@aeternity/aepp-sdk 13.0.0-alpha.0 → 13.0.0-alpha.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/bin/aesophia_cli +0 -0
- package/dist/aepp-sdk.browser-script.js +1 -1
- 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 +4206 -1127
- package/dist/aepp-sdk.js.map +1 -1
- package/es/AeSdkBase.d.ts +3 -3
- package/es/AeSdkBase.mjs +4 -0
- package/es/AeSdkBase.mjs.map +1 -1
- package/es/AeSdkMethods.d.ts +3 -4
- package/es/AeSdkMethods.mjs.map +1 -1
- package/es/Node.d.ts +4 -3
- package/es/Node.mjs +1 -1
- package/es/Node.mjs.map +1 -1
- package/es/account/Base.d.ts +2 -2
- package/es/account/Base.mjs.map +1 -1
- package/es/account/Generalized.mjs +5 -3
- package/es/account/Generalized.mjs.map +1 -1
- package/es/account/Ledger.mjs +2 -1
- package/es/account/Ledger.mjs.map +1 -1
- package/es/account/Memory.mjs +2 -1
- package/es/account/Memory.mjs.map +1 -1
- package/es/aens.d.ts +1 -1
- package/es/aens.mjs +5 -1
- package/es/aens.mjs.map +1 -1
- package/es/aepp-wallet-communication/connection/BrowserRuntime.d.ts +1 -0
- package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs +19 -4
- package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs.map +1 -1
- package/es/aepp-wallet-communication/rpc/RpcClient.mjs +1 -1
- package/es/aepp-wallet-communication/rpc/RpcClient.mjs.map +1 -1
- package/es/chain.d.ts +9 -1
- package/es/chain.mjs +4 -1
- package/es/chain.mjs.map +1 -1
- package/es/channel/Base.d.ts +6 -1
- package/es/channel/Base.mjs +9 -6
- package/es/channel/Base.mjs.map +1 -1
- package/es/channel/Contract.d.ts +8 -7
- package/es/channel/Contract.mjs +1 -1
- package/es/channel/Contract.mjs.map +1 -1
- package/es/channel/Spend.d.ts +3 -1
- package/es/channel/Spend.mjs +4 -2
- package/es/channel/Spend.mjs.map +1 -1
- package/es/channel/handlers.mjs +11 -9
- package/es/channel/handlers.mjs.map +1 -1
- package/es/channel/internal.mjs +3 -1
- package/es/channel/internal.mjs.map +1 -1
- package/es/contract/Contract.d.ts +21 -46
- package/es/contract/Contract.mjs +69 -52
- package/es/contract/Contract.mjs.map +1 -1
- package/es/contract/compiler/Base.d.ts +81 -0
- package/es/contract/compiler/Base.mjs +5 -0
- package/es/contract/compiler/Base.mjs.map +1 -0
- package/es/contract/compiler/Cli.d.ts +23 -0
- package/es/contract/compiler/Cli.mjs +155 -0
- package/es/contract/compiler/Cli.mjs.map +1 -0
- package/es/contract/compiler/Http.d.ts +32 -0
- package/es/contract/{CompilerHttp.mjs → compiler/Http.mjs} +64 -9
- package/es/contract/compiler/Http.mjs.map +1 -0
- package/es/contract/compiler/HttpNode.d.ts +17 -0
- package/es/contract/compiler/HttpNode.mjs +26 -0
- package/es/contract/compiler/HttpNode.mjs.map +1 -0
- package/es/contract/compiler/getFileSystem.d.ts +6 -0
- package/es/contract/compiler/getFileSystem.mjs +40 -0
- package/es/contract/compiler/getFileSystem.mjs.map +1 -0
- package/es/contract/ga.d.ts +5 -4
- package/es/contract/ga.mjs +11 -2
- package/es/contract/ga.mjs.map +1 -1
- package/es/index-browser.d.ts +39 -0
- package/es/index-browser.mjs +55 -0
- package/es/index-browser.mjs.map +1 -0
- package/es/index.d.ts +4 -38
- package/es/index.mjs +4 -53
- package/es/index.mjs.map +1 -1
- package/es/oracle.mjs +1 -1
- package/es/oracle.mjs.map +1 -1
- package/es/spend.mjs +1 -3
- package/es/spend.mjs.map +1 -1
- package/es/tx/builder/constants.d.ts +28 -1
- package/es/tx/builder/constants.mjs +32 -3
- package/es/tx/builder/constants.mjs.map +1 -1
- package/es/tx/builder/field-types/abi-version.d.ts +10 -0
- package/es/tx/builder/field-types/abi-version.mjs +20 -0
- package/es/tx/builder/field-types/abi-version.mjs.map +1 -0
- package/es/tx/builder/field-types/address.d.ts +5 -6
- package/es/tx/builder/field-types/address.mjs +17 -8
- package/es/tx/builder/field-types/address.mjs.map +1 -1
- package/es/tx/builder/field-types/array.d.ts +7 -0
- package/es/tx/builder/field-types/array.mjs +11 -0
- package/es/tx/builder/field-types/array.mjs.map +1 -0
- package/es/tx/builder/field-types/boolean.d.ts +6 -0
- package/es/tx/builder/field-types/boolean.mjs +13 -0
- package/es/tx/builder/field-types/boolean.mjs.map +1 -0
- package/es/tx/builder/field-types/coin-amount.d.ts +1 -1
- package/es/tx/builder/field-types/coin-amount.mjs.map +1 -1
- package/es/tx/builder/field-types/ct-version.d.ts +30 -0
- package/es/tx/builder/field-types/ct-version.mjs +48 -0
- package/es/tx/builder/field-types/ct-version.mjs.map +1 -0
- package/es/tx/builder/field-types/deposit.d.ts +1 -1
- package/es/tx/builder/field-types/deposit.mjs.map +1 -1
- package/es/tx/builder/field-types/encoded.d.ts +6 -0
- package/es/tx/builder/field-types/encoded.mjs +21 -0
- package/es/tx/builder/field-types/encoded.mjs.map +1 -0
- package/es/tx/builder/field-types/entry.d.ts +11 -0
- package/es/tx/builder/field-types/entry.mjs +31 -0
- package/es/tx/builder/field-types/entry.mjs.map +1 -0
- package/es/tx/builder/field-types/enumeration.d.ts +5 -3
- package/es/tx/builder/field-types/enumeration.mjs +11 -2
- package/es/tx/builder/field-types/enumeration.mjs.map +1 -1
- package/es/tx/builder/field-types/fee.d.ts +10 -7
- package/es/tx/builder/field-types/fee.mjs +24 -20
- package/es/tx/builder/field-types/fee.mjs.map +1 -1
- package/es/tx/builder/field-types/gas-limit.d.ts +5 -2
- package/es/tx/builder/field-types/gas-limit.mjs +9 -6
- package/es/tx/builder/field-types/gas-limit.mjs.map +1 -1
- package/es/tx/builder/field-types/gas-price.d.ts +1 -1
- package/es/tx/builder/field-types/index.d.ts +66 -28
- package/es/tx/builder/field-types/index.mjs +30 -12
- package/es/tx/builder/field-types/index.mjs.map +1 -1
- package/es/tx/builder/field-types/mptree.d.ts +37 -0
- package/es/tx/builder/field-types/mptree.mjs +268 -0
- package/es/tx/builder/field-types/mptree.mjs.map +1 -0
- package/es/tx/builder/field-types/name-fee.d.ts +1 -2
- package/es/tx/builder/field-types/name-fee.mjs.map +1 -1
- package/es/tx/builder/field-types/name-id.mjs +2 -1
- package/es/tx/builder/field-types/name-id.mjs.map +1 -1
- package/es/tx/builder/field-types/pointers.mjs +2 -2
- package/es/tx/builder/field-types/pointers.mjs.map +1 -1
- package/es/tx/builder/field-types/raw.d.ts +6 -0
- package/es/tx/builder/field-types/raw.mjs +13 -0
- package/es/tx/builder/field-types/raw.mjs.map +1 -0
- package/es/tx/builder/field-types/short-u-int-const.d.ts +5 -0
- package/es/tx/builder/field-types/short-u-int-const.mjs +16 -0
- package/es/tx/builder/field-types/short-u-int-const.mjs.map +1 -0
- package/es/tx/builder/field-types/string.d.ts +6 -0
- package/es/tx/builder/field-types/string.mjs +10 -0
- package/es/tx/builder/field-types/string.mjs.map +1 -0
- package/es/tx/builder/field-types/u-int.d.ts +1 -2
- package/es/tx/builder/field-types/u-int.mjs.map +1 -1
- package/es/tx/builder/index.d.ts +11 -29
- package/es/tx/builder/index.mjs +50 -211
- package/es/tx/builder/index.mjs.map +1 -1
- package/es/tx/builder/schema.d.ts +2111 -571
- package/es/tx/builder/schema.mjs +57 -125
- package/es/tx/builder/schema.mjs.map +1 -1
- package/es/tx/index.d.ts +5 -20
- package/es/tx/index.mjs +31 -88
- package/es/tx/index.mjs.map +1 -1
- package/es/tx/validator.d.ts +3 -5
- package/es/tx/validator.mjs +82 -95
- package/es/tx/validator.mjs.map +1 -1
- package/es/utils/bytes.mjs +1 -1
- package/es/utils/bytes.mjs.map +1 -1
- package/es/utils/errors.d.ts +3 -8
- package/es/utils/errors.mjs +1 -11
- package/es/utils/errors.mjs.map +1 -1
- package/es/utils/other.d.ts +1 -1
- package/package.json +35 -27
- package/src/AeSdkBase.ts +6 -3
- package/src/AeSdkMethods.ts +3 -4
- package/src/Node.ts +6 -3
- package/src/account/Base.ts +2 -2
- package/src/account/Generalized.ts +2 -2
- package/src/account/Ledger.ts +1 -1
- package/src/account/Memory.ts +1 -1
- package/src/aens.ts +3 -2
- package/src/aepp-wallet-communication/connection/BrowserRuntime.ts +18 -7
- package/src/aepp-wallet-communication/rpc/RpcClient.ts +2 -2
- package/src/chain.ts +5 -3
- package/src/channel/Base.ts +13 -5
- package/src/channel/Contract.ts +11 -10
- package/src/channel/Spend.ts +7 -2
- package/src/channel/handlers.ts +10 -9
- package/src/channel/internal.ts +1 -1
- package/src/contract/Contract.ts +69 -79
- package/src/contract/compiler/Base.ts +94 -0
- package/src/contract/compiler/Cli.ts +134 -0
- package/src/contract/compiler/Http.ts +124 -0
- package/src/contract/compiler/HttpNode.ts +26 -0
- package/src/contract/compiler/getFileSystem.ts +42 -0
- package/src/contract/ga.ts +9 -6
- package/src/index-browser.ts +58 -0
- package/src/index.ts +4 -56
- package/src/oracle.ts +1 -1
- package/src/spend.ts +1 -1
- package/src/tx/builder/constants.ts +32 -3
- package/src/tx/builder/field-types/abi-version.ts +21 -0
- package/src/tx/builder/field-types/address.ts +23 -13
- package/src/tx/builder/field-types/array.ts +19 -0
- package/src/tx/builder/field-types/boolean.ts +9 -0
- package/src/tx/builder/field-types/coin-amount.ts +2 -1
- package/src/tx/builder/field-types/ct-version.ts +50 -0
- package/src/tx/builder/field-types/deposit.ts +1 -1
- package/src/tx/builder/field-types/encoded.ts +27 -0
- package/src/tx/builder/field-types/entry.ts +31 -0
- package/src/tx/builder/field-types/enumeration.ts +15 -4
- package/src/tx/builder/field-types/fee.ts +38 -18
- package/src/tx/builder/field-types/gas-limit.ts +12 -7
- package/src/tx/builder/field-types/index.ts +46 -17
- package/src/tx/builder/field-types/mptree.ts +242 -0
- package/src/tx/builder/field-types/name-fee.ts +1 -2
- package/src/tx/builder/field-types/name-id.ts +1 -1
- package/src/tx/builder/field-types/pointers.ts +2 -2
- package/src/tx/builder/field-types/raw.ts +9 -0
- package/src/tx/builder/field-types/short-u-int-const.ts +20 -0
- package/src/tx/builder/field-types/string.ts +11 -0
- package/src/tx/builder/field-types/u-int.ts +1 -3
- package/src/tx/builder/index.ts +63 -247
- package/src/tx/builder/schema.ts +273 -323
- package/src/tx/index.ts +37 -104
- package/src/tx/validator.ts +72 -95
- package/src/utils/bytes.ts +1 -1
- package/src/utils/errors.ts +4 -13
- package/types-legacy/ts4.2/AeSdkBase.d.ts +3 -3
- package/types-legacy/ts4.2/AeSdkMethods.d.ts +3 -4
- package/types-legacy/ts4.2/Node.d.ts +3 -3
- package/types-legacy/ts4.2/account/Base.d.ts +2 -2
- package/types-legacy/ts4.2/aens.d.ts +1 -1
- package/types-legacy/ts4.2/aepp-wallet-communication/connection/BrowserRuntime.d.ts +1 -0
- package/types-legacy/ts4.2/chain.d.ts +9 -1
- package/types-legacy/ts4.2/channel/Base.d.ts +6 -1
- package/types-legacy/ts4.2/channel/Contract.d.ts +8 -7
- package/types-legacy/ts4.2/channel/Spend.d.ts +3 -1
- package/types-legacy/ts4.2/contract/Contract.d.ts +21 -46
- package/types-legacy/ts4.2/contract/compiler/Base.d.ts +81 -0
- package/types-legacy/ts4.2/contract/compiler/Cli.d.ts +23 -0
- package/types-legacy/ts4.2/contract/compiler/Http.d.ts +32 -0
- package/types-legacy/ts4.2/contract/compiler/HttpNode.d.ts +17 -0
- package/types-legacy/ts4.2/contract/compiler/getFileSystem.d.ts +6 -0
- package/types-legacy/ts4.2/contract/ga.d.ts +5 -4
- package/types-legacy/ts4.2/index-browser.d.ts +39 -0
- package/types-legacy/ts4.2/index.d.ts +4 -38
- package/types-legacy/ts4.2/tx/builder/constants.d.ts +28 -1
- package/types-legacy/ts4.2/tx/builder/field-types/abi-version.d.ts +10 -0
- package/types-legacy/ts4.2/tx/builder/field-types/address.d.ts +11 -12
- package/types-legacy/ts4.2/tx/builder/field-types/array.d.ts +7 -0
- package/types-legacy/ts4.2/tx/builder/field-types/boolean.d.ts +6 -0
- package/types-legacy/ts4.2/tx/builder/field-types/coin-amount.d.ts +1 -1
- package/types-legacy/ts4.2/tx/builder/field-types/ct-version.d.ts +42 -0
- package/types-legacy/ts4.2/tx/builder/field-types/deposit.d.ts +1 -1
- package/types-legacy/ts4.2/tx/builder/field-types/encoded.d.ts +6 -0
- package/types-legacy/ts4.2/tx/builder/field-types/entry.d.ts +11 -0
- package/types-legacy/ts4.2/tx/builder/field-types/enumeration.d.ts +5 -3
- package/types-legacy/ts4.2/tx/builder/field-types/fee.d.ts +10 -7
- package/types-legacy/ts4.2/tx/builder/field-types/gas-limit.d.ts +5 -2
- package/types-legacy/ts4.2/tx/builder/field-types/gas-price.d.ts +1 -1
- package/types-legacy/ts4.2/tx/builder/field-types/index.d.ts +72 -28
- package/types-legacy/ts4.2/tx/builder/field-types/mptree.d.ts +43 -0
- package/types-legacy/ts4.2/tx/builder/field-types/name-fee.d.ts +1 -2
- package/types-legacy/ts4.2/tx/builder/field-types/raw.d.ts +6 -0
- package/types-legacy/ts4.2/tx/builder/field-types/short-u-int-const.d.ts +5 -0
- package/types-legacy/ts4.2/tx/builder/field-types/string.d.ts +6 -0
- package/types-legacy/ts4.2/tx/builder/field-types/u-int.d.ts +1 -2
- package/types-legacy/ts4.2/tx/builder/index.d.ts +11 -29
- package/types-legacy/ts4.2/tx/builder/schema.d.ts +2380 -668
- package/types-legacy/ts4.2/tx/index.d.ts +5 -20
- package/types-legacy/ts4.2/tx/validator.d.ts +3 -5
- package/types-legacy/ts4.2/utils/errors.d.ts +3 -8
- package/types-legacy/ts4.2/utils/other.d.ts +1 -1
- package/types-legacy/ts4.5/AeSdkBase.d.ts +3 -3
- package/types-legacy/ts4.5/AeSdkMethods.d.ts +3 -4
- package/types-legacy/ts4.5/Node.d.ts +3 -3
- package/types-legacy/ts4.5/account/Base.d.ts +2 -2
- package/types-legacy/ts4.5/aens.d.ts +1 -1
- package/types-legacy/ts4.5/aepp-wallet-communication/connection/BrowserRuntime.d.ts +1 -0
- package/types-legacy/ts4.5/chain.d.ts +9 -1
- package/types-legacy/ts4.5/channel/Base.d.ts +6 -1
- package/types-legacy/ts4.5/channel/Contract.d.ts +8 -7
- package/types-legacy/ts4.5/channel/Spend.d.ts +3 -1
- package/types-legacy/ts4.5/contract/Contract.d.ts +21 -46
- package/types-legacy/ts4.5/contract/compiler/Base.d.ts +81 -0
- package/types-legacy/ts4.5/contract/compiler/Cli.d.ts +23 -0
- package/types-legacy/ts4.5/contract/compiler/Http.d.ts +32 -0
- package/types-legacy/ts4.5/contract/compiler/HttpNode.d.ts +17 -0
- package/types-legacy/ts4.5/contract/compiler/getFileSystem.d.ts +6 -0
- package/types-legacy/ts4.5/contract/ga.d.ts +5 -4
- package/types-legacy/ts4.5/index-browser.d.ts +39 -0
- package/types-legacy/ts4.5/index.d.ts +4 -38
- package/types-legacy/ts4.5/tx/builder/constants.d.ts +28 -1
- package/types-legacy/ts4.5/tx/builder/field-types/abi-version.d.ts +10 -0
- package/types-legacy/ts4.5/tx/builder/field-types/address.d.ts +11 -12
- package/types-legacy/ts4.5/tx/builder/field-types/array.d.ts +7 -0
- package/types-legacy/ts4.5/tx/builder/field-types/boolean.d.ts +6 -0
- package/types-legacy/ts4.5/tx/builder/field-types/coin-amount.d.ts +1 -1
- package/types-legacy/ts4.5/tx/builder/field-types/ct-version.d.ts +42 -0
- package/types-legacy/ts4.5/tx/builder/field-types/deposit.d.ts +1 -1
- package/types-legacy/ts4.5/tx/builder/field-types/encoded.d.ts +6 -0
- package/types-legacy/ts4.5/tx/builder/field-types/entry.d.ts +11 -0
- package/types-legacy/ts4.5/tx/builder/field-types/enumeration.d.ts +5 -3
- package/types-legacy/ts4.5/tx/builder/field-types/fee.d.ts +10 -7
- package/types-legacy/ts4.5/tx/builder/field-types/gas-limit.d.ts +5 -2
- package/types-legacy/ts4.5/tx/builder/field-types/gas-price.d.ts +1 -1
- package/types-legacy/ts4.5/tx/builder/field-types/index.d.ts +72 -28
- package/types-legacy/ts4.5/tx/builder/field-types/mptree.d.ts +43 -0
- package/types-legacy/ts4.5/tx/builder/field-types/name-fee.d.ts +1 -2
- package/types-legacy/ts4.5/tx/builder/field-types/raw.d.ts +6 -0
- package/types-legacy/ts4.5/tx/builder/field-types/short-u-int-const.d.ts +5 -0
- package/types-legacy/ts4.5/tx/builder/field-types/string.d.ts +6 -0
- package/types-legacy/ts4.5/tx/builder/field-types/u-int.d.ts +1 -2
- package/types-legacy/ts4.5/tx/builder/index.d.ts +11 -29
- package/types-legacy/ts4.5/tx/builder/schema.d.ts +2380 -668
- package/types-legacy/ts4.5/tx/index.d.ts +5 -20
- package/types-legacy/ts4.5/tx/validator.d.ts +3 -5
- package/types-legacy/ts4.5/utils/errors.d.ts +3 -8
- package/types-legacy/ts4.5/utils/other.d.ts +1 -1
- package/es/contract/CompilerHttp.d.ts +0 -18
- package/es/contract/CompilerHttp.mjs.map +0 -1
- package/es/tx/builder/field-types/addresses.d.ts +0 -6
- package/es/tx/builder/field-types/addresses.mjs +0 -13
- package/es/tx/builder/field-types/addresses.mjs.map +0 -1
- package/es/utils/mptree.d.ts +0 -26
- package/es/utils/mptree.mjs +0 -143
- package/es/utils/mptree.mjs.map +0 -1
- package/src/contract/CompilerHttp.ts +0 -67
- package/src/tx/builder/field-types/addresses.ts +0 -18
- package/src/utils/mptree.ts +0 -145
- package/types-legacy/ts4.2/contract/CompilerHttp.d.ts +0 -18
- package/types-legacy/ts4.2/tx/builder/field-types/addresses.d.ts +0 -6
- package/types-legacy/ts4.2/utils/mptree.d.ts +0 -32
- package/types-legacy/ts4.5/contract/CompilerHttp.d.ts +0 -18
- package/types-legacy/ts4.5/tx/builder/field-types/addresses.d.ts +0 -6
- package/types-legacy/ts4.5/utils/mptree.d.ts +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.mjs","names":["JsonBig","pascalToSnake","ChannelCallError","ChannelPingTimedOutError","UnexpectedTsError","UnknownChannelStateError","ChannelIncomingMessageError","ChannelError","PING_TIMEOUT_MS","PONG_TIMEOUT_MS","emit","channel","args","eventName","rest","_eventEmitter","enterState","nextState","_fsm","handler","enter","dequeueAction","changeStatus","newStatus","_status","changeState","newState","_state","send","message","_options","debug","console","log","_websocket","stringify","jsonrpc","notify","method","params","_isActionQueueLocked","queue","_actionQueue","length","index","findIndex","action","guard","filter","_","i","enqueueAction","promise","Promise","resolve","reject","push","res","state","handleMessage","st","dequeueMessage","_isMessageQueueLocked","_messageQueue","shift","error","disconnect","close","clearTimeout","_pingTimeoutId","ping","setTimeout","onMessage","data","parse","id","callback","_rpcCallbacks","get","delete","channel_id","_channelId","call","_nextRpcMessageId","set","details","result","initialize","connectionHandler","openHandler","url","channelOptions","wsUrl","URL","Object","entries","key","includes","forEach","value","searchParams","toString","W3CWebSocket","assign","onerror","onopen","reconnectTx","signedTx","signed_tx","onclose","onmessage"],"sources":["../../src/channel/internal.ts"],"sourcesContent":["/*\n * ISC License (ISC)\n * Copyright (c) 2018 aeternity developers\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport { w3cwebsocket as W3CWebSocket } from 'websocket';\nimport BigNumber from 'bignumber.js';\nimport type Channel from './Base';\nimport JsonBig from '../utils/json-big';\nimport { pascalToSnake } from '../utils/string';\nimport { Encoded } from '../utils/encoder';\nimport {\n BaseError,\n ChannelCallError,\n ChannelPingTimedOutError,\n UnexpectedTsError,\n UnknownChannelStateError,\n ChannelIncomingMessageError,\n ChannelError,\n} from '../utils/errors';\n\nexport interface ChannelAction {\n guard: (channel: Channel, state?: ChannelFsm) => boolean;\n action: (channel: Channel, state?: ChannelFsm) => ChannelFsm;\n}\n\ninterface SignOptions {\n updates?: any[];\n [k: string]: any;\n}\nexport type SignTxWithTag = (tag: string, tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction>\n);\n// TODO: SignTx shouldn't return number or null\nexport type SignTx = (tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction | number | null>\n);\n\nexport interface ChannelOptions {\n existingFsmId?: Encoded.Bytearray;\n url: string;\n\n /**\n * @see {@link https://github.com/aeternity/protocol/blob/6734de2e4c7cce7e5e626caa8305fb535785131d/node/api/channels_api_usage.md#channel-establishing-parameters}\n */\n initiatorId: Encoded.AccountAddress;\n responderId: Encoded.AccountAddress;\n lockPeriod: number;\n pushAmount: number;\n initiatorAmount: BigNumber;\n responderAmount: BigNumber;\n channelReserve?: BigNumber | number;\n ttl?: number;\n host: string;\n port: number;\n role: 'initiator' | 'responder';\n minimumDepthStrategy?: 'txfee' | 'plain';\n minimumDepth?: number;\n fee?: BigNumber | number;\n gasPrice?: BigNumber | number;\n\n signedTx?: string;\n existingChannelId?: string;\n offChainTx?: string;\n reconnectTx?: string;\n timeoutIdle?: number;\n timeoutFundingCreate?: number;\n timeoutFundingSign?: number;\n timeoutFundingLock?: number;\n timeoutSign?: number;\n timeoutAccept?: number;\n timeoutInitialized?: number;\n timeoutAwaitingOpen?: number;\n statePassword?: string;\n debug: boolean;\n sign: SignTxWithTag;\n offchainTx?: string;\n}\n\nexport interface ChannelHandler extends Function {\n enter?: Function;\n}\n\nexport interface ChannelState {\n signedTx: Encoded.Transaction;\n resolve: (r?: any) => void;\n reject: (e: BaseError) => void;\n sign: SignTx;\n handler?: ChannelHandler;\n onOnChainTx?: (tx: Encoded.Transaction) => void;\n onOwnWithdrawLocked?: () => void;\n onWithdrawLocked?: () => void;\n onOwnDepositLocked?: () => void;\n onDepositLocked?: () => void;\n closeTx?: string;\n}\n\nexport interface ChannelFsm {\n handler: ChannelHandler;\n state?: ChannelState | {\n resolve: Function;\n reject: Function;\n };\n}\n\nexport interface ChannelMessage {\n id?: number;\n method: string;\n params: any;\n payload?: any;\n data?: any;\n error?: ChannelMessageError;\n}\n\ninterface ChannelMessageError {\n code: number;\n message: string;\n data: [{\n message: string;\n code: number;\n }];\n request: ChannelMessage;\n}\n\n// Send ping message every 10 seconds\nconst PING_TIMEOUT_MS = 10000;\n// Close connection if pong message is not received within 15 seconds\nconst PONG_TIMEOUT_MS = 15000;\n\nexport function emit(channel: Channel, ...args: any[]): void {\n const [eventName, ...rest] = args;\n channel._eventEmitter.emit(eventName, ...rest);\n}\n\nfunction enterState(channel: Channel, nextState: ChannelFsm): void {\n if (nextState == null) {\n throw new UnknownChannelStateError();\n }\n channel._fsm = nextState;\n if (nextState?.handler?.enter != null) {\n nextState.handler.enter(channel);\n }\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n void dequeueAction(channel);\n}\n\n// TODO: rewrite to enum\nexport type ChannelStatus = 'connecting' | 'connected' | 'accepted' | 'halfSigned' | 'signed'\n| 'open' | 'closing' | 'closed' | 'died' | 'disconnected';\n\nexport function changeStatus(channel: Channel, newStatus: ChannelStatus): void {\n if (newStatus === channel._status) return;\n channel._status = newStatus;\n emit(channel, 'statusChanged', newStatus);\n}\n\nexport function changeState(channel: Channel, newState: Encoded.Transaction): void {\n channel._state = newState;\n emit(channel, 'stateChanged', newState);\n}\n\nfunction send(channel: Channel, message: ChannelMessage): void {\n if (channel._options.debug) console.log('Send message: ', message);\n channel._websocket.send(JsonBig.stringify({ jsonrpc: '2.0', ...message }));\n}\n\nexport function notify(channel: Channel, method: string, params: object = {}): void {\n send(channel, { method, params });\n}\n\nasync function dequeueAction(channel: Channel): Promise<void> {\n if (channel._isActionQueueLocked) return;\n const queue = channel._actionQueue;\n if (queue.length === 0) return;\n const index = queue.findIndex((action) => action.guard(channel, channel._fsm));\n if (index === -1) return;\n channel._actionQueue = queue.filter((_, i) => index !== i);\n channel._isActionQueueLocked = true;\n const nextState: ChannelFsm = await queue[index].action(channel, channel._fsm);\n channel._isActionQueueLocked = false;\n enterState(channel, nextState);\n}\n\nexport async function enqueueAction(\n channel: Channel,\n guard: ChannelAction['guard'],\n action: () => { handler: ChannelHandler; state?: Partial<ChannelState> },\n): Promise<any> {\n const promise = new Promise((resolve, reject) => {\n channel._actionQueue.push({\n guard,\n action() {\n const res = action();\n return { ...res, state: { ...res.state, resolve, reject } };\n },\n });\n });\n void dequeueAction(channel);\n return promise;\n}\n\nasync function handleMessage(channel: Channel, message: object): Promise<void> {\n const { handler, state: st } = channel._fsm;\n enterState(channel, await Promise.resolve(handler(channel, message, st)));\n}\n\nasync function dequeueMessage(channel: Channel): Promise<void> {\n if (channel._isMessageQueueLocked) return;\n channel._isMessageQueueLocked = true;\n while (channel._messageQueue.length > 0) {\n const message = channel._messageQueue.shift();\n if (message == null) throw new UnexpectedTsError();\n try {\n await handleMessage(channel, message);\n } catch (error) {\n emit(channel, 'error', new ChannelIncomingMessageError(error, message));\n }\n }\n channel._isMessageQueueLocked = false;\n}\n\nexport function disconnect(channel: Channel): void {\n channel._websocket.close();\n clearTimeout(channel._pingTimeoutId);\n}\n\nfunction ping(channel: Channel): void {\n clearTimeout(channel._pingTimeoutId);\n channel._pingTimeoutId = setTimeout(() => {\n notify(channel, 'channels.system', { action: 'ping' });\n channel._pingTimeoutId = setTimeout(() => {\n disconnect(channel);\n emit(channel, 'error', new ChannelPingTimedOutError());\n }, PONG_TIMEOUT_MS);\n }, PING_TIMEOUT_MS);\n}\n\nfunction onMessage(channel: Channel, data: string): void {\n const message = JsonBig.parse(data);\n if (channel._options.debug) console.log('Receive message: ', message);\n if (message.id != null) {\n const callback = channel._rpcCallbacks.get(message.id);\n if (callback == null) {\n emit(channel, 'error', new ChannelError(`Can't find callback by id: ${message.id}`));\n return;\n }\n try {\n callback(message);\n } finally {\n channel._rpcCallbacks.delete(message.id);\n }\n return;\n }\n if (message.method === 'channels.message') {\n emit(channel, 'message', message.params.data.message);\n return;\n }\n if (message.method === 'channels.system.pong') {\n if (message.params.channel_id === channel._channelId || channel._channelId == null) {\n ping(channel);\n }\n return;\n }\n channel._messageQueue.push(message);\n void dequeueMessage(channel);\n}\n\nexport async function call(channel: Channel, method: string, params: any): Promise<any> {\n return new Promise((resolve, reject) => {\n const id = channel._nextRpcMessageId;\n channel._nextRpcMessageId += 1;\n channel._rpcCallbacks.set(id, (\n message: { result: PromiseLike<any>; error?: ChannelMessageError },\n ) => {\n if (message.error != null) {\n const details = message.error.data[0].message ?? '';\n reject(new ChannelCallError(message.error.message + details));\n } else resolve(message.result);\n });\n send(channel, { method, id, params });\n });\n}\n\nexport async function initialize(\n channel: Channel,\n connectionHandler: Function,\n openHandler: Function,\n { url, ...channelOptions }: ChannelOptions,\n): Promise<void> {\n channel._options = { url, ...channelOptions };\n channel._fsm = { handler: connectionHandler };\n\n const wsUrl = new URL(url);\n Object.entries(channelOptions)\n .filter(([key]) => !['sign', 'debug'].includes(key))\n .forEach(([key, value]) => wsUrl.searchParams.set(pascalToSnake(key), value.toString()));\n wsUrl.searchParams.set('protocol', 'json-rpc');\n changeStatus(channel, 'connecting');\n channel._websocket = new W3CWebSocket(wsUrl.toString());\n await new Promise<void>((resolve, reject) => {\n Object.assign(channel._websocket, {\n onerror: reject,\n onopen: async () => {\n resolve();\n changeStatus(channel, 'connected');\n if (channelOptions.reconnectTx != null) {\n enterState(channel, { handler: openHandler });\n const signedTx = (await call(channel, 'channels.get.offchain_state', {})).signed_tx;\n changeState(channel, signedTx);\n }\n ping(channel);\n },\n onclose: () => {\n changeStatus(channel, 'disconnected');\n clearTimeout(channel._pingTimeoutId);\n },\n onmessage: ({ data }: { data: string }) => onMessage(channel, data),\n });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"internal.mjs","names":["JsonBig","pascalToSnake","ChannelCallError","ChannelPingTimedOutError","UnexpectedTsError","UnknownChannelStateError","ChannelIncomingMessageError","ChannelError","PING_TIMEOUT_MS","PONG_TIMEOUT_MS","emit","channel","args","eventName","rest","_eventEmitter","enterState","nextState","_fsm","handler","enter","dequeueAction","changeStatus","newStatus","_status","changeState","newState","_state","send","message","_options","debug","console","log","_websocket","stringify","jsonrpc","notify","method","params","_isActionQueueLocked","queue","_actionQueue","length","index","findIndex","action","guard","filter","_","i","enqueueAction","promise","Promise","resolve","reject","push","res","state","handleMessage","st","dequeueMessage","_isMessageQueueLocked","_messageQueue","shift","error","disconnect","close","clearTimeout","_pingTimeoutId","ping","setTimeout","onMessage","data","parse","id","callback","_rpcCallbacks","get","delete","channel_id","_channelId","call","_nextRpcMessageId","set","details","result","initialize","connectionHandler","openHandler","url","channelOptions","wsUrl","URL","Object","entries","key","includes","forEach","value","searchParams","toString","W3CWebSocket","assign","onerror","onopen","reconnectTx","signedTx","onclose","onmessage"],"sources":["../../src/channel/internal.ts"],"sourcesContent":["/*\n * ISC License (ISC)\n * Copyright (c) 2018 aeternity developers\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport { w3cwebsocket as W3CWebSocket } from 'websocket';\nimport BigNumber from 'bignumber.js';\nimport type Channel from './Base';\nimport JsonBig from '../utils/json-big';\nimport { pascalToSnake } from '../utils/string';\nimport { Encoded } from '../utils/encoder';\nimport {\n BaseError,\n ChannelCallError,\n ChannelPingTimedOutError,\n UnexpectedTsError,\n UnknownChannelStateError,\n ChannelIncomingMessageError,\n ChannelError,\n} from '../utils/errors';\n\nexport interface ChannelAction {\n guard: (channel: Channel, state?: ChannelFsm) => boolean;\n action: (channel: Channel, state?: ChannelFsm) => ChannelFsm;\n}\n\ninterface SignOptions {\n updates?: any[];\n [k: string]: any;\n}\nexport type SignTxWithTag = (tag: string, tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction>\n);\n// TODO: SignTx shouldn't return number or null\nexport type SignTx = (tx: Encoded.Transaction, options?: SignOptions) => (\n Promise<Encoded.Transaction | number | null>\n);\n\nexport interface ChannelOptions {\n existingFsmId?: Encoded.Bytearray;\n url: string;\n\n /**\n * @see {@link https://github.com/aeternity/protocol/blob/6734de2e4c7cce7e5e626caa8305fb535785131d/node/api/channels_api_usage.md#channel-establishing-parameters}\n */\n initiatorId: Encoded.AccountAddress;\n responderId: Encoded.AccountAddress;\n lockPeriod: number;\n pushAmount: number;\n initiatorAmount: BigNumber;\n responderAmount: BigNumber;\n channelReserve?: BigNumber | number;\n ttl?: number;\n host: string;\n port: number;\n role: 'initiator' | 'responder';\n minimumDepthStrategy?: 'txfee' | 'plain';\n minimumDepth?: number;\n fee?: BigNumber | number;\n gasPrice?: BigNumber | number;\n\n signedTx?: string;\n existingChannelId?: string;\n offChainTx?: string;\n reconnectTx?: string;\n timeoutIdle?: number;\n timeoutFundingCreate?: number;\n timeoutFundingSign?: number;\n timeoutFundingLock?: number;\n timeoutSign?: number;\n timeoutAccept?: number;\n timeoutInitialized?: number;\n timeoutAwaitingOpen?: number;\n statePassword?: string;\n debug: boolean;\n sign: SignTxWithTag;\n offchainTx?: string;\n}\n\nexport interface ChannelHandler extends Function {\n enter?: Function;\n}\n\nexport interface ChannelState {\n signedTx: Encoded.Transaction;\n resolve: (r?: any) => void;\n reject: (e: BaseError) => void;\n sign: SignTx;\n handler?: ChannelHandler;\n onOnChainTx?: (tx: Encoded.Transaction) => void;\n onOwnWithdrawLocked?: () => void;\n onWithdrawLocked?: () => void;\n onOwnDepositLocked?: () => void;\n onDepositLocked?: () => void;\n closeTx?: string;\n}\n\nexport interface ChannelFsm {\n handler: ChannelHandler;\n state?: ChannelState | {\n resolve: Function;\n reject: Function;\n };\n}\n\nexport interface ChannelMessage {\n id?: number;\n method: string;\n params: any;\n payload?: any;\n data?: any;\n error?: ChannelMessageError;\n}\n\ninterface ChannelMessageError {\n code: number;\n message: string;\n data: [{\n message: string;\n code: number;\n }];\n request: ChannelMessage;\n}\n\n// Send ping message every 10 seconds\nconst PING_TIMEOUT_MS = 10000;\n// Close connection if pong message is not received within 15 seconds\nconst PONG_TIMEOUT_MS = 15000;\n\nexport function emit(channel: Channel, ...args: any[]): void {\n const [eventName, ...rest] = args;\n channel._eventEmitter.emit(eventName, ...rest);\n}\n\nfunction enterState(channel: Channel, nextState: ChannelFsm): void {\n if (nextState == null) {\n throw new UnknownChannelStateError();\n }\n channel._fsm = nextState;\n if (nextState?.handler?.enter != null) {\n nextState.handler.enter(channel);\n }\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n void dequeueAction(channel);\n}\n\n// TODO: rewrite to enum\nexport type ChannelStatus = 'connecting' | 'connected' | 'accepted' | 'halfSigned' | 'signed'\n| 'open' | 'closing' | 'closed' | 'died' | 'disconnected';\n\nexport function changeStatus(channel: Channel, newStatus: ChannelStatus): void {\n if (newStatus === channel._status) return;\n channel._status = newStatus;\n emit(channel, 'statusChanged', newStatus);\n}\n\nexport function changeState(channel: Channel, newState: Encoded.Transaction): void {\n channel._state = newState;\n emit(channel, 'stateChanged', newState);\n}\n\nfunction send(channel: Channel, message: ChannelMessage): void {\n if (channel._options.debug) console.log('Send message: ', message);\n channel._websocket.send(JsonBig.stringify({ jsonrpc: '2.0', ...message }));\n}\n\nexport function notify(channel: Channel, method: string, params: object = {}): void {\n send(channel, { method, params });\n}\n\nasync function dequeueAction(channel: Channel): Promise<void> {\n if (channel._isActionQueueLocked) return;\n const queue = channel._actionQueue;\n if (queue.length === 0) return;\n const index = queue.findIndex((action) => action.guard(channel, channel._fsm));\n if (index === -1) return;\n channel._actionQueue = queue.filter((_, i) => index !== i);\n channel._isActionQueueLocked = true;\n const nextState: ChannelFsm = await queue[index].action(channel, channel._fsm);\n channel._isActionQueueLocked = false;\n enterState(channel, nextState);\n}\n\nexport async function enqueueAction(\n channel: Channel,\n guard: ChannelAction['guard'],\n action: () => { handler: ChannelHandler; state?: Partial<ChannelState> },\n): Promise<any> {\n const promise = new Promise((resolve, reject) => {\n channel._actionQueue.push({\n guard,\n action() {\n const res = action();\n return { ...res, state: { ...res.state, resolve, reject } };\n },\n });\n });\n void dequeueAction(channel);\n return promise;\n}\n\nasync function handleMessage(channel: Channel, message: object): Promise<void> {\n const { handler, state: st } = channel._fsm;\n enterState(channel, await Promise.resolve(handler(channel, message, st)));\n}\n\nasync function dequeueMessage(channel: Channel): Promise<void> {\n if (channel._isMessageQueueLocked) return;\n channel._isMessageQueueLocked = true;\n while (channel._messageQueue.length > 0) {\n const message = channel._messageQueue.shift();\n if (message == null) throw new UnexpectedTsError();\n try {\n await handleMessage(channel, message);\n } catch (error) {\n emit(channel, 'error', new ChannelIncomingMessageError(error, message));\n }\n }\n channel._isMessageQueueLocked = false;\n}\n\nexport function disconnect(channel: Channel): void {\n channel._websocket.close();\n clearTimeout(channel._pingTimeoutId);\n}\n\nfunction ping(channel: Channel): void {\n clearTimeout(channel._pingTimeoutId);\n channel._pingTimeoutId = setTimeout(() => {\n notify(channel, 'channels.system', { action: 'ping' });\n channel._pingTimeoutId = setTimeout(() => {\n disconnect(channel);\n emit(channel, 'error', new ChannelPingTimedOutError());\n }, PONG_TIMEOUT_MS);\n }, PING_TIMEOUT_MS);\n}\n\nfunction onMessage(channel: Channel, data: string): void {\n const message = JsonBig.parse(data);\n if (channel._options.debug) console.log('Receive message: ', message);\n if (message.id != null) {\n const callback = channel._rpcCallbacks.get(message.id);\n if (callback == null) {\n emit(channel, 'error', new ChannelError(`Can't find callback by id: ${message.id}`));\n return;\n }\n try {\n callback(message);\n } finally {\n channel._rpcCallbacks.delete(message.id);\n }\n return;\n }\n if (message.method === 'channels.message') {\n emit(channel, 'message', message.params.data.message);\n return;\n }\n if (message.method === 'channels.system.pong') {\n if (message.params.channel_id === channel._channelId || channel._channelId == null) {\n ping(channel);\n }\n return;\n }\n channel._messageQueue.push(message);\n void dequeueMessage(channel);\n}\n\nexport async function call(channel: Channel, method: string, params: any): Promise<any> {\n return new Promise((resolve, reject) => {\n const id = channel._nextRpcMessageId;\n channel._nextRpcMessageId += 1;\n channel._rpcCallbacks.set(id, (\n message: { result: PromiseLike<any>; error?: ChannelMessageError },\n ) => {\n if (message.error != null) {\n const details = message.error.data[0].message ?? '';\n reject(new ChannelCallError(message.error.message + details));\n } else resolve(message.result);\n });\n send(channel, { method, id, params });\n });\n}\n\nexport async function initialize(\n channel: Channel,\n connectionHandler: Function,\n openHandler: Function,\n { url, ...channelOptions }: ChannelOptions,\n): Promise<void> {\n channel._options = { url, ...channelOptions };\n channel._fsm = { handler: connectionHandler };\n\n const wsUrl = new URL(url);\n Object.entries(channelOptions)\n .filter(([key]) => !['sign', 'debug'].includes(key))\n .forEach(([key, value]) => wsUrl.searchParams.set(pascalToSnake(key), value.toString()));\n wsUrl.searchParams.set('protocol', 'json-rpc');\n changeStatus(channel, 'connecting');\n channel._websocket = new W3CWebSocket(wsUrl.toString());\n await new Promise<void>((resolve, reject) => {\n Object.assign(channel._websocket, {\n onerror: reject,\n onopen: async () => {\n resolve();\n changeStatus(channel, 'connected');\n if (channelOptions.reconnectTx != null) {\n enterState(channel, { handler: openHandler });\n const { signedTx } = await channel.state();\n changeState(channel, signedTx);\n }\n ping(channel);\n },\n onclose: () => {\n changeStatus(channel, 'disconnected');\n clearTimeout(channel._pingTimeoutId);\n },\n onmessage: ({ data }: { data: string }) => onMessage(channel, data),\n });\n });\n}\n"],"mappings":"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"}
|
|
@@ -8,33 +8,15 @@
|
|
|
8
8
|
import { Encoder as Calldata } from '@aeternity/aepp-calldata';
|
|
9
9
|
import { Tag, AensName } from '../tx/builder/constants';
|
|
10
10
|
import { unpackTx } from '../tx/builder';
|
|
11
|
-
import {
|
|
11
|
+
import { BuildTxOptions } from '../tx';
|
|
12
|
+
import { send, SendOptions } from '../spend';
|
|
12
13
|
import { Encoded } from '../utils/encoder';
|
|
13
|
-
import { Aci as BaseAci } from '../apis/compiler';
|
|
14
14
|
import { ContractCallObject as NodeContractCallObject, ContractCallReturnType, Event as NodeEvent } from '../apis/node';
|
|
15
|
-
import
|
|
15
|
+
import CompilerBase, { Aci } from './compiler/Base';
|
|
16
16
|
import Node, { TransformNodeType } from '../Node';
|
|
17
|
+
import { txDryRun } from '../chain';
|
|
17
18
|
import AccountBase from '../account/Base';
|
|
18
|
-
|
|
19
|
-
arguments: any[];
|
|
20
|
-
name: string;
|
|
21
|
-
payable: boolean;
|
|
22
|
-
returns: string;
|
|
23
|
-
stateful: boolean;
|
|
24
|
-
}
|
|
25
|
-
interface Aci extends BaseAci {
|
|
26
|
-
encodedAci: {
|
|
27
|
-
contract: {
|
|
28
|
-
name: string;
|
|
29
|
-
event: any;
|
|
30
|
-
kind: string;
|
|
31
|
-
state: any;
|
|
32
|
-
type_defs: any[];
|
|
33
|
-
functions: FunctionACI[];
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
externalEncodedAci: any[];
|
|
37
|
-
}
|
|
19
|
+
type FunctionAci = Aci['encodedAci']['contract']['functions'][0];
|
|
38
20
|
interface Event extends NodeEvent {
|
|
39
21
|
address: Encoded.ContractAddress;
|
|
40
22
|
data: Encoded.ContractBytearray;
|
|
@@ -143,7 +125,7 @@ declare class Contract<M extends ContractMethodsBase> {
|
|
|
143
125
|
returnType: ContractCallReturnType;
|
|
144
126
|
returnValue: Encoded.ContractBytearray;
|
|
145
127
|
}, transaction: string): void;
|
|
146
|
-
protected _sendAndProcess(tx: Encoded.Transaction, options:
|
|
128
|
+
protected _sendAndProcess(tx: Encoded.Transaction, options: SendOptions): Promise<SendAndProcessReturnType>;
|
|
147
129
|
_estimateGas<Fn extends MethodNames<M>>(name: Fn, params: MethodParameters<M, Fn>, options?: object): Promise<number>;
|
|
148
130
|
/**
|
|
149
131
|
* Deploy contract
|
|
@@ -151,17 +133,18 @@ declare class Contract<M extends ContractMethodsBase> {
|
|
|
151
133
|
* @param options - Options
|
|
152
134
|
* @returns deploy info
|
|
153
135
|
*/
|
|
154
|
-
$deploy(params: MethodParameters<M, 'init'>, options?: Parameters<Contract<M>['$call']>[2] &
|
|
136
|
+
$deploy(params: MethodParameters<M, 'init'>, options?: Parameters<Contract<M>['$call']>[2] & Partial<BuildTxOptions<Tag.ContractCreateTx, 'ownerId' | 'code' | 'callData'>>): Promise<Omit<SendAndProcessReturnType, 'hash'> & {
|
|
155
137
|
transaction?: Encoded.TxHash;
|
|
156
138
|
owner?: Encoded.AccountAddress;
|
|
157
139
|
address?: Encoded.ContractAddress;
|
|
140
|
+
decodedEvents?: ReturnType<Contract<M>['$decodeEvents']>;
|
|
158
141
|
}>;
|
|
159
142
|
/**
|
|
160
143
|
* Get function schema from contract ACI object
|
|
161
144
|
* @param name - Function name
|
|
162
145
|
* @returns function ACI
|
|
163
146
|
*/
|
|
164
|
-
protected _getFunctionACI(name: string): Partial<
|
|
147
|
+
protected _getFunctionACI(name: string): Partial<FunctionAci>;
|
|
165
148
|
/**
|
|
166
149
|
* Call contract function
|
|
167
150
|
* @param fn - Function name
|
|
@@ -169,7 +152,11 @@ declare class Contract<M extends ContractMethodsBase> {
|
|
|
169
152
|
* @param options - Array of function arguments
|
|
170
153
|
* @returns CallResult
|
|
171
154
|
*/
|
|
172
|
-
$call<Fn extends MethodNames<M>>(fn: Fn, params: MethodParameters<M, Fn>, options?:
|
|
155
|
+
$call<Fn extends MethodNames<M>>(fn: Fn, params: MethodParameters<M, Fn>, options?: Partial<BuildTxOptions<Tag.ContractCallTx, 'callerId' | 'contractId' | 'callData'>> & Parameters<Contract<M>['$decodeEvents']>[1] & Omit<Parameters<Contract<M>['_sendAndProcess']>[1], 'onAccount' | 'onNode'> & Omit<Parameters<typeof txDryRun>[2], 'onNode'> & {
|
|
156
|
+
onAccount?: AccountBase;
|
|
157
|
+
onNode?: Node;
|
|
158
|
+
callStatic?: boolean;
|
|
159
|
+
}): Promise<{
|
|
173
160
|
decodedResult?: any;
|
|
174
161
|
decodedEvents?: ReturnType<Contract<M>['$decodeEvents']>;
|
|
175
162
|
} & SendAndProcessReturnType>;
|
|
@@ -195,7 +182,7 @@ declare class Contract<M extends ContractMethodsBase> {
|
|
|
195
182
|
$decodeEvents(events: Event[], { omitUnknown, ...opt }?: {
|
|
196
183
|
omitUnknown?: boolean;
|
|
197
184
|
} & Parameters<Contract<M>['_getContractNameByEvent']>[2]): DecodedEvent[];
|
|
198
|
-
static initialize<M extends ContractMethodsBase>({ onCompiler, onNode,
|
|
185
|
+
static initialize<M extends ContractMethodsBase>({ onCompiler, onNode, bytecode, aci, address, sourceCodePath, sourceCode, fileSystem, validateBytecode, ...otherOptions }: Omit<ConstructorParameters<typeof Contract>[0], 'aci' | 'address'> & {
|
|
199
186
|
validateBytecode?: boolean;
|
|
200
187
|
aci?: Aci;
|
|
201
188
|
address?: Encoded.ContractAddress | AensName;
|
|
@@ -203,29 +190,17 @@ declare class Contract<M extends ContractMethodsBase> {
|
|
|
203
190
|
_aci: Aci;
|
|
204
191
|
_name: string;
|
|
205
192
|
_calldata: Calldata;
|
|
206
|
-
$options:
|
|
207
|
-
sourceCode?: string;
|
|
208
|
-
bytecode?: Encoded.ContractBytearray;
|
|
209
|
-
address?: Encoded.ContractAddress;
|
|
210
|
-
onCompiler: CompilerHttp;
|
|
211
|
-
onNode: Node;
|
|
212
|
-
omitUnknown?: boolean;
|
|
213
|
-
contractAddressToName?: {
|
|
214
|
-
[key: Encoded.ContractAddress]: string;
|
|
215
|
-
};
|
|
216
|
-
[key: string]: any;
|
|
217
|
-
};
|
|
193
|
+
$options: Omit<ConstructorParameters<typeof Contract>[0], 'aci'>;
|
|
218
194
|
constructor({ aci, ...otherOptions }: {
|
|
219
|
-
|
|
220
|
-
onCompiler: CompilerHttp;
|
|
195
|
+
onCompiler?: CompilerBase;
|
|
221
196
|
onNode: Node;
|
|
222
|
-
sourceCode?: string;
|
|
223
197
|
bytecode?: Encoded.ContractBytearray;
|
|
224
198
|
aci: Aci;
|
|
225
199
|
address?: Encoded.ContractAddress;
|
|
226
|
-
|
|
227
|
-
[
|
|
228
|
-
|
|
200
|
+
sourceCodePath?: Parameters<CompilerBase['compile']>[0];
|
|
201
|
+
sourceCode?: Parameters<CompilerBase['compileBySourceCode']>[0];
|
|
202
|
+
fileSystem?: Parameters<CompilerBase['compileBySourceCode']>[1];
|
|
203
|
+
} & Parameters<Contract<M>['$deploy']>[1]);
|
|
229
204
|
}
|
|
230
205
|
interface ContractWithMethodsClass {
|
|
231
206
|
new <M extends ContractMethodsBase>(options: ConstructorParameters<typeof Contract>[0]): ContractWithMethods<M>;
|
package/es/contract/Contract.mjs
CHANGED
|
@@ -38,7 +38,7 @@ import { send } from "../spend.mjs";
|
|
|
38
38
|
import { decode } from "../utils/encoder.mjs";
|
|
39
39
|
import { MissingContractDefError, MissingContractAddressError, InactiveContractError, BytecodeMismatchError, DuplicateContractError, MissingFunctionNameError, InvalidMethodInvocationError, NotPayableFunctionError, TypeError, NodeInvocationError, IllegalArgumentError, NoSuchContractFunctionError, MissingEventDefinitionError, AmbiguousEventDefinitionError, UnexpectedTsError, InternalError, NoWalletConnectedError } from "../utils/errors.mjs";
|
|
40
40
|
import { hash as calcHash } from "../utils/crypto.mjs";
|
|
41
|
-
import { getAccount, getContract, getContractByteCode,
|
|
41
|
+
import { getAccount, getContract, getContractByteCode, resolveName, txDryRun } from "../chain.mjs";
|
|
42
42
|
import { concatBuffers } from "../utils/other.mjs";
|
|
43
43
|
import { isNameValid, produceNameId } from "../tx/builder/helpers.mjs";
|
|
44
44
|
/**
|
|
@@ -114,12 +114,8 @@ class Contract {
|
|
|
114
114
|
async $compile() {
|
|
115
115
|
if (this.$options.bytecode != null) return this.$options.bytecode;
|
|
116
116
|
if (this.$options.sourceCode == null) throw new IllegalArgumentError('Can\'t compile without source code');
|
|
117
|
-
this.$options.
|
|
118
|
-
|
|
119
|
-
options: {
|
|
120
|
-
fileSystem: this.$options.fileSystem
|
|
121
|
-
}
|
|
122
|
-
})).bytecode;
|
|
117
|
+
if (this.$options.onCompiler == null) throw new IllegalArgumentError('Can\'t compile without compiler');
|
|
118
|
+
this.$options.bytecode = (await this.$options.onCompiler.compileBySourceCode(this.$options.sourceCode, this.$options.fileSystem)).bytecode;
|
|
123
119
|
return this.$options.bytecode;
|
|
124
120
|
}
|
|
125
121
|
_handleCallError(_ref, transaction) {
|
|
@@ -143,11 +139,10 @@ class Contract {
|
|
|
143
139
|
throw new NodeInvocationError(message, transaction);
|
|
144
140
|
}
|
|
145
141
|
async _sendAndProcess(tx, options) {
|
|
146
|
-
|
|
142
|
+
const txData = await send(tx, {
|
|
147
143
|
...this.$options,
|
|
148
144
|
...options
|
|
149
|
-
};
|
|
150
|
-
const txData = await send(tx, options);
|
|
145
|
+
});
|
|
151
146
|
const result = {
|
|
152
147
|
hash: txData.hash,
|
|
153
148
|
tx: unpackTx(txData.rawTx),
|
|
@@ -189,15 +184,23 @@ class Contract {
|
|
|
189
184
|
* @returns deploy info
|
|
190
185
|
*/
|
|
191
186
|
async $deploy(params, options) {
|
|
192
|
-
var _opt$gasLimit;
|
|
193
|
-
const
|
|
187
|
+
var _opt$gasLimit, _other$result;
|
|
188
|
+
const {
|
|
189
|
+
callStatic,
|
|
190
|
+
...opt
|
|
191
|
+
} = {
|
|
194
192
|
...this.$options,
|
|
195
193
|
...options
|
|
196
194
|
};
|
|
197
195
|
if (this.$options.bytecode == null) await this.$compile();
|
|
198
|
-
if (
|
|
196
|
+
if (callStatic === true) return this.$call('init', params, {
|
|
197
|
+
...opt,
|
|
198
|
+
callStatic
|
|
199
|
+
});
|
|
199
200
|
if (this.$options.address != null) throw new DuplicateContractError();
|
|
201
|
+
if (opt.onAccount == null) throw new IllegalArgumentError('Can\'t deploy without account');
|
|
200
202
|
const ownerId = opt.onAccount.address;
|
|
203
|
+
if (this.$options.bytecode == null) throw new IllegalArgumentError('Can\'t deploy without bytecode');
|
|
201
204
|
const tx = await _buildTx(Tag.ContractCreateTx, {
|
|
202
205
|
...opt,
|
|
203
206
|
gasLimit: (_opt$gasLimit = opt.gasLimit) !== null && _opt$gasLimit !== void 0 ? _opt$gasLimit : await this._estimateGas('init', params, opt),
|
|
@@ -209,9 +212,15 @@ class Contract {
|
|
|
209
212
|
const {
|
|
210
213
|
hash,
|
|
211
214
|
...other
|
|
212
|
-
} = await this._sendAndProcess(tx,
|
|
215
|
+
} = await this._sendAndProcess(tx, {
|
|
216
|
+
...opt,
|
|
217
|
+
onAccount: opt.onAccount
|
|
218
|
+
});
|
|
213
219
|
return {
|
|
214
220
|
...other,
|
|
221
|
+
...(((_other$result = other.result) === null || _other$result === void 0 ? void 0 : _other$result.log) != null && {
|
|
222
|
+
decodedEvents: this.$decodeEvents(other.result.log, opt)
|
|
223
|
+
}),
|
|
215
224
|
owner: ownerId,
|
|
216
225
|
transaction: hash,
|
|
217
226
|
address: this.$options.address
|
|
@@ -243,7 +252,11 @@ class Contract {
|
|
|
243
252
|
*/
|
|
244
253
|
async $call(fn, params) {
|
|
245
254
|
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
246
|
-
const
|
|
255
|
+
const {
|
|
256
|
+
callStatic,
|
|
257
|
+
top,
|
|
258
|
+
...opt
|
|
259
|
+
} = {
|
|
247
260
|
...this.$options,
|
|
248
261
|
...options
|
|
249
262
|
};
|
|
@@ -253,35 +266,34 @@ class Contract {
|
|
|
253
266
|
onNode
|
|
254
267
|
} = opt;
|
|
255
268
|
if (fn == null) throw new MissingFunctionNameError();
|
|
256
|
-
if (fn === 'init' &&
|
|
257
|
-
if (fn !== 'init' && opt.amount > 0 && fnACI.payable === false)
|
|
269
|
+
if (fn === 'init' && callStatic !== true) throw new InvalidMethodInvocationError('"init" can be called only via dryRun');
|
|
270
|
+
if (fn !== 'init' && opt.amount != null && opt.amount > 0 && fnACI.payable === false) {
|
|
271
|
+
throw new NotPayableFunctionError(opt.amount, fn);
|
|
272
|
+
}
|
|
258
273
|
let callerId;
|
|
259
274
|
try {
|
|
275
|
+
if (opt.onAccount == null) throw new InternalError('Use fallback account');
|
|
260
276
|
callerId = opt.onAccount.address;
|
|
261
277
|
} catch (error) {
|
|
262
|
-
const useFallbackAccount =
|
|
278
|
+
const useFallbackAccount = callStatic === true && (error instanceof TypeError && error.message === 'Account should be an address (ak-prefixed string), or instance of AccountBase, got undefined instead' || error instanceof NoWalletConnectedError);
|
|
263
279
|
if (!useFallbackAccount) throw error;
|
|
264
280
|
callerId = DRY_RUN_ACCOUNT.pub;
|
|
265
281
|
}
|
|
266
282
|
const callData = this._calldata.encode(this._name, fn, params);
|
|
267
283
|
let res;
|
|
268
|
-
if (
|
|
269
|
-
if (
|
|
270
|
-
|
|
284
|
+
if (callStatic === true) {
|
|
285
|
+
if (opt.nonce == null && top != null) {
|
|
286
|
+
const topKey = typeof top === 'number' ? 'height' : 'hash';
|
|
287
|
+
opt.nonce = (await getAccount(callerId, {
|
|
288
|
+
[topKey]: top,
|
|
271
289
|
onNode
|
|
272
|
-
})).
|
|
290
|
+
})).nonce + 1;
|
|
273
291
|
}
|
|
274
292
|
const txOpt = {
|
|
275
293
|
...opt,
|
|
276
294
|
onNode,
|
|
277
295
|
callData
|
|
278
296
|
};
|
|
279
|
-
if (opt.nonce == null && opt.top != null) {
|
|
280
|
-
opt.nonce = (await getAccount(callerId, {
|
|
281
|
-
hash: opt.top,
|
|
282
|
-
onNode
|
|
283
|
-
})).nonce + 1;
|
|
284
|
-
}
|
|
285
297
|
let tx;
|
|
286
298
|
if (fn === 'init') {
|
|
287
299
|
if (this.$options.bytecode == null) throw new IllegalArgumentError('Can\'t dry-run "init" without bytecode');
|
|
@@ -301,7 +313,10 @@ class Contract {
|
|
|
301
313
|
const {
|
|
302
314
|
callObj,
|
|
303
315
|
...dryRunOther
|
|
304
|
-
} = await txDryRun(tx, callerId,
|
|
316
|
+
} = await txDryRun(tx, callerId, {
|
|
317
|
+
...opt,
|
|
318
|
+
top
|
|
319
|
+
});
|
|
305
320
|
if (callObj == null) throw new UnexpectedTsError();
|
|
306
321
|
this._handleCallError({
|
|
307
322
|
returnType: callObj.returnType,
|
|
@@ -314,6 +329,7 @@ class Contract {
|
|
|
314
329
|
};
|
|
315
330
|
} else {
|
|
316
331
|
var _opt$gasLimit2;
|
|
332
|
+
if (top != null) throw new IllegalArgumentError('Can\'t handle `top` option in on-chain contract call');
|
|
317
333
|
if (contractId == null) throw new MissingContractAddressError('Can\'t call contract without address');
|
|
318
334
|
const tx = await _buildTx(Tag.ContractCallTx, {
|
|
319
335
|
...opt,
|
|
@@ -322,9 +338,13 @@ class Contract {
|
|
|
322
338
|
contractId,
|
|
323
339
|
callData
|
|
324
340
|
});
|
|
325
|
-
|
|
341
|
+
if (opt.onAccount == null) throw new IllegalArgumentError('Can\'t call contract on chain without account');
|
|
342
|
+
res = await this._sendAndProcess(tx, {
|
|
343
|
+
...opt,
|
|
344
|
+
onAccount: opt.onAccount
|
|
345
|
+
});
|
|
326
346
|
}
|
|
327
|
-
if (
|
|
347
|
+
if (callStatic === true || res.txData.blockHeight != null) {
|
|
328
348
|
res.decodedResult = fnACI.returns != null && fnACI.returns !== 'unit' && fn !== 'init' && this._calldata.decode(this._name, fn, res.result.returnValue);
|
|
329
349
|
res.decodedEvents = this.$decodeEvents(res.result.log, opt);
|
|
330
350
|
}
|
|
@@ -417,22 +437,24 @@ class Contract {
|
|
|
417
437
|
let {
|
|
418
438
|
onCompiler,
|
|
419
439
|
onNode,
|
|
420
|
-
sourceCode,
|
|
421
440
|
bytecode,
|
|
422
441
|
aci,
|
|
423
442
|
address,
|
|
443
|
+
sourceCodePath,
|
|
444
|
+
sourceCode,
|
|
424
445
|
fileSystem,
|
|
425
446
|
validateBytecode,
|
|
426
447
|
...otherOptions
|
|
427
448
|
} = _ref8;
|
|
428
|
-
if (aci == null &&
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
449
|
+
if (aci == null && onCompiler != null) {
|
|
450
|
+
let res;
|
|
451
|
+
if (sourceCodePath != null) res = await onCompiler.compile(sourceCodePath);
|
|
452
|
+
if (sourceCode != null) res = await onCompiler.compileBySourceCode(sourceCode, fileSystem);
|
|
453
|
+
if (res != null) {
|
|
454
|
+
var _bytecode;
|
|
455
|
+
aci = res.aci;
|
|
456
|
+
(_bytecode = bytecode) !== null && _bytecode !== void 0 ? _bytecode : bytecode = res.bytecode;
|
|
457
|
+
}
|
|
436
458
|
}
|
|
437
459
|
if (aci == null) throw new MissingContractDefError();
|
|
438
460
|
if (address != null) {
|
|
@@ -450,18 +472,16 @@ class Contract {
|
|
|
450
472
|
});
|
|
451
473
|
if (contract.active == null) throw new InactiveContractError(address);
|
|
452
474
|
}
|
|
453
|
-
if (validateBytecode
|
|
475
|
+
if (validateBytecode === true) {
|
|
454
476
|
if (address == null) throw new MissingContractAddressError('Can\'t validate bytecode without contract address');
|
|
455
477
|
const onChanBytecode = (await getContractByteCode(address, {
|
|
456
478
|
onNode
|
|
457
479
|
})).bytecode;
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
}
|
|
464
|
-
}).then(() => true, () => false) : bytecode === onChanBytecode;
|
|
480
|
+
let isValid = false;
|
|
481
|
+
if (bytecode != null) isValid = bytecode === onChanBytecode;else if (sourceCode != null) {
|
|
482
|
+
if (onCompiler == null) throw new IllegalArgumentError('Can\'t validate bytecode without compiler');
|
|
483
|
+
isValid = await onCompiler.validateBySourceCode(onChanBytecode, sourceCode, fileSystem);
|
|
484
|
+
}
|
|
465
485
|
if (!isValid) throw new BytecodeMismatchError(sourceCode != null ? 'source code' : 'bytecode');
|
|
466
486
|
}
|
|
467
487
|
return new ContractWithMethods({
|
|
@@ -484,10 +504,7 @@ class Contract {
|
|
|
484
504
|
this._aci = aci;
|
|
485
505
|
this._name = aci.encodedAci.contract.name;
|
|
486
506
|
this._calldata = new Calldata([aci.encodedAci, ...aci.externalEncodedAci]);
|
|
487
|
-
this.$options =
|
|
488
|
-
callStatic: false,
|
|
489
|
-
...otherOptions
|
|
490
|
-
};
|
|
507
|
+
this.$options = otherOptions;
|
|
491
508
|
|
|
492
509
|
/**
|
|
493
510
|
* Generate proto function based on contract function using Contract ACI schema
|