From 235b9fb25f5eb6729a24345d69e738006a9b8913 Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 00:50:46 +0800 Subject: [PATCH 01/16] feat(debugger): upgrade debugger default version --- packages/debugger/src/constants.ts | 2 +- packages/debugger/src/executor.ts | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/debugger/src/constants.ts b/packages/debugger/src/constants.ts index 43ebf684b..0f696e897 100644 --- a/packages/debugger/src/constants.ts +++ b/packages/debugger/src/constants.ts @@ -1 +1 @@ -export const CKB_DEBUGGER_VERSION = "0.21.1"; +export const CKB_DEBUGGER_VERSION = "0.112.1"; diff --git a/packages/debugger/src/executor.ts b/packages/debugger/src/executor.ts index b8cacc69c..bd864df03 100644 --- a/packages/debugger/src/executor.ts +++ b/packages/debugger/src/executor.ts @@ -12,6 +12,19 @@ interface DebuggerOptions { readonly debuggerPath?: string; } +type Options = { + /** + * script hash to execute + * @example + * computeScriptHash(inputs[0].lock) + */ + scriptHash: Hash; + /** + * script group type to execute + */ + scriptGroupType: "lock" | "type"; +}; + // TODO maybe we can compile the ckb-debugger to a wasm or a node module export class CKBDebugger implements Executor { loader: DataLoader; @@ -47,10 +60,7 @@ export class CKBDebugger implements Executor { async execute( txSkeleton: TransactionSkeletonType, - options: { - scriptHash: Hash; - scriptGroupType: "lock" | "type"; - } + options: Options ): Promise { const tmpTxPath = this.saveTmpTxFile(txSkeleton); From 7df3b1134ad9fe1e953ea83916aedd2eecca5249 Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 00:51:16 +0800 Subject: [PATCH 02/16] feat(debugger): update omnilock binary --- packages/debugger/contracts/omni_lock | Bin 104592 -> 120728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/debugger/contracts/omni_lock b/packages/debugger/contracts/omni_lock index 059fcdbb30c443ea8ddc3e5e11ba48f2fc1e1018..11c016aa0fbf8e4111334a8f43fd050e4541ab19 100755 GIT binary patch delta 29676 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 CnP_8 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 F{{u}uU|s+K From 7ecb7baeab88506418775a2a688d16a69c58e20a Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 00:53:02 +0800 Subject: [PATCH 03/16] chore: changeset for debugger default version --- .changeset/flat-feet-fold.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/flat-feet-fold.md diff --git a/.changeset/flat-feet-fold.md b/.changeset/flat-feet-fold.md new file mode 100644 index 000000000..7b2ce244d --- /dev/null +++ b/.changeset/flat-feet-fold.md @@ -0,0 +1,5 @@ +--- +"@ckb-lumos/debugger": minor +--- + +feat: update default ckb-debugger version to 0.112 From f15776ca30a2c5f2ea72149e09b872e70a94b7f8 Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 00:54:08 +0800 Subject: [PATCH 04/16] chore(examples): basic debugger usage example --- examples/misc-nodejs/package.json | 10 + .../misc-nodejs/verify-sig-via-debugger.ts | 64 +++ examples/pnpm-lock.yaml | 392 +++++++++++++----- 3 files changed, 364 insertions(+), 102 deletions(-) create mode 100644 examples/misc-nodejs/package.json create mode 100644 examples/misc-nodejs/verify-sig-via-debugger.ts diff --git a/examples/misc-nodejs/package.json b/examples/misc-nodejs/package.json new file mode 100644 index 000000000..df43f2f4c --- /dev/null +++ b/examples/misc-nodejs/package.json @@ -0,0 +1,10 @@ +{ + "name": "@lumos-example/misc", + "private": true, + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@ckb-lumos/lumos": "canary", + "@ckb-lumos/debugger": "canary" + } +} diff --git a/examples/misc-nodejs/verify-sig-via-debugger.ts b/examples/misc-nodejs/verify-sig-via-debugger.ts new file mode 100644 index 000000000..4d7c1552e --- /dev/null +++ b/examples/misc-nodejs/verify-sig-via-debugger.ts @@ -0,0 +1,64 @@ +import { randomBytes } from "crypto"; +import { config, hd, Script } from "@ckb-lumos/lumos"; +import { CKBDebuggerDownloader, createTestContext, getDefaultConfig } from "@ckb-lumos/debugger"; +import { TransactionSkeleton } from "@ckb-lumos/lumos/helpers"; +import { common } from "@ckb-lumos/lumos/common-scripts"; +import { blockchain, bytes } from "@ckb-lumos/lumos/codec"; +import { computeScriptHash } from "@ckb-lumos/lumos/utils"; +import { mockOutPoint } from "@ckb-lumos/debugger/lib/context"; + +const context = createTestContext(getDefaultConfig()); +const lumosConfig = { PREFIX: "ckt", SCRIPTS: context.scriptConfigs }; +config.initializeConfig(lumosConfig); + +const privateKey = bytes.hexify(randomBytes(32)); + +async function main() { + await new CKBDebuggerDownloader().downloadIfNotExists(); + + const txSkeleton = TransactionSkeleton().asMutable(); + const lock: Script = { + codeHash: context.scriptConfigs.SECP256K1_BLAKE160.CODE_HASH, + hashType: context.scriptConfigs.SECP256K1_BLAKE160.HASH_TYPE, + args: hd.key.privateKeyToBlake160(privateKey), + }; + + await common.setupInputCell(txSkeleton, { + cellOutput: { capacity: "0x123123123", lock: lock }, + data: "0x", + outPoint: mockOutPoint(), + }); + + txSkeleton.update("cellDeps", (cellDeps) => + cellDeps.push({ + depType: context.scriptConfigs.SECP256K1_BLAKE160.DEP_TYPE, + outPoint: { + txHash: context.scriptConfigs.SECP256K1_BLAKE160.TX_HASH, + index: context.scriptConfigs.SECP256K1_BLAKE160.INDEX, + }, + }) + ); + + common.prepareSigningEntries(txSkeleton, { config: lumosConfig }); + const message = txSkeleton.get("signingEntries").get(0)!.message; + const sig = hd.key.signRecoverable(message, privateKey); + txSkeleton.update("witnesses", (witnesses) => + witnesses.update(0, (witness) => { + const unsigned = blockchain.WitnessArgs.unpack(witness!); + unsigned.lock = sig; + return bytes.hexify(blockchain.WitnessArgs.pack(unsigned)); + }) + ); + + const result = await context.executor.execute(txSkeleton, { + scriptHash: computeScriptHash(lock), + scriptGroupType: "lock", + }); + + console.assert(result.code === 0); + + console.log("Cycles consumed", result.cycles); + console.log(result.message); +} + +main(); diff --git a/examples/pnpm-lock.yaml b/examples/pnpm-lock.yaml index e3d43cf92..24e9d3bfe 100644 --- a/examples/pnpm-lock.yaml +++ b/examples/pnpm-lock.yaml @@ -39,13 +39,13 @@ importers: ../packages/base: dependencies: '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit '@types/blake2b': specifier: ^2.1.0 @@ -76,19 +76,19 @@ importers: ../packages/ckb-indexer: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit cross-fetch: specifier: ^3.1.5 @@ -98,7 +98,7 @@ importers: version: 3.3.0 devDependencies: '@ckb-lumos/testkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../testkit '@types/lodash.uniqby': specifier: ^4.7.7 @@ -125,7 +125,7 @@ importers: ../packages/codec: dependencies: '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi devDependencies: escape-string-regexp: @@ -138,39 +138,42 @@ importers: ../packages/common-scripts: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/config-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../config-manager '@ckb-lumos/helpers': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../helpers '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit immutable: specifier: ^4.3.0 version: 4.3.0 devDependencies: '@ckb-lumos/debugger': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../debugger '@ckb-lumos/hd': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../hd '@types/keccak': specifier: ^3.0.1 version: 3.0.1 + '@unisat/wallet-sdk': + specifier: ^1.1.2 + version: 1.1.2 keccak: specifier: ^3.0.1 version: 3.0.1 @@ -178,13 +181,13 @@ importers: ../packages/config-manager: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@types/deep-freeze-strict': specifier: ^1.1.0 @@ -196,22 +199,22 @@ importers: ../packages/debugger: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/config-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../config-manager '@ckb-lumos/helpers': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../helpers '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc '@types/download': specifier: ^8.0.1 @@ -233,55 +236,55 @@ importers: version: 3.0.0 devDependencies: '@ckb-lumos/common-scripts': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../common-scripts '@ckb-lumos/experiment-tx-assembler': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../experiment-tx-assembler '@ckb-lumos/hd': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../hd ../packages/e2e-test: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/ckb-indexer': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../ckb-indexer '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/common-scripts': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../common-scripts '@ckb-lumos/config-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../config-manager '@ckb-lumos/hd': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../hd '@ckb-lumos/helpers': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../helpers '@ckb-lumos/light-client': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../light-client '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc '@ckb-lumos/runner': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../runner '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit '@ckb-lumos/utils': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../utils '@types/kill-port': specifier: ^2.0.0 @@ -294,7 +297,7 @@ importers: version: 2.0.1 devDependencies: '@ckb-lumos/testkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../testkit '@types/request': specifier: ^2.48.8 @@ -315,28 +318,28 @@ importers: ../packages/experiment-tx-assembler: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/config-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../config-manager '@ckb-lumos/helpers': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../helpers '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit ../packages/hd: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi bn.js: specifier: ^5.1.3 @@ -367,22 +370,22 @@ importers: ../packages/hd-cache: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/ckb-indexer': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../ckb-indexer '@ckb-lumos/config-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../config-manager '@ckb-lumos/hd': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../hd '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc immutable: specifier: ^4.3.0 @@ -398,19 +401,19 @@ importers: ../packages/helpers: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/config-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../config-manager '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit bech32: specifier: ^2.0.0 @@ -422,13 +425,13 @@ importers: ../packages/light-client: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/ckb-indexer': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../ckb-indexer '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc cross-fetch: specifier: ^3.1.5 @@ -438,7 +441,7 @@ importers: version: 3.3.0 devDependencies: '@ckb-lumos/testkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../testkit '@types/request': specifier: ^2.48.8 @@ -456,49 +459,49 @@ importers: ../packages/lumos: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/ckb-indexer': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../ckb-indexer '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/common-scripts': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../common-scripts '@ckb-lumos/config-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../config-manager '@ckb-lumos/hd': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../hd '@ckb-lumos/helpers': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../helpers '@ckb-lumos/light-client': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../light-client '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit '@ckb-lumos/transaction-manager': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../transaction-manager ../packages/molecule: dependencies: '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@types/nearley': specifier: ^2.11.2 @@ -511,7 +514,7 @@ importers: version: 2.20.1 devDependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base jsbi: specifier: ^4.1.0 @@ -520,10 +523,10 @@ importers: ../packages/rpc: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi abort-controller: specifier: ^3.0.0 @@ -551,7 +554,7 @@ importers: ../packages/runner: dependencies: '@ckb-lumos/utils': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../utils '@ltd/j-toml': specifier: ^1.38.0 @@ -587,16 +590,16 @@ importers: ../packages/testkit: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc '@types/body-parser': specifier: ^1.19.1 @@ -633,7 +636,7 @@ importers: ../packages/toolkit: dependencies: '@ckb-lumos/bi': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../bi devDependencies: '@babel/plugin-proposal-export-namespace-from': @@ -646,19 +649,19 @@ importers: ../packages/transaction-manager: dependencies: '@ckb-lumos/base': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../base '@ckb-lumos/ckb-indexer': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../ckb-indexer '@ckb-lumos/codec': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../codec '@ckb-lumos/rpc': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../rpc '@ckb-lumos/toolkit': - specifier: 0.22.0-next.0 + specifier: 0.22.0-next.2 version: link:../toolkit immutable: specifier: ^4.3.0 @@ -750,6 +753,15 @@ importers: specifier: canary version: link:../../packages/lumos + misc-nodejs: + dependencies: + '@ckb-lumos/debugger': + specifier: canary + version: link:../../packages/debugger + '@ckb-lumos/lumos': + specifier: canary + version: link:../../packages/lumos + omni-lock-metamask: dependencies: '@ckb-lumos/lumos': @@ -826,12 +838,6 @@ importers: secp256k1-transfer: dependencies: - '@ckb-lumos/base': - specifier: canary - version: link:../../packages/base - '@ckb-lumos/codec': - specifier: canary - version: link:../../packages/codec '@ckb-lumos/lumos': specifier: canary version: link:../../packages/lumos @@ -1687,6 +1693,11 @@ packages: dev: true optional: true + /@noble/hashes@1.3.3: + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + dev: true + /@parcel/bundler-default@2.8.0(@parcel/core@2.9.3): resolution: {integrity: sha512-OvDDhxX4LwfGe7lYVMbJMzqNcDk8ydOqNw0Hra9WPgl0m5gju/eVIbDvot3JXp5F96FmV36uCxdODJhKTNoAzQ==} engines: {node: '>= 12.0.0', parcel: ^2.8.0} @@ -3494,6 +3505,19 @@ packages: '@types/yargs-parser': 21.0.0 dev: true + /@unisat/wallet-sdk@1.1.2: + resolution: {integrity: sha512-1ycdryAcCm7vFQlnKgpDsabDAXybwP7rGatp0FDHBZ7Aqgztfa3HkYDOY/M1e26Jl3OBuMPa7ak30VJMhTbhZA==} + engines: {node: '>=14.0.0'} + dependencies: + bignumber.js: 9.1.2 + bip39: 3.1.0 + bitcoinjs-lib: 6.1.5 + bitcore-lib: 10.0.23 + ecpair: 2.1.0 + hdkey: 2.1.0 + tiny-secp256k1: 2.2.1 + dev: true + /@xobotyi/scrollbar-width@1.9.5: resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} dev: false @@ -3708,6 +3732,10 @@ packages: safe-buffer: 5.2.1 dev: true + /base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + dev: true + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -3719,7 +3747,61 @@ packages: /bech32@2.0.0: resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} - dev: false + + /bigi@1.4.2: + resolution: {integrity: sha512-ddkU+dFIuEIW8lE7ZwdIAf2UPoM90eaprg5m3YXAVVTmKlqV/9BX4A2M8BOK2yOq6/VgZFVhK6QAxJebhlbhzw==} + dev: true + + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: true + + /bip-schnorr@0.6.4: + resolution: {integrity: sha512-dNKw7Lea8B0wMIN4OjEmOk/Z5qUGqoPDY0P2QttLqGk1hmDPytLWW8PR5Pb6Vxy6CprcdEgfJpOjUu+ONQveyg==} + engines: {node: '>=8.0.0'} + dependencies: + bigi: 1.4.2 + ecurve: 1.0.6 + js-sha256: 0.9.0 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /bip174@2.1.1: + resolution: {integrity: sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==} + engines: {node: '>=8.0.0'} + dev: true + + /bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + dependencies: + '@noble/hashes': 1.3.3 + dev: true + + /bitcoinjs-lib@6.1.5: + resolution: {integrity: sha512-yuf6xs9QX/E8LWE2aMJPNd0IxGofwfuVOiYdNUESkc+2bHHVKjhJd8qewqapeoolh9fihzHGoDCB5Vkr57RZCQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@noble/hashes': 1.3.3 + bech32: 2.0.0 + bip174: 2.1.1 + bs58check: 3.0.1 + typeforce: 1.18.0 + varuint-bitcoin: 1.1.2 + dev: true + + /bitcore-lib@10.0.23: + resolution: {integrity: sha512-HnwdOAXfwNJqia6SW7feAeh7fDwk7p21XXo32uTqhWzYDJ2MkalpTerl8hM5o6xYHWEIaY5rxCSaQMhKvQLXOg==} + dependencies: + bech32: 2.0.0 + bip-schnorr: 0.6.4 + bn.js: 4.11.8 + bs58: 4.0.1 + buffer-compare: 1.1.1 + elliptic: 6.5.4 + inherits: 2.0.1 + lodash: 4.17.21 + dev: true /bl@1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} @@ -3741,6 +3823,10 @@ packages: nanoassert: 1.1.0 dev: false + /bn.js@4.11.8: + resolution: {integrity: sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==} + dev: true + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -3870,6 +3956,33 @@ packages: update-browserslist-db: 1.0.11(browserslist@4.21.9) dev: true + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + dev: true + + /bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + dependencies: + base-x: 4.0.0 + dev: true + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + dev: true + + /bs58check@3.0.1: + resolution: {integrity: sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==} + dependencies: + '@noble/hashes': 1.3.3 + bs58: 5.0.0 + dev: true + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -3887,6 +4000,10 @@ packages: buffer-fill: 1.0.0 dev: false + /buffer-compare@1.1.1: + resolution: {integrity: sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==} + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: false @@ -4478,6 +4595,22 @@ packages: safer-buffer: 2.1.2 dev: true + /ecpair@2.1.0: + resolution: {integrity: sha512-cL/mh3MtJutFOvFc27GPZE2pWL3a3k4YvzUWEOvilnfZVlH3Jwgx/7d6tlD7/75tNk8TG2m+7Kgtz0SI1tWcqw==} + engines: {node: '>=8.0.0'} + dependencies: + randombytes: 2.1.0 + typeforce: 1.18.0 + wif: 2.0.6 + dev: true + + /ecurve@1.0.6: + resolution: {integrity: sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w==} + dependencies: + bigi: 1.4.2 + safe-buffer: 5.2.1 + dev: true + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -5034,6 +5167,15 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 + /hdkey@2.1.0: + resolution: {integrity: sha512-i9Wzi0Dy49bNS4tXXeGeu0vIcn86xXdPQUpEYg+SO1YiO8HtomjmmRMaRyqL0r59QfcD4PfVbSF3qmsWFwAemA==} + dependencies: + bs58check: 2.1.2 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + secp256k1: 4.0.3 + dev: true + /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: @@ -5178,6 +5320,10 @@ packages: once: 1.4.0 wrappy: 1.0.2 + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: true + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: false @@ -5813,6 +5959,10 @@ packages: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} dev: false + /js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -7082,6 +7232,16 @@ packages: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} dev: false + /secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + elliptic: 6.5.4 + node-addon-api: 2.0.2 + node-gyp-build: 4.6.0 + dev: true + /seek-bzip@1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} hasBin: true @@ -7540,6 +7700,13 @@ packages: resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} dev: true + /tiny-secp256k1@2.2.1: + resolution: {integrity: sha512-/U4xfVqnVxJXN4YVsru0E6t5wVncu2uunB8+RVR40fYUxkKYUPS10f+ePQZgFBoE/Jbf9H1NBveupF2VmB58Ng==} + engines: {node: '>=14.0.0'} + dependencies: + uint8array-tools: 0.0.7 + dev: true + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true @@ -7636,12 +7803,21 @@ packages: media-typer: 0.3.0 mime-types: 2.1.35 + /typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + dev: true + /typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true dev: true + /uint8array-tools@0.0.7: + resolution: {integrity: sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==} + engines: {node: '>=14.0.0'} + dev: true + /unbzip2-stream@1.4.3: resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} dependencies: @@ -7714,6 +7890,12 @@ packages: convert-source-map: 1.9.0 dev: true + /varuint-bitcoin@1.1.2: + resolution: {integrity: sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -7756,6 +7938,12 @@ packages: isexe: 2.0.0 dev: true + /wif@2.0.6: + resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + dependencies: + bs58check: 2.1.2 + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} From 1bcee1408ecde34547615ee11c24b098bf619fe6 Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 00:58:50 +0800 Subject: [PATCH 05/16] feat(common-scripts): supported omnilock auth in omnilock --- .changeset/gold-seals-pretend.md | 5 + packages/common-scripts/package.json | 3 + .../common-scripts/src/omnilock-bitcoin.ts | 93 ++++++++ packages/common-scripts/src/omnilock.ts | 55 +++-- packages/common-scripts/tests/inputs.ts | 4 +- .../tests/omnilock-bitcoin.test.ts | 119 +++++++++++ pnpm-lock.yaml | 199 +++++++++++++++++- 7 files changed, 459 insertions(+), 19 deletions(-) create mode 100644 .changeset/gold-seals-pretend.md create mode 100644 packages/common-scripts/src/omnilock-bitcoin.ts create mode 100644 packages/common-scripts/tests/omnilock-bitcoin.test.ts diff --git a/.changeset/gold-seals-pretend.md b/.changeset/gold-seals-pretend.md new file mode 100644 index 000000000..2ec1ce9d8 --- /dev/null +++ b/.changeset/gold-seals-pretend.md @@ -0,0 +1,5 @@ +--- +"@ckb-lumos/common-scripts": minor +--- + +feat: supported bitcoin auth in omnilock diff --git a/packages/common-scripts/package.json b/packages/common-scripts/package.json index 93cc9600b..3d7a18246 100644 --- a/packages/common-scripts/package.json +++ b/packages/common-scripts/package.json @@ -26,6 +26,8 @@ "@ckb-lumos/helpers": "0.22.0-next.2", "@ckb-lumos/rpc": "0.22.0-next.2", "@ckb-lumos/toolkit": "0.22.0-next.2", + "bs58": "^5.0.0", + "bech32": "^2.0.0", "immutable": "^4.3.0" }, "repository": { @@ -56,6 +58,7 @@ "@ckb-lumos/debugger": "0.22.0-next.2", "@ckb-lumos/hd": "0.22.0-next.2", "@types/keccak": "^3.0.1", + "@unisat/wallet-sdk": "^1.1.2", "keccak": "^3.0.1" }, "publishConfig": { diff --git a/packages/common-scripts/src/omnilock-bitcoin.ts b/packages/common-scripts/src/omnilock-bitcoin.ts new file mode 100644 index 000000000..2fd0c3cbe --- /dev/null +++ b/packages/common-scripts/src/omnilock-bitcoin.ts @@ -0,0 +1,93 @@ +import { bytes } from "@ckb-lumos/codec"; +import { bech32 } from "bech32"; +import bs58 from "bs58"; + +export function decodeAddress(address: string): ArrayLike { + try { + // Bech32 + if (address.startsWith("bc1")) { + return bech32.fromWords(bech32.decode(address).words.slice(1)); + } + + // P2PKH + if (address.startsWith("1")) { + return bs58.decode(address).slice(1, 21); + } + + // P2SH + if (address.startsWith("3")) { + return bs58.decode(address).slice(1, 21); + } + } catch { + if (address.startsWith("bc1")) { + throw new Error("Taproot address is not supported yet."); + } + } + + throw new Error( + `Unsupported bitcoin address ${address}, only 1...(P2PKH) 3...(P2SH), and bc1...(Bech32) are supported.` + ); +} + +export interface Provider { + requestAccounts(): Promise; + signMessage(message: string, type?: "ecdsa"): Promise; +} + +export async function signMessage( + message: string, + type?: "ecdsa", + provider?: Provider +): Promise { + const internal: Provider = (() => { + if (provider) return provider; + + /* c8 ignore next */ + if (typeof window !== "undefined") { + if ("unisat" in window) { + return window.unisat as Provider; + } + + if ( + "okxwallet" in window && + "bitcoin" in (window.okxwallet as Provider) + ) { + return (window.okxwallet as Record<"bitcoin", Provider>).bitcoin; + } + } + + throw new Error( + "No provider found, make sure you have installed UniSat Wallet" + ); + })(); + + const accounts = await internal.requestAccounts(); + const signatureBase64 = await internal.signMessage( + message.startsWith("0x") ? message.slice(2) : message, + type + ); + const signature = bytes.bytify(base64ToHex(signatureBase64)); + + const address = accounts[0]; + if (address.startsWith("bc1q")) { + signature[0] = 39 + ((signature[0] - 27) % 4); + } + if (address.startsWith("3")) { + signature[0] = 35 + ((signature[0] - 27) % 4); + } + if (address.startsWith("1")) { + signature[0] = 31 + ((signature[0] - 27) % 4); + } + + return bytes.hexify(signature); +} + +function base64ToHex(str: string) { + const raw = atob(str); + let result = ""; + for (let i = 0; i < raw.length; i++) { + const hex = raw.charCodeAt(i).toString(16); + result += hex.length === 2 ? hex : "0" + hex; + } + return "0x" + result; +} diff --git a/packages/common-scripts/src/omnilock.ts b/packages/common-scripts/src/omnilock.ts index b01dc1f77..2c0eb4009 100644 --- a/packages/common-scripts/src/omnilock.ts +++ b/packages/common-scripts/src/omnilock.ts @@ -35,17 +35,39 @@ import { createFixedHexBytesCodec, } from "@ckb-lumos/codec/lib/blockchain"; import { bytify, hexify } from "@ckb-lumos/codec/lib/bytes"; +import * as bitcoin from "./omnilock-bitcoin"; const { ScriptValue } = values; export type OmnilockInfo = { - auth: { - flag: "ETHEREUM" | "SECP256K1_BLAKE160"; - /** - * if auth flag is SECP256K1_BLAKE160, content is publicKeyToBlake160(secp256k1Pubkey) - * if auth flag is ETHEREUM, content is Ethereum address - */ - content: BytesLike; - }; + auth: OmnilockAuth; +}; + +export type OmnilockAuth = IdentityCkb | IdentityEthereum | IdentityBitcoin; + +export type IdentityCkb = { + flag: "SECP256K1_BLAKE160"; + /** + * the blake160 hash of a secp256k1 public key + */ + content: BytesLike; +}; +export type IdentityEthereum = { + flag: "ETHEREUM"; + + /** + * an Ethereum address, aka the public key hash + */ + content: BytesLike; +}; +export type IdentityBitcoin = { + flag: "BITCOIN"; + /** + * a Bitcoin address, such as + * `P2PKH(17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem)`, + * `P2SH(3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX)`, + * `Bech32(bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4)` + */ + address: string; }; /** @@ -66,17 +88,18 @@ export function createOmnilockScript( } const args = (() => { - // omni flag pubkey hash omni lock flags - // chain identity eth addr function flag() - // 00: Nervos 👇 00: owner - // 01: Ethereum 👇 01: administrator if (omnilockInfo.auth.flag === "ETHEREUM") { - return `0x01${bytes.hexify(omnilockInfo.auth.content).slice(2)}00`; + return bytes.hexify(bytes.concat([1], omnilockInfo.auth.content, [0])); } if (omnilockInfo.auth.flag === "SECP256K1_BLAKE160") { - return `0x00${bytes.hexify(omnilockInfo.auth.content).slice(2)}00`; + return bytes.hexify(bytes.concat([0], omnilockInfo.auth.content, [0])); } - throw new Error(`Not supported flag: ${omnilockInfo.auth.flag}.`); + if (omnilockInfo.auth.flag === "BITCOIN") { + return bytes.hexify( + bytes.concat([4], bitcoin.decodeAddress(omnilockInfo.auth.address), [0]) + ); + } + throw new Error(`Not supported flag: ${omnilockInfo.auth}.`); })(); const script: Script = { @@ -292,6 +315,8 @@ export function prepareSigningEntries( return _prepareSigningEntries(txSkeleton, config, "OMNILOCK"); } +export { bitcoin }; + export default { prepareSigningEntries, setupInputCell, diff --git a/packages/common-scripts/tests/inputs.ts b/packages/common-scripts/tests/inputs.ts index 14dd5dd2c..ba97a6a43 100644 --- a/packages/common-scripts/tests/inputs.ts +++ b/packages/common-scripts/tests/inputs.ts @@ -7,7 +7,7 @@ export const charlesOmnilockInputs: Cell[] = [ capacity: "0x174876e800", lock: { codeHash: - "0x1bf147d1c95a5ad51016bd426c33f364257e685af54df26fc69ec40e3ae267d1", + "0xdea31e1f104cf6a26ee3cbace40f6fa70e2deb556cd12fdc23eae15889d0d37b", hashType: "data", args: "0x00e3e0a82b199dceadb55e223c6e4b8e511d57d24900", }, @@ -28,7 +28,7 @@ export const charlesOmnilockInputs: Cell[] = [ capacity: "0x174876e800", lock: { codeHash: - "0x1bf147d1c95a5ad51016bd426c33f364257e685af54df26fc69ec40e3ae267d1", + "0xdea31e1f104cf6a26ee3cbace40f6fa70e2deb556cd12fdc23eae15889d0d37b", hashType: "data", args: "0x00e3e0a82b199dceadb55e223c6e4b8e511d57d24900", }, diff --git a/packages/common-scripts/tests/omnilock-bitcoin.test.ts b/packages/common-scripts/tests/omnilock-bitcoin.test.ts new file mode 100644 index 000000000..6b16caecc --- /dev/null +++ b/packages/common-scripts/tests/omnilock-bitcoin.test.ts @@ -0,0 +1,119 @@ +import test from "ava"; +import { + CKBDebuggerDownloader, + createTestContext, + getDefaultConfig, +} from "@ckb-lumos/debugger"; +import { TransactionSkeleton } from "@ckb-lumos/helpers"; +import { blockchain, utils } from "@ckb-lumos/base"; +import { bytes } from "@ckb-lumos/codec"; +import { common } from "../src"; +import { mockOutPoint } from "@ckb-lumos/debugger/lib/context"; +import { createOmnilockScript, OmnilockWitnessLock } from "../src/omnilock"; +import { address, AddressType, core, keyring } from "@unisat/wallet-sdk"; +import { NetworkType } from "@unisat/wallet-sdk/lib/network"; +import { Provider, signMessage } from "../src/omnilock-bitcoin"; +import { SimpleKeyring } from "@unisat/wallet-sdk/lib/keyring"; + +test.before(async () => { + await new CKBDebuggerDownloader().downloadIfNotExists(); +}); + +test("Should throw when sign a message without provider", async (t) => { + await t.throwsAsync(() => signMessage("hello world")); +}); + +const context = createTestContext(getDefaultConfig()); +const managerConfig = { PREFIX: "ckt", SCRIPTS: context.scriptConfigs }; + +test("Omnilock#Bitcoin P2PKH", async (t) => { + const { provider } = makeProvider(AddressType.P2PKH); + const result = await execute(provider); + t.is(result.code, 0, result.message); +}); + +test("Omnilock#Bitcoin P2WPKH", async (t) => { + const { provider } = makeProvider(AddressType.P2WPKH); + const result = await execute(provider); + + t.is(result.code, 0, result.message); +}); + +test("Omnilock#Bitcoin P2SH_P2WPKH", async (t) => { + const { provider } = makeProvider(AddressType.P2SH_P2WPKH); + const result = await execute(provider); + + t.is(result.code, 0, result.message); +}); + +async function execute(provider: Provider) { + const addr = (await provider.requestAccounts())[0]; + + const { txSkeleton, lock } = await setupTxSkeleton(addr); + + const message = txSkeleton.get("signingEntries").get(0)!.message; + const signature = await signMessage(message, "ecdsa", provider); + + txSkeleton.update("witnesses", (witnesses) => + witnesses.update(0, () => { + return bytes.hexify( + blockchain.WitnessArgs.pack({ + lock: OmnilockWitnessLock.pack({ signature }), + }) + ); + }) + ); + + return await context.executor.execute(txSkeleton, { + scriptHash: utils.computeScriptHash(lock), + scriptGroupType: "lock", + }); +} + +function makeProvider(addressType: AddressType): { + provider: Provider; + pair: core.ECPairInterface; + keyring: SimpleKeyring; +} { + const pair = core.ECPair.makeRandom(); + const ring = new keyring.SimpleKeyring([pair.privateKey!.toString("hex")]); + const publicKey = pair.publicKey.toString("hex"); + const addr = address.publicKeyToAddress( + publicKey, + addressType, + NetworkType.MAINNET + ); + + return { + pair, + keyring: ring, + provider: { + requestAccounts: async () => [addr], + signMessage: async (message: string) => + ring.signMessage(publicKey, message), + }, + }; +} + +async function setupTxSkeleton(addr: string) { + const txSkeleton = TransactionSkeleton().asMutable(); + + const lock = createOmnilockScript( + { auth: { flag: "BITCOIN", address: addr } }, + { config: managerConfig } + ); + + await common.setupInputCell( + txSkeleton, + { + cellOutput: { capacity: "0x123", lock: lock }, + data: "0x", + outPoint: mockOutPoint(), + }, + undefined, + { config: managerConfig } + ); + + common.prepareSigningEntries(txSkeleton, { config: managerConfig }); + return { txSkeleton: txSkeleton, lock }; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4145f21e..2366ae3f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -236,6 +236,12 @@ importers: '@ckb-lumos/toolkit': specifier: 0.22.0-next.2 version: link:../toolkit + bech32: + specifier: ^2.0.0 + version: 2.0.0 + bs58: + specifier: ^5.0.0 + version: 5.0.0 immutable: specifier: ^4.3.0 version: 4.3.0 @@ -249,6 +255,9 @@ importers: '@types/keccak': specifier: ^3.0.1 version: 3.0.1 + '@unisat/wallet-sdk': + specifier: ^1.1.2 + version: 1.1.2 keccak: specifier: ^3.0.1 version: 3.0.1 @@ -5424,6 +5433,11 @@ packages: dev: true optional: true + /@noble/hashes@1.3.3: + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -6461,6 +6475,19 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: false + /@unisat/wallet-sdk@1.1.2: + resolution: {integrity: sha512-1ycdryAcCm7vFQlnKgpDsabDAXybwP7rGatp0FDHBZ7Aqgztfa3HkYDOY/M1e26Jl3OBuMPa7ak30VJMhTbhZA==} + engines: {node: '>=14.0.0'} + dependencies: + bignumber.js: 9.1.2 + bip39: 3.1.0 + bitcoinjs-lib: 6.1.5 + bitcore-lib: 10.0.23 + ecpair: 2.1.0 + hdkey: 2.1.0 + tiny-secp256k1: 2.2.1 + dev: true + /@webassemblyjs/ast@1.11.5: resolution: {integrity: sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==} dependencies: @@ -7186,6 +7213,15 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + /base16@1.0.0: resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} dev: false @@ -7206,7 +7242,6 @@ packages: /bech32@2.0.0: resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} - dev: false /benchmark@2.1.4: resolution: {integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==} @@ -7226,10 +7261,65 @@ packages: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: false + /bigi@1.4.2: + resolution: {integrity: sha512-ddkU+dFIuEIW8lE7ZwdIAf2UPoM90eaprg5m3YXAVVTmKlqV/9BX4A2M8BOK2yOq6/VgZFVhK6QAxJebhlbhzw==} + dev: true + + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /bip-schnorr@0.6.4: + resolution: {integrity: sha512-dNKw7Lea8B0wMIN4OjEmOk/Z5qUGqoPDY0P2QttLqGk1hmDPytLWW8PR5Pb6Vxy6CprcdEgfJpOjUu+ONQveyg==} + engines: {node: '>=8.0.0'} + dependencies: + bigi: 1.4.2 + ecurve: 1.0.6 + js-sha256: 0.9.0 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /bip174@2.1.1: + resolution: {integrity: sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==} + engines: {node: '>=8.0.0'} + dev: true + + /bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + dependencies: + '@noble/hashes': 1.3.3 + dev: true + + /bitcoinjs-lib@6.1.5: + resolution: {integrity: sha512-yuf6xs9QX/E8LWE2aMJPNd0IxGofwfuVOiYdNUESkc+2bHHVKjhJd8qewqapeoolh9fihzHGoDCB5Vkr57RZCQ==} + engines: {node: '>=8.0.0'} + dependencies: + '@noble/hashes': 1.3.3 + bech32: 2.0.0 + bip174: 2.1.1 + bs58check: 3.0.1 + typeforce: 1.18.0 + varuint-bitcoin: 1.1.2 + dev: true + + /bitcore-lib@10.0.23: + resolution: {integrity: sha512-HnwdOAXfwNJqia6SW7feAeh7fDwk7p21XXo32uTqhWzYDJ2MkalpTerl8hM5o6xYHWEIaY5rxCSaQMhKvQLXOg==} + dependencies: + bech32: 2.0.0 + bip-schnorr: 0.6.4 + bn.js: 4.11.8 + bs58: 4.0.1 + buffer-compare: 1.1.1 + elliptic: 6.5.4 + inherits: 2.0.1 + lodash: 4.17.21 + dev: true + /bl@1.2.3: resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} dependencies: @@ -7254,6 +7344,10 @@ packages: resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} dev: true + /bn.js@4.11.8: + resolution: {integrity: sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==} + dev: true + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -7475,6 +7569,32 @@ packages: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) + /bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.9 + dev: true + + /bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + dependencies: + base-x: 4.0.0 + + /bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + dev: true + + /bs58check@3.0.1: + resolution: {integrity: sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==} + dependencies: + '@noble/hashes': 1.3.3 + bs58: 5.0.0 + dev: true + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -7492,6 +7612,10 @@ packages: buffer-fill: 1.0.0 dev: false + /buffer-compare@1.1.1: + resolution: {integrity: sha512-O6NvNiHZMd3mlIeMDjP6t/gPG75OqGPeiRZXoMQZJ6iy9GofCls4Ijs5YkPZZwoysizLiedhticmdyx/GyHghA==} + dev: true + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: false @@ -9056,6 +9180,22 @@ packages: safer-buffer: 2.1.2 dev: true + /ecpair@2.1.0: + resolution: {integrity: sha512-cL/mh3MtJutFOvFc27GPZE2pWL3a3k4YvzUWEOvilnfZVlH3Jwgx/7d6tlD7/75tNk8TG2m+7Kgtz0SI1tWcqw==} + engines: {node: '>=8.0.0'} + dependencies: + randombytes: 2.1.0 + typeforce: 1.18.0 + wif: 2.0.6 + dev: true + + /ecurve@1.0.6: + resolution: {integrity: sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w==} + dependencies: + bigi: 1.4.2 + safe-buffer: 5.2.1 + dev: true + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -10679,6 +10819,15 @@ packages: space-separated-tokens: 2.0.2 dev: false + /hdkey@2.1.0: + resolution: {integrity: sha512-i9Wzi0Dy49bNS4tXXeGeu0vIcn86xXdPQUpEYg+SO1YiO8HtomjmmRMaRyqL0r59QfcD4PfVbSF3qmsWFwAemA==} + dependencies: + bs58check: 2.1.2 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + secp256k1: 4.0.3 + dev: true + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -11015,6 +11164,10 @@ packages: once: 1.4.0 wrappy: 1.0.2 + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: true + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} dev: false @@ -12040,6 +12193,10 @@ packages: /js-sdsl@4.4.0: resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + /js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + dev: true + /js-string-escape@1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} engines: {node: '>= 0.8'} @@ -15633,6 +15790,16 @@ packages: resolution: {integrity: sha512-Uin2J8Bpm3xaZi9Y8QibSys6uJOFZ+REMrf42v20AA3FUDUrshKkMEP6liJbMAHCm71wO6ls4mwAf7a3gFVxLw==} dev: false + /secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + elliptic: 6.5.4 + node-addon-api: 2.0.2 + node-gyp-build: 4.6.0 + dev: true + /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -16544,6 +16711,13 @@ packages: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} dev: false + /tiny-secp256k1@2.2.1: + resolution: {integrity: sha512-/U4xfVqnVxJXN4YVsru0E6t5wVncu2uunB8+RVR40fYUxkKYUPS10f+ePQZgFBoE/Jbf9H1NBveupF2VmB58Ng==} + engines: {node: '>=14.0.0'} + dependencies: + uint8array-tools: 0.0.7 + dev: true + /tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} dev: false @@ -16833,6 +17007,10 @@ packages: typescript: 5.0.4 dev: true + /typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + dev: true + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -16848,6 +17026,11 @@ packages: resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==} dev: false + /uint8array-tools@0.0.7: + resolution: {integrity: sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==} + engines: {node: '>=14.0.0'} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -17167,6 +17350,12 @@ packages: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} dev: false + /varuint-bitcoin@1.1.2: + resolution: {integrity: sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -17494,6 +17683,12 @@ packages: string-width: 5.1.2 dev: false + /wif@2.0.6: + resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + dependencies: + bs58check: 2.1.2 + dev: true + /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} From e0ea48e55be6cdca40f15c99c72ac2e647a08b75 Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 10:26:40 +0800 Subject: [PATCH 06/16] refactor(common-scripts): if to switch for more clear --- packages/common-scripts/src/omnilock.ts | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/common-scripts/src/omnilock.ts b/packages/common-scripts/src/omnilock.ts index 2c0eb4009..ebdb043e3 100644 --- a/packages/common-scripts/src/omnilock.ts +++ b/packages/common-scripts/src/omnilock.ts @@ -88,18 +88,21 @@ export function createOmnilockScript( } const args = (() => { - if (omnilockInfo.auth.flag === "ETHEREUM") { - return bytes.hexify(bytes.concat([1], omnilockInfo.auth.content, [0])); + const flag = omnilockInfo.auth.flag; + switch (flag) { + case "ETHEREUM": + return bytes.hexify(bytes.concat([1], omnilockInfo.auth.content, [0])); + case "SECP256K1_BLAKE160": + return bytes.hexify(bytes.concat([0], omnilockInfo.auth.content, [0])); + case "BITCOIN": + return bytes.hexify( + bytes.concat([4], bitcoin.decodeAddress(omnilockInfo.auth.address), [ + 0, + ]) + ); + default: + throw new Error(`Not supported flag: ${flag}.`); } - if (omnilockInfo.auth.flag === "SECP256K1_BLAKE160") { - return bytes.hexify(bytes.concat([0], omnilockInfo.auth.content, [0])); - } - if (omnilockInfo.auth.flag === "BITCOIN") { - return bytes.hexify( - bytes.concat([4], bitcoin.decodeAddress(omnilockInfo.auth.address), [0]) - ); - } - throw new Error(`Not supported flag: ${omnilockInfo.auth}.`); })(); const script: Script = { From a5b6a08354cf29ccba77d072ad4be3d230790ac6 Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 12:03:53 +0800 Subject: [PATCH 07/16] fix(debugger): debug message output to stdout no longer stderr --- packages/debugger/tests/context.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/debugger/tests/context.test.ts b/packages/debugger/tests/context.test.ts index 24c22d8b2..867d6f8aa 100644 --- a/packages/debugger/tests/context.test.ts +++ b/packages/debugger/tests/context.test.ts @@ -200,7 +200,7 @@ test("context#CKBDebugger with printf debug message", async (t) => { scriptHash: computeScriptHash(debugScript), }); - t.regex(result.debugMessage, /debugger print utf-8 string/); + t.regex(result.message, /debugger print utf-8 string/); t.is(result.code, 0); }); From 30b3faaff0447f5706fec52986fa1e2b1d16df7d Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 15:38:58 +0800 Subject: [PATCH 08/16] feat(lumos): export omnilock --- packages/lumos/.gitignore | 1 + packages/lumos/src/common-scripts/index.ts | 1 + packages/lumos/src/common-scripts/omnilock.ts | 9 +++++++++ 3 files changed, 11 insertions(+) create mode 100644 packages/lumos/src/common-scripts/omnilock.ts diff --git a/packages/lumos/.gitignore b/packages/lumos/.gitignore index 26cfec3ac..4d8ef3e74 100644 --- a/packages/lumos/.gitignore +++ b/packages/lumos/.gitignore @@ -1,5 +1,6 @@ * !src +!src/* !.gitignore !.npmignore !CHANGELOG.md diff --git a/packages/lumos/src/common-scripts/index.ts b/packages/lumos/src/common-scripts/index.ts index 1b49ae386..d9f4901e8 100644 --- a/packages/lumos/src/common-scripts/index.ts +++ b/packages/lumos/src/common-scripts/index.ts @@ -4,6 +4,7 @@ export * as sudt from "./sudt"; export * as secp256k1Blake160 from "./secp256k1-blake160"; export * as secp256k1Blake160Multisig from "./secp256k1-blake160-multisig"; export * as anyoneCanPay from "./anyone-can-pay"; +export * as omnilock from "./omnilock"; export { parseFromInfo, serializeMultisigScript, diff --git a/packages/lumos/src/common-scripts/omnilock.ts b/packages/lumos/src/common-scripts/omnilock.ts new file mode 100644 index 000000000..99070eaba --- /dev/null +++ b/packages/lumos/src/common-scripts/omnilock.ts @@ -0,0 +1,9 @@ +export { + bitcoin, + OmnilockWitnessLock, + createOmnilockScript, + setupInputCell, + CellCollector, + prepareSigningEntries, +} from "@ckb-lumos/common-scripts/lib/omnilock"; +export type { OmnilockInfo } from "@ckb-lumos/common-scripts/lib/omnilock"; From 5df49567c6f17899eca6ed6cd48931c76c79f75a Mon Sep 17 00:00:00 2001 From: homura Date: Thu, 11 Jan 2024 15:40:08 +0800 Subject: [PATCH 09/16] chore(examples): demo for using unisat with lumos --- examples/omni-lock-unisat/README.md | 21 ++++ examples/omni-lock-unisat/index.html | 13 +++ examples/omni-lock-unisat/index.tsx | 95 +++++++++++++++++ examples/omni-lock-unisat/lib.ts | 134 ++++++++++++++++++++++++ examples/omni-lock-unisat/package.json | 22 ++++ examples/omni-lock-unisat/tsconfig.json | 9 ++ examples/pnpm-lock.yaml | 30 +++++- 7 files changed, 322 insertions(+), 2 deletions(-) create mode 100644 examples/omni-lock-unisat/README.md create mode 100644 examples/omni-lock-unisat/index.html create mode 100644 examples/omni-lock-unisat/index.tsx create mode 100644 examples/omni-lock-unisat/lib.ts create mode 100644 examples/omni-lock-unisat/package.json create mode 100644 examples/omni-lock-unisat/tsconfig.json diff --git a/examples/omni-lock-unisat/README.md b/examples/omni-lock-unisat/README.md new file mode 100644 index 000000000..56bea684d --- /dev/null +++ b/examples/omni-lock-unisat/README.md @@ -0,0 +1,21 @@ +# Lumos Works with UniSat + +Nervos maintains a powerful lock +called [Omni Lock](https://github.com/XuJiandong/docs-bank/blob/master/omni_lock.md) (previously named RC lock), which +can use MetaMask as a signer. This example will show how to use Lumos to send a transaction using Omni lock and MetaMask + +## Quick Start + +> we should [build](..) Lumos project first before we start this example + +``` +npm run build +cd examples/omni-lock- +npm start +``` + +## Links + +- [MetaMask](https://unisat.io/) - A crypto wallet for Bitcoin +- [Nervos Faucet](https://faucet.nervos.org/) - Claim Nervos testnet CKB +- [Omnilock](https://github.com/nervosnetwork/rfcs/blob/master/rfcs/0042-omnilock/0042-omnilock.md) - Omni lock intro diff --git a/examples/omni-lock-unisat/index.html b/examples/omni-lock-unisat/index.html new file mode 100644 index 000000000..a243ae789 --- /dev/null +++ b/examples/omni-lock-unisat/index.html @@ -0,0 +1,13 @@ + + + + + + + Lumos ❤️ UniSat + + +
+ + + diff --git a/examples/omni-lock-unisat/index.tsx b/examples/omni-lock-unisat/index.tsx new file mode 100644 index 000000000..206f0f35f --- /dev/null +++ b/examples/omni-lock-unisat/index.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useState } from "react"; +import { helpers, Script, config, commons } from "@ckb-lumos/lumos"; +import ReactDOM from "react-dom"; +import { asyncSleep, capacityOf, unisat, transfer } from "./lib"; + +// use testnet config +config.initializeConfig(config.predefined.AGGRON4); + +const App: React.FC = () => { + const [bitcoinAddr, setBitcoinAddr] = useState(""); + const [omniAddr, setOmniAddr] = useState(""); + const [omniLock, setOmniLock] = useState