crypto-aio 0.0.2 → 0.1.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/CHANGELOG.md +17 -0
- package/README.md +144 -14
- package/dist/adapters/avalanche/address.d.ts +15 -0
- package/dist/adapters/avalanche/address.js +74 -0
- package/dist/adapters/avalanche/address.js.map +1 -0
- package/dist/adapters/avalanche/api.d.ts +100 -0
- package/dist/adapters/avalanche/api.js +381 -0
- package/dist/adapters/avalanche/api.js.map +1 -0
- package/dist/adapters/avalanche/builder.d.ts +13 -0
- package/dist/adapters/avalanche/builder.js +336 -0
- package/dist/adapters/avalanche/builder.js.map +1 -0
- package/dist/adapters/avalanche/cb58.d.ts +7 -0
- package/dist/adapters/avalanche/cb58.js +49 -0
- package/dist/adapters/avalanche/cb58.js.map +1 -0
- package/dist/adapters/avalanche/chains.d.ts +21 -0
- package/dist/adapters/avalanche/chains.js +79 -0
- package/dist/adapters/avalanche/chains.js.map +1 -0
- package/dist/adapters/avalanche/codec.d.ts +94 -0
- package/dist/adapters/avalanche/codec.js +371 -0
- package/dist/adapters/avalanche/codec.js.map +1 -0
- package/dist/adapters/avalanche/context.d.ts +59 -0
- package/dist/adapters/avalanche/context.js +114 -0
- package/dist/adapters/avalanche/context.js.map +1 -0
- package/dist/adapters/avalanche/decode.d.ts +16 -0
- package/dist/adapters/avalanche/decode.js +101 -0
- package/dist/adapters/avalanche/decode.js.map +1 -0
- package/dist/adapters/avalanche/driver.d.ts +22 -0
- package/dist/adapters/avalanche/driver.js +81 -0
- package/dist/adapters/avalanche/driver.js.map +1 -0
- package/dist/adapters/avalanche/errors.d.ts +18 -0
- package/dist/adapters/avalanche/errors.js +61 -0
- package/dist/adapters/avalanche/errors.js.map +1 -0
- package/dist/adapters/avalanche/fees.d.ts +23 -0
- package/dist/adapters/avalanche/fees.js +105 -0
- package/dist/adapters/avalanche/fees.js.map +1 -0
- package/dist/adapters/avalanche/index.d.ts +19 -0
- package/dist/adapters/avalanche/index.js +8 -0
- package/dist/adapters/avalanche/index.js.map +1 -0
- package/dist/adapters/avalanche/network.d.ts +37 -0
- package/dist/adapters/avalanche/network.js +135 -0
- package/dist/adapters/avalanche/network.js.map +1 -0
- package/dist/adapters/avalanche/plugin.d.ts +21 -0
- package/dist/adapters/avalanche/plugin.js +46 -0
- package/dist/adapters/avalanche/plugin.js.map +1 -0
- package/dist/adapters/avalanche/presets.d.ts +6 -0
- package/dist/adapters/avalanche/presets.js +86 -0
- package/dist/adapters/avalanche/presets.js.map +1 -0
- package/dist/adapters/avalanche/proofs.d.ts +41 -0
- package/dist/adapters/avalanche/proofs.js +270 -0
- package/dist/adapters/avalanche/proofs.js.map +1 -0
- package/dist/adapters/avalanche/reader.d.ts +40 -0
- package/dist/adapters/avalanche/reader.js +231 -0
- package/dist/adapters/avalanche/reader.js.map +1 -0
- package/dist/adapters/avalanche/sdk.d.ts +182 -0
- package/dist/adapters/avalanche/sdk.js +21 -0
- package/dist/adapters/avalanche/sdk.js.map +1 -0
- package/dist/adapters/avalanche/types.d.ts +86 -0
- package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
- package/dist/adapters/avalanche/types.js.map +1 -0
- package/dist/adapters/evm/builder.d.ts +11 -0
- package/dist/adapters/evm/builder.js +326 -0
- package/dist/adapters/evm/builder.js.map +1 -0
- package/dist/adapters/evm/chains.d.ts +6 -0
- package/dist/adapters/evm/chains.js +203 -0
- package/dist/adapters/evm/chains.js.map +1 -0
- package/dist/adapters/evm/client.d.ts +84 -0
- package/dist/adapters/evm/client.js +335 -0
- package/dist/adapters/evm/client.js.map +1 -0
- package/dist/adapters/evm/decode.d.ts +35 -0
- package/dist/adapters/evm/decode.js +170 -0
- package/dist/adapters/evm/decode.js.map +1 -0
- package/dist/adapters/evm/driver.d.ts +8 -0
- package/dist/adapters/evm/driver.js +61 -0
- package/dist/adapters/evm/driver.js.map +1 -0
- package/dist/adapters/evm/errors.d.ts +20 -0
- package/dist/adapters/evm/errors.js +110 -0
- package/dist/adapters/evm/errors.js.map +1 -0
- package/dist/adapters/evm/ethers-client.d.ts +43 -0
- package/dist/adapters/evm/ethers-client.js +135 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +79 -0
- package/dist/adapters/evm/fees.js +234 -0
- package/dist/adapters/evm/fees.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +20 -0
- package/dist/adapters/evm/index.js +11 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +60 -0
- package/dist/adapters/evm/network.js +131 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +36 -0
- package/dist/adapters/evm/plugin.js +102 -0
- package/dist/adapters/evm/plugin.js.map +1 -0
- package/dist/adapters/evm/presets.d.ts +2 -0
- package/dist/adapters/evm/presets.js +105 -0
- package/dist/adapters/evm/presets.js.map +1 -0
- package/dist/adapters/evm/proofs.d.ts +19 -0
- package/dist/adapters/evm/proofs.js +358 -0
- package/dist/adapters/evm/proofs.js.map +1 -0
- package/dist/adapters/evm/rawtx.d.ts +25 -0
- package/dist/adapters/evm/rawtx.js +176 -0
- package/dist/adapters/evm/rawtx.js.map +1 -0
- package/dist/adapters/evm/reader.d.ts +65 -0
- package/dist/adapters/evm/reader.js +292 -0
- package/dist/adapters/evm/reader.js.map +1 -0
- package/dist/adapters/evm/rpc.d.ts +39 -0
- package/dist/adapters/evm/rpc.js +152 -0
- package/dist/adapters/evm/rpc.js.map +1 -0
- package/dist/adapters/evm/tokens.d.ts +7 -0
- package/dist/adapters/evm/tokens.js +23 -0
- package/dist/adapters/evm/tokens.js.map +1 -0
- package/dist/adapters/evm/types.d.ts +255 -0
- package/dist/{type/account.js → adapters/evm/types.js} +1 -1
- package/dist/adapters/evm/types.js.map +1 -0
- package/dist/adapters/evm/web3-client.d.ts +23 -0
- package/dist/adapters/evm/web3-client.js +159 -0
- package/dist/adapters/evm/web3-client.js.map +1 -0
- package/dist/adapters/solana/builder.d.ts +18 -0
- package/dist/adapters/solana/builder.js +545 -0
- package/dist/adapters/solana/builder.js.map +1 -0
- package/dist/adapters/solana/chains.d.ts +13 -0
- package/dist/adapters/solana/chains.js +37 -0
- package/dist/adapters/solana/chains.js.map +1 -0
- package/dist/adapters/solana/decode.d.ts +111 -0
- package/dist/adapters/solana/decode.js +595 -0
- package/dist/adapters/solana/decode.js.map +1 -0
- package/dist/adapters/solana/driver.d.ts +15 -0
- package/dist/adapters/solana/driver.js +72 -0
- package/dist/adapters/solana/driver.js.map +1 -0
- package/dist/adapters/solana/errors.d.ts +36 -0
- package/dist/adapters/solana/errors.js +154 -0
- package/dist/adapters/solana/errors.js.map +1 -0
- package/dist/adapters/solana/fees.d.ts +68 -0
- package/dist/adapters/solana/fees.js +205 -0
- package/dist/adapters/solana/fees.js.map +1 -0
- package/dist/adapters/solana/heights.d.ts +47 -0
- package/dist/adapters/solana/heights.js +185 -0
- package/dist/adapters/solana/heights.js.map +1 -0
- package/dist/adapters/solana/history.d.ts +10 -0
- package/dist/adapters/solana/history.js +71 -0
- package/dist/adapters/solana/history.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +16 -0
- package/dist/adapters/solana/index.js +9 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/keys.d.ts +13 -0
- package/dist/adapters/solana/keys.js +69 -0
- package/dist/adapters/solana/keys.js.map +1 -0
- package/dist/adapters/solana/network.d.ts +24 -0
- package/dist/adapters/solana/network.js +95 -0
- package/dist/adapters/solana/network.js.map +1 -0
- package/dist/adapters/solana/plugin.d.ts +18 -0
- package/dist/adapters/solana/plugin.js +41 -0
- package/dist/adapters/solana/plugin.js.map +1 -0
- package/dist/adapters/solana/presets.d.ts +2 -0
- package/dist/adapters/solana/presets.js +77 -0
- package/dist/adapters/solana/presets.js.map +1 -0
- package/dist/adapters/solana/programs.d.ts +44 -0
- package/dist/adapters/solana/programs.js +159 -0
- package/dist/adapters/solana/programs.js.map +1 -0
- package/dist/adapters/solana/proofs.d.ts +56 -0
- package/dist/adapters/solana/proofs.js +540 -0
- package/dist/adapters/solana/proofs.js.map +1 -0
- package/dist/adapters/solana/reader.d.ts +82 -0
- package/dist/adapters/solana/reader.js +326 -0
- package/dist/adapters/solana/reader.js.map +1 -0
- package/dist/adapters/solana/rpc.d.ts +102 -0
- package/dist/adapters/solana/rpc.js +301 -0
- package/dist/adapters/solana/rpc.js.map +1 -0
- package/dist/adapters/solana/tokens.d.ts +7 -0
- package/dist/adapters/solana/tokens.js +19 -0
- package/dist/adapters/solana/tokens.js.map +1 -0
- package/dist/adapters/solana/types.d.ts +121 -0
- package/dist/{type/lib-types.js → adapters/solana/types.js} +1 -1
- package/dist/adapters/solana/types.js.map +1 -0
- package/dist/adapters/solana/web3.d.ts +5 -0
- package/dist/adapters/solana/web3.js +83 -0
- package/dist/adapters/solana/web3.js.map +1 -0
- package/dist/adapters/solana/wire.d.ts +62 -0
- package/dist/adapters/solana/wire.js +168 -0
- package/dist/adapters/solana/wire.js.map +1 -0
- package/dist/adapters/ton/address.d.ts +43 -0
- package/dist/adapters/ton/address.js +168 -0
- package/dist/adapters/ton/address.js.map +1 -0
- package/dist/adapters/ton/api.d.ts +344 -0
- package/dist/adapters/ton/api.js +942 -0
- package/dist/adapters/ton/api.js.map +1 -0
- package/dist/adapters/ton/builder.d.ts +18 -0
- package/dist/adapters/ton/builder.js +701 -0
- package/dist/adapters/ton/builder.js.map +1 -0
- package/dist/adapters/ton/chains.d.ts +16 -0
- package/dist/adapters/ton/chains.js +39 -0
- package/dist/adapters/ton/chains.js.map +1 -0
- package/dist/adapters/ton/decode.d.ts +43 -0
- package/dist/adapters/ton/decode.js +219 -0
- package/dist/adapters/ton/decode.js.map +1 -0
- package/dist/adapters/ton/driver.d.ts +10 -0
- package/dist/adapters/ton/driver.js +117 -0
- package/dist/adapters/ton/driver.js.map +1 -0
- package/dist/adapters/ton/errors.d.ts +36 -0
- package/dist/adapters/ton/errors.js +89 -0
- package/dist/adapters/ton/errors.js.map +1 -0
- package/dist/adapters/ton/fees.d.ts +28 -0
- package/dist/adapters/ton/fees.js +121 -0
- package/dist/adapters/ton/fees.js.map +1 -0
- package/dist/adapters/ton/index.d.ts +16 -0
- package/dist/adapters/ton/index.js +9 -0
- package/dist/adapters/ton/index.js.map +1 -0
- package/dist/adapters/ton/messages.d.ts +157 -0
- package/dist/adapters/ton/messages.js +397 -0
- package/dist/adapters/ton/messages.js.map +1 -0
- package/dist/adapters/ton/native-client.d.ts +10 -0
- package/dist/adapters/ton/native-client.js +47 -0
- package/dist/adapters/ton/native-client.js.map +1 -0
- package/dist/adapters/ton/network.d.ts +58 -0
- package/dist/adapters/ton/network.js +207 -0
- package/dist/adapters/ton/network.js.map +1 -0
- package/dist/adapters/ton/plugin.d.ts +24 -0
- package/dist/adapters/ton/plugin.js +57 -0
- package/dist/adapters/ton/plugin.js.map +1 -0
- package/dist/adapters/ton/presets.d.ts +6 -0
- package/dist/adapters/ton/presets.js +94 -0
- package/dist/adapters/ton/presets.js.map +1 -0
- package/dist/adapters/ton/proofs.d.ts +66 -0
- package/dist/adapters/ton/proofs.js +813 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +194 -0
- package/dist/adapters/ton/reader.js +781 -0
- package/dist/adapters/ton/reader.js.map +1 -0
- package/dist/adapters/ton/tokens.d.ts +10 -0
- package/dist/adapters/ton/tokens.js +27 -0
- package/dist/adapters/ton/tokens.js.map +1 -0
- package/dist/adapters/ton/trace.d.ts +48 -0
- package/dist/adapters/ton/trace.js +277 -0
- package/dist/adapters/ton/trace.js.map +1 -0
- package/dist/adapters/ton/types.d.ts +105 -0
- package/dist/adapters/ton/types.js +3 -0
- package/dist/adapters/ton/types.js.map +1 -0
- package/dist/adapters/ton/wallets.d.ts +86 -0
- package/dist/adapters/ton/wallets.js +373 -0
- package/dist/adapters/ton/wallets.js.map +1 -0
- package/dist/adapters/tron/abi.d.ts +39 -0
- package/dist/adapters/tron/abi.js +110 -0
- package/dist/adapters/tron/abi.js.map +1 -0
- package/dist/adapters/tron/address.d.ts +20 -0
- package/dist/adapters/tron/address.js +110 -0
- package/dist/adapters/tron/address.js.map +1 -0
- package/dist/adapters/tron/builder.d.ts +12 -0
- package/dist/adapters/tron/builder.js +553 -0
- package/dist/adapters/tron/builder.js.map +1 -0
- package/dist/adapters/tron/chains.d.ts +12 -0
- package/dist/adapters/tron/chains.js +35 -0
- package/dist/adapters/tron/chains.js.map +1 -0
- package/dist/adapters/tron/codec.d.ts +10 -0
- package/dist/adapters/tron/codec.js +322 -0
- package/dist/adapters/tron/codec.js.map +1 -0
- package/dist/adapters/tron/decode.d.ts +50 -0
- package/dist/adapters/tron/decode.js +280 -0
- package/dist/adapters/tron/decode.js.map +1 -0
- package/dist/adapters/tron/driver.d.ts +12 -0
- package/dist/adapters/tron/driver.js +106 -0
- package/dist/adapters/tron/driver.js.map +1 -0
- package/dist/adapters/tron/errors.d.ts +74 -0
- package/dist/adapters/tron/errors.js +261 -0
- package/dist/adapters/tron/errors.js.map +1 -0
- package/dist/adapters/tron/fees.d.ts +49 -0
- package/dist/adapters/tron/fees.js +166 -0
- package/dist/adapters/tron/fees.js.map +1 -0
- package/dist/adapters/tron/http.d.ts +173 -0
- package/dist/adapters/tron/http.js +729 -0
- package/dist/adapters/tron/http.js.map +1 -0
- package/dist/adapters/tron/index.d.ts +16 -0
- package/dist/adapters/tron/index.js +15 -0
- package/dist/adapters/tron/index.js.map +1 -0
- package/dist/adapters/tron/network.d.ts +44 -0
- package/dist/adapters/tron/network.js +163 -0
- package/dist/adapters/tron/network.js.map +1 -0
- package/dist/adapters/tron/plugin.d.ts +17 -0
- package/dist/adapters/tron/plugin.js +39 -0
- package/dist/adapters/tron/plugin.js.map +1 -0
- package/dist/adapters/tron/presets.d.ts +5 -0
- package/dist/adapters/tron/presets.js +68 -0
- package/dist/adapters/tron/presets.js.map +1 -0
- package/dist/adapters/tron/proofs.d.ts +80 -0
- package/dist/adapters/tron/proofs.js +370 -0
- package/dist/adapters/tron/proofs.js.map +1 -0
- package/dist/adapters/tron/protobuf.d.ts +36 -0
- package/dist/adapters/tron/protobuf.js +90 -0
- package/dist/adapters/tron/protobuf.js.map +1 -0
- package/dist/adapters/tron/reader.d.ts +47 -0
- package/dist/adapters/tron/reader.js +203 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +7 -0
- package/dist/adapters/tron/tokens.js +14 -0
- package/dist/adapters/tron/tokens.js.map +1 -0
- package/dist/adapters/tron/types.d.ts +166 -0
- package/dist/adapters/tron/types.js +3 -0
- package/dist/adapters/tron/types.js.map +1 -0
- package/dist/adapters/utxo/address.d.ts +51 -0
- package/dist/adapters/utxo/address.js +341 -0
- package/dist/adapters/utxo/address.js.map +1 -0
- package/dist/adapters/utxo/builder.d.ts +35 -0
- package/dist/adapters/utxo/builder.js +380 -0
- package/dist/adapters/utxo/builder.js.map +1 -0
- package/dist/adapters/utxo/chains.d.ts +17 -0
- package/dist/adapters/utxo/chains.js +99 -0
- package/dist/adapters/utxo/chains.js.map +1 -0
- package/dist/adapters/utxo/codec.d.ts +120 -0
- package/dist/adapters/utxo/codec.js +408 -0
- package/dist/adapters/utxo/codec.js.map +1 -0
- package/dist/adapters/utxo/coinselect.d.ts +48 -0
- package/dist/adapters/utxo/coinselect.js +131 -0
- package/dist/adapters/utxo/coinselect.js.map +1 -0
- package/dist/adapters/utxo/context.d.ts +57 -0
- package/dist/adapters/utxo/context.js +118 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +14 -0
- package/dist/adapters/utxo/decode.js +85 -0
- package/dist/adapters/utxo/decode.js.map +1 -0
- package/dist/adapters/utxo/driver.d.ts +16 -0
- package/dist/adapters/utxo/driver.js +74 -0
- package/dist/adapters/utxo/driver.js.map +1 -0
- package/dist/adapters/utxo/ecc.d.ts +9 -0
- package/dist/adapters/utxo/ecc.js +26 -0
- package/dist/adapters/utxo/ecc.js.map +1 -0
- package/dist/adapters/utxo/errors.d.ts +52 -0
- package/dist/adapters/utxo/errors.js +191 -0
- package/dist/adapters/utxo/errors.js.map +1 -0
- package/dist/adapters/utxo/esplora.d.ts +79 -0
- package/dist/adapters/utxo/esplora.js +451 -0
- package/dist/adapters/utxo/esplora.js.map +1 -0
- package/dist/adapters/utxo/fees.d.ts +41 -0
- package/dist/adapters/utxo/fees.js +125 -0
- package/dist/adapters/utxo/fees.js.map +1 -0
- package/dist/adapters/utxo/index.d.ts +17 -0
- package/dist/adapters/utxo/index.js +8 -0
- package/dist/adapters/utxo/index.js.map +1 -0
- package/dist/adapters/utxo/network.d.ts +50 -0
- package/dist/adapters/utxo/network.js +165 -0
- package/dist/adapters/utxo/network.js.map +1 -0
- package/dist/adapters/utxo/plugin.d.ts +17 -0
- package/dist/adapters/utxo/plugin.js +41 -0
- package/dist/adapters/utxo/plugin.js.map +1 -0
- package/dist/adapters/utxo/presets.d.ts +12 -0
- package/dist/adapters/utxo/presets.js +47 -0
- package/dist/adapters/utxo/presets.js.map +1 -0
- package/dist/adapters/utxo/preview.d.ts +3 -0
- package/dist/adapters/utxo/preview.js +65 -0
- package/dist/adapters/utxo/preview.js.map +1 -0
- package/dist/adapters/utxo/proofs.d.ts +57 -0
- package/dist/adapters/utxo/proofs.js +331 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +59 -0
- package/dist/adapters/utxo/rawtx.js +234 -0
- package/dist/adapters/utxo/rawtx.js.map +1 -0
- package/dist/adapters/utxo/reader.d.ts +36 -0
- package/dist/adapters/utxo/reader.js +265 -0
- package/dist/adapters/utxo/reader.js.map +1 -0
- package/dist/adapters/utxo/sdk.d.ts +18 -0
- package/dist/adapters/utxo/sdk.js +17 -0
- package/dist/adapters/utxo/sdk.js.map +1 -0
- package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
- package/dist/adapters/utxo/signed-psbt.js +428 -0
- package/dist/adapters/utxo/signed-psbt.js.map +1 -0
- package/dist/adapters/utxo/spend.d.ts +59 -0
- package/dist/adapters/utxo/spend.js +230 -0
- package/dist/adapters/utxo/spend.js.map +1 -0
- package/dist/adapters/utxo/types.d.ts +167 -0
- package/dist/adapters/utxo/types.js +3 -0
- package/dist/adapters/utxo/types.js.map +1 -0
- package/dist/core/assets/service.d.ts +18 -0
- package/dist/core/assets/service.js +69 -0
- package/dist/core/assets/service.js.map +1 -0
- package/dist/core/blockchain/default-ref.d.ts +4 -0
- package/dist/core/blockchain/default-ref.js +16 -0
- package/dist/core/blockchain/default-ref.js.map +1 -0
- package/dist/core/blockchain/handle.d.ts +200 -0
- package/dist/core/blockchain/handle.js +579 -0
- package/dist/core/blockchain/handle.js.map +1 -0
- package/dist/core/blockchain/internal.d.ts +19 -0
- package/dist/core/blockchain/internal.js +16 -0
- package/dist/core/blockchain/internal.js.map +1 -0
- package/dist/core/blockchain/mapping.d.ts +22 -0
- package/dist/core/blockchain/mapping.js +136 -0
- package/dist/core/blockchain/mapping.js.map +1 -0
- package/dist/core/config/env.d.ts +8 -0
- package/dist/core/config/env.js +60 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/merge.d.ts +26 -0
- package/dist/core/config/merge.js +144 -0
- package/dist/core/config/merge.js.map +1 -0
- package/dist/core/config/resolve.d.ts +12 -0
- package/dist/core/config/resolve.js +251 -0
- package/dist/core/config/resolve.js.map +1 -0
- package/dist/core/config/types.d.ts +165 -0
- package/dist/core/config/types.js +3 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/container/builtins.d.ts +4 -0
- package/dist/core/container/builtins.js +13 -0
- package/dist/core/container/builtins.js.map +1 -0
- package/dist/core/container/container.d.ts +69 -0
- package/dist/core/container/container.js +466 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/default.d.ts +15 -0
- package/dist/core/container/default.js +70 -0
- package/dist/core/container/default.js.map +1 -0
- package/dist/core/container/internals.d.ts +54 -0
- package/dist/core/container/internals.js +21 -0
- package/dist/core/container/internals.js.map +1 -0
- package/dist/core/container/pool.d.ts +27 -0
- package/dist/core/container/pool.js +77 -0
- package/dist/core/container/pool.js.map +1 -0
- package/dist/core/driver/types.d.ts +346 -0
- package/dist/core/driver/types.js +3 -0
- package/dist/core/driver/types.js.map +1 -0
- package/dist/core/errors/codes.d.ts +153 -0
- package/dist/core/errors/codes.js +49 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/error.d.ts +66 -0
- package/dist/core/errors/error.js +129 -0
- package/dist/core/errors/error.js.map +1 -0
- package/dist/core/events/bus.d.ts +12 -0
- package/dist/core/events/bus.js +46 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/logger.d.ts +13 -0
- package/dist/core/events/logger.js +42 -0
- package/dist/core/events/logger.js.map +1 -0
- package/dist/core/events/types.d.ts +131 -0
- package/dist/core/events/types.js +3 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/lifecycle/engine-rules.d.ts +107 -0
- package/dist/core/lifecycle/engine-rules.js +257 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +500 -0
- package/dist/core/lifecycle/engine.js +1732 -0
- package/dist/core/lifecycle/engine.js.map +1 -0
- package/dist/core/lifecycle/evaluate.d.ts +19 -0
- package/dist/core/lifecycle/evaluate.js +72 -0
- package/dist/core/lifecycle/evaluate.js.map +1 -0
- package/dist/core/lifecycle/intent.d.ts +11 -0
- package/dist/core/lifecycle/intent.js +88 -0
- package/dist/core/lifecycle/intent.js.map +1 -0
- package/dist/core/lifecycle/monitor.d.ts +138 -0
- package/dist/core/lifecycle/monitor.js +606 -0
- package/dist/core/lifecycle/monitor.js.map +1 -0
- package/dist/core/lifecycle/observations.d.ts +17 -0
- package/dist/core/lifecycle/observations.js +59 -0
- package/dist/core/lifecycle/observations.js.map +1 -0
- package/dist/core/lifecycle/reconcile.d.ts +58 -0
- package/dist/core/lifecycle/reconcile.js +112 -0
- package/dist/core/lifecycle/reconcile.js.map +1 -0
- package/dist/core/lifecycle/views.d.ts +49 -0
- package/dist/core/lifecycle/views.js +57 -0
- package/dist/core/lifecycle/views.js.map +1 -0
- package/dist/core/lifecycle/workers.d.ts +82 -0
- package/dist/core/lifecycle/workers.js +329 -0
- package/dist/core/lifecycle/workers.js.map +1 -0
- package/dist/core/model/address.d.ts +32 -0
- package/dist/core/model/address.js +43 -0
- package/dist/core/model/address.js.map +1 -0
- package/dist/core/model/amount.d.ts +25 -0
- package/dist/core/model/amount.js +102 -0
- package/dist/core/model/amount.js.map +1 -0
- package/dist/core/model/asset.d.ts +28 -0
- package/dist/core/model/asset.js +47 -0
- package/dist/core/model/asset.js.map +1 -0
- package/dist/core/model/capability.d.ts +3 -0
- package/dist/core/model/capability.js +18 -0
- package/dist/core/model/capability.js.map +1 -0
- package/dist/core/model/chain.d.ts +63 -0
- package/dist/core/model/chain.js +8 -0
- package/dist/core/model/chain.js.map +1 -0
- package/dist/core/model/fee.d.ts +36 -0
- package/dist/core/model/fee.js +17 -0
- package/dist/core/model/fee.js.map +1 -0
- package/dist/core/model/ids.d.ts +37 -0
- package/dist/core/model/ids.js +13 -0
- package/dist/core/model/ids.js.map +1 -0
- package/dist/core/model/intent.d.ts +63 -0
- package/dist/core/model/intent.js +81 -0
- package/dist/core/model/intent.js.map +1 -0
- package/dist/core/model/ordering.d.ts +20 -0
- package/dist/core/model/ordering.js +29 -0
- package/dist/core/model/ordering.js.map +1 -0
- package/dist/core/model/transaction.d.ts +116 -0
- package/dist/core/model/transaction.js +3 -0
- package/dist/core/model/transaction.js.map +1 -0
- package/dist/core/observe/scanner.d.ts +135 -0
- package/dist/core/observe/scanner.js +355 -0
- package/dist/core/observe/scanner.js.map +1 -0
- package/dist/core/ordering/reservations.d.ts +16 -0
- package/dist/core/ordering/reservations.js +53 -0
- package/dist/core/ordering/reservations.js.map +1 -0
- package/dist/core/ordering/sequence.d.ts +61 -0
- package/dist/core/ordering/sequence.js +155 -0
- package/dist/core/ordering/sequence.js.map +1 -0
- package/dist/core/registry/adapters.d.ts +10 -0
- package/dist/core/registry/adapters.js +56 -0
- package/dist/core/registry/adapters.js.map +1 -0
- package/dist/core/registry/assets.d.ts +18 -0
- package/dist/core/registry/assets.js +90 -0
- package/dist/core/registry/assets.js.map +1 -0
- package/dist/core/registry/chains.d.ts +10 -0
- package/dist/core/registry/chains.js +80 -0
- package/dist/core/registry/chains.js.map +1 -0
- package/dist/core/registry/plugin.d.ts +41 -0
- package/dist/core/registry/plugin.js +109 -0
- package/dist/core/registry/plugin.js.map +1 -0
- package/dist/core/registry/providers.d.ts +31 -0
- package/dist/core/registry/providers.js +43 -0
- package/dist/core/registry/providers.js.map +1 -0
- package/dist/core/registry/schemes.d.ts +30 -0
- package/dist/core/registry/schemes.js +84 -0
- package/dist/core/registry/schemes.js.map +1 -0
- package/dist/core/secret/fragments.d.ts +33 -0
- package/dist/core/secret/fragments.js +110 -0
- package/dist/core/secret/fragments.js.map +1 -0
- package/dist/core/secret/redact.d.ts +10 -0
- package/dist/core/secret/redact.js +110 -0
- package/dist/core/secret/redact.js.map +1 -0
- package/dist/core/secret/secret.d.ts +14 -0
- package/dist/core/secret/secret.js +42 -0
- package/dist/core/secret/secret.js.map +1 -0
- package/dist/core/signing/callback.d.ts +10 -0
- package/dist/core/signing/callback.js +22 -0
- package/dist/core/signing/callback.js.map +1 -0
- package/dist/core/signing/guard.d.ts +18 -0
- package/dist/core/signing/guard.js +72 -0
- package/dist/core/signing/guard.js.map +1 -0
- package/dist/core/signing/hd.d.ts +36 -0
- package/dist/core/signing/hd.js +167 -0
- package/dist/core/signing/hd.js.map +1 -0
- package/dist/core/signing/local.d.ts +48 -0
- package/dist/core/signing/local.js +190 -0
- package/dist/core/signing/local.js.map +1 -0
- package/dist/core/signing/orchestrator.d.ts +40 -0
- package/dist/core/signing/orchestrator.js +300 -0
- package/dist/core/signing/orchestrator.js.map +1 -0
- package/dist/core/signing/types.d.ts +64 -0
- package/dist/core/signing/types.js +3 -0
- package/dist/core/signing/types.js.map +1 -0
- package/dist/core/signing/wallet.d.ts +48 -0
- package/dist/core/signing/wallet.js +153 -0
- package/dist/core/signing/wallet.js.map +1 -0
- package/dist/core/store/clone.d.ts +25 -0
- package/dist/core/store/clone.js +71 -0
- package/dist/core/store/clone.js.map +1 -0
- package/dist/core/store/memory.d.ts +38 -0
- package/dist/core/store/memory.js +325 -0
- package/dist/core/store/memory.js.map +1 -0
- package/dist/core/store/types.d.ts +246 -0
- package/dist/core/store/types.js +117 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/transport/backoff.d.ts +8 -0
- package/dist/core/transport/backoff.js +27 -0
- package/dist/core/transport/backoff.js.map +1 -0
- package/dist/core/transport/circuit.d.ts +25 -0
- package/dist/core/transport/circuit.js +61 -0
- package/dist/core/transport/circuit.js.map +1 -0
- package/dist/core/transport/http-transport.d.ts +30 -0
- package/dist/core/transport/http-transport.js +1695 -0
- package/dist/core/transport/http-transport.js.map +1 -0
- package/dist/core/transport/rate-limit.d.ts +27 -0
- package/dist/core/transport/rate-limit.js +78 -0
- package/dist/core/transport/rate-limit.js.map +1 -0
- package/dist/core/transport/stale-view.d.ts +11 -0
- package/dist/core/transport/stale-view.js +17 -0
- package/dist/core/transport/stale-view.js.map +1 -0
- package/dist/core/transport/types.d.ts +144 -0
- package/dist/core/transport/types.js +6 -0
- package/dist/core/transport/types.js.map +1 -0
- package/dist/core/util/bytes.d.ts +9 -0
- package/dist/core/util/bytes.js +40 -0
- package/dist/core/util/bytes.js.map +1 -0
- package/dist/core/util/clock.d.ts +6 -0
- package/dist/core/util/clock.js +26 -0
- package/dist/core/util/clock.js.map +1 -0
- package/dist/core/util/freeze.d.ts +8 -0
- package/dist/core/util/freeze.js +31 -0
- package/dist/core/util/freeze.js.map +1 -0
- package/dist/core/util/json.d.ts +29 -0
- package/dist/core/util/json.js +165 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +21 -0
- package/dist/core/util/names.js +46 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +64 -14
- package/dist/index.js +105 -49
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +21 -0
- package/dist/native.js +44 -0
- package/dist/native.js.map +1 -0
- package/dist/testing/contracts/api.d.ts +12 -0
- package/dist/testing/contracts/api.js +58 -0
- package/dist/testing/contracts/api.js.map +1 -0
- package/dist/testing/contracts/cursors.d.ts +6 -0
- package/dist/testing/contracts/cursors.js +43 -0
- package/dist/testing/contracts/cursors.js.map +1 -0
- package/dist/testing/contracts/locks.d.ts +10 -0
- package/dist/testing/contracts/locks.js +63 -0
- package/dist/testing/contracts/locks.js.map +1 -0
- package/dist/testing/contracts/operations.d.ts +21 -0
- package/dist/testing/contracts/operations.js +718 -0
- package/dist/testing/contracts/operations.js.map +1 -0
- package/dist/testing/contracts/sequences.d.ts +6 -0
- package/dist/testing/contracts/sequences.js +68 -0
- package/dist/testing/contracts/sequences.js.map +1 -0
- package/dist/testing/env.d.ts +63 -0
- package/dist/testing/env.js +105 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/fake-chain.d.ts +118 -0
- package/dist/testing/fake-chain.js +536 -0
- package/dist/testing/fake-chain.js.map +1 -0
- package/dist/testing/fake-clock.d.ts +15 -0
- package/dist/testing/fake-clock.js +86 -0
- package/dist/testing/fake-clock.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +15 -0
- package/dist/testing/fake-driver.js +458 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/fake-fetch.d.ts +32 -0
- package/dist/testing/fake-fetch.js +81 -0
- package/dist/testing/fake-fetch.js.map +1 -0
- package/dist/testing/fake-plugin.d.ts +30 -0
- package/dist/testing/fake-plugin.js +66 -0
- package/dist/testing/fake-plugin.js.map +1 -0
- package/dist/testing/faulty-store.d.ts +36 -0
- package/dist/testing/faulty-store.js +66 -0
- package/dist/testing/faulty-store.js.map +1 -0
- package/dist/testing/generation.d.ts +60 -0
- package/dist/testing/generation.js +252 -0
- package/dist/testing/generation.js.map +1 -0
- package/dist/testing/index.d.ts +28 -0
- package/dist/testing/index.js +51 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +188 -44
- package/dist/libs/eth/account.d.ts +0 -9
- package/dist/libs/eth/account.js +0 -58
- package/dist/libs/eth/account.js.map +0 -1
- package/dist/libs/eth/contract.d.ts +0 -2
- package/dist/libs/eth/contract.js +0 -7
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -20
- package/dist/libs/eth/index.js +0 -62
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -2
- package/dist/libs/eth/transact.js +0 -7
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -1
- package/dist/libs/index.js +0 -18
- package/dist/libs/index.js.map +0 -1
- package/dist/tool/common.d.ts +0 -28
- package/dist/tool/common.js +0 -33
- package/dist/tool/common.js.map +0 -1
- package/dist/tool/eth-tools.d.ts +0 -3
- package/dist/tool/eth-tools.js +0 -33
- package/dist/tool/eth-tools.js.map +0 -1
- package/dist/tool/index.d.ts +0 -4
- package/dist/tool/index.js +0 -21
- package/dist/tool/index.js.map +0 -1
- package/dist/tool/logging.d.ts +0 -3
- package/dist/tool/logging.js +0 -11
- package/dist/tool/logging.js.map +0 -1
- package/dist/tool/options.d.ts +0 -4
- package/dist/tool/options.js +0 -28
- package/dist/tool/options.js.map +0 -1
- package/dist/type/account.d.ts +0 -9
- package/dist/type/account.js.map +0 -1
- package/dist/type/common.d.ts +0 -18
- package/dist/type/common.js.map +0 -1
- package/dist/type/index.d.ts +0 -3
- package/dist/type/index.js +0 -20
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -7
- package/dist/type/lib-types.js.map +0 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { AvalancheNetworkConfig } from './network';
|
|
2
|
+
import { type SdkContext, type SdkFeeState, type SdkSignedTx, type SdkTransaction, type SdkUtxo } from './sdk';
|
|
3
|
+
import type { FeeWeights } from './api';
|
|
4
|
+
/** AvalancheGo's mempool refuses a transaction of more bytes (`MaxTxSize`, 64 KiB). */
|
|
5
|
+
export declare const MAX_TX_BYTES: number;
|
|
6
|
+
/** `avax.MaxMemoSize`. */
|
|
7
|
+
export declare const MAX_MEMO_BYTES = 256;
|
|
8
|
+
/** A reservation key: `txID:outputIndex`. */
|
|
9
|
+
export declare const utxoKey: (txId: string, outputIndex: number) => string;
|
|
10
|
+
/** The `utxoId` of raw UTXO bytes: codec (2), txID (32), output index (4) lead them all. */
|
|
11
|
+
export declare function utxoKeyOf(bytes: Uint8Array): string;
|
|
12
|
+
/** An unspent output, read from the node's bytes. */
|
|
13
|
+
export interface ParsedUtxo {
|
|
14
|
+
readonly utxoId: string;
|
|
15
|
+
readonly txId: string;
|
|
16
|
+
readonly outputIndex: number;
|
|
17
|
+
readonly assetId: string;
|
|
18
|
+
readonly amount: bigint;
|
|
19
|
+
readonly locktime: bigint;
|
|
20
|
+
readonly threshold: number;
|
|
21
|
+
readonly owners: readonly Uint8Array[];
|
|
22
|
+
/** A `secp256k1fx.TransferOutput` (not stake-locked, minted or an NFT). */
|
|
23
|
+
readonly plain: boolean;
|
|
24
|
+
readonly sdk: SdkUtxo;
|
|
25
|
+
}
|
|
26
|
+
export declare function parseUtxo(bytes: Uint8Array, config: Pick<AvalancheNetworkConfig, 'vm'>): ParsedUtxo;
|
|
27
|
+
/** Whether a transfer from `from` may spend `utxo`: plain AVAX, unlocked, `from` alone signs. */
|
|
28
|
+
export declare function spendableBy(utxo: ParsedUtxo, from: Uint8Array, config: Pick<AvalancheNetworkConfig, 'avaxAssetId'>): boolean;
|
|
29
|
+
/** Signed transaction bytes, parsed; their unsigned part re-encoded. */
|
|
30
|
+
export interface ParsedTx {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly signed: SdkSignedTx;
|
|
33
|
+
readonly tx: SdkTransaction;
|
|
34
|
+
readonly unsignedBytes: Uint8Array;
|
|
35
|
+
}
|
|
36
|
+
export declare function parseSignedTx(bytes: Uint8Array, config: Pick<AvalancheNetworkConfig, 'vm'>): ParsedTx;
|
|
37
|
+
/** The unsigned transaction in `bytes` (a prepared payload), re-encoded exactly. */
|
|
38
|
+
export declare function parseUnsignedTx(bytes: Uint8Array, config: Pick<AvalancheNetworkConfig, 'vm'>): SdkTransaction;
|
|
39
|
+
/** `r ‖ s ‖ v`: a 64-byte compact signature and its recovery id, as credentials hold them. */
|
|
40
|
+
export declare function credentialSignature(compact: Uint8Array, recovery: number): Uint8Array;
|
|
41
|
+
/** The signed bytes: every input's credential carries `signature` once per signer index. */
|
|
42
|
+
export declare function assembleSigned(unsignedBytes: Uint8Array, signature: Uint8Array, config: Pick<AvalancheNetworkConfig, 'vm'>): Uint8Array;
|
|
43
|
+
/** The addresses that signed `parsed`, once each, in credential order. */
|
|
44
|
+
export declare function signersOf(parsed: ParsedTx): Uint8Array[];
|
|
45
|
+
/** avalanchejs's `Context` for this network; `fees` fills the fee fields the builder reads. */
|
|
46
|
+
export declare function sdkContext(config: AvalancheNetworkConfig, fees?: {
|
|
47
|
+
readonly txFee?: bigint;
|
|
48
|
+
readonly weights?: FeeWeights;
|
|
49
|
+
}): SdkContext;
|
|
50
|
+
export type FeePlan = {
|
|
51
|
+
readonly model: 'static';
|
|
52
|
+
readonly txFee: bigint;
|
|
53
|
+
} | {
|
|
54
|
+
readonly model: 'dynamic';
|
|
55
|
+
readonly price: bigint;
|
|
56
|
+
readonly state: SdkFeeState;
|
|
57
|
+
readonly weights: FeeWeights;
|
|
58
|
+
};
|
|
59
|
+
export interface PlannedOutput {
|
|
60
|
+
readonly to: Uint8Array;
|
|
61
|
+
readonly amount: bigint;
|
|
62
|
+
}
|
|
63
|
+
export interface BuiltTx {
|
|
64
|
+
/** The unsigned bytes (codec version and transaction). */
|
|
65
|
+
readonly bytes: Uint8Array;
|
|
66
|
+
readonly inputs: readonly string[];
|
|
67
|
+
readonly fee: bigint;
|
|
68
|
+
/** P-Chain: the gas the transaction uses. */
|
|
69
|
+
readonly gas?: bigint;
|
|
70
|
+
readonly change: bigint;
|
|
71
|
+
readonly outputs: number;
|
|
72
|
+
}
|
|
73
|
+
/** The absurd-fee guard: no transfer ever pays more than `options.maxFee`. */
|
|
74
|
+
export declare function assertSaneFee(fee: bigint, config: Pick<AvalancheNetworkConfig, 'maxFee'>): void;
|
|
75
|
+
/**
|
|
76
|
+
* A BaseTx from `from` paying `outputs`, spending the first of `utxos` (in their order)
|
|
77
|
+
* that cover the outputs and the fee, with change back to `from`. Checked before it is
|
|
78
|
+
* returned.
|
|
79
|
+
*/
|
|
80
|
+
export declare function buildBaseTx(args: {
|
|
81
|
+
readonly config: AvalancheNetworkConfig;
|
|
82
|
+
readonly from: Uint8Array;
|
|
83
|
+
readonly utxos: readonly ParsedUtxo[];
|
|
84
|
+
readonly outputs: readonly PlannedOutput[];
|
|
85
|
+
readonly memo: Uint8Array;
|
|
86
|
+
readonly minIssuanceTime: bigint;
|
|
87
|
+
readonly fee: FeePlan;
|
|
88
|
+
}): BuiltTx;
|
|
89
|
+
/**
|
|
90
|
+
* An output that does not exist: `amount` of AVAX owned by `owner`, at a zero transaction
|
|
91
|
+
* id. Fee estimates build with it when the wallet's outputs do not cover a transfer, so the
|
|
92
|
+
* estimate still names the fee of a one-input transaction. Never spent.
|
|
93
|
+
*/
|
|
94
|
+
export declare function syntheticUtxo(owner: Uint8Array, amount: bigint, config: Pick<AvalancheNetworkConfig, 'vm' | 'avaxAssetId'>): ParsedUtxo;
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.utxoKey = exports.MAX_MEMO_BYTES = exports.MAX_TX_BYTES = void 0;
|
|
4
|
+
exports.utxoKeyOf = utxoKeyOf;
|
|
5
|
+
exports.parseUtxo = parseUtxo;
|
|
6
|
+
exports.spendableBy = spendableBy;
|
|
7
|
+
exports.parseSignedTx = parseSignedTx;
|
|
8
|
+
exports.parseUnsignedTx = parseUnsignedTx;
|
|
9
|
+
exports.credentialSignature = credentialSignature;
|
|
10
|
+
exports.assembleSigned = assembleSigned;
|
|
11
|
+
exports.signersOf = signersOf;
|
|
12
|
+
exports.sdkContext = sdkContext;
|
|
13
|
+
exports.assertSaneFee = assertSaneFee;
|
|
14
|
+
exports.buildBaseTx = buildBaseTx;
|
|
15
|
+
exports.syntheticUtxo = syntheticUtxo;
|
|
16
|
+
/**
|
|
17
|
+
* Avalanche bytes through avalanchejs: unspent outputs, signed transactions, BaseTx
|
|
18
|
+
* building and credential assembly.
|
|
19
|
+
* - Every parse is a round trip: bytes that do not re-encode to themselves are not taken.
|
|
20
|
+
* - A transaction signs one digest, the SHA-256 of its unsigned bytes; every input's
|
|
21
|
+
* credential carries the same 65-byte recoverable signature (r, s, recovery id).
|
|
22
|
+
* - A built transaction is checked before it is used (defence in depth against the SDK):
|
|
23
|
+
* its network and chain, that it spends only the outputs offered, pays every intended
|
|
24
|
+
* output exactly, sends the rest back to the sender, and burns exactly the expected fee.
|
|
25
|
+
* - A transaction's senders are the addresses its signatures recover to, for every input,
|
|
26
|
+
* imported ones included.
|
|
27
|
+
*/
|
|
28
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
29
|
+
const ripemd160_1 = require("@noble/hashes/ripemd160");
|
|
30
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
31
|
+
const error_1 = require("../../core/errors/error");
|
|
32
|
+
const bytes_1 = require("../../core/util/bytes");
|
|
33
|
+
const api_1 = require("./api");
|
|
34
|
+
const cb58_1 = require("./cb58");
|
|
35
|
+
const sdk_1 = require("./sdk");
|
|
36
|
+
/** AvalancheGo's mempool refuses a transaction of more bytes (`MaxTxSize`, 64 KiB). */
|
|
37
|
+
exports.MAX_TX_BYTES = 64 * 1024;
|
|
38
|
+
/** A secp256k1 credential of one signature: type id, count and the signature. */
|
|
39
|
+
const CREDENTIAL_BYTES = 4 + 4 + 65;
|
|
40
|
+
/** `avax.MaxMemoSize`. */
|
|
41
|
+
exports.MAX_MEMO_BYTES = 256;
|
|
42
|
+
const vmName = (config) => config.vm === 'avm' ? 'AVM' : 'PVM';
|
|
43
|
+
/** A reservation key: `txID:outputIndex`. */
|
|
44
|
+
const utxoKey = (txId, outputIndex) => `${txId}:${outputIndex}`;
|
|
45
|
+
exports.utxoKey = utxoKey;
|
|
46
|
+
/** The `utxoId` of raw UTXO bytes: codec (2), txID (32), output index (4) lead them all. */
|
|
47
|
+
function utxoKeyOf(bytes) {
|
|
48
|
+
if (bytes.length < 38)
|
|
49
|
+
throw (0, api_1.malformed)('utxo');
|
|
50
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
51
|
+
return (0, exports.utxoKey)((0, cb58_1.cb58Encode)(bytes.subarray(2, 34)), view.getUint32(34));
|
|
52
|
+
}
|
|
53
|
+
const hasAmount = (value) => typeof value.amount === 'function';
|
|
54
|
+
function ownersOf(output) {
|
|
55
|
+
if (output._type === sdk_1.TYPES.transferOutput) {
|
|
56
|
+
return output.outputOwners;
|
|
57
|
+
}
|
|
58
|
+
if (output._type === sdk_1.TYPES.stakeableLockOut) {
|
|
59
|
+
const inner = output.transferOut;
|
|
60
|
+
return inner._type === sdk_1.TYPES.transferOutput
|
|
61
|
+
? inner.outputOwners
|
|
62
|
+
: undefined;
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
function parseUtxo(bytes, config) {
|
|
67
|
+
const manager = sdk_1.avalanche.utils.getManagerForVM(vmName(config));
|
|
68
|
+
let utxo;
|
|
69
|
+
try {
|
|
70
|
+
utxo = manager.unpack(bytes, sdk_1.avalanche.Utxo);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
throw (0, api_1.malformed)('utxo');
|
|
74
|
+
}
|
|
75
|
+
const reencoded = (() => {
|
|
76
|
+
try {
|
|
77
|
+
return new Uint8Array([0, 0, ...utxo.toBytes(manager.getDefaultCodec())]);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw (0, api_1.malformed)('utxo');
|
|
81
|
+
}
|
|
82
|
+
})();
|
|
83
|
+
if (!(0, bytes_1.equalBytes)(reencoded, bytes))
|
|
84
|
+
throw (0, api_1.malformed)('utxo');
|
|
85
|
+
const owners = ownersOf(utxo.output);
|
|
86
|
+
const plain = utxo.output._type === sdk_1.TYPES.transferOutput;
|
|
87
|
+
const amount = hasAmount(utxo.output) ? utxo.output.amount() : 0n;
|
|
88
|
+
const locktime = utxo.output._type === sdk_1.TYPES.stakeableLockOut
|
|
89
|
+
? utxo.output.getLocktime()
|
|
90
|
+
: (owners?.locktime.value() ?? 0n);
|
|
91
|
+
const txId = utxo.utxoId.txID.toString();
|
|
92
|
+
const outputIndex = utxo.utxoId.outputIdx.value();
|
|
93
|
+
return {
|
|
94
|
+
utxoId: (0, exports.utxoKey)(txId, outputIndex),
|
|
95
|
+
txId,
|
|
96
|
+
outputIndex,
|
|
97
|
+
assetId: utxo.assetId.toString(),
|
|
98
|
+
amount,
|
|
99
|
+
locktime,
|
|
100
|
+
threshold: owners?.threshold.value() ?? 0,
|
|
101
|
+
owners: owners?.addrs.map((a) => a.toBytes()) ?? [],
|
|
102
|
+
plain,
|
|
103
|
+
sdk: utxo,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** Whether a transfer from `from` may spend `utxo`: plain AVAX, unlocked, `from` alone signs. */
|
|
107
|
+
function spendableBy(utxo, from, config) {
|
|
108
|
+
return (utxo.plain &&
|
|
109
|
+
utxo.assetId === config.avaxAssetId &&
|
|
110
|
+
utxo.amount > 0n &&
|
|
111
|
+
utxo.locktime === 0n &&
|
|
112
|
+
utxo.threshold === 1 &&
|
|
113
|
+
utxo.owners.some((owner) => (0, bytes_1.equalBytes)(owner, from)));
|
|
114
|
+
}
|
|
115
|
+
function parseSignedTx(bytes, config) {
|
|
116
|
+
const manager = sdk_1.avalanche.utils.getManagerForVM(vmName(config));
|
|
117
|
+
let signed;
|
|
118
|
+
let reencoded;
|
|
119
|
+
let unsignedBytes;
|
|
120
|
+
try {
|
|
121
|
+
signed = manager.unpack(bytes, sdk_1.avalanche.avaxSerial.SignedTx);
|
|
122
|
+
reencoded = signed.toBytes();
|
|
123
|
+
unsignedBytes = manager.packCodec(signed.unsignedTx);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
throw (0, api_1.malformed)('transaction');
|
|
127
|
+
}
|
|
128
|
+
if (!(0, bytes_1.equalBytes)(reencoded, bytes) ||
|
|
129
|
+
!(0, bytes_1.equalBytes)(bytes.subarray(0, unsignedBytes.length), unsignedBytes)) {
|
|
130
|
+
throw (0, api_1.malformed)('transaction');
|
|
131
|
+
}
|
|
132
|
+
return { id: (0, cb58_1.idOf)(bytes), signed, tx: signed.unsignedTx, unsignedBytes };
|
|
133
|
+
}
|
|
134
|
+
/** The unsigned transaction in `bytes` (a prepared payload), re-encoded exactly. */
|
|
135
|
+
function parseUnsignedTx(bytes, config) {
|
|
136
|
+
const manager = sdk_1.avalanche.utils.getManagerForVM(vmName(config));
|
|
137
|
+
let tx;
|
|
138
|
+
try {
|
|
139
|
+
tx = manager.unpackTransaction(bytes);
|
|
140
|
+
if (!(0, bytes_1.equalBytes)(manager.packCodec(tx), bytes))
|
|
141
|
+
throw new Error('not exact');
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'not an unsigned transaction of this chain');
|
|
145
|
+
}
|
|
146
|
+
return tx;
|
|
147
|
+
}
|
|
148
|
+
/** `r ‖ s ‖ v`: a 64-byte compact signature and its recovery id, as credentials hold them. */
|
|
149
|
+
function credentialSignature(compact, recovery) {
|
|
150
|
+
const out = new Uint8Array(65);
|
|
151
|
+
out.set(compact, 0);
|
|
152
|
+
out[64] = recovery;
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
/** The signed bytes: every input's credential carries `signature` once per signer index. */
|
|
156
|
+
function assembleSigned(unsignedBytes, signature, config) {
|
|
157
|
+
const tx = parseUnsignedTx(unsignedBytes, config);
|
|
158
|
+
const credentials = tx
|
|
159
|
+
.getSigIndices()
|
|
160
|
+
.map((indices) => new sdk_1.avalanche.Credential(indices.map(() => new sdk_1.avalanche.Signature(signature))));
|
|
161
|
+
return new sdk_1.avalanche.avaxSerial.SignedTx(tx, credentials).toBytes();
|
|
162
|
+
}
|
|
163
|
+
/** The 20-byte address a 65-byte signature over `digest` recovers to, if any. */
|
|
164
|
+
function signerOf(signature, digest) {
|
|
165
|
+
if (signature.length !== 65 || signature[64] > 3)
|
|
166
|
+
return undefined;
|
|
167
|
+
try {
|
|
168
|
+
const publicKey = secp256k1_1.secp256k1.Signature.fromCompact(signature.subarray(0, 64))
|
|
169
|
+
.addRecoveryBit(signature[64])
|
|
170
|
+
.recoverPublicKey(digest)
|
|
171
|
+
.toRawBytes(true);
|
|
172
|
+
return (0, ripemd160_1.ripemd160)((0, sha256_1.sha256)(publicKey));
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** The addresses that signed `parsed`, once each, in credential order. */
|
|
179
|
+
function signersOf(parsed) {
|
|
180
|
+
const digest = (0, sha256_1.sha256)(parsed.unsignedBytes);
|
|
181
|
+
const found = new Map();
|
|
182
|
+
for (const credential of parsed.signed.getCredentials()) {
|
|
183
|
+
if (credential._type !== sdk_1.TYPES.credential)
|
|
184
|
+
continue;
|
|
185
|
+
for (const hex of credential.getSignatures()) {
|
|
186
|
+
const address = signerOf((0, bytes_1.fromHex)(hex.replace(/^0x/, '')), digest);
|
|
187
|
+
if (address)
|
|
188
|
+
found.set((0, bytes_1.toHex)(address), address);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return [...found.values()];
|
|
192
|
+
}
|
|
193
|
+
/** avalanchejs's `Context` for this network; `fees` fills the fee fields the builder reads. */
|
|
194
|
+
function sdkContext(config, fees = {}) {
|
|
195
|
+
const [bandwidth, dbRead, dbWrite, compute] = fees.weights ?? [0, 0, 0, 0];
|
|
196
|
+
return {
|
|
197
|
+
networkID: config.networkId,
|
|
198
|
+
hrp: config.hrp,
|
|
199
|
+
xBlockchainID: config.vm === 'avm' ? config.blockchainId : '',
|
|
200
|
+
pBlockchainID: config.vm === 'pvm' ? config.blockchainId : '',
|
|
201
|
+
cBlockchainID: '',
|
|
202
|
+
avaxAssetID: config.avaxAssetId,
|
|
203
|
+
baseTxFee: fees.txFee ?? 0n,
|
|
204
|
+
createAssetTxFee: 0n,
|
|
205
|
+
platformFeeConfig: {
|
|
206
|
+
weights: sdk_1.avalanche.Common.createDimensions({ bandwidth, dbRead, dbWrite, compute }),
|
|
207
|
+
maxCapacity: 0n,
|
|
208
|
+
maxPerSecond: 0n,
|
|
209
|
+
targetPerSecond: 0n,
|
|
210
|
+
minPrice: 0n,
|
|
211
|
+
excessConversionConstant: 0n,
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** The absurd-fee guard: no transfer ever pays more than `options.maxFee`. */
|
|
216
|
+
function assertSaneFee(fee, config) {
|
|
217
|
+
if (fee > config.maxFee) {
|
|
218
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'the fee exceeds the configured maximum (options.maxFee)');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const insufficient = (required, available) => new error_1.ChainError('INSUFFICIENT_FUNDS', 'insufficient funds for this transfer', {
|
|
222
|
+
details: { required: required.toString(), available: available.toString() },
|
|
223
|
+
});
|
|
224
|
+
/**
|
|
225
|
+
* A BaseTx from `from` paying `outputs`, spending the first of `utxos` (in their order)
|
|
226
|
+
* that cover the outputs and the fee, with change back to `from`. Checked before it is
|
|
227
|
+
* returned.
|
|
228
|
+
*/
|
|
229
|
+
function buildBaseTx(args) {
|
|
230
|
+
const { config, from, utxos, fee } = args;
|
|
231
|
+
const outputs = args.outputs.map((o) => sdk_1.avalanche.TransferableOutput.fromNative(config.avaxAssetId, o.amount, [o.to], 0n, 1));
|
|
232
|
+
const sdkUtxos = utxos.map((u) => u.sdk);
|
|
233
|
+
let tx;
|
|
234
|
+
let bytes;
|
|
235
|
+
try {
|
|
236
|
+
const unsigned = fee.model === 'static'
|
|
237
|
+
? sdk_1.avalanche.avm.newBaseTx(sdkContext(config, { txFee: fee.txFee }), [from], sdkUtxos, outputs, {
|
|
238
|
+
changeAddresses: [from],
|
|
239
|
+
memo: args.memo,
|
|
240
|
+
minIssuanceTime: args.minIssuanceTime,
|
|
241
|
+
})
|
|
242
|
+
: sdk_1.avalanche.pvm.newBaseTx({
|
|
243
|
+
feeState: { ...fee.state, price: fee.price },
|
|
244
|
+
fromAddressesBytes: [from],
|
|
245
|
+
changeAddressesBytes: [from],
|
|
246
|
+
outputs,
|
|
247
|
+
utxos: sdkUtxos,
|
|
248
|
+
memo: args.memo,
|
|
249
|
+
minIssuanceTime: args.minIssuanceTime,
|
|
250
|
+
}, sdkContext(config, { weights: fee.weights }));
|
|
251
|
+
tx = unsigned.getTx();
|
|
252
|
+
bytes = unsigned.toBytes();
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
const message = error instanceof Error ? error.message : '';
|
|
256
|
+
const available = utxos.reduce((sum, u) => sum + u.amount, 0n);
|
|
257
|
+
const paid = args.outputs.reduce((sum, o) => sum + o.amount, 0n);
|
|
258
|
+
if (/insufficient funds/i.test(message))
|
|
259
|
+
throw insufficient(paid, available);
|
|
260
|
+
if (/exceeds capacity/i.test(message)) {
|
|
261
|
+
throw new error_1.ChainError('TX_REFUSED', 'the P-Chain has no gas capacity for this transaction now; retry later', { retryable: true });
|
|
262
|
+
}
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
return checkBuilt({ ...args, tx, bytes });
|
|
266
|
+
}
|
|
267
|
+
const sameOwners = (owners, address) => owners.locktime.value() === 0n &&
|
|
268
|
+
owners.threshold.value() === 1 &&
|
|
269
|
+
owners.addrs.length === 1 &&
|
|
270
|
+
(0, bytes_1.equalBytes)(owners.addrs[0]?.toBytes() ?? new Uint8Array(), address);
|
|
271
|
+
const sdkMismatch = (what) => new error_1.ProviderError('PROVIDER_UNAVAILABLE', `the built transaction is wrong: ${what}`, {
|
|
272
|
+
retryable: false,
|
|
273
|
+
});
|
|
274
|
+
function checkBuilt(args) {
|
|
275
|
+
const { config, from, tx, fee } = args;
|
|
276
|
+
const base = tx.baseTx;
|
|
277
|
+
if (!base)
|
|
278
|
+
throw sdkMismatch('no base transaction');
|
|
279
|
+
if (base.NetworkId.value() !== config.networkId ||
|
|
280
|
+
base.BlockchainId.toString() !== config.blockchainId) {
|
|
281
|
+
throw sdkMismatch('another network or chain');
|
|
282
|
+
}
|
|
283
|
+
if (!(0, bytes_1.equalBytes)(base.memo.bytes, args.memo))
|
|
284
|
+
throw sdkMismatch('the memo');
|
|
285
|
+
const offered = new Map(args.utxos.map((u) => [u.utxoId, u]));
|
|
286
|
+
const inputs = [];
|
|
287
|
+
let spent = 0n;
|
|
288
|
+
for (const input of base.inputs) {
|
|
289
|
+
const key = (0, exports.utxoKey)(input.utxoID.txID.toString(), input.utxoID.outputIdx.value());
|
|
290
|
+
const utxo = offered.get(key);
|
|
291
|
+
if (!utxo || inputs.includes(key) || input.amount() !== utxo.amount) {
|
|
292
|
+
throw sdkMismatch('an input that was not offered');
|
|
293
|
+
}
|
|
294
|
+
inputs.push(key);
|
|
295
|
+
spent += utxo.amount;
|
|
296
|
+
}
|
|
297
|
+
// Every intended output exactly once; every other output is change to the sender.
|
|
298
|
+
const pending = [...args.outputs];
|
|
299
|
+
let paid = 0n;
|
|
300
|
+
let change = 0n;
|
|
301
|
+
for (const output of base.outputs) {
|
|
302
|
+
if (output.assetId.toString() !== config.avaxAssetId ||
|
|
303
|
+
output.output._type !== sdk_1.TYPES.transferOutput) {
|
|
304
|
+
throw sdkMismatch('an output that is not plain AVAX');
|
|
305
|
+
}
|
|
306
|
+
const owners = output.output.outputOwners;
|
|
307
|
+
const amount = output.amount();
|
|
308
|
+
const index = pending.findIndex((p) => p.amount === amount && sameOwners(owners, p.to));
|
|
309
|
+
if (index !== -1) {
|
|
310
|
+
pending.splice(index, 1);
|
|
311
|
+
paid += amount;
|
|
312
|
+
}
|
|
313
|
+
else if (sameOwners(owners, from)) {
|
|
314
|
+
change += amount;
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
throw sdkMismatch('an output to an address not asked for');
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (pending.length > 0)
|
|
321
|
+
throw sdkMismatch('an intended output is missing');
|
|
322
|
+
const burned = spent - paid - change;
|
|
323
|
+
let gas;
|
|
324
|
+
let expected;
|
|
325
|
+
if (fee.model === 'static') {
|
|
326
|
+
expected = fee.txFee;
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
const weights = sdk_1.avalanche.Common.createDimensions({
|
|
330
|
+
bandwidth: fee.weights[0],
|
|
331
|
+
dbRead: fee.weights[1],
|
|
332
|
+
dbWrite: fee.weights[2],
|
|
333
|
+
compute: fee.weights[3],
|
|
334
|
+
});
|
|
335
|
+
expected = sdk_1.avalanche.pvm.calculateFee(tx, weights, fee.price);
|
|
336
|
+
gas = expected / (fee.price === 0n ? 1n : fee.price);
|
|
337
|
+
}
|
|
338
|
+
if (burned !== expected)
|
|
339
|
+
throw sdkMismatch('it burns another fee');
|
|
340
|
+
assertSaneFee(burned, config);
|
|
341
|
+
const signedSize = args.bytes.length + 4 + base.inputs.length * CREDENTIAL_BYTES;
|
|
342
|
+
if (signedSize > exports.MAX_TX_BYTES) {
|
|
343
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'the transaction would exceed 64 KiB; send fewer outputs or consolidate small outputs first');
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
bytes: args.bytes,
|
|
347
|
+
inputs: [...inputs].sort(),
|
|
348
|
+
fee: burned,
|
|
349
|
+
...(gas !== undefined ? { gas } : {}),
|
|
350
|
+
change,
|
|
351
|
+
outputs: base.outputs.length,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* An output that does not exist: `amount` of AVAX owned by `owner`, at a zero transaction
|
|
356
|
+
* id. Fee estimates build with it when the wallet's outputs do not cover a transfer, so the
|
|
357
|
+
* estimate still names the fee of a one-input transaction. Never spent.
|
|
358
|
+
*/
|
|
359
|
+
function syntheticUtxo(owner, amount, config) {
|
|
360
|
+
const asset = (0, cb58_1.cb58Decode)(config.avaxAssetId);
|
|
361
|
+
const bytes = new Uint8Array(2 + 32 + 4 + 32 + 4 + 8 + 8 + 4 + 4 + 20);
|
|
362
|
+
const view = new DataView(bytes.buffer);
|
|
363
|
+
bytes.set(asset, 38);
|
|
364
|
+
view.setUint32(70, 7); // secp256k1fx.TransferOutput, in both chains' codecs
|
|
365
|
+
view.setBigUint64(74, amount);
|
|
366
|
+
view.setUint32(90, 1); // threshold
|
|
367
|
+
view.setUint32(94, 1); // one owner
|
|
368
|
+
bytes.set(owner, 98);
|
|
369
|
+
return parseUtxo(bytes, config);
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/adapters/avalanche/codec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Avalanche bytes through avalanchejs: unspent outputs, signed transactions, BaseTx\n * building and credential assembly.\n * - Every parse is a round trip: bytes that do not re-encode to themselves are not taken.\n * - A transaction signs one digest, the SHA-256 of its unsigned bytes; every input's\n * credential carries the same 65-byte recoverable signature (r, s, recovery id).\n * - A built transaction is checked before it is used (defence in depth against the SDK):\n * its network and chain, that it spends only the outputs offered, pays every intended\n * output exactly, sends the rest back to the sender, and burns exactly the expected fee.\n * - A transaction's senders are the addresses its signatures recover to, for every input,\n * imported ones included.\n */\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport { ripemd160 } from '@noble/hashes/ripemd160';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { ChainError, ProviderError, ValidationError } from '../../core/errors/error';\nimport { equalBytes, fromHex, toHex } from '../../core/util/bytes';\nimport { malformed } from './api';\nimport { cb58Decode, cb58Encode, idOf } from './cb58';\nimport type { AvalancheNetworkConfig } from './network';\nimport {\n TYPES,\n avalanche,\n type SdkContext,\n type SdkFeeState,\n type SdkOutputOwners,\n type SdkSignedTx,\n type SdkTransaction,\n type SdkTransferOutput,\n type SdkUtxo,\n} from './sdk';\nimport type { FeeWeights } from './api';\n\n/** AvalancheGo's mempool refuses a transaction of more bytes (`MaxTxSize`, 64 KiB). */\nexport const MAX_TX_BYTES = 64 * 1024;\n/** A secp256k1 credential of one signature: type id, count and the signature. */\nconst CREDENTIAL_BYTES = 4 + 4 + 65;\n/** `avax.MaxMemoSize`. */\nexport const MAX_MEMO_BYTES = 256;\n\nconst vmName = (config: Pick<AvalancheNetworkConfig, 'vm'>): 'AVM' | 'PVM' =>\n config.vm === 'avm' ? 'AVM' : 'PVM';\n\n/** A reservation key: `txID:outputIndex`. */\nexport const utxoKey = (txId: string, outputIndex: number): string =>\n `${txId}:${outputIndex}`;\n\n/** The `utxoId` of raw UTXO bytes: codec (2), txID (32), output index (4) lead them all. */\nexport function utxoKeyOf(bytes: Uint8Array): string {\n if (bytes.length < 38) throw malformed('utxo');\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n return utxoKey(cb58Encode(bytes.subarray(2, 34)), view.getUint32(34));\n}\n\n/** An unspent output, read from the node's bytes. */\nexport interface ParsedUtxo {\n readonly utxoId: string;\n readonly txId: string;\n readonly outputIndex: number;\n readonly assetId: string;\n readonly amount: bigint;\n readonly locktime: bigint;\n readonly threshold: number;\n readonly owners: readonly Uint8Array[];\n /** A `secp256k1fx.TransferOutput` (not stake-locked, minted or an NFT). */\n readonly plain: boolean;\n readonly sdk: SdkUtxo;\n}\n\nconst hasAmount = (value: unknown): value is { amount(): bigint } =>\n typeof (value as { amount?: unknown }).amount === 'function';\n\nfunction ownersOf(output: { readonly _type: string }): SdkOutputOwners | undefined {\n if (output._type === TYPES.transferOutput) {\n return (output as SdkTransferOutput).outputOwners;\n }\n if (output._type === TYPES.stakeableLockOut) {\n const inner = (output as unknown as { transferOut: { _type: string } }).transferOut;\n return inner._type === TYPES.transferOutput\n ? (inner as SdkTransferOutput).outputOwners\n : undefined;\n }\n return undefined;\n}\n\nexport function parseUtxo(\n bytes: Uint8Array,\n config: Pick<AvalancheNetworkConfig, 'vm'>,\n): ParsedUtxo {\n const manager = avalanche.utils.getManagerForVM(vmName(config));\n let utxo: SdkUtxo;\n try {\n utxo = manager.unpack(bytes, avalanche.Utxo);\n } catch {\n throw malformed('utxo');\n }\n const reencoded = (() => {\n try {\n return new Uint8Array([0, 0, ...utxo.toBytes(manager.getDefaultCodec())]);\n } catch {\n throw malformed('utxo');\n }\n })();\n if (!equalBytes(reencoded, bytes)) throw malformed('utxo');\n const owners = ownersOf(utxo.output);\n const plain = utxo.output._type === TYPES.transferOutput;\n const amount = hasAmount(utxo.output) ? utxo.output.amount() : 0n;\n const locktime =\n utxo.output._type === TYPES.stakeableLockOut\n ? (utxo.output as unknown as { getLocktime(): bigint }).getLocktime()\n : (owners?.locktime.value() ?? 0n);\n const txId = utxo.utxoId.txID.toString();\n const outputIndex = utxo.utxoId.outputIdx.value();\n return {\n utxoId: utxoKey(txId, outputIndex),\n txId,\n outputIndex,\n assetId: utxo.assetId.toString(),\n amount,\n locktime,\n threshold: owners?.threshold.value() ?? 0,\n owners: owners?.addrs.map((a) => a.toBytes()) ?? [],\n plain,\n sdk: utxo,\n };\n}\n\n/** Whether a transfer from `from` may spend `utxo`: plain AVAX, unlocked, `from` alone signs. */\nexport function spendableBy(\n utxo: ParsedUtxo,\n from: Uint8Array,\n config: Pick<AvalancheNetworkConfig, 'avaxAssetId'>,\n): boolean {\n return (\n utxo.plain &&\n utxo.assetId === config.avaxAssetId &&\n utxo.amount > 0n &&\n utxo.locktime === 0n &&\n utxo.threshold === 1 &&\n utxo.owners.some((owner) => equalBytes(owner, from))\n );\n}\n\n/** Signed transaction bytes, parsed; their unsigned part re-encoded. */\nexport interface ParsedTx {\n readonly id: string;\n readonly signed: SdkSignedTx;\n readonly tx: SdkTransaction;\n readonly unsignedBytes: Uint8Array;\n}\n\nexport function parseSignedTx(\n bytes: Uint8Array,\n config: Pick<AvalancheNetworkConfig, 'vm'>,\n): ParsedTx {\n const manager = avalanche.utils.getManagerForVM(vmName(config));\n let signed: SdkSignedTx;\n let reencoded: Uint8Array;\n let unsignedBytes: Uint8Array;\n try {\n signed = manager.unpack(bytes, avalanche.avaxSerial.SignedTx);\n reencoded = signed.toBytes();\n unsignedBytes = manager.packCodec(signed.unsignedTx);\n } catch {\n throw malformed('transaction');\n }\n if (\n !equalBytes(reencoded, bytes) ||\n !equalBytes(bytes.subarray(0, unsignedBytes.length), unsignedBytes)\n ) {\n throw malformed('transaction');\n }\n return { id: idOf(bytes), signed, tx: signed.unsignedTx, unsignedBytes };\n}\n\n/** The unsigned transaction in `bytes` (a prepared payload), re-encoded exactly. */\nexport function parseUnsignedTx(\n bytes: Uint8Array,\n config: Pick<AvalancheNetworkConfig, 'vm'>,\n): SdkTransaction {\n const manager = avalanche.utils.getManagerForVM(vmName(config));\n let tx: SdkTransaction;\n try {\n tx = manager.unpackTransaction(bytes);\n if (!equalBytes(manager.packCodec(tx), bytes)) throw new Error('not exact');\n } catch {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'not an unsigned transaction of this chain',\n );\n }\n return tx;\n}\n\n/** `r ‖ s ‖ v`: a 64-byte compact signature and its recovery id, as credentials hold them. */\nexport function credentialSignature(compact: Uint8Array, recovery: number): Uint8Array {\n const out = new Uint8Array(65);\n out.set(compact, 0);\n out[64] = recovery;\n return out;\n}\n\n/** The signed bytes: every input's credential carries `signature` once per signer index. */\nexport function assembleSigned(\n unsignedBytes: Uint8Array,\n signature: Uint8Array,\n config: Pick<AvalancheNetworkConfig, 'vm'>,\n): Uint8Array {\n const tx = parseUnsignedTx(unsignedBytes, config);\n const credentials = tx\n .getSigIndices()\n .map(\n (indices) =>\n new avalanche.Credential(indices.map(() => new avalanche.Signature(signature))),\n );\n return new avalanche.avaxSerial.SignedTx(tx, credentials).toBytes();\n}\n\n/** The 20-byte address a 65-byte signature over `digest` recovers to, if any. */\nfunction signerOf(signature: Uint8Array, digest: Uint8Array): Uint8Array | undefined {\n if (signature.length !== 65 || (signature[64] as number) > 3) return undefined;\n try {\n const publicKey = secp256k1.Signature.fromCompact(signature.subarray(0, 64))\n .addRecoveryBit(signature[64] as number)\n .recoverPublicKey(digest)\n .toRawBytes(true);\n return ripemd160(sha256(publicKey));\n } catch {\n return undefined;\n }\n}\n\n/** The addresses that signed `parsed`, once each, in credential order. */\nexport function signersOf(parsed: ParsedTx): Uint8Array[] {\n const digest = sha256(parsed.unsignedBytes);\n const found = new Map<string, Uint8Array>();\n for (const credential of parsed.signed.getCredentials()) {\n if (credential._type !== TYPES.credential) continue;\n for (const hex of credential.getSignatures()) {\n const address = signerOf(fromHex(hex.replace(/^0x/, '')), digest);\n if (address) found.set(toHex(address), address);\n }\n }\n return [...found.values()];\n}\n\n/** avalanchejs's `Context` for this network; `fees` fills the fee fields the builder reads. */\nexport function sdkContext(\n config: AvalancheNetworkConfig,\n fees: { readonly txFee?: bigint; readonly weights?: FeeWeights } = {},\n): SdkContext {\n const [bandwidth, dbRead, dbWrite, compute] = fees.weights ?? [0, 0, 0, 0];\n return {\n networkID: config.networkId,\n hrp: config.hrp,\n xBlockchainID: config.vm === 'avm' ? config.blockchainId : '',\n pBlockchainID: config.vm === 'pvm' ? config.blockchainId : '',\n cBlockchainID: '',\n avaxAssetID: config.avaxAssetId,\n baseTxFee: fees.txFee ?? 0n,\n createAssetTxFee: 0n,\n platformFeeConfig: {\n weights: avalanche.Common.createDimensions({ bandwidth, dbRead, dbWrite, compute }),\n maxCapacity: 0n,\n maxPerSecond: 0n,\n targetPerSecond: 0n,\n minPrice: 0n,\n excessConversionConstant: 0n,\n },\n };\n}\n\nexport type FeePlan =\n | { readonly model: 'static'; readonly txFee: bigint }\n | {\n readonly model: 'dynamic';\n readonly price: bigint;\n readonly state: SdkFeeState;\n readonly weights: FeeWeights;\n };\n\nexport interface PlannedOutput {\n readonly to: Uint8Array;\n readonly amount: bigint;\n}\n\nexport interface BuiltTx {\n /** The unsigned bytes (codec version and transaction). */\n readonly bytes: Uint8Array;\n readonly inputs: readonly string[];\n readonly fee: bigint;\n /** P-Chain: the gas the transaction uses. */\n readonly gas?: bigint;\n readonly change: bigint;\n readonly outputs: number;\n}\n\n/** The absurd-fee guard: no transfer ever pays more than `options.maxFee`. */\nexport function assertSaneFee(\n fee: bigint,\n config: Pick<AvalancheNetworkConfig, 'maxFee'>,\n): void {\n if (fee > config.maxFee) {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'the fee exceeds the configured maximum (options.maxFee)',\n );\n }\n}\n\nconst insufficient = (required: bigint, available: bigint): ChainError =>\n new ChainError('INSUFFICIENT_FUNDS', 'insufficient funds for this transfer', {\n details: { required: required.toString(), available: available.toString() },\n });\n\n/**\n * A BaseTx from `from` paying `outputs`, spending the first of `utxos` (in their order)\n * that cover the outputs and the fee, with change back to `from`. Checked before it is\n * returned.\n */\nexport function buildBaseTx(args: {\n readonly config: AvalancheNetworkConfig;\n readonly from: Uint8Array;\n readonly utxos: readonly ParsedUtxo[];\n readonly outputs: readonly PlannedOutput[];\n readonly memo: Uint8Array;\n readonly minIssuanceTime: bigint;\n readonly fee: FeePlan;\n}): BuiltTx {\n const { config, from, utxos, fee } = args;\n const outputs = args.outputs.map((o) =>\n avalanche.TransferableOutput.fromNative(config.avaxAssetId, o.amount, [o.to], 0n, 1),\n );\n const sdkUtxos = utxos.map((u) => u.sdk);\n let tx: SdkTransaction;\n let bytes: Uint8Array;\n try {\n const unsigned =\n fee.model === 'static'\n ? avalanche.avm.newBaseTx(\n sdkContext(config, { txFee: fee.txFee }),\n [from],\n sdkUtxos,\n outputs,\n {\n changeAddresses: [from],\n memo: args.memo,\n minIssuanceTime: args.minIssuanceTime,\n },\n )\n : avalanche.pvm.newBaseTx(\n {\n feeState: { ...fee.state, price: fee.price },\n fromAddressesBytes: [from],\n changeAddressesBytes: [from],\n outputs,\n utxos: sdkUtxos,\n memo: args.memo,\n minIssuanceTime: args.minIssuanceTime,\n },\n sdkContext(config, { weights: fee.weights }),\n );\n tx = unsigned.getTx();\n bytes = unsigned.toBytes();\n } catch (error) {\n const message = error instanceof Error ? error.message : '';\n const available = utxos.reduce((sum, u) => sum + u.amount, 0n);\n const paid = args.outputs.reduce((sum, o) => sum + o.amount, 0n);\n if (/insufficient funds/i.test(message)) throw insufficient(paid, available);\n if (/exceeds capacity/i.test(message)) {\n throw new ChainError(\n 'TX_REFUSED',\n 'the P-Chain has no gas capacity for this transaction now; retry later',\n { retryable: true },\n );\n }\n throw error;\n }\n return checkBuilt({ ...args, tx, bytes });\n}\n\nconst sameOwners = (owners: SdkOutputOwners, address: Uint8Array): boolean =>\n owners.locktime.value() === 0n &&\n owners.threshold.value() === 1 &&\n owners.addrs.length === 1 &&\n equalBytes(owners.addrs[0]?.toBytes() ?? new Uint8Array(), address);\n\nconst sdkMismatch = (what: string): ProviderError =>\n new ProviderError('PROVIDER_UNAVAILABLE', `the built transaction is wrong: ${what}`, {\n retryable: false,\n });\n\nfunction checkBuilt(args: {\n readonly config: AvalancheNetworkConfig;\n readonly from: Uint8Array;\n readonly utxos: readonly ParsedUtxo[];\n readonly outputs: readonly PlannedOutput[];\n readonly memo: Uint8Array;\n readonly fee: FeePlan;\n readonly tx: SdkTransaction;\n readonly bytes: Uint8Array;\n}): BuiltTx {\n const { config, from, tx, fee } = args;\n const base = tx.baseTx;\n if (!base) throw sdkMismatch('no base transaction');\n if (\n base.NetworkId.value() !== config.networkId ||\n base.BlockchainId.toString() !== config.blockchainId\n ) {\n throw sdkMismatch('another network or chain');\n }\n if (!equalBytes(base.memo.bytes, args.memo)) throw sdkMismatch('the memo');\n const offered = new Map(args.utxos.map((u) => [u.utxoId, u]));\n const inputs: string[] = [];\n let spent = 0n;\n for (const input of base.inputs) {\n const key = utxoKey(input.utxoID.txID.toString(), input.utxoID.outputIdx.value());\n const utxo = offered.get(key);\n if (!utxo || inputs.includes(key) || input.amount() !== utxo.amount) {\n throw sdkMismatch('an input that was not offered');\n }\n inputs.push(key);\n spent += utxo.amount;\n }\n // Every intended output exactly once; every other output is change to the sender.\n const pending = [...args.outputs];\n let paid = 0n;\n let change = 0n;\n for (const output of base.outputs) {\n if (\n output.assetId.toString() !== config.avaxAssetId ||\n output.output._type !== TYPES.transferOutput\n ) {\n throw sdkMismatch('an output that is not plain AVAX');\n }\n const owners = (output.output as SdkTransferOutput).outputOwners;\n const amount = output.amount();\n const index = pending.findIndex(\n (p) => p.amount === amount && sameOwners(owners, p.to),\n );\n if (index !== -1) {\n pending.splice(index, 1);\n paid += amount;\n } else if (sameOwners(owners, from)) {\n change += amount;\n } else {\n throw sdkMismatch('an output to an address not asked for');\n }\n }\n if (pending.length > 0) throw sdkMismatch('an intended output is missing');\n const burned = spent - paid - change;\n let gas: bigint | undefined;\n let expected: bigint;\n if (fee.model === 'static') {\n expected = fee.txFee;\n } else {\n const weights = avalanche.Common.createDimensions({\n bandwidth: fee.weights[0],\n dbRead: fee.weights[1],\n dbWrite: fee.weights[2],\n compute: fee.weights[3],\n });\n expected = avalanche.pvm.calculateFee(tx, weights, fee.price);\n gas = expected / (fee.price === 0n ? 1n : fee.price);\n }\n if (burned !== expected) throw sdkMismatch('it burns another fee');\n assertSaneFee(burned, config);\n const signedSize = args.bytes.length + 4 + base.inputs.length * CREDENTIAL_BYTES;\n if (signedSize > MAX_TX_BYTES) {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'the transaction would exceed 64 KiB; send fewer outputs or consolidate small outputs first',\n );\n }\n return {\n bytes: args.bytes,\n inputs: [...inputs].sort(),\n fee: burned,\n ...(gas !== undefined ? { gas } : {}),\n change,\n outputs: base.outputs.length,\n };\n}\n\n/**\n * An output that does not exist: `amount` of AVAX owned by `owner`, at a zero transaction\n * id. Fee estimates build with it when the wallet's outputs do not cover a transfer, so the\n * estimate still names the fee of a one-input transaction. Never spent.\n */\nexport function syntheticUtxo(\n owner: Uint8Array,\n amount: bigint,\n config: Pick<AvalancheNetworkConfig, 'vm' | 'avaxAssetId'>,\n): ParsedUtxo {\n const asset = cb58Decode(config.avaxAssetId) as Uint8Array;\n const bytes = new Uint8Array(2 + 32 + 4 + 32 + 4 + 8 + 8 + 4 + 4 + 20);\n const view = new DataView(bytes.buffer);\n bytes.set(asset, 38);\n view.setUint32(70, 7); // secp256k1fx.TransferOutput, in both chains' codecs\n view.setBigUint64(74, amount);\n view.setUint32(90, 1); // threshold\n view.setUint32(94, 1); // one owner\n bytes.set(owner, 98);\n return parseUtxo(bytes, config);\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every Avalanche port is built from, the transport tags of the `ChainDriver` contract
|
|
3
|
+
* table, and the locator: which accepted block holds a transaction.
|
|
4
|
+
*
|
|
5
|
+
* AvalancheGo can say a transaction is accepted, never in which block. The locator asks the
|
|
6
|
+
* Data API, then checks the answer against the node's block; a transaction the indexer does
|
|
7
|
+
* not know yet (it trails the chain by seconds) is looked for in the newest `SCAN_DEPTH`
|
|
8
|
+
* blocks. Accepted blocks never change (Snowman finality), so a location is kept once found.
|
|
9
|
+
* A location found on one endpoint is only a candidate for proofs: every proof re-reads its
|
|
10
|
+
* block under the proof quorum, and a candidate the quorum contradicts is forgotten.
|
|
11
|
+
*/
|
|
12
|
+
import { ProviderError } from '../../core/errors/error';
|
|
13
|
+
import type { Logger } from '../../core/events/logger';
|
|
14
|
+
import type { ChainInfo, NetworkInfo } from '../../core/model/chain';
|
|
15
|
+
import type { Clock } from '../../core/util/clock';
|
|
16
|
+
import type { AvalancheNode, DataApi, Location } from './api';
|
|
17
|
+
import type { AvalancheNetworkConfig } from './network';
|
|
18
|
+
import type { AvalancheCallTags } from './types';
|
|
19
|
+
export declare const READ: AvalancheCallTags;
|
|
20
|
+
export declare const MONITOR: AvalancheCallTags;
|
|
21
|
+
export declare const PROOF: AvalancheCallTags;
|
|
22
|
+
export declare const withSignal: (tags: AvalancheCallTags, signal?: AbortSignal) => AvalancheCallTags;
|
|
23
|
+
/** How many blocks below the head the locator reads when the indexer does not know a tx. */
|
|
24
|
+
export declare const SCAN_DEPTH = 16;
|
|
25
|
+
export declare class LocationCache {
|
|
26
|
+
#private;
|
|
27
|
+
get(txId: string): Location | undefined;
|
|
28
|
+
set(txId: string, location: Location): void;
|
|
29
|
+
forget(txId: string): void;
|
|
30
|
+
}
|
|
31
|
+
export interface AvalancheContext {
|
|
32
|
+
readonly node: AvalancheNode;
|
|
33
|
+
readonly dataApi: DataApi;
|
|
34
|
+
readonly chain: ChainInfo;
|
|
35
|
+
readonly network: NetworkInfo;
|
|
36
|
+
readonly config: AvalancheNetworkConfig;
|
|
37
|
+
readonly clock: Clock;
|
|
38
|
+
readonly log: Logger;
|
|
39
|
+
readonly located: LocationCache;
|
|
40
|
+
}
|
|
41
|
+
export declare const undecided: (reason: string) => ProviderError;
|
|
42
|
+
/** Two reads that cannot both hold decide nothing (retryable). */
|
|
43
|
+
export declare const contradiction: (reason: string) => ProviderError;
|
|
44
|
+
/**
|
|
45
|
+
* On a proof path only a definitive negative proof may answer "no".
|
|
46
|
+
* Every other non-retryable provider error (a JSON-RPC error that is not a "not found" the
|
|
47
|
+
* caller already mapped, a proxy's 4xx, a 401/403) becomes a retryable
|
|
48
|
+
* `PROVIDER_UNAVAILABLE` here, so it never decides anything. Retryable errors pass as they
|
|
49
|
+
* are. The cost is liveness only.
|
|
50
|
+
*/
|
|
51
|
+
export declare function proofRead<T>(read: () => Promise<T>): Promise<T>;
|
|
52
|
+
/**
|
|
53
|
+
* The accepted block holding `txId`, a transaction the node has accepted: from the cache,
|
|
54
|
+
* else the indexer (checked against the node's block at its height), else the newest
|
|
55
|
+
* `SCAN_DEPTH` blocks. `undefined` when none of them names it yet, `'no-block'` for an
|
|
56
|
+
* X-Chain transaction from before the chain had blocks. Reads are single
|
|
57
|
+
* (`monitor` or `read`) reads: a location is a candidate; proofs re-read it under quorum.
|
|
58
|
+
*/
|
|
59
|
+
export declare function locate(ctx: AvalancheContext, txId: string, tags: AvalancheCallTags): Promise<Location | 'no-block' | undefined>;
|