crypto-aio 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +144 -14
- package/dist/adapters/avalanche/address.d.ts +15 -0
- package/dist/adapters/avalanche/address.js +74 -0
- package/dist/adapters/avalanche/address.js.map +1 -0
- package/dist/adapters/avalanche/api.d.ts +100 -0
- package/dist/adapters/avalanche/api.js +381 -0
- package/dist/adapters/avalanche/api.js.map +1 -0
- package/dist/adapters/avalanche/builder.d.ts +13 -0
- package/dist/adapters/avalanche/builder.js +336 -0
- package/dist/adapters/avalanche/builder.js.map +1 -0
- package/dist/adapters/avalanche/cb58.d.ts +7 -0
- package/dist/adapters/avalanche/cb58.js +49 -0
- package/dist/adapters/avalanche/cb58.js.map +1 -0
- package/dist/adapters/avalanche/chains.d.ts +21 -0
- package/dist/adapters/avalanche/chains.js +79 -0
- package/dist/adapters/avalanche/chains.js.map +1 -0
- package/dist/adapters/avalanche/codec.d.ts +94 -0
- package/dist/adapters/avalanche/codec.js +371 -0
- package/dist/adapters/avalanche/codec.js.map +1 -0
- package/dist/adapters/avalanche/context.d.ts +59 -0
- package/dist/adapters/avalanche/context.js +114 -0
- package/dist/adapters/avalanche/context.js.map +1 -0
- package/dist/adapters/avalanche/decode.d.ts +16 -0
- package/dist/adapters/avalanche/decode.js +101 -0
- package/dist/adapters/avalanche/decode.js.map +1 -0
- package/dist/adapters/avalanche/driver.d.ts +22 -0
- package/dist/adapters/avalanche/driver.js +81 -0
- package/dist/adapters/avalanche/driver.js.map +1 -0
- package/dist/adapters/avalanche/errors.d.ts +18 -0
- package/dist/adapters/avalanche/errors.js +61 -0
- package/dist/adapters/avalanche/errors.js.map +1 -0
- package/dist/adapters/avalanche/fees.d.ts +23 -0
- package/dist/adapters/avalanche/fees.js +105 -0
- package/dist/adapters/avalanche/fees.js.map +1 -0
- package/dist/adapters/avalanche/index.d.ts +19 -0
- package/dist/adapters/avalanche/index.js +8 -0
- package/dist/adapters/avalanche/index.js.map +1 -0
- package/dist/adapters/avalanche/network.d.ts +37 -0
- package/dist/adapters/avalanche/network.js +135 -0
- package/dist/adapters/avalanche/network.js.map +1 -0
- package/dist/adapters/avalanche/plugin.d.ts +21 -0
- package/dist/adapters/avalanche/plugin.js +46 -0
- package/dist/adapters/avalanche/plugin.js.map +1 -0
- package/dist/adapters/avalanche/presets.d.ts +6 -0
- package/dist/adapters/avalanche/presets.js +86 -0
- package/dist/adapters/avalanche/presets.js.map +1 -0
- package/dist/adapters/avalanche/proofs.d.ts +41 -0
- package/dist/adapters/avalanche/proofs.js +270 -0
- package/dist/adapters/avalanche/proofs.js.map +1 -0
- package/dist/adapters/avalanche/reader.d.ts +40 -0
- package/dist/adapters/avalanche/reader.js +231 -0
- package/dist/adapters/avalanche/reader.js.map +1 -0
- package/dist/adapters/avalanche/sdk.d.ts +182 -0
- package/dist/adapters/avalanche/sdk.js +21 -0
- package/dist/adapters/avalanche/sdk.js.map +1 -0
- package/dist/adapters/avalanche/types.d.ts +86 -0
- package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
- package/dist/adapters/avalanche/types.js.map +1 -0
- package/dist/adapters/evm/builder.d.ts +11 -0
- package/dist/adapters/evm/builder.js +326 -0
- package/dist/adapters/evm/builder.js.map +1 -0
- package/dist/adapters/evm/chains.d.ts +6 -0
- package/dist/adapters/evm/chains.js +203 -0
- package/dist/adapters/evm/chains.js.map +1 -0
- package/dist/adapters/evm/client.d.ts +84 -0
- package/dist/adapters/evm/client.js +335 -0
- package/dist/adapters/evm/client.js.map +1 -0
- package/dist/adapters/evm/decode.d.ts +35 -0
- package/dist/adapters/evm/decode.js +170 -0
- package/dist/adapters/evm/decode.js.map +1 -0
- package/dist/adapters/evm/driver.d.ts +8 -0
- package/dist/adapters/evm/driver.js +61 -0
- package/dist/adapters/evm/driver.js.map +1 -0
- package/dist/adapters/evm/errors.d.ts +20 -0
- package/dist/adapters/evm/errors.js +110 -0
- package/dist/adapters/evm/errors.js.map +1 -0
- package/dist/adapters/evm/ethers-client.d.ts +43 -0
- package/dist/adapters/evm/ethers-client.js +135 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +79 -0
- package/dist/adapters/evm/fees.js +234 -0
- package/dist/adapters/evm/fees.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +20 -0
- package/dist/adapters/evm/index.js +11 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +60 -0
- package/dist/adapters/evm/network.js +131 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +36 -0
- package/dist/adapters/evm/plugin.js +102 -0
- package/dist/adapters/evm/plugin.js.map +1 -0
- package/dist/adapters/evm/presets.d.ts +2 -0
- package/dist/adapters/evm/presets.js +105 -0
- package/dist/adapters/evm/presets.js.map +1 -0
- package/dist/adapters/evm/proofs.d.ts +19 -0
- package/dist/adapters/evm/proofs.js +358 -0
- package/dist/adapters/evm/proofs.js.map +1 -0
- package/dist/adapters/evm/rawtx.d.ts +25 -0
- package/dist/adapters/evm/rawtx.js +176 -0
- package/dist/adapters/evm/rawtx.js.map +1 -0
- package/dist/adapters/evm/reader.d.ts +65 -0
- package/dist/adapters/evm/reader.js +292 -0
- package/dist/adapters/evm/reader.js.map +1 -0
- package/dist/adapters/evm/rpc.d.ts +39 -0
- package/dist/adapters/evm/rpc.js +152 -0
- package/dist/adapters/evm/rpc.js.map +1 -0
- package/dist/adapters/evm/tokens.d.ts +7 -0
- package/dist/adapters/evm/tokens.js +23 -0
- package/dist/adapters/evm/tokens.js.map +1 -0
- package/dist/adapters/evm/types.d.ts +255 -0
- package/dist/{type/account.js → adapters/evm/types.js} +1 -1
- package/dist/adapters/evm/types.js.map +1 -0
- package/dist/adapters/evm/web3-client.d.ts +23 -0
- package/dist/adapters/evm/web3-client.js +159 -0
- package/dist/adapters/evm/web3-client.js.map +1 -0
- package/dist/adapters/solana/builder.d.ts +18 -0
- package/dist/adapters/solana/builder.js +545 -0
- package/dist/adapters/solana/builder.js.map +1 -0
- package/dist/adapters/solana/chains.d.ts +13 -0
- package/dist/adapters/solana/chains.js +37 -0
- package/dist/adapters/solana/chains.js.map +1 -0
- package/dist/adapters/solana/decode.d.ts +111 -0
- package/dist/adapters/solana/decode.js +595 -0
- package/dist/adapters/solana/decode.js.map +1 -0
- package/dist/adapters/solana/driver.d.ts +15 -0
- package/dist/adapters/solana/driver.js +72 -0
- package/dist/adapters/solana/driver.js.map +1 -0
- package/dist/adapters/solana/errors.d.ts +36 -0
- package/dist/adapters/solana/errors.js +154 -0
- package/dist/adapters/solana/errors.js.map +1 -0
- package/dist/adapters/solana/fees.d.ts +68 -0
- package/dist/adapters/solana/fees.js +205 -0
- package/dist/adapters/solana/fees.js.map +1 -0
- package/dist/adapters/solana/heights.d.ts +47 -0
- package/dist/adapters/solana/heights.js +185 -0
- package/dist/adapters/solana/heights.js.map +1 -0
- package/dist/adapters/solana/history.d.ts +10 -0
- package/dist/adapters/solana/history.js +71 -0
- package/dist/adapters/solana/history.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +16 -0
- package/dist/adapters/solana/index.js +9 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/keys.d.ts +13 -0
- package/dist/adapters/solana/keys.js +69 -0
- package/dist/adapters/solana/keys.js.map +1 -0
- package/dist/adapters/solana/network.d.ts +24 -0
- package/dist/adapters/solana/network.js +95 -0
- package/dist/adapters/solana/network.js.map +1 -0
- package/dist/adapters/solana/plugin.d.ts +18 -0
- package/dist/adapters/solana/plugin.js +41 -0
- package/dist/adapters/solana/plugin.js.map +1 -0
- package/dist/adapters/solana/presets.d.ts +2 -0
- package/dist/adapters/solana/presets.js +77 -0
- package/dist/adapters/solana/presets.js.map +1 -0
- package/dist/adapters/solana/programs.d.ts +44 -0
- package/dist/adapters/solana/programs.js +159 -0
- package/dist/adapters/solana/programs.js.map +1 -0
- package/dist/adapters/solana/proofs.d.ts +56 -0
- package/dist/adapters/solana/proofs.js +540 -0
- package/dist/adapters/solana/proofs.js.map +1 -0
- package/dist/adapters/solana/reader.d.ts +82 -0
- package/dist/adapters/solana/reader.js +326 -0
- package/dist/adapters/solana/reader.js.map +1 -0
- package/dist/adapters/solana/rpc.d.ts +102 -0
- package/dist/adapters/solana/rpc.js +301 -0
- package/dist/adapters/solana/rpc.js.map +1 -0
- package/dist/adapters/solana/tokens.d.ts +7 -0
- package/dist/adapters/solana/tokens.js +19 -0
- package/dist/adapters/solana/tokens.js.map +1 -0
- package/dist/adapters/solana/types.d.ts +121 -0
- package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
- package/dist/adapters/solana/types.js.map +1 -0
- package/dist/adapters/solana/web3.d.ts +5 -0
- package/dist/adapters/solana/web3.js +83 -0
- package/dist/adapters/solana/web3.js.map +1 -0
- package/dist/adapters/solana/wire.d.ts +62 -0
- package/dist/adapters/solana/wire.js +168 -0
- package/dist/adapters/solana/wire.js.map +1 -0
- package/dist/adapters/ton/address.d.ts +43 -0
- package/dist/adapters/ton/address.js +168 -0
- package/dist/adapters/ton/address.js.map +1 -0
- package/dist/adapters/ton/api.d.ts +344 -0
- package/dist/adapters/ton/api.js +942 -0
- package/dist/adapters/ton/api.js.map +1 -0
- package/dist/adapters/ton/builder.d.ts +18 -0
- package/dist/adapters/ton/builder.js +701 -0
- package/dist/adapters/ton/builder.js.map +1 -0
- package/dist/adapters/ton/chains.d.ts +16 -0
- package/dist/adapters/ton/chains.js +39 -0
- package/dist/adapters/ton/chains.js.map +1 -0
- package/dist/adapters/ton/decode.d.ts +43 -0
- package/dist/adapters/ton/decode.js +219 -0
- package/dist/adapters/ton/decode.js.map +1 -0
- package/dist/adapters/ton/driver.d.ts +10 -0
- package/dist/adapters/ton/driver.js +117 -0
- package/dist/adapters/ton/driver.js.map +1 -0
- package/dist/adapters/ton/errors.d.ts +36 -0
- package/dist/adapters/ton/errors.js +89 -0
- package/dist/adapters/ton/errors.js.map +1 -0
- package/dist/adapters/ton/fees.d.ts +28 -0
- package/dist/adapters/ton/fees.js +121 -0
- package/dist/adapters/ton/fees.js.map +1 -0
- package/dist/adapters/ton/index.d.ts +16 -0
- package/dist/adapters/ton/index.js +9 -0
- package/dist/adapters/ton/index.js.map +1 -0
- package/dist/adapters/ton/messages.d.ts +157 -0
- package/dist/adapters/ton/messages.js +397 -0
- package/dist/adapters/ton/messages.js.map +1 -0
- package/dist/adapters/ton/native-client.d.ts +10 -0
- package/dist/adapters/ton/native-client.js +47 -0
- package/dist/adapters/ton/native-client.js.map +1 -0
- package/dist/adapters/ton/network.d.ts +58 -0
- package/dist/adapters/ton/network.js +207 -0
- package/dist/adapters/ton/network.js.map +1 -0
- package/dist/adapters/ton/plugin.d.ts +24 -0
- package/dist/adapters/ton/plugin.js +57 -0
- package/dist/adapters/ton/plugin.js.map +1 -0
- package/dist/adapters/ton/presets.d.ts +6 -0
- package/dist/adapters/ton/presets.js +94 -0
- package/dist/adapters/ton/presets.js.map +1 -0
- package/dist/adapters/ton/proofs.d.ts +66 -0
- package/dist/adapters/ton/proofs.js +813 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +194 -0
- package/dist/adapters/ton/reader.js +781 -0
- package/dist/adapters/ton/reader.js.map +1 -0
- package/dist/adapters/ton/tokens.d.ts +10 -0
- package/dist/adapters/ton/tokens.js +27 -0
- package/dist/adapters/ton/tokens.js.map +1 -0
- package/dist/adapters/ton/trace.d.ts +48 -0
- package/dist/adapters/ton/trace.js +277 -0
- package/dist/adapters/ton/trace.js.map +1 -0
- package/dist/adapters/ton/types.d.ts +105 -0
- package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
- package/dist/adapters/ton/types.js.map +1 -0
- package/dist/adapters/ton/wallets.d.ts +86 -0
- package/dist/adapters/ton/wallets.js +373 -0
- package/dist/adapters/ton/wallets.js.map +1 -0
- package/dist/adapters/tron/abi.d.ts +39 -0
- package/dist/adapters/tron/abi.js +110 -0
- package/dist/adapters/tron/abi.js.map +1 -0
- package/dist/adapters/tron/address.d.ts +20 -0
- package/dist/adapters/tron/address.js +110 -0
- package/dist/adapters/tron/address.js.map +1 -0
- package/dist/adapters/tron/builder.d.ts +12 -0
- package/dist/adapters/tron/builder.js +553 -0
- package/dist/adapters/tron/builder.js.map +1 -0
- package/dist/adapters/tron/chains.d.ts +12 -0
- package/dist/adapters/tron/chains.js +35 -0
- package/dist/adapters/tron/chains.js.map +1 -0
- package/dist/adapters/tron/codec.d.ts +10 -0
- package/dist/adapters/tron/codec.js +322 -0
- package/dist/adapters/tron/codec.js.map +1 -0
- package/dist/adapters/tron/decode.d.ts +50 -0
- package/dist/adapters/tron/decode.js +280 -0
- package/dist/adapters/tron/decode.js.map +1 -0
- package/dist/adapters/tron/driver.d.ts +12 -0
- package/dist/adapters/tron/driver.js +106 -0
- package/dist/adapters/tron/driver.js.map +1 -0
- package/dist/adapters/tron/errors.d.ts +74 -0
- package/dist/adapters/tron/errors.js +261 -0
- package/dist/adapters/tron/errors.js.map +1 -0
- package/dist/adapters/tron/fees.d.ts +49 -0
- package/dist/adapters/tron/fees.js +166 -0
- package/dist/adapters/tron/fees.js.map +1 -0
- package/dist/adapters/tron/http.d.ts +173 -0
- package/dist/adapters/tron/http.js +729 -0
- package/dist/adapters/tron/http.js.map +1 -0
- package/dist/adapters/tron/index.d.ts +16 -0
- package/dist/adapters/tron/index.js +15 -0
- package/dist/adapters/tron/index.js.map +1 -0
- package/dist/adapters/tron/network.d.ts +44 -0
- package/dist/adapters/tron/network.js +163 -0
- package/dist/adapters/tron/network.js.map +1 -0
- package/dist/adapters/tron/plugin.d.ts +17 -0
- package/dist/adapters/tron/plugin.js +39 -0
- package/dist/adapters/tron/plugin.js.map +1 -0
- package/dist/adapters/tron/presets.d.ts +5 -0
- package/dist/adapters/tron/presets.js +68 -0
- package/dist/adapters/tron/presets.js.map +1 -0
- package/dist/adapters/tron/proofs.d.ts +80 -0
- package/dist/adapters/tron/proofs.js +370 -0
- package/dist/adapters/tron/proofs.js.map +1 -0
- package/dist/adapters/tron/protobuf.d.ts +36 -0
- package/dist/adapters/tron/protobuf.js +90 -0
- package/dist/adapters/tron/protobuf.js.map +1 -0
- package/dist/adapters/tron/reader.d.ts +47 -0
- package/dist/adapters/tron/reader.js +203 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +7 -0
- package/dist/adapters/tron/tokens.js +14 -0
- package/dist/adapters/tron/tokens.js.map +1 -0
- package/dist/adapters/tron/types.d.ts +166 -0
- package/dist/adapters/tron/types.js +3 -0
- package/dist/adapters/tron/types.js.map +1 -0
- package/dist/adapters/utxo/address.d.ts +51 -0
- package/dist/adapters/utxo/address.js +341 -0
- package/dist/adapters/utxo/address.js.map +1 -0
- package/dist/adapters/utxo/builder.d.ts +35 -0
- package/dist/adapters/utxo/builder.js +380 -0
- package/dist/adapters/utxo/builder.js.map +1 -0
- package/dist/adapters/utxo/chains.d.ts +17 -0
- package/dist/adapters/utxo/chains.js +99 -0
- package/dist/adapters/utxo/chains.js.map +1 -0
- package/dist/adapters/utxo/codec.d.ts +120 -0
- package/dist/adapters/utxo/codec.js +408 -0
- package/dist/adapters/utxo/codec.js.map +1 -0
- package/dist/adapters/utxo/coinselect.d.ts +48 -0
- package/dist/adapters/utxo/coinselect.js +131 -0
- package/dist/adapters/utxo/coinselect.js.map +1 -0
- package/dist/adapters/utxo/context.d.ts +57 -0
- package/dist/adapters/utxo/context.js +118 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +14 -0
- package/dist/adapters/utxo/decode.js +85 -0
- package/dist/adapters/utxo/decode.js.map +1 -0
- package/dist/adapters/utxo/driver.d.ts +16 -0
- package/dist/adapters/utxo/driver.js +74 -0
- package/dist/adapters/utxo/driver.js.map +1 -0
- package/dist/adapters/utxo/ecc.d.ts +9 -0
- package/dist/adapters/utxo/ecc.js +26 -0
- package/dist/adapters/utxo/ecc.js.map +1 -0
- package/dist/adapters/utxo/errors.d.ts +52 -0
- package/dist/adapters/utxo/errors.js +191 -0
- package/dist/adapters/utxo/errors.js.map +1 -0
- package/dist/adapters/utxo/esplora.d.ts +79 -0
- package/dist/adapters/utxo/esplora.js +451 -0
- package/dist/adapters/utxo/esplora.js.map +1 -0
- package/dist/adapters/utxo/fees.d.ts +41 -0
- package/dist/adapters/utxo/fees.js +125 -0
- package/dist/adapters/utxo/fees.js.map +1 -0
- package/dist/adapters/utxo/index.d.ts +17 -0
- package/dist/adapters/utxo/index.js +8 -0
- package/dist/adapters/utxo/index.js.map +1 -0
- package/dist/adapters/utxo/network.d.ts +50 -0
- package/dist/adapters/utxo/network.js +165 -0
- package/dist/adapters/utxo/network.js.map +1 -0
- package/dist/adapters/utxo/plugin.d.ts +17 -0
- package/dist/adapters/utxo/plugin.js +41 -0
- package/dist/adapters/utxo/plugin.js.map +1 -0
- package/dist/adapters/utxo/presets.d.ts +12 -0
- package/dist/adapters/utxo/presets.js +47 -0
- package/dist/adapters/utxo/presets.js.map +1 -0
- package/dist/adapters/utxo/preview.d.ts +3 -0
- package/dist/adapters/utxo/preview.js +65 -0
- package/dist/adapters/utxo/preview.js.map +1 -0
- package/dist/adapters/utxo/proofs.d.ts +57 -0
- package/dist/adapters/utxo/proofs.js +331 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +59 -0
- package/dist/adapters/utxo/rawtx.js +234 -0
- package/dist/adapters/utxo/rawtx.js.map +1 -0
- package/dist/adapters/utxo/reader.d.ts +36 -0
- package/dist/adapters/utxo/reader.js +265 -0
- package/dist/adapters/utxo/reader.js.map +1 -0
- package/dist/adapters/utxo/sdk.d.ts +18 -0
- package/dist/adapters/utxo/sdk.js +17 -0
- package/dist/adapters/utxo/sdk.js.map +1 -0
- package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
- package/dist/adapters/utxo/signed-psbt.js +428 -0
- package/dist/adapters/utxo/signed-psbt.js.map +1 -0
- package/dist/adapters/utxo/spend.d.ts +59 -0
- package/dist/adapters/utxo/spend.js +230 -0
- package/dist/adapters/utxo/spend.js.map +1 -0
- package/dist/adapters/utxo/types.d.ts +167 -0
- package/dist/adapters/utxo/types.js +3 -0
- package/dist/adapters/utxo/types.js.map +1 -0
- package/dist/core/assets/service.d.ts +18 -0
- package/dist/core/assets/service.js +69 -0
- package/dist/core/assets/service.js.map +1 -0
- package/dist/core/blockchain/default-ref.d.ts +4 -0
- package/dist/core/blockchain/default-ref.js +16 -0
- package/dist/core/blockchain/default-ref.js.map +1 -0
- package/dist/core/blockchain/handle.d.ts +200 -0
- package/dist/core/blockchain/handle.js +579 -0
- package/dist/core/blockchain/handle.js.map +1 -0
- package/dist/core/blockchain/internal.d.ts +19 -0
- package/dist/core/blockchain/internal.js +16 -0
- package/dist/core/blockchain/internal.js.map +1 -0
- package/dist/core/blockchain/mapping.d.ts +22 -0
- package/dist/core/blockchain/mapping.js +136 -0
- package/dist/core/blockchain/mapping.js.map +1 -0
- package/dist/core/config/env.d.ts +8 -0
- package/dist/core/config/env.js +60 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/merge.d.ts +26 -0
- package/dist/core/config/merge.js +144 -0
- package/dist/core/config/merge.js.map +1 -0
- package/dist/core/config/resolve.d.ts +12 -0
- package/dist/core/config/resolve.js +251 -0
- package/dist/core/config/resolve.js.map +1 -0
- package/dist/core/config/types.d.ts +165 -0
- package/dist/core/config/types.js +3 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/container/builtins.d.ts +4 -0
- package/dist/core/container/builtins.js +13 -0
- package/dist/core/container/builtins.js.map +1 -0
- package/dist/core/container/container.d.ts +69 -0
- package/dist/core/container/container.js +466 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/default.d.ts +15 -0
- package/dist/core/container/default.js +70 -0
- package/dist/core/container/default.js.map +1 -0
- package/dist/core/container/internals.d.ts +54 -0
- package/dist/core/container/internals.js +21 -0
- package/dist/core/container/internals.js.map +1 -0
- package/dist/core/container/pool.d.ts +27 -0
- package/dist/core/container/pool.js +77 -0
- package/dist/core/container/pool.js.map +1 -0
- package/dist/core/driver/types.d.ts +346 -0
- package/dist/core/driver/types.js +3 -0
- package/dist/core/driver/types.js.map +1 -0
- package/dist/core/errors/codes.d.ts +153 -0
- package/dist/core/errors/codes.js +49 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/error.d.ts +66 -0
- package/dist/core/errors/error.js +129 -0
- package/dist/core/errors/error.js.map +1 -0
- package/dist/core/events/bus.d.ts +12 -0
- package/dist/core/events/bus.js +46 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/logger.d.ts +13 -0
- package/dist/core/events/logger.js +42 -0
- package/dist/core/events/logger.js.map +1 -0
- package/dist/core/events/types.d.ts +131 -0
- package/dist/core/events/types.js +3 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/lifecycle/engine-rules.d.ts +107 -0
- package/dist/core/lifecycle/engine-rules.js +257 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +500 -0
- package/dist/core/lifecycle/engine.js +1732 -0
- package/dist/core/lifecycle/engine.js.map +1 -0
- package/dist/core/lifecycle/evaluate.d.ts +19 -0
- package/dist/core/lifecycle/evaluate.js +72 -0
- package/dist/core/lifecycle/evaluate.js.map +1 -0
- package/dist/core/lifecycle/intent.d.ts +11 -0
- package/dist/core/lifecycle/intent.js +88 -0
- package/dist/core/lifecycle/intent.js.map +1 -0
- package/dist/core/lifecycle/monitor.d.ts +138 -0
- package/dist/core/lifecycle/monitor.js +606 -0
- package/dist/core/lifecycle/monitor.js.map +1 -0
- package/dist/core/lifecycle/observations.d.ts +17 -0
- package/dist/core/lifecycle/observations.js +59 -0
- package/dist/core/lifecycle/observations.js.map +1 -0
- package/dist/core/lifecycle/reconcile.d.ts +58 -0
- package/dist/core/lifecycle/reconcile.js +112 -0
- package/dist/core/lifecycle/reconcile.js.map +1 -0
- package/dist/core/lifecycle/views.d.ts +49 -0
- package/dist/core/lifecycle/views.js +57 -0
- package/dist/core/lifecycle/views.js.map +1 -0
- package/dist/core/lifecycle/workers.d.ts +82 -0
- package/dist/core/lifecycle/workers.js +329 -0
- package/dist/core/lifecycle/workers.js.map +1 -0
- package/dist/core/model/address.d.ts +32 -0
- package/dist/core/model/address.js +43 -0
- package/dist/core/model/address.js.map +1 -0
- package/dist/core/model/amount.d.ts +25 -0
- package/dist/core/model/amount.js +102 -0
- package/dist/core/model/amount.js.map +1 -0
- package/dist/core/model/asset.d.ts +28 -0
- package/dist/core/model/asset.js +47 -0
- package/dist/core/model/asset.js.map +1 -0
- package/dist/core/model/capability.d.ts +3 -0
- package/dist/core/model/capability.js +18 -0
- package/dist/core/model/capability.js.map +1 -0
- package/dist/core/model/chain.d.ts +63 -0
- package/dist/core/model/chain.js +8 -0
- package/dist/core/model/chain.js.map +1 -0
- package/dist/core/model/fee.d.ts +36 -0
- package/dist/core/model/fee.js +17 -0
- package/dist/core/model/fee.js.map +1 -0
- package/dist/core/model/ids.d.ts +37 -0
- package/dist/core/model/ids.js +13 -0
- package/dist/core/model/ids.js.map +1 -0
- package/dist/core/model/intent.d.ts +63 -0
- package/dist/core/model/intent.js +81 -0
- package/dist/core/model/intent.js.map +1 -0
- package/dist/core/model/ordering.d.ts +20 -0
- package/dist/core/model/ordering.js +29 -0
- package/dist/core/model/ordering.js.map +1 -0
- package/dist/core/model/transaction.d.ts +116 -0
- package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
- package/dist/core/model/transaction.js.map +1 -0
- package/dist/core/observe/scanner.d.ts +135 -0
- package/dist/core/observe/scanner.js +355 -0
- package/dist/core/observe/scanner.js.map +1 -0
- package/dist/core/ordering/reservations.d.ts +16 -0
- package/dist/core/ordering/reservations.js +53 -0
- package/dist/core/ordering/reservations.js.map +1 -0
- package/dist/core/ordering/sequence.d.ts +61 -0
- package/dist/core/ordering/sequence.js +155 -0
- package/dist/core/ordering/sequence.js.map +1 -0
- package/dist/core/registry/adapters.d.ts +10 -0
- package/dist/core/registry/adapters.js +56 -0
- package/dist/core/registry/adapters.js.map +1 -0
- package/dist/core/registry/assets.d.ts +18 -0
- package/dist/core/registry/assets.js +90 -0
- package/dist/core/registry/assets.js.map +1 -0
- package/dist/core/registry/chains.d.ts +10 -0
- package/dist/core/registry/chains.js +80 -0
- package/dist/core/registry/chains.js.map +1 -0
- package/dist/core/registry/plugin.d.ts +41 -0
- package/dist/core/registry/plugin.js +109 -0
- package/dist/core/registry/plugin.js.map +1 -0
- package/dist/core/registry/providers.d.ts +31 -0
- package/dist/core/registry/providers.js +43 -0
- package/dist/core/registry/providers.js.map +1 -0
- package/dist/core/registry/schemes.d.ts +30 -0
- package/dist/core/registry/schemes.js +84 -0
- package/dist/core/registry/schemes.js.map +1 -0
- package/dist/core/secret/fragments.d.ts +33 -0
- package/dist/core/secret/fragments.js +110 -0
- package/dist/core/secret/fragments.js.map +1 -0
- package/dist/core/secret/redact.d.ts +10 -0
- package/dist/core/secret/redact.js +110 -0
- package/dist/core/secret/redact.js.map +1 -0
- package/dist/core/secret/secret.d.ts +14 -0
- package/dist/core/secret/secret.js +42 -0
- package/dist/core/secret/secret.js.map +1 -0
- package/dist/core/signing/callback.d.ts +10 -0
- package/dist/core/signing/callback.js +22 -0
- package/dist/core/signing/callback.js.map +1 -0
- package/dist/core/signing/guard.d.ts +18 -0
- package/dist/core/signing/guard.js +72 -0
- package/dist/core/signing/guard.js.map +1 -0
- package/dist/core/signing/hd.d.ts +36 -0
- package/dist/core/signing/hd.js +167 -0
- package/dist/core/signing/hd.js.map +1 -0
- package/dist/core/signing/local.d.ts +48 -0
- package/dist/core/signing/local.js +190 -0
- package/dist/core/signing/local.js.map +1 -0
- package/dist/core/signing/orchestrator.d.ts +40 -0
- package/dist/core/signing/orchestrator.js +300 -0
- package/dist/core/signing/orchestrator.js.map +1 -0
- package/dist/core/signing/types.d.ts +64 -0
- package/dist/core/signing/types.js +3 -0
- package/dist/core/signing/types.js.map +1 -0
- package/dist/core/signing/wallet.d.ts +48 -0
- package/dist/core/signing/wallet.js +153 -0
- package/dist/core/signing/wallet.js.map +1 -0
- package/dist/core/store/clone.d.ts +25 -0
- package/dist/core/store/clone.js +71 -0
- package/dist/core/store/clone.js.map +1 -0
- package/dist/core/store/memory.d.ts +38 -0
- package/dist/core/store/memory.js +325 -0
- package/dist/core/store/memory.js.map +1 -0
- package/dist/core/store/types.d.ts +246 -0
- package/dist/core/store/types.js +117 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/transport/backoff.d.ts +8 -0
- package/dist/core/transport/backoff.js +27 -0
- package/dist/core/transport/backoff.js.map +1 -0
- package/dist/core/transport/circuit.d.ts +25 -0
- package/dist/core/transport/circuit.js +61 -0
- package/dist/core/transport/circuit.js.map +1 -0
- package/dist/core/transport/http-transport.d.ts +30 -0
- package/dist/core/transport/http-transport.js +1695 -0
- package/dist/core/transport/http-transport.js.map +1 -0
- package/dist/core/transport/rate-limit.d.ts +27 -0
- package/dist/core/transport/rate-limit.js +78 -0
- package/dist/core/transport/rate-limit.js.map +1 -0
- package/dist/core/transport/stale-view.d.ts +11 -0
- package/dist/core/transport/stale-view.js +17 -0
- package/dist/core/transport/stale-view.js.map +1 -0
- package/dist/core/transport/types.d.ts +144 -0
- package/dist/core/transport/types.js +6 -0
- package/dist/core/transport/types.js.map +1 -0
- package/dist/core/util/bytes.d.ts +9 -0
- package/dist/core/util/bytes.js +40 -0
- package/dist/core/util/bytes.js.map +1 -0
- package/dist/core/util/clock.d.ts +6 -0
- package/dist/core/util/clock.js +26 -0
- package/dist/core/util/clock.js.map +1 -0
- package/dist/core/util/freeze.d.ts +8 -0
- package/dist/core/util/freeze.js +31 -0
- package/dist/core/util/freeze.js.map +1 -0
- package/dist/core/util/json.d.ts +29 -0
- package/dist/core/util/json.js +165 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +21 -0
- package/dist/core/util/names.js +46 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +64 -14
- package/dist/index.js +105 -49
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +21 -0
- package/dist/native.js +44 -0
- package/dist/native.js.map +1 -0
- package/dist/testing/contracts/api.d.ts +12 -0
- package/dist/testing/contracts/api.js +58 -0
- package/dist/testing/contracts/api.js.map +1 -0
- package/dist/testing/contracts/cursors.d.ts +6 -0
- package/dist/testing/contracts/cursors.js +43 -0
- package/dist/testing/contracts/cursors.js.map +1 -0
- package/dist/testing/contracts/locks.d.ts +10 -0
- package/dist/testing/contracts/locks.js +63 -0
- package/dist/testing/contracts/locks.js.map +1 -0
- package/dist/testing/contracts/operations.d.ts +21 -0
- package/dist/testing/contracts/operations.js +718 -0
- package/dist/testing/contracts/operations.js.map +1 -0
- package/dist/testing/contracts/sequences.d.ts +6 -0
- package/dist/testing/contracts/sequences.js +68 -0
- package/dist/testing/contracts/sequences.js.map +1 -0
- package/dist/testing/env.d.ts +63 -0
- package/dist/testing/env.js +105 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/fake-chain.d.ts +118 -0
- package/dist/testing/fake-chain.js +536 -0
- package/dist/testing/fake-chain.js.map +1 -0
- package/dist/testing/fake-clock.d.ts +15 -0
- package/dist/testing/fake-clock.js +86 -0
- package/dist/testing/fake-clock.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +15 -0
- package/dist/testing/fake-driver.js +458 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/fake-fetch.d.ts +32 -0
- package/dist/testing/fake-fetch.js +81 -0
- package/dist/testing/fake-fetch.js.map +1 -0
- package/dist/testing/fake-plugin.d.ts +30 -0
- package/dist/testing/fake-plugin.js +66 -0
- package/dist/testing/fake-plugin.js.map +1 -0
- package/dist/testing/faulty-store.d.ts +36 -0
- package/dist/testing/faulty-store.js +66 -0
- package/dist/testing/faulty-store.js.map +1 -0
- package/dist/testing/generation.d.ts +60 -0
- package/dist/testing/generation.js +252 -0
- package/dist/testing/generation.js.map +1 -0
- package/dist/testing/index.d.ts +28 -0
- package/dist/testing/index.js +51 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +188 -45
- package/dist/libs/eth/account.d.ts +0 -9
- package/dist/libs/eth/account.js +0 -58
- package/dist/libs/eth/account.js.map +0 -1
- package/dist/libs/eth/contract.d.ts +0 -7
- package/dist/libs/eth/contract.js +0 -42
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -24
- package/dist/libs/eth/index.js +0 -72
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -7
- package/dist/libs/eth/transact.js +0 -26
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -2
- package/dist/libs/index.js +0 -19
- package/dist/libs/index.js.map +0 -1
- package/dist/libs/trx/account.d.ts +0 -9
- package/dist/libs/trx/account.js +0 -55
- package/dist/libs/trx/account.js.map +0 -1
- package/dist/libs/trx/contract.d.ts +0 -7
- package/dist/libs/trx/contract.js +0 -27
- package/dist/libs/trx/contract.js.map +0 -1
- package/dist/libs/trx/index.d.ts +0 -22
- package/dist/libs/trx/index.js +0 -64
- package/dist/libs/trx/index.js.map +0 -1
- package/dist/libs/trx/transact.d.ts +0 -7
- package/dist/libs/trx/transact.js +0 -26
- package/dist/libs/trx/transact.js.map +0 -1
- package/dist/tool/common.d.ts +0 -28
- package/dist/tool/common.js +0 -33
- package/dist/tool/common.js.map +0 -1
- package/dist/tool/eth-tools.d.ts +0 -3
- package/dist/tool/eth-tools.js +0 -33
- package/dist/tool/eth-tools.js.map +0 -1
- package/dist/tool/index.d.ts +0 -5
- package/dist/tool/index.js +0 -22
- package/dist/tool/index.js.map +0 -1
- package/dist/tool/logging.d.ts +0 -3
- package/dist/tool/logging.js +0 -11
- package/dist/tool/logging.js.map +0 -1
- package/dist/tool/options.d.ts +0 -6
- package/dist/tool/options.js +0 -41
- package/dist/tool/options.js.map +0 -1
- package/dist/tool/trx-tools.d.ts +0 -3
- package/dist/tool/trx-tools.js +0 -20
- package/dist/tool/trx-tools.js.map +0 -1
- package/dist/type/account.d.ts +0 -9
- package/dist/type/account.js.map +0 -1
- package/dist/type/common.d.ts +0 -18
- package/dist/type/common.js.map +0 -1
- package/dist/type/contract.d.ts +0 -10
- package/dist/type/contract.js.map +0 -1
- package/dist/type/index.d.ts +0 -5
- package/dist/type/index.js +0 -22
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -9
- package/dist/type/lib-types.js.map +0 -1
- package/dist/type/transact.d.ts +0 -7
- package/dist/type/transact.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SPEED_TARGETS = void 0;
|
|
4
|
+
exports.satPerKvB = satPerKvB;
|
|
5
|
+
exports.rateForSpeed = rateForSpeed;
|
|
6
|
+
exports.rateFromOverride = rateFromOverride;
|
|
7
|
+
exports.feeAt = feeAt;
|
|
8
|
+
exports.assertSaneFee = assertSaneFee;
|
|
9
|
+
exports.replacementFloor = replacementFloor;
|
|
10
|
+
/**
|
|
11
|
+
* UTXO fee policy (pure): fee rates from Esplora estimates or an override, the fee of a
|
|
12
|
+
* size, the absurd-fee guard, and the replacement rules every Bitcoin Core release since
|
|
13
|
+
* v28 enforces (doc/policy/mempool-replacements.md): the replacement pays at least the
|
|
14
|
+
* replaced fee plus the incremental relay fee for its own size (rules 3 and 4), and a
|
|
15
|
+
* strictly higher fee rate (the pre-v31 rule 6, which a single-transaction conflict still
|
|
16
|
+
* needs for the v31 feerate diagram). Rates are sat/kvB bigints; nothing here floats except
|
|
17
|
+
* the parsing of Esplora's sat/vB numbers.
|
|
18
|
+
*/
|
|
19
|
+
const error_1 = require("../../core/errors/error");
|
|
20
|
+
/** Confirmation targets (blocks) per speed: library policy, not a network fact. */
|
|
21
|
+
exports.SPEED_TARGETS = Object.freeze({
|
|
22
|
+
fast: 2,
|
|
23
|
+
normal: 6,
|
|
24
|
+
slow: 144,
|
|
25
|
+
});
|
|
26
|
+
/** Esplora's sat/vB float as sat/kvB, rounded up after removing float noise. */
|
|
27
|
+
function satPerKvB(satPerVByte) {
|
|
28
|
+
const micro = Math.round(satPerVByte * 1_000_000);
|
|
29
|
+
return BigInt(Math.ceil(micro / 1_000));
|
|
30
|
+
}
|
|
31
|
+
const outOfRange = () => new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'the fee estimate is out of range');
|
|
32
|
+
/**
|
|
33
|
+
* The largest sat/vB an estimate may carry before it is converted (the `/fee-estimates`
|
|
34
|
+
* parser's bound too); above about 1.8e302, `satPerKvB`'s `x × 1e6` overflows to
|
|
35
|
+
* Infinity.
|
|
36
|
+
*/
|
|
37
|
+
const MAX_ESTIMATE = 1e7;
|
|
38
|
+
/**
|
|
39
|
+
* The rate for a speed: the estimate at its target, else at the nearest faster target the
|
|
40
|
+
* endpoint has; never below the minimum relay fee. With no usable estimate, a test
|
|
41
|
+
* network's `feeFallback`, else a retryable `PROVIDER_UNAVAILABLE` (nothing is guessed).
|
|
42
|
+
* The relay floor clamps the fallback too: it is registry data, never checked against
|
|
43
|
+
* `minRelayFee`.
|
|
44
|
+
*/
|
|
45
|
+
function rateForSpeed(estimates, speed, policy) {
|
|
46
|
+
const target = exports.SPEED_TARGETS[speed];
|
|
47
|
+
let best;
|
|
48
|
+
for (const available of estimates.keys()) {
|
|
49
|
+
if (available <= target && (best === undefined || available > best))
|
|
50
|
+
best = available;
|
|
51
|
+
}
|
|
52
|
+
let rate;
|
|
53
|
+
if (best !== undefined) {
|
|
54
|
+
const estimate = estimates.get(best);
|
|
55
|
+
// One endpoint's estimate never sets an absurd rate (an explicit override may), and a
|
|
56
|
+
// malformed one (negative, not finite or beyond any real rate) decides nothing either;
|
|
57
|
+
// the negated range test also refuses NaN.
|
|
58
|
+
if (!(estimate >= 0 && estimate <= MAX_ESTIMATE))
|
|
59
|
+
throw outOfRange();
|
|
60
|
+
rate = satPerKvB(estimate);
|
|
61
|
+
if (rate > policy.maxEstimatedFeeRate)
|
|
62
|
+
throw outOfRange();
|
|
63
|
+
}
|
|
64
|
+
else if (policy.feeFallback !== undefined)
|
|
65
|
+
rate = policy.feeFallback;
|
|
66
|
+
else {
|
|
67
|
+
throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', 'the endpoint has no fee estimate for this confirmation target');
|
|
68
|
+
}
|
|
69
|
+
return rate < policy.minRelayFee ? policy.minRelayFee : rate;
|
|
70
|
+
}
|
|
71
|
+
const DECIMAL = /^(0|[1-9][0-9]{0,6})(\.[0-9]{1,3})?$/;
|
|
72
|
+
/** `{ satPerVByte }` as sat/kvB. `INVALID_INTENT` when malformed, `FEE_TOO_LOW` below relay. */
|
|
73
|
+
function rateFromOverride(override, policy) {
|
|
74
|
+
const keys = Object.keys(override);
|
|
75
|
+
const value = override.satPerVByte;
|
|
76
|
+
if (keys.length !== 1 || keys[0] !== 'satPerVByte') {
|
|
77
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'a UTXO fee override is { satPerVByte: bigint | decimal string }');
|
|
78
|
+
}
|
|
79
|
+
let rate;
|
|
80
|
+
if (typeof value === 'bigint') {
|
|
81
|
+
if (value < 0n)
|
|
82
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'satPerVByte must be >= 0');
|
|
83
|
+
rate = value * 1000n;
|
|
84
|
+
}
|
|
85
|
+
else if (typeof value === 'string' && DECIMAL.test(value)) {
|
|
86
|
+
const [whole, fraction = ''] = value.split('.');
|
|
87
|
+
rate = BigInt(whole) * 1000n + BigInt(fraction.padEnd(3, '0'));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'satPerVByte must be a bigint or a decimal string with at most 3 fractional digits');
|
|
91
|
+
}
|
|
92
|
+
if (rate < policy.minRelayFee) {
|
|
93
|
+
throw new error_1.ChainError('FEE_TOO_LOW', 'the fee rate is below the minimum relay fee');
|
|
94
|
+
}
|
|
95
|
+
return rate;
|
|
96
|
+
}
|
|
97
|
+
/** Bitcoin Core's `CFeeRate::GetFee`: `rate × vsize / 1000`, rounded up. */
|
|
98
|
+
function feeAt(rate, vsize) {
|
|
99
|
+
return (rate * BigInt(vsize) + 999n) / 1000n;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The absurd-fee guard (a burn of funds by a fee bug or a fat-fingered override): refuses
|
|
103
|
+
* a fee above `maxFee` or a rate above `maxFeeRate` before anything is signed.
|
|
104
|
+
*/
|
|
105
|
+
function assertSaneFee(fee, vsize, policy) {
|
|
106
|
+
if (fee > policy.maxFee || fee * 1000n > policy.maxFeeRate * BigInt(vsize)) {
|
|
107
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'the fee exceeds the configured maximum (options.maxFee / options.maxFeeRate)');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The least fee a replacement of `vsize` may pay over `previous` (rules 3, 4 and 6). It does
|
|
112
|
+
* not count descendants of the replaced transaction (a recipient's CPFP): a node then refuses
|
|
113
|
+
* with `FEE_TOO_LOW`, and a higher explicit fee resolves it.
|
|
114
|
+
*/
|
|
115
|
+
function replacementFloor(previous, vsize, incrementalRelayFee) {
|
|
116
|
+
const byBandwidth = previous.fee + feeAt(incrementalRelayFee, vsize);
|
|
117
|
+
// The replaced rate at its smallest possible size (the worst-case size understates it),
|
|
118
|
+
// rounded up to sat/kvB, plus one: strictly higher both exactly (v30) and truncated to
|
|
119
|
+
// sat/kvB (v28, v29).
|
|
120
|
+
const smallest = BigInt(previous.minVsize ?? previous.vsize);
|
|
121
|
+
const oldRate = (previous.fee * 1000n + smallest - 1n) / smallest;
|
|
122
|
+
const byRate = ((oldRate + 1n) * BigInt(vsize) + 999n) / 1000n;
|
|
123
|
+
return byBandwidth > byRate ? byBandwidth : byRate;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=fees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fees.js","sourceRoot":"","sources":["../../../src/adapters/utxo/fees.ts"],"names":[],"mappings":";;;AA0BA,8BAGC;AAmBD,oCA2BC;AAKD,4CA2BC;AAGD,sBAEC;AAMD,sCAOC;AAkBD,4CAaC;AA5JD;;;;;;;;GAQG;AACH,mDAAqF;AAIrF,mFAAmF;AACtE,QAAA,aAAa,GAAuC,MAAM,CAAC,MAAM,CAAC;IAC7E,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,GAAG;CACV,CAAC,CAAC;AAOH,gFAAgF;AAChF,SAAgB,SAAS,CAAC,WAAmB;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,GAAG,GAAkB,EAAE,CACrC,IAAI,qBAAa,CAAC,sBAAsB,EAAE,kCAAkC,CAAC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,SAAsC,EACtC,KAAe,EACf,MAAiB;IAEjB,MAAM,MAAM,GAAG,qBAAa,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,IAAwB,CAAC;IAC7B,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,SAAS,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,GAAG,IAAI,CAAC;YAAE,IAAI,GAAG,SAAS,CAAC;IACxF,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAW,CAAC;QAC/C,sFAAsF;QACtF,uFAAuF;QACvF,2CAA2C;QAC3C,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,YAAY,CAAC;YAAE,MAAM,UAAU,EAAE,CAAC;QACrE,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC3B,IAAI,IAAI,GAAG,MAAM,CAAC,mBAAmB;YAAE,MAAM,UAAU,EAAE,CAAC;IAC5D,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;QAAE,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;SAClE,CAAC;QACJ,MAAM,IAAI,qBAAa,CACrB,sBAAsB,EACtB,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,OAAO,GAAG,sCAAsC,CAAC;AAEvD,gGAAgG;AAChG,SAAgB,gBAAgB,CAAC,QAAqB,EAAE,MAAiB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;QACnD,MAAM,IAAI,uBAAe,CACvB,gBAAgB,EAChB,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,GAAG,EAAE;YACZ,MAAM,IAAI,uBAAe,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;QAC1E,IAAI,GAAG,KAAK,GAAG,KAAM,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;QACrE,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,uBAAe,CACvB,gBAAgB,EAChB,mFAAmF,CACpF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,kBAAU,CAAC,aAAa,EAAE,6CAA6C,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,SAAgB,KAAK,CAAC,IAAY,EAAE,KAAa;IAC/C,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAM,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,MAAiB;IACzE,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,KAAM,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,uBAAe,CACvB,gBAAgB,EAChB,8EAA8E,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC;AAaD;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,QAAiB,EACjB,KAAa,EACb,mBAA2B;IAE3B,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IACrE,wFAAwF;IACxF,uFAAuF;IACvF,sBAAsB;IACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,KAAM,GAAG,QAAQ,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC;IACnE,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAM,CAAC;IAChE,OAAO,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;AACrD,CAAC","sourcesContent":["/**\n * UTXO fee policy (pure): fee rates from Esplora estimates or an override, the fee of a\n * size, the absurd-fee guard, and the replacement rules every Bitcoin Core release since\n * v28 enforces (doc/policy/mempool-replacements.md): the replacement pays at least the\n * replaced fee plus the incremental relay fee for its own size (rules 3 and 4), and a\n * strictly higher fee rate (the pre-v31 rule 6, which a single-transaction conflict still\n * needs for the v31 feerate diagram). Rates are sat/kvB bigints; nothing here floats except\n * the parsing of Esplora's sat/vB numbers.\n */\nimport { ChainError, ProviderError, ValidationError } from '../../core/errors/error';\nimport type { FeeOverride, FeeSpeed } from '../../core/model/fee';\nimport type { UtxoNetworkConfig } from './network';\n\n/** Confirmation targets (blocks) per speed: library policy, not a network fact. */\nexport const SPEED_TARGETS: Readonly<Record<FeeSpeed, number>> = Object.freeze({\n fast: 2,\n normal: 6,\n slow: 144,\n});\n\ntype FeePolicy = Pick<\n UtxoNetworkConfig,\n 'minRelayFee' | 'feeFallback' | 'maxFeeRate' | 'maxFee' | 'maxEstimatedFeeRate'\n>;\n\n/** Esplora's sat/vB float as sat/kvB, rounded up after removing float noise. */\nexport function satPerKvB(satPerVByte: number): bigint {\n const micro = Math.round(satPerVByte * 1_000_000);\n return BigInt(Math.ceil(micro / 1_000));\n}\n\nconst outOfRange = (): ProviderError =>\n new ProviderError('PROVIDER_UNAVAILABLE', 'the fee estimate is out of range');\n\n/**\n * The largest sat/vB an estimate may carry before it is converted (the `/fee-estimates`\n * parser's bound too); above about 1.8e302, `satPerKvB`'s `x × 1e6` overflows to\n * Infinity.\n */\nconst MAX_ESTIMATE = 1e7;\n\n/**\n * The rate for a speed: the estimate at its target, else at the nearest faster target the\n * endpoint has; never below the minimum relay fee. With no usable estimate, a test\n * network's `feeFallback`, else a retryable `PROVIDER_UNAVAILABLE` (nothing is guessed).\n * The relay floor clamps the fallback too: it is registry data, never checked against\n * `minRelayFee`.\n */\nexport function rateForSpeed(\n estimates: ReadonlyMap<number, number>,\n speed: FeeSpeed,\n policy: FeePolicy,\n): bigint {\n const target = SPEED_TARGETS[speed];\n let best: number | undefined;\n for (const available of estimates.keys()) {\n if (available <= target && (best === undefined || available > best)) best = available;\n }\n let rate: bigint;\n if (best !== undefined) {\n const estimate = estimates.get(best) as number;\n // One endpoint's estimate never sets an absurd rate (an explicit override may), and a\n // malformed one (negative, not finite or beyond any real rate) decides nothing either;\n // the negated range test also refuses NaN.\n if (!(estimate >= 0 && estimate <= MAX_ESTIMATE)) throw outOfRange();\n rate = satPerKvB(estimate);\n if (rate > policy.maxEstimatedFeeRate) throw outOfRange();\n } else if (policy.feeFallback !== undefined) rate = policy.feeFallback;\n else {\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n 'the endpoint has no fee estimate for this confirmation target',\n );\n }\n return rate < policy.minRelayFee ? policy.minRelayFee : rate;\n}\n\nconst DECIMAL = /^(0|[1-9][0-9]{0,6})(\\.[0-9]{1,3})?$/;\n\n/** `{ satPerVByte }` as sat/kvB. `INVALID_INTENT` when malformed, `FEE_TOO_LOW` below relay. */\nexport function rateFromOverride(override: FeeOverride, policy: FeePolicy): bigint {\n const keys = Object.keys(override);\n const value = override.satPerVByte;\n if (keys.length !== 1 || keys[0] !== 'satPerVByte') {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'a UTXO fee override is { satPerVByte: bigint | decimal string }',\n );\n }\n let rate: bigint;\n if (typeof value === 'bigint') {\n if (value < 0n)\n throw new ValidationError('INVALID_INTENT', 'satPerVByte must be >= 0');\n rate = value * 1_000n;\n } else if (typeof value === 'string' && DECIMAL.test(value)) {\n const [whole, fraction = ''] = value.split('.') as [string, string?];\n rate = BigInt(whole) * 1_000n + BigInt(fraction.padEnd(3, '0'));\n } else {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'satPerVByte must be a bigint or a decimal string with at most 3 fractional digits',\n );\n }\n if (rate < policy.minRelayFee) {\n throw new ChainError('FEE_TOO_LOW', 'the fee rate is below the minimum relay fee');\n }\n return rate;\n}\n\n/** Bitcoin Core's `CFeeRate::GetFee`: `rate × vsize / 1000`, rounded up. */\nexport function feeAt(rate: bigint, vsize: number): bigint {\n return (rate * BigInt(vsize) + 999n) / 1_000n;\n}\n\n/**\n * The absurd-fee guard (a burn of funds by a fee bug or a fat-fingered override): refuses\n * a fee above `maxFee` or a rate above `maxFeeRate` before anything is signed.\n */\nexport function assertSaneFee(fee: bigint, vsize: number, policy: FeePolicy): void {\n if (fee > policy.maxFee || fee * 1_000n > policy.maxFeeRate * BigInt(vsize)) {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'the fee exceeds the configured maximum (options.maxFee / options.maxFeeRate)',\n );\n }\n}\n\nexport interface PaidFee {\n readonly fee: bigint;\n /** Estimated with worst-case signatures (an upper bound of the real size). */\n readonly vsize: number;\n /**\n * A lower bound of the real size: a signature can be shorter than the worst case the\n * estimate assumes. Default `vsize`.\n */\n readonly minVsize?: number;\n}\n\n/**\n * The least fee a replacement of `vsize` may pay over `previous` (rules 3, 4 and 6). It does\n * not count descendants of the replaced transaction (a recipient's CPFP): a node then refuses\n * with `FEE_TOO_LOW`, and a higher explicit fee resolves it.\n */\nexport function replacementFloor(\n previous: PaidFee,\n vsize: number,\n incrementalRelayFee: bigint,\n): bigint {\n const byBandwidth = previous.fee + feeAt(incrementalRelayFee, vsize);\n // The replaced rate at its smallest possible size (the worst-case size understates it),\n // rounded up to sat/kvB, plus one: strictly higher both exactly (v30) and truncated to\n // sat/kvB (v28, v29).\n const smallest = BigInt(previous.minVsize ?? previous.vsize);\n const oldRate = (previous.fee * 1_000n + smallest - 1n) / smallest;\n const byRate = ((oldRate + 1n) * BigInt(vsize) + 999n) / 1_000n;\n return byBandwidth > byRate ? byBandwidth : byRate;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `crypto-aio/utxo`: the SDK-free UTXO types, the family's peer dependency and
|
|
3
|
+
* capabilities, and the `crypto-aio/native` client type: importing this entry types
|
|
4
|
+
* `native(bc, 'bitcoinjs-lib')` as a {@link UtxoNativeClient}.
|
|
5
|
+
*
|
|
6
|
+
* @module crypto-aio/utxo
|
|
7
|
+
*/
|
|
8
|
+
import type { UtxoNativeClient } from './driver';
|
|
9
|
+
declare module '../../index' {
|
|
10
|
+
interface NativeClientMap {
|
|
11
|
+
'bitcoinjs-lib': UtxoNativeClient;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export type { UtxoNativeClient } from './driver';
|
|
15
|
+
export { UTXO_PEER_DEPENDENCIES } from './plugin';
|
|
16
|
+
export { UTXO_CAPABILITIES } from './network';
|
|
17
|
+
export type { UtxoAddressType, UtxoExt, UtxoFeeDetails, UtxoFeeOverride, UtxoOutputType, UtxoSelectionPreview, UtxoSelectionRequest, UtxoUnspent, UtxoWalletOptions, } from './types';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UTXO_CAPABILITIES = exports.UTXO_PEER_DEPENDENCIES = void 0;
|
|
4
|
+
var plugin_1 = require("./plugin");
|
|
5
|
+
Object.defineProperty(exports, "UTXO_PEER_DEPENDENCIES", { enumerable: true, get: function () { return plugin_1.UTXO_PEER_DEPENDENCIES; } });
|
|
6
|
+
var network_1 = require("./network");
|
|
7
|
+
Object.defineProperty(exports, "UTXO_CAPABILITIES", { enumerable: true, get: function () { return network_1.UTXO_CAPABILITIES; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/utxo/index.ts"],"names":[],"mappings":";;;AAkBA,mCAAkD;AAAzC,gHAAA,sBAAsB,OAAA;AAC/B,qCAA8C;AAArC,4GAAA,iBAAiB,OAAA","sourcesContent":["/**\n * `crypto-aio/utxo`: the SDK-free UTXO types, the family's peer dependency and\n * capabilities, and the `crypto-aio/native` client type: importing this entry types\n * `native(bc, 'bitcoinjs-lib')` as a {@link UtxoNativeClient}.\n *\n * @module crypto-aio/utxo\n */\nimport type { UtxoNativeClient } from './driver';\n\n// Through the package entry, as users augment 'crypto-aio'. SDK types appear only in this\n// subpath's `NativeClientMap` augmentation, never in the main entry's types.\ndeclare module '../../index' {\n interface NativeClientMap {\n 'bitcoinjs-lib': UtxoNativeClient;\n }\n}\n\nexport type { UtxoNativeClient } from './driver';\nexport { UTXO_PEER_DEPENDENCIES } from './plugin';\nexport { UTXO_CAPABILITIES } from './network';\nexport type {\n UtxoAddressType,\n UtxoExt,\n UtxoFeeDetails,\n UtxoFeeOverride,\n UtxoOutputType,\n UtxoSelectionPreview,\n UtxoSelectionRequest,\n UtxoUnspent,\n UtxoWalletOptions,\n} from './types';\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type Capability } from '../../core/model/capability';
|
|
2
|
+
import type { ChainInfo, NetworkInfo } from '../../core/model/chain';
|
|
3
|
+
import type { AddressParams } from './types';
|
|
4
|
+
/** Every capability of a UTXO network (the indexer is required). */
|
|
5
|
+
export declare const UTXO_CAPABILITIES: readonly Capability[];
|
|
6
|
+
export type CoinSelectionStrategy = 'accumulative' | 'all';
|
|
7
|
+
export interface UtxoNetworkConfig {
|
|
8
|
+
/** The genesis block hash: the endpoint identity. */
|
|
9
|
+
readonly genesisHash: string;
|
|
10
|
+
readonly address: AddressParams;
|
|
11
|
+
/** Finality depth N: a block with N confirmations is final. */
|
|
12
|
+
readonly confirmations: number;
|
|
13
|
+
/** Relay policy, in sat/kvB. */
|
|
14
|
+
readonly dustRelayFee: bigint;
|
|
15
|
+
readonly minRelayFee: bigint;
|
|
16
|
+
readonly incrementalRelayFee: bigint;
|
|
17
|
+
/** The rate used when a test network's estimator has no data; `undefined` on mainnet. */
|
|
18
|
+
readonly feeFallback?: bigint;
|
|
19
|
+
/** Absurd-fee guard: the highest fee rate (sat/kvB) and absolute fee (sat) ever built. */
|
|
20
|
+
readonly maxFeeRate: bigint;
|
|
21
|
+
readonly maxFee: bigint;
|
|
22
|
+
/**
|
|
23
|
+
* The highest rate (sat/kvB) taken from an endpoint's estimate; above it the estimate
|
|
24
|
+
* decides nothing. One endpoint's estimate sets a speed's rate, so it has a cap of its
|
|
25
|
+
* own, lower than `maxFeeRate`, which alone bounds an explicit override.
|
|
26
|
+
*/
|
|
27
|
+
readonly maxEstimatedFeeRate: bigint;
|
|
28
|
+
/**
|
|
29
|
+
* Carry each segwit v0 input's previous transaction in the PSBT, for hardware wallets
|
|
30
|
+
* that demand it. A p2tr input never carries one.
|
|
31
|
+
*/
|
|
32
|
+
readonly nonWitnessUtxo: boolean;
|
|
33
|
+
/** Confirmations an output needs before coin selection spends it (0 allows unconfirmed). */
|
|
34
|
+
readonly minInputConfirmations: number;
|
|
35
|
+
readonly coinSelection: CoinSelectionStrategy;
|
|
36
|
+
/** Signal BIP125 replaceability (`nSequence` 0xfffffffd) on every input. */
|
|
37
|
+
readonly rbf: boolean;
|
|
38
|
+
readonly capabilities: ReadonlySet<Capability>;
|
|
39
|
+
}
|
|
40
|
+
/** Library defaults for the handle `options`: library policy, not network facts. */
|
|
41
|
+
export declare const OPTION_DEFAULTS: Readonly<{
|
|
42
|
+
maxFeeRate: 1000000n;
|
|
43
|
+
maxFee: 10000000n;
|
|
44
|
+
maxEstimatedFeeRate: 200000n;
|
|
45
|
+
nonWitnessUtxo: true;
|
|
46
|
+
minInputConfirmations: 1;
|
|
47
|
+
coinSelection: CoinSelectionStrategy;
|
|
48
|
+
rbf: true;
|
|
49
|
+
}>;
|
|
50
|
+
export declare function utxoNetworkConfig(chain: ChainInfo, network: NetworkInfo, options?: Readonly<Record<string, unknown>>): UtxoNetworkConfig;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OPTION_DEFAULTS = exports.UTXO_CAPABILITIES = void 0;
|
|
4
|
+
exports.utxoNetworkConfig = utxoNetworkConfig;
|
|
5
|
+
/**
|
|
6
|
+
* What the UTXO driver needs from a network's registry entry and from the handle's
|
|
7
|
+
* `options`, validated once when a driver is created, so bad data fails with
|
|
8
|
+
* `CONFIG_INVALID` instead of misbehaving (every number is checked, and the finality
|
|
9
|
+
* depth is a safe integer of at least 1).
|
|
10
|
+
*/
|
|
11
|
+
const error_1 = require("../../core/errors/error");
|
|
12
|
+
const capability_1 = require("../../core/model/capability");
|
|
13
|
+
const names_1 = require("../../core/util/names");
|
|
14
|
+
/** Every capability of a UTXO network (the indexer is required). */
|
|
15
|
+
exports.UTXO_CAPABILITIES = Object.freeze([
|
|
16
|
+
'batch-transfer',
|
|
17
|
+
'replace-fee',
|
|
18
|
+
'cancel',
|
|
19
|
+
'block-scan',
|
|
20
|
+
'address-history',
|
|
21
|
+
'hd-public-derivation',
|
|
22
|
+
]);
|
|
23
|
+
/** Library defaults for the handle `options`: library policy, not network facts. */
|
|
24
|
+
exports.OPTION_DEFAULTS = Object.freeze({
|
|
25
|
+
maxFeeRate: 1000000n, // 1,000 sat/vB
|
|
26
|
+
maxFee: 10000000n, // 0.1 BTC, Bitcoin Core's -maxtxfee default
|
|
27
|
+
maxEstimatedFeeRate: 200000n, // 200 sat/vB
|
|
28
|
+
nonWitnessUtxo: true,
|
|
29
|
+
minInputConfirmations: 1,
|
|
30
|
+
coinSelection: 'accumulative',
|
|
31
|
+
rbf: true,
|
|
32
|
+
});
|
|
33
|
+
const OPTION_KEYS = new Set([
|
|
34
|
+
'maxFeeRate',
|
|
35
|
+
'maxFee',
|
|
36
|
+
'maxEstimatedFeeRate',
|
|
37
|
+
'nonWitnessUtxo',
|
|
38
|
+
'minInputConfirmations',
|
|
39
|
+
'coinSelection',
|
|
40
|
+
'rbf',
|
|
41
|
+
]);
|
|
42
|
+
/**
|
|
43
|
+
* A network's capability overrides, checked against what the
|
|
44
|
+
* UTXO driver serves. The handle advertises the manifest's capabilities plus `add`, minus
|
|
45
|
+
* `remove`, and the core accepts what it advertises: `add: ['memo']` would make it take a
|
|
46
|
+
* memo the builder cannot write (no OP_RETURN). So each name, added or removed, must be one
|
|
47
|
+
* the driver serves, and a removal of anything else fails as the typo it likely is. The error
|
|
48
|
+
* names a library capability, never a caller's unknown text, and lists the accepted names.
|
|
49
|
+
*/
|
|
50
|
+
function checkCapabilities(network, fail) {
|
|
51
|
+
const add = network.capabilities?.add ?? [];
|
|
52
|
+
const remove = network.capabilities?.remove ?? [];
|
|
53
|
+
if (!Array.isArray(add) || !Array.isArray(remove)) {
|
|
54
|
+
fail('capabilities.add and capabilities.remove must be lists');
|
|
55
|
+
}
|
|
56
|
+
const serves = `the UTXO driver serves ${exports.UTXO_CAPABILITIES.join(', ')}`;
|
|
57
|
+
for (const [side, names] of [
|
|
58
|
+
['add', add],
|
|
59
|
+
['remove', remove],
|
|
60
|
+
]) {
|
|
61
|
+
for (const name of names) {
|
|
62
|
+
if (exports.UTXO_CAPABILITIES.includes(name))
|
|
63
|
+
continue;
|
|
64
|
+
const known = capability_1.KNOWN_CAPABILITIES.includes(name);
|
|
65
|
+
fail(`capabilities.${side}: ${known ? `'${String(name)}' is not one` : 'an unknown name'}; ${serves}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function utxoNetworkConfig(chain, network, options = {}) {
|
|
70
|
+
const fail = (reason) => {
|
|
71
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `UTXO network ${chain.id}:${network.id}: ${reason}`);
|
|
72
|
+
};
|
|
73
|
+
const identity = network.identity;
|
|
74
|
+
if (identity === undefined || !/^[0-9a-f]{64}$/.test(identity)) {
|
|
75
|
+
fail('its identity must be the genesis block hash (64 lowercase hex digits)');
|
|
76
|
+
}
|
|
77
|
+
if (network.feeModel !== 'utxo')
|
|
78
|
+
fail(`fee model '${network.feeModel}' is not 'utxo'`);
|
|
79
|
+
const finality = network.finality;
|
|
80
|
+
if (finality.kind !== 'confirmations') {
|
|
81
|
+
fail(`finality '${finality.kind}' is not a UTXO policy (use 'confirmations')`);
|
|
82
|
+
}
|
|
83
|
+
const confirmations = finality.confirmations;
|
|
84
|
+
if (!Number.isSafeInteger(confirmations) || confirmations < 1) {
|
|
85
|
+
fail('finality.confirmations must be a safe integer >= 1');
|
|
86
|
+
}
|
|
87
|
+
const params = network.params ?? {};
|
|
88
|
+
const bech32 = params.bech32;
|
|
89
|
+
// 30 letters at most: a 32-byte witness program (p2tr, p2wsh) then fits in 90 characters.
|
|
90
|
+
if (typeof bech32 !== 'string' || !/^[a-z]{1,30}$/.test(bech32)) {
|
|
91
|
+
fail('params.bech32 must be a lowercase human-readable part of 1 to 30 letters');
|
|
92
|
+
}
|
|
93
|
+
const byte = (key) => {
|
|
94
|
+
const value = params[key];
|
|
95
|
+
if (!Number.isInteger(value) || value < 0 || value > 255) {
|
|
96
|
+
fail(`params.${key} must be a byte (0-255)`);
|
|
97
|
+
}
|
|
98
|
+
return value;
|
|
99
|
+
};
|
|
100
|
+
const pubKeyHash = byte('pubKeyHash');
|
|
101
|
+
const scriptHash = byte('scriptHash');
|
|
102
|
+
if (pubKeyHash === scriptHash)
|
|
103
|
+
fail('params.pubKeyHash and scriptHash must differ');
|
|
104
|
+
const rate = (source, key, where) => {
|
|
105
|
+
const value = source[key];
|
|
106
|
+
if (typeof value !== 'bigint' || value < 0n)
|
|
107
|
+
fail(`${where}.${key} must be a bigint >= 0`);
|
|
108
|
+
return value;
|
|
109
|
+
};
|
|
110
|
+
const dustRelayFee = rate(params, 'dustRelayFee', 'params');
|
|
111
|
+
const minRelayFee = rate(params, 'minRelayFee', 'params');
|
|
112
|
+
const incrementalRelayFee = rate(params, 'incrementalRelayFee', 'params');
|
|
113
|
+
const feeFallback = params.feeFallback === undefined ? undefined : rate(params, 'feeFallback', 'params');
|
|
114
|
+
for (const key of Object.keys(options)) {
|
|
115
|
+
// The accepted names, never the caller's key (it may be a pasted secret).
|
|
116
|
+
if (!OPTION_KEYS.has(key))
|
|
117
|
+
fail((0, names_1.unknownName)('option', OPTION_KEYS));
|
|
118
|
+
}
|
|
119
|
+
const merged = { ...exports.OPTION_DEFAULTS, ...options };
|
|
120
|
+
const maxFeeRate = rate(merged, 'maxFeeRate', 'options');
|
|
121
|
+
const maxFee = rate(merged, 'maxFee', 'options');
|
|
122
|
+
if (maxFeeRate < minRelayFee)
|
|
123
|
+
fail('options.maxFeeRate is below the minimum relay fee');
|
|
124
|
+
if (maxFee < 1n)
|
|
125
|
+
fail('options.maxFee must be at least 1 satoshi');
|
|
126
|
+
const maxEstimatedFeeRate = rate(merged, 'maxEstimatedFeeRate', 'options');
|
|
127
|
+
if (maxEstimatedFeeRate < minRelayFee) {
|
|
128
|
+
fail('options.maxEstimatedFeeRate is below the minimum relay fee');
|
|
129
|
+
}
|
|
130
|
+
if (typeof merged.nonWitnessUtxo !== 'boolean')
|
|
131
|
+
fail('options.nonWitnessUtxo must be a boolean');
|
|
132
|
+
const minInputConfirmations = merged.minInputConfirmations;
|
|
133
|
+
if (!Number.isSafeInteger(minInputConfirmations) || minInputConfirmations < 0) {
|
|
134
|
+
fail('options.minInputConfirmations must be a safe integer >= 0');
|
|
135
|
+
}
|
|
136
|
+
if (merged.coinSelection !== 'accumulative' && merged.coinSelection !== 'all') {
|
|
137
|
+
fail(`options.coinSelection must be 'accumulative' or 'all'`);
|
|
138
|
+
}
|
|
139
|
+
if (typeof merged.rbf !== 'boolean')
|
|
140
|
+
fail('options.rbf must be a boolean');
|
|
141
|
+
checkCapabilities(network, fail);
|
|
142
|
+
const capabilities = new Set(exports.UTXO_CAPABILITIES);
|
|
143
|
+
for (const c of network.capabilities?.add ?? [])
|
|
144
|
+
capabilities.add(c);
|
|
145
|
+
for (const c of network.capabilities?.remove ?? [])
|
|
146
|
+
capabilities.delete(c);
|
|
147
|
+
return {
|
|
148
|
+
genesisHash: identity,
|
|
149
|
+
address: { bech32: bech32, pubKeyHash, scriptHash },
|
|
150
|
+
confirmations: confirmations,
|
|
151
|
+
dustRelayFee,
|
|
152
|
+
minRelayFee,
|
|
153
|
+
incrementalRelayFee,
|
|
154
|
+
...(feeFallback !== undefined ? { feeFallback } : {}),
|
|
155
|
+
maxFeeRate,
|
|
156
|
+
maxFee,
|
|
157
|
+
maxEstimatedFeeRate,
|
|
158
|
+
nonWitnessUtxo: merged.nonWitnessUtxo,
|
|
159
|
+
minInputConfirmations,
|
|
160
|
+
coinSelection: merged.coinSelection,
|
|
161
|
+
rbf: merged.rbf,
|
|
162
|
+
capabilities,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/adapters/utxo/network.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What the UTXO driver needs from a network's registry entry and from the handle's\n * `options`, validated once when a driver is created, so bad data fails with\n * `CONFIG_INVALID` instead of misbehaving (every number is checked, and the finality\n * depth is a safe integer of at least 1).\n */\nimport { ConfigError } from '../../core/errors/error';\nimport { KNOWN_CAPABILITIES, type Capability } from '../../core/model/capability';\nimport type { ChainInfo, NetworkInfo } from '../../core/model/chain';\nimport { unknownName } from '../../core/util/names';\nimport type { AddressParams } from './types';\n\n/** Every capability of a UTXO network (the indexer is required). */\nexport const UTXO_CAPABILITIES: readonly Capability[] = Object.freeze([\n 'batch-transfer',\n 'replace-fee',\n 'cancel',\n 'block-scan',\n 'address-history',\n 'hd-public-derivation',\n]);\n\nexport type CoinSelectionStrategy = 'accumulative' | 'all';\n\nexport interface UtxoNetworkConfig {\n /** The genesis block hash: the endpoint identity. */\n readonly genesisHash: string;\n readonly address: AddressParams;\n /** Finality depth N: a block with N confirmations is final. */\n readonly confirmations: number;\n /** Relay policy, in sat/kvB. */\n readonly dustRelayFee: bigint;\n readonly minRelayFee: bigint;\n readonly incrementalRelayFee: bigint;\n /** The rate used when a test network's estimator has no data; `undefined` on mainnet. */\n readonly feeFallback?: bigint;\n /** Absurd-fee guard: the highest fee rate (sat/kvB) and absolute fee (sat) ever built. */\n readonly maxFeeRate: bigint;\n readonly maxFee: bigint;\n /**\n * The highest rate (sat/kvB) taken from an endpoint's estimate; above it the estimate\n * decides nothing. One endpoint's estimate sets a speed's rate, so it has a cap of its\n * own, lower than `maxFeeRate`, which alone bounds an explicit override.\n */\n readonly maxEstimatedFeeRate: bigint;\n /**\n * Carry each segwit v0 input's previous transaction in the PSBT, for hardware wallets\n * that demand it. A p2tr input never carries one.\n */\n readonly nonWitnessUtxo: boolean;\n /** Confirmations an output needs before coin selection spends it (0 allows unconfirmed). */\n readonly minInputConfirmations: number;\n readonly coinSelection: CoinSelectionStrategy;\n /** Signal BIP125 replaceability (`nSequence` 0xfffffffd) on every input. */\n readonly rbf: boolean;\n readonly capabilities: ReadonlySet<Capability>;\n}\n\n/** Library defaults for the handle `options`: library policy, not network facts. */\nexport const OPTION_DEFAULTS = Object.freeze({\n maxFeeRate: 1_000_000n, // 1,000 sat/vB\n maxFee: 10_000_000n, // 0.1 BTC, Bitcoin Core's -maxtxfee default\n maxEstimatedFeeRate: 200_000n, // 200 sat/vB\n nonWitnessUtxo: true,\n minInputConfirmations: 1,\n coinSelection: 'accumulative' as CoinSelectionStrategy,\n rbf: true,\n});\n\nconst OPTION_KEYS = new Set([\n 'maxFeeRate',\n 'maxFee',\n 'maxEstimatedFeeRate',\n 'nonWitnessUtxo',\n 'minInputConfirmations',\n 'coinSelection',\n 'rbf',\n]);\n\n/**\n * A network's capability overrides, checked against what the\n * UTXO driver serves. The handle advertises the manifest's capabilities plus `add`, minus\n * `remove`, and the core accepts what it advertises: `add: ['memo']` would make it take a\n * memo the builder cannot write (no OP_RETURN). So each name, added or removed, must be one\n * the driver serves, and a removal of anything else fails as the typo it likely is. The error\n * names a library capability, never a caller's unknown text, and lists the accepted names.\n */\nfunction checkCapabilities(network: NetworkInfo, fail: (reason: string) => never): void {\n const add: unknown = network.capabilities?.add ?? [];\n const remove: unknown = network.capabilities?.remove ?? [];\n if (!Array.isArray(add) || !Array.isArray(remove)) {\n fail('capabilities.add and capabilities.remove must be lists');\n }\n const serves = `the UTXO driver serves ${UTXO_CAPABILITIES.join(', ')}`;\n for (const [side, names] of [\n ['add', add],\n ['remove', remove],\n ] as const) {\n for (const name of names as readonly unknown[]) {\n if (UTXO_CAPABILITIES.includes(name as Capability)) continue;\n const known = (KNOWN_CAPABILITIES as readonly unknown[]).includes(name);\n fail(\n `capabilities.${side}: ${known ? `'${String(name)}' is not one` : 'an unknown name'}; ${serves}`,\n );\n }\n }\n}\n\nexport function utxoNetworkConfig(\n chain: ChainInfo,\n network: NetworkInfo,\n options: Readonly<Record<string, unknown>> = {},\n): UtxoNetworkConfig {\n const fail = (reason: string): never => {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `UTXO network ${chain.id}:${network.id}: ${reason}`,\n );\n };\n const identity = network.identity;\n if (identity === undefined || !/^[0-9a-f]{64}$/.test(identity)) {\n fail('its identity must be the genesis block hash (64 lowercase hex digits)');\n }\n if (network.feeModel !== 'utxo') fail(`fee model '${network.feeModel}' is not 'utxo'`);\n const finality = network.finality;\n if (finality.kind !== 'confirmations') {\n fail(`finality '${finality.kind}' is not a UTXO policy (use 'confirmations')`);\n }\n const confirmations = (finality as { confirmations: unknown }).confirmations;\n if (!Number.isSafeInteger(confirmations) || (confirmations as number) < 1) {\n fail('finality.confirmations must be a safe integer >= 1');\n }\n const params = network.params ?? {};\n const bech32 = params.bech32;\n // 30 letters at most: a 32-byte witness program (p2tr, p2wsh) then fits in 90 characters.\n if (typeof bech32 !== 'string' || !/^[a-z]{1,30}$/.test(bech32)) {\n fail('params.bech32 must be a lowercase human-readable part of 1 to 30 letters');\n }\n const byte = (key: string): number => {\n const value = params[key];\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > 255) {\n fail(`params.${key} must be a byte (0-255)`);\n }\n return value as number;\n };\n const pubKeyHash = byte('pubKeyHash');\n const scriptHash = byte('scriptHash');\n if (pubKeyHash === scriptHash) fail('params.pubKeyHash and scriptHash must differ');\n const rate = (\n source: Readonly<Record<string, unknown>>,\n key: string,\n where: string,\n ) => {\n const value = source[key];\n if (typeof value !== 'bigint' || value < 0n)\n fail(`${where}.${key} must be a bigint >= 0`);\n return value as bigint;\n };\n const dustRelayFee = rate(params, 'dustRelayFee', 'params');\n const minRelayFee = rate(params, 'minRelayFee', 'params');\n const incrementalRelayFee = rate(params, 'incrementalRelayFee', 'params');\n const feeFallback =\n params.feeFallback === undefined ? undefined : rate(params, 'feeFallback', 'params');\n\n for (const key of Object.keys(options)) {\n // The accepted names, never the caller's key (it may be a pasted secret).\n if (!OPTION_KEYS.has(key)) fail(unknownName('option', OPTION_KEYS));\n }\n const merged = { ...OPTION_DEFAULTS, ...options };\n const maxFeeRate = rate(merged, 'maxFeeRate', 'options');\n const maxFee = rate(merged, 'maxFee', 'options');\n if (maxFeeRate < minRelayFee) fail('options.maxFeeRate is below the minimum relay fee');\n if (maxFee < 1n) fail('options.maxFee must be at least 1 satoshi');\n const maxEstimatedFeeRate = rate(merged, 'maxEstimatedFeeRate', 'options');\n if (maxEstimatedFeeRate < minRelayFee) {\n fail('options.maxEstimatedFeeRate is below the minimum relay fee');\n }\n if (typeof merged.nonWitnessUtxo !== 'boolean')\n fail('options.nonWitnessUtxo must be a boolean');\n const minInputConfirmations = merged.minInputConfirmations;\n if (!Number.isSafeInteger(minInputConfirmations) || minInputConfirmations < 0) {\n fail('options.minInputConfirmations must be a safe integer >= 0');\n }\n if (merged.coinSelection !== 'accumulative' && merged.coinSelection !== 'all') {\n fail(`options.coinSelection must be 'accumulative' or 'all'`);\n }\n if (typeof merged.rbf !== 'boolean') fail('options.rbf must be a boolean');\n\n checkCapabilities(network, fail);\n const capabilities = new Set<Capability>(UTXO_CAPABILITIES);\n for (const c of network.capabilities?.add ?? []) capabilities.add(c);\n for (const c of network.capabilities?.remove ?? []) capabilities.delete(c);\n return {\n genesisHash: identity as string,\n address: { bech32: bech32 as string, pubKeyHash, scriptHash },\n confirmations: confirmations as number,\n dustRelayFee,\n minRelayFee,\n incrementalRelayFee,\n ...(feeFallback !== undefined ? { feeFallback } : {}),\n maxFeeRate,\n maxFee,\n maxEstimatedFeeRate,\n nonWitnessUtxo: merged.nonWitnessUtxo,\n minInputConfirmations,\n coinSelection: merged.coinSelection,\n rbf: merged.rbf,\n capabilities,\n };\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The UTXO family plugin (SDK-free): the Bitcoin chain, the Esplora presets and the
|
|
3
|
+
* bitcoinjs-lib manifest. Only `load()` pulls in the driver module and, with it, the SDK.
|
|
4
|
+
*/
|
|
5
|
+
import type { AdapterManifest, PeerDependency } from '../../core/driver/types';
|
|
6
|
+
import type { Plugin } from '../../core/registry/plugin';
|
|
7
|
+
/** Keyed by library name, as in every family; each manifest lists only its own. */
|
|
8
|
+
export declare const UTXO_PEER_DEPENDENCIES: Readonly<Record<'bitcoinjs-lib', PeerDependency>>;
|
|
9
|
+
/**
|
|
10
|
+
* The `bitcoinjs-lib` manifest. Built once, at module level, like the presets, so every
|
|
11
|
+
* `utxoPlugin()` carries the same `load` function and registering it again is the same
|
|
12
|
+
* plugin, a no-op: the registry compares functions by identity, and a different plugin
|
|
13
|
+
* under a registered name is `CONFIG_INVALID`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const utxoManifest: AdapterManifest;
|
|
16
|
+
/** The built-in UTXO family: chain `bitcoin` with mainnet, testnet, testnet4, signet and regtest. */
|
|
17
|
+
export declare function utxoPlugin(): Plugin;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.utxoManifest = exports.UTXO_PEER_DEPENDENCIES = void 0;
|
|
4
|
+
exports.utxoPlugin = utxoPlugin;
|
|
5
|
+
const chains_1 = require("./chains");
|
|
6
|
+
const network_1 = require("./network");
|
|
7
|
+
const presets_1 = require("./presets");
|
|
8
|
+
/** Keyed by library name, as in every family; each manifest lists only its own. */
|
|
9
|
+
exports.UTXO_PEER_DEPENDENCIES = Object.freeze({
|
|
10
|
+
'bitcoinjs-lib': Object.freeze({ name: 'bitcoinjs-lib', range: '^7.0.2' }),
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* The `bitcoinjs-lib` manifest. Built once, at module level, like the presets, so every
|
|
14
|
+
* `utxoPlugin()` carries the same `load` function and registering it again is the same
|
|
15
|
+
* plugin, a no-op: the registry compares functions by identity, and a different plugin
|
|
16
|
+
* under a registered name is `CONFIG_INVALID`.
|
|
17
|
+
*/
|
|
18
|
+
exports.utxoManifest = Object.freeze({
|
|
19
|
+
family: 'utxo',
|
|
20
|
+
library: 'bitcoinjs-lib',
|
|
21
|
+
chains: Object.freeze(['bitcoin']),
|
|
22
|
+
capabilities: network_1.UTXO_CAPABILITIES,
|
|
23
|
+
// Esplora is the only data source; the core refuses a handle without one.
|
|
24
|
+
requiresIndexer: true,
|
|
25
|
+
peerDependencies: Object.freeze([exports.UTXO_PEER_DEPENDENCIES['bitcoinjs-lib']]),
|
|
26
|
+
load: async () => {
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
28
|
+
const mod = require('./driver');
|
|
29
|
+
return mod.utxoDriverFactory;
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
/** The built-in UTXO family: chain `bitcoin` with mainnet, testnet, testnet4, signet and regtest. */
|
|
33
|
+
function utxoPlugin() {
|
|
34
|
+
return {
|
|
35
|
+
name: 'utxo',
|
|
36
|
+
chains: [chains_1.BITCOIN_CHAIN],
|
|
37
|
+
adapters: [exports.utxoManifest],
|
|
38
|
+
presets: presets_1.UTXO_PRESETS,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/adapters/utxo/plugin.ts"],"names":[],"mappings":";;;AA0CA,gCAOC;AAvCD,qCAAyC;AACzC,uCAA8C;AAC9C,uCAAyC;AAEzC,mFAAmF;AACtE,QAAA,sBAAsB,GACjC,MAAM,CAAC,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;CAC3E,CAAC,CAAC;AAEL;;;;;GAKG;AACU,QAAA,YAAY,GAAoB,MAAM,CAAC,MAAM,CAAC;IACzD,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;IAClC,YAAY,EAAE,2BAAiB;IAC/B,0EAA0E;IAC1E,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,8BAAsB,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1E,IAAI,EAAE,KAAK,IAA4B,EAAE;QACvC,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAA8B,CAAC;QAC7D,OAAO,GAAG,CAAC,iBAAiB,CAAC;IAC/B,CAAC;CACF,CAAC,CAAC;AAEH,qGAAqG;AACrG,SAAgB,UAAU;IACxB,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,CAAC,sBAAa,CAAC;QACvB,QAAQ,EAAE,CAAC,oBAAY,CAAC;QACxB,OAAO,EAAE,sBAAY;KACtB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * The UTXO family plugin (SDK-free): the Bitcoin chain, the Esplora presets and the\n * bitcoinjs-lib manifest. Only `load()` pulls in the driver module and, with it, the SDK.\n */\nimport type {\n AdapterManifest,\n DriverFactory,\n PeerDependency,\n} from '../../core/driver/types';\nimport type { Plugin } from '../../core/registry/plugin';\nimport { BITCOIN_CHAIN } from './chains';\nimport { UTXO_CAPABILITIES } from './network';\nimport { UTXO_PRESETS } from './presets';\n\n/** Keyed by library name, as in every family; each manifest lists only its own. */\nexport const UTXO_PEER_DEPENDENCIES: Readonly<Record<'bitcoinjs-lib', PeerDependency>> =\n Object.freeze({\n 'bitcoinjs-lib': Object.freeze({ name: 'bitcoinjs-lib', range: '^7.0.2' }),\n });\n\n/**\n * The `bitcoinjs-lib` manifest. Built once, at module level, like the presets, so every\n * `utxoPlugin()` carries the same `load` function and registering it again is the same\n * plugin, a no-op: the registry compares functions by identity, and a different plugin\n * under a registered name is `CONFIG_INVALID`.\n */\nexport const utxoManifest: AdapterManifest = Object.freeze({\n family: 'utxo',\n library: 'bitcoinjs-lib',\n chains: Object.freeze(['bitcoin']),\n capabilities: UTXO_CAPABILITIES,\n // Esplora is the only data source; the core refuses a handle without one.\n requiresIndexer: true,\n peerDependencies: Object.freeze([UTXO_PEER_DEPENDENCIES['bitcoinjs-lib']]),\n load: async (): Promise<DriverFactory> => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require('./driver') as typeof import('./driver');\n return mod.utxoDriverFactory;\n },\n});\n\n/** The built-in UTXO family: chain `bitcoin` with mainnet, testnet, testnet4, signet and regtest. */\nexport function utxoPlugin(): Plugin {\n return {\n name: 'utxo',\n chains: [BITCOIN_CHAIN],\n adapters: [utxoManifest],\n presets: UTXO_PRESETS,\n };\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Esplora provider presets. Each is registered twice, as an `rpc` provider
|
|
3
|
+
* (blocks, transactions, broadcasts, proofs, fee estimates) and as an `indexer` (address
|
|
4
|
+
* UTXOs, balances, history), because the core requires an `rpc` provider and the UTXO
|
|
5
|
+
* manifest `requiresIndexer`. Only base URLs verified against the operators' own sources
|
|
6
|
+
* are listed (Blockstream's `esplora/API.md` and live answers; mempool.space's frontend
|
|
7
|
+
* source); a preset refuses every other network with `CONFIG_INVALID`.
|
|
8
|
+
* Both services are free and rate limited, so they are marked `production: false`: for
|
|
9
|
+
* production, run your own Esplora and configure it as `{ endpoints: [...] }`.
|
|
10
|
+
*/
|
|
11
|
+
import type { ProviderPreset } from '../../core/registry/providers';
|
|
12
|
+
export declare const UTXO_PRESETS: readonly ProviderPreset[];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UTXO_PRESETS = void 0;
|
|
4
|
+
/** blockstream.info: mainnet, testnet (v3) and signet. */
|
|
5
|
+
const BLOCKSTREAM = Object.freeze({
|
|
6
|
+
mainnet: 'https://blockstream.info/api',
|
|
7
|
+
testnet: 'https://blockstream.info/testnet/api',
|
|
8
|
+
signet: 'https://blockstream.info/signet/api',
|
|
9
|
+
});
|
|
10
|
+
/** mempool.space: mainnet, testnet (v3), testnet4 and signet. */
|
|
11
|
+
const MEMPOOL = Object.freeze({
|
|
12
|
+
mainnet: 'https://mempool.space/api',
|
|
13
|
+
testnet: 'https://mempool.space/testnet/api',
|
|
14
|
+
testnet4: 'https://mempool.space/testnet4/api',
|
|
15
|
+
signet: 'https://mempool.space/signet/api',
|
|
16
|
+
});
|
|
17
|
+
/** Own keys only: `table['toString']` would find `Object.prototype`'s. */
|
|
18
|
+
function has(table, network) {
|
|
19
|
+
return Object.hasOwn(table, network);
|
|
20
|
+
}
|
|
21
|
+
function url(table, network) {
|
|
22
|
+
// Unreachable through the catalog, which asks `supports` first.
|
|
23
|
+
if (!has(table, network))
|
|
24
|
+
throw new Error(`no entry for bitcoin:${network}`);
|
|
25
|
+
return table[network];
|
|
26
|
+
}
|
|
27
|
+
function presets(name, endpoints, supports) {
|
|
28
|
+
return ['rpc', 'indexer'].map((kind) => Object.freeze({
|
|
29
|
+
name,
|
|
30
|
+
kind,
|
|
31
|
+
production: false,
|
|
32
|
+
supports: (chain, network) => chain === 'bitcoin' && supports(network),
|
|
33
|
+
endpoints: (input) => endpoints(input.network),
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
exports.UTXO_PRESETS = Object.freeze([
|
|
37
|
+
...presets('blockstream', (network) => [{ name: 'blockstream', url: url(BLOCKSTREAM, network) }], (network) => has(BLOCKSTREAM, network)),
|
|
38
|
+
...presets('mempool', (network) => [{ name: 'mempool', url: url(MEMPOOL, network) }], (network) => has(MEMPOOL, network)),
|
|
39
|
+
// The fallback when a handle names no provider: both services, mempool.space first.
|
|
40
|
+
...presets('public', (network) => [
|
|
41
|
+
{ name: 'mempool', url: url(MEMPOOL, network), priority: 0 },
|
|
42
|
+
...(has(BLOCKSTREAM, network)
|
|
43
|
+
? [{ name: 'blockstream', url: url(BLOCKSTREAM, network), priority: 1 }]
|
|
44
|
+
: []),
|
|
45
|
+
], (network) => has(MEMPOOL, network)),
|
|
46
|
+
]);
|
|
47
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/adapters/utxo/presets.ts"],"names":[],"mappings":";;;AAeA,0DAA0D;AAC1D,MAAM,WAAW,GAAU,MAAM,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,8BAA8B;IACvC,OAAO,EAAE,sCAAsC;IAC/C,MAAM,EAAE,qCAAqC;CAC9C,CAAC,CAAC;AAEH,iEAAiE;AACjE,MAAM,OAAO,GAAU,MAAM,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,2BAA2B;IACpC,OAAO,EAAE,mCAAmC;IAC5C,QAAQ,EAAE,oCAAoC;IAC9C,MAAM,EAAE,kCAAkC;CAC3C,CAAC,CAAC;AAEH,0EAA0E;AAC1E,SAAS,GAAG,CAAC,KAAY,EAAE,OAAe;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,GAAG,CAAC,KAAY,EAAE,OAAe;IACxC,gEAAgE;IAChE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC,OAAO,CAAW,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CACd,IAAY,EACZ,SAAyD,EACzD,QAAsC;IAEtC,OAAQ,CAAC,KAAK,EAAE,SAAS,CAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAChD,MAAM,CAAC,MAAM,CAAiB;QAC5B,IAAI;QACJ,IAAI;QACJ,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,CAAC,KAAa,EAAE,OAAe,EAAE,EAAE,CAC3C,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC;QAC1C,SAAS,EAAE,CAAC,KAAkB,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;KAC5D,CAAC,CACH,CAAC;AACJ,CAAC;AAEY,QAAA,YAAY,GAA8B,MAAM,CAAC,MAAM,CAAC;IACnE,GAAG,OAAO,CACR,aAAa,EACb,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,EACtE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CACvC;IACD,GAAG,OAAO,CACR,SAAS,EACT,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,EAC9D,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CACnC;IACD,oFAAoF;IACpF,GAAG,OAAO,CACR,QAAQ,EACR,CAAC,OAAO,EAAE,EAAE,CAAC;QACX,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC5D,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC;YAC3B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACxE,CAAC,CAAC,EAAE,CAAC;KACR,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CACnC;CACF,CAAC,CAAC","sourcesContent":["/**\n * Esplora provider presets. Each is registered twice, as an `rpc` provider\n * (blocks, transactions, broadcasts, proofs, fee estimates) and as an `indexer` (address\n * UTXOs, balances, history), because the core requires an `rpc` provider and the UTXO\n * manifest `requiresIndexer`. Only base URLs verified against the operators' own sources\n * are listed (Blockstream's `esplora/API.md` and live answers; mempool.space's frontend\n * source); a preset refuses every other network with `CONFIG_INVALID`.\n * Both services are free and rate limited, so they are marked `production: false`: for\n * production, run your own Esplora and configure it as `{ endpoints: [...] }`.\n */\nimport type { PresetInput, ProviderPreset } from '../../core/registry/providers';\nimport type { EndpointConfig } from '../../core/transport/types';\n\ntype Table = Readonly<Record<string, string>>;\n\n/** blockstream.info: mainnet, testnet (v3) and signet. */\nconst BLOCKSTREAM: Table = Object.freeze({\n mainnet: 'https://blockstream.info/api',\n testnet: 'https://blockstream.info/testnet/api',\n signet: 'https://blockstream.info/signet/api',\n});\n\n/** mempool.space: mainnet, testnet (v3), testnet4 and signet. */\nconst MEMPOOL: Table = Object.freeze({\n mainnet: 'https://mempool.space/api',\n testnet: 'https://mempool.space/testnet/api',\n testnet4: 'https://mempool.space/testnet4/api',\n signet: 'https://mempool.space/signet/api',\n});\n\n/** Own keys only: `table['toString']` would find `Object.prototype`'s. */\nfunction has(table: Table, network: string): boolean {\n return Object.hasOwn(table, network);\n}\n\nfunction url(table: Table, network: string): string {\n // Unreachable through the catalog, which asks `supports` first.\n if (!has(table, network)) throw new Error(`no entry for bitcoin:${network}`);\n return table[network] as string;\n}\n\nfunction presets(\n name: string,\n endpoints: (network: string) => readonly EndpointConfig[],\n supports: (network: string) => boolean,\n): ProviderPreset[] {\n return (['rpc', 'indexer'] as const).map((kind) =>\n Object.freeze<ProviderPreset>({\n name,\n kind,\n production: false,\n supports: (chain: string, network: string) =>\n chain === 'bitcoin' && supports(network),\n endpoints: (input: PresetInput) => endpoints(input.network),\n }),\n );\n}\n\nexport const UTXO_PRESETS: readonly ProviderPreset[] = Object.freeze([\n ...presets(\n 'blockstream',\n (network) => [{ name: 'blockstream', url: url(BLOCKSTREAM, network) }],\n (network) => has(BLOCKSTREAM, network),\n ),\n ...presets(\n 'mempool',\n (network) => [{ name: 'mempool', url: url(MEMPOOL, network) }],\n (network) => has(MEMPOOL, network),\n ),\n // The fallback when a handle names no provider: both services, mempool.space first.\n ...presets(\n 'public',\n (network) => [\n { name: 'mempool', url: url(MEMPOOL, network), priority: 0 },\n ...(has(BLOCKSTREAM, network)\n ? [{ name: 'blockstream', url: url(BLOCKSTREAM, network), priority: 1 }]\n : []),\n ],\n (network) => has(MEMPOOL, network),\n ),\n]);\n"]}
|