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,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CHAIN_TIME_TOLERANCE = exports.MAX_VALID_FOR_SECONDS = exports.MIN_VALID_FOR_SECONDS = exports.DEFAULT_MAX_NETWORK_FEE = exports.TON_INDEXER_CAPABILITIES = exports.TON_CAPABILITIES = void 0;
|
|
4
|
+
exports.recordedValidFrom = recordedValidFrom;
|
|
5
|
+
exports.tonNetworkConfig = tonNetworkConfig;
|
|
6
|
+
/**
|
|
7
|
+
* What the TON driver needs from a network's registry entry, validated once when a driver
|
|
8
|
+
* is created, so inconsistent data fails with `CONFIG_INVALID` instead of misbehaving.
|
|
9
|
+
* SDK-free.
|
|
10
|
+
*/
|
|
11
|
+
const error_1 = require("../../core/errors/error");
|
|
12
|
+
const capability_1 = require("../../core/model/capability");
|
|
13
|
+
const names_1 = require("../../core/util/names");
|
|
14
|
+
const fees_1 = require("./fees");
|
|
15
|
+
/**
|
|
16
|
+
* The TON manifest's capabilities; `address-history` comes with the indexer. No
|
|
17
|
+
* `batch-transfer`: the verdict answers `failed` for a partly delivered batch, and
|
|
18
|
+
* a failed Operation sent again whole would pay twice the outputs that moved, so a TON
|
|
19
|
+
* transfer carries exactly one output.
|
|
20
|
+
*/
|
|
21
|
+
exports.TON_CAPABILITIES = Object.freeze([
|
|
22
|
+
'tokens',
|
|
23
|
+
'memo',
|
|
24
|
+
'expiry',
|
|
25
|
+
]);
|
|
26
|
+
exports.TON_INDEXER_CAPABILITIES = Object.freeze([
|
|
27
|
+
'address-history',
|
|
28
|
+
]);
|
|
29
|
+
/**
|
|
30
|
+
* The only capabilities a TON network may add or remove. Never on TON: `block-scan`
|
|
31
|
+
* (sharded, no block source), `replace-fee` and `cancel` (TON has neither),
|
|
32
|
+
* `batch-transfer` (one output per transfer), nor any other.
|
|
33
|
+
*/
|
|
34
|
+
const OWN_CAPABILITIES = new Set([
|
|
35
|
+
...exports.TON_CAPABILITIES,
|
|
36
|
+
...exports.TON_INDEXER_CAPABILITIES,
|
|
37
|
+
]);
|
|
38
|
+
/** The TON network options (`NetworkInfo.params`); any other key is a typo. */
|
|
39
|
+
const OPTIONS = new Set([
|
|
40
|
+
'validForSeconds',
|
|
41
|
+
'jettonAttached',
|
|
42
|
+
'jettonForwardAmount',
|
|
43
|
+
'finalitySkewBlocks',
|
|
44
|
+
'maxNetworkFee',
|
|
45
|
+
]);
|
|
46
|
+
/**
|
|
47
|
+
* The default economic ceiling on the `network` charge an endpoint's emulation suggests,
|
|
48
|
+
* which a network replaces with `params.maxNetworkFee`. TON signs no fee: the chain
|
|
49
|
+
* charges gas and forward fees by its config, so an inflated estimate cannot make a
|
|
50
|
+
* transfer pay more, but it would fail the funds check for good (`INSUFFICIENT_FUNDS`) or
|
|
51
|
+
* mislead whoever approves the fee. A basechain wallet's transfer costs about 0.001-0.01
|
|
52
|
+
* TON, and a whole gas limit (1M gas at 400 nanograms) 0.4 TON; a masterchain wallet pays
|
|
53
|
+
* about 25 times the gas and far more storage (about 6 TON a year for a v4r2 wallet at
|
|
54
|
+
* mainnet's config param 18), so 100 TON refuses only a wallet idle for more than about
|
|
55
|
+
* 13 years. Above the ceiling an estimate is a retryable `PROVIDER_INCONSISTENT`.
|
|
56
|
+
*/
|
|
57
|
+
exports.DEFAULT_MAX_NETWORK_FEE = Object.freeze({
|
|
58
|
+
basechain: 1000000000n,
|
|
59
|
+
masterchain: 100000000000n,
|
|
60
|
+
});
|
|
61
|
+
const WORKCHAINS = new Set(['basechain', 'masterchain']);
|
|
62
|
+
/**
|
|
63
|
+
* A capability as an error may show it: a core capability's name is a fixed word, so
|
|
64
|
+
* it is shown; any other text could be a pasted secret, so it is not. Unknown option keys are
|
|
65
|
+
* never echoed either; their errors list the accepted names instead.
|
|
66
|
+
*/
|
|
67
|
+
const shown = (capability) => (0, names_1.knownName)(capability, capability_1.KNOWN_CAPABILITIES, 'an unknown capability');
|
|
68
|
+
const isIntegerIn = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
69
|
+
/** The lifetimes a network may configure (`params.validForSeconds`), in seconds. */
|
|
70
|
+
exports.MIN_VALID_FOR_SECONDS = 10;
|
|
71
|
+
exports.MAX_VALID_FOR_SECONDS = 86_400;
|
|
72
|
+
/** How far an endpoint's `sync_utime` may be from the local clock, in seconds. */
|
|
73
|
+
exports.CHAIN_TIME_TOLERANCE = 300;
|
|
74
|
+
/**
|
|
75
|
+
* A build's recorded chain time (`TonSeqnoOrdering.validFrom`) when the ordering holds
|
|
76
|
+
* a well-formed one for its lifetime: a safe integer at least the shortest lifetime before
|
|
77
|
+
* `validUntil`, and at most the longest (plus the chain-time tolerance) before it. Undefined
|
|
78
|
+
* otherwise (an attempt built before the field existed, or a damaged record).
|
|
79
|
+
*/
|
|
80
|
+
function recordedValidFrom(slot) {
|
|
81
|
+
const { validUntil } = slot;
|
|
82
|
+
const { validFrom } = slot;
|
|
83
|
+
return typeof validFrom === 'number' &&
|
|
84
|
+
Number.isSafeInteger(validFrom) &&
|
|
85
|
+
validFrom <= validUntil - exports.MIN_VALID_FOR_SECONDS &&
|
|
86
|
+
validFrom >= validUntil - exports.MAX_VALID_FOR_SECONDS - exports.CHAIN_TIME_TOLERANCE
|
|
87
|
+
? validFrom
|
|
88
|
+
: undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The only driver options (`HandleOptions.options`, `chains.ton.options`) the TON driver
|
|
92
|
+
* reads. Any other key is refused, so a typo fails loudly instead of leaving the default
|
|
93
|
+
* in place.
|
|
94
|
+
*/
|
|
95
|
+
const OPTION_KEYS = new Set(['maxNetworkFee']);
|
|
96
|
+
function tonNetworkConfig(chain, network, options = {}) {
|
|
97
|
+
const fail = (reason) => {
|
|
98
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `TON network ${chain.id}:${network.id}: ${reason}`);
|
|
99
|
+
};
|
|
100
|
+
const identity = network.identity;
|
|
101
|
+
if (identity === undefined || !/^-?[1-9][0-9]*$/.test(identity)) {
|
|
102
|
+
fail('its identity must be the decimal global id (config param 19)');
|
|
103
|
+
}
|
|
104
|
+
const globalId = Number(identity);
|
|
105
|
+
if (!isIntegerIn(globalId, -(2 ** 31), 2 ** 31 - 1)) {
|
|
106
|
+
fail('the global id must be an int32');
|
|
107
|
+
}
|
|
108
|
+
if (network.feeModel !== 'ton') {
|
|
109
|
+
fail(`its fee model must be 'ton'`);
|
|
110
|
+
}
|
|
111
|
+
if (network.finality.kind !== 'masterchain') {
|
|
112
|
+
fail(`its finality must be 'masterchain'`);
|
|
113
|
+
}
|
|
114
|
+
const params = network.params ?? {};
|
|
115
|
+
for (const key of Object.keys(params)) {
|
|
116
|
+
if (!OPTIONS.has(key)) {
|
|
117
|
+
fail(`params has a key that is not a TON network option (${[...OPTIONS].join(', ')})`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Own keys only; an explicit `undefined` is absent, so the library default applies.
|
|
121
|
+
const param = (key, fallback) => {
|
|
122
|
+
const value = Object.hasOwn(params, key) ? params[key] : undefined;
|
|
123
|
+
return value === undefined ? fallback : value;
|
|
124
|
+
};
|
|
125
|
+
const validFor = param('validForSeconds', 60);
|
|
126
|
+
if (!isIntegerIn(validFor, exports.MIN_VALID_FOR_SECONDS, exports.MAX_VALID_FOR_SECONDS)) {
|
|
127
|
+
fail('params.validForSeconds must be an integer in [10, 86400]');
|
|
128
|
+
}
|
|
129
|
+
// Encoded as Coins in every jetton wallet message: range-checked here, never wrapped.
|
|
130
|
+
const attached = param('jettonAttached', 50000000n);
|
|
131
|
+
if (typeof attached !== 'bigint' || attached <= 0n || attached > fees_1.MAX_COINS) {
|
|
132
|
+
fail('params.jettonAttached must be a bigint in [1, 2^120 - 1] (nanograms)');
|
|
133
|
+
}
|
|
134
|
+
const forward = param('jettonForwardAmount', 1n);
|
|
135
|
+
if (typeof forward !== 'bigint' || forward < 0n || forward >= attached) {
|
|
136
|
+
fail('params.jettonForwardAmount must be a bigint in [0, jettonAttached)');
|
|
137
|
+
}
|
|
138
|
+
const skew = param('finalitySkewBlocks', 10);
|
|
139
|
+
if (!isIntegerIn(skew, 1, 1_000)) {
|
|
140
|
+
fail('params.finalitySkewBlocks must be an integer in [1, 1000]');
|
|
141
|
+
}
|
|
142
|
+
// The refusal names the accepted option and shows neither the caller's key, which
|
|
143
|
+
// may be a pasted secret, nor its value.
|
|
144
|
+
for (const key of Object.keys(options)) {
|
|
145
|
+
if (!OPTION_KEYS.has(key)) {
|
|
146
|
+
fail((0, names_1.unknownName)('option', OPTION_KEYS));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Per workchain, the handle's option, else the network's params, else the
|
|
150
|
+
// default. A network value is checked even where an option overrides it.
|
|
151
|
+
const networkFeeCeiling = feeCeiling(param('maxNetworkFee', {}), 'params.maxNetworkFee', exports.DEFAULT_MAX_NETWORK_FEE, fail);
|
|
152
|
+
const option = Object.hasOwn(options, 'maxNetworkFee')
|
|
153
|
+
? options.maxNetworkFee
|
|
154
|
+
: undefined;
|
|
155
|
+
const maxNetworkFee = option === undefined
|
|
156
|
+
? networkFeeCeiling
|
|
157
|
+
: feeCeiling(option, 'maxNetworkFee', networkFeeCeiling, fail);
|
|
158
|
+
const capabilities = new Set([
|
|
159
|
+
...exports.TON_CAPABILITIES,
|
|
160
|
+
...exports.TON_INDEXER_CAPABILITIES,
|
|
161
|
+
]);
|
|
162
|
+
const own = (c) => OWN_CAPABILITIES.has(c) ? c : fail(`${shown(c)} is not available on TON`);
|
|
163
|
+
for (const c of network.capabilities?.add ?? [])
|
|
164
|
+
capabilities.add(own(c));
|
|
165
|
+
for (const c of network.capabilities?.remove ?? [])
|
|
166
|
+
capabilities.delete(own(c));
|
|
167
|
+
return {
|
|
168
|
+
globalId,
|
|
169
|
+
testnet: network.testnet,
|
|
170
|
+
validForSeconds: validFor,
|
|
171
|
+
jettonAttached: attached,
|
|
172
|
+
jettonForwardAmount: forward,
|
|
173
|
+
finalitySkewBlocks: skew,
|
|
174
|
+
maxNetworkFee,
|
|
175
|
+
capabilities,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* `maxNetworkFee` (`name`: the network's `params.maxNetworkFee` or the handle option):
|
|
180
|
+
* `{ basechain?, masterchain? }`, each a positive bigint within Coins (the charge is
|
|
181
|
+
* compared with nanogram amounts); a workchain left out keeps `fallback`'s. Any other key,
|
|
182
|
+
* or value, is `CONFIG_INVALID`, which never echoes the key.
|
|
183
|
+
*/
|
|
184
|
+
function feeCeiling(value, name, fallback, fail) {
|
|
185
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
186
|
+
return fail(`${name} must be { basechain?, masterchain? } (nanograms)`);
|
|
187
|
+
}
|
|
188
|
+
const record = value;
|
|
189
|
+
for (const key of Object.keys(record)) {
|
|
190
|
+
if (!WORKCHAINS.has(key)) {
|
|
191
|
+
fail(`${name} takes only 'basechain' and 'masterchain'`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const bound = (key) => {
|
|
195
|
+
const own = Object.hasOwn(record, key) ? record[key] : undefined;
|
|
196
|
+
const ceiling = own === undefined ? fallback[key] : own;
|
|
197
|
+
if (typeof ceiling !== 'bigint' || ceiling <= 0n || ceiling > fees_1.MAX_COINS) {
|
|
198
|
+
fail(`${name}.${key} must be a bigint in [1, 2^120 - 1] (nanograms)`);
|
|
199
|
+
}
|
|
200
|
+
return ceiling;
|
|
201
|
+
};
|
|
202
|
+
return Object.freeze({
|
|
203
|
+
basechain: bound('basechain'),
|
|
204
|
+
masterchain: bound('masterchain'),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/adapters/ton/network.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What the TON driver needs from a network's registry entry, validated once when a driver\n * is created, so inconsistent data fails with `CONFIG_INVALID` instead of misbehaving.\n * SDK-free.\n */\nimport { ConfigError } from '../../core/errors/error';\nimport { KNOWN_CAPABILITIES, type Capability } from '../../core/model/capability';\nimport type { ChainInfo, NetworkInfo } from '../../core/model/chain';\nimport { knownName, unknownName } from '../../core/util/names';\nimport { MAX_COINS } from './fees';\n\n/**\n * The TON manifest's capabilities; `address-history` comes with the indexer. No\n * `batch-transfer`: the verdict answers `failed` for a partly delivered batch, and\n * a failed Operation sent again whole would pay twice the outputs that moved, so a TON\n * transfer carries exactly one output.\n */\nexport const TON_CAPABILITIES: readonly Capability[] = Object.freeze([\n 'tokens',\n 'memo',\n 'expiry',\n]);\nexport const TON_INDEXER_CAPABILITIES: readonly Capability[] = Object.freeze([\n 'address-history',\n]);\n/**\n * The only capabilities a TON network may add or remove. Never on TON: `block-scan`\n * (sharded, no block source), `replace-fee` and `cancel` (TON has neither),\n * `batch-transfer` (one output per transfer), nor any other.\n */\nconst OWN_CAPABILITIES: ReadonlySet<Capability> = new Set([\n ...TON_CAPABILITIES,\n ...TON_INDEXER_CAPABILITIES,\n]);\n\n/** The TON network options (`NetworkInfo.params`); any other key is a typo. */\nconst OPTIONS: ReadonlySet<string> = new Set([\n 'validForSeconds',\n 'jettonAttached',\n 'jettonForwardAmount',\n 'finalitySkewBlocks',\n 'maxNetworkFee',\n]);\n\n/** The ceiling of each workchain's `network` charge, in nanograms. */\nexport interface TonFeeCeiling {\n readonly basechain: bigint;\n readonly masterchain: bigint;\n}\n\n/**\n * The default economic ceiling on the `network` charge an endpoint's emulation suggests,\n * which a network replaces with `params.maxNetworkFee`. TON signs no fee: the chain\n * charges gas and forward fees by its config, so an inflated estimate cannot make a\n * transfer pay more, but it would fail the funds check for good (`INSUFFICIENT_FUNDS`) or\n * mislead whoever approves the fee. A basechain wallet's transfer costs about 0.001-0.01\n * TON, and a whole gas limit (1M gas at 400 nanograms) 0.4 TON; a masterchain wallet pays\n * about 25 times the gas and far more storage (about 6 TON a year for a v4r2 wallet at\n * mainnet's config param 18), so 100 TON refuses only a wallet idle for more than about\n * 13 years. Above the ceiling an estimate is a retryable `PROVIDER_INCONSISTENT`.\n */\nexport const DEFAULT_MAX_NETWORK_FEE: TonFeeCeiling = Object.freeze({\n basechain: 1_000_000_000n,\n masterchain: 100_000_000_000n,\n});\n\nconst WORKCHAINS: ReadonlySet<string> = new Set(['basechain', 'masterchain']);\n\n/**\n * A capability as an error may show it: a core capability's name is a fixed word, so\n * it is shown; any other text could be a pasted secret, so it is not. Unknown option keys are\n * never echoed either; their errors list the accepted names instead.\n */\nconst shown = (capability: Capability): string =>\n knownName(capability, KNOWN_CAPABILITIES, 'an unknown capability');\n\nexport interface TonNetworkConfig {\n /** Config param 19; the network identity. */\n readonly globalId: number;\n readonly testnet: boolean;\n /** A message's lifetime past chain time, in seconds. */\n readonly validForSeconds: number;\n /** Nanograms attached to each jetton wallet message; the unspent part is refunded. */\n readonly jettonAttached: bigint;\n /** Nanograms forwarded with each jetton notification. */\n readonly jettonForwardAmount: bigint;\n /** Masterchain blocks the attested head first trails the freshest endpoint by. */\n readonly finalitySkewBlocks: number;\n /** The most an estimate's `network` charge may be, per workchain of the sender. */\n readonly maxNetworkFee: TonFeeCeiling;\n readonly capabilities: ReadonlySet<Capability>;\n}\n\nconst isIntegerIn = (value: unknown, min: number, max: number): value is number =>\n Number.isSafeInteger(value) && (value as number) >= min && (value as number) <= max;\n\n/** The lifetimes a network may configure (`params.validForSeconds`), in seconds. */\nexport const MIN_VALID_FOR_SECONDS = 10;\nexport const MAX_VALID_FOR_SECONDS = 86_400;\n\n/** How far an endpoint's `sync_utime` may be from the local clock, in seconds. */\nexport const CHAIN_TIME_TOLERANCE = 300;\n\n/**\n * A build's recorded chain time (`TonSeqnoOrdering.validFrom`) when the ordering holds\n * a well-formed one for its lifetime: a safe integer at least the shortest lifetime before\n * `validUntil`, and at most the longest (plus the chain-time tolerance) before it. Undefined\n * otherwise (an attempt built before the field existed, or a damaged record).\n */\nexport function recordedValidFrom(slot: {\n readonly validUntil: number;\n}): number | undefined {\n const { validUntil } = slot;\n const { validFrom } = slot as { readonly validFrom?: unknown };\n return typeof validFrom === 'number' &&\n Number.isSafeInteger(validFrom) &&\n validFrom <= validUntil - MIN_VALID_FOR_SECONDS &&\n validFrom >= validUntil - MAX_VALID_FOR_SECONDS - CHAIN_TIME_TOLERANCE\n ? validFrom\n : undefined;\n}\n\n/**\n * The only driver options (`HandleOptions.options`, `chains.ton.options`) the TON driver\n * reads. Any other key is refused, so a typo fails loudly instead of leaving the default\n * in place.\n */\nconst OPTION_KEYS: ReadonlySet<string> = new Set(['maxNetworkFee']);\n\nexport function tonNetworkConfig(\n chain: ChainInfo,\n network: NetworkInfo,\n options: Readonly<Record<string, unknown>> = {},\n): TonNetworkConfig {\n const fail = (reason: string): never => {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `TON network ${chain.id}:${network.id}: ${reason}`,\n );\n };\n const identity = network.identity;\n if (identity === undefined || !/^-?[1-9][0-9]*$/.test(identity)) {\n fail('its identity must be the decimal global id (config param 19)');\n }\n const globalId = Number(identity);\n if (!isIntegerIn(globalId, -(2 ** 31), 2 ** 31 - 1)) {\n fail('the global id must be an int32');\n }\n if (network.feeModel !== 'ton') {\n fail(`its fee model must be 'ton'`);\n }\n if (network.finality.kind !== 'masterchain') {\n fail(`its finality must be 'masterchain'`);\n }\n const params = network.params ?? {};\n for (const key of Object.keys(params)) {\n if (!OPTIONS.has(key)) {\n fail(\n `params has a key that is not a TON network option (${[...OPTIONS].join(', ')})`,\n );\n }\n }\n // Own keys only; an explicit `undefined` is absent, so the library default applies.\n const param = (key: string, fallback: unknown): unknown => {\n const value = Object.hasOwn(params, key) ? params[key] : undefined;\n return value === undefined ? fallback : value;\n };\n const validFor = param('validForSeconds', 60);\n if (!isIntegerIn(validFor, MIN_VALID_FOR_SECONDS, MAX_VALID_FOR_SECONDS)) {\n fail('params.validForSeconds must be an integer in [10, 86400]');\n }\n // Encoded as Coins in every jetton wallet message: range-checked here, never wrapped.\n const attached = param('jettonAttached', 50_000_000n);\n if (typeof attached !== 'bigint' || attached <= 0n || attached > MAX_COINS) {\n fail('params.jettonAttached must be a bigint in [1, 2^120 - 1] (nanograms)');\n }\n const forward = param('jettonForwardAmount', 1n);\n if (typeof forward !== 'bigint' || forward < 0n || forward >= (attached as bigint)) {\n fail('params.jettonForwardAmount must be a bigint in [0, jettonAttached)');\n }\n const skew = param('finalitySkewBlocks', 10);\n if (!isIntegerIn(skew, 1, 1_000)) {\n fail('params.finalitySkewBlocks must be an integer in [1, 1000]');\n }\n // The refusal names the accepted option and shows neither the caller's key, which\n // may be a pasted secret, nor its value.\n for (const key of Object.keys(options)) {\n if (!OPTION_KEYS.has(key)) {\n fail(unknownName('option', OPTION_KEYS));\n }\n }\n // Per workchain, the handle's option, else the network's params, else the\n // default. A network value is checked even where an option overrides it.\n const networkFeeCeiling = feeCeiling(\n param('maxNetworkFee', {}),\n 'params.maxNetworkFee',\n DEFAULT_MAX_NETWORK_FEE,\n fail,\n );\n const option = Object.hasOwn(options, 'maxNetworkFee')\n ? options.maxNetworkFee\n : undefined;\n const maxNetworkFee =\n option === undefined\n ? networkFeeCeiling\n : feeCeiling(option, 'maxNetworkFee', networkFeeCeiling, fail);\n const capabilities = new Set<Capability>([\n ...TON_CAPABILITIES,\n ...TON_INDEXER_CAPABILITIES,\n ]);\n const own = (c: Capability): Capability =>\n OWN_CAPABILITIES.has(c) ? c : fail(`${shown(c)} is not available on TON`);\n for (const c of network.capabilities?.add ?? []) capabilities.add(own(c));\n for (const c of network.capabilities?.remove ?? []) capabilities.delete(own(c));\n return {\n globalId,\n testnet: network.testnet,\n validForSeconds: validFor as number,\n jettonAttached: attached as bigint,\n jettonForwardAmount: forward as bigint,\n finalitySkewBlocks: skew as number,\n maxNetworkFee,\n capabilities,\n };\n}\n\n/**\n * `maxNetworkFee` (`name`: the network's `params.maxNetworkFee` or the handle option):\n * `{ basechain?, masterchain? }`, each a positive bigint within Coins (the charge is\n * compared with nanogram amounts); a workchain left out keeps `fallback`'s. Any other key,\n * or value, is `CONFIG_INVALID`, which never echoes the key.\n */\nfunction feeCeiling(\n value: unknown,\n name: string,\n fallback: TonFeeCeiling,\n fail: (reason: string) => never,\n): TonFeeCeiling {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return fail(`${name} must be { basechain?, masterchain? } (nanograms)`);\n }\n const record = value as Readonly<Record<string, unknown>>;\n for (const key of Object.keys(record)) {\n if (!WORKCHAINS.has(key)) {\n fail(`${name} takes only 'basechain' and 'masterchain'`);\n }\n }\n const bound = (key: keyof TonFeeCeiling): bigint => {\n const own = Object.hasOwn(record, key) ? record[key] : undefined;\n const ceiling = own === undefined ? fallback[key] : own;\n if (typeof ceiling !== 'bigint' || ceiling <= 0n || ceiling > MAX_COINS) {\n fail(`${name}.${key} must be a bigint in [1, 2^120 - 1] (nanograms)`);\n }\n return ceiling as bigint;\n };\n return Object.freeze({\n basechain: bound('basechain'),\n masterchain: bound('masterchain'),\n });\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The TON family plugin: the chain, jettons and toncenter presets as data, plus
|
|
3
|
+
* one adapter manifest (library `@ton/ton`). SDK-free: only the manifest's `load()` requires
|
|
4
|
+
* the library module, and with it the driver, `@ton/ton`, `@ton/core` and `@ton/crypto`.
|
|
5
|
+
*/
|
|
6
|
+
import type { AdapterManifest, PeerDependency } from '../../core/driver/types';
|
|
7
|
+
import type { Plugin } from '../../core/registry/plugin';
|
|
8
|
+
/**
|
|
9
|
+
* The SDK versions this adapter is validated against, keyed by package name. The one
|
|
10
|
+
* `@ton/ton` library needs all three: `@ton/ton` and `@ton/core` both declare
|
|
11
|
+
* `@ton/crypto` as a peer, and `@ton/core` requires it at load time.
|
|
12
|
+
*/
|
|
13
|
+
export declare const TON_PEER_DEPENDENCIES: Readonly<Record<'@ton/ton' | '@ton/core' | '@ton/crypto', PeerDependency>>;
|
|
14
|
+
/**
|
|
15
|
+
* The `@ton/ton` manifest, built once, at module level, like the presets, so every
|
|
16
|
+
* `tonPlugin()` carries the same `load` function and registering it again is the same
|
|
17
|
+
* plugin: the registry compares functions by identity, and a different plugin under a
|
|
18
|
+
* registered name is `CONFIG_INVALID`. Its capabilities are exactly `TON_CAPABILITIES`:
|
|
19
|
+
* no `batch-transfer`, since a TON transfer carries one output (each message lands in its
|
|
20
|
+
* own transaction, so a batch could be partly delivered).
|
|
21
|
+
*/
|
|
22
|
+
export declare const tonManifest: AdapterManifest;
|
|
23
|
+
/** The built-in TON family: chain `ton`, networks mainnet and testnet. */
|
|
24
|
+
export declare function tonPlugin(): Plugin;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tonManifest = exports.TON_PEER_DEPENDENCIES = void 0;
|
|
4
|
+
exports.tonPlugin = tonPlugin;
|
|
5
|
+
const freeze_1 = require("../../core/util/freeze");
|
|
6
|
+
const chains_1 = require("./chains");
|
|
7
|
+
const network_1 = require("./network");
|
|
8
|
+
const presets_1 = require("./presets");
|
|
9
|
+
const tokens_1 = require("./tokens");
|
|
10
|
+
/**
|
|
11
|
+
* The SDK versions this adapter is validated against, keyed by package name. The one
|
|
12
|
+
* `@ton/ton` library needs all three: `@ton/ton` and `@ton/core` both declare
|
|
13
|
+
* `@ton/crypto` as a peer, and `@ton/core` requires it at load time.
|
|
14
|
+
*/
|
|
15
|
+
exports.TON_PEER_DEPENDENCIES = (0, freeze_1.deepFreeze)({
|
|
16
|
+
'@ton/ton': { name: '@ton/ton', range: '^16.3.0' },
|
|
17
|
+
'@ton/core': { name: '@ton/core', range: '^0.63.1' },
|
|
18
|
+
'@ton/crypto': { name: '@ton/crypto', range: '^3.3.0' },
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* The `@ton/ton` manifest, built once, at module level, like the presets, so every
|
|
22
|
+
* `tonPlugin()` carries the same `load` function and registering it again is the same
|
|
23
|
+
* plugin: the registry compares functions by identity, and a different plugin under a
|
|
24
|
+
* registered name is `CONFIG_INVALID`. Its capabilities are exactly `TON_CAPABILITIES`:
|
|
25
|
+
* no `batch-transfer`, since a TON transfer carries one output (each message lands in its
|
|
26
|
+
* own transaction, so a batch could be partly delivered).
|
|
27
|
+
*/
|
|
28
|
+
exports.tonManifest = Object.freeze({
|
|
29
|
+
family: 'ton',
|
|
30
|
+
library: '@ton/ton',
|
|
31
|
+
chains: Object.freeze(['ton']),
|
|
32
|
+
capabilities: network_1.TON_CAPABILITIES,
|
|
33
|
+
indexerCapabilities: network_1.TON_INDEXER_CAPABILITIES,
|
|
34
|
+
// Message → transaction resolution and trace-based finality need toncenter v3.
|
|
35
|
+
requiresIndexer: true,
|
|
36
|
+
peerDependencies: Object.freeze([
|
|
37
|
+
exports.TON_PEER_DEPENDENCIES['@ton/ton'],
|
|
38
|
+
exports.TON_PEER_DEPENDENCIES['@ton/core'],
|
|
39
|
+
exports.TON_PEER_DEPENDENCIES['@ton/crypto'],
|
|
40
|
+
]),
|
|
41
|
+
load: async () => {
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
43
|
+
const mod = require('./native-client');
|
|
44
|
+
return mod.tonLibraryDriverFactory;
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
/** The built-in TON family: chain `ton`, networks mainnet and testnet. */
|
|
48
|
+
function tonPlugin() {
|
|
49
|
+
return {
|
|
50
|
+
name: 'ton',
|
|
51
|
+
chains: chains_1.TON_CHAINS,
|
|
52
|
+
adapters: [exports.tonManifest],
|
|
53
|
+
presets: presets_1.TON_PRESETS,
|
|
54
|
+
assets: tokens_1.TON_TOKENS,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/adapters/ton/plugin.ts"],"names":[],"mappings":";;;AA2DA,8BAQC;AAxDD,mDAAoD;AACpD,qCAAsC;AACtC,uCAAuE;AACvE,uCAAwC;AACxC,qCAAsC;AAEtC;;;;GAIG;AACU,QAAA,qBAAqB,GAE9B,IAAA,mBAAU,EAAC;IACb,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;IAClD,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE;IACpD,aAAa,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;CACxD,CAAC,CAAC;AAEH;;;;;;;GAOG;AACU,QAAA,WAAW,GAAoB,MAAM,CAAC,MAAM,CAAC;IACxD,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9B,YAAY,EAAE,0BAAgB;IAC9B,mBAAmB,EAAE,kCAAwB;IAC7C,+EAA+E;IAC/E,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC;QAC9B,6BAAqB,CAAC,UAAU,CAAC;QACjC,6BAAqB,CAAC,WAAW,CAAC;QAClC,6BAAqB,CAAC,aAAa,CAAC;KACrC,CAAC;IACF,IAAI,EAAE,KAAK,IAA4B,EAAE;QACvC,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAqC,CAAC;QAC3E,OAAO,GAAG,CAAC,uBAAuB,CAAC;IACrC,CAAC;CACF,CAAC,CAAC;AAEH,0EAA0E;AAC1E,SAAgB,SAAS;IACvB,OAAO;QACL,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,mBAAU;QAClB,QAAQ,EAAE,CAAC,mBAAW,CAAC;QACvB,OAAO,EAAE,qBAAW;QACpB,MAAM,EAAE,mBAAU;KACnB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * The TON family plugin: the chain, jettons and toncenter presets as data, plus\n * one adapter manifest (library `@ton/ton`). SDK-free: only the manifest's `load()` requires\n * the library module, and with it the driver, `@ton/ton`, `@ton/core` and `@ton/crypto`.\n */\nimport type {\n AdapterManifest,\n DriverFactory,\n PeerDependency,\n} from '../../core/driver/types';\nimport type { Plugin } from '../../core/registry/plugin';\nimport { deepFreeze } from '../../core/util/freeze';\nimport { TON_CHAINS } from './chains';\nimport { TON_CAPABILITIES, TON_INDEXER_CAPABILITIES } from './network';\nimport { TON_PRESETS } from './presets';\nimport { TON_TOKENS } from './tokens';\n\n/**\n * The SDK versions this adapter is validated against, keyed by package name. The one\n * `@ton/ton` library needs all three: `@ton/ton` and `@ton/core` both declare\n * `@ton/crypto` as a peer, and `@ton/core` requires it at load time.\n */\nexport const TON_PEER_DEPENDENCIES: Readonly<\n Record<'@ton/ton' | '@ton/core' | '@ton/crypto', PeerDependency>\n> = deepFreeze({\n '@ton/ton': { name: '@ton/ton', range: '^16.3.0' },\n '@ton/core': { name: '@ton/core', range: '^0.63.1' },\n '@ton/crypto': { name: '@ton/crypto', range: '^3.3.0' },\n});\n\n/**\n * The `@ton/ton` manifest, built once, at module level, like the presets, so every\n * `tonPlugin()` carries the same `load` function and registering it again is the same\n * plugin: the registry compares functions by identity, and a different plugin under a\n * registered name is `CONFIG_INVALID`. Its capabilities are exactly `TON_CAPABILITIES`:\n * no `batch-transfer`, since a TON transfer carries one output (each message lands in its\n * own transaction, so a batch could be partly delivered).\n */\nexport const tonManifest: AdapterManifest = Object.freeze({\n family: 'ton',\n library: '@ton/ton',\n chains: Object.freeze(['ton']),\n capabilities: TON_CAPABILITIES,\n indexerCapabilities: TON_INDEXER_CAPABILITIES,\n // Message → transaction resolution and trace-based finality need toncenter v3.\n requiresIndexer: true,\n peerDependencies: Object.freeze([\n TON_PEER_DEPENDENCIES['@ton/ton'],\n TON_PEER_DEPENDENCIES['@ton/core'],\n TON_PEER_DEPENDENCIES['@ton/crypto'],\n ]),\n load: async (): Promise<DriverFactory> => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('./native-client') as typeof import('./native-client');\n return mod.tonLibraryDriverFactory;\n },\n});\n\n/** The built-in TON family: chain `ton`, networks mainnet and testnet. */\nexport function tonPlugin(): Plugin {\n return {\n name: 'ton',\n chains: TON_CHAINS,\n adapters: [tonManifest],\n presets: TON_PRESETS,\n assets: TON_TOKENS,\n };\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ProviderPreset } from '../../core/registry/providers';
|
|
2
|
+
/**
|
|
3
|
+
* Built once at module level, so the plugin's functions keep their identity and
|
|
4
|
+
* registering the plugin again is the same plugin.
|
|
5
|
+
*/
|
|
6
|
+
export declare const TON_PRESETS: readonly ProviderPreset[];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TON_PRESETS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* TON provider presets: toncenter's API v2 (a liteserver proxy, the `rpc` endpoint) and
|
|
6
|
+
* API v3 (its indexer). Base URLs, the `X-API-Key` header and the limits (1 request per
|
|
7
|
+
* second keyless, 10 with a free key) are verified against docs.ton.org and toncenter's
|
|
8
|
+
* own API descriptions, and the 429s were reproduced live. The key travels in a header
|
|
9
|
+
* whose value is a `Secret`, so it never reaches logs, errors or events.
|
|
10
|
+
*
|
|
11
|
+
* One toncenter limit covers every request to a network, v2 and v3 alike (per IP keyless,
|
|
12
|
+
* per account with a key), so each API's endpoint gets half of it. Health probes take
|
|
13
|
+
* their tokens from the same buckets. The split holds on average only: after idle time
|
|
14
|
+
* each API's bucket holds its burst of one token (keyless by default, keyed set
|
|
15
|
+
* explicitly: with the default burst of five, v2 and v3 together sent about 18 requests
|
|
16
|
+
* in the first second) and refills at its rate, so v2 and v3 together can send 2 requests
|
|
17
|
+
* in the first second keyless (limit 1) and 12 with a key (limit 10); toncenter's 429
|
|
18
|
+
* then comes back as a retryable `RATE_LIMITED`.
|
|
19
|
+
*/
|
|
20
|
+
const error_1 = require("../../core/errors/error");
|
|
21
|
+
const secret_1 = require("../../core/secret/secret");
|
|
22
|
+
const freeze_1 = require("../../core/util/freeze");
|
|
23
|
+
const HOSTS = Object.freeze({
|
|
24
|
+
mainnet: 'https://toncenter.com',
|
|
25
|
+
testnet: 'https://testnet.toncenter.com',
|
|
26
|
+
});
|
|
27
|
+
const API = Object.freeze({
|
|
28
|
+
rpc: '/api/v2',
|
|
29
|
+
indexer: '/api/v3',
|
|
30
|
+
});
|
|
31
|
+
/** Own keys only: `constructor`, `toString` or `__proto__` is not a network. */
|
|
32
|
+
const supports = (chain, network) => chain === 'ton' && Object.hasOwn(HOSTS, network);
|
|
33
|
+
function baseUrl(kind, input) {
|
|
34
|
+
// Unreachable through the catalog, which asks `supports` first.
|
|
35
|
+
if (!Object.hasOwn(HOSTS, input.network)) {
|
|
36
|
+
throw new Error(`no toncenter host for ${input.network}`);
|
|
37
|
+
}
|
|
38
|
+
return `${HOSTS[input.network]}${API[kind]}`;
|
|
39
|
+
}
|
|
40
|
+
/** The revealed key; the error names the preset and network, never the key. */
|
|
41
|
+
function apiKeyOf(input) {
|
|
42
|
+
const key = input.apiKey === undefined ? undefined : (0, secret_1.reveal)(input.apiKey);
|
|
43
|
+
if (typeof key !== 'string' || key.trim() === '') {
|
|
44
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `provider preset 'toncenter' requires a non-empty apiKey for ${input.chain}:${input.network}`);
|
|
45
|
+
}
|
|
46
|
+
return key;
|
|
47
|
+
}
|
|
48
|
+
function keyless(kind) {
|
|
49
|
+
return {
|
|
50
|
+
name: 'public',
|
|
51
|
+
kind,
|
|
52
|
+
production: false,
|
|
53
|
+
supports,
|
|
54
|
+
endpoints: (input) => [
|
|
55
|
+
{
|
|
56
|
+
name: 'toncenter',
|
|
57
|
+
url: baseUrl(kind, input),
|
|
58
|
+
// Half of the keyless 1 request per second, shared with the other API.
|
|
59
|
+
rateLimit: { rps: 0.5 },
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function keyed(kind) {
|
|
65
|
+
return {
|
|
66
|
+
name: 'toncenter',
|
|
67
|
+
kind,
|
|
68
|
+
requiresApiKey: true,
|
|
69
|
+
supports,
|
|
70
|
+
endpoints: (input) => [
|
|
71
|
+
{
|
|
72
|
+
name: 'toncenter',
|
|
73
|
+
url: baseUrl(kind, input),
|
|
74
|
+
headers: { 'X-API-Key': (0, secret_1.secret)(apiKeyOf(input)) },
|
|
75
|
+
// Half of the free-key limit of 10 requests per second
|
|
76
|
+
// (docs.ton.org/api/rate-limit), shared with the other API, with a burst of one
|
|
77
|
+
// rather than the default of five; a paid key overrides it with a custom endpoint
|
|
78
|
+
// config.
|
|
79
|
+
rateLimit: { rps: 5, burst: 1 },
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Built once at module level, so the plugin's functions keep their identity and
|
|
86
|
+
* registering the plugin again is the same plugin.
|
|
87
|
+
*/
|
|
88
|
+
exports.TON_PRESETS = (0, freeze_1.deepFreeze)([
|
|
89
|
+
keyless('rpc'),
|
|
90
|
+
keyless('indexer'),
|
|
91
|
+
keyed('rpc'),
|
|
92
|
+
keyed('indexer'),
|
|
93
|
+
]);
|
|
94
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/adapters/ton/presets.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;GAeG;AACH,mDAAsD;AAEtD,qDAA0D;AAE1D,mDAAoD;AAEpD,MAAM,KAAK,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC5D,OAAO,EAAE,uBAAuB;IAChC,OAAO,EAAE,+BAA+B;CACzC,CAAC,CAAC;AAEH,MAAM,GAAG,GAAgD,MAAM,CAAC,MAAM,CAAC;IACrE,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH,gFAAgF;AAChF,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,OAAe,EAAW,EAAE,CAC3D,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAEnD,SAAS,OAAO,CAAC,IAAuB,EAAE,KAAkB;IAC1D,gEAAgE;IAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,+EAA+E;AAC/E,SAAS,QAAQ,CAAC,KAAkB;IAClC,MAAM,GAAG,GAAY,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,eAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,mBAAW,CACnB,gBAAgB,EAChB,+DAA+D,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAC9F,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAC,IAAuB;IACtC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,UAAU,EAAE,KAAK;QACjB,QAAQ;QACR,SAAS,EAAE,CAAC,KAAK,EAA6B,EAAE,CAAC;YAC/C;gBACE,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;gBACzB,uEAAuE;gBACvE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;aACxB;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,IAAuB;IACpC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI;QACJ,cAAc,EAAE,IAAI;QACpB,QAAQ;QACR,SAAS,EAAE,CAAC,KAAK,EAA6B,EAAE,CAAC;YAC/C;gBACE,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;gBACzB,OAAO,EAAE,EAAE,WAAW,EAAE,IAAA,eAAM,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE;gBACjD,uDAAuD;gBACvD,gFAAgF;gBAChF,kFAAkF;gBAClF,UAAU;gBACV,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aAChC;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACU,QAAA,WAAW,GAA8B,IAAA,mBAAU,EAAC;IAC/D,OAAO,CAAC,KAAK,CAAC;IACd,OAAO,CAAC,SAAS,CAAC;IAClB,KAAK,CAAC,KAAK,CAAC;IACZ,KAAK,CAAC,SAAS,CAAC;CACjB,CAAC,CAAC","sourcesContent":["/**\n * TON provider presets: toncenter's API v2 (a liteserver proxy, the `rpc` endpoint) and\n * API v3 (its indexer). Base URLs, the `X-API-Key` header and the limits (1 request per\n * second keyless, 10 with a free key) are verified against docs.ton.org and toncenter's\n * own API descriptions, and the 429s were reproduced live. The key travels in a header\n * whose value is a `Secret`, so it never reaches logs, errors or events.\n *\n * One toncenter limit covers every request to a network, v2 and v3 alike (per IP keyless,\n * per account with a key), so each API's endpoint gets half of it. Health probes take\n * their tokens from the same buckets. The split holds on average only: after idle time\n * each API's bucket holds its burst of one token (keyless by default, keyed set\n * explicitly: with the default burst of five, v2 and v3 together sent about 18 requests\n * in the first second) and refills at its rate, so v2 and v3 together can send 2 requests\n * in the first second keyless (limit 1) and 12 with a key (limit 10); toncenter's 429\n * then comes back as a retryable `RATE_LIMITED`.\n */\nimport { ConfigError } from '../../core/errors/error';\nimport type { PresetInput, ProviderPreset } from '../../core/registry/providers';\nimport { reveal, secret } from '../../core/secret/secret';\nimport type { EndpointConfig } from '../../core/transport/types';\nimport { deepFreeze } from '../../core/util/freeze';\n\nconst HOSTS: Readonly<Record<string, string>> = Object.freeze({\n mainnet: 'https://toncenter.com',\n testnet: 'https://testnet.toncenter.com',\n});\n\nconst API: Readonly<Record<'rpc' | 'indexer', string>> = Object.freeze({\n rpc: '/api/v2',\n indexer: '/api/v3',\n});\n\n/** Own keys only: `constructor`, `toString` or `__proto__` is not a network. */\nconst supports = (chain: string, network: string): boolean =>\n chain === 'ton' && Object.hasOwn(HOSTS, network);\n\nfunction baseUrl(kind: 'rpc' | 'indexer', input: PresetInput): string {\n // Unreachable through the catalog, which asks `supports` first.\n if (!Object.hasOwn(HOSTS, input.network)) {\n throw new Error(`no toncenter host for ${input.network}`);\n }\n return `${HOSTS[input.network]}${API[kind]}`;\n}\n\n/** The revealed key; the error names the preset and network, never the key. */\nfunction apiKeyOf(input: PresetInput): string {\n const key: unknown = input.apiKey === undefined ? undefined : reveal(input.apiKey);\n if (typeof key !== 'string' || key.trim() === '') {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `provider preset 'toncenter' requires a non-empty apiKey for ${input.chain}:${input.network}`,\n );\n }\n return key;\n}\n\nfunction keyless(kind: 'rpc' | 'indexer'): ProviderPreset {\n return {\n name: 'public',\n kind,\n production: false,\n supports,\n endpoints: (input): readonly EndpointConfig[] => [\n {\n name: 'toncenter',\n url: baseUrl(kind, input),\n // Half of the keyless 1 request per second, shared with the other API.\n rateLimit: { rps: 0.5 },\n },\n ],\n };\n}\n\nfunction keyed(kind: 'rpc' | 'indexer'): ProviderPreset {\n return {\n name: 'toncenter',\n kind,\n requiresApiKey: true,\n supports,\n endpoints: (input): readonly EndpointConfig[] => [\n {\n name: 'toncenter',\n url: baseUrl(kind, input),\n headers: { 'X-API-Key': secret(apiKeyOf(input)) },\n // Half of the free-key limit of 10 requests per second\n // (docs.ton.org/api/rate-limit), shared with the other API, with a burst of one\n // rather than the default of five; a paid key overrides it with a custom endpoint\n // config.\n rateLimit: { rps: 5, burst: 1 },\n },\n ],\n };\n}\n\n/**\n * Built once at module level, so the plugin's functions keep their identity and\n * registering the plugin again is the same plugin.\n */\nexport const TON_PRESETS: readonly ProviderPreset[] = deepFreeze([\n keyless('rpc'),\n keyless('indexer'),\n keyed('rpc'),\n keyed('indexer'),\n]);\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { AddressHistorySource, ProofSource } from '../../core/driver/types';
|
|
2
|
+
import { type BlockHeader } from './api';
|
|
3
|
+
import { type TonContext } from './reader';
|
|
4
|
+
/** How far back the consumer of a seqno is searched: pages of `CONSUMER_PAGE` transactions. */
|
|
5
|
+
export declare const CONSUMER_PAGES = 8;
|
|
6
|
+
/** How far the chain is walked: pages of `WALK_PAGE` transactions. */
|
|
7
|
+
export declare const WALK_PAGES = 16;
|
|
8
|
+
/**
|
|
9
|
+
* The one unanchored head: one endpoint's head, trailed by the network's skew and
|
|
10
|
+
* attested by the quorum; when a healthy peer trails further, retried at the transport's
|
|
11
|
+
* lag tolerance, the furthest a proof endpoint may trail. Never a false head, only a
|
|
12
|
+
* later one.
|
|
13
|
+
*/
|
|
14
|
+
export declare function attestedHead(ctx: TonContext): Promise<BlockHeader>;
|
|
15
|
+
/**
|
|
16
|
+
* No block after `header` can include a message valid until `validUntil`: the
|
|
17
|
+
* masterchain block and every shard top it commits are at least that old, every later block
|
|
18
|
+
* of a shard is younger than its top (the collator's `now` rises), and a wallet rejects a
|
|
19
|
+
* message once `valid_until <= now()`. The shard tops are asked for the attested block's
|
|
20
|
+
* seqno; toncenter's answer names no block (live), so only the proof quorum binds the list
|
|
21
|
+
* to it, and it must cover the basechain. Each top's header is read under the quorum
|
|
22
|
+
* and bound to the id the list gives. A lifetime that is no time decides nothing.
|
|
23
|
+
*/
|
|
24
|
+
export declare function expiredAt(ctx: TonContext, header: BlockHeader, validUntil: number): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Stored bytes about to be sent again: the wallet they go to (raw), their TEP-467 hash, and
|
|
27
|
+
* the seqno and lifetime their signed header carries. `validFrom` is the build's recorded
|
|
28
|
+
* chain time when this driver assembled them; otherwise the widest lifetime applies.
|
|
29
|
+
*/
|
|
30
|
+
export interface StoredMessage {
|
|
31
|
+
readonly wallet: string;
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly seqno: bigint;
|
|
34
|
+
readonly validUntil: number;
|
|
35
|
+
readonly validFrom?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Whether stored bytes may go out again. A wallet reset (a deletion, then a deposit,
|
|
39
|
+
* or a re-deploy from the public `StateInit` back to our seqno) makes a message that already
|
|
40
|
+
* ran and paid runnable again while it is valid, so every send of stored bytes asks first:
|
|
41
|
+
* - `send`: the wallet's seqno is already above ours under the proof quorum, so the message
|
|
42
|
+
* cannot run (no walk); or the chain shows it cannot have run: the walk reaches the
|
|
43
|
+
* earliest time it could have run (`windowStartOf`, from the recorded build time, else
|
|
44
|
+
* the widest lifetime) with no reset, or a chain start whose earlier history shows the
|
|
45
|
+
* code never ran (a wallet funded a minute ago is sent to);
|
|
46
|
+
* - `ours`: the chain holds our message run to the end: it must never be sent again.
|
|
47
|
+
* The walk starts from the freshest state an endpoint serves (the attested head trails it
|
|
48
|
+
* by 10 to 150 blocks, and a reset in that trail is exactly the danger), and must lead
|
|
49
|
+
* down to the attested state's last transaction, so a lying fresh endpoint can hide only
|
|
50
|
+
* what the attested walk could not see either. Anything else, including a deletion or a
|
|
51
|
+
* new chain since the attested head, an activation or a destruction in the window, a walk
|
|
52
|
+
* past its cap, an indexer behind the fresh block or a failed read, throws a retryable
|
|
53
|
+
* error: the guard never sends while it cannot decide, and the proof decides.
|
|
54
|
+
* Known gap: once a wallet is reset (which takes software that shares its key), anyone
|
|
55
|
+
* can replay our message from the chain's public record; no client can stop that, and the
|
|
56
|
+
* guard covers only this library's own sends.
|
|
57
|
+
*/
|
|
58
|
+
export declare function replayVerdict(ctx: TonContext, message: StoredMessage): Promise<'send' | 'ours'>;
|
|
59
|
+
export declare function createTonProofs(ctx: TonContext): ProofSource;
|
|
60
|
+
/**
|
|
61
|
+
* An address's transactions from the indexer, newest first, decoded with jettons only for
|
|
62
|
+
* verified jetton wallets. The cursor is the next page's `end_lt`, taken from the page as
|
|
63
|
+
* the indexer served it, so rows not final yet never end the history early; a page
|
|
64
|
+
* is at most what toncenter serves.
|
|
65
|
+
*/
|
|
66
|
+
export declare function createTonHistory(ctx: TonContext): AddressHistorySource;
|