crypto-aio 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +167 -0
- package/README.md +163 -13
- package/dist/adapters/avalanche/address.d.ts +15 -0
- package/dist/adapters/avalanche/address.js +74 -0
- package/dist/adapters/avalanche/address.js.map +1 -0
- package/dist/adapters/avalanche/api.d.ts +100 -0
- package/dist/adapters/avalanche/api.js +381 -0
- package/dist/adapters/avalanche/api.js.map +1 -0
- package/dist/adapters/avalanche/builder.d.ts +13 -0
- package/dist/adapters/avalanche/builder.js +336 -0
- package/dist/adapters/avalanche/builder.js.map +1 -0
- package/dist/adapters/avalanche/cb58.d.ts +7 -0
- package/dist/adapters/avalanche/cb58.js +49 -0
- package/dist/adapters/avalanche/cb58.js.map +1 -0
- package/dist/adapters/avalanche/chains.d.ts +21 -0
- package/dist/adapters/avalanche/chains.js +79 -0
- package/dist/adapters/avalanche/chains.js.map +1 -0
- package/dist/adapters/avalanche/codec.d.ts +94 -0
- package/dist/adapters/avalanche/codec.js +371 -0
- package/dist/adapters/avalanche/codec.js.map +1 -0
- package/dist/adapters/avalanche/context.d.ts +59 -0
- package/dist/adapters/avalanche/context.js +114 -0
- package/dist/adapters/avalanche/context.js.map +1 -0
- package/dist/adapters/avalanche/decode.d.ts +16 -0
- package/dist/adapters/avalanche/decode.js +101 -0
- package/dist/adapters/avalanche/decode.js.map +1 -0
- package/dist/adapters/avalanche/driver.d.ts +22 -0
- package/dist/adapters/avalanche/driver.js +81 -0
- package/dist/adapters/avalanche/driver.js.map +1 -0
- package/dist/adapters/avalanche/errors.d.ts +18 -0
- package/dist/adapters/avalanche/errors.js +61 -0
- package/dist/adapters/avalanche/errors.js.map +1 -0
- package/dist/adapters/avalanche/fees.d.ts +23 -0
- package/dist/adapters/avalanche/fees.js +105 -0
- package/dist/adapters/avalanche/fees.js.map +1 -0
- package/dist/adapters/avalanche/index.d.ts +19 -0
- package/dist/adapters/avalanche/index.js +8 -0
- package/dist/adapters/avalanche/index.js.map +1 -0
- package/dist/adapters/avalanche/network.d.ts +37 -0
- package/dist/adapters/avalanche/network.js +135 -0
- package/dist/adapters/avalanche/network.js.map +1 -0
- package/dist/adapters/avalanche/plugin.d.ts +21 -0
- package/dist/adapters/avalanche/plugin.js +46 -0
- package/dist/adapters/avalanche/plugin.js.map +1 -0
- package/dist/adapters/avalanche/presets.d.ts +6 -0
- package/dist/adapters/avalanche/presets.js +86 -0
- package/dist/adapters/avalanche/presets.js.map +1 -0
- package/dist/adapters/avalanche/proofs.d.ts +41 -0
- package/dist/adapters/avalanche/proofs.js +270 -0
- package/dist/adapters/avalanche/proofs.js.map +1 -0
- package/dist/adapters/avalanche/reader.d.ts +40 -0
- package/dist/adapters/avalanche/reader.js +231 -0
- package/dist/adapters/avalanche/reader.js.map +1 -0
- package/dist/adapters/avalanche/sdk.d.ts +182 -0
- package/dist/adapters/avalanche/sdk.js +21 -0
- package/dist/adapters/avalanche/sdk.js.map +1 -0
- package/dist/adapters/avalanche/types.d.ts +86 -0
- package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
- package/dist/adapters/avalanche/types.js.map +1 -0
- package/dist/adapters/evm/builder.d.ts +11 -0
- package/dist/adapters/evm/builder.js +386 -0
- package/dist/adapters/evm/builder.js.map +1 -0
- package/dist/adapters/evm/chains.d.ts +6 -0
- package/dist/adapters/evm/chains.js +203 -0
- package/dist/adapters/evm/chains.js.map +1 -0
- package/dist/adapters/evm/client.d.ts +84 -0
- package/dist/adapters/evm/client.js +335 -0
- package/dist/adapters/evm/client.js.map +1 -0
- package/dist/adapters/evm/decode.d.ts +35 -0
- package/dist/adapters/evm/decode.js +175 -0
- package/dist/adapters/evm/decode.js.map +1 -0
- package/dist/adapters/evm/driver.d.ts +8 -0
- package/dist/adapters/evm/driver.js +61 -0
- package/dist/adapters/evm/driver.js.map +1 -0
- package/dist/adapters/evm/errors.d.ts +20 -0
- package/dist/adapters/evm/errors.js +110 -0
- package/dist/adapters/evm/errors.js.map +1 -0
- package/dist/adapters/evm/ethers-client.d.ts +43 -0
- package/dist/adapters/evm/ethers-client.js +139 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +103 -0
- package/dist/adapters/evm/fees.js +277 -0
- package/dist/adapters/evm/fees.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +20 -0
- package/dist/adapters/evm/index.js +12 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +65 -0
- package/dist/adapters/evm/network.js +150 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +35 -0
- package/dist/adapters/evm/plugin.js +150 -0
- package/dist/adapters/evm/plugin.js.map +1 -0
- package/dist/adapters/evm/presets.d.ts +2 -0
- package/dist/adapters/evm/presets.js +105 -0
- package/dist/adapters/evm/presets.js.map +1 -0
- package/dist/adapters/evm/proofs.d.ts +19 -0
- package/dist/adapters/evm/proofs.js +370 -0
- package/dist/adapters/evm/proofs.js.map +1 -0
- package/dist/adapters/evm/rawtx.d.ts +25 -0
- package/dist/adapters/evm/rawtx.js +176 -0
- package/dist/adapters/evm/rawtx.js.map +1 -0
- package/dist/adapters/evm/reader.d.ts +83 -0
- package/dist/adapters/evm/reader.js +326 -0
- package/dist/adapters/evm/reader.js.map +1 -0
- package/dist/adapters/evm/rpc.d.ts +39 -0
- package/dist/adapters/evm/rpc.js +152 -0
- package/dist/adapters/evm/rpc.js.map +1 -0
- package/dist/adapters/evm/tokens.d.ts +10 -0
- package/dist/adapters/evm/tokens.js +23 -0
- package/dist/adapters/evm/tokens.js.map +1 -0
- package/dist/adapters/evm/types.d.ts +265 -0
- package/dist/{type/account.js → adapters/evm/types.js} +1 -1
- package/dist/adapters/evm/types.js.map +1 -0
- package/dist/adapters/evm/web3-client.d.ts +26 -0
- package/dist/adapters/evm/web3-client.js +176 -0
- package/dist/adapters/evm/web3-client.js.map +1 -0
- package/dist/adapters/solana/builder.d.ts +18 -0
- package/dist/adapters/solana/builder.js +556 -0
- package/dist/adapters/solana/builder.js.map +1 -0
- package/dist/adapters/solana/chains.d.ts +13 -0
- package/dist/adapters/solana/chains.js +37 -0
- package/dist/adapters/solana/chains.js.map +1 -0
- package/dist/adapters/solana/decode.d.ts +111 -0
- package/dist/adapters/solana/decode.js +595 -0
- package/dist/adapters/solana/decode.js.map +1 -0
- package/dist/adapters/solana/driver.d.ts +15 -0
- package/dist/adapters/solana/driver.js +72 -0
- package/dist/adapters/solana/driver.js.map +1 -0
- package/dist/adapters/solana/errors.d.ts +36 -0
- package/dist/adapters/solana/errors.js +154 -0
- package/dist/adapters/solana/errors.js.map +1 -0
- package/dist/adapters/solana/fees.d.ts +77 -0
- package/dist/adapters/solana/fees.js +214 -0
- package/dist/adapters/solana/fees.js.map +1 -0
- package/dist/adapters/solana/heights.d.ts +47 -0
- package/dist/adapters/solana/heights.js +185 -0
- package/dist/adapters/solana/heights.js.map +1 -0
- package/dist/adapters/solana/history.d.ts +10 -0
- package/dist/adapters/solana/history.js +71 -0
- package/dist/adapters/solana/history.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +16 -0
- package/dist/adapters/solana/index.js +9 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/keys.d.ts +13 -0
- package/dist/adapters/solana/keys.js +69 -0
- package/dist/adapters/solana/keys.js.map +1 -0
- package/dist/adapters/solana/message.d.ts +15 -0
- package/dist/adapters/solana/message.js +120 -0
- package/dist/adapters/solana/message.js.map +1 -0
- package/dist/adapters/solana/network.d.ts +24 -0
- package/dist/adapters/solana/network.js +95 -0
- package/dist/adapters/solana/network.js.map +1 -0
- package/dist/adapters/solana/plugin.d.ts +18 -0
- package/dist/adapters/solana/plugin.js +44 -0
- package/dist/adapters/solana/plugin.js.map +1 -0
- package/dist/adapters/solana/presets.d.ts +2 -0
- package/dist/adapters/solana/presets.js +77 -0
- package/dist/adapters/solana/presets.js.map +1 -0
- package/dist/adapters/solana/programs.d.ts +44 -0
- package/dist/adapters/solana/programs.js +159 -0
- package/dist/adapters/solana/programs.js.map +1 -0
- package/dist/adapters/solana/proofs.d.ts +56 -0
- package/dist/adapters/solana/proofs.js +540 -0
- package/dist/adapters/solana/proofs.js.map +1 -0
- package/dist/adapters/solana/reader.d.ts +82 -0
- package/dist/adapters/solana/reader.js +326 -0
- package/dist/adapters/solana/reader.js.map +1 -0
- package/dist/adapters/solana/rpc.d.ts +102 -0
- package/dist/adapters/solana/rpc.js +301 -0
- package/dist/adapters/solana/rpc.js.map +1 -0
- package/dist/adapters/solana/tokens.d.ts +7 -0
- package/dist/adapters/solana/tokens.js +19 -0
- package/dist/adapters/solana/tokens.js.map +1 -0
- package/dist/adapters/solana/types.d.ts +124 -0
- package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
- package/dist/adapters/solana/types.js.map +1 -0
- package/dist/adapters/solana/web3.d.ts +5 -0
- package/dist/adapters/solana/web3.js +61 -0
- package/dist/adapters/solana/web3.js.map +1 -0
- package/dist/adapters/solana/wire.d.ts +62 -0
- package/dist/adapters/solana/wire.js +168 -0
- package/dist/adapters/solana/wire.js.map +1 -0
- package/dist/adapters/ton/address.d.ts +43 -0
- package/dist/adapters/ton/address.js +168 -0
- package/dist/adapters/ton/address.js.map +1 -0
- package/dist/adapters/ton/api.d.ts +344 -0
- package/dist/adapters/ton/api.js +942 -0
- package/dist/adapters/ton/api.js.map +1 -0
- package/dist/adapters/ton/builder.d.ts +18 -0
- package/dist/adapters/ton/builder.js +701 -0
- package/dist/adapters/ton/builder.js.map +1 -0
- package/dist/adapters/ton/chains.d.ts +16 -0
- package/dist/adapters/ton/chains.js +39 -0
- package/dist/adapters/ton/chains.js.map +1 -0
- package/dist/adapters/ton/decode.d.ts +43 -0
- package/dist/adapters/ton/decode.js +219 -0
- package/dist/adapters/ton/decode.js.map +1 -0
- package/dist/adapters/ton/driver.d.ts +10 -0
- package/dist/adapters/ton/driver.js +117 -0
- package/dist/adapters/ton/driver.js.map +1 -0
- package/dist/adapters/ton/errors.d.ts +36 -0
- package/dist/adapters/ton/errors.js +89 -0
- package/dist/adapters/ton/errors.js.map +1 -0
- package/dist/adapters/ton/fees.d.ts +28 -0
- package/dist/adapters/ton/fees.js +121 -0
- package/dist/adapters/ton/fees.js.map +1 -0
- package/dist/adapters/ton/index.d.ts +16 -0
- package/dist/adapters/ton/index.js +9 -0
- package/dist/adapters/ton/index.js.map +1 -0
- package/dist/adapters/ton/messages.d.ts +157 -0
- package/dist/adapters/ton/messages.js +397 -0
- package/dist/adapters/ton/messages.js.map +1 -0
- package/dist/adapters/ton/native-client.d.ts +10 -0
- package/dist/adapters/ton/native-client.js +47 -0
- package/dist/adapters/ton/native-client.js.map +1 -0
- package/dist/adapters/ton/network.d.ts +58 -0
- package/dist/adapters/ton/network.js +207 -0
- package/dist/adapters/ton/network.js.map +1 -0
- package/dist/adapters/ton/plugin.d.ts +24 -0
- package/dist/adapters/ton/plugin.js +57 -0
- package/dist/adapters/ton/plugin.js.map +1 -0
- package/dist/adapters/ton/presets.d.ts +6 -0
- package/dist/adapters/ton/presets.js +94 -0
- package/dist/adapters/ton/presets.js.map +1 -0
- package/dist/adapters/ton/proofs.d.ts +66 -0
- package/dist/adapters/ton/proofs.js +755 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +235 -0
- package/dist/adapters/ton/reader.js +976 -0
- package/dist/adapters/ton/reader.js.map +1 -0
- package/dist/adapters/ton/tokens.d.ts +10 -0
- package/dist/adapters/ton/tokens.js +27 -0
- package/dist/adapters/ton/tokens.js.map +1 -0
- package/dist/adapters/ton/trace.d.ts +74 -0
- package/dist/adapters/ton/trace.js +303 -0
- package/dist/adapters/ton/trace.js.map +1 -0
- package/dist/adapters/ton/types.d.ts +105 -0
- package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
- package/dist/adapters/ton/types.js.map +1 -0
- package/dist/adapters/ton/wallets.d.ts +86 -0
- package/dist/adapters/ton/wallets.js +373 -0
- package/dist/adapters/ton/wallets.js.map +1 -0
- package/dist/adapters/tron/abi.d.ts +41 -0
- package/dist/adapters/tron/abi.js +112 -0
- package/dist/adapters/tron/abi.js.map +1 -0
- package/dist/adapters/tron/address.d.ts +20 -0
- package/dist/adapters/tron/address.js +110 -0
- package/dist/adapters/tron/address.js.map +1 -0
- package/dist/adapters/tron/builder.d.ts +12 -0
- package/dist/adapters/tron/builder.js +569 -0
- package/dist/adapters/tron/builder.js.map +1 -0
- package/dist/adapters/tron/chains.d.ts +12 -0
- package/dist/adapters/tron/chains.js +35 -0
- package/dist/adapters/tron/chains.js.map +1 -0
- package/dist/adapters/tron/codec.d.ts +10 -0
- package/dist/adapters/tron/codec.js +322 -0
- package/dist/adapters/tron/codec.js.map +1 -0
- package/dist/adapters/tron/decode.d.ts +52 -0
- package/dist/adapters/tron/decode.js +280 -0
- package/dist/adapters/tron/decode.js.map +1 -0
- package/dist/adapters/tron/driver.d.ts +12 -0
- package/dist/adapters/tron/driver.js +106 -0
- package/dist/adapters/tron/driver.js.map +1 -0
- package/dist/adapters/tron/errors.d.ts +74 -0
- package/dist/adapters/tron/errors.js +261 -0
- package/dist/adapters/tron/errors.js.map +1 -0
- package/dist/adapters/tron/fees.d.ts +49 -0
- package/dist/adapters/tron/fees.js +166 -0
- package/dist/adapters/tron/fees.js.map +1 -0
- package/dist/adapters/tron/http.d.ts +173 -0
- package/dist/adapters/tron/http.js +729 -0
- package/dist/adapters/tron/http.js.map +1 -0
- package/dist/adapters/tron/index.d.ts +16 -0
- package/dist/adapters/tron/index.js +15 -0
- package/dist/adapters/tron/index.js.map +1 -0
- package/dist/adapters/tron/network.d.ts +44 -0
- package/dist/adapters/tron/network.js +163 -0
- package/dist/adapters/tron/network.js.map +1 -0
- package/dist/adapters/tron/plugin.d.ts +17 -0
- package/dist/adapters/tron/plugin.js +39 -0
- package/dist/adapters/tron/plugin.js.map +1 -0
- package/dist/adapters/tron/presets.d.ts +5 -0
- package/dist/adapters/tron/presets.js +68 -0
- package/dist/adapters/tron/presets.js.map +1 -0
- package/dist/adapters/tron/proofs.d.ts +80 -0
- package/dist/adapters/tron/proofs.js +371 -0
- package/dist/adapters/tron/proofs.js.map +1 -0
- package/dist/adapters/tron/protobuf.d.ts +36 -0
- package/dist/adapters/tron/protobuf.js +90 -0
- package/dist/adapters/tron/protobuf.js.map +1 -0
- package/dist/adapters/tron/reader.d.ts +57 -0
- package/dist/adapters/tron/reader.js +220 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +9 -0
- package/dist/adapters/tron/tokens.js +14 -0
- package/dist/adapters/tron/tokens.js.map +1 -0
- package/dist/adapters/tron/types.d.ts +166 -0
- package/dist/adapters/tron/types.js +3 -0
- package/dist/adapters/tron/types.js.map +1 -0
- package/dist/adapters/utxo/address.d.ts +51 -0
- package/dist/adapters/utxo/address.js +341 -0
- package/dist/adapters/utxo/address.js.map +1 -0
- package/dist/adapters/utxo/builder.d.ts +35 -0
- package/dist/adapters/utxo/builder.js +380 -0
- package/dist/adapters/utxo/builder.js.map +1 -0
- package/dist/adapters/utxo/chains.d.ts +17 -0
- package/dist/adapters/utxo/chains.js +100 -0
- package/dist/adapters/utxo/chains.js.map +1 -0
- package/dist/adapters/utxo/codec.d.ts +120 -0
- package/dist/adapters/utxo/codec.js +408 -0
- package/dist/adapters/utxo/codec.js.map +1 -0
- package/dist/adapters/utxo/coinselect.d.ts +48 -0
- package/dist/adapters/utxo/coinselect.js +131 -0
- package/dist/adapters/utxo/coinselect.js.map +1 -0
- package/dist/adapters/utxo/context.d.ts +63 -0
- package/dist/adapters/utxo/context.js +125 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +22 -0
- package/dist/adapters/utxo/decode.js +121 -0
- package/dist/adapters/utxo/decode.js.map +1 -0
- package/dist/adapters/utxo/driver.d.ts +16 -0
- package/dist/adapters/utxo/driver.js +79 -0
- package/dist/adapters/utxo/driver.js.map +1 -0
- package/dist/adapters/utxo/ecc.d.ts +9 -0
- package/dist/adapters/utxo/ecc.js +26 -0
- package/dist/adapters/utxo/ecc.js.map +1 -0
- package/dist/adapters/utxo/errors.d.ts +52 -0
- package/dist/adapters/utxo/errors.js +191 -0
- package/dist/adapters/utxo/errors.js.map +1 -0
- package/dist/adapters/utxo/esplora.d.ts +100 -0
- package/dist/adapters/utxo/esplora.js +498 -0
- package/dist/adapters/utxo/esplora.js.map +1 -0
- package/dist/adapters/utxo/fees.d.ts +41 -0
- package/dist/adapters/utxo/fees.js +125 -0
- package/dist/adapters/utxo/fees.js.map +1 -0
- package/dist/adapters/utxo/index.d.ts +17 -0
- package/dist/adapters/utxo/index.js +8 -0
- package/dist/adapters/utxo/index.js.map +1 -0
- package/dist/adapters/utxo/network.d.ts +50 -0
- package/dist/adapters/utxo/network.js +165 -0
- package/dist/adapters/utxo/network.js.map +1 -0
- package/dist/adapters/utxo/plugin.d.ts +17 -0
- package/dist/adapters/utxo/plugin.js +41 -0
- package/dist/adapters/utxo/plugin.js.map +1 -0
- package/dist/adapters/utxo/presets.d.ts +12 -0
- package/dist/adapters/utxo/presets.js +47 -0
- package/dist/adapters/utxo/presets.js.map +1 -0
- package/dist/adapters/utxo/preview.d.ts +3 -0
- package/dist/adapters/utxo/preview.js +65 -0
- package/dist/adapters/utxo/preview.js.map +1 -0
- package/dist/adapters/utxo/proofs.d.ts +66 -0
- package/dist/adapters/utxo/proofs.js +469 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawblock.d.ts +46 -0
- package/dist/adapters/utxo/rawblock.js +159 -0
- package/dist/adapters/utxo/rawblock.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +73 -0
- package/dist/adapters/utxo/rawtx.js +264 -0
- package/dist/adapters/utxo/rawtx.js.map +1 -0
- package/dist/adapters/utxo/reader.d.ts +36 -0
- package/dist/adapters/utxo/reader.js +265 -0
- package/dist/adapters/utxo/reader.js.map +1 -0
- package/dist/adapters/utxo/sdk.d.ts +18 -0
- package/dist/adapters/utxo/sdk.js +17 -0
- package/dist/adapters/utxo/sdk.js.map +1 -0
- package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
- package/dist/adapters/utxo/signed-psbt.js +428 -0
- package/dist/adapters/utxo/signed-psbt.js.map +1 -0
- package/dist/adapters/utxo/spend.d.ts +59 -0
- package/dist/adapters/utxo/spend.js +230 -0
- package/dist/adapters/utxo/spend.js.map +1 -0
- package/dist/adapters/utxo/types.d.ts +167 -0
- package/dist/adapters/utxo/types.js +3 -0
- package/dist/adapters/utxo/types.js.map +1 -0
- package/dist/core/assets/service.d.ts +18 -0
- package/dist/core/assets/service.js +69 -0
- package/dist/core/assets/service.js.map +1 -0
- package/dist/core/blockchain/default-ref.d.ts +4 -0
- package/dist/core/blockchain/default-ref.js +16 -0
- package/dist/core/blockchain/default-ref.js.map +1 -0
- package/dist/core/blockchain/handle.d.ts +179 -0
- package/dist/core/blockchain/handle.js +579 -0
- package/dist/core/blockchain/handle.js.map +1 -0
- package/dist/core/blockchain/internal.d.ts +19 -0
- package/dist/core/blockchain/internal.js +16 -0
- package/dist/core/blockchain/internal.js.map +1 -0
- package/dist/core/blockchain/mapping.d.ts +22 -0
- package/dist/core/blockchain/mapping.js +136 -0
- package/dist/core/blockchain/mapping.js.map +1 -0
- package/dist/core/config/env.d.ts +8 -0
- package/dist/core/config/env.js +60 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/merge.d.ts +26 -0
- package/dist/core/config/merge.js +144 -0
- package/dist/core/config/merge.js.map +1 -0
- package/dist/core/config/resolve.d.ts +12 -0
- package/dist/core/config/resolve.js +251 -0
- package/dist/core/config/resolve.js.map +1 -0
- package/dist/core/config/types.d.ts +180 -0
- package/dist/core/config/types.js +3 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/container/builtins.d.ts +4 -0
- package/dist/core/container/builtins.js +13 -0
- package/dist/core/container/builtins.js.map +1 -0
- package/dist/core/container/container.d.ts +62 -0
- package/dist/core/container/container.js +500 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/default.d.ts +15 -0
- package/dist/core/container/default.js +70 -0
- package/dist/core/container/default.js.map +1 -0
- package/dist/core/container/internals.d.ts +54 -0
- package/dist/core/container/internals.js +21 -0
- package/dist/core/container/internals.js.map +1 -0
- package/dist/core/container/pool.d.ts +27 -0
- package/dist/core/container/pool.js +77 -0
- package/dist/core/container/pool.js.map +1 -0
- package/dist/core/driver/types.d.ts +379 -0
- package/dist/core/driver/types.js +3 -0
- package/dist/core/driver/types.js.map +1 -0
- package/dist/core/errors/codes.d.ts +163 -0
- package/dist/core/errors/codes.js +53 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/error.d.ts +66 -0
- package/dist/core/errors/error.js +129 -0
- package/dist/core/errors/error.js.map +1 -0
- package/dist/core/events/bus.d.ts +12 -0
- package/dist/core/events/bus.js +46 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/logger.d.ts +13 -0
- package/dist/core/events/logger.js +42 -0
- package/dist/core/events/logger.js.map +1 -0
- package/dist/core/events/types.d.ts +131 -0
- package/dist/core/events/types.js +3 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/lifecycle/engine-rules.d.ts +106 -0
- package/dist/core/lifecycle/engine-rules.js +267 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +502 -0
- package/dist/core/lifecycle/engine.js +1750 -0
- package/dist/core/lifecycle/engine.js.map +1 -0
- package/dist/core/lifecycle/evaluate.d.ts +19 -0
- package/dist/core/lifecycle/evaluate.js +77 -0
- package/dist/core/lifecycle/evaluate.js.map +1 -0
- package/dist/core/lifecycle/intent.d.ts +11 -0
- package/dist/core/lifecycle/intent.js +88 -0
- package/dist/core/lifecycle/intent.js.map +1 -0
- package/dist/core/lifecycle/monitor.d.ts +138 -0
- package/dist/core/lifecycle/monitor.js +616 -0
- package/dist/core/lifecycle/monitor.js.map +1 -0
- package/dist/core/lifecycle/observations.d.ts +17 -0
- package/dist/core/lifecycle/observations.js +59 -0
- package/dist/core/lifecycle/observations.js.map +1 -0
- package/dist/core/lifecycle/reconcile.d.ts +58 -0
- package/dist/core/lifecycle/reconcile.js +112 -0
- package/dist/core/lifecycle/reconcile.js.map +1 -0
- package/dist/core/lifecycle/views.d.ts +49 -0
- package/dist/core/lifecycle/views.js +57 -0
- package/dist/core/lifecycle/views.js.map +1 -0
- package/dist/core/lifecycle/workers.d.ts +88 -0
- package/dist/core/lifecycle/workers.js +347 -0
- package/dist/core/lifecycle/workers.js.map +1 -0
- package/dist/core/model/address.d.ts +32 -0
- package/dist/core/model/address.js +43 -0
- package/dist/core/model/address.js.map +1 -0
- package/dist/core/model/amount.d.ts +25 -0
- package/dist/core/model/amount.js +102 -0
- package/dist/core/model/amount.js.map +1 -0
- package/dist/core/model/asset.d.ts +28 -0
- package/dist/core/model/asset.js +47 -0
- package/dist/core/model/asset.js.map +1 -0
- package/dist/core/model/capability.d.ts +3 -0
- package/dist/core/model/capability.js +18 -0
- package/dist/core/model/capability.js.map +1 -0
- package/dist/core/model/chain.d.ts +63 -0
- package/dist/core/model/chain.js +8 -0
- package/dist/core/model/chain.js.map +1 -0
- package/dist/core/model/fee.d.ts +36 -0
- package/dist/core/model/fee.js +17 -0
- package/dist/core/model/fee.js.map +1 -0
- package/dist/core/model/ids.d.ts +38 -0
- package/dist/core/model/ids.js +14 -0
- package/dist/core/model/ids.js.map +1 -0
- package/dist/core/model/intent.d.ts +63 -0
- package/dist/core/model/intent.js +81 -0
- package/dist/core/model/intent.js.map +1 -0
- package/dist/core/model/ordering.d.ts +28 -0
- package/dist/core/model/ordering.js +29 -0
- package/dist/core/model/ordering.js.map +1 -0
- package/dist/core/model/transaction.d.ts +123 -0
- package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
- package/dist/core/model/transaction.js.map +1 -0
- package/dist/core/observe/scanner.d.ts +135 -0
- package/dist/core/observe/scanner.js +358 -0
- package/dist/core/observe/scanner.js.map +1 -0
- package/dist/core/ordering/reservations.d.ts +16 -0
- package/dist/core/ordering/reservations.js +53 -0
- package/dist/core/ordering/reservations.js.map +1 -0
- package/dist/core/ordering/sequence.d.ts +61 -0
- package/dist/core/ordering/sequence.js +155 -0
- package/dist/core/ordering/sequence.js.map +1 -0
- package/dist/core/registry/adapters.d.ts +10 -0
- package/dist/core/registry/adapters.js +56 -0
- package/dist/core/registry/adapters.js.map +1 -0
- package/dist/core/registry/assets.d.ts +18 -0
- package/dist/core/registry/assets.js +90 -0
- package/dist/core/registry/assets.js.map +1 -0
- package/dist/core/registry/chains.d.ts +10 -0
- package/dist/core/registry/chains.js +80 -0
- package/dist/core/registry/chains.js.map +1 -0
- package/dist/core/registry/plugin.d.ts +41 -0
- package/dist/core/registry/plugin.js +109 -0
- package/dist/core/registry/plugin.js.map +1 -0
- package/dist/core/registry/providers.d.ts +31 -0
- package/dist/core/registry/providers.js +43 -0
- package/dist/core/registry/providers.js.map +1 -0
- package/dist/core/registry/schemes.d.ts +30 -0
- package/dist/core/registry/schemes.js +84 -0
- package/dist/core/registry/schemes.js.map +1 -0
- package/dist/core/secret/fragments.d.ts +33 -0
- package/dist/core/secret/fragments.js +110 -0
- package/dist/core/secret/fragments.js.map +1 -0
- package/dist/core/secret/redact.d.ts +10 -0
- package/dist/core/secret/redact.js +110 -0
- package/dist/core/secret/redact.js.map +1 -0
- package/dist/core/secret/secret.d.ts +14 -0
- package/dist/core/secret/secret.js +42 -0
- package/dist/core/secret/secret.js.map +1 -0
- package/dist/core/signing/callback.d.ts +10 -0
- package/dist/core/signing/callback.js +22 -0
- package/dist/core/signing/callback.js.map +1 -0
- package/dist/core/signing/guard.d.ts +18 -0
- package/dist/core/signing/guard.js +72 -0
- package/dist/core/signing/guard.js.map +1 -0
- package/dist/core/signing/hd.d.ts +36 -0
- package/dist/core/signing/hd.js +167 -0
- package/dist/core/signing/hd.js.map +1 -0
- package/dist/core/signing/local.d.ts +48 -0
- package/dist/core/signing/local.js +190 -0
- package/dist/core/signing/local.js.map +1 -0
- package/dist/core/signing/orchestrator.d.ts +40 -0
- package/dist/core/signing/orchestrator.js +300 -0
- package/dist/core/signing/orchestrator.js.map +1 -0
- package/dist/core/signing/types.d.ts +64 -0
- package/dist/core/signing/types.js +3 -0
- package/dist/core/signing/types.js.map +1 -0
- package/dist/core/signing/wallet.d.ts +48 -0
- package/dist/core/signing/wallet.js +161 -0
- package/dist/core/signing/wallet.js.map +1 -0
- package/dist/core/store/clone.d.ts +25 -0
- package/dist/core/store/clone.js +71 -0
- package/dist/core/store/clone.js.map +1 -0
- package/dist/core/store/format.d.ts +20 -0
- package/dist/core/store/format.js +86 -0
- package/dist/core/store/format.js.map +1 -0
- package/dist/core/store/memory.d.ts +38 -0
- package/dist/core/store/memory.js +325 -0
- package/dist/core/store/memory.js.map +1 -0
- package/dist/core/store/types.d.ts +258 -0
- package/dist/core/store/types.js +119 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/transport/backoff.d.ts +8 -0
- package/dist/core/transport/backoff.js +27 -0
- package/dist/core/transport/backoff.js.map +1 -0
- package/dist/core/transport/circuit.d.ts +25 -0
- package/dist/core/transport/circuit.js +61 -0
- package/dist/core/transport/circuit.js.map +1 -0
- package/dist/core/transport/http-transport.d.ts +30 -0
- package/dist/core/transport/http-transport.js +1703 -0
- package/dist/core/transport/http-transport.js.map +1 -0
- package/dist/core/transport/rate-limit.d.ts +27 -0
- package/dist/core/transport/rate-limit.js +78 -0
- package/dist/core/transport/rate-limit.js.map +1 -0
- package/dist/core/transport/stale-view.d.ts +11 -0
- package/dist/core/transport/stale-view.js +17 -0
- package/dist/core/transport/stale-view.js.map +1 -0
- package/dist/core/transport/types.d.ts +159 -0
- package/dist/core/transport/types.js +6 -0
- package/dist/core/transport/types.js.map +1 -0
- package/dist/core/util/bytes.d.ts +9 -0
- package/dist/core/util/bytes.js +40 -0
- package/dist/core/util/bytes.js.map +1 -0
- package/dist/core/util/clock.d.ts +6 -0
- package/dist/core/util/clock.js +26 -0
- package/dist/core/util/clock.js.map +1 -0
- package/dist/core/util/freeze.d.ts +8 -0
- package/dist/core/util/freeze.js +31 -0
- package/dist/core/util/freeze.js.map +1 -0
- package/dist/core/util/json.d.ts +35 -0
- package/dist/core/util/json.js +174 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +27 -0
- package/dist/core/util/names.js +56 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +65 -14
- package/dist/index.js +107 -49
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +21 -0
- package/dist/native.js +44 -0
- package/dist/native.js.map +1 -0
- package/dist/testing/contracts/api.d.ts +12 -0
- package/dist/testing/contracts/api.js +58 -0
- package/dist/testing/contracts/api.js.map +1 -0
- package/dist/testing/contracts/cursors.d.ts +6 -0
- package/dist/testing/contracts/cursors.js +43 -0
- package/dist/testing/contracts/cursors.js.map +1 -0
- package/dist/testing/contracts/locks.d.ts +10 -0
- package/dist/testing/contracts/locks.js +63 -0
- package/dist/testing/contracts/locks.js.map +1 -0
- package/dist/testing/contracts/operations.d.ts +21 -0
- package/dist/testing/contracts/operations.js +737 -0
- package/dist/testing/contracts/operations.js.map +1 -0
- package/dist/testing/contracts/sequences.d.ts +6 -0
- package/dist/testing/contracts/sequences.js +68 -0
- package/dist/testing/contracts/sequences.js.map +1 -0
- package/dist/testing/env.d.ts +68 -0
- package/dist/testing/env.js +105 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/fake-chain.d.ts +118 -0
- package/dist/testing/fake-chain.js +536 -0
- package/dist/testing/fake-chain.js.map +1 -0
- package/dist/testing/fake-clock.d.ts +15 -0
- package/dist/testing/fake-clock.js +86 -0
- package/dist/testing/fake-clock.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +15 -0
- package/dist/testing/fake-driver.js +458 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/fake-fetch.d.ts +32 -0
- package/dist/testing/fake-fetch.js +81 -0
- package/dist/testing/fake-fetch.js.map +1 -0
- package/dist/testing/fake-plugin.d.ts +30 -0
- package/dist/testing/fake-plugin.js +66 -0
- package/dist/testing/fake-plugin.js.map +1 -0
- package/dist/testing/faulty-store.d.ts +38 -0
- package/dist/testing/faulty-store.js +71 -0
- package/dist/testing/faulty-store.js.map +1 -0
- package/dist/testing/generation.d.ts +60 -0
- package/dist/testing/generation.js +252 -0
- package/dist/testing/generation.js.map +1 -0
- package/dist/testing/index.d.ts +28 -0
- package/dist/testing/index.js +51 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +198 -45
- package/dist/libs/eth/account.d.ts +0 -9
- package/dist/libs/eth/account.js +0 -58
- package/dist/libs/eth/account.js.map +0 -1
- package/dist/libs/eth/contract.d.ts +0 -7
- package/dist/libs/eth/contract.js +0 -42
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -24
- package/dist/libs/eth/index.js +0 -72
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -7
- package/dist/libs/eth/transact.js +0 -26
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -2
- package/dist/libs/index.js +0 -19
- package/dist/libs/index.js.map +0 -1
- package/dist/libs/trx/account.d.ts +0 -9
- package/dist/libs/trx/account.js +0 -55
- package/dist/libs/trx/account.js.map +0 -1
- package/dist/libs/trx/contract.d.ts +0 -7
- package/dist/libs/trx/contract.js +0 -27
- package/dist/libs/trx/contract.js.map +0 -1
- package/dist/libs/trx/index.d.ts +0 -22
- package/dist/libs/trx/index.js +0 -64
- package/dist/libs/trx/index.js.map +0 -1
- package/dist/libs/trx/transact.d.ts +0 -7
- package/dist/libs/trx/transact.js +0 -26
- package/dist/libs/trx/transact.js.map +0 -1
- package/dist/tool/common.d.ts +0 -28
- package/dist/tool/common.js +0 -33
- package/dist/tool/common.js.map +0 -1
- package/dist/tool/eth-tools.d.ts +0 -3
- package/dist/tool/eth-tools.js +0 -33
- package/dist/tool/eth-tools.js.map +0 -1
- package/dist/tool/index.d.ts +0 -5
- package/dist/tool/index.js +0 -22
- package/dist/tool/index.js.map +0 -1
- package/dist/tool/logging.d.ts +0 -3
- package/dist/tool/logging.js +0 -11
- package/dist/tool/logging.js.map +0 -1
- package/dist/tool/options.d.ts +0 -6
- package/dist/tool/options.js +0 -41
- package/dist/tool/options.js.map +0 -1
- package/dist/tool/trx-tools.d.ts +0 -3
- package/dist/tool/trx-tools.js +0 -20
- package/dist/tool/trx-tools.js.map +0 -1
- package/dist/type/account.d.ts +0 -9
- package/dist/type/account.js.map +0 -1
- package/dist/type/common.d.ts +0 -18
- package/dist/type/common.js.map +0 -1
- package/dist/type/contract.d.ts +0 -10
- package/dist/type/contract.js.map +0 -1
- package/dist/type/index.d.ts +0 -5
- package/dist/type/index.js +0 -22
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -9
- package/dist/type/lib-types.js.map +0 -1
- package/dist/type/transact.d.ts +0 -7
- package/dist/type/transact.js.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
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
|
+
'function deprecated() view returns (bool)',
|
|
43
|
+
'event Transfer(address indexed from, address indexed to, uint256 amount)',
|
|
44
|
+
]);
|
|
45
|
+
const gasPriceOracle = new ethers_1.Interface([
|
|
46
|
+
'function getL1Fee(bytes data) view returns (uint256)',
|
|
47
|
+
'function getOperatorFee(uint256 gasUsed) view returns (uint256)',
|
|
48
|
+
]);
|
|
49
|
+
const TRANSFER_TOPIC = erc20.getEvent('Transfer')?.topicHash;
|
|
50
|
+
const ethersAbi = {
|
|
51
|
+
transferTopic: TRANSFER_TOPIC,
|
|
52
|
+
encodeTransfer: (to, amount) => erc20.encodeFunctionData('transfer', [to, amount]),
|
|
53
|
+
encodeBalanceOf: (owner) => erc20.encodeFunctionData('balanceOf', [owner]),
|
|
54
|
+
encodeDecimals: () => erc20.encodeFunctionData('decimals', []),
|
|
55
|
+
encodeSymbol: () => erc20.encodeFunctionData('symbol', []),
|
|
56
|
+
encodeDeprecated: () => erc20.encodeFunctionData('deprecated', []),
|
|
57
|
+
encodeGetL1Fee: (unsignedTx) => gasPriceOracle.encodeFunctionData('getL1Fee', [unsignedTx]),
|
|
58
|
+
encodeGetOperatorFee: (gasUsed) => gasPriceOracle.encodeFunctionData('getOperatorFee', [gasUsed]),
|
|
59
|
+
decodeUint256: (data) => {
|
|
60
|
+
if (!client_1.ABI_WORD.test(data))
|
|
61
|
+
throw new Error('not one ABI word');
|
|
62
|
+
return coder.decode(['uint256'], data)[0];
|
|
63
|
+
},
|
|
64
|
+
decodeString: (data) => coder.decode(['string'], data)[0],
|
|
65
|
+
decodeTransfer: (log) => {
|
|
66
|
+
const words = (0, client_1.transferLogWords)(log, TRANSFER_TOPIC);
|
|
67
|
+
if (!words)
|
|
68
|
+
return null;
|
|
69
|
+
return {
|
|
70
|
+
from: (0, ethers_1.getAddress)(coder.decode(['address'], words.from)[0]),
|
|
71
|
+
to: (0, ethers_1.getAddress)(coder.decode(['address'], words.to)[0]),
|
|
72
|
+
amount: coder.decode(['uint256'], words.data)[0],
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
function toEthers(tx, signature) {
|
|
77
|
+
const common = {
|
|
78
|
+
chainId: tx.chainId,
|
|
79
|
+
nonce: Number(tx.nonce),
|
|
80
|
+
to: tx.to,
|
|
81
|
+
value: tx.value,
|
|
82
|
+
data: tx.data,
|
|
83
|
+
gasLimit: tx.gasLimit,
|
|
84
|
+
};
|
|
85
|
+
const built = ethers_1.Transaction.from(tx.type === 'eip1559'
|
|
86
|
+
? {
|
|
87
|
+
...common,
|
|
88
|
+
type: 2,
|
|
89
|
+
maxFeePerGas: tx.maxFeePerGas,
|
|
90
|
+
maxPriorityFeePerGas: tx.maxPriorityFeePerGas,
|
|
91
|
+
}
|
|
92
|
+
: { ...common, type: 0, gasPrice: tx.gasPrice });
|
|
93
|
+
if (signature)
|
|
94
|
+
built.signature = ethers_1.Signature.from(signature);
|
|
95
|
+
return built;
|
|
96
|
+
}
|
|
97
|
+
class EthersClient extends client_1.EvmClientBase {
|
|
98
|
+
library = 'ethers';
|
|
99
|
+
abi = ethersAbi;
|
|
100
|
+
#transport;
|
|
101
|
+
#network;
|
|
102
|
+
constructor(transport, chainId) {
|
|
103
|
+
super(chainId);
|
|
104
|
+
this.#transport = transport;
|
|
105
|
+
// A plain network: ethers' known networks carry plugins (ENS, gas stations) we never use.
|
|
106
|
+
this.#network = new ethers_1.Network('crypto-aio', chainId);
|
|
107
|
+
}
|
|
108
|
+
send(method, params, tags) {
|
|
109
|
+
// No SDK queue, and so no real timer, between a driver call and the transport.
|
|
110
|
+
return (0, rpc_1.transportCall)(this.#transport, method, [...params], tags);
|
|
111
|
+
}
|
|
112
|
+
isAddress(value) {
|
|
113
|
+
return client_1.ADDRESS.test(value) && (0, ethers_1.isAddress)(value);
|
|
114
|
+
}
|
|
115
|
+
checksum(address) {
|
|
116
|
+
return this.checked(address, ethers_1.getAddress);
|
|
117
|
+
}
|
|
118
|
+
addressFromPublicKey(publicKey) {
|
|
119
|
+
return (0, ethers_1.computeAddress)((0, ethers_1.hexlify)((0, client_1.uncompressedPublicKey)(publicKey)));
|
|
120
|
+
}
|
|
121
|
+
encodeUnsigned(tx) {
|
|
122
|
+
return toEthers(tx).unsignedSerialized;
|
|
123
|
+
}
|
|
124
|
+
hashUnsigned(tx) {
|
|
125
|
+
return toEthers(tx).unsignedHash;
|
|
126
|
+
}
|
|
127
|
+
encodeSigned(tx, signature) {
|
|
128
|
+
const signed = toEthers(tx, signature);
|
|
129
|
+
return { raw: signed.serialized, hash: signed.hash };
|
|
130
|
+
}
|
|
131
|
+
createNative() {
|
|
132
|
+
const client = new TransportJsonRpcProvider(this.#network, (method, params) => (0, rpc_1.transportCall)(this.#transport, method, params, (0, rpc_1.nativeTags)(method)));
|
|
133
|
+
return { client, close: () => client.destroy() };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.EthersClient = EthersClient;
|
|
137
|
+
/** The `ethers` adapter's driver factory; the manifest's `load()` returns it. */
|
|
138
|
+
exports.ethersDriverFactory = (0, driver_1.evmDriverFactory)((transport, chainId) => new EthersClient(transport, chainId));
|
|
139
|
+
//# 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 'function deprecated() view returns (bool)',\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 'function getOperatorFee(uint256 gasUsed) 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 encodeDeprecated: () => erc20.encodeFunctionData('deprecated', []),\n encodeGetL1Fee: (unsignedTx) =>\n gasPriceOracle.encodeFunctionData('getL1Fee', [unsignedTx]),\n encodeGetOperatorFee: (gasUsed) =>\n gasPriceOracle.encodeFunctionData('getOperatorFee', [gasUsed]),\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,103 @@
|
|
|
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
|
+
/**
|
|
59
|
+
* The default `maxGasLimit`, the highest gas limit an EVM transaction signs: 16,777,216
|
|
60
|
+
* (2^24), the per-transaction cap Ethereum enforces since Fusaka (EIP-7825), so no
|
|
61
|
+
* transaction above it is included there. A transfer this driver builds needs a small
|
|
62
|
+
* fraction of it (21,000 gas for a plain transfer, tens of thousands for a token's); an
|
|
63
|
+
* Arbitrum estimate also counts the L1 data fee in L2 gas, so it grows with L1 prices.
|
|
64
|
+
* Like `DEFAULT_MAX_FEE_PER_GAS`, it stops an absurd gas limit, from an endpoint's
|
|
65
|
+
* estimate or an override, not an expensive one: set the option to your own policy.
|
|
66
|
+
*/
|
|
67
|
+
export declare const DEFAULT_MAX_GAS_LIMIT = 16777216n;
|
|
68
|
+
/**
|
|
69
|
+
* Refuses, before anything is signed, a gas limit above `bound` (the handle's
|
|
70
|
+
* `maxGasLimit`), whatever produced it: the node's estimate with its headroom, an
|
|
71
|
+
* override's `gasLimit`, a stored fee, or a replacement that keeps its original's. It is
|
|
72
|
+
* never clamped: a lower limit than the call needs runs out of gas and still pays. The
|
|
73
|
+
* details carry the gas limit and the bound as decimal strings.
|
|
74
|
+
*/
|
|
75
|
+
export declare function assertWithinGasLimit(gasLimit: bigint, bound: bigint): void;
|
|
76
|
+
/** Validates an `EvmFeeOverride` against the network's fee model. */
|
|
77
|
+
export declare function parseFeeOverride(override: FeeOverride, model: EvmFeeModel): {
|
|
78
|
+
readonly params: EvmFeeParams;
|
|
79
|
+
readonly gasLimit?: bigint;
|
|
80
|
+
};
|
|
81
|
+
/** The fee draft for a transaction of `gasLimit` at `params`. */
|
|
82
|
+
export declare function feeDraft(speed: FeeSpeed | 'custom', gasLimit: bigint, params: EvmFeeParams, extra?: {
|
|
83
|
+
readonly baseFeePerGas?: bigint;
|
|
84
|
+
readonly l1Fee?: bigint;
|
|
85
|
+
readonly operatorFee?: bigint;
|
|
86
|
+
}): FeeEstimateDraft;
|
|
87
|
+
/** The gas limit and prices a fee draft's details hold. */
|
|
88
|
+
export declare function feeOf(details: Readonly<Record<string, unknown>>): {
|
|
89
|
+
readonly gasLimit: bigint;
|
|
90
|
+
readonly params: EvmFeeParams;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Orders two fee settings by what a txpool compares on replacement: the fee cap (or gas
|
|
94
|
+
* price), then the tip. A legacy gas price is compared as a fee cap and tip alike.
|
|
95
|
+
*/
|
|
96
|
+
export declare function comparePrices(a: EvmFeeParams, b: EvmFeeParams): number;
|
|
97
|
+
/**
|
|
98
|
+
* Whether `next` may replace `previous` under a txpool's `percent` price bump: each price
|
|
99
|
+
* strictly higher, and at least `percent` higher (geth), so a zero tip must still rise.
|
|
100
|
+
*/
|
|
101
|
+
export declare function meetsBump(previous: EvmFeeParams, next: EvmFeeParams, percent: number): boolean;
|
|
102
|
+
/** The smallest prices that meet the bump over `previous`: each strictly higher (geth). */
|
|
103
|
+
export declare function minimumBump(previous: EvmFeeParams, percent: number): EvmFeeParams;
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_MAX_GAS_LIMIT = exports.DEFAULT_MAX_FEE_PER_GAS = exports.TRANSFER_GAS = exports.FEE_PERCENTILES = exports.FEE_HISTORY_BLOCKS = void 0;
|
|
4
|
+
exports.median = median;
|
|
5
|
+
exports.feesFromHistory = feesFromHistory;
|
|
6
|
+
exports.legacyPrice = legacyPrice;
|
|
7
|
+
exports.gasLimitFrom = gasLimitFrom;
|
|
8
|
+
exports.priceCap = priceCap;
|
|
9
|
+
exports.capPrice = capPrice;
|
|
10
|
+
exports.assertWithinCeiling = assertWithinCeiling;
|
|
11
|
+
exports.assertWithinGasLimit = assertWithinGasLimit;
|
|
12
|
+
exports.parseFeeOverride = parseFeeOverride;
|
|
13
|
+
exports.feeDraft = feeDraft;
|
|
14
|
+
exports.feeOf = feeOf;
|
|
15
|
+
exports.comparePrices = comparePrices;
|
|
16
|
+
exports.meetsBump = meetsBump;
|
|
17
|
+
exports.minimumBump = minimumBump;
|
|
18
|
+
/**
|
|
19
|
+
* The EVM fee policy: `evm-1559` or `evm-legacy` per network, an `upper`
|
|
20
|
+
* bound with the `expected` cost in the details, overrides, and replacement bumps. Pure
|
|
21
|
+
* functions over plain data; the driver does the I/O.
|
|
22
|
+
*/
|
|
23
|
+
const error_1 = require("../../core/errors/error");
|
|
24
|
+
/**
|
|
25
|
+
* `eth_feeHistory` window and priority-fee percentiles for slow, normal and fast: the
|
|
26
|
+
* method the Polygon Gas Station documents (10th, 25th and 50th over the last 15 blocks).
|
|
27
|
+
*/
|
|
28
|
+
exports.FEE_HISTORY_BLOCKS = 15;
|
|
29
|
+
exports.FEE_PERCENTILES = [10, 25, 50];
|
|
30
|
+
const SPEED_INDEX = { slow: 0, normal: 1, fast: 2 };
|
|
31
|
+
/** Legacy networks: `eth_gasPrice` scaled per speed, in percent. */
|
|
32
|
+
const LEGACY_PERCENT = {
|
|
33
|
+
slow: 100n,
|
|
34
|
+
normal: 110n,
|
|
35
|
+
fast: 125n,
|
|
36
|
+
};
|
|
37
|
+
/** A plain transfer to an account without code costs exactly this much gas. */
|
|
38
|
+
exports.TRANSFER_GAS = 21000n;
|
|
39
|
+
/** Headroom over the node's estimate for anything but a plain transfer, in percent. */
|
|
40
|
+
const GAS_HEADROOM_PERCENT = 120n;
|
|
41
|
+
const ceilDiv = (a, b) => (a + b - 1n) / b;
|
|
42
|
+
const max = (a, b) => (a > b ? a : b);
|
|
43
|
+
const min = (a, b) => (a < b ? a : b);
|
|
44
|
+
/** The lower median; `0n` for no values. */
|
|
45
|
+
function median(values) {
|
|
46
|
+
if (values.length === 0)
|
|
47
|
+
return 0n;
|
|
48
|
+
const sorted = [...values].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
49
|
+
return sorted[Math.floor((sorted.length - 1) / 2)];
|
|
50
|
+
}
|
|
51
|
+
const malformedHistory = () => new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'malformed fee history');
|
|
52
|
+
/**
|
|
53
|
+
* EIP-1559 prices for `speed`: the tip is the median, over the window, of the speed's
|
|
54
|
+
* percentile (at least `minTip`); the cap allows the next base fee to double. The history
|
|
55
|
+
* must answer a request for `FEE_PERCENTILES`: one without the next base fee, without
|
|
56
|
+
* reward rows, or with a reward row shorter than `FEE_PERCENTILES` is a retryable
|
|
57
|
+
* `PROVIDER_UNAVAILABLE`, never a tip of `minTip`.
|
|
58
|
+
*/
|
|
59
|
+
function feesFromHistory(history, speed, minTip) {
|
|
60
|
+
const baseFeePerGas = history.baseFeePerGas[history.baseFeePerGas.length - 1];
|
|
61
|
+
if (baseFeePerGas === undefined || history.reward.length === 0) {
|
|
62
|
+
throw malformedHistory();
|
|
63
|
+
}
|
|
64
|
+
const index = SPEED_INDEX[speed];
|
|
65
|
+
const tips = history.reward.map((row) => {
|
|
66
|
+
const tip = row[index];
|
|
67
|
+
if (row.length < exports.FEE_PERCENTILES.length || tip === undefined)
|
|
68
|
+
throw malformedHistory();
|
|
69
|
+
return tip;
|
|
70
|
+
});
|
|
71
|
+
const tip = max(median(tips), minTip);
|
|
72
|
+
return {
|
|
73
|
+
params: {
|
|
74
|
+
type: 'eip1559',
|
|
75
|
+
maxFeePerGas: 2n * baseFeePerGas + tip,
|
|
76
|
+
maxPriorityFeePerGas: tip,
|
|
77
|
+
},
|
|
78
|
+
baseFeePerGas,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function legacyPrice(gasPrice, speed) {
|
|
82
|
+
return { type: 'legacy', gasPrice: ceilDiv(gasPrice * LEGACY_PERCENT[speed], 100n) };
|
|
83
|
+
}
|
|
84
|
+
/** The node's estimate, with headroom unless it is a plain transfer. */
|
|
85
|
+
function gasLimitFrom(estimate) {
|
|
86
|
+
return estimate === exports.TRANSFER_GAS
|
|
87
|
+
? exports.TRANSFER_GAS
|
|
88
|
+
: ceilDiv(estimate * GAS_HEADROOM_PERCENT, 100n);
|
|
89
|
+
}
|
|
90
|
+
const invalid = (reason) => new error_1.ValidationError('INVALID_INTENT', reason);
|
|
91
|
+
/**
|
|
92
|
+
* The default `maxFeePerGas`, the highest price per gas an EVM transaction signs, 1,000
|
|
93
|
+
* gwei. It bounds a plain transfer at 0.021 and a 65,000-gas token transfer at 0.065 of
|
|
94
|
+
* the native coin, however an endpoint prices the fee. A network whose base fee rises
|
|
95
|
+
* above the ceiling stalls its transfers as `FEE_TOO_LOW` until the fee falls or the
|
|
96
|
+
* option is raised.
|
|
97
|
+
*/
|
|
98
|
+
exports.DEFAULT_MAX_FEE_PER_GAS = 1000000000000n;
|
|
99
|
+
/** The highest price per gas `params` may pay: the fee cap, or the legacy gas price. */
|
|
100
|
+
function priceCap(params) {
|
|
101
|
+
return params.type === 'eip1559' ? params.maxFeePerGas : params.gasPrice;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* A node's suggestion within the ceiling: the fee cap or gas price at most `ceiling`,
|
|
105
|
+
* and the tip at most the fee cap. No endpoint can raise what a transfer signs.
|
|
106
|
+
*/
|
|
107
|
+
function capPrice(params, ceiling) {
|
|
108
|
+
if (params.type === 'legacy')
|
|
109
|
+
return { type: 'legacy', gasPrice: min(params.gasPrice, ceiling) };
|
|
110
|
+
const maxFeePerGas = min(params.maxFeePerGas, ceiling);
|
|
111
|
+
return {
|
|
112
|
+
type: 'eip1559',
|
|
113
|
+
maxFeePerGas,
|
|
114
|
+
maxPriorityFeePerGas: min(params.maxPriorityFeePerGas, maxFeePerGas),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Refuses, before anything is signed, a fee whose price per gas is above `ceiling` (the
|
|
119
|
+
* handle's `maxFeePerGas`), whatever produced it: an explicit override, a stored fee, or a
|
|
120
|
+
* cancel's least bump. The details carry the price and the bound as decimal strings.
|
|
121
|
+
*/
|
|
122
|
+
function assertWithinCeiling(params, ceiling) {
|
|
123
|
+
const price = priceCap(params);
|
|
124
|
+
if (price <= ceiling)
|
|
125
|
+
return;
|
|
126
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'the fee is above maxFeePerGas, the EVM handle option that bounds it (wei per gas)', { details: { required: price.toString(), maxFeePerGas: ceiling.toString() } });
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The default `maxGasLimit`, the highest gas limit an EVM transaction signs: 16,777,216
|
|
130
|
+
* (2^24), the per-transaction cap Ethereum enforces since Fusaka (EIP-7825), so no
|
|
131
|
+
* transaction above it is included there. A transfer this driver builds needs a small
|
|
132
|
+
* fraction of it (21,000 gas for a plain transfer, tens of thousands for a token's); an
|
|
133
|
+
* Arbitrum estimate also counts the L1 data fee in L2 gas, so it grows with L1 prices.
|
|
134
|
+
* Like `DEFAULT_MAX_FEE_PER_GAS`, it stops an absurd gas limit, from an endpoint's
|
|
135
|
+
* estimate or an override, not an expensive one: set the option to your own policy.
|
|
136
|
+
*/
|
|
137
|
+
exports.DEFAULT_MAX_GAS_LIMIT = 16777216n;
|
|
138
|
+
/**
|
|
139
|
+
* Refuses, before anything is signed, a gas limit above `bound` (the handle's
|
|
140
|
+
* `maxGasLimit`), whatever produced it: the node's estimate with its headroom, an
|
|
141
|
+
* override's `gasLimit`, a stored fee, or a replacement that keeps its original's. It is
|
|
142
|
+
* never clamped: a lower limit than the call needs runs out of gas and still pays. The
|
|
143
|
+
* details carry the gas limit and the bound as decimal strings.
|
|
144
|
+
*/
|
|
145
|
+
function assertWithinGasLimit(gasLimit, bound) {
|
|
146
|
+
if (gasLimit <= bound)
|
|
147
|
+
return;
|
|
148
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'the gas limit is above maxGasLimit, the EVM handle option that bounds it (gas)', { details: { required: gasLimit.toString(), maxGasLimit: bound.toString() } });
|
|
149
|
+
}
|
|
150
|
+
/** Validates an `EvmFeeOverride` against the network's fee model. */
|
|
151
|
+
function parseFeeOverride(override, model) {
|
|
152
|
+
const allowed = model === 'evm-1559'
|
|
153
|
+
? ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasLimit']
|
|
154
|
+
: ['gasPrice', 'gasLimit'];
|
|
155
|
+
const shape = model === 'evm-1559'
|
|
156
|
+
? '{ maxFeePerGas, maxPriorityFeePerGas, gasLimit? }'
|
|
157
|
+
: '{ gasPrice, gasLimit? }';
|
|
158
|
+
const keys = Object.keys(override);
|
|
159
|
+
if (keys.some((key) => !allowed.includes(key))) {
|
|
160
|
+
throw invalid(`${model} fee overrides look like ${shape}`);
|
|
161
|
+
}
|
|
162
|
+
const amount = (key, min) => {
|
|
163
|
+
const value = override[key];
|
|
164
|
+
if (typeof value !== 'bigint' || value < min) {
|
|
165
|
+
throw invalid(`fee override '${key}' must be a bigint of at least ${min}`);
|
|
166
|
+
}
|
|
167
|
+
return value;
|
|
168
|
+
};
|
|
169
|
+
const gasLimit = override.gasLimit === undefined ? undefined : amount('gasLimit', exports.TRANSFER_GAS);
|
|
170
|
+
const limit = gasLimit !== undefined ? { gasLimit } : {};
|
|
171
|
+
if (model === 'evm-legacy') {
|
|
172
|
+
return { params: { type: 'legacy', gasPrice: amount('gasPrice', 1n) }, ...limit };
|
|
173
|
+
}
|
|
174
|
+
const maxFeePerGas = amount('maxFeePerGas', 1n);
|
|
175
|
+
const maxPriorityFeePerGas = amount('maxPriorityFeePerGas', 0n);
|
|
176
|
+
if (maxPriorityFeePerGas > maxFeePerGas) {
|
|
177
|
+
throw invalid('maxPriorityFeePerGas must not exceed maxFeePerGas');
|
|
178
|
+
}
|
|
179
|
+
return { params: { type: 'eip1559', maxFeePerGas, maxPriorityFeePerGas }, ...limit };
|
|
180
|
+
}
|
|
181
|
+
/** The fee draft for a transaction of `gasLimit` at `params`. */
|
|
182
|
+
function feeDraft(speed, gasLimit, params, extra = {}) {
|
|
183
|
+
const cap = params.type === 'eip1559' ? params.maxFeePerGas : params.gasPrice;
|
|
184
|
+
const expectedPrice = params.type === 'eip1559' && extra.baseFeePerGas !== undefined
|
|
185
|
+
? min(params.maxFeePerGas, extra.baseFeePerGas + params.maxPriorityFeePerGas)
|
|
186
|
+
: cap;
|
|
187
|
+
// `satisfies` checks the shape and keeps a literal type the draft's record accepts.
|
|
188
|
+
const details = {
|
|
189
|
+
gasLimit,
|
|
190
|
+
...(params.type === 'eip1559'
|
|
191
|
+
? {
|
|
192
|
+
maxFeePerGas: params.maxFeePerGas,
|
|
193
|
+
maxPriorityFeePerGas: params.maxPriorityFeePerGas,
|
|
194
|
+
...(extra.baseFeePerGas !== undefined
|
|
195
|
+
? { baseFeePerGas: extra.baseFeePerGas }
|
|
196
|
+
: {}),
|
|
197
|
+
}
|
|
198
|
+
: { gasPrice: params.gasPrice }),
|
|
199
|
+
...(extra.l1Fee !== undefined ? { l1Fee: extra.l1Fee } : {}),
|
|
200
|
+
...(extra.operatorFee !== undefined ? { operatorFee: extra.operatorFee } : {}),
|
|
201
|
+
expected: gasLimit * expectedPrice + (extra.l1Fee ?? 0n) + (extra.operatorFee ?? 0n),
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
kind: params.type === 'eip1559' ? 'evm-1559' : 'evm-legacy',
|
|
205
|
+
speed,
|
|
206
|
+
charges: [
|
|
207
|
+
{ asset: 'native', amount: gasLimit * cap, label: 'network' },
|
|
208
|
+
...(extra.l1Fee !== undefined
|
|
209
|
+
? [{ asset: 'native', amount: extra.l1Fee, label: 'l1-data' }]
|
|
210
|
+
: []),
|
|
211
|
+
...(extra.operatorFee !== undefined
|
|
212
|
+
? [{ asset: 'native', amount: extra.operatorFee, label: 'operator' }]
|
|
213
|
+
: []),
|
|
214
|
+
],
|
|
215
|
+
// The L1 data fee moves with L1 prices until inclusion, and the operator fee with the
|
|
216
|
+
// chain's operator settings, so either is only expected.
|
|
217
|
+
bound: extra.l1Fee !== undefined || extra.operatorFee !== undefined ? 'expected' : 'upper',
|
|
218
|
+
details,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** The gas limit and prices a fee draft's details hold. */
|
|
222
|
+
function feeOf(details) {
|
|
223
|
+
const { gasLimit, maxFeePerGas, maxPriorityFeePerGas, gasPrice } = details;
|
|
224
|
+
if (typeof gasLimit !== 'bigint')
|
|
225
|
+
throw invalid('the fee holds no EVM gas limit');
|
|
226
|
+
if (typeof maxFeePerGas === 'bigint' && typeof maxPriorityFeePerGas === 'bigint') {
|
|
227
|
+
return { gasLimit, params: { type: 'eip1559', maxFeePerGas, maxPriorityFeePerGas } };
|
|
228
|
+
}
|
|
229
|
+
if (typeof gasPrice === 'bigint')
|
|
230
|
+
return { gasLimit, params: { type: 'legacy', gasPrice } };
|
|
231
|
+
throw invalid('the fee holds no EVM gas prices');
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Orders two fee settings by what a txpool compares on replacement: the fee cap (or gas
|
|
235
|
+
* price), then the tip. A legacy gas price is compared as a fee cap and tip alike.
|
|
236
|
+
*/
|
|
237
|
+
function comparePrices(a, b) {
|
|
238
|
+
const pair = (p) => p.type === 'eip1559'
|
|
239
|
+
? [p.maxFeePerGas, p.maxPriorityFeePerGas]
|
|
240
|
+
: [p.gasPrice, p.gasPrice];
|
|
241
|
+
const [capA, tipA] = pair(a);
|
|
242
|
+
const [capB, tipB] = pair(b);
|
|
243
|
+
if (capA !== capB)
|
|
244
|
+
return capA < capB ? -1 : 1;
|
|
245
|
+
return tipA === tipB ? 0 : tipA < tipB ? -1 : 1;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Whether `next` may replace `previous` under a txpool's `percent` price bump: each price
|
|
249
|
+
* strictly higher, and at least `percent` higher (geth), so a zero tip must still rise.
|
|
250
|
+
*/
|
|
251
|
+
function meetsBump(previous, next, percent) {
|
|
252
|
+
const factor = BigInt(100 + percent);
|
|
253
|
+
const bumped = (before, after) => after > before && after * 100n >= before * factor;
|
|
254
|
+
if (previous.type === 'eip1559' && next.type === 'eip1559') {
|
|
255
|
+
return (bumped(previous.maxFeePerGas, next.maxFeePerGas) &&
|
|
256
|
+
bumped(previous.maxPriorityFeePerGas, next.maxPriorityFeePerGas));
|
|
257
|
+
}
|
|
258
|
+
if (previous.type === 'legacy' && next.type === 'legacy') {
|
|
259
|
+
return bumped(previous.gasPrice, next.gasPrice);
|
|
260
|
+
}
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
/** The smallest prices that meet the bump over `previous`: each strictly higher (geth). */
|
|
264
|
+
function minimumBump(previous, percent) {
|
|
265
|
+
const up = (value) => {
|
|
266
|
+
const bumped = ceilDiv(value * BigInt(100 + percent), 100n);
|
|
267
|
+
return bumped > value ? bumped : value + 1n;
|
|
268
|
+
};
|
|
269
|
+
return previous.type === 'eip1559'
|
|
270
|
+
? {
|
|
271
|
+
type: 'eip1559',
|
|
272
|
+
maxFeePerGas: up(previous.maxFeePerGas),
|
|
273
|
+
maxPriorityFeePerGas: up(previous.maxPriorityFeePerGas),
|
|
274
|
+
}
|
|
275
|
+
: { type: 'legacy', gasPrice: up(previous.gasPrice) };
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=fees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fees.js","sourceRoot":"","sources":["../../../src/adapters/evm/fees.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The EVM fee policy: `evm-1559` or `evm-legacy` per network, an `upper`\n * bound with the `expected` cost in the details, overrides, and replacement bumps. Pure\n * functions over plain data; the driver does the I/O.\n */\nimport { ProviderError, ValidationError } from '../../core/errors/error';\nimport type { FeeEstimateDraft, FeeOverride, FeeSpeed } from '../../core/model/fee';\nimport type { EvmFeeDetails, EvmFeeHistory } from './types';\n\nexport type EvmFeeModel = 'evm-1559' | 'evm-legacy';\n\n/** The per-gas prices of one transaction. */\nexport type EvmFeeParams =\n | {\n readonly type: 'eip1559';\n readonly maxFeePerGas: bigint;\n readonly maxPriorityFeePerGas: bigint;\n }\n | { readonly type: 'legacy'; readonly gasPrice: bigint };\n\n/**\n * `eth_feeHistory` window and priority-fee percentiles for slow, normal and fast: the\n * method the Polygon Gas Station documents (10th, 25th and 50th over the last 15 blocks).\n */\nexport const FEE_HISTORY_BLOCKS = 15;\nexport const FEE_PERCENTILES: readonly number[] = [10, 25, 50];\nconst SPEED_INDEX: Readonly<Record<FeeSpeed, number>> = { slow: 0, normal: 1, fast: 2 };\n/** Legacy networks: `eth_gasPrice` scaled per speed, in percent. */\nconst LEGACY_PERCENT: Readonly<Record<FeeSpeed, bigint>> = {\n slow: 100n,\n normal: 110n,\n fast: 125n,\n};\n/** A plain transfer to an account without code costs exactly this much gas. */\nexport const TRANSFER_GAS = 21_000n;\n/** Headroom over the node's estimate for anything but a plain transfer, in percent. */\nconst GAS_HEADROOM_PERCENT = 120n;\n\nconst ceilDiv = (a: bigint, b: bigint): bigint => (a + b - 1n) / b;\nconst max = (a: bigint, b: bigint): bigint => (a > b ? a : b);\nconst min = (a: bigint, b: bigint): bigint => (a < b ? a : b);\n\n/** The lower median; `0n` for no values. */\nexport function median(values: readonly bigint[]): bigint {\n if (values.length === 0) return 0n;\n const sorted = [...values].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n return sorted[Math.floor((sorted.length - 1) / 2)] as bigint;\n}\n\nconst malformedHistory = () =>\n new ProviderError('PROVIDER_UNAVAILABLE', 'malformed fee history');\n\n/**\n * EIP-1559 prices for `speed`: the tip is the median, over the window, of the speed's\n * percentile (at least `minTip`); the cap allows the next base fee to double. The history\n * must answer a request for `FEE_PERCENTILES`: one without the next base fee, without\n * reward rows, or with a reward row shorter than `FEE_PERCENTILES` is a retryable\n * `PROVIDER_UNAVAILABLE`, never a tip of `minTip`.\n */\nexport function feesFromHistory(\n history: EvmFeeHistory,\n speed: FeeSpeed,\n minTip: bigint,\n): { readonly params: EvmFeeParams; readonly baseFeePerGas: bigint } {\n const baseFeePerGas = history.baseFeePerGas[history.baseFeePerGas.length - 1];\n if (baseFeePerGas === undefined || history.reward.length === 0) {\n throw malformedHistory();\n }\n const index = SPEED_INDEX[speed];\n const tips = history.reward.map((row) => {\n const tip = row[index];\n if (row.length < FEE_PERCENTILES.length || tip === undefined)\n throw malformedHistory();\n return tip;\n });\n const tip = max(median(tips), minTip);\n return {\n params: {\n type: 'eip1559',\n maxFeePerGas: 2n * baseFeePerGas + tip,\n maxPriorityFeePerGas: tip,\n },\n baseFeePerGas,\n };\n}\n\nexport function legacyPrice(gasPrice: bigint, speed: FeeSpeed): EvmFeeParams {\n return { type: 'legacy', gasPrice: ceilDiv(gasPrice * LEGACY_PERCENT[speed], 100n) };\n}\n\n/** The node's estimate, with headroom unless it is a plain transfer. */\nexport function gasLimitFrom(estimate: bigint): bigint {\n return estimate === TRANSFER_GAS\n ? TRANSFER_GAS\n : ceilDiv(estimate * GAS_HEADROOM_PERCENT, 100n);\n}\n\nconst invalid = (reason: string) => new ValidationError('INVALID_INTENT', reason);\n\n/**\n * The default `maxFeePerGas`, the highest price per gas an EVM transaction signs, 1,000\n * gwei. It bounds a plain transfer at 0.021 and a 65,000-gas token transfer at 0.065 of\n * the native coin, however an endpoint prices the fee. A network whose base fee rises\n * above the ceiling stalls its transfers as `FEE_TOO_LOW` until the fee falls or the\n * option is raised.\n */\nexport const DEFAULT_MAX_FEE_PER_GAS = 1_000_000_000_000n;\n\n/** The highest price per gas `params` may pay: the fee cap, or the legacy gas price. */\nexport function priceCap(params: EvmFeeParams): bigint {\n return params.type === 'eip1559' ? params.maxFeePerGas : params.gasPrice;\n}\n\n/**\n * A node's suggestion within the ceiling: the fee cap or gas price at most `ceiling`,\n * and the tip at most the fee cap. No endpoint can raise what a transfer signs.\n */\nexport function capPrice(params: EvmFeeParams, ceiling: bigint): EvmFeeParams {\n if (params.type === 'legacy')\n return { type: 'legacy', gasPrice: min(params.gasPrice, ceiling) };\n const maxFeePerGas = min(params.maxFeePerGas, ceiling);\n return {\n type: 'eip1559',\n maxFeePerGas,\n maxPriorityFeePerGas: min(params.maxPriorityFeePerGas, maxFeePerGas),\n };\n}\n\n/**\n * Refuses, before anything is signed, a fee whose price per gas is above `ceiling` (the\n * handle's `maxFeePerGas`), whatever produced it: an explicit override, a stored fee, or a\n * cancel's least bump. The details carry the price and the bound as decimal strings.\n */\nexport function assertWithinCeiling(params: EvmFeeParams, ceiling: bigint): void {\n const price = priceCap(params);\n if (price <= ceiling) return;\n throw new ValidationError(\n 'INVALID_INTENT',\n 'the fee is above maxFeePerGas, the EVM handle option that bounds it (wei per gas)',\n { details: { required: price.toString(), maxFeePerGas: ceiling.toString() } },\n );\n}\n\n/**\n * The default `maxGasLimit`, the highest gas limit an EVM transaction signs: 16,777,216\n * (2^24), the per-transaction cap Ethereum enforces since Fusaka (EIP-7825), so no\n * transaction above it is included there. A transfer this driver builds needs a small\n * fraction of it (21,000 gas for a plain transfer, tens of thousands for a token's); an\n * Arbitrum estimate also counts the L1 data fee in L2 gas, so it grows with L1 prices.\n * Like `DEFAULT_MAX_FEE_PER_GAS`, it stops an absurd gas limit, from an endpoint's\n * estimate or an override, not an expensive one: set the option to your own policy.\n */\nexport const DEFAULT_MAX_GAS_LIMIT = 16_777_216n;\n\n/**\n * Refuses, before anything is signed, a gas limit above `bound` (the handle's\n * `maxGasLimit`), whatever produced it: the node's estimate with its headroom, an\n * override's `gasLimit`, a stored fee, or a replacement that keeps its original's. It is\n * never clamped: a lower limit than the call needs runs out of gas and still pays. The\n * details carry the gas limit and the bound as decimal strings.\n */\nexport function assertWithinGasLimit(gasLimit: bigint, bound: bigint): void {\n if (gasLimit <= bound) return;\n throw new ValidationError(\n 'INVALID_INTENT',\n 'the gas limit is above maxGasLimit, the EVM handle option that bounds it (gas)',\n { details: { required: gasLimit.toString(), maxGasLimit: bound.toString() } },\n );\n}\n\n/** Validates an `EvmFeeOverride` against the network's fee model. */\nexport function parseFeeOverride(\n override: FeeOverride,\n model: EvmFeeModel,\n): { readonly params: EvmFeeParams; readonly gasLimit?: bigint } {\n const allowed =\n model === 'evm-1559'\n ? ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasLimit']\n : ['gasPrice', 'gasLimit'];\n const shape =\n model === 'evm-1559'\n ? '{ maxFeePerGas, maxPriorityFeePerGas, gasLimit? }'\n : '{ gasPrice, gasLimit? }';\n const keys = Object.keys(override);\n if (keys.some((key) => !allowed.includes(key))) {\n throw invalid(`${model} fee overrides look like ${shape}`);\n }\n const amount = (key: string, min: bigint): bigint => {\n const value = override[key];\n if (typeof value !== 'bigint' || value < min) {\n throw invalid(`fee override '${key}' must be a bigint of at least ${min}`);\n }\n return value;\n };\n const gasLimit =\n override.gasLimit === undefined ? undefined : amount('gasLimit', TRANSFER_GAS);\n const limit = gasLimit !== undefined ? { gasLimit } : {};\n if (model === 'evm-legacy') {\n return { params: { type: 'legacy', gasPrice: amount('gasPrice', 1n) }, ...limit };\n }\n const maxFeePerGas = amount('maxFeePerGas', 1n);\n const maxPriorityFeePerGas = amount('maxPriorityFeePerGas', 0n);\n if (maxPriorityFeePerGas > maxFeePerGas) {\n throw invalid('maxPriorityFeePerGas must not exceed maxFeePerGas');\n }\n return { params: { type: 'eip1559', maxFeePerGas, maxPriorityFeePerGas }, ...limit };\n}\n\n/** The fee draft for a transaction of `gasLimit` at `params`. */\nexport function feeDraft(\n speed: FeeSpeed | 'custom',\n gasLimit: bigint,\n params: EvmFeeParams,\n extra: {\n readonly baseFeePerGas?: bigint;\n readonly l1Fee?: bigint;\n readonly operatorFee?: bigint;\n } = {},\n): FeeEstimateDraft {\n const cap = params.type === 'eip1559' ? params.maxFeePerGas : params.gasPrice;\n const expectedPrice =\n params.type === 'eip1559' && extra.baseFeePerGas !== undefined\n ? min(params.maxFeePerGas, extra.baseFeePerGas + params.maxPriorityFeePerGas)\n : cap;\n // `satisfies` checks the shape and keeps a literal type the draft's record accepts.\n const details = {\n gasLimit,\n ...(params.type === 'eip1559'\n ? {\n maxFeePerGas: params.maxFeePerGas,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas,\n ...(extra.baseFeePerGas !== undefined\n ? { baseFeePerGas: extra.baseFeePerGas }\n : {}),\n }\n : { gasPrice: params.gasPrice }),\n ...(extra.l1Fee !== undefined ? { l1Fee: extra.l1Fee } : {}),\n ...(extra.operatorFee !== undefined ? { operatorFee: extra.operatorFee } : {}),\n expected: gasLimit * expectedPrice + (extra.l1Fee ?? 0n) + (extra.operatorFee ?? 0n),\n } satisfies EvmFeeDetails;\n return {\n kind: params.type === 'eip1559' ? 'evm-1559' : 'evm-legacy',\n speed,\n charges: [\n { asset: 'native', amount: gasLimit * cap, label: 'network' },\n ...(extra.l1Fee !== undefined\n ? [{ asset: 'native' as const, amount: extra.l1Fee, label: 'l1-data' }]\n : []),\n ...(extra.operatorFee !== undefined\n ? [{ asset: 'native' as const, amount: extra.operatorFee, label: 'operator' }]\n : []),\n ],\n // The L1 data fee moves with L1 prices until inclusion, and the operator fee with the\n // chain's operator settings, so either is only expected.\n bound:\n extra.l1Fee !== undefined || extra.operatorFee !== undefined ? 'expected' : 'upper',\n details,\n };\n}\n\n/** The gas limit and prices a fee draft's details hold. */\nexport function feeOf(details: Readonly<Record<string, unknown>>): {\n readonly gasLimit: bigint;\n readonly params: EvmFeeParams;\n} {\n const { gasLimit, maxFeePerGas, maxPriorityFeePerGas, gasPrice } = details;\n if (typeof gasLimit !== 'bigint') throw invalid('the fee holds no EVM gas limit');\n if (typeof maxFeePerGas === 'bigint' && typeof maxPriorityFeePerGas === 'bigint') {\n return { gasLimit, params: { type: 'eip1559', maxFeePerGas, maxPriorityFeePerGas } };\n }\n if (typeof gasPrice === 'bigint')\n return { gasLimit, params: { type: 'legacy', gasPrice } };\n throw invalid('the fee holds no EVM gas prices');\n}\n\n/**\n * Orders two fee settings by what a txpool compares on replacement: the fee cap (or gas\n * price), then the tip. A legacy gas price is compared as a fee cap and tip alike.\n */\nexport function comparePrices(a: EvmFeeParams, b: EvmFeeParams): number {\n const pair = (p: EvmFeeParams): readonly [bigint, bigint] =>\n p.type === 'eip1559'\n ? [p.maxFeePerGas, p.maxPriorityFeePerGas]\n : [p.gasPrice, p.gasPrice];\n const [capA, tipA] = pair(a);\n const [capB, tipB] = pair(b);\n if (capA !== capB) return capA < capB ? -1 : 1;\n return tipA === tipB ? 0 : tipA < tipB ? -1 : 1;\n}\n\n/**\n * Whether `next` may replace `previous` under a txpool's `percent` price bump: each price\n * strictly higher, and at least `percent` higher (geth), so a zero tip must still rise.\n */\nexport function meetsBump(\n previous: EvmFeeParams,\n next: EvmFeeParams,\n percent: number,\n): boolean {\n const factor = BigInt(100 + percent);\n const bumped = (before: bigint, after: bigint) =>\n after > before && after * 100n >= before * factor;\n if (previous.type === 'eip1559' && next.type === 'eip1559') {\n return (\n bumped(previous.maxFeePerGas, next.maxFeePerGas) &&\n bumped(previous.maxPriorityFeePerGas, next.maxPriorityFeePerGas)\n );\n }\n if (previous.type === 'legacy' && next.type === 'legacy') {\n return bumped(previous.gasPrice, next.gasPrice);\n }\n return false;\n}\n\n/** The smallest prices that meet the bump over `previous`: each strictly higher (geth). */\nexport function minimumBump(previous: EvmFeeParams, percent: number): EvmFeeParams {\n const up = (value: bigint) => {\n const bumped = ceilDiv(value * BigInt(100 + percent), 100n);\n return bumped > value ? bumped : value + 1n;\n };\n return previous.type === 'eip1559'\n ? {\n type: 'eip1559',\n maxFeePerGas: up(previous.maxFeePerGas),\n maxPriorityFeePerGas: up(previous.maxPriorityFeePerGas),\n }\n : { type: 'legacy', gasPrice: up(previous.gasPrice) };\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `crypto-aio/evm`: EVM chains of your own (`evmChainPlugin`), the SDK-free EVM types, and
|
|
3
|
+
* the `crypto-aio/native` client types: importing this entry types `native(bc, 'ethers')`
|
|
4
|
+
* as an ethers `JsonRpcApiProvider` and `native(bc, 'web3')` as a `Web3` instance.
|
|
5
|
+
*
|
|
6
|
+
* @module crypto-aio/evm
|
|
7
|
+
*/
|
|
8
|
+
import type { JsonRpcApiProvider } from 'ethers';
|
|
9
|
+
import type { Web3 } from 'web3';
|
|
10
|
+
declare module '../../index' {
|
|
11
|
+
interface NativeClientMap {
|
|
12
|
+
ethers: JsonRpcApiProvider;
|
|
13
|
+
web3: Web3;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export { EVM_PEER_DEPENDENCIES, evmChainPlugin } from './plugin';
|
|
17
|
+
export type { EvmChainPluginOptions } from './plugin';
|
|
18
|
+
export { DEFAULT_MAX_FEE_PER_GAS, DEFAULT_MAX_GAS_LIMIT } from './fees';
|
|
19
|
+
export { EVM_CAPABILITIES } from './network';
|
|
20
|
+
export type { EvmExt, EvmFeeDetails, EvmFeeOverride } from './types';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EVM_CAPABILITIES = exports.DEFAULT_MAX_GAS_LIMIT = exports.DEFAULT_MAX_FEE_PER_GAS = exports.evmChainPlugin = exports.EVM_PEER_DEPENDENCIES = void 0;
|
|
4
|
+
var plugin_1 = require("./plugin");
|
|
5
|
+
Object.defineProperty(exports, "EVM_PEER_DEPENDENCIES", { enumerable: true, get: function () { return plugin_1.EVM_PEER_DEPENDENCIES; } });
|
|
6
|
+
Object.defineProperty(exports, "evmChainPlugin", { enumerable: true, get: function () { return plugin_1.evmChainPlugin; } });
|
|
7
|
+
var fees_1 = require("./fees");
|
|
8
|
+
Object.defineProperty(exports, "DEFAULT_MAX_FEE_PER_GAS", { enumerable: true, get: function () { return fees_1.DEFAULT_MAX_FEE_PER_GAS; } });
|
|
9
|
+
Object.defineProperty(exports, "DEFAULT_MAX_GAS_LIMIT", { enumerable: true, get: function () { return fees_1.DEFAULT_MAX_GAS_LIMIT; } });
|
|
10
|
+
var network_1 = require("./network");
|
|
11
|
+
Object.defineProperty(exports, "EVM_CAPABILITIES", { enumerable: true, get: function () { return network_1.EVM_CAPABILITIES; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/evm/index.ts"],"names":[],"mappings":";;;AAmBA,mCAAiE;AAAxD,+GAAA,qBAAqB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAE9C,+BAAwE;AAA/D,+GAAA,uBAAuB,OAAA;AAAE,6GAAA,qBAAqB,OAAA;AACvD,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA","sourcesContent":["/**\n * `crypto-aio/evm`: EVM chains of your own (`evmChainPlugin`), the SDK-free EVM types, and\n * the `crypto-aio/native` client types: importing this entry types `native(bc, 'ethers')`\n * as an ethers `JsonRpcApiProvider` and `native(bc, 'web3')` as a `Web3` instance.\n *\n * @module crypto-aio/evm\n */\nimport type { JsonRpcApiProvider } from 'ethers';\nimport type { Web3 } from 'web3';\n\n// Through the package entry, never a core module. SDK types appear only here, in the\n// adapter's entry, so the main entry's typings name no SDK.\ndeclare module '../../index' {\n interface NativeClientMap {\n ethers: JsonRpcApiProvider;\n web3: Web3;\n }\n}\n\nexport { EVM_PEER_DEPENDENCIES, evmChainPlugin } from './plugin';\nexport type { EvmChainPluginOptions } from './plugin';\nexport { DEFAULT_MAX_FEE_PER_GAS, DEFAULT_MAX_GAS_LIMIT } from './fees';\nexport { EVM_CAPABILITIES } from './network';\nexport type { EvmExt, EvmFeeDetails, EvmFeeOverride } from './types';\n"]}
|