@ckb-ccc/core 0.0.11-alpha.2 → 0.0.12-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/address/index.d.ts.map +1 -1
  2. package/dist/ckb/script.d.ts +1 -5
  3. package/dist/ckb/script.d.ts.map +1 -1
  4. package/dist/ckb/transaction.d.ts +32 -39
  5. package/dist/ckb/transaction.d.ts.map +1 -1
  6. package/dist/ckb/transaction.js +58 -16
  7. package/dist/client/client.advanced.d.ts.map +1 -1
  8. package/dist/client/client.d.ts +1 -0
  9. package/dist/client/client.d.ts.map +1 -1
  10. package/dist/client/client.js +10 -4
  11. package/dist/client/clientPublicMainnet.advanced.d.ts.map +1 -1
  12. package/dist/client/clientPublicMainnet.advanced.js +22 -2
  13. package/dist/client/clientPublicMainnet.d.ts +4 -1
  14. package/dist/client/clientPublicMainnet.d.ts.map +1 -1
  15. package/dist/client/clientPublicMainnet.js +3 -2
  16. package/dist/client/clientPublicTestnet.advanced.d.ts.map +1 -1
  17. package/dist/client/clientPublicTestnet.advanced.js +22 -2
  18. package/dist/client/clientPublicTestnet.d.ts +4 -1
  19. package/dist/client/clientPublicTestnet.d.ts.map +1 -1
  20. package/dist/client/clientPublicTestnet.js +3 -2
  21. package/dist/client/jsonRpc/index.d.ts.map +1 -1
  22. package/dist/fixedPoint/index.d.ts +2 -2
  23. package/dist/fixedPoint/index.d.ts.map +1 -1
  24. package/dist/hasher/hasher.d.ts +32 -0
  25. package/dist/hasher/hasher.d.ts.map +1 -0
  26. package/dist/hasher/hasher.js +1 -0
  27. package/dist/hasher/hasherCkb.d.ts +68 -0
  28. package/dist/hasher/hasherCkb.d.ts.map +1 -0
  29. package/dist/hasher/hasherCkb.js +83 -0
  30. package/dist/hasher/hasherKeecak256.d.ts +38 -0
  31. package/dist/hasher/hasherKeecak256.d.ts.map +1 -0
  32. package/dist/hasher/hasherKeecak256.js +43 -0
  33. package/dist/hasher/index.d.ts +3 -66
  34. package/dist/hasher/index.d.ts.map +1 -1
  35. package/dist/hasher/index.js +3 -79
  36. package/dist/keystore/index.d.ts +2 -2
  37. package/dist/keystore/index.d.ts.map +1 -1
  38. package/dist/signer/evm/signerEvm.d.ts +13 -4
  39. package/dist/signer/evm/signerEvm.d.ts.map +1 -1
  40. package/dist/signer/evm/signerEvm.js +63 -11
  41. package/dist/signer/signer/index.d.ts.map +1 -1
  42. package/dist/utils/index.d.ts +1 -1
  43. package/dist/utils/index.d.ts.map +1 -1
  44. package/dist.commonjs/address/index.d.ts.map +1 -1
  45. package/dist.commonjs/ckb/script.d.ts +1 -5
  46. package/dist.commonjs/ckb/script.d.ts.map +1 -1
  47. package/dist.commonjs/ckb/transaction.d.ts +32 -39
  48. package/dist.commonjs/ckb/transaction.d.ts.map +1 -1
  49. package/dist.commonjs/ckb/transaction.js +57 -15
  50. package/dist.commonjs/client/client.advanced.d.ts.map +1 -1
  51. package/dist.commonjs/client/client.d.ts +1 -0
  52. package/dist.commonjs/client/client.d.ts.map +1 -1
  53. package/dist.commonjs/client/client.js +10 -4
  54. package/dist.commonjs/client/clientPublicMainnet.advanced.d.ts.map +1 -1
  55. package/dist.commonjs/client/clientPublicMainnet.advanced.js +22 -2
  56. package/dist.commonjs/client/clientPublicMainnet.d.ts +4 -1
  57. package/dist.commonjs/client/clientPublicMainnet.d.ts.map +1 -1
  58. package/dist.commonjs/client/clientPublicMainnet.js +3 -2
  59. package/dist.commonjs/client/clientPublicTestnet.advanced.d.ts.map +1 -1
  60. package/dist.commonjs/client/clientPublicTestnet.advanced.js +22 -2
  61. package/dist.commonjs/client/clientPublicTestnet.d.ts +4 -1
  62. package/dist.commonjs/client/clientPublicTestnet.d.ts.map +1 -1
  63. package/dist.commonjs/client/clientPublicTestnet.js +3 -2
  64. package/dist.commonjs/client/jsonRpc/index.d.ts.map +1 -1
  65. package/dist.commonjs/fixedPoint/index.d.ts +2 -2
  66. package/dist.commonjs/fixedPoint/index.d.ts.map +1 -1
  67. package/dist.commonjs/hasher/hasher.d.ts +32 -0
  68. package/dist.commonjs/hasher/hasher.d.ts.map +1 -0
  69. package/dist.commonjs/hasher/hasher.js +2 -0
  70. package/dist.commonjs/hasher/hasherCkb.d.ts +68 -0
  71. package/dist.commonjs/hasher/hasherCkb.d.ts.map +1 -0
  72. package/dist.commonjs/hasher/hasherCkb.js +89 -0
  73. package/dist.commonjs/hasher/hasherKeecak256.d.ts +38 -0
  74. package/dist.commonjs/hasher/hasherKeecak256.d.ts.map +1 -0
  75. package/dist.commonjs/hasher/hasherKeecak256.js +47 -0
  76. package/dist.commonjs/hasher/index.d.ts +3 -66
  77. package/dist.commonjs/hasher/index.d.ts.map +1 -1
  78. package/dist.commonjs/hasher/index.js +16 -85
  79. package/dist.commonjs/keystore/index.d.ts +2 -2
  80. package/dist.commonjs/keystore/index.d.ts.map +1 -1
  81. package/dist.commonjs/signer/evm/signerEvm.d.ts +13 -4
  82. package/dist.commonjs/signer/evm/signerEvm.d.ts.map +1 -1
  83. package/dist.commonjs/signer/evm/signerEvm.js +72 -20
  84. package/dist.commonjs/signer/signer/index.d.ts.map +1 -1
  85. package/dist.commonjs/utils/index.d.ts +1 -1
  86. package/dist.commonjs/utils/index.d.ts.map +1 -1
  87. package/package.json +2 -3
  88. package/src/address/index.ts +1 -1
  89. package/src/ckb/script.ts +1 -1
  90. package/src/ckb/transaction.ts +75 -22
  91. package/src/client/client.advanced.ts +1 -1
  92. package/src/client/client.ts +15 -4
  93. package/src/client/clientPublicMainnet.advanced.ts +25 -2
  94. package/src/client/clientPublicMainnet.ts +6 -2
  95. package/src/client/clientPublicTestnet.advanced.ts +25 -2
  96. package/src/client/clientPublicTestnet.ts +6 -2
  97. package/src/client/jsonRpc/index.ts +3 -3
  98. package/src/fixedPoint/index.ts +2 -2
  99. package/src/hasher/hasher.ts +35 -0
  100. package/src/hasher/hasherCkb.ts +102 -0
  101. package/src/hasher/hasherKeecak256.ts +52 -0
  102. package/src/hasher/index.ts +3 -103
  103. package/src/keystore/index.ts +19 -1
  104. package/src/signer/evm/signerEvm.ts +131 -24
  105. package/src/signer/signer/index.ts +1 -1
  106. package/src/utils/index.ts +2 -2
