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,545 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSolanaBuilder = createSolanaBuilder;
|
|
4
|
+
exports.createSolanaBroadcaster = createSolanaBroadcaster;
|
|
5
|
+
const error_1 = require("../../core/errors/error");
|
|
6
|
+
const asset_1 = require("../../core/model/asset");
|
|
7
|
+
const fee_1 = require("../../core/model/fee");
|
|
8
|
+
const bytes_1 = require("../../core/util/bytes");
|
|
9
|
+
const errors_1 = require("./errors");
|
|
10
|
+
const fees_1 = require("./fees");
|
|
11
|
+
const keys_1 = require("./keys");
|
|
12
|
+
const programs_1 = require("./programs");
|
|
13
|
+
const reader_1 = require("./reader");
|
|
14
|
+
const rpc_1 = require("./rpc");
|
|
15
|
+
const wire_1 = require("./wire");
|
|
16
|
+
const invalid = (reason) => new error_1.ValidationError('INVALID_INTENT', reason);
|
|
17
|
+
/** A UTF-16 surrogate without its pair: text that has no UTF-8 encoding. */
|
|
18
|
+
const LONE_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/;
|
|
19
|
+
const U64_MAX = 2n ** 64n - 1n;
|
|
20
|
+
const SIGNATURE_BYTES = 64;
|
|
21
|
+
/** The longest text of a packet-sized transaction: 1,644 base64 characters, 2,464 hex. */
|
|
22
|
+
const MAX_BASE64_CHARS = 4 * Math.ceil(programs_1.MAX_TRANSACTION_SIZE / 3);
|
|
23
|
+
const MAX_HEX_CHARS = 2 * programs_1.MAX_TRANSACTION_SIZE;
|
|
24
|
+
const TOO_LARGE = `the transaction exceeds ${programs_1.MAX_TRANSACTION_SIZE} bytes`;
|
|
25
|
+
/** Every node refuses a transaction over the packet limit; it is refused here, unsent. */
|
|
26
|
+
const REFUSED_TOO_LARGE = Object.freeze({
|
|
27
|
+
kind: 'refused',
|
|
28
|
+
code: 'TX_REFUSED',
|
|
29
|
+
reason: 'transaction too large',
|
|
30
|
+
});
|
|
31
|
+
function onlyOutput(intent) {
|
|
32
|
+
const output = intent.outputs[0];
|
|
33
|
+
if (!output || intent.outputs.length !== 1) {
|
|
34
|
+
throw invalid('Solana transfers have exactly one output');
|
|
35
|
+
}
|
|
36
|
+
return output;
|
|
37
|
+
}
|
|
38
|
+
const addressOf = (publicKey) => {
|
|
39
|
+
try {
|
|
40
|
+
return (0, keys_1.addressFromPublicKey)(publicKey);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
/** The wallet's ed25519 key whose address is the sending address. */
|
|
47
|
+
function keyOf(from, keys) {
|
|
48
|
+
const key = keys.find((k) => k.scheme === 'ed25519' && addressOf(k.publicKey) === from);
|
|
49
|
+
if (!key) {
|
|
50
|
+
throw new error_1.SigningError('SIGNER_UNAVAILABLE', 'no ed25519 key for the sending address');
|
|
51
|
+
}
|
|
52
|
+
return key;
|
|
53
|
+
}
|
|
54
|
+
/** At most 256 UTF-8 bytes of well-formed text (the intent's policy, not `memo()`'s). */
|
|
55
|
+
function memoOf(text) {
|
|
56
|
+
if (text === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
if (LONE_SURROGATE.test(text))
|
|
59
|
+
throw invalid('the memo is not well-formed Unicode text');
|
|
60
|
+
if (new TextEncoder().encode(text).length > programs_1.MAX_MEMO_BYTES) {
|
|
61
|
+
throw invalid(`the memo exceeds ${programs_1.MAX_MEMO_BYTES} UTF-8 bytes`);
|
|
62
|
+
}
|
|
63
|
+
return text;
|
|
64
|
+
}
|
|
65
|
+
async function rentExemptMinimum(ctx, bytes, tags) {
|
|
66
|
+
return (0, rpc_1.u64)(await (0, rpc_1.call)(ctx.transport, 'getMinimumBalanceForRentExemption', [bytes, { commitment: 'confirmed' }], tags), 'getMinimumBalanceForRentExemption');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The classic token account of `owner` for `mint` at its associated address, or `null`
|
|
70
|
+
* while that account is not created. An address that only holds lamports is not created
|
|
71
|
+
* yet: the ATA program keeps those lamports when it creates the account, so nobody can
|
|
72
|
+
* block a transfer by funding the address first. Anything else there is not the owner's
|
|
73
|
+
* account for the mint (a reassigned owner included), and is refused.
|
|
74
|
+
*/
|
|
75
|
+
async function associatedAccount(ctx, address, owner, mint, whose, tags) {
|
|
76
|
+
const info = await (0, reader_1.accountInfo)(ctx, address, tags);
|
|
77
|
+
if (!info ||
|
|
78
|
+
(info.owner === programs_1.SYSTEM_PROGRAM && !info.executable && info.data.length === 0)) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const account = info.owner === programs_1.TOKEN_PROGRAM ? (0, programs_1.decodeTokenAccount)(info.data) : null;
|
|
82
|
+
if (!account ||
|
|
83
|
+
(0, keys_1.encodeBase58)(account.owner) !== owner ||
|
|
84
|
+
(0, keys_1.encodeBase58)(account.mint) !== mint) {
|
|
85
|
+
throw invalid(`the ${whose} token account does not match`);
|
|
86
|
+
}
|
|
87
|
+
return { amount: account.amount, frozen: account.frozen };
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Where a transfer pays the recipient `to` (the binding the landing guard trusts): SOL to
|
|
91
|
+
* `to` itself; SPL into `to`'s associated token account for the mint, derived with the
|
|
92
|
+
* mint's own program, classic Token (`mintDecimals` refuses every other owner).
|
|
93
|
+
*/
|
|
94
|
+
const destinationOf = (ctx, to, mint) => mint === undefined ? to : ctx.codec.associatedTokenAddress(to, mint);
|
|
95
|
+
function tokenPlan(ctx, from, to, mint, decimals) {
|
|
96
|
+
return {
|
|
97
|
+
mint,
|
|
98
|
+
decimals,
|
|
99
|
+
source: ctx.codec.associatedTokenAddress(from, mint),
|
|
100
|
+
destination: destinationOf(ctx, to, mint),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** The one output and the recipient's on-chain checks (no key: a fee needs none). */
|
|
104
|
+
async function planTransfer(ctx, intent, tags) {
|
|
105
|
+
const output = onlyOutput(intent);
|
|
106
|
+
const { from } = intent;
|
|
107
|
+
const text = memoOf(intent.memo);
|
|
108
|
+
const base = {
|
|
109
|
+
from,
|
|
110
|
+
to: output.to,
|
|
111
|
+
amount: output.amount,
|
|
112
|
+
...(text !== undefined ? { memo: text } : {}),
|
|
113
|
+
};
|
|
114
|
+
const recipient = output.to === from ? null : await (0, reader_1.accountInfo)(ctx, output.to, tags);
|
|
115
|
+
if (intent.asset === 'native') {
|
|
116
|
+
if (recipient && (recipient.executable || recipient.owner !== programs_1.SYSTEM_PROGRAM)) {
|
|
117
|
+
throw invalid('the recipient is a program-owned account');
|
|
118
|
+
}
|
|
119
|
+
if (!recipient &&
|
|
120
|
+
output.to !== from &&
|
|
121
|
+
output.amount < (await rentExemptMinimum(ctx, 0, tags))) {
|
|
122
|
+
throw new error_1.ValidationError('INVALID_AMOUNT', 'a new account needs at least the rent-exempt minimum');
|
|
123
|
+
}
|
|
124
|
+
return { ...base, createsRecipientAccount: false };
|
|
125
|
+
}
|
|
126
|
+
const mint = (0, reader_1.mintOf)(intent.asset);
|
|
127
|
+
// Token metadata under the proof quorum, with the caller's signal: the decimals are
|
|
128
|
+
// signed into `transferChecked`, so a lagging endpoint without the mint decides
|
|
129
|
+
// nothing.
|
|
130
|
+
const decimals = await (0, reader_1.mintDecimals)(ctx, mint, (0, rpc_1.withSignal)(reader_1.METADATA, tags.signal));
|
|
131
|
+
// Nobody can sign for a program's associated token account.
|
|
132
|
+
if (recipient?.executable) {
|
|
133
|
+
throw invalid('the recipient is a program; send to a wallet or a PDA owner');
|
|
134
|
+
}
|
|
135
|
+
if (recipient &&
|
|
136
|
+
(recipient.owner === programs_1.TOKEN_PROGRAM || recipient.owner === programs_1.TOKEN_2022_PROGRAM)) {
|
|
137
|
+
throw invalid('the recipient is a token account; send to its owner');
|
|
138
|
+
}
|
|
139
|
+
const token = tokenPlan(ctx, from, output.to, mint, decimals);
|
|
140
|
+
const existing = await associatedAccount(ctx, token.destination, output.to, mint, 'recipient', tags);
|
|
141
|
+
if (existing?.frozen)
|
|
142
|
+
throw invalid('the recipient token account is frozen');
|
|
143
|
+
return { ...base, token, createsRecipientAccount: existing === null };
|
|
144
|
+
}
|
|
145
|
+
/** The transfer's own instructions (no compute budget). */
|
|
146
|
+
function transferInstructions(plan) {
|
|
147
|
+
const list = [];
|
|
148
|
+
const { token } = plan;
|
|
149
|
+
if (token) {
|
|
150
|
+
if (plan.createsRecipientAccount) {
|
|
151
|
+
list.push((0, programs_1.createAssociatedTokenAccountIdempotent)(plan.from, token.destination, plan.to, token.mint));
|
|
152
|
+
}
|
|
153
|
+
list.push((0, programs_1.transferChecked)(token.source, token.mint, token.destination, plan.from, plan.amount, token.decimals));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
list.push((0, programs_1.systemTransfer)(plan.from, plan.to, plan.amount));
|
|
157
|
+
}
|
|
158
|
+
if (plan.memo !== undefined)
|
|
159
|
+
list.push((0, programs_1.memo)(plan.memo));
|
|
160
|
+
return list;
|
|
161
|
+
}
|
|
162
|
+
const withBudget = (limit, price, list) => [
|
|
163
|
+
(0, programs_1.setComputeUnitLimit)(limit),
|
|
164
|
+
(0, programs_1.setComputeUnitPrice)(price),
|
|
165
|
+
...list,
|
|
166
|
+
];
|
|
167
|
+
/**
|
|
168
|
+
* The newest blockhash at `confirmed`, its last valid height, and the slot of its block:
|
|
169
|
+
* agave answers from one bank (`rpc.rs` `get_latest_blockhash`: the bank's last blockhash,
|
|
170
|
+
* that blockhash's last valid height, and `new_response`'s context slot, the bank's own).
|
|
171
|
+
* One endpoint's word: proofs attest the three together before using the height.
|
|
172
|
+
*/
|
|
173
|
+
async function latestBlockhash(ctx, tags) {
|
|
174
|
+
const result = await (0, rpc_1.call)(ctx.transport, 'getLatestBlockhash', [{ commitment: 'confirmed' }], tags);
|
|
175
|
+
const value = (0, rpc_1.contextValue)(result, 'getLatestBlockhash');
|
|
176
|
+
if (!value || (0, keys_1.decodeBase58)(value.blockhash, 32) === null) {
|
|
177
|
+
throw (0, rpc_1.malformed)('getLatestBlockhash');
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
blockhash: value.blockhash,
|
|
181
|
+
lastValidBlockHeight: (0, rpc_1.u64)(value.lastValidBlockHeight, 'lastValidBlockHeight'),
|
|
182
|
+
slot: (0, rpc_1.u64)((0, rpc_1.record)((0, rpc_1.record)(result)?.context)?.slot, 'getLatestBlockhash context slot'),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const base64 = (bytes) => Buffer.from(bytes).toString('base64');
|
|
186
|
+
/** Whether `bytes` (a key read from a message) is the key `address`. */
|
|
187
|
+
function isKey(bytes, address) {
|
|
188
|
+
const expected = (0, keys_1.decodeBase58)(address, 32);
|
|
189
|
+
return bytes !== undefined && expected !== null && (0, bytes_1.equalBytes)(bytes, expected);
|
|
190
|
+
}
|
|
191
|
+
/** The transaction with a zero signature for each required signer. */
|
|
192
|
+
const withPlaceholders = (parts, message) => (0, wire_1.signedTransaction)(Array.from({ length: parts.required }, () => new Uint8Array(SIGNATURE_BYTES)), message);
|
|
193
|
+
/**
|
|
194
|
+
* A compiled message read back from its bytes before it is simulated, quoted or signed: one
|
|
195
|
+
* legacy message (a `null` from the reader is a refusal, never "no signers needed") whose
|
|
196
|
+
* only signer is `from`, the fee payer, and whose transaction fits the packet limit.
|
|
197
|
+
*/
|
|
198
|
+
function readBack(message, from) {
|
|
199
|
+
const parts = (0, wire_1.parseMessage)(message);
|
|
200
|
+
if (!parts)
|
|
201
|
+
throw invalid('the compiled message is not one legacy message');
|
|
202
|
+
if (parts.required !== 1 || !isKey(parts.keys[0], from)) {
|
|
203
|
+
throw invalid('the compiled message has unexpected signers');
|
|
204
|
+
}
|
|
205
|
+
if (withPlaceholders(parts, message).length > programs_1.MAX_TRANSACTION_SIZE) {
|
|
206
|
+
throw invalid(TOO_LARGE);
|
|
207
|
+
}
|
|
208
|
+
return parts;
|
|
209
|
+
}
|
|
210
|
+
const isWritable = (parts, index) => index < parts.required
|
|
211
|
+
? index < parts.required - parts.readonlySigned
|
|
212
|
+
: index < parts.keys.length - parts.readonlyUnsigned;
|
|
213
|
+
/** A little-endian u64 of `data` at `at`, or `null` when the data is too short. */
|
|
214
|
+
const u64At = (data, at) => data.length < at + 8
|
|
215
|
+
? null
|
|
216
|
+
: new DataView(data.buffer, data.byteOffset + at, 8).getBigUint64(0, true);
|
|
217
|
+
/**
|
|
218
|
+
* The recipient binding the landing guard trusts, read from the bytes and re-derived from
|
|
219
|
+
* the intent alone: exactly one transfer (System `Transfer`, or Token `TransferChecked`)
|
|
220
|
+
* moves the intent's amount into `destinationOf` the intent's recipient. The sender is
|
|
221
|
+
* bound by `readBack`: it is the message's only signer.
|
|
222
|
+
*/
|
|
223
|
+
function checkRecipient(ctx, parts, output, mint) {
|
|
224
|
+
const program = mint === undefined ? programs_1.SYSTEM_PROGRAM : programs_1.TOKEN_PROGRAM;
|
|
225
|
+
// The destination's position and the amount's offset: System [from, to], data
|
|
226
|
+
// [u32 2, u64 lamports]; Token [source, mint, destination, authority], data
|
|
227
|
+
// [12, u64 amount, u8 decimals].
|
|
228
|
+
const [destination, amountAt] = mint === undefined ? [1, 4] : [2, 1];
|
|
229
|
+
const transfers = parts.instructions.filter((ix) => isKey(parts.keys[ix.program], program));
|
|
230
|
+
const transfer = transfers[0];
|
|
231
|
+
if (transfers.length !== 1 ||
|
|
232
|
+
!transfer ||
|
|
233
|
+
!isKey(parts.keys[transfer.accounts[destination]], destinationOf(ctx, output.to, mint)) ||
|
|
234
|
+
u64At(transfer.data, amountAt) !== output.amount) {
|
|
235
|
+
throw invalid('the transfer does not pay the recipient');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* The bytes carry exactly `list` on `blockhash`: each instruction's program, accounts and
|
|
240
|
+
* data, and no other instruction. An account the list writes must be writable (the message
|
|
241
|
+
* merges flags per key); its signers are `readBack`'s.
|
|
242
|
+
*/
|
|
243
|
+
function checkInstructions(parts, blockhash, list) {
|
|
244
|
+
const mismatch = () => invalid('the compiled message does not match the transfer');
|
|
245
|
+
if (!isKey(parts.blockhash, blockhash) || parts.instructions.length !== list.length) {
|
|
246
|
+
throw mismatch();
|
|
247
|
+
}
|
|
248
|
+
list.forEach((expected, i) => {
|
|
249
|
+
const found = parts.instructions[i];
|
|
250
|
+
if (!found ||
|
|
251
|
+
!isKey(parts.keys[found.program], expected.programId) ||
|
|
252
|
+
found.accounts.length !== expected.accounts.length ||
|
|
253
|
+
!(0, bytes_1.equalBytes)(found.data, expected.data)) {
|
|
254
|
+
throw mismatch();
|
|
255
|
+
}
|
|
256
|
+
expected.accounts.forEach((account, j) => {
|
|
257
|
+
const index = found.accounts[j];
|
|
258
|
+
if (!isKey(parts.keys[index], account.address) ||
|
|
259
|
+
(account.writable && !isWritable(parts, index))) {
|
|
260
|
+
throw mismatch();
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/** The simulated compute units of the transfer, or `null` when it cannot be measured. */
|
|
266
|
+
async function simulatedUnits(ctx, from, price, list, blockhash, tags) {
|
|
267
|
+
const message = ctx.codec.compileMessage(from, blockhash, withBudget(programs_1.MAX_COMPUTE_UNIT_LIMIT, price, list));
|
|
268
|
+
const unsignedTx = withPlaceholders(readBack(message, from), message);
|
|
269
|
+
const value = (0, rpc_1.contextValue)(await (0, rpc_1.call)(ctx.transport, 'simulateTransaction', [
|
|
270
|
+
base64(unsignedTx),
|
|
271
|
+
{
|
|
272
|
+
encoding: 'base64',
|
|
273
|
+
sigVerify: false,
|
|
274
|
+
replaceRecentBlockhash: true,
|
|
275
|
+
commitment: 'confirmed',
|
|
276
|
+
},
|
|
277
|
+
], tags), 'simulateTransaction');
|
|
278
|
+
if (!value)
|
|
279
|
+
throw (0, rpc_1.malformed)('simulateTransaction');
|
|
280
|
+
// A failing simulation (e.g. insufficient funds) still lets `checkFunds` explain itself.
|
|
281
|
+
if (value.err !== null || value.unitsConsumed === undefined)
|
|
282
|
+
return null;
|
|
283
|
+
return (0, rpc_1.u64)(value.unitsConsumed, 'unitsConsumed');
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* The base64 wire bytes of a signed transaction, or `null` when they exceed the packet
|
|
287
|
+
* limit. The text is capped before it is decoded, and only a canonical text is
|
|
288
|
+
* read: `Buffer` skips what it cannot decode, and a truncated transaction is never sent.
|
|
289
|
+
*/
|
|
290
|
+
function wirePayload(raw) {
|
|
291
|
+
const { encoding, data } = raw;
|
|
292
|
+
if (encoding === 'json')
|
|
293
|
+
throw invalid('a Solana transaction is bytes (base64 or hex)');
|
|
294
|
+
if (typeof data !== 'string')
|
|
295
|
+
throw invalid('a Solana transaction is a text of bytes');
|
|
296
|
+
if (data.length > (encoding === 'hex' ? MAX_HEX_CHARS : MAX_BASE64_CHARS))
|
|
297
|
+
return null;
|
|
298
|
+
const bytes = Buffer.from(data, encoding);
|
|
299
|
+
const canonical = encoding === 'hex'
|
|
300
|
+
? bytes.toString('hex') === data.toLowerCase()
|
|
301
|
+
: bytes.toString('base64') === data;
|
|
302
|
+
if (!canonical)
|
|
303
|
+
throw invalid(`the transaction is not canonical ${encoding}`);
|
|
304
|
+
return bytes.length > programs_1.MAX_TRANSACTION_SIZE ? null : bytes.toString('base64');
|
|
305
|
+
}
|
|
306
|
+
function createSolanaBuilder(ctx) {
|
|
307
|
+
return {
|
|
308
|
+
async estimateFee(intent, build) {
|
|
309
|
+
const tags = (0, rpc_1.withSignal)(rpc_1.READ, build.signal);
|
|
310
|
+
// The handle's bound, which no endpoint can raise. An explicit price above it is
|
|
311
|
+
// refused before any request; a speed's is clamped below it.
|
|
312
|
+
const bound = ctx.config.maxComputeUnitPrice;
|
|
313
|
+
const override = (0, fee_1.isFeeSpeed)(intent.fee) ? undefined : (0, fees_1.parseOverride)(intent.fee);
|
|
314
|
+
if (override && override.computeUnitPrice > bound) {
|
|
315
|
+
throw (0, fees_1.aboveMaxPrice)(override.computeUnitPrice, bound);
|
|
316
|
+
}
|
|
317
|
+
const plan = await planTransfer(ctx, intent, tags);
|
|
318
|
+
const list = transferInstructions(plan);
|
|
319
|
+
const variant = (0, fees_1.variantOffsets)(ctx.nextVariant());
|
|
320
|
+
let price;
|
|
321
|
+
if (override) {
|
|
322
|
+
price = override.computeUnitPrice;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const writable = plan.token
|
|
326
|
+
? [plan.from, plan.token.source, plan.token.destination]
|
|
327
|
+
: [plan.from, plan.to];
|
|
328
|
+
const recent = await (0, rpc_1.call)(ctx.transport, 'getRecentPrioritizationFees', [writable], tags);
|
|
329
|
+
price = (0, fees_1.speedPrice)((0, fees_1.priceForSpeed)(recent, intent.fee), variant.price, bound);
|
|
330
|
+
}
|
|
331
|
+
const { blockhash } = await latestBlockhash(ctx, tags);
|
|
332
|
+
let base = override?.computeUnitLimit;
|
|
333
|
+
if (base === undefined) {
|
|
334
|
+
const units = await simulatedUnits(ctx, plan.from, price, list, blockhash, tags);
|
|
335
|
+
base =
|
|
336
|
+
units === null
|
|
337
|
+
? (0, fees_1.fallbackComputeUnitLimit)(list.length)
|
|
338
|
+
: (0, fees_1.computeUnitLimitFor)(units);
|
|
339
|
+
}
|
|
340
|
+
// Every build varies the limit, an explicit one included, so identical transfers
|
|
341
|
+
// sign different bytes (the price of an explicit fee is kept exactly). At the
|
|
342
|
+
// protocol maximum no variant fits, and only the core's guard against two
|
|
343
|
+
// Operations sharing one Attempt ref keeps them apart.
|
|
344
|
+
const limit = base + variant.limit > programs_1.MAX_COMPUTE_UNIT_LIMIT
|
|
345
|
+
? programs_1.MAX_COMPUTE_UNIT_LIMIT
|
|
346
|
+
: base + variant.limit;
|
|
347
|
+
// A fee is a u64 of lamports. An explicit price without one is the
|
|
348
|
+
// caller's; a node's recent prices or quote without one decide nothing (retryable).
|
|
349
|
+
const unpriced = (what) => override
|
|
350
|
+
? invalid('Solana fee override: the fee does not fit in u64')
|
|
351
|
+
: (0, rpc_1.malformed)(what);
|
|
352
|
+
const priority = (0, fees_1.priorityFee)(price, limit);
|
|
353
|
+
if (priority > U64_MAX)
|
|
354
|
+
throw unpriced('getRecentPrioritizationFees');
|
|
355
|
+
const message = ctx.codec.compileMessage(plan.from, blockhash, withBudget(limit, price, list));
|
|
356
|
+
readBack(message, plan.from);
|
|
357
|
+
const quoted = (0, rpc_1.contextValue)(await (0, rpc_1.call)(ctx.transport, 'getFeeForMessage', [base64(message), { commitment: 'confirmed' }], tags), 'getFeeForMessage');
|
|
358
|
+
// `null`: the endpoint does not know the blockhash yet.
|
|
359
|
+
if (quoted === null)
|
|
360
|
+
throw (0, rpc_1.notYet)('the fee of the message');
|
|
361
|
+
const total = (0, rpc_1.u64)(quoted, 'getFeeForMessage');
|
|
362
|
+
// agave's fee arithmetic saturates: a quote of u64::MAX is no fee.
|
|
363
|
+
if (total === U64_MAX)
|
|
364
|
+
throw unpriced('getFeeForMessage');
|
|
365
|
+
if (total < priority)
|
|
366
|
+
throw (0, rpc_1.malformed)('getFeeForMessage');
|
|
367
|
+
const details = {
|
|
368
|
+
signatures: 1,
|
|
369
|
+
baseFee: total - priority,
|
|
370
|
+
computeUnitLimit: limit,
|
|
371
|
+
computeUnitPrice: price,
|
|
372
|
+
priorityFee: priority,
|
|
373
|
+
rent: plan.createsRecipientAccount
|
|
374
|
+
? await rentExemptMinimum(ctx, programs_1.TOKEN_ACCOUNT_SIZE, tags)
|
|
375
|
+
: 0n,
|
|
376
|
+
createsRecipientAccount: plan.createsRecipientAccount,
|
|
377
|
+
};
|
|
378
|
+
return (0, fees_1.feeDraft)(override ? 'custom' : intent.fee, details);
|
|
379
|
+
},
|
|
380
|
+
async checkFunds(intent, fee, build) {
|
|
381
|
+
const output = onlyOutput(intent);
|
|
382
|
+
const tags = (0, rpc_1.withSignal)(rpc_1.READ, build.signal);
|
|
383
|
+
const balance = (0, rpc_1.u64)((0, rpc_1.contextValue)(await (0, rpc_1.call)(ctx.transport, 'getBalance', [intent.from, { commitment: 'confirmed' }], tags), 'getBalance'), 'balance');
|
|
384
|
+
if (intent.asset !== 'native') {
|
|
385
|
+
const mint = (0, reader_1.mintOf)(intent.asset);
|
|
386
|
+
const source = await associatedAccount(ctx, ctx.codec.associatedTokenAddress(intent.from, mint), intent.from, mint, 'source', tags);
|
|
387
|
+
if (source?.frozen)
|
|
388
|
+
throw invalid('the source token account is frozen');
|
|
389
|
+
const available = source?.amount ?? 0n;
|
|
390
|
+
if (available < output.amount) {
|
|
391
|
+
return { ok: false, asset: intent.asset, required: output.amount, available };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// A system account may end at 0 or at the rent-exempt minimum, nothing in between.
|
|
395
|
+
const spent = (0, fees_1.lamportsCharged)(fee) + (intent.asset === 'native' ? output.amount : 0n);
|
|
396
|
+
const minimum = await rentExemptMinimum(ctx, 0, tags);
|
|
397
|
+
if (balance < spent) {
|
|
398
|
+
return { ok: false, asset: 'native', required: spent, available: balance };
|
|
399
|
+
}
|
|
400
|
+
const left = balance - spent;
|
|
401
|
+
if (left !== 0n && left < minimum) {
|
|
402
|
+
return {
|
|
403
|
+
ok: false,
|
|
404
|
+
asset: 'native',
|
|
405
|
+
required: spent + minimum,
|
|
406
|
+
available: balance,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
return { ok: true };
|
|
410
|
+
},
|
|
411
|
+
async build(intent, fee, build) {
|
|
412
|
+
const output = onlyOutput(intent);
|
|
413
|
+
const details = (0, fees_1.signedFee)(fee, ctx.config.maxComputeUnitPrice);
|
|
414
|
+
const key = keyOf(intent.from, build.keys);
|
|
415
|
+
const text = memoOf(intent.memo);
|
|
416
|
+
const tags = (0, rpc_1.withSignal)(rpc_1.READ, build.signal);
|
|
417
|
+
const mint = intent.asset === 'native' ? undefined : (0, reader_1.mintOf)(intent.asset);
|
|
418
|
+
const plan = {
|
|
419
|
+
from: intent.from,
|
|
420
|
+
to: output.to,
|
|
421
|
+
amount: output.amount,
|
|
422
|
+
...(text !== undefined ? { memo: text } : {}),
|
|
423
|
+
createsRecipientAccount: details.createsRecipientAccount,
|
|
424
|
+
...(mint === undefined
|
|
425
|
+
? {}
|
|
426
|
+
: {
|
|
427
|
+
token: tokenPlan(ctx, intent.from, output.to, mint, await (0, reader_1.mintDecimals)(ctx, mint, (0, rpc_1.withSignal)(reader_1.METADATA, build.signal))),
|
|
428
|
+
}),
|
|
429
|
+
};
|
|
430
|
+
const list = withBudget(details.computeUnitLimit, details.computeUnitPrice, transferInstructions(plan));
|
|
431
|
+
const { blockhash, lastValidBlockHeight, slot } = await latestBlockhash(ctx, tags);
|
|
432
|
+
// The payload, the signing request and the ordering all come from this one message,
|
|
433
|
+
// read back before it is offered for signing.
|
|
434
|
+
const message = ctx.codec.compileMessage(plan.from, blockhash, list);
|
|
435
|
+
const parts = readBack(message, plan.from);
|
|
436
|
+
checkRecipient(ctx, parts, output, mint);
|
|
437
|
+
checkInstructions(parts, blockhash, list);
|
|
438
|
+
// The height, with the blockhash and slot that let a proof attest it.
|
|
439
|
+
const ordering = {
|
|
440
|
+
kind: 'expiry',
|
|
441
|
+
lastValidHeight: lastValidBlockHeight,
|
|
442
|
+
blockhash,
|
|
443
|
+
blockhashSlot: slot,
|
|
444
|
+
};
|
|
445
|
+
const unsigned = {
|
|
446
|
+
payload: { encoding: 'base64', data: base64(message) },
|
|
447
|
+
signingRequests: [
|
|
448
|
+
{
|
|
449
|
+
id: 's0',
|
|
450
|
+
scheme: 'ed25519',
|
|
451
|
+
payload: message,
|
|
452
|
+
payloadKind: 'message',
|
|
453
|
+
publicKey: key.publicKey,
|
|
454
|
+
...(key.keyRef ? { keyRef: key.keyRef } : {}),
|
|
455
|
+
},
|
|
456
|
+
],
|
|
457
|
+
ordering,
|
|
458
|
+
fee,
|
|
459
|
+
summary: {
|
|
460
|
+
asset: (0, asset_1.assetId)(ctx.chain.id, ctx.network.id, intent.asset),
|
|
461
|
+
outputs: [{ to: output.to, amount: output.amount.toString() }],
|
|
462
|
+
...(text !== undefined ? { memo: text } : {}),
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
return unsigned;
|
|
466
|
+
},
|
|
467
|
+
async assemble(unsigned, signatures) {
|
|
468
|
+
const failed = (reason) => new error_1.SigningError('SIGNING_FAILED', reason);
|
|
469
|
+
const mismatch = () => failed('the message and its signing requests do not match');
|
|
470
|
+
const { encoding, data } = unsigned.payload;
|
|
471
|
+
if (encoding !== 'base64')
|
|
472
|
+
throw failed('not a Solana message');
|
|
473
|
+
const message = new Uint8Array(Buffer.from(data, 'base64'));
|
|
474
|
+
if (base64(message) !== data)
|
|
475
|
+
throw failed('not a Solana message');
|
|
476
|
+
// A `null` is a refusal, never "no signers needed": one request per required signer.
|
|
477
|
+
const parts = (0, wire_1.parseMessage)(message);
|
|
478
|
+
if (!parts || parts.required !== unsigned.signingRequests.length)
|
|
479
|
+
throw mismatch();
|
|
480
|
+
// The core stores this `ordering` as the Attempt's, and the expiry proof reads its
|
|
481
|
+
// blockhash as the message's. A changed one between build and signing would
|
|
482
|
+
// misplace the window.
|
|
483
|
+
const ordering = unsigned.ordering;
|
|
484
|
+
if (ordering.kind !== 'expiry' ||
|
|
485
|
+
typeof ordering.blockhash !== 'string' ||
|
|
486
|
+
!isKey(parts.blockhash, ordering.blockhash) ||
|
|
487
|
+
typeof ordering.lastValidHeight !== 'bigint' ||
|
|
488
|
+
typeof ordering.blockhashSlot !== 'bigint') {
|
|
489
|
+
throw failed("the Attempt's ordering does not match the signed message");
|
|
490
|
+
}
|
|
491
|
+
const bytes = unsigned.signingRequests.map((request, i) => {
|
|
492
|
+
if (request.scheme !== 'ed25519' ||
|
|
493
|
+
request.payloadKind !== 'message' ||
|
|
494
|
+
!(0, bytes_1.equalBytes)(request.publicKey, parts.keys[i]) ||
|
|
495
|
+
!(0, bytes_1.equalBytes)(request.payload, message)) {
|
|
496
|
+
throw mismatch();
|
|
497
|
+
}
|
|
498
|
+
const signature = signatures.find((s) => s.requestId === request.id);
|
|
499
|
+
if (!signature || signature.bytes.length !== SIGNATURE_BYTES) {
|
|
500
|
+
throw failed(`missing signature for request ${request.id}`);
|
|
501
|
+
}
|
|
502
|
+
return signature.bytes;
|
|
503
|
+
});
|
|
504
|
+
const raw = (0, wire_1.signedTransaction)(bytes, message);
|
|
505
|
+
if (raw.length > programs_1.MAX_TRANSACTION_SIZE)
|
|
506
|
+
throw failed(TOO_LARGE);
|
|
507
|
+
return {
|
|
508
|
+
raw: { encoding: 'base64', data: base64(raw) },
|
|
509
|
+
ref: {
|
|
510
|
+
id: (0, keys_1.encodeBase58)(bytes[0]),
|
|
511
|
+
idKind: 'signature',
|
|
512
|
+
canonical: true,
|
|
513
|
+
},
|
|
514
|
+
};
|
|
515
|
+
},
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
function createSolanaBroadcaster(ctx) {
|
|
519
|
+
return {
|
|
520
|
+
async broadcast(signed, options = {}) {
|
|
521
|
+
const payload = wirePayload(signed.raw);
|
|
522
|
+
if (payload === null)
|
|
523
|
+
return REFUSED_TOO_LARGE;
|
|
524
|
+
try {
|
|
525
|
+
await (0, rpc_1.call)(ctx.transport, 'sendTransaction', [payload, { encoding: 'base64', preflightCommitment: 'confirmed' }], {
|
|
526
|
+
...(0, rpc_1.withSignal)(rpc_1.BROADCAST, options.signal),
|
|
527
|
+
...(options.fanout !== undefined ? { fanout: options.fanout } : {}),
|
|
528
|
+
});
|
|
529
|
+
return { kind: 'accepted' };
|
|
530
|
+
}
|
|
531
|
+
catch (error) {
|
|
532
|
+
// Only a definitive, non-ambiguous node answer is classified: by its code, then
|
|
533
|
+
// its structured data (a preflight failure's simulation result), then its
|
|
534
|
+
// anchored text. Anything else may have been sent: rethrown unchanged. A claimed
|
|
535
|
+
// bad signature stands only when these bytes carry one.
|
|
536
|
+
const code = (0, rpc_1.rpcCode)(error);
|
|
537
|
+
if (code === undefined)
|
|
538
|
+
throw error;
|
|
539
|
+
const failure = error;
|
|
540
|
+
return (0, errors_1.classifyOwnBroadcast)(Buffer.from(payload, 'base64'), code, (0, rpc_1.rpcMessage)(failure), failure.details?.rpcData);
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=builder.js.map
|