@layerzerolabs/onesig-core 0.2.90 → 0.2.92

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/package.json CHANGED
@@ -1,16 +1,15 @@
1
1
  {
2
2
  "name": "@layerzerolabs/onesig-core",
3
- "version": "0.2.90",
3
+ "version": "0.2.92",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "exports": {
8
8
  "types": "./dist/index.d.ts",
9
- "require": "./dist/index.cjs",
10
9
  "import": "./dist/index.js",
11
- "default": "./dist/index.cjs"
10
+ "default": "./dist/index.js"
12
11
  },
13
- "main": "./dist/index.cjs",
12
+ "main": "./dist/index.js",
14
13
  "module": "./dist/index.js",
15
14
  "types": "./dist/index.d.ts",
16
15
  "files": [
@@ -20,7 +19,7 @@
20
19
  "@ethersproject/abstract-signer": "^5.8.0",
21
20
  "ethers": "^5.8.0",
22
21
  "merkletreejs": "^0.3.11",
23
- "@layerzerolabs/typescript-utils": "0.2.90"
22
+ "@layerzerolabs/typescript-utils": "0.2.92"
24
23
  },
25
24
  "devDependencies": {
26
25
  "@types/node": "^22.18.6",
@@ -30,8 +29,8 @@
30
29
  "tsup": "^8.4.0",
31
30
  "typescript": "^5.8.2",
32
31
  "vitest": "^3.2.3",
33
- "@layerzerolabs/tsup-configuration": "0.2.90",
34
- "@layerzerolabs/typescript-configuration": "0.2.90"
32
+ "@layerzerolabs/typescript-configuration": "0.2.92",
33
+ "@layerzerolabs/tsup-configuration": "0.2.92"
35
34
  },
36
35
  "publishConfig": {
37
36
  "access": "public",
@@ -40,6 +39,7 @@
40
39
  "externalRepoConfig": {
41
40
  "targets": [
42
41
  "audit-external",
42
+ "console-pen-test",
43
43
  "monorepo-external",
44
44
  "onesig-client"
45
45
  ]
package/dist/XDTXKETK.cjs DELETED
@@ -1,47 +0,0 @@
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
@@ -1 +0,0 @@
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 DELETED
@@ -1,16 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"error.cjs"}
package/dist/index.cjs DELETED
@@ -1,255 +0,0 @@
1
- 'use strict';
2
-
3
- var XDTXKETK_cjs = require('./XDTXKETK.cjs');
4
- var ethers = require('ethers');
5
- var merkletreejs = require('merkletreejs');
6
-
7
- function readByteFromHex(input, byteOffset) {
8
- const charOffset = byteOffset * 2;
9
- const sub = input.substring(charOffset, charOffset + 2);
10
- return parseInt(sub, 16);
11
- }
12
- XDTXKETK_cjs.__name(readByteFromHex, "readByteFromHex");
13
- function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }) {
14
- if (targetOneSigAddress.byteLength !== 32) {
15
- throw new Error("Contract address must be 32 bytes");
16
- }
17
- const storage = Buffer.alloc(49);
18
- storage[0] = 1;
19
- const idStr = oneSigId.toString(16).padStart(16, "0");
20
- const nonceStr = nonce.toString(16).padStart(16, "0");
21
- for (let i = 0; i < 32; i++) {
22
- if (i < 8) {
23
- storage[i + 1] = readByteFromHex(idStr, i);
24
- storage[i + 41] = readByteFromHex(nonceStr, i);
25
- }
26
- storage[i + 9] = targetOneSigAddress[i];
27
- }
28
- return storage;
29
- }
30
- XDTXKETK_cjs.__name(encodeLeafHeader, "encodeLeafHeader");
31
- function encodeLeaf(gen, index) {
32
- const leaf = gen.leafs[index];
33
- if (!leaf) {
34
- throw new Error("Leaf does not exist");
35
- }
36
- const leafData = Buffer.concat([
37
- encodeLeafHeader({
38
- nonce: leaf.nonce,
39
- oneSigId: leaf.oneSigId,
40
- targetOneSigAddress: gen.encodeAddress(leaf.targetOneSigAddress)
41
- }),
42
- gen.encodeCalls(leaf.calls)
43
- ]);
44
- return ethers.ethers.utils.keccak256(ethers.ethers.utils.keccak256(leafData));
45
- }
46
- XDTXKETK_cjs.__name(encodeLeaf, "encodeLeaf");
47
- function makeOneSigTree(input) {
48
- const encodedLeafs = [];
49
- const seenNonceIds = /* @__PURE__ */ new Set();
50
- for (const gen of input) {
51
- for (let i = 0; i < gen.leafs.length; i++) {
52
- const leaf = gen.leafs[i];
53
- const nonceIdCombo = `${leaf.nonce}.${leaf.oneSigId}`;
54
- if (seenNonceIds.has(nonceIdCombo)) {
55
- throw new XDTXKETK_cjs.OneSigCoreError("NONCE_ID_SEEN_TWICE", "Two calls should not be made for the same chain/nonce twice");
56
- }
57
- seenNonceIds.add(nonceIdCombo);
58
- encodedLeafs.push(encodeLeaf(gen, i));
59
- }
60
- }
61
- const tree = new merkletreejs.MerkleTree(encodedLeafs, ethers.ethers.utils.keccak256, {
62
- sort: true
63
- });
64
- return tree;
65
- }
66
- XDTXKETK_cjs.__name(makeOneSigTree, "makeOneSigTree");
67
- function compareAddresses(a, b) {
68
- const aNumeric = BigInt(a);
69
- const bNumeric = BigInt(b);
70
- if (aNumeric === bNumeric) {
71
- return 0;
72
- } else if (aNumeric < bNumeric) {
73
- return -1;
74
- } else {
75
- return 1;
76
- }
77
- }
78
- XDTXKETK_cjs.__name(compareAddresses, "compareAddresses");
79
- var Signature = class _Signature {
80
- static {
81
- XDTXKETK_cjs.__name(this, "Signature");
82
- }
83
- #value;
84
- constructor(input) {
85
- let value = input;
86
- if (value instanceof _Signature) {
87
- value = value.get();
88
- }
89
- if (typeof value === "string") {
90
- if (!value.startsWith("0x")) {
91
- throw new XDTXKETK_cjs.OneSigCoreError("INVALID_SIGNATURE_INPUT", "Signature takes in hex encoded strings prefixed with 0x only");
92
- }
93
- value = Buffer.from(value.substring(2), "hex");
94
- }
95
- if (value.length % 65 !== 0) {
96
- throw new XDTXKETK_cjs.OneSigCoreError("INVALID_SIGNATURE_INPUT", "Each signature must be 65 bytes long");
97
- }
98
- this.#value = value;
99
- }
100
- get() {
101
- return this.#value;
102
- }
103
- toHexString() {
104
- return `0x${this.get().toString("hex")}`;
105
- }
106
- get signatureCount() {
107
- const count = this.#value.length / 65;
108
- if (Math.floor(count) !== count) {
109
- throw new Error("Count is not an int");
110
- }
111
- return count;
112
- }
113
- /**
114
- * Concatenate and order signatures based on data provided
115
- * @param input An array of signatures to concat
116
- * @param sortMethod Parameter specifying how to order each signature
117
- * @returns The concatenated signature
118
- */
119
- static concatenateSignatures(input, sortMethod) {
120
- const signatureBuffers = input.map(function(singleInput) {
121
- const signature = new _Signature(singleInput);
122
- if (signature.signatureCount !== 1) {
123
- throw new XDTXKETK_cjs.OneSigCoreError("CANNOT_CONCAT_INPUT", "Cannot concatenate pre-concatenated signatures");
124
- }
125
- return signature.get();
126
- });
127
- let orderedSignatures;
128
- if (sortMethod === false) {
129
- orderedSignatures = signatureBuffers;
130
- } else {
131
- let addresses;
132
- if (typeof sortMethod === "string" || Buffer.isBuffer(sortMethod)) {
133
- addresses = [];
134
- for (const signature of signatureBuffers) {
135
- const recovered = ethers.ethers.utils.recoverAddress(sortMethod, signature);
136
- addresses.push(recovered);
137
- }
138
- } else {
139
- addresses = sortMethod;
140
- }
141
- if (addresses.length !== signatureBuffers.length) {
142
- throw new XDTXKETK_cjs.OneSigCoreError("ADDRESS_SIGNATURE_LENGTH_MISMATCH", `Mismatch between addresses and provided signatures`);
143
- }
144
- const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort((a, b) => {
145
- return compareAddresses(addresses[a], addresses[b]);
146
- });
147
- orderedSignatures = indexMapping.map((index) => signatureBuffers[index]);
148
- }
149
- const combined = Buffer.concat(orderedSignatures);
150
- return new this(combined);
151
- }
152
- };
153
- var ONE_SIG_TYPED_DATA_DOMAIN = {
154
- name: "OneSig",
155
- version: "0.0.1",
156
- chainId: 1,
157
- verifyingContract: "0x000000000000000000000000000000000000dEaD"
158
- };
159
- var getOneSigTypedDataDomain = /* @__PURE__ */ XDTXKETK_cjs.__name(() => {
160
- return ONE_SIG_TYPED_DATA_DOMAIN;
161
- }, "getOneSigTypedDataDomain");
162
- var ONE_SIG_TYPED_DATA_DOMAIN_TYPES = {
163
- EIP712Domain: [
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
- }
180
- ]
181
- };
182
- var getOneSigTypedDataDomainTypes = /* @__PURE__ */ XDTXKETK_cjs.__name(() => {
183
- return ONE_SIG_TYPED_DATA_DOMAIN_TYPES;
184
- }, "getOneSigTypedDataDomainTypes");
185
- var ONE_SIG_TYPED_DATA_PRIMARY_TYPES = {
186
- SignMerkleRoot: [
187
- {
188
- name: "seed",
189
- type: "bytes32"
190
- },
191
- {
192
- name: "merkleRoot",
193
- type: "bytes32"
194
- },
195
- {
196
- name: "expiry",
197
- type: "uint256"
198
- }
199
- ]
200
- };
201
- var getOneSigTypedDataPrimaryTypes = /* @__PURE__ */ XDTXKETK_cjs.__name(() => {
202
- return ONE_SIG_TYPED_DATA_PRIMARY_TYPES;
203
- }, "getOneSigTypedDataPrimaryTypes");
204
- var getSigningData = /* @__PURE__ */ XDTXKETK_cjs.__name((tree, { seed, expiry }) => {
205
- return [
206
- getOneSigTypedDataDomain(),
207
- getOneSigTypedDataPrimaryTypes(),
208
- {
209
- seed,
210
- expiry,
211
- merkleRoot: tree.getHexRoot()
212
- }
213
- ];
214
- }, "getSigningData");
215
- var getDigestToSign = /* @__PURE__ */ XDTXKETK_cjs.__name((tree, options) => {
216
- return ethers.ethers.utils._TypedDataEncoder.hash(...getSigningData(tree, options));
217
- }, "getDigestToSign");
218
- async function signOneSigTree(tree, signers, options, enc = "string") {
219
- if (signers.length <= 0) {
220
- throw new XDTXKETK_cjs.OneSigCoreError("ONE_SIGNER_REQUIRED", "1+ signer must be provided");
221
- }
222
- const toSign = getSigningData(tree, options);
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);
228
- const sig = Signature.concatenateSignatures(signatures, signingDigest);
229
- if (enc === "signature") {
230
- return sig;
231
- } else if (enc === "string") {
232
- return sig.toHexString();
233
- } else {
234
- throw new Error("Invalid encoding");
235
- }
236
- }
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
@@ -1 +0,0 @@
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":"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","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 specifying 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 between addresses and 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"]}