@@ -5,20 +5,21 @@ const index_js_1 = require("../../address/index.js");
5
5
  const index_js_2 = require("../../bytes/index.js");
6
6
  const index_js_3 = require("../../ckb/index.js");
7
7
  const index_js_4 = require("../../client/index.js");
8
- const index_js_5 = require("../../hex/index.js");
9
- const index_js_6 = require("../../num/index.js");
10
- const index_js_7 = require("../../utils/index.js");
11
- const index_js_8 = require("../signer/index.js");
8
+ const index_js_5 = require("../../hasher/index.js");
9
+ const index_js_6 = require("../../hex/index.js");
10
+ const index_js_7 = require("../../num/index.js");
11
+ const index_js_8 = require("../../utils/index.js");
12
+ const index_js_9 = require("../signer/index.js");
12
13
  /**
13
14
  * An abstract class extending Signer for Ethereum Virtual Machine (EVM) based signing operations.
14
15
  * This class provides methods to get EVM account, internal address, and signing transactions.
15
16
  */
16
- class SignerEvm extends index_js_8.Signer {
17
+ class SignerEvm extends index_js_9.Signer {
17
18
  get type() {
18
- return index_js_8.SignerType.EVM;
19
+ return index_js_9.SignerType.EVM;
19
20
  }
20
21
  get signType() {
21
- return index_js_8.SignerSignType.EvmPersonal;
22
+ return index_js_9.SignerSignType.EvmPersonal;
22
23
  }
23
24
  /**
24
25
  * Gets the internal address, which is the EVM account in this case.
@@ -35,16 +36,37 @@ class SignerEvm extends index_js_8.Signer {
35
36
  */
36
37
  async getAddressObjs() {
37
38
  const account = await this.getEvmAccount();
38
- return [
39
- await this._getOmniLockEvmAddressObj(account),
40
- await this._getOmniLockOldEvmAddressObj(account),
41
- ];
39
+ const addresses = await Promise.all([
40
+ this._getOmniLockAddresses(account),
41
+ this._getPWLockAddresses(account),
42
+ ]);
43
+ return addresses.flat();
44
+ }
45
+ _getOmniLockAddresses(account) {
46
+ return Promise.all([
47
+ this._getOmniLockEvmAddressObj(account),
48
+ this._getOmniLockOldEvmAddressObj(account),
49
+ ]);
50
+ }
51
+ async _getPWLockAddresses(account) {
52
+ const addr = await this._getPWLockEvmAddressObj(account);
53
+ if (!addr) {
54
+ return [];
55
+ }
56
+ return [addr];
42
57
  }
43
58
  async _getOmniLockEvmAddressObj(account) {
44
- return index_js_1.Address.fromKnownScript(this.client, index_js_4.KnownScript.OmniLock, (0, index_js_5.hexFrom)([0x12, ...(0, index_js_2.bytesFrom)(account), 0x00]));
59
+ return index_js_1.Address.fromKnownScript(this.client, index_js_4.KnownScript.OmniLock, (0, index_js_6.hexFrom)([0x12, ...(0, index_js_2.bytesFrom)(account), 0x00]));
45
60
  }
46
61
  async _getOmniLockOldEvmAddressObj(account) {
47
- return index_js_1.Address.fromKnownScript(this.client, index_js_4.KnownScript.OmniLock, (0, index_js_5.hexFrom)([0x1, ...(0, index_js_2.bytesFrom)(account), 0x00]));
62
+ return index_js_1.Address.fromKnownScript(this.client, index_js_4.KnownScript.OmniLock, (0, index_js_6.hexFrom)([0x1, ...(0, index_js_2.bytesFrom)(account), 0x00]));
63
+ }
64
+ async _getPWLockEvmAddressObj(account) {
65
+ try {
66
+ return index_js_1.Address.fromKnownScript(this.client, index_js_4.KnownScript.PWLock, (0, index_js_6.hexFrom)((0, index_js_2.bytesFrom)(account)));
67
+ }
68
+ catch { }
69
+ return;
48
70
  }
49
71
  /**
50
72
  * prepare a transaction before signing. This method is not implemented and should be overridden by subclasses.
@@ -54,8 +76,17 @@ class SignerEvm extends index_js_8.Signer {
54
76
  */
55
77
  async prepareTransaction(txLike) {
56
78
  const tx = index_js_3.Transaction.from(txLike);
57
- await tx.addCellDepsOfKnownScripts(this.client, index_js_4.KnownScript.OmniLock);
58
- return (0, index_js_7.reduceAsync)(await this.getAddressObjs(), (tx, { script }) => tx.prepareSighashAllWitness(script, 85, this.client), tx);
79
+ if ((await tx.findInputIndexByLockId(await this.client.getKnownScript(index_js_4.KnownScript.OmniLock), this.client)) !== undefined) {
80
+ await tx.addCellDepsOfKnownScripts(this.client, index_js_4.KnownScript.OmniLock);
81
+ }
82
+ if ((await tx.findInputIndexByLockId(await this.client.getKnownScript(index_js_4.KnownScript.PWLock), this.client)) !== undefined) {
83
+ await tx.addCellDepsOfKnownScripts(this.client, index_js_4.KnownScript.PWLock);
84
+ }
85
+ const account = await this.getEvmAccount();
86
+ const omniLockAddresses = await this._getOmniLockAddresses(account);
87
+ const pwLockAddresses = await this._getPWLockAddresses(account);
88
+ const omniTx = (0, index_js_8.reduceAsync)(omniLockAddresses, (tx, { script }) => tx.prepareSighashAllWitness(script, 85, this.client), tx);
89
+ return (0, index_js_8.reduceAsync)(pwLockAddresses, (tx, { script }) => tx.prepareSighashAllWitness(script, 65, this.client), omniTx);
59
90
  }
60
91
  /**
61
92
  * Signs a transaction without modifying it.
@@ -70,21 +101,42 @@ class SignerEvm extends index_js_8.Signer {
70
101
  const { script: oldEvmScript } = await this._getOmniLockOldEvmAddressObj(account);
71
102
  tx = await this._signOmniLockScriptForTransaction(tx, evmScript, (hash) => `CKB transaction: ${hash}`);
72
103
  tx = await this._signOmniLockScriptForTransaction(tx, oldEvmScript, (hash) => (0, index_js_2.bytesFrom)(hash));
104
+ const pwAddress = await this._getPWLockEvmAddressObj(account);
105
+ if (pwAddress) {
106
+ tx = await this._signPWLockScriptForTransaction(tx, pwAddress.script, (hash) => (0, index_js_2.bytesFrom)(hash));
107
+ }
73
108
  return tx;
74
109
  }
75
110
  async _signOmniLockScriptForTransaction(tx, script, messageTransformer) {
76
- const info = await tx.getSignHashInfo(script, this.client);
111
+ const info = await this._signPersonalEvmForTransaction(tx, script, messageTransformer);
77
112
  if (!info) {
78
113
  return tx;
79
114
  }
80
- const signature = (0, index_js_2.bytesFrom)(await this.signMessageRaw(messageTransformer(info.message)));
81
- if (signature[signature.length - 1] >= 27) {
82
- signature[signature.length - 1] -= 27;
115
+ const witness = index_js_3.WitnessArgs.fromBytes(tx.witnesses[info.position]);
116
+ witness.lock = (0, index_js_6.hexFrom)((0, index_js_2.bytesConcat)((0, index_js_7.numToBytes)(5 * 4 + info.signature.length, 4), (0, index_js_7.numToBytes)(4 * 4, 4), (0, index_js_7.numToBytes)(5 * 4 + info.signature.length, 4), (0, index_js_7.numToBytes)(5 * 4 + info.signature.length, 4), (0, index_js_7.numToBytes)(info.signature.length, 4), info.signature));
117
+ tx.setWitnessArgsAt(info.position, witness);
118
+ return tx;
119
+ }
120
+ async _signPWLockScriptForTransaction(tx, script, messageTransformer) {
121
+ const info = await this._signPersonalEvmForTransaction(tx, script, messageTransformer, new index_js_5.HasherKeecak256());
122
+ if (!info) {
123
+ return tx;
83
124
  }
84
125
  const witness = index_js_3.WitnessArgs.fromBytes(tx.witnesses[info.position]);
85
- witness.lock = (0, index_js_5.hexFrom)((0, index_js_2.bytesConcat)((0, index_js_6.numToBytes)(5 * 4 + signature.length, 4), (0, index_js_6.numToBytes)(4 * 4, 4), (0, index_js_6.numToBytes)(5 * 4 + signature.length, 4), (0, index_js_6.numToBytes)(5 * 4 + signature.length, 4), (0, index_js_6.numToBytes)(signature.length, 4), signature));
126
+ witness.lock = (0, index_js_6.hexFrom)(info.signature);
86
127
  tx.setWitnessArgsAt(info.position, witness);
87
128
  return tx;
88
129
  }
130
+ async _signPersonalEvmForTransaction(tx, script, messageTransformer, hasher) {
131
+ const info = await tx.getSignHashInfo(script, this.client, hasher);
132
+ if (!info) {
133
+ return;
134
+ }
135
+ const signature = (0, index_js_2.bytesFrom)(await this.signMessageRaw(messageTransformer(info.message)));
136
+ if (signature[signature.length - 1] >= 27) {
137
+ signature[signature.length - 1] -= 27;
138
+ }
139
+ return { signature, position: info.position };
140
+ }
89
141
  }
90
142
  exports.SignerEvm = SignerEvm;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/signer/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/signer/index.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,6 @@ export declare function reduceAsync<T, V>(values: T[], accumulator: (a: T, b: T)
71
71
  * @param init - The initial value.
72
72
  * @returns The accumulated result.
73
73
  */
74
- export declare function reduceAsync<T, V>(values: V[], accumulator: (a: T, b: V, i: number, values: V[]) => Promise<T | undefined | null | void> | T | undefined | null | void, init: T): Promise<T>;
74
+ export declare function reduceAsync<T, V>(values: V[], accumulator: (a: T, b: V, i: number, values: V[]) => Promise<T | undefined | null | void> | T | undefined | null | void, init: T | Promise<T>): Promise<T>;
75
75
  export declare function isWebview(userAgent: string): boolean;
76
76
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,SAAS,GACf,SAAS,CAAC;AACb;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC;AAChF;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACrE;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,CAAC,GAAG,SAAS,GACnB,CAAC,GAAG,SAAS,CAAC;AACjB;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,CAAC,GAAG,IAAI,GACd,CAAC,GAAG,SAAS,CAAC;AACjB;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,SAAS,CAAC;AACb;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,GAC1B,CAAC,GAAG,SAAS,CAAC;AAmBjB;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACpC,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,CACX,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,KACD,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GACtE,OAAO,CAAC,CAAC,CAAC,CAAC;AACd;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACpC,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,CACX,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,CAAC,EAAE,KACR,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,EACvE,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,CAAC,CAAC,CAAC;AA4Bd,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEpD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,SAAS,GACf,SAAS,CAAC;AACb;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC;AAChF;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;AACrE;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,CAAC,GAAG,SAAS,GACnB,CAAC,GAAG,SAAS,CAAC;AACjB;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,CAAC,GAAG,IAAI,GACd,CAAC,GAAG,SAAS,CAAC;AACjB;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,SAAS,CAAC;AACb;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,GAC1B,CAAC,GAAG,SAAS,CAAC;AAmBjB;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACpC,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,CACX,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,KACD,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GACtE,OAAO,CAAC,CAAC,CAAC,CAAC;AACd;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACpC,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,CACX,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,CAAC,EAAE,KACR,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,EACvE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAAC;AA4Bd,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckb-ccc/core",
3
- "version": "0.0.11-alpha.2",
3
+ "version": "0.0.12-alpha.0",
4
4
  "description": "Core of CCC - CKBer's Codebase",
5
5
  "author": "Hanssen0 <hanssen0@hanssen0.com>",
6
6
  "license": "MIT",
@@ -65,10 +65,9 @@
65
65
  "abort-controller": "^3.0.0",
66
66
  "bech32": "^2.0.0",
67
67
  "bitcoinjs-message": "^2.2.0",
68
- "blake2b": "^2.1.4",
69
68
  "buffer": "^6.0.3",
70
69
  "cross-fetch": "^4.0.0",
71
70
  "ethers": "^6.13.1"
72
71
  },
73
- "gitHead": "fd2ee28eac9dc6a3572181b9da05eba204ee13df"
72
+ "gitHead": "171a9941a56575dd5db2e3fad21d04bff8ec3fc5"
74
73
  }
