@layerzerolabs/onesig-core 0.2.102 → 0.2.104
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.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TypedDataSigner } from '@ethersproject/abstract-signer';
|
|
2
|
-
import type { BigNumber, TypedDataDomain, TypedDataField } from 'ethers';
|
|
2
|
+
import type { BigNumber, BytesLike, TypedDataDomain, TypedDataField } from 'ethers';
|
|
3
3
|
import { MerkleTree } from 'merkletreejs';
|
|
4
4
|
import type { HexString } from '@layerzerolabs/typescript-utils';
|
|
5
5
|
export { MerkleTree, type TypedDataSigner };
|
|
@@ -49,4 +49,22 @@ export declare const getSigningData: (tree: MerkleTree, { seed, expiry }: Signin
|
|
|
49
49
|
export declare const getDigestToSign: (tree: MerkleTree, options: SigningOptions) => string;
|
|
50
50
|
export declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc?: 'string'): Promise<string>;
|
|
51
51
|
export declare function signOneSigTree(tree: MerkleTree, signers: TypedDataSigner[], options: SigningOptions, enc: 'signature'): Promise<Signature>;
|
|
52
|
+
export declare const getSignerExecutionAuthorizationTypes: () => Record<string, TypedDataField[]>;
|
|
53
|
+
export interface SignerExecutionAuthorizationData {
|
|
54
|
+
/** Canonical OneSig merkle leaf hash for the transaction being executed. */
|
|
55
|
+
leafHash: BytesLike;
|
|
56
|
+
/** Signer-approved batch the leaf must execute under (binds the authorization to one root). */
|
|
57
|
+
merkleRoot: BytesLike;
|
|
58
|
+
/** Native-chain address the signer authorizes as submitter (EIP-712 `bytes`). */
|
|
59
|
+
delegate: BytesLike;
|
|
60
|
+
/** Submission-window cutoff (Unix seconds) for this attempt. */
|
|
61
|
+
expiry: bigint | number | string;
|
|
62
|
+
}
|
|
63
|
+
export declare const getSignerExecutionAuthorizationSigningData: ({ leafHash, merkleRoot, delegate, expiry, }: SignerExecutionAuthorizationData) => Parameters<TypedDataSigner["_signTypedData"]>;
|
|
64
|
+
/**
|
|
65
|
+
* Produces the 65-byte (r‖s‖v) secp256k1 signature a signer provides to act as executor,
|
|
66
|
+
* by signing the EIP-712 `SignerExecutionAuthorization` struct. Chain contracts recover the
|
|
67
|
+
* signer address from the same digest.
|
|
68
|
+
*/
|
|
69
|
+
export declare function signSignerExecutionAuthorization(signer: TypedDataSigner, data: SignerExecutionAuthorizationData): Promise<Signature>;
|
|
52
70
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -234,7 +234,47 @@ async function signOneSigTree(tree, signers, options, enc = "string") {
|
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
__name(signOneSigTree, "signOneSigTree");
|
|
237
|
+
var ONE_SIG_SIGNER_EXECUTION_AUTHORIZATION_TYPES = {
|
|
238
|
+
SignerExecutionAuthorization: [
|
|
239
|
+
{
|
|
240
|
+
name: "leafHash",
|
|
241
|
+
type: "bytes32"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
name: "merkleRoot",
|
|
245
|
+
type: "bytes32"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
name: "delegate",
|
|
249
|
+
type: "bytes"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
name: "expiry",
|
|
253
|
+
type: "uint256"
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
};
|
|
257
|
+
var getSignerExecutionAuthorizationTypes = /* @__PURE__ */ __name(() => {
|
|
258
|
+
return ONE_SIG_SIGNER_EXECUTION_AUTHORIZATION_TYPES;
|
|
259
|
+
}, "getSignerExecutionAuthorizationTypes");
|
|
260
|
+
var getSignerExecutionAuthorizationSigningData = /* @__PURE__ */ __name(({ leafHash, merkleRoot, delegate, expiry }) => {
|
|
261
|
+
return [
|
|
262
|
+
getOneSigTypedDataDomain(),
|
|
263
|
+
getSignerExecutionAuthorizationTypes(),
|
|
264
|
+
{
|
|
265
|
+
leafHash: ethers.utils.hexlify(leafHash),
|
|
266
|
+
merkleRoot: ethers.utils.hexlify(merkleRoot),
|
|
267
|
+
delegate: ethers.utils.hexlify(delegate),
|
|
268
|
+
expiry
|
|
269
|
+
}
|
|
270
|
+
];
|
|
271
|
+
}, "getSignerExecutionAuthorizationSigningData");
|
|
272
|
+
async function signSignerExecutionAuthorization(signer, data) {
|
|
273
|
+
const signatureHex = await signer._signTypedData(...getSignerExecutionAuthorizationSigningData(data));
|
|
274
|
+
return new Signature(signatureHex);
|
|
275
|
+
}
|
|
276
|
+
__name(signSignerExecutionAuthorization, "signSignerExecutionAuthorization");
|
|
237
277
|
|
|
238
|
-
export { Signature, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getOneSigTypedDataDomain, getOneSigTypedDataDomainTypes, getOneSigTypedDataPrimaryTypes, getSigningData, makeOneSigTree, signOneSigTree };
|
|
278
|
+
export { Signature, compareAddresses, encodeLeaf, encodeLeafHeader, getDigestToSign, getOneSigTypedDataDomain, getOneSigTypedDataDomainTypes, getOneSigTypedDataPrimaryTypes, getSignerExecutionAuthorizationSigningData, getSignerExecutionAuthorizationTypes, getSigningData, makeOneSigTree, signOneSigTree, signSignerExecutionAuthorization };
|
|
239
279
|
//# sourceMappingURL=index.js.map
|
|
240
280
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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":"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","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 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"]}
|
|
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","ONE_SIG_SIGNER_EXECUTION_AUTHORIZATION_TYPES","SignerExecutionAuthorization","getSignerExecutionAuthorizationTypes","getSignerExecutionAuthorizationSigningData","leafHash","delegate","hexlify","signSignerExecutionAuthorization","signatureHex"],"mappings":"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","file":"index.js","sourcesContent":["import type { TypedDataSigner } from '@ethersproject/abstract-signer';\nimport type { BigNumber, BytesLike, 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\n// ============================================================================\n// Signer-as-executor\n//\n// EIP-712 typed data a registered signer signs to authorize a delegate to submit\n// one of their leaves on a non-EVM chain. Reuses the canonical OneSig domain above —\n// separation from SignMerkleRoot is provided by the distinct primary type.\n// See packages/onesig/docs/signer-as-executor.md.\n// ============================================================================\n\nconst ONE_SIG_SIGNER_EXECUTION_AUTHORIZATION_TYPES: Record<string, TypedDataField[]> = {\n SignerExecutionAuthorization: [\n { name: 'leafHash', type: 'bytes32' },\n { name: 'merkleRoot', type: 'bytes32' },\n { name: 'delegate', type: 'bytes' },\n { name: 'expiry', type: 'uint256' },\n ],\n};\n\nexport const getSignerExecutionAuthorizationTypes = (): Record<string, TypedDataField[]> => {\n return ONE_SIG_SIGNER_EXECUTION_AUTHORIZATION_TYPES;\n};\n\nexport interface SignerExecutionAuthorizationData {\n /** Canonical OneSig merkle leaf hash for the transaction being executed. */\n leafHash: BytesLike;\n /** Signer-approved batch the leaf must execute under (binds the authorization to one root). */\n merkleRoot: BytesLike;\n /** Native-chain address the signer authorizes as submitter (EIP-712 `bytes`). */\n delegate: BytesLike;\n /** Submission-window cutoff (Unix seconds) for this attempt. */\n expiry: bigint | number | string;\n}\n\nexport const getSignerExecutionAuthorizationSigningData = ({\n leafHash,\n merkleRoot,\n delegate,\n expiry,\n}: SignerExecutionAuthorizationData): Parameters<TypedDataSigner['_signTypedData']> => {\n return [\n getOneSigTypedDataDomain(),\n getSignerExecutionAuthorizationTypes(),\n {\n leafHash: ethers.utils.hexlify(leafHash),\n merkleRoot: ethers.utils.hexlify(merkleRoot),\n delegate: ethers.utils.hexlify(delegate),\n expiry,\n },\n ];\n};\n\n/**\n * Produces the 65-byte (r‖s‖v) secp256k1 signature a signer provides to act as executor,\n * by signing the EIP-712 `SignerExecutionAuthorization` struct. Chain contracts recover the\n * signer address from the same digest.\n */\nexport async function signSignerExecutionAuthorization(\n signer: TypedDataSigner,\n data: SignerExecutionAuthorizationData,\n): Promise<Signature> {\n const signatureHex = await signer._signTypedData(\n ...getSignerExecutionAuthorizationSigningData(data),\n );\n return new Signature(signatureHex);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/onesig-core",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.104",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@ethersproject/abstract-signer": "^5.8.0",
|
|
20
20
|
"ethers": "^5.8.0",
|
|
21
21
|
"merkletreejs": "^0.3.11",
|
|
22
|
-
"@layerzerolabs/typescript-utils": "0.2.
|
|
22
|
+
"@layerzerolabs/typescript-utils": "0.2.104"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/node": "^22.18.6",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"tsup": "^8.4.0",
|
|
30
30
|
"typescript": "^5.8.2",
|
|
31
31
|
"vitest": "^3.2.3",
|
|
32
|
-
"@layerzerolabs/
|
|
33
|
-
"@layerzerolabs/
|
|
32
|
+
"@layerzerolabs/typescript-configuration": "0.2.104",
|
|
33
|
+
"@layerzerolabs/tsup-configuration": "0.2.104"
|
|
34
34
|
},
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public",
|