crypto-aio 0.0.3 → 0.2.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 +167 -0
- package/README.md +163 -13
- 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 +386 -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 +175 -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 +139 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +103 -0
- package/dist/adapters/evm/fees.js +277 -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 +12 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +65 -0
- package/dist/adapters/evm/network.js +150 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +35 -0
- package/dist/adapters/evm/plugin.js +150 -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 +370 -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 +83 -0
- package/dist/adapters/evm/reader.js +326 -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 +10 -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 +265 -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 +26 -0
- package/dist/adapters/evm/web3-client.js +176 -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 +556 -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 +77 -0
- package/dist/adapters/solana/fees.js +214 -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/message.d.ts +15 -0
- package/dist/adapters/solana/message.js +120 -0
- package/dist/adapters/solana/message.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 +44 -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 +124 -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 +61 -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 +755 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +235 -0
- package/dist/adapters/ton/reader.js +976 -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 +74 -0
- package/dist/adapters/ton/trace.js +303 -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 +41 -0
- package/dist/adapters/tron/abi.js +112 -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 +569 -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 +52 -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 +371 -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 +57 -0
- package/dist/adapters/tron/reader.js +220 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +9 -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 +100 -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 +63 -0
- package/dist/adapters/utxo/context.js +125 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +22 -0
- package/dist/adapters/utxo/decode.js +121 -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 +79 -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 +100 -0
- package/dist/adapters/utxo/esplora.js +498 -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 +66 -0
- package/dist/adapters/utxo/proofs.js +469 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawblock.d.ts +46 -0
- package/dist/adapters/utxo/rawblock.js +159 -0
- package/dist/adapters/utxo/rawblock.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +73 -0
- package/dist/adapters/utxo/rawtx.js +264 -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 +179 -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 +180 -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 +62 -0
- package/dist/core/container/container.js +500 -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 +379 -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 +163 -0
- package/dist/core/errors/codes.js +53 -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 +106 -0
- package/dist/core/lifecycle/engine-rules.js +267 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +502 -0
- package/dist/core/lifecycle/engine.js +1750 -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 +77 -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 +616 -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 +88 -0
- package/dist/core/lifecycle/workers.js +347 -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 +38 -0
- package/dist/core/model/ids.js +14 -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 +28 -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 +123 -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 +358 -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 +161 -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/format.d.ts +20 -0
- package/dist/core/store/format.js +86 -0
- package/dist/core/store/format.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 +258 -0
- package/dist/core/store/types.js +119 -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 +1703 -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 +159 -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 +35 -0
- package/dist/core/util/json.js +174 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +27 -0
- package/dist/core/util/names.js +56 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +65 -14
- package/dist/index.js +107 -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 +737 -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 +68 -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 +38 -0
- package/dist/testing/faulty-store.js +71 -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 +198 -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 @@
|
|
|
1
|
+
{"version":3,"file":"rawtx.js","sourceRoot":"","sources":["../../../src/adapters/evm/rawtx.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What a node's rejection claims is checked against the bytes we sent,\n * read here SDK-free. The reader is never stricter than geth: it calls bytes `malformed`\n * only for what geth's RLP decoder also refuses (a broken or non-canonical encoding, an\n * integer with a leading zero or over 256 bits, the wrong number of fields, a `to` that is\n * not 20 bytes), and it reads no access list, so a claim it cannot confirm stays a refusal.\n */\nimport { fromHex } from '../../core/util/bytes';\n\n/** The fields a rejection check reads, of one signed legacy, EIP-2930 or EIP-1559 tx. */\nexport interface EvmSentTx {\n readonly type: 0 | 1 | 2;\n /** Absent for a legacy transaction signed without EIP-155 (v of 27 or 28). */\n readonly chainId?: bigint;\n readonly maxFeePerGas?: bigint;\n readonly maxPriorityFeePerGas?: bigint;\n /** The recovery id: `yParity`, or the legacy `v` reduced to 0 or 1; -1 when neither. */\n readonly recovery: number;\n readonly r: bigint;\n readonly s: bigint;\n}\n\n/**\n * Twice geth's 128 KiB pool limit, checked before any decoding: a bare broadcast may\n * carry any bytes, and untrusted input is capped before it is decoded.\n */\nexport const MAX_SENT_BYTES = 2 * 128 * 1024;\n\nclass Malformed extends Error {}\ntype Item = Uint8Array | readonly Item[];\n\n/** One canonical RLP item at `at`, and the offset after it; throws `Malformed`. */\nfunction item(bytes: Uint8Array, at: number): [Item, number] {\n const lead = bytes[at];\n if (lead === undefined) throw new Malformed();\n const span = (offset: number, length: number): [number, number] => {\n const end = offset + length;\n if (end > bytes.length) throw new Malformed();\n return [offset, end];\n };\n const longLength = (width: number): number => {\n const [start, end] = span(at + 1, width);\n if (bytes[start] === 0) throw new Malformed();\n let length = 0;\n for (let i = start; i < end; i++) length = length * 256 + (bytes[i] as number);\n if (length < 56) throw new Malformed();\n return length;\n };\n if (lead < 0x80) return [bytes.subarray(at, at + 1), at + 1];\n if (lead <= 0xbf) {\n const long = lead > 0xb7;\n const width = long ? lead - 0xb7 : 0;\n const length = long ? longLength(width) : lead - 0x80;\n const [start, end] = span(at + 1 + width, length);\n if (!long && length === 1 && (bytes[start] as number) < 0x80) throw new Malformed();\n return [bytes.subarray(start, end), end];\n }\n const long = lead > 0xf7;\n const width = long ? lead - 0xf7 : 0;\n const length = long ? longLength(width) : lead - 0xc0;\n const [start, end] = span(at + 1 + width, length);\n const items: Item[] = [];\n for (let offset = start; offset < end;) {\n const [next, after] = item(bytes, offset);\n if (after > end) throw new Malformed();\n items.push(next);\n offset = after;\n }\n return [items, end];\n}\n\n/** A whole buffer as one list of exactly `fields` items. */\nfunction list(bytes: Uint8Array, fields: number): readonly Item[] {\n const [value, end] = item(bytes, 0);\n if (end !== bytes.length || !Array.isArray(value) || value.length !== fields)\n throw new Malformed();\n return value as readonly Item[];\n}\n\n/** A canonical unsigned integer of at most `bits` bits. */\nfunction uint(value: Item | undefined, bits: number): bigint {\n if (!(value instanceof Uint8Array) || value.length * 8 > bits || value[0] === 0)\n throw new Malformed();\n let out = 0n;\n for (const byte of value) out = (out << 8n) | BigInt(byte);\n return out;\n}\n\nfunction address(value: Item | undefined): void {\n if (!(value instanceof Uint8Array) || (value.length !== 0 && value.length !== 20))\n throw new Malformed();\n}\n\n/**\n * The sent bytes as the checks read them: the fields, `'malformed'` when geth could not\n * decode them either, or `undefined` when they are unreadable here but may be valid (an\n * EIP-4844 or EIP-7702 transaction, or more than `MAX_SENT_BYTES`): no claim holds for those.\n */\nexport function readSentTx(hex: string): EvmSentTx | 'malformed' | undefined {\n if (typeof hex !== 'string' || hex.length > 2 + 2 * MAX_SENT_BYTES) return undefined;\n let bytes: Uint8Array;\n try {\n bytes = fromHex(hex);\n } catch {\n return 'malformed';\n }\n const type = bytes[0];\n if (type === undefined) return 'malformed';\n try {\n if (type >= 0xc0) {\n const [nonce, gasPrice, gas, to, value, , v, r, s] = list(bytes, 9);\n uint(nonce, 64);\n uint(gasPrice, 256);\n uint(gas, 64);\n address(to);\n uint(value, 256);\n const vv = uint(v, 256);\n const eip155 = vv >= 35n;\n return {\n type: 0,\n ...(eip155 ? { chainId: (vv - 35n) / 2n } : {}),\n recovery: eip155\n ? Number((vv - 35n) % 2n)\n : vv === 27n || vv === 28n\n ? Number(vv - 27n)\n : -1,\n r: uint(r, 256),\n s: uint(s, 256),\n };\n }\n if (type === 1 || type === 2) {\n const fields = list(bytes.subarray(1), type === 1 ? 11 : 12);\n const chainId = uint(fields[0], 256);\n uint(fields[1], 64);\n const prices = type === 2 ? [uint(fields[2], 256), uint(fields[3], 256)] : [];\n if (type === 1) uint(fields[2], 256);\n const rest = type === 1 ? 3 : 4;\n uint(fields[rest], 64);\n address(fields[rest + 1]);\n uint(fields[rest + 2], 256);\n const [yParity, r, s] = fields.slice(-3);\n const parity = uint(yParity, 256);\n return {\n type,\n chainId,\n ...(type === 2\n ? {\n maxPriorityFeePerGas: prices[0] as bigint,\n maxFeePerGas: prices[1] as bigint,\n }\n : {}),\n recovery: parity <= 1n ? Number(parity) : -1,\n r: uint(r, 256),\n s: uint(s, 256),\n };\n }\n // geth reads any other first byte above 0x7f as a legacy list, and fails.\n if (type >= 0x80) return 'malformed';\n return undefined;\n } catch (error) {\n if (error instanceof Malformed) return 'malformed';\n throw error;\n }\n}\n\n/** secp256k1's group order. */\nconst N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n;\n\n/** geth's `ValidateSignatureValues` with Homestead's low-s rule, over the recovery id. */\nexport function signatureValuesValid(tx: EvmSentTx): boolean {\n return (\n (tx.recovery === 0 || tx.recovery === 1) &&\n tx.r >= 1n &&\n tx.r < N &&\n tx.s >= 1n &&\n tx.s <= N / 2n\n );\n}\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EVM addresses, reads, nonces, finality and the `ext.evm` API. Every call carries the tags
|
|
3
|
+
* of the `ChainDriver` contract table (`src/core/driver/types.ts`): `read` for point
|
|
4
|
+
* queries, `monitor` for heights, observations and nonces, and `proof` for the finality
|
|
5
|
+
* that proofs attest.
|
|
6
|
+
*/
|
|
7
|
+
import type { AddressCodec, ChainReader, DriverBlock, SequenceSource } from '../../core/driver/types';
|
|
8
|
+
import type { Logger } from '../../core/events/logger';
|
|
9
|
+
import type { ChainInfo, NetworkInfo } from '../../core/model/chain';
|
|
10
|
+
import type { EvmNetworkConfig } from './network';
|
|
11
|
+
import type { EvmBlock, EvmCallTags, EvmClient, EvmExt } from './types';
|
|
12
|
+
/** What every EVM port is built from. */
|
|
13
|
+
export interface EvmContext {
|
|
14
|
+
readonly client: EvmClient;
|
|
15
|
+
readonly chain: ChainInfo;
|
|
16
|
+
readonly network: NetworkInfo;
|
|
17
|
+
readonly config: EvmNetworkConfig;
|
|
18
|
+
readonly log: Logger;
|
|
19
|
+
}
|
|
20
|
+
export declare const READ: EvmCallTags;
|
|
21
|
+
export declare const MONITOR: EvmCallTags;
|
|
22
|
+
export declare const PROOF: EvmCallTags;
|
|
23
|
+
export declare const withSignal: (tags: EvmCallTags, signal?: AbortSignal) => EvmCallTags;
|
|
24
|
+
export declare function toDriverBlock(block: EvmBlock): DriverBlock;
|
|
25
|
+
/** Whether a definitive (non-ambiguous) JSON-RPC error says the call reverted. */
|
|
26
|
+
export declare function isRevert(error: unknown): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* How many blocks a proof's final height trails the one endpoint that proposed it, so
|
|
29
|
+
* a quorum peer up to this far behind that endpoint still attests it.
|
|
30
|
+
*/
|
|
31
|
+
export declare const PEER_SKEW = 2n;
|
|
32
|
+
/**
|
|
33
|
+
* The highest final block as one endpoint sees it (a `monitor` view): the `finalized` tag,
|
|
34
|
+
* or the head minus the confirmations; the head read carries the signal of `tags`. Proofs
|
|
35
|
+
* never use it as a final height: `provenFinal` attests one.
|
|
36
|
+
*/
|
|
37
|
+
export declare function finalizedHeight(ctx: EvmContext, tags: EvmCallTags): Promise<bigint>;
|
|
38
|
+
/**
|
|
39
|
+
* A height that is final on every endpoint of the proof quorum (`tags`), and the quorum's
|
|
40
|
+
* block at it when the proof read that block anyway. One endpoint's view (a `monitor` read)
|
|
41
|
+
* only proposes: the height trails it by `PEER_SKEW` blocks, and the quorum attests it. On
|
|
42
|
+
* tag networks every quorum endpoint's `finalized` block must be at or past it; on
|
|
43
|
+
* confirmation networks every one must hold the block that confirms it. So an
|
|
44
|
+
* endpoint that over-reports cannot advance finality, and a peer that trails the proposer
|
|
45
|
+
* by up to `PEER_SKEW` blocks still agrees.
|
|
46
|
+
*/
|
|
47
|
+
export declare function provenFinal(ctx: EvmContext, tags: EvmCallTags): Promise<{
|
|
48
|
+
readonly height: bigint;
|
|
49
|
+
readonly block?: EvmBlock;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* The quorum's block at `height` when `height` is final on every endpoint of the proof
|
|
53
|
+
* quorum (`tags`), else `null`. Anchored at `height` itself, not at any endpoint's view:
|
|
54
|
+
* honest endpoints disagree only while `height` is final on one and not yet on another, and
|
|
55
|
+
* that decides nothing (a retryable `PROVIDER_INCONSISTENT`).
|
|
56
|
+
*/
|
|
57
|
+
export declare function finalBlockAt(ctx: EvmContext, height: bigint, tags: EvmCallTags): Promise<EvmBlock | null>;
|
|
58
|
+
export declare function createEvmAddressCodec(client: EvmClient): AddressCodec;
|
|
59
|
+
/** Whether a definitive (non-ambiguous) JSON-RPC error says the EVM stopped the code. */
|
|
60
|
+
export declare function isExecutionFailure(error: unknown): boolean;
|
|
61
|
+
/** An ERC-20 `balanceOf` at `latest`; `ASSET_RESOLUTION` when the contract gives none. */
|
|
62
|
+
export declare function erc20Balance(client: EvmClient, token: string, owner: string, tags: EvmCallTags): Promise<bigint>;
|
|
63
|
+
/**
|
|
64
|
+
* An `eth_call` at `latest` to a method the contract may lack: `null` when the call reverts
|
|
65
|
+
* or the VM stops it, as a call to a missing method does (the dispatcher reverts, or older
|
|
66
|
+
* code hits an invalid opcode). Any other JSON-RPC error is the node's and is rethrown
|
|
67
|
+
* retryable, and everything else propagates unchanged: a failed read is never an answer.
|
|
68
|
+
*/
|
|
69
|
+
export declare function callIfPresent(client: EvmClient, request: {
|
|
70
|
+
readonly to: string;
|
|
71
|
+
readonly data: string;
|
|
72
|
+
}, tags: EvmCallTags): Promise<string | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Whether a token answers `deprecated()` with `true` at `latest`, as Tether's `TetherToken`
|
|
75
|
+
* does once its owner deprecates it for an upgraded contract (`upgradedAddress`). Only a
|
|
76
|
+
* definitive answer decides: a contract without the method (a revert, a VM failure, `0x`,
|
|
77
|
+
* or an answer that is not one ABI `bool`) is not deprecated, and a failed read throws
|
|
78
|
+
* (`callIfPresent`), so it is never taken for either answer.
|
|
79
|
+
*/
|
|
80
|
+
export declare function erc20Deprecated(client: EvmClient, token: string, tags: EvmCallTags): Promise<boolean>;
|
|
81
|
+
export declare function createEvmReader(ctx: EvmContext): ChainReader;
|
|
82
|
+
export declare function createEvmSequence(client: EvmClient): SequenceSource;
|
|
83
|
+
export declare function createEvmExt(client: EvmClient): EvmExt;
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PEER_SKEW = exports.withSignal = exports.PROOF = exports.MONITOR = exports.READ = void 0;
|
|
4
|
+
exports.toDriverBlock = toDriverBlock;
|
|
5
|
+
exports.isRevert = isRevert;
|
|
6
|
+
exports.finalizedHeight = finalizedHeight;
|
|
7
|
+
exports.provenFinal = provenFinal;
|
|
8
|
+
exports.finalBlockAt = finalBlockAt;
|
|
9
|
+
exports.createEvmAddressCodec = createEvmAddressCodec;
|
|
10
|
+
exports.isExecutionFailure = isExecutionFailure;
|
|
11
|
+
exports.erc20Balance = erc20Balance;
|
|
12
|
+
exports.callIfPresent = callIfPresent;
|
|
13
|
+
exports.erc20Deprecated = erc20Deprecated;
|
|
14
|
+
exports.createEvmReader = createEvmReader;
|
|
15
|
+
exports.createEvmSequence = createEvmSequence;
|
|
16
|
+
exports.createEvmExt = createEvmExt;
|
|
17
|
+
const error_1 = require("../../core/errors/error");
|
|
18
|
+
const client_1 = require("./client");
|
|
19
|
+
const decode_1 = require("./decode");
|
|
20
|
+
exports.READ = { purpose: 'read', retry: 'safe' };
|
|
21
|
+
exports.MONITOR = { purpose: 'monitor', retry: 'safe' };
|
|
22
|
+
exports.PROOF = { purpose: 'proof', retry: 'safe', quorum: 'proof' };
|
|
23
|
+
const withSignal = (tags, signal) => signal ? { ...tags, signal } : tags;
|
|
24
|
+
exports.withSignal = withSignal;
|
|
25
|
+
function toDriverBlock(block) {
|
|
26
|
+
return {
|
|
27
|
+
height: block.number,
|
|
28
|
+
hash: block.hash,
|
|
29
|
+
parentHash: block.parentHash,
|
|
30
|
+
timestamp: block.timestamp,
|
|
31
|
+
transactionIds: block.transactions,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Whether a definitive (non-ambiguous) JSON-RPC error says the call reverted. */
|
|
35
|
+
function isRevert(error) {
|
|
36
|
+
if (!(0, error_1.isCryptoAioError)(error, 'RPC_ERROR') || error.ambiguous)
|
|
37
|
+
return false;
|
|
38
|
+
const { rpcCode, rpcMessage } = error.details ?? {};
|
|
39
|
+
return rpcCode === 3 || /revert/i.test(String(rpcMessage ?? error.message));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* How many blocks a proof's final height trails the one endpoint that proposed it, so
|
|
43
|
+
* a quorum peer up to this far behind that endpoint still attests it.
|
|
44
|
+
*/
|
|
45
|
+
exports.PEER_SKEW = 2n;
|
|
46
|
+
/** `height - depth`, or genesis. */
|
|
47
|
+
const below = (height, depth) => height > depth ? height - depth : 0n;
|
|
48
|
+
/**
|
|
49
|
+
* A quorum key under which every endpoint whose block is at or past `height` agrees,
|
|
50
|
+
* so honest endpoints at different heights agree, and one that is not there disagrees.
|
|
51
|
+
* A malformed answer throws, which the transport counts as a disagreement.
|
|
52
|
+
*/
|
|
53
|
+
const atOrPast = (height) => (result) => result !== null &&
|
|
54
|
+
(0, client_1.quantity)(result.number, 'block number') >= height;
|
|
55
|
+
/** Whether every quorum endpoint's `finalized` block is at or past `height`. */
|
|
56
|
+
async function finalizedAtOrPast(ctx, height, tags) {
|
|
57
|
+
const block = await ctx.client.getBlock('finalized', {
|
|
58
|
+
...tags,
|
|
59
|
+
quorumKey: atOrPast(height),
|
|
60
|
+
});
|
|
61
|
+
// The endpoints agreed on the predicate, so the first one's block states it for all.
|
|
62
|
+
return block !== null && block.number >= height;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The highest final block as one endpoint sees it (a `monitor` view): the `finalized` tag,
|
|
66
|
+
* or the head minus the confirmations; the head read carries the signal of `tags`. Proofs
|
|
67
|
+
* never use it as a final height: `provenFinal` attests one.
|
|
68
|
+
*/
|
|
69
|
+
async function finalizedHeight(ctx, tags) {
|
|
70
|
+
const { finality } = ctx.config;
|
|
71
|
+
if (finality.kind === 'confirmations') {
|
|
72
|
+
const head = await ctx.client.blockNumber((0, exports.withSignal)(exports.MONITOR, tags.signal));
|
|
73
|
+
return below(head, BigInt(finality.confirmations - 1));
|
|
74
|
+
}
|
|
75
|
+
const block = await ctx.client.getBlock('finalized', tags);
|
|
76
|
+
if (!block) {
|
|
77
|
+
throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'the endpoint reports no finalized block');
|
|
78
|
+
}
|
|
79
|
+
return block.number;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A height that is final on every endpoint of the proof quorum (`tags`), and the quorum's
|
|
83
|
+
* block at it when the proof read that block anyway. One endpoint's view (a `monitor` read)
|
|
84
|
+
* only proposes: the height trails it by `PEER_SKEW` blocks, and the quorum attests it. On
|
|
85
|
+
* tag networks every quorum endpoint's `finalized` block must be at or past it; on
|
|
86
|
+
* confirmation networks every one must hold the block that confirms it. So an
|
|
87
|
+
* endpoint that over-reports cannot advance finality, and a peer that trails the proposer
|
|
88
|
+
* by up to `PEER_SKEW` blocks still agrees.
|
|
89
|
+
*/
|
|
90
|
+
async function provenFinal(ctx, tags) {
|
|
91
|
+
const { finality } = ctx.config;
|
|
92
|
+
const view = (0, exports.withSignal)(exports.MONITOR, tags.signal);
|
|
93
|
+
if (finality.kind === 'confirmations') {
|
|
94
|
+
const confirming = below(await ctx.client.blockNumber(view), exports.PEER_SKEW);
|
|
95
|
+
const block = await ctx.client.getBlock(confirming, tags);
|
|
96
|
+
if (block?.number !== confirming) {
|
|
97
|
+
throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'the endpoints do not hold the confirming block');
|
|
98
|
+
}
|
|
99
|
+
const height = below(confirming, BigInt(finality.confirmations - 1));
|
|
100
|
+
return height === confirming ? { height, block } : { height };
|
|
101
|
+
}
|
|
102
|
+
const height = below(await finalizedHeight(ctx, view), exports.PEER_SKEW);
|
|
103
|
+
if (!(await finalizedAtOrPast(ctx, height, tags))) {
|
|
104
|
+
throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'the endpoints do not attest the proposed finalized block');
|
|
105
|
+
}
|
|
106
|
+
return { height };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The quorum's block at `height` when `height` is final on every endpoint of the proof
|
|
110
|
+
* quorum (`tags`), else `null`. Anchored at `height` itself, not at any endpoint's view:
|
|
111
|
+
* honest endpoints disagree only while `height` is final on one and not yet on another, and
|
|
112
|
+
* that decides nothing (a retryable `PROVIDER_INCONSISTENT`).
|
|
113
|
+
*/
|
|
114
|
+
async function finalBlockAt(ctx, height, tags) {
|
|
115
|
+
const { client } = ctx;
|
|
116
|
+
const { finality } = ctx.config;
|
|
117
|
+
if (finality.kind === 'tag') {
|
|
118
|
+
if (!(await finalizedAtOrPast(ctx, height, tags)))
|
|
119
|
+
return null;
|
|
120
|
+
return client.getBlock(height, tags);
|
|
121
|
+
}
|
|
122
|
+
// The block that gives `height` its confirmations; with one, it is `height`'s own.
|
|
123
|
+
const depth = BigInt(finality.confirmations - 1);
|
|
124
|
+
const confirming = await client.getBlock(height + depth, tags);
|
|
125
|
+
if (confirming === null)
|
|
126
|
+
return null;
|
|
127
|
+
return depth === 0n ? confirming : client.getBlock(height, tags);
|
|
128
|
+
}
|
|
129
|
+
function createEvmAddressCodec(client) {
|
|
130
|
+
return {
|
|
131
|
+
validate: (value) => client.isAddress(value),
|
|
132
|
+
normalize: (value) => {
|
|
133
|
+
if (!client.isAddress(value)) {
|
|
134
|
+
throw new error_1.ValidationError('INVALID_ADDRESS', 'not an EVM address');
|
|
135
|
+
}
|
|
136
|
+
const canonical = client.checksum(value);
|
|
137
|
+
return { canonical, display: canonical };
|
|
138
|
+
},
|
|
139
|
+
fromPublicKey: (publicKey) => {
|
|
140
|
+
// The client's strict decode already throws a specific `INVALID_ADDRESS`.
|
|
141
|
+
const canonical = client.addressFromPublicKey(publicKey);
|
|
142
|
+
return { canonical, display: canonical };
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const assetError = (reason) => new error_1.ValidationError('ASSET_RESOLUTION', reason);
|
|
147
|
+
/** geth's texts for an EVM that stopped the called code itself (`core/vm/errors.go`). */
|
|
148
|
+
const VM_FAILURE = /^(out of gas|invalid opcode|invalid jump destination|stack (underflow|limit reached)|write protection|return data out of bounds)/i;
|
|
149
|
+
/** Whether a definitive (non-ambiguous) JSON-RPC error says the EVM stopped the code. */
|
|
150
|
+
function isExecutionFailure(error) {
|
|
151
|
+
if (!(0, error_1.isCryptoAioError)(error, 'RPC_ERROR') || error.ambiguous)
|
|
152
|
+
return false;
|
|
153
|
+
const { rpcMessage } = error.details ?? {};
|
|
154
|
+
return typeof rpcMessage === 'string' && VM_FAILURE.test(rpcMessage);
|
|
155
|
+
}
|
|
156
|
+
/** An ERC-20 `balanceOf` at `latest`; `ASSET_RESOLUTION` when the contract gives none. */
|
|
157
|
+
async function erc20Balance(client, token, owner, tags) {
|
|
158
|
+
const data = await client.call({ to: token, data: client.abi.encodeBalanceOf(owner) }, 'latest', tags);
|
|
159
|
+
try {
|
|
160
|
+
return client.abi.decodeUint256(data);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
throw assetError('the token contract returned no balance');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* An `eth_call` at `latest` to a method the contract may lack: `null` when the call reverts
|
|
168
|
+
* or the VM stops it, as a call to a missing method does (the dispatcher reverts, or older
|
|
169
|
+
* code hits an invalid opcode). Any other JSON-RPC error is the node's and is rethrown
|
|
170
|
+
* retryable, and everything else propagates unchanged: a failed read is never an answer.
|
|
171
|
+
*/
|
|
172
|
+
async function callIfPresent(client, request, tags) {
|
|
173
|
+
try {
|
|
174
|
+
return await client.call(request, 'latest', tags);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (isRevert(error) || isExecutionFailure(error))
|
|
178
|
+
return null;
|
|
179
|
+
if ((0, error_1.isCryptoAioError)(error, 'RPC_ERROR')) {
|
|
180
|
+
throw (0, error_1.withContext)(error, {}, { retryable: true });
|
|
181
|
+
}
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/** An ABI `bool` that is `true`: one word, exactly 1 (`call` answers lower-case). */
|
|
186
|
+
const TRUE_WORD = /^0x0{63}1$/;
|
|
187
|
+
/**
|
|
188
|
+
* Whether a token answers `deprecated()` with `true` at `latest`, as Tether's `TetherToken`
|
|
189
|
+
* does once its owner deprecates it for an upgraded contract (`upgradedAddress`). Only a
|
|
190
|
+
* definitive answer decides: a contract without the method (a revert, a VM failure, `0x`,
|
|
191
|
+
* or an answer that is not one ABI `bool`) is not deprecated, and a failed read throws
|
|
192
|
+
* (`callIfPresent`), so it is never taken for either answer.
|
|
193
|
+
*/
|
|
194
|
+
async function erc20Deprecated(client, token, tags) {
|
|
195
|
+
const data = await callIfPresent(client, { to: token, data: client.abi.encodeDeprecated() }, tags);
|
|
196
|
+
return data !== null && TRUE_WORD.test(data);
|
|
197
|
+
}
|
|
198
|
+
function tokenOf(asset) {
|
|
199
|
+
if (asset === 'native' || asset.standard !== 'erc20') {
|
|
200
|
+
throw assetError(`EVM tokens use the 'erc20' standard`);
|
|
201
|
+
}
|
|
202
|
+
return asset.contract;
|
|
203
|
+
}
|
|
204
|
+
/** The text of an ABI `string`, or of a `bytes32` (older tokens such as MKR return one). */
|
|
205
|
+
function symbolText(client, data) {
|
|
206
|
+
try {
|
|
207
|
+
return client.abi.decodeString(data);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(data))
|
|
211
|
+
throw assetError('the token symbol is unreadable');
|
|
212
|
+
return Buffer.from(data.slice(2), 'hex').toString('utf8').replace(/\0+$/, '');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Token metadata is read under the proof quorum, stricter than the contract table's
|
|
217
|
+
* minimum. The core caches it for the container's life, and one endpoint's wrong `decimals`
|
|
218
|
+
* (a lagging, misrouted or buggy backend) would mis-scale every amount by orders of
|
|
219
|
+
* magnitude until restart. `decimals` never changes, so honest endpoints always agree.
|
|
220
|
+
*/
|
|
221
|
+
const METADATA = { ...exports.READ, quorum: 'proof' };
|
|
222
|
+
function createEvmReader(ctx) {
|
|
223
|
+
const { client } = ctx;
|
|
224
|
+
/**
|
|
225
|
+
* A revert or a VM execution failure is the token's own permanent problem
|
|
226
|
+
* (`ASSET_RESOLUTION`, which the core caches until restart, even if the call would
|
|
227
|
+
* later run). Any other JSON-RPC error is the node's, so it is rethrown retryable: a
|
|
228
|
+
* provider fault never pins a token. Everything else propagates unchanged: a
|
|
229
|
+
* misconfigured endpoint stays final, and a retryable failure is already retryable.
|
|
230
|
+
*/
|
|
231
|
+
const tokenCall = async (contract, data) => {
|
|
232
|
+
try {
|
|
233
|
+
return await client.call({ to: contract, data }, 'latest', METADATA);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (isRevert(error))
|
|
237
|
+
throw assetError('the token contract reverted');
|
|
238
|
+
if (isExecutionFailure(error))
|
|
239
|
+
throw assetError('the token contract failed to run');
|
|
240
|
+
if ((0, error_1.isCryptoAioError)(error, 'RPC_ERROR')) {
|
|
241
|
+
throw (0, error_1.withContext)(error, {}, { retryable: true });
|
|
242
|
+
}
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
return {
|
|
247
|
+
getBalance: async (address, asset) => {
|
|
248
|
+
if (asset === 'native')
|
|
249
|
+
return client.getBalance(address, 'latest', exports.READ);
|
|
250
|
+
return erc20Balance(client, tokenOf(asset), address, exports.READ);
|
|
251
|
+
},
|
|
252
|
+
getBlockHeight: () => client.blockNumber(exports.MONITOR),
|
|
253
|
+
getFinalizedHeight: () => finalizedHeight(ctx, exports.MONITOR),
|
|
254
|
+
getBlock: async (ref) => {
|
|
255
|
+
const block = await client.getBlock(ref, exports.READ);
|
|
256
|
+
return block ? toDriverBlock(block) : null;
|
|
257
|
+
},
|
|
258
|
+
getTransaction: async (id) => {
|
|
259
|
+
const tx = await client.getTransaction(id, exports.READ);
|
|
260
|
+
if (!tx)
|
|
261
|
+
return null;
|
|
262
|
+
const receipt = tx.blockHash !== null ? await client.getReceipt(id, exports.READ) : null;
|
|
263
|
+
return (0, decode_1.decodeTransaction)(client.abi, tx, receipt, undefined, ctx.config);
|
|
264
|
+
},
|
|
265
|
+
/**
|
|
266
|
+
* With an ordering, the token verdict on one of our own Attempts. Without one (a
|
|
267
|
+
* status lookup by id, for a transaction the library does not manage) the chain's
|
|
268
|
+
* view, so a third party's call that shares the `transfer` selector is not reported
|
|
269
|
+
* failed.
|
|
270
|
+
*/
|
|
271
|
+
observe: async (ref, ordering) => {
|
|
272
|
+
const tx = await client.getTransaction(ref.id, exports.MONITOR);
|
|
273
|
+
if (!tx)
|
|
274
|
+
return { seen: 'none' };
|
|
275
|
+
const receipt = tx.blockHash === null ? null : await client.getReceipt(ref.id, exports.MONITOR);
|
|
276
|
+
return ordering === undefined
|
|
277
|
+
? (0, decode_1.chainObservation)(tx, receipt)
|
|
278
|
+
: (0, decode_1.evmObservation)(client.abi, tx, receipt);
|
|
279
|
+
},
|
|
280
|
+
getTokenMetadata: async (ref) => {
|
|
281
|
+
const contract = tokenOf(ref);
|
|
282
|
+
const decimalsData = await tokenCall(contract, client.abi.encodeDecimals());
|
|
283
|
+
if (decimalsData === '0x')
|
|
284
|
+
throw assetError('no token contract at this address');
|
|
285
|
+
let decimals;
|
|
286
|
+
try {
|
|
287
|
+
decimals = client.abi.decodeUint256(decimalsData);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
throw assetError('the token decimals are unreadable');
|
|
291
|
+
}
|
|
292
|
+
if (decimals > 255n)
|
|
293
|
+
throw assetError('the token decimals are out of range');
|
|
294
|
+
const symbol = symbolText(client, await tokenCall(contract, client.abi.encodeSymbol()));
|
|
295
|
+
if (!symbol)
|
|
296
|
+
throw assetError('the token has no symbol');
|
|
297
|
+
return { symbol, decimals: Number(decimals) };
|
|
298
|
+
},
|
|
299
|
+
normalizeTokenRef: (ref) => {
|
|
300
|
+
const contract = tokenOf(ref);
|
|
301
|
+
if (!client.isAddress(contract))
|
|
302
|
+
throw assetError('not an EVM contract address');
|
|
303
|
+
return { standard: 'erc20', contract: client.checksum(contract) };
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
function createEvmSequence(client) {
|
|
308
|
+
return {
|
|
309
|
+
pending: (address) => client.getTransactionCount(address, 'pending', exports.MONITOR),
|
|
310
|
+
latest: (address) => client.getTransactionCount(address, 'latest', exports.MONITOR),
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
function createEvmExt(client) {
|
|
314
|
+
return {
|
|
315
|
+
evm: {
|
|
316
|
+
getNonce: async (address, block = 'latest') => {
|
|
317
|
+
if (block !== 'latest' && block !== 'pending') {
|
|
318
|
+
throw new error_1.ValidationError('INVALID_INTENT', `block must be 'latest' or 'pending'`);
|
|
319
|
+
}
|
|
320
|
+
const codec = createEvmAddressCodec(client);
|
|
321
|
+
return client.getTransactionCount(codec.normalize(address).canonical, block, exports.READ);
|
|
322
|
+
},
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/adapters/evm/reader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * EVM addresses, reads, nonces, finality and the `ext.evm` API. Every call carries the tags\n * of the `ChainDriver` contract table (`src/core/driver/types.ts`): `read` for point\n * queries, `monitor` for heights, observations and nonces, and `proof` for the finality\n * that proofs attest.\n */\nimport type {\n AddressCodec,\n ChainReader,\n DriverBlock,\n SequenceSource,\n} from '../../core/driver/types';\nimport {\n ProviderError,\n ValidationError,\n isCryptoAioError,\n withContext,\n} from '../../core/errors/error';\nimport type { Logger } from '../../core/events/logger';\nimport type { AssetMetadata, AssetRef, TokenRef } from '../../core/model/asset';\nimport type { ChainInfo, NetworkInfo } from '../../core/model/chain';\nimport { quantity } from './client';\nimport { chainObservation, decodeTransaction, evmObservation } from './decode';\nimport type { EvmNetworkConfig } from './network';\nimport type { EvmBlock, EvmCallTags, EvmClient, EvmExt } from './types';\n\n/** What every EVM port is built from. */\nexport interface EvmContext {\n readonly client: EvmClient;\n readonly chain: ChainInfo;\n readonly network: NetworkInfo;\n readonly config: EvmNetworkConfig;\n readonly log: Logger;\n}\n\nexport const READ: EvmCallTags = { purpose: 'read', retry: 'safe' };\nexport const MONITOR: EvmCallTags = { purpose: 'monitor', retry: 'safe' };\nexport const PROOF: EvmCallTags = { purpose: 'proof', retry: 'safe', quorum: 'proof' };\n\nexport const withSignal = (tags: EvmCallTags, signal?: AbortSignal): EvmCallTags =>\n signal ? { ...tags, signal } : tags;\n\nexport function toDriverBlock(block: EvmBlock): DriverBlock {\n return {\n height: block.number,\n hash: block.hash,\n parentHash: block.parentHash,\n timestamp: block.timestamp,\n transactionIds: block.transactions,\n };\n}\n\n/** Whether a definitive (non-ambiguous) JSON-RPC error says the call reverted. */\nexport function isRevert(error: unknown): boolean {\n if (!isCryptoAioError(error, 'RPC_ERROR') || error.ambiguous) return false;\n const { rpcCode, rpcMessage } = error.details ?? {};\n return rpcCode === 3 || /revert/i.test(String(rpcMessage ?? error.message));\n}\n\n/**\n * How many blocks a proof's final height trails the one endpoint that proposed it, so\n * a quorum peer up to this far behind that endpoint still attests it.\n */\nexport const PEER_SKEW = 2n;\n\n/** `height - depth`, or genesis. */\nconst below = (height: bigint, depth: bigint): bigint =>\n height > depth ? height - depth : 0n;\n\n/**\n * A quorum key under which every endpoint whose block is at or past `height` agrees,\n * so honest endpoints at different heights agree, and one that is not there disagrees.\n * A malformed answer throws, which the transport counts as a disagreement.\n */\nconst atOrPast =\n (height: bigint) =>\n (result: unknown): boolean =>\n result !== null &&\n quantity((result as { readonly number?: unknown }).number, 'block number') >= height;\n\n/** Whether every quorum endpoint's `finalized` block is at or past `height`. */\nasync function finalizedAtOrPast(\n ctx: EvmContext,\n height: bigint,\n tags: EvmCallTags,\n): Promise<boolean> {\n const block = await ctx.client.getBlock('finalized', {\n ...tags,\n quorumKey: atOrPast(height),\n });\n // The endpoints agreed on the predicate, so the first one's block states it for all.\n return block !== null && block.number >= height;\n}\n\n/**\n * The highest final block as one endpoint sees it (a `monitor` view): the `finalized` tag,\n * or the head minus the confirmations; the head read carries the signal of `tags`. Proofs\n * never use it as a final height: `provenFinal` attests one.\n */\nexport async function finalizedHeight(\n ctx: EvmContext,\n tags: EvmCallTags,\n): Promise<bigint> {\n const { finality } = ctx.config;\n if (finality.kind === 'confirmations') {\n const head = await ctx.client.blockNumber(withSignal(MONITOR, tags.signal));\n return below(head, BigInt(finality.confirmations - 1));\n }\n const block = await ctx.client.getBlock('finalized', tags);\n if (!block) {\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n 'the endpoint reports no finalized block',\n );\n }\n return block.number;\n}\n\n/**\n * A height that is final on every endpoint of the proof quorum (`tags`), and the quorum's\n * block at it when the proof read that block anyway. One endpoint's view (a `monitor` read)\n * only proposes: the height trails it by `PEER_SKEW` blocks, and the quorum attests it. On\n * tag networks every quorum endpoint's `finalized` block must be at or past it; on\n * confirmation networks every one must hold the block that confirms it. So an\n * endpoint that over-reports cannot advance finality, and a peer that trails the proposer\n * by up to `PEER_SKEW` blocks still agrees.\n */\nexport async function provenFinal(\n ctx: EvmContext,\n tags: EvmCallTags,\n): Promise<{ readonly height: bigint; readonly block?: EvmBlock }> {\n const { finality } = ctx.config;\n const view = withSignal(MONITOR, tags.signal);\n if (finality.kind === 'confirmations') {\n const confirming = below(await ctx.client.blockNumber(view), PEER_SKEW);\n const block = await ctx.client.getBlock(confirming, tags);\n if (block?.number !== confirming) {\n throw new ProviderError(\n 'PROVIDER_INCONSISTENT',\n 'the endpoints do not hold the confirming block',\n );\n }\n const height = below(confirming, BigInt(finality.confirmations - 1));\n return height === confirming ? { height, block } : { height };\n }\n const height = below(await finalizedHeight(ctx, view), PEER_SKEW);\n if (!(await finalizedAtOrPast(ctx, height, tags))) {\n throw new ProviderError(\n 'PROVIDER_INCONSISTENT',\n 'the endpoints do not attest the proposed finalized block',\n );\n }\n return { height };\n}\n\n/**\n * The quorum's block at `height` when `height` is final on every endpoint of the proof\n * quorum (`tags`), else `null`. Anchored at `height` itself, not at any endpoint's view:\n * honest endpoints disagree only while `height` is final on one and not yet on another, and\n * that decides nothing (a retryable `PROVIDER_INCONSISTENT`).\n */\nexport async function finalBlockAt(\n ctx: EvmContext,\n height: bigint,\n tags: EvmCallTags,\n): Promise<EvmBlock | null> {\n const { client } = ctx;\n const { finality } = ctx.config;\n if (finality.kind === 'tag') {\n if (!(await finalizedAtOrPast(ctx, height, tags))) return null;\n return client.getBlock(height, tags);\n }\n // The block that gives `height` its confirmations; with one, it is `height`'s own.\n const depth = BigInt(finality.confirmations - 1);\n const confirming = await client.getBlock(height + depth, tags);\n if (confirming === null) return null;\n return depth === 0n ? confirming : client.getBlock(height, tags);\n}\n\nexport function createEvmAddressCodec(client: EvmClient): AddressCodec {\n return {\n validate: (value) => client.isAddress(value),\n normalize: (value) => {\n if (!client.isAddress(value)) {\n throw new ValidationError('INVALID_ADDRESS', 'not an EVM address');\n }\n const canonical = client.checksum(value);\n return { canonical, display: canonical };\n },\n fromPublicKey: (publicKey) => {\n // The client's strict decode already throws a specific `INVALID_ADDRESS`.\n const canonical = client.addressFromPublicKey(publicKey);\n return { canonical, display: canonical };\n },\n };\n}\n\nconst assetError = (reason: string) => new ValidationError('ASSET_RESOLUTION', reason);\n\n/** geth's texts for an EVM that stopped the called code itself (`core/vm/errors.go`). */\nconst VM_FAILURE =\n /^(out of gas|invalid opcode|invalid jump destination|stack (underflow|limit reached)|write protection|return data out of bounds)/i;\n\n/** Whether a definitive (non-ambiguous) JSON-RPC error says the EVM stopped the code. */\nexport function isExecutionFailure(error: unknown): boolean {\n if (!isCryptoAioError(error, 'RPC_ERROR') || error.ambiguous) return false;\n const { rpcMessage } = error.details ?? {};\n return typeof rpcMessage === 'string' && VM_FAILURE.test(rpcMessage);\n}\n\n/** An ERC-20 `balanceOf` at `latest`; `ASSET_RESOLUTION` when the contract gives none. */\nexport async function erc20Balance(\n client: EvmClient,\n token: string,\n owner: string,\n tags: EvmCallTags,\n): Promise<bigint> {\n const data = await client.call(\n { to: token, data: client.abi.encodeBalanceOf(owner) },\n 'latest',\n tags,\n );\n try {\n return client.abi.decodeUint256(data);\n } catch {\n throw assetError('the token contract returned no balance');\n }\n}\n\n/**\n * An `eth_call` at `latest` to a method the contract may lack: `null` when the call reverts\n * or the VM stops it, as a call to a missing method does (the dispatcher reverts, or older\n * code hits an invalid opcode). Any other JSON-RPC error is the node's and is rethrown\n * retryable, and everything else propagates unchanged: a failed read is never an answer.\n */\nexport async function callIfPresent(\n client: EvmClient,\n request: { readonly to: string; readonly data: string },\n tags: EvmCallTags,\n): Promise<string | null> {\n try {\n return await client.call(request, 'latest', tags);\n } catch (error) {\n if (isRevert(error) || isExecutionFailure(error)) return null;\n if (isCryptoAioError(error, 'RPC_ERROR')) {\n throw withContext(error, {}, { retryable: true });\n }\n throw error;\n }\n}\n\n/** An ABI `bool` that is `true`: one word, exactly 1 (`call` answers lower-case). */\nconst TRUE_WORD = /^0x0{63}1$/;\n\n/**\n * Whether a token answers `deprecated()` with `true` at `latest`, as Tether's `TetherToken`\n * does once its owner deprecates it for an upgraded contract (`upgradedAddress`). Only a\n * definitive answer decides: a contract without the method (a revert, a VM failure, `0x`,\n * or an answer that is not one ABI `bool`) is not deprecated, and a failed read throws\n * (`callIfPresent`), so it is never taken for either answer.\n */\nexport async function erc20Deprecated(\n client: EvmClient,\n token: string,\n tags: EvmCallTags,\n): Promise<boolean> {\n const data = await callIfPresent(\n client,\n { to: token, data: client.abi.encodeDeprecated() },\n tags,\n );\n return data !== null && TRUE_WORD.test(data);\n}\n\nfunction tokenOf(asset: AssetRef): string {\n if (asset === 'native' || asset.standard !== 'erc20') {\n throw assetError(`EVM tokens use the 'erc20' standard`);\n }\n return asset.contract;\n}\n\n/** The text of an ABI `string`, or of a `bytes32` (older tokens such as MKR return one). */\nfunction symbolText(client: EvmClient, data: string): string {\n try {\n return client.abi.decodeString(data);\n } catch {\n if (!/^0x[0-9a-fA-F]{64}$/.test(data))\n throw assetError('the token symbol is unreadable');\n return Buffer.from(data.slice(2), 'hex').toString('utf8').replace(/\\0+$/, '');\n }\n}\n\n/**\n * Token metadata is read under the proof quorum, stricter than the contract table's\n * minimum. The core caches it for the container's life, and one endpoint's wrong `decimals`\n * (a lagging, misrouted or buggy backend) would mis-scale every amount by orders of\n * magnitude until restart. `decimals` never changes, so honest endpoints always agree.\n */\nconst METADATA: EvmCallTags = { ...READ, quorum: 'proof' };\n\nexport function createEvmReader(ctx: EvmContext): ChainReader {\n const { client } = ctx;\n /**\n * A revert or a VM execution failure is the token's own permanent problem\n * (`ASSET_RESOLUTION`, which the core caches until restart, even if the call would\n * later run). Any other JSON-RPC error is the node's, so it is rethrown retryable: a\n * provider fault never pins a token. Everything else propagates unchanged: a\n * misconfigured endpoint stays final, and a retryable failure is already retryable.\n */\n const tokenCall = async (contract: string, data: string): Promise<string> => {\n try {\n return await client.call({ to: contract, data }, 'latest', METADATA);\n } catch (error) {\n if (isRevert(error)) throw assetError('the token contract reverted');\n if (isExecutionFailure(error)) throw assetError('the token contract failed to run');\n if (isCryptoAioError(error, 'RPC_ERROR')) {\n throw withContext(error, {}, { retryable: true });\n }\n throw error;\n }\n };\n\n return {\n getBalance: async (address, asset) => {\n if (asset === 'native') return client.getBalance(address, 'latest', READ);\n return erc20Balance(client, tokenOf(asset), address, READ);\n },\n getBlockHeight: () => client.blockNumber(MONITOR),\n getFinalizedHeight: () => finalizedHeight(ctx, MONITOR),\n getBlock: async (ref) => {\n const block = await client.getBlock(ref, READ);\n return block ? toDriverBlock(block) : null;\n },\n getTransaction: async (id) => {\n const tx = await client.getTransaction(id, READ);\n if (!tx) return null;\n const receipt = tx.blockHash !== null ? await client.getReceipt(id, READ) : null;\n return decodeTransaction(client.abi, tx, receipt, undefined, ctx.config);\n },\n /**\n * With an ordering, the token verdict on one of our own Attempts. Without one (a\n * status lookup by id, for a transaction the library does not manage) the chain's\n * view, so a third party's call that shares the `transfer` selector is not reported\n * failed.\n */\n observe: async (ref, ordering) => {\n const tx = await client.getTransaction(ref.id, MONITOR);\n if (!tx) return { seen: 'none' };\n const receipt =\n tx.blockHash === null ? null : await client.getReceipt(ref.id, MONITOR);\n return ordering === undefined\n ? chainObservation(tx, receipt)\n : evmObservation(client.abi, tx, receipt);\n },\n getTokenMetadata: async (ref: TokenRef): Promise<AssetMetadata> => {\n const contract = tokenOf(ref);\n const decimalsData = await tokenCall(contract, client.abi.encodeDecimals());\n if (decimalsData === '0x') throw assetError('no token contract at this address');\n let decimals: bigint;\n try {\n decimals = client.abi.decodeUint256(decimalsData);\n } catch {\n throw assetError('the token decimals are unreadable');\n }\n if (decimals > 255n) throw assetError('the token decimals are out of range');\n const symbol = symbolText(\n client,\n await tokenCall(contract, client.abi.encodeSymbol()),\n );\n if (!symbol) throw assetError('the token has no symbol');\n return { symbol, decimals: Number(decimals) };\n },\n normalizeTokenRef: (ref) => {\n const contract = tokenOf(ref);\n if (!client.isAddress(contract)) throw assetError('not an EVM contract address');\n return { standard: 'erc20', contract: client.checksum(contract) };\n },\n };\n}\n\nexport function createEvmSequence(client: EvmClient): SequenceSource {\n return {\n pending: (address) => client.getTransactionCount(address, 'pending', MONITOR),\n latest: (address) => client.getTransactionCount(address, 'latest', MONITOR),\n };\n}\n\nexport function createEvmExt(client: EvmClient): EvmExt {\n return {\n evm: {\n getNonce: async (address, block = 'latest') => {\n if (block !== 'latest' && block !== 'pending') {\n throw new ValidationError(\n 'INVALID_INTENT',\n `block must be 'latest' or 'pending'`,\n );\n }\n const codec = createEvmAddressCodec(client);\n return client.getTransactionCount(\n codec.normalize(address).canonical,\n block,\n READ,\n );\n },\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The clients' common path to the core transport. `EthersClient` (directly) and
|
|
3
|
+
* `Web3Client` (through its EIP-1193 `request` object) end here, so each JSON-RPC
|
|
4
|
+
* call carries the purpose, retry class, quorum, fanout and signal of the driver method that
|
|
5
|
+
* made it.
|
|
6
|
+
*/
|
|
7
|
+
import type { Transport } from '../../core/transport/types';
|
|
8
|
+
import type { EvmCallTags } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* The consensus facts of a block read with its transactions to find the one that
|
|
11
|
+
* consumed a nonce: the block's number and hash, and each transaction's hash, sender and
|
|
12
|
+
* nonce, with the recipient and calldata that the token verdict reads.
|
|
13
|
+
*/
|
|
14
|
+
export declare function blockTransactionsKey(result: unknown): unknown;
|
|
15
|
+
/**
|
|
16
|
+
* The tags of a `crypto-aio/native` client's request: plain reads, except a broadcast, which
|
|
17
|
+
* is one: a failure after the transport may have delivered it is `ambiguous`, never an
|
|
18
|
+
* invitation to sign again with a new nonce.
|
|
19
|
+
*/
|
|
20
|
+
export declare const nativeTags: (method: string) => EvmCallTags;
|
|
21
|
+
/**
|
|
22
|
+
* The consensus facts compared under a quorum, per JSON-RPC method. Node implementations
|
|
23
|
+
* return extra or differently formatted fields (`size`, `totalDifficulty`, L2 extras), so a
|
|
24
|
+
* quorum over whole objects would report disagreement where there is none.
|
|
25
|
+
*/
|
|
26
|
+
export declare function quorumKeyFor(method: string): ((result: unknown) => unknown) | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* One JSON-RPC call through the transport, under the calling driver method's tags. A quorum
|
|
29
|
+
* compares the caller's own `quorumKey` when it gives one, else the method's consensus
|
|
30
|
+
* facts; a key never travels without a quorum.
|
|
31
|
+
*/
|
|
32
|
+
export declare function transportCall(transport: Transport, method: string, params: unknown, tags: EvmCallTags): Promise<unknown>;
|
|
33
|
+
/**
|
|
34
|
+
* Runs `request` (an SDK call whose bridge ends in `call`) and, when its last transport call
|
|
35
|
+
* failed, rethrows the transport's own error, never an SDK wrapper of it: web3 turns an
|
|
36
|
+
* "execution reverted" error into a `ContractExecutionError`, which would lose the error's
|
|
37
|
+
* code and ambiguity. A failure followed by a successful call is forgotten.
|
|
38
|
+
*/
|
|
39
|
+
export declare function throughSdk<T>(request: (call: (method: string, params: unknown) => Promise<unknown>) => Promise<T>, transport: Transport, tags: EvmCallTags): Promise<T>;
|