@@ -94,7 +94,7 @@ export class Address {
94
94
  client: Client,
95
95
  script: KnownScript,
96
96
  args: HexLike,
97
- ) {
97
+ ): Promise<Address> {
98
98
  return Address.from({
99
99
  script: await Script.fromKnownScript(client, script, args),
100
100
  prefix: client.addressPrefix,
package/src/ckb/script.ts CHANGED
@@ -180,7 +180,7 @@ export class Script {
180
180
  * @returns An object representing the script in molecule data format.
181
181
  */
182
182
 
183
- _toMolData() {
183
+ _toMolData(): mol.ScriptType {
184
184
  return {
185
185
  codeHash: bytesFrom(this.codeHash),
186
186
  hashType: hashTypeToBytes(this.hashType),
@@ -7,7 +7,7 @@ import {
7
7
  fixedPointFrom,
8
8
  fixedPointToString,
9
9
  } from "../fixedPoint/index.js";
10
- import { Hasher, hashCkb } from "../hasher/index.js";
10
+ import { Hasher, HasherCkb, hashCkb } from "../hasher/index.js";
11
11
  import { Hex, HexLike, hexFrom } from "../hex/index.js";
12
12
  import {
13
13
  Num,
@@ -148,7 +148,7 @@ export class OutPoint {
148
148
  * @returns An object representing the outpoint in molecule data format.
149
149
  */
150
150
 
151
- _toMolData() {
151
+ _toMolData(): mol.OutPointType {
152
152
  return {
153
153
  txHash: bytesFrom(this.txHash),
154
154
  index: numToBytes(this.index, 4),
@@ -282,7 +282,7 @@ export class CellOutput {
282
282
  * @returns An object representing the cell output in molecule data format.
283
283
  */
284
284
 
285
- _toMolData() {
285
+ _toMolData(): mol.CellOutputType {
286
286
  return {
287
287
  capacity: numToBytes(this.capacity, 8),
288
288
  lock: this.lock._toMolData(),
@@ -488,7 +488,7 @@ export class CellInput {
488
488
  * @returns An object representing the cell input in molecule data format.
489
489
  */
490
490
 
491
- _toMolData() {
491
+ _toMolData(): mol.CellInputType {
492
492
  return {
493
493
  previousOutput: this.previousOutput._toMolData(),
494
494
  since: numToBytes(this.since, 8),
@@ -599,7 +599,7 @@ export class CellDep {
599
599
  * @returns An object representing the cell dependency in molecule data format.
600
600
  */
601
601
 
602
- _toMolData() {
602
+ _toMolData(): mol.CellDepType {
603
603
  return {
604
604
  outPoint: this.outPoint._toMolData(),
605
605
  depType: depTypeToBytes(this.depType),
@@ -716,7 +716,7 @@ export class WitnessArgs {
716
716
  * @returns An object representing the witness arguments in molecule data format.
717
717
  */
718
718
 
719
- _toMolData() {
719
+ _toMolData(): mol.WitnessArgsType {
720
720
  return {
721
721
  lock: apply(bytesFrom, this.lock),
722
722
  inputType: apply(bytesFrom, this.inputType),
@@ -765,7 +765,7 @@ export class WitnessArgs {
765
765
  }
766
766
  }
767
767
 
768
- export function udtBalanceFrom(dataLike: BytesLike) {
768
+ export function udtBalanceFrom(dataLike: BytesLike): Num {
769
769
  const data = bytesFrom(dataLike).slice(0, 16);
770
770
  if (data.length !== 16) {
771
771
  throw new Error("Invalid UDT cell data");
@@ -1028,7 +1028,7 @@ export class Transaction {
1028
1028
  * ```
1029
1029
  */
1030
1030
 
1031
- hash() {
1031
+ hash(): Hex {
1032
1032
  return hashCkb(this.rawToBytes());
1033
1033
  }
1034
1034
 
@@ -1070,10 +1070,10 @@ export class Transaction {
1070
1070
  async getSignHashInfo(
1071
1071
  scriptLike: ScriptLike,
1072
1072
  client: Client,
1073
+ hasher: Hasher = new HasherCkb(),
1073
1074
  ): Promise<{ message: Hex; position: number } | undefined> {
1074
1075
  const script = Script.from(scriptLike);
1075
1076
  let position = -1;
1076
- const hasher = new Hasher();
1077
1077
  hasher.update(this.hash());
1078
1078
 
1079
1079
  for (let i = 0; i < this.witnesses.length; i += 1) {
@@ -1111,6 +1111,40 @@ export class Transaction {
1111
1111
  };
1112
1112
  }
1113
1113
 
1114
+ /**
1115
+ * Find the first occurrence of a input with the specified lock id
1116
+ *
1117
+ * @param scriptIdLike - The script associated with the transaction, represented as a ScriptLike object without args.
1118
+ * @param client - The client for complete extra infos in the transaction.
1119
+ * @returns A promise that resolves to the found index
1120
+ *
1121
+ * @example
1122
+ * ```typescript
1123
+ * const index = await tx.findInputIndexByLockId(scriptIdLike, client);
1124
+ * ```
1125
+ */
1126
+ async findInputIndexByLockId(
1127
+ scriptLike: Pick<ScriptLike, "codeHash" | "hashType">,
1128
+ client: Client,
1129
+ ): Promise<number | undefined> {
1130
+ const script = Script.from({ ...scriptLike, args: "0x" });
1131
+
1132
+ for (let i = 0; i < this.inputs.length; i += 1) {
1133
+ const input = this.inputs[i];
1134
+ await input.completeExtraInfos(client);
1135
+ if (!input.cellOutput) {
1136
+ throw new Error("Unable to complete input");
1137
+ }
1138
+
1139
+ if (
1140
+ script.codeHash === input.cellOutput.lock.codeHash &&
1141
+ script.hashType === input.cellOutput.lock.hashType
1142
+ ) {
1143
+ return i;
1144
+ }
1145
+ }
1146
+ }
1147
+
1114
1148
  /**
1115
1149
  * Find the first occurrence of a input with the specified lock
1116
1150
  *
@@ -1194,6 +1228,27 @@ export class Transaction {
1194
1228
  });
1195
1229
  }
1196
1230
 
1231
+ /**
1232
+ * Add cell deps at the start if they are not existed
1233
+ *
1234
+ * @param cellDepLikes - The cell deps to add
1235
+ *
1236
+ * @example
1237
+ * ```typescript
1238
+ * tx.addCellDepsAtBegin(cellDep);
1239
+ * ```
1240
+ */
1241
+ addCellDepsAtStart(...cellDepsLike: (CellDepLike | CellDepLike[])[]): void {
1242
+ cellDepsLike.flat().forEach((cellDepLike) => {
1243
+ const cellDep = CellDep.from(cellDepLike);
1244
+ if (this.cellDeps.some((c) => c.eq(cellDep))) {
1245
+ return;
1246
+ }
1247
+
1248
+ this.cellDeps.unshift(cellDep);
1249
+ });
1250
+ }
1251
+
1197
1252
  /**
1198
1253
  * Add cell dep from infos if they are not existed
1199
1254
  *
@@ -1572,10 +1627,10 @@ export class Transaction {
1572
1627
  let leastExtraCapacity = Zero;
1573
1628
 
1574
1629
  while (true) {
1575
- const prepared = await from.prepareTransaction(this.clone());
1630
+ const tx = this.clone();
1576
1631
  const collected = await (async () => {
1577
1632
  try {
1578
- return await prepared.completeInputsByCapacity(
1633
+ return await tx.completeInputsByCapacity(
1579
1634
  from,
1580
1635
  leastFee + leastExtraCapacity,
1581
1636
  filter,
@@ -1589,22 +1644,21 @@ export class Transaction {
1589
1644
  }
1590
1645
  })();
1591
1646
 
1647
+ await from.prepareTransaction(tx);
1592
1648
  if (leastFee === Zero) {
1593
1649
  // The initial fee is calculated based on prepared transaction
1594
- leastFee = prepared.estimateFee(feeRate);
1650
+ leastFee = tx.estimateFee(feeRate);
1595
1651
  }
1596
1652
  const extraCapacity =
1597
- (await prepared.getInputsCapacity(from.client)) -
1598
- prepared.getOutputsCapacity();
1653
+ (await tx.getInputsCapacity(from.client)) - tx.getOutputsCapacity();
1599
1654
  // The extra capacity paid the fee without a change
1600
1655
  if (extraCapacity === leastFee) {
1601
- this.copy(prepared);
1656
+ this.copy(tx);
1602
1657
  return [collected, false];
1603
1658
  }
1604
1659
 
1605
- let changed = prepared.clone();
1606
1660
  const needed = numFrom(
1607
- await Promise.resolve(change(changed, extraCapacity - leastFee)),
1661
+ await Promise.resolve(change(tx, extraCapacity - leastFee)),
1608
1662
  );
1609
1663
  // No enough extra capacity to create new cells for change
1610
1664
  if (needed > Zero) {
@@ -1613,8 +1667,7 @@ export class Transaction {
1613
1667
  }
1614
1668
 
1615
1669
  if (
1616
- (await changed.getInputsCapacity(from.client)) -
1617
- changed.getOutputsCapacity() !==
1670
+ (await tx.getInputsCapacity(from.client)) - tx.getOutputsCapacity() !==
1618
1671
  leastFee
1619
1672
  ) {
1620
1673
  throw new Error(
@@ -1623,14 +1676,14 @@ export class Transaction {
1623
1676
  }
1624
1677
 
1625
1678
  // New change cells created, update the fee
1626
- await from.prepareTransaction(changed);
1627
- const changedFee = changed.estimateFee(feeRate);
1679
+ await from.prepareTransaction(tx);
1680
+ const changedFee = tx.estimateFee(feeRate);
1628
1681
  if (leastFee > changedFee) {
1629
1682
  throw new Error("The change function removed existed transaction data");
1630
1683
  }
1631
1684
  // The fee has been paid
1632
1685
  if (leastFee === changedFee) {
1633
- this.copy(changed);
1686
+ this.copy(tx);
1634
1687
  return [collected, true];
1635
1688
  }
1636
1689
 
@@ -57,7 +57,7 @@ export function filterScript(
57
57
  export function filterNumByRange(
58
58
  lengthLike: NumLike,
59
59
  range: [NumLike, NumLike] | undefined,
60
- ) {
60
+ ): boolean {
61
61
  if (!range) {
62
62
  return true;
63
63
  }
@@ -36,6 +36,7 @@ export enum KnownScript {
36
36
  XUdt = "XUdt",
37
37
  JoyId = "JoyId",
38
38
  COTA = "COTA",
39
+ PWLock = "PWLock",
39
40
  OmniLock = "OmniLock",
40
41
  NostrLock = "NostrLock",
41
42
  UniqueType = "UniqueType",
@@ -198,16 +199,26 @@ export abstract class Client {
198
199
  limit = 10,
199
200
  ): AsyncGenerator<Cell> {
200
201
  const key = ClientIndexerSearchKey.from(keyLike);
202
+ const foundedOutPoints = [];
203
+
201
204
  for (const cell of this.usableCells) {
202
- if (filterCell(key, cell)) {
203
- yield cell;
205
+ if (!filterCell(key, cell)) {
206
+ continue;
204
207
  }
208
+
209
+ foundedOutPoints.push(cell.outPoint);
210
+ yield cell;
205
211
  }
206
212
 
207
213
  for await (const cell of this.findCells(key, order, limit)) {
208
- if (!this.unusableOutPoints.some((o) => o.eq(cell.outPoint))) {
209
- yield cell;
214
+ if (
215
+ this.unusableOutPoints.some((o) => o.eq(cell.outPoint)) ||
216
+ foundedOutPoints.some((founded) => founded.eq(cell.outPoint))
217
+ ) {
218
+ continue;
210
219
  }
220
+
221
+ yield cell;
211
222
  }
212
223
  }
213
224
 
@@ -5,7 +5,7 @@ export const MAINNET_SCRIPTS: Record<
5
5
  KnownScript,
6
6
  | (Pick<Script, "codeHash" | "hashType"> & { cellDeps: CellDepInfoLike[] })
7
7
  | undefined
8
- > = {
8
+ > = Object.freeze({
9
9
  [KnownScript.Secp256k1Blake160]: {
10
10
  codeHash:
11
11
  "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8",
@@ -114,6 +114,29 @@ export const MAINNET_SCRIPTS: Record<
114
114
  },
115
115
  ],
116
116
  },
117
+ [KnownScript.PWLock]: {
118
+ codeHash:
119
+ "0xbf43c3602455798c1a61a596e0d95278864c552fafe231c063b3fabf97a8febc",
120
+ hashType: "type",
121
+ cellDeps: [
122
+ {
123
+ cellDep: {
124
+ outPoint: {
125
+ txHash:
126
+ "0x1d60cb8f4666e039f418ea94730b1a8c5aa0bf2f7781474406387462924d15d4",
127
+ index: 0,
128
+ },
129
+ depType: "code",
130
+ },
131
+ type: {
132
+ codeHash:
133
+ "0x00000000000000000000000000000000000000000000000000545950455f4944",
134
+ hashType: "type",
135
+ args: "0x42ade2f25eb938b5dbfd3d8f07b8b07aa593d848e7ff14bdfbbea5aeb6175261",
136
+ },
137
+ },
138
+ ],
139
+ },
117
140
  [KnownScript.OmniLock]: {
118
141
  codeHash:
119
142
  "0x9b819793a64463aed77c615d6cb226eea5487ccfc0783043a587254cda2b6f26",
@@ -221,4 +244,4 @@ export const MAINNET_SCRIPTS: Record<
221
244
  },
222
245
  ],
223
246
  },
224
- };
247
+ });
@@ -4,7 +4,11 @@ import { MAINNET_SCRIPTS } from "./clientPublicMainnet.advanced.js";
4
4
  import { ClientJsonRpc } from "./jsonRpc/index.js";
5
5
 
6
6
  export class ClientPublicMainnet extends ClientJsonRpc {
7
- constructor(url = "https://mainnet.ckb.dev/", timeout?: number) {
7
+ constructor(
8
+ url = "https://mainnet.ckb.dev/",
9
+ timeout?: number,
10
+ private readonly scripts = MAINNET_SCRIPTS,
11
+ ) {
8
12
  super(url, timeout);
9
13
  }
10
14
 
@@ -17,7 +21,7 @@ export class ClientPublicMainnet extends ClientJsonRpc {
17
21
  ): Promise<
18
22
  Pick<Script, "codeHash" | "hashType"> & { cellDeps: CellDepInfo[] }
19
23
  > {
20
- const found = MAINNET_SCRIPTS[script];
24
+ const found = this.scripts[script];
21
25
  if (!found) {
22
26
  throw new Error(
23
27
  `No script information was found for ${script} on ${this.addressPrefix}`,
@@ -4,7 +4,7 @@ import { CellDepInfoLike, KnownScript } from "./client.js";
4
4
  export const TESTNET_SCRIPTS: Record<
5
5
  KnownScript,
6
6
  Pick<Script, "codeHash" | "hashType"> & { cellDeps: CellDepInfoLike[] }
7
- > = {
7
+ > = Object.freeze({
8
8
  [KnownScript.Secp256k1Blake160]: {
9
9
  codeHash:
10
10
  "0x9bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce8",
@@ -119,6 +119,29 @@ export const TESTNET_SCRIPTS: Record<
119
119
  },
120
120
  ],
121
121
  },
122
+ [KnownScript.PWLock]: {
123
+ codeHash:
124
+ "0x58c5f491aba6d61678b7cf7edf4910b1f5e00ec0cde2f42e0abb4fd9aff25a63",
125
+ hashType: "type",
126
+ cellDeps: [
127
+ {
128
+ cellDep: {
129
+ outPoint: {
130
+ txHash:
131
+ "0x57a62003daeab9d54aa29b944fc3b451213a5ebdf2e232216a3cfed0dde61b38",
132
+ index: 0,
133
+ },
134
+ depType: "code",
135
+ },
136
+ type: {
137
+ codeHash:
138
+ "0x00000000000000000000000000000000000000000000000000545950455f4944",
139
+ hashType: "type",
140
+ args: "0xf6d90bfe3041d0fd7e01c45770241697f5f837974bd6ae1672a7ec0f9f523268",
141
+ },
142
+ },
143
+ ],
144
+ },
122
145
  [KnownScript.OmniLock]: {
123
146
  codeHash:
124
147
  "0xf329effd1c475a2978453c8600e1eaf0bc2087ee093c3ee64cc96ec6847752cb",
@@ -232,4 +255,4 @@ export const TESTNET_SCRIPTS: Record<
232
255
  },
233
256
  ],
234
257
  },
235
- };
258
+ });
@@ -4,7 +4,11 @@ import { TESTNET_SCRIPTS } from "./clientPublicTestnet.advanced.js";
4
4
  import { ClientJsonRpc } from "./jsonRpc/index.js";
5
5
 
6
6
  export class ClientPublicTestnet extends ClientJsonRpc {
7
- constructor(url = "https://testnet.ckb.dev/", timeout?: number) {
7
+ constructor(
8
+ url = "https://testnet.ckb.dev/",
9
+ timeout?: number,
10
+ private readonly scripts = TESTNET_SCRIPTS,
11
+ ) {
8
12
  super(url, timeout);
9
13
  }
10
14
 
@@ -17,7 +21,7 @@ export class ClientPublicTestnet extends ClientJsonRpc {
17
21
  ): Promise<
18
22
  Pick<Script, "codeHash" | "hashType"> & { cellDeps: CellDepInfo[] }
19
23
  > {
20
- const found = TESTNET_SCRIPTS[script];
24
+ const found = this.scripts[script];
21
25
  return {
22
26
  ...found,
23
27
  cellDeps: found.cellDeps.map((c) => CellDepInfo.from(c)),
@@ -63,7 +63,7 @@ export abstract class ClientJsonRpc extends Client {
63
63
  * @returns The URL of the JSON-RPC server.
64
64
  */
65
65
 
66
- get url() {
66
+ get url(): string {
67
67
  return this.url_;
68
68
  }
69
69
 
@@ -206,7 +206,7 @@ export abstract class ClientJsonRpc extends Client {
206
206
  rpcMethod: string,
207
207
  inTransformers: (((_: any) => unknown) | undefined)[],
208
208
  outTransformer?: (_: any) => unknown,
209
- ) {
209
+ ): (...req: unknown[]) => Promise<unknown> {
210
210
  return async (...req: unknown[]) => {
211
211
  const payload = ClientJsonRpc.buildPayload(
212
212
  rpcMethod,
@@ -234,7 +234,7 @@ export abstract class ClientJsonRpc extends Client {
234
234
  * @throws Will throw an error if the response ID does not match the request ID, or if the response contains an error.
235
235
  */
236
236
 
237
- async send(payload: JsonRpcPayload) {
237
+ async send(payload: JsonRpcPayload): Promise<unknown> {
238
238
  const aborter = new AbortController();
239
239
  const abortTimer = setTimeout(() => aborter.abort(), this.timeout);
240
240
 
@@ -76,11 +76,11 @@ export function fixedPointFrom(val: FixedPointLike, decimals = 8): FixedPoint {
76
76
  * Represents the fixed point value of zero as a bigint.
77
77
  */
78
78
 
79
- export const Zero = 0n;
79
+ export const Zero: FixedPoint = 0n;
80
80
 
81
81
  /**
82
82
  * Represents the fixed point value of one as a FixedPoint (bigint).
83
83
  * Equivalent to 1 in fixed-point representation with default decimals (8).
84
84
  */
85
85
 
86
- export const One = fixedPointFrom("1");
86
+ export const One: FixedPoint = fixedPointFrom("1");