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,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EVM_PEER_DEPENDENCIES = void 0;
|
|
4
|
+
exports.evmManifests = evmManifests;
|
|
5
|
+
exports.evmPlugin = evmPlugin;
|
|
6
|
+
exports.evmChainPlugin = evmChainPlugin;
|
|
7
|
+
const error_1 = require("../../core/errors/error");
|
|
8
|
+
const chains_1 = require("./chains");
|
|
9
|
+
const network_1 = require("./network");
|
|
10
|
+
const presets_1 = require("./presets");
|
|
11
|
+
const tokens_1 = require("./tokens");
|
|
12
|
+
/** The SDK versions this adapter is validated against. */
|
|
13
|
+
exports.EVM_PEER_DEPENDENCIES = {
|
|
14
|
+
ethers: { name: 'ethers', range: '^6.17.0' },
|
|
15
|
+
web3: { name: 'web3', range: '^4.16.0' },
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The manifests' `load` functions, shared by every `evmManifests(...)` call, so that
|
|
19
|
+
* registering `evmPlugin()` or the same `evmChainPlugin(...)` again is the same plugin:
|
|
20
|
+
* the registry compares a plugin's functions by identity, and refuses a different plugin
|
|
21
|
+
* under a registered name. Each `require`s its client module, and with it the SDK, only
|
|
22
|
+
* when called.
|
|
23
|
+
*/
|
|
24
|
+
const loadEthers = async () => {
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
26
|
+
const mod = require('./ethers-client');
|
|
27
|
+
return mod.ethersDriverFactory;
|
|
28
|
+
};
|
|
29
|
+
const loadWeb3 = async () => {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
31
|
+
const mod = require('./web3-client');
|
|
32
|
+
return mod.web3DriverFactory;
|
|
33
|
+
};
|
|
34
|
+
/** The `ethers` and `web3` manifests for `chains`, keyed `<family>/<library>`. */
|
|
35
|
+
function evmManifests(family, chains) {
|
|
36
|
+
return [
|
|
37
|
+
{
|
|
38
|
+
family,
|
|
39
|
+
library: 'ethers',
|
|
40
|
+
chains,
|
|
41
|
+
capabilities: network_1.EVM_CAPABILITIES,
|
|
42
|
+
peerDependencies: [exports.EVM_PEER_DEPENDENCIES.ethers],
|
|
43
|
+
load: loadEthers,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
family,
|
|
47
|
+
library: 'web3',
|
|
48
|
+
chains,
|
|
49
|
+
capabilities: network_1.EVM_CAPABILITIES,
|
|
50
|
+
peerDependencies: [exports.EVM_PEER_DEPENDENCIES.web3],
|
|
51
|
+
load: loadWeb3,
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The built-in EVM family: Ethereum, BNB Smart Chain, Polygon PoS, Avalanche C-Chain,
|
|
57
|
+
* Arbitrum One, OP Mainnet and Base, with their testnets.
|
|
58
|
+
*/
|
|
59
|
+
function evmPlugin() {
|
|
60
|
+
return {
|
|
61
|
+
name: 'evm',
|
|
62
|
+
chains: chains_1.EVM_CHAINS,
|
|
63
|
+
adapters: evmManifests('evm', chains_1.EVM_CHAINS.map((chain) => chain.id)),
|
|
64
|
+
presets: presets_1.EVM_PRESETS,
|
|
65
|
+
assets: tokens_1.EVM_TOKENS,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** A plugin name: lower-case letters, digits and hyphens, starting with a letter. */
|
|
69
|
+
const PLUGIN_NAME = /^[a-z][a-z0-9-]*$/;
|
|
70
|
+
/**
|
|
71
|
+
* A plugin for EVM chains of your own, served by the built-in EVM driver with either
|
|
72
|
+
* library. Every network is validated here, so bad data fails at registration.
|
|
73
|
+
*/
|
|
74
|
+
function evmChainPlugin(options) {
|
|
75
|
+
if (!PLUGIN_NAME.test(options.name)) {
|
|
76
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `EVM chain plugin name ${JSON.stringify(options.name)} must match ${String(PLUGIN_NAME)}`);
|
|
77
|
+
}
|
|
78
|
+
const name = `evm:${options.name}`;
|
|
79
|
+
for (const chain of options.chains) {
|
|
80
|
+
const fail = (reason) => {
|
|
81
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `EVM chain '${chain.id}': ${reason}`);
|
|
82
|
+
};
|
|
83
|
+
if (chain.family !== 'evm')
|
|
84
|
+
fail(`its family must be 'evm'`);
|
|
85
|
+
if (chain.model !== 'account' || chain.ordering !== 'nonce') {
|
|
86
|
+
fail(`it must use the account model and nonce ordering`);
|
|
87
|
+
}
|
|
88
|
+
if (chain.schemes.length !== 1 || chain.schemes[0] !== 'secp256k1-ecdsa') {
|
|
89
|
+
fail(`its only scheme must be 'secp256k1-ecdsa'`);
|
|
90
|
+
}
|
|
91
|
+
for (const network of Object.values(chain.networks))
|
|
92
|
+
(0, network_1.evmNetworkConfig)(chain, network);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
name,
|
|
96
|
+
chains: options.chains,
|
|
97
|
+
adapters: evmManifests(name, options.chains.map((chain) => chain.id)),
|
|
98
|
+
...(options.presets ? { presets: options.presets } : {}),
|
|
99
|
+
...(options.assets ? { assets: options.assets } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/adapters/evm/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The EVM family plugin: chains, tokens and provider presets as data, plus one\n * adapter manifest per library. SDK-free: only a manifest's `load()` requires a client\n * module, and with it the SDK. `ethers` is registered first, so it is the family default.\n */\nimport type {\n AdapterManifest,\n DriverFactory,\n PeerDependency,\n} from '../../core/driver/types';\nimport { ConfigError } from '../../core/errors/error';\nimport type { ChainInfo } from '../../core/model/chain';\nimport type { AssetRegistration } from '../../core/registry/assets';\nimport type { Plugin } from '../../core/registry/plugin';\nimport type { ProviderPreset } from '../../core/registry/providers';\nimport { EVM_CHAINS } from './chains';\nimport { EVM_CAPABILITIES, evmNetworkConfig } from './network';\nimport { EVM_PRESETS } from './presets';\nimport { EVM_TOKENS } from './tokens';\n\n/** The SDK versions this adapter is validated against. */\nexport const EVM_PEER_DEPENDENCIES: Readonly<Record<'ethers' | 'web3', PeerDependency>> =\n {\n ethers: { name: 'ethers', range: '^6.17.0' },\n web3: { name: 'web3', range: '^4.16.0' },\n };\n\n/**\n * The manifests' `load` functions, shared by every `evmManifests(...)` call, so that\n * registering `evmPlugin()` or the same `evmChainPlugin(...)` again is the same plugin:\n * the registry compares a plugin's functions by identity, and refuses a different plugin\n * under a registered name. Each `require`s its client module, and with it the SDK, only\n * when called.\n */\nconst loadEthers = async (): Promise<DriverFactory> => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('./ethers-client') as typeof import('./ethers-client');\n return mod.ethersDriverFactory;\n};\n\nconst loadWeb3 = async (): Promise<DriverFactory> => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('./web3-client') as typeof import('./web3-client');\n return mod.web3DriverFactory;\n};\n\n/** The `ethers` and `web3` manifests for `chains`, keyed `<family>/<library>`. */\nexport function evmManifests(\n family: string,\n chains: readonly string[],\n): AdapterManifest[] {\n return [\n {\n family,\n library: 'ethers',\n chains,\n capabilities: EVM_CAPABILITIES,\n peerDependencies: [EVM_PEER_DEPENDENCIES.ethers],\n load: loadEthers,\n },\n {\n family,\n library: 'web3',\n chains,\n capabilities: EVM_CAPABILITIES,\n peerDependencies: [EVM_PEER_DEPENDENCIES.web3],\n load: loadWeb3,\n },\n ];\n}\n\n/**\n * The built-in EVM family: Ethereum, BNB Smart Chain, Polygon PoS, Avalanche C-Chain,\n * Arbitrum One, OP Mainnet and Base, with their testnets.\n */\nexport function evmPlugin(): Plugin {\n return {\n name: 'evm',\n chains: EVM_CHAINS,\n adapters: evmManifests(\n 'evm',\n EVM_CHAINS.map((chain) => chain.id),\n ),\n presets: EVM_PRESETS,\n assets: EVM_TOKENS,\n };\n}\n\n/** A plugin name: lower-case letters, digits and hyphens, starting with a letter. */\nconst PLUGIN_NAME = /^[a-z][a-z0-9-]*$/;\n\nexport interface EvmChainPluginOptions {\n /**\n * A unique name matching `/^[a-z][a-z0-9-]*$/`. The plugin registers as `evm:<name>`, so\n * it never collides with a family plugin, and its manifests as `evm:<name>/ethers` and\n * `evm:<name>/web3`.\n */\n readonly name: string;\n /** Chains with `family: 'evm'`, nonce ordering and the `secp256k1-ecdsa` scheme. */\n readonly chains: readonly ChainInfo[];\n readonly presets?: readonly ProviderPreset[];\n readonly assets?: readonly AssetRegistration[];\n}\n\n/**\n * A plugin for EVM chains of your own, served by the built-in EVM driver with either\n * library. Every network is validated here, so bad data fails at registration.\n */\nexport function evmChainPlugin(options: EvmChainPluginOptions): Plugin {\n if (!PLUGIN_NAME.test(options.name)) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `EVM chain plugin name ${JSON.stringify(options.name)} must match ${String(PLUGIN_NAME)}`,\n );\n }\n const name = `evm:${options.name}`;\n for (const chain of options.chains) {\n const fail = (reason: string): never => {\n throw new ConfigError('CONFIG_INVALID', `EVM chain '${chain.id}': ${reason}`);\n };\n if (chain.family !== 'evm') fail(`its family must be 'evm'`);\n if (chain.model !== 'account' || chain.ordering !== 'nonce') {\n fail(`it must use the account model and nonce ordering`);\n }\n if (chain.schemes.length !== 1 || chain.schemes[0] !== 'secp256k1-ecdsa') {\n fail(`its only scheme must be 'secp256k1-ecdsa'`);\n }\n for (const network of Object.values(chain.networks)) evmNetworkConfig(chain, network);\n }\n return {\n name,\n chains: options.chains,\n adapters: evmManifests(\n name,\n options.chains.map((chain) => chain.id),\n ),\n ...(options.presets ? { presets: options.presets } : {}),\n ...(options.assets ? { assets: options.assets } : {}),\n };\n}\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EVM_PRESETS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* EVM provider presets. Only URL templates verified against the provider's own
|
|
6
|
+
* documentation are listed; a preset refuses every other network with `CONFIG_INVALID`.
|
|
7
|
+
* `public` has no Ethereum entry: no operator-run public endpoint is documented for it.
|
|
8
|
+
* Keyed URLs are `Secret`s, so the key never reaches logs or errors.
|
|
9
|
+
*/
|
|
10
|
+
const error_1 = require("../../core/errors/error");
|
|
11
|
+
const secret_1 = require("../../core/secret/secret");
|
|
12
|
+
/**
|
|
13
|
+
* Free public endpoints named in each chain's own documentation: the chain operator's, or a
|
|
14
|
+
* third party's where the docs list one (Polygon's are drpc's).
|
|
15
|
+
*/
|
|
16
|
+
const PUBLIC = {
|
|
17
|
+
bsc: {
|
|
18
|
+
mainnet: 'https://bsc-dataseed.bnbchain.org',
|
|
19
|
+
testnet: 'https://bsc-testnet-dataseed.bnbchain.org',
|
|
20
|
+
},
|
|
21
|
+
polygon: {
|
|
22
|
+
mainnet: 'https://polygon.drpc.org',
|
|
23
|
+
amoy: 'https://polygon-amoy.drpc.org',
|
|
24
|
+
},
|
|
25
|
+
avalanche: {
|
|
26
|
+
mainnet: 'https://api.avax.network/ext/bc/C/rpc',
|
|
27
|
+
fuji: 'https://api.avax-test.network/ext/bc/C/rpc',
|
|
28
|
+
},
|
|
29
|
+
arbitrum: {
|
|
30
|
+
mainnet: 'https://arb1.arbitrum.io/rpc',
|
|
31
|
+
sepolia: 'https://sepolia-rollup.arbitrum.io/rpc',
|
|
32
|
+
},
|
|
33
|
+
optimism: {
|
|
34
|
+
mainnet: 'https://mainnet.optimism.io',
|
|
35
|
+
sepolia: 'https://sepolia.optimism.io',
|
|
36
|
+
},
|
|
37
|
+
base: { mainnet: 'https://mainnet.base.org', sepolia: 'https://sepolia.base.org' },
|
|
38
|
+
};
|
|
39
|
+
/** `https://<host>.g.alchemy.com/v2/<key>`. */
|
|
40
|
+
const ALCHEMY = {
|
|
41
|
+
ethereum: { mainnet: 'eth-mainnet', sepolia: 'eth-sepolia', hoodi: 'eth-hoodi' },
|
|
42
|
+
bsc: { mainnet: 'bnb-mainnet', testnet: 'bnb-testnet' },
|
|
43
|
+
polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },
|
|
44
|
+
avalanche: { mainnet: 'avax-mainnet', fuji: 'avax-fuji' },
|
|
45
|
+
arbitrum: { mainnet: 'arb-mainnet', sepolia: 'arb-sepolia' },
|
|
46
|
+
optimism: { mainnet: 'opt-mainnet', sepolia: 'opt-sepolia' },
|
|
47
|
+
base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },
|
|
48
|
+
};
|
|
49
|
+
/** `https://<host>.infura.io/v3/<key>`. */
|
|
50
|
+
const INFURA = {
|
|
51
|
+
ethereum: { mainnet: 'mainnet', sepolia: 'sepolia', hoodi: 'hoodi' },
|
|
52
|
+
bsc: { mainnet: 'bsc-mainnet', testnet: 'bsc-testnet' },
|
|
53
|
+
polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },
|
|
54
|
+
avalanche: { mainnet: 'avalanche-mainnet', fuji: 'avalanche-fuji' },
|
|
55
|
+
arbitrum: { mainnet: 'arbitrum-mainnet', sepolia: 'arbitrum-sepolia' },
|
|
56
|
+
optimism: { mainnet: 'optimism-mainnet', sepolia: 'optimism-sepolia' },
|
|
57
|
+
base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },
|
|
58
|
+
};
|
|
59
|
+
/** `https://rpc.ankr.com/<path>/<key>`: only the paths Ankr's documentation shows. */
|
|
60
|
+
const ANKR = {
|
|
61
|
+
ethereum: { mainnet: 'eth' },
|
|
62
|
+
bsc: { mainnet: 'bsc' },
|
|
63
|
+
avalanche: { mainnet: 'avalanche' },
|
|
64
|
+
arbitrum: { mainnet: 'arbitrum' },
|
|
65
|
+
base: { mainnet: 'base' },
|
|
66
|
+
};
|
|
67
|
+
function entry(table, input) {
|
|
68
|
+
const value = table[input.chain]?.[input.network];
|
|
69
|
+
// Unreachable through the catalog, which asks `supports` first.
|
|
70
|
+
if (value === undefined)
|
|
71
|
+
throw new Error(`no entry for ${input.chain}:${input.network}`);
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
/** The revealed key; the error names the preset and network, never the key. */
|
|
75
|
+
function apiKeyOf(name, input) {
|
|
76
|
+
const key = input.apiKey === undefined ? undefined : (0, secret_1.reveal)(input.apiKey);
|
|
77
|
+
if (typeof key !== 'string' || key.trim() === '') {
|
|
78
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `provider preset '${name}' requires a non-empty apiKey for ${input.chain}:${input.network}`);
|
|
79
|
+
}
|
|
80
|
+
return key;
|
|
81
|
+
}
|
|
82
|
+
function keyed(name, table, url) {
|
|
83
|
+
return {
|
|
84
|
+
name,
|
|
85
|
+
kind: 'rpc',
|
|
86
|
+
requiresApiKey: true,
|
|
87
|
+
supports: (chain, network) => table[chain]?.[network] !== undefined,
|
|
88
|
+
endpoints: (input) => [
|
|
89
|
+
{ name, url: (0, secret_1.secret)(url(entry(table, input), apiKeyOf(name, input))) },
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
exports.EVM_PRESETS = [
|
|
94
|
+
{
|
|
95
|
+
name: 'public',
|
|
96
|
+
kind: 'rpc',
|
|
97
|
+
production: false,
|
|
98
|
+
supports: (chain, network) => PUBLIC[chain]?.[network] !== undefined,
|
|
99
|
+
endpoints: (input) => [{ name: 'public', url: entry(PUBLIC, input) }],
|
|
100
|
+
},
|
|
101
|
+
keyed('alchemy', ALCHEMY, (host, key) => `https://${host}.g.alchemy.com/v2/${key}`),
|
|
102
|
+
keyed('infura', INFURA, (host, key) => `https://${host}.infura.io/v3/${key}`),
|
|
103
|
+
keyed('ankr', ANKR, (path, key) => `https://rpc.ankr.com/${path}/${key}`),
|
|
104
|
+
];
|
|
105
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/adapters/evm/presets.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * EVM provider presets. Only URL templates verified against the provider's own\n * documentation are listed; a preset refuses every other network with `CONFIG_INVALID`.\n * `public` has no Ethereum entry: no operator-run public endpoint is documented for it.\n * Keyed URLs are `Secret`s, so the key never reaches logs or errors.\n */\nimport { ConfigError } from '../../core/errors/error';\nimport type { PresetInput, ProviderPreset } from '../../core/registry/providers';\nimport { reveal, secret } from '../../core/secret/secret';\nimport type { EndpointConfig } from '../../core/transport/types';\n\ntype Table = Readonly<Record<string, Readonly<Record<string, string>>>>;\n\n/**\n * Free public endpoints named in each chain's own documentation: the chain operator's, or a\n * third party's where the docs list one (Polygon's are drpc's).\n */\nconst PUBLIC: Table = {\n bsc: {\n mainnet: 'https://bsc-dataseed.bnbchain.org',\n testnet: 'https://bsc-testnet-dataseed.bnbchain.org',\n },\n polygon: {\n mainnet: 'https://polygon.drpc.org',\n amoy: 'https://polygon-amoy.drpc.org',\n },\n avalanche: {\n mainnet: 'https://api.avax.network/ext/bc/C/rpc',\n fuji: 'https://api.avax-test.network/ext/bc/C/rpc',\n },\n arbitrum: {\n mainnet: 'https://arb1.arbitrum.io/rpc',\n sepolia: 'https://sepolia-rollup.arbitrum.io/rpc',\n },\n optimism: {\n mainnet: 'https://mainnet.optimism.io',\n sepolia: 'https://sepolia.optimism.io',\n },\n base: { mainnet: 'https://mainnet.base.org', sepolia: 'https://sepolia.base.org' },\n};\n\n/** `https://<host>.g.alchemy.com/v2/<key>`. */\nconst ALCHEMY: Table = {\n ethereum: { mainnet: 'eth-mainnet', sepolia: 'eth-sepolia', hoodi: 'eth-hoodi' },\n bsc: { mainnet: 'bnb-mainnet', testnet: 'bnb-testnet' },\n polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },\n avalanche: { mainnet: 'avax-mainnet', fuji: 'avax-fuji' },\n arbitrum: { mainnet: 'arb-mainnet', sepolia: 'arb-sepolia' },\n optimism: { mainnet: 'opt-mainnet', sepolia: 'opt-sepolia' },\n base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },\n};\n\n/** `https://<host>.infura.io/v3/<key>`. */\nconst INFURA: Table = {\n ethereum: { mainnet: 'mainnet', sepolia: 'sepolia', hoodi: 'hoodi' },\n bsc: { mainnet: 'bsc-mainnet', testnet: 'bsc-testnet' },\n polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },\n avalanche: { mainnet: 'avalanche-mainnet', fuji: 'avalanche-fuji' },\n arbitrum: { mainnet: 'arbitrum-mainnet', sepolia: 'arbitrum-sepolia' },\n optimism: { mainnet: 'optimism-mainnet', sepolia: 'optimism-sepolia' },\n base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },\n};\n\n/** `https://rpc.ankr.com/<path>/<key>`: only the paths Ankr's documentation shows. */\nconst ANKR: Table = {\n ethereum: { mainnet: 'eth' },\n bsc: { mainnet: 'bsc' },\n avalanche: { mainnet: 'avalanche' },\n arbitrum: { mainnet: 'arbitrum' },\n base: { mainnet: 'base' },\n};\n\nfunction entry(table: Table, input: PresetInput): string {\n const value = table[input.chain]?.[input.network];\n // Unreachable through the catalog, which asks `supports` first.\n if (value === undefined)\n throw new Error(`no entry for ${input.chain}:${input.network}`);\n return value;\n}\n\n/** The revealed key; the error names the preset and network, never the key. */\nfunction apiKeyOf(name: string, input: PresetInput): string {\n const key: unknown = input.apiKey === undefined ? undefined : reveal(input.apiKey);\n if (typeof key !== 'string' || key.trim() === '') {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `provider preset '${name}' requires a non-empty apiKey for ${input.chain}:${input.network}`,\n );\n }\n return key;\n}\n\nfunction keyed(\n name: string,\n table: Table,\n url: (value: string, key: string) => string,\n): ProviderPreset {\n return {\n name,\n kind: 'rpc',\n requiresApiKey: true,\n supports: (chain, network) => table[chain]?.[network] !== undefined,\n endpoints: (input): readonly EndpointConfig[] => [\n { name, url: secret(url(entry(table, input), apiKeyOf(name, input))) },\n ],\n };\n}\n\nexport const EVM_PRESETS: readonly ProviderPreset[] = [\n {\n name: 'public',\n kind: 'rpc',\n production: false,\n supports: (chain, network) => PUBLIC[chain]?.[network] !== undefined,\n endpoints: (input) => [{ name: 'public', url: entry(PUBLIC, input) }],\n },\n keyed('alchemy', ALCHEMY, (host, key) => `https://${host}.g.alchemy.com/v2/${key}`),\n keyed('infura', INFURA, (host, key) => `https://${host}.infura.io/v3/${key}`),\n keyed('ankr', ANKR, (path, key) => `https://rpc.ankr.com/${path}/${key}`),\n];\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BlockSource, ProofSource } from '../../core/driver/types';
|
|
2
|
+
import { type EvmContext } from './reader';
|
|
3
|
+
/**
|
|
4
|
+
* The lowest height at or below `final` where `consumed` holds, given that it holds at
|
|
5
|
+
* `final`. A gallop back (`final` less 1, 2, 4, …) finds a height where it does not, then a
|
|
6
|
+
* bisection the first where it does. `consumed` never turns false again as the height
|
|
7
|
+
* grows, since an account's nonce never falls. Beyond `MAX_SEARCH_READS` reads, it decides
|
|
8
|
+
* nothing.
|
|
9
|
+
*/
|
|
10
|
+
export declare function consumptionHeight(consumed: (height: bigint) => Promise<boolean>, final: bigint): Promise<bigint>;
|
|
11
|
+
export declare function createEvmProofs(ctx: EvmContext): ProofSource;
|
|
12
|
+
/**
|
|
13
|
+
* Whether a block's `logsBloom` may hold `value` (a log's address or topic), by the
|
|
14
|
+
* yellow paper's M3:2048: three bits, each the low 11 bits of a byte pair of the value's
|
|
15
|
+
* keccak-256. `false` is definitive; `true` may be a false positive. No bloom may hold
|
|
16
|
+
* anything.
|
|
17
|
+
*/
|
|
18
|
+
export declare function mayHold(bloom: string | undefined, value: string): boolean;
|
|
19
|
+
export declare function createEvmBlocks(ctx: EvmContext): BlockSource;
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.consumptionHeight = consumptionHeight;
|
|
4
|
+
exports.createEvmProofs = createEvmProofs;
|
|
5
|
+
exports.mayHold = mayHold;
|
|
6
|
+
exports.createEvmBlocks = createEvmBlocks;
|
|
7
|
+
/**
|
|
8
|
+
* Proofs and block scanning. Every proof read is a quorum read under `PROOF`, comparing
|
|
9
|
+
* only consensus facts (`rpc.ts`). No proof lets one endpoint choose the final height: a
|
|
10
|
+
* proof attests the fact it needs at that fact's own
|
|
11
|
+
* height, so honest endpoints disagree only while it is final on one and not yet on another,
|
|
12
|
+
* which decides nothing. The block source serves dense heights with native transfers and
|
|
13
|
+
* ERC-20 `Transfer` logs, as the chain reports them. Every error thrown here is a
|
|
14
|
+
* `PROVIDER_*` code, retryable by the code table: look again later.
|
|
15
|
+
*/
|
|
16
|
+
const sha3_1 = require("@noble/hashes/sha3");
|
|
17
|
+
const utils_1 = require("@noble/hashes/utils");
|
|
18
|
+
const error_1 = require("../../core/errors/error");
|
|
19
|
+
const client_1 = require("./client");
|
|
20
|
+
const decode_1 = require("./decode");
|
|
21
|
+
const reader_1 = require("./reader");
|
|
22
|
+
const rpc_1 = require("./rpc");
|
|
23
|
+
/**
|
|
24
|
+
* A quorum key under which every endpoint whose nonce is past `nonce` agrees. A
|
|
25
|
+
* malformed answer throws, which the transport counts as a disagreement.
|
|
26
|
+
*/
|
|
27
|
+
const nonceAbove = (nonce) => (result) => (0, client_1.quantity)(result, 'nonce') > nonce;
|
|
28
|
+
/**
|
|
29
|
+
* Node texts for state it does not hold: pruned, beyond its recent-state window, or
|
|
30
|
+
* not served at a tag (geth, op-geth, Nitro, BSC, Erigon, Reth, Besu wordings).
|
|
31
|
+
*/
|
|
32
|
+
const STATE_UNAVAILABLE = /missing trie node|historical state .* not available|header not found|state (is )?not available|pruned/i;
|
|
33
|
+
/**
|
|
34
|
+
* The boundary of every proof. Only a definitive negative answer may
|
|
35
|
+
* say "no", and a JSON-RPC error answer is none: state the node does not hold, an index it
|
|
36
|
+
* is still building (geth's "transaction indexing is in progress"), or any other error,
|
|
37
|
+
* ambiguous or not. Every `RPC_ERROR` becomes a retryable `PROVIDER_UNAVAILABLE` (look again
|
|
38
|
+
* later, or elsewhere) that carries it as its cause, so no caller takes it for an answer and
|
|
39
|
+
* the monitor keeps watching. Every other error passes unchanged: `PROVIDER_MISCONFIGURED`
|
|
40
|
+
* stays final, and aborts and foreign errors stay what they are.
|
|
41
|
+
*/
|
|
42
|
+
async function undecided(proof) {
|
|
43
|
+
try {
|
|
44
|
+
return await proof();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (!(0, error_1.isCryptoAioError)(error, 'RPC_ERROR'))
|
|
48
|
+
throw error;
|
|
49
|
+
const message = String(error.details?.rpcMessage ?? error.message);
|
|
50
|
+
throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', STATE_UNAVAILABLE.test(message)
|
|
51
|
+
? 'finalized state not available'
|
|
52
|
+
: 'the endpoints gave no answer', { cause: error });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** A retryable "decide nothing": look again later, or elsewhere. */
|
|
56
|
+
const undecidable = (reason) => new error_1.ProviderError('PROVIDER_UNAVAILABLE', reason);
|
|
57
|
+
/**
|
|
58
|
+
* At most this many nonce reads look for the height that consumed a nonce. The gallop
|
|
59
|
+
* and the bisection take about two reads per doubling of the distance back: at worst 60
|
|
60
|
+
* reads below a final height of 2^30, and 64 below 2^32, so this reaches every consumption
|
|
61
|
+
* on any chain served today.
|
|
62
|
+
*/
|
|
63
|
+
const MAX_SEARCH_READS = 64;
|
|
64
|
+
/**
|
|
65
|
+
* The lowest height at or below `final` where `consumed` holds, given that it holds at
|
|
66
|
+
* `final`. A gallop back (`final` less 1, 2, 4, …) finds a height where it does not, then a
|
|
67
|
+
* bisection the first where it does. `consumed` never turns false again as the height
|
|
68
|
+
* grows, since an account's nonce never falls. Beyond `MAX_SEARCH_READS` reads, it decides
|
|
69
|
+
* nothing.
|
|
70
|
+
*/
|
|
71
|
+
async function consumptionHeight(consumed, final) {
|
|
72
|
+
let reads = 0;
|
|
73
|
+
const read = (height) => {
|
|
74
|
+
if (reads === MAX_SEARCH_READS) {
|
|
75
|
+
throw undecidable('the nonce was consumed too far back to look up');
|
|
76
|
+
}
|
|
77
|
+
reads += 1;
|
|
78
|
+
return consumed(height);
|
|
79
|
+
};
|
|
80
|
+
// Consumed at `high`; not at `low` (below genesis, until a read says otherwise).
|
|
81
|
+
let high = final;
|
|
82
|
+
let low = -1n;
|
|
83
|
+
for (let step = 1n; high > 0n && low < 0n; step *= 2n) {
|
|
84
|
+
const height = final > step ? final - step : 0n;
|
|
85
|
+
if (await read(height))
|
|
86
|
+
high = height;
|
|
87
|
+
else
|
|
88
|
+
low = height;
|
|
89
|
+
}
|
|
90
|
+
while (high - low > 1n) {
|
|
91
|
+
const middle = (low + high) / 2n;
|
|
92
|
+
if (await read(middle))
|
|
93
|
+
high = middle;
|
|
94
|
+
else
|
|
95
|
+
low = middle;
|
|
96
|
+
}
|
|
97
|
+
return high;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Whether `txHash` is final, when no endpoint serves its
|
|
101
|
+
* receipt. `null` is no proof of absence: a node answers it for every transaction outside its
|
|
102
|
+
* index (geth indexes the last 2,350,000 blocks by default, and pruning nodes of other
|
|
103
|
+
* clients drop theirs), so "not included" would prove a final, executed transfer `replaced`.
|
|
104
|
+
* The nonce's consumer decides instead. The quorum attests the nonce consumed at a final
|
|
105
|
+
* height, a search finds the block that consumed it, and the sender's transaction at that
|
|
106
|
+
* nonce there answers: another one proves ours is not included; ours is included, with the
|
|
107
|
+
* verdict its receipt in that block gives. Anything else decides nothing, and so does
|
|
108
|
+
* an endpoint without the historical state the search reads.
|
|
109
|
+
*
|
|
110
|
+
* Known gap: nothing caches the consumer per sender and nonce, so an undecided Attempt
|
|
111
|
+
* repeats the search on every monitor pass. A nonce that an EIP-7702 authorization
|
|
112
|
+
* consumed (no transaction from the sender) is never decided, the safe direction.
|
|
113
|
+
*/
|
|
114
|
+
async function nonceConsumer(ctx, txHash, ordering, from) {
|
|
115
|
+
if (ordering.kind !== 'nonce')
|
|
116
|
+
throw undecidable('no nonce to look the transaction up by');
|
|
117
|
+
const { client } = ctx;
|
|
118
|
+
const { nonce } = ordering;
|
|
119
|
+
const tags = { ...reader_1.PROOF, quorumKey: nonceAbove(nonce) };
|
|
120
|
+
const consumed = async (height) => (await client.getTransactionCount(from, height, tags)) > nonce;
|
|
121
|
+
const { height: final } = await (0, reader_1.provenFinal)(ctx, reader_1.PROOF);
|
|
122
|
+
if (!(await consumed(final)))
|
|
123
|
+
throw undecidable('the nonce is not consumed at finality');
|
|
124
|
+
const height = await consumptionHeight(consumed, final);
|
|
125
|
+
const block = await client.getBlockWithTransactions(height, {
|
|
126
|
+
...reader_1.PROOF,
|
|
127
|
+
quorumKey: rpc_1.blockTransactionsKey,
|
|
128
|
+
});
|
|
129
|
+
if (block?.number !== height)
|
|
130
|
+
throw undecidable('the endpoints serve no final block');
|
|
131
|
+
const sender = from.toLowerCase();
|
|
132
|
+
const consumer = block.transactions.find((tx) => tx.from.toLowerCase() === sender && tx.nonce === nonce);
|
|
133
|
+
// No transaction from the sender used the nonce: an EIP-7702 authorization can.
|
|
134
|
+
if (!consumer)
|
|
135
|
+
throw undecidable('no transaction in its block used the nonce');
|
|
136
|
+
// Another transaction is final at our nonce: ours can never be included.
|
|
137
|
+
if (consumer.hash !== txHash.toLowerCase())
|
|
138
|
+
return { included: false };
|
|
139
|
+
const receipts = await client.getBlockReceipts(block.hash, reader_1.PROOF);
|
|
140
|
+
const receipt = receipts?.find((r) => r.transactionHash === consumer.hash);
|
|
141
|
+
if (receipt?.blockHash !== block.hash) {
|
|
142
|
+
throw undecidable('the final block has no receipts on the endpoints');
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
included: true,
|
|
146
|
+
success: receipt.status === 1 && (0, decode_1.tokenTransferLanded)(client.abi, consumer, receipt),
|
|
147
|
+
blockHeight: height,
|
|
148
|
+
blockHash: block.hash,
|
|
149
|
+
txHash: consumer.hash,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function createEvmProofs(ctx) {
|
|
153
|
+
const { client } = ctx;
|
|
154
|
+
return {
|
|
155
|
+
finalizedHead: () => undecided(async () => {
|
|
156
|
+
const { height, block } = await (0, reader_1.provenFinal)(ctx, reader_1.PROOF);
|
|
157
|
+
const final = block ?? (await client.getBlock(height, reader_1.PROOF));
|
|
158
|
+
if (!final) {
|
|
159
|
+
throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'the endpoints serve no finalized block');
|
|
160
|
+
}
|
|
161
|
+
return { height: final.number, hash: final.hash, timestamp: final.timestamp };
|
|
162
|
+
}),
|
|
163
|
+
includedFinal: (ref, ordering, from) => undecided(async () => {
|
|
164
|
+
const receipt = await client.getReceipt(ref.id, reader_1.PROOF);
|
|
165
|
+
// No receipt is no proof of absence; the transaction at our nonce decides.
|
|
166
|
+
if (!receipt)
|
|
167
|
+
return nonceConsumer(ctx, ref.id, ordering, from);
|
|
168
|
+
const final = await (0, reader_1.finalBlockAt)(ctx, receipt.blockNumber, reader_1.PROOF);
|
|
169
|
+
// The transaction is in a block, just not a final one on these endpoints yet.
|
|
170
|
+
// "Not included" would let the core prove a final transfer `replaced` (whenAbsent,
|
|
171
|
+
// after the slot was proven consumed on endpoints whose finality is further along),
|
|
172
|
+
// so this decides nothing.
|
|
173
|
+
if (!final) {
|
|
174
|
+
throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'receipt not yet final');
|
|
175
|
+
}
|
|
176
|
+
// The endpoints agree on a receipt from a block that is not the final one at its
|
|
177
|
+
// height: the chain reorganized between the reads, or their receipt index lags. The
|
|
178
|
+
// transaction may be final elsewhere, so this decides nothing.
|
|
179
|
+
if (final.hash !== receipt.blockHash) {
|
|
180
|
+
throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'the receipt is not in the final block at its height');
|
|
181
|
+
}
|
|
182
|
+
let success = receipt.status === 1;
|
|
183
|
+
if (success) {
|
|
184
|
+
// A token transfer that logged no transfer to its recipient paid it nothing
|
|
185
|
+
// (read from the ref alone, the call's arguments from its keyed calldata). The
|
|
186
|
+
// core proves only its own Attempts, so this is always a verdict.
|
|
187
|
+
const tx = await client.getTransaction(ref.id, reader_1.PROOF);
|
|
188
|
+
if (!tx) {
|
|
189
|
+
throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'a receipt without its transaction');
|
|
190
|
+
}
|
|
191
|
+
success = (0, decode_1.tokenTransferLanded)(client.abi, tx, receipt);
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
included: true,
|
|
195
|
+
success,
|
|
196
|
+
blockHeight: receipt.blockNumber,
|
|
197
|
+
blockHash: receipt.blockHash,
|
|
198
|
+
txHash: receipt.transactionHash,
|
|
199
|
+
};
|
|
200
|
+
}),
|
|
201
|
+
slotConsumed: (ordering, from, level) => undecided(async () => {
|
|
202
|
+
if (ordering.kind !== 'nonce')
|
|
203
|
+
return false;
|
|
204
|
+
if (level === 'latest') {
|
|
205
|
+
return ((await client.getTransactionCount(from, 'latest', reader_1.MONITOR)) > ordering.nonce);
|
|
206
|
+
}
|
|
207
|
+
// The nonce at a height the quorum attests final (one endpoint's view proposes
|
|
208
|
+
// it, trailed by PEER_SKEW), on tag and confirmation networks alike. State at a final
|
|
209
|
+
// height never changes, so honest endpoints agree however their heads move, and one
|
|
210
|
+
// that over-reports its finalized block cannot advance the height. A number,
|
|
211
|
+
// not the `finalized` tag: some nodes (BSC's) serve no state at the tag.
|
|
212
|
+
const { height } = await (0, reader_1.provenFinal)(ctx, reader_1.PROOF);
|
|
213
|
+
const count = await client.getTransactionCount(from, height, {
|
|
214
|
+
...reader_1.PROOF,
|
|
215
|
+
quorumKey: nonceAbove(ordering.nonce),
|
|
216
|
+
});
|
|
217
|
+
return count > ordering.nonce;
|
|
218
|
+
}),
|
|
219
|
+
// Nonce ordering: an EVM transaction never expires.
|
|
220
|
+
expired: async () => false,
|
|
221
|
+
blockHash: (height, level) => undecided(async () => {
|
|
222
|
+
if (level === 'finalized') {
|
|
223
|
+
return (await (0, reader_1.finalBlockAt)(ctx, height, reader_1.PROOF))?.hash ?? null;
|
|
224
|
+
}
|
|
225
|
+
return (await client.getBlock(height, reader_1.PROOF))?.hash ?? null;
|
|
226
|
+
}),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const changed = (height) => new error_1.ProviderError('PROVIDER_INCONSISTENT', `block ${height} changed while scanning`);
|
|
230
|
+
/**
|
|
231
|
+
* Whether a block's `logsBloom` may hold `value` (a log's address or topic), by the
|
|
232
|
+
* yellow paper's M3:2048: three bits, each the low 11 bits of a byte pair of the value's
|
|
233
|
+
* keccak-256. `false` is definitive; `true` may be a false positive. No bloom may hold
|
|
234
|
+
* anything.
|
|
235
|
+
*/
|
|
236
|
+
function mayHold(bloom, value) {
|
|
237
|
+
if (bloom === undefined)
|
|
238
|
+
return true;
|
|
239
|
+
const hash = (0, sha3_1.keccak_256)((0, utils_1.hexToBytes)(value.slice(2)));
|
|
240
|
+
for (let i = 0; i < 6; i += 2) {
|
|
241
|
+
const bit = ((hash[i] << 8) | hash[i + 1]) & 2047;
|
|
242
|
+
// Bit 0 is the last byte's lowest bit.
|
|
243
|
+
const byte = 255 - (bit >> 3);
|
|
244
|
+
const bits = Number.parseInt(bloom.slice(2 + 2 * byte, 4 + 2 * byte), 16);
|
|
245
|
+
if ((bits & (1 << (bit & 7))) === 0)
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
/** Provider texts for a method they do not serve, whatever their error code. */
|
|
251
|
+
const METHOD_MISSING = /method .*(not found|not supported|does not exist|is not available)/i;
|
|
252
|
+
/**
|
|
253
|
+
* A definitive answer that the node does not serve `eth_getBlockReceipts`: JSON-RPC's
|
|
254
|
+
* "method not found" (-32601), EIP-1474's "method not supported" (-32004), or a provider's
|
|
255
|
+
* own code with a text that says so.
|
|
256
|
+
*/
|
|
257
|
+
function methodMissing(error) {
|
|
258
|
+
if (!(0, error_1.isCryptoAioError)(error, 'RPC_ERROR') || error.ambiguous)
|
|
259
|
+
return false;
|
|
260
|
+
const { rpcCode, rpcMessage } = error.details ?? {};
|
|
261
|
+
return (rpcCode === -32601 ||
|
|
262
|
+
rpcCode === -32004 ||
|
|
263
|
+
METHOD_MISSING.test(String(rpcMessage ?? '')));
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Every receipt of `block` in one call, by transaction hash. The node reads them by
|
|
267
|
+
* block, never through a log or transaction index that may lag. `undefined` when the node
|
|
268
|
+
* does not serve `eth_getBlockReceipts`.
|
|
269
|
+
*/
|
|
270
|
+
async function blockReceipts(client, block) {
|
|
271
|
+
let receipts;
|
|
272
|
+
try {
|
|
273
|
+
receipts = await client.getBlockReceipts(block.hash, reader_1.MONITOR);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
if (methodMissing(error))
|
|
277
|
+
return undefined;
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
if (receipts === null)
|
|
281
|
+
throw changed(block.number);
|
|
282
|
+
return new Map(receipts.map((receipt) => [receipt.transactionHash, receipt]));
|
|
283
|
+
}
|
|
284
|
+
/** The fallback: one `eth_getTransactionReceipt` per transaction. */
|
|
285
|
+
async function receiptsOf(client, txs) {
|
|
286
|
+
const receipts = await Promise.all(txs.map((tx) => client.getReceipt(tx.hash, reader_1.MONITOR)));
|
|
287
|
+
return new Map(receipts.flatMap((receipt, i) => receipt ? [[txs[i]?.hash, receipt]] : []));
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* The logs of every transaction of `block`. A receipt missing, or from another block, could
|
|
291
|
+
* hide a deposit, so it fails the scan retryably instead.
|
|
292
|
+
*/
|
|
293
|
+
function blockLogs(block, receipts) {
|
|
294
|
+
return block.transactions.flatMap((tx) => {
|
|
295
|
+
const receipt = receipts.get(tx.hash);
|
|
296
|
+
if (receipt?.blockHash !== block.hash)
|
|
297
|
+
throw changed(block.number);
|
|
298
|
+
return receipt.logs;
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function createEvmBlocks(ctx) {
|
|
302
|
+
const { client, config } = ctx;
|
|
303
|
+
/**
|
|
304
|
+
* The block's `Transfer` logs without block receipts: `eth_getLogs`, which a lagging
|
|
305
|
+
* log index answers empty without an error. So when it answers nothing while the header's
|
|
306
|
+
* bloom may hold the topic, every transaction's receipt is read before the empty answer
|
|
307
|
+
* is trusted: any call may have logged one.
|
|
308
|
+
*/
|
|
309
|
+
const transferLogs = async (block) => {
|
|
310
|
+
const topic = client.abi.transferTopic;
|
|
311
|
+
const logs = await client.getLogs({ blockHash: block.hash, topics: [topic] }, reader_1.MONITOR);
|
|
312
|
+
if (logs.length > 0 || !mayHold(block.logsBloom, topic))
|
|
313
|
+
return { logs };
|
|
314
|
+
const receipts = await receiptsOf(client, block.transactions);
|
|
315
|
+
return { logs: blockLogs(block, receipts), receipts };
|
|
316
|
+
};
|
|
317
|
+
return {
|
|
318
|
+
async header(height) {
|
|
319
|
+
const block = await client.getBlock(height, reader_1.MONITOR);
|
|
320
|
+
return block ? (0, reader_1.toDriverBlock)(block) : null;
|
|
321
|
+
},
|
|
322
|
+
async transactions(block, filter) {
|
|
323
|
+
const full = await client.getBlockWithTransactions(block.height, reader_1.MONITOR);
|
|
324
|
+
if (!full || full.hash !== block.hash)
|
|
325
|
+
throw changed(block.height);
|
|
326
|
+
// One call for every receipt of the block, filtered scans included.
|
|
327
|
+
let receipts = await blockReceipts(client, full);
|
|
328
|
+
let selected = full.transactions;
|
|
329
|
+
if (filter?.addresses?.length) {
|
|
330
|
+
const wanted = new Set(filter.addresses.map((a) => a.toLowerCase()));
|
|
331
|
+
const watched = (address) => address !== null && wanted.has(address.toLowerCase());
|
|
332
|
+
let logs;
|
|
333
|
+
if (receipts)
|
|
334
|
+
logs = blockLogs(full, receipts);
|
|
335
|
+
else
|
|
336
|
+
({ logs, receipts } = await transferLogs(full));
|
|
337
|
+
const tokenTxs = new Set(logs
|
|
338
|
+
.filter((log) => {
|
|
339
|
+
const transfer = client.abi.decodeTransfer(log);
|
|
340
|
+
return (transfer !== null && (watched(transfer.from) || watched(transfer.to)));
|
|
341
|
+
})
|
|
342
|
+
.map((log) => log.transactionHash));
|
|
343
|
+
// A contract creation's recipient is only in its receipt, so every creation stays.
|
|
344
|
+
selected = full.transactions.filter((tx) => tx.to === null || watched(tx.from) || watched(tx.to) || tokenTxs.has(tx.hash));
|
|
345
|
+
}
|
|
346
|
+
receipts ??= await receiptsOf(client, selected);
|
|
347
|
+
return selected.map((tx) => {
|
|
348
|
+
const receipt = receipts.get(tx.hash);
|
|
349
|
+
if (!receipt || receipt.blockHash !== block.hash)
|
|
350
|
+
throw changed(block.height);
|
|
351
|
+
// The chain's view, with the network's config so bor's system logs do not make a
|
|
352
|
+
// plain Polygon transfer `partial`.
|
|
353
|
+
return (0, decode_1.decodeTransaction)(client.abi, tx, receipt, full.timestamp, config);
|
|
354
|
+
});
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=proofs.js.map
|