@layerzerolabs/onesig-core 0.1.2 → 0.2.23
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/WGY3RCNT.js +43 -0
- package/dist/WGY3RCNT.js.map +1 -0
- package/dist/XDTXKETK.cjs +47 -0
- package/dist/XDTXKETK.cjs.map +1 -0
- package/dist/error.cjs +16 -0
- package/dist/error.cjs.map +1 -0
- package/dist/error.d.ts +11 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +3 -0
- package/dist/error.js.map +1 -0
- package/dist/{index.mjs → index.cjs} +92 -104
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +23 -26
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -122
- package/dist/index.js.map +1 -0
- package/package.json +25 -43
- package/LICENSE.md +0 -9
- package/dist/index.d.mts +0 -55
package/dist/WGY3RCNT.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/error.ts
|
|
5
|
+
var OneSigCoreError = class _OneSigCoreError extends Error {
|
|
6
|
+
static {
|
|
7
|
+
__name(this, "OneSigCoreError");
|
|
8
|
+
}
|
|
9
|
+
#code;
|
|
10
|
+
constructor(code, message) {
|
|
11
|
+
super(`[${code}] ${message}`);
|
|
12
|
+
this.#code = code;
|
|
13
|
+
}
|
|
14
|
+
get code() {
|
|
15
|
+
return this.#code;
|
|
16
|
+
}
|
|
17
|
+
static is(input, code) {
|
|
18
|
+
if (input instanceof _OneSigCoreError) {
|
|
19
|
+
if (code) {
|
|
20
|
+
return input.code === code;
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
} else {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
async function getErrorFromCall(method) {
|
|
29
|
+
try {
|
|
30
|
+
await method();
|
|
31
|
+
} catch (error) {
|
|
32
|
+
if (OneSigCoreError.is(error)) {
|
|
33
|
+
return error.code;
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
__name(getErrorFromCall, "getErrorFromCall");
|
|
40
|
+
|
|
41
|
+
export { OneSigCoreError, __name, getErrorFromCall };
|
|
42
|
+
//# sourceMappingURL=WGY3RCNT.js.map
|
|
43
|
+
//# sourceMappingURL=WGY3RCNT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error.ts"],"names":["OneSigCoreError","Error","code","message","is","input","getErrorFromCall","method","error"],"mappings":";;;;AAWO,IAAMA,eAAAA,GAAN,MAAMA,gBAAAA,SAAwBC,KAAAA,CAAAA;EAXrC;;;AAYI,EAAA,KAAA;AAEA,EAAA,WAAA,CAAYC,MAA2BC,OAAAA,EAAiB;AACpD,IAAA,KAAA,CAAM,CAAA,CAAA,EAAID,IAAAA,CAAAA,EAAAA,EAASC,OAAAA,CAAAA,CAAS,CAAA;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQD,IAAAA;AACjB,EAAA;AAEA,EAAA,IAAIA,IAAAA,GAAO;AACP,IAAA,OAAO,IAAA,CAAK,KAAA;AAChB,EAAA;EAEA,OAAOE,EAAAA,CAAGC,OAAgBH,IAAAA,EAAsD;AAC5E,IAAA,IAAIG,iBAAiBL,gBAAAA,EAAiB;AAClC,MAAA,IAAIE,IAAAA,EAAM;AACN,QAAA,OAAOG,MAAMH,IAAAA,KAASA,IAAAA;AAC1B,MAAA;AAEA,MAAA,OAAO,IAAA;IACX,CAAA,MAAO;AACH,MAAA,OAAO,KAAA;AACX,IAAA;AACJ,EAAA;AACJ;AAEA,eAAsBI,iBAAiBC,MAAAA,EAA8B;AACjE,EAAA,IAAI;AACA,IAAA,MAAMA,MAAAA,EAAAA;AACV,EAAA,CAAA,CAAA,OAASC,KAAAA,EAAO;AACZ,IAAA,IAAIR,eAAAA,CAAgBI,EAAAA,CAAGI,KAAAA,CAAAA,EAAQ;AAC3B,MAAA,OAAOA,KAAAA,CAAMN,IAAAA;AACjB,IAAA;AAEA,IAAA,MAAMM,KAAAA;AACV,EAAA;AAEA,EAAA,OAAO,IAAA;AACX;AAZsBF,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA","file":"WGY3RCNT.js","sourcesContent":["const _codes = [\n 'LEAF_SEEN_TWICE',\n 'NONCE_ID_SEEN_TWICE',\n 'INVALID_SIGNATURE_INPUT',\n 'ONE_SIGNER_REQUIRED',\n 'ADDRESS_SIGNATURE_LENGTH_MISMATCH',\n 'CANNOT_CONCAT_INPUT',\n] as const;\n\nexport type OneSigCoreErrorCode = (typeof _codes)[number];\n\nexport class OneSigCoreError extends Error {\n #code: OneSigCoreErrorCode;\n\n constructor(code: OneSigCoreErrorCode, message: string) {\n super(`[${code}] ${message}`);\n this.#code = code;\n }\n\n get code() {\n return this.#code;\n }\n\n static is(input: unknown, code?: OneSigCoreErrorCode): input is OneSigCoreError {\n if (input instanceof OneSigCoreError) {\n if (code) {\n return input.code === code;\n }\n\n return true;\n } else {\n return false;\n }\n }\n}\n\nexport async function getErrorFromCall(method: () => Promise<unknown>) {\n try {\n await method();\n } catch (error) {\n if (OneSigCoreError.is(error)) {\n return error.code;\n }\n\n throw error;\n }\n\n return null;\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
|
|
6
|
+
// src/error.ts
|
|
7
|
+
var OneSigCoreError = class _OneSigCoreError extends Error {
|
|
8
|
+
static {
|
|
9
|
+
__name(this, "OneSigCoreError");
|
|
10
|
+
}
|
|
11
|
+
#code;
|
|
12
|
+
constructor(code, message) {
|
|
13
|
+
super(`[${code}] ${message}`);
|
|
14
|
+
this.#code = code;
|
|
15
|
+
}
|
|
16
|
+
get code() {
|
|
17
|
+
return this.#code;
|
|
18
|
+
}
|
|
19
|
+
static is(input, code) {
|
|
20
|
+
if (input instanceof _OneSigCoreError) {
|
|
21
|
+
if (code) {
|
|
22
|
+
return input.code === code;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
} else {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
async function getErrorFromCall(method) {
|
|
31
|
+
try {
|
|
32
|
+
await method();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
if (OneSigCoreError.is(error)) {
|
|
35
|
+
return error.code;
|
|
36
|
+
}
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
__name(getErrorFromCall, "getErrorFromCall");
|
|
42
|
+
|
|
43
|
+
exports.OneSigCoreError = OneSigCoreError;
|
|
44
|
+
exports.__name = __name;
|
|
45
|
+
exports.getErrorFromCall = getErrorFromCall;
|
|
46
|
+
//# sourceMappingURL=XDTXKETK.cjs.map
|
|
47
|
+
//# sourceMappingURL=XDTXKETK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error.ts"],"names":["OneSigCoreError","Error","code","message","is","input","getErrorFromCall","method","error"],"mappings":";;;;;;AAWO,IAAMA,eAAAA,GAAN,MAAMA,gBAAAA,SAAwBC,KAAAA,CAAAA;EAXrC;;;AAYI,EAAA,KAAA;AAEA,EAAA,WAAA,CAAYC,MAA2BC,OAAAA,EAAiB;AACpD,IAAA,KAAA,CAAM,CAAA,CAAA,EAAID,IAAAA,CAAAA,EAAAA,EAASC,OAAAA,CAAAA,CAAS,CAAA;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQD,IAAAA;AACjB,EAAA;AAEA,EAAA,IAAIA,IAAAA,GAAO;AACP,IAAA,OAAO,IAAA,CAAK,KAAA;AAChB,EAAA;EAEA,OAAOE,EAAAA,CAAGC,OAAgBH,IAAAA,EAAsD;AAC5E,IAAA,IAAIG,iBAAiBL,gBAAAA,EAAiB;AAClC,MAAA,IAAIE,IAAAA,EAAM;AACN,QAAA,OAAOG,MAAMH,IAAAA,KAASA,IAAAA;AAC1B,MAAA;AAEA,MAAA,OAAO,IAAA;IACX,CAAA,MAAO;AACH,MAAA,OAAO,KAAA;AACX,IAAA;AACJ,EAAA;AACJ;AAEA,eAAsBI,iBAAiBC,MAAAA,EAA8B;AACjE,EAAA,IAAI;AACA,IAAA,MAAMA,MAAAA,EAAAA;AACV,EAAA,CAAA,CAAA,OAASC,KAAAA,EAAO;AACZ,IAAA,IAAIR,eAAAA,CAAgBI,EAAAA,CAAGI,KAAAA,CAAAA,EAAQ;AAC3B,MAAA,OAAOA,KAAAA,CAAMN,IAAAA;AACjB,IAAA;AAEA,IAAA,MAAMM,KAAAA;AACV,EAAA;AAEA,EAAA,OAAO,IAAA;AACX;AAZsBF,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA","file":"XDTXKETK.cjs","sourcesContent":["const _codes = [\n 'LEAF_SEEN_TWICE',\n 'NONCE_ID_SEEN_TWICE',\n 'INVALID_SIGNATURE_INPUT',\n 'ONE_SIGNER_REQUIRED',\n 'ADDRESS_SIGNATURE_LENGTH_MISMATCH',\n 'CANNOT_CONCAT_INPUT',\n] as const;\n\nexport type OneSigCoreErrorCode = (typeof _codes)[number];\n\nexport class OneSigCoreError extends Error {\n #code: OneSigCoreErrorCode;\n\n constructor(code: OneSigCoreErrorCode, message: string) {\n super(`[${code}] ${message}`);\n this.#code = code;\n }\n\n get code() {\n return this.#code;\n }\n\n static is(input: unknown, code?: OneSigCoreErrorCode): input is OneSigCoreError {\n if (input instanceof OneSigCoreError) {\n if (code) {\n return input.code === code;\n }\n\n return true;\n } else {\n return false;\n }\n }\n}\n\nexport async function getErrorFromCall(method: () => Promise<unknown>) {\n try {\n await method();\n } catch (error) {\n if (OneSigCoreError.is(error)) {\n return error.code;\n }\n\n throw error;\n }\n\n return null;\n}\n"]}
|
package/dist/error.cjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var XDTXKETK_cjs = require('./XDTXKETK.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "OneSigCoreError", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return XDTXKETK_cjs.OneSigCoreError; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "getErrorFromCall", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return XDTXKETK_cjs.getErrorFromCall; }
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=error.cjs.map
|
|
16
|
+
//# sourceMappingURL=error.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"error.cjs"}
|
package/dist/error.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const _codes: readonly ["LEAF_SEEN_TWICE", "NONCE_ID_SEEN_TWICE", "INVALID_SIGNATURE_INPUT", "ONE_SIGNER_REQUIRED", "ADDRESS_SIGNATURE_LENGTH_MISMATCH", "CANNOT_CONCAT_INPUT"];
|
|
2
|
+
export type OneSigCoreErrorCode = (typeof _codes)[number];
|
|
3
|
+
export declare class OneSigCoreError extends Error {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(code: OneSigCoreErrorCode, message: string);
|
|
6
|
+
get code(): "LEAF_SEEN_TWICE" | "NONCE_ID_SEEN_TWICE" | "INVALID_SIGNATURE_INPUT" | "ONE_SIGNER_REQUIRED" | "ADDRESS_SIGNATURE_LENGTH_MISMATCH" | "CANNOT_CONCAT_INPUT";
|
|
7
|
+
static is(input: unknown, code?: OneSigCoreErrorCode): input is OneSigCoreError;
|
|
8
|
+
}
|
|
9
|
+
export declare function getErrorFromCall(method: () => Promise<unknown>): Promise<"LEAF_SEEN_TWICE" | "NONCE_ID_SEEN_TWICE" | "INVALID_SIGNATURE_INPUT" | "ONE_SIGNER_REQUIRED" | "ADDRESS_SIGNATURE_LENGTH_MISMATCH" | "CANNOT_CONCAT_INPUT" | null>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,MAAM,mKAOF,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,qBAAa,eAAgB,SAAQ,KAAK;;gBAG1B,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM;IAKtD,IAAI,IAAI,gKAEP;IAED,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,KAAK,IAAI,eAAe;CAWlF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,+KAYpE"}
|
package/dist/error.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"error.js"}
|
|
@@ -1,46 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
throw TypeError(msg);
|
|
3
|
-
};
|
|
4
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
1
|
+
'use strict';
|
|
8
2
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
var XDTXKETK_cjs = require('./XDTXKETK.cjs');
|
|
4
|
+
var ethers = require('ethers');
|
|
5
|
+
var merkletreejs = require('merkletreejs');
|
|
12
6
|
|
|
13
|
-
// src/error.ts
|
|
14
|
-
var _code;
|
|
15
|
-
var _OneSigCoreError = class _OneSigCoreError extends Error {
|
|
16
|
-
constructor(code, message) {
|
|
17
|
-
super(`[${code}] ${message}`);
|
|
18
|
-
__privateAdd(this, _code);
|
|
19
|
-
__privateSet(this, _code, code);
|
|
20
|
-
}
|
|
21
|
-
get code() {
|
|
22
|
-
return __privateGet(this, _code);
|
|
23
|
-
}
|
|
24
|
-
static is(input, code) {
|
|
25
|
-
if (input instanceof _OneSigCoreError) {
|
|
26
|
-
if (code) {
|
|
27
|
-
return input.code === code;
|
|
28
|
-
}
|
|
29
|
-
return true;
|
|
30
|
-
} else {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
_code = new WeakMap();
|
|
36
|
-
var OneSigCoreError = _OneSigCoreError;
|
|
37
|
-
|
|
38
|
-
// src/index.ts
|
|
39
7
|
function readByteFromHex(input, byteOffset) {
|
|
40
8
|
const charOffset = byteOffset * 2;
|
|
41
9
|
const sub = input.substring(charOffset, charOffset + 2);
|
|
42
10
|
return parseInt(sub, 16);
|
|
43
11
|
}
|
|
12
|
+
XDTXKETK_cjs.__name(readByteFromHex, "readByteFromHex");
|
|
44
13
|
function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }) {
|
|
45
14
|
if (targetOneSigAddress.byteLength !== 32) {
|
|
46
15
|
throw new Error("Contract address must be 32 bytes");
|
|
@@ -58,6 +27,7 @@ function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }) {
|
|
|
58
27
|
}
|
|
59
28
|
return storage;
|
|
60
29
|
}
|
|
30
|
+
XDTXKETK_cjs.__name(encodeLeafHeader, "encodeLeafHeader");
|
|
61
31
|
function encodeLeaf(gen, index) {
|
|
62
32
|
const leaf = gen.leafs[index];
|
|
63
33
|
if (!leaf) {
|
|
@@ -71,8 +41,9 @@ function encodeLeaf(gen, index) {
|
|
|
71
41
|
}),
|
|
72
42
|
gen.encodeCalls(leaf.calls)
|
|
73
43
|
]);
|
|
74
|
-
return ethers.utils.keccak256(ethers.utils.keccak256(leafData));
|
|
44
|
+
return ethers.ethers.utils.keccak256(ethers.ethers.utils.keccak256(leafData));
|
|
75
45
|
}
|
|
46
|
+
XDTXKETK_cjs.__name(encodeLeaf, "encodeLeaf");
|
|
76
47
|
function makeOneSigTree(input) {
|
|
77
48
|
const encodedLeafs = [];
|
|
78
49
|
const seenNonceIds = /* @__PURE__ */ new Set();
|
|
@@ -81,18 +52,18 @@ function makeOneSigTree(input) {
|
|
|
81
52
|
const leaf = gen.leafs[i];
|
|
82
53
|
const nonceIdCombo = `${leaf.nonce}.${leaf.oneSigId}`;
|
|
83
54
|
if (seenNonceIds.has(nonceIdCombo)) {
|
|
84
|
-
throw new OneSigCoreError(
|
|
85
|
-
"NONCE_ID_SEEN_TWICE",
|
|
86
|
-
"Two calls should not be made for the same chain/nonce twice"
|
|
87
|
-
);
|
|
55
|
+
throw new XDTXKETK_cjs.OneSigCoreError("NONCE_ID_SEEN_TWICE", "Two calls should not be made for the same chain/nonce twice");
|
|
88
56
|
}
|
|
89
57
|
seenNonceIds.add(nonceIdCombo);
|
|
90
58
|
encodedLeafs.push(encodeLeaf(gen, i));
|
|
91
59
|
}
|
|
92
60
|
}
|
|
93
|
-
const tree = new MerkleTree(encodedLeafs, ethers.utils.keccak256, {
|
|
61
|
+
const tree = new merkletreejs.MerkleTree(encodedLeafs, ethers.ethers.utils.keccak256, {
|
|
62
|
+
sort: true
|
|
63
|
+
});
|
|
94
64
|
return tree;
|
|
95
65
|
}
|
|
66
|
+
XDTXKETK_cjs.__name(makeOneSigTree, "makeOneSigTree");
|
|
96
67
|
function compareAddresses(a, b) {
|
|
97
68
|
const aNumeric = BigInt(a);
|
|
98
69
|
const bNumeric = BigInt(b);
|
|
@@ -104,36 +75,36 @@ function compareAddresses(a, b) {
|
|
|
104
75
|
return 1;
|
|
105
76
|
}
|
|
106
77
|
}
|
|
107
|
-
|
|
108
|
-
var
|
|
78
|
+
XDTXKETK_cjs.__name(compareAddresses, "compareAddresses");
|
|
79
|
+
var Signature = class _Signature {
|
|
80
|
+
static {
|
|
81
|
+
XDTXKETK_cjs.__name(this, "Signature");
|
|
82
|
+
}
|
|
83
|
+
#value;
|
|
109
84
|
constructor(input) {
|
|
110
|
-
__privateAdd(this, _value);
|
|
111
85
|
let value = input;
|
|
112
86
|
if (value instanceof _Signature) {
|
|
113
87
|
value = value.get();
|
|
114
88
|
}
|
|
115
89
|
if (typeof value === "string") {
|
|
116
90
|
if (!value.startsWith("0x")) {
|
|
117
|
-
throw new OneSigCoreError(
|
|
118
|
-
"INVALID_SIGNATURE_INPUT",
|
|
119
|
-
"Signature takes in hex encoded strings prefixed with 0x only"
|
|
120
|
-
);
|
|
91
|
+
throw new XDTXKETK_cjs.OneSigCoreError("INVALID_SIGNATURE_INPUT", "Signature takes in hex encoded strings prefixed with 0x only");
|
|
121
92
|
}
|
|
122
93
|
value = Buffer.from(value.substring(2), "hex");
|
|
123
94
|
}
|
|
124
95
|
if (value.length % 65 !== 0) {
|
|
125
|
-
throw new OneSigCoreError("INVALID_SIGNATURE_INPUT", "Each signature must be 65 bytes long");
|
|
96
|
+
throw new XDTXKETK_cjs.OneSigCoreError("INVALID_SIGNATURE_INPUT", "Each signature must be 65 bytes long");
|
|
126
97
|
}
|
|
127
|
-
|
|
98
|
+
this.#value = value;
|
|
128
99
|
}
|
|
129
100
|
get() {
|
|
130
|
-
return
|
|
101
|
+
return this.#value;
|
|
131
102
|
}
|
|
132
103
|
toHexString() {
|
|
133
104
|
return `0x${this.get().toString("hex")}`;
|
|
134
105
|
}
|
|
135
106
|
get signatureCount() {
|
|
136
|
-
const count =
|
|
107
|
+
const count = this.#value.length / 65;
|
|
137
108
|
if (Math.floor(count) !== count) {
|
|
138
109
|
throw new Error("Count is not an int");
|
|
139
110
|
}
|
|
@@ -149,7 +120,7 @@ var _Signature = class _Signature {
|
|
|
149
120
|
const signatureBuffers = input.map(function(singleInput) {
|
|
150
121
|
const signature = new _Signature(singleInput);
|
|
151
122
|
if (signature.signatureCount !== 1) {
|
|
152
|
-
throw new OneSigCoreError("CANNOT_CONCAT_INPUT", "Cannot concatenate pre-concatenated signatures");
|
|
123
|
+
throw new XDTXKETK_cjs.OneSigCoreError("CANNOT_CONCAT_INPUT", "Cannot concatenate pre-concatenated signatures");
|
|
153
124
|
}
|
|
154
125
|
return signature.get();
|
|
155
126
|
});
|
|
@@ -161,19 +132,16 @@ var _Signature = class _Signature {
|
|
|
161
132
|
if (typeof sortMethod === "string" || Buffer.isBuffer(sortMethod)) {
|
|
162
133
|
addresses = [];
|
|
163
134
|
for (const signature of signatureBuffers) {
|
|
164
|
-
const recovered = ethers.utils.recoverAddress(sortMethod, signature);
|
|
135
|
+
const recovered = ethers.ethers.utils.recoverAddress(sortMethod, signature);
|
|
165
136
|
addresses.push(recovered);
|
|
166
137
|
}
|
|
167
138
|
} else {
|
|
168
139
|
addresses = sortMethod;
|
|
169
140
|
}
|
|
170
141
|
if (addresses.length !== signatureBuffers.length) {
|
|
171
|
-
throw new OneSigCoreError(
|
|
172
|
-
"ADDRESS_SIGNATURE_LENGTH_MISMATCH",
|
|
173
|
-
"Mismatch in addresses provided signatures"
|
|
174
|
-
);
|
|
142
|
+
throw new XDTXKETK_cjs.OneSigCoreError("ADDRESS_SIGNATURE_LENGTH_MISMATCH", "Mismatch in addresses provided signatures");
|
|
175
143
|
}
|
|
176
|
-
const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort(
|
|
144
|
+
const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort((a, b) => {
|
|
177
145
|
return compareAddresses(addresses[a], addresses[b]);
|
|
178
146
|
});
|
|
179
147
|
orderedSignatures = indexMapping.map((index) => signatureBuffers[index]);
|
|
@@ -182,41 +150,58 @@ var _Signature = class _Signature {
|
|
|
182
150
|
return new this(combined);
|
|
183
151
|
}
|
|
184
152
|
};
|
|
185
|
-
_value = new WeakMap();
|
|
186
|
-
var Signature = _Signature;
|
|
187
153
|
var ONE_SIG_TYPED_DATA_DOMAIN = {
|
|
188
154
|
name: "OneSig",
|
|
189
155
|
version: "0.0.1",
|
|
190
156
|
chainId: 1,
|
|
191
|
-
// this is hardcoded to Ethereum mainnet
|
|
192
157
|
verifyingContract: "0x000000000000000000000000000000000000dEaD"
|
|
193
|
-
// this is hardcoded to a dead address
|
|
194
158
|
};
|
|
195
|
-
|
|
159
|
+
var getOneSigTypedDataDomain = /* @__PURE__ */ XDTXKETK_cjs.__name(() => {
|
|
196
160
|
return ONE_SIG_TYPED_DATA_DOMAIN;
|
|
197
|
-
}
|
|
161
|
+
}, "getOneSigTypedDataDomain");
|
|
198
162
|
var ONE_SIG_TYPED_DATA_DOMAIN_TYPES = {
|
|
199
163
|
EIP712Domain: [
|
|
200
|
-
{
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
164
|
+
{
|
|
165
|
+
name: "name",
|
|
166
|
+
type: "string"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: "version",
|
|
170
|
+
type: "string"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "chainId",
|
|
174
|
+
type: "uint256"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: "verifyingContract",
|
|
178
|
+
type: "address"
|
|
179
|
+
}
|
|
204
180
|
]
|
|
205
181
|
};
|
|
206
|
-
|
|
182
|
+
var getOneSigTypedDataDomainTypes = /* @__PURE__ */ XDTXKETK_cjs.__name(() => {
|
|
207
183
|
return ONE_SIG_TYPED_DATA_DOMAIN_TYPES;
|
|
208
|
-
}
|
|
184
|
+
}, "getOneSigTypedDataDomainTypes");
|
|
209
185
|
var ONE_SIG_TYPED_DATA_PRIMARY_TYPES = {
|
|
210
186
|
SignMerkleRoot: [
|
|
211
|
-
{
|
|
212
|
-
|
|
213
|
-
|
|
187
|
+
{
|
|
188
|
+
name: "seed",
|
|
189
|
+
type: "bytes32"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
name: "merkleRoot",
|
|
193
|
+
type: "bytes32"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: "expiry",
|
|
197
|
+
type: "uint256"
|
|
198
|
+
}
|
|
214
199
|
]
|
|
215
200
|
};
|
|
216
|
-
|
|
201
|
+
var getOneSigTypedDataPrimaryTypes = /* @__PURE__ */ XDTXKETK_cjs.__name(() => {
|
|
217
202
|
return ONE_SIG_TYPED_DATA_PRIMARY_TYPES;
|
|
218
|
-
}
|
|
219
|
-
|
|
203
|
+
}, "getOneSigTypedDataPrimaryTypes");
|
|
204
|
+
var getSigningData = /* @__PURE__ */ XDTXKETK_cjs.__name((tree, { seed, expiry }) => {
|
|
220
205
|
return [
|
|
221
206
|
getOneSigTypedDataDomain(),
|
|
222
207
|
getOneSigTypedDataPrimaryTypes(),
|
|
@@ -226,22 +211,20 @@ function getSigningData(tree, { seed, expiry }) {
|
|
|
226
211
|
merkleRoot: tree.getHexRoot()
|
|
227
212
|
}
|
|
228
213
|
];
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
return ethers.utils._TypedDataEncoder.hash(...getSigningData(tree, options));
|
|
232
|
-
}
|
|
214
|
+
}, "getSigningData");
|
|
215
|
+
var getDigestToSign = /* @__PURE__ */ XDTXKETK_cjs.__name((tree, options) => {
|
|
216
|
+
return ethers.ethers.utils._TypedDataEncoder.hash(...getSigningData(tree, options));
|
|
217
|
+
}, "getDigestToSign");
|
|
233
218
|
async function signOneSigTree(tree, signers, options, enc = "string") {
|
|
234
219
|
if (signers.length <= 0) {
|
|
235
|
-
throw new OneSigCoreError("ONE_SIGNER_REQUIRED", "1+ signer must be provided");
|
|
220
|
+
throw new XDTXKETK_cjs.OneSigCoreError("ONE_SIGNER_REQUIRED", "1+ signer must be provided");
|
|
236
221
|
}
|
|
237
222
|
const toSign = getSigningData(tree, options);
|
|
238
|
-
const signatures = await Promise.all(
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
);
|
|
244
|
-
const signingDigest = ethers.utils._TypedDataEncoder.hash(...toSign);
|
|
223
|
+
const signatures = await Promise.all(signers.map(async function(signer) {
|
|
224
|
+
const data = await signer._signTypedData(...toSign);
|
|
225
|
+
return new Signature(data);
|
|
226
|
+
}));
|
|
227
|
+
const signingDigest = ethers.ethers.utils._TypedDataEncoder.hash(...toSign);
|
|
245
228
|
const sig = Signature.concatenateSignatures(signatures, signingDigest);
|
|
246
229
|
if (enc === "signature") {
|
|
247
230
|
return sig;
|
|
@@ -251,17 +234,22 @@ async function signOneSigTree(tree, signers, options, enc = "string") {
|
|
|
251
234
|
throw new Error("Invalid encoding");
|
|
252
235
|
}
|
|
253
236
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
237
|
+
XDTXKETK_cjs.__name(signOneSigTree, "signOneSigTree");
|
|
238
|
+
|
|
239
|
+
Object.defineProperty(exports, "MerkleTree", {
|
|
240
|
+
enumerable: true,
|
|
241
|
+
get: function () { return merkletreejs.MerkleTree; }
|
|
242
|
+
});
|
|
243
|
+
exports.Signature = Signature;
|
|
244
|
+
exports.compareAddresses = compareAddresses;
|
|
245
|
+
exports.encodeLeaf = encodeLeaf;
|
|
246
|
+
exports.encodeLeafHeader = encodeLeafHeader;
|
|
247
|
+
exports.getDigestToSign = getDigestToSign;
|
|
248
|
+
exports.getOneSigTypedDataDomain = getOneSigTypedDataDomain;
|
|
249
|
+
exports.getOneSigTypedDataDomainTypes = getOneSigTypedDataDomainTypes;
|
|
250
|
+
exports.getOneSigTypedDataPrimaryTypes = getOneSigTypedDataPrimaryTypes;
|
|
251
|
+
exports.getSigningData = getSigningData;
|
|
252
|
+
exports.makeOneSigTree = makeOneSigTree;
|
|
253
|
+
exports.signOneSigTree = signOneSigTree;
|
|
254
|
+
//# sourceMappingURL=index.cjs.map
|
|
255
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["readByteFromHex","input","byteOffset","charOffset","sub","substring","parseInt","encodeLeafHeader","targetOneSigAddress","oneSigId","nonce","byteLength","Error","storage","Buffer","alloc","idStr","toString","padStart","nonceStr","i","encodeLeaf","gen","index","leaf","leafs","leafData","concat","encodeAddress","encodeCalls","calls","ethers","utils","keccak256","makeOneSigTree","encodedLeafs","seenNonceIds","Set","length","nonceIdCombo","has","OneSigCoreError","add","push","tree","MerkleTree","sort","compareAddresses","a","b","aNumeric","BigInt","bNumeric","Signature","value","get","startsWith","from","toHexString","signatureCount","count","Math","floor","concatenateSignatures","sortMethod","signatureBuffers","map","singleInput","signature","orderedSignatures","addresses","isBuffer","recovered","recoverAddress","indexMapping","Array","fill","_","combined","ONE_SIG_TYPED_DATA_DOMAIN","name","version","chainId","verifyingContract","getOneSigTypedDataDomain","__name","ONE_SIG_TYPED_DATA_DOMAIN_TYPES","EIP712Domain","type","getOneSigTypedDataDomainTypes","ONE_SIG_TYPED_DATA_PRIMARY_TYPES","SignMerkleRoot","getOneSigTypedDataPrimaryTypes","getSigningData","seed","expiry","merkleRoot","getHexRoot","getDigestToSign","options","_TypedDataEncoder","hash","signOneSigTree","signers","enc","toSign","signatures","Promise","all","signer","data","_signTypedData","signingDigest","sig"],"mappings":";;;;;;AAgCA,SAASA,eAAAA,CAAgBC,OAAeC,UAAAA,EAAkB;AACtD,EAAA,MAAMC,aAAaD,UAAAA,GAAa,CAAA;AAChC,EAAA,MAAME,GAAAA,GAAMH,KAAAA,CAAMI,SAAAA,CAAUF,UAAAA,EAAYA,aAAa,CAAA,CAAA;AACrD,EAAA,OAAOG,QAAAA,CAASF,KAAK,EAAA,CAAA;AACzB;AAJSJ,mBAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAMF,SAASO,gBAAAA,CAAiB,EAC7BC,mBAAAA,EACAC,QAAAA,EACAC,OAAK,EAC6B;AAClC,EAAA,IAAIF,mBAAAA,CAAoBG,eAAe,EAAA,EAAI;AACvC,IAAA,MAAM,IAAIC,MAAM,mCAAA,CAAA;AACpB,EAAA;AAEA,EAAA,MAAMC,OAAAA,GAAUC,MAAAA,CAAOC,KAAAA,CAAM,EAAA,CAAA;AAC7BF,EAAAA,OAAAA,CAAQ,CAAA,CAAA,GAAK,CAAA;AAEb,EAAA,MAAMG,QAAQP,QAAAA,CAASQ,QAAAA,CAAS,EAAA,CAAA,CAAIC,QAAAA,CAAS,IAAI,GAAA,CAAA;AACjD,EAAA,MAAMC,WAAWT,KAAAA,CAAMO,QAAAA,CAAS,EAAA,CAAA,CAAIC,QAAAA,CAAS,IAAI,GAAA,CAAA;AAEjD,EAAA,KAAA,IAASE,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,EAAA,EAAIA,CAAAA,EAAAA,EAAK;AACzB,IAAA,IAAIA,IAAI,CAAA,EAAG;AACPP,MAAAA,OAAAA,CAAQO,CAAAA,GAAI,CAAA,CAAA,GAAKpB,eAAAA,CAAgBgB,OAAOI,CAAAA,CAAAA;AACxCP,MAAAA,OAAAA,CAAQO,CAAAA,GAAI,EAAA,CAAA,GAAMpB,eAAAA,CAAgBmB,UAAUC,CAAAA,CAAAA;AAChD,IAAA;AAEAP,IAAAA,OAAAA,CAAQO,CAAAA,GAAI,CAAA,CAAA,GAAKZ,mBAAAA,CAAoBY,CAAAA,CAAAA;AACzC,EAAA;AAEA,EAAA,OAAOP,OAAAA;AACX;AAzBgBN,mBAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AA2BT,SAASc,UAAAA,CAAWC,KAA0BC,KAAAA,EAAa;AAC9D,EAAA,MAAMC,IAAAA,GAAOF,GAAAA,CAAIG,KAAAA,CAAMF,KAAAA,CAAAA;AAEvB,EAAA,IAAI,CAACC,IAAAA,EAAM;AACP,IAAA,MAAM,IAAIZ,MAAM,qBAAA,CAAA;AACpB,EAAA;AAEA,EAAA,MAAMc,QAAAA,GAAWZ,OAAOa,MAAAA,CAAO;IAC3BpB,gBAAAA,CAAiB;AACbG,MAAAA,KAAAA,EAAOc,IAAAA,CAAKd,KAAAA;AACZD,MAAAA,QAAAA,EAAUe,IAAAA,CAAKf,QAAAA;MACfD,mBAAAA,EAAqBc,GAAAA,CAAIM,aAAAA,CAAcJ,IAAAA,CAAKhB,mBAAmB;KACnE,CAAA;IACAc,GAAAA,CAAIO,WAAAA,CAAYL,KAAKM,KAAK;AAC7B,GAAA,CAAA;AAED,EAAA,OAAOC,cAAOC,KAAAA,CAAMC,SAAAA,CAAUF,cAAOC,KAAAA,CAAMC,SAAAA,CAAUP,QAAAA,CAAAA,CAAAA;AACzD;AAjBgBL,mBAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAmBT,SAASa,eAAejC,KAAAA,EAA4B;AACvD,EAAA,MAAMkC,eAAe,EAAA;AACrB,EAAA,MAAMC,YAAAA,uBAAmBC,GAAAA,EAAAA;AAEzB,EAAA,KAAA,MAAWf,OAAOrB,KAAAA,EAAO;AACrB,IAAA,KAAA,IAASmB,IAAI,CAAA,EAAGA,CAAAA,GAAIE,GAAAA,CAAIG,KAAAA,CAAMa,QAAQlB,CAAAA,EAAAA,EAAK;AACvC,MAAA,MAAMI,IAAAA,GAAOF,GAAAA,CAAIG,KAAAA,CAAML,CAAAA,CAAAA;AAGvB,MAAA,MAAMmB,eAAe,CAAA,EAAGf,IAAAA,CAAKd,KAAK,CAAA,CAAA,EAAIc,KAAKf,QAAQ,CAAA,CAAA;AACnD,MAAA,IAAI2B,YAAAA,CAAaI,GAAAA,CAAID,YAAAA,CAAAA,EAAe;AAChC,QAAA,MAAM,IAAIE,4BAAAA,CACN,qBAAA,EACA,6DAAA,CAAA;AAER,MAAA;AACAL,MAAAA,YAAAA,CAAaM,IAAIH,YAAAA,CAAAA;AAEjBJ,MAAAA,YAAAA,CAAaQ,IAAAA,CAAKtB,UAAAA,CAAWC,GAAAA,EAAKF,CAAAA,CAAAA,CAAAA;AACtC,IAAA;AACJ,EAAA;AAKA,EAAA,MAAMwB,OAAO,IAAIC,uBAAAA,CAAWV,YAAAA,EAAcJ,aAAAA,CAAOC,MAAMC,SAAAA,EAAW;IAAEa,IAAAA,EAAM;GAAK,CAAA;AAE/E,EAAA,OAAOF,IAAAA;AACX;AA5BgBV,mBAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AA8BT,SAASa,gBAAAA,CAAiBC,GAAWC,CAAAA,EAAS;AACjD,EAAA,MAAMC,QAAAA,GAAWC,OAAOH,CAAAA,CAAAA;AACxB,EAAA,MAAMI,QAAAA,GAAWD,OAAOF,CAAAA,CAAAA;AAExB,EAAA,IAAIC,aAAaE,QAAAA,EAAU;AACvB,IAAA,OAAO,CAAA;AACX,EAAA,CAAA,MAAA,IAAWF,WAAWE,QAAAA,EAAU;AAC5B,IAAA,OAAO,EAAA;EACX,CAAA,MAAO;AACH,IAAA,OAAO,CAAA;AACX,EAAA;AACJ;AAXgBL,mBAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAgBT,IAAMM,SAAAA,GAAN,MAAMA,UAAAA,CAAAA;EAhIb;;;AAiII,EAAA,MAAA;AAEA,EAAA,WAAA,CAAYpD,KAAAA,EAAsB;AAC9B,IAAA,IAAIqD,KAAAA,GAAQrD,KAAAA;AACZ,IAAA,IAAIqD,iBAAiBD,UAAAA,EAAW;AAC5BC,MAAAA,KAAAA,GAAQA,MAAMC,GAAAA,EAAG;AACrB,IAAA;AAEA,IAAA,IAAI,OAAOD,UAAU,QAAA,EAAU;AAC3B,MAAA,IAAI,CAACA,KAAAA,CAAME,UAAAA,CAAW,IAAA,CAAA,EAAO;AACzB,QAAA,MAAM,IAAIf,4BAAAA,CACN,yBAAA,EACA,8DAAA,CAAA;AAER,MAAA;AAEAa,MAAAA,KAAAA,GAAQxC,OAAO2C,IAAAA,CAAKH,KAAAA,CAAMjD,SAAAA,CAAU,CAAA,GAAI,KAAA,CAAA;AAC5C,IAAA;AAEA,IAAA,IAAIiD,KAAAA,CAAMhB,MAAAA,GAAS,EAAA,KAAO,CAAA,EAAG;AACzB,MAAA,MAAM,IAAIG,4BAAAA,CACN,yBAAA,EACA,sCAAA,CAAA;AAER,IAAA;AAEA,IAAA,IAAA,CAAK,MAAA,GAASa,KAAAA;AAClB,EAAA;EAEAC,GAAAA,GAAM;AACF,IAAA,OAAO,IAAA,CAAK,MAAA;AAChB,EAAA;EAEAG,WAAAA,GAAyB;AACrB,IAAA,OAAO,KAAK,IAAA,CAAKH,GAAAA,EAAG,CAAGtC,QAAAA,CAAS,KAAA,CAAA,CAAA,CAAA;AACpC,EAAA;AAEA,EAAA,IAAI0C,cAAAA,GAAiB;AACjB,IAAA,MAAMC,KAAAA,GAAQ,IAAA,CAAK,MAAA,CAAOtB,MAAAA,GAAS,EAAA;AACnC,IAAA,IAAIuB,IAAAA,CAAKC,KAAAA,CAAMF,KAAAA,CAAAA,KAAWA,KAAAA,EAAO;AAC7B,MAAA,MAAM,IAAIhD,MAAM,qBAAA,CAAA;AACpB,IAAA;AACA,IAAA,OAAOgD,KAAAA;AACX,EAAA;;;;;;;EAoBA,OAAOG,qBAAAA,CACH9D,OACA+D,UAAAA,EACF;AACE,IAAA,MAAMC,gBAAAA,GAAmBhE,KAAAA,CAAMiE,GAAAA,CAAI,SAAUC,WAAAA,EAAW;AACpD,MAAA,MAAMC,SAAAA,GAAY,IAAIf,UAAAA,CAAUc,WAAAA,CAAAA;AAEhC,MAAA,IAAIC,SAAAA,CAAUT,mBAAmB,CAAA,EAAG;AAChC,QAAA,MAAM,IAAIlB,4BAAAA,CACN,qBAAA,EACA,gDAAA,CAAA;AAER,MAAA;AAEA,MAAA,OAAO2B,UAAUb,GAAAA,EAAG;IACxB,CAAA,CAAA;AAEA,IAAA,IAAIc,iBAAAA;AAEJ,IAAA,IAAIL,eAAe,KAAA,EAAO;AACtBK,MAAAA,iBAAAA,GAAoBJ,gBAAAA;IACxB,CAAA,MAAO;AACH,MAAA,IAAIK,SAAAA;AACJ,MAAA,IAAI,OAAON,UAAAA,KAAe,QAAA,IAAYlD,MAAAA,CAAOyD,QAAAA,CAASP,UAAAA,CAAAA,EAAa;AAC/DM,QAAAA,SAAAA,GAAY,EAAA;AAEZ,QAAA,KAAA,MAAWF,aAAaH,gBAAAA,EAAkB;AACtC,UAAA,MAAMO,SAAAA,GAAYzC,aAAAA,CAAOC,KAAAA,CAAMyC,cAAAA,CAAeT,YAAYI,SAAAA,CAAAA;AAC1DE,UAAAA,SAAAA,CAAU3B,KAAK6B,SAAAA,CAAAA;AACnB,QAAA;MACJ,CAAA,MAAO;AACHF,QAAAA,SAAAA,GAAYN,UAAAA;AAChB,MAAA;AAEA,MAAA,IAAIM,SAAAA,CAAUhC,MAAAA,KAAW2B,gBAAAA,CAAiB3B,MAAAA,EAAQ;AAC9C,QAAA,MAAM,IAAIG,4BAAAA,CACN,mCAAA,EACA,2CAAA,CAAA;AAER,MAAA;AAGA,MAAA,MAAMiC,eAAe,IAAIC,KAAAA,CAAML,UAAUhC,MAAM,CAAA,CAC1CsC,KAAK,CAAA,CAAA,CACLV,GAAAA,CAAI,CAACW,GAAGzD,CAAAA,KAAMA,CAAAA,EAEd0B,IAAAA,CAAK,CAACE,GAAGC,CAAAA,KAAAA;AACN,QAAA,OAAOF,iBAAiBuB,SAAAA,CAAUtB,CAAAA,CAAAA,EAAIsB,SAAAA,CAAUrB,CAAAA,CAAE,CAAA;MACtD,CAAA,CAAA;AAEJoB,MAAAA,iBAAAA,GAAoBK,aAAaR,GAAAA,CAAI,CAAC3C,KAAAA,KAAU0C,gBAAAA,CAAiB1C,KAAAA,CAAM,CAAA;AAC3E,IAAA;AAEA,IAAA,MAAMuD,QAAAA,GAAWhE,MAAAA,CAAOa,MAAAA,CAAO0C,iBAAAA,CAAAA;AAE/B,IAAA,OAAO,IAAI,KAAKS,QAAAA,CAAAA;AACpB,EAAA;AACJ;AAEA,IAAMC,yBAAAA,GAA6C;EAC/CC,IAAAA,EAAM,QAAA;EACNC,OAAAA,EAAS,OAAA;EACTC,OAAAA,EAAS,CAAA;EACTC,iBAAAA,EAAmB;AACvB,CAAA;AAEO,IAAMC,2CAA2BC,mBAAA,CAAA,MAAA;AACpC,EAAA,OAAON,yBAAAA;AACX,CAAA,EAFwC,0BAAA;AAIxC,IAAMO,+BAAAA,GAAoE;EACtEC,YAAAA,EAAc;AACV,IAAA;MAAEP,IAAAA,EAAM,MAAA;MAAQQ,IAAAA,EAAM;AAAS,KAAA;AAC/B,IAAA;MAAER,IAAAA,EAAM,SAAA;MAAWQ,IAAAA,EAAM;AAAS,KAAA;AAClC,IAAA;MAAER,IAAAA,EAAM,SAAA;MAAWQ,IAAAA,EAAM;AAAU,KAAA;AACnC,IAAA;MAAER,IAAAA,EAAM,mBAAA;MAAqBQ,IAAAA,EAAM;AAAU;;AAErD,CAAA;AAEO,IAAMC,gDAAgCJ,mBAAA,CAAA,MAAA;AACzC,EAAA,OAAOC,+BAAAA;AACX,CAAA,EAF6C,+BAAA;AAI7C,IAAMI,gCAAAA,GAAqE;EACvEC,cAAAA,EAAgB;AACZ,IAAA;MAAEX,IAAAA,EAAM,MAAA;MAAQQ,IAAAA,EAAM;AAAU,KAAA;AAChC,IAAA;MAAER,IAAAA,EAAM,YAAA;MAAcQ,IAAAA,EAAM;AAAU,KAAA;AACtC,IAAA;MAAER,IAAAA,EAAM,QAAA;MAAUQ,IAAAA,EAAM;AAAU;;AAE1C,CAAA;AAEO,IAAMI,iDAAiCP,mBAAA,CAAA,MAAA;AAC1C,EAAA,OAAOK,gCAAAA;AACX,CAAA,EAF8C,gCAAA;AAIvC,IAAMG,iCAAiBR,mBAAA,CAAA,CAC1BzC,IAAAA,EACA,EAAEkD,IAAAA,EAAMC,QAAM,KAAkB;AAEhC,EAAA,OAAO;IACHX,wBAAAA,EAAAA;IACAQ,8BAAAA,EAAAA;AACA,IAAA;AACIE,MAAAA,IAAAA;AACAC,MAAAA,MAAAA;AACAC,MAAAA,UAAAA,EAAYpD,KAAKqD,UAAAA;AACrB;;AAER,CAAA,EAb8B,gBAAA;AAevB,IAAMC,eAAAA,mBAAkBb,mBAAA,CAAA,CAACzC,IAAAA,EAAkBuD,OAAAA,KAAAA;AAC9C,EAAA,OAAOpE,aAAAA,CAAOC,MAAMoE,iBAAAA,CAAkBC,IAAAA,CAAI,GAAIR,cAAAA,CAAejD,IAAAA,EAAMuD,OAAAA,CAAAA,CAAAA;AACvE,CAAA,EAF+B,iBAAA;AAgB/B,eAAsBG,cAAAA,CAClB1D,IAAAA,EACA2D,OAAAA,EACAJ,OAAAA,EACAK,MAA8B,QAAA,EAAQ;AAEtC,EAAA,IAAID,OAAAA,CAAQjE,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,IAAIG,4BAAAA,CAAgB,qBAAA,EAAuB,4BAAA,CAAA;AACrD,EAAA;AAEA,EAAA,MAAMgE,MAAAA,GAASZ,cAAAA,CAAejD,IAAAA,EAAMuD,OAAAA,CAAAA;AAEpC,EAAA,MAAMO,aAAa,MAAMC,OAAAA,CAAQC,IAC7BL,OAAAA,CAAQrC,GAAAA,CAAI,eAAgB2C,MAAAA,EAAM;AAC9B,IAAA,MAAMC,IAAAA,GAAO,MAAMD,MAAAA,CAAOE,cAAAA,CAAc,GAAIN,MAAAA,CAAAA;AAC5C,IAAA,OAAO,IAAIpD,UAAUyD,IAAAA,CAAAA;AACzB,EAAA,CAAA,CAAA,CAAA;AAGJ,EAAA,MAAME,gBAAgBjF,aAAAA,CAAOC,KAAAA,CAAMoE,iBAAAA,CAAkBC,IAAAA,CAAI,GAAII,MAAAA,CAAAA;AAE7D,EAAA,MAAMQ,GAAAA,GAAM5D,SAAAA,CAAUU,qBAAAA,CAAsB2C,UAAAA,EAAYM,aAAAA,CAAAA;AAExD,EAAA,IAAIR,QAAQ,WAAA,EAAa;AACrB,IAAA,OAAOS,GAAAA;AACX,EAAA,CAAA,MAAA,IAAWT,QAAQ,QAAA,EAAU;AACzB,IAAA,OAAOS,IAAIvD,WAAAA,EAAW;EAC1B,CAAA,MAAO;AACH,IAAA,MAAM,IAAI9C,MAAM,kBAAA,CAAA;AACpB,EAAA;AACJ;AA9BsB0F,mBAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA","file":"index.cjs","sourcesContent":["import type { TypedDataSigner } from '@ethersproject/abstract-signer';\nimport type { BigNumber, TypedDataDomain, TypedDataField } from 'ethers';\nimport { ethers } from 'ethers';\nimport { MerkleTree } from 'merkletreejs';\n\nimport type { HexString } from '@layerzerolabs/typescript-utils';\n\nimport { OneSigCoreError } from './error';\n\n// Re-export MerkleTree and TypedDataSigner to avoid duplicate dependencies and version differences\nexport { MerkleTree, type TypedDataSigner };\n\nexport interface BaseLeafData<TargetAddressType = unknown, CallData = unknown> {\n nonce: bigint;\n oneSigId: bigint;\n targetOneSigAddress: TargetAddressType;\n calls: CallData[];\n}\n\nexport interface SigningOptions {\n seed: string | Uint8Array;\n expiry: number | string | BigNumber;\n}\n\n// We can use any here as it will be overridden by implementation\n\nexport interface GenerateLeafsResult<Leaf extends BaseLeafData = BaseLeafData<any, any>> {\n encodeCalls: (calls: Leaf['calls']) => Buffer;\n encodeAddress: (address: Leaf['targetOneSigAddress']) => Buffer;\n leafs: Leaf[];\n}\n\nfunction readByteFromHex(input: string, byteOffset: number) {\n const charOffset = byteOffset * 2;\n const sub = input.substring(charOffset, charOffset + 2);\n return parseInt(sub, 16);\n}\n\nexport function encodeLeafHeader({\n targetOneSigAddress,\n oneSigId,\n nonce,\n}: Omit<BaseLeafData<Buffer>, 'calls'>) {\n if (targetOneSigAddress.byteLength !== 32) {\n throw new Error('Contract address must be 32 bytes');\n }\n\n const storage = Buffer.alloc(49);\n storage[0] = 1;\n\n const idStr = oneSigId.toString(16).padStart(16, '0');\n const nonceStr = nonce.toString(16).padStart(16, '0');\n\n for (let i = 0; i < 32; i++) {\n if (i < 8) {\n storage[i + 1] = readByteFromHex(idStr, i); // oneSigId\n storage[i + 41] = readByteFromHex(nonceStr, i); // nonce\n }\n\n storage[i + 9] = targetOneSigAddress[i]; // target address\n }\n\n return storage;\n}\n\nexport function encodeLeaf(gen: GenerateLeafsResult, index: number) {\n const leaf = gen.leafs[index];\n\n if (!leaf) {\n throw new Error('Leaf does not exist');\n }\n\n const leafData = Buffer.concat([\n encodeLeafHeader({\n nonce: leaf.nonce,\n oneSigId: leaf.oneSigId,\n targetOneSigAddress: gen.encodeAddress(leaf.targetOneSigAddress),\n }) as unknown as Uint8Array,\n gen.encodeCalls(leaf.calls) as unknown as Uint8Array,\n ]);\n\n return ethers.utils.keccak256(ethers.utils.keccak256(leafData));\n}\n\nexport function makeOneSigTree(input: GenerateLeafsResult[]) {\n const encodedLeafs = [];\n const seenNonceIds = new Set();\n\n for (const gen of input) {\n for (let i = 0; i < gen.leafs.length; i++) {\n const leaf = gen.leafs[i];\n\n // Ensure that two calls with the same nonce/oneSigId have not already been seen\n const nonceIdCombo = `${leaf.nonce}.${leaf.oneSigId}`;\n if (seenNonceIds.has(nonceIdCombo)) {\n throw new OneSigCoreError(\n 'NONCE_ID_SEEN_TWICE',\n 'Two calls should not be made for the same chain/nonce twice',\n );\n }\n seenNonceIds.add(nonceIdCombo);\n\n encodedLeafs.push(encodeLeaf(gen, i));\n }\n }\n\n // Using sort: true instead of sortPairs: true for better determinism and multiProof compatibility.\n // sort: true enables both sortLeaves and sortPairs, ensuring consistent leaf ordering\n // and makes the tree structure completely predictable regardless of input order.\n const tree = new MerkleTree(encodedLeafs, ethers.utils.keccak256, { sort: true });\n\n return tree;\n}\n\nexport function compareAddresses(a: string, b: string): number {\n const aNumeric = BigInt(a);\n const bNumeric = BigInt(b);\n\n if (aNumeric === bNumeric) {\n return 0;\n } else if (aNumeric < bNumeric) {\n return -1;\n } else {\n return 1;\n }\n}\n\n// XXX:TODO At some point this should be moved away\ntype SignatureLike = Buffer | string | Signature | HexString;\n\nexport class Signature {\n #value: Buffer;\n\n constructor(input: SignatureLike) {\n let value = input;\n if (value instanceof Signature) {\n value = value.get();\n }\n\n if (typeof value === 'string') {\n if (!value.startsWith('0x')) {\n throw new OneSigCoreError(\n 'INVALID_SIGNATURE_INPUT',\n 'Signature takes in hex encoded strings prefixed with 0x only',\n );\n }\n\n value = Buffer.from(value.substring(2), 'hex');\n }\n\n if (value.length % 65 !== 0) {\n throw new OneSigCoreError(\n 'INVALID_SIGNATURE_INPUT',\n 'Each signature must be 65 bytes long',\n );\n }\n\n this.#value = value;\n }\n\n get() {\n return this.#value;\n }\n\n toHexString(): HexString {\n return `0x${this.get().toString('hex')}`;\n }\n\n get signatureCount() {\n const count = this.#value.length / 65;\n if (Math.floor(count) !== count) {\n throw new Error('Count is not an int');\n }\n return count;\n }\n\n /**\n * Concatenate signatures without changing ordering\n */\n static concatenateSignatures(input: SignatureLike[], sortMethod: false): Signature;\n /**\n * Concatenate signatures based on addresses provided, with each signature corresponding to the address in the same index\n */\n static concatenateSignatures(input: SignatureLike[], addresses: string[]): Signature;\n /**\n * Concatenate signatures based on the signature data, ordering based on the recovered address\n */\n static concatenateSignatures(input: SignatureLike[], digest: Buffer | string): Signature;\n /**\n * Concatenate and order signatures based on data provided\n * @param input An array of signatures to concat\n * @param sortMethod Parameter specifing how to order each signature\n * @returns The concatenated signature\n */\n static concatenateSignatures(\n input: SignatureLike[],\n sortMethod: string[] | Buffer | false | string,\n ) {\n const signatureBuffers = input.map(function (singleInput) {\n const signature = new Signature(singleInput);\n\n if (signature.signatureCount !== 1) {\n throw new OneSigCoreError(\n 'CANNOT_CONCAT_INPUT',\n 'Cannot concatenate pre-concatenated signatures',\n );\n }\n\n return signature.get();\n });\n\n let orderedSignatures;\n\n if (sortMethod === false) {\n orderedSignatures = signatureBuffers;\n } else {\n let addresses;\n if (typeof sortMethod === 'string' || Buffer.isBuffer(sortMethod)) {\n addresses = [];\n\n for (const signature of signatureBuffers) {\n const recovered = ethers.utils.recoverAddress(sortMethod, signature);\n addresses.push(recovered);\n }\n } else {\n addresses = sortMethod;\n }\n\n if (addresses.length !== signatureBuffers.length) {\n throw new OneSigCoreError(\n 'ADDRESS_SIGNATURE_LENGTH_MISMATCH',\n 'Mismatch in addresses provided signatures',\n );\n }\n\n // Create an array with the same length of addresses with incrementing values ([0, 1, ... 5])\n const indexMapping = new Array(addresses.length)\n .fill(0)\n .map((_, i) => i)\n // Sort this array based on the references to the address array, so we can apply the same order to the signatures\n .sort((a, b) => {\n return compareAddresses(addresses[a], addresses[b]);\n });\n\n orderedSignatures = indexMapping.map((index) => signatureBuffers[index]);\n }\n\n const combined = Buffer.concat(orderedSignatures);\n\n return new this(combined);\n }\n}\n\nconst ONE_SIG_TYPED_DATA_DOMAIN: TypedDataDomain = {\n name: 'OneSig',\n version: '0.0.1',\n chainId: 1, // this is hardcoded to Ethereum mainnet\n verifyingContract: '0x000000000000000000000000000000000000dEaD', // this is hardcoded to a dead address\n};\n\nexport const getOneSigTypedDataDomain = (): TypedDataDomain => {\n return ONE_SIG_TYPED_DATA_DOMAIN;\n};\n\nconst ONE_SIG_TYPED_DATA_DOMAIN_TYPES: Record<string, TypedDataField[]> = {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n};\n\nexport const getOneSigTypedDataDomainTypes = (): Record<string, TypedDataField[]> => {\n return ONE_SIG_TYPED_DATA_DOMAIN_TYPES;\n};\n\nconst ONE_SIG_TYPED_DATA_PRIMARY_TYPES: Record<string, TypedDataField[]> = {\n SignMerkleRoot: [\n { name: 'seed', type: 'bytes32' },\n { name: 'merkleRoot', type: 'bytes32' },\n { name: 'expiry', type: 'uint256' },\n ],\n};\n\nexport const getOneSigTypedDataPrimaryTypes = (): Record<string, TypedDataField[]> => {\n return ONE_SIG_TYPED_DATA_PRIMARY_TYPES;\n};\n\nexport const getSigningData = (\n tree: MerkleTree,\n { seed, expiry }: SigningOptions,\n): Parameters<TypedDataSigner['_signTypedData']> => {\n return [\n getOneSigTypedDataDomain(),\n getOneSigTypedDataPrimaryTypes(),\n {\n seed: seed,\n expiry: expiry,\n merkleRoot: tree.getHexRoot(),\n },\n ];\n};\n\nexport const getDigestToSign = (tree: MerkleTree, options: SigningOptions) => {\n return ethers.utils._TypedDataEncoder.hash(...getSigningData(tree, options));\n};\n\nexport async function signOneSigTree(\n tree: MerkleTree,\n signers: TypedDataSigner[],\n options: SigningOptions,\n enc?: 'string',\n): Promise<string>;\nexport async function signOneSigTree(\n tree: MerkleTree,\n signers: TypedDataSigner[],\n options: SigningOptions,\n enc: 'signature',\n): Promise<Signature>;\nexport async function signOneSigTree(\n tree: MerkleTree,\n signers: TypedDataSigner[],\n options: SigningOptions,\n enc: 'signature' | 'string' = 'string',\n): Promise<Signature | string> {\n if (signers.length <= 0) {\n throw new OneSigCoreError('ONE_SIGNER_REQUIRED', '1+ signer must be provided');\n }\n\n const toSign = getSigningData(tree, options);\n\n const signatures = await Promise.all(\n signers.map(async function (signer): Promise<Signature> {\n const data = await signer._signTypedData(...toSign);\n return new Signature(data);\n }),\n );\n\n const signingDigest = ethers.utils._TypedDataEncoder.hash(...toSign);\n\n const sig = Signature.concatenateSignatures(signatures, signingDigest);\n\n if (enc === 'signature') {\n return sig;\n } else if (enc === 'string') {\n return sig.toHexString();\n } else {\n throw new Error('Invalid encoding');\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,35 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { TypedDataSigner } from '@ethersproject/abstract-signer';
|
|
2
|
+
import type { BigNumber, TypedDataDomain, TypedDataField } from 'ethers';
|
|
2
3
|
import { MerkleTree } from 'merkletreejs';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
interface BaseLeafData<TargetAddressType = unknown, CallData = unknown> {
|
|
4
|
+
import type { HexString } from '@layerzerolabs/typescript-utils';
|
|
5
|
+
export { MerkleTree, type TypedDataSigner };
|
|
6
|
+
export interface BaseLeafData<TargetAddressType = unknown, CallData = unknown> {
|
|
8
7
|
nonce: bigint;
|
|
9
8
|
oneSigId: bigint;
|
|
10
9
|
targetOneSigAddress: TargetAddressType;
|
|
11
10
|
calls: CallData[];
|
|
12
11
|
}
|
|
13
|
-
interface SigningOptions {
|
|
12
|
+
export interface SigningOptions {
|
|
14
13
|
seed: string | Uint8Array;
|
|
15
14
|
expiry: number | string | BigNumber;
|
|
16
15
|
}
|
|
17
|
-
interface GenerateLeafsResult<Leaf extends BaseLeafData = BaseLeafData<any, any>> {
|
|
16
|
+
export interface GenerateLeafsResult<Leaf extends BaseLeafData = BaseLeafData<any, any>> {
|
|
18
17
|
encodeCalls: (calls: Leaf['calls']) => Buffer;
|
|
19
18
|
encodeAddress: (address: Leaf['targetOneSigAddress']) => Buffer;
|
|
20
19
|
leafs: Leaf[];
|
|
21
20
|
}
|
|
22
|
-
declare function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }: Omit<BaseLeafData<Buffer>, 'calls'>): Buffer
|
|
23
|
-
declare function encodeLeaf(gen: GenerateLeafsResult, index: number): string;
|
|
24
|
-
declare function makeOneSigTree(input: GenerateLeafsResult[]): MerkleTree;
|
|
25
|
-
declare function compareAddresses(a: string, b: string): number;
|
|
26
|
-
type
|
|
27
|
-
|
|
28
|
-
declare class Signature {
|
|
21
|
+
export declare function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce, }: Omit<BaseLeafData<Buffer>, 'calls'>): Buffer<ArrayBuffer>;
|
|
22
|
+
export declare function encodeLeaf(gen: GenerateLeafsResult, index: number): string;
|
|
23
|
+
export declare function makeOneSigTree(input: GenerateLeafsResult[]): MerkleTree;
|
|
24
|
+
export declare function compareAddresses(a: string, b: string): number;
|
|
25
|
+
type SignatureLike = Buffer | string | Signature | HexString;
|
|
26
|
+
export declare class Signature {
|
|
29
27
|
#private;
|
|
30
28
|
constructor(input: SignatureLike);
|
|
31
|
-
get(): Buffer
|
|
32
|
-
toHexString():
|
|
29
|
+
get(): Buffer<ArrayBufferLike>;
|
|
30
|
+
toHexString(): HexString;
|
|
33
31
|
get signatureCount(): number;
|
|
34
32
|
/**
|
|
35
33
|
* Concatenate signatures without changing ordering
|
|
@@ -44,12 +42,11 @@ declare class Signature {
|
|
|
44
42
|
*/
|
|
45
43
|
static concatenateSignatures(input: SignatureLike[], digest: Buffer | string): Signature;
|
|
46
44
|
}
|
|
47
|
-
declare
|
|
48
|
-
declare
|
|
49
|
-
declare
|
|
50
|
-
declare
|
|
51
|
-
declare
|
|
52
|
-
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc?: 'string'): Promise<string>;
|
|
53
|
-
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc: 'signature'): Promise<Signature>;
|
|
54
|
-
|
|
55
|
-
export { type BaseLeafData, type GenerateLeafsResult, Signature, type SigningOptions, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getOneSigTypedDataDomain, getOneSigTypedDataDomainTypes, getOneSigTypedDataPrimaryTypes, getSigningData, makeOneSigTree, signOneSigTree };
|
|
45
|
+
export declare const getOneSigTypedDataDomain: () => TypedDataDomain;
|
|
46
|
+
export declare const getOneSigTypedDataDomainTypes: () => Record<string, TypedDataField[]>;
|
|
47
|
+
export declare const getOneSigTypedDataPrimaryTypes: () => Record<string, TypedDataField[]>;
|
|
48
|
+
export declare const getSigningData: (tree: MerkleTree, { seed, expiry }: SigningOptions) => Parameters<TypedDataSigner["_signTypedData"]>;
|
|
49
|
+
export declare const getDigestToSign: (tree: MerkleTree, options: SigningOptions) => string;
|
|
50
|
+
export declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc?: 'string'): Promise<string>;
|
|
51
|
+
export declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc: 'signature'): Promise<Signature>;
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,80 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __typeError = (msg) => {
|
|
7
|
-
throw TypeError(msg);
|
|
8
|
-
};
|
|
9
|
-
var __export = (target, all) => {
|
|
10
|
-
for (var name in all)
|
|
11
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
-
};
|
|
13
|
-
var __copyProps = (to, from, except, desc) => {
|
|
14
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
-
for (let key of __getOwnPropNames(from))
|
|
16
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
-
}
|
|
19
|
-
return to;
|
|
20
|
-
};
|
|
21
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
22
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
23
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
24
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
25
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
1
|
+
import { __name, OneSigCoreError } from './WGY3RCNT.js';
|
|
2
|
+
import { ethers } from 'ethers';
|
|
3
|
+
import { MerkleTree } from 'merkletreejs';
|
|
4
|
+
export { MerkleTree } from 'merkletreejs';
|
|
26
5
|
|
|
27
|
-
// src/index.ts
|
|
28
|
-
var src_exports = {};
|
|
29
|
-
__export(src_exports, {
|
|
30
|
-
MerkleTree: () => import_merkletreejs.MerkleTree,
|
|
31
|
-
Signature: () => Signature,
|
|
32
|
-
compareAddresses: () => compareAddresses,
|
|
33
|
-
encodeLeaf: () => encodeLeaf,
|
|
34
|
-
encodeLeafHeader: () => encodeLeafHeader,
|
|
35
|
-
getDigestToSign: () => getDigestToSign,
|
|
36
|
-
getOneSigTypedDataDomain: () => getOneSigTypedDataDomain,
|
|
37
|
-
getOneSigTypedDataDomainTypes: () => getOneSigTypedDataDomainTypes,
|
|
38
|
-
getOneSigTypedDataPrimaryTypes: () => getOneSigTypedDataPrimaryTypes,
|
|
39
|
-
getSigningData: () => getSigningData,
|
|
40
|
-
makeOneSigTree: () => makeOneSigTree,
|
|
41
|
-
signOneSigTree: () => signOneSigTree
|
|
42
|
-
});
|
|
43
|
-
module.exports = __toCommonJS(src_exports);
|
|
44
|
-
var import_ethers = require("ethers");
|
|
45
|
-
var import_merkletreejs = require("merkletreejs");
|
|
46
|
-
|
|
47
|
-
// src/error.ts
|
|
48
|
-
var _code;
|
|
49
|
-
var _OneSigCoreError = class _OneSigCoreError extends Error {
|
|
50
|
-
constructor(code, message) {
|
|
51
|
-
super(`[${code}] ${message}`);
|
|
52
|
-
__privateAdd(this, _code);
|
|
53
|
-
__privateSet(this, _code, code);
|
|
54
|
-
}
|
|
55
|
-
get code() {
|
|
56
|
-
return __privateGet(this, _code);
|
|
57
|
-
}
|
|
58
|
-
static is(input, code) {
|
|
59
|
-
if (input instanceof _OneSigCoreError) {
|
|
60
|
-
if (code) {
|
|
61
|
-
return input.code === code;
|
|
62
|
-
}
|
|
63
|
-
return true;
|
|
64
|
-
} else {
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
_code = new WeakMap();
|
|
70
|
-
var OneSigCoreError = _OneSigCoreError;
|
|
71
|
-
|
|
72
|
-
// src/index.ts
|
|
73
6
|
function readByteFromHex(input, byteOffset) {
|
|
74
7
|
const charOffset = byteOffset * 2;
|
|
75
8
|
const sub = input.substring(charOffset, charOffset + 2);
|
|
76
9
|
return parseInt(sub, 16);
|
|
77
10
|
}
|
|
11
|
+
__name(readByteFromHex, "readByteFromHex");
|
|
78
12
|
function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }) {
|
|
79
13
|
if (targetOneSigAddress.byteLength !== 32) {
|
|
80
14
|
throw new Error("Contract address must be 32 bytes");
|
|
@@ -92,6 +26,7 @@ function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }) {
|
|
|
92
26
|
}
|
|
93
27
|
return storage;
|
|
94
28
|
}
|
|
29
|
+
__name(encodeLeafHeader, "encodeLeafHeader");
|
|
95
30
|
function encodeLeaf(gen, index) {
|
|
96
31
|
const leaf = gen.leafs[index];
|
|
97
32
|
if (!leaf) {
|
|
@@ -105,8 +40,9 @@ function encodeLeaf(gen, index) {
|
|
|
105
40
|
}),
|
|
106
41
|
gen.encodeCalls(leaf.calls)
|
|
107
42
|
]);
|
|
108
|
-
return
|
|
43
|
+
return ethers.utils.keccak256(ethers.utils.keccak256(leafData));
|
|
109
44
|
}
|
|
45
|
+
__name(encodeLeaf, "encodeLeaf");
|
|
110
46
|
function makeOneSigTree(input) {
|
|
111
47
|
const encodedLeafs = [];
|
|
112
48
|
const seenNonceIds = /* @__PURE__ */ new Set();
|
|
@@ -115,18 +51,18 @@ function makeOneSigTree(input) {
|
|
|
115
51
|
const leaf = gen.leafs[i];
|
|
116
52
|
const nonceIdCombo = `${leaf.nonce}.${leaf.oneSigId}`;
|
|
117
53
|
if (seenNonceIds.has(nonceIdCombo)) {
|
|
118
|
-
throw new OneSigCoreError(
|
|
119
|
-
"NONCE_ID_SEEN_TWICE",
|
|
120
|
-
"Two calls should not be made for the same chain/nonce twice"
|
|
121
|
-
);
|
|
54
|
+
throw new OneSigCoreError("NONCE_ID_SEEN_TWICE", "Two calls should not be made for the same chain/nonce twice");
|
|
122
55
|
}
|
|
123
56
|
seenNonceIds.add(nonceIdCombo);
|
|
124
57
|
encodedLeafs.push(encodeLeaf(gen, i));
|
|
125
58
|
}
|
|
126
59
|
}
|
|
127
|
-
const tree = new
|
|
60
|
+
const tree = new MerkleTree(encodedLeafs, ethers.utils.keccak256, {
|
|
61
|
+
sort: true
|
|
62
|
+
});
|
|
128
63
|
return tree;
|
|
129
64
|
}
|
|
65
|
+
__name(makeOneSigTree, "makeOneSigTree");
|
|
130
66
|
function compareAddresses(a, b) {
|
|
131
67
|
const aNumeric = BigInt(a);
|
|
132
68
|
const bNumeric = BigInt(b);
|
|
@@ -138,36 +74,36 @@ function compareAddresses(a, b) {
|
|
|
138
74
|
return 1;
|
|
139
75
|
}
|
|
140
76
|
}
|
|
141
|
-
|
|
142
|
-
var
|
|
77
|
+
__name(compareAddresses, "compareAddresses");
|
|
78
|
+
var Signature = class _Signature {
|
|
79
|
+
static {
|
|
80
|
+
__name(this, "Signature");
|
|
81
|
+
}
|
|
82
|
+
#value;
|
|
143
83
|
constructor(input) {
|
|
144
|
-
__privateAdd(this, _value);
|
|
145
84
|
let value = input;
|
|
146
85
|
if (value instanceof _Signature) {
|
|
147
86
|
value = value.get();
|
|
148
87
|
}
|
|
149
88
|
if (typeof value === "string") {
|
|
150
89
|
if (!value.startsWith("0x")) {
|
|
151
|
-
throw new OneSigCoreError(
|
|
152
|
-
"INVALID_SIGNATURE_INPUT",
|
|
153
|
-
"Signature takes in hex encoded strings prefixed with 0x only"
|
|
154
|
-
);
|
|
90
|
+
throw new OneSigCoreError("INVALID_SIGNATURE_INPUT", "Signature takes in hex encoded strings prefixed with 0x only");
|
|
155
91
|
}
|
|
156
92
|
value = Buffer.from(value.substring(2), "hex");
|
|
157
93
|
}
|
|
158
94
|
if (value.length % 65 !== 0) {
|
|
159
95
|
throw new OneSigCoreError("INVALID_SIGNATURE_INPUT", "Each signature must be 65 bytes long");
|
|
160
96
|
}
|
|
161
|
-
|
|
97
|
+
this.#value = value;
|
|
162
98
|
}
|
|
163
99
|
get() {
|
|
164
|
-
return
|
|
100
|
+
return this.#value;
|
|
165
101
|
}
|
|
166
102
|
toHexString() {
|
|
167
103
|
return `0x${this.get().toString("hex")}`;
|
|
168
104
|
}
|
|
169
105
|
get signatureCount() {
|
|
170
|
-
const count =
|
|
106
|
+
const count = this.#value.length / 65;
|
|
171
107
|
if (Math.floor(count) !== count) {
|
|
172
108
|
throw new Error("Count is not an int");
|
|
173
109
|
}
|
|
@@ -195,19 +131,16 @@ var _Signature = class _Signature {
|
|
|
195
131
|
if (typeof sortMethod === "string" || Buffer.isBuffer(sortMethod)) {
|
|
196
132
|
addresses = [];
|
|
197
133
|
for (const signature of signatureBuffers) {
|
|
198
|
-
const recovered =
|
|
134
|
+
const recovered = ethers.utils.recoverAddress(sortMethod, signature);
|
|
199
135
|
addresses.push(recovered);
|
|
200
136
|
}
|
|
201
137
|
} else {
|
|
202
138
|
addresses = sortMethod;
|
|
203
139
|
}
|
|
204
140
|
if (addresses.length !== signatureBuffers.length) {
|
|
205
|
-
throw new OneSigCoreError(
|
|
206
|
-
"ADDRESS_SIGNATURE_LENGTH_MISMATCH",
|
|
207
|
-
"Mismatch in addresses provided signatures"
|
|
208
|
-
);
|
|
141
|
+
throw new OneSigCoreError("ADDRESS_SIGNATURE_LENGTH_MISMATCH", "Mismatch in addresses provided signatures");
|
|
209
142
|
}
|
|
210
|
-
const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort(
|
|
143
|
+
const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort((a, b) => {
|
|
211
144
|
return compareAddresses(addresses[a], addresses[b]);
|
|
212
145
|
});
|
|
213
146
|
orderedSignatures = indexMapping.map((index) => signatureBuffers[index]);
|
|
@@ -216,41 +149,58 @@ var _Signature = class _Signature {
|
|
|
216
149
|
return new this(combined);
|
|
217
150
|
}
|
|
218
151
|
};
|
|
219
|
-
_value = new WeakMap();
|
|
220
|
-
var Signature = _Signature;
|
|
221
152
|
var ONE_SIG_TYPED_DATA_DOMAIN = {
|
|
222
153
|
name: "OneSig",
|
|
223
154
|
version: "0.0.1",
|
|
224
155
|
chainId: 1,
|
|
225
|
-
// this is hardcoded to Ethereum mainnet
|
|
226
156
|
verifyingContract: "0x000000000000000000000000000000000000dEaD"
|
|
227
|
-
// this is hardcoded to a dead address
|
|
228
157
|
};
|
|
229
|
-
|
|
158
|
+
var getOneSigTypedDataDomain = /* @__PURE__ */ __name(() => {
|
|
230
159
|
return ONE_SIG_TYPED_DATA_DOMAIN;
|
|
231
|
-
}
|
|
160
|
+
}, "getOneSigTypedDataDomain");
|
|
232
161
|
var ONE_SIG_TYPED_DATA_DOMAIN_TYPES = {
|
|
233
162
|
EIP712Domain: [
|
|
234
|
-
{
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
163
|
+
{
|
|
164
|
+
name: "name",
|
|
165
|
+
type: "string"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: "version",
|
|
169
|
+
type: "string"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: "chainId",
|
|
173
|
+
type: "uint256"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: "verifyingContract",
|
|
177
|
+
type: "address"
|
|
178
|
+
}
|
|
238
179
|
]
|
|
239
180
|
};
|
|
240
|
-
|
|
181
|
+
var getOneSigTypedDataDomainTypes = /* @__PURE__ */ __name(() => {
|
|
241
182
|
return ONE_SIG_TYPED_DATA_DOMAIN_TYPES;
|
|
242
|
-
}
|
|
183
|
+
}, "getOneSigTypedDataDomainTypes");
|
|
243
184
|
var ONE_SIG_TYPED_DATA_PRIMARY_TYPES = {
|
|
244
185
|
SignMerkleRoot: [
|
|
245
|
-
{
|
|
246
|
-
|
|
247
|
-
|
|
186
|
+
{
|
|
187
|
+
name: "seed",
|
|
188
|
+
type: "bytes32"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: "merkleRoot",
|
|
192
|
+
type: "bytes32"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
name: "expiry",
|
|
196
|
+
type: "uint256"
|
|
197
|
+
}
|
|
248
198
|
]
|
|
249
199
|
};
|
|
250
|
-
|
|
200
|
+
var getOneSigTypedDataPrimaryTypes = /* @__PURE__ */ __name(() => {
|
|
251
201
|
return ONE_SIG_TYPED_DATA_PRIMARY_TYPES;
|
|
252
|
-
}
|
|
253
|
-
|
|
202
|
+
}, "getOneSigTypedDataPrimaryTypes");
|
|
203
|
+
var getSigningData = /* @__PURE__ */ __name((tree, { seed, expiry }) => {
|
|
254
204
|
return [
|
|
255
205
|
getOneSigTypedDataDomain(),
|
|
256
206
|
getOneSigTypedDataPrimaryTypes(),
|
|
@@ -260,22 +210,20 @@ function getSigningData(tree, { seed, expiry }) {
|
|
|
260
210
|
merkleRoot: tree.getHexRoot()
|
|
261
211
|
}
|
|
262
212
|
];
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
return
|
|
266
|
-
}
|
|
213
|
+
}, "getSigningData");
|
|
214
|
+
var getDigestToSign = /* @__PURE__ */ __name((tree, options) => {
|
|
215
|
+
return ethers.utils._TypedDataEncoder.hash(...getSigningData(tree, options));
|
|
216
|
+
}, "getDigestToSign");
|
|
267
217
|
async function signOneSigTree(tree, signers, options, enc = "string") {
|
|
268
218
|
if (signers.length <= 0) {
|
|
269
219
|
throw new OneSigCoreError("ONE_SIGNER_REQUIRED", "1+ signer must be provided");
|
|
270
220
|
}
|
|
271
221
|
const toSign = getSigningData(tree, options);
|
|
272
|
-
const signatures = await Promise.all(
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
);
|
|
278
|
-
const signingDigest = import_ethers.ethers.utils._TypedDataEncoder.hash(...toSign);
|
|
222
|
+
const signatures = await Promise.all(signers.map(async function(signer) {
|
|
223
|
+
const data = await signer._signTypedData(...toSign);
|
|
224
|
+
return new Signature(data);
|
|
225
|
+
}));
|
|
226
|
+
const signingDigest = ethers.utils._TypedDataEncoder.hash(...toSign);
|
|
279
227
|
const sig = Signature.concatenateSignatures(signatures, signingDigest);
|
|
280
228
|
if (enc === "signature") {
|
|
281
229
|
return sig;
|
|
@@ -285,3 +233,8 @@ async function signOneSigTree(tree, signers, options, enc = "string") {
|
|
|
285
233
|
throw new Error("Invalid encoding");
|
|
286
234
|
}
|
|
287
235
|
}
|
|
236
|
+
__name(signOneSigTree, "signOneSigTree");
|
|
237
|
+
|
|
238
|
+
export { Signature, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getOneSigTypedDataDomain, getOneSigTypedDataDomainTypes, getOneSigTypedDataPrimaryTypes, getSigningData, makeOneSigTree, signOneSigTree };
|
|
239
|
+
//# sourceMappingURL=index.js.map
|
|
240
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["readByteFromHex","input","byteOffset","charOffset","sub","substring","parseInt","encodeLeafHeader","targetOneSigAddress","oneSigId","nonce","byteLength","Error","storage","Buffer","alloc","idStr","toString","padStart","nonceStr","i","encodeLeaf","gen","index","leaf","leafs","leafData","concat","encodeAddress","encodeCalls","calls","ethers","utils","keccak256","makeOneSigTree","encodedLeafs","seenNonceIds","Set","length","nonceIdCombo","has","OneSigCoreError","add","push","tree","MerkleTree","sort","compareAddresses","a","b","aNumeric","BigInt","bNumeric","Signature","value","get","startsWith","from","toHexString","signatureCount","count","Math","floor","concatenateSignatures","sortMethod","signatureBuffers","map","singleInput","signature","orderedSignatures","addresses","isBuffer","recovered","recoverAddress","indexMapping","Array","fill","_","combined","ONE_SIG_TYPED_DATA_DOMAIN","name","version","chainId","verifyingContract","getOneSigTypedDataDomain","ONE_SIG_TYPED_DATA_DOMAIN_TYPES","EIP712Domain","type","getOneSigTypedDataDomainTypes","ONE_SIG_TYPED_DATA_PRIMARY_TYPES","SignMerkleRoot","getOneSigTypedDataPrimaryTypes","getSigningData","seed","expiry","merkleRoot","getHexRoot","getDigestToSign","options","_TypedDataEncoder","hash","signOneSigTree","signers","enc","toSign","signatures","Promise","all","signer","data","_signTypedData","signingDigest","sig"],"mappings":";;;;;AAgCA,SAASA,eAAAA,CAAgBC,OAAeC,UAAAA,EAAkB;AACtD,EAAA,MAAMC,aAAaD,UAAAA,GAAa,CAAA;AAChC,EAAA,MAAME,GAAAA,GAAMH,KAAAA,CAAMI,SAAAA,CAAUF,UAAAA,EAAYA,aAAa,CAAA,CAAA;AACrD,EAAA,OAAOG,QAAAA,CAASF,KAAK,EAAA,CAAA;AACzB;AAJSJ,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAMF,SAASO,gBAAAA,CAAiB,EAC7BC,mBAAAA,EACAC,QAAAA,EACAC,OAAK,EAC6B;AAClC,EAAA,IAAIF,mBAAAA,CAAoBG,eAAe,EAAA,EAAI;AACvC,IAAA,MAAM,IAAIC,MAAM,mCAAA,CAAA;AACpB,EAAA;AAEA,EAAA,MAAMC,OAAAA,GAAUC,MAAAA,CAAOC,KAAAA,CAAM,EAAA,CAAA;AAC7BF,EAAAA,OAAAA,CAAQ,CAAA,CAAA,GAAK,CAAA;AAEb,EAAA,MAAMG,QAAQP,QAAAA,CAASQ,QAAAA,CAAS,EAAA,CAAA,CAAIC,QAAAA,CAAS,IAAI,GAAA,CAAA;AACjD,EAAA,MAAMC,WAAWT,KAAAA,CAAMO,QAAAA,CAAS,EAAA,CAAA,CAAIC,QAAAA,CAAS,IAAI,GAAA,CAAA;AAEjD,EAAA,KAAA,IAASE,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,EAAA,EAAIA,CAAAA,EAAAA,EAAK;AACzB,IAAA,IAAIA,IAAI,CAAA,EAAG;AACPP,MAAAA,OAAAA,CAAQO,CAAAA,GAAI,CAAA,CAAA,GAAKpB,eAAAA,CAAgBgB,OAAOI,CAAAA,CAAAA;AACxCP,MAAAA,OAAAA,CAAQO,CAAAA,GAAI,EAAA,CAAA,GAAMpB,eAAAA,CAAgBmB,UAAUC,CAAAA,CAAAA;AAChD,IAAA;AAEAP,IAAAA,OAAAA,CAAQO,CAAAA,GAAI,CAAA,CAAA,GAAKZ,mBAAAA,CAAoBY,CAAAA,CAAAA;AACzC,EAAA;AAEA,EAAA,OAAOP,OAAAA;AACX;AAzBgBN,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AA2BT,SAASc,UAAAA,CAAWC,KAA0BC,KAAAA,EAAa;AAC9D,EAAA,MAAMC,IAAAA,GAAOF,GAAAA,CAAIG,KAAAA,CAAMF,KAAAA,CAAAA;AAEvB,EAAA,IAAI,CAACC,IAAAA,EAAM;AACP,IAAA,MAAM,IAAIZ,MAAM,qBAAA,CAAA;AACpB,EAAA;AAEA,EAAA,MAAMc,QAAAA,GAAWZ,OAAOa,MAAAA,CAAO;IAC3BpB,gBAAAA,CAAiB;AACbG,MAAAA,KAAAA,EAAOc,IAAAA,CAAKd,KAAAA;AACZD,MAAAA,QAAAA,EAAUe,IAAAA,CAAKf,QAAAA;MACfD,mBAAAA,EAAqBc,GAAAA,CAAIM,aAAAA,CAAcJ,IAAAA,CAAKhB,mBAAmB;KACnE,CAAA;IACAc,GAAAA,CAAIO,WAAAA,CAAYL,KAAKM,KAAK;AAC7B,GAAA,CAAA;AAED,EAAA,OAAOC,OAAOC,KAAAA,CAAMC,SAAAA,CAAUF,OAAOC,KAAAA,CAAMC,SAAAA,CAAUP,QAAAA,CAAAA,CAAAA;AACzD;AAjBgBL,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AAmBT,SAASa,eAAejC,KAAAA,EAA4B;AACvD,EAAA,MAAMkC,eAAe,EAAA;AACrB,EAAA,MAAMC,YAAAA,uBAAmBC,GAAAA,EAAAA;AAEzB,EAAA,KAAA,MAAWf,OAAOrB,KAAAA,EAAO;AACrB,IAAA,KAAA,IAASmB,IAAI,CAAA,EAAGA,CAAAA,GAAIE,GAAAA,CAAIG,KAAAA,CAAMa,QAAQlB,CAAAA,EAAAA,EAAK;AACvC,MAAA,MAAMI,IAAAA,GAAOF,GAAAA,CAAIG,KAAAA,CAAML,CAAAA,CAAAA;AAGvB,MAAA,MAAMmB,eAAe,CAAA,EAAGf,IAAAA,CAAKd,KAAK,CAAA,CAAA,EAAIc,KAAKf,QAAQ,CAAA,CAAA;AACnD,MAAA,IAAI2B,YAAAA,CAAaI,GAAAA,CAAID,YAAAA,CAAAA,EAAe;AAChC,QAAA,MAAM,IAAIE,eAAAA,CACN,qBAAA,EACA,6DAAA,CAAA;AAER,MAAA;AACAL,MAAAA,YAAAA,CAAaM,IAAIH,YAAAA,CAAAA;AAEjBJ,MAAAA,YAAAA,CAAaQ,IAAAA,CAAKtB,UAAAA,CAAWC,GAAAA,EAAKF,CAAAA,CAAAA,CAAAA;AACtC,IAAA;AACJ,EAAA;AAKA,EAAA,MAAMwB,OAAO,IAAIC,UAAAA,CAAWV,YAAAA,EAAcJ,MAAAA,CAAOC,MAAMC,SAAAA,EAAW;IAAEa,IAAAA,EAAM;GAAK,CAAA;AAE/E,EAAA,OAAOF,IAAAA;AACX;AA5BgBV,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AA8BT,SAASa,gBAAAA,CAAiBC,GAAWC,CAAAA,EAAS;AACjD,EAAA,MAAMC,QAAAA,GAAWC,OAAOH,CAAAA,CAAAA;AACxB,EAAA,MAAMI,QAAAA,GAAWD,OAAOF,CAAAA,CAAAA;AAExB,EAAA,IAAIC,aAAaE,QAAAA,EAAU;AACvB,IAAA,OAAO,CAAA;AACX,EAAA,CAAA,MAAA,IAAWF,WAAWE,QAAAA,EAAU;AAC5B,IAAA,OAAO,EAAA;EACX,CAAA,MAAO;AACH,IAAA,OAAO,CAAA;AACX,EAAA;AACJ;AAXgBL,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAgBT,IAAMM,SAAAA,GAAN,MAAMA,UAAAA,CAAAA;EAhIb;;;AAiII,EAAA,MAAA;AAEA,EAAA,WAAA,CAAYpD,KAAAA,EAAsB;AAC9B,IAAA,IAAIqD,KAAAA,GAAQrD,KAAAA;AACZ,IAAA,IAAIqD,iBAAiBD,UAAAA,EAAW;AAC5BC,MAAAA,KAAAA,GAAQA,MAAMC,GAAAA,EAAG;AACrB,IAAA;AAEA,IAAA,IAAI,OAAOD,UAAU,QAAA,EAAU;AAC3B,MAAA,IAAI,CAACA,KAAAA,CAAME,UAAAA,CAAW,IAAA,CAAA,EAAO;AACzB,QAAA,MAAM,IAAIf,eAAAA,CACN,yBAAA,EACA,8DAAA,CAAA;AAER,MAAA;AAEAa,MAAAA,KAAAA,GAAQxC,OAAO2C,IAAAA,CAAKH,KAAAA,CAAMjD,SAAAA,CAAU,CAAA,GAAI,KAAA,CAAA;AAC5C,IAAA;AAEA,IAAA,IAAIiD,KAAAA,CAAMhB,MAAAA,GAAS,EAAA,KAAO,CAAA,EAAG;AACzB,MAAA,MAAM,IAAIG,eAAAA,CACN,yBAAA,EACA,sCAAA,CAAA;AAER,IAAA;AAEA,IAAA,IAAA,CAAK,MAAA,GAASa,KAAAA;AAClB,EAAA;EAEAC,GAAAA,GAAM;AACF,IAAA,OAAO,IAAA,CAAK,MAAA;AAChB,EAAA;EAEAG,WAAAA,GAAyB;AACrB,IAAA,OAAO,KAAK,IAAA,CAAKH,GAAAA,EAAG,CAAGtC,QAAAA,CAAS,KAAA,CAAA,CAAA,CAAA;AACpC,EAAA;AAEA,EAAA,IAAI0C,cAAAA,GAAiB;AACjB,IAAA,MAAMC,KAAAA,GAAQ,IAAA,CAAK,MAAA,CAAOtB,MAAAA,GAAS,EAAA;AACnC,IAAA,IAAIuB,IAAAA,CAAKC,KAAAA,CAAMF,KAAAA,CAAAA,KAAWA,KAAAA,EAAO;AAC7B,MAAA,MAAM,IAAIhD,MAAM,qBAAA,CAAA;AACpB,IAAA;AACA,IAAA,OAAOgD,KAAAA;AACX,EAAA;;;;;;;EAoBA,OAAOG,qBAAAA,CACH9D,OACA+D,UAAAA,EACF;AACE,IAAA,MAAMC,gBAAAA,GAAmBhE,KAAAA,CAAMiE,GAAAA,CAAI,SAAUC,WAAAA,EAAW;AACpD,MAAA,MAAMC,SAAAA,GAAY,IAAIf,UAAAA,CAAUc,WAAAA,CAAAA;AAEhC,MAAA,IAAIC,SAAAA,CAAUT,mBAAmB,CAAA,EAAG;AAChC,QAAA,MAAM,IAAIlB,eAAAA,CACN,qBAAA,EACA,gDAAA,CAAA;AAER,MAAA;AAEA,MAAA,OAAO2B,UAAUb,GAAAA,EAAG;IACxB,CAAA,CAAA;AAEA,IAAA,IAAIc,iBAAAA;AAEJ,IAAA,IAAIL,eAAe,KAAA,EAAO;AACtBK,MAAAA,iBAAAA,GAAoBJ,gBAAAA;IACxB,CAAA,MAAO;AACH,MAAA,IAAIK,SAAAA;AACJ,MAAA,IAAI,OAAON,UAAAA,KAAe,QAAA,IAAYlD,MAAAA,CAAOyD,QAAAA,CAASP,UAAAA,CAAAA,EAAa;AAC/DM,QAAAA,SAAAA,GAAY,EAAA;AAEZ,QAAA,KAAA,MAAWF,aAAaH,gBAAAA,EAAkB;AACtC,UAAA,MAAMO,SAAAA,GAAYzC,MAAAA,CAAOC,KAAAA,CAAMyC,cAAAA,CAAeT,YAAYI,SAAAA,CAAAA;AAC1DE,UAAAA,SAAAA,CAAU3B,KAAK6B,SAAAA,CAAAA;AACnB,QAAA;MACJ,CAAA,MAAO;AACHF,QAAAA,SAAAA,GAAYN,UAAAA;AAChB,MAAA;AAEA,MAAA,IAAIM,SAAAA,CAAUhC,MAAAA,KAAW2B,gBAAAA,CAAiB3B,MAAAA,EAAQ;AAC9C,QAAA,MAAM,IAAIG,eAAAA,CACN,mCAAA,EACA,2CAAA,CAAA;AAER,MAAA;AAGA,MAAA,MAAMiC,eAAe,IAAIC,KAAAA,CAAML,UAAUhC,MAAM,CAAA,CAC1CsC,KAAK,CAAA,CAAA,CACLV,GAAAA,CAAI,CAACW,GAAGzD,CAAAA,KAAMA,CAAAA,EAEd0B,IAAAA,CAAK,CAACE,GAAGC,CAAAA,KAAAA;AACN,QAAA,OAAOF,iBAAiBuB,SAAAA,CAAUtB,CAAAA,CAAAA,EAAIsB,SAAAA,CAAUrB,CAAAA,CAAE,CAAA;MACtD,CAAA,CAAA;AAEJoB,MAAAA,iBAAAA,GAAoBK,aAAaR,GAAAA,CAAI,CAAC3C,KAAAA,KAAU0C,gBAAAA,CAAiB1C,KAAAA,CAAM,CAAA;AAC3E,IAAA;AAEA,IAAA,MAAMuD,QAAAA,GAAWhE,MAAAA,CAAOa,MAAAA,CAAO0C,iBAAAA,CAAAA;AAE/B,IAAA,OAAO,IAAI,KAAKS,QAAAA,CAAAA;AACpB,EAAA;AACJ;AAEA,IAAMC,yBAAAA,GAA6C;EAC/CC,IAAAA,EAAM,QAAA;EACNC,OAAAA,EAAS,OAAA;EACTC,OAAAA,EAAS,CAAA;EACTC,iBAAAA,EAAmB;AACvB,CAAA;AAEO,IAAMC,2CAA2B,MAAA,CAAA,MAAA;AACpC,EAAA,OAAOL,yBAAAA;AACX,CAAA,EAFwC,0BAAA;AAIxC,IAAMM,+BAAAA,GAAoE;EACtEC,YAAAA,EAAc;AACV,IAAA;MAAEN,IAAAA,EAAM,MAAA;MAAQO,IAAAA,EAAM;AAAS,KAAA;AAC/B,IAAA;MAAEP,IAAAA,EAAM,SAAA;MAAWO,IAAAA,EAAM;AAAS,KAAA;AAClC,IAAA;MAAEP,IAAAA,EAAM,SAAA;MAAWO,IAAAA,EAAM;AAAU,KAAA;AACnC,IAAA;MAAEP,IAAAA,EAAM,mBAAA;MAAqBO,IAAAA,EAAM;AAAU;;AAErD,CAAA;AAEO,IAAMC,gDAAgC,MAAA,CAAA,MAAA;AACzC,EAAA,OAAOH,+BAAAA;AACX,CAAA,EAF6C,+BAAA;AAI7C,IAAMI,gCAAAA,GAAqE;EACvEC,cAAAA,EAAgB;AACZ,IAAA;MAAEV,IAAAA,EAAM,MAAA;MAAQO,IAAAA,EAAM;AAAU,KAAA;AAChC,IAAA;MAAEP,IAAAA,EAAM,YAAA;MAAcO,IAAAA,EAAM;AAAU,KAAA;AACtC,IAAA;MAAEP,IAAAA,EAAM,QAAA;MAAUO,IAAAA,EAAM;AAAU;;AAE1C,CAAA;AAEO,IAAMI,iDAAiC,MAAA,CAAA,MAAA;AAC1C,EAAA,OAAOF,gCAAAA;AACX,CAAA,EAF8C,gCAAA;AAIvC,IAAMG,iCAAiB,MAAA,CAAA,CAC1BhD,IAAAA,EACA,EAAEiD,IAAAA,EAAMC,QAAM,KAAkB;AAEhC,EAAA,OAAO;IACHV,wBAAAA,EAAAA;IACAO,8BAAAA,EAAAA;AACA,IAAA;AACIE,MAAAA,IAAAA;AACAC,MAAAA,MAAAA;AACAC,MAAAA,UAAAA,EAAYnD,KAAKoD,UAAAA;AACrB;;AAER,CAAA,EAb8B,gBAAA;AAevB,IAAMC,eAAAA,mBAAkB,MAAA,CAAA,CAACrD,IAAAA,EAAkBsD,OAAAA,KAAAA;AAC9C,EAAA,OAAOnE,MAAAA,CAAOC,MAAMmE,iBAAAA,CAAkBC,IAAAA,CAAI,GAAIR,cAAAA,CAAehD,IAAAA,EAAMsD,OAAAA,CAAAA,CAAAA;AACvE,CAAA,EAF+B,iBAAA;AAgB/B,eAAsBG,cAAAA,CAClBzD,IAAAA,EACA0D,OAAAA,EACAJ,OAAAA,EACAK,MAA8B,QAAA,EAAQ;AAEtC,EAAA,IAAID,OAAAA,CAAQhE,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,IAAIG,eAAAA,CAAgB,qBAAA,EAAuB,4BAAA,CAAA;AACrD,EAAA;AAEA,EAAA,MAAM+D,MAAAA,GAASZ,cAAAA,CAAehD,IAAAA,EAAMsD,OAAAA,CAAAA;AAEpC,EAAA,MAAMO,aAAa,MAAMC,OAAAA,CAAQC,IAC7BL,OAAAA,CAAQpC,GAAAA,CAAI,eAAgB0C,MAAAA,EAAM;AAC9B,IAAA,MAAMC,IAAAA,GAAO,MAAMD,MAAAA,CAAOE,cAAAA,CAAc,GAAIN,MAAAA,CAAAA;AAC5C,IAAA,OAAO,IAAInD,UAAUwD,IAAAA,CAAAA;AACzB,EAAA,CAAA,CAAA,CAAA;AAGJ,EAAA,MAAME,gBAAgBhF,MAAAA,CAAOC,KAAAA,CAAMmE,iBAAAA,CAAkBC,IAAAA,CAAI,GAAII,MAAAA,CAAAA;AAE7D,EAAA,MAAMQ,GAAAA,GAAM3D,SAAAA,CAAUU,qBAAAA,CAAsB0C,UAAAA,EAAYM,aAAAA,CAAAA;AAExD,EAAA,IAAIR,QAAQ,WAAA,EAAa;AACrB,IAAA,OAAOS,GAAAA;AACX,EAAA,CAAA,MAAA,IAAWT,QAAQ,QAAA,EAAU;AACzB,IAAA,OAAOS,IAAItD,WAAAA,EAAW;EAC1B,CAAA,MAAO;AACH,IAAA,MAAM,IAAI9C,MAAM,kBAAA,CAAA;AACpB,EAAA;AACJ;AA9BsByF,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA","file":"index.js","sourcesContent":["import type { TypedDataSigner } from '@ethersproject/abstract-signer';\nimport type { BigNumber, TypedDataDomain, TypedDataField } from 'ethers';\nimport { ethers } from 'ethers';\nimport { MerkleTree } from 'merkletreejs';\n\nimport type { HexString } from '@layerzerolabs/typescript-utils';\n\nimport { OneSigCoreError } from './error';\n\n// Re-export MerkleTree and TypedDataSigner to avoid duplicate dependencies and version differences\nexport { MerkleTree, type TypedDataSigner };\n\nexport interface BaseLeafData<TargetAddressType = unknown, CallData = unknown> {\n nonce: bigint;\n oneSigId: bigint;\n targetOneSigAddress: TargetAddressType;\n calls: CallData[];\n}\n\nexport interface SigningOptions {\n seed: string | Uint8Array;\n expiry: number | string | BigNumber;\n}\n\n// We can use any here as it will be overridden by implementation\n\nexport interface GenerateLeafsResult<Leaf extends BaseLeafData = BaseLeafData<any, any>> {\n encodeCalls: (calls: Leaf['calls']) => Buffer;\n encodeAddress: (address: Leaf['targetOneSigAddress']) => Buffer;\n leafs: Leaf[];\n}\n\nfunction readByteFromHex(input: string, byteOffset: number) {\n const charOffset = byteOffset * 2;\n const sub = input.substring(charOffset, charOffset + 2);\n return parseInt(sub, 16);\n}\n\nexport function encodeLeafHeader({\n targetOneSigAddress,\n oneSigId,\n nonce,\n}: Omit<BaseLeafData<Buffer>, 'calls'>) {\n if (targetOneSigAddress.byteLength !== 32) {\n throw new Error('Contract address must be 32 bytes');\n }\n\n const storage = Buffer.alloc(49);\n storage[0] = 1;\n\n const idStr = oneSigId.toString(16).padStart(16, '0');\n const nonceStr = nonce.toString(16).padStart(16, '0');\n\n for (let i = 0; i < 32; i++) {\n if (i < 8) {\n storage[i + 1] = readByteFromHex(idStr, i); // oneSigId\n storage[i + 41] = readByteFromHex(nonceStr, i); // nonce\n }\n\n storage[i + 9] = targetOneSigAddress[i]; // target address\n }\n\n return storage;\n}\n\nexport function encodeLeaf(gen: GenerateLeafsResult, index: number) {\n const leaf = gen.leafs[index];\n\n if (!leaf) {\n throw new Error('Leaf does not exist');\n }\n\n const leafData = Buffer.concat([\n encodeLeafHeader({\n nonce: leaf.nonce,\n oneSigId: leaf.oneSigId,\n targetOneSigAddress: gen.encodeAddress(leaf.targetOneSigAddress),\n }) as unknown as Uint8Array,\n gen.encodeCalls(leaf.calls) as unknown as Uint8Array,\n ]);\n\n return ethers.utils.keccak256(ethers.utils.keccak256(leafData));\n}\n\nexport function makeOneSigTree(input: GenerateLeafsResult[]) {\n const encodedLeafs = [];\n const seenNonceIds = new Set();\n\n for (const gen of input) {\n for (let i = 0; i < gen.leafs.length; i++) {\n const leaf = gen.leafs[i];\n\n // Ensure that two calls with the same nonce/oneSigId have not already been seen\n const nonceIdCombo = `${leaf.nonce}.${leaf.oneSigId}`;\n if (seenNonceIds.has(nonceIdCombo)) {\n throw new OneSigCoreError(\n 'NONCE_ID_SEEN_TWICE',\n 'Two calls should not be made for the same chain/nonce twice',\n );\n }\n seenNonceIds.add(nonceIdCombo);\n\n encodedLeafs.push(encodeLeaf(gen, i));\n }\n }\n\n // Using sort: true instead of sortPairs: true for better determinism and multiProof compatibility.\n // sort: true enables both sortLeaves and sortPairs, ensuring consistent leaf ordering\n // and makes the tree structure completely predictable regardless of input order.\n const tree = new MerkleTree(encodedLeafs, ethers.utils.keccak256, { sort: true });\n\n return tree;\n}\n\nexport function compareAddresses(a: string, b: string): number {\n const aNumeric = BigInt(a);\n const bNumeric = BigInt(b);\n\n if (aNumeric === bNumeric) {\n return 0;\n } else if (aNumeric < bNumeric) {\n return -1;\n } else {\n return 1;\n }\n}\n\n// XXX:TODO At some point this should be moved away\ntype SignatureLike = Buffer | string | Signature | HexString;\n\nexport class Signature {\n #value: Buffer;\n\n constructor(input: SignatureLike) {\n let value = input;\n if (value instanceof Signature) {\n value = value.get();\n }\n\n if (typeof value === 'string') {\n if (!value.startsWith('0x')) {\n throw new OneSigCoreError(\n 'INVALID_SIGNATURE_INPUT',\n 'Signature takes in hex encoded strings prefixed with 0x only',\n );\n }\n\n value = Buffer.from(value.substring(2), 'hex');\n }\n\n if (value.length % 65 !== 0) {\n throw new OneSigCoreError(\n 'INVALID_SIGNATURE_INPUT',\n 'Each signature must be 65 bytes long',\n );\n }\n\n this.#value = value;\n }\n\n get() {\n return this.#value;\n }\n\n toHexString(): HexString {\n return `0x${this.get().toString('hex')}`;\n }\n\n get signatureCount() {\n const count = this.#value.length / 65;\n if (Math.floor(count) !== count) {\n throw new Error('Count is not an int');\n }\n return count;\n }\n\n /**\n * Concatenate signatures without changing ordering\n */\n static concatenateSignatures(input: SignatureLike[], sortMethod: false): Signature;\n /**\n * Concatenate signatures based on addresses provided, with each signature corresponding to the address in the same index\n */\n static concatenateSignatures(input: SignatureLike[], addresses: string[]): Signature;\n /**\n * Concatenate signatures based on the signature data, ordering based on the recovered address\n */\n static concatenateSignatures(input: SignatureLike[], digest: Buffer | string): Signature;\n /**\n * Concatenate and order signatures based on data provided\n * @param input An array of signatures to concat\n * @param sortMethod Parameter specifing how to order each signature\n * @returns The concatenated signature\n */\n static concatenateSignatures(\n input: SignatureLike[],\n sortMethod: string[] | Buffer | false | string,\n ) {\n const signatureBuffers = input.map(function (singleInput) {\n const signature = new Signature(singleInput);\n\n if (signature.signatureCount !== 1) {\n throw new OneSigCoreError(\n 'CANNOT_CONCAT_INPUT',\n 'Cannot concatenate pre-concatenated signatures',\n );\n }\n\n return signature.get();\n });\n\n let orderedSignatures;\n\n if (sortMethod === false) {\n orderedSignatures = signatureBuffers;\n } else {\n let addresses;\n if (typeof sortMethod === 'string' || Buffer.isBuffer(sortMethod)) {\n addresses = [];\n\n for (const signature of signatureBuffers) {\n const recovered = ethers.utils.recoverAddress(sortMethod, signature);\n addresses.push(recovered);\n }\n } else {\n addresses = sortMethod;\n }\n\n if (addresses.length !== signatureBuffers.length) {\n throw new OneSigCoreError(\n 'ADDRESS_SIGNATURE_LENGTH_MISMATCH',\n 'Mismatch in addresses provided signatures',\n );\n }\n\n // Create an array with the same length of addresses with incrementing values ([0, 1, ... 5])\n const indexMapping = new Array(addresses.length)\n .fill(0)\n .map((_, i) => i)\n // Sort this array based on the references to the address array, so we can apply the same order to the signatures\n .sort((a, b) => {\n return compareAddresses(addresses[a], addresses[b]);\n });\n\n orderedSignatures = indexMapping.map((index) => signatureBuffers[index]);\n }\n\n const combined = Buffer.concat(orderedSignatures);\n\n return new this(combined);\n }\n}\n\nconst ONE_SIG_TYPED_DATA_DOMAIN: TypedDataDomain = {\n name: 'OneSig',\n version: '0.0.1',\n chainId: 1, // this is hardcoded to Ethereum mainnet\n verifyingContract: '0x000000000000000000000000000000000000dEaD', // this is hardcoded to a dead address\n};\n\nexport const getOneSigTypedDataDomain = (): TypedDataDomain => {\n return ONE_SIG_TYPED_DATA_DOMAIN;\n};\n\nconst ONE_SIG_TYPED_DATA_DOMAIN_TYPES: Record<string, TypedDataField[]> = {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n};\n\nexport const getOneSigTypedDataDomainTypes = (): Record<string, TypedDataField[]> => {\n return ONE_SIG_TYPED_DATA_DOMAIN_TYPES;\n};\n\nconst ONE_SIG_TYPED_DATA_PRIMARY_TYPES: Record<string, TypedDataField[]> = {\n SignMerkleRoot: [\n { name: 'seed', type: 'bytes32' },\n { name: 'merkleRoot', type: 'bytes32' },\n { name: 'expiry', type: 'uint256' },\n ],\n};\n\nexport const getOneSigTypedDataPrimaryTypes = (): Record<string, TypedDataField[]> => {\n return ONE_SIG_TYPED_DATA_PRIMARY_TYPES;\n};\n\nexport const getSigningData = (\n tree: MerkleTree,\n { seed, expiry }: SigningOptions,\n): Parameters<TypedDataSigner['_signTypedData']> => {\n return [\n getOneSigTypedDataDomain(),\n getOneSigTypedDataPrimaryTypes(),\n {\n seed: seed,\n expiry: expiry,\n merkleRoot: tree.getHexRoot(),\n },\n ];\n};\n\nexport const getDigestToSign = (tree: MerkleTree, options: SigningOptions) => {\n return ethers.utils._TypedDataEncoder.hash(...getSigningData(tree, options));\n};\n\nexport async function signOneSigTree(\n tree: MerkleTree,\n signers: TypedDataSigner[],\n options: SigningOptions,\n enc?: 'string',\n): Promise<string>;\nexport async function signOneSigTree(\n tree: MerkleTree,\n signers: TypedDataSigner[],\n options: SigningOptions,\n enc: 'signature',\n): Promise<Signature>;\nexport async function signOneSigTree(\n tree: MerkleTree,\n signers: TypedDataSigner[],\n options: SigningOptions,\n enc: 'signature' | 'string' = 'string',\n): Promise<Signature | string> {\n if (signers.length <= 0) {\n throw new OneSigCoreError('ONE_SIGNER_REQUIRED', '1+ signer must be provided');\n }\n\n const toSign = getSigningData(tree, options);\n\n const signatures = await Promise.all(\n signers.map(async function (signer): Promise<Signature> {\n const data = await signer._signTypedData(...toSign);\n return new Signature(data);\n }),\n );\n\n const signingDigest = ethers.utils._TypedDataEncoder.hash(...toSign);\n\n const sig = Signature.concatenateSignatures(signatures, signingDigest);\n\n if (enc === 'signature') {\n return sig;\n } else if (enc === 'string') {\n return sig.toHexString();\n } else {\n throw new Error('Invalid encoding');\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,63 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/onesig-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.23",
|
|
4
|
+
"private": false,
|
|
4
5
|
"license": "GPL-3.0-only",
|
|
6
|
+
"type": "module",
|
|
5
7
|
"exports": {
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
},
|
|
11
|
-
"./package.json": "./package.json"
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"require": "./dist/index.cjs",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.cjs"
|
|
12
12
|
},
|
|
13
|
-
"main": "./dist/index.
|
|
13
|
+
"main": "./dist/index.cjs",
|
|
14
|
+
"module": "./dist/index.js",
|
|
14
15
|
"types": "./dist/index.d.ts",
|
|
15
16
|
"files": [
|
|
16
17
|
"dist/**/*"
|
|
17
18
|
],
|
|
18
|
-
"lint-staged": {
|
|
19
|
-
"**/*.{js,ts,tsx}": [
|
|
20
|
-
"pnpm prettier --write --ignore-unknown .",
|
|
21
|
-
"pnpm eslint --fix"
|
|
22
|
-
],
|
|
23
|
-
"**/*.json": [
|
|
24
|
-
"pnpm prettier --write --ignore-unknown ."
|
|
25
|
-
]
|
|
26
|
-
},
|
|
27
19
|
"dependencies": {
|
|
28
20
|
"@ethersproject/abstract-signer": "^5.8.0",
|
|
29
21
|
"ethers": "^5.8.0",
|
|
30
|
-
"merkletreejs": "^0.3.11"
|
|
22
|
+
"merkletreejs": "^0.3.11",
|
|
23
|
+
"@layerzerolabs/typescript-utils": "0.2.23"
|
|
31
24
|
},
|
|
32
25
|
"devDependencies": {
|
|
33
|
-
"@
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"jest": "^29.7.0",
|
|
43
|
-
"lint-staged": "^15.2.2",
|
|
44
|
-
"prettier": "^3.2.5",
|
|
45
|
-
"rimraf": "^5.0.5",
|
|
46
|
-
"typescript": "^5.3.3"
|
|
47
|
-
},
|
|
48
|
-
"packageManager": "pnpm@8.14.0",
|
|
49
|
-
"engines": {
|
|
50
|
-
"node": ">=20.10.0"
|
|
26
|
+
"@types/node": "^22.18.6",
|
|
27
|
+
"dotenv": "16.4.5",
|
|
28
|
+
"eslint": "^9.17.0",
|
|
29
|
+
"prettier": "3.5.3",
|
|
30
|
+
"tsup": "^8.4.0",
|
|
31
|
+
"typescript": "^5.8.2",
|
|
32
|
+
"vitest": "^3.2.3",
|
|
33
|
+
"@layerzerolabs/typescript-configuration": "0.2.23",
|
|
34
|
+
"@layerzerolabs/tsup-configuration": "0.2.23"
|
|
51
35
|
},
|
|
52
36
|
"publishConfig": {
|
|
53
|
-
"access": "
|
|
37
|
+
"access": "restricted",
|
|
38
|
+
"registry": "https://registry.npmjs.org/"
|
|
54
39
|
},
|
|
55
40
|
"scripts": {
|
|
56
|
-
"build
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"lint:fix": "eslint --fix '**/*.{js,ts,json}' && prettier --write .",
|
|
60
|
-
"lint:js": "eslint '**/*.{js,ts,json}' && prettier --check .",
|
|
61
|
-
"test": "jest --verbose --ci"
|
|
41
|
+
"build": "tsup",
|
|
42
|
+
"lint": "eslint . --max-warnings 0 || (eslint . --fix --max-warnings 0 && false)",
|
|
43
|
+
"test": "vitest --run --pass-with-no-tests --typecheck"
|
|
62
44
|
}
|
|
63
45
|
}
|
package/LICENSE.md
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
GPL-3.0 License
|
|
2
|
-
|
|
3
|
-
Copyright (C) 2025 LayerZero Labs Ltd.
|
|
4
|
-
|
|
5
|
-
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
|
|
6
|
-
|
|
7
|
-
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
8
|
-
|
|
9
|
-
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
package/dist/index.d.mts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { BigNumber, TypedDataDomain, TypedDataField } from 'ethers';
|
|
2
|
-
import { MerkleTree } from 'merkletreejs';
|
|
3
|
-
export { MerkleTree } from 'merkletreejs';
|
|
4
|
-
import { TypedDataSigner } from '@ethersproject/abstract-signer';
|
|
5
|
-
export { TypedDataSigner } from '@ethersproject/abstract-signer';
|
|
6
|
-
|
|
7
|
-
interface BaseLeafData<TargetAddressType = unknown, CallData = unknown> {
|
|
8
|
-
nonce: bigint;
|
|
9
|
-
oneSigId: bigint;
|
|
10
|
-
targetOneSigAddress: TargetAddressType;
|
|
11
|
-
calls: CallData[];
|
|
12
|
-
}
|
|
13
|
-
interface SigningOptions {
|
|
14
|
-
seed: string | Uint8Array;
|
|
15
|
-
expiry: number | string | BigNumber;
|
|
16
|
-
}
|
|
17
|
-
interface GenerateLeafsResult<Leaf extends BaseLeafData = BaseLeafData<any, any>> {
|
|
18
|
-
encodeCalls: (calls: Leaf['calls']) => Buffer;
|
|
19
|
-
encodeAddress: (address: Leaf['targetOneSigAddress']) => Buffer;
|
|
20
|
-
leafs: Leaf[];
|
|
21
|
-
}
|
|
22
|
-
declare function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }: Omit<BaseLeafData<Buffer>, 'calls'>): Buffer;
|
|
23
|
-
declare function encodeLeaf(gen: GenerateLeafsResult, index: number): string;
|
|
24
|
-
declare function makeOneSigTree(input: GenerateLeafsResult[]): MerkleTree;
|
|
25
|
-
declare function compareAddresses(a: string, b: string): number;
|
|
26
|
-
type HexStringLike = `0x${string}`;
|
|
27
|
-
type SignatureLike = Buffer | string | Signature | HexStringLike;
|
|
28
|
-
declare class Signature {
|
|
29
|
-
#private;
|
|
30
|
-
constructor(input: SignatureLike);
|
|
31
|
-
get(): Buffer;
|
|
32
|
-
toHexString(): HexStringLike;
|
|
33
|
-
get signatureCount(): number;
|
|
34
|
-
/**
|
|
35
|
-
* Concatenate signatures without changing ordering
|
|
36
|
-
*/
|
|
37
|
-
static concatenateSignatures(input: SignatureLike[], sortMethod: false): Signature;
|
|
38
|
-
/**
|
|
39
|
-
* Concatenate signatures based on addresses provided, with each signature corresponding to the address in the same index
|
|
40
|
-
*/
|
|
41
|
-
static concatenateSignatures(input: SignatureLike[], addresses: string[]): Signature;
|
|
42
|
-
/**
|
|
43
|
-
* Concatenate signatures based on the signature data, ordering based on the recovered address
|
|
44
|
-
*/
|
|
45
|
-
static concatenateSignatures(input: SignatureLike[], digest: Buffer | string): Signature;
|
|
46
|
-
}
|
|
47
|
-
declare function getOneSigTypedDataDomain(): TypedDataDomain;
|
|
48
|
-
declare function getOneSigTypedDataDomainTypes(): Record<string, TypedDataField[]>;
|
|
49
|
-
declare function getOneSigTypedDataPrimaryTypes(): Record<string, TypedDataField[]>;
|
|
50
|
-
declare function getSigningData(tree: MerkleTree, { seed, expiry }: SigningOptions): Parameters<TypedDataSigner['_signTypedData']>;
|
|
51
|
-
declare function getDigestToSign(tree: MerkleTree, options: SigningOptions): string;
|
|
52
|
-
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc?: 'string'): Promise<string>;
|
|
53
|
-
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc: 'signature'): Promise<Signature>;
|
|
54
|
-
|
|
55
|
-
export { type BaseLeafData, type GenerateLeafsResult, Signature, type SigningOptions, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getOneSigTypedDataDomain, getOneSigTypedDataDomainTypes, getOneSigTypedDataPrimaryTypes, getSigningData, makeOneSigTree, signOneSigTree };
|