crypto-aio 0.0.3 → 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/contract.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/{type/transact.js → adapters/ton/types.js} +1 -1
- 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/{type/lib-types.js → core/model/transaction.js} +1 -1
- 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 -45
- 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 -7
- package/dist/libs/eth/contract.js +0 -42
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -24
- package/dist/libs/eth/index.js +0 -72
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -7
- package/dist/libs/eth/transact.js +0 -26
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -2
- package/dist/libs/index.js +0 -19
- package/dist/libs/index.js.map +0 -1
- package/dist/libs/trx/account.d.ts +0 -9
- package/dist/libs/trx/account.js +0 -55
- package/dist/libs/trx/account.js.map +0 -1
- package/dist/libs/trx/contract.d.ts +0 -7
- package/dist/libs/trx/contract.js +0 -27
- package/dist/libs/trx/contract.js.map +0 -1
- package/dist/libs/trx/index.d.ts +0 -22
- package/dist/libs/trx/index.js +0 -64
- package/dist/libs/trx/index.js.map +0 -1
- package/dist/libs/trx/transact.d.ts +0 -7
- package/dist/libs/trx/transact.js +0 -26
- package/dist/libs/trx/transact.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 -5
- package/dist/tool/index.js +0 -22
- 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 -6
- package/dist/tool/options.js +0 -41
- package/dist/tool/options.js.map +0 -1
- package/dist/tool/trx-tools.d.ts +0 -3
- package/dist/tool/trx-tools.js +0 -20
- package/dist/tool/trx-tools.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/contract.d.ts +0 -10
- package/dist/type/contract.js.map +0 -1
- package/dist/type/index.d.ts +0 -5
- package/dist/type/index.js +0 -22
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -9
- package/dist/type/lib-types.js.map +0 -1
- package/dist/type/transact.d.ts +0 -7
- package/dist/type/transact.js.map +0 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK-free types of the TON family: the wallet identity, the `ext.ton` API, fee
|
|
3
|
+
* details and overrides, and the transport tags. Nothing here imports an SDK, so the
|
|
4
|
+
* composition root can export these types.
|
|
5
|
+
*/
|
|
6
|
+
import type { CallOptions } from '../../core/transport/types';
|
|
7
|
+
declare module '../../index' {
|
|
8
|
+
interface ChainRegistry {
|
|
9
|
+
ton: {
|
|
10
|
+
family: 'ton';
|
|
11
|
+
network: 'mainnet' | 'testnet';
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
interface FamilyRegistry {
|
|
15
|
+
ton: {
|
|
16
|
+
library: '@ton/ton';
|
|
17
|
+
ext: TonExt;
|
|
18
|
+
fee: TonFeeDetails;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export type TonWalletVersion = 'v4r2' | 'v5r1';
|
|
23
|
+
/**
|
|
24
|
+
* The wallet contract behind a TON address. Every field determines the address,
|
|
25
|
+
* so it is wallet config (`wallets.<name>.ton`), never a per-call option.
|
|
26
|
+
* - v4r2: `subwalletId` defaults to `698983191 + workchain`.
|
|
27
|
+
* - v5r1: `subwalletNumber` defaults to 0 (15 bits); `networkGlobalId` defaults to the
|
|
28
|
+
* network's global id (-239 mainnet, -3 testnet) and must equal it.
|
|
29
|
+
*/
|
|
30
|
+
export type TonWalletIdentity = {
|
|
31
|
+
readonly version: 'v4r2';
|
|
32
|
+
readonly workchain?: 0 | -1;
|
|
33
|
+
readonly subwalletId?: number;
|
|
34
|
+
} | {
|
|
35
|
+
readonly version: 'v5r1';
|
|
36
|
+
readonly workchain?: 0 | -1;
|
|
37
|
+
readonly subwalletNumber?: number;
|
|
38
|
+
readonly networkGlobalId?: number;
|
|
39
|
+
};
|
|
40
|
+
/** `bc.ext.ton`: the TON family extension. */
|
|
41
|
+
export interface TonExt {
|
|
42
|
+
readonly ton: {
|
|
43
|
+
/** The wallet's seqno at the latest masterchain block; 0 while it is not deployed. */
|
|
44
|
+
getSeqno(address: string): Promise<bigint>;
|
|
45
|
+
/** The jetton wallet that `owner` holds for the jetton `master` (raw form). */
|
|
46
|
+
jettonWallet(owner: string, master: string): Promise<string>;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* `FeeEstimate.details` of the `ton` fee kind, in nanograms. The `network` charge is
|
|
51
|
+
* `importFee + gasFee + storageFee + forwardFee`; a jetton transfer adds an `attached`
|
|
52
|
+
* charge (`attached` per output), whose unspent part the jetton wallet refunds.
|
|
53
|
+
*/
|
|
54
|
+
export interface TonFeeDetails {
|
|
55
|
+
/** The inbound external message's import fee. */
|
|
56
|
+
readonly importFee: bigint;
|
|
57
|
+
/** The wallet's compute phase, from the endpoint's emulation. */
|
|
58
|
+
readonly gasFee: bigint;
|
|
59
|
+
readonly storageFee: bigint;
|
|
60
|
+
/** The forward fees of every outgoing internal message (full `fwd_fee`), counted once. */
|
|
61
|
+
readonly forwardFee: bigint;
|
|
62
|
+
/**
|
|
63
|
+
* Where `forwardFee` comes from: the endpoint's emulation (`fwd_fee`, which follows
|
|
64
|
+
* the real action list), or, when it reports none, config params 24/25.
|
|
65
|
+
*/
|
|
66
|
+
readonly forwardFeeSource: 'emulated' | 'computed';
|
|
67
|
+
/** Jetton transfers: the value attached to each jetton wallet message. */
|
|
68
|
+
readonly attached?: bigint;
|
|
69
|
+
/** Jetton transfers: `forward_ton_amount`, which pays for the recipient's notification. */
|
|
70
|
+
readonly forwardAmount?: bigint;
|
|
71
|
+
/** Whether the message deploys the wallet (its first send carries the `StateInit`). */
|
|
72
|
+
readonly deploy: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* An explicit TON fee (`TransferIntent.fee`). TON fees are fixed by the network config, so
|
|
76
|
+
* there is nothing to bid; a jetton transfer may change the value attached to each jetton
|
|
77
|
+
* wallet message (default: the network's `jettonAttached`).
|
|
78
|
+
*/
|
|
79
|
+
export interface TonFeeOverride {
|
|
80
|
+
readonly attached?: bigint;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The seqno ordering a TON build records: the signed seqno and `valid_until`, and
|
|
84
|
+
* `validFrom`, the chain time the build ran at (the state's `sync_utime`, and never later
|
|
85
|
+
* than the local clock), in seconds. The message cannot run in a block older than that, less
|
|
86
|
+
* the builder's chain-time tolerance, so a proof that it was not included walks the
|
|
87
|
+
* wallet's history back to there, whatever the network's `validForSeconds` is now. It is a
|
|
88
|
+
* core `seqno` ordering with one more property, which the core stores whole. A store that
|
|
89
|
+
* drops `validFrom` costs only liveness (the proof and the replay guard fall back to a
|
|
90
|
+
* one-day window); one that moves it later could hide a wallet reset and prove "not
|
|
91
|
+
* included" falsely, and a `rebuild` would then pay twice.
|
|
92
|
+
*/
|
|
93
|
+
export interface TonSeqnoOrdering {
|
|
94
|
+
readonly kind: 'seqno';
|
|
95
|
+
readonly seqno: bigint;
|
|
96
|
+
readonly validUntil: number;
|
|
97
|
+
readonly validFrom: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The transport tags every TON I/O call carries, as the `ChainDriver` contract table sets
|
|
101
|
+
* them. A caller's `quorumKey` replaces the call's default consensus key: proofs attest a
|
|
102
|
+
* monotone predicate, such as "my seqno is above n", instead of comparing data read at a
|
|
103
|
+
* moving head.
|
|
104
|
+
*/
|
|
105
|
+
export type TonCallTags = Pick<CallOptions, 'purpose' | 'retry' | 'quorum' | 'quorumKey' | 'fanout' | 'signal'>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/ton/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * SDK-free types of the TON family: the wallet identity, the `ext.ton` API, fee\n * details and overrides, and the transport tags. Nothing here imports an SDK, so the\n * composition root can export these types.\n */\nimport type { CallOptions } from '../../core/transport/types';\n\n// Augment the registries through the package entry, as users do with 'crypto-aio'.\ndeclare module '../../index' {\n interface ChainRegistry {\n ton: { family: 'ton'; network: 'mainnet' | 'testnet' };\n }\n interface FamilyRegistry {\n ton: { library: '@ton/ton'; ext: TonExt; fee: TonFeeDetails };\n }\n}\n\nexport type TonWalletVersion = 'v4r2' | 'v5r1';\n\n/**\n * The wallet contract behind a TON address. Every field determines the address,\n * so it is wallet config (`wallets.<name>.ton`), never a per-call option.\n * - v4r2: `subwalletId` defaults to `698983191 + workchain`.\n * - v5r1: `subwalletNumber` defaults to 0 (15 bits); `networkGlobalId` defaults to the\n * network's global id (-239 mainnet, -3 testnet) and must equal it.\n */\nexport type TonWalletIdentity =\n | {\n readonly version: 'v4r2';\n readonly workchain?: 0 | -1;\n readonly subwalletId?: number;\n }\n | {\n readonly version: 'v5r1';\n readonly workchain?: 0 | -1;\n readonly subwalletNumber?: number;\n readonly networkGlobalId?: number;\n };\n\n/** `bc.ext.ton`: the TON family extension. */\nexport interface TonExt {\n readonly ton: {\n /** The wallet's seqno at the latest masterchain block; 0 while it is not deployed. */\n getSeqno(address: string): Promise<bigint>;\n /** The jetton wallet that `owner` holds for the jetton `master` (raw form). */\n jettonWallet(owner: string, master: string): Promise<string>;\n };\n}\n\n/**\n * `FeeEstimate.details` of the `ton` fee kind, in nanograms. The `network` charge is\n * `importFee + gasFee + storageFee + forwardFee`; a jetton transfer adds an `attached`\n * charge (`attached` per output), whose unspent part the jetton wallet refunds.\n */\nexport interface TonFeeDetails {\n /** The inbound external message's import fee. */\n readonly importFee: bigint;\n /** The wallet's compute phase, from the endpoint's emulation. */\n readonly gasFee: bigint;\n readonly storageFee: bigint;\n /** The forward fees of every outgoing internal message (full `fwd_fee`), counted once. */\n readonly forwardFee: bigint;\n /**\n * Where `forwardFee` comes from: the endpoint's emulation (`fwd_fee`, which follows\n * the real action list), or, when it reports none, config params 24/25.\n */\n readonly forwardFeeSource: 'emulated' | 'computed';\n /** Jetton transfers: the value attached to each jetton wallet message. */\n readonly attached?: bigint;\n /** Jetton transfers: `forward_ton_amount`, which pays for the recipient's notification. */\n readonly forwardAmount?: bigint;\n /** Whether the message deploys the wallet (its first send carries the `StateInit`). */\n readonly deploy: boolean;\n}\n\n/**\n * An explicit TON fee (`TransferIntent.fee`). TON fees are fixed by the network config, so\n * there is nothing to bid; a jetton transfer may change the value attached to each jetton\n * wallet message (default: the network's `jettonAttached`).\n */\nexport interface TonFeeOverride {\n readonly attached?: bigint;\n}\n\n/**\n * The seqno ordering a TON build records: the signed seqno and `valid_until`, and\n * `validFrom`, the chain time the build ran at (the state's `sync_utime`, and never later\n * than the local clock), in seconds. The message cannot run in a block older than that, less\n * the builder's chain-time tolerance, so a proof that it was not included walks the\n * wallet's history back to there, whatever the network's `validForSeconds` is now. It is a\n * core `seqno` ordering with one more property, which the core stores whole. A store that\n * drops `validFrom` costs only liveness (the proof and the replay guard fall back to a\n * one-day window); one that moves it later could hide a wallet reset and prove \"not\n * included\" falsely, and a `rebuild` would then pay twice.\n */\nexport interface TonSeqnoOrdering {\n readonly kind: 'seqno';\n readonly seqno: bigint;\n readonly validUntil: number;\n readonly validFrom: number;\n}\n\n/**\n * The transport tags every TON I/O call carries, as the `ChainDriver` contract table sets\n * them. A caller's `quorumKey` replaces the call's default consensus key: proofs attest a\n * monotone predicate, such as \"my seqno is above n\", instead of comparing data read at a\n * moving head.\n */\nexport type TonCallTags = Pick<\n CallOptions,\n 'purpose' | 'retry' | 'quorum' | 'quorumKey' | 'fanout' | 'signal'\n>;\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TON wallet contracts, over `@ton/core` and `@ton/ton`: the wallet identity,
|
|
3
|
+
* its address and `StateInit`, the signing message, and the external message around it.
|
|
4
|
+
* Loaded only through the adapter manifest's `load()`.
|
|
5
|
+
*
|
|
6
|
+
* Signing flow: `build` asks the SDK for the transfer body with a zero signature and keeps
|
|
7
|
+
* the whole unsigned external message (a BOC) as the payload; the one ed25519 request signs
|
|
8
|
+
* the signing message's cell hash. `assemble` finds the 512 zero bits the signature
|
|
9
|
+
* replaces (front for v4r2, tail for v5r1) by the one position whose remainder hashes to
|
|
10
|
+
* the signed digest, so it needs no wallet version and cannot write a signature anywhere
|
|
11
|
+
* else.
|
|
12
|
+
*/
|
|
13
|
+
import { Cell, type MessageRelaxed, type StateInit } from '@ton/core';
|
|
14
|
+
import type { WalletOptions } from '../../core/driver/types';
|
|
15
|
+
import { type TonWorkchain } from './address';
|
|
16
|
+
import { sdkAddress } from './messages';
|
|
17
|
+
import type { TonWalletVersion } from './types';
|
|
18
|
+
/** Messages one external request may carry: 4 refs per cell (v4r2), 255 (v5r1). */
|
|
19
|
+
export declare const MAX_MESSAGES: Readonly<Record<TonWalletVersion, number>>;
|
|
20
|
+
/** Pay forward fees separately and never fail the action phase (W5 requires +2). */
|
|
21
|
+
export declare const SEND_MODE: number;
|
|
22
|
+
/** The resolved wallet identity: every field that determines the address. */
|
|
23
|
+
export type TonIdentity = {
|
|
24
|
+
readonly version: 'v4r2';
|
|
25
|
+
readonly workchain: TonWorkchain;
|
|
26
|
+
readonly subwalletId: number;
|
|
27
|
+
} | {
|
|
28
|
+
readonly version: 'v5r1';
|
|
29
|
+
readonly workchain: TonWorkchain;
|
|
30
|
+
readonly subwalletNumber: number;
|
|
31
|
+
readonly networkGlobalId: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* `wallets.<name>.ton` validated against the network: a v5r1 wallet id made for
|
|
35
|
+
* another network is refused before any key is used. Every problem is `CONFIG_INVALID`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveIdentity(wallet: WalletOptions | undefined, globalId: number): TonIdentity;
|
|
38
|
+
/** The wallet's raw address: the hash of its `StateInit` in its workchain. */
|
|
39
|
+
export declare function walletAddress(identity: TonIdentity, publicKey: Uint8Array): string;
|
|
40
|
+
/** The code and data a first message carries to deploy the wallet. */
|
|
41
|
+
export declare function walletStateInit(identity: TonIdentity, publicKey: Uint8Array): StateInit;
|
|
42
|
+
/** The wallet's wire wallet id (v4r2: the subwallet id; v5r1: the signed 32-bit id). */
|
|
43
|
+
export declare function walletIdOf(identity: TonIdentity, publicKey: Uint8Array): number;
|
|
44
|
+
export interface UnsignedRequest {
|
|
45
|
+
/** The unsigned external message: the wallet body with 512 zero bits for the signature. */
|
|
46
|
+
readonly message: Cell;
|
|
47
|
+
/** The signing message's cell hash: what the ed25519 key signs. */
|
|
48
|
+
readonly digest: Uint8Array;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The external request for `messages` at `seqno`, valid while chain time is before
|
|
52
|
+
* `validUntil` (seconds). `init` deploys the wallet with its first message.
|
|
53
|
+
*/
|
|
54
|
+
export declare function unsignedRequest(identity: TonIdentity, publicKey: Uint8Array, args: {
|
|
55
|
+
readonly seqno: number;
|
|
56
|
+
readonly validUntil: number;
|
|
57
|
+
readonly messages: readonly MessageRelaxed[];
|
|
58
|
+
readonly deploy: boolean;
|
|
59
|
+
}): Promise<UnsignedRequest>;
|
|
60
|
+
/**
|
|
61
|
+
* The signed external message: `signature` in place of the 512 zero bits whose remainder
|
|
62
|
+
* hashes to `digest` (the front for v4r2, the tail for v5r1). Refuses (`SIGNING_FAILED`) a
|
|
63
|
+
* payload with no such position, so a signature can never land anywhere else.
|
|
64
|
+
*/
|
|
65
|
+
export declare function signedRequest(unsigned: Cell, digest: Uint8Array, signature: Uint8Array): Cell;
|
|
66
|
+
/**
|
|
67
|
+
* TEP-467: the hash of the external-in message with `src` = addr_none, `import_fee` = 0,
|
|
68
|
+
* no `init`, and the body always as a reference. Stable across relays; the Attempt id.
|
|
69
|
+
*/
|
|
70
|
+
export declare function normalizedHash(externalMessage: Cell): Uint8Array;
|
|
71
|
+
/**
|
|
72
|
+
* Whether the wallet request `body` (external, or a W5
|
|
73
|
+
* `internal_signed` request relayed in an internal message) is `from`'s own. Anyone can post
|
|
74
|
+
* a relayed body, and a lone lying indexer can make up an external one, so a request
|
|
75
|
+
* proves nothing unless its ed25519 signature verifies over the rest of the request under
|
|
76
|
+
* `publicKey`, the wallet's key (v4r2: the first 512 bits; v5r1: the last 512), and its
|
|
77
|
+
* wallet id derives `from` with that key (v4r2: the subwallet id in `from`'s workchain;
|
|
78
|
+
* v5r1: the signed wallet id). A request of another wallet sharing the key, replayed
|
|
79
|
+
* here, never counts. For a relayed request the caller also requires the transaction's
|
|
80
|
+
* compute phase to have succeeded, i.e. the wallet ran it.
|
|
81
|
+
*/
|
|
82
|
+
export declare function requestIsOwn(from: string, body: Cell, publicKey: Uint8Array, globalId: number): boolean;
|
|
83
|
+
/** The SDK's `Address` for a raw address, parsed strictly. */
|
|
84
|
+
export { sdkAddress };
|
|
85
|
+
/** The TEP-467 hash (hex) of the external message `body` to `account` would travel in. */
|
|
86
|
+
export declare function externalHashOf(account: string, body: Cell): string;
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sdkAddress = exports.SEND_MODE = exports.MAX_MESSAGES = void 0;
|
|
4
|
+
exports.resolveIdentity = resolveIdentity;
|
|
5
|
+
exports.walletAddress = walletAddress;
|
|
6
|
+
exports.walletStateInit = walletStateInit;
|
|
7
|
+
exports.walletIdOf = walletIdOf;
|
|
8
|
+
exports.unsignedRequest = unsignedRequest;
|
|
9
|
+
exports.signedRequest = signedRequest;
|
|
10
|
+
exports.normalizedHash = normalizedHash;
|
|
11
|
+
exports.requestIsOwn = requestIsOwn;
|
|
12
|
+
exports.externalHashOf = externalHashOf;
|
|
13
|
+
/**
|
|
14
|
+
* TON wallet contracts, over `@ton/core` and `@ton/ton`: the wallet identity,
|
|
15
|
+
* its address and `StateInit`, the signing message, and the external message around it.
|
|
16
|
+
* Loaded only through the adapter manifest's `load()`.
|
|
17
|
+
*
|
|
18
|
+
* Signing flow: `build` asks the SDK for the transfer body with a zero signature and keeps
|
|
19
|
+
* the whole unsigned external message (a BOC) as the payload; the one ed25519 request signs
|
|
20
|
+
* the signing message's cell hash. `assemble` finds the 512 zero bits the signature
|
|
21
|
+
* replaces (front for v4r2, tail for v5r1) by the one position whose remainder hashes to
|
|
22
|
+
* the signed digest, so it needs no wallet version and cannot write a signature anywhere
|
|
23
|
+
* else.
|
|
24
|
+
*/
|
|
25
|
+
const core_1 = require("@ton/core");
|
|
26
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
27
|
+
const ton_1 = require("@ton/ton");
|
|
28
|
+
const error_1 = require("../../core/errors/error");
|
|
29
|
+
const address_1 = require("./address");
|
|
30
|
+
const messages_1 = require("./messages");
|
|
31
|
+
Object.defineProperty(exports, "sdkAddress", { enumerable: true, get: function () { return messages_1.sdkAddress; } });
|
|
32
|
+
/** Messages one external request may carry: 4 refs per cell (v4r2), 255 (v5r1). */
|
|
33
|
+
exports.MAX_MESSAGES = Object.freeze({
|
|
34
|
+
v4r2: 4,
|
|
35
|
+
v5r1: 255,
|
|
36
|
+
});
|
|
37
|
+
/** Pay forward fees separately and never fail the action phase (W5 requires +2). */
|
|
38
|
+
exports.SEND_MODE = core_1.SendMode.PAY_GAS_SEPARATELY + core_1.SendMode.IGNORE_ERRORS;
|
|
39
|
+
const V4_KEYS = new Set(['version', 'workchain', 'subwalletId']);
|
|
40
|
+
const V5_KEYS = new Set(['version', 'workchain', 'subwalletNumber', 'networkGlobalId']);
|
|
41
|
+
/**
|
|
42
|
+
* `wallets.<name>.ton` validated against the network: a v5r1 wallet id made for
|
|
43
|
+
* another network is refused before any key is used. Every problem is `CONFIG_INVALID`.
|
|
44
|
+
*/
|
|
45
|
+
function resolveIdentity(wallet, globalId) {
|
|
46
|
+
const fail = (reason) => {
|
|
47
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `TON wallet: ${reason}`);
|
|
48
|
+
};
|
|
49
|
+
const ton = wallet?.ton;
|
|
50
|
+
if (ton === undefined || ton === null || typeof ton !== 'object') {
|
|
51
|
+
return fail(`set wallets.<name>.ton = { version: 'v4r2' | 'v5r1' }`);
|
|
52
|
+
}
|
|
53
|
+
const config = ton;
|
|
54
|
+
const version = config.version;
|
|
55
|
+
if (version !== 'v4r2' && version !== 'v5r1') {
|
|
56
|
+
return fail(`version must be 'v4r2' or 'v5r1'`);
|
|
57
|
+
}
|
|
58
|
+
const allowed = version === 'v4r2' ? V4_KEYS : V5_KEYS;
|
|
59
|
+
for (const key of Object.keys(config)) {
|
|
60
|
+
if (config[key] !== undefined && !allowed.has(key)) {
|
|
61
|
+
// The caller's key is never echoed (it could be a pasted secret).
|
|
62
|
+
fail(`a ${version} wallet takes only ${[...allowed].join(', ')}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const workchain = config.workchain ?? 0;
|
|
66
|
+
if (workchain !== 0 && workchain !== -1)
|
|
67
|
+
fail('workchain must be 0 or -1');
|
|
68
|
+
const wc = workchain;
|
|
69
|
+
if (version === 'v4r2') {
|
|
70
|
+
const subwalletId = config.subwalletId ?? 698983191 + wc;
|
|
71
|
+
if (!Number.isInteger(subwalletId) ||
|
|
72
|
+
subwalletId < 0 ||
|
|
73
|
+
subwalletId > 0xffffffff) {
|
|
74
|
+
fail('subwalletId must be an integer in [0, 2^32 - 1]');
|
|
75
|
+
}
|
|
76
|
+
return { version, workchain: wc, subwalletId: subwalletId };
|
|
77
|
+
}
|
|
78
|
+
const subwalletNumber = config.subwalletNumber ?? 0;
|
|
79
|
+
if (!Number.isInteger(subwalletNumber) ||
|
|
80
|
+
subwalletNumber < 0 ||
|
|
81
|
+
subwalletNumber > 0x7fff) {
|
|
82
|
+
fail('subwalletNumber must be an integer in [0, 32767]');
|
|
83
|
+
}
|
|
84
|
+
const networkGlobalId = config.networkGlobalId ?? globalId;
|
|
85
|
+
if (networkGlobalId !== globalId) {
|
|
86
|
+
fail(`networkGlobalId is not this network's (${globalId})`);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
version,
|
|
90
|
+
workchain: wc,
|
|
91
|
+
subwalletNumber: subwalletNumber,
|
|
92
|
+
networkGlobalId: globalId,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** A strict (RFC 8032) encoding of a point that is not of small order. */
|
|
96
|
+
function canonicalKey(publicKey) {
|
|
97
|
+
try {
|
|
98
|
+
return !ed25519_1.ed25519.Point.fromHex(publicKey, false).isSmallOrder();
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const isInt = (value, min, max) => Number.isInteger(value) && value >= min && value <= max;
|
|
105
|
+
/**
|
|
106
|
+
* Every identity field fits the wire field the SDK writes it into (workchain
|
|
107
|
+
* int8, subwallet id uint32, subwallet number uint15, network id int32), so an identity
|
|
108
|
+
* not made by `resolveIdentity` is refused rather than wrapped or thrown as a bare `Error`.
|
|
109
|
+
*/
|
|
110
|
+
function identityFits(identity) {
|
|
111
|
+
if (identity.workchain !== 0 && identity.workchain !== -1)
|
|
112
|
+
return false;
|
|
113
|
+
if (identity.version === 'v4r2')
|
|
114
|
+
return isInt(identity.subwalletId, 0, 0xffffffff);
|
|
115
|
+
return (identity.version === 'v5r1' &&
|
|
116
|
+
isInt(identity.subwalletNumber, 0, 0x7fff) &&
|
|
117
|
+
isInt(identity.networkGlobalId, -0x80000000, 0x7fffffff));
|
|
118
|
+
}
|
|
119
|
+
function contractOf(identity, publicKey) {
|
|
120
|
+
if (!identityFits(identity)) {
|
|
121
|
+
throw new error_1.ConfigError('CONFIG_INVALID', 'the TON wallet identity is out of range');
|
|
122
|
+
}
|
|
123
|
+
if (publicKey.length !== 32 || !canonicalKey(publicKey)) {
|
|
124
|
+
throw new error_1.ConfigError('CONFIG_INVALID', 'a TON wallet key must be a canonical 32-byte ed25519 public key');
|
|
125
|
+
}
|
|
126
|
+
const key = Buffer.from(publicKey);
|
|
127
|
+
if (identity.version === 'v4r2') {
|
|
128
|
+
return ton_1.WalletContractV4.create({
|
|
129
|
+
workchain: identity.workchain,
|
|
130
|
+
publicKey: key,
|
|
131
|
+
walletId: identity.subwalletId,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Every field explicit: the SDK's defaults are mainnet's id and workchain 0.
|
|
135
|
+
return ton_1.WalletContractV5R1.create({
|
|
136
|
+
publicKey: key,
|
|
137
|
+
walletId: {
|
|
138
|
+
networkGlobalId: identity.networkGlobalId,
|
|
139
|
+
context: {
|
|
140
|
+
workchain: identity.workchain,
|
|
141
|
+
walletVersion: 'v5r1',
|
|
142
|
+
subwalletNumber: identity.subwalletNumber,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/** The wallet's raw address: the hash of its `StateInit` in its workchain. */
|
|
148
|
+
function walletAddress(identity, publicKey) {
|
|
149
|
+
const contract = contractOf(identity, publicKey);
|
|
150
|
+
return (0, address_1.rawAddress)(identity.workchain, contract.address.hash);
|
|
151
|
+
}
|
|
152
|
+
/** The code and data a first message carries to deploy the wallet. */
|
|
153
|
+
function walletStateInit(identity, publicKey) {
|
|
154
|
+
const { init } = contractOf(identity, publicKey);
|
|
155
|
+
return { code: init.code, data: init.data };
|
|
156
|
+
}
|
|
157
|
+
/** The wallet's wire wallet id (v4r2: the subwallet id; v5r1: the signed 32-bit id). */
|
|
158
|
+
function walletIdOf(identity, publicKey) {
|
|
159
|
+
const contract = contractOf(identity, publicKey);
|
|
160
|
+
if (contract instanceof ton_1.WalletContractV4)
|
|
161
|
+
return contract.walletId;
|
|
162
|
+
// v5r1 data: is_signature_allowed:1 seqno:32 wallet_id:int32 public_key:256 extensions.
|
|
163
|
+
const data = contract.init.data.beginParse();
|
|
164
|
+
data.skip(1 + 32);
|
|
165
|
+
return data.loadInt(32);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The external request for `messages` at `seqno`, valid while chain time is before
|
|
169
|
+
* `validUntil` (seconds). `init` deploys the wallet with its first message.
|
|
170
|
+
*/
|
|
171
|
+
async function unsignedRequest(identity, publicKey, args) {
|
|
172
|
+
// The seqno is a uint32 on the wire, never wrapped.
|
|
173
|
+
if (!Number.isSafeInteger(args.seqno) || args.seqno < 0 || args.seqno > 0xffffffff) {
|
|
174
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'seqno must be a uint32');
|
|
175
|
+
}
|
|
176
|
+
// The SDK falls back to the wall clock for a falsy timeout; never let it.
|
|
177
|
+
if (!Number.isSafeInteger(args.validUntil) ||
|
|
178
|
+
args.validUntil <= 0 ||
|
|
179
|
+
args.validUntil > 0xffffffff) {
|
|
180
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'validUntil must be a uint32 above 0');
|
|
181
|
+
}
|
|
182
|
+
if (args.messages.length === 0 ||
|
|
183
|
+
args.messages.length > exports.MAX_MESSAGES[identity.version]) {
|
|
184
|
+
throw new error_1.ValidationError('INVALID_INTENT', `a ${identity.version} request carries 1 to ${exports.MAX_MESSAGES[identity.version]} messages`);
|
|
185
|
+
}
|
|
186
|
+
const contract = contractOf(identity, publicKey);
|
|
187
|
+
let signing;
|
|
188
|
+
const transfer = {
|
|
189
|
+
seqno: args.seqno,
|
|
190
|
+
timeout: args.validUntil,
|
|
191
|
+
sendMode: exports.SEND_MODE,
|
|
192
|
+
messages: [...args.messages],
|
|
193
|
+
signer: async (cell) => {
|
|
194
|
+
signing = cell;
|
|
195
|
+
return Buffer.alloc(64);
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
let message;
|
|
199
|
+
try {
|
|
200
|
+
const body = await (contract instanceof ton_1.WalletContractV4
|
|
201
|
+
? contract.createTransfer(transfer)
|
|
202
|
+
: contract.createTransfer(transfer));
|
|
203
|
+
message = (0, core_1.beginCell)()
|
|
204
|
+
.store((0, core_1.storeMessage)((0, core_1.external)({
|
|
205
|
+
to: contract.address,
|
|
206
|
+
body,
|
|
207
|
+
...(args.deploy
|
|
208
|
+
? { init: { code: contract.init.code, data: contract.init.data } }
|
|
209
|
+
: {}),
|
|
210
|
+
})))
|
|
211
|
+
.endCell();
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// The SDK throws bare errors that may name a value; `nativeMessage` and
|
|
215
|
+
// `jettonMessage` range-check theirs, so only a hand-built message ends here.
|
|
216
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'the TON request cannot be encoded');
|
|
217
|
+
}
|
|
218
|
+
if (!signing) {
|
|
219
|
+
throw new error_1.SigningError('SIGNING_FAILED', 'the SDK did not produce a signing message');
|
|
220
|
+
}
|
|
221
|
+
return { message, digest: new Uint8Array(signing.hash()) };
|
|
222
|
+
}
|
|
223
|
+
/** The message in `cell`, or undefined when it holds none (the SDK throws a bare `Error`). */
|
|
224
|
+
function messageOf(cell) {
|
|
225
|
+
try {
|
|
226
|
+
return (0, core_1.loadMessage)(cell.beginParse());
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/** A cell of `bits` then `refs`. */
|
|
233
|
+
function cellOf(parts, refs) {
|
|
234
|
+
const builder = (0, core_1.beginCell)();
|
|
235
|
+
for (const part of parts) {
|
|
236
|
+
if (Buffer.isBuffer(part))
|
|
237
|
+
builder.storeBuffer(part);
|
|
238
|
+
else
|
|
239
|
+
builder.storeBits(part);
|
|
240
|
+
}
|
|
241
|
+
for (const ref of refs)
|
|
242
|
+
builder.storeRef(ref);
|
|
243
|
+
return builder.endCell();
|
|
244
|
+
}
|
|
245
|
+
const ZERO_SIGNATURE = Buffer.alloc(64);
|
|
246
|
+
/**
|
|
247
|
+
* The signed external message: `signature` in place of the 512 zero bits whose remainder
|
|
248
|
+
* hashes to `digest` (the front for v4r2, the tail for v5r1). Refuses (`SIGNING_FAILED`) a
|
|
249
|
+
* payload with no such position, so a signature can never land anywhere else.
|
|
250
|
+
*/
|
|
251
|
+
function signedRequest(unsigned, digest, signature) {
|
|
252
|
+
if (signature.length !== 64) {
|
|
253
|
+
throw new error_1.SigningError('SIGNING_FAILED', 'a TON signature is 64 bytes');
|
|
254
|
+
}
|
|
255
|
+
const message = messageOf(unsigned);
|
|
256
|
+
if (message?.info.type !== 'external-in') {
|
|
257
|
+
throw new error_1.SigningError('SIGNING_FAILED', 'the unsigned TON payload is not an external message');
|
|
258
|
+
}
|
|
259
|
+
const { body } = message;
|
|
260
|
+
const length = body.bits.length;
|
|
261
|
+
const expected = Buffer.from(digest);
|
|
262
|
+
const zero = cellOf([ZERO_SIGNATURE], []).bits;
|
|
263
|
+
const sig = Buffer.from(signature);
|
|
264
|
+
let signedBody;
|
|
265
|
+
if (length >= 512) {
|
|
266
|
+
const front = body.bits.substring(0, 512);
|
|
267
|
+
const afterFront = body.bits.substring(512, length - 512);
|
|
268
|
+
const tail = body.bits.substring(length - 512, 512);
|
|
269
|
+
const beforeTail = body.bits.substring(0, length - 512);
|
|
270
|
+
if (front.equals(zero) && cellOf([afterFront], body.refs).hash().equals(expected)) {
|
|
271
|
+
signedBody = cellOf([sig, afterFront], body.refs);
|
|
272
|
+
}
|
|
273
|
+
else if (tail.equals(zero) &&
|
|
274
|
+
cellOf([beforeTail], body.refs).hash().equals(expected)) {
|
|
275
|
+
signedBody = cellOf([beforeTail, sig], body.refs);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (!signedBody) {
|
|
279
|
+
throw new error_1.SigningError('SIGNING_FAILED', 'the unsigned TON payload does not match its signing request');
|
|
280
|
+
}
|
|
281
|
+
return (0, core_1.beginCell)()
|
|
282
|
+
.store((0, core_1.storeMessage)({
|
|
283
|
+
info: message.info,
|
|
284
|
+
...(message.init ? { init: message.init } : {}),
|
|
285
|
+
body: signedBody,
|
|
286
|
+
}))
|
|
287
|
+
.endCell();
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* TEP-467: the hash of the external-in message with `src` = addr_none, `import_fee` = 0,
|
|
291
|
+
* no `init`, and the body always as a reference. Stable across relays; the Attempt id.
|
|
292
|
+
*/
|
|
293
|
+
function normalizedHash(externalMessage) {
|
|
294
|
+
const message = messageOf(externalMessage);
|
|
295
|
+
if (message?.info.type !== 'external-in') {
|
|
296
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'not an external-in message');
|
|
297
|
+
}
|
|
298
|
+
const normalized = (0, core_1.beginCell)()
|
|
299
|
+
.storeUint(2, 2)
|
|
300
|
+
.storeUint(0, 2)
|
|
301
|
+
.storeAddress(message.info.dest)
|
|
302
|
+
.storeCoins(0)
|
|
303
|
+
.storeBit(false)
|
|
304
|
+
.storeBit(true)
|
|
305
|
+
.storeRef(message.body)
|
|
306
|
+
.endCell();
|
|
307
|
+
return new Uint8Array(normalized.hash());
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Whether the wallet request `body` (external, or a W5
|
|
311
|
+
* `internal_signed` request relayed in an internal message) is `from`'s own. Anyone can post
|
|
312
|
+
* a relayed body, and a lone lying indexer can make up an external one, so a request
|
|
313
|
+
* proves nothing unless its ed25519 signature verifies over the rest of the request under
|
|
314
|
+
* `publicKey`, the wallet's key (v4r2: the first 512 bits; v5r1: the last 512), and its
|
|
315
|
+
* wallet id derives `from` with that key (v4r2: the subwallet id in `from`'s workchain;
|
|
316
|
+
* v5r1: the signed wallet id). A request of another wallet sharing the key, replayed
|
|
317
|
+
* here, never counts. For a relayed request the caller also requires the transaction's
|
|
318
|
+
* compute phase to have succeeded, i.e. the wallet ran it.
|
|
319
|
+
*/
|
|
320
|
+
function requestIsOwn(from, body, publicKey, globalId) {
|
|
321
|
+
try {
|
|
322
|
+
const length = body.bits.length;
|
|
323
|
+
if (length < 512 + 32 || publicKey.length !== 32)
|
|
324
|
+
return false;
|
|
325
|
+
const op = body.beginParse().preloadUint(32);
|
|
326
|
+
const v5 = op === messages_1.OP.w5SignedExternal || op === messages_1.OP.w5SignedInternal;
|
|
327
|
+
const [signed, rest] = v5
|
|
328
|
+
? [body.bits.substring(length - 512, 512), body.bits.substring(0, length - 512)]
|
|
329
|
+
: [body.bits.substring(0, 512), body.bits.substring(512, length - 512)];
|
|
330
|
+
const signing = cellOf([rest], body.refs);
|
|
331
|
+
const signature = cellOf([signed], []).beginParse().loadBuffer(64);
|
|
332
|
+
if (!ed25519_1.ed25519.verify(signature, signing.hash(), publicKey))
|
|
333
|
+
return false;
|
|
334
|
+
const identity = v5
|
|
335
|
+
? v5IdentityOf(signing.beginParse().skip(32).loadInt(32), globalId)
|
|
336
|
+
: v4IdentityOf(from, signing.beginParse().loadUint(32));
|
|
337
|
+
return identity !== undefined && walletAddress(identity, publicKey) === from;
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/** The v4r2 identity a request's subwallet id names in `from`'s workchain. */
|
|
344
|
+
function v4IdentityOf(from, subwalletId) {
|
|
345
|
+
const workchain = Number(from.split(':')[0]);
|
|
346
|
+
if (workchain !== 0 && workchain !== -1)
|
|
347
|
+
return undefined;
|
|
348
|
+
return { version: 'v4r2', workchain, subwalletId };
|
|
349
|
+
}
|
|
350
|
+
/** The v5r1 identity a signed wallet id names: 1 bit set, workchain int8, version 0, uint15. */
|
|
351
|
+
function v5IdentityOf(walletId, globalId) {
|
|
352
|
+
const context = (walletId ^ globalId) | 0;
|
|
353
|
+
if (context >>> 31 !== 1 || ((context >> 15) & 0xff) !== 0)
|
|
354
|
+
return undefined;
|
|
355
|
+
const byte = (context >> 23) & 0xff;
|
|
356
|
+
const workchain = byte >= 128 ? byte - 256 : byte;
|
|
357
|
+
if (workchain !== 0 && workchain !== -1)
|
|
358
|
+
return undefined;
|
|
359
|
+
return {
|
|
360
|
+
version: 'v5r1',
|
|
361
|
+
workchain,
|
|
362
|
+
subwalletNumber: context & 0x7fff,
|
|
363
|
+
networkGlobalId: globalId,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/** The TEP-467 hash (hex) of the external message `body` to `account` would travel in. */
|
|
367
|
+
function externalHashOf(account, body) {
|
|
368
|
+
const message = (0, core_1.beginCell)()
|
|
369
|
+
.store((0, core_1.storeMessage)((0, core_1.external)({ to: (0, messages_1.sdkAddress)(account), body })))
|
|
370
|
+
.endCell();
|
|
371
|
+
return Buffer.from(normalizedHash(message)).toString('hex');
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=wallets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallets.js","sourceRoot":"","sources":["../../../src/adapters/ton/wallets.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * TON wallet contracts, over `@ton/core` and `@ton/ton`: the wallet identity,\n * its address and `StateInit`, the signing message, and the external message around it.\n * Loaded only through the adapter manifest's `load()`.\n *\n * Signing flow: `build` asks the SDK for the transfer body with a zero signature and keeps\n * the whole unsigned external message (a BOC) as the payload; the one ed25519 request signs\n * the signing message's cell hash. `assemble` finds the 512 zero bits the signature\n * replaces (front for v4r2, tail for v5r1) by the one position whose remainder hashes to\n * the signed digest, so it needs no wallet version and cannot write a signature anywhere\n * else.\n */\nimport {\n Cell,\n SendMode,\n beginCell,\n external,\n loadMessage,\n storeMessage,\n type Message,\n type MessageRelaxed,\n type StateInit,\n} from '@ton/core';\nimport { ed25519 } from '@noble/curves/ed25519';\nimport { WalletContractV4, WalletContractV5R1 } from '@ton/ton';\nimport type { WalletOptions } from '../../core/driver/types';\nimport { ConfigError, SigningError, ValidationError } from '../../core/errors/error';\nimport { rawAddress, type TonWorkchain } from './address';\nimport { OP, sdkAddress } from './messages';\nimport type { TonWalletVersion } from './types';\n\n/** Messages one external request may carry: 4 refs per cell (v4r2), 255 (v5r1). */\nexport const MAX_MESSAGES: Readonly<Record<TonWalletVersion, number>> = Object.freeze({\n v4r2: 4,\n v5r1: 255,\n});\n\n/** Pay forward fees separately and never fail the action phase (W5 requires +2). */\nexport const SEND_MODE = SendMode.PAY_GAS_SEPARATELY + SendMode.IGNORE_ERRORS;\n\n/** The resolved wallet identity: every field that determines the address. */\nexport type TonIdentity =\n | {\n readonly version: 'v4r2';\n readonly workchain: TonWorkchain;\n readonly subwalletId: number;\n }\n | {\n readonly version: 'v5r1';\n readonly workchain: TonWorkchain;\n readonly subwalletNumber: number;\n readonly networkGlobalId: number;\n };\n\nconst V4_KEYS = new Set(['version', 'workchain', 'subwalletId']);\nconst V5_KEYS = new Set(['version', 'workchain', 'subwalletNumber', 'networkGlobalId']);\n\n/**\n * `wallets.<name>.ton` validated against the network: a v5r1 wallet id made for\n * another network is refused before any key is used. Every problem is `CONFIG_INVALID`.\n */\nexport function resolveIdentity(\n wallet: WalletOptions | undefined,\n globalId: number,\n): TonIdentity {\n const fail = (reason: string): never => {\n throw new ConfigError('CONFIG_INVALID', `TON wallet: ${reason}`);\n };\n const ton = wallet?.ton;\n if (ton === undefined || ton === null || typeof ton !== 'object') {\n return fail(`set wallets.<name>.ton = { version: 'v4r2' | 'v5r1' }`);\n }\n const config = ton as Record<string, unknown>;\n const version = config.version;\n if (version !== 'v4r2' && version !== 'v5r1') {\n return fail(`version must be 'v4r2' or 'v5r1'`);\n }\n const allowed = version === 'v4r2' ? V4_KEYS : V5_KEYS;\n for (const key of Object.keys(config)) {\n if (config[key] !== undefined && !allowed.has(key)) {\n // The caller's key is never echoed (it could be a pasted secret).\n fail(`a ${version} wallet takes only ${[...allowed].join(', ')}`);\n }\n }\n const workchain = config.workchain ?? 0;\n if (workchain !== 0 && workchain !== -1) fail('workchain must be 0 or -1');\n const wc = workchain as TonWorkchain;\n if (version === 'v4r2') {\n const subwalletId = config.subwalletId ?? 698983191 + wc;\n if (\n !Number.isInteger(subwalletId) ||\n (subwalletId as number) < 0 ||\n (subwalletId as number) > 0xffffffff\n ) {\n fail('subwalletId must be an integer in [0, 2^32 - 1]');\n }\n return { version, workchain: wc, subwalletId: subwalletId as number };\n }\n const subwalletNumber = config.subwalletNumber ?? 0;\n if (\n !Number.isInteger(subwalletNumber) ||\n (subwalletNumber as number) < 0 ||\n (subwalletNumber as number) > 0x7fff\n ) {\n fail('subwalletNumber must be an integer in [0, 32767]');\n }\n const networkGlobalId = config.networkGlobalId ?? globalId;\n if (networkGlobalId !== globalId) {\n fail(`networkGlobalId is not this network's (${globalId})`);\n }\n return {\n version,\n workchain: wc,\n subwalletNumber: subwalletNumber as number,\n networkGlobalId: globalId,\n };\n}\n\ntype WalletContract = WalletContractV4 | WalletContractV5R1;\n\n/** A strict (RFC 8032) encoding of a point that is not of small order. */\nfunction canonicalKey(publicKey: Uint8Array): boolean {\n try {\n return !ed25519.Point.fromHex(publicKey, false).isSmallOrder();\n } catch {\n return false;\n }\n}\n\nconst isInt = (value: number, min: number, max: number): boolean =>\n Number.isInteger(value) && value >= min && value <= max;\n\n/**\n * Every identity field fits the wire field the SDK writes it into (workchain\n * int8, subwallet id uint32, subwallet number uint15, network id int32), so an identity\n * not made by `resolveIdentity` is refused rather than wrapped or thrown as a bare `Error`.\n */\nfunction identityFits(identity: TonIdentity): boolean {\n if (identity.workchain !== 0 && identity.workchain !== -1) return false;\n if (identity.version === 'v4r2') return isInt(identity.subwalletId, 0, 0xffffffff);\n return (\n identity.version === 'v5r1' &&\n isInt(identity.subwalletNumber, 0, 0x7fff) &&\n isInt(identity.networkGlobalId, -0x80000000, 0x7fffffff)\n );\n}\n\nfunction contractOf(identity: TonIdentity, publicKey: Uint8Array): WalletContract {\n if (!identityFits(identity)) {\n throw new ConfigError('CONFIG_INVALID', 'the TON wallet identity is out of range');\n }\n if (publicKey.length !== 32 || !canonicalKey(publicKey)) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n 'a TON wallet key must be a canonical 32-byte ed25519 public key',\n );\n }\n const key = Buffer.from(publicKey);\n if (identity.version === 'v4r2') {\n return WalletContractV4.create({\n workchain: identity.workchain,\n publicKey: key,\n walletId: identity.subwalletId,\n });\n }\n // Every field explicit: the SDK's defaults are mainnet's id and workchain 0.\n return WalletContractV5R1.create({\n publicKey: key,\n walletId: {\n networkGlobalId: identity.networkGlobalId,\n context: {\n workchain: identity.workchain,\n walletVersion: 'v5r1',\n subwalletNumber: identity.subwalletNumber,\n },\n },\n });\n}\n\n/** The wallet's raw address: the hash of its `StateInit` in its workchain. */\nexport function walletAddress(identity: TonIdentity, publicKey: Uint8Array): string {\n const contract = contractOf(identity, publicKey);\n return rawAddress(identity.workchain, contract.address.hash);\n}\n\n/** The code and data a first message carries to deploy the wallet. */\nexport function walletStateInit(identity: TonIdentity, publicKey: Uint8Array): StateInit {\n const { init } = contractOf(identity, publicKey);\n return { code: init.code, data: init.data };\n}\n\n/** The wallet's wire wallet id (v4r2: the subwallet id; v5r1: the signed 32-bit id). */\nexport function walletIdOf(identity: TonIdentity, publicKey: Uint8Array): number {\n const contract = contractOf(identity, publicKey);\n if (contract instanceof WalletContractV4) return contract.walletId;\n // v5r1 data: is_signature_allowed:1 seqno:32 wallet_id:int32 public_key:256 extensions.\n const data = contract.init.data.beginParse();\n data.skip(1 + 32);\n return data.loadInt(32);\n}\n\nexport interface UnsignedRequest {\n /** The unsigned external message: the wallet body with 512 zero bits for the signature. */\n readonly message: Cell;\n /** The signing message's cell hash: what the ed25519 key signs. */\n readonly digest: Uint8Array;\n}\n\n/**\n * The external request for `messages` at `seqno`, valid while chain time is before\n * `validUntil` (seconds). `init` deploys the wallet with its first message.\n */\nexport async function unsignedRequest(\n identity: TonIdentity,\n publicKey: Uint8Array,\n args: {\n readonly seqno: number;\n readonly validUntil: number;\n readonly messages: readonly MessageRelaxed[];\n readonly deploy: boolean;\n },\n): Promise<UnsignedRequest> {\n // The seqno is a uint32 on the wire, never wrapped.\n if (!Number.isSafeInteger(args.seqno) || args.seqno < 0 || args.seqno > 0xffffffff) {\n throw new ValidationError('INVALID_INTENT', 'seqno must be a uint32');\n }\n // The SDK falls back to the wall clock for a falsy timeout; never let it.\n if (\n !Number.isSafeInteger(args.validUntil) ||\n args.validUntil <= 0 ||\n args.validUntil > 0xffffffff\n ) {\n throw new ValidationError('INVALID_INTENT', 'validUntil must be a uint32 above 0');\n }\n if (\n args.messages.length === 0 ||\n args.messages.length > MAX_MESSAGES[identity.version]\n ) {\n throw new ValidationError(\n 'INVALID_INTENT',\n `a ${identity.version} request carries 1 to ${MAX_MESSAGES[identity.version]} messages`,\n );\n }\n const contract = contractOf(identity, publicKey);\n let signing: Cell | undefined;\n const transfer = {\n seqno: args.seqno,\n timeout: args.validUntil,\n sendMode: SEND_MODE,\n messages: [...args.messages],\n signer: async (cell: Cell): Promise<Buffer> => {\n signing = cell;\n return Buffer.alloc(64);\n },\n };\n let message: Cell;\n try {\n const body = await (contract instanceof WalletContractV4\n ? contract.createTransfer(transfer)\n : contract.createTransfer(transfer));\n message = beginCell()\n .store(\n storeMessage(\n external({\n to: contract.address,\n body,\n ...(args.deploy\n ? { init: { code: contract.init.code, data: contract.init.data } }\n : {}),\n }),\n ),\n )\n .endCell();\n } catch {\n // The SDK throws bare errors that may name a value; `nativeMessage` and\n // `jettonMessage` range-check theirs, so only a hand-built message ends here.\n throw new ValidationError('INVALID_INTENT', 'the TON request cannot be encoded');\n }\n if (!signing) {\n throw new SigningError('SIGNING_FAILED', 'the SDK did not produce a signing message');\n }\n return { message, digest: new Uint8Array(signing.hash()) };\n}\n\n/** The message in `cell`, or undefined when it holds none (the SDK throws a bare `Error`). */\nfunction messageOf(cell: Cell): Message | undefined {\n try {\n return loadMessage(cell.beginParse());\n } catch {\n return undefined;\n }\n}\n\n/** A cell of `bits` then `refs`. */\nfunction cellOf(parts: readonly (Buffer | Cell['bits'])[], refs: readonly Cell[]): Cell {\n const builder = beginCell();\n for (const part of parts) {\n if (Buffer.isBuffer(part)) builder.storeBuffer(part);\n else builder.storeBits(part);\n }\n for (const ref of refs) builder.storeRef(ref);\n return builder.endCell();\n}\n\nconst ZERO_SIGNATURE = Buffer.alloc(64);\n\n/**\n * The signed external message: `signature` in place of the 512 zero bits whose remainder\n * hashes to `digest` (the front for v4r2, the tail for v5r1). Refuses (`SIGNING_FAILED`) a\n * payload with no such position, so a signature can never land anywhere else.\n */\nexport function signedRequest(\n unsigned: Cell,\n digest: Uint8Array,\n signature: Uint8Array,\n): Cell {\n if (signature.length !== 64) {\n throw new SigningError('SIGNING_FAILED', 'a TON signature is 64 bytes');\n }\n const message = messageOf(unsigned);\n if (message?.info.type !== 'external-in') {\n throw new SigningError(\n 'SIGNING_FAILED',\n 'the unsigned TON payload is not an external message',\n );\n }\n const { body } = message;\n const length = body.bits.length;\n const expected = Buffer.from(digest);\n const zero = cellOf([ZERO_SIGNATURE], []).bits;\n const sig = Buffer.from(signature);\n let signedBody: Cell | undefined;\n if (length >= 512) {\n const front = body.bits.substring(0, 512);\n const afterFront = body.bits.substring(512, length - 512);\n const tail = body.bits.substring(length - 512, 512);\n const beforeTail = body.bits.substring(0, length - 512);\n if (front.equals(zero) && cellOf([afterFront], body.refs).hash().equals(expected)) {\n signedBody = cellOf([sig, afterFront], body.refs);\n } else if (\n tail.equals(zero) &&\n cellOf([beforeTail], body.refs).hash().equals(expected)\n ) {\n signedBody = cellOf([beforeTail, sig], body.refs);\n }\n }\n if (!signedBody) {\n throw new SigningError(\n 'SIGNING_FAILED',\n 'the unsigned TON payload does not match its signing request',\n );\n }\n return beginCell()\n .store(\n storeMessage({\n info: message.info,\n ...(message.init ? { init: message.init } : {}),\n body: signedBody,\n }),\n )\n .endCell();\n}\n\n/**\n * TEP-467: the hash of the external-in message with `src` = addr_none, `import_fee` = 0,\n * no `init`, and the body always as a reference. Stable across relays; the Attempt id.\n */\nexport function normalizedHash(externalMessage: Cell): Uint8Array {\n const message = messageOf(externalMessage);\n if (message?.info.type !== 'external-in') {\n throw new ValidationError('INVALID_INTENT', 'not an external-in message');\n }\n const normalized = beginCell()\n .storeUint(2, 2)\n .storeUint(0, 2)\n .storeAddress(message.info.dest)\n .storeCoins(0)\n .storeBit(false)\n .storeBit(true)\n .storeRef(message.body)\n .endCell();\n return new Uint8Array(normalized.hash());\n}\n\n/**\n * Whether the wallet request `body` (external, or a W5\n * `internal_signed` request relayed in an internal message) is `from`'s own. Anyone can post\n * a relayed body, and a lone lying indexer can make up an external one, so a request\n * proves nothing unless its ed25519 signature verifies over the rest of the request under\n * `publicKey`, the wallet's key (v4r2: the first 512 bits; v5r1: the last 512), and its\n * wallet id derives `from` with that key (v4r2: the subwallet id in `from`'s workchain;\n * v5r1: the signed wallet id). A request of another wallet sharing the key, replayed\n * here, never counts. For a relayed request the caller also requires the transaction's\n * compute phase to have succeeded, i.e. the wallet ran it.\n */\nexport function requestIsOwn(\n from: string,\n body: Cell,\n publicKey: Uint8Array,\n globalId: number,\n): boolean {\n try {\n const length = body.bits.length;\n if (length < 512 + 32 || publicKey.length !== 32) return false;\n const op = body.beginParse().preloadUint(32);\n const v5 = op === OP.w5SignedExternal || op === OP.w5SignedInternal;\n const [signed, rest] = v5\n ? [body.bits.substring(length - 512, 512), body.bits.substring(0, length - 512)]\n : [body.bits.substring(0, 512), body.bits.substring(512, length - 512)];\n const signing = cellOf([rest], body.refs);\n const signature = cellOf([signed], []).beginParse().loadBuffer(64);\n if (!ed25519.verify(signature, signing.hash(), publicKey)) return false;\n const identity = v5\n ? v5IdentityOf(signing.beginParse().skip(32).loadInt(32), globalId)\n : v4IdentityOf(from, signing.beginParse().loadUint(32));\n return identity !== undefined && walletAddress(identity, publicKey) === from;\n } catch {\n return false;\n }\n}\n\n/** The v4r2 identity a request's subwallet id names in `from`'s workchain. */\nfunction v4IdentityOf(from: string, subwalletId: number): TonIdentity | undefined {\n const workchain = Number(from.split(':')[0]);\n if (workchain !== 0 && workchain !== -1) return undefined;\n return { version: 'v4r2', workchain, subwalletId };\n}\n\n/** The v5r1 identity a signed wallet id names: 1 bit set, workchain int8, version 0, uint15. */\nfunction v5IdentityOf(walletId: number, globalId: number): TonIdentity | undefined {\n const context = (walletId ^ globalId) | 0;\n if (context >>> 31 !== 1 || ((context >> 15) & 0xff) !== 0) return undefined;\n const byte = (context >> 23) & 0xff;\n const workchain = byte >= 128 ? byte - 256 : byte;\n if (workchain !== 0 && workchain !== -1) return undefined;\n return {\n version: 'v5r1',\n workchain,\n subwalletNumber: context & 0x7fff,\n networkGlobalId: globalId,\n };\n}\n\n/** The SDK's `Address` for a raw address, parsed strictly. */\nexport { sdkAddress };\n\n/** The TEP-467 hash (hex) of the external message `body` to `account` would travel in. */\nexport function externalHashOf(account: string, body: Cell): string {\n const message = beginCell()\n .store(storeMessage(external({ to: sdkAddress(account), body })))\n .endCell();\n return Buffer.from(normalizedHash(message)).toString('hex');\n}\n"]}
|