@ckb-ccc/core 0.0.4-alpha.11 → 0.0.4-alpha.13
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.
- package/dist/signer/btc/signerBtcPublicKeyReadonly.js +0 -1
- package/dist/signer/ckb/signerCkbScriptReadonly.js +0 -1
- package/dist/signer/evm/signerEvm.d.ts +5 -1
- package/dist/signer/evm/signerEvm.d.ts.map +1 -1
- package/dist/signer/evm/signerEvm.js +20 -6
- package/dist/signer/evm/signerEvmAddressReadonly.js +0 -1
- package/dist/signer/helpers.d.ts.map +1 -1
- package/dist/signer/helpers.js +3 -2
- package/package.json +2 -2
- package/src/signer/btc/signerBtcPublicKeyReadonly.ts +1 -1
- package/src/signer/ckb/signerCkbScriptReadonly.ts +1 -1
- package/src/signer/evm/signerEvm.ts +55 -12
- package/src/signer/evm/signerEvmAddressReadonly.ts +1 -1
- package/src/signer/helpers.ts +5 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Address } from "../../address";
|
|
2
|
-
import {
|
|
2
|
+
import { BytesLike } from "../../bytes";
|
|
3
|
+
import { Script, Transaction, TransactionLike } from "../../ckb";
|
|
3
4
|
import { Signer } from "../signer";
|
|
4
5
|
/**
|
|
5
6
|
* An abstract class extending Signer for Ethereum Virtual Machine (EVM) based signing operations.
|
|
@@ -24,6 +25,8 @@ export declare abstract class SignerEvm extends Signer {
|
|
|
24
25
|
* @returns A promise that resolves to an array of Address objects.
|
|
25
26
|
*/
|
|
26
27
|
getAddressObjs(): Promise<Address[]>;
|
|
28
|
+
_getOmniLockEvmAddressObj(account: string): Promise<Address>;
|
|
29
|
+
_getOmniLockOldEvmAddressObj(account: string): Promise<Address>;
|
|
27
30
|
/**
|
|
28
31
|
* prepare a transaction before signing. This method is not implemented and should be overridden by subclasses.
|
|
29
32
|
*
|
|
@@ -38,5 +41,6 @@ export declare abstract class SignerEvm extends Signer {
|
|
|
38
41
|
* @returns A promise that resolves to a signed Transaction object.
|
|
39
42
|
*/
|
|
40
43
|
signOnlyTransaction(txLike: TransactionLike): Promise<Transaction>;
|
|
44
|
+
_signOmniLockScriptForTransaction(tx: Transaction, script: Script, messageTransformer: (hash: string) => BytesLike): Promise<Transaction>;
|
|
41
45
|
}
|
|
42
46
|
//# sourceMappingURL=signerEvm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signerEvm.d.ts","sourceRoot":"","sources":["../../../src/signer/evm/signerEvm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"signerEvm.d.ts","sourceRoot":"","sources":["../../../src/signer/evm/signerEvm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAA0B,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAe,MAAM,WAAW,CAAC;AAK9E,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC;;;GAGG;AACH,8BAAsB,SAAU,SAAQ,MAAM;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAEzC;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI3C;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAQpC,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ5D,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrE;;;;;OAKG;IACG,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAYvE;;;;;OAKG;IACG,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;IAsBlE,iCAAiC,CACrC,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAC9C,OAAO,CAAC,WAAW,CAAC;CA6BxB"}
|
|
@@ -27,9 +27,16 @@ export class SignerEvm extends Signer {
|
|
|
27
27
|
async getAddressObjs() {
|
|
28
28
|
const account = await this.getEvmAccount();
|
|
29
29
|
return [
|
|
30
|
-
await
|
|
30
|
+
await this._getOmniLockEvmAddressObj(account),
|
|
31
|
+
await this._getOmniLockOldEvmAddressObj(account),
|
|
31
32
|
];
|
|
32
33
|
}
|
|
34
|
+
async _getOmniLockEvmAddressObj(account) {
|
|
35
|
+
return Address.fromKnownScript(KnownScript.OmniLock, hexFrom([0x12, ...bytesFrom(account), 0x00]), this.client);
|
|
36
|
+
}
|
|
37
|
+
async _getOmniLockOldEvmAddressObj(account) {
|
|
38
|
+
return Address.fromKnownScript(KnownScript.OmniLock, hexFrom([0x1, ...bytesFrom(account), 0x00]), this.client);
|
|
39
|
+
}
|
|
33
40
|
/**
|
|
34
41
|
* prepare a transaction before signing. This method is not implemented and should be overridden by subclasses.
|
|
35
42
|
*
|
|
@@ -37,8 +44,8 @@ export class SignerEvm extends Signer {
|
|
|
37
44
|
* @returns A promise that resolves to the prepared Transaction object.
|
|
38
45
|
*/
|
|
39
46
|
async prepareTransaction(txLike) {
|
|
40
|
-
const
|
|
41
|
-
return prepareSighashAllWitness(
|
|
47
|
+
const addresses = await this.getAddressObjs();
|
|
48
|
+
return addresses.reduce((txPromise, { script }) => txPromise.then((tx) => prepareSighashAllWitness(tx, script, 85, this.client)), Promise.resolve(Transaction.from(txLike)));
|
|
42
49
|
}
|
|
43
50
|
/**
|
|
44
51
|
* Signs a transaction without modifying it.
|
|
@@ -47,13 +54,20 @@ export class SignerEvm extends Signer {
|
|
|
47
54
|
* @returns A promise that resolves to a signed Transaction object.
|
|
48
55
|
*/
|
|
49
56
|
async signOnlyTransaction(txLike) {
|
|
50
|
-
|
|
51
|
-
const
|
|
57
|
+
let tx = Transaction.from(txLike);
|
|
58
|
+
const account = await this.getEvmAccount();
|
|
59
|
+
const { script: evmScript } = await this._getOmniLockEvmAddressObj(account);
|
|
60
|
+
const { script: oldEvmScript } = await this._getOmniLockOldEvmAddressObj(account);
|
|
61
|
+
tx = await this._signOmniLockScriptForTransaction(tx, evmScript, (hash) => `CKB transaction: ${hash}`);
|
|
62
|
+
tx = await this._signOmniLockScriptForTransaction(tx, oldEvmScript, (hash) => bytesFrom(hash));
|
|
63
|
+
return tx;
|
|
64
|
+
}
|
|
65
|
+
async _signOmniLockScriptForTransaction(tx, script, messageTransformer) {
|
|
52
66
|
const info = await getSignHashInfo(tx, script, this.client);
|
|
53
67
|
if (!info) {
|
|
54
68
|
return tx;
|
|
55
69
|
}
|
|
56
|
-
const signature = bytesFrom(await this.signMessage(
|
|
70
|
+
const signature = bytesFrom(await this.signMessage(messageTransformer(info.message)));
|
|
57
71
|
if (signature[signature.length - 1] >= 27) {
|
|
58
72
|
signature[signature.length - 1] -= 27;
|
|
59
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/signer/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,WAAW,EACX,eAAe,EAEhB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,GAAG,EAAW,MAAM,QAAQ,CAAC;AAEtC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAuCzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/signer/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,WAAW,EACX,eAAe,EAEhB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,EAAE,GAAG,EAAW,MAAM,QAAQ,CAAC;AAEtC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAuCzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CA+BtB"}
|
package/dist/signer/helpers.js
CHANGED
|
@@ -81,8 +81,9 @@ export async function prepareSighashAllWitness(txLike, scriptLike, lockLen, clie
|
|
|
81
81
|
if (position === -1) {
|
|
82
82
|
return tx;
|
|
83
83
|
}
|
|
84
|
-
const
|
|
85
|
-
|
|
84
|
+
const rawWitness = tx.witnesses[position];
|
|
85
|
+
const witness = (rawWitness ?? "0x") !== "0x"
|
|
86
|
+
? WitnessArgs.fromBytes(rawWitness)
|
|
86
87
|
: WitnessArgs.from({});
|
|
87
88
|
witness.lock = hexFrom(Array.from(new Array(lockLen), () => 0));
|
|
88
89
|
tx.witnesses[position] = hexFrom(witness.toBytes());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ckb-ccc/core",
|
|
3
|
-
"version": "0.0.4-alpha.
|
|
3
|
+
"version": "0.0.4-alpha.13",
|
|
4
4
|
"description": "Common Chains Connector Core",
|
|
5
5
|
"author": "Hanssen0 <hanssen0@hanssen0.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"buffer": "^6.0.3",
|
|
48
48
|
"cross-fetch": "^4.0.0"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "92a34e4c924a2b41702bcc1247edd5a01fe6925b"
|
|
51
51
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Address } from "../../address";
|
|
2
|
-
import { bytesConcat, bytesFrom } from "../../bytes";
|
|
3
|
-
import { Transaction, TransactionLike, WitnessArgs } from "../../ckb";
|
|
2
|
+
import { BytesLike, bytesConcat, bytesFrom } from "../../bytes";
|
|
3
|
+
import { Script, Transaction, TransactionLike, WitnessArgs } from "../../ckb";
|
|
4
4
|
import { KnownScript } from "../../client";
|
|
5
5
|
import { hexFrom } from "../../hex";
|
|
6
6
|
import { numToBytes } from "../../num";
|
|
@@ -36,14 +36,27 @@ export abstract class SignerEvm extends Signer {
|
|
|
36
36
|
async getAddressObjs(): Promise<Address[]> {
|
|
37
37
|
const account = await this.getEvmAccount();
|
|
38
38
|
return [
|
|
39
|
-
await
|
|
40
|
-
|
|
41
|
-
hexFrom([0x12, ...bytesFrom(account), 0x00]),
|
|
42
|
-
this.client,
|
|
43
|
-
),
|
|
39
|
+
await this._getOmniLockEvmAddressObj(account),
|
|
40
|
+
await this._getOmniLockOldEvmAddressObj(account),
|
|
44
41
|
];
|
|
45
42
|
}
|
|
46
43
|
|
|
44
|
+
async _getOmniLockEvmAddressObj(account: string): Promise<Address> {
|
|
45
|
+
return Address.fromKnownScript(
|
|
46
|
+
KnownScript.OmniLock,
|
|
47
|
+
hexFrom([0x12, ...bytesFrom(account), 0x00]),
|
|
48
|
+
this.client,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async _getOmniLockOldEvmAddressObj(account: string): Promise<Address> {
|
|
53
|
+
return Address.fromKnownScript(
|
|
54
|
+
KnownScript.OmniLock,
|
|
55
|
+
hexFrom([0x1, ...bytesFrom(account), 0x00]),
|
|
56
|
+
this.client,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
47
60
|
/**
|
|
48
61
|
* prepare a transaction before signing. This method is not implemented and should be overridden by subclasses.
|
|
49
62
|
*
|
|
@@ -51,8 +64,15 @@ export abstract class SignerEvm extends Signer {
|
|
|
51
64
|
* @returns A promise that resolves to the prepared Transaction object.
|
|
52
65
|
*/
|
|
53
66
|
async prepareTransaction(txLike: TransactionLike): Promise<Transaction> {
|
|
54
|
-
const
|
|
55
|
-
|
|
67
|
+
const addresses = await this.getAddressObjs();
|
|
68
|
+
|
|
69
|
+
return addresses.reduce(
|
|
70
|
+
(txPromise, { script }) =>
|
|
71
|
+
txPromise.then((tx) =>
|
|
72
|
+
prepareSighashAllWitness(tx, script, 85, this.client),
|
|
73
|
+
),
|
|
74
|
+
Promise.resolve(Transaction.from(txLike)),
|
|
75
|
+
);
|
|
56
76
|
}
|
|
57
77
|
|
|
58
78
|
/**
|
|
@@ -62,16 +82,39 @@ export abstract class SignerEvm extends Signer {
|
|
|
62
82
|
* @returns A promise that resolves to a signed Transaction object.
|
|
63
83
|
*/
|
|
64
84
|
async signOnlyTransaction(txLike: TransactionLike): Promise<Transaction> {
|
|
65
|
-
|
|
85
|
+
let tx = Transaction.from(txLike);
|
|
86
|
+
|
|
87
|
+
const account = await this.getEvmAccount();
|
|
88
|
+
const { script: evmScript } = await this._getOmniLockEvmAddressObj(account);
|
|
89
|
+
const { script: oldEvmScript } =
|
|
90
|
+
await this._getOmniLockOldEvmAddressObj(account);
|
|
91
|
+
|
|
92
|
+
tx = await this._signOmniLockScriptForTransaction(
|
|
93
|
+
tx,
|
|
94
|
+
evmScript,
|
|
95
|
+
(hash) => `CKB transaction: ${hash}`,
|
|
96
|
+
);
|
|
97
|
+
tx = await this._signOmniLockScriptForTransaction(
|
|
98
|
+
tx,
|
|
99
|
+
oldEvmScript,
|
|
100
|
+
(hash) => bytesFrom(hash),
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
return tx;
|
|
104
|
+
}
|
|
66
105
|
|
|
67
|
-
|
|
106
|
+
async _signOmniLockScriptForTransaction(
|
|
107
|
+
tx: Transaction,
|
|
108
|
+
script: Script,
|
|
109
|
+
messageTransformer: (hash: string) => BytesLike,
|
|
110
|
+
): Promise<Transaction> {
|
|
68
111
|
const info = await getSignHashInfo(tx, script, this.client);
|
|
69
112
|
if (!info) {
|
|
70
113
|
return tx;
|
|
71
114
|
}
|
|
72
115
|
|
|
73
116
|
const signature = bytesFrom(
|
|
74
|
-
await this.signMessage(
|
|
117
|
+
await this.signMessage(messageTransformer(info.message)),
|
|
75
118
|
);
|
|
76
119
|
if (signature[signature.length - 1] >= 27) {
|
|
77
120
|
signature[signature.length - 1] -= 27;
|
package/src/signer/helpers.ts
CHANGED
|
@@ -112,9 +112,11 @@ export async function prepareSighashAllWitness(
|
|
|
112
112
|
return tx;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
const rawWitness = tx.witnesses[position];
|
|
116
|
+
const witness =
|
|
117
|
+
(rawWitness ?? "0x") !== "0x"
|
|
118
|
+
? WitnessArgs.fromBytes(rawWitness)
|
|
119
|
+
: WitnessArgs.from({});
|
|
118
120
|
witness.lock = hexFrom(Array.from(new Array(lockLen), () => 0));
|
|
119
121
|
tx.witnesses[position] = hexFrom(witness.toBytes());
|
|
120
122
|
|