@aeternity/aepp-sdk 10.0.0 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +15 -14
- package/dist/aepp-sdk.browser-script.js +1 -1
- package/dist/aepp-sdk.browser-script.js.LICENSE.txt +13 -40
- package/dist/aepp-sdk.browser-script.js.map +1 -1
- package/dist/aepp-sdk.browser.js +1 -1
- package/dist/aepp-sdk.browser.js.map +1 -1
- package/dist/aepp-sdk.js +1 -1
- package/dist/aepp-sdk.js.map +1 -1
- package/es/AeSdk.d.ts +37 -0
- package/es/AeSdk.mjs +81 -0
- package/es/AeSdk.mjs.map +1 -0
- package/es/AeSdkAepp.d.ts +69 -0
- package/es/AeSdkAepp.mjs +175 -0
- package/es/AeSdkAepp.mjs.map +1 -0
- package/es/AeSdkBase.d.ts +212 -0
- package/es/AeSdkBase.mjs +310 -0
- package/es/AeSdkBase.mjs.map +1 -0
- package/es/AeSdkWallet.d.ts +103 -0
- package/es/AeSdkWallet.mjs +322 -0
- package/es/AeSdkWallet.mjs.map +1 -0
- package/es/Node.d.ts +44 -0
- package/es/Node.mjs +141 -0
- package/es/Node.mjs.map +1 -0
- package/es/account/Base.d.ts +65 -0
- package/es/account/Base.mjs +123 -0
- package/es/account/Base.mjs.map +1 -0
- package/es/account/Memory.d.ts +25 -0
- package/es/account/Memory.mjs +81 -0
- package/es/account/Memory.mjs.map +1 -0
- package/es/account/Rpc.d.ts +27 -0
- package/es/account/Rpc.mjs +79 -0
- package/es/account/Rpc.mjs.map +1 -0
- package/es/aens.d.ts +209 -0
- package/es/aens.mjs +332 -0
- package/es/aens.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection/Browser.d.ts +32 -0
- package/es/aepp-wallet-communication/connection/Browser.mjs +70 -0
- package/es/aepp-wallet-communication/connection/Browser.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection/BrowserRuntime.d.ts +17 -0
- package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs +57 -0
- package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection/BrowserWindowMessage.d.ts +35 -0
- package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs +142 -0
- package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs.map +1 -0
- package/es/aepp-wallet-communication/connection-proxy.d.ts +10 -0
- package/{src/utils/crypto-ts.ts → es/aepp-wallet-communication/connection-proxy.mjs} +15 -11
- package/es/aepp-wallet-communication/connection-proxy.mjs.map +1 -0
- package/es/aepp-wallet-communication/rpc/RpcClient.d.ts +33 -0
- package/es/aepp-wallet-communication/rpc/RpcClient.mjs +169 -0
- package/es/aepp-wallet-communication/rpc/RpcClient.mjs.map +1 -0
- package/es/aepp-wallet-communication/rpc/types.d.ts +77 -0
- package/es/aepp-wallet-communication/rpc/types.mjs +3 -0
- package/es/aepp-wallet-communication/rpc/types.mjs.map +1 -0
- package/es/aepp-wallet-communication/schema.d.ts +118 -0
- package/es/aepp-wallet-communication/schema.mjs +214 -0
- package/es/aepp-wallet-communication/schema.mjs.map +1 -0
- package/es/aepp-wallet-communication/wallet-detector.d.ts +24 -0
- package/es/aepp-wallet-communication/wallet-detector.mjs +63 -0
- package/es/aepp-wallet-communication/wallet-detector.mjs.map +1 -0
- package/es/apis/compiler/compiler.d.ts +92 -0
- package/es/apis/compiler/compiler.mjs +576 -0
- package/es/apis/compiler/compiler.mjs.map +1 -0
- package/es/apis/compiler/index.d.ts +2 -0
- package/es/apis/compiler/index.mjs +3 -0
- package/es/apis/compiler/index.mjs.map +1 -0
- package/es/apis/compiler/models/index.d.ts +248 -0
- package/es/apis/compiler/models/index.mjs +48 -0
- package/es/apis/compiler/models/index.mjs.map +1 -0
- package/es/apis/compiler/models/mappers.d.ts +23 -0
- package/es/apis/compiler/models/mappers.mjs +585 -0
- package/es/apis/compiler/models/mappers.mjs.map +1 -0
- package/es/apis/compiler/models/parameters.d.ts +13 -0
- package/es/apis/compiler/models/parameters.mjs +71 -0
- package/es/apis/compiler/models/parameters.mjs.map +1 -0
- package/es/apis/node/index.d.ts +2 -0
- package/es/apis/node/index.mjs +3 -0
- package/es/apis/node/index.mjs.map +1 -0
- package/es/apis/node/models/index.d.ts +1061 -0
- package/es/apis/node/models/index.mjs +2 -0
- package/es/apis/node/models/index.mjs.map +1 -0
- package/es/apis/node/models/mappers.d.ts +95 -0
- package/es/apis/node/models/mappers.mjs +4164 -0
- package/es/apis/node/models/mappers.mjs.map +1 -0
- package/es/apis/node/models/parameters.d.ts +17 -0
- package/es/apis/node/models/parameters.mjs +165 -0
- package/es/apis/node/models/parameters.mjs.map +1 -0
- package/es/apis/node/node.d.ts +215 -0
- package/es/apis/node/node.mjs +1165 -0
- package/es/apis/node/node.mjs.map +1 -0
- package/es/chain.d.ts +220 -0
- package/es/chain.mjs +524 -0
- package/es/chain.mjs.map +1 -0
- package/es/channel/handlers.d.ts +34 -0
- package/es/channel/{handlers.js → handlers.mjs} +163 -130
- package/es/channel/handlers.mjs.map +1 -0
- package/es/channel/index.d.ts +634 -0
- package/es/channel/index.mjs +978 -0
- package/es/channel/index.mjs.map +1 -0
- package/es/channel/internal.d.ts +100 -0
- package/es/channel/internal.mjs +328 -0
- package/es/channel/internal.mjs.map +1 -0
- package/es/contract/Compiler.d.ts +17 -0
- package/es/contract/Compiler.mjs +67 -0
- package/es/contract/Compiler.mjs.map +1 -0
- package/es/contract/aci.d.ts +125 -0
- package/es/contract/aci.mjs +496 -0
- package/es/contract/aci.mjs.map +1 -0
- package/es/contract/ga.d.ts +68 -0
- package/es/contract/ga.mjs +190 -0
- package/es/contract/ga.mjs.map +1 -0
- package/es/contract/methods.d.ts +68 -0
- package/es/contract/methods.mjs +101 -0
- package/es/contract/methods.mjs.map +1 -0
- package/es/index.d.ts +32 -0
- package/es/index.mjs +49 -0
- package/es/index.mjs.map +1 -0
- package/es/oracle.d.ts +154 -0
- package/es/oracle.mjs +288 -0
- package/es/oracle.mjs.map +1 -0
- package/es/spend.d.ts +61 -0
- package/es/spend.mjs +122 -0
- package/es/spend.mjs.map +1 -0
- package/es/tx/builder/constants.d.ts +41 -0
- package/es/tx/builder/constants.mjs +100 -0
- package/es/tx/builder/constants.mjs.map +1 -0
- package/es/tx/builder/field-types.d.ts +62 -0
- package/es/tx/builder/field-types.mjs +126 -0
- package/es/tx/builder/field-types.mjs.map +1 -0
- package/es/tx/builder/helpers.d.ts +131 -0
- package/es/tx/builder/helpers.mjs +223 -0
- package/es/tx/builder/helpers.mjs.map +1 -0
- package/es/tx/builder/index.d.ts +75 -0
- package/es/tx/builder/index.mjs +424 -0
- package/es/tx/builder/index.mjs.map +1 -0
- package/es/tx/builder/schema.d.ts +350 -0
- package/es/tx/builder/schema.mjs +320 -0
- package/es/tx/builder/schema.mjs.map +1 -0
- package/es/tx/index.d.ts +63 -0
- package/es/tx/index.mjs +209 -0
- package/es/tx/index.mjs.map +1 -0
- package/es/tx/min-fee.d.ts +20 -0
- package/es/tx/min-fee.mjs +148 -0
- package/es/tx/min-fee.mjs.map +1 -0
- package/es/tx/validator.d.ts +19 -0
- package/es/tx/validator.mjs +240 -0
- package/es/tx/validator.mjs.map +1 -0
- package/es/typings/@aeternity__argon2-browser/index.d.mjs +2 -0
- package/es/typings/@aeternity__argon2-browser/index.d.mjs.map +1 -0
- package/es/typings/@aeternity__uuid/index.d.mjs +2 -0
- package/es/typings/@aeternity__uuid/index.d.mjs.map +1 -0
- package/es/typings/bip32-path/index.d.mjs +2 -0
- package/es/typings/bip32-path/index.d.mjs.map +1 -0
- package/es/typings/blakejs/index.d.mjs +2 -0
- package/es/typings/blakejs/index.d.mjs.map +1 -0
- package/es/typings/tweetnacl-auth/index.d.mjs +2 -0
- package/es/typings/tweetnacl-auth/index.d.mjs.map +1 -0
- package/es/utils/amount-formatter.d.ts +42 -0
- package/es/utils/{amount-formatter.js → amount-formatter.mjs} +38 -44
- package/es/utils/amount-formatter.mjs.map +1 -0
- package/es/utils/autorest.d.ts +6 -0
- package/es/utils/autorest.mjs +97 -0
- package/es/utils/autorest.mjs.map +1 -0
- package/es/utils/bignumber.d.ts +13 -0
- package/es/utils/bignumber.mjs +23 -0
- package/es/utils/bignumber.mjs.map +1 -0
- package/es/{bytes.d.ts → utils/bytes.d.ts} +10 -13
- package/es/utils/{bytes.js → bytes.mjs} +26 -22
- package/es/utils/bytes.mjs.map +1 -0
- package/es/utils/crypto.d.ts +103 -0
- package/es/utils/crypto.mjs +221 -0
- package/es/utils/crypto.mjs.map +1 -0
- package/es/utils/encoder.d.ts +26 -0
- package/es/utils/encoder.mjs +102 -0
- package/es/utils/encoder.mjs.map +1 -0
- package/es/utils/errors.d.ts +481 -0
- package/es/utils/errors.mjs +882 -0
- package/es/utils/errors.mjs.map +1 -0
- package/es/utils/hd-wallet.d.ts +34 -0
- package/es/utils/hd-wallet.mjs +122 -0
- package/es/utils/hd-wallet.mjs.map +1 -0
- package/es/utils/json-big.d.ts +5 -0
- package/es/utils/json-big.mjs +41 -0
- package/es/utils/json-big.mjs.map +1 -0
- package/es/utils/keystore.d.ts +51 -0
- package/es/utils/keystore.mjs +145 -0
- package/es/utils/keystore.mjs.map +1 -0
- package/es/{mptree.d.ts → utils/mptree.d.ts} +5 -8
- package/es/utils/{mptree.js → mptree.mjs} +33 -25
- package/es/utils/mptree.mjs.map +1 -0
- package/es/utils/other.d.ts +14 -0
- package/es/utils/other.mjs +28 -0
- package/es/utils/other.mjs.map +1 -0
- package/es/{semver-satisfies.d.ts → utils/semver-satisfies.d.ts} +0 -0
- package/es/utils/{semver-satisfies.js → semver-satisfies.mjs} +1 -1
- package/es/utils/semver-satisfies.mjs.map +1 -0
- package/es/utils/string.d.ts +24 -0
- package/es/utils/{string.js → string.mjs} +9 -11
- package/es/utils/string.mjs.map +1 -0
- package/package.json +67 -64
- package/src/AeSdk.ts +65 -0
- package/src/AeSdkAepp.ts +167 -0
- package/src/AeSdkBase.ts +320 -0
- package/src/AeSdkWallet.ts +332 -0
- package/src/Node.ts +167 -0
- package/src/account/Base.ts +114 -0
- package/src/account/Memory.ts +83 -0
- package/src/account/Rpc.ts +67 -0
- package/src/aens.ts +391 -0
- package/src/aepp-wallet-communication/connection/Browser.ts +68 -0
- package/src/aepp-wallet-communication/connection/BrowserRuntime.ts +58 -0
- package/src/aepp-wallet-communication/connection/BrowserWindowMessage.ts +111 -0
- package/{es/utils/crypto-ts.js → src/aepp-wallet-communication/connection-proxy.ts} +16 -9
- package/src/aepp-wallet-communication/rpc/RpcClient.ts +137 -0
- package/src/aepp-wallet-communication/rpc/types.ts +66 -0
- package/src/aepp-wallet-communication/schema.ts +181 -0
- package/src/aepp-wallet-communication/wallet-detector.ts +71 -0
- package/src/apis/compiler/code-model-v4.yaml +2649 -0
- package/src/apis/compiler/compiler.ts +585 -0
- package/src/apis/compiler/index.ts +2 -0
- package/src/apis/compiler/models/index.ts +301 -0
- package/src/apis/compiler/models/mappers.ts +583 -0
- package/src/apis/compiler/models/parameters.ts +93 -0
- package/src/apis/node/code-model-v4.yaml +10046 -0
- package/src/apis/node/index.ts +2 -0
- package/src/apis/node/models/index.ts +1253 -0
- package/src/apis/node/models/mappers.ts +4278 -0
- package/src/apis/node/models/parameters.ts +188 -0
- package/src/apis/node/node.ts +1299 -0
- package/src/chain.ts +444 -0
- package/src/channel/{handlers.js → handlers.ts} +238 -143
- package/src/channel/index.ts +991 -0
- package/src/channel/internal.ts +345 -0
- package/src/contract/Compiler.ts +66 -0
- package/src/contract/aci.ts +529 -0
- package/src/contract/ga.ts +178 -0
- package/src/contract/methods.ts +118 -0
- package/src/index.ts +51 -0
- package/src/oracle.ts +342 -0
- package/src/spend.ts +152 -0
- package/src/tx/builder/constants.ts +96 -0
- package/src/tx/builder/field-types.ts +111 -0
- package/src/tx/builder/helpers.ts +253 -0
- package/src/tx/builder/index.ts +394 -0
- package/src/tx/builder/schema.ts +771 -0
- package/src/tx/index.ts +199 -0
- package/src/tx/min-fee.ts +136 -0
- package/src/tx/validator.ts +226 -0
- package/src/typings/@aeternity__argon2-browser/index.d.ts +3 -0
- package/src/typings/@aeternity__uuid/index.d.ts +3 -0
- package/src/typings/bip32-path/index.d.ts +33 -0
- package/src/typings/tweetnacl-auth/index.d.ts +14 -0
- package/src/utils/amount-formatter.ts +29 -41
- package/src/utils/autorest.ts +90 -0
- package/src/utils/bignumber.ts +9 -19
- package/src/utils/bytes.ts +15 -16
- package/src/utils/crypto.ts +217 -0
- package/src/utils/encoder.ts +98 -0
- package/src/utils/errors.ts +817 -0
- package/src/utils/hd-wallet.ts +134 -0
- package/src/utils/json-big.ts +26 -0
- package/src/utils/keystore.ts +179 -0
- package/src/utils/mptree.ts +26 -20
- package/src/utils/other.ts +28 -43
- package/src/utils/string.ts +8 -10
- package/CHANGELOG.md +0 -1603
- package/es/account/base.js +0 -169
- package/es/account/base.js.map +0 -1
- package/es/account/memory.js +0 -84
- package/es/account/memory.js.map +0 -1
- package/es/account/multiple.js +0 -178
- package/es/account/multiple.js.map +0 -1
- package/es/ae/aens.js +0 -408
- package/es/ae/aens.js.map +0 -1
- package/es/ae/aepp.js +0 -45
- package/es/ae/aepp.js.map +0 -1
- package/es/ae/contract.js +0 -312
- package/es/ae/contract.js.map +0 -1
- package/es/ae/index.js +0 -206
- package/es/ae/index.js.map +0 -1
- package/es/ae/oracle.js +0 -322
- package/es/ae/oracle.js.map +0 -1
- package/es/ae/universal.js +0 -45
- package/es/ae/universal.js.map +0 -1
- package/es/ae/wallet.js +0 -50
- package/es/ae/wallet.js.map +0 -1
- package/es/amount-formatter.d.ts +0 -58
- package/es/bignumber.d.ts +0 -24
- package/es/chain/index.js +0 -256
- package/es/chain/index.js.map +0 -1
- package/es/chain/node.js +0 -394
- package/es/chain/node.js.map +0 -1
- package/es/channel/handlers.js.map +0 -1
- package/es/channel/index.js +0 -980
- package/es/channel/index.js.map +0 -1
- package/es/channel/internal.js +0 -266
- package/es/channel/internal.js.map +0 -1
- package/es/contract/aci/helpers.js +0 -298
- package/es/contract/aci/helpers.js.map +0 -1
- package/es/contract/aci/index.js +0 -361
- package/es/contract/aci/index.js.map +0 -1
- package/es/contract/aci/transformation.js +0 -66
- package/es/contract/aci/transformation.js.map +0 -1
- package/es/contract/compiler.js +0 -244
- package/es/contract/compiler.js.map +0 -1
- package/es/contract/ga/helpers.js +0 -22
- package/es/contract/ga/helpers.js.map +0 -1
- package/es/contract/ga/index.js +0 -170
- package/es/contract/ga/index.js.map +0 -1
- package/es/contract/index.js +0 -162
- package/es/contract/index.js.map +0 -1
- package/es/crypto-ts.d.ts +0 -9
- package/es/index.js +0 -57
- package/es/index.js.map +0 -1
- package/es/node-pool/index.js +0 -187
- package/es/node-pool/index.js.map +0 -1
- package/es/node.js +0 -132
- package/es/node.js.map +0 -1
- package/es/other.d.ts +0 -31
- package/es/string.d.ts +0 -26
- package/es/tx/builder/helpers.js +0 -305
- package/es/tx/builder/helpers.js.map +0 -1
- package/es/tx/builder/index.js +0 -595
- package/es/tx/builder/index.js.map +0 -1
- package/es/tx/builder/schema.js +0 -814
- package/es/tx/builder/schema.js.map +0 -1
- package/es/tx/index.js +0 -300
- package/es/tx/index.js.map +0 -1
- package/es/tx/tx-object.js +0 -276
- package/es/tx/tx-object.js.map +0 -1
- package/es/tx/tx.js +0 -937
- package/es/tx/tx.js.map +0 -1
- package/es/tx/validator.js +0 -208
- package/es/tx/validator.js.map +0 -1
- package/es/typings/blakejs/index.d.js +0 -2
- package/es/typings/blakejs/index.d.js.map +0 -1
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.js +0 -131
- package/es/utils/aepp-wallet-communication/connection/browser-runtime.js.map +0 -1
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.js +0 -184
- package/es/utils/aepp-wallet-communication/connection/browser-window-message.js.map +0 -1
- package/es/utils/aepp-wallet-communication/connection/index.js +0 -84
- package/es/utils/aepp-wallet-communication/connection/index.js.map +0 -1
- package/es/utils/aepp-wallet-communication/content-script-bridge.js +0 -97
- package/es/utils/aepp-wallet-communication/content-script-bridge.js.map +0 -1
- package/es/utils/aepp-wallet-communication/helpers.js +0 -103
- package/es/utils/aepp-wallet-communication/helpers.js.map +0 -1
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js +0 -329
- package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js.map +0 -1
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.js +0 -270
- package/es/utils/aepp-wallet-communication/rpc/rpc-client.js.map +0 -1
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js +0 -533
- package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js.map +0 -1
- package/es/utils/aepp-wallet-communication/schema.js +0 -107
- package/es/utils/aepp-wallet-communication/schema.js.map +0 -1
- package/es/utils/aepp-wallet-communication/wallet-detector.js +0 -109
- package/es/utils/aepp-wallet-communication/wallet-detector.js.map +0 -1
- package/es/utils/amount-formatter.js.map +0 -1
- package/es/utils/async-init.js +0 -67
- package/es/utils/async-init.js.map +0 -1
- package/es/utils/bignumber.js +0 -28
- package/es/utils/bignumber.js.map +0 -1
- package/es/utils/bytes.js.map +0 -1
- package/es/utils/crypto-ts.js.map +0 -1
- package/es/utils/crypto.js +0 -304
- package/es/utils/crypto.js.map +0 -1
- package/es/utils/hd-wallet.js +0 -112
- package/es/utils/hd-wallet.js.map +0 -1
- package/es/utils/json-big.js +0 -45
- package/es/utils/json-big.js.map +0 -1
- package/es/utils/keystore.js +0 -228
- package/es/utils/keystore.js.map +0 -1
- package/es/utils/mptree.js.map +0 -1
- package/es/utils/other.js +0 -43
- package/es/utils/other.js.map +0 -1
- package/es/utils/semver-satisfies.js.map +0 -1
- package/es/utils/string.js.map +0 -1
- package/es/utils/swagger.js +0 -132
- package/es/utils/swagger.js.map +0 -1
- package/src/account/base.js +0 -153
- package/src/account/memory.js +0 -78
- package/src/account/multiple.js +0 -154
- package/src/ae/aens.js +0 -366
- package/src/ae/aepp.js +0 -45
- package/src/ae/contract.js +0 -285
- package/src/ae/index.js +0 -167
- package/src/ae/oracle.js +0 -296
- package/src/ae/universal.js +0 -47
- package/src/ae/wallet.js +0 -50
- package/src/chain/index.js +0 -250
- package/src/chain/node.js +0 -293
- package/src/channel/index.js +0 -898
- package/src/channel/internal.js +0 -231
- package/src/contract/aci/index.js +0 -317
- package/src/contract/aci/transformation.js +0 -72
- package/src/contract/compiler.js +0 -195
- package/src/contract/ga/helpers.js +0 -17
- package/src/contract/ga/index.js +0 -147
- package/src/contract/index.js +0 -163
- package/src/index.js +0 -90
- package/src/node-pool/index.js +0 -171
- package/src/node.js +0 -118
- package/src/tx/builder/helpers.js +0 -325
- package/src/tx/builder/index.js +0 -460
- package/src/tx/builder/schema.js +0 -1211
- package/src/tx/index.js +0 -301
- package/src/tx/tx-object.js +0 -186
- package/src/tx/tx.js +0 -622
- package/src/tx/validator.js +0 -161
- package/src/utils/aepp-wallet-communication/connection/browser-runtime.js +0 -114
- package/src/utils/aepp-wallet-communication/connection/browser-window-message.js +0 -161
- package/src/utils/aepp-wallet-communication/connection/index.js +0 -85
- package/src/utils/aepp-wallet-communication/content-script-bridge.js +0 -85
- package/src/utils/aepp-wallet-communication/helpers.js +0 -70
- package/src/utils/aepp-wallet-communication/rpc/aepp-rpc.js +0 -268
- package/src/utils/aepp-wallet-communication/rpc/rpc-client.js +0 -223
- package/src/utils/aepp-wallet-communication/rpc/wallet-rpc.js +0 -390
- package/src/utils/aepp-wallet-communication/schema.js +0 -108
- package/src/utils/aepp-wallet-communication/wallet-detector.js +0 -91
- package/src/utils/async-init.js +0 -41
- package/src/utils/crypto.js +0 -312
- package/src/utils/hd-wallet.js +0 -115
- package/src/utils/json-big.js +0 -26
- package/src/utils/keystore.js +0 -223
- package/src/utils/swagger.js +0 -133
package/src/tx/index.ts
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ISC License (ISC)
|
|
3
|
+
* Copyright (c) 2022 aeternity developers
|
|
4
|
+
*
|
|
5
|
+
* Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
* purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
* copyright notice and this permission notice appear in all copies.
|
|
8
|
+
*
|
|
9
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
|
+
* PERFORMANCE OF THIS SOFTWARE.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Transaction methods
|
|
20
|
+
*
|
|
21
|
+
* This is implementation of [Tx](api/tx.md) relays
|
|
22
|
+
* the creation of transactions to {@link Node}.
|
|
23
|
+
* These methods provide ability to create native transactions.
|
|
24
|
+
*/
|
|
25
|
+
import {
|
|
26
|
+
ABI_VERSIONS, CtVersion, PROTOCOL_VM_ABI, TX_TYPE, TX_TTL, TxParamsCommon
|
|
27
|
+
} from './builder/schema'
|
|
28
|
+
import {
|
|
29
|
+
ArgumentError, UnsupportedProtocolError, UnknownTxError, InvalidTxParamsError
|
|
30
|
+
} from '../utils/errors'
|
|
31
|
+
import BigNumber from 'bignumber.js'
|
|
32
|
+
import Node from '../Node'
|
|
33
|
+
import { EncodedData } from '../utils/encoder'
|
|
34
|
+
import { buildTx as syncBuildTx, unpackTx } from './builder/index'
|
|
35
|
+
import calculateMinFee from './min-fee'
|
|
36
|
+
import { isKeyOfObject } from '../utils/other'
|
|
37
|
+
import { AE_AMOUNT_FORMATS } from '../utils/amount-formatter'
|
|
38
|
+
|
|
39
|
+
type Int = number | string | BigNumber
|
|
40
|
+
|
|
41
|
+
// uses a new feature, probably typescript-eslint doesn't support it yet
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
43
|
+
export type BuildTxOptions <TxType extends TX_TYPE, OmitFields extends string> =
|
|
44
|
+
Omit<Parameters<typeof _buildTx<TxType>>[1], OmitFields>
|
|
45
|
+
|
|
46
|
+
// TODO: find a better name or rearrange methods
|
|
47
|
+
export async function _buildTx<TxType extends TX_TYPE> (
|
|
48
|
+
txType: TxType,
|
|
49
|
+
{ denomination, absoluteTtl, ..._params }:
|
|
50
|
+
Omit<Parameters<typeof syncBuildTx<TxType, 'tx'>>[0], 'fee' | 'nonce' | 'ttl' | 'ctVersion' | 'abiVersion'>
|
|
51
|
+
& {
|
|
52
|
+
onNode: Node
|
|
53
|
+
fee?: Int
|
|
54
|
+
nonce?: number
|
|
55
|
+
ttl?: number
|
|
56
|
+
denomination?: AE_AMOUNT_FORMATS
|
|
57
|
+
absoluteTtl?: boolean
|
|
58
|
+
}
|
|
59
|
+
& (TxType extends TX_TYPE.oracleExtend | TX_TYPE.oracleResponse ? { callerId: EncodedData<'ak'> } : {})
|
|
60
|
+
& (TxType extends TX_TYPE.contractCreate | TX_TYPE.gaAttach ? { ctVersion?: CtVersion } : {})
|
|
61
|
+
& (TxType extends TX_TYPE.contractCall | TX_TYPE.oracleRegister
|
|
62
|
+
? { abiVersion?: ABI_VERSIONS } : {})
|
|
63
|
+
): Promise<EncodedData<'tx'>> {
|
|
64
|
+
// TODO: avoid this assertion
|
|
65
|
+
const params = _params as unknown as TxParamsCommon & { onNode: Node }
|
|
66
|
+
let senderKey: keyof TxParamsCommon | '<absent>'
|
|
67
|
+
switch (txType) {
|
|
68
|
+
case TX_TYPE.spend:
|
|
69
|
+
case TX_TYPE.oracleQuery:
|
|
70
|
+
senderKey = 'senderId'
|
|
71
|
+
break
|
|
72
|
+
case TX_TYPE.nameClaim:
|
|
73
|
+
case TX_TYPE.nameUpdate:
|
|
74
|
+
case TX_TYPE.nameRevoke:
|
|
75
|
+
case TX_TYPE.nameTransfer:
|
|
76
|
+
case TX_TYPE.namePreClaim:
|
|
77
|
+
case TX_TYPE.oracleRegister:
|
|
78
|
+
senderKey = 'accountId'
|
|
79
|
+
break
|
|
80
|
+
case TX_TYPE.contractCreate:
|
|
81
|
+
case TX_TYPE.gaAttach:
|
|
82
|
+
senderKey = 'ownerId'
|
|
83
|
+
break
|
|
84
|
+
case TX_TYPE.contractCall:
|
|
85
|
+
case TX_TYPE.oracleExtend:
|
|
86
|
+
case TX_TYPE.oracleResponse:
|
|
87
|
+
senderKey = 'callerId'
|
|
88
|
+
break
|
|
89
|
+
case TX_TYPE.channelCloseSolo:
|
|
90
|
+
case TX_TYPE.channelSlash:
|
|
91
|
+
case TX_TYPE.channelSettle:
|
|
92
|
+
case TX_TYPE.channelSnapshotSolo:
|
|
93
|
+
senderKey = 'fromId'
|
|
94
|
+
break
|
|
95
|
+
case TX_TYPE.payingFor:
|
|
96
|
+
senderKey = 'payerId'
|
|
97
|
+
break
|
|
98
|
+
default:
|
|
99
|
+
throw new ArgumentError('txType', 'valid transaction type', txType)
|
|
100
|
+
}
|
|
101
|
+
// TODO: move specific cases to field-types
|
|
102
|
+
if ([TX_TYPE.contractCreate, TX_TYPE.gaAttach].includes(txType)) {
|
|
103
|
+
params.ctVersion = await getVmVersion(
|
|
104
|
+
TX_TYPE.contractCreate, { ...params, ...params.ctVersion }
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
if (txType === TX_TYPE.contractCall) {
|
|
108
|
+
params.abiVersion = (await getVmVersion(TX_TYPE.contractCall, params)).abiVersion
|
|
109
|
+
}
|
|
110
|
+
if (txType === TX_TYPE.oracleRegister) {
|
|
111
|
+
params.abiVersion ??= ABI_VERSIONS.NO_ABI
|
|
112
|
+
}
|
|
113
|
+
if (txType === TX_TYPE.payingFor) {
|
|
114
|
+
params.tx = unpackTx(params.tx)
|
|
115
|
+
}
|
|
116
|
+
const senderId = params[senderKey]
|
|
117
|
+
// TODO: do this check on TypeScript level
|
|
118
|
+
if (senderId == null) throw new InvalidTxParamsError(`Transaction field ${senderKey} is missed`)
|
|
119
|
+
const extraParams = await prepareTxParams(
|
|
120
|
+
txType, { ...params, senderId, denomination, absoluteTtl }
|
|
121
|
+
)
|
|
122
|
+
return syncBuildTx({ ...params, ...extraParams } as any, txType, { denomination }).tx
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Validated vm/abi version or get default based on transaction type and NODE version
|
|
127
|
+
*
|
|
128
|
+
* @param txType - Type of transaction
|
|
129
|
+
* @param ctVersion - Object with vm and abi version fields
|
|
130
|
+
* @returns Object with vm/abi version
|
|
131
|
+
*/
|
|
132
|
+
export async function getVmVersion (
|
|
133
|
+
txType: TX_TYPE.contractCreate, ctVersion: Partial<CtVersion> & { onNode: Node }
|
|
134
|
+
): Promise<CtVersion>
|
|
135
|
+
export async function getVmVersion (
|
|
136
|
+
txType: TX_TYPE, ctVersion: Partial<Pick<CtVersion, 'abiVersion'>> & { onNode: Node }
|
|
137
|
+
): Promise<Pick<CtVersion, 'abiVersion'>>
|
|
138
|
+
export async function getVmVersion (
|
|
139
|
+
txType: TX_TYPE, { vmVersion, abiVersion, onNode }: Partial<CtVersion> & { onNode: Node }
|
|
140
|
+
): Promise<Partial<CtVersion>> {
|
|
141
|
+
const { consensusProtocolVersion } = await onNode.getNodeInfo()
|
|
142
|
+
if (!isKeyOfObject(consensusProtocolVersion, PROTOCOL_VM_ABI)) {
|
|
143
|
+
throw new UnsupportedProtocolError('Not supported consensus protocol version')
|
|
144
|
+
}
|
|
145
|
+
const supportedProtocol = PROTOCOL_VM_ABI[consensusProtocolVersion]
|
|
146
|
+
if (!isKeyOfObject(txType, supportedProtocol)) {
|
|
147
|
+
throw new UnknownTxError('Not supported tx type')
|
|
148
|
+
}
|
|
149
|
+
const protocolForTX = supportedProtocol[txType]
|
|
150
|
+
abiVersion ??= protocolForTX.abiVersion[0]
|
|
151
|
+
vmVersion ??= protocolForTX.vmVersion[0]
|
|
152
|
+
return { vmVersion, abiVersion }
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Calculate fee, get absolute ttl (ttl + height), get account nonce
|
|
157
|
+
*
|
|
158
|
+
* @param txType - Type of transaction
|
|
159
|
+
* @param params - Object which contains all tx data
|
|
160
|
+
* @returns Object with account nonce, absolute ttl and transaction fee
|
|
161
|
+
*/
|
|
162
|
+
export async function prepareTxParams (
|
|
163
|
+
txType: TX_TYPE,
|
|
164
|
+
{
|
|
165
|
+
senderId,
|
|
166
|
+
nonce,
|
|
167
|
+
ttl = TX_TTL,
|
|
168
|
+
fee: f,
|
|
169
|
+
absoluteTtl,
|
|
170
|
+
vsn,
|
|
171
|
+
strategy,
|
|
172
|
+
denomination,
|
|
173
|
+
onNode,
|
|
174
|
+
...txParams
|
|
175
|
+
}: PrepareTxParamsOptions
|
|
176
|
+
): Promise<{ fee: BigNumber, ttl: number, nonce: number }> {
|
|
177
|
+
nonce ??= (
|
|
178
|
+
await onNode.getAccountNextNonce(senderId, { strategy }).catch(() => ({ nextNonce: 1 }))
|
|
179
|
+
).nextNonce
|
|
180
|
+
|
|
181
|
+
if (ttl !== 0) {
|
|
182
|
+
if (ttl < 0) throw new ArgumentError('ttl', 'greater or equal to 0', ttl)
|
|
183
|
+
ttl += absoluteTtl === true ? 0 : (await onNode.getCurrentKeyBlock()).height
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const fee = f != null
|
|
187
|
+
? new BigNumber(f)
|
|
188
|
+
: calculateMinFee(txType, { params: { ...txParams, senderId, nonce, ttl }, vsn, denomination })
|
|
189
|
+
return { fee, ttl, nonce }
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
interface PrepareTxParamsOptions extends Pick<TxParamsCommon, 'nonce' | 'ttl' | 'fee'> {
|
|
193
|
+
senderId: EncodedData<'ak'>
|
|
194
|
+
vsn?: number
|
|
195
|
+
absoluteTtl?: boolean
|
|
196
|
+
strategy?: 'continuity' | 'max'
|
|
197
|
+
denomination?: AE_AMOUNT_FORMATS
|
|
198
|
+
onNode: Node
|
|
199
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js'
|
|
2
|
+
import { MIN_GAS_PRICE, TX_TYPE, TxParamsCommon } from './builder/schema'
|
|
3
|
+
import { AE_AMOUNT_FORMATS } from '../utils/amount-formatter'
|
|
4
|
+
import { buildTx } from './builder'
|
|
5
|
+
import { isKeyOfObject } from '../utils/other'
|
|
6
|
+
|
|
7
|
+
const BASE_GAS = 15000
|
|
8
|
+
const GAS_PER_BYTE = 20
|
|
9
|
+
const KEY_BLOCK_INTERVAL = 3
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Calculate the Base fee gas
|
|
13
|
+
* @see {@link https://github.com/aeternity/protocol/blob/master/consensus/README.md#gas}
|
|
14
|
+
* @param txType - The transaction type
|
|
15
|
+
* @returns The base fee
|
|
16
|
+
* @example
|
|
17
|
+
* ```js
|
|
18
|
+
* TX_FEE_BASE('channelForceProgress') => new BigNumber(30 * 15000)
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
const TX_FEE_BASE_GAS = (txType: TX_TYPE): BigNumber => {
|
|
22
|
+
const feeFactors = {
|
|
23
|
+
[TX_TYPE.channelForceProgress]: 30,
|
|
24
|
+
[TX_TYPE.channelOffChain]: 0,
|
|
25
|
+
[TX_TYPE.channelOffChainCallContract]: 0,
|
|
26
|
+
[TX_TYPE.channelOffChainCreateContract]: 0,
|
|
27
|
+
[TX_TYPE.channelOffChainUpdateDeposit]: 0,
|
|
28
|
+
[TX_TYPE.channelOffChainUpdateWithdrawal]: 0,
|
|
29
|
+
[TX_TYPE.channelOffChainUpdateTransfer]: 0,
|
|
30
|
+
[TX_TYPE.contractCreate]: 5,
|
|
31
|
+
[TX_TYPE.contractCall]: 12,
|
|
32
|
+
[TX_TYPE.gaAttach]: 5,
|
|
33
|
+
[TX_TYPE.gaMeta]: 5,
|
|
34
|
+
[TX_TYPE.payingFor]: 1 / 5
|
|
35
|
+
} as const
|
|
36
|
+
const factor = feeFactors[txType as keyof typeof feeFactors] ?? 1
|
|
37
|
+
return new BigNumber(factor * BASE_GAS)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Calculate fee for Other types of transactions
|
|
42
|
+
* @see {@link https://github.com/aeternity/protocol/blob/master/consensus/README.md#gas}
|
|
43
|
+
* @param txType - The transaction type
|
|
44
|
+
* @param txSize - The transaction size
|
|
45
|
+
* @returns parameters - The transaction parameters
|
|
46
|
+
* @returns parameters.relativeTtl - The relative ttl
|
|
47
|
+
* @returns parameters.innerTxSize - The size of the inner transaction
|
|
48
|
+
* @returns The Other fee
|
|
49
|
+
* @example
|
|
50
|
+
* ```js
|
|
51
|
+
* TX_FEE_OTHER_GAS('oracleResponse',10, { relativeTtl: 10, innerTxSize: 10 })
|
|
52
|
+
* => new BigNumber(10).times(20).plus(Math.ceil(32000 * 10 / Math.floor(60 * 24 * 365 / 2)))
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
const TX_FEE_OTHER_GAS = (
|
|
56
|
+
txType: TX_TYPE,
|
|
57
|
+
txSize: number,
|
|
58
|
+
{ relativeTtl, innerTxSize }: { relativeTtl: number, innerTxSize: number }
|
|
59
|
+
): BigNumber => {
|
|
60
|
+
switch (txType) {
|
|
61
|
+
case TX_TYPE.oracleRegister:
|
|
62
|
+
case TX_TYPE.oracleExtend:
|
|
63
|
+
case TX_TYPE.oracleQuery:
|
|
64
|
+
case TX_TYPE.oracleResponse:
|
|
65
|
+
return new BigNumber(txSize)
|
|
66
|
+
.times(GAS_PER_BYTE)
|
|
67
|
+
.plus(
|
|
68
|
+
Math.ceil(32000 * relativeTtl / Math.floor(60 * 24 * 365 / KEY_BLOCK_INTERVAL))
|
|
69
|
+
)
|
|
70
|
+
case TX_TYPE.gaMeta:
|
|
71
|
+
case TX_TYPE.payingFor:
|
|
72
|
+
return new BigNumber(txSize).minus(innerTxSize).times(GAS_PER_BYTE)
|
|
73
|
+
default:
|
|
74
|
+
return new BigNumber(txSize).times(GAS_PER_BYTE)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function getOracleRelativeTtl (params: any, txType: TX_TYPE): number {
|
|
79
|
+
const ttlKeys = {
|
|
80
|
+
[TX_TYPE.oracleRegister]: 'oracleTtlValue',
|
|
81
|
+
[TX_TYPE.oracleExtend]: 'oracleTtlValue',
|
|
82
|
+
[TX_TYPE.oracleQuery]: 'queryTtlValue',
|
|
83
|
+
[TX_TYPE.oracleResponse]: 'responseTtlValue'
|
|
84
|
+
} as const
|
|
85
|
+
|
|
86
|
+
if (!isKeyOfObject(txType, ttlKeys)) return 1
|
|
87
|
+
else return params[ttlKeys[txType]]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Calculate fee based on tx type and params
|
|
92
|
+
*/
|
|
93
|
+
function buildFee (
|
|
94
|
+
txType: TX_TYPE,
|
|
95
|
+
{ params, vsn, denomination }:
|
|
96
|
+
{ params: TxParamsCommon, vsn?: number, denomination?: AE_AMOUNT_FORMATS }
|
|
97
|
+
): BigNumber {
|
|
98
|
+
const { rlpEncoded: { length } } = buildTx(params, txType, { vsn, denomination })
|
|
99
|
+
|
|
100
|
+
return TX_FEE_BASE_GAS(txType)
|
|
101
|
+
.plus(TX_FEE_OTHER_GAS(txType, length, {
|
|
102
|
+
relativeTtl: getOracleRelativeTtl(params, txType),
|
|
103
|
+
innerTxSize: [TX_TYPE.gaMeta, TX_TYPE.payingFor].includes(txType)
|
|
104
|
+
? params.tx.tx.encodedTx.rlpEncoded.length
|
|
105
|
+
: 0
|
|
106
|
+
}))
|
|
107
|
+
.times(MIN_GAS_PRICE)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Calculate min fee
|
|
112
|
+
* @param txType - Transaction type
|
|
113
|
+
* @param options - Options object
|
|
114
|
+
* @param options.params - Tx params
|
|
115
|
+
* @example
|
|
116
|
+
* ```js
|
|
117
|
+
* calculateMinFee('spendTx', { gasLimit, params })
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
export default function calculateMinFee (
|
|
121
|
+
txType: TX_TYPE, { params, vsn, denomination }: CalculateMinFeeOptions
|
|
122
|
+
): BigNumber {
|
|
123
|
+
let fee = new BigNumber(0)
|
|
124
|
+
let previousFee
|
|
125
|
+
do {
|
|
126
|
+
previousFee = fee
|
|
127
|
+
fee = buildFee(txType, { params: { ...params, fee }, vsn, denomination })
|
|
128
|
+
} while (!fee.eq(previousFee))
|
|
129
|
+
return fee
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
interface CalculateMinFeeOptions {
|
|
133
|
+
params: TxParamsCommon
|
|
134
|
+
vsn?: number
|
|
135
|
+
denomination?: AE_AMOUNT_FORMATS
|
|
136
|
+
}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { verify, hash } from '../utils/crypto'
|
|
2
|
+
import { encode, decode } from './builder/helpers'
|
|
3
|
+
import BigNumber from 'bignumber.js'
|
|
4
|
+
import {
|
|
5
|
+
PROTOCOL_VM_ABI, RawTxObject, TxSchema, TxParamsCommon, TX_TYPE, TxTypeSchemas, CtVersion
|
|
6
|
+
} from './builder/schema'
|
|
7
|
+
import { TxUnpacked, unpackTx } from './builder'
|
|
8
|
+
import calculateMinFee from './min-fee'
|
|
9
|
+
import { UnsupportedProtocolError } from '../utils/errors'
|
|
10
|
+
import { concatBuffers, isKeyOfObject } from '../utils/other'
|
|
11
|
+
import { EncodedData } from '../utils/encoder'
|
|
12
|
+
import Node from '../Node'
|
|
13
|
+
|
|
14
|
+
interface Account {
|
|
15
|
+
balance: bigint
|
|
16
|
+
id: EncodedData<'ak'>
|
|
17
|
+
nonce: number
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ValidatorResult {
|
|
21
|
+
message: string
|
|
22
|
+
key: string
|
|
23
|
+
checkedKeys: string[]
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type Validator = (
|
|
27
|
+
tx: {
|
|
28
|
+
encodedTx: TxUnpacked<TxSchema>
|
|
29
|
+
signatures: Buffer[]
|
|
30
|
+
tx: TxUnpacked<TxSchema> & {
|
|
31
|
+
tx: TxTypeSchemas[TX_TYPE.signed]
|
|
32
|
+
}
|
|
33
|
+
nonce?: number
|
|
34
|
+
ttl?: number
|
|
35
|
+
amount?: number
|
|
36
|
+
fee?: number
|
|
37
|
+
nameFee?: number
|
|
38
|
+
ctVersion?: Partial<CtVersion>
|
|
39
|
+
abiVersion?: number
|
|
40
|
+
contractId?: EncodedData<'ct'>
|
|
41
|
+
},
|
|
42
|
+
options: {
|
|
43
|
+
account?: Account
|
|
44
|
+
nodeNetworkId: string
|
|
45
|
+
parentTxTypes: TX_TYPE[]
|
|
46
|
+
node: Node
|
|
47
|
+
txType: TX_TYPE
|
|
48
|
+
height: number
|
|
49
|
+
consensusProtocolVersion: number
|
|
50
|
+
}
|
|
51
|
+
) => ValidatorResult[] | Promise<ValidatorResult[]>
|
|
52
|
+
|
|
53
|
+
const validators: Validator[] = [
|
|
54
|
+
({ encodedTx, signatures }, { account, nodeNetworkId, parentTxTypes }) => {
|
|
55
|
+
if ((encodedTx ?? signatures) === undefined) return []
|
|
56
|
+
if (account == null) return []
|
|
57
|
+
if (signatures.length !== 1) return [] // TODO: Support multisignature?
|
|
58
|
+
const prefix = Buffer.from([
|
|
59
|
+
nodeNetworkId,
|
|
60
|
+
...parentTxTypes.includes(TX_TYPE.payingFor) ? ['inner_tx'] : []
|
|
61
|
+
].join('-'))
|
|
62
|
+
const txWithNetworkId = concatBuffers([prefix, encodedTx.rlpEncoded])
|
|
63
|
+
const txHashWithNetworkId = concatBuffers([prefix, hash(encodedTx.rlpEncoded)])
|
|
64
|
+
const decodedPub = decode(account.id)
|
|
65
|
+
if (verify(txWithNetworkId, signatures[0], decodedPub) ||
|
|
66
|
+
verify(txHashWithNetworkId, signatures[0], decodedPub)) return []
|
|
67
|
+
return [{
|
|
68
|
+
message: 'Signature cannot be verified, please ensure that you transaction have' +
|
|
69
|
+
' the correct prefix and the correct private key for the sender address',
|
|
70
|
+
key: 'InvalidSignature',
|
|
71
|
+
checkedKeys: ['encodedTx', 'signatures']
|
|
72
|
+
}]
|
|
73
|
+
},
|
|
74
|
+
async ({ encodedTx, tx }, { node, parentTxTypes, txType }) => {
|
|
75
|
+
if ((encodedTx ?? tx) === undefined) return []
|
|
76
|
+
return await verifyTransaction(
|
|
77
|
+
encode((encodedTx ?? tx).rlpEncoded, 'tx'),
|
|
78
|
+
node,
|
|
79
|
+
[...parentTxTypes, txType]
|
|
80
|
+
)
|
|
81
|
+
},
|
|
82
|
+
(tx: any, { txType }) => {
|
|
83
|
+
if (tx.fee === undefined) return []
|
|
84
|
+
const minFee = calculateMinFee(txType, { params: tx, vsn: tx.VSN })
|
|
85
|
+
if (minFee.lte(tx.fee)) return []
|
|
86
|
+
return [{
|
|
87
|
+
message: `Fee ${tx.fee as string} is too low, minimum fee for this transaction is ${minFee.toString()}`,
|
|
88
|
+
key: 'InsufficientFee',
|
|
89
|
+
checkedKeys: ['fee']
|
|
90
|
+
}]
|
|
91
|
+
},
|
|
92
|
+
({ ttl }, { height }) => {
|
|
93
|
+
if (ttl === undefined) return []
|
|
94
|
+
ttl = +ttl
|
|
95
|
+
if (ttl === 0 || ttl >= height) return []
|
|
96
|
+
return [{
|
|
97
|
+
message: `TTL ${ttl} is already expired, current height is ${height}`,
|
|
98
|
+
key: 'ExpiredTTL',
|
|
99
|
+
checkedKeys: ['ttl']
|
|
100
|
+
}]
|
|
101
|
+
},
|
|
102
|
+
({ amount, fee, nameFee, tx }, { account, parentTxTypes, txType }) => {
|
|
103
|
+
if (account == null) return []
|
|
104
|
+
if ((amount ?? fee ?? nameFee) === undefined) return []
|
|
105
|
+
fee ??= 0
|
|
106
|
+
const cost = new BigNumber(fee).plus(nameFee ?? 0).plus(amount ?? 0)
|
|
107
|
+
.plus(txType === TX_TYPE.payingFor ? (tx.tx.encodedTx.tx).fee : 0)
|
|
108
|
+
.minus(parentTxTypes.includes(TX_TYPE.payingFor) ? fee : 0)
|
|
109
|
+
if (cost.lte(account.balance.toString())) return []
|
|
110
|
+
return [{
|
|
111
|
+
message: `Account balance ${account.balance.toString()} is not enough to execute the transaction that costs ${cost.toFixed()}`,
|
|
112
|
+
key: 'InsufficientBalance',
|
|
113
|
+
checkedKeys: ['amount', 'fee', 'nameFee']
|
|
114
|
+
}]
|
|
115
|
+
},
|
|
116
|
+
({ nonce }, { account, parentTxTypes }) => {
|
|
117
|
+
if (nonce == null || account == null || parentTxTypes.includes(TX_TYPE.gaMeta)) return []
|
|
118
|
+
nonce = +nonce
|
|
119
|
+
const validNonce = account.nonce + 1
|
|
120
|
+
if (nonce === validNonce) return []
|
|
121
|
+
return [{
|
|
122
|
+
...nonce < validNonce
|
|
123
|
+
? {
|
|
124
|
+
message: `Nonce ${nonce} is already used, valid nonce is ${validNonce}`,
|
|
125
|
+
key: 'NonceAlreadyUsed'
|
|
126
|
+
}
|
|
127
|
+
: {
|
|
128
|
+
message: `Nonce ${nonce} is too high, valid nonce is ${validNonce}`,
|
|
129
|
+
key: 'NonceHigh'
|
|
130
|
+
},
|
|
131
|
+
checkedKeys: ['nonce']
|
|
132
|
+
}]
|
|
133
|
+
},
|
|
134
|
+
({ ctVersion, abiVersion }, { txType, consensusProtocolVersion }) => {
|
|
135
|
+
if (!isKeyOfObject(consensusProtocolVersion, PROTOCOL_VM_ABI)) {
|
|
136
|
+
throw new UnsupportedProtocolError(`Unsupported protocol: ${consensusProtocolVersion}`)
|
|
137
|
+
}
|
|
138
|
+
const protocol = PROTOCOL_VM_ABI[consensusProtocolVersion]
|
|
139
|
+
|
|
140
|
+
// If not contract create tx
|
|
141
|
+
if (ctVersion == null) ctVersion = { abiVersion }
|
|
142
|
+
const txProtocol = protocol[txType as keyof typeof protocol]
|
|
143
|
+
if (txProtocol == null) return []
|
|
144
|
+
if (Object.entries(ctVersion).some(
|
|
145
|
+
([
|
|
146
|
+
key,
|
|
147
|
+
value
|
|
148
|
+
]: [
|
|
149
|
+
key:keyof typeof txProtocol,
|
|
150
|
+
value:any]) => !(txProtocol[key].includes(+value as never)))) {
|
|
151
|
+
return [{
|
|
152
|
+
message: `ABI/VM version ${JSON.stringify(ctVersion)} is wrong, supported is: ${JSON.stringify(txProtocol)}`,
|
|
153
|
+
key: 'VmAndAbiVersionMismatch',
|
|
154
|
+
checkedKeys: ['ctVersion', 'abiVersion']
|
|
155
|
+
}]
|
|
156
|
+
}
|
|
157
|
+
return []
|
|
158
|
+
},
|
|
159
|
+
async ({ contractId }, { txType, node }) => {
|
|
160
|
+
if (TX_TYPE.contractCall !== txType) return []
|
|
161
|
+
contractId = contractId as EncodedData<'ct'>
|
|
162
|
+
try {
|
|
163
|
+
const { active } = await node.getContract(contractId)
|
|
164
|
+
if (active) return []
|
|
165
|
+
return [{
|
|
166
|
+
message: `Contract ${contractId} is not active`,
|
|
167
|
+
key: 'ContractNotActive',
|
|
168
|
+
checkedKeys: ['contractId']
|
|
169
|
+
}]
|
|
170
|
+
} catch (error) {
|
|
171
|
+
if (error.response?.parsedBody?.reason == null) throw error
|
|
172
|
+
return [{
|
|
173
|
+
message: error.response.parsedBody.reason,
|
|
174
|
+
key: 'ContractNotFound',
|
|
175
|
+
checkedKeys: ['contractId']
|
|
176
|
+
}]
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
const getSenderAddress = (
|
|
182
|
+
tx: TxParamsCommon | RawTxObject<TxSchema>
|
|
183
|
+
): EncodedData<'ak'> | undefined => [
|
|
184
|
+
'senderId', 'accountId', 'ownerId', 'callerId',
|
|
185
|
+
'oracleId', 'fromId', 'initiator', 'gaId', 'payerId'
|
|
186
|
+
]
|
|
187
|
+
.map((key: keyof TxSchema) => tx[key])
|
|
188
|
+
.filter(a => a)
|
|
189
|
+
.map((a) => a?.toString().replace(/^ok_/, 'ak_'))[0] as EncodedData<'ak'> | undefined
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Transaction Validator
|
|
193
|
+
* This function validates some of transaction properties,
|
|
194
|
+
* to make sure it can be posted it to the chain
|
|
195
|
+
* @param transaction - Base64Check-encoded transaction
|
|
196
|
+
* @param node - Node to validate transaction against
|
|
197
|
+
* @param parentTxTypes - Types of parent transactions
|
|
198
|
+
* @returns Array with verification errors
|
|
199
|
+
* @example const errors = await verifyTransaction(transaction, node)
|
|
200
|
+
*/
|
|
201
|
+
export default async function verifyTransaction (
|
|
202
|
+
transaction: EncodedData<'tx' | 'pi'>,
|
|
203
|
+
node: Node,
|
|
204
|
+
parentTxTypes: TX_TYPE[] = []
|
|
205
|
+
): Promise<ValidatorResult[]> {
|
|
206
|
+
const { tx, txType } = unpackTx<TX_TYPE.signed>(transaction)
|
|
207
|
+
const address = getSenderAddress(tx) ??
|
|
208
|
+
(txType === TX_TYPE.signed ? getSenderAddress(tx.encodedTx.tx) : undefined)
|
|
209
|
+
const [account, { height }, { consensusProtocolVersion, nodeNetworkId }] = await Promise.all([
|
|
210
|
+
address == null
|
|
211
|
+
? undefined
|
|
212
|
+
: node.getAccountByPubkey(address)
|
|
213
|
+
.catch(() => ({ id: address, balance: 0n, nonce: 0 }))
|
|
214
|
+
// TODO: remove after fixing https://github.com/aeternity/aepp-sdk-js/issues/1537
|
|
215
|
+
.then(acc => ({ ...acc, id: acc.id as EncodedData<'ak'> })),
|
|
216
|
+
node.getCurrentKeyBlockHeight(),
|
|
217
|
+
node.getNodeInfo()
|
|
218
|
+
])
|
|
219
|
+
|
|
220
|
+
return (await Promise.all(
|
|
221
|
+
validators.map(v => v(
|
|
222
|
+
tx as any,
|
|
223
|
+
{ txType, node, account, height, consensusProtocolVersion, nodeNetworkId, parentTxTypes }
|
|
224
|
+
))
|
|
225
|
+
)).flat()
|
|
226
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// TODO: remove after solving https://github.com/axic/bip32-path/issues/5
|
|
2
|
+
|
|
3
|
+
declare module 'bip32-path' {
|
|
4
|
+
interface BipPath {
|
|
5
|
+
toPathArray: () => number[]
|
|
6
|
+
/**
|
|
7
|
+
* returns a text encoded path. Set to noRoot to true to omit the m/ prefix.
|
|
8
|
+
* Set oldStyle true to use h instead of ' for marking hardened nodes.
|
|
9
|
+
*/
|
|
10
|
+
toString: (noRoot: boolean, oldStyle: boolean) => string
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* returns true if the input is a valid path string
|
|
14
|
+
*/
|
|
15
|
+
validateString: (path: string) => boolean
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* returns true if the input is a valid binary path array
|
|
19
|
+
*/
|
|
20
|
+
validatePathArray: (path: string) => boolean
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* creates an instance from a path written as text.
|
|
25
|
+
* Set reqRoot to true if the m/ prefix is mandatory.
|
|
26
|
+
*/
|
|
27
|
+
export const fromString: (text: string, reqRoot?: boolean) => BipPath
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* creates an instance from a binary path array
|
|
31
|
+
*/
|
|
32
|
+
export const fromPathArray: (path: string) => BipPath
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// TODO: remove after solving https://github.com/dchest/tweetnacl-auth-js/issues/3
|
|
2
|
+
|
|
3
|
+
declare module 'tweetnacl-auth' {
|
|
4
|
+
/**
|
|
5
|
+
* Authenticates the given message with the secret key.
|
|
6
|
+
* (In other words, returns HMAC-SHA-512-256 of the message under the key.)
|
|
7
|
+
*/
|
|
8
|
+
export default function (message: Uint8Array, key: Uint8Array): Uint8Array
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Returns HMAC-SHA-512 (without truncation) of the message under the key
|
|
12
|
+
*/
|
|
13
|
+
export const full: (message: Uint8Array, key: Uint8Array) => Uint8Array
|
|
14
|
+
}
|