@aptos-labs/ts-sdk 1.13.3 → 1.14.0-zeta.1
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/common/accountAddress-u9wEan9p.d.ts +2149 -0
- package/dist/common/chunk-QRI7EC4T.js +24 -0
- package/dist/common/chunk-QRI7EC4T.js.map +1 -0
- package/dist/common/cli/index.d.ts +94 -1
- package/dist/common/cli/index.js +245 -1
- package/dist/common/cli/index.js.map +1 -1
- package/dist/common/index.d.ts +2699 -4119
- package/dist/common/index.js +11786 -374
- package/dist/common/index.js.map +1 -1
- package/dist/esm/{Ed25519Account--qjfup2u.d.mts → Ed25519Account-9zBaZEnp.d.mts} +76 -9
- package/dist/esm/account/Account.d.mts +34 -0
- package/dist/esm/account/Account.mjs +56 -0
- package/dist/esm/account/Ed25519Account.d.mts +34 -0
- package/dist/esm/account/Ed25519Account.mjs +54 -0
- package/dist/esm/account/EphemeralKeyPair.d.mts +80 -0
- package/dist/esm/account/EphemeralKeyPair.mjs +37 -0
- package/dist/esm/account/KeylessAccount.d.mts +145 -0
- package/dist/esm/account/KeylessAccount.mjs +57 -0
- package/dist/esm/account/MultiKeyAccount.d.mts +138 -0
- package/dist/esm/account/MultiKeyAccount.mjs +56 -0
- package/dist/esm/account/SingleKeyAccount.d.mts +34 -0
- package/dist/esm/account/SingleKeyAccount.mjs +54 -0
- package/dist/esm/account/index.d.mts +41 -0
- package/dist/esm/account/index.mjs +77 -0
- package/dist/esm/api/account.d.mts +13 -1
- package/dist/esm/api/account.mjs +76 -1
- package/dist/esm/api/ans.d.mts +2 -2
- package/dist/esm/api/ans.mjs +87 -1
- package/dist/esm/api/aptos.d.mts +15 -8
- package/dist/esm/api/aptos.mjs +116 -1
- package/dist/esm/api/aptosConfig.d.mts +20 -0
- package/dist/esm/api/aptosConfig.mjs +9 -1
- package/dist/esm/api/coin.d.mts +7 -7
- package/dist/esm/api/coin.mjs +86 -1
- package/dist/esm/api/digitalAsset.d.mts +1 -1
- package/dist/esm/api/digitalAsset.mjs +87 -1
- package/dist/esm/api/event.mjs +54 -1
- package/dist/esm/api/faucet.mjs +53 -1
- package/dist/esm/api/fungibleAsset.d.mts +5 -5
- package/dist/esm/api/fungibleAsset.mjs +87 -1
- package/dist/esm/api/general.d.mts +7 -7
- package/dist/esm/api/general.mjs +84 -1
- package/dist/esm/api/index.d.mts +14 -8
- package/dist/esm/api/index.mjs +120 -1
- package/dist/esm/api/keyless.d.mts +81 -0
- package/dist/esm/api/keyless.mjs +71 -0
- package/dist/esm/api/staking.mjs +54 -1
- package/dist/esm/api/transaction.d.mts +1 -1
- package/dist/esm/api/transaction.mjs +94 -1
- package/dist/esm/api/transactionSubmission/build.d.mts +2 -2
- package/dist/esm/api/transactionSubmission/build.mjs +85 -1
- package/dist/esm/api/transactionSubmission/helpers.mjs +9 -1
- package/dist/esm/api/transactionSubmission/management.d.mts +8 -8
- package/dist/esm/api/transactionSubmission/management.mjs +89 -1
- package/dist/esm/api/transactionSubmission/sign.d.mts +1 -1
- package/dist/esm/api/transactionSubmission/sign.mjs +109 -1
- package/dist/esm/api/transactionSubmission/sign.mjs.map +1 -1
- package/dist/esm/api/transactionSubmission/simulate.d.mts +6 -6
- package/dist/esm/api/transactionSubmission/simulate.mjs +86 -1
- package/dist/esm/api/transactionSubmission/submit.mjs +86 -1
- package/dist/esm/api/utils.mjs +34 -1
- package/dist/esm/bcs/consts.mjs +17 -1
- package/dist/esm/bcs/deserializer.d.mts +26 -0
- package/dist/esm/bcs/deserializer.mjs +8 -1
- package/dist/esm/bcs/index.mjs +57 -1
- package/dist/esm/bcs/serializable/entryFunctionBytes.mjs +12 -1
- package/dist/esm/bcs/serializable/fixedBytes.mjs +11 -1
- package/dist/esm/bcs/serializable/movePrimitives.mjs +25 -1
- package/dist/esm/bcs/serializable/moveStructs.mjs +18 -1
- package/dist/esm/bcs/serializer.d.mts +2 -0
- package/dist/esm/bcs/serializer.mjs +18 -1
- package/dist/esm/chunk-2JOCR2VL.mjs +32 -0
- package/dist/esm/chunk-2JOCR2VL.mjs.map +1 -0
- package/dist/esm/chunk-2OQW7BMN.mjs +129 -0
- package/dist/esm/{chunk-PZGLV5UQ.mjs.map → chunk-2OQW7BMN.mjs.map} +1 -1
- package/dist/esm/chunk-2TJJWII2.mjs +23 -0
- package/dist/esm/{chunk-DSTKXJMA.mjs.map → chunk-2TJJWII2.mjs.map} +1 -1
- package/dist/esm/chunk-2ZEGJU43.mjs +252 -0
- package/dist/esm/chunk-2ZEGJU43.mjs.map +1 -0
- package/dist/esm/chunk-4OYYOYSO.mjs +336 -0
- package/dist/esm/chunk-4OYYOYSO.mjs.map +1 -0
- package/dist/esm/{chunk-S4SEFF4K.mjs → chunk-4PJ5FYGQ.mjs} +302 -27
- package/dist/esm/{chunk-S4SEFF4K.mjs.map → chunk-4PJ5FYGQ.mjs.map} +1 -1
- package/dist/esm/chunk-55NODGHC.mjs +135 -0
- package/dist/esm/chunk-55NODGHC.mjs.map +1 -0
- package/dist/esm/chunk-6LRQSBRH.mjs +130 -0
- package/dist/esm/chunk-6LRQSBRH.mjs.map +1 -0
- package/dist/esm/chunk-6MSZMIFW.mjs +23 -0
- package/dist/esm/{chunk-BWFJHFBQ.mjs.map → chunk-6MSZMIFW.mjs.map} +1 -1
- package/dist/esm/chunk-76TSTAU4.mjs +120 -0
- package/dist/esm/chunk-76TSTAU4.mjs.map +1 -0
- package/dist/esm/chunk-7FO3S6IZ.mjs +324 -0
- package/dist/esm/{chunk-DMKUAQB7.mjs.map → chunk-7FO3S6IZ.mjs.map} +1 -1
- package/dist/esm/chunk-7FUHWL6A.mjs +42 -0
- package/dist/esm/{chunk-V3Q2KXJU.mjs.map → chunk-7FUHWL6A.mjs.map} +1 -1
- package/dist/esm/chunk-7IDBB4J4.mjs +33 -0
- package/dist/esm/{chunk-ZZZZVONX.mjs.map → chunk-7IDBB4J4.mjs.map} +1 -1
- package/dist/esm/chunk-7JRMOHBP.mjs +247 -0
- package/dist/esm/chunk-7JRMOHBP.mjs.map +1 -0
- package/dist/esm/chunk-7REUIYF4.mjs +63 -0
- package/dist/esm/chunk-7REUIYF4.mjs.map +1 -0
- package/dist/esm/chunk-7Z6DYLCA.mjs +1 -0
- package/dist/esm/chunk-7Z6DYLCA.mjs.map +1 -0
- package/dist/esm/chunk-AC3OGAL6.mjs +87 -0
- package/dist/esm/{chunk-U6Z4FNB7.mjs.map → chunk-AC3OGAL6.mjs.map} +1 -1
- package/dist/esm/chunk-AQ4I7VVB.mjs +1 -0
- package/dist/esm/chunk-AQ4I7VVB.mjs.map +1 -0
- package/dist/esm/chunk-AR7X6GWQ.mjs +356 -0
- package/dist/esm/{chunk-FS3NSGBF.mjs.map → chunk-AR7X6GWQ.mjs.map} +1 -1
- package/dist/esm/chunk-ASF2VWOX.mjs +142 -0
- package/dist/esm/{chunk-G2O323HP.mjs.map → chunk-ASF2VWOX.mjs.map} +1 -1
- package/dist/esm/chunk-ATVFVXR6.mjs +43 -0
- package/dist/esm/{chunk-VVIG4E7Q.mjs.map → chunk-ATVFVXR6.mjs.map} +1 -1
- package/dist/esm/chunk-B5S6DDUD.mjs +120 -0
- package/dist/esm/chunk-B5S6DDUD.mjs.map +1 -0
- package/dist/esm/chunk-BXMHDQHW.mjs +512 -0
- package/dist/esm/chunk-BXMHDQHW.mjs.map +1 -0
- package/dist/esm/chunk-CC4DQ6NH.mjs +19 -0
- package/dist/esm/{chunk-MACC2BLE.mjs.map → chunk-CC4DQ6NH.mjs.map} +1 -1
- package/dist/esm/chunk-CMNJG4NN.mjs +345 -0
- package/dist/esm/{chunk-IOSQVDZI.mjs.map → chunk-CMNJG4NN.mjs.map} +1 -1
- package/dist/esm/chunk-CTJSZT5V.mjs +87 -0
- package/dist/esm/{chunk-UFT7US42.mjs.map → chunk-CTJSZT5V.mjs.map} +1 -1
- package/dist/esm/chunk-CX3NAVRD.mjs +205 -0
- package/dist/esm/chunk-CX3NAVRD.mjs.map +1 -0
- package/dist/esm/chunk-CXUGZXED.mjs +307 -0
- package/dist/esm/{chunk-YU3KB3UV.mjs.map → chunk-CXUGZXED.mjs.map} +1 -1
- package/dist/esm/chunk-D2BVBXWO.mjs +7 -0
- package/dist/esm/{chunk-B7TQGVGL.mjs.map → chunk-D2BVBXWO.mjs.map} +1 -1
- package/dist/esm/chunk-DGV7DYU4.mjs +413 -0
- package/dist/esm/chunk-DGV7DYU4.mjs.map +1 -0
- package/dist/esm/chunk-DIYZRGR6.mjs +242 -0
- package/dist/esm/{chunk-O4JRPZZM.mjs.map → chunk-DIYZRGR6.mjs.map} +1 -1
- package/dist/esm/chunk-DNPMS2OF.mjs +236 -0
- package/dist/esm/{chunk-U43IJHQN.mjs.map → chunk-DNPMS2OF.mjs.map} +1 -1
- package/dist/esm/chunk-DVPQGCFT.mjs +74 -0
- package/dist/esm/{chunk-O2F53NKI.mjs.map → chunk-DVPQGCFT.mjs.map} +1 -1
- package/dist/esm/chunk-EYHRMZPO.mjs +34 -0
- package/dist/esm/{chunk-AH44UPM4.mjs.map → chunk-EYHRMZPO.mjs.map} +1 -1
- package/dist/esm/chunk-F2ZWA7B7.mjs +412 -0
- package/dist/esm/chunk-F2ZWA7B7.mjs.map +1 -0
- package/dist/esm/chunk-FDWJNY4U.mjs +22 -0
- package/dist/esm/{chunk-R5QUBEH6.mjs.map → chunk-FDWJNY4U.mjs.map} +1 -1
- package/dist/esm/chunk-FF4JPDKD.mjs +315 -0
- package/dist/esm/chunk-FF4JPDKD.mjs.map +1 -0
- package/dist/esm/chunk-FQQW55X7.mjs +288 -0
- package/dist/esm/{chunk-52C73T26.mjs.map → chunk-FQQW55X7.mjs.map} +1 -1
- package/dist/esm/chunk-FXKSE3ZP.mjs +25 -0
- package/dist/esm/{chunk-WFZDFFBM.mjs.map → chunk-FXKSE3ZP.mjs.map} +1 -1
- package/dist/esm/chunk-GBEVD2VM.mjs +99 -0
- package/dist/esm/chunk-GBEVD2VM.mjs.map +1 -0
- package/dist/esm/chunk-GGMTQAQP.mjs +11 -0
- package/dist/esm/{chunk-3JPVQHOR.mjs.map → chunk-GGMTQAQP.mjs.map} +1 -1
- package/dist/esm/chunk-GSVQ6EUD.mjs +649 -0
- package/dist/esm/chunk-GSVQ6EUD.mjs.map +1 -0
- package/dist/esm/chunk-HBNSRCZN.mjs +100 -0
- package/dist/esm/{chunk-SG4MAOCF.mjs.map → chunk-HBNSRCZN.mjs.map} +1 -1
- package/dist/esm/chunk-IC56GQFJ.mjs +127 -0
- package/dist/esm/chunk-IC56GQFJ.mjs.map +1 -0
- package/dist/esm/chunk-IHNPN5CQ.mjs +256 -0
- package/dist/esm/chunk-IHNPN5CQ.mjs.map +1 -0
- package/dist/esm/chunk-JHDHNGJ3.mjs +126 -0
- package/dist/esm/chunk-JHDHNGJ3.mjs.map +1 -0
- package/dist/esm/chunk-JL2JHVS4.mjs +49 -0
- package/dist/esm/{chunk-RHBCVCOS.mjs.map → chunk-JL2JHVS4.mjs.map} +1 -1
- package/dist/esm/chunk-JV3GSIJW.mjs +268 -0
- package/dist/esm/chunk-JV3GSIJW.mjs.map +1 -0
- package/dist/esm/chunk-JXCZTOYC.mjs +1 -0
- package/dist/esm/chunk-JXCZTOYC.mjs.map +1 -0
- package/dist/esm/chunk-KK2BSALW.mjs +32 -0
- package/dist/esm/{chunk-TBMAJ6AW.mjs.map → chunk-KK2BSALW.mjs.map} +1 -1
- package/dist/esm/chunk-KMXSRHJ6.mjs +93 -0
- package/dist/esm/chunk-KMXSRHJ6.mjs.map +1 -0
- package/dist/esm/chunk-KVSQ57HU.mjs +45 -0
- package/dist/esm/{chunk-NNQJBFRB.mjs.map → chunk-KVSQ57HU.mjs.map} +1 -1
- package/dist/esm/chunk-LI2QV6RU.mjs +129 -0
- package/dist/esm/chunk-LI2QV6RU.mjs.map +1 -0
- package/dist/esm/chunk-LLLQJWRZ.mjs +35 -0
- package/dist/esm/{chunk-DPV25ZKR.mjs.map → chunk-LLLQJWRZ.mjs.map} +1 -1
- package/dist/esm/chunk-LYK4TQZO.mjs +70 -0
- package/dist/esm/chunk-LYK4TQZO.mjs.map +1 -0
- package/dist/esm/chunk-LYMY63SO.mjs +124 -0
- package/dist/esm/{chunk-W4ZW7QHA.mjs.map → chunk-LYMY63SO.mjs.map} +1 -1
- package/dist/esm/chunk-MZZLEY6O.mjs +92 -0
- package/dist/esm/chunk-MZZLEY6O.mjs.map +1 -0
- package/dist/esm/chunk-N4WKFNQ6.mjs +156 -0
- package/dist/esm/chunk-N4WKFNQ6.mjs.map +1 -0
- package/dist/esm/chunk-NFJCQRVK.mjs +37 -0
- package/dist/esm/chunk-NFJCQRVK.mjs.map +1 -0
- package/dist/esm/chunk-NMKCJNQM.mjs +20 -0
- package/dist/esm/{chunk-TJDC5PWD.mjs.map → chunk-NMKCJNQM.mjs.map} +1 -1
- package/dist/esm/chunk-NW45SCPY.mjs +36 -0
- package/dist/esm/{chunk-GSD4OOM3.mjs.map → chunk-NW45SCPY.mjs.map} +1 -1
- package/dist/esm/chunk-NXFO2W4G.mjs +84 -0
- package/dist/esm/{chunk-QMURTXFM.mjs.map → chunk-NXFO2W4G.mjs.map} +1 -1
- package/dist/esm/chunk-NYL77J4X.mjs +97 -0
- package/dist/esm/chunk-NYL77J4X.mjs.map +1 -0
- package/dist/esm/chunk-O6PSHSN3.mjs +53 -0
- package/dist/esm/{chunk-MFKMAAWA.mjs.map → chunk-O6PSHSN3.mjs.map} +1 -1
- package/dist/esm/chunk-OR7TEZ25.mjs +16 -0
- package/dist/esm/chunk-OR7TEZ25.mjs.map +1 -0
- package/dist/esm/chunk-PCLNX6FS.mjs +17 -0
- package/dist/esm/{chunk-6FBKUTGF.mjs.map → chunk-PCLNX6FS.mjs.map} +1 -1
- package/dist/esm/chunk-PIMQHG2J.mjs +49 -0
- package/dist/esm/{chunk-ZYYK3UXP.mjs.map → chunk-PIMQHG2J.mjs.map} +1 -1
- package/dist/esm/chunk-PU5AFUX3.mjs +52 -0
- package/dist/esm/{chunk-LR65XHSF.mjs.map → chunk-PU5AFUX3.mjs.map} +1 -1
- package/dist/esm/chunk-PYLOAMR2.mjs +29 -0
- package/dist/esm/{chunk-UML2VQZT.mjs.map → chunk-PYLOAMR2.mjs.map} +1 -1
- package/dist/esm/chunk-QBBTUC66.mjs +15 -0
- package/dist/esm/{chunk-ROXFCLDT.mjs.map → chunk-QBBTUC66.mjs.map} +1 -1
- package/dist/esm/chunk-QFOG4LIN.mjs +319 -0
- package/dist/esm/{chunk-DM44OGQH.mjs.map → chunk-QFOG4LIN.mjs.map} +1 -1
- package/dist/esm/chunk-QMM2KL6C.mjs +12 -0
- package/dist/esm/{chunk-FBPNHF54.mjs.map → chunk-QMM2KL6C.mjs.map} +1 -1
- package/dist/esm/chunk-RCQMWXEW.mjs +35 -0
- package/dist/esm/{chunk-3WUGR46O.mjs.map → chunk-RCQMWXEW.mjs.map} +1 -1
- package/dist/esm/chunk-RFSO3JRG.mjs +1 -0
- package/dist/esm/chunk-RFSO3JRG.mjs.map +1 -0
- package/dist/esm/chunk-RX4VG2AT.mjs +314 -0
- package/dist/esm/{chunk-CNMQNPNV.mjs.map → chunk-RX4VG2AT.mjs.map} +1 -1
- package/dist/esm/chunk-SBB4YEPT.mjs +17 -0
- package/dist/esm/{chunk-56CNRT2K.mjs.map → chunk-SBB4YEPT.mjs.map} +1 -1
- package/dist/esm/chunk-SIJELMDP.mjs +29 -0
- package/dist/esm/{chunk-6EMN3BOV.mjs.map → chunk-SIJELMDP.mjs.map} +1 -1
- package/dist/esm/chunk-SS3NUM5L.mjs +94 -0
- package/dist/esm/{chunk-L54P6EGN.mjs.map → chunk-SS3NUM5L.mjs.map} +1 -1
- package/dist/esm/chunk-ST4QXIMI.mjs +37 -0
- package/dist/esm/{chunk-5P2S2SZZ.mjs.map → chunk-ST4QXIMI.mjs.map} +1 -1
- package/dist/esm/chunk-TBHU6ZW6.mjs +215 -0
- package/dist/esm/{chunk-7QJ6YJXP.mjs.map → chunk-TBHU6ZW6.mjs.map} +1 -1
- package/dist/esm/chunk-TLNHRJB2.mjs +155 -0
- package/dist/esm/chunk-TLNHRJB2.mjs.map +1 -0
- package/dist/esm/chunk-U3IUCR2G.mjs +54 -0
- package/dist/esm/{chunk-CU67XZNB.mjs.map → chunk-U3IUCR2G.mjs.map} +1 -1
- package/dist/esm/chunk-U7QBZ6PP.mjs +400 -0
- package/dist/esm/chunk-U7QBZ6PP.mjs.map +1 -0
- package/dist/esm/chunk-UEBBLQJ5.mjs +94 -0
- package/dist/esm/{chunk-NPFNYP75.mjs.map → chunk-UEBBLQJ5.mjs.map} +1 -1
- package/dist/esm/chunk-UKU6A2W2.mjs +232 -0
- package/dist/esm/{chunk-XO3HHRJV.mjs.map → chunk-UKU6A2W2.mjs.map} +1 -1
- package/dist/esm/chunk-UX5NSZEN.mjs +134 -0
- package/dist/esm/chunk-UX5NSZEN.mjs.map +1 -0
- package/dist/esm/chunk-VDJBDX3A.mjs +79 -0
- package/dist/esm/chunk-VDJBDX3A.mjs.map +1 -0
- package/dist/esm/chunk-VJP2VWMF.mjs +58 -0
- package/dist/esm/chunk-VJP2VWMF.mjs.map +1 -0
- package/dist/esm/chunk-VKJQORON.mjs +93 -0
- package/dist/esm/{chunk-734YX27W.mjs.map → chunk-VKJQORON.mjs.map} +1 -1
- package/dist/esm/chunk-VPWUODU4.mjs +51 -0
- package/dist/esm/{chunk-AU6W5OIH.mjs.map → chunk-VPWUODU4.mjs.map} +1 -1
- package/dist/esm/chunk-VZQXLVEP.mjs +197 -0
- package/dist/esm/{chunk-V6OS74OS.mjs.map → chunk-VZQXLVEP.mjs.map} +1 -1
- package/dist/esm/chunk-W76MGKZB.mjs +33 -0
- package/dist/esm/{chunk-CTIN3GTP.mjs.map → chunk-W76MGKZB.mjs.map} +1 -1
- package/dist/esm/chunk-WDRH2URB.mjs +91 -0
- package/dist/esm/chunk-WDRH2URB.mjs.map +1 -0
- package/dist/esm/chunk-WHBWEN6N.mjs +206 -0
- package/dist/esm/chunk-WHBWEN6N.mjs.map +1 -0
- package/dist/esm/chunk-WK5ZSNE2.mjs +173 -0
- package/dist/esm/{chunk-QIAHBEEW.mjs.map → chunk-WK5ZSNE2.mjs.map} +1 -1
- package/dist/esm/chunk-WLTBF4DF.mjs +22 -0
- package/dist/esm/chunk-WLTBF4DF.mjs.map +1 -0
- package/dist/esm/chunk-WVGO4D7K.mjs +254 -0
- package/dist/esm/chunk-WVGO4D7K.mjs.map +1 -0
- package/dist/esm/chunk-XANFAUBD.mjs +44 -0
- package/dist/esm/{chunk-QTRYMRYK.mjs.map → chunk-XANFAUBD.mjs.map} +1 -1
- package/dist/esm/chunk-Y2LV3S5W.mjs +410 -0
- package/dist/esm/chunk-Y2LV3S5W.mjs.map +1 -0
- package/dist/esm/chunk-YV7M4CFP.mjs +137 -0
- package/dist/esm/{chunk-AOCNYMMX.mjs.map → chunk-YV7M4CFP.mjs.map} +1 -1
- package/dist/esm/chunk-YYOPNUX5.mjs +41 -0
- package/dist/esm/chunk-YYOPNUX5.mjs.map +1 -0
- package/dist/esm/chunk-ZAHJ7KXB.mjs +81 -0
- package/dist/esm/chunk-ZAHJ7KXB.mjs.map +1 -0
- package/dist/esm/chunk-ZMFKQUHL.mjs +117 -0
- package/dist/esm/{chunk-RIUZPGI5.mjs.map → chunk-ZMFKQUHL.mjs.map} +1 -1
- package/dist/esm/cli/index.d.mts +12 -0
- package/dist/esm/cli/index.mjs +12 -1
- package/dist/esm/cli/localNode.mjs +8 -1
- package/dist/esm/cli/move.d.mts +105 -0
- package/dist/esm/cli/move.mjs +8 -0
- package/dist/esm/cli/move.mjs.map +1 -0
- package/dist/esm/client/core.mjs +27 -1
- package/dist/esm/client/get.d.mts +2 -1
- package/dist/esm/client/get.mjs +32 -1
- package/dist/esm/client/index.d.mts +2 -2
- package/dist/esm/client/index.mjs +55 -1
- package/dist/esm/client/post.d.mts +3 -1
- package/dist/esm/client/post.mjs +36 -1
- package/dist/esm/client/types.d.mts +5 -1
- package/dist/esm/client/types.mjs +7 -1
- package/dist/esm/core/account/index.d.mts +5 -14
- package/dist/esm/core/account/index.mjs +19 -1
- package/dist/esm/core/account/utils/address.mjs +18 -1
- package/dist/esm/core/account/utils/index.mjs +19 -1
- package/dist/esm/core/accountAddress.mjs +15 -1
- package/dist/esm/core/authenticationKey.mjs +14 -1
- package/dist/esm/core/common.mjs +7 -1
- package/dist/esm/core/crypto/ed25519.mjs +29 -1
- package/dist/esm/core/crypto/ephemeral.d.mts +73 -0
- package/dist/esm/core/crypto/ephemeral.mjs +29 -0
- package/dist/esm/core/crypto/ephemeral.mjs.map +1 -0
- package/dist/esm/core/crypto/hdKey.mjs +25 -1
- package/dist/esm/core/crypto/index.d.mts +6 -3
- package/dist/esm/core/crypto/index.mjs +124 -1
- package/dist/esm/core/crypto/keyless.d.mts +232 -0
- package/dist/esm/core/crypto/keyless.mjs +56 -0
- package/dist/esm/core/crypto/keyless.mjs.map +1 -0
- package/dist/esm/core/crypto/multiEd25519.mjs +28 -1
- package/dist/esm/core/crypto/multiKey.d.mts +7 -0
- package/dist/esm/core/crypto/multiKey.mjs +34 -1
- package/dist/esm/core/crypto/poseidon.d.mts +7 -0
- package/dist/esm/core/crypto/poseidon.mjs +16 -0
- package/dist/esm/core/crypto/poseidon.mjs.map +1 -0
- package/dist/esm/core/crypto/privateKey.mjs +1 -1
- package/dist/esm/core/crypto/proof.d.mts +21 -0
- package/dist/esm/core/crypto/proof.mjs +20 -0
- package/dist/esm/core/crypto/proof.mjs.map +1 -0
- package/dist/esm/core/crypto/publicKey.mjs +21 -1
- package/dist/esm/core/crypto/secp256k1.mjs +27 -1
- package/dist/esm/core/crypto/signature.mjs +19 -1
- package/dist/esm/core/crypto/singleKey.mjs +33 -1
- package/dist/esm/core/crypto/utils.mjs +9 -1
- package/dist/esm/core/hex.mjs +10 -1
- package/dist/esm/core/index.d.mts +5 -5
- package/dist/esm/core/index.mjs +141 -1
- package/dist/esm/index.d.mts +15 -8
- package/dist/esm/index.mjs +635 -1
- package/dist/esm/internal/account.d.mts +13 -1
- package/dist/esm/internal/account.mjs +106 -1
- package/dist/esm/internal/ans.d.mts +1 -1
- package/dist/esm/internal/ans.mjs +120 -1
- package/dist/esm/internal/coin.d.mts +7 -7
- package/dist/esm/internal/coin.mjs +85 -1
- package/dist/esm/internal/digitalAsset.d.mts +2 -2
- package/dist/esm/internal/digitalAsset.mjs +127 -1
- package/dist/esm/internal/event.d.mts +1 -1
- package/dist/esm/internal/event.mjs +55 -1
- package/dist/esm/internal/faucet.d.mts +1 -1
- package/dist/esm/internal/faucet.mjs +52 -1
- package/dist/esm/internal/fungibleAsset.d.mts +5 -5
- package/dist/esm/internal/fungibleAsset.mjs +91 -1
- package/dist/esm/internal/general.mjs +46 -1
- package/dist/esm/internal/keyless.d.mts +68 -0
- package/dist/esm/internal/keyless.mjs +74 -0
- package/dist/esm/internal/keyless.mjs.map +1 -0
- package/dist/esm/internal/staking.d.mts +1 -1
- package/dist/esm/internal/staking.mjs +53 -1
- package/dist/esm/internal/transaction.mjs +51 -1
- package/dist/esm/internal/transactionSubmission.d.mts +1 -1
- package/dist/esm/internal/transactionSubmission.mjs +102 -1
- package/dist/esm/internal/view.d.mts +7 -7
- package/dist/esm/internal/view.mjs +83 -1
- package/dist/esm/transactions/authenticator/account.d.mts +3 -4
- package/dist/esm/transactions/authenticator/account.mjs +44 -1
- package/dist/esm/transactions/authenticator/index.mjs +60 -1
- package/dist/esm/transactions/authenticator/transaction.mjs +48 -1
- package/dist/esm/transactions/index.d.mts +2 -2
- package/dist/esm/transactions/index.mjs +284 -1
- package/dist/esm/transactions/instances/chainId.mjs +11 -1
- package/dist/esm/transactions/instances/identifier.mjs +11 -1
- package/dist/esm/transactions/instances/index.mjs +96 -1
- package/dist/esm/transactions/instances/moduleId.d.mts +1 -1
- package/dist/esm/transactions/instances/moduleId.mjs +38 -1
- package/dist/esm/transactions/instances/multiAgentTransaction.mjs +43 -1
- package/dist/esm/transactions/instances/rawTransaction.mjs +48 -1
- package/dist/esm/transactions/instances/rotationProofChallenge.mjs +20 -1
- package/dist/esm/transactions/instances/signedTransaction.mjs +45 -1
- package/dist/esm/transactions/instances/simpleTransaction.mjs +43 -1
- package/dist/esm/transactions/instances/transactionArgument.mjs +1 -1
- package/dist/esm/transactions/instances/transactionPayload.d.mts +1 -1
- package/dist/esm/transactions/instances/transactionPayload.mjs +56 -1
- package/dist/esm/transactions/management/accountSequenceNumber.d.mts +13 -1
- package/dist/esm/transactions/management/accountSequenceNumber.mjs +74 -1
- package/dist/esm/transactions/management/asyncQueue.mjs +9 -1
- package/dist/esm/transactions/management/index.d.mts +2 -2
- package/dist/esm/transactions/management/index.mjs +95 -1
- package/dist/esm/transactions/management/transactionWorker.d.mts +1 -1
- package/dist/esm/transactions/management/transactionWorker.mjs +91 -1
- package/dist/esm/transactions/transactionBuilder/helpers.d.mts +9 -9
- package/dist/esm/transactions/transactionBuilder/helpers.mjs +75 -1
- package/dist/esm/transactions/transactionBuilder/index.d.mts +9 -9
- package/dist/esm/transactions/transactionBuilder/index.mjs +162 -1
- package/dist/esm/transactions/transactionBuilder/remoteAbi.d.mts +6 -6
- package/dist/esm/transactions/transactionBuilder/remoteAbi.mjs +85 -1
- package/dist/esm/transactions/transactionBuilder/signingMessage.d.mts +72 -0
- package/dist/esm/transactions/transactionBuilder/signingMessage.mjs +59 -0
- package/dist/esm/transactions/transactionBuilder/signingMessage.mjs.map +1 -0
- package/dist/esm/transactions/transactionBuilder/transactionBuilder.d.mts +6 -28
- package/dist/esm/transactions/transactionBuilder/transactionBuilder.mjs +98 -1
- package/dist/esm/transactions/typeTag/index.mjs +74 -1
- package/dist/esm/transactions/typeTag/parser.mjs +43 -1
- package/dist/esm/transactions/types.d.mts +6 -6
- package/dist/esm/transactions/types.mjs +1 -1
- package/dist/esm/types/generated/queries.mjs +57 -1
- package/dist/esm/types/generated/types.mjs +809 -1
- package/dist/esm/types/generated/types.mjs.map +1 -1
- package/dist/esm/types/index.d.mts +19 -3
- package/dist/esm/types/index.mjs +68 -1
- package/dist/esm/types/indexer.mjs +1 -1
- package/dist/esm/types/keyless.d.mts +69 -0
- package/dist/esm/types/keyless.mjs +10 -0
- package/dist/esm/types/keyless.mjs.map +1 -0
- package/dist/esm/utils/apiEndpoints.d.mts +3 -2
- package/dist/esm/utils/apiEndpoints.mjs +21 -1
- package/dist/esm/utils/const.d.mts +3 -1
- package/dist/esm/utils/const.mjs +21 -1
- package/dist/esm/utils/helpers.mjs +7 -1
- package/dist/esm/utils/index.d.mts +1 -1
- package/dist/esm/utils/index.mjs +56 -1
- package/dist/esm/utils/memoize.mjs +9 -1
- package/dist/esm/utils/normalizeBundle.mjs +19 -1
- package/dist/esm/version.d.mts +1 -1
- package/dist/esm/version.mjs +7 -1
- package/package.json +11 -3
- package/src/{core/account → account}/Account.ts +25 -15
- package/src/{core/account → account}/Ed25519Account.ts +45 -9
- package/src/account/EphemeralKeyPair.ts +161 -0
- package/src/account/KeylessAccount.ts +342 -0
- package/src/account/MultiKeyAccount.ts +186 -0
- package/src/{core/account → account}/SingleKeyAccount.ts +45 -10
- package/src/account/index.ts +6 -0
- package/src/api/account.ts +2 -1
- package/src/api/ans.ts +2 -1
- package/src/api/aptos.ts +6 -0
- package/src/api/aptosConfig.ts +46 -1
- package/src/api/digitalAsset.ts +2 -1
- package/src/api/fungibleAsset.ts +2 -1
- package/src/api/keyless.ts +48 -0
- package/src/api/transaction.ts +2 -1
- package/src/api/transactionSubmission/management.ts +1 -1
- package/src/api/transactionSubmission/sign.ts +1 -1
- package/src/bcs/deserializer.ts +40 -0
- package/src/bcs/serializer.ts +18 -0
- package/src/cli/index.ts +1 -0
- package/src/cli/move.ts +183 -0
- package/src/client/core.ts +8 -0
- package/src/client/get.ts +6 -0
- package/src/client/post.ts +12 -0
- package/src/client/types.ts +1 -1
- package/src/core/account/index.ts +0 -3
- package/src/core/crypto/ephemeral.ts +138 -0
- package/src/core/crypto/index.ts +2 -0
- package/src/core/crypto/keyless.ts +453 -0
- package/src/core/crypto/multiKey.ts +17 -6
- package/src/core/crypto/poseidon.ts +134 -0
- package/src/core/crypto/proof.ts +16 -0
- package/src/core/crypto/singleKey.ts +11 -0
- package/src/core/index.ts +0 -1
- package/src/index.ts +1 -0
- package/src/internal/account.ts +1 -1
- package/src/internal/ans.ts +2 -2
- package/src/internal/digitalAsset.ts +2 -1
- package/src/internal/fungibleAsset.ts +3 -2
- package/src/internal/keyless.ts +119 -0
- package/src/internal/transactionSubmission.ts +24 -13
- package/src/transactions/authenticator/account.ts +6 -11
- package/src/transactions/management/accountSequenceNumber.ts +1 -1
- package/src/transactions/management/transactionWorker.ts +1 -1
- package/src/transactions/transactionBuilder/index.ts +1 -0
- package/src/transactions/transactionBuilder/signingMessage.ts +93 -0
- package/src/transactions/transactionBuilder/transactionBuilder.ts +2 -75
- package/src/types/index.ts +22 -0
- package/src/types/keyless.ts +37 -0
- package/src/utils/apiEndpoints.ts +14 -6
- package/src/utils/const.ts +2 -0
- package/src/version.ts +1 -1
- package/dist/common/chunk-KSEUZTKY.js +0 -2
- package/dist/common/chunk-KSEUZTKY.js.map +0 -1
- package/dist/esm/chunk-24IKVZBK.mjs +0 -2
- package/dist/esm/chunk-24IKVZBK.mjs.map +0 -1
- package/dist/esm/chunk-2HISPUZZ.mjs +0 -2
- package/dist/esm/chunk-2HISPUZZ.mjs.map +0 -1
- package/dist/esm/chunk-3JPVQHOR.mjs +0 -2
- package/dist/esm/chunk-3WUGR46O.mjs +0 -2
- package/dist/esm/chunk-52C73T26.mjs +0 -2
- package/dist/esm/chunk-56CNRT2K.mjs +0 -2
- package/dist/esm/chunk-5P2S2SZZ.mjs +0 -2
- package/dist/esm/chunk-6CFRW26C.mjs +0 -2
- package/dist/esm/chunk-6CFRW26C.mjs.map +0 -1
- package/dist/esm/chunk-6EMN3BOV.mjs +0 -2
- package/dist/esm/chunk-6FBKUTGF.mjs +0 -2
- package/dist/esm/chunk-6IFMQ5AS.mjs +0 -2
- package/dist/esm/chunk-6IFMQ5AS.mjs.map +0 -1
- package/dist/esm/chunk-734YX27W.mjs +0 -2
- package/dist/esm/chunk-7QJ6YJXP.mjs +0 -2
- package/dist/esm/chunk-AD3VLZ7I.mjs +0 -2
- package/dist/esm/chunk-AD3VLZ7I.mjs.map +0 -1
- package/dist/esm/chunk-AH44UPM4.mjs +0 -2
- package/dist/esm/chunk-AOCNYMMX.mjs +0 -2
- package/dist/esm/chunk-AU6W5OIH.mjs +0 -2
- package/dist/esm/chunk-B3R6G6QP.mjs +0 -2
- package/dist/esm/chunk-B3R6G6QP.mjs.map +0 -1
- package/dist/esm/chunk-B7TQGVGL.mjs +0 -2
- package/dist/esm/chunk-BWFJHFBQ.mjs +0 -2
- package/dist/esm/chunk-CNMQNPNV.mjs +0 -2
- package/dist/esm/chunk-CTIN3GTP.mjs +0 -2
- package/dist/esm/chunk-CU67XZNB.mjs +0 -2
- package/dist/esm/chunk-CYNQRMO5.mjs +0 -2
- package/dist/esm/chunk-CYNQRMO5.mjs.map +0 -1
- package/dist/esm/chunk-DM44OGQH.mjs +0 -2
- package/dist/esm/chunk-DMKUAQB7.mjs +0 -2
- package/dist/esm/chunk-DPV25ZKR.mjs +0 -2
- package/dist/esm/chunk-DSTKXJMA.mjs +0 -2
- package/dist/esm/chunk-E7FWVXGX.mjs +0 -1
- package/dist/esm/chunk-EOFJFE4T.mjs +0 -2
- package/dist/esm/chunk-EOFJFE4T.mjs.map +0 -1
- package/dist/esm/chunk-FATWMUXK.mjs +0 -2
- package/dist/esm/chunk-FATWMUXK.mjs.map +0 -1
- package/dist/esm/chunk-FBPNHF54.mjs +0 -2
- package/dist/esm/chunk-FS3NSGBF.mjs +0 -2
- package/dist/esm/chunk-FVA2OPG4.mjs +0 -2
- package/dist/esm/chunk-G2O323HP.mjs +0 -2
- package/dist/esm/chunk-GSD4OOM3.mjs +0 -2
- package/dist/esm/chunk-HQ5I4Q3H.mjs +0 -2
- package/dist/esm/chunk-HQ5I4Q3H.mjs.map +0 -1
- package/dist/esm/chunk-IIPYR7PF.mjs +0 -2
- package/dist/esm/chunk-IIPYR7PF.mjs.map +0 -1
- package/dist/esm/chunk-IKYIJYBY.mjs +0 -2
- package/dist/esm/chunk-IKYIJYBY.mjs.map +0 -1
- package/dist/esm/chunk-IOSQVDZI.mjs +0 -2
- package/dist/esm/chunk-KVZ4XMZS.mjs +0 -2
- package/dist/esm/chunk-KVZ4XMZS.mjs.map +0 -1
- package/dist/esm/chunk-L54P6EGN.mjs +0 -2
- package/dist/esm/chunk-LR65XHSF.mjs +0 -2
- package/dist/esm/chunk-MACC2BLE.mjs +0 -2
- package/dist/esm/chunk-MC6G725U.mjs +0 -2
- package/dist/esm/chunk-MC6G725U.mjs.map +0 -1
- package/dist/esm/chunk-MFKMAAWA.mjs +0 -2
- package/dist/esm/chunk-MLWIHWNH.mjs +0 -1
- package/dist/esm/chunk-NNQJBFRB.mjs +0 -2
- package/dist/esm/chunk-NPFNYP75.mjs +0 -2
- package/dist/esm/chunk-O2F53NKI.mjs +0 -2
- package/dist/esm/chunk-O4JRPZZM.mjs +0 -2
- package/dist/esm/chunk-ODRO4CSA.mjs +0 -2
- package/dist/esm/chunk-ODRO4CSA.mjs.map +0 -1
- package/dist/esm/chunk-OVJQWQ2N.mjs +0 -2
- package/dist/esm/chunk-OVJQWQ2N.mjs.map +0 -1
- package/dist/esm/chunk-OWW6SIDP.mjs +0 -2
- package/dist/esm/chunk-OWW6SIDP.mjs.map +0 -1
- package/dist/esm/chunk-PFIMEXNN.mjs +0 -2
- package/dist/esm/chunk-PFIMEXNN.mjs.map +0 -1
- package/dist/esm/chunk-PZGLV5UQ.mjs +0 -2
- package/dist/esm/chunk-Q3TZGQVC.mjs +0 -2
- package/dist/esm/chunk-Q3TZGQVC.mjs.map +0 -1
- package/dist/esm/chunk-QIAHBEEW.mjs +0 -2
- package/dist/esm/chunk-QMURTXFM.mjs +0 -2
- package/dist/esm/chunk-QTRYMRYK.mjs +0 -2
- package/dist/esm/chunk-R5QUBEH6.mjs +0 -2
- package/dist/esm/chunk-R7G3CLRI.mjs +0 -1
- package/dist/esm/chunk-RHBCVCOS.mjs +0 -2
- package/dist/esm/chunk-RIUZPGI5.mjs +0 -2
- package/dist/esm/chunk-ROXFCLDT.mjs +0 -2
- package/dist/esm/chunk-SG4MAOCF.mjs +0 -2
- package/dist/esm/chunk-SUAKPNKQ.mjs +0 -2
- package/dist/esm/chunk-SUAKPNKQ.mjs.map +0 -1
- package/dist/esm/chunk-TBMAJ6AW.mjs +0 -2
- package/dist/esm/chunk-TJDC5PWD.mjs +0 -2
- package/dist/esm/chunk-TLOPIURC.mjs +0 -2
- package/dist/esm/chunk-TLOPIURC.mjs.map +0 -1
- package/dist/esm/chunk-U43IJHQN.mjs +0 -2
- package/dist/esm/chunk-U6Z4FNB7.mjs +0 -2
- package/dist/esm/chunk-UFT7US42.mjs +0 -2
- package/dist/esm/chunk-UML2VQZT.mjs +0 -2
- package/dist/esm/chunk-UVSRX4SV.mjs +0 -1
- package/dist/esm/chunk-V3Q2KXJU.mjs +0 -2
- package/dist/esm/chunk-V4SRNEV3.mjs +0 -2
- package/dist/esm/chunk-V4SRNEV3.mjs.map +0 -1
- package/dist/esm/chunk-V6OS74OS.mjs +0 -2
- package/dist/esm/chunk-VVIG4E7Q.mjs +0 -2
- package/dist/esm/chunk-W4ZW7QHA.mjs +0 -2
- package/dist/esm/chunk-WFZDFFBM.mjs +0 -2
- package/dist/esm/chunk-WLF5YQM4.mjs +0 -2
- package/dist/esm/chunk-WLF5YQM4.mjs.map +0 -1
- package/dist/esm/chunk-XDGQTMDV.mjs +0 -2
- package/dist/esm/chunk-XDGQTMDV.mjs.map +0 -1
- package/dist/esm/chunk-XO3HHRJV.mjs +0 -2
- package/dist/esm/chunk-YFRXBEOC.mjs +0 -2
- package/dist/esm/chunk-YFRXBEOC.mjs.map +0 -1
- package/dist/esm/chunk-YPTF6MLX.mjs +0 -2
- package/dist/esm/chunk-YPTF6MLX.mjs.map +0 -1
- package/dist/esm/chunk-YU3KB3UV.mjs +0 -2
- package/dist/esm/chunk-Z5YFM2AW.mjs +0 -2
- package/dist/esm/chunk-Z5YFM2AW.mjs.map +0 -1
- package/dist/esm/chunk-ZYYK3UXP.mjs +0 -2
- package/dist/esm/chunk-ZZZZVONX.mjs +0 -2
- package/dist/esm/core/account/Account.d.mts +0 -20
- package/dist/esm/core/account/Account.mjs +0 -2
- package/dist/esm/core/account/Ed25519Account.d.mts +0 -20
- package/dist/esm/core/account/Ed25519Account.mjs +0 -2
- package/dist/esm/core/account/SingleKeyAccount.d.mts +0 -20
- package/dist/esm/core/account/SingleKeyAccount.mjs +0 -2
- /package/dist/esm/{core/account → account}/Account.mjs.map +0 -0
- /package/dist/esm/{core/account → account}/Ed25519Account.mjs.map +0 -0
- /package/dist/esm/{chunk-E7FWVXGX.mjs.map → account/EphemeralKeyPair.mjs.map} +0 -0
- /package/dist/esm/{chunk-FVA2OPG4.mjs.map → account/KeylessAccount.mjs.map} +0 -0
- /package/dist/esm/{chunk-MLWIHWNH.mjs.map → account/MultiKeyAccount.mjs.map} +0 -0
- /package/dist/esm/{core/account → account}/SingleKeyAccount.mjs.map +0 -0
- /package/dist/esm/{chunk-R7G3CLRI.mjs.map → account/index.mjs.map} +0 -0
- /package/dist/esm/{chunk-UVSRX4SV.mjs.map → api/keyless.mjs.map} +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// Copyright © Aptos Foundation
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { randomBytes } from "@noble/hashes/utils";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
EPK_HORIZON_SECS,
|
|
8
|
+
Ed25519PrivateKey,
|
|
9
|
+
EphemeralPublicKey,
|
|
10
|
+
EphemeralSignature,
|
|
11
|
+
PrivateKey,
|
|
12
|
+
} from "../core/crypto";
|
|
13
|
+
import { Hex } from "../core/hex";
|
|
14
|
+
import { bytesToBigIntLE, padAndPackBytesWithLen, poseidonHash } from "../core/crypto/poseidon";
|
|
15
|
+
import { EphemeralPublicKeyVariant, HexInput } from "../types";
|
|
16
|
+
import { Deserializer, Serializable, Serializer } from "../bcs";
|
|
17
|
+
|
|
18
|
+
export class EphemeralKeyPair extends Serializable {
|
|
19
|
+
static readonly BLINDER_LENGTH: number = 31;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A byte array of length BLINDER_LENGTH used to obfuscate the public key from the IdP.
|
|
23
|
+
* Used in calculating the nonce passed to the IdP and as a secret witness in proof generation.
|
|
24
|
+
*/
|
|
25
|
+
readonly blinder: Uint8Array;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A timestamp in seconds indicating when the ephemeral key pair is expired. After expiry, a new
|
|
29
|
+
* EphemeralKeyPair must be generated and a new JWT needs to be created.
|
|
30
|
+
*/
|
|
31
|
+
readonly expiryDateSecs: bigint | number;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The value passed to the IdP when the user authenticates. It comprises of a hash of the
|
|
35
|
+
* ephermeral public key, expiry date, and blinder.
|
|
36
|
+
*/
|
|
37
|
+
readonly nonce: string;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A private key used to sign transactions. This private key is not tied to any account on the chain as it
|
|
41
|
+
* is ephemeral in nature.
|
|
42
|
+
*/
|
|
43
|
+
private privateKey: PrivateKey;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A public key used to verify transactions. This public key is not tied to any account on the chain as it
|
|
47
|
+
* is ephemeral in nature.
|
|
48
|
+
*/
|
|
49
|
+
private publicKey: EphemeralPublicKey;
|
|
50
|
+
|
|
51
|
+
constructor(args: { privateKey: PrivateKey; expiryDateSecs?: bigint | number; blinder?: HexInput }) {
|
|
52
|
+
super();
|
|
53
|
+
const { privateKey, expiryDateSecs, blinder } = args;
|
|
54
|
+
this.privateKey = privateKey;
|
|
55
|
+
this.publicKey = new EphemeralPublicKey(privateKey.publicKey());
|
|
56
|
+
// We set the expiry date to be the nearest floored hour
|
|
57
|
+
this.expiryDateSecs = expiryDateSecs || BigInt(floorToWholeHour(currentTimeInSeconds() + EPK_HORIZON_SECS));
|
|
58
|
+
// Generate the blinder if not provided
|
|
59
|
+
this.blinder = blinder !== undefined ? Hex.fromHexInput(blinder).toUint8Array() : generateBlinder();
|
|
60
|
+
// Calculate the nonce
|
|
61
|
+
this.nonce = this.generateNonce();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns the public key of the key pair.
|
|
66
|
+
* @return EphemeralPublicKey
|
|
67
|
+
*/
|
|
68
|
+
getPublicKey(): EphemeralPublicKey {
|
|
69
|
+
return this.publicKey;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Returns the public key of the key pair.
|
|
74
|
+
* @return boolean
|
|
75
|
+
*/
|
|
76
|
+
isExpired(): boolean {
|
|
77
|
+
const currentTimeSecs: number = Math.floor(Date.now() / 1000);
|
|
78
|
+
return currentTimeSecs > this.expiryDateSecs;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
serialize(serializer: Serializer): void {
|
|
82
|
+
serializer.serializeU32AsUleb128(this.publicKey.variant);
|
|
83
|
+
serializer.serializeBytes(this.privateKey.toUint8Array());
|
|
84
|
+
serializer.serializeU64(this.expiryDateSecs);
|
|
85
|
+
serializer.serializeFixedBytes(this.blinder);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
static deserialize(deserializer: Deserializer): EphemeralKeyPair {
|
|
89
|
+
const variantIndex = deserializer.deserializeUleb128AsU32();
|
|
90
|
+
let privateKey: PrivateKey;
|
|
91
|
+
switch (variantIndex) {
|
|
92
|
+
case EphemeralPublicKeyVariant.Ed25519:
|
|
93
|
+
privateKey = Ed25519PrivateKey.deserialize(deserializer);
|
|
94
|
+
break;
|
|
95
|
+
default:
|
|
96
|
+
throw new Error(`Unknown variant index for EphemeralPublicKey: ${variantIndex}`);
|
|
97
|
+
}
|
|
98
|
+
const expiryDateSecs = deserializer.deserializeU64();
|
|
99
|
+
const blinder = deserializer.deserializeFixedBytes(31);
|
|
100
|
+
return new EphemeralKeyPair({ privateKey, expiryDateSecs, blinder });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static fromBytes(bytes: Uint8Array): EphemeralKeyPair {
|
|
104
|
+
return EphemeralKeyPair.deserialize(new Deserializer(bytes));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Returns the public key of the key pair.
|
|
109
|
+
* @param scheme the type of keypair to use for the EphemeralKeyPair. Only Ed25519 supported for now.
|
|
110
|
+
* @return boolean
|
|
111
|
+
*/
|
|
112
|
+
static generate(args?: { scheme: EphemeralPublicKeyVariant }): EphemeralKeyPair {
|
|
113
|
+
let privateKey: PrivateKey;
|
|
114
|
+
|
|
115
|
+
switch (args?.scheme) {
|
|
116
|
+
case EphemeralPublicKeyVariant.Ed25519:
|
|
117
|
+
default:
|
|
118
|
+
privateKey = Ed25519PrivateKey.generate();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return new EphemeralKeyPair({ privateKey });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private generateNonce(): string {
|
|
125
|
+
const fields = padAndPackBytesWithLen(this.publicKey.bcsToBytes(), 93);
|
|
126
|
+
fields.push(BigInt(this.expiryDateSecs));
|
|
127
|
+
fields.push(bytesToBigIntLE(this.blinder));
|
|
128
|
+
const nonceHash = poseidonHash(fields);
|
|
129
|
+
return nonceHash.toString();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Sign the given message with the private key.
|
|
134
|
+
*
|
|
135
|
+
* @param data in HexInput format
|
|
136
|
+
* @returns EphemeralSignature
|
|
137
|
+
*/
|
|
138
|
+
sign(data: HexInput): EphemeralSignature {
|
|
139
|
+
if (this.isExpired()) {
|
|
140
|
+
throw new Error("EphemeralKeyPair has expired");
|
|
141
|
+
}
|
|
142
|
+
return new EphemeralSignature(this.privateKey.sign(data));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function generateBlinder(): Uint8Array {
|
|
147
|
+
return randomBytes(EphemeralKeyPair.BLINDER_LENGTH);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function currentTimeInSeconds(): number {
|
|
151
|
+
return Math.floor(new Date().getTime() / 1000);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function floorToWholeHour(timestampInSeconds: number): number {
|
|
155
|
+
const date = new Date(timestampInSeconds * 1000);
|
|
156
|
+
// Reset minutes and seconds to zero
|
|
157
|
+
date.setMinutes(0);
|
|
158
|
+
date.setSeconds(0);
|
|
159
|
+
date.setMilliseconds(0);
|
|
160
|
+
return Math.floor(date.getTime() / 1000);
|
|
161
|
+
}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
// Copyright © Aptos Foundation
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { JwtPayload, jwtDecode } from "jwt-decode";
|
|
5
|
+
import { JwksClient } from "jwks-rsa";
|
|
6
|
+
import { decode } from "base-64";
|
|
7
|
+
import EventEmitter from "eventemitter3";
|
|
8
|
+
import { EphemeralCertificateVariant, HexInput, SigningScheme } from "../types";
|
|
9
|
+
import { AccountAddress } from "../core/accountAddress";
|
|
10
|
+
import {
|
|
11
|
+
AnyPublicKey,
|
|
12
|
+
AnySignature,
|
|
13
|
+
KeylessPublicKey,
|
|
14
|
+
KeylessSignature,
|
|
15
|
+
EphemeralCertificate,
|
|
16
|
+
Signature,
|
|
17
|
+
ZeroKnowledgeSig,
|
|
18
|
+
ZkProof,
|
|
19
|
+
} from "../core/crypto";
|
|
20
|
+
|
|
21
|
+
import { Account } from "./Account";
|
|
22
|
+
import { EphemeralKeyPair } from "./EphemeralKeyPair";
|
|
23
|
+
import { Hex } from "../core/hex";
|
|
24
|
+
import { AccountAuthenticatorSingleKey } from "../transactions/authenticator/account";
|
|
25
|
+
import { Deserializer, Serializable, Serializer } from "../bcs";
|
|
26
|
+
import {
|
|
27
|
+
deriveTransactionType,
|
|
28
|
+
generateSigningMessageForSerializable,
|
|
29
|
+
} from "../transactions/transactionBuilder/signingMessage";
|
|
30
|
+
import { AnyRawTransaction, AnyRawTransactionInstance } from "../transactions/types";
|
|
31
|
+
|
|
32
|
+
export const IssuerToJwkEndpoint: Record<string, string> = {
|
|
33
|
+
"https://accounts.google.com": "https://www.googleapis.com/oauth2/v3/certs",
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export class KeylessAccount extends Serializable implements Account {
|
|
37
|
+
static readonly PEPPER_LENGTH: number = 31;
|
|
38
|
+
|
|
39
|
+
readonly publicKey: KeylessPublicKey;
|
|
40
|
+
|
|
41
|
+
readonly ephemeralKeyPair: EphemeralKeyPair;
|
|
42
|
+
|
|
43
|
+
readonly uidKey: string;
|
|
44
|
+
|
|
45
|
+
readonly uidVal: string;
|
|
46
|
+
|
|
47
|
+
readonly aud: string;
|
|
48
|
+
|
|
49
|
+
readonly pepper: Uint8Array;
|
|
50
|
+
|
|
51
|
+
readonly accountAddress: AccountAddress;
|
|
52
|
+
|
|
53
|
+
proof: ZeroKnowledgeSig | undefined;
|
|
54
|
+
|
|
55
|
+
readonly proofOrPromise: ZeroKnowledgeSig | Promise<ZeroKnowledgeSig>;
|
|
56
|
+
|
|
57
|
+
readonly signingScheme: SigningScheme;
|
|
58
|
+
|
|
59
|
+
private jwt: string;
|
|
60
|
+
|
|
61
|
+
private isJwtValid: boolean;
|
|
62
|
+
|
|
63
|
+
readonly emitter: EventEmitter<ProofFetchEvents>;
|
|
64
|
+
|
|
65
|
+
constructor(args: {
|
|
66
|
+
address?: AccountAddress;
|
|
67
|
+
ephemeralKeyPair: EphemeralKeyPair;
|
|
68
|
+
iss: string;
|
|
69
|
+
uidKey: string;
|
|
70
|
+
uidVal: string;
|
|
71
|
+
aud: string;
|
|
72
|
+
pepper: HexInput;
|
|
73
|
+
proofOrFetcher: ZeroKnowledgeSig | Promise<ZeroKnowledgeSig>;
|
|
74
|
+
proofFetchCallback?: ProofFetchCallback;
|
|
75
|
+
jwt: string;
|
|
76
|
+
}) {
|
|
77
|
+
super();
|
|
78
|
+
const { address, ephemeralKeyPair, uidKey, uidVal, aud, pepper, proofOrFetcher, proofFetchCallback, jwt } = args;
|
|
79
|
+
this.ephemeralKeyPair = ephemeralKeyPair;
|
|
80
|
+
this.publicKey = KeylessPublicKey.create(args);
|
|
81
|
+
this.accountAddress = address ? AccountAddress.from(address) : this.publicKey.authKey().derivedAddress();
|
|
82
|
+
this.uidKey = uidKey;
|
|
83
|
+
this.uidVal = uidVal;
|
|
84
|
+
this.aud = aud;
|
|
85
|
+
this.jwt = jwt;
|
|
86
|
+
this.emitter = new EventEmitter<ProofFetchEvents>();
|
|
87
|
+
this.proofOrPromise = proofOrFetcher;
|
|
88
|
+
if (proofOrFetcher instanceof ZeroKnowledgeSig) {
|
|
89
|
+
this.proof = proofOrFetcher;
|
|
90
|
+
} else {
|
|
91
|
+
if (proofFetchCallback === undefined) {
|
|
92
|
+
throw new Error("Must provide callback for async proof fetch");
|
|
93
|
+
}
|
|
94
|
+
this.emitter.on("proofFetchFinish", async (status) => {
|
|
95
|
+
await proofFetchCallback(status);
|
|
96
|
+
this.emitter.removeAllListeners();
|
|
97
|
+
});
|
|
98
|
+
this.init(proofOrFetcher);
|
|
99
|
+
}
|
|
100
|
+
this.signingScheme = SigningScheme.SingleKey;
|
|
101
|
+
const pepperBytes = Hex.fromHexInput(pepper).toUint8Array();
|
|
102
|
+
if (pepperBytes.length !== KeylessAccount.PEPPER_LENGTH) {
|
|
103
|
+
throw new Error(`Pepper length in bytes should be ${KeylessAccount.PEPPER_LENGTH}`);
|
|
104
|
+
}
|
|
105
|
+
this.pepper = pepperBytes;
|
|
106
|
+
this.isJwtValid = true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* This initializes the asyncronous proof fetch
|
|
111
|
+
* @return
|
|
112
|
+
*/
|
|
113
|
+
async init(promise: Promise<ZeroKnowledgeSig>) {
|
|
114
|
+
try {
|
|
115
|
+
this.proof = await promise;
|
|
116
|
+
this.emitter.emit("proofFetchFinish", { status: "Success" });
|
|
117
|
+
} catch (error) {
|
|
118
|
+
if (error instanceof Error) {
|
|
119
|
+
this.emitter.emit("proofFetchFinish", { status: "Failed", error: error.toString() });
|
|
120
|
+
} else {
|
|
121
|
+
this.emitter.emit("proofFetchFinish", { status: "Failed", error: "Unknown" });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
serialize(serializer: Serializer): void {
|
|
127
|
+
serializer.serializeStr(this.jwt);
|
|
128
|
+
serializer.serializeStr(this.uidKey);
|
|
129
|
+
serializer.serializeFixedBytes(this.pepper);
|
|
130
|
+
this.ephemeralKeyPair.serialize(serializer);
|
|
131
|
+
if (this.proof === undefined) {
|
|
132
|
+
throw new Error("Connot serialize - proof undefined");
|
|
133
|
+
}
|
|
134
|
+
this.proof.serialize(serializer);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static deserialize(deserializer: Deserializer): KeylessAccount {
|
|
138
|
+
const jwt = deserializer.deserializeStr();
|
|
139
|
+
const uidKey = deserializer.deserializeStr();
|
|
140
|
+
const pepper = deserializer.deserializeFixedBytes(31);
|
|
141
|
+
const ephemeralKeyPair = EphemeralKeyPair.deserialize(deserializer);
|
|
142
|
+
const proof = ZeroKnowledgeSig.deserialize(deserializer);
|
|
143
|
+
return KeylessAccount.fromJWTAndProof({
|
|
144
|
+
proof,
|
|
145
|
+
pepper,
|
|
146
|
+
uidKey,
|
|
147
|
+
jwt,
|
|
148
|
+
ephemeralKeyPair,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Checks if the proof is expired. If so the account must be rederived with a new EphemeralKeyPair
|
|
154
|
+
* and JWT token.
|
|
155
|
+
* @return boolean
|
|
156
|
+
*/
|
|
157
|
+
isExpired(): boolean {
|
|
158
|
+
return this.ephemeralKeyPair.isExpired();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Checks if the the JWK used to verify the token still exists on the issuer's JWK uri.
|
|
163
|
+
* Caches the result.
|
|
164
|
+
* @return boolean
|
|
165
|
+
*/
|
|
166
|
+
async checkJwkValidity(): Promise<boolean> {
|
|
167
|
+
if (!this.isJwtValid) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const jwtHeader = jwtDecode(this.jwt, { header: true });
|
|
171
|
+
const client = new JwksClient({
|
|
172
|
+
jwksUri: IssuerToJwkEndpoint[this.publicKey.iss],
|
|
173
|
+
});
|
|
174
|
+
try {
|
|
175
|
+
await client.getSigningKey(jwtHeader.kid);
|
|
176
|
+
return true;
|
|
177
|
+
} catch (error) {
|
|
178
|
+
this.isJwtValid = false;
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Sign a message using Keyless.
|
|
185
|
+
* @param message the message to sign, as binary input
|
|
186
|
+
* @return the AccountAuthenticator containing the signature, together with the account's public key
|
|
187
|
+
*/
|
|
188
|
+
signWithAuthenticator(message: HexInput): AccountAuthenticatorSingleKey {
|
|
189
|
+
const signature = new AnySignature(this.sign(message));
|
|
190
|
+
const publicKey = new AnyPublicKey(this.publicKey);
|
|
191
|
+
return new AccountAuthenticatorSingleKey(publicKey, signature);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Sign a transaction using Keyless.
|
|
196
|
+
* @param transaction the raw transaction
|
|
197
|
+
* @return the AccountAuthenticator containing the signature of the transaction, together with the account's public key
|
|
198
|
+
*/
|
|
199
|
+
signTransactionWithAuthenticator(transaction: AnyRawTransaction): AccountAuthenticatorSingleKey {
|
|
200
|
+
const signature = new AnySignature(this.signTransaction(transaction));
|
|
201
|
+
const publicKey = new AnyPublicKey(this.publicKey);
|
|
202
|
+
return new AccountAuthenticatorSingleKey(publicKey, signature);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Waits for asyncronous proof fetching to finish.
|
|
207
|
+
* @return
|
|
208
|
+
*/
|
|
209
|
+
async waitForProofFetch() {
|
|
210
|
+
if (this.proofOrPromise instanceof Promise) {
|
|
211
|
+
await this.proofOrPromise;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Sign the given message using Keyless.
|
|
217
|
+
* @param message in HexInput format
|
|
218
|
+
* @returns Signature
|
|
219
|
+
*/
|
|
220
|
+
sign(data: HexInput): KeylessSignature {
|
|
221
|
+
const { expiryDateSecs } = this.ephemeralKeyPair;
|
|
222
|
+
if (this.isExpired()) {
|
|
223
|
+
throw new Error("Ephemeral key pair is expired.");
|
|
224
|
+
}
|
|
225
|
+
if (this.proof === undefined) {
|
|
226
|
+
throw new Error("Proof not found");
|
|
227
|
+
}
|
|
228
|
+
if (!this.isJwtValid) {
|
|
229
|
+
throw new Error("The proof has expired. Please refetch proof");
|
|
230
|
+
}
|
|
231
|
+
const ephemeralPublicKey = this.ephemeralKeyPair.getPublicKey();
|
|
232
|
+
const ephemeralSignature = this.ephemeralKeyPair.sign(data);
|
|
233
|
+
|
|
234
|
+
return new KeylessSignature({
|
|
235
|
+
jwtHeader: base64UrlDecode(this.jwt.split(".")[0]),
|
|
236
|
+
ephemeralCertificate: new EphemeralCertificate(this.proof, EphemeralCertificateVariant.ZkProof),
|
|
237
|
+
expiryDateSecs,
|
|
238
|
+
ephemeralPublicKey,
|
|
239
|
+
ephemeralSignature,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Sign the given transaction with Keyless.
|
|
245
|
+
* Signs the transaction and proof to guard against proof malleability.
|
|
246
|
+
* @param transaction the transaction to be signed
|
|
247
|
+
* @returns KeylessSignature
|
|
248
|
+
*/
|
|
249
|
+
signTransaction(transaction: AnyRawTransaction): KeylessSignature {
|
|
250
|
+
if (this.proof === undefined) {
|
|
251
|
+
throw new Error("Proof not found");
|
|
252
|
+
}
|
|
253
|
+
const raw = deriveTransactionType(transaction);
|
|
254
|
+
const txnAndProof = new TransactionAndProof(raw, this.proof.proof);
|
|
255
|
+
const signMess = generateSigningMessageForSerializable(txnAndProof);
|
|
256
|
+
return this.sign(signMess);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this
|
|
260
|
+
verifySignature(args: { message: HexInput; signature: Signature }): boolean {
|
|
261
|
+
throw new Error("Not implemented");
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
static fromBytes(bytes: Uint8Array): KeylessAccount {
|
|
265
|
+
return KeylessAccount.deserialize(new Deserializer(bytes));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
static fromJWTAndProof(args: {
|
|
269
|
+
proof: ZeroKnowledgeSig | Promise<ZeroKnowledgeSig>;
|
|
270
|
+
jwt: string;
|
|
271
|
+
ephemeralKeyPair: EphemeralKeyPair;
|
|
272
|
+
pepper: HexInput;
|
|
273
|
+
uidKey?: string;
|
|
274
|
+
proofFetchCallback?: ProofFetchCallback;
|
|
275
|
+
}): KeylessAccount {
|
|
276
|
+
const { proof, jwt, ephemeralKeyPair, pepper, proofFetchCallback } = args;
|
|
277
|
+
const uidKey = args.uidKey ?? "sub";
|
|
278
|
+
|
|
279
|
+
const jwtPayload = jwtDecode<JwtPayload & { [key: string]: string }>(jwt);
|
|
280
|
+
const iss = jwtPayload.iss!;
|
|
281
|
+
if (typeof jwtPayload.aud !== "string") {
|
|
282
|
+
throw new Error("aud was not found or an array of values");
|
|
283
|
+
}
|
|
284
|
+
const aud = jwtPayload.aud!;
|
|
285
|
+
const uidVal = jwtPayload[uidKey];
|
|
286
|
+
return new KeylessAccount({
|
|
287
|
+
proofOrFetcher: proof,
|
|
288
|
+
ephemeralKeyPair,
|
|
289
|
+
iss,
|
|
290
|
+
uidKey,
|
|
291
|
+
uidVal,
|
|
292
|
+
aud,
|
|
293
|
+
pepper,
|
|
294
|
+
jwt,
|
|
295
|
+
proofFetchCallback,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
class TransactionAndProof extends Serializable {
|
|
301
|
+
transaction: AnyRawTransactionInstance;
|
|
302
|
+
|
|
303
|
+
proof?: ZkProof;
|
|
304
|
+
|
|
305
|
+
constructor(transaction: AnyRawTransactionInstance, proof?: ZkProof) {
|
|
306
|
+
super();
|
|
307
|
+
this.transaction = transaction;
|
|
308
|
+
this.proof = proof;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
serialize(serializer: Serializer): void {
|
|
312
|
+
serializer.serializeFixedBytes(this.transaction.bcsToBytes());
|
|
313
|
+
serializer.serializeOption(this.proof);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function base64UrlDecode(base64Url: string): string {
|
|
318
|
+
// Replace base64url-specific characters
|
|
319
|
+
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
|
|
320
|
+
// Pad the string with '=' characters if needed
|
|
321
|
+
const paddedBase64 = base64 + "==".substring(0, (3 - (base64.length % 3)) % 3);
|
|
322
|
+
// Decode the base64 string using the base-64 library
|
|
323
|
+
const decodedString = decode(paddedBase64);
|
|
324
|
+
return decodedString;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export type ProofFetchSuccess = {
|
|
328
|
+
status: "Success";
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
export type ProofFetchFailure = {
|
|
332
|
+
status: "Failed";
|
|
333
|
+
error: string;
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
export type ProofFetchStatus = ProofFetchSuccess | ProofFetchFailure;
|
|
337
|
+
|
|
338
|
+
export type ProofFetchCallback = (status: ProofFetchStatus) => Promise<void>;
|
|
339
|
+
|
|
340
|
+
export interface ProofFetchEvents {
|
|
341
|
+
proofFetchFinish: (status: ProofFetchStatus) => void;
|
|
342
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Copyright © Aptos Foundation
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { Account } from "./Account";
|
|
5
|
+
import { MultiKey, MultiKeySignature, PublicKey } from "../core/crypto";
|
|
6
|
+
import { AccountAddress } from "../core/accountAddress";
|
|
7
|
+
import { HexInput, SigningScheme } from "../types";
|
|
8
|
+
import { AccountAuthenticatorMultiKey } from "../transactions/authenticator/account";
|
|
9
|
+
import { AnyRawTransaction } from "../transactions/types";
|
|
10
|
+
import { KeylessAccount } from "./KeylessAccount";
|
|
11
|
+
|
|
12
|
+
export interface VerifyMultiKeySignatureArgs {
|
|
13
|
+
message: HexInput;
|
|
14
|
+
signature: MultiKeySignature;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Signer implementation for the MultiKey authentication scheme.
|
|
19
|
+
*
|
|
20
|
+
* This accounts to use a M of N signing scheme. M and N are specified in the {@link MultiKey}
|
|
21
|
+
* It signs messages via the array of M number of Accounts that individually correspond to a public key in the {@link MultiKey}.
|
|
22
|
+
*
|
|
23
|
+
* Note: Generating a signer instance does not create the account on-chain.
|
|
24
|
+
*/
|
|
25
|
+
export class MultiKeyAccount implements Account {
|
|
26
|
+
/**
|
|
27
|
+
* Public key associated with the account
|
|
28
|
+
*/
|
|
29
|
+
readonly publicKey: MultiKey;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Account address associated with the account
|
|
33
|
+
*/
|
|
34
|
+
readonly accountAddress: AccountAddress;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Signing scheme used to sign transactions
|
|
38
|
+
*/
|
|
39
|
+
readonly signingScheme: SigningScheme;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The signers used to sign messages. These signers should correspond to public keys in the
|
|
43
|
+
* MultiKeyAccount's public key. The number of signers should be equal or greater
|
|
44
|
+
* than this.publicKey.signaturesRequired
|
|
45
|
+
*/
|
|
46
|
+
readonly signers: Account[];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* An array of indicies where for signer[i], signerIndicies[i] is the index of the corresponding public key in
|
|
50
|
+
* publicKey.publicKeys. Used to derive the right public key to use for verification.
|
|
51
|
+
*/
|
|
52
|
+
readonly signerIndicies: number[];
|
|
53
|
+
|
|
54
|
+
readonly signaturesBitmap: Uint8Array;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* constructor for MultiKeyAccount
|
|
58
|
+
*
|
|
59
|
+
* @param args.multiKey the multikey of the account which consists of N public keys and a number M which is
|
|
60
|
+
* the number of required signatures.
|
|
61
|
+
* @param args.signers an array of M signers that will be used to sign the transaction
|
|
62
|
+
* @returns MultiKeyAccount
|
|
63
|
+
*/
|
|
64
|
+
constructor(args: { multiKey: MultiKey; signers: Account[] }) {
|
|
65
|
+
const { multiKey, signers } = args;
|
|
66
|
+
|
|
67
|
+
this.publicKey = multiKey;
|
|
68
|
+
this.signingScheme = SigningScheme.MultiKey;
|
|
69
|
+
|
|
70
|
+
this.accountAddress = this.publicKey.authKey().derivedAddress();
|
|
71
|
+
|
|
72
|
+
// Get the index of each respective signer in the bitmap
|
|
73
|
+
const bitPositions: number[] = [];
|
|
74
|
+
for (const signer of signers) {
|
|
75
|
+
bitPositions.push(this.publicKey.getIndex(signer.publicKey));
|
|
76
|
+
}
|
|
77
|
+
// Zip signers and bit positions and sort signers by bit positions in order
|
|
78
|
+
// to ensure the signature is signed in ascending order according to the bitmap.
|
|
79
|
+
// Authentication on chain will fail otherwise.
|
|
80
|
+
const signersAndBitPosition: [Account, number][] = signers.map((signer, index) => [signer, bitPositions[index]]);
|
|
81
|
+
signersAndBitPosition.sort((a, b) => a[1] - b[1]);
|
|
82
|
+
this.signers = signersAndBitPosition.map((value) => value[0]);
|
|
83
|
+
this.signerIndicies = signersAndBitPosition.map((value) => value[1]);
|
|
84
|
+
this.signaturesBitmap = this.publicKey.createBitmap({ bits: bitPositions });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Static constructor for MultiKeyAccount
|
|
89
|
+
*
|
|
90
|
+
* @param args.publicKeys the N public keys of the MultiKeyAccount
|
|
91
|
+
* @param args.signaturesRequired the number of signatures required
|
|
92
|
+
* @param args.signers an array of M signers that will be used to sign the transaction
|
|
93
|
+
* @returns MultiKeyAccount
|
|
94
|
+
*/
|
|
95
|
+
static fromPublicKeysAndSigners(args: {
|
|
96
|
+
publicKeys: PublicKey[];
|
|
97
|
+
signaturesRequired: number;
|
|
98
|
+
signers: Account[];
|
|
99
|
+
}): MultiKeyAccount {
|
|
100
|
+
const { publicKeys, signaturesRequired, signers } = args;
|
|
101
|
+
const multiKey = new MultiKey({ publicKeys, signaturesRequired });
|
|
102
|
+
return new MultiKeyAccount({ multiKey, signers });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
static isMultiKeySigner(account: Account): account is MultiKeyAccount {
|
|
106
|
+
return account instanceof MultiKeyAccount;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Sign a message using the account's signers.
|
|
111
|
+
* @param message the signing message, as binary input
|
|
112
|
+
* @return the AccountAuthenticator containing the signature, together with the account's public key
|
|
113
|
+
*/
|
|
114
|
+
signWithAuthenticator(message: HexInput): AccountAuthenticatorMultiKey {
|
|
115
|
+
return new AccountAuthenticatorMultiKey(this.publicKey, this.sign(message));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Sign a transaction using the account's signers.
|
|
120
|
+
* @param transaction the raw transaction
|
|
121
|
+
* @return the AccountAuthenticator containing the signature of the transaction, together with the account's public key
|
|
122
|
+
*/
|
|
123
|
+
signTransactionWithAuthenticator(transaction: AnyRawTransaction): AccountAuthenticatorMultiKey {
|
|
124
|
+
return new AccountAuthenticatorMultiKey(this.publicKey, this.signTransaction(transaction));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Waits for any proofs to be fetched
|
|
129
|
+
* @return
|
|
130
|
+
*/
|
|
131
|
+
async waitForProofFetch() {
|
|
132
|
+
const keylessSigners = this.signers.filter((signer) => signer instanceof KeylessAccount) as KeylessAccount[];
|
|
133
|
+
await Promise.all(keylessSigners.filter((signer) => signer.proof instanceof Promise).map((signer) => signer.proof));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Sign the given message using the MultiKeyAccount's signers
|
|
138
|
+
* @param message in HexInput format
|
|
139
|
+
* @returns MultiKeySignature
|
|
140
|
+
*/
|
|
141
|
+
sign(data: HexInput): MultiKeySignature {
|
|
142
|
+
const signatures = [];
|
|
143
|
+
for (const signer of this.signers) {
|
|
144
|
+
signatures.push(signer.sign(data));
|
|
145
|
+
}
|
|
146
|
+
return new MultiKeySignature({ signatures, bitmap: this.signaturesBitmap });
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Sign the given transaction using the MultiKeyAccount's signers
|
|
151
|
+
* @param transaction the transaction to be signed
|
|
152
|
+
* @returns MultiKeySignature
|
|
153
|
+
*/
|
|
154
|
+
signTransaction(transaction: AnyRawTransaction): MultiKeySignature {
|
|
155
|
+
const signatures = [];
|
|
156
|
+
for (const signer of this.signers) {
|
|
157
|
+
signatures.push(signer.signTransaction(transaction));
|
|
158
|
+
}
|
|
159
|
+
return new MultiKeySignature({ signatures, bitmap: this.signaturesBitmap });
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Verify the given message and signature with the public key.
|
|
164
|
+
*
|
|
165
|
+
* @param args.message raw message data in HexInput format
|
|
166
|
+
* @param args.signatures signed message MultiKeySignature
|
|
167
|
+
* @returns boolean
|
|
168
|
+
*/
|
|
169
|
+
verifySignature(args: VerifyMultiKeySignatureArgs): boolean {
|
|
170
|
+
const { message, signature } = args;
|
|
171
|
+
const isSignerIndiciesSorted = this.signerIndicies.every(
|
|
172
|
+
(value, i) => i === 0 || value >= this.signerIndicies[i - 1],
|
|
173
|
+
);
|
|
174
|
+
if (!isSignerIndiciesSorted) {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
for (let i = 0; i < signature.signatures.length; i += 1) {
|
|
178
|
+
const singleSignature = signature.signatures[i];
|
|
179
|
+
const publicKey = this.publicKey.publicKeys[this.signerIndicies[i]];
|
|
180
|
+
if (!publicKey.verifySignature({ message, signature: singleSignature })) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
}
|