crypto-aio 0.0.2 → 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/lib-types.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/adapters/ton/types.js +3 -0
- 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/core/model/transaction.js +3 -0
- 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 -44
- 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 -2
- package/dist/libs/eth/contract.js +0 -7
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -20
- package/dist/libs/eth/index.js +0 -62
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -2
- package/dist/libs/eth/transact.js +0 -7
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -1
- package/dist/libs/index.js +0 -18
- package/dist/libs/index.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 -4
- package/dist/tool/index.js +0 -21
- 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 -4
- package/dist/tool/options.js +0 -28
- package/dist/tool/options.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/index.d.ts +0 -3
- package/dist/type/index.js +0 -20
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -7
- package/dist/type/lib-types.js.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evmDriverFactory = evmDriverFactory;
|
|
4
|
+
const builder_1 = require("./builder");
|
|
5
|
+
const client_1 = require("./client");
|
|
6
|
+
const network_1 = require("./network");
|
|
7
|
+
const proofs_1 = require("./proofs");
|
|
8
|
+
const reader_1 = require("./reader");
|
|
9
|
+
const probe = async (call, method) => (0, client_1.quantity)(await call.rpc(method), method);
|
|
10
|
+
/**
|
|
11
|
+
* Identity is the decimal `eth_chainId`, the form of the network's registry identity; the
|
|
12
|
+
* height is `eth_blockNumber`. Only endpoints whose identity matches feed health heights.
|
|
13
|
+
*/
|
|
14
|
+
function probes(expectedIdentity) {
|
|
15
|
+
return {
|
|
16
|
+
identity: async (call) => (await probe(call, 'eth_chainId')).toString(),
|
|
17
|
+
...(expectedIdentity !== undefined ? { expectedIdentity } : {}),
|
|
18
|
+
height: (call) => probe(call, 'eth_blockNumber'),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function evmDriverFactory(makeClient) {
|
|
22
|
+
return {
|
|
23
|
+
async create(ctx) {
|
|
24
|
+
// The handle's options too (`maxFeePerGas`); an unknown one is refused, so a
|
|
25
|
+
// misspelt key never passes silently.
|
|
26
|
+
const config = (0, network_1.evmNetworkConfig)(ctx.chain, ctx.network, ctx.options);
|
|
27
|
+
// Probes go on every transport this driver receives, before any traffic: an
|
|
28
|
+
// endpoint without them stays unverified.
|
|
29
|
+
ctx.transport.setProbes(probes(ctx.network.identity));
|
|
30
|
+
ctx.indexer?.setProbes(probes(ctx.network.identity));
|
|
31
|
+
const client = makeClient(ctx.transport, config.chainId);
|
|
32
|
+
const evm = {
|
|
33
|
+
client,
|
|
34
|
+
chain: ctx.chain,
|
|
35
|
+
network: ctx.network,
|
|
36
|
+
config,
|
|
37
|
+
log: ctx.log,
|
|
38
|
+
};
|
|
39
|
+
const replacement = (0, builder_1.createEvmReplacement)(evm);
|
|
40
|
+
const ext = (0, reader_1.createEvmExt)(client);
|
|
41
|
+
return {
|
|
42
|
+
ordering: 'nonce',
|
|
43
|
+
capabilities: config.capabilities,
|
|
44
|
+
address: (0, reader_1.createEvmAddressCodec)(client),
|
|
45
|
+
reader: (0, reader_1.createEvmReader)(evm),
|
|
46
|
+
builder: (0, builder_1.createEvmBuilder)(evm),
|
|
47
|
+
broadcaster: (0, builder_1.createEvmBroadcaster)(client, config.chainId),
|
|
48
|
+
proofs: (0, proofs_1.createEvmProofs)(evm),
|
|
49
|
+
sequence: (0, reader_1.createEvmSequence)(client),
|
|
50
|
+
...(replacement ? { replacement } : {}),
|
|
51
|
+
blocks: (0, proofs_1.createEvmBlocks)(evm),
|
|
52
|
+
ext: { evm: { getNonce: ext.evm.getNonce } },
|
|
53
|
+
limits: () => ({ maxOutputs: 1 }),
|
|
54
|
+
// A fresh SDK client on every call, never the driver's own: a caller may mutate
|
|
55
|
+
// it (listeners, polling) without touching other handles.
|
|
56
|
+
createNativeClient: () => client.createNative(),
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/adapters/evm/driver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `EvmDriver`: all EVM logic, over the `EvmClient` strategy. One factory serves\n * every EVM chain and network; each network's registry data configures it.\n */\nimport type { ChainDriver, DriverFactory } from '../../core/driver/types';\nimport type { EndpointCall, HealthProbes, Transport } from '../../core/transport/types';\nimport { createEvmBroadcaster, createEvmBuilder, createEvmReplacement } from './builder';\nimport { quantity } from './client';\nimport { evmNetworkConfig } from './network';\nimport { createEvmBlocks, createEvmProofs } from './proofs';\nimport {\n createEvmAddressCodec,\n createEvmExt,\n createEvmReader,\n createEvmSequence,\n type EvmContext,\n} from './reader';\nimport type { EvmClient } from './types';\n\nconst probe = async (call: EndpointCall, method: string): Promise<bigint> =>\n quantity(await call.rpc<unknown>(method), method);\n\n/**\n * Identity is the decimal `eth_chainId`, the form of the network's registry identity; the\n * height is `eth_blockNumber`. Only endpoints whose identity matches feed health heights.\n */\nfunction probes(expectedIdentity: string | undefined): HealthProbes {\n return {\n identity: async (call) => (await probe(call, 'eth_chainId')).toString(),\n ...(expectedIdentity !== undefined ? { expectedIdentity } : {}),\n height: (call) => probe(call, 'eth_blockNumber'),\n };\n}\n\nexport function evmDriverFactory(\n makeClient: (transport: Transport, chainId: bigint) => EvmClient,\n): DriverFactory {\n return {\n async create(ctx): Promise<ChainDriver> {\n // The handle's options too (`maxFeePerGas`); an unknown one is refused, so a\n // misspelt key never passes silently.\n const config = evmNetworkConfig(ctx.chain, ctx.network, ctx.options);\n // Probes go on every transport this driver receives, before any traffic: an\n // endpoint without them stays unverified.\n ctx.transport.setProbes(probes(ctx.network.identity));\n ctx.indexer?.setProbes(probes(ctx.network.identity));\n const client = makeClient(ctx.transport, config.chainId);\n const evm: EvmContext = {\n client,\n chain: ctx.chain,\n network: ctx.network,\n config,\n log: ctx.log,\n };\n const replacement = createEvmReplacement(evm);\n const ext = createEvmExt(client);\n return {\n ordering: 'nonce',\n capabilities: config.capabilities,\n address: createEvmAddressCodec(client),\n reader: createEvmReader(evm),\n builder: createEvmBuilder(evm),\n broadcaster: createEvmBroadcaster(client, config.chainId),\n proofs: createEvmProofs(evm),\n sequence: createEvmSequence(client),\n ...(replacement ? { replacement } : {}),\n blocks: createEvmBlocks(evm),\n ext: { evm: { getNonce: ext.evm.getNonce } },\n limits: () => ({ maxOutputs: 1 }),\n // A fresh SDK client on every call, never the driver's own: a caller may mutate\n // it (listeners, polling) without touching other handles.\n createNativeClient: () => client.createNative(),\n };\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classifies a node's answer to `eth_sendRawTransaction`. The patterns are
|
|
3
|
+
* geth's texts (txpool and RPC), which the geth-derived clients of most built-in chains
|
|
4
|
+
* share; an Ethereum endpoint may run any client, so a text not listed here falls to the
|
|
5
|
+
* safe default, a generic refusal. The returned reasons are short, fixed texts: a
|
|
6
|
+
* node's own text can carry addresses and amounts ("insufficient funds …: address 0x… have
|
|
7
|
+
* … want …") and is never passed on. Every result is frozen, so no caller can alter a later
|
|
8
|
+
* one.
|
|
9
|
+
*/
|
|
10
|
+
import type { BroadcastResult } from '../../core/driver/types';
|
|
11
|
+
/** The node's answer at its word (see `classifyOwnBroadcast` for the bytes we sent). */
|
|
12
|
+
export declare function classifyBroadcastError(message: string): BroadcastResult;
|
|
13
|
+
/**
|
|
14
|
+
* A node's rejection is a claim. The answer to `sentHex`, the
|
|
15
|
+
* bytes this driver sent on the network whose chain id is `chainId`: a `rejected` stands
|
|
16
|
+
* only when its reason holds for those bytes, read SDK-free (`readSentTx`); otherwise it is a
|
|
17
|
+
* refusal, so a lying endpoint that relays our bytes can never end the Operation and invite
|
|
18
|
+
* a second payment. Every other answer is the node's, as `classifyBroadcastError` reads it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function classifyOwnBroadcast(message: string, sentHex: string, chainId: bigint): BroadcastResult;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.classifyBroadcastError = classifyBroadcastError;
|
|
4
|
+
exports.classifyOwnBroadcast = classifyOwnBroadcast;
|
|
5
|
+
const rawtx_1 = require("./rawtx");
|
|
6
|
+
const refused = (code, reason) => Object.freeze({ kind: 'refused', code, reason });
|
|
7
|
+
const rejected = (reason) => Object.freeze({ kind: 'rejected', reason });
|
|
8
|
+
/** Success: the node already holds these bytes, or they are already mined. */
|
|
9
|
+
const ALREADY_KNOWN = /already known|known transaction|already imported|alreadyknown|already exists|already in chain/i;
|
|
10
|
+
const ALREADY_KNOWN_RESULT = Object.freeze({ kind: 'already-known' });
|
|
11
|
+
/**
|
|
12
|
+
* State-dependent or node policy: the same bytes may become valid later or on another node,
|
|
13
|
+
* or may already be included (observed only).
|
|
14
|
+
*/
|
|
15
|
+
const REFUSED = [
|
|
16
|
+
[/nonce too low/i, refused('NONCE_CONFLICT', 'nonce too low')],
|
|
17
|
+
[/nonce too high|nonce gap/i, refused('NONCE_TOO_HIGH', 'nonce too high')],
|
|
18
|
+
[/insufficient funds/i, refused('INSUFFICIENT_FUNDS', 'insufficient funds')],
|
|
19
|
+
[
|
|
20
|
+
/replacement transaction underpriced/i,
|
|
21
|
+
refused('FEE_TOO_LOW', 'replacement underpriced'),
|
|
22
|
+
],
|
|
23
|
+
[
|
|
24
|
+
/underpriced|fee too low|less than block base fee|gas price too low|below minimum/i,
|
|
25
|
+
refused('FEE_TOO_LOW', 'fee too low'),
|
|
26
|
+
],
|
|
27
|
+
// The block gas limit can rise.
|
|
28
|
+
[
|
|
29
|
+
/exceeds block gas limit/i,
|
|
30
|
+
refused('TX_REFUSED', 'gas limit above the block gas limit'),
|
|
31
|
+
],
|
|
32
|
+
// A pool gates types on the forks active at its head (a syncing node) and on its config.
|
|
33
|
+
[
|
|
34
|
+
/transaction type not supported|tx type not supported/i,
|
|
35
|
+
refused('TX_REFUSED', 'unsupported transaction type'),
|
|
36
|
+
],
|
|
37
|
+
// Arbitrum's intrinsic gas includes the L1 poster cost, which moves.
|
|
38
|
+
[/intrinsic gas too low/i, refused('TX_REFUSED', 'gas limit below intrinsic gas')],
|
|
39
|
+
// Node policy: another node may accept the same bytes.
|
|
40
|
+
[/only replay-protected/i, refused('TX_REFUSED', 'replay protection required')],
|
|
41
|
+
[/oversized data/i, refused('TX_REFUSED', 'transaction too large')],
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Invalid by construction: these bytes can never be included on any node. Exact texts only,
|
|
45
|
+
* so a state-dependent cause that merely shares a word is never taken for one of these.
|
|
46
|
+
* `invalid chain id` comes first: geth wraps it as "invalid sender: invalid chain id …".
|
|
47
|
+
*/
|
|
48
|
+
const REJECTED = [
|
|
49
|
+
{
|
|
50
|
+
pattern: /invalid chain id/i,
|
|
51
|
+
result: rejected('wrong chain id'),
|
|
52
|
+
holds: (sent, chainId) => sent !== 'malformed' && sent.chainId !== undefined && sent.chainId !== chainId,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
pattern: /invalid sender|invalid signature|invalid transaction v, r, s values/i,
|
|
56
|
+
result: rejected('invalid signature'),
|
|
57
|
+
holds: (sent) => sent !== 'malformed' && !(0, rawtx_1.signatureValuesValid)(sent),
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
pattern: /\brlp:|typed transaction too short/i,
|
|
61
|
+
result: rejected('malformed transaction'),
|
|
62
|
+
holds: (sent) => sent === 'malformed',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
pattern: /max priority fee per gas higher than max fee per gas|tip above fee cap/i,
|
|
66
|
+
result: rejected('priority fee above the fee cap'),
|
|
67
|
+
holds: (sent) => sent !== 'malformed' &&
|
|
68
|
+
sent.type === 2 &&
|
|
69
|
+
sent.maxPriorityFeePerGas > sent.maxFeePerGas,
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
const REFUSED_BY_NODE = refused('TX_REFUSED', 'refused by the node');
|
|
73
|
+
/**
|
|
74
|
+
* `rejected` ends an Attempt without proof, so any doubt falls toward `refused`: the
|
|
75
|
+
* refusal patterns are checked first ("invalid sender: transaction type not supported" is a
|
|
76
|
+
* refusal), and an unlisted text is a refusal.
|
|
77
|
+
*/
|
|
78
|
+
function classified(message) {
|
|
79
|
+
if (ALREADY_KNOWN.test(message))
|
|
80
|
+
return { result: ALREADY_KNOWN_RESULT };
|
|
81
|
+
for (const [pattern, result] of REFUSED) {
|
|
82
|
+
if (pattern.test(message))
|
|
83
|
+
return { result };
|
|
84
|
+
}
|
|
85
|
+
const rejection = REJECTED.find((entry) => entry.pattern.test(message));
|
|
86
|
+
return rejection
|
|
87
|
+
? { result: rejection.result, rejection }
|
|
88
|
+
: { result: REFUSED_BY_NODE };
|
|
89
|
+
}
|
|
90
|
+
/** The node's answer at its word (see `classifyOwnBroadcast` for the bytes we sent). */
|
|
91
|
+
function classifyBroadcastError(message) {
|
|
92
|
+
return classified(message).result;
|
|
93
|
+
}
|
|
94
|
+
/** A rejection this driver cannot confirm for the bytes it sent: observed, never terminal. */
|
|
95
|
+
const UNCONFIRMED = refused('TX_REFUSED', 'the node claimed the transaction is invalid');
|
|
96
|
+
/**
|
|
97
|
+
* A node's rejection is a claim. The answer to `sentHex`, the
|
|
98
|
+
* bytes this driver sent on the network whose chain id is `chainId`: a `rejected` stands
|
|
99
|
+
* only when its reason holds for those bytes, read SDK-free (`readSentTx`); otherwise it is a
|
|
100
|
+
* refusal, so a lying endpoint that relays our bytes can never end the Operation and invite
|
|
101
|
+
* a second payment. Every other answer is the node's, as `classifyBroadcastError` reads it.
|
|
102
|
+
*/
|
|
103
|
+
function classifyOwnBroadcast(message, sentHex, chainId) {
|
|
104
|
+
const { result, rejection } = classified(message);
|
|
105
|
+
if (!rejection)
|
|
106
|
+
return result;
|
|
107
|
+
const sent = (0, rawtx_1.readSentTx)(sentHex);
|
|
108
|
+
return sent !== undefined && rejection.holds(sent, chainId) ? result : UNCONFIRMED;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/adapters/evm/errors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Classifies a node's answer to `eth_sendRawTransaction`. The patterns are\n * geth's texts (txpool and RPC), which the geth-derived clients of most built-in chains\n * share; an Ethereum endpoint may run any client, so a text not listed here falls to the\n * safe default, a generic refusal. The returned reasons are short, fixed texts: a\n * node's own text can carry addresses and amounts (\"insufficient funds …: address 0x… have\n * … want …\") and is never passed on. Every result is frozen, so no caller can alter a later\n * one.\n */\nimport type { BroadcastResult } from '../../core/driver/types';\nimport { readSentTx, signatureValuesValid, type EvmSentTx } from './rawtx';\n\ntype RefusalCode = Extract<BroadcastResult, { kind: 'refused' }>['code'];\n\nconst refused = (code: RefusalCode, reason: string): BroadcastResult =>\n Object.freeze({ kind: 'refused', code, reason });\nconst rejected = (reason: string): BroadcastResult =>\n Object.freeze({ kind: 'rejected', reason });\n\n/** Success: the node already holds these bytes, or they are already mined. */\nconst ALREADY_KNOWN =\n /already known|known transaction|already imported|alreadyknown|already exists|already in chain/i;\nconst ALREADY_KNOWN_RESULT: BroadcastResult = Object.freeze({ kind: 'already-known' });\n\n/**\n * State-dependent or node policy: the same bytes may become valid later or on another node,\n * or may already be included (observed only).\n */\nconst REFUSED: readonly (readonly [RegExp, BroadcastResult])[] = [\n [/nonce too low/i, refused('NONCE_CONFLICT', 'nonce too low')],\n [/nonce too high|nonce gap/i, refused('NONCE_TOO_HIGH', 'nonce too high')],\n [/insufficient funds/i, refused('INSUFFICIENT_FUNDS', 'insufficient funds')],\n [\n /replacement transaction underpriced/i,\n refused('FEE_TOO_LOW', 'replacement underpriced'),\n ],\n [\n /underpriced|fee too low|less than block base fee|gas price too low|below minimum/i,\n refused('FEE_TOO_LOW', 'fee too low'),\n ],\n // The block gas limit can rise.\n [\n /exceeds block gas limit/i,\n refused('TX_REFUSED', 'gas limit above the block gas limit'),\n ],\n // A pool gates types on the forks active at its head (a syncing node) and on its config.\n [\n /transaction type not supported|tx type not supported/i,\n refused('TX_REFUSED', 'unsupported transaction type'),\n ],\n // Arbitrum's intrinsic gas includes the L1 poster cost, which moves.\n [/intrinsic gas too low/i, refused('TX_REFUSED', 'gas limit below intrinsic gas')],\n // Node policy: another node may accept the same bytes.\n [/only replay-protected/i, refused('TX_REFUSED', 'replay protection required')],\n [/oversized data/i, refused('TX_REFUSED', 'transaction too large')],\n];\n\n/** A rejection and the check that confirms it for the bytes we sent. */\ninterface Rejection {\n readonly pattern: RegExp;\n readonly result: BroadcastResult;\n readonly holds: (sent: EvmSentTx | 'malformed', chainId: bigint) => boolean;\n}\n\n/**\n * Invalid by construction: these bytes can never be included on any node. Exact texts only,\n * so a state-dependent cause that merely shares a word is never taken for one of these.\n * `invalid chain id` comes first: geth wraps it as \"invalid sender: invalid chain id …\".\n */\nconst REJECTED: readonly Rejection[] = [\n {\n pattern: /invalid chain id/i,\n result: rejected('wrong chain id'),\n holds: (sent, chainId) =>\n sent !== 'malformed' && sent.chainId !== undefined && sent.chainId !== chainId,\n },\n {\n pattern: /invalid sender|invalid signature|invalid transaction v, r, s values/i,\n result: rejected('invalid signature'),\n holds: (sent) => sent !== 'malformed' && !signatureValuesValid(sent),\n },\n {\n pattern: /\\brlp:|typed transaction too short/i,\n result: rejected('malformed transaction'),\n holds: (sent) => sent === 'malformed',\n },\n {\n pattern: /max priority fee per gas higher than max fee per gas|tip above fee cap/i,\n result: rejected('priority fee above the fee cap'),\n holds: (sent) =>\n sent !== 'malformed' &&\n sent.type === 2 &&\n (sent.maxPriorityFeePerGas as bigint) > (sent.maxFeePerGas as bigint),\n },\n];\n\nconst REFUSED_BY_NODE = refused('TX_REFUSED', 'refused by the node');\n\n/**\n * `rejected` ends an Attempt without proof, so any doubt falls toward `refused`: the\n * refusal patterns are checked first (\"invalid sender: transaction type not supported\" is a\n * refusal), and an unlisted text is a refusal.\n */\nfunction classified(message: string): {\n readonly result: BroadcastResult;\n readonly rejection?: Rejection;\n} {\n if (ALREADY_KNOWN.test(message)) return { result: ALREADY_KNOWN_RESULT };\n for (const [pattern, result] of REFUSED) {\n if (pattern.test(message)) return { result };\n }\n const rejection = REJECTED.find((entry) => entry.pattern.test(message));\n return rejection\n ? { result: rejection.result, rejection }\n : { result: REFUSED_BY_NODE };\n}\n\n/** The node's answer at its word (see `classifyOwnBroadcast` for the bytes we sent). */\nexport function classifyBroadcastError(message: string): BroadcastResult {\n return classified(message).result;\n}\n\n/** A rejection this driver cannot confirm for the bytes it sent: observed, never terminal. */\nconst UNCONFIRMED: BroadcastResult = refused(\n 'TX_REFUSED',\n 'the node claimed the transaction is invalid',\n);\n\n/**\n * A node's rejection is a claim. The answer to `sentHex`, the\n * bytes this driver sent on the network whose chain id is `chainId`: a `rejected` stands\n * only when its reason holds for those bytes, read SDK-free (`readSentTx`); otherwise it is a\n * refusal, so a lying endpoint that relays our bytes can never end the Operation and invite\n * a second payment. Every other answer is the node's, as `classifyBroadcastError` reads it.\n */\nexport function classifyOwnBroadcast(\n message: string,\n sentHex: string,\n chainId: bigint,\n): BroadcastResult {\n const { result, rejection } = classified(message);\n if (!rejection) return result;\n const sent = readSentTx(sentHex);\n return sent !== undefined && rejection.holds(sent, chainId) ? result : UNCONFIRMED;\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `EthersClient`: the ethers v6 strategy (the EVM default). Driver I/O goes straight to the
|
|
3
|
+
* core transport under each call's tags, never through ethers' provider: ethers' request
|
|
4
|
+
* queue drains on a real 0 ms timer that fake-clock tests cannot step deterministically,
|
|
5
|
+
* and the driver needs none of it (one request per call). ethers does the codec work, and
|
|
6
|
+
* `TransportJsonRpcProvider` (static network, no batching, no cache, no polling, `_send` →
|
|
7
|
+
* transport) is the `crypto-aio/native` client.
|
|
8
|
+
*/
|
|
9
|
+
import { JsonRpcApiProvider, Network, type JsonRpcPayload, type JsonRpcResult } from 'ethers';
|
|
10
|
+
import type { DisposableNativeClient } from '../../core/driver/types';
|
|
11
|
+
import type { Transport } from '../../core/transport/types';
|
|
12
|
+
import { EvmClientBase } from './client';
|
|
13
|
+
import type { EvmAbi, EvmCallTags, EvmSignature, EvmTxFields } from './types';
|
|
14
|
+
type Call = (method: string, params: unknown) => Promise<unknown>;
|
|
15
|
+
/**
|
|
16
|
+
* The ethers provider bridged onto the core transport through `call`: the native client
|
|
17
|
+
* only.
|
|
18
|
+
*/
|
|
19
|
+
export declare class TransportJsonRpcProvider extends JsonRpcApiProvider {
|
|
20
|
+
#private;
|
|
21
|
+
constructor(network: Network, call: Call);
|
|
22
|
+
_send(payload: JsonRpcPayload | JsonRpcPayload[]): Promise<JsonRpcResult[]>;
|
|
23
|
+
}
|
|
24
|
+
export declare class EthersClient extends EvmClientBase {
|
|
25
|
+
#private;
|
|
26
|
+
readonly library = "ethers";
|
|
27
|
+
readonly abi: EvmAbi;
|
|
28
|
+
constructor(transport: Transport, chainId: bigint);
|
|
29
|
+
protected send(method: string, params: readonly unknown[], tags: EvmCallTags): Promise<unknown>;
|
|
30
|
+
isAddress(value: string): boolean;
|
|
31
|
+
checksum(address: string): string;
|
|
32
|
+
addressFromPublicKey(publicKey: Uint8Array): string;
|
|
33
|
+
protected encodeUnsigned(tx: EvmTxFields): string;
|
|
34
|
+
protected hashUnsigned(tx: EvmTxFields): string;
|
|
35
|
+
protected encodeSigned(tx: EvmTxFields, signature: EvmSignature): {
|
|
36
|
+
raw: string;
|
|
37
|
+
hash: string;
|
|
38
|
+
};
|
|
39
|
+
createNative(): DisposableNativeClient;
|
|
40
|
+
}
|
|
41
|
+
/** The `ethers` adapter's driver factory; the manifest's `load()` returns it. */
|
|
42
|
+
export declare const ethersDriverFactory: import("../../core/driver/types").DriverFactory;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ethersDriverFactory = exports.EthersClient = exports.TransportJsonRpcProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* `EthersClient`: the ethers v6 strategy (the EVM default). Driver I/O goes straight to the
|
|
6
|
+
* core transport under each call's tags, never through ethers' provider: ethers' request
|
|
7
|
+
* queue drains on a real 0 ms timer that fake-clock tests cannot step deterministically,
|
|
8
|
+
* and the driver needs none of it (one request per call). ethers does the codec work, and
|
|
9
|
+
* `TransportJsonRpcProvider` (static network, no batching, no cache, no polling, `_send` →
|
|
10
|
+
* transport) is the `crypto-aio/native` client.
|
|
11
|
+
*/
|
|
12
|
+
const ethers_1 = require("ethers");
|
|
13
|
+
const client_1 = require("./client");
|
|
14
|
+
const driver_1 = require("./driver");
|
|
15
|
+
const rpc_1 = require("./rpc");
|
|
16
|
+
/**
|
|
17
|
+
* The ethers provider bridged onto the core transport through `call`: the native client
|
|
18
|
+
* only.
|
|
19
|
+
*/
|
|
20
|
+
class TransportJsonRpcProvider extends ethers_1.JsonRpcApiProvider {
|
|
21
|
+
#call;
|
|
22
|
+
constructor(network, call) {
|
|
23
|
+
super(network, { staticNetwork: network, batchMaxCount: 1, cacheTimeout: -1 });
|
|
24
|
+
this.#call = call;
|
|
25
|
+
this._start();
|
|
26
|
+
}
|
|
27
|
+
async _send(payload) {
|
|
28
|
+
const results = [];
|
|
29
|
+
for (const item of Array.isArray(payload) ? payload : [payload]) {
|
|
30
|
+
results.push({ id: item.id, result: await this.#call(item.method, item.params) });
|
|
31
|
+
}
|
|
32
|
+
return results;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.TransportJsonRpcProvider = TransportJsonRpcProvider;
|
|
36
|
+
const coder = ethers_1.AbiCoder.defaultAbiCoder();
|
|
37
|
+
const erc20 = new ethers_1.Interface([
|
|
38
|
+
'function transfer(address to, uint256 amount)',
|
|
39
|
+
'function balanceOf(address owner) view returns (uint256)',
|
|
40
|
+
'function decimals() view returns (uint8)',
|
|
41
|
+
'function symbol() view returns (string)',
|
|
42
|
+
'event Transfer(address indexed from, address indexed to, uint256 amount)',
|
|
43
|
+
]);
|
|
44
|
+
const gasPriceOracle = new ethers_1.Interface([
|
|
45
|
+
'function getL1Fee(bytes data) view returns (uint256)',
|
|
46
|
+
]);
|
|
47
|
+
const TRANSFER_TOPIC = erc20.getEvent('Transfer')?.topicHash;
|
|
48
|
+
const ethersAbi = {
|
|
49
|
+
transferTopic: TRANSFER_TOPIC,
|
|
50
|
+
encodeTransfer: (to, amount) => erc20.encodeFunctionData('transfer', [to, amount]),
|
|
51
|
+
encodeBalanceOf: (owner) => erc20.encodeFunctionData('balanceOf', [owner]),
|
|
52
|
+
encodeDecimals: () => erc20.encodeFunctionData('decimals', []),
|
|
53
|
+
encodeSymbol: () => erc20.encodeFunctionData('symbol', []),
|
|
54
|
+
encodeGetL1Fee: (unsignedTx) => gasPriceOracle.encodeFunctionData('getL1Fee', [unsignedTx]),
|
|
55
|
+
decodeUint256: (data) => {
|
|
56
|
+
if (!client_1.ABI_WORD.test(data))
|
|
57
|
+
throw new Error('not one ABI word');
|
|
58
|
+
return coder.decode(['uint256'], data)[0];
|
|
59
|
+
},
|
|
60
|
+
decodeString: (data) => coder.decode(['string'], data)[0],
|
|
61
|
+
decodeTransfer: (log) => {
|
|
62
|
+
const words = (0, client_1.transferLogWords)(log, TRANSFER_TOPIC);
|
|
63
|
+
if (!words)
|
|
64
|
+
return null;
|
|
65
|
+
return {
|
|
66
|
+
from: (0, ethers_1.getAddress)(coder.decode(['address'], words.from)[0]),
|
|
67
|
+
to: (0, ethers_1.getAddress)(coder.decode(['address'], words.to)[0]),
|
|
68
|
+
amount: coder.decode(['uint256'], words.data)[0],
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
function toEthers(tx, signature) {
|
|
73
|
+
const common = {
|
|
74
|
+
chainId: tx.chainId,
|
|
75
|
+
nonce: Number(tx.nonce),
|
|
76
|
+
to: tx.to,
|
|
77
|
+
value: tx.value,
|
|
78
|
+
data: tx.data,
|
|
79
|
+
gasLimit: tx.gasLimit,
|
|
80
|
+
};
|
|
81
|
+
const built = ethers_1.Transaction.from(tx.type === 'eip1559'
|
|
82
|
+
? {
|
|
83
|
+
...common,
|
|
84
|
+
type: 2,
|
|
85
|
+
maxFeePerGas: tx.maxFeePerGas,
|
|
86
|
+
maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
|
|
87
|
+
}
|
|
88
|
+
: { ...common, type: 0, gasPrice: tx.gasPrice });
|
|
89
|
+
if (signature)
|
|
90
|
+
built.signature = ethers_1.Signature.from(signature);
|
|
91
|
+
return built;
|
|
92
|
+
}
|
|
93
|
+
class EthersClient extends client_1.EvmClientBase {
|
|
94
|
+
library = 'ethers';
|
|
95
|
+
abi = ethersAbi;
|
|
96
|
+
#transport;
|
|
97
|
+
#network;
|
|
98
|
+
constructor(transport, chainId) {
|
|
99
|
+
super(chainId);
|
|
100
|
+
this.#transport = transport;
|
|
101
|
+
// A plain network: ethers' known networks carry plugins (ENS, gas stations) we never use.
|
|
102
|
+
this.#network = new ethers_1.Network('crypto-aio', chainId);
|
|
103
|
+
}
|
|
104
|
+
send(method, params, tags) {
|
|
105
|
+
// No SDK queue, and so no real timer, between a driver call and the transport.
|
|
106
|
+
return (0, rpc_1.transportCall)(this.#transport, method, [...params], tags);
|
|
107
|
+
}
|
|
108
|
+
isAddress(value) {
|
|
109
|
+
return client_1.ADDRESS.test(value) && (0, ethers_1.isAddress)(value);
|
|
110
|
+
}
|
|
111
|
+
checksum(address) {
|
|
112
|
+
return this.checked(address, ethers_1.getAddress);
|
|
113
|
+
}
|
|
114
|
+
addressFromPublicKey(publicKey) {
|
|
115
|
+
return (0, ethers_1.computeAddress)((0, ethers_1.hexlify)((0, client_1.uncompressedPublicKey)(publicKey)));
|
|
116
|
+
}
|
|
117
|
+
encodeUnsigned(tx) {
|
|
118
|
+
return toEthers(tx).unsignedSerialized;
|
|
119
|
+
}
|
|
120
|
+
hashUnsigned(tx) {
|
|
121
|
+
return toEthers(tx).unsignedHash;
|
|
122
|
+
}
|
|
123
|
+
encodeSigned(tx, signature) {
|
|
124
|
+
const signed = toEthers(tx, signature);
|
|
125
|
+
return { raw: signed.serialized, hash: signed.hash };
|
|
126
|
+
}
|
|
127
|
+
createNative() {
|
|
128
|
+
const client = new TransportJsonRpcProvider(this.#network, (method, params) => (0, rpc_1.transportCall)(this.#transport, method, params, (0, rpc_1.nativeTags)(method)));
|
|
129
|
+
return { client, close: () => client.destroy() };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.EthersClient = EthersClient;
|
|
133
|
+
/** The `ethers` adapter's driver factory; the manifest's `load()` returns it. */
|
|
134
|
+
exports.ethersDriverFactory = (0, driver_1.evmDriverFactory)((transport, chainId) => new EthersClient(transport, chainId));
|
|
135
|
+
//# sourceMappingURL=ethers-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ethers-client.js","sourceRoot":"","sources":["../../../src/adapters/evm/ethers-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `EthersClient`: the ethers v6 strategy (the EVM default). Driver I/O goes straight to the\n * core transport under each call's tags, never through ethers' provider: ethers' request\n * queue drains on a real 0 ms timer that fake-clock tests cannot step deterministically,\n * and the driver needs none of it (one request per call). ethers does the codec work, and\n * `TransportJsonRpcProvider` (static network, no batching, no cache, no polling, `_send` →\n * transport) is the `crypto-aio/native` client.\n */\nimport {\n AbiCoder,\n Interface,\n JsonRpcApiProvider,\n Network,\n Signature,\n Transaction,\n computeAddress,\n getAddress,\n hexlify,\n isAddress,\n type JsonRpcPayload,\n type JsonRpcResult,\n} from 'ethers';\nimport type { DisposableNativeClient } from '../../core/driver/types';\nimport type { Transport } from '../../core/transport/types';\nimport {\n ABI_WORD,\n ADDRESS,\n EvmClientBase,\n transferLogWords,\n uncompressedPublicKey,\n} from './client';\nimport { evmDriverFactory } from './driver';\nimport { nativeTags, transportCall } from './rpc';\nimport type { EvmAbi, EvmCallTags, EvmSignature, EvmTxFields } from './types';\n\ntype Call = (method: string, params: unknown) => Promise<unknown>;\n\n/**\n * The ethers provider bridged onto the core transport through `call`: the native client\n * only.\n */\nexport class TransportJsonRpcProvider extends JsonRpcApiProvider {\n readonly #call: Call;\n\n constructor(network: Network, call: Call) {\n super(network, { staticNetwork: network, batchMaxCount: 1, cacheTimeout: -1 });\n this.#call = call;\n this._start();\n }\n\n override async _send(\n payload: JsonRpcPayload | JsonRpcPayload[],\n ): Promise<JsonRpcResult[]> {\n const results: JsonRpcResult[] = [];\n for (const item of Array.isArray(payload) ? payload : [payload]) {\n results.push({ id: item.id, result: await this.#call(item.method, item.params) });\n }\n return results;\n }\n}\n\nconst coder = AbiCoder.defaultAbiCoder();\nconst erc20 = new Interface([\n 'function transfer(address to, uint256 amount)',\n 'function balanceOf(address owner) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n 'function symbol() view returns (string)',\n 'event Transfer(address indexed from, address indexed to, uint256 amount)',\n]);\nconst gasPriceOracle = new Interface([\n 'function getL1Fee(bytes data) view returns (uint256)',\n]);\nconst TRANSFER_TOPIC = erc20.getEvent('Transfer')?.topicHash as string;\n\nconst ethersAbi: EvmAbi = {\n transferTopic: TRANSFER_TOPIC,\n encodeTransfer: (to, amount) => erc20.encodeFunctionData('transfer', [to, amount]),\n encodeBalanceOf: (owner) => erc20.encodeFunctionData('balanceOf', [owner]),\n encodeDecimals: () => erc20.encodeFunctionData('decimals', []),\n encodeSymbol: () => erc20.encodeFunctionData('symbol', []),\n encodeGetL1Fee: (unsignedTx) =>\n gasPriceOracle.encodeFunctionData('getL1Fee', [unsignedTx]),\n decodeUint256: (data) => {\n if (!ABI_WORD.test(data)) throw new Error('not one ABI word');\n return coder.decode(['uint256'], data)[0] as bigint;\n },\n decodeString: (data) => coder.decode(['string'], data)[0] as string,\n decodeTransfer: (log) => {\n const words = transferLogWords(log, TRANSFER_TOPIC);\n if (!words) return null;\n return {\n from: getAddress(coder.decode(['address'], words.from)[0] as string),\n to: getAddress(coder.decode(['address'], words.to)[0] as string),\n amount: coder.decode(['uint256'], words.data)[0] as bigint,\n };\n },\n};\n\nfunction toEthers(tx: EvmTxFields, signature?: EvmSignature): Transaction {\n const common = {\n chainId: tx.chainId,\n nonce: Number(tx.nonce),\n to: tx.to,\n value: tx.value,\n data: tx.data,\n gasLimit: tx.gasLimit,\n };\n const built = Transaction.from(\n tx.type === 'eip1559'\n ? {\n ...common,\n type: 2,\n maxFeePerGas: tx.maxFeePerGas,\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas,\n }\n : { ...common, type: 0, gasPrice: tx.gasPrice },\n );\n if (signature) built.signature = Signature.from(signature);\n return built;\n}\n\nexport class EthersClient extends EvmClientBase {\n readonly library = 'ethers';\n readonly abi = ethersAbi;\n readonly #transport: Transport;\n readonly #network: Network;\n\n constructor(transport: Transport, chainId: bigint) {\n super(chainId);\n this.#transport = transport;\n // A plain network: ethers' known networks carry plugins (ENS, gas stations) we never use.\n this.#network = new Network('crypto-aio', chainId);\n }\n\n protected send(\n method: string,\n params: readonly unknown[],\n tags: EvmCallTags,\n ): Promise<unknown> {\n // No SDK queue, and so no real timer, between a driver call and the transport.\n return transportCall(this.#transport, method, [...params], tags);\n }\n\n isAddress(value: string): boolean {\n return ADDRESS.test(value) && isAddress(value);\n }\n\n checksum(address: string): string {\n return this.checked(address, getAddress);\n }\n\n addressFromPublicKey(publicKey: Uint8Array): string {\n return computeAddress(hexlify(uncompressedPublicKey(publicKey)));\n }\n\n protected encodeUnsigned(tx: EvmTxFields): string {\n return toEthers(tx).unsignedSerialized;\n }\n\n protected hashUnsigned(tx: EvmTxFields): string {\n return toEthers(tx).unsignedHash;\n }\n\n protected encodeSigned(\n tx: EvmTxFields,\n signature: EvmSignature,\n ): { raw: string; hash: string } {\n const signed = toEthers(tx, signature);\n return { raw: signed.serialized, hash: signed.hash as string };\n }\n\n createNative(): DisposableNativeClient {\n const client = new TransportJsonRpcProvider(this.#network, (method, params) =>\n transportCall(this.#transport, method, params, nativeTags(method)),\n );\n return { client, close: () => client.destroy() };\n }\n}\n\n/** The `ethers` adapter's driver factory; the manifest's `load()` returns it. */\nexport const ethersDriverFactory = evmDriverFactory(\n (transport, chainId) => new EthersClient(transport, chainId),\n);\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { FeeEstimateDraft, FeeOverride, FeeSpeed } from '../../core/model/fee';
|
|
2
|
+
import type { EvmFeeHistory } from './types';
|
|
3
|
+
export type EvmFeeModel = 'evm-1559' | 'evm-legacy';
|
|
4
|
+
/** The per-gas prices of one transaction. */
|
|
5
|
+
export type EvmFeeParams = {
|
|
6
|
+
readonly type: 'eip1559';
|
|
7
|
+
readonly maxFeePerGas: bigint;
|
|
8
|
+
readonly maxPriorityFeePerGas: bigint;
|
|
9
|
+
} | {
|
|
10
|
+
readonly type: 'legacy';
|
|
11
|
+
readonly gasPrice: bigint;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* `eth_feeHistory` window and priority-fee percentiles for slow, normal and fast: the
|
|
15
|
+
* method the Polygon Gas Station documents (10th, 25th and 50th over the last 15 blocks).
|
|
16
|
+
*/
|
|
17
|
+
export declare const FEE_HISTORY_BLOCKS = 15;
|
|
18
|
+
export declare const FEE_PERCENTILES: readonly number[];
|
|
19
|
+
/** A plain transfer to an account without code costs exactly this much gas. */
|
|
20
|
+
export declare const TRANSFER_GAS = 21000n;
|
|
21
|
+
/** The lower median; `0n` for no values. */
|
|
22
|
+
export declare function median(values: readonly bigint[]): bigint;
|
|
23
|
+
/**
|
|
24
|
+
* EIP-1559 prices for `speed`: the tip is the median, over the window, of the speed's
|
|
25
|
+
* percentile (at least `minTip`); the cap allows the next base fee to double. The history
|
|
26
|
+
* must answer a request for `FEE_PERCENTILES`: one without the next base fee, without
|
|
27
|
+
* reward rows, or with a reward row shorter than `FEE_PERCENTILES` is a retryable
|
|
28
|
+
* `PROVIDER_UNAVAILABLE`, never a tip of `minTip`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function feesFromHistory(history: EvmFeeHistory, speed: FeeSpeed, minTip: bigint): {
|
|
31
|
+
readonly params: EvmFeeParams;
|
|
32
|
+
readonly baseFeePerGas: bigint;
|
|
33
|
+
};
|
|
34
|
+
export declare function legacyPrice(gasPrice: bigint, speed: FeeSpeed): EvmFeeParams;
|
|
35
|
+
/** The node's estimate, with headroom unless it is a plain transfer. */
|
|
36
|
+
export declare function gasLimitFrom(estimate: bigint): bigint;
|
|
37
|
+
/**
|
|
38
|
+
* The default `maxFeePerGas`, the highest price per gas an EVM transaction signs, 1,000
|
|
39
|
+
* gwei. It bounds a plain transfer at 0.021 and a 65,000-gas token transfer at 0.065 of
|
|
40
|
+
* the native coin, however an endpoint prices the fee. A network whose base fee rises
|
|
41
|
+
* above the ceiling stalls its transfers as `FEE_TOO_LOW` until the fee falls or the
|
|
42
|
+
* option is raised.
|
|
43
|
+
*/
|
|
44
|
+
export declare const DEFAULT_MAX_FEE_PER_GAS = 1000000000000n;
|
|
45
|
+
/** The highest price per gas `params` may pay: the fee cap, or the legacy gas price. */
|
|
46
|
+
export declare function priceCap(params: EvmFeeParams): bigint;
|
|
47
|
+
/**
|
|
48
|
+
* A node's suggestion within the ceiling: the fee cap or gas price at most `ceiling`,
|
|
49
|
+
* and the tip at most the fee cap. No endpoint can raise what a transfer signs.
|
|
50
|
+
*/
|
|
51
|
+
export declare function capPrice(params: EvmFeeParams, ceiling: bigint): EvmFeeParams;
|
|
52
|
+
/**
|
|
53
|
+
* Refuses, before anything is signed, a fee whose price per gas is above `ceiling` (the
|
|
54
|
+
* handle's `maxFeePerGas`), whatever produced it: an explicit override, a stored fee, or a
|
|
55
|
+
* cancel's least bump. The details carry the price and the bound as decimal strings.
|
|
56
|
+
*/
|
|
57
|
+
export declare function assertWithinCeiling(params: EvmFeeParams, ceiling: bigint): void;
|
|
58
|
+
/** Validates an `EvmFeeOverride` against the network's fee model. */
|
|
59
|
+
export declare function parseFeeOverride(override: FeeOverride, model: EvmFeeModel): {
|
|
60
|
+
readonly params: EvmFeeParams;
|
|
61
|
+
readonly gasLimit?: bigint;
|
|
62
|
+
};
|
|
63
|
+
/** The fee draft for a transaction of `gasLimit` at `params`. */
|
|
64
|
+
export declare function feeDraft(speed: FeeSpeed | 'custom', gasLimit: bigint, params: EvmFeeParams, extra?: {
|
|
65
|
+
readonly baseFeePerGas?: bigint;
|
|
66
|
+
readonly l1Fee?: bigint;
|
|
67
|
+
}): FeeEstimateDraft;
|
|
68
|
+
/** The gas limit and prices a fee draft's details hold. */
|
|
69
|
+
export declare function feeOf(details: Readonly<Record<string, unknown>>): {
|
|
70
|
+
readonly gasLimit: bigint;
|
|
71
|
+
readonly params: EvmFeeParams;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Whether `next` may replace `previous` under a txpool's `percent` price bump: each price
|
|
75
|
+
* strictly higher, and at least `percent` higher (geth), so a zero tip must still rise.
|
|
76
|
+
*/
|
|
77
|
+
export declare function meetsBump(previous: EvmFeeParams, next: EvmFeeParams, percent: number): boolean;
|
|
78
|
+
/** The smallest prices that meet the bump over `previous`: each strictly higher (geth). */
|
|
79
|
+
export declare function minimumBump(previous: EvmFeeParams, percent: number): EvmFeeParams;
|