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,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the EVM driver needs from a network's registry entry (each network keeps its own
|
|
3
|
+
* registry identity, its decimal chain id), validated once when a driver is created, so a
|
|
4
|
+
* custom EVM chain with inconsistent data fails with `CONFIG_INVALID` instead of
|
|
5
|
+
* misbehaving.
|
|
6
|
+
*/
|
|
7
|
+
import type { Capability } from '../../core/model/capability';
|
|
8
|
+
import type { ChainInfo, NetworkInfo } from '../../core/model/chain';
|
|
9
|
+
import { type EvmFeeModel } from './fees';
|
|
10
|
+
/** Every capability an EVM network can have; a network removes what it lacks. */
|
|
11
|
+
export declare const EVM_CAPABILITIES: readonly Capability[];
|
|
12
|
+
export type EvmFinality = {
|
|
13
|
+
readonly kind: 'tag';
|
|
14
|
+
} | {
|
|
15
|
+
readonly kind: 'confirmations';
|
|
16
|
+
readonly confirmations: number;
|
|
17
|
+
};
|
|
18
|
+
export interface EvmNetworkConfig {
|
|
19
|
+
readonly chainId: bigint;
|
|
20
|
+
readonly feeModel: EvmFeeModel;
|
|
21
|
+
readonly finality: EvmFinality;
|
|
22
|
+
/** The txpool's price bump; `undefined` when the network has no replace or cancel. */
|
|
23
|
+
readonly minBumpPercent?: number;
|
|
24
|
+
readonly minPriorityFeePerGas: bigint;
|
|
25
|
+
/** OP Stack: transactions also pay an L1 data fee (`GasPriceOracle.getL1Fee`). */
|
|
26
|
+
readonly l1DataFee: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* bor-based networks (`params.systemLogs: 'bor'`, as on Polygon PoS): receipts carry bor's
|
|
29
|
+
* `POLYGON_FEE_LOG` and `POLYGON_TRANSFER_LOG`.
|
|
30
|
+
*/
|
|
31
|
+
readonly polygonSystemLogs: boolean;
|
|
32
|
+
readonly capabilities: ReadonlySet<Capability>;
|
|
33
|
+
/**
|
|
34
|
+
* The highest price per gas (wei) a transaction signs: the handle's
|
|
35
|
+
* `maxFeePerGas` option, else the network's `params.maxFeePerGas`, else
|
|
36
|
+
* `DEFAULT_MAX_FEE_PER_GAS`.
|
|
37
|
+
*/
|
|
38
|
+
readonly maxFeePerGas: bigint;
|
|
39
|
+
/**
|
|
40
|
+
* The highest gas limit a transaction signs: the handle's `maxGasLimit` option, else the
|
|
41
|
+
* network's `params.maxGasLimit`, else `DEFAULT_MAX_GAS_LIMIT`.
|
|
42
|
+
*/
|
|
43
|
+
readonly maxGasLimit: bigint;
|
|
44
|
+
}
|
|
45
|
+
/** The OP Stack `GasPriceOracle` predeploy. */
|
|
46
|
+
export declare const GAS_PRICE_ORACLE = "0x420000000000000000000000000000000000000F";
|
|
47
|
+
/**
|
|
48
|
+
* The `LogFeeTransfer(address,address,address,uint256,uint256,uint256,uint256,uint256)`
|
|
49
|
+
* system log that Polygon PoS's client (bor, `core/bor_fee_log.go`) adds to every
|
|
50
|
+
* fee-paying transaction, emitted from the MRC20 predeploy. It says nothing about code.
|
|
51
|
+
*/
|
|
52
|
+
export declare const POLYGON_FEE_LOG: {
|
|
53
|
+
readonly address: "0x0000000000000000000000000000000000001010";
|
|
54
|
+
readonly topic: "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63";
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* bor's `LogTransfer(address,address,address,uint256,uint256,uint256,uint256,uint256)`
|
|
58
|
+
* system log for a native POL value transfer (`core/evm.go` `Transfer`), from the same
|
|
59
|
+
* predeploy. Its topic is not ERC-20 `Transfer`'s, so it never decodes as a token movement.
|
|
60
|
+
*/
|
|
61
|
+
export declare const POLYGON_TRANSFER_LOG: {
|
|
62
|
+
readonly address: "0x0000000000000000000000000000000000001010";
|
|
63
|
+
readonly topic: "0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4";
|
|
64
|
+
};
|
|
65
|
+
export declare function evmNetworkConfig(chain: ChainInfo, network: NetworkInfo, options?: Readonly<Record<string, unknown>>): EvmNetworkConfig;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POLYGON_TRANSFER_LOG = exports.POLYGON_FEE_LOG = exports.GAS_PRICE_ORACLE = exports.EVM_CAPABILITIES = void 0;
|
|
4
|
+
exports.evmNetworkConfig = evmNetworkConfig;
|
|
5
|
+
const error_1 = require("../../core/errors/error");
|
|
6
|
+
const names_1 = require("../../core/util/names");
|
|
7
|
+
const fees_1 = require("./fees");
|
|
8
|
+
/** Every capability an EVM network can have; a network removes what it lacks. */
|
|
9
|
+
exports.EVM_CAPABILITIES = [
|
|
10
|
+
'tokens',
|
|
11
|
+
'block-scan',
|
|
12
|
+
'hd-public-derivation',
|
|
13
|
+
'fee-market-1559',
|
|
14
|
+
'finality-tag',
|
|
15
|
+
'replace-fee',
|
|
16
|
+
'cancel',
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* The only driver options (`HandleOptions.options`) the EVM driver reads. Any other key is
|
|
20
|
+
* refused, so a typo, or another family's option such as Tron's `maxFeeLimit`, fails loudly
|
|
21
|
+
* instead of leaving the default in place.
|
|
22
|
+
*/
|
|
23
|
+
const OPTION_KEYS = Object.freeze(['maxFeePerGas', 'maxGasLimit']);
|
|
24
|
+
const MAX_UINT256 = 2n ** 256n - 1n;
|
|
25
|
+
/** The largest gas limit a transaction carries: clients read it as a `uint64`. */
|
|
26
|
+
const MAX_UINT64 = 2n ** 64n - 1n;
|
|
27
|
+
/** A price ceiling: a bigint of wei per gas that an EVM transaction can carry. */
|
|
28
|
+
function priceCeiling(value, name, fail) {
|
|
29
|
+
if (typeof value !== 'bigint' || value < 1n || value > MAX_UINT256) {
|
|
30
|
+
fail(`${name} must be a bigint of wei per gas from 1 to 2^256 − 1`);
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A gas-limit bound: a bigint of gas a transaction can carry, and at least a plain
|
|
36
|
+
* transfer's 21,000, below which nothing could be signed.
|
|
37
|
+
*/
|
|
38
|
+
function gasBound(value, name, fail) {
|
|
39
|
+
if (typeof value !== 'bigint' || value < fees_1.TRANSFER_GAS || value > MAX_UINT64) {
|
|
40
|
+
fail(`${name} must be a bigint of gas from 21,000 to 2^64 − 1`);
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
/** The OP Stack `GasPriceOracle` predeploy. */
|
|
45
|
+
exports.GAS_PRICE_ORACLE = '0x420000000000000000000000000000000000000F';
|
|
46
|
+
/**
|
|
47
|
+
* The `LogFeeTransfer(address,address,address,uint256,uint256,uint256,uint256,uint256)`
|
|
48
|
+
* system log that Polygon PoS's client (bor, `core/bor_fee_log.go`) adds to every
|
|
49
|
+
* fee-paying transaction, emitted from the MRC20 predeploy. It says nothing about code.
|
|
50
|
+
*/
|
|
51
|
+
exports.POLYGON_FEE_LOG = {
|
|
52
|
+
address: '0x0000000000000000000000000000000000001010',
|
|
53
|
+
topic: '0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63',
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* bor's `LogTransfer(address,address,address,uint256,uint256,uint256,uint256,uint256)`
|
|
57
|
+
* system log for a native POL value transfer (`core/evm.go` `Transfer`), from the same
|
|
58
|
+
* predeploy. Its topic is not ERC-20 `Transfer`'s, so it never decodes as a token movement.
|
|
59
|
+
*/
|
|
60
|
+
exports.POLYGON_TRANSFER_LOG = {
|
|
61
|
+
address: exports.POLYGON_FEE_LOG.address,
|
|
62
|
+
topic: '0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4',
|
|
63
|
+
};
|
|
64
|
+
function finalityOf(policy, fail) {
|
|
65
|
+
if (policy.kind === 'tag')
|
|
66
|
+
return { kind: 'tag' };
|
|
67
|
+
if (policy.kind === 'confirmations') {
|
|
68
|
+
// The final height is `head - confirmations + 1`, so fewer than one is the future.
|
|
69
|
+
const confirmations = policy.confirmations;
|
|
70
|
+
if (!Number.isSafeInteger(confirmations) || confirmations < 1) {
|
|
71
|
+
return fail('finality confirmations must be an integer of at least 1');
|
|
72
|
+
}
|
|
73
|
+
return { kind: 'confirmations', confirmations: confirmations };
|
|
74
|
+
}
|
|
75
|
+
return fail(`finality '${policy.kind}' is not an EVM policy (use 'tag' or 'confirmations')`);
|
|
76
|
+
}
|
|
77
|
+
function evmNetworkConfig(chain, network, options = {}) {
|
|
78
|
+
const fail = (reason) => {
|
|
79
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `EVM network ${chain.id}:${network.id}: ${reason}`);
|
|
80
|
+
};
|
|
81
|
+
if (network.identity === undefined || !/^[1-9][0-9]*$/.test(network.identity)) {
|
|
82
|
+
fail('its identity must be the decimal chain id');
|
|
83
|
+
}
|
|
84
|
+
const feeModel = network.feeModel;
|
|
85
|
+
if (feeModel !== 'evm-1559' && feeModel !== 'evm-legacy') {
|
|
86
|
+
fail(`fee model '${feeModel}' is not 'evm-1559' or 'evm-legacy'`);
|
|
87
|
+
}
|
|
88
|
+
const finality = finalityOf(network.finality, fail);
|
|
89
|
+
const capabilities = new Set(exports.EVM_CAPABILITIES);
|
|
90
|
+
for (const c of network.capabilities?.add ?? [])
|
|
91
|
+
capabilities.add(c);
|
|
92
|
+
for (const c of network.capabilities?.remove ?? [])
|
|
93
|
+
capabilities.delete(c);
|
|
94
|
+
if (capabilities.has('fee-market-1559') !== (feeModel === 'evm-1559')) {
|
|
95
|
+
fail(`'fee-market-1559' must be present exactly on 'evm-1559' networks`);
|
|
96
|
+
}
|
|
97
|
+
if (capabilities.has('finality-tag') !== (finality.kind === 'tag')) {
|
|
98
|
+
fail(`'finality-tag' must be present exactly on 'tag' finality networks`);
|
|
99
|
+
}
|
|
100
|
+
// The fee policy computes `BigInt(100 + percent)`, which throws on a fraction.
|
|
101
|
+
const bump = network.replacement?.minBumpPercent;
|
|
102
|
+
if (bump !== undefined && !(Number.isSafeInteger(bump) && bump >= 0)) {
|
|
103
|
+
fail('replacement.minBumpPercent must be a non-negative integer');
|
|
104
|
+
}
|
|
105
|
+
const params = network.params ?? {};
|
|
106
|
+
const minTip = params.minPriorityFeePerGas;
|
|
107
|
+
if (minTip !== undefined && typeof minTip !== 'bigint') {
|
|
108
|
+
fail('params.minPriorityFeePerGas must be a bigint');
|
|
109
|
+
}
|
|
110
|
+
if (params.l1DataFee !== undefined && params.l1DataFee !== 'op-stack') {
|
|
111
|
+
fail(`params.l1DataFee must be 'op-stack'`);
|
|
112
|
+
}
|
|
113
|
+
// Data, not the chain id, so a bor chain served through evmChainPlugin can opt in.
|
|
114
|
+
if (params.systemLogs !== undefined && params.systemLogs !== 'bor') {
|
|
115
|
+
fail(`params.systemLogs must be 'bor'`);
|
|
116
|
+
}
|
|
117
|
+
// The refusal lists the accepted name, never the caller's key or its value: either may
|
|
118
|
+
// be a secret typed in the wrong place.
|
|
119
|
+
for (const key of Object.keys(options)) {
|
|
120
|
+
if (!OPTION_KEYS.includes(key))
|
|
121
|
+
fail((0, names_1.unknownName)('option', OPTION_KEYS));
|
|
122
|
+
}
|
|
123
|
+
// The handle's option, else the network entry's own, else the
|
|
124
|
+
// default. A network value is checked even where an option overrides it.
|
|
125
|
+
const own = params.maxFeePerGas;
|
|
126
|
+
const networkCeiling = own === undefined ? undefined : priceCeiling(own, 'params.maxFeePerGas', fail);
|
|
127
|
+
const maxFeePerGas = options.maxFeePerGas !== undefined
|
|
128
|
+
? priceCeiling(options.maxFeePerGas, 'maxFeePerGas', fail)
|
|
129
|
+
: (networkCeiling ?? fees_1.DEFAULT_MAX_FEE_PER_GAS);
|
|
130
|
+
// The gas-limit bound resolves the same way.
|
|
131
|
+
const ownGas = params.maxGasLimit;
|
|
132
|
+
const networkGas = ownGas === undefined ? undefined : gasBound(ownGas, 'params.maxGasLimit', fail);
|
|
133
|
+
const maxGasLimit = options.maxGasLimit !== undefined
|
|
134
|
+
? gasBound(options.maxGasLimit, 'maxGasLimit', fail)
|
|
135
|
+
: (networkGas ?? fees_1.DEFAULT_MAX_GAS_LIMIT);
|
|
136
|
+
const replaces = capabilities.has('replace-fee') || capabilities.has('cancel');
|
|
137
|
+
return {
|
|
138
|
+
chainId: BigInt(network.identity),
|
|
139
|
+
feeModel: feeModel,
|
|
140
|
+
finality,
|
|
141
|
+
...(replaces ? { minBumpPercent: network.replacement?.minBumpPercent ?? 10 } : {}),
|
|
142
|
+
minPriorityFeePerGas: minTip ?? 0n,
|
|
143
|
+
l1DataFee: params.l1DataFee === 'op-stack',
|
|
144
|
+
polygonSystemLogs: params.systemLogs === 'bor',
|
|
145
|
+
capabilities,
|
|
146
|
+
maxFeePerGas,
|
|
147
|
+
maxGasLimit,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/adapters/evm/network.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What the EVM driver needs from a network's registry entry (each network keeps its own\n * registry identity, its decimal chain id), validated once when a driver is created, so a\n * custom EVM chain with inconsistent data fails with `CONFIG_INVALID` instead of\n * misbehaving.\n */\nimport type { Capability } from '../../core/model/capability';\nimport type { ChainInfo, FinalityPolicy, NetworkInfo } from '../../core/model/chain';\nimport { ConfigError } from '../../core/errors/error';\nimport { unknownName } from '../../core/util/names';\nimport {\n DEFAULT_MAX_FEE_PER_GAS,\n DEFAULT_MAX_GAS_LIMIT,\n TRANSFER_GAS,\n type EvmFeeModel,\n} from './fees';\n\n/** Every capability an EVM network can have; a network removes what it lacks. */\nexport const EVM_CAPABILITIES: readonly Capability[] = [\n 'tokens',\n 'block-scan',\n 'hd-public-derivation',\n 'fee-market-1559',\n 'finality-tag',\n 'replace-fee',\n 'cancel',\n];\n\nexport type EvmFinality =\n | { readonly kind: 'tag' }\n | { readonly kind: 'confirmations'; readonly confirmations: number };\n\nexport interface EvmNetworkConfig {\n readonly chainId: bigint;\n readonly feeModel: EvmFeeModel;\n readonly finality: EvmFinality;\n /** The txpool's price bump; `undefined` when the network has no replace or cancel. */\n readonly minBumpPercent?: number;\n readonly minPriorityFeePerGas: bigint;\n /** OP Stack: transactions also pay an L1 data fee (`GasPriceOracle.getL1Fee`). */\n readonly l1DataFee: boolean;\n /**\n * bor-based networks (`params.systemLogs: 'bor'`, as on Polygon PoS): receipts carry bor's\n * `POLYGON_FEE_LOG` and `POLYGON_TRANSFER_LOG`.\n */\n readonly polygonSystemLogs: boolean;\n readonly capabilities: ReadonlySet<Capability>;\n /**\n * The highest price per gas (wei) a transaction signs: the handle's\n * `maxFeePerGas` option, else the network's `params.maxFeePerGas`, else\n * `DEFAULT_MAX_FEE_PER_GAS`.\n */\n readonly maxFeePerGas: bigint;\n /**\n * The highest gas limit a transaction signs: the handle's `maxGasLimit` option, else the\n * network's `params.maxGasLimit`, else `DEFAULT_MAX_GAS_LIMIT`.\n */\n readonly maxGasLimit: bigint;\n}\n\n/**\n * The only driver options (`HandleOptions.options`) the EVM driver reads. Any other key is\n * refused, so a typo, or another family's option such as Tron's `maxFeeLimit`, fails loudly\n * instead of leaving the default in place.\n */\nconst OPTION_KEYS: readonly string[] = Object.freeze(['maxFeePerGas', 'maxGasLimit']);\n\nconst MAX_UINT256 = 2n ** 256n - 1n;\n/** The largest gas limit a transaction carries: clients read it as a `uint64`. */\nconst MAX_UINT64 = 2n ** 64n - 1n;\n\n/** A price ceiling: a bigint of wei per gas that an EVM transaction can carry. */\nfunction priceCeiling(\n value: unknown,\n name: string,\n fail: (reason: string) => never,\n): bigint {\n if (typeof value !== 'bigint' || value < 1n || value > MAX_UINT256) {\n fail(`${name} must be a bigint of wei per gas from 1 to 2^256 − 1`);\n }\n return value as bigint;\n}\n\n/**\n * A gas-limit bound: a bigint of gas a transaction can carry, and at least a plain\n * transfer's 21,000, below which nothing could be signed.\n */\nfunction gasBound(value: unknown, name: string, fail: (reason: string) => never): bigint {\n if (typeof value !== 'bigint' || value < TRANSFER_GAS || value > MAX_UINT64) {\n fail(`${name} must be a bigint of gas from 21,000 to 2^64 − 1`);\n }\n return value as bigint;\n}\n\n/** The OP Stack `GasPriceOracle` predeploy. */\nexport const GAS_PRICE_ORACLE = '0x420000000000000000000000000000000000000F';\n\n/**\n * The `LogFeeTransfer(address,address,address,uint256,uint256,uint256,uint256,uint256)`\n * system log that Polygon PoS's client (bor, `core/bor_fee_log.go`) adds to every\n * fee-paying transaction, emitted from the MRC20 predeploy. It says nothing about code.\n */\nexport const POLYGON_FEE_LOG = {\n address: '0x0000000000000000000000000000000000001010',\n topic: '0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63',\n} as const;\n\n/**\n * bor's `LogTransfer(address,address,address,uint256,uint256,uint256,uint256,uint256)`\n * system log for a native POL value transfer (`core/evm.go` `Transfer`), from the same\n * predeploy. Its topic is not ERC-20 `Transfer`'s, so it never decodes as a token movement.\n */\nexport const POLYGON_TRANSFER_LOG = {\n address: POLYGON_FEE_LOG.address,\n topic: '0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4',\n} as const;\n\nfunction finalityOf(\n policy: FinalityPolicy,\n fail: (reason: string) => never,\n): EvmFinality {\n if (policy.kind === 'tag') return { kind: 'tag' };\n if (policy.kind === 'confirmations') {\n // The final height is `head - confirmations + 1`, so fewer than one is the future.\n const confirmations: unknown = policy.confirmations;\n if (!Number.isSafeInteger(confirmations) || (confirmations as number) < 1) {\n return fail('finality confirmations must be an integer of at least 1');\n }\n return { kind: 'confirmations', confirmations: confirmations as number };\n }\n return fail(\n `finality '${policy.kind}' is not an EVM policy (use 'tag' or 'confirmations')`,\n );\n}\n\nexport function evmNetworkConfig(\n chain: ChainInfo,\n network: NetworkInfo,\n options: Readonly<Record<string, unknown>> = {},\n): EvmNetworkConfig {\n const fail = (reason: string): never => {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `EVM network ${chain.id}:${network.id}: ${reason}`,\n );\n };\n if (network.identity === undefined || !/^[1-9][0-9]*$/.test(network.identity)) {\n fail('its identity must be the decimal chain id');\n }\n const feeModel = network.feeModel;\n if (feeModel !== 'evm-1559' && feeModel !== 'evm-legacy') {\n fail(`fee model '${feeModel}' is not 'evm-1559' or 'evm-legacy'`);\n }\n const finality = finalityOf(network.finality, fail);\n const capabilities = new Set<Capability>(EVM_CAPABILITIES);\n for (const c of network.capabilities?.add ?? []) capabilities.add(c);\n for (const c of network.capabilities?.remove ?? []) capabilities.delete(c);\n if (capabilities.has('fee-market-1559') !== (feeModel === 'evm-1559')) {\n fail(`'fee-market-1559' must be present exactly on 'evm-1559' networks`);\n }\n if (capabilities.has('finality-tag') !== (finality.kind === 'tag')) {\n fail(`'finality-tag' must be present exactly on 'tag' finality networks`);\n }\n // The fee policy computes `BigInt(100 + percent)`, which throws on a fraction.\n const bump: unknown = network.replacement?.minBumpPercent;\n if (bump !== undefined && !(Number.isSafeInteger(bump) && (bump as number) >= 0)) {\n fail('replacement.minBumpPercent must be a non-negative integer');\n }\n const params = network.params ?? {};\n const minTip = params.minPriorityFeePerGas;\n if (minTip !== undefined && typeof minTip !== 'bigint') {\n fail('params.minPriorityFeePerGas must be a bigint');\n }\n if (params.l1DataFee !== undefined && params.l1DataFee !== 'op-stack') {\n fail(`params.l1DataFee must be 'op-stack'`);\n }\n // Data, not the chain id, so a bor chain served through evmChainPlugin can opt in.\n if (params.systemLogs !== undefined && params.systemLogs !== 'bor') {\n fail(`params.systemLogs must be 'bor'`);\n }\n // The refusal lists the accepted name, never the caller's key or its value: either may\n // be a secret typed in the wrong place.\n for (const key of Object.keys(options)) {\n if (!OPTION_KEYS.includes(key)) fail(unknownName('option', OPTION_KEYS));\n }\n // The handle's option, else the network entry's own, else the\n // default. A network value is checked even where an option overrides it.\n const own = params.maxFeePerGas;\n const networkCeiling =\n own === undefined ? undefined : priceCeiling(own, 'params.maxFeePerGas', fail);\n const maxFeePerGas =\n options.maxFeePerGas !== undefined\n ? priceCeiling(options.maxFeePerGas, 'maxFeePerGas', fail)\n : (networkCeiling ?? DEFAULT_MAX_FEE_PER_GAS);\n // The gas-limit bound resolves the same way.\n const ownGas = params.maxGasLimit;\n const networkGas =\n ownGas === undefined ? undefined : gasBound(ownGas, 'params.maxGasLimit', fail);\n const maxGasLimit =\n options.maxGasLimit !== undefined\n ? gasBound(options.maxGasLimit, 'maxGasLimit', fail)\n : (networkGas ?? DEFAULT_MAX_GAS_LIMIT);\n const replaces = capabilities.has('replace-fee') || capabilities.has('cancel');\n return {\n chainId: BigInt(network.identity as string),\n feeModel: feeModel as EvmFeeModel,\n finality,\n ...(replaces ? { minBumpPercent: network.replacement?.minBumpPercent ?? 10 } : {}),\n minPriorityFeePerGas: (minTip as bigint | undefined) ?? 0n,\n l1DataFee: params.l1DataFee === 'op-stack',\n polygonSystemLogs: params.systemLogs === 'bor',\n capabilities,\n maxFeePerGas,\n maxGasLimit,\n };\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { AdapterManifest, PeerDependency } from '../../core/driver/types';
|
|
2
|
+
import type { ChainInfo } from '../../core/model/chain';
|
|
3
|
+
import type { AssetRegistration } from '../../core/registry/assets';
|
|
4
|
+
import type { Plugin } from '../../core/registry/plugin';
|
|
5
|
+
import type { ProviderPreset } from '../../core/registry/providers';
|
|
6
|
+
/** The SDK versions this adapter is validated against. */
|
|
7
|
+
export declare const EVM_PEER_DEPENDENCIES: Readonly<Record<'ethers' | 'web3', PeerDependency>>;
|
|
8
|
+
/** The `ethers` and `web3` manifests for `chains`, keyed `<family>/<library>`. */
|
|
9
|
+
export declare function evmManifests(family: string, chains: readonly string[]): AdapterManifest[];
|
|
10
|
+
/**
|
|
11
|
+
* The built-in EVM family: Ethereum, BNB Smart Chain, Polygon PoS, Avalanche C-Chain,
|
|
12
|
+
* Arbitrum One, OP Mainnet and Base, with their testnets.
|
|
13
|
+
*/
|
|
14
|
+
export declare function evmPlugin(): Plugin;
|
|
15
|
+
export interface EvmChainPluginOptions {
|
|
16
|
+
/**
|
|
17
|
+
* A unique name matching `/^[a-z][a-z0-9-]*$/`. The plugin registers as `evm:<name>`, so
|
|
18
|
+
* it never collides with a family plugin, and its manifests as `evm:<name>/ethers` and
|
|
19
|
+
* `evm:<name>/web3`.
|
|
20
|
+
*/
|
|
21
|
+
readonly name: string;
|
|
22
|
+
/** Chains with `family: 'evm'`, nonce ordering and the `secp256k1-ecdsa` scheme. */
|
|
23
|
+
readonly chains: readonly ChainInfo[];
|
|
24
|
+
readonly presets?: readonly ProviderPreset[];
|
|
25
|
+
/**
|
|
26
|
+
* Tokens: `erc20` refs, each registered under its EIP-55 checksummed contract, whatever
|
|
27
|
+
* case it is given in, so its alias and its transfers name one asset id.
|
|
28
|
+
*/
|
|
29
|
+
readonly assets?: readonly AssetRegistration[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A plugin for EVM chains of your own, served by the built-in EVM driver with either
|
|
33
|
+
* library. Every network and token is validated here, so bad data fails at registration.
|
|
34
|
+
*/
|
|
35
|
+
export declare function evmChainPlugin(options: EvmChainPluginOptions): Plugin;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EVM_PEER_DEPENDENCIES = void 0;
|
|
4
|
+
exports.evmManifests = evmManifests;
|
|
5
|
+
exports.evmPlugin = evmPlugin;
|
|
6
|
+
exports.evmChainPlugin = evmChainPlugin;
|
|
7
|
+
/**
|
|
8
|
+
* The EVM family plugin: chains, tokens and provider presets as data, plus one
|
|
9
|
+
* adapter manifest per library. SDK-free: only a manifest's `load()` requires a client
|
|
10
|
+
* module, and with it the SDK. `ethers` is registered first, so it is the family default.
|
|
11
|
+
*/
|
|
12
|
+
const sha3_1 = require("@noble/hashes/sha3");
|
|
13
|
+
const error_1 = require("../../core/errors/error");
|
|
14
|
+
const bytes_1 = require("../../core/util/bytes");
|
|
15
|
+
const chains_1 = require("./chains");
|
|
16
|
+
const network_1 = require("./network");
|
|
17
|
+
const presets_1 = require("./presets");
|
|
18
|
+
const tokens_1 = require("./tokens");
|
|
19
|
+
/** The SDK versions this adapter is validated against. */
|
|
20
|
+
exports.EVM_PEER_DEPENDENCIES = {
|
|
21
|
+
ethers: { name: 'ethers', range: '^6.17.0' },
|
|
22
|
+
web3: { name: 'web3', range: '^4.16.0' },
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The manifests' `load` functions, shared by every `evmManifests(...)` call, so that
|
|
26
|
+
* registering `evmPlugin()` or the same `evmChainPlugin(...)` again is the same plugin:
|
|
27
|
+
* the registry compares a plugin's functions by identity, and refuses a different plugin
|
|
28
|
+
* under a registered name. Each `require`s its client module, and with it the SDK, only
|
|
29
|
+
* when called.
|
|
30
|
+
*/
|
|
31
|
+
const loadEthers = async () => {
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
33
|
+
const mod = require('./ethers-client');
|
|
34
|
+
return mod.ethersDriverFactory;
|
|
35
|
+
};
|
|
36
|
+
const loadWeb3 = async () => {
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
38
|
+
const mod = require('./web3-client');
|
|
39
|
+
return mod.web3DriverFactory;
|
|
40
|
+
};
|
|
41
|
+
/** The `ethers` and `web3` manifests for `chains`, keyed `<family>/<library>`. */
|
|
42
|
+
function evmManifests(family, chains) {
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
family,
|
|
46
|
+
library: 'ethers',
|
|
47
|
+
chains,
|
|
48
|
+
capabilities: network_1.EVM_CAPABILITIES,
|
|
49
|
+
peerDependencies: [exports.EVM_PEER_DEPENDENCIES.ethers],
|
|
50
|
+
load: loadEthers,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
family,
|
|
54
|
+
library: 'web3',
|
|
55
|
+
chains,
|
|
56
|
+
capabilities: network_1.EVM_CAPABILITIES,
|
|
57
|
+
peerDependencies: [exports.EVM_PEER_DEPENDENCIES.web3],
|
|
58
|
+
load: loadWeb3,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The built-in EVM family: Ethereum, BNB Smart Chain, Polygon PoS, Avalanche C-Chain,
|
|
64
|
+
* Arbitrum One, OP Mainnet and Base, with their testnets.
|
|
65
|
+
*/
|
|
66
|
+
function evmPlugin() {
|
|
67
|
+
return {
|
|
68
|
+
name: 'evm',
|
|
69
|
+
chains: chains_1.EVM_CHAINS,
|
|
70
|
+
adapters: evmManifests('evm', chains_1.EVM_CHAINS.map((chain) => chain.id)),
|
|
71
|
+
presets: presets_1.EVM_PRESETS,
|
|
72
|
+
assets: tokens_1.EVM_TOKENS,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** A plugin name: lower-case letters, digits and hyphens, starting with a letter. */
|
|
76
|
+
const PLUGIN_NAME = /^[a-z][a-z0-9-]*$/;
|
|
77
|
+
/** `0x` and 40 hex digits, in any case. */
|
|
78
|
+
const HEX_ADDRESS = /^0x[0-9a-fA-F]{40}$/;
|
|
79
|
+
/** EIP-55: each letter upper-cased where the keccak-256 of the lower-case hex has 8 or more. */
|
|
80
|
+
function eip55(address) {
|
|
81
|
+
const hex = address.slice(2).toLowerCase();
|
|
82
|
+
const hash = (0, bytes_1.toHex)((0, sha3_1.keccak_256)((0, bytes_1.utf8ToBytes)(hex)));
|
|
83
|
+
let out = '0x';
|
|
84
|
+
for (let i = 0; i < hex.length; i++) {
|
|
85
|
+
const c = hex[i];
|
|
86
|
+
out += Number.parseInt(hash[i], 16) >= 8 ? c.toUpperCase() : c;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* An ERC-20 registration under the contract the driver names it by. The driver normalizes
|
|
92
|
+
* every token ref it is given, reads or decodes to the EIP-55 form, and an asset id carries
|
|
93
|
+
* the contract as registered, so a lower-case registration would be a second asset of the
|
|
94
|
+
* same token: its alias would resolve to one id, and the token's own transfers, deposits
|
|
95
|
+
* and balances by ref to another. A mixed-case contract with a wrong checksum is a typo,
|
|
96
|
+
* refused as the driver refuses it in a transfer. The refusal never repeats the value.
|
|
97
|
+
*/
|
|
98
|
+
function erc20Registration(asset, name) {
|
|
99
|
+
const { ref } = asset;
|
|
100
|
+
if (ref === 'native')
|
|
101
|
+
return asset;
|
|
102
|
+
const fail = (reason) => {
|
|
103
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `EVM chain plugin '${name}': the asset ${JSON.stringify(asset.metadata.symbol)} on ${asset.chain}:${asset.network} ${reason}`);
|
|
104
|
+
};
|
|
105
|
+
if (ref.standard !== 'erc20')
|
|
106
|
+
fail(`must use the 'erc20' standard`);
|
|
107
|
+
if (!HEX_ADDRESS.test(ref.contract))
|
|
108
|
+
fail('needs a 0x-prefixed 20-byte hex contract');
|
|
109
|
+
const contract = eip55(ref.contract);
|
|
110
|
+
const digits = ref.contract.slice(2);
|
|
111
|
+
const mixedCase = /[a-f]/.test(digits) && /[A-F]/.test(digits);
|
|
112
|
+
if (mixedCase && contract !== ref.contract)
|
|
113
|
+
fail('has a contract with a wrong checksum');
|
|
114
|
+
return contract === ref.contract ? asset : { ...asset, ref: { ...ref, contract } };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* A plugin for EVM chains of your own, served by the built-in EVM driver with either
|
|
118
|
+
* library. Every network and token is validated here, so bad data fails at registration.
|
|
119
|
+
*/
|
|
120
|
+
function evmChainPlugin(options) {
|
|
121
|
+
if (!PLUGIN_NAME.test(options.name)) {
|
|
122
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `EVM chain plugin name ${JSON.stringify(options.name)} must match ${String(PLUGIN_NAME)}`);
|
|
123
|
+
}
|
|
124
|
+
const name = `evm:${options.name}`;
|
|
125
|
+
for (const chain of options.chains) {
|
|
126
|
+
const fail = (reason) => {
|
|
127
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `EVM chain '${chain.id}': ${reason}`);
|
|
128
|
+
};
|
|
129
|
+
if (chain.family !== 'evm')
|
|
130
|
+
fail(`its family must be 'evm'`);
|
|
131
|
+
if (chain.model !== 'account' || chain.ordering !== 'nonce') {
|
|
132
|
+
fail(`it must use the account model and nonce ordering`);
|
|
133
|
+
}
|
|
134
|
+
if (chain.schemes.length !== 1 || chain.schemes[0] !== 'secp256k1-ecdsa') {
|
|
135
|
+
fail(`its only scheme must be 'secp256k1-ecdsa'`);
|
|
136
|
+
}
|
|
137
|
+
for (const network of Object.values(chain.networks))
|
|
138
|
+
(0, network_1.evmNetworkConfig)(chain, network);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
name,
|
|
142
|
+
chains: options.chains,
|
|
143
|
+
adapters: evmManifests(name, options.chains.map((chain) => chain.id)),
|
|
144
|
+
...(options.presets ? { presets: options.presets } : {}),
|
|
145
|
+
...(options.assets
|
|
146
|
+
? { assets: options.assets.map((asset) => erc20Registration(asset, name)) }
|
|
147
|
+
: {}),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/adapters/evm/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The EVM family plugin: chains, tokens and provider presets as data, plus one\n * adapter manifest per library. SDK-free: only a manifest's `load()` requires a client\n * module, and with it the SDK. `ethers` is registered first, so it is the family default.\n */\nimport { keccak_256 } from '@noble/hashes/sha3';\nimport type {\n AdapterManifest,\n DriverFactory,\n PeerDependency,\n} from '../../core/driver/types';\nimport { ConfigError } from '../../core/errors/error';\nimport type { ChainInfo } from '../../core/model/chain';\nimport type { AssetRegistration } from '../../core/registry/assets';\nimport type { Plugin } from '../../core/registry/plugin';\nimport type { ProviderPreset } from '../../core/registry/providers';\nimport { toHex, utf8ToBytes } from '../../core/util/bytes';\nimport { EVM_CHAINS } from './chains';\nimport { EVM_CAPABILITIES, evmNetworkConfig } from './network';\nimport { EVM_PRESETS } from './presets';\nimport { EVM_TOKENS } from './tokens';\n\n/** The SDK versions this adapter is validated against. */\nexport const EVM_PEER_DEPENDENCIES: Readonly<Record<'ethers' | 'web3', PeerDependency>> =\n {\n ethers: { name: 'ethers', range: '^6.17.0' },\n web3: { name: 'web3', range: '^4.16.0' },\n };\n\n/**\n * The manifests' `load` functions, shared by every `evmManifests(...)` call, so that\n * registering `evmPlugin()` or the same `evmChainPlugin(...)` again is the same plugin:\n * the registry compares a plugin's functions by identity, and refuses a different plugin\n * under a registered name. Each `require`s its client module, and with it the SDK, only\n * when called.\n */\nconst loadEthers = async (): Promise<DriverFactory> => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('./ethers-client') as typeof import('./ethers-client');\n return mod.ethersDriverFactory;\n};\n\nconst loadWeb3 = async (): Promise<DriverFactory> => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('./web3-client') as typeof import('./web3-client');\n return mod.web3DriverFactory;\n};\n\n/** The `ethers` and `web3` manifests for `chains`, keyed `<family>/<library>`. */\nexport function evmManifests(\n family: string,\n chains: readonly string[],\n): AdapterManifest[] {\n return [\n {\n family,\n library: 'ethers',\n chains,\n capabilities: EVM_CAPABILITIES,\n peerDependencies: [EVM_PEER_DEPENDENCIES.ethers],\n load: loadEthers,\n },\n {\n family,\n library: 'web3',\n chains,\n capabilities: EVM_CAPABILITIES,\n peerDependencies: [EVM_PEER_DEPENDENCIES.web3],\n load: loadWeb3,\n },\n ];\n}\n\n/**\n * The built-in EVM family: Ethereum, BNB Smart Chain, Polygon PoS, Avalanche C-Chain,\n * Arbitrum One, OP Mainnet and Base, with their testnets.\n */\nexport function evmPlugin(): Plugin {\n return {\n name: 'evm',\n chains: EVM_CHAINS,\n adapters: evmManifests(\n 'evm',\n EVM_CHAINS.map((chain) => chain.id),\n ),\n presets: EVM_PRESETS,\n assets: EVM_TOKENS,\n };\n}\n\n/** A plugin name: lower-case letters, digits and hyphens, starting with a letter. */\nconst PLUGIN_NAME = /^[a-z][a-z0-9-]*$/;\n\n/** `0x` and 40 hex digits, in any case. */\nconst HEX_ADDRESS = /^0x[0-9a-fA-F]{40}$/;\n\n/** EIP-55: each letter upper-cased where the keccak-256 of the lower-case hex has 8 or more. */\nfunction eip55(address: string): string {\n const hex = address.slice(2).toLowerCase();\n const hash = toHex(keccak_256(utf8ToBytes(hex)));\n let out = '0x';\n for (let i = 0; i < hex.length; i++) {\n const c = hex[i] as string;\n out += Number.parseInt(hash[i] as string, 16) >= 8 ? c.toUpperCase() : c;\n }\n return out;\n}\n\n/**\n * An ERC-20 registration under the contract the driver names it by. The driver normalizes\n * every token ref it is given, reads or decodes to the EIP-55 form, and an asset id carries\n * the contract as registered, so a lower-case registration would be a second asset of the\n * same token: its alias would resolve to one id, and the token's own transfers, deposits\n * and balances by ref to another. A mixed-case contract with a wrong checksum is a typo,\n * refused as the driver refuses it in a transfer. The refusal never repeats the value.\n */\nfunction erc20Registration(asset: AssetRegistration, name: string): AssetRegistration {\n const { ref } = asset;\n if (ref === 'native') return asset;\n const fail = (reason: string): never => {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `EVM chain plugin '${name}': the asset ${JSON.stringify(asset.metadata.symbol)} on ${asset.chain}:${asset.network} ${reason}`,\n );\n };\n if (ref.standard !== 'erc20') fail(`must use the 'erc20' standard`);\n if (!HEX_ADDRESS.test(ref.contract)) fail('needs a 0x-prefixed 20-byte hex contract');\n const contract = eip55(ref.contract);\n const digits = ref.contract.slice(2);\n const mixedCase = /[a-f]/.test(digits) && /[A-F]/.test(digits);\n if (mixedCase && contract !== ref.contract)\n fail('has a contract with a wrong checksum');\n return contract === ref.contract ? asset : { ...asset, ref: { ...ref, contract } };\n}\n\nexport interface EvmChainPluginOptions {\n /**\n * A unique name matching `/^[a-z][a-z0-9-]*$/`. The plugin registers as `evm:<name>`, so\n * it never collides with a family plugin, and its manifests as `evm:<name>/ethers` and\n * `evm:<name>/web3`.\n */\n readonly name: string;\n /** Chains with `family: 'evm'`, nonce ordering and the `secp256k1-ecdsa` scheme. */\n readonly chains: readonly ChainInfo[];\n readonly presets?: readonly ProviderPreset[];\n /**\n * Tokens: `erc20` refs, each registered under its EIP-55 checksummed contract, whatever\n * case it is given in, so its alias and its transfers name one asset id.\n */\n readonly assets?: readonly AssetRegistration[];\n}\n\n/**\n * A plugin for EVM chains of your own, served by the built-in EVM driver with either\n * library. Every network and token is validated here, so bad data fails at registration.\n */\nexport function evmChainPlugin(options: EvmChainPluginOptions): Plugin {\n if (!PLUGIN_NAME.test(options.name)) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `EVM chain plugin name ${JSON.stringify(options.name)} must match ${String(PLUGIN_NAME)}`,\n );\n }\n const name = `evm:${options.name}`;\n for (const chain of options.chains) {\n const fail = (reason: string): never => {\n throw new ConfigError('CONFIG_INVALID', `EVM chain '${chain.id}': ${reason}`);\n };\n if (chain.family !== 'evm') fail(`its family must be 'evm'`);\n if (chain.model !== 'account' || chain.ordering !== 'nonce') {\n fail(`it must use the account model and nonce ordering`);\n }\n if (chain.schemes.length !== 1 || chain.schemes[0] !== 'secp256k1-ecdsa') {\n fail(`its only scheme must be 'secp256k1-ecdsa'`);\n }\n for (const network of Object.values(chain.networks)) evmNetworkConfig(chain, network);\n }\n return {\n name,\n chains: options.chains,\n adapters: evmManifests(\n name,\n options.chains.map((chain) => chain.id),\n ),\n ...(options.presets ? { presets: options.presets } : {}),\n ...(options.assets\n ? { assets: options.assets.map((asset) => erc20Registration(asset, name)) }\n : {}),\n };\n}\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EVM_PRESETS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* EVM provider presets. Only URL templates verified against the provider's own
|
|
6
|
+
* documentation are listed; a preset refuses every other network with `CONFIG_INVALID`.
|
|
7
|
+
* `public` has no Ethereum entry: no operator-run public endpoint is documented for it.
|
|
8
|
+
* Keyed URLs are `Secret`s, so the key never reaches logs or errors.
|
|
9
|
+
*/
|
|
10
|
+
const error_1 = require("../../core/errors/error");
|
|
11
|
+
const secret_1 = require("../../core/secret/secret");
|
|
12
|
+
/**
|
|
13
|
+
* Free public endpoints named in each chain's own documentation: the chain operator's, or a
|
|
14
|
+
* third party's where the docs list one (Polygon's are drpc's).
|
|
15
|
+
*/
|
|
16
|
+
const PUBLIC = {
|
|
17
|
+
bsc: {
|
|
18
|
+
mainnet: 'https://bsc-dataseed.bnbchain.org',
|
|
19
|
+
testnet: 'https://bsc-testnet-dataseed.bnbchain.org',
|
|
20
|
+
},
|
|
21
|
+
polygon: {
|
|
22
|
+
mainnet: 'https://polygon.drpc.org',
|
|
23
|
+
amoy: 'https://polygon-amoy.drpc.org',
|
|
24
|
+
},
|
|
25
|
+
avalanche: {
|
|
26
|
+
mainnet: 'https://api.avax.network/ext/bc/C/rpc',
|
|
27
|
+
fuji: 'https://api.avax-test.network/ext/bc/C/rpc',
|
|
28
|
+
},
|
|
29
|
+
arbitrum: {
|
|
30
|
+
mainnet: 'https://arb1.arbitrum.io/rpc',
|
|
31
|
+
sepolia: 'https://sepolia-rollup.arbitrum.io/rpc',
|
|
32
|
+
},
|
|
33
|
+
optimism: {
|
|
34
|
+
mainnet: 'https://mainnet.optimism.io',
|
|
35
|
+
sepolia: 'https://sepolia.optimism.io',
|
|
36
|
+
},
|
|
37
|
+
base: { mainnet: 'https://mainnet.base.org', sepolia: 'https://sepolia.base.org' },
|
|
38
|
+
};
|
|
39
|
+
/** `https://<host>.g.alchemy.com/v2/<key>`. */
|
|
40
|
+
const ALCHEMY = {
|
|
41
|
+
ethereum: { mainnet: 'eth-mainnet', sepolia: 'eth-sepolia', hoodi: 'eth-hoodi' },
|
|
42
|
+
bsc: { mainnet: 'bnb-mainnet', testnet: 'bnb-testnet' },
|
|
43
|
+
polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },
|
|
44
|
+
avalanche: { mainnet: 'avax-mainnet', fuji: 'avax-fuji' },
|
|
45
|
+
arbitrum: { mainnet: 'arb-mainnet', sepolia: 'arb-sepolia' },
|
|
46
|
+
optimism: { mainnet: 'opt-mainnet', sepolia: 'opt-sepolia' },
|
|
47
|
+
base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },
|
|
48
|
+
};
|
|
49
|
+
/** `https://<host>.infura.io/v3/<key>`. */
|
|
50
|
+
const INFURA = {
|
|
51
|
+
ethereum: { mainnet: 'mainnet', sepolia: 'sepolia', hoodi: 'hoodi' },
|
|
52
|
+
bsc: { mainnet: 'bsc-mainnet', testnet: 'bsc-testnet' },
|
|
53
|
+
polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },
|
|
54
|
+
avalanche: { mainnet: 'avalanche-mainnet', fuji: 'avalanche-fuji' },
|
|
55
|
+
arbitrum: { mainnet: 'arbitrum-mainnet', sepolia: 'arbitrum-sepolia' },
|
|
56
|
+
optimism: { mainnet: 'optimism-mainnet', sepolia: 'optimism-sepolia' },
|
|
57
|
+
base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },
|
|
58
|
+
};
|
|
59
|
+
/** `https://rpc.ankr.com/<path>/<key>`: only the paths Ankr's documentation shows. */
|
|
60
|
+
const ANKR = {
|
|
61
|
+
ethereum: { mainnet: 'eth' },
|
|
62
|
+
bsc: { mainnet: 'bsc' },
|
|
63
|
+
avalanche: { mainnet: 'avalanche' },
|
|
64
|
+
arbitrum: { mainnet: 'arbitrum' },
|
|
65
|
+
base: { mainnet: 'base' },
|
|
66
|
+
};
|
|
67
|
+
function entry(table, input) {
|
|
68
|
+
const value = table[input.chain]?.[input.network];
|
|
69
|
+
// Unreachable through the catalog, which asks `supports` first.
|
|
70
|
+
if (value === undefined)
|
|
71
|
+
throw new Error(`no entry for ${input.chain}:${input.network}`);
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
/** The revealed key; the error names the preset and network, never the key. */
|
|
75
|
+
function apiKeyOf(name, input) {
|
|
76
|
+
const key = input.apiKey === undefined ? undefined : (0, secret_1.reveal)(input.apiKey);
|
|
77
|
+
if (typeof key !== 'string' || key.trim() === '') {
|
|
78
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `provider preset '${name}' requires a non-empty apiKey for ${input.chain}:${input.network}`);
|
|
79
|
+
}
|
|
80
|
+
return key;
|
|
81
|
+
}
|
|
82
|
+
function keyed(name, table, url) {
|
|
83
|
+
return {
|
|
84
|
+
name,
|
|
85
|
+
kind: 'rpc',
|
|
86
|
+
requiresApiKey: true,
|
|
87
|
+
supports: (chain, network) => table[chain]?.[network] !== undefined,
|
|
88
|
+
endpoints: (input) => [
|
|
89
|
+
{ name, url: (0, secret_1.secret)(url(entry(table, input), apiKeyOf(name, input))) },
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
exports.EVM_PRESETS = [
|
|
94
|
+
{
|
|
95
|
+
name: 'public',
|
|
96
|
+
kind: 'rpc',
|
|
97
|
+
production: false,
|
|
98
|
+
supports: (chain, network) => PUBLIC[chain]?.[network] !== undefined,
|
|
99
|
+
endpoints: (input) => [{ name: 'public', url: entry(PUBLIC, input) }],
|
|
100
|
+
},
|
|
101
|
+
keyed('alchemy', ALCHEMY, (host, key) => `https://${host}.g.alchemy.com/v2/${key}`),
|
|
102
|
+
keyed('infura', INFURA, (host, key) => `https://${host}.infura.io/v3/${key}`),
|
|
103
|
+
keyed('ankr', ANKR, (path, key) => `https://rpc.ankr.com/${path}/${key}`),
|
|
104
|
+
];
|
|
105
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/adapters/evm/presets.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * EVM provider presets. Only URL templates verified against the provider's own\n * documentation are listed; a preset refuses every other network with `CONFIG_INVALID`.\n * `public` has no Ethereum entry: no operator-run public endpoint is documented for it.\n * Keyed URLs are `Secret`s, so the key never reaches logs or errors.\n */\nimport { ConfigError } from '../../core/errors/error';\nimport type { PresetInput, ProviderPreset } from '../../core/registry/providers';\nimport { reveal, secret } from '../../core/secret/secret';\nimport type { EndpointConfig } from '../../core/transport/types';\n\ntype Table = Readonly<Record<string, Readonly<Record<string, string>>>>;\n\n/**\n * Free public endpoints named in each chain's own documentation: the chain operator's, or a\n * third party's where the docs list one (Polygon's are drpc's).\n */\nconst PUBLIC: Table = {\n bsc: {\n mainnet: 'https://bsc-dataseed.bnbchain.org',\n testnet: 'https://bsc-testnet-dataseed.bnbchain.org',\n },\n polygon: {\n mainnet: 'https://polygon.drpc.org',\n amoy: 'https://polygon-amoy.drpc.org',\n },\n avalanche: {\n mainnet: 'https://api.avax.network/ext/bc/C/rpc',\n fuji: 'https://api.avax-test.network/ext/bc/C/rpc',\n },\n arbitrum: {\n mainnet: 'https://arb1.arbitrum.io/rpc',\n sepolia: 'https://sepolia-rollup.arbitrum.io/rpc',\n },\n optimism: {\n mainnet: 'https://mainnet.optimism.io',\n sepolia: 'https://sepolia.optimism.io',\n },\n base: { mainnet: 'https://mainnet.base.org', sepolia: 'https://sepolia.base.org' },\n};\n\n/** `https://<host>.g.alchemy.com/v2/<key>`. */\nconst ALCHEMY: Table = {\n ethereum: { mainnet: 'eth-mainnet', sepolia: 'eth-sepolia', hoodi: 'eth-hoodi' },\n bsc: { mainnet: 'bnb-mainnet', testnet: 'bnb-testnet' },\n polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },\n avalanche: { mainnet: 'avax-mainnet', fuji: 'avax-fuji' },\n arbitrum: { mainnet: 'arb-mainnet', sepolia: 'arb-sepolia' },\n optimism: { mainnet: 'opt-mainnet', sepolia: 'opt-sepolia' },\n base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },\n};\n\n/** `https://<host>.infura.io/v3/<key>`. */\nconst INFURA: Table = {\n ethereum: { mainnet: 'mainnet', sepolia: 'sepolia', hoodi: 'hoodi' },\n bsc: { mainnet: 'bsc-mainnet', testnet: 'bsc-testnet' },\n polygon: { mainnet: 'polygon-mainnet', amoy: 'polygon-amoy' },\n avalanche: { mainnet: 'avalanche-mainnet', fuji: 'avalanche-fuji' },\n arbitrum: { mainnet: 'arbitrum-mainnet', sepolia: 'arbitrum-sepolia' },\n optimism: { mainnet: 'optimism-mainnet', sepolia: 'optimism-sepolia' },\n base: { mainnet: 'base-mainnet', sepolia: 'base-sepolia' },\n};\n\n/** `https://rpc.ankr.com/<path>/<key>`: only the paths Ankr's documentation shows. */\nconst ANKR: Table = {\n ethereum: { mainnet: 'eth' },\n bsc: { mainnet: 'bsc' },\n avalanche: { mainnet: 'avalanche' },\n arbitrum: { mainnet: 'arbitrum' },\n base: { mainnet: 'base' },\n};\n\nfunction entry(table: Table, input: PresetInput): string {\n const value = table[input.chain]?.[input.network];\n // Unreachable through the catalog, which asks `supports` first.\n if (value === undefined)\n throw new Error(`no entry for ${input.chain}:${input.network}`);\n return value;\n}\n\n/** The revealed key; the error names the preset and network, never the key. */\nfunction apiKeyOf(name: string, input: PresetInput): string {\n const key: unknown = input.apiKey === undefined ? undefined : reveal(input.apiKey);\n if (typeof key !== 'string' || key.trim() === '') {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `provider preset '${name}' requires a non-empty apiKey for ${input.chain}:${input.network}`,\n );\n }\n return key;\n}\n\nfunction keyed(\n name: string,\n table: Table,\n url: (value: string, key: string) => string,\n): ProviderPreset {\n return {\n name,\n kind: 'rpc',\n requiresApiKey: true,\n supports: (chain, network) => table[chain]?.[network] !== undefined,\n endpoints: (input): readonly EndpointConfig[] => [\n { name, url: secret(url(entry(table, input), apiKeyOf(name, input))) },\n ],\n };\n}\n\nexport const EVM_PRESETS: readonly ProviderPreset[] = [\n {\n name: 'public',\n kind: 'rpc',\n production: false,\n supports: (chain, network) => PUBLIC[chain]?.[network] !== undefined,\n endpoints: (input) => [{ name: 'public', url: entry(PUBLIC, input) }],\n },\n keyed('alchemy', ALCHEMY, (host, key) => `https://${host}.g.alchemy.com/v2/${key}`),\n keyed('infura', INFURA, (host, key) => `https://${host}.infura.io/v3/${key}`),\n keyed('ankr', ANKR, (path, key) => `https://rpc.ankr.com/${path}/${key}`),\n];\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BlockSource, ProofSource } from '../../core/driver/types';
|
|
2
|
+
import { type EvmContext } from './reader';
|
|
3
|
+
/**
|
|
4
|
+
* The lowest height at or below `final` where `consumed` holds, given that it holds at
|
|
5
|
+
* `final`. A gallop back (`final` less 1, 2, 4, …) finds a height where it does not, then a
|
|
6
|
+
* bisection the first where it does. `consumed` never turns false again as the height
|
|
7
|
+
* grows, since an account's nonce never falls. Beyond `MAX_SEARCH_READS` reads, it decides
|
|
8
|
+
* nothing.
|
|
9
|
+
*/
|
|
10
|
+
export declare function consumptionHeight(consumed: (height: bigint) => Promise<boolean>, final: bigint): Promise<bigint>;
|
|
11
|
+
export declare function createEvmProofs(ctx: EvmContext): ProofSource;
|
|
12
|
+
/**
|
|
13
|
+
* Whether a block's `logsBloom` may hold `value` (a log's address or topic), by the
|
|
14
|
+
* yellow paper's M3:2048: three bits, each the low 11 bits of a byte pair of the value's
|
|
15
|
+
* keccak-256. `false` is definitive; `true` may be a false positive. No bloom may hold
|
|
16
|
+
* anything.
|
|
17
|
+
*/
|
|
18
|
+
export declare function mayHold(bloom: string | undefined, value: string): boolean;
|
|
19
|
+
export declare function createEvmBlocks(ctx: EvmContext): BlockSource;
|