@layerzerolabs/onesig-core 0.2.46 → 0.2.47
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.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -113,7 +113,7 @@ var Signature = class _Signature {
|
|
|
113
113
|
/**
|
|
114
114
|
* Concatenate and order signatures based on data provided
|
|
115
115
|
* @param input An array of signatures to concat
|
|
116
|
-
* @param sortMethod Parameter
|
|
116
|
+
* @param sortMethod Parameter specifying how to order each signature
|
|
117
117
|
* @returns The concatenated signature
|
|
118
118
|
*/
|
|
119
119
|
static concatenateSignatures(input, sortMethod) {
|
|
@@ -139,7 +139,7 @@ var Signature = class _Signature {
|
|
|
139
139
|
addresses = sortMethod;
|
|
140
140
|
}
|
|
141
141
|
if (addresses.length !== signatureBuffers.length) {
|
|
142
|
-
throw new XDTXKETK_cjs.OneSigCoreError("ADDRESS_SIGNATURE_LENGTH_MISMATCH",
|
|
142
|
+
throw new XDTXKETK_cjs.OneSigCoreError("ADDRESS_SIGNATURE_LENGTH_MISMATCH", `Mismatch between addresses and provided signatures`);
|
|
143
143
|
}
|
|
144
144
|
const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort((a, b) => {
|
|
145
145
|
return compareAddresses(addresses[a], addresses[b]);
|
package/dist/index.cjs.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","__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"]}
|
|
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"]}
|
package/dist/index.js
CHANGED
|
@@ -112,7 +112,7 @@ var Signature = class _Signature {
|
|
|
112
112
|
/**
|
|
113
113
|
* Concatenate and order signatures based on data provided
|
|
114
114
|
* @param input An array of signatures to concat
|
|
115
|
-
* @param sortMethod Parameter
|
|
115
|
+
* @param sortMethod Parameter specifying how to order each signature
|
|
116
116
|
* @returns The concatenated signature
|
|
117
117
|
*/
|
|
118
118
|
static concatenateSignatures(input, sortMethod) {
|
|
@@ -138,7 +138,7 @@ var Signature = class _Signature {
|
|
|
138
138
|
addresses = sortMethod;
|
|
139
139
|
}
|
|
140
140
|
if (addresses.length !== signatureBuffers.length) {
|
|
141
|
-
throw new OneSigCoreError("ADDRESS_SIGNATURE_LENGTH_MISMATCH",
|
|
141
|
+
throw new OneSigCoreError("ADDRESS_SIGNATURE_LENGTH_MISMATCH", `Mismatch between addresses and provided signatures`);
|
|
142
142
|
}
|
|
143
143
|
const indexMapping = new Array(addresses.length).fill(0).map((_, i) => i).sort((a, b) => {
|
|
144
144
|
return compareAddresses(addresses[a], addresses[b]);
|
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 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"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/onesig-core",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.47",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"@ethersproject/abstract-signer": "^5.8.0",
|
|
21
21
|
"ethers": "^5.8.0",
|
|
22
22
|
"merkletreejs": "^0.3.11",
|
|
23
|
-
"@layerzerolabs/typescript-utils": "0.2.
|
|
23
|
+
"@layerzerolabs/typescript-utils": "0.2.47"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "^22.18.6",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"tsup": "^8.4.0",
|
|
31
31
|
"typescript": "^5.8.2",
|
|
32
32
|
"vitest": "^3.2.3",
|
|
33
|
-
"@layerzerolabs/
|
|
34
|
-
"@layerzerolabs/
|
|
33
|
+
"@layerzerolabs/typescript-configuration": "0.2.47",
|
|
34
|
+
"@layerzerolabs/tsup-configuration": "0.2.47"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public",
|