crypto-aio 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +144 -14
- package/dist/adapters/avalanche/address.d.ts +15 -0
- package/dist/adapters/avalanche/address.js +74 -0
- package/dist/adapters/avalanche/address.js.map +1 -0
- package/dist/adapters/avalanche/api.d.ts +100 -0
- package/dist/adapters/avalanche/api.js +381 -0
- package/dist/adapters/avalanche/api.js.map +1 -0
- package/dist/adapters/avalanche/builder.d.ts +13 -0
- package/dist/adapters/avalanche/builder.js +336 -0
- package/dist/adapters/avalanche/builder.js.map +1 -0
- package/dist/adapters/avalanche/cb58.d.ts +7 -0
- package/dist/adapters/avalanche/cb58.js +49 -0
- package/dist/adapters/avalanche/cb58.js.map +1 -0
- package/dist/adapters/avalanche/chains.d.ts +21 -0
- package/dist/adapters/avalanche/chains.js +79 -0
- package/dist/adapters/avalanche/chains.js.map +1 -0
- package/dist/adapters/avalanche/codec.d.ts +94 -0
- package/dist/adapters/avalanche/codec.js +371 -0
- package/dist/adapters/avalanche/codec.js.map +1 -0
- package/dist/adapters/avalanche/context.d.ts +59 -0
- package/dist/adapters/avalanche/context.js +114 -0
- package/dist/adapters/avalanche/context.js.map +1 -0
- package/dist/adapters/avalanche/decode.d.ts +16 -0
- package/dist/adapters/avalanche/decode.js +101 -0
- package/dist/adapters/avalanche/decode.js.map +1 -0
- package/dist/adapters/avalanche/driver.d.ts +22 -0
- package/dist/adapters/avalanche/driver.js +81 -0
- package/dist/adapters/avalanche/driver.js.map +1 -0
- package/dist/adapters/avalanche/errors.d.ts +18 -0
- package/dist/adapters/avalanche/errors.js +61 -0
- package/dist/adapters/avalanche/errors.js.map +1 -0
- package/dist/adapters/avalanche/fees.d.ts +23 -0
- package/dist/adapters/avalanche/fees.js +105 -0
- package/dist/adapters/avalanche/fees.js.map +1 -0
- package/dist/adapters/avalanche/index.d.ts +19 -0
- package/dist/adapters/avalanche/index.js +8 -0
- package/dist/adapters/avalanche/index.js.map +1 -0
- package/dist/adapters/avalanche/network.d.ts +37 -0
- package/dist/adapters/avalanche/network.js +135 -0
- package/dist/adapters/avalanche/network.js.map +1 -0
- package/dist/adapters/avalanche/plugin.d.ts +21 -0
- package/dist/adapters/avalanche/plugin.js +46 -0
- package/dist/adapters/avalanche/plugin.js.map +1 -0
- package/dist/adapters/avalanche/presets.d.ts +6 -0
- package/dist/adapters/avalanche/presets.js +86 -0
- package/dist/adapters/avalanche/presets.js.map +1 -0
- package/dist/adapters/avalanche/proofs.d.ts +41 -0
- package/dist/adapters/avalanche/proofs.js +270 -0
- package/dist/adapters/avalanche/proofs.js.map +1 -0
- package/dist/adapters/avalanche/reader.d.ts +40 -0
- package/dist/adapters/avalanche/reader.js +231 -0
- package/dist/adapters/avalanche/reader.js.map +1 -0
- package/dist/adapters/avalanche/sdk.d.ts +182 -0
- package/dist/adapters/avalanche/sdk.js +21 -0
- package/dist/adapters/avalanche/sdk.js.map +1 -0
- package/dist/adapters/avalanche/types.d.ts +86 -0
- package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
- package/dist/adapters/avalanche/types.js.map +1 -0
- package/dist/adapters/evm/builder.d.ts +11 -0
- package/dist/adapters/evm/builder.js +326 -0
- package/dist/adapters/evm/builder.js.map +1 -0
- package/dist/adapters/evm/chains.d.ts +6 -0
- package/dist/adapters/evm/chains.js +203 -0
- package/dist/adapters/evm/chains.js.map +1 -0
- package/dist/adapters/evm/client.d.ts +84 -0
- package/dist/adapters/evm/client.js +335 -0
- package/dist/adapters/evm/client.js.map +1 -0
- package/dist/adapters/evm/decode.d.ts +35 -0
- package/dist/adapters/evm/decode.js +170 -0
- package/dist/adapters/evm/decode.js.map +1 -0
- package/dist/adapters/evm/driver.d.ts +8 -0
- package/dist/adapters/evm/driver.js +61 -0
- package/dist/adapters/evm/driver.js.map +1 -0
- package/dist/adapters/evm/errors.d.ts +20 -0
- package/dist/adapters/evm/errors.js +110 -0
- package/dist/adapters/evm/errors.js.map +1 -0
- package/dist/adapters/evm/ethers-client.d.ts +43 -0
- package/dist/adapters/evm/ethers-client.js +135 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +79 -0
- package/dist/adapters/evm/fees.js +234 -0
- package/dist/adapters/evm/fees.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +20 -0
- package/dist/adapters/evm/index.js +11 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +60 -0
- package/dist/adapters/evm/network.js +131 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +36 -0
- package/dist/adapters/evm/plugin.js +102 -0
- package/dist/adapters/evm/plugin.js.map +1 -0
- package/dist/adapters/evm/presets.d.ts +2 -0
- package/dist/adapters/evm/presets.js +105 -0
- package/dist/adapters/evm/presets.js.map +1 -0
- package/dist/adapters/evm/proofs.d.ts +19 -0
- package/dist/adapters/evm/proofs.js +358 -0
- package/dist/adapters/evm/proofs.js.map +1 -0
- package/dist/adapters/evm/rawtx.d.ts +25 -0
- package/dist/adapters/evm/rawtx.js +176 -0
- package/dist/adapters/evm/rawtx.js.map +1 -0
- package/dist/adapters/evm/reader.d.ts +65 -0
- package/dist/adapters/evm/reader.js +292 -0
- package/dist/adapters/evm/reader.js.map +1 -0
- package/dist/adapters/evm/rpc.d.ts +39 -0
- package/dist/adapters/evm/rpc.js +152 -0
- package/dist/adapters/evm/rpc.js.map +1 -0
- package/dist/adapters/evm/tokens.d.ts +7 -0
- package/dist/adapters/evm/tokens.js +23 -0
- package/dist/adapters/evm/tokens.js.map +1 -0
- package/dist/adapters/evm/types.d.ts +255 -0
- package/dist/{type/account.js → adapters/evm/types.js} +1 -1
- package/dist/adapters/evm/types.js.map +1 -0
- package/dist/adapters/evm/web3-client.d.ts +23 -0
- package/dist/adapters/evm/web3-client.js +159 -0
- package/dist/adapters/evm/web3-client.js.map +1 -0
- package/dist/adapters/solana/builder.d.ts +18 -0
- package/dist/adapters/solana/builder.js +545 -0
- package/dist/adapters/solana/builder.js.map +1 -0
- package/dist/adapters/solana/chains.d.ts +13 -0
- package/dist/adapters/solana/chains.js +37 -0
- package/dist/adapters/solana/chains.js.map +1 -0
- package/dist/adapters/solana/decode.d.ts +111 -0
- package/dist/adapters/solana/decode.js +595 -0
- package/dist/adapters/solana/decode.js.map +1 -0
- package/dist/adapters/solana/driver.d.ts +15 -0
- package/dist/adapters/solana/driver.js +72 -0
- package/dist/adapters/solana/driver.js.map +1 -0
- package/dist/adapters/solana/errors.d.ts +36 -0
- package/dist/adapters/solana/errors.js +154 -0
- package/dist/adapters/solana/errors.js.map +1 -0
- package/dist/adapters/solana/fees.d.ts +68 -0
- package/dist/adapters/solana/fees.js +205 -0
- package/dist/adapters/solana/fees.js.map +1 -0
- package/dist/adapters/solana/heights.d.ts +47 -0
- package/dist/adapters/solana/heights.js +185 -0
- package/dist/adapters/solana/heights.js.map +1 -0
- package/dist/adapters/solana/history.d.ts +10 -0
- package/dist/adapters/solana/history.js +71 -0
- package/dist/adapters/solana/history.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +16 -0
- package/dist/adapters/solana/index.js +9 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/keys.d.ts +13 -0
- package/dist/adapters/solana/keys.js +69 -0
- package/dist/adapters/solana/keys.js.map +1 -0
- package/dist/adapters/solana/network.d.ts +24 -0
- package/dist/adapters/solana/network.js +95 -0
- package/dist/adapters/solana/network.js.map +1 -0
- package/dist/adapters/solana/plugin.d.ts +18 -0
- package/dist/adapters/solana/plugin.js +41 -0
- package/dist/adapters/solana/plugin.js.map +1 -0
- package/dist/adapters/solana/presets.d.ts +2 -0
- package/dist/adapters/solana/presets.js +77 -0
- package/dist/adapters/solana/presets.js.map +1 -0
- package/dist/adapters/solana/programs.d.ts +44 -0
- package/dist/adapters/solana/programs.js +159 -0
- package/dist/adapters/solana/programs.js.map +1 -0
- package/dist/adapters/solana/proofs.d.ts +56 -0
- package/dist/adapters/solana/proofs.js +540 -0
- package/dist/adapters/solana/proofs.js.map +1 -0
- package/dist/adapters/solana/reader.d.ts +82 -0
- package/dist/adapters/solana/reader.js +326 -0
- package/dist/adapters/solana/reader.js.map +1 -0
- package/dist/adapters/solana/rpc.d.ts +102 -0
- package/dist/adapters/solana/rpc.js +301 -0
- package/dist/adapters/solana/rpc.js.map +1 -0
- package/dist/adapters/solana/tokens.d.ts +7 -0
- package/dist/adapters/solana/tokens.js +19 -0
- package/dist/adapters/solana/tokens.js.map +1 -0
- package/dist/adapters/solana/types.d.ts +121 -0
- package/dist/{type/lib-types.js → adapters/solana/types.js} +1 -1
- package/dist/adapters/solana/types.js.map +1 -0
- package/dist/adapters/solana/web3.d.ts +5 -0
- package/dist/adapters/solana/web3.js +83 -0
- package/dist/adapters/solana/web3.js.map +1 -0
- package/dist/adapters/solana/wire.d.ts +62 -0
- package/dist/adapters/solana/wire.js +168 -0
- package/dist/adapters/solana/wire.js.map +1 -0
- package/dist/adapters/ton/address.d.ts +43 -0
- package/dist/adapters/ton/address.js +168 -0
- package/dist/adapters/ton/address.js.map +1 -0
- package/dist/adapters/ton/api.d.ts +344 -0
- package/dist/adapters/ton/api.js +942 -0
- package/dist/adapters/ton/api.js.map +1 -0
- package/dist/adapters/ton/builder.d.ts +18 -0
- package/dist/adapters/ton/builder.js +701 -0
- package/dist/adapters/ton/builder.js.map +1 -0
- package/dist/adapters/ton/chains.d.ts +16 -0
- package/dist/adapters/ton/chains.js +39 -0
- package/dist/adapters/ton/chains.js.map +1 -0
- package/dist/adapters/ton/decode.d.ts +43 -0
- package/dist/adapters/ton/decode.js +219 -0
- package/dist/adapters/ton/decode.js.map +1 -0
- package/dist/adapters/ton/driver.d.ts +10 -0
- package/dist/adapters/ton/driver.js +117 -0
- package/dist/adapters/ton/driver.js.map +1 -0
- package/dist/adapters/ton/errors.d.ts +36 -0
- package/dist/adapters/ton/errors.js +89 -0
- package/dist/adapters/ton/errors.js.map +1 -0
- package/dist/adapters/ton/fees.d.ts +28 -0
- package/dist/adapters/ton/fees.js +121 -0
- package/dist/adapters/ton/fees.js.map +1 -0
- package/dist/adapters/ton/index.d.ts +16 -0
- package/dist/adapters/ton/index.js +9 -0
- package/dist/adapters/ton/index.js.map +1 -0
- package/dist/adapters/ton/messages.d.ts +157 -0
- package/dist/adapters/ton/messages.js +397 -0
- package/dist/adapters/ton/messages.js.map +1 -0
- package/dist/adapters/ton/native-client.d.ts +10 -0
- package/dist/adapters/ton/native-client.js +47 -0
- package/dist/adapters/ton/native-client.js.map +1 -0
- package/dist/adapters/ton/network.d.ts +58 -0
- package/dist/adapters/ton/network.js +207 -0
- package/dist/adapters/ton/network.js.map +1 -0
- package/dist/adapters/ton/plugin.d.ts +24 -0
- package/dist/adapters/ton/plugin.js +57 -0
- package/dist/adapters/ton/plugin.js.map +1 -0
- package/dist/adapters/ton/presets.d.ts +6 -0
- package/dist/adapters/ton/presets.js +94 -0
- package/dist/adapters/ton/presets.js.map +1 -0
- package/dist/adapters/ton/proofs.d.ts +66 -0
- package/dist/adapters/ton/proofs.js +813 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +194 -0
- package/dist/adapters/ton/reader.js +781 -0
- package/dist/adapters/ton/reader.js.map +1 -0
- package/dist/adapters/ton/tokens.d.ts +10 -0
- package/dist/adapters/ton/tokens.js +27 -0
- package/dist/adapters/ton/tokens.js.map +1 -0
- package/dist/adapters/ton/trace.d.ts +48 -0
- package/dist/adapters/ton/trace.js +277 -0
- package/dist/adapters/ton/trace.js.map +1 -0
- package/dist/adapters/ton/types.d.ts +105 -0
- package/dist/adapters/ton/types.js +3 -0
- package/dist/adapters/ton/types.js.map +1 -0
- package/dist/adapters/ton/wallets.d.ts +86 -0
- package/dist/adapters/ton/wallets.js +373 -0
- package/dist/adapters/ton/wallets.js.map +1 -0
- package/dist/adapters/tron/abi.d.ts +39 -0
- package/dist/adapters/tron/abi.js +110 -0
- package/dist/adapters/tron/abi.js.map +1 -0
- package/dist/adapters/tron/address.d.ts +20 -0
- package/dist/adapters/tron/address.js +110 -0
- package/dist/adapters/tron/address.js.map +1 -0
- package/dist/adapters/tron/builder.d.ts +12 -0
- package/dist/adapters/tron/builder.js +553 -0
- package/dist/adapters/tron/builder.js.map +1 -0
- package/dist/adapters/tron/chains.d.ts +12 -0
- package/dist/adapters/tron/chains.js +35 -0
- package/dist/adapters/tron/chains.js.map +1 -0
- package/dist/adapters/tron/codec.d.ts +10 -0
- package/dist/adapters/tron/codec.js +322 -0
- package/dist/adapters/tron/codec.js.map +1 -0
- package/dist/adapters/tron/decode.d.ts +50 -0
- package/dist/adapters/tron/decode.js +280 -0
- package/dist/adapters/tron/decode.js.map +1 -0
- package/dist/adapters/tron/driver.d.ts +12 -0
- package/dist/adapters/tron/driver.js +106 -0
- package/dist/adapters/tron/driver.js.map +1 -0
- package/dist/adapters/tron/errors.d.ts +74 -0
- package/dist/adapters/tron/errors.js +261 -0
- package/dist/adapters/tron/errors.js.map +1 -0
- package/dist/adapters/tron/fees.d.ts +49 -0
- package/dist/adapters/tron/fees.js +166 -0
- package/dist/adapters/tron/fees.js.map +1 -0
- package/dist/adapters/tron/http.d.ts +173 -0
- package/dist/adapters/tron/http.js +729 -0
- package/dist/adapters/tron/http.js.map +1 -0
- package/dist/adapters/tron/index.d.ts +16 -0
- package/dist/adapters/tron/index.js +15 -0
- package/dist/adapters/tron/index.js.map +1 -0
- package/dist/adapters/tron/network.d.ts +44 -0
- package/dist/adapters/tron/network.js +163 -0
- package/dist/adapters/tron/network.js.map +1 -0
- package/dist/adapters/tron/plugin.d.ts +17 -0
- package/dist/adapters/tron/plugin.js +39 -0
- package/dist/adapters/tron/plugin.js.map +1 -0
- package/dist/adapters/tron/presets.d.ts +5 -0
- package/dist/adapters/tron/presets.js +68 -0
- package/dist/adapters/tron/presets.js.map +1 -0
- package/dist/adapters/tron/proofs.d.ts +80 -0
- package/dist/adapters/tron/proofs.js +370 -0
- package/dist/adapters/tron/proofs.js.map +1 -0
- package/dist/adapters/tron/protobuf.d.ts +36 -0
- package/dist/adapters/tron/protobuf.js +90 -0
- package/dist/adapters/tron/protobuf.js.map +1 -0
- package/dist/adapters/tron/reader.d.ts +47 -0
- package/dist/adapters/tron/reader.js +203 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +7 -0
- package/dist/adapters/tron/tokens.js +14 -0
- package/dist/adapters/tron/tokens.js.map +1 -0
- package/dist/adapters/tron/types.d.ts +166 -0
- package/dist/adapters/tron/types.js +3 -0
- package/dist/adapters/tron/types.js.map +1 -0
- package/dist/adapters/utxo/address.d.ts +51 -0
- package/dist/adapters/utxo/address.js +341 -0
- package/dist/adapters/utxo/address.js.map +1 -0
- package/dist/adapters/utxo/builder.d.ts +35 -0
- package/dist/adapters/utxo/builder.js +380 -0
- package/dist/adapters/utxo/builder.js.map +1 -0
- package/dist/adapters/utxo/chains.d.ts +17 -0
- package/dist/adapters/utxo/chains.js +99 -0
- package/dist/adapters/utxo/chains.js.map +1 -0
- package/dist/adapters/utxo/codec.d.ts +120 -0
- package/dist/adapters/utxo/codec.js +408 -0
- package/dist/adapters/utxo/codec.js.map +1 -0
- package/dist/adapters/utxo/coinselect.d.ts +48 -0
- package/dist/adapters/utxo/coinselect.js +131 -0
- package/dist/adapters/utxo/coinselect.js.map +1 -0
- package/dist/adapters/utxo/context.d.ts +57 -0
- package/dist/adapters/utxo/context.js +118 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +14 -0
- package/dist/adapters/utxo/decode.js +85 -0
- package/dist/adapters/utxo/decode.js.map +1 -0
- package/dist/adapters/utxo/driver.d.ts +16 -0
- package/dist/adapters/utxo/driver.js +74 -0
- package/dist/adapters/utxo/driver.js.map +1 -0
- package/dist/adapters/utxo/ecc.d.ts +9 -0
- package/dist/adapters/utxo/ecc.js +26 -0
- package/dist/adapters/utxo/ecc.js.map +1 -0
- package/dist/adapters/utxo/errors.d.ts +52 -0
- package/dist/adapters/utxo/errors.js +191 -0
- package/dist/adapters/utxo/errors.js.map +1 -0
- package/dist/adapters/utxo/esplora.d.ts +79 -0
- package/dist/adapters/utxo/esplora.js +451 -0
- package/dist/adapters/utxo/esplora.js.map +1 -0
- package/dist/adapters/utxo/fees.d.ts +41 -0
- package/dist/adapters/utxo/fees.js +125 -0
- package/dist/adapters/utxo/fees.js.map +1 -0
- package/dist/adapters/utxo/index.d.ts +17 -0
- package/dist/adapters/utxo/index.js +8 -0
- package/dist/adapters/utxo/index.js.map +1 -0
- package/dist/adapters/utxo/network.d.ts +50 -0
- package/dist/adapters/utxo/network.js +165 -0
- package/dist/adapters/utxo/network.js.map +1 -0
- package/dist/adapters/utxo/plugin.d.ts +17 -0
- package/dist/adapters/utxo/plugin.js +41 -0
- package/dist/adapters/utxo/plugin.js.map +1 -0
- package/dist/adapters/utxo/presets.d.ts +12 -0
- package/dist/adapters/utxo/presets.js +47 -0
- package/dist/adapters/utxo/presets.js.map +1 -0
- package/dist/adapters/utxo/preview.d.ts +3 -0
- package/dist/adapters/utxo/preview.js +65 -0
- package/dist/adapters/utxo/preview.js.map +1 -0
- package/dist/adapters/utxo/proofs.d.ts +57 -0
- package/dist/adapters/utxo/proofs.js +331 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +59 -0
- package/dist/adapters/utxo/rawtx.js +234 -0
- package/dist/adapters/utxo/rawtx.js.map +1 -0
- package/dist/adapters/utxo/reader.d.ts +36 -0
- package/dist/adapters/utxo/reader.js +265 -0
- package/dist/adapters/utxo/reader.js.map +1 -0
- package/dist/adapters/utxo/sdk.d.ts +18 -0
- package/dist/adapters/utxo/sdk.js +17 -0
- package/dist/adapters/utxo/sdk.js.map +1 -0
- package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
- package/dist/adapters/utxo/signed-psbt.js +428 -0
- package/dist/adapters/utxo/signed-psbt.js.map +1 -0
- package/dist/adapters/utxo/spend.d.ts +59 -0
- package/dist/adapters/utxo/spend.js +230 -0
- package/dist/adapters/utxo/spend.js.map +1 -0
- package/dist/adapters/utxo/types.d.ts +167 -0
- package/dist/adapters/utxo/types.js +3 -0
- package/dist/adapters/utxo/types.js.map +1 -0
- package/dist/core/assets/service.d.ts +18 -0
- package/dist/core/assets/service.js +69 -0
- package/dist/core/assets/service.js.map +1 -0
- package/dist/core/blockchain/default-ref.d.ts +4 -0
- package/dist/core/blockchain/default-ref.js +16 -0
- package/dist/core/blockchain/default-ref.js.map +1 -0
- package/dist/core/blockchain/handle.d.ts +200 -0
- package/dist/core/blockchain/handle.js +579 -0
- package/dist/core/blockchain/handle.js.map +1 -0
- package/dist/core/blockchain/internal.d.ts +19 -0
- package/dist/core/blockchain/internal.js +16 -0
- package/dist/core/blockchain/internal.js.map +1 -0
- package/dist/core/blockchain/mapping.d.ts +22 -0
- package/dist/core/blockchain/mapping.js +136 -0
- package/dist/core/blockchain/mapping.js.map +1 -0
- package/dist/core/config/env.d.ts +8 -0
- package/dist/core/config/env.js +60 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/merge.d.ts +26 -0
- package/dist/core/config/merge.js +144 -0
- package/dist/core/config/merge.js.map +1 -0
- package/dist/core/config/resolve.d.ts +12 -0
- package/dist/core/config/resolve.js +251 -0
- package/dist/core/config/resolve.js.map +1 -0
- package/dist/core/config/types.d.ts +165 -0
- package/dist/core/config/types.js +3 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/container/builtins.d.ts +4 -0
- package/dist/core/container/builtins.js +13 -0
- package/dist/core/container/builtins.js.map +1 -0
- package/dist/core/container/container.d.ts +69 -0
- package/dist/core/container/container.js +466 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/default.d.ts +15 -0
- package/dist/core/container/default.js +70 -0
- package/dist/core/container/default.js.map +1 -0
- package/dist/core/container/internals.d.ts +54 -0
- package/dist/core/container/internals.js +21 -0
- package/dist/core/container/internals.js.map +1 -0
- package/dist/core/container/pool.d.ts +27 -0
- package/dist/core/container/pool.js +77 -0
- package/dist/core/container/pool.js.map +1 -0
- package/dist/core/driver/types.d.ts +346 -0
- package/dist/core/driver/types.js +3 -0
- package/dist/core/driver/types.js.map +1 -0
- package/dist/core/errors/codes.d.ts +153 -0
- package/dist/core/errors/codes.js +49 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/error.d.ts +66 -0
- package/dist/core/errors/error.js +129 -0
- package/dist/core/errors/error.js.map +1 -0
- package/dist/core/events/bus.d.ts +12 -0
- package/dist/core/events/bus.js +46 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/logger.d.ts +13 -0
- package/dist/core/events/logger.js +42 -0
- package/dist/core/events/logger.js.map +1 -0
- package/dist/core/events/types.d.ts +131 -0
- package/dist/core/events/types.js +3 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/lifecycle/engine-rules.d.ts +107 -0
- package/dist/core/lifecycle/engine-rules.js +257 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +500 -0
- package/dist/core/lifecycle/engine.js +1732 -0
- package/dist/core/lifecycle/engine.js.map +1 -0
- package/dist/core/lifecycle/evaluate.d.ts +19 -0
- package/dist/core/lifecycle/evaluate.js +72 -0
- package/dist/core/lifecycle/evaluate.js.map +1 -0
- package/dist/core/lifecycle/intent.d.ts +11 -0
- package/dist/core/lifecycle/intent.js +88 -0
- package/dist/core/lifecycle/intent.js.map +1 -0
- package/dist/core/lifecycle/monitor.d.ts +138 -0
- package/dist/core/lifecycle/monitor.js +606 -0
- package/dist/core/lifecycle/monitor.js.map +1 -0
- package/dist/core/lifecycle/observations.d.ts +17 -0
- package/dist/core/lifecycle/observations.js +59 -0
- package/dist/core/lifecycle/observations.js.map +1 -0
- package/dist/core/lifecycle/reconcile.d.ts +58 -0
- package/dist/core/lifecycle/reconcile.js +112 -0
- package/dist/core/lifecycle/reconcile.js.map +1 -0
- package/dist/core/lifecycle/views.d.ts +49 -0
- package/dist/core/lifecycle/views.js +57 -0
- package/dist/core/lifecycle/views.js.map +1 -0
- package/dist/core/lifecycle/workers.d.ts +82 -0
- package/dist/core/lifecycle/workers.js +329 -0
- package/dist/core/lifecycle/workers.js.map +1 -0
- package/dist/core/model/address.d.ts +32 -0
- package/dist/core/model/address.js +43 -0
- package/dist/core/model/address.js.map +1 -0
- package/dist/core/model/amount.d.ts +25 -0
- package/dist/core/model/amount.js +102 -0
- package/dist/core/model/amount.js.map +1 -0
- package/dist/core/model/asset.d.ts +28 -0
- package/dist/core/model/asset.js +47 -0
- package/dist/core/model/asset.js.map +1 -0
- package/dist/core/model/capability.d.ts +3 -0
- package/dist/core/model/capability.js +18 -0
- package/dist/core/model/capability.js.map +1 -0
- package/dist/core/model/chain.d.ts +63 -0
- package/dist/core/model/chain.js +8 -0
- package/dist/core/model/chain.js.map +1 -0
- package/dist/core/model/fee.d.ts +36 -0
- package/dist/core/model/fee.js +17 -0
- package/dist/core/model/fee.js.map +1 -0
- package/dist/core/model/ids.d.ts +37 -0
- package/dist/core/model/ids.js +13 -0
- package/dist/core/model/ids.js.map +1 -0
- package/dist/core/model/intent.d.ts +63 -0
- package/dist/core/model/intent.js +81 -0
- package/dist/core/model/intent.js.map +1 -0
- package/dist/core/model/ordering.d.ts +20 -0
- package/dist/core/model/ordering.js +29 -0
- package/dist/core/model/ordering.js.map +1 -0
- package/dist/core/model/transaction.d.ts +116 -0
- package/dist/core/model/transaction.js +3 -0
- package/dist/core/model/transaction.js.map +1 -0
- package/dist/core/observe/scanner.d.ts +135 -0
- package/dist/core/observe/scanner.js +355 -0
- package/dist/core/observe/scanner.js.map +1 -0
- package/dist/core/ordering/reservations.d.ts +16 -0
- package/dist/core/ordering/reservations.js +53 -0
- package/dist/core/ordering/reservations.js.map +1 -0
- package/dist/core/ordering/sequence.d.ts +61 -0
- package/dist/core/ordering/sequence.js +155 -0
- package/dist/core/ordering/sequence.js.map +1 -0
- package/dist/core/registry/adapters.d.ts +10 -0
- package/dist/core/registry/adapters.js +56 -0
- package/dist/core/registry/adapters.js.map +1 -0
- package/dist/core/registry/assets.d.ts +18 -0
- package/dist/core/registry/assets.js +90 -0
- package/dist/core/registry/assets.js.map +1 -0
- package/dist/core/registry/chains.d.ts +10 -0
- package/dist/core/registry/chains.js +80 -0
- package/dist/core/registry/chains.js.map +1 -0
- package/dist/core/registry/plugin.d.ts +41 -0
- package/dist/core/registry/plugin.js +109 -0
- package/dist/core/registry/plugin.js.map +1 -0
- package/dist/core/registry/providers.d.ts +31 -0
- package/dist/core/registry/providers.js +43 -0
- package/dist/core/registry/providers.js.map +1 -0
- package/dist/core/registry/schemes.d.ts +30 -0
- package/dist/core/registry/schemes.js +84 -0
- package/dist/core/registry/schemes.js.map +1 -0
- package/dist/core/secret/fragments.d.ts +33 -0
- package/dist/core/secret/fragments.js +110 -0
- package/dist/core/secret/fragments.js.map +1 -0
- package/dist/core/secret/redact.d.ts +10 -0
- package/dist/core/secret/redact.js +110 -0
- package/dist/core/secret/redact.js.map +1 -0
- package/dist/core/secret/secret.d.ts +14 -0
- package/dist/core/secret/secret.js +42 -0
- package/dist/core/secret/secret.js.map +1 -0
- package/dist/core/signing/callback.d.ts +10 -0
- package/dist/core/signing/callback.js +22 -0
- package/dist/core/signing/callback.js.map +1 -0
- package/dist/core/signing/guard.d.ts +18 -0
- package/dist/core/signing/guard.js +72 -0
- package/dist/core/signing/guard.js.map +1 -0
- package/dist/core/signing/hd.d.ts +36 -0
- package/dist/core/signing/hd.js +167 -0
- package/dist/core/signing/hd.js.map +1 -0
- package/dist/core/signing/local.d.ts +48 -0
- package/dist/core/signing/local.js +190 -0
- package/dist/core/signing/local.js.map +1 -0
- package/dist/core/signing/orchestrator.d.ts +40 -0
- package/dist/core/signing/orchestrator.js +300 -0
- package/dist/core/signing/orchestrator.js.map +1 -0
- package/dist/core/signing/types.d.ts +64 -0
- package/dist/core/signing/types.js +3 -0
- package/dist/core/signing/types.js.map +1 -0
- package/dist/core/signing/wallet.d.ts +48 -0
- package/dist/core/signing/wallet.js +153 -0
- package/dist/core/signing/wallet.js.map +1 -0
- package/dist/core/store/clone.d.ts +25 -0
- package/dist/core/store/clone.js +71 -0
- package/dist/core/store/clone.js.map +1 -0
- package/dist/core/store/memory.d.ts +38 -0
- package/dist/core/store/memory.js +325 -0
- package/dist/core/store/memory.js.map +1 -0
- package/dist/core/store/types.d.ts +246 -0
- package/dist/core/store/types.js +117 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/transport/backoff.d.ts +8 -0
- package/dist/core/transport/backoff.js +27 -0
- package/dist/core/transport/backoff.js.map +1 -0
- package/dist/core/transport/circuit.d.ts +25 -0
- package/dist/core/transport/circuit.js +61 -0
- package/dist/core/transport/circuit.js.map +1 -0
- package/dist/core/transport/http-transport.d.ts +30 -0
- package/dist/core/transport/http-transport.js +1695 -0
- package/dist/core/transport/http-transport.js.map +1 -0
- package/dist/core/transport/rate-limit.d.ts +27 -0
- package/dist/core/transport/rate-limit.js +78 -0
- package/dist/core/transport/rate-limit.js.map +1 -0
- package/dist/core/transport/stale-view.d.ts +11 -0
- package/dist/core/transport/stale-view.js +17 -0
- package/dist/core/transport/stale-view.js.map +1 -0
- package/dist/core/transport/types.d.ts +144 -0
- package/dist/core/transport/types.js +6 -0
- package/dist/core/transport/types.js.map +1 -0
- package/dist/core/util/bytes.d.ts +9 -0
- package/dist/core/util/bytes.js +40 -0
- package/dist/core/util/bytes.js.map +1 -0
- package/dist/core/util/clock.d.ts +6 -0
- package/dist/core/util/clock.js +26 -0
- package/dist/core/util/clock.js.map +1 -0
- package/dist/core/util/freeze.d.ts +8 -0
- package/dist/core/util/freeze.js +31 -0
- package/dist/core/util/freeze.js.map +1 -0
- package/dist/core/util/json.d.ts +29 -0
- package/dist/core/util/json.js +165 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +21 -0
- package/dist/core/util/names.js +46 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +64 -14
- package/dist/index.js +105 -49
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +21 -0
- package/dist/native.js +44 -0
- package/dist/native.js.map +1 -0
- package/dist/testing/contracts/api.d.ts +12 -0
- package/dist/testing/contracts/api.js +58 -0
- package/dist/testing/contracts/api.js.map +1 -0
- package/dist/testing/contracts/cursors.d.ts +6 -0
- package/dist/testing/contracts/cursors.js +43 -0
- package/dist/testing/contracts/cursors.js.map +1 -0
- package/dist/testing/contracts/locks.d.ts +10 -0
- package/dist/testing/contracts/locks.js +63 -0
- package/dist/testing/contracts/locks.js.map +1 -0
- package/dist/testing/contracts/operations.d.ts +21 -0
- package/dist/testing/contracts/operations.js +718 -0
- package/dist/testing/contracts/operations.js.map +1 -0
- package/dist/testing/contracts/sequences.d.ts +6 -0
- package/dist/testing/contracts/sequences.js +68 -0
- package/dist/testing/contracts/sequences.js.map +1 -0
- package/dist/testing/env.d.ts +63 -0
- package/dist/testing/env.js +105 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/fake-chain.d.ts +118 -0
- package/dist/testing/fake-chain.js +536 -0
- package/dist/testing/fake-chain.js.map +1 -0
- package/dist/testing/fake-clock.d.ts +15 -0
- package/dist/testing/fake-clock.js +86 -0
- package/dist/testing/fake-clock.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +15 -0
- package/dist/testing/fake-driver.js +458 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/fake-fetch.d.ts +32 -0
- package/dist/testing/fake-fetch.js +81 -0
- package/dist/testing/fake-fetch.js.map +1 -0
- package/dist/testing/fake-plugin.d.ts +30 -0
- package/dist/testing/fake-plugin.js +66 -0
- package/dist/testing/fake-plugin.js.map +1 -0
- package/dist/testing/faulty-store.d.ts +36 -0
- package/dist/testing/faulty-store.js +66 -0
- package/dist/testing/faulty-store.js.map +1 -0
- package/dist/testing/generation.d.ts +60 -0
- package/dist/testing/generation.js +252 -0
- package/dist/testing/generation.js.map +1 -0
- package/dist/testing/index.d.ts +28 -0
- package/dist/testing/index.js +51 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +188 -44
- package/dist/libs/eth/account.d.ts +0 -9
- package/dist/libs/eth/account.js +0 -58
- package/dist/libs/eth/account.js.map +0 -1
- package/dist/libs/eth/contract.d.ts +0 -2
- package/dist/libs/eth/contract.js +0 -7
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -20
- package/dist/libs/eth/index.js +0 -62
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -2
- package/dist/libs/eth/transact.js +0 -7
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -1
- package/dist/libs/index.js +0 -18
- package/dist/libs/index.js.map +0 -1
- package/dist/tool/common.d.ts +0 -28
- package/dist/tool/common.js +0 -33
- package/dist/tool/common.js.map +0 -1
- package/dist/tool/eth-tools.d.ts +0 -3
- package/dist/tool/eth-tools.js +0 -33
- package/dist/tool/eth-tools.js.map +0 -1
- package/dist/tool/index.d.ts +0 -4
- package/dist/tool/index.js +0 -21
- package/dist/tool/index.js.map +0 -1
- package/dist/tool/logging.d.ts +0 -3
- package/dist/tool/logging.js +0 -11
- package/dist/tool/logging.js.map +0 -1
- package/dist/tool/options.d.ts +0 -4
- package/dist/tool/options.js +0 -28
- package/dist/tool/options.js.map +0 -1
- package/dist/type/account.d.ts +0 -9
- package/dist/type/account.js.map +0 -1
- package/dist/type/common.d.ts +0 -18
- package/dist/type/common.js.map +0 -1
- package/dist/type/index.d.ts +0 -3
- package/dist/type/index.js +0 -20
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -7
- package/dist/type/lib-types.js.map +0 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createCatalogs = createCatalogs;
|
|
4
|
+
exports.cloneCatalogs = cloneCatalogs;
|
|
5
|
+
exports.applyPlugin = applyPlugin;
|
|
6
|
+
exports.samePlugin = samePlugin;
|
|
7
|
+
const error_1 = require("../errors/error");
|
|
8
|
+
const adapters_1 = require("./adapters");
|
|
9
|
+
const assets_1 = require("./assets");
|
|
10
|
+
const chains_1 = require("./chains");
|
|
11
|
+
const providers_1 = require("./providers");
|
|
12
|
+
const schemes_1 = require("./schemes");
|
|
13
|
+
function createCatalogs() {
|
|
14
|
+
return {
|
|
15
|
+
chains: new chains_1.ChainCatalog(),
|
|
16
|
+
assets: new assets_1.AssetCatalog(),
|
|
17
|
+
adapters: new adapters_1.AdapterCatalog(),
|
|
18
|
+
presets: new providers_1.PresetCatalog(),
|
|
19
|
+
schemes: new schemes_1.SchemeCatalog(schemes_1.BUILTIN_SCHEMES),
|
|
20
|
+
plugins: new Map(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function cloneCatalogs(catalogs) {
|
|
24
|
+
return {
|
|
25
|
+
chains: catalogs.chains.clone(),
|
|
26
|
+
assets: catalogs.assets.clone(),
|
|
27
|
+
adapters: catalogs.adapters.clone(),
|
|
28
|
+
presets: catalogs.presets.clone(),
|
|
29
|
+
schemes: catalogs.schemes.clone(),
|
|
30
|
+
plugins: new Map(catalogs.plugins),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Registers a plugin. Registering the same plugin again (`samePlugin`) is a no-op, so
|
|
35
|
+
* `use()` stays idempotent; a different plugin under a registered name is `CONFIG_INVALID`.
|
|
36
|
+
*/
|
|
37
|
+
function applyPlugin(catalogs, plugin) {
|
|
38
|
+
const registered = catalogs.plugins.get(plugin.name);
|
|
39
|
+
if (registered) {
|
|
40
|
+
if (samePlugin(registered, plugin))
|
|
41
|
+
return;
|
|
42
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `plugin '${plugin.name}' is already registered with a different definition`);
|
|
43
|
+
}
|
|
44
|
+
for (const scheme of plugin.schemes ?? [])
|
|
45
|
+
catalogs.schemes.register(scheme);
|
|
46
|
+
for (const chain of plugin.chains ?? []) {
|
|
47
|
+
for (const scheme of chain.schemes)
|
|
48
|
+
catalogs.schemes.get(scheme);
|
|
49
|
+
catalogs.chains.register(chain);
|
|
50
|
+
catalogs.assets.registerNative(chain);
|
|
51
|
+
}
|
|
52
|
+
for (const manifest of plugin.adapters ?? []) {
|
|
53
|
+
for (const chainId of manifest.chains)
|
|
54
|
+
catalogs.chains.get(chainId);
|
|
55
|
+
catalogs.adapters.register(manifest);
|
|
56
|
+
}
|
|
57
|
+
for (const preset of plugin.presets ?? [])
|
|
58
|
+
catalogs.presets.register(preset);
|
|
59
|
+
for (const asset of plugin.assets ?? []) {
|
|
60
|
+
catalogs.chains.network(asset.chain, asset.network);
|
|
61
|
+
catalogs.assets.register(asset);
|
|
62
|
+
}
|
|
63
|
+
catalogs.plugins.set(plugin.name, plugin);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Whether two plugins are the same: the same object, or structurally equal
|
|
67
|
+
* data around the same functions. Functions and class instances match only themselves (a
|
|
68
|
+
* closure over other values, or a bound function, is another function), so a factory
|
|
69
|
+
* such as `evmPlugin()` keeps its functions at module level to stay idempotent. Data is
|
|
70
|
+
* every own enumerable key, symbols included, and every array index: a hole matches only
|
|
71
|
+
* a hole.
|
|
72
|
+
*/
|
|
73
|
+
function samePlugin(a, b) {
|
|
74
|
+
return sameShape(a, b, 0);
|
|
75
|
+
}
|
|
76
|
+
function sameShape(a, b, depth) {
|
|
77
|
+
if (Object.is(a, b))
|
|
78
|
+
return true;
|
|
79
|
+
if (depth > 64)
|
|
80
|
+
return false;
|
|
81
|
+
if (typeof a === 'function' || typeof b === 'function')
|
|
82
|
+
return false;
|
|
83
|
+
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
87
|
+
return (Array.isArray(a) &&
|
|
88
|
+
Array.isArray(b) &&
|
|
89
|
+
a.length === b.length &&
|
|
90
|
+
// Every index: `every` would skip a's holes.
|
|
91
|
+
[...a.keys()].every((i) => i in a === i in b && sameShape(a[i], b[i], depth + 1)));
|
|
92
|
+
}
|
|
93
|
+
const proto = Object.getPrototypeOf(a);
|
|
94
|
+
if ((proto !== Object.prototype && proto !== null) ||
|
|
95
|
+
Object.getPrototypeOf(b) !== proto) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const left = a;
|
|
99
|
+
const right = b;
|
|
100
|
+
const keys = dataKeys(left);
|
|
101
|
+
return (keys.length === dataKeys(right).length &&
|
|
102
|
+
keys.every((key) => Object.prototype.propertyIsEnumerable.call(right, key) &&
|
|
103
|
+
sameShape(left[key], right[key], depth + 1)));
|
|
104
|
+
}
|
|
105
|
+
/** An object's own enumerable keys, symbols included. */
|
|
106
|
+
function dataKeys(value) {
|
|
107
|
+
return Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/core/registry/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdapterManifest } from '../driver/types';\nimport { ConfigError } from '../errors/error';\nimport type { ChainInfo } from '../model/chain';\nimport { AdapterCatalog } from './adapters';\nimport { AssetCatalog, type AssetRegistration } from './assets';\nimport { ChainCatalog } from './chains';\nimport { PresetCatalog, type ProviderPreset } from './providers';\nimport { BUILTIN_SCHEMES, SchemeCatalog, type SignatureScheme } from './schemes';\n\n/** Everything a chain family contributes. Plugin modules must not import SDKs. */\nexport interface Plugin {\n readonly name: string;\n readonly chains?: readonly ChainInfo[];\n readonly adapters?: readonly AdapterManifest[];\n readonly presets?: readonly ProviderPreset[];\n readonly assets?: readonly AssetRegistration[];\n readonly schemes?: readonly SignatureScheme[];\n}\n\nexport interface Catalogs {\n readonly chains: ChainCatalog;\n readonly assets: AssetCatalog;\n readonly adapters: AdapterCatalog;\n readonly presets: PresetCatalog;\n readonly schemes: SchemeCatalog;\n /** Every registered plugin by name, to tell a repeat from a different plugin. */\n readonly plugins: Map<string, Plugin>;\n}\n\nexport function createCatalogs(): Catalogs {\n return {\n chains: new ChainCatalog(),\n assets: new AssetCatalog(),\n adapters: new AdapterCatalog(),\n presets: new PresetCatalog(),\n schemes: new SchemeCatalog(BUILTIN_SCHEMES),\n plugins: new Map(),\n };\n}\n\nexport function cloneCatalogs(catalogs: Catalogs): Catalogs {\n return {\n chains: catalogs.chains.clone(),\n assets: catalogs.assets.clone(),\n adapters: catalogs.adapters.clone(),\n presets: catalogs.presets.clone(),\n schemes: catalogs.schemes.clone(),\n plugins: new Map(catalogs.plugins),\n };\n}\n\n/**\n * Registers a plugin. Registering the same plugin again (`samePlugin`) is a no-op, so\n * `use()` stays idempotent; a different plugin under a registered name is `CONFIG_INVALID`.\n */\nexport function applyPlugin(catalogs: Catalogs, plugin: Plugin): void {\n const registered = catalogs.plugins.get(plugin.name);\n if (registered) {\n if (samePlugin(registered, plugin)) return;\n throw new ConfigError(\n 'CONFIG_INVALID',\n `plugin '${plugin.name}' is already registered with a different definition`,\n );\n }\n for (const scheme of plugin.schemes ?? []) catalogs.schemes.register(scheme);\n for (const chain of plugin.chains ?? []) {\n for (const scheme of chain.schemes) catalogs.schemes.get(scheme);\n catalogs.chains.register(chain);\n catalogs.assets.registerNative(chain);\n }\n for (const manifest of plugin.adapters ?? []) {\n for (const chainId of manifest.chains) catalogs.chains.get(chainId);\n catalogs.adapters.register(manifest);\n }\n for (const preset of plugin.presets ?? []) catalogs.presets.register(preset);\n for (const asset of plugin.assets ?? []) {\n catalogs.chains.network(asset.chain, asset.network);\n catalogs.assets.register(asset);\n }\n catalogs.plugins.set(plugin.name, plugin);\n}\n\n/**\n * Whether two plugins are the same: the same object, or structurally equal\n * data around the same functions. Functions and class instances match only themselves (a\n * closure over other values, or a bound function, is another function), so a factory\n * such as `evmPlugin()` keeps its functions at module level to stay idempotent. Data is\n * every own enumerable key, symbols included, and every array index: a hole matches only\n * a hole.\n */\nexport function samePlugin(a: Plugin, b: Plugin): boolean {\n return sameShape(a, b, 0);\n}\n\nfunction sameShape(a: unknown, b: unknown, depth: number): boolean {\n if (Object.is(a, b)) return true;\n if (depth > 64) return false;\n if (typeof a === 'function' || typeof b === 'function') return false;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {\n return false;\n }\n if (Array.isArray(a) || Array.isArray(b)) {\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n // Every index: `every` would skip a's holes.\n [...a.keys()].every((i) => i in a === i in b && sameShape(a[i], b[i], depth + 1))\n );\n }\n const proto = Object.getPrototypeOf(a) as unknown;\n if (\n (proto !== Object.prototype && proto !== null) ||\n Object.getPrototypeOf(b) !== proto\n ) {\n return false;\n }\n const left = a as Record<PropertyKey, unknown>;\n const right = b as Record<PropertyKey, unknown>;\n const keys = dataKeys(left);\n return (\n keys.length === dataKeys(right).length &&\n keys.every(\n (key) =>\n Object.prototype.propertyIsEnumerable.call(right, key) &&\n sameShape(left[key], right[key], depth + 1),\n )\n );\n}\n\n/** An object's own enumerable keys, symbols included. */\nfunction dataKeys(value: object): (string | symbol)[] {\n return Reflect.ownKeys(value).filter((key) =>\n Object.prototype.propertyIsEnumerable.call(value, key),\n );\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Secret } from '../secret/secret';
|
|
2
|
+
import type { EndpointConfig } from '../transport/types';
|
|
3
|
+
export interface PresetInput {
|
|
4
|
+
readonly chain: string;
|
|
5
|
+
readonly network: string;
|
|
6
|
+
readonly apiKey?: string | Secret<string>;
|
|
7
|
+
readonly options?: Readonly<Record<string, unknown>>;
|
|
8
|
+
}
|
|
9
|
+
/** Provider preset contributed by a family plugin. Endpoint URLs holding keys must be `Secret`s. */
|
|
10
|
+
export interface ProviderPreset {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly kind: 'rpc' | 'indexer';
|
|
13
|
+
readonly requiresApiKey?: boolean;
|
|
14
|
+
/** `false` for free public endpoints (logged as not for production). */
|
|
15
|
+
readonly production?: boolean;
|
|
16
|
+
supports(chain: string, network: string): boolean;
|
|
17
|
+
endpoints(input: PresetInput): readonly EndpointConfig[];
|
|
18
|
+
}
|
|
19
|
+
export declare class PresetCatalog {
|
|
20
|
+
#private;
|
|
21
|
+
/** Several families may contribute presets with the same name (e.g. one per chain family). */
|
|
22
|
+
register(preset: ProviderPreset): void;
|
|
23
|
+
has(name: string, kind?: 'rpc' | 'indexer'): boolean;
|
|
24
|
+
/** The registered preset names, of one kind or of both. */
|
|
25
|
+
names(kind?: 'rpc' | 'indexer'): string[];
|
|
26
|
+
resolve(name: string, input: PresetInput, kind: 'rpc' | 'indexer'): {
|
|
27
|
+
readonly endpoints: readonly EndpointConfig[];
|
|
28
|
+
readonly preset: ProviderPreset;
|
|
29
|
+
};
|
|
30
|
+
clone(): PresetCatalog;
|
|
31
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PresetCatalog = void 0;
|
|
4
|
+
const error_1 = require("../errors/error");
|
|
5
|
+
const names_1 = require("../util/names");
|
|
6
|
+
class PresetCatalog {
|
|
7
|
+
#presets = new Map();
|
|
8
|
+
/** Several families may contribute presets with the same name (e.g. one per chain family). */
|
|
9
|
+
register(preset) {
|
|
10
|
+
const list = this.#presets.get(preset.name) ?? [];
|
|
11
|
+
list.push(preset);
|
|
12
|
+
this.#presets.set(preset.name, list);
|
|
13
|
+
}
|
|
14
|
+
has(name, kind) {
|
|
15
|
+
return (this.#presets.get(name) ?? []).some((p) => kind === undefined || p.kind === kind);
|
|
16
|
+
}
|
|
17
|
+
/** The registered preset names, of one kind or of both. */
|
|
18
|
+
names(kind) {
|
|
19
|
+
return [...this.#presets.keys()].filter((name) => this.has(name, kind));
|
|
20
|
+
}
|
|
21
|
+
resolve(name, input, kind) {
|
|
22
|
+
const candidates = (this.#presets.get(name) ?? []).filter((p) => p.kind === kind);
|
|
23
|
+
if (candidates.length === 0) {
|
|
24
|
+
throw new error_1.ConfigError('CONFIG_INVALID', (0, names_1.unknownName)(`${kind} provider preset`, this.names(kind)));
|
|
25
|
+
}
|
|
26
|
+
const preset = candidates.find((p) => p.supports(input.chain, input.network));
|
|
27
|
+
if (!preset) {
|
|
28
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `provider preset '${name}' does not support ${input.chain}:${input.network}`);
|
|
29
|
+
}
|
|
30
|
+
if (preset.requiresApiKey && input.apiKey === undefined) {
|
|
31
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `provider preset '${name}' requires an apiKey`);
|
|
32
|
+
}
|
|
33
|
+
return { endpoints: preset.endpoints(input), preset };
|
|
34
|
+
}
|
|
35
|
+
clone() {
|
|
36
|
+
const copy = new PresetCatalog();
|
|
37
|
+
for (const [name, list] of this.#presets)
|
|
38
|
+
copy.#presets.set(name, [...list]);
|
|
39
|
+
return copy;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.PresetCatalog = PresetCatalog;
|
|
43
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/core/registry/providers.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAG9C,yCAA4C;AAoB5C,MAAa,aAAa;IACf,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAExD,8FAA8F;IAC9F,QAAQ,CAAC,MAAsB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,IAAwB;QACxC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAC7C,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,IAAwB;QAC5B,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,CACL,IAAY,EACZ,KAAkB,EAClB,IAAuB;QAEvB,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAClF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,mBAAW,CACnB,gBAAgB,EAChB,IAAA,mBAAW,EAAC,GAAG,IAAI,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACzD,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAW,CACnB,gBAAgB,EAChB,oBAAoB,IAAI,sBAAsB,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAC7E,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,IAAI,mBAAW,CACnB,gBAAgB,EAChB,oBAAoB,IAAI,sBAAsB,CAC/C,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACxD,CAAC;IAED,KAAK;QACH,MAAM,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAtDD,sCAsDC","sourcesContent":["import { ConfigError } from '../errors/error';\nimport type { Secret } from '../secret/secret';\nimport type { EndpointConfig } from '../transport/types';\nimport { unknownName } from '../util/names';\n\nexport interface PresetInput {\n readonly chain: string;\n readonly network: string;\n readonly apiKey?: string | Secret<string>;\n readonly options?: Readonly<Record<string, unknown>>;\n}\n\n/** Provider preset contributed by a family plugin. Endpoint URLs holding keys must be `Secret`s. */\nexport interface ProviderPreset {\n readonly name: string;\n readonly kind: 'rpc' | 'indexer';\n readonly requiresApiKey?: boolean;\n /** `false` for free public endpoints (logged as not for production). */\n readonly production?: boolean;\n supports(chain: string, network: string): boolean;\n endpoints(input: PresetInput): readonly EndpointConfig[];\n}\n\nexport class PresetCatalog {\n readonly #presets = new Map<string, ProviderPreset[]>();\n\n /** Several families may contribute presets with the same name (e.g. one per chain family). */\n register(preset: ProviderPreset): void {\n const list = this.#presets.get(preset.name) ?? [];\n list.push(preset);\n this.#presets.set(preset.name, list);\n }\n\n has(name: string, kind?: 'rpc' | 'indexer'): boolean {\n return (this.#presets.get(name) ?? []).some(\n (p) => kind === undefined || p.kind === kind,\n );\n }\n\n /** The registered preset names, of one kind or of both. */\n names(kind?: 'rpc' | 'indexer'): string[] {\n return [...this.#presets.keys()].filter((name) => this.has(name, kind));\n }\n\n resolve(\n name: string,\n input: PresetInput,\n kind: 'rpc' | 'indexer',\n ): { readonly endpoints: readonly EndpointConfig[]; readonly preset: ProviderPreset } {\n const candidates = (this.#presets.get(name) ?? []).filter((p) => p.kind === kind);\n if (candidates.length === 0) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n unknownName(`${kind} provider preset`, this.names(kind)),\n );\n }\n const preset = candidates.find((p) => p.supports(input.chain, input.network));\n if (!preset) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `provider preset '${name}' does not support ${input.chain}:${input.network}`,\n );\n }\n if (preset.requiresApiKey && input.apiKey === undefined) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `provider preset '${name}' requires an apiKey`,\n );\n }\n return { endpoints: preset.endpoints(input), preset };\n }\n\n clone(): PresetCatalog {\n const copy = new PresetCatalog();\n for (const [name, list] of this.#presets) copy.#presets.set(name, [...list]);\n return copy;\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SigningParams } from '../signing/types';
|
|
2
|
+
export interface VerifyInput {
|
|
3
|
+
readonly publicKey: Uint8Array;
|
|
4
|
+
readonly payload: Uint8Array;
|
|
5
|
+
readonly signature: Uint8Array;
|
|
6
|
+
readonly recovery?: number;
|
|
7
|
+
readonly params?: SigningParams;
|
|
8
|
+
}
|
|
9
|
+
export interface SignatureScheme {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly publicKeyLength: number;
|
|
12
|
+
verify(input: VerifyInput): boolean;
|
|
13
|
+
}
|
|
14
|
+
/** 32-byte digest, 64-byte compact low-s signature, recovery bit required and checked. */
|
|
15
|
+
export declare const secp256k1Ecdsa: Readonly<SignatureScheme>;
|
|
16
|
+
/** BIP340 over a 32-byte message; the request's public key is the (possibly tweaked) x-only key. */
|
|
17
|
+
export declare const secp256k1Schnorr: Readonly<SignatureScheme>;
|
|
18
|
+
/** RFC 8032 strict verification (zip215 disabled). */
|
|
19
|
+
export declare const ed25519Scheme: Readonly<SignatureScheme>;
|
|
20
|
+
/** Frozen, like each scheme in it. */
|
|
21
|
+
export declare const BUILTIN_SCHEMES: readonly SignatureScheme[];
|
|
22
|
+
export declare class SchemeCatalog {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(initial?: readonly SignatureScheme[]);
|
|
25
|
+
register(scheme: SignatureScheme): void;
|
|
26
|
+
has(id: string): boolean;
|
|
27
|
+
get(id: string): SignatureScheme;
|
|
28
|
+
list(): SignatureScheme[];
|
|
29
|
+
clone(): SchemeCatalog;
|
|
30
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SchemeCatalog = exports.BUILTIN_SCHEMES = exports.ed25519Scheme = exports.secp256k1Schnorr = exports.secp256k1Ecdsa = void 0;
|
|
4
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
5
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
6
|
+
const error_1 = require("../errors/error");
|
|
7
|
+
const bytes_1 = require("../util/bytes");
|
|
8
|
+
const names_1 = require("../util/names");
|
|
9
|
+
function safely(check) {
|
|
10
|
+
try {
|
|
11
|
+
return check();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** 32-byte digest, 64-byte compact low-s signature, recovery bit required and checked. */
|
|
18
|
+
exports.secp256k1Ecdsa = Object.freeze({
|
|
19
|
+
id: 'secp256k1-ecdsa',
|
|
20
|
+
publicKeyLength: 33,
|
|
21
|
+
verify: ({ publicKey, payload, signature, recovery }) => safely(() => {
|
|
22
|
+
if (payload.length !== 32 || signature.length !== 64)
|
|
23
|
+
return false;
|
|
24
|
+
if (recovery !== 0 && recovery !== 1)
|
|
25
|
+
return false;
|
|
26
|
+
const sig = secp256k1_1.secp256k1.Signature.fromCompact(signature);
|
|
27
|
+
if (!secp256k1_1.secp256k1.verify(signature, payload, publicKey, { lowS: true }))
|
|
28
|
+
return false;
|
|
29
|
+
const recovered = sig
|
|
30
|
+
.addRecoveryBit(recovery)
|
|
31
|
+
.recoverPublicKey(payload)
|
|
32
|
+
.toRawBytes(true);
|
|
33
|
+
return (0, bytes_1.equalBytes)(recovered, publicKey);
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
/** BIP340 over a 32-byte message; the request's public key is the (possibly tweaked) x-only key. */
|
|
37
|
+
exports.secp256k1Schnorr = Object.freeze({
|
|
38
|
+
id: 'secp256k1-schnorr',
|
|
39
|
+
publicKeyLength: 32,
|
|
40
|
+
verify: ({ publicKey, payload, signature }) => safely(() => payload.length === 32 && secp256k1_1.schnorr.verify(signature, payload, publicKey)),
|
|
41
|
+
});
|
|
42
|
+
/** RFC 8032 strict verification (zip215 disabled). */
|
|
43
|
+
exports.ed25519Scheme = Object.freeze({
|
|
44
|
+
id: 'ed25519',
|
|
45
|
+
publicKeyLength: 32,
|
|
46
|
+
verify: ({ publicKey, payload, signature }) => safely(() => ed25519_1.ed25519.verify(signature, payload, publicKey, { zip215: false })),
|
|
47
|
+
});
|
|
48
|
+
/** Frozen, like each scheme in it. */
|
|
49
|
+
exports.BUILTIN_SCHEMES = Object.freeze([
|
|
50
|
+
exports.secp256k1Ecdsa,
|
|
51
|
+
exports.secp256k1Schnorr,
|
|
52
|
+
exports.ed25519Scheme,
|
|
53
|
+
]);
|
|
54
|
+
class SchemeCatalog {
|
|
55
|
+
#schemes = new Map();
|
|
56
|
+
constructor(initial = []) {
|
|
57
|
+
for (const scheme of initial)
|
|
58
|
+
this.register(scheme);
|
|
59
|
+
}
|
|
60
|
+
register(scheme) {
|
|
61
|
+
if (this.#schemes.has(scheme.id)) {
|
|
62
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `signature scheme '${scheme.id}' is already registered`);
|
|
63
|
+
}
|
|
64
|
+
this.#schemes.set(scheme.id, scheme);
|
|
65
|
+
}
|
|
66
|
+
has(id) {
|
|
67
|
+
return this.#schemes.has(id);
|
|
68
|
+
}
|
|
69
|
+
get(id) {
|
|
70
|
+
const scheme = this.#schemes.get(id);
|
|
71
|
+
if (!scheme) {
|
|
72
|
+
throw new error_1.ConfigError('CONFIG_INVALID', (0, names_1.unknownName)('signature scheme', this.#schemes.keys()));
|
|
73
|
+
}
|
|
74
|
+
return scheme;
|
|
75
|
+
}
|
|
76
|
+
list() {
|
|
77
|
+
return [...this.#schemes.values()];
|
|
78
|
+
}
|
|
79
|
+
clone() {
|
|
80
|
+
return new SchemeCatalog(this.list());
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.SchemeCatalog = SchemeCatalog;
|
|
84
|
+
//# sourceMappingURL=schemes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemes.js","sourceRoot":"","sources":["../../../src/core/registry/schemes.ts"],"names":[],"mappings":"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","sourcesContent":["import { ed25519 } from '@noble/curves/ed25519';\nimport { schnorr, secp256k1 } from '@noble/curves/secp256k1';\nimport { ConfigError } from '../errors/error';\nimport type { SigningParams } from '../signing/types';\nimport { equalBytes } from '../util/bytes';\nimport { unknownName } from '../util/names';\n\nexport interface VerifyInput {\n readonly publicKey: Uint8Array;\n readonly payload: Uint8Array;\n readonly signature: Uint8Array;\n readonly recovery?: number;\n readonly params?: SigningParams;\n}\n\nexport interface SignatureScheme {\n readonly id: string;\n readonly publicKeyLength: number;\n verify(input: VerifyInput): boolean;\n}\n\nfunction safely(check: () => boolean): boolean {\n try {\n return check();\n } catch {\n return false;\n }\n}\n\n/** 32-byte digest, 64-byte compact low-s signature, recovery bit required and checked. */\nexport const secp256k1Ecdsa = Object.freeze<SignatureScheme>({\n id: 'secp256k1-ecdsa',\n publicKeyLength: 33,\n verify: ({ publicKey, payload, signature, recovery }) =>\n safely(() => {\n if (payload.length !== 32 || signature.length !== 64) return false;\n if (recovery !== 0 && recovery !== 1) return false;\n const sig = secp256k1.Signature.fromCompact(signature);\n if (!secp256k1.verify(signature, payload, publicKey, { lowS: true })) return false;\n const recovered = sig\n .addRecoveryBit(recovery)\n .recoverPublicKey(payload)\n .toRawBytes(true);\n return equalBytes(recovered, publicKey);\n }),\n});\n\n/** BIP340 over a 32-byte message; the request's public key is the (possibly tweaked) x-only key. */\nexport const secp256k1Schnorr = Object.freeze<SignatureScheme>({\n id: 'secp256k1-schnorr',\n publicKeyLength: 32,\n verify: ({ publicKey, payload, signature }) =>\n safely(() => payload.length === 32 && schnorr.verify(signature, payload, publicKey)),\n});\n\n/** RFC 8032 strict verification (zip215 disabled). */\nexport const ed25519Scheme = Object.freeze<SignatureScheme>({\n id: 'ed25519',\n publicKeyLength: 32,\n verify: ({ publicKey, payload, signature }) =>\n safely(() => ed25519.verify(signature, payload, publicKey, { zip215: false })),\n});\n\n/** Frozen, like each scheme in it. */\nexport const BUILTIN_SCHEMES: readonly SignatureScheme[] = Object.freeze([\n secp256k1Ecdsa,\n secp256k1Schnorr,\n ed25519Scheme,\n]);\n\nexport class SchemeCatalog {\n readonly #schemes = new Map<string, SignatureScheme>();\n\n constructor(initial: readonly SignatureScheme[] = []) {\n for (const scheme of initial) this.register(scheme);\n }\n\n register(scheme: SignatureScheme): void {\n if (this.#schemes.has(scheme.id)) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `signature scheme '${scheme.id}' is already registered`,\n );\n }\n this.#schemes.set(scheme.id, scheme);\n }\n\n has(id: string): boolean {\n return this.#schemes.has(id);\n }\n\n get(id: string): SignatureScheme {\n const scheme = this.#schemes.get(id);\n if (!scheme) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n unknownName('signature scheme', this.#schemes.keys()),\n );\n }\n return scheme;\n }\n\n list(): SignatureScheme[] {\n return [...this.#schemes.values()];\n }\n\n clone(): SchemeCatalog {\n return new SchemeCatalog(this.list());\n }\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shortest fragment scrubbed on its own. Every built-in keyed preset's key is at least
|
|
3
|
+
* 32 characters (Alchemy, Infura, Ankr, TronGrid, toncenter), while the ordinary words of an
|
|
4
|
+
* endpoint URL are shorter than 8 (`v2`, `v3`, `api`, `rpc`, `eth`, `bsc`, `solana`,
|
|
5
|
+
* `jsonRPC`, `mainnet`). Those words also occur inside node texts the drivers classify
|
|
6
|
+
* ("method not found" holds `eth`, a JSON-RPC body holds `jsonrpc`), so scrubbing them would
|
|
7
|
+
* change a verdict's input. A secret shorter than 8 characters is still removed wherever
|
|
8
|
+
* the whole URL, the whole header value or the whole `Scheme token` appears.
|
|
9
|
+
*/
|
|
10
|
+
export declare const MIN_FRAGMENT_LENGTH = 8;
|
|
11
|
+
export interface EndpointSecrets {
|
|
12
|
+
/** The endpoint URL as configured and as parsed: an error shows its placeholder. */
|
|
13
|
+
readonly urls: readonly string[];
|
|
14
|
+
/** Every other text to remove: fragments and whole header values. */
|
|
15
|
+
readonly fragments: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The URL forms and fragments of one endpoint: the URL as given and as parsed; its path and
|
|
19
|
+
* query together; each userinfo part, path segment, query value and fragment (raw and
|
|
20
|
+
* percent-decoded); each header value whole; the token after an auth scheme, and for
|
|
21
|
+
* `Basic` the decoded `user:password` and password. Fragments shorter than
|
|
22
|
+
* `MIN_FRAGMENT_LENGTH` are left out. The input is trusted configuration (its URL already
|
|
23
|
+
* parsed by the transport).
|
|
24
|
+
*/
|
|
25
|
+
export declare function endpointSecrets(url: string, headers: Readonly<Record<string, string>>): EndpointSecrets;
|
|
26
|
+
/**
|
|
27
|
+
* A text with every secret of `secrets` replaced, case-insensitively and longest first: a
|
|
28
|
+
* URL form by `placeholder`, anything else by `[REDACTED]`; then any other URL redacted.
|
|
29
|
+
* With `limit`, only the first `limit` characters come back, and only a bounded prefix is
|
|
30
|
+
* read, since a provider's text is untrusted and may be huge: long enough that a secret
|
|
31
|
+
* starting before the cut is removed whole.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createScrubber(placeholder: string, secrets: EndpointSecrets): (text: string, limit?: number) => string;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MIN_FRAGMENT_LENGTH = void 0;
|
|
4
|
+
exports.endpointSecrets = endpointSecrets;
|
|
5
|
+
exports.createScrubber = createScrubber;
|
|
6
|
+
/**
|
|
7
|
+
* The secret fragments of one endpoint's configuration, and the scrubber that
|
|
8
|
+
* removes them from every text an error, a `details` field or a `cause` may carry. A
|
|
9
|
+
* provider that refuses a key often echoes the bare key back ("invalid api key <KEY>"),
|
|
10
|
+
* without the URL or header around it, so removing only the whole URL or header value is
|
|
11
|
+
* not enough.
|
|
12
|
+
*/
|
|
13
|
+
const redact_1 = require("./redact");
|
|
14
|
+
const secret_1 = require("./secret");
|
|
15
|
+
/**
|
|
16
|
+
* The shortest fragment scrubbed on its own. Every built-in keyed preset's key is at least
|
|
17
|
+
* 32 characters (Alchemy, Infura, Ankr, TronGrid, toncenter), while the ordinary words of an
|
|
18
|
+
* endpoint URL are shorter than 8 (`v2`, `v3`, `api`, `rpc`, `eth`, `bsc`, `solana`,
|
|
19
|
+
* `jsonRPC`, `mainnet`). Those words also occur inside node texts the drivers classify
|
|
20
|
+
* ("method not found" holds `eth`, a JSON-RPC body holds `jsonrpc`), so scrubbing them would
|
|
21
|
+
* change a verdict's input. A secret shorter than 8 characters is still removed wherever
|
|
22
|
+
* the whole URL, the whole header value or the whole `Scheme token` appears.
|
|
23
|
+
*/
|
|
24
|
+
exports.MIN_FRAGMENT_LENGTH = 8;
|
|
25
|
+
/** A whole header value shorter than this is left alone. */
|
|
26
|
+
const MIN_VALUE_LENGTH = 4;
|
|
27
|
+
/** `Scheme token` in an `Authorization`-style value (RFC 9110 §11.4). */
|
|
28
|
+
const AUTH_VALUE = /^\s*[A-Za-z][A-Za-z0-9!#$%&'*+.^_`|~-]*\s+(\S+)\s*$/;
|
|
29
|
+
function decoded(text) {
|
|
30
|
+
try {
|
|
31
|
+
return decodeURIComponent(text);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return text;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function base64Text(text) {
|
|
38
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(text))
|
|
39
|
+
return undefined;
|
|
40
|
+
const value = Buffer.from(text, 'base64').toString('utf8');
|
|
41
|
+
return /^[\x20-\x7e]+$/.test(value) ? value : undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The URL forms and fragments of one endpoint: the URL as given and as parsed; its path and
|
|
45
|
+
* query together; each userinfo part, path segment, query value and fragment (raw and
|
|
46
|
+
* percent-decoded); each header value whole; the token after an auth scheme, and for
|
|
47
|
+
* `Basic` the decoded `user:password` and password. Fragments shorter than
|
|
48
|
+
* `MIN_FRAGMENT_LENGTH` are left out. The input is trusted configuration (its URL already
|
|
49
|
+
* parsed by the transport).
|
|
50
|
+
*/
|
|
51
|
+
function endpointSecrets(url, headers) {
|
|
52
|
+
const parsed = new URL(url);
|
|
53
|
+
const urls = [...new Set([url, parsed.href])];
|
|
54
|
+
const fragments = new Set();
|
|
55
|
+
const add = (text, min = exports.MIN_FRAGMENT_LENGTH) => {
|
|
56
|
+
for (const form of [text, decoded(text)])
|
|
57
|
+
if (form.length >= min)
|
|
58
|
+
fragments.add(form);
|
|
59
|
+
};
|
|
60
|
+
add(`${parsed.pathname}${parsed.search}`, 2);
|
|
61
|
+
add(parsed.username);
|
|
62
|
+
add(parsed.password);
|
|
63
|
+
for (const segment of parsed.pathname.split('/'))
|
|
64
|
+
add(segment);
|
|
65
|
+
for (const pair of parsed.search.replace(/^\?/, '').split('&')) {
|
|
66
|
+
const at = pair.indexOf('=');
|
|
67
|
+
if (at < 0)
|
|
68
|
+
continue;
|
|
69
|
+
const value = pair.slice(at + 1);
|
|
70
|
+
add(value);
|
|
71
|
+
add(value.replace(/\+/g, ' '));
|
|
72
|
+
}
|
|
73
|
+
add(parsed.hash.replace(/^#/, ''));
|
|
74
|
+
for (const value of Object.values(headers)) {
|
|
75
|
+
add(value, MIN_VALUE_LENGTH);
|
|
76
|
+
const token = AUTH_VALUE.exec(value)?.[1];
|
|
77
|
+
if (token === undefined)
|
|
78
|
+
continue;
|
|
79
|
+
add(token);
|
|
80
|
+
const basic = /^\s*basic\s/i.test(value) ? base64Text(token) : undefined;
|
|
81
|
+
if (basic !== undefined) {
|
|
82
|
+
add(basic);
|
|
83
|
+
add(basic.slice(basic.indexOf(':') + 1));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { urls, fragments: [...fragments] };
|
|
87
|
+
}
|
|
88
|
+
const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
89
|
+
/**
|
|
90
|
+
* A text with every secret of `secrets` replaced, case-insensitively and longest first: a
|
|
91
|
+
* URL form by `placeholder`, anything else by `[REDACTED]`; then any other URL redacted.
|
|
92
|
+
* With `limit`, only the first `limit` characters come back, and only a bounded prefix is
|
|
93
|
+
* read, since a provider's text is untrusted and may be huge: long enough that a secret
|
|
94
|
+
* starting before the cut is removed whole.
|
|
95
|
+
*/
|
|
96
|
+
function createScrubber(placeholder, secrets) {
|
|
97
|
+
const all = [...secrets.urls, ...secrets.fragments].sort((a, b) => b.length - a.length);
|
|
98
|
+
const longest = all[0]?.length ?? 0;
|
|
99
|
+
const urls = new Set(secrets.urls.map((form) => form.toLowerCase()));
|
|
100
|
+
const pattern = all.length > 0 ? new RegExp(all.map(escape).join('|'), 'gi') : undefined;
|
|
101
|
+
return (text, limit) => {
|
|
102
|
+
const input = limit === undefined ? text : text.slice(0, limit + longest);
|
|
103
|
+
const replaced = pattern
|
|
104
|
+
? input.replace(pattern, (match) => urls.has(match.toLowerCase()) ? placeholder : secret_1.REDACTED)
|
|
105
|
+
: input;
|
|
106
|
+
const out = (0, redact_1.redactText)(replaced);
|
|
107
|
+
return limit === undefined ? out : out.slice(0, limit);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=fragments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragments.js","sourceRoot":"","sources":["../../../src/core/secret/fragments.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The secret fragments of one endpoint's configuration, and the scrubber that\n * removes them from every text an error, a `details` field or a `cause` may carry. A\n * provider that refuses a key often echoes the bare key back (\"invalid api key <KEY>\"),\n * without the URL or header around it, so removing only the whole URL or header value is\n * not enough.\n */\nimport { redactText } from './redact';\nimport { REDACTED } from './secret';\n\n/**\n * The shortest fragment scrubbed on its own. Every built-in keyed preset's key is at least\n * 32 characters (Alchemy, Infura, Ankr, TronGrid, toncenter), while the ordinary words of an\n * endpoint URL are shorter than 8 (`v2`, `v3`, `api`, `rpc`, `eth`, `bsc`, `solana`,\n * `jsonRPC`, `mainnet`). Those words also occur inside node texts the drivers classify\n * (\"method not found\" holds `eth`, a JSON-RPC body holds `jsonrpc`), so scrubbing them would\n * change a verdict's input. A secret shorter than 8 characters is still removed wherever\n * the whole URL, the whole header value or the whole `Scheme token` appears.\n */\nexport const MIN_FRAGMENT_LENGTH = 8;\n\n/** A whole header value shorter than this is left alone. */\nconst MIN_VALUE_LENGTH = 4;\n\n/** `Scheme token` in an `Authorization`-style value (RFC 9110 §11.4). */\nconst AUTH_VALUE = /^\\s*[A-Za-z][A-Za-z0-9!#$%&'*+.^_`|~-]*\\s+(\\S+)\\s*$/;\n\nexport interface EndpointSecrets {\n /** The endpoint URL as configured and as parsed: an error shows its placeholder. */\n readonly urls: readonly string[];\n /** Every other text to remove: fragments and whole header values. */\n readonly fragments: readonly string[];\n}\n\nfunction decoded(text: string): string {\n try {\n return decodeURIComponent(text);\n } catch {\n return text;\n }\n}\n\nfunction base64Text(text: string): string | undefined {\n if (!/^[A-Za-z0-9+/]+={0,2}$/.test(text)) return undefined;\n const value = Buffer.from(text, 'base64').toString('utf8');\n return /^[\\x20-\\x7e]+$/.test(value) ? value : undefined;\n}\n\n/**\n * The URL forms and fragments of one endpoint: the URL as given and as parsed; its path and\n * query together; each userinfo part, path segment, query value and fragment (raw and\n * percent-decoded); each header value whole; the token after an auth scheme, and for\n * `Basic` the decoded `user:password` and password. Fragments shorter than\n * `MIN_FRAGMENT_LENGTH` are left out. The input is trusted configuration (its URL already\n * parsed by the transport).\n */\nexport function endpointSecrets(\n url: string,\n headers: Readonly<Record<string, string>>,\n): EndpointSecrets {\n const parsed = new URL(url);\n const urls = [...new Set([url, parsed.href])];\n const fragments = new Set<string>();\n const add = (text: string, min = MIN_FRAGMENT_LENGTH) => {\n for (const form of [text, decoded(text)]) if (form.length >= min) fragments.add(form);\n };\n add(`${parsed.pathname}${parsed.search}`, 2);\n add(parsed.username);\n add(parsed.password);\n for (const segment of parsed.pathname.split('/')) add(segment);\n for (const pair of parsed.search.replace(/^\\?/, '').split('&')) {\n const at = pair.indexOf('=');\n if (at < 0) continue;\n const value = pair.slice(at + 1);\n add(value);\n add(value.replace(/\\+/g, ' '));\n }\n add(parsed.hash.replace(/^#/, ''));\n for (const value of Object.values(headers)) {\n add(value, MIN_VALUE_LENGTH);\n const token = AUTH_VALUE.exec(value)?.[1];\n if (token === undefined) continue;\n add(token);\n const basic = /^\\s*basic\\s/i.test(value) ? base64Text(token) : undefined;\n if (basic !== undefined) {\n add(basic);\n add(basic.slice(basic.indexOf(':') + 1));\n }\n }\n return { urls, fragments: [...fragments] };\n}\n\nconst escape = (text: string) => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * A text with every secret of `secrets` replaced, case-insensitively and longest first: a\n * URL form by `placeholder`, anything else by `[REDACTED]`; then any other URL redacted.\n * With `limit`, only the first `limit` characters come back, and only a bounded prefix is\n * read, since a provider's text is untrusted and may be huge: long enough that a secret\n * starting before the cut is removed whole.\n */\nexport function createScrubber(\n placeholder: string,\n secrets: EndpointSecrets,\n): (text: string, limit?: number) => string {\n const all = [...secrets.urls, ...secrets.fragments].sort((a, b) => b.length - a.length);\n const longest = all[0]?.length ?? 0;\n const urls = new Set(secrets.urls.map((form) => form.toLowerCase()));\n const pattern =\n all.length > 0 ? new RegExp(all.map(escape).join('|'), 'gi') : undefined;\n return (text, limit) => {\n const input = limit === undefined ? text : text.slice(0, limit + longest);\n const replaced = pattern\n ? input.replace(pattern, (match) =>\n urls.has(match.toLowerCase()) ? placeholder : REDACTED,\n )\n : input;\n const out = redactText(replaced);\n return limit === undefined ? out : out.slice(0, limit);\n };\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Secret } from './secret';
|
|
2
|
+
export declare function redactUrl(url: string | Secret<string>): string;
|
|
3
|
+
export declare function redactText(text: string): string;
|
|
4
|
+
export declare function redactHeaders(headers: Readonly<Record<string, string | Secret<string>>> | undefined): Record<string, string>;
|
|
5
|
+
export declare function redactDeep(value: unknown, depth?: number): unknown;
|
|
6
|
+
/**
|
|
7
|
+
* Copies an error's name/message/code with URLs redacted and without its cause chain.
|
|
8
|
+
* Total: a throwable that cannot be read or printed yields '[unprintable error]'.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sanitizeError(error: unknown): Error;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redactUrl = redactUrl;
|
|
4
|
+
exports.redactText = redactText;
|
|
5
|
+
exports.redactHeaders = redactHeaders;
|
|
6
|
+
exports.redactDeep = redactDeep;
|
|
7
|
+
exports.sanitizeError = sanitizeError;
|
|
8
|
+
const secret_1 = require("./secret");
|
|
9
|
+
const SENSITIVE_KEY = /(key|secret|token|password|passphrase|mnemonic|private|seed|authorization|cookie)/i;
|
|
10
|
+
const SENSITIVE_HEADER = /(authorization|api[-_]?key|token|secret|cookie)/i;
|
|
11
|
+
const KEYLIKE_SEGMENT = /^[A-Za-z0-9_-]{16,}$/;
|
|
12
|
+
const URL_IN_TEXT = /\b[a-z][a-z0-9+.-]*:\/\/[^\s'"<>)]+/gi;
|
|
13
|
+
function redactUrl(url) {
|
|
14
|
+
const isSecretUrl = (0, secret_1.isSecret)(url);
|
|
15
|
+
const raw = isSecretUrl ? url.reveal() : url;
|
|
16
|
+
let parsed;
|
|
17
|
+
try {
|
|
18
|
+
parsed = new URL(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return secret_1.REDACTED;
|
|
22
|
+
}
|
|
23
|
+
if (isSecretUrl)
|
|
24
|
+
return `${parsed.protocol}//${parsed.host}/${secret_1.REDACTED}`;
|
|
25
|
+
const path = parsed.pathname
|
|
26
|
+
.split('/')
|
|
27
|
+
.map((segment) => (KEYLIKE_SEGMENT.test(segment) ? secret_1.REDACTED : segment))
|
|
28
|
+
.join('/');
|
|
29
|
+
const keys = [...new Set(parsed.searchParams.keys())];
|
|
30
|
+
const query = keys.length
|
|
31
|
+
? `?${keys.map((k) => `${encodeURIComponent(k)}=${secret_1.REDACTED}`).join('&')}`
|
|
32
|
+
: '';
|
|
33
|
+
const auth = parsed.username || parsed.password ? `${secret_1.REDACTED}@` : '';
|
|
34
|
+
return `${parsed.protocol}//${auth}${parsed.host}${path}${query}`;
|
|
35
|
+
}
|
|
36
|
+
function redactText(text) {
|
|
37
|
+
return text.replace(URL_IN_TEXT, (match) => {
|
|
38
|
+
const trailing = match.match(/[.,;:!?\]}]+$/);
|
|
39
|
+
const trailingStr = trailing ? trailing[0] : '';
|
|
40
|
+
const url = trailing ? match.slice(0, -trailingStr.length) : match;
|
|
41
|
+
return redactUrl(url) + trailingStr;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function redactHeaders(headers) {
|
|
45
|
+
const out = {};
|
|
46
|
+
for (const [name, value] of Object.entries(headers ?? {})) {
|
|
47
|
+
out[name] =
|
|
48
|
+
(0, secret_1.isSecret)(value) || SENSITIVE_HEADER.test(name) ? secret_1.REDACTED : value;
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
function redactDeep(value, depth = 8) {
|
|
53
|
+
return walk(value, depth, new WeakSet());
|
|
54
|
+
}
|
|
55
|
+
function walk(value, depth, seen) {
|
|
56
|
+
if ((0, secret_1.isSecret)(value))
|
|
57
|
+
return secret_1.REDACTED;
|
|
58
|
+
if (typeof value === 'string')
|
|
59
|
+
return redactText(value);
|
|
60
|
+
if (typeof value === 'bigint')
|
|
61
|
+
return value.toString();
|
|
62
|
+
if (value === null || typeof value !== 'object')
|
|
63
|
+
return value;
|
|
64
|
+
if (value instanceof Uint8Array)
|
|
65
|
+
return `[bytes:${value.length}]`;
|
|
66
|
+
if (value instanceof Error)
|
|
67
|
+
return { name: value.name, message: redactText(value.message) };
|
|
68
|
+
if (seen.has(value))
|
|
69
|
+
return '[Circular]';
|
|
70
|
+
if (depth <= 0)
|
|
71
|
+
return '[Truncated]';
|
|
72
|
+
seen.add(value);
|
|
73
|
+
if (Array.isArray(value))
|
|
74
|
+
return value.map((item) => walk(item, depth - 1, seen));
|
|
75
|
+
const out = {};
|
|
76
|
+
for (const [key, item] of Object.entries(value)) {
|
|
77
|
+
// Redact if key is sensitive and value is not null/undefined/boolean/number
|
|
78
|
+
const isPrimitive = item === undefined ||
|
|
79
|
+
item === null ||
|
|
80
|
+
typeof item === 'boolean' ||
|
|
81
|
+
typeof item === 'number';
|
|
82
|
+
const sensitive = SENSITIVE_KEY.test(key) && !isPrimitive;
|
|
83
|
+
out[key] = sensitive ? secret_1.REDACTED : walk(item, depth - 1, seen);
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
const UNPRINTABLE = '[unprintable error]';
|
|
88
|
+
/**
|
|
89
|
+
* Copies an error's name/message/code with URLs redacted and without its cause chain.
|
|
90
|
+
* Total: a throwable that cannot be read or printed yields '[unprintable error]'.
|
|
91
|
+
*/
|
|
92
|
+
function sanitizeError(error) {
|
|
93
|
+
try {
|
|
94
|
+
if (error instanceof Error) {
|
|
95
|
+
const clean = new Error(redactText(String(error.message)));
|
|
96
|
+
clean.name = redactText(String(error.name));
|
|
97
|
+
const code = error.code;
|
|
98
|
+
if (typeof code === 'string') {
|
|
99
|
+
clean.code = redactText(code);
|
|
100
|
+
}
|
|
101
|
+
clean.stack = `${clean.name}: ${clean.message}`;
|
|
102
|
+
return clean;
|
|
103
|
+
}
|
|
104
|
+
return new Error(redactText(String(error)));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return new Error(UNPRINTABLE);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=redact.js.map
|