@layerzerolabs/onesig-core 0.0.8 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +54 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +38 -16
- package/dist/index.mjs +267 -0
- package/package.json +2 -2
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
|
|
6
|
+
interface BaseLeafData<TargetAddressType = unknown, CallData = unknown> {
|
|
7
|
+
nonce: bigint;
|
|
8
|
+
oneSigId: bigint;
|
|
9
|
+
targetOneSigAddress: TargetAddressType;
|
|
10
|
+
calls: CallData[];
|
|
11
|
+
}
|
|
12
|
+
interface SigningOptions {
|
|
13
|
+
seed: string | Uint8Array;
|
|
14
|
+
expiry: number | string | BigNumber;
|
|
15
|
+
}
|
|
16
|
+
interface GenerateLeafsResult<Leaf extends BaseLeafData = BaseLeafData<any, any>> {
|
|
17
|
+
encodeCalls: (calls: Leaf['calls']) => Buffer;
|
|
18
|
+
encodeAddress: (address: Leaf['targetOneSigAddress']) => Buffer;
|
|
19
|
+
leafs: Leaf[];
|
|
20
|
+
}
|
|
21
|
+
declare function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }: Omit<BaseLeafData<Buffer>, 'calls'>): Buffer;
|
|
22
|
+
declare function encodeLeaf(gen: GenerateLeafsResult, index: number): string;
|
|
23
|
+
declare function makeOneSigTree(input: GenerateLeafsResult[]): MerkleTree;
|
|
24
|
+
declare function compareAddresses(a: string, b: string): number;
|
|
25
|
+
type HexStringLike = `0x${string}`;
|
|
26
|
+
type SignatureLike = Buffer | string | Signature | HexStringLike;
|
|
27
|
+
declare class Signature {
|
|
28
|
+
#private;
|
|
29
|
+
constructor(input: SignatureLike);
|
|
30
|
+
get(): Buffer;
|
|
31
|
+
toHexString(): HexStringLike;
|
|
32
|
+
get signatureCount(): number;
|
|
33
|
+
/**
|
|
34
|
+
* Concatenate signatures without changing ordering
|
|
35
|
+
*/
|
|
36
|
+
static concatenateSignatures(input: SignatureLike[], sortMethod: false): Signature;
|
|
37
|
+
/**
|
|
38
|
+
* Concatenate signatures based on addresses provided, with each signature corresponding to the address in the same index
|
|
39
|
+
*/
|
|
40
|
+
static concatenateSignatures(input: SignatureLike[], addresses: string[]): Signature;
|
|
41
|
+
/**
|
|
42
|
+
* Concatenate signatures based on the signature data, ordering based on the recovered address
|
|
43
|
+
*/
|
|
44
|
+
static concatenateSignatures(input: SignatureLike[], digest: Buffer | string): Signature;
|
|
45
|
+
}
|
|
46
|
+
declare function getOneSigTypedDataDomain(): TypedDataDomain;
|
|
47
|
+
declare function getOneSigTypedDataDomainTypes(): Record<string, TypedDataField[]>;
|
|
48
|
+
declare function getOneSigTypedDataPrimaryTypes(): Record<string, TypedDataField[]>;
|
|
49
|
+
declare function getSigningData(tree: MerkleTree, { seed, expiry }: SigningOptions): Parameters<TypedDataSigner['_signTypedData']>;
|
|
50
|
+
declare function getDigestToSign(tree: MerkleTree, options: SigningOptions): string;
|
|
51
|
+
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc?: 'string'): Promise<string>;
|
|
52
|
+
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc: 'signature'): Promise<Signature>;
|
|
53
|
+
|
|
54
|
+
export { type BaseLeafData, type GenerateLeafsResult, Signature, type SigningOptions, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getOneSigTypedDataDomain, getOneSigTypedDataDomainTypes, getOneSigTypedDataPrimaryTypes, getSigningData, makeOneSigTree, signOneSigTree };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BigNumber } from 'ethers';
|
|
1
|
+
import { BigNumber, TypedDataDomain, TypedDataField } from 'ethers';
|
|
2
2
|
import { MerkleTree } from 'merkletreejs';
|
|
3
3
|
export { MerkleTree } from 'merkletreejs';
|
|
4
4
|
import { TypedDataSigner } from '@ethersproject/abstract-signer';
|
|
@@ -43,9 +43,12 @@ declare class Signature {
|
|
|
43
43
|
*/
|
|
44
44
|
static concatenateSignatures(input: SignatureLike[], digest: Buffer | string): Signature;
|
|
45
45
|
}
|
|
46
|
+
declare function getOneSigTypedDataDomain(): TypedDataDomain;
|
|
47
|
+
declare function getOneSigTypedDataDomainTypes(): Record<string, TypedDataField[]>;
|
|
48
|
+
declare function getOneSigTypedDataPrimaryTypes(): Record<string, TypedDataField[]>;
|
|
46
49
|
declare function getSigningData(tree: MerkleTree, { seed, expiry }: SigningOptions): Parameters<TypedDataSigner['_signTypedData']>;
|
|
47
50
|
declare function getDigestToSign(tree: MerkleTree, options: SigningOptions): string;
|
|
48
51
|
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc?: 'string'): Promise<string>;
|
|
49
52
|
declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc: 'signature'): Promise<Signature>;
|
|
50
53
|
|
|
51
|
-
export { type BaseLeafData, type GenerateLeafsResult, Signature, type SigningOptions, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getSigningData, makeOneSigTree, signOneSigTree };
|
|
54
|
+
export { type BaseLeafData, type GenerateLeafsResult, Signature, type SigningOptions, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getOneSigTypedDataDomain, getOneSigTypedDataDomainTypes, getOneSigTypedDataPrimaryTypes, getSigningData, makeOneSigTree, signOneSigTree };
|
package/dist/index.js
CHANGED
|
@@ -33,6 +33,9 @@ __export(src_exports, {
|
|
|
33
33
|
encodeLeaf: () => encodeLeaf,
|
|
34
34
|
encodeLeafHeader: () => encodeLeafHeader,
|
|
35
35
|
getDigestToSign: () => getDigestToSign,
|
|
36
|
+
getOneSigTypedDataDomain: () => getOneSigTypedDataDomain,
|
|
37
|
+
getOneSigTypedDataDomainTypes: () => getOneSigTypedDataDomainTypes,
|
|
38
|
+
getOneSigTypedDataPrimaryTypes: () => getOneSigTypedDataPrimaryTypes,
|
|
36
39
|
getSigningData: () => getSigningData,
|
|
37
40
|
makeOneSigTree: () => makeOneSigTree,
|
|
38
41
|
signOneSigTree: () => signOneSigTree
|
|
@@ -215,27 +218,46 @@ var _Signature = class _Signature {
|
|
|
215
218
|
};
|
|
216
219
|
_value = new WeakMap();
|
|
217
220
|
var Signature = _Signature;
|
|
221
|
+
var ONE_SIG_TYPED_DATA_DOMAIN = {
|
|
222
|
+
name: "OneSig",
|
|
223
|
+
version: "0.0.1",
|
|
224
|
+
chainId: 1,
|
|
225
|
+
// this is hardcoded to Ethereum mainnet
|
|
226
|
+
verifyingContract: "0x000000000000000000000000000000000000dEaD"
|
|
227
|
+
// this is hardcoded to a dead address
|
|
228
|
+
};
|
|
229
|
+
function getOneSigTypedDataDomain() {
|
|
230
|
+
return ONE_SIG_TYPED_DATA_DOMAIN;
|
|
231
|
+
}
|
|
232
|
+
var ONE_SIG_TYPED_DATA_DOMAIN_TYPES = {
|
|
233
|
+
EIP712Domain: [
|
|
234
|
+
{ name: "name", type: "string" },
|
|
235
|
+
{ name: "version", type: "string" },
|
|
236
|
+
{ name: "chainId", type: "uint256" },
|
|
237
|
+
{ name: "verifyingContract", type: "address" }
|
|
238
|
+
]
|
|
239
|
+
};
|
|
240
|
+
function getOneSigTypedDataDomainTypes() {
|
|
241
|
+
return ONE_SIG_TYPED_DATA_DOMAIN_TYPES;
|
|
242
|
+
}
|
|
243
|
+
var ONE_SIG_TYPED_DATA_PRIMARY_TYPES = {
|
|
244
|
+
SignMerkleRoot: [
|
|
245
|
+
{ name: "seed", type: "bytes32" },
|
|
246
|
+
{ name: "merkleRoot", type: "bytes32" },
|
|
247
|
+
{ name: "expiry", type: "uint256" }
|
|
248
|
+
]
|
|
249
|
+
};
|
|
250
|
+
function getOneSigTypedDataPrimaryTypes() {
|
|
251
|
+
return ONE_SIG_TYPED_DATA_PRIMARY_TYPES;
|
|
252
|
+
}
|
|
218
253
|
function getSigningData(tree, { seed, expiry }) {
|
|
219
254
|
return [
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
version: "0.0.1",
|
|
223
|
-
chainId: 1,
|
|
224
|
-
// this is hardcoded to Ethereum mainnet
|
|
225
|
-
verifyingContract: "0x000000000000000000000000000000000000dEaD"
|
|
226
|
-
// this is hardcoded to a dead address
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
SignMerkleRoot: [
|
|
230
|
-
{ name: "seed", type: "bytes32" },
|
|
231
|
-
{ name: "merkleRoot", type: "bytes32" },
|
|
232
|
-
{ name: "expiry", type: "uint256" }
|
|
233
|
-
]
|
|
234
|
-
},
|
|
255
|
+
getOneSigTypedDataDomain(),
|
|
256
|
+
getOneSigTypedDataPrimaryTypes(),
|
|
235
257
|
{
|
|
236
258
|
seed,
|
|
237
259
|
expiry,
|
|
238
|
-
merkleRoot: tree.
|
|
260
|
+
merkleRoot: tree.getHexRoot()
|
|
239
261
|
}
|
|
240
262
|
];
|
|
241
263
|
}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
var __typeError = (msg) => {
|
|
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);
|
|
8
|
+
|
|
9
|
+
// src/index.ts
|
|
10
|
+
import { ethers } from "ethers";
|
|
11
|
+
import { MerkleTree } from "merkletreejs";
|
|
12
|
+
|
|
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
|
+
function readByteFromHex(input, byteOffset) {
|
|
40
|
+
const charOffset = byteOffset * 2;
|
|
41
|
+
const sub = input.substring(charOffset, charOffset + 2);
|
|
42
|
+
return parseInt(sub, 16);
|
|
43
|
+
}
|
|
44
|
+
function encodeLeafHeader({ targetOneSigAddress, oneSigId, nonce }) {
|
|
45
|
+
if (targetOneSigAddress.byteLength !== 32) {
|
|
46
|
+
throw new Error("Contract address must be 32 bytes");
|
|
47
|
+
}
|
|
48
|
+
const storage = Buffer.alloc(49);
|
|
49
|
+
storage[0] = 1;
|
|
50
|
+
const idStr = oneSigId.toString(16).padStart(16, "0");
|
|
51
|
+
const nonceStr = nonce.toString(16).padStart(16, "0");
|
|
52
|
+
for (let i = 0; i < 32; i++) {
|
|
53
|
+
if (i < 8) {
|
|
54
|
+
storage[i + 1] = readByteFromHex(idStr, i);
|
|
55
|
+
storage[i + 41] = readByteFromHex(nonceStr, i);
|
|
56
|
+
}
|
|
57
|
+
storage[i + 9] = targetOneSigAddress[i];
|
|
58
|
+
}
|
|
59
|
+
return storage;
|
|
60
|
+
}
|
|
61
|
+
function encodeLeaf(gen, index) {
|
|
62
|
+
const leaf = gen.leafs[index];
|
|
63
|
+
if (!leaf) {
|
|
64
|
+
throw new Error("Leaf does not exist");
|
|
65
|
+
}
|
|
66
|
+
const leafData = Buffer.concat([
|
|
67
|
+
encodeLeafHeader({
|
|
68
|
+
nonce: leaf.nonce,
|
|
69
|
+
oneSigId: leaf.oneSigId,
|
|
70
|
+
targetOneSigAddress: gen.encodeAddress(leaf.targetOneSigAddress)
|
|
71
|
+
}),
|
|
72
|
+
gen.encodeCalls(leaf.calls)
|
|
73
|
+
]);
|
|
74
|
+
return ethers.utils.keccak256(ethers.utils.keccak256(leafData));
|
|
75
|
+
}
|
|
76
|
+
function makeOneSigTree(input) {
|
|
77
|
+
const encodedLeafs = [];
|
|
78
|
+
const seenNonceIds = /* @__PURE__ */ new Set();
|
|
79
|
+
for (const gen of input) {
|
|
80
|
+
for (let i = 0; i < gen.leafs.length; i++) {
|
|
81
|
+
const leaf = gen.leafs[i];
|
|
82
|
+
const nonceIdCombo = `${leaf.nonce}.${leaf.oneSigId}`;
|
|
83
|
+
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
|
+
);
|
|
88
|
+
}
|
|
89
|
+
seenNonceIds.add(nonceIdCombo);
|
|
90
|
+
encodedLeafs.push(encodeLeaf(gen, i));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const tree = new MerkleTree(encodedLeafs, ethers.utils.keccak256, { sortPairs: true });
|
|
94
|
+
return tree;
|
|
95
|
+
}
|
|
96
|
+
function compareAddresses(a, b) {
|
|
97
|
+
const aNumeric = BigInt(a);
|
|
98
|
+
const bNumeric = BigInt(b);
|
|
99
|
+
if (aNumeric === bNumeric) {
|
|
100
|
+
return 0;
|
|
101
|
+
} else if (aNumeric < bNumeric) {
|
|
102
|
+
return -1;
|
|
103
|
+
} else {
|
|
104
|
+
return 1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
var _value;
|
|
108
|
+
var _Signature = class _Signature {
|
|
109
|
+
constructor(input) {
|
|
110
|
+
__privateAdd(this, _value);
|
|
111
|
+
let value = input;
|
|
112
|
+
if (value instanceof _Signature) {
|
|
113
|
+
value = value.get();
|
|
114
|
+
}
|
|
115
|
+
if (typeof value === "string") {
|
|
116
|
+
if (!value.startsWith("0x")) {
|
|
117
|
+
throw new OneSigCoreError(
|
|
118
|
+
"INVALID_SIGNATURE_INPUT",
|
|
119
|
+
"Signature takes in hex encoded strings prefixed with 0x only"
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
value = Buffer.from(value.substring(2), "hex");
|
|
123
|
+
}
|
|
124
|
+
if (value.length % 65 !== 0) {
|
|
125
|
+
throw new OneSigCoreError("INVALID_SIGNATURE_INPUT", "Each signature must be 65 bytes long");
|
|
126
|
+
}
|
|
127
|
+
__privateSet(this, _value, value);
|
|
128
|
+
}
|
|
129
|
+
get() {
|
|
130
|
+
return __privateGet(this, _value);
|
|
131
|
+
}
|
|
132
|
+
toHexString() {
|
|
133
|
+
return `0x${this.get().toString("hex")}`;
|
|
134
|
+
}
|
|
135
|
+
get signatureCount() {
|
|
136
|
+
const count = __privateGet(this, _value).length / 65;
|
|
137
|
+
if (Math.floor(count) !== count) {
|
|
138
|
+
throw new Error("Count is not an int");
|
|
139
|
+
}
|
|
140
|
+
return count;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Concatenate and order signatures based on data provided
|
|
144
|
+
* @param input An array of signatures to concat
|
|
145
|
+
* @param sortMethod Parameter specifing how to order each signature
|
|
146
|
+
* @returns The concatenated signature
|
|
147
|
+
*/
|
|
148
|
+
static concatenateSignatures(input, sortMethod) {
|
|
149
|
+
const signatureBuffers = input.map(function(singleInput) {
|
|
150
|
+
const signature = new _Signature(singleInput);
|
|
151
|
+
if (signature.signatureCount !== 1) {
|
|
152
|
+
throw new OneSigCoreError("CANNOT_CONCAT_INPUT", "Cannot concatenate pre-concatenated signatures");
|
|
153
|
+
}
|
|
154
|
+
return signature.get();
|
|
155
|
+
});
|
|
156
|
+
let orderedSignatures;
|
|
157
|
+
if (sortMethod === false) {
|
|
158
|
+
orderedSignatures = signatureBuffers;
|
|
159
|
+
} else {
|
|
160
|
+
let addresses;
|
|
161
|
+
if (typeof sortMethod === "string" || Buffer.isBuffer(sortMethod)) {
|
|
162
|
+
addresses = [];
|
|
163
|
+
for (const signature of signatureBuffers) {
|
|
164
|
+
const recovered = ethers.utils.recoverAddress(sortMethod, signature);
|
|
165
|
+
addresses.push(recovered);
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
addresses = sortMethod;
|
|
169
|
+
}
|
|
170
|
+
if (addresses.length !== signatureBuffers.length) {
|
|
171
|
+
throw new OneSigCoreError(
|
|
172
|
+
"ADDRESS_SIGNATURE_LENGTH_MISMATCH",
|
|
173
|
+
"Mismatch in addresses provided signatures"
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort(function(a, b) {
|
|
177
|
+
return compareAddresses(addresses[a], addresses[b]);
|
|
178
|
+
});
|
|
179
|
+
orderedSignatures = indexMapping.map((index) => signatureBuffers[index]);
|
|
180
|
+
}
|
|
181
|
+
const combined = Buffer.concat(orderedSignatures);
|
|
182
|
+
return new this(combined);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
_value = new WeakMap();
|
|
186
|
+
var Signature = _Signature;
|
|
187
|
+
var ONE_SIG_TYPED_DATA_DOMAIN = {
|
|
188
|
+
name: "OneSig",
|
|
189
|
+
version: "0.0.1",
|
|
190
|
+
chainId: 1,
|
|
191
|
+
// this is hardcoded to Ethereum mainnet
|
|
192
|
+
verifyingContract: "0x000000000000000000000000000000000000dEaD"
|
|
193
|
+
// this is hardcoded to a dead address
|
|
194
|
+
};
|
|
195
|
+
function getOneSigTypedDataDomain() {
|
|
196
|
+
return ONE_SIG_TYPED_DATA_DOMAIN;
|
|
197
|
+
}
|
|
198
|
+
var ONE_SIG_TYPED_DATA_DOMAIN_TYPES = {
|
|
199
|
+
EIP712Domain: [
|
|
200
|
+
{ name: "name", type: "string" },
|
|
201
|
+
{ name: "version", type: "string" },
|
|
202
|
+
{ name: "chainId", type: "uint256" },
|
|
203
|
+
{ name: "verifyingContract", type: "address" }
|
|
204
|
+
]
|
|
205
|
+
};
|
|
206
|
+
function getOneSigTypedDataDomainTypes() {
|
|
207
|
+
return ONE_SIG_TYPED_DATA_DOMAIN_TYPES;
|
|
208
|
+
}
|
|
209
|
+
var ONE_SIG_TYPED_DATA_PRIMARY_TYPES = {
|
|
210
|
+
SignMerkleRoot: [
|
|
211
|
+
{ name: "seed", type: "bytes32" },
|
|
212
|
+
{ name: "merkleRoot", type: "bytes32" },
|
|
213
|
+
{ name: "expiry", type: "uint256" }
|
|
214
|
+
]
|
|
215
|
+
};
|
|
216
|
+
function getOneSigTypedDataPrimaryTypes() {
|
|
217
|
+
return ONE_SIG_TYPED_DATA_PRIMARY_TYPES;
|
|
218
|
+
}
|
|
219
|
+
function getSigningData(tree, { seed, expiry }) {
|
|
220
|
+
return [
|
|
221
|
+
getOneSigTypedDataDomain(),
|
|
222
|
+
getOneSigTypedDataPrimaryTypes(),
|
|
223
|
+
{
|
|
224
|
+
seed,
|
|
225
|
+
expiry,
|
|
226
|
+
merkleRoot: tree.getHexRoot()
|
|
227
|
+
}
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
function getDigestToSign(tree, options) {
|
|
231
|
+
return ethers.utils._TypedDataEncoder.hash(...getSigningData(tree, options));
|
|
232
|
+
}
|
|
233
|
+
async function signOneSigTree(tree, signers, options, enc = "string") {
|
|
234
|
+
if (signers.length <= 0) {
|
|
235
|
+
throw new OneSigCoreError("ONE_SIGNER_REQUIRED", "1+ signer must be provided");
|
|
236
|
+
}
|
|
237
|
+
const toSign = getSigningData(tree, options);
|
|
238
|
+
const signatures = await Promise.all(
|
|
239
|
+
signers.map(async function(signer) {
|
|
240
|
+
const data = await signer._signTypedData(...toSign);
|
|
241
|
+
return new Signature(data);
|
|
242
|
+
})
|
|
243
|
+
);
|
|
244
|
+
const signingDigest = ethers.utils._TypedDataEncoder.hash(...toSign);
|
|
245
|
+
const sig = Signature.concatenateSignatures(signatures, signingDigest);
|
|
246
|
+
if (enc === "signature") {
|
|
247
|
+
return sig;
|
|
248
|
+
} else if (enc === "string") {
|
|
249
|
+
return sig.toHexString();
|
|
250
|
+
} else {
|
|
251
|
+
throw new Error("Invalid encoding");
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export {
|
|
255
|
+
MerkleTree,
|
|
256
|
+
Signature,
|
|
257
|
+
compareAddresses,
|
|
258
|
+
encodeLeaf,
|
|
259
|
+
encodeLeafHeader,
|
|
260
|
+
getDigestToSign,
|
|
261
|
+
getOneSigTypedDataDomain,
|
|
262
|
+
getOneSigTypedDataDomainTypes,
|
|
263
|
+
getOneSigTypedDataPrimaryTypes,
|
|
264
|
+
getSigningData,
|
|
265
|
+
makeOneSigTree,
|
|
266
|
+
signOneSigTree
|
|
267
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/onesig-core",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"license": "GPL-3.0-only",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"access": "restricted"
|
|
60
60
|
},
|
|
61
61
|
"scripts": {
|
|
62
|
-
"build:js": "pnpm tsup",
|
|
62
|
+
"build:js": "pnpm tsup --config ../../tsup.config.ts ./src/index.ts",
|
|
63
63
|
"clean": "pnpm clean:prebuild",
|
|
64
64
|
"clean:prebuild": "rimraf dist",
|
|
65
65
|
"lint:fix": "eslint --fix '**/*.{js,ts,json}' && prettier --write .",
|