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,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transferLanded = transferLanded;
|
|
4
|
+
exports.chainVerdict = chainVerdict;
|
|
5
|
+
exports.verdictOf = verdictOf;
|
|
6
|
+
exports.decodeTransaction = decodeTransaction;
|
|
7
|
+
const bytes_1 = require("../../core/util/bytes");
|
|
8
|
+
const abi_1 = require("./abi");
|
|
9
|
+
const address_1 = require("./address");
|
|
10
|
+
const http_1 = require("./http");
|
|
11
|
+
/** VM receipt results with a reason of their own; any other failure is generic. */
|
|
12
|
+
const FAILURE_REASONS = new Map([
|
|
13
|
+
['OUT_OF_ENERGY', 'out of energy'],
|
|
14
|
+
['REVERT', 'reverted'],
|
|
15
|
+
]);
|
|
16
|
+
/** A contract call that also sends TRX or a TRC-10 token: never a plain TRC-20 transfer. */
|
|
17
|
+
function carriesValue(contract) {
|
|
18
|
+
return (contract.type === 'TriggerSmartContract' &&
|
|
19
|
+
(contract.callValue !== undefined ||
|
|
20
|
+
contract.callTokenValue !== undefined ||
|
|
21
|
+
contract.tokenId !== undefined));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The chain's own verdict, from strictly read fields (no evidence check). The VM writes a
|
|
25
|
+
* receipt result for every call it runs (`TransactionTrace.setResult`), `ret[0].contractRet`
|
|
26
|
+
* repeats it, and the info's `FAILED` is set exactly when the call did not succeed
|
|
27
|
+
* (`TransactionUtil.buildTransactionInfoInstance`, GreatVoyage-v4.8.2.2 `d5c3d1d1`). Other
|
|
28
|
+
* contracts carry no receipt result: java-tron never includes one whose execution failed,
|
|
29
|
+
* and blocks from 2018 carry no `ret` at all (mainnet block 2,000,000), so inclusion is
|
|
30
|
+
* their success unless the node reports a failure.
|
|
31
|
+
*/
|
|
32
|
+
function executed(raw, tx, info) {
|
|
33
|
+
// Bound to the id asked for: another transaction's receipt decides nothing.
|
|
34
|
+
if (info.id !== tx.id)
|
|
35
|
+
throw (0, http_1.malformed)('transaction info');
|
|
36
|
+
const vm = raw
|
|
37
|
+
? raw.contract.type === 'TriggerSmartContract'
|
|
38
|
+
: info.receiptResult !== undefined;
|
|
39
|
+
if (vm) {
|
|
40
|
+
const result = info.receiptResult;
|
|
41
|
+
if (result === undefined)
|
|
42
|
+
throw (0, http_1.malformed)('receipt result');
|
|
43
|
+
if (tx.contractRet !== undefined && tx.contractRet !== result) {
|
|
44
|
+
throw (0, http_1.malformed)('contractRet');
|
|
45
|
+
}
|
|
46
|
+
if (result !== 'SUCCESS') {
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
reason: FAILURE_REASONS.get(result) ?? 'contract execution failed',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
if (info.failed)
|
|
53
|
+
throw (0, http_1.malformed)('result');
|
|
54
|
+
return { success: true };
|
|
55
|
+
}
|
|
56
|
+
if (info.failed || (tx.contractRet !== undefined && tx.contractRet !== 'SUCCESS')) {
|
|
57
|
+
return { success: false, reason: 'execution failed' };
|
|
58
|
+
}
|
|
59
|
+
return { success: true };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* What the called token logged for a TRC-20 `transfer(to, …)`. `landed`: a `Transfer`
|
|
63
|
+
* from the sender to that recipient of any positive amount, from the called contract.
|
|
64
|
+
* `unreadable`: nothing landed, and the contract logged a `Transfer` event that does not
|
|
65
|
+
* read as one (its value indexed, say).
|
|
66
|
+
* A call with a value, or with data that is not a canonical `transfer`, is `absent`.
|
|
67
|
+
*/
|
|
68
|
+
function transferEvidence(raw, info) {
|
|
69
|
+
const { contract } = raw;
|
|
70
|
+
if (contract.type !== 'TriggerSmartContract')
|
|
71
|
+
return 'landed';
|
|
72
|
+
if (carriesValue(contract))
|
|
73
|
+
return 'absent';
|
|
74
|
+
const call = (0, abi_1.decodeTransferCall)(contract.data);
|
|
75
|
+
if (call === null)
|
|
76
|
+
return 'absent';
|
|
77
|
+
const emitter = contract.contract.slice(2);
|
|
78
|
+
let unreadable = false;
|
|
79
|
+
for (const log of info.logs) {
|
|
80
|
+
if (log.address !== emitter)
|
|
81
|
+
continue;
|
|
82
|
+
const event = (0, abi_1.decodeTransferLog)(log);
|
|
83
|
+
if (event === null) {
|
|
84
|
+
if (log.topics[0] === abi_1.TRANSFER_TOPIC)
|
|
85
|
+
unreadable = true;
|
|
86
|
+
}
|
|
87
|
+
else if (event.from === contract.owner &&
|
|
88
|
+
event.to === call.to &&
|
|
89
|
+
event.amount > 0n) {
|
|
90
|
+
return 'landed';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return unreadable ? 'unreadable' : 'absent';
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* A TRC-20 `transfer(to, …)` counts only if the called token
|
|
97
|
+
* contract logged a `Transfer` from the sender to that recipient. Any positive amount counts:
|
|
98
|
+
* a fee-on-transfer token (Tron USDT has a dormant fee switch) logs less than the call's
|
|
99
|
+
* amount, and requiring the exact amount would prove a transfer that moved `failed`. A call
|
|
100
|
+
* that also sends TRX or a TRC-10 token, or whose data is not a canonical `transfer`, is never
|
|
101
|
+
* a plain TRC-20 transfer. Decoding reports the amounts that actually moved.
|
|
102
|
+
*/
|
|
103
|
+
function transferLanded(raw, info) {
|
|
104
|
+
return transferEvidence(raw, info) === 'landed';
|
|
105
|
+
}
|
|
106
|
+
/** The chain's own view of an included transaction (no evidence check: not a verdict). */
|
|
107
|
+
function chainVerdict(codec, tx, info) {
|
|
108
|
+
return executed(codec.readRaw(tx.rawHex), tx, info);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The verdict of our own included transaction (observe with an ordering, `includedFinal`).
|
|
112
|
+
* The driver built it, so its bytes read, its call is a canonical `transfer` that sends no
|
|
113
|
+
* value, a node's answer for it carries `contractRet`, and a TRX transfer in a block executed;
|
|
114
|
+
* anything else contradicts the signed transaction or the chain's rules and decides nothing
|
|
115
|
+
* (retryable), as does a token `Transfer` event that does not read.
|
|
116
|
+
*/
|
|
117
|
+
function verdictOf(codec, tx, info) {
|
|
118
|
+
const raw = codec.readRaw(tx.rawHex);
|
|
119
|
+
if (raw === null)
|
|
120
|
+
throw (0, http_1.malformed)('raw_data_hex');
|
|
121
|
+
if (tx.contractRet === undefined)
|
|
122
|
+
throw (0, http_1.malformed)('contractRet');
|
|
123
|
+
if (carriesValue(raw.contract))
|
|
124
|
+
throw (0, http_1.malformed)('call value');
|
|
125
|
+
// An included TransferContract executed (java-tron never includes one that
|
|
126
|
+
// failed), so any other answer on our own is impossible: a false `failed` on a proof path
|
|
127
|
+
// would invite a second payment. The chain's view reports what the node says.
|
|
128
|
+
if (raw.contract.type === 'TransferContract' &&
|
|
129
|
+
(tx.contractRet !== 'SUCCESS' || info.failed)) {
|
|
130
|
+
throw (0, http_1.malformed)('contractRet');
|
|
131
|
+
}
|
|
132
|
+
// Our own TRC-20 call is a canonical `transfer(to, amount)` (the builder
|
|
133
|
+
// writes nothing else), so other call data contradicts the signed transaction.
|
|
134
|
+
if (raw.contract.type === 'TriggerSmartContract' &&
|
|
135
|
+
(0, abi_1.decodeTransferCall)(raw.contract.data) === null) {
|
|
136
|
+
throw (0, http_1.malformed)('call data');
|
|
137
|
+
}
|
|
138
|
+
const chain = executed(raw, tx, info);
|
|
139
|
+
if (!chain.success)
|
|
140
|
+
return chain;
|
|
141
|
+
const evidence = transferEvidence(raw, info);
|
|
142
|
+
if (evidence === 'unreadable')
|
|
143
|
+
throw (0, http_1.malformed)('Transfer log');
|
|
144
|
+
return evidence === 'landed'
|
|
145
|
+
? chain
|
|
146
|
+
: { success: false, reason: 'token transfer not evidenced' };
|
|
147
|
+
}
|
|
148
|
+
const UTF8 = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
|
|
149
|
+
/**
|
|
150
|
+
* The memo (`raw_data.data`) as text: `undefined` without one, `null` when its bytes are not
|
|
151
|
+
* UTF-8 (replacement characters would make two different memos read the same). Any size the
|
|
152
|
+
* chain accepts reads: the driver's own 256-byte cap applies to what it writes.
|
|
153
|
+
*/
|
|
154
|
+
function memoOf(raw) {
|
|
155
|
+
if (raw.data === undefined)
|
|
156
|
+
return undefined;
|
|
157
|
+
try {
|
|
158
|
+
return UTF8.decode((0, bytes_1.fromHex)(raw.data));
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** A canonical `T…` address, or `null` for bytes that are not one (never thrown). */
|
|
165
|
+
function base58(hex) {
|
|
166
|
+
try {
|
|
167
|
+
return (0, address_1.toBase58Address)(hex);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Any transaction as the chain reports it. `info` and `blockHash` come together for an
|
|
175
|
+
* included transaction; `pending` marks one the node holds in its pool.
|
|
176
|
+
*/
|
|
177
|
+
function decodeTransaction(codec, tx, info, blockHash, pending = false) {
|
|
178
|
+
if (info !== null && blockHash === undefined)
|
|
179
|
+
throw (0, http_1.notServable)();
|
|
180
|
+
const raw = codec.readRaw(tx.rawHex);
|
|
181
|
+
const chain = info ? executed(raw, tx, info) : undefined;
|
|
182
|
+
const observation = info && chain && blockHash !== undefined
|
|
183
|
+
? {
|
|
184
|
+
seen: 'block',
|
|
185
|
+
txHash: tx.id,
|
|
186
|
+
blockHeight: info.blockNumber,
|
|
187
|
+
blockHash,
|
|
188
|
+
success: chain.success,
|
|
189
|
+
...(chain.reason ? { reason: chain.reason } : {}),
|
|
190
|
+
}
|
|
191
|
+
: pending
|
|
192
|
+
? { seen: 'mempool', txHash: tx.id }
|
|
193
|
+
: { seen: 'none' };
|
|
194
|
+
const memo = raw ? memoOf(raw) : undefined;
|
|
195
|
+
const owner = raw ? base58(raw.contract.owner) : null;
|
|
196
|
+
const transfers = [];
|
|
197
|
+
let decoding = 'complete';
|
|
198
|
+
/** A movement with the memo; `null` (an address that does not read) is left out. */
|
|
199
|
+
const add = (transfer) => {
|
|
200
|
+
if (!transfer)
|
|
201
|
+
decoding = 'partial';
|
|
202
|
+
else
|
|
203
|
+
transfers.push(typeof memo === 'string' ? { ...transfer, memo } : transfer);
|
|
204
|
+
};
|
|
205
|
+
const native = (to, amount) => {
|
|
206
|
+
const recipient = base58(to);
|
|
207
|
+
add(owner && recipient
|
|
208
|
+
? {
|
|
209
|
+
locator: 'native',
|
|
210
|
+
from: [owner],
|
|
211
|
+
to: recipient,
|
|
212
|
+
asset: 'native',
|
|
213
|
+
amount,
|
|
214
|
+
source: 'native',
|
|
215
|
+
}
|
|
216
|
+
: null);
|
|
217
|
+
};
|
|
218
|
+
if (raw === null) {
|
|
219
|
+
decoding = 'none';
|
|
220
|
+
}
|
|
221
|
+
else if (!info) {
|
|
222
|
+
decoding = 'partial';
|
|
223
|
+
}
|
|
224
|
+
else if (chain?.success) {
|
|
225
|
+
if (memo === null)
|
|
226
|
+
decoding = 'partial';
|
|
227
|
+
const { contract } = raw;
|
|
228
|
+
if (contract.type === 'TransferContract') {
|
|
229
|
+
native(contract.to, contract.amount);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
// Value can move without a log (internal transfers), and a TRC-10 value has no asset
|
|
233
|
+
// here: a contract call is partial.
|
|
234
|
+
decoding = 'partial';
|
|
235
|
+
if (contract.callValue !== undefined)
|
|
236
|
+
native(contract.contract, contract.callValue);
|
|
237
|
+
info.logs.forEach((log, index) => {
|
|
238
|
+
const event = (0, abi_1.decodeTransferLog)(log);
|
|
239
|
+
if (!event)
|
|
240
|
+
return;
|
|
241
|
+
const from = base58(event.from);
|
|
242
|
+
const to = base58(event.to);
|
|
243
|
+
const token = base58(`41${log.address}`);
|
|
244
|
+
add(from && to && token
|
|
245
|
+
? {
|
|
246
|
+
locator: `log:${index}`,
|
|
247
|
+
from: [from],
|
|
248
|
+
to,
|
|
249
|
+
asset: { standard: 'trc20', contract: token },
|
|
250
|
+
amount: event.amount,
|
|
251
|
+
source: 'token-event',
|
|
252
|
+
}
|
|
253
|
+
: null);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const call = raw?.contract.type === 'TriggerSmartContract' ? raw.contract : undefined;
|
|
258
|
+
return {
|
|
259
|
+
id: tx.id,
|
|
260
|
+
observation,
|
|
261
|
+
...(info ? { fee: [{ asset: 'native', amount: info.fee }] } : {}),
|
|
262
|
+
transfers,
|
|
263
|
+
decoding,
|
|
264
|
+
// The block's time: the client-set `raw_data.timestamp` is display only.
|
|
265
|
+
...(info ? { timestamp: info.blockTimestamp } : {}),
|
|
266
|
+
details: {
|
|
267
|
+
contract: raw?.contract.type ?? 'unknown',
|
|
268
|
+
...(owner ? { owner } : {}),
|
|
269
|
+
...(tx.contractRet !== undefined ? { result: tx.contractRet } : {}),
|
|
270
|
+
...(info?.receiptResult !== undefined ? { receipt: info.receiptResult } : {}),
|
|
271
|
+
...(raw?.feeLimit !== undefined ? { feeLimit: BigInt(raw.feeLimit) } : {}),
|
|
272
|
+
...(call?.callValue !== undefined ? { callValue: call.callValue } : {}),
|
|
273
|
+
...(call?.callTokenValue !== undefined
|
|
274
|
+
? { callTokenValue: call.callTokenValue }
|
|
275
|
+
: {}),
|
|
276
|
+
...(call?.tokenId !== undefined ? { tokenId: call.tokenId } : {}),
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../src/adapters/tron/decode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Chain transactions into `DriverTransaction`s, and the verdict of our own transfers.\n * - General decoding (reads, scans, history) reports execution as the chain does: a TRX\n * transfer is `native`, and so is the TRX a contract call sends; each TRC-20 `Transfer`\n * log is a `token-event` (`log:<i>`); contract execution is `partial` (value may move\n * without a log), a failed transaction moved nothing and is `complete`, and a contract\n * type this model does not carry is `none`.\n * - The verdict of our own Attempts (observe with an ordering, and the proofs) also\n * requires on-chain evidence that value moved: a TRC-20 `transfer(to, amount)` counts\n * only with a `Transfer(owner, to, any positive amount)` log from the called contract.\n * Execution success alone proves nothing: a token can succeed and move nothing, and\n * USDT on Tron returns a zero word from `transfer`.\n * - Verdict fields are read strictly: a missing, ill-typed or contradicting one\n * is a malformed answer (retryable), which decides nothing, never a default. Decoding stays\n * lenient on what the chain accepts: an unknown contract type, a memo of any size or bytes.\n * - `readRaw`'s `timestamp` and `feeLimit` are display only: no verdict or amount uses them.\n * Failure reasons are fixed literals: a node's text can carry addresses or amounts, and a\n * stored reason must never hold either.\n */\nimport type {\n DriverTransaction,\n DriverTransfer,\n DriverTxObservation,\n} from '../../core/driver/types';\nimport { fromHex } from '../../core/util/bytes';\nimport { TRANSFER_TOPIC, decodeTransferCall, decodeTransferLog } from './abi';\nimport { toBase58Address } from './address';\nimport { malformed, notServable, type TronTxInfo, type TronTxJson } from './http';\nimport type { TronCodec, TronContract, TronRawData } from './types';\n\nexport interface TxVerdict {\n readonly success: boolean;\n readonly reason?: string;\n}\n\n/** VM receipt results with a reason of their own; any other failure is generic. */\nconst FAILURE_REASONS: ReadonlyMap<string, string> = new Map([\n ['OUT_OF_ENERGY', 'out of energy'],\n ['REVERT', 'reverted'],\n]);\n\n/** A contract call that also sends TRX or a TRC-10 token: never a plain TRC-20 transfer. */\nfunction carriesValue(contract: TronContract): boolean {\n return (\n contract.type === 'TriggerSmartContract' &&\n (contract.callValue !== undefined ||\n contract.callTokenValue !== undefined ||\n contract.tokenId !== undefined)\n );\n}\n\n/**\n * The chain's own verdict, from strictly read fields (no evidence check). The VM writes a\n * receipt result for every call it runs (`TransactionTrace.setResult`), `ret[0].contractRet`\n * repeats it, and the info's `FAILED` is set exactly when the call did not succeed\n * (`TransactionUtil.buildTransactionInfoInstance`, GreatVoyage-v4.8.2.2 `d5c3d1d1`). Other\n * contracts carry no receipt result: java-tron never includes one whose execution failed,\n * and blocks from 2018 carry no `ret` at all (mainnet block 2,000,000), so inclusion is\n * their success unless the node reports a failure.\n */\nfunction executed(raw: TronRawData | null, tx: TronTxJson, info: TronTxInfo): TxVerdict {\n // Bound to the id asked for: another transaction's receipt decides nothing.\n if (info.id !== tx.id) throw malformed('transaction info');\n const vm = raw\n ? raw.contract.type === 'TriggerSmartContract'\n : info.receiptResult !== undefined;\n if (vm) {\n const result = info.receiptResult;\n if (result === undefined) throw malformed('receipt result');\n if (tx.contractRet !== undefined && tx.contractRet !== result) {\n throw malformed('contractRet');\n }\n if (result !== 'SUCCESS') {\n return {\n success: false,\n reason: FAILURE_REASONS.get(result) ?? 'contract execution failed',\n };\n }\n if (info.failed) throw malformed('result');\n return { success: true };\n }\n if (info.failed || (tx.contractRet !== undefined && tx.contractRet !== 'SUCCESS')) {\n return { success: false, reason: 'execution failed' };\n }\n return { success: true };\n}\n\ntype Evidence = 'landed' | 'absent' | 'unreadable';\n\n/**\n * What the called token logged for a TRC-20 `transfer(to, …)`. `landed`: a `Transfer`\n * from the sender to that recipient of any positive amount, from the called contract.\n * `unreadable`: nothing landed, and the contract logged a `Transfer` event that does not\n * read as one (its value indexed, say).\n * A call with a value, or with data that is not a canonical `transfer`, is `absent`.\n */\nfunction transferEvidence(raw: TronRawData, info: TronTxInfo): Evidence {\n const { contract } = raw;\n if (contract.type !== 'TriggerSmartContract') return 'landed';\n if (carriesValue(contract)) return 'absent';\n const call = decodeTransferCall(contract.data);\n if (call === null) return 'absent';\n const emitter = contract.contract.slice(2);\n let unreadable = false;\n for (const log of info.logs) {\n if (log.address !== emitter) continue;\n const event = decodeTransferLog(log);\n if (event === null) {\n if (log.topics[0] === TRANSFER_TOPIC) unreadable = true;\n } else if (\n event.from === contract.owner &&\n event.to === call.to &&\n event.amount > 0n\n ) {\n return 'landed';\n }\n }\n return unreadable ? 'unreadable' : 'absent';\n}\n\n/**\n * A TRC-20 `transfer(to, …)` counts only if the called token\n * contract logged a `Transfer` from the sender to that recipient. Any positive amount counts:\n * a fee-on-transfer token (Tron USDT has a dormant fee switch) logs less than the call's\n * amount, and requiring the exact amount would prove a transfer that moved `failed`. A call\n * that also sends TRX or a TRC-10 token, or whose data is not a canonical `transfer`, is never\n * a plain TRC-20 transfer. Decoding reports the amounts that actually moved.\n */\nexport function transferLanded(raw: TronRawData, info: TronTxInfo): boolean {\n return transferEvidence(raw, info) === 'landed';\n}\n\n/** The chain's own view of an included transaction (no evidence check: not a verdict). */\nexport function chainVerdict(\n codec: TronCodec,\n tx: TronTxJson,\n info: TronTxInfo,\n): TxVerdict {\n return executed(codec.readRaw(tx.rawHex), tx, info);\n}\n\n/**\n * The verdict of our own included transaction (observe with an ordering, `includedFinal`).\n * The driver built it, so its bytes read, its call is a canonical `transfer` that sends no\n * value, a node's answer for it carries `contractRet`, and a TRX transfer in a block executed;\n * anything else contradicts the signed transaction or the chain's rules and decides nothing\n * (retryable), as does a token `Transfer` event that does not read.\n */\nexport function verdictOf(codec: TronCodec, tx: TronTxJson, info: TronTxInfo): TxVerdict {\n const raw = codec.readRaw(tx.rawHex);\n if (raw === null) throw malformed('raw_data_hex');\n if (tx.contractRet === undefined) throw malformed('contractRet');\n if (carriesValue(raw.contract)) throw malformed('call value');\n // An included TransferContract executed (java-tron never includes one that\n // failed), so any other answer on our own is impossible: a false `failed` on a proof path\n // would invite a second payment. The chain's view reports what the node says.\n if (\n raw.contract.type === 'TransferContract' &&\n (tx.contractRet !== 'SUCCESS' || info.failed)\n ) {\n throw malformed('contractRet');\n }\n // Our own TRC-20 call is a canonical `transfer(to, amount)` (the builder\n // writes nothing else), so other call data contradicts the signed transaction.\n if (\n raw.contract.type === 'TriggerSmartContract' &&\n decodeTransferCall(raw.contract.data) === null\n ) {\n throw malformed('call data');\n }\n const chain = executed(raw, tx, info);\n if (!chain.success) return chain;\n const evidence = transferEvidence(raw, info);\n if (evidence === 'unreadable') throw malformed('Transfer log');\n return evidence === 'landed'\n ? chain\n : { success: false, reason: 'token transfer not evidenced' };\n}\n\nconst UTF8 = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });\n\n/**\n * The memo (`raw_data.data`) as text: `undefined` without one, `null` when its bytes are not\n * UTF-8 (replacement characters would make two different memos read the same). Any size the\n * chain accepts reads: the driver's own 256-byte cap applies to what it writes.\n */\nfunction memoOf(raw: TronRawData): string | null | undefined {\n if (raw.data === undefined) return undefined;\n try {\n return UTF8.decode(fromHex(raw.data));\n } catch {\n return null;\n }\n}\n\n/** A canonical `T…` address, or `null` for bytes that are not one (never thrown). */\nfunction base58(hex: string): string | null {\n try {\n return toBase58Address(hex);\n } catch {\n return null;\n }\n}\n\n/**\n * Any transaction as the chain reports it. `info` and `blockHash` come together for an\n * included transaction; `pending` marks one the node holds in its pool.\n */\nexport function decodeTransaction(\n codec: TronCodec,\n tx: TronTxJson,\n info: TronTxInfo | null,\n blockHash: string | undefined,\n pending = false,\n): DriverTransaction {\n if (info !== null && blockHash === undefined) throw notServable();\n const raw = codec.readRaw(tx.rawHex);\n const chain = info ? executed(raw, tx, info) : undefined;\n const observation: DriverTxObservation =\n info && chain && blockHash !== undefined\n ? {\n seen: 'block',\n txHash: tx.id,\n blockHeight: info.blockNumber,\n blockHash,\n success: chain.success,\n ...(chain.reason ? { reason: chain.reason } : {}),\n }\n : pending\n ? { seen: 'mempool', txHash: tx.id }\n : { seen: 'none' };\n const memo = raw ? memoOf(raw) : undefined;\n const owner = raw ? base58(raw.contract.owner) : null;\n const transfers: DriverTransfer[] = [];\n let decoding: DriverTransaction['decoding'] = 'complete';\n /** A movement with the memo; `null` (an address that does not read) is left out. */\n const add = (transfer: Omit<DriverTransfer, 'memo'> | null): void => {\n if (!transfer) decoding = 'partial';\n else transfers.push(typeof memo === 'string' ? { ...transfer, memo } : transfer);\n };\n const native = (to: string, amount: bigint) => {\n const recipient = base58(to);\n add(\n owner && recipient\n ? {\n locator: 'native',\n from: [owner],\n to: recipient,\n asset: 'native',\n amount,\n source: 'native',\n }\n : null,\n );\n };\n if (raw === null) {\n decoding = 'none';\n } else if (!info) {\n decoding = 'partial';\n } else if (chain?.success) {\n if (memo === null) decoding = 'partial';\n const { contract } = raw;\n if (contract.type === 'TransferContract') {\n native(contract.to, contract.amount);\n } else {\n // Value can move without a log (internal transfers), and a TRC-10 value has no asset\n // here: a contract call is partial.\n decoding = 'partial';\n if (contract.callValue !== undefined) native(contract.contract, contract.callValue);\n info.logs.forEach((log, index) => {\n const event = decodeTransferLog(log);\n if (!event) return;\n const from = base58(event.from);\n const to = base58(event.to);\n const token = base58(`41${log.address}`);\n add(\n from && to && token\n ? {\n locator: `log:${index}`,\n from: [from],\n to,\n asset: { standard: 'trc20', contract: token },\n amount: event.amount,\n source: 'token-event',\n }\n : null,\n );\n });\n }\n }\n const call = raw?.contract.type === 'TriggerSmartContract' ? raw.contract : undefined;\n return {\n id: tx.id,\n observation,\n ...(info ? { fee: [{ asset: 'native' as const, amount: info.fee }] } : {}),\n transfers,\n decoding,\n // The block's time: the client-set `raw_data.timestamp` is display only.\n ...(info ? { timestamp: info.blockTimestamp } : {}),\n details: {\n contract: raw?.contract.type ?? 'unknown',\n ...(owner ? { owner } : {}),\n ...(tx.contractRet !== undefined ? { result: tx.contractRet } : {}),\n ...(info?.receiptResult !== undefined ? { receipt: info.receiptResult } : {}),\n ...(raw?.feeLimit !== undefined ? { feeLimit: BigInt(raw.feeLimit) } : {}),\n ...(call?.callValue !== undefined ? { callValue: call.callValue } : {}),\n ...(call?.callTokenValue !== undefined\n ? { callTokenValue: call.callTokenValue }\n : {}),\n ...(call?.tokenId !== undefined ? { tokenId: call.tokenId } : {}),\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Tron driver factory, for any `TronCodec`: validates the network and options,
|
|
3
|
+
* configures the identity (block 0's id) and height probes exactly once on every transport it
|
|
4
|
+
* receives, before any traffic, and assembles the ports. Without probes an endpoint is
|
|
5
|
+
* never identity-verified, and only verified endpoints feed health heights.
|
|
6
|
+
* `address-history` needs an indexer transport (TronGrid's `/v1`). This module imports no
|
|
7
|
+
* SDK: the codec module exports the library's factory (`tronwebDriverFactory`), so there
|
|
8
|
+
* is no import cycle.
|
|
9
|
+
*/
|
|
10
|
+
import type { DriverFactory } from '../../core/driver/types';
|
|
11
|
+
import type { TronCodec } from './types';
|
|
12
|
+
export declare function tronDriverFactory(codec: TronCodec): DriverFactory;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tronDriverFactory = tronDriverFactory;
|
|
4
|
+
const address_1 = require("./address");
|
|
5
|
+
const builder_1 = require("./builder");
|
|
6
|
+
const http_1 = require("./http");
|
|
7
|
+
const network_1 = require("./network");
|
|
8
|
+
const proofs_1 = require("./proofs");
|
|
9
|
+
const reader_1 = require("./reader");
|
|
10
|
+
async function blockField(call, path, body) {
|
|
11
|
+
const answer = await call.http({
|
|
12
|
+
method: 'POST',
|
|
13
|
+
path,
|
|
14
|
+
body,
|
|
15
|
+
route: path,
|
|
16
|
+
});
|
|
17
|
+
const raw = answer?.block_header
|
|
18
|
+
?.raw_data;
|
|
19
|
+
const id = answer?.blockID;
|
|
20
|
+
const number = raw?.number ?? 0;
|
|
21
|
+
if (typeof id !== 'string' ||
|
|
22
|
+
!/^[0-9a-f]{64}$/.test(id) ||
|
|
23
|
+
!Number.isSafeInteger(number)) {
|
|
24
|
+
throw (0, http_1.malformed)('probe block');
|
|
25
|
+
}
|
|
26
|
+
return { id, number: BigInt(number) };
|
|
27
|
+
}
|
|
28
|
+
function tronDriverFactory(codec) {
|
|
29
|
+
return {
|
|
30
|
+
async create(ctx) {
|
|
31
|
+
const config = (0, network_1.tronNetworkConfig)(ctx.chain, ctx.network, ctx.options);
|
|
32
|
+
const height = async (call) => (await blockField(call, '/wallet/getblock', { detail: false })).number;
|
|
33
|
+
// The rpc endpoint must serve the full node, the solidity node and JSON-RPC for one
|
|
34
|
+
// network; a partial endpoint fails its identity check loudly instead of stalling proofs.
|
|
35
|
+
// java-tron serves the three from separate HTTP services, so a self-hosted node
|
|
36
|
+
// needs a reverse proxy that maps all three paths under one URL, as TronGrid does.
|
|
37
|
+
ctx.transport.setProbes({
|
|
38
|
+
identity: async (call) => {
|
|
39
|
+
const full = (await blockField(call, '/wallet/getblockbynum', { num: 0 })).id;
|
|
40
|
+
const solid = (await blockField(call, '/walletsolidity/getblockbynum', { num: 0 })).id;
|
|
41
|
+
const rpc = await call.http({
|
|
42
|
+
method: 'POST',
|
|
43
|
+
path: '/jsonrpc',
|
|
44
|
+
route: '/jsonrpc',
|
|
45
|
+
body: {
|
|
46
|
+
jsonrpc: '2.0',
|
|
47
|
+
id: 1,
|
|
48
|
+
method: 'eth_getBlockByNumber',
|
|
49
|
+
params: ['0x0', false],
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
const hash = rpc?.result?.hash;
|
|
53
|
+
if (solid !== full ||
|
|
54
|
+
typeof hash !== 'string' ||
|
|
55
|
+
hash.toLowerCase() !== `0x${full}`) {
|
|
56
|
+
throw (0, http_1.malformed)('endpoint services');
|
|
57
|
+
}
|
|
58
|
+
return full;
|
|
59
|
+
},
|
|
60
|
+
expectedIdentity: config.identity,
|
|
61
|
+
height,
|
|
62
|
+
});
|
|
63
|
+
// The indexer (TronGrid's /v1) answers the full-node paths only.
|
|
64
|
+
ctx.indexer?.setProbes({
|
|
65
|
+
identity: async (call) => (await blockField(call, '/wallet/getblockbynum', { num: 0 })).id,
|
|
66
|
+
expectedIdentity: config.identity,
|
|
67
|
+
height,
|
|
68
|
+
});
|
|
69
|
+
const tron = {
|
|
70
|
+
api: new http_1.TronApi(ctx.transport),
|
|
71
|
+
codec,
|
|
72
|
+
chain: ctx.chain,
|
|
73
|
+
network: ctx.network,
|
|
74
|
+
config,
|
|
75
|
+
clock: ctx.clock,
|
|
76
|
+
log: ctx.log,
|
|
77
|
+
};
|
|
78
|
+
const reader = (0, reader_1.createTronReader)(tron);
|
|
79
|
+
const { builder, broadcaster } = (0, builder_1.createTronBuilder)(tron);
|
|
80
|
+
const capabilities = new Set(network_1.TRON_CAPABILITIES);
|
|
81
|
+
if (ctx.indexer)
|
|
82
|
+
for (const c of network_1.TRON_INDEXER_CAPABILITIES)
|
|
83
|
+
capabilities.add(c);
|
|
84
|
+
const ext = (0, reader_1.createTronExt)(tron);
|
|
85
|
+
return {
|
|
86
|
+
ordering: 'expiry',
|
|
87
|
+
capabilities,
|
|
88
|
+
address: address_1.tronAddressCodec,
|
|
89
|
+
reader,
|
|
90
|
+
builder,
|
|
91
|
+
broadcaster,
|
|
92
|
+
proofs: (0, proofs_1.createTronProofs)(tron),
|
|
93
|
+
blocks: (0, proofs_1.createTronBlocks)(tron),
|
|
94
|
+
...(ctx.indexer
|
|
95
|
+
? {
|
|
96
|
+
history: (0, proofs_1.createTronHistory)(tron, ctx.indexer, (id) => reader.getTransaction(id)),
|
|
97
|
+
}
|
|
98
|
+
: {}),
|
|
99
|
+
ext: { tron: { getResources: ext.tron.getResources } },
|
|
100
|
+
limits: () => ({ maxOutputs: 1 }),
|
|
101
|
+
createNativeClient: () => codec.createNative(ctx.transport),
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/adapters/tron/driver.ts"],"names":[],"mappings":";;AAiDA,8CAoFC;AAzHD,uCAA6C;AAC7C,uCAA8C;AAC9C,iCAA4C;AAC5C,uCAImB;AACnB,qCAAiF;AACjF,qCAA6E;AAG7E,KAAK,UAAU,UAAU,CACvB,IAAkB,EAClB,IAAY,EACZ,IAA6B;IAE7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAA0B;QACtD,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,IAAI;QACJ,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IACH,MAAM,GAAG,GAAI,MAAM,EAAE,YAAgE;QACnF,EAAE,QAAQ,CAAC;IACb,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM,IAAI,CAAC,CAAC;IAChC,IACE,OAAO,EAAE,KAAK,QAAQ;QACtB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAC7B,CAAC;QACD,MAAM,IAAA,gBAAS,EAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAgB,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAgB;IAChD,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,MAAM,MAAM,GAAG,IAAA,2BAAiB,EAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,MAAM,GAAG,KAAK,EAAE,IAAkB,EAAE,EAAE,CAC1C,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACzE,oFAAoF;YACpF,0FAA0F;YAC1F,gFAAgF;YAChF,mFAAmF;YACnF,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;gBACtB,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACvB,MAAM,IAAI,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,uBAAuB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9E,MAAM,KAAK,GAAG,CACZ,MAAM,UAAU,CAAC,IAAI,EAAE,+BAA+B,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CACpE,CAAC,EAAE,CAAC;oBACL,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAyC;wBAClE,MAAM,EAAE,MAAM;wBACd,IAAI,EAAE,UAAU;wBAChB,KAAK,EAAE,UAAU;wBACjB,IAAI,EAAE;4BACJ,OAAO,EAAE,KAAK;4BACd,EAAE,EAAE,CAAC;4BACL,MAAM,EAAE,sBAAsB;4BAC9B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;yBACvB;qBACF,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC;oBAC/B,IACE,KAAK,KAAK,IAAI;wBACd,OAAO,IAAI,KAAK,QAAQ;wBACxB,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,EAAE,EAClC,CAAC;wBACD,MAAM,IAAA,gBAAS,EAAC,mBAAmB,CAAC,CAAC;oBACvC,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,gBAAgB,EAAE,MAAM,CAAC,QAAQ;gBACjC,MAAM;aACP,CAAC,CAAC;YACH,iEAAiE;YACjE,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;gBACrB,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACvB,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,uBAAuB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;gBAClE,gBAAgB,EAAE,MAAM,CAAC,QAAQ;gBACjC,MAAM;aACP,CAAC,CAAC;YAEH,MAAM,IAAI,GAAgB;gBACxB,GAAG,EAAE,IAAI,cAAO,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC/B,KAAK;gBACL,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,MAAM;gBACN,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,GAAG,EAAE,GAAG,CAAC,GAAG;aACb,CAAC;YACF,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,CAAC;YACtC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAA,2BAAiB,EAAC,IAAI,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAa,2BAAiB,CAAC,CAAC;YAC5D,IAAI,GAAG,CAAC,OAAO;gBAAE,KAAK,MAAM,CAAC,IAAI,mCAAyB;oBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChF,MAAM,GAAG,GAAG,IAAA,sBAAa,EAAC,IAAI,CAAC,CAAC;YAChC,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,YAAY;gBACZ,OAAO,EAAE,0BAAgB;gBACzB,MAAM;gBACN,OAAO;gBACP,WAAW;gBACX,MAAM,EAAE,IAAA,yBAAgB,EAAC,IAAI,CAAC;gBAC9B,MAAM,EAAE,IAAA,yBAAgB,EAAC,IAAI,CAAC;gBAC9B,GAAG,CAAC,GAAG,CAAC,OAAO;oBACb,CAAC,CAAC;wBACE,OAAO,EAAE,IAAA,0BAAiB,EAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CACnD,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAC1B;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAoB;gBACxE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;gBACjC,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;aAC5D,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/**\n * The Tron driver factory, for any `TronCodec`: validates the network and options,\n * configures the identity (block 0's id) and height probes exactly once on every transport it\n * receives, before any traffic, and assembles the ports. Without probes an endpoint is\n * never identity-verified, and only verified endpoints feed health heights.\n * `address-history` needs an indexer transport (TronGrid's `/v1`). This module imports no\n * SDK: the codec module exports the library's factory (`tronwebDriverFactory`), so there\n * is no import cycle.\n */\nimport type { ChainDriver, DriverFactory } from '../../core/driver/types';\nimport type { Capability } from '../../core/model/capability';\nimport type { EndpointCall } from '../../core/transport/types';\nimport { tronAddressCodec } from './address';\nimport { createTronBuilder } from './builder';\nimport { TronApi, malformed } from './http';\nimport {\n TRON_CAPABILITIES,\n TRON_INDEXER_CAPABILITIES,\n tronNetworkConfig,\n} from './network';\nimport { createTronBlocks, createTronHistory, createTronProofs } from './proofs';\nimport { createTronExt, createTronReader, type TronContext } from './reader';\nimport type { TronCodec, TronExt } from './types';\n\nasync function blockField(\n call: EndpointCall,\n path: string,\n body: Record<string, unknown>,\n): Promise<{ readonly id: string; readonly number: bigint }> {\n const answer = await call.http<Record<string, unknown>>({\n method: 'POST',\n path,\n body,\n route: path,\n });\n const raw = (answer?.block_header as { raw_data?: { number?: unknown } } | undefined)\n ?.raw_data;\n const id = answer?.blockID;\n const number = raw?.number ?? 0;\n if (\n typeof id !== 'string' ||\n !/^[0-9a-f]{64}$/.test(id) ||\n !Number.isSafeInteger(number)\n ) {\n throw malformed('probe block');\n }\n return { id, number: BigInt(number as number) };\n}\n\nexport function tronDriverFactory(codec: TronCodec): DriverFactory {\n return {\n async create(ctx): Promise<ChainDriver> {\n const config = tronNetworkConfig(ctx.chain, ctx.network, ctx.options);\n const height = async (call: EndpointCall) =>\n (await blockField(call, '/wallet/getblock', { detail: false })).number;\n // The rpc endpoint must serve the full node, the solidity node and JSON-RPC for one\n // network; a partial endpoint fails its identity check loudly instead of stalling proofs.\n // java-tron serves the three from separate HTTP services, so a self-hosted node\n // needs a reverse proxy that maps all three paths under one URL, as TronGrid does.\n ctx.transport.setProbes({\n identity: async (call) => {\n const full = (await blockField(call, '/wallet/getblockbynum', { num: 0 })).id;\n const solid = (\n await blockField(call, '/walletsolidity/getblockbynum', { num: 0 })\n ).id;\n const rpc = await call.http<{ result?: { hash?: unknown } } | null>({\n method: 'POST',\n path: '/jsonrpc',\n route: '/jsonrpc',\n body: {\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_getBlockByNumber',\n params: ['0x0', false],\n },\n });\n const hash = rpc?.result?.hash;\n if (\n solid !== full ||\n typeof hash !== 'string' ||\n hash.toLowerCase() !== `0x${full}`\n ) {\n throw malformed('endpoint services');\n }\n return full;\n },\n expectedIdentity: config.identity,\n height,\n });\n // The indexer (TronGrid's /v1) answers the full-node paths only.\n ctx.indexer?.setProbes({\n identity: async (call) =>\n (await blockField(call, '/wallet/getblockbynum', { num: 0 })).id,\n expectedIdentity: config.identity,\n height,\n });\n\n const tron: TronContext = {\n api: new TronApi(ctx.transport),\n codec,\n chain: ctx.chain,\n network: ctx.network,\n config,\n clock: ctx.clock,\n log: ctx.log,\n };\n const reader = createTronReader(tron);\n const { builder, broadcaster } = createTronBuilder(tron);\n const capabilities = new Set<Capability>(TRON_CAPABILITIES);\n if (ctx.indexer) for (const c of TRON_INDEXER_CAPABILITIES) capabilities.add(c);\n const ext = createTronExt(tron);\n return {\n ordering: 'expiry',\n capabilities,\n address: tronAddressCodec,\n reader,\n builder,\n broadcaster,\n proofs: createTronProofs(tron),\n blocks: createTronBlocks(tron),\n ...(ctx.indexer\n ? {\n history: createTronHistory(tron, ctx.indexer, (id) =>\n reader.getTransaction(id),\n ),\n }\n : {}),\n ext: { tron: { getResources: ext.tron.getResources } } satisfies TronExt,\n limits: () => ({ maxOutputs: 1 }),\n createNativeClient: () => codec.createNative(ctx.transport),\n };\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broadcast classification, pure. java-tron answers
|
|
3
|
+
* `/wallet/broadcasthex` with HTTP 200 and `{ result: false, code, message }`, so the
|
|
4
|
+
* transport never sees these as errors. The codes, texts and their order are java-tron's
|
|
5
|
+
* (`Wallet.broadcastTransaction`, `Manager.pushTransaction` and `processTransaction`,
|
|
6
|
+
* checked against GreatVoyage-v4.8.2.2, `d5c3d1d1`).
|
|
7
|
+
* - `rejected` only on definitive evidence: the refusal code plus an exact, anchored text
|
|
8
|
+
* that consensus also refuses for these bytes on every node at every time — a signature
|
|
9
|
+
* under 65 bytes, no contract, a transfer to self, a non-positive amount, or a size over
|
|
10
|
+
* the constant 512,000-byte limit (the signature and size rules only for bytes with one
|
|
11
|
+
* signature). Numbers in those texts must show the defect: a text that
|
|
12
|
+
* contradicts itself decides nothing.
|
|
13
|
+
* - Refusal codes java-tron gives before it pools the transaction are `refused`, the
|
|
14
|
+
* default for any text: account state, permissions, chain parameters and node policy
|
|
15
|
+
* can change.
|
|
16
|
+
* - Node-local codes (busy, not connected, not solidified, "P2P broadcast failed.", which
|
|
17
|
+
* java-tron returns after it pooled the transaction), `OTHER_ERROR` (its catch-all, which
|
|
18
|
+
* also covers a failure after pooling) and any empty or unknown code are thrown as a
|
|
19
|
+
* retryable `PROVIDER_UNAVAILABLE` marked `ambiguous`: possibly sent, even for a bare
|
|
20
|
+
* `Blockchain.broadcast` caller.
|
|
21
|
+
* Nothing here decides from text alone: the code gates every result. Reasons are
|
|
22
|
+
* fixed literals: no address, amount, transaction id or node text. Every pattern is
|
|
23
|
+
* anchored and linear, whatever the message's length.
|
|
24
|
+
*
|
|
25
|
+
* A node's rejection is a claim. `classifyBroadcast` takes the node at
|
|
26
|
+
* its word; `classifyOwnBroadcast`, which the broadcaster uses, keeps a `rejected` only when
|
|
27
|
+
* the claimed reason holds for the bytes that were sent (`txBytesOf`, read with the SDK-free
|
|
28
|
+
* reader the codec shares, `protobuf.ts`), and makes every other one `refused`, which
|
|
29
|
+
* is not terminal. A terminal `rejected`
|
|
30
|
+
* lets a caller pay again, so a lying endpoint that relayed the bytes, or keeps them to relay
|
|
31
|
+
* later, would make that a second payment. Our builder refuses every byte-only defect before
|
|
32
|
+
* signing, so a true rejection of our own bytes should not happen; a refusal costs liveness
|
|
33
|
+
* only, and the expiry proof still ends the Operation.
|
|
34
|
+
*/
|
|
35
|
+
import type { BroadcastResult } from '../../core/driver/types';
|
|
36
|
+
import type { BroadcastAnswer } from './http';
|
|
37
|
+
/**
|
|
38
|
+
* Our signed transaction as java-tron's byte-only checks read it, from the hex
|
|
39
|
+
* that was sent.
|
|
40
|
+
*/
|
|
41
|
+
export interface TronTxBytes {
|
|
42
|
+
/** The serialized `Transaction` without `ret`, which java-tron clears before measuring it. */
|
|
43
|
+
readonly size: number;
|
|
44
|
+
/** Each signature's length, in bytes. */
|
|
45
|
+
readonly signatures: readonly number[];
|
|
46
|
+
/** How many contracts `raw_data` holds (field 11). */
|
|
47
|
+
readonly contracts: number;
|
|
48
|
+
/**
|
|
49
|
+
* The one contract when it is a TransferContract: its addresses as hex and its amount as
|
|
50
|
+
* java-tron reads the `int64` (negative above 2^63 − 1; 0 when absent).
|
|
51
|
+
*/
|
|
52
|
+
readonly transfer?: {
|
|
53
|
+
readonly owner: string;
|
|
54
|
+
readonly to: string;
|
|
55
|
+
readonly amount: bigint;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** The node's answer at its word (see `classifyOwnBroadcast` for our own broadcasts). */
|
|
59
|
+
export declare function classifyBroadcast(answer: BroadcastAnswer): BroadcastResult;
|
|
60
|
+
/**
|
|
61
|
+
* The node's answer to bytes this driver sent, `sent` being those bytes read by
|
|
62
|
+
* `txBytesOf` (`undefined` when they do not read). A `rejected` stands only when its claimed
|
|
63
|
+
* reason holds for `sent`; otherwise the answer is `refused`. Every other answer is the
|
|
64
|
+
* node's, as `classifyBroadcast` reads it: acceptance, duplicates, state-dependent refusals
|
|
65
|
+
* (balance, a missing account, bandwidth, TaPoS, expiry, the fee limit) and possibly sent.
|
|
66
|
+
*/
|
|
67
|
+
export declare function classifyOwnBroadcast(answer: BroadcastAnswer, sent: TronTxBytes | undefined): BroadcastResult;
|
|
68
|
+
/**
|
|
69
|
+
* The bytes a broadcast sent, as the rejection checks read them, SDK-free: `Transaction`
|
|
70
|
+
* (`raw_data` once, signatures, `ret` entries left out of the size), the contracts in
|
|
71
|
+
* `raw_data`, and a single TransferContract's fields. `undefined` for hex that does not read
|
|
72
|
+
* strictly, or is longer than `MAX_READ_BYTES`; no claim holds for it.
|
|
73
|
+
*/
|
|
74
|
+
export declare function txBytesOf(hex: string): TronTxBytes | undefined;
|