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,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bitcoin = void 0;
|
|
4
|
+
exports.useNobleEcc = useNobleEcc;
|
|
5
|
+
const ecc_1 = require("./ecc");
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
7
|
+
exports.bitcoin = require('bitcoinjs-lib');
|
|
8
|
+
/**
|
|
9
|
+
* Installs the `@noble/curves` backend (no WASM, no tiny-secp256k1). bitcoinjs
|
|
10
|
+
* verifies it against its own test vectors the first time, and skips a repeat install of
|
|
11
|
+
* the same object, so calling this before every taproot use is cheap and undoes a
|
|
12
|
+
* `native()` caller who swapped the library-global backend.
|
|
13
|
+
*/
|
|
14
|
+
function useNobleEcc() {
|
|
15
|
+
exports.bitcoin.initEccLib(ecc_1.nobleEcc);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../../src/adapters/utxo/sdk.ts"],"names":[],"mappings":";;;AAsBA,kCAEC;AAjBD,+BAAiC;AAEjC,iEAAiE;AACpD,QAAA,OAAO,GAAG,OAAO,CAAC,eAAe,CAAmB,CAAC;AAMlE;;;;;GAKG;AACH,SAAgB,WAAW;IACzB,eAAO,CAAC,UAAU,CAAC,cAAQ,CAAC,CAAC;AAC/B,CAAC","sourcesContent":["/**\n * The one place that loads bitcoinjs-lib. Its 7.x package is an ES module with a CommonJS\n * build (`require` condition), so this CommonJS library `require()`s it at run time and\n * takes its types with `resolution-mode: 'import'` (TypeScript refuses a plain CommonJS\n * import of an ES module's types, TS1479). Loaded only through the manifest's `load()`.\n */\nimport type * as Bitcoin from 'bitcoinjs-lib' with { 'resolution-mode': 'import' };\nimport { nobleEcc } from './ecc';\n\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nexport const bitcoin = require('bitcoinjs-lib') as typeof Bitcoin;\n\nexport type Network = Bitcoin.Network;\nexport type Psbt = Bitcoin.Psbt;\nexport type Transaction = Bitcoin.Transaction;\n\n/**\n * Installs the `@noble/curves` backend (no WASM, no tiny-secp256k1). bitcoinjs\n * verifies it against its own test vectors the first time, and skips a repeat install of\n * the same object, so calling this before every taproot use is cheap and undoes a\n * `native()` caller who swapped the library-global backend.\n */\nexport function useNobleEcc(): void {\n bitcoin.initEccLib(nobleEcc);\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reader of a PSBT signed elsewhere: a cold signer's or a coordinator's copy of our
|
|
3
|
+
* PSBT is untrusted input. It is capped before decoding and parsed strictly. What could
|
|
4
|
+
* change the spend is refused: another unsigned transaction, a changed previous output,
|
|
5
|
+
* redeem script or internal key, an input script path, or a foreign, cross-scheme or
|
|
6
|
+
* other-sighash signature. What cannot change it is ignored: key origins, the output
|
|
7
|
+
* scripts a coordinator adds for change detection, proprietary keys and PSBT version 0.
|
|
8
|
+
* Only signature bytes are taken, and the core verifies them against the stored requests.
|
|
9
|
+
* Every refusal is `ValidationError('INVALID_INTENT')` with a fixed text. Synchronous and
|
|
10
|
+
* I/O-free.
|
|
11
|
+
*/
|
|
12
|
+
import { ValidationError } from '../../core/errors/error';
|
|
13
|
+
import { type Network, type Psbt } from './sdk';
|
|
14
|
+
export declare const SIGHASH_ALL = 1;
|
|
15
|
+
export declare const SIGHASH_DEFAULT = 0;
|
|
16
|
+
export type PsbtInput = Psbt['data']['inputs'][number];
|
|
17
|
+
export declare const signedPsbtError: (reason: string) => ValidationError;
|
|
18
|
+
/**
|
|
19
|
+
* A PSBT signed elsewhere, parsed strictly: capped before decoding, ASCII
|
|
20
|
+
* whitespace trimmed at the ends, canonical base64 (the SDK's decoder skips junk), and no
|
|
21
|
+
* bytes after its maps.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseSigned(text: string, stored: Psbt, storedBase64: string, network: Network): Psbt;
|
|
24
|
+
/**
|
|
25
|
+
* Every field of a signed copy whose unsigned transaction is already ours: the global map,
|
|
26
|
+
* each output and each input (see the allowlists and `assertUnchanged`).
|
|
27
|
+
*/
|
|
28
|
+
export declare function assertSignedFields(signed: Psbt, stored: Psbt): void;
|
|
29
|
+
/** p2tr: the key-path signature (BIP341, SIGHASH_DEFAULT, 64 bytes), partial or final. */
|
|
30
|
+
export declare function schnorrSignatureOf(input: PsbtInput): Uint8Array | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* ECDSA: the signature of `publicKey` (strict DER, SIGHASH_ALL, returned as 64-byte r‖s),
|
|
33
|
+
* partial or final: `<sig> <key>` in the scriptSig for p2pkh; in the witness for segwit v0,
|
|
34
|
+
* whose scriptSig is empty or, for p2sh-p2wpkh, the push of our redeem script.
|
|
35
|
+
*/
|
|
36
|
+
export declare function ecdsaSignatureOf(publicKey: Uint8Array, input: PsbtInput, stored: PsbtInput): Uint8Array | undefined;
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.signedPsbtError = exports.SIGHASH_DEFAULT = exports.SIGHASH_ALL = void 0;
|
|
4
|
+
exports.parseSigned = parseSigned;
|
|
5
|
+
exports.assertSignedFields = assertSignedFields;
|
|
6
|
+
exports.schnorrSignatureOf = schnorrSignatureOf;
|
|
7
|
+
exports.ecdsaSignatureOf = ecdsaSignatureOf;
|
|
8
|
+
/**
|
|
9
|
+
* The reader of a PSBT signed elsewhere: a cold signer's or a coordinator's copy of our
|
|
10
|
+
* PSBT is untrusted input. It is capped before decoding and parsed strictly. What could
|
|
11
|
+
* change the spend is refused: another unsigned transaction, a changed previous output,
|
|
12
|
+
* redeem script or internal key, an input script path, or a foreign, cross-scheme or
|
|
13
|
+
* other-sighash signature. What cannot change it is ignored: key origins, the output
|
|
14
|
+
* scripts a coordinator adds for change detection, proprietary keys and PSBT version 0.
|
|
15
|
+
* Only signature bytes are taken, and the core verifies them against the stored requests.
|
|
16
|
+
* Every refusal is `ValidationError('INVALID_INTENT')` with a fixed text. Synchronous and
|
|
17
|
+
* I/O-free.
|
|
18
|
+
*/
|
|
19
|
+
const error_1 = require("../../core/errors/error");
|
|
20
|
+
const bytes_1 = require("../../core/util/bytes");
|
|
21
|
+
const rawtx_1 = require("./rawtx");
|
|
22
|
+
const sdk_1 = require("./sdk");
|
|
23
|
+
exports.SIGHASH_ALL = 0x01;
|
|
24
|
+
exports.SIGHASH_DEFAULT = 0x00;
|
|
25
|
+
const signedPsbtError = (reason) => new error_1.ValidationError('INVALID_INTENT', `the signed PSBT ${reason}`);
|
|
26
|
+
exports.signedPsbtError = signedPsbtError;
|
|
27
|
+
const sighashError = (expected) => (0, exports.signedPsbtError)(`uses a sighash type other than ${expected}`);
|
|
28
|
+
const shapeError = () => (0, exports.signedPsbtError)('carries a final script of another shape');
|
|
29
|
+
const fieldError = () => (0, exports.signedPsbtError)('carries a field a signer does not add');
|
|
30
|
+
const changedError = () => (0, exports.signedPsbtError)('changes the prepared transaction');
|
|
31
|
+
/**
|
|
32
|
+
* What a signer may add to each map of our PSBT (signatures, final scripts, a sighash type,
|
|
33
|
+
* key origins, change-output scripts, proprietary keys): well under 1 KiB per input for one
|
|
34
|
+
* key. A larger PSBT is not a signed copy of ours, and is refused before it is decoded.
|
|
35
|
+
*/
|
|
36
|
+
const SIGNED_GROWTH_PER_MAP = 4_096;
|
|
37
|
+
/**
|
|
38
|
+
* Room for the previous transaction a coordinator may add to a non-taproot input of ours
|
|
39
|
+
* that lacks one (`nonWitnessUtxo` off): a standard transaction's largest stripped size
|
|
40
|
+
* (`MAX_STANDARD_TX_WEIGHT` / 4).
|
|
41
|
+
*/
|
|
42
|
+
const ADDED_PREVIOUS_TX = 100_000;
|
|
43
|
+
/**
|
|
44
|
+
* What coordinators may add in all, whatever the number of inputs: one block (Bitcoin
|
|
45
|
+
* Core's `MAX_BLOCK_SERIALIZED_SIZE`), so the decoding it costs stays bounded. Unbounded,
|
|
46
|
+
* 160 inputs with `nonWitnessUtxo` off took 8 s of synchronous decoding.
|
|
47
|
+
*/
|
|
48
|
+
const ADDED_PREVIOUS_TXS = 4_000_000;
|
|
49
|
+
/** BIP174 key types a signed copy may carry but we never read. */
|
|
50
|
+
const PROPRIETARY = 0xfc;
|
|
51
|
+
const GLOBAL_VERSION = 0xfb;
|
|
52
|
+
/** Key origins (BIP32 derivations), which a signer or a coordinator may add. */
|
|
53
|
+
const KEY_ORIGINS = ['bip32Derivation', 'tapBip32Derivation'];
|
|
54
|
+
/**
|
|
55
|
+
* The fields a signed copy of our PSBT may carry. `unknownKeyVals` holds every key bip174
|
|
56
|
+
* does not know, and only proprietary keys (and, globally, version 0) may be among them.
|
|
57
|
+
*/
|
|
58
|
+
const SIGNED_GLOBAL_FIELDS = new Set([
|
|
59
|
+
'unsignedTx',
|
|
60
|
+
'globalXpub',
|
|
61
|
+
'unknownKeyVals',
|
|
62
|
+
]);
|
|
63
|
+
/**
|
|
64
|
+
* Per input: signatures, final scripts, a sighash type, key origins, and our own fields
|
|
65
|
+
* unchanged (or a verified previous transaction). The script-path fields (`witnessScript`,
|
|
66
|
+
* `tapLeafScript`, `tapScriptSig`, `tapMerkleRoot`) and `porCommitment` are refused.
|
|
67
|
+
*/
|
|
68
|
+
const SIGNED_INPUT_FIELDS = new Set([
|
|
69
|
+
...KEY_ORIGINS,
|
|
70
|
+
'partialSig',
|
|
71
|
+
'tapKeySig',
|
|
72
|
+
'finalScriptSig',
|
|
73
|
+
'finalScriptWitness',
|
|
74
|
+
'sighashType',
|
|
75
|
+
'witnessUtxo',
|
|
76
|
+
'nonWitnessUtxo',
|
|
77
|
+
'redeemScript',
|
|
78
|
+
'tapInternalKey',
|
|
79
|
+
'unknownKeyVals',
|
|
80
|
+
]);
|
|
81
|
+
/**
|
|
82
|
+
* Per output: key origins and the scripts Core's `UpdatePSBTOutput` adds so a hardware
|
|
83
|
+
* wallet recognizes change. None is read: the outputs are fixed by the unsigned transaction.
|
|
84
|
+
*/
|
|
85
|
+
const SIGNED_OUTPUT_FIELDS = new Set([
|
|
86
|
+
...KEY_ORIGINS,
|
|
87
|
+
'redeemScript',
|
|
88
|
+
'witnessScript',
|
|
89
|
+
'tapInternalKey',
|
|
90
|
+
'tapTree',
|
|
91
|
+
'unknownKeyVals',
|
|
92
|
+
]);
|
|
93
|
+
/** Our taproot inputs carry their internal key (`buildTx`). */
|
|
94
|
+
const isTaproot = (stored) => stored.tapInternalKey !== undefined;
|
|
95
|
+
/** ASCII whitespace (C `isspace`), trimmed at both ends of a pasted or file-read PSBT. */
|
|
96
|
+
const ASCII_SPACE = new Set([0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x20]);
|
|
97
|
+
function trimAsciiSpace(text) {
|
|
98
|
+
let start = 0;
|
|
99
|
+
let end = text.length;
|
|
100
|
+
while (start < end && ASCII_SPACE.has(text.charCodeAt(start)))
|
|
101
|
+
start++;
|
|
102
|
+
while (end > start && ASCII_SPACE.has(text.charCodeAt(end - 1)))
|
|
103
|
+
end--;
|
|
104
|
+
return text.slice(start, end);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Whether PSBT bytes end right after their maps (BIP174: the global map, then one per input
|
|
108
|
+
* and one per output), with every key and value length a minimal CompactSize inside the
|
|
109
|
+
* bytes. bip174 ignores whatever follows the last map.
|
|
110
|
+
*/
|
|
111
|
+
function endsAfterMaps(bytes, maps) {
|
|
112
|
+
let offset = 5; // the magic `psbt` and 0xff, which the parser has checked
|
|
113
|
+
const length = () => {
|
|
114
|
+
const first = bytes[offset];
|
|
115
|
+
if (first === undefined)
|
|
116
|
+
return undefined;
|
|
117
|
+
const width = first < 0xfd ? 0 : first === 0xfd ? 2 : first === 0xfe ? 4 : 8;
|
|
118
|
+
if (offset + 1 + width > bytes.length)
|
|
119
|
+
return undefined;
|
|
120
|
+
let value = width === 0 ? first : 0;
|
|
121
|
+
for (let i = width; i >= 1; i--)
|
|
122
|
+
value = value * 256 + bytes[offset + i];
|
|
123
|
+
offset += 1 + width;
|
|
124
|
+
const least = width === 0 ? 0 : width === 2 ? 0xfd : width === 4 ? 0x1_0000 : 2 ** 32;
|
|
125
|
+
return value < least ? undefined : value;
|
|
126
|
+
};
|
|
127
|
+
for (let map = 0; map < maps; map++) {
|
|
128
|
+
for (;;) {
|
|
129
|
+
const keyLength = length();
|
|
130
|
+
if (keyLength === undefined)
|
|
131
|
+
return false;
|
|
132
|
+
if (keyLength === 0)
|
|
133
|
+
break;
|
|
134
|
+
offset += keyLength;
|
|
135
|
+
const valueLength = length();
|
|
136
|
+
if (valueLength === undefined)
|
|
137
|
+
return false;
|
|
138
|
+
offset += valueLength;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return offset === bytes.length;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The value of the global map's `PSBT_GLOBAL_UNSIGNED_TX` (key `0x00`) of PSBT bytes, read
|
|
145
|
+
* without decoding it; `undefined` when the magic or the global map is malformed, or it has
|
|
146
|
+
* no such key.
|
|
147
|
+
*/
|
|
148
|
+
function globalUnsignedTx(bytes) {
|
|
149
|
+
const magic = [0x70, 0x73, 0x62, 0x74, 0xff];
|
|
150
|
+
if (!magic.every((byte, index) => bytes[index] === byte))
|
|
151
|
+
return undefined;
|
|
152
|
+
let offset = 5;
|
|
153
|
+
const length = () => {
|
|
154
|
+
const first = bytes[offset];
|
|
155
|
+
if (first === undefined)
|
|
156
|
+
return undefined;
|
|
157
|
+
const width = first < 0xfd ? 0 : first === 0xfd ? 2 : first === 0xfe ? 4 : 8;
|
|
158
|
+
if (offset + 1 + width > bytes.length)
|
|
159
|
+
return undefined;
|
|
160
|
+
let value = width === 0 ? first : 0;
|
|
161
|
+
for (let i = width; i >= 1; i--)
|
|
162
|
+
value = value * 256 + bytes[offset + i];
|
|
163
|
+
offset += 1 + width;
|
|
164
|
+
return value;
|
|
165
|
+
};
|
|
166
|
+
for (;;) {
|
|
167
|
+
const keyLength = length();
|
|
168
|
+
if (keyLength === undefined || offset + keyLength > bytes.length)
|
|
169
|
+
return undefined;
|
|
170
|
+
if (keyLength === 0)
|
|
171
|
+
return undefined; // the end of the global map: no unsigned tx
|
|
172
|
+
const unsignedKey = keyLength === 1 && bytes[offset] === 0x00;
|
|
173
|
+
offset += keyLength;
|
|
174
|
+
const valueLength = length();
|
|
175
|
+
if (valueLength === undefined || offset + valueLength > bytes.length)
|
|
176
|
+
return undefined;
|
|
177
|
+
if (unsignedKey)
|
|
178
|
+
return bytes.subarray(offset, offset + valueLength);
|
|
179
|
+
offset += valueLength;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Canonical base64 (the standard alphabet, padded), or `undefined`. Node's decoder is
|
|
184
|
+
* linear and far faster than a pure-JS one (a few milliseconds for 4 million characters,
|
|
185
|
+
* against about 300), but it skips what it cannot read, so the bytes count only when they
|
|
186
|
+
* encode back to exactly `text`.
|
|
187
|
+
*/
|
|
188
|
+
function canonicalBase64(text) {
|
|
189
|
+
if (text.length % 4 !== 0)
|
|
190
|
+
return undefined;
|
|
191
|
+
const bytes = Buffer.from(text, 'base64');
|
|
192
|
+
if (bytes.toString('base64') !== text)
|
|
193
|
+
return undefined;
|
|
194
|
+
return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* A PSBT signed elsewhere, parsed strictly: capped before decoding, ASCII
|
|
198
|
+
* whitespace trimmed at the ends, canonical base64 (the SDK's decoder skips junk), and no
|
|
199
|
+
* bytes after its maps.
|
|
200
|
+
*/
|
|
201
|
+
function parseSigned(text, stored, storedBase64, network) {
|
|
202
|
+
if (typeof text !== 'string')
|
|
203
|
+
throw (0, exports.signedPsbtError)('does not decode');
|
|
204
|
+
const maps = 1 + stored.inputCount + stored.txOutputs.length;
|
|
205
|
+
const added = stored.data.inputs.filter((input) => input.nonWitnessUtxo === undefined && !isTaproot(input)).length;
|
|
206
|
+
const room = maps * SIGNED_GROWTH_PER_MAP +
|
|
207
|
+
Math.min(added * ADDED_PREVIOUS_TX, ADDED_PREVIOUS_TXS);
|
|
208
|
+
if (text.length > storedBase64.length + Math.ceil(room / 3) * 4) {
|
|
209
|
+
throw (0, exports.signedPsbtError)('is too large');
|
|
210
|
+
}
|
|
211
|
+
const bytes = canonicalBase64(trimAsciiSpace(text));
|
|
212
|
+
if (!bytes)
|
|
213
|
+
throw (0, exports.signedPsbtError)('does not decode');
|
|
214
|
+
// The unsigned transaction it carries must be ours byte for byte before bitcoinjs
|
|
215
|
+
// decodes it (its decoder is quadratic in the inputs and outputs).
|
|
216
|
+
const unsigned = globalUnsignedTx(bytes);
|
|
217
|
+
if (!unsigned)
|
|
218
|
+
throw (0, exports.signedPsbtError)('does not decode');
|
|
219
|
+
if (!(0, bytes_1.equalBytes)(unsigned, stored.data.globalMap.unsignedTx.toBuffer())) {
|
|
220
|
+
throw (0, exports.signedPsbtError)('is not the prepared transaction');
|
|
221
|
+
}
|
|
222
|
+
let signed;
|
|
223
|
+
try {
|
|
224
|
+
signed = sdk_1.bitcoin.Psbt.fromBuffer(bytes, { network });
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
throw (0, exports.signedPsbtError)('does not decode');
|
|
228
|
+
}
|
|
229
|
+
if (!endsAfterMaps(bytes, 1 + signed.inputCount + signed.txOutputs.length)) {
|
|
230
|
+
throw (0, exports.signedPsbtError)('does not decode');
|
|
231
|
+
}
|
|
232
|
+
return signed;
|
|
233
|
+
}
|
|
234
|
+
/** Refuses any field outside `allowed`, and any unknown key but those we ignore. */
|
|
235
|
+
function assertOnly(fields, allowed, global) {
|
|
236
|
+
for (const name of Object.keys(fields)) {
|
|
237
|
+
if (!allowed.has(name))
|
|
238
|
+
throw fieldError();
|
|
239
|
+
}
|
|
240
|
+
for (const { key, value } of fields.unknownKeyVals ?? []) {
|
|
241
|
+
const versionZero = global &&
|
|
242
|
+
key.length === 1 &&
|
|
243
|
+
key[0] === GLOBAL_VERSION &&
|
|
244
|
+
value.length === 4 &&
|
|
245
|
+
value.every((byte) => byte === 0);
|
|
246
|
+
if (key[0] !== PROPRIETARY && !versionZero)
|
|
247
|
+
throw fieldError();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* A previous transaction on a signed input (BIP174 `non_witness_utxo`): it must decode
|
|
252
|
+
* strictly and hash to the outpoint's txid, which fixes every byte but the witness (Core
|
|
253
|
+
* writes it without one), and pay the output our PSBT spends. A coordinator may add one to a
|
|
254
|
+
* non-taproot input of ours that lacks it; taproot never carries one (BIP341 commits to
|
|
255
|
+
* every amount). It is never read.
|
|
256
|
+
*/
|
|
257
|
+
function assertPreviousTx(bytes, stored, outpoint) {
|
|
258
|
+
if (isTaproot(stored))
|
|
259
|
+
throw changedError();
|
|
260
|
+
// Our own previous transaction, byte for byte, which `buildTx` checked: no decode.
|
|
261
|
+
if (stored.nonWitnessUtxo !== undefined && (0, bytes_1.equalBytes)(bytes, stored.nonWitnessUtxo)) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// Read in one linear pass, its txid hashed from the bytes (bitcoinjs' decoder is
|
|
265
|
+
// quadratic), and capped at the million bytes without witness a chain can hold.
|
|
266
|
+
const prev = (0, rawtx_1.readTx)(bytes);
|
|
267
|
+
if (!prev)
|
|
268
|
+
throw (0, exports.signedPsbtError)('does not decode');
|
|
269
|
+
const output = prev.outputs[outpoint.vout];
|
|
270
|
+
const ours = stored.witnessUtxo;
|
|
271
|
+
if (prev.txid !== outpoint.txid ||
|
|
272
|
+
!output ||
|
|
273
|
+
(ours !== undefined &&
|
|
274
|
+
(output.value !== ours.value || !(0, bytes_1.equalBytes)(output.script, ours.script)))) {
|
|
275
|
+
throw changedError();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Our fields a signed input carries unchanged, or not at all (a finalizer drops some): its
|
|
280
|
+
* previous output, redeem script and taproot internal key; a previous transaction is checked
|
|
281
|
+
* by its txid. A signed PSBT never decides an amount or a script.
|
|
282
|
+
*/
|
|
283
|
+
function assertUnchanged(signed, stored, outpoint) {
|
|
284
|
+
const same = (a, b) => a === undefined || (b !== undefined && (0, bytes_1.equalBytes)(a, b));
|
|
285
|
+
const utxo = signed.witnessUtxo;
|
|
286
|
+
if (!same(signed.redeemScript, stored.redeemScript) ||
|
|
287
|
+
!same(signed.tapInternalKey, stored.tapInternalKey) ||
|
|
288
|
+
(utxo !== undefined &&
|
|
289
|
+
(stored.witnessUtxo === undefined ||
|
|
290
|
+
utxo.value !== stored.witnessUtxo.value ||
|
|
291
|
+
!(0, bytes_1.equalBytes)(utxo.script, stored.witnessUtxo.script)))) {
|
|
292
|
+
throw changedError();
|
|
293
|
+
}
|
|
294
|
+
if (signed.nonWitnessUtxo !== undefined) {
|
|
295
|
+
assertPreviousTx(signed.nonWitnessUtxo, stored, outpoint);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Every field of a signed copy whose unsigned transaction is already ours: the global map,
|
|
300
|
+
* each output and each input (see the allowlists and `assertUnchanged`).
|
|
301
|
+
*/
|
|
302
|
+
function assertSignedFields(signed, stored) {
|
|
303
|
+
assertOnly(signed.data.globalMap, SIGNED_GLOBAL_FIELDS, true);
|
|
304
|
+
for (const output of signed.data.outputs)
|
|
305
|
+
assertOnly(output, SIGNED_OUTPUT_FIELDS, false);
|
|
306
|
+
const outpoints = stored.txInputs.map((input) => ({
|
|
307
|
+
txid: (0, bytes_1.toHex)(Uint8Array.from(input.hash).reverse()),
|
|
308
|
+
vout: input.index,
|
|
309
|
+
}));
|
|
310
|
+
signed.data.inputs.forEach((input, index) => {
|
|
311
|
+
assertOnly(input, SIGNED_INPUT_FIELDS, false);
|
|
312
|
+
assertUnchanged(input, stored.data.inputs[index], outpoints[index]);
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/** Pushes of a script, or `undefined` when it is not push-only. */
|
|
316
|
+
function pushes(script) {
|
|
317
|
+
const chunks = sdk_1.bitcoin.script.decompile(script);
|
|
318
|
+
if (!chunks || chunks.some((c) => typeof c === 'number'))
|
|
319
|
+
return undefined;
|
|
320
|
+
return chunks;
|
|
321
|
+
}
|
|
322
|
+
/** A serialized witness stack (BIP144): a count, then length-prefixed items. */
|
|
323
|
+
function witnessItems(witness) {
|
|
324
|
+
let offset = 0;
|
|
325
|
+
const varint = () => {
|
|
326
|
+
const first = witness[offset];
|
|
327
|
+
if (first === undefined || first >= 0xfd)
|
|
328
|
+
return undefined; // no item this long here
|
|
329
|
+
offset += 1;
|
|
330
|
+
return first;
|
|
331
|
+
};
|
|
332
|
+
const count = varint();
|
|
333
|
+
if (count === undefined)
|
|
334
|
+
return undefined;
|
|
335
|
+
const items = [];
|
|
336
|
+
for (let i = 0; i < count; i++) {
|
|
337
|
+
const length = varint();
|
|
338
|
+
if (length === undefined || offset + length > witness.length)
|
|
339
|
+
return undefined;
|
|
340
|
+
items.push(witness.slice(offset, offset + length));
|
|
341
|
+
offset += length;
|
|
342
|
+
}
|
|
343
|
+
return offset === witness.length ? items : undefined;
|
|
344
|
+
}
|
|
345
|
+
/** p2tr: the key-path signature (BIP341, SIGHASH_DEFAULT, 64 bytes), partial or final. */
|
|
346
|
+
function schnorrSignatureOf(input) {
|
|
347
|
+
if (input.partialSig)
|
|
348
|
+
throw (0, exports.signedPsbtError)('carries a signature of another scheme');
|
|
349
|
+
if (input.sighashType !== undefined && input.sighashType !== exports.SIGHASH_DEFAULT) {
|
|
350
|
+
throw sighashError('SIGHASH_DEFAULT');
|
|
351
|
+
}
|
|
352
|
+
if (input.finalScriptSig !== undefined && input.finalScriptSig.length > 0) {
|
|
353
|
+
throw shapeError();
|
|
354
|
+
}
|
|
355
|
+
const found = [];
|
|
356
|
+
if (input.tapKeySig)
|
|
357
|
+
found.push(input.tapKeySig);
|
|
358
|
+
if (input.finalScriptWitness) {
|
|
359
|
+
const items = witnessItems(input.finalScriptWitness);
|
|
360
|
+
if (items?.length !== 1)
|
|
361
|
+
throw shapeError();
|
|
362
|
+
found.push(items[0]);
|
|
363
|
+
}
|
|
364
|
+
for (const signature of found) {
|
|
365
|
+
if (signature.length === 65)
|
|
366
|
+
throw sighashError('SIGHASH_DEFAULT');
|
|
367
|
+
if (signature.length !== 64)
|
|
368
|
+
throw (0, exports.signedPsbtError)('carries a malformed signature');
|
|
369
|
+
}
|
|
370
|
+
return found[0];
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* ECDSA: the signature of `publicKey` (strict DER, SIGHASH_ALL, returned as 64-byte r‖s),
|
|
374
|
+
* partial or final: `<sig> <key>` in the scriptSig for p2pkh; in the witness for segwit v0,
|
|
375
|
+
* whose scriptSig is empty or, for p2sh-p2wpkh, the push of our redeem script.
|
|
376
|
+
*/
|
|
377
|
+
function ecdsaSignatureOf(publicKey, input, stored) {
|
|
378
|
+
if (input.tapKeySig)
|
|
379
|
+
throw (0, exports.signedPsbtError)('carries a signature of another scheme');
|
|
380
|
+
if (input.sighashType !== undefined && input.sighashType !== exports.SIGHASH_ALL) {
|
|
381
|
+
throw sighashError('SIGHASH_ALL');
|
|
382
|
+
}
|
|
383
|
+
const found = [];
|
|
384
|
+
for (const partial of input.partialSig ?? []) {
|
|
385
|
+
if (!(0, bytes_1.equalBytes)(partial.pubkey, publicKey)) {
|
|
386
|
+
throw (0, exports.signedPsbtError)('carries a signature for another key');
|
|
387
|
+
}
|
|
388
|
+
found.push(partial.signature);
|
|
389
|
+
}
|
|
390
|
+
const ours = (stack) => {
|
|
391
|
+
if (stack?.length !== 2 || !(0, bytes_1.equalBytes)(stack[1], publicKey)) {
|
|
392
|
+
throw shapeError();
|
|
393
|
+
}
|
|
394
|
+
return stack[0];
|
|
395
|
+
};
|
|
396
|
+
if (stored.witnessUtxo === undefined) {
|
|
397
|
+
if (input.finalScriptWitness !== undefined)
|
|
398
|
+
throw shapeError();
|
|
399
|
+
if (input.finalScriptSig !== undefined)
|
|
400
|
+
found.push(ours(pushes(input.finalScriptSig)));
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
const scriptSig = stored.redeemScript
|
|
404
|
+
? sdk_1.bitcoin.script.compile([stored.redeemScript])
|
|
405
|
+
: new Uint8Array();
|
|
406
|
+
if (input.finalScriptSig !== undefined &&
|
|
407
|
+
!(0, bytes_1.equalBytes)(input.finalScriptSig, scriptSig)) {
|
|
408
|
+
throw shapeError();
|
|
409
|
+
}
|
|
410
|
+
if (input.finalScriptWitness !== undefined) {
|
|
411
|
+
found.push(ours(witnessItems(input.finalScriptWitness)));
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
const signatures = found.map((der) => {
|
|
415
|
+
let decoded;
|
|
416
|
+
try {
|
|
417
|
+
decoded = sdk_1.bitcoin.script.signature.decode(der);
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
throw (0, exports.signedPsbtError)('carries a malformed signature');
|
|
421
|
+
}
|
|
422
|
+
if (decoded.hashType !== exports.SIGHASH_ALL)
|
|
423
|
+
throw sighashError('SIGHASH_ALL');
|
|
424
|
+
return decoded.signature;
|
|
425
|
+
});
|
|
426
|
+
return signatures[0];
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=signed-psbt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signed-psbt.js","sourceRoot":"","sources":["../../../src/adapters/utxo/signed-psbt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The reader of a PSBT signed elsewhere: a cold signer's or a coordinator's copy of our\n * PSBT is untrusted input. It is capped before decoding and parsed strictly. What could\n * change the spend is refused: another unsigned transaction, a changed previous output,\n * redeem script or internal key, an input script path, or a foreign, cross-scheme or\n * other-sighash signature. What cannot change it is ignored: key origins, the output\n * scripts a coordinator adds for change detection, proprietary keys and PSBT version 0.\n * Only signature bytes are taken, and the core verifies them against the stored requests.\n * Every refusal is `ValidationError('INVALID_INTENT')` with a fixed text. Synchronous and\n * I/O-free.\n */\nimport { ValidationError } from '../../core/errors/error';\nimport { equalBytes, toHex } from '../../core/util/bytes';\nimport { readTx } from './rawtx';\nimport { bitcoin, type Network, type Psbt } from './sdk';\n\nexport const SIGHASH_ALL = 0x01;\nexport const SIGHASH_DEFAULT = 0x00;\n\nexport type PsbtInput = Psbt['data']['inputs'][number];\n\ninterface KeyValue {\n readonly key: Uint8Array;\n readonly value: Uint8Array;\n}\n\nexport const signedPsbtError = (reason: string): ValidationError =>\n new ValidationError('INVALID_INTENT', `the signed PSBT ${reason}`);\nconst sighashError = (expected: 'SIGHASH_ALL' | 'SIGHASH_DEFAULT'): ValidationError =>\n signedPsbtError(`uses a sighash type other than ${expected}`);\nconst shapeError = (): ValidationError =>\n signedPsbtError('carries a final script of another shape');\nconst fieldError = (): ValidationError =>\n signedPsbtError('carries a field a signer does not add');\nconst changedError = (): ValidationError =>\n signedPsbtError('changes the prepared transaction');\n\n/**\n * What a signer may add to each map of our PSBT (signatures, final scripts, a sighash type,\n * key origins, change-output scripts, proprietary keys): well under 1 KiB per input for one\n * key. A larger PSBT is not a signed copy of ours, and is refused before it is decoded.\n */\nconst SIGNED_GROWTH_PER_MAP = 4_096;\n/**\n * Room for the previous transaction a coordinator may add to a non-taproot input of ours\n * that lacks one (`nonWitnessUtxo` off): a standard transaction's largest stripped size\n * (`MAX_STANDARD_TX_WEIGHT` / 4).\n */\nconst ADDED_PREVIOUS_TX = 100_000;\n/**\n * What coordinators may add in all, whatever the number of inputs: one block (Bitcoin\n * Core's `MAX_BLOCK_SERIALIZED_SIZE`), so the decoding it costs stays bounded. Unbounded,\n * 160 inputs with `nonWitnessUtxo` off took 8 s of synchronous decoding.\n */\nconst ADDED_PREVIOUS_TXS = 4_000_000;\n\n/** BIP174 key types a signed copy may carry but we never read. */\nconst PROPRIETARY = 0xfc;\nconst GLOBAL_VERSION = 0xfb;\n\n/** Key origins (BIP32 derivations), which a signer or a coordinator may add. */\nconst KEY_ORIGINS = ['bip32Derivation', 'tapBip32Derivation'];\n/**\n * The fields a signed copy of our PSBT may carry. `unknownKeyVals` holds every key bip174\n * does not know, and only proprietary keys (and, globally, version 0) may be among them.\n */\nconst SIGNED_GLOBAL_FIELDS: ReadonlySet<string> = new Set([\n 'unsignedTx',\n 'globalXpub',\n 'unknownKeyVals',\n]);\n/**\n * Per input: signatures, final scripts, a sighash type, key origins, and our own fields\n * unchanged (or a verified previous transaction). The script-path fields (`witnessScript`,\n * `tapLeafScript`, `tapScriptSig`, `tapMerkleRoot`) and `porCommitment` are refused.\n */\nconst SIGNED_INPUT_FIELDS: ReadonlySet<string> = new Set([\n ...KEY_ORIGINS,\n 'partialSig',\n 'tapKeySig',\n 'finalScriptSig',\n 'finalScriptWitness',\n 'sighashType',\n 'witnessUtxo',\n 'nonWitnessUtxo',\n 'redeemScript',\n 'tapInternalKey',\n 'unknownKeyVals',\n]);\n/**\n * Per output: key origins and the scripts Core's `UpdatePSBTOutput` adds so a hardware\n * wallet recognizes change. None is read: the outputs are fixed by the unsigned transaction.\n */\nconst SIGNED_OUTPUT_FIELDS: ReadonlySet<string> = new Set([\n ...KEY_ORIGINS,\n 'redeemScript',\n 'witnessScript',\n 'tapInternalKey',\n 'tapTree',\n 'unknownKeyVals',\n]);\n\n/** Our taproot inputs carry their internal key (`buildTx`). */\nconst isTaproot = (stored: PsbtInput): boolean => stored.tapInternalKey !== undefined;\n\n/** ASCII whitespace (C `isspace`), trimmed at both ends of a pasted or file-read PSBT. */\nconst ASCII_SPACE: ReadonlySet<number> = new Set([0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x20]);\n\nfunction trimAsciiSpace(text: string): string {\n let start = 0;\n let end = text.length;\n while (start < end && ASCII_SPACE.has(text.charCodeAt(start))) start++;\n while (end > start && ASCII_SPACE.has(text.charCodeAt(end - 1))) end--;\n return text.slice(start, end);\n}\n\n/**\n * Whether PSBT bytes end right after their maps (BIP174: the global map, then one per input\n * and one per output), with every key and value length a minimal CompactSize inside the\n * bytes. bip174 ignores whatever follows the last map.\n */\nfunction endsAfterMaps(bytes: Uint8Array, maps: number): boolean {\n let offset = 5; // the magic `psbt` and 0xff, which the parser has checked\n const length = (): number | undefined => {\n const first = bytes[offset];\n if (first === undefined) return undefined;\n const width = first < 0xfd ? 0 : first === 0xfd ? 2 : first === 0xfe ? 4 : 8;\n if (offset + 1 + width > bytes.length) return undefined;\n let value = width === 0 ? first : 0;\n for (let i = width; i >= 1; i--) value = value * 256 + (bytes[offset + i] as number);\n offset += 1 + width;\n const least = width === 0 ? 0 : width === 2 ? 0xfd : width === 4 ? 0x1_0000 : 2 ** 32;\n return value < least ? undefined : value;\n };\n for (let map = 0; map < maps; map++) {\n for (;;) {\n const keyLength = length();\n if (keyLength === undefined) return false;\n if (keyLength === 0) break;\n offset += keyLength;\n const valueLength = length();\n if (valueLength === undefined) return false;\n offset += valueLength;\n }\n }\n return offset === bytes.length;\n}\n\n/**\n * The value of the global map's `PSBT_GLOBAL_UNSIGNED_TX` (key `0x00`) of PSBT bytes, read\n * without decoding it; `undefined` when the magic or the global map is malformed, or it has\n * no such key.\n */\nfunction globalUnsignedTx(bytes: Uint8Array): Uint8Array | undefined {\n const magic = [0x70, 0x73, 0x62, 0x74, 0xff];\n if (!magic.every((byte, index) => bytes[index] === byte)) return undefined;\n let offset = 5;\n const length = (): number | undefined => {\n const first = bytes[offset];\n if (first === undefined) return undefined;\n const width = first < 0xfd ? 0 : first === 0xfd ? 2 : first === 0xfe ? 4 : 8;\n if (offset + 1 + width > bytes.length) return undefined;\n let value = width === 0 ? first : 0;\n for (let i = width; i >= 1; i--) value = value * 256 + (bytes[offset + i] as number);\n offset += 1 + width;\n return value;\n };\n for (;;) {\n const keyLength = length();\n if (keyLength === undefined || offset + keyLength > bytes.length) return undefined;\n if (keyLength === 0) return undefined; // the end of the global map: no unsigned tx\n const unsignedKey = keyLength === 1 && bytes[offset] === 0x00;\n offset += keyLength;\n const valueLength = length();\n if (valueLength === undefined || offset + valueLength > bytes.length)\n return undefined;\n if (unsignedKey) return bytes.subarray(offset, offset + valueLength);\n offset += valueLength;\n }\n}\n\n/**\n * Canonical base64 (the standard alphabet, padded), or `undefined`. Node's decoder is\n * linear and far faster than a pure-JS one (a few milliseconds for 4 million characters,\n * against about 300), but it skips what it cannot read, so the bytes count only when they\n * encode back to exactly `text`.\n */\nfunction canonicalBase64(text: string): Uint8Array | undefined {\n if (text.length % 4 !== 0) return undefined;\n const bytes = Buffer.from(text, 'base64');\n if (bytes.toString('base64') !== text) return undefined;\n return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.length);\n}\n\n/**\n * A PSBT signed elsewhere, parsed strictly: capped before decoding, ASCII\n * whitespace trimmed at the ends, canonical base64 (the SDK's decoder skips junk), and no\n * bytes after its maps.\n */\nexport function parseSigned(\n text: string,\n stored: Psbt,\n storedBase64: string,\n network: Network,\n): Psbt {\n if (typeof text !== 'string') throw signedPsbtError('does not decode');\n const maps = 1 + stored.inputCount + stored.txOutputs.length;\n const added = stored.data.inputs.filter(\n (input) => input.nonWitnessUtxo === undefined && !isTaproot(input),\n ).length;\n const room =\n maps * SIGNED_GROWTH_PER_MAP +\n Math.min(added * ADDED_PREVIOUS_TX, ADDED_PREVIOUS_TXS);\n if (text.length > storedBase64.length + Math.ceil(room / 3) * 4) {\n throw signedPsbtError('is too large');\n }\n const bytes = canonicalBase64(trimAsciiSpace(text));\n if (!bytes) throw signedPsbtError('does not decode');\n // The unsigned transaction it carries must be ours byte for byte before bitcoinjs\n // decodes it (its decoder is quadratic in the inputs and outputs).\n const unsigned = globalUnsignedTx(bytes);\n if (!unsigned) throw signedPsbtError('does not decode');\n if (!equalBytes(unsigned, stored.data.globalMap.unsignedTx.toBuffer())) {\n throw signedPsbtError('is not the prepared transaction');\n }\n let signed: Psbt;\n try {\n signed = bitcoin.Psbt.fromBuffer(bytes, { network });\n } catch {\n throw signedPsbtError('does not decode');\n }\n if (!endsAfterMaps(bytes, 1 + signed.inputCount + signed.txOutputs.length)) {\n throw signedPsbtError('does not decode');\n }\n return signed;\n}\n\n/** Refuses any field outside `allowed`, and any unknown key but those we ignore. */\nfunction assertOnly(\n fields: { readonly unknownKeyVals?: readonly KeyValue[] },\n allowed: ReadonlySet<string>,\n global: boolean,\n): void {\n for (const name of Object.keys(fields)) {\n if (!allowed.has(name)) throw fieldError();\n }\n for (const { key, value } of fields.unknownKeyVals ?? []) {\n const versionZero =\n global &&\n key.length === 1 &&\n key[0] === GLOBAL_VERSION &&\n value.length === 4 &&\n value.every((byte) => byte === 0);\n if (key[0] !== PROPRIETARY && !versionZero) throw fieldError();\n }\n}\n\n/**\n * A previous transaction on a signed input (BIP174 `non_witness_utxo`): it must decode\n * strictly and hash to the outpoint's txid, which fixes every byte but the witness (Core\n * writes it without one), and pay the output our PSBT spends. A coordinator may add one to a\n * non-taproot input of ours that lacks it; taproot never carries one (BIP341 commits to\n * every amount). It is never read.\n */\nfunction assertPreviousTx(\n bytes: Uint8Array,\n stored: PsbtInput,\n outpoint: { readonly txid: string; readonly vout: number },\n): void {\n if (isTaproot(stored)) throw changedError();\n // Our own previous transaction, byte for byte, which `buildTx` checked: no decode.\n if (stored.nonWitnessUtxo !== undefined && equalBytes(bytes, stored.nonWitnessUtxo)) {\n return;\n }\n // Read in one linear pass, its txid hashed from the bytes (bitcoinjs' decoder is\n // quadratic), and capped at the million bytes without witness a chain can hold.\n const prev = readTx(bytes);\n if (!prev) throw signedPsbtError('does not decode');\n const output = prev.outputs[outpoint.vout];\n const ours = stored.witnessUtxo;\n if (\n prev.txid !== outpoint.txid ||\n !output ||\n (ours !== undefined &&\n (output.value !== ours.value || !equalBytes(output.script, ours.script)))\n ) {\n throw changedError();\n }\n}\n\n/**\n * Our fields a signed input carries unchanged, or not at all (a finalizer drops some): its\n * previous output, redeem script and taproot internal key; a previous transaction is checked\n * by its txid. A signed PSBT never decides an amount or a script.\n */\nfunction assertUnchanged(\n signed: PsbtInput,\n stored: PsbtInput,\n outpoint: { readonly txid: string; readonly vout: number },\n): void {\n const same = (a: Uint8Array | undefined, b: Uint8Array | undefined): boolean =>\n a === undefined || (b !== undefined && equalBytes(a, b));\n const utxo = signed.witnessUtxo;\n if (\n !same(signed.redeemScript, stored.redeemScript) ||\n !same(signed.tapInternalKey, stored.tapInternalKey) ||\n (utxo !== undefined &&\n (stored.witnessUtxo === undefined ||\n utxo.value !== stored.witnessUtxo.value ||\n !equalBytes(utxo.script, stored.witnessUtxo.script)))\n ) {\n throw changedError();\n }\n if (signed.nonWitnessUtxo !== undefined) {\n assertPreviousTx(signed.nonWitnessUtxo, stored, outpoint);\n }\n}\n\n/**\n * Every field of a signed copy whose unsigned transaction is already ours: the global map,\n * each output and each input (see the allowlists and `assertUnchanged`).\n */\nexport function assertSignedFields(signed: Psbt, stored: Psbt): void {\n assertOnly(signed.data.globalMap, SIGNED_GLOBAL_FIELDS, true);\n for (const output of signed.data.outputs)\n assertOnly(output, SIGNED_OUTPUT_FIELDS, false);\n const outpoints = stored.txInputs.map((input) => ({\n txid: toHex(Uint8Array.from(input.hash).reverse()),\n vout: input.index,\n }));\n signed.data.inputs.forEach((input, index) => {\n assertOnly(input, SIGNED_INPUT_FIELDS, false);\n assertUnchanged(\n input,\n stored.data.inputs[index] as PsbtInput,\n outpoints[index] as { txid: string; vout: number },\n );\n });\n}\n\n/** Pushes of a script, or `undefined` when it is not push-only. */\nfunction pushes(script: Uint8Array): Uint8Array[] | undefined {\n const chunks = bitcoin.script.decompile(script);\n if (!chunks || chunks.some((c) => typeof c === 'number')) return undefined;\n return chunks as Uint8Array[];\n}\n\n/** A serialized witness stack (BIP144): a count, then length-prefixed items. */\nfunction witnessItems(witness: Uint8Array): Uint8Array[] | undefined {\n let offset = 0;\n const varint = (): number | undefined => {\n const first = witness[offset];\n if (first === undefined || first >= 0xfd) return undefined; // no item this long here\n offset += 1;\n return first;\n };\n const count = varint();\n if (count === undefined) return undefined;\n const items: Uint8Array[] = [];\n for (let i = 0; i < count; i++) {\n const length = varint();\n if (length === undefined || offset + length > witness.length) return undefined;\n items.push(witness.slice(offset, offset + length));\n offset += length;\n }\n return offset === witness.length ? items : undefined;\n}\n\n/** p2tr: the key-path signature (BIP341, SIGHASH_DEFAULT, 64 bytes), partial or final. */\nexport function schnorrSignatureOf(input: PsbtInput): Uint8Array | undefined {\n if (input.partialSig) throw signedPsbtError('carries a signature of another scheme');\n if (input.sighashType !== undefined && input.sighashType !== SIGHASH_DEFAULT) {\n throw sighashError('SIGHASH_DEFAULT');\n }\n if (input.finalScriptSig !== undefined && input.finalScriptSig.length > 0) {\n throw shapeError();\n }\n const found: Uint8Array[] = [];\n if (input.tapKeySig) found.push(input.tapKeySig);\n if (input.finalScriptWitness) {\n const items = witnessItems(input.finalScriptWitness);\n if (items?.length !== 1) throw shapeError();\n found.push(items[0] as Uint8Array);\n }\n for (const signature of found) {\n if (signature.length === 65) throw sighashError('SIGHASH_DEFAULT');\n if (signature.length !== 64) throw signedPsbtError('carries a malformed signature');\n }\n return found[0];\n}\n\n/**\n * ECDSA: the signature of `publicKey` (strict DER, SIGHASH_ALL, returned as 64-byte r‖s),\n * partial or final: `<sig> <key>` in the scriptSig for p2pkh; in the witness for segwit v0,\n * whose scriptSig is empty or, for p2sh-p2wpkh, the push of our redeem script.\n */\nexport function ecdsaSignatureOf(\n publicKey: Uint8Array,\n input: PsbtInput,\n stored: PsbtInput,\n): Uint8Array | undefined {\n if (input.tapKeySig) throw signedPsbtError('carries a signature of another scheme');\n if (input.sighashType !== undefined && input.sighashType !== SIGHASH_ALL) {\n throw sighashError('SIGHASH_ALL');\n }\n const found: Uint8Array[] = [];\n for (const partial of input.partialSig ?? []) {\n if (!equalBytes(partial.pubkey, publicKey)) {\n throw signedPsbtError('carries a signature for another key');\n }\n found.push(partial.signature);\n }\n const ours = (stack: Uint8Array[] | undefined): Uint8Array => {\n if (stack?.length !== 2 || !equalBytes(stack[1] as Uint8Array, publicKey)) {\n throw shapeError();\n }\n return stack[0] as Uint8Array;\n };\n if (stored.witnessUtxo === undefined) {\n if (input.finalScriptWitness !== undefined) throw shapeError();\n if (input.finalScriptSig !== undefined)\n found.push(ours(pushes(input.finalScriptSig)));\n } else {\n const scriptSig = stored.redeemScript\n ? bitcoin.script.compile([stored.redeemScript])\n : new Uint8Array();\n if (\n input.finalScriptSig !== undefined &&\n !equalBytes(input.finalScriptSig, scriptSig)\n ) {\n throw shapeError();\n }\n if (input.finalScriptWitness !== undefined) {\n found.push(ours(witnessItems(input.finalScriptWitness)));\n }\n }\n const signatures = found.map((der) => {\n let decoded: { signature: Uint8Array; hashType: number };\n try {\n decoded = bitcoin.script.signature.decode(der);\n } catch {\n throw signedPsbtError('carries a malformed signature');\n }\n if (decoded.hashType !== SIGHASH_ALL) throw sighashError('SIGHASH_ALL');\n return decoded.signature;\n });\n return signatures[0];\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What coin selection spends and pays: the planned outputs of an intent (strict addresses,
|
|
3
|
+
* no dust), the wallet's eligible outputs (not reserved by another live Operation, and
|
|
4
|
+
* confirmed as deeply as `minInputConfirmations` asks), and the fee rate of a fee spec.
|
|
5
|
+
*
|
|
6
|
+
* This module loads bitcoinjs-lib (`spendable` reads through `reader.ts`, which imports the
|
|
7
|
+
* codec and `sdk.ts`), so only modules behind the manifest's `load()` may import it; an
|
|
8
|
+
* SDK-free module (the plugin, an entry's types) must not.
|
|
9
|
+
*/
|
|
10
|
+
import type { WalletKey, WalletOptions } from '../../core/driver/types';
|
|
11
|
+
import { type FeeOverride, type FeeSpeed } from '../../core/model/fee';
|
|
12
|
+
import { type DecodedAddress, type WalletAddress } from './address';
|
|
13
|
+
import type { PlannedOutput, Spendable } from './coinselect';
|
|
14
|
+
import { type UtxoContext } from './context';
|
|
15
|
+
export { assertNative } from './context';
|
|
16
|
+
import type { UtxoAddressType } from './types';
|
|
17
|
+
/**
|
|
18
|
+
* The most outputs one transfer may pay (`limits().maxOutputs`), enforced here because
|
|
19
|
+
* the core only reports it. Library policy: 1,000 taproot outputs are about 43 kvB, far
|
|
20
|
+
* below the 100 kvB standard size.
|
|
21
|
+
*/
|
|
22
|
+
export declare const MAX_OUTPUTS = 1000;
|
|
23
|
+
/** The intent's outputs as scripts; each must be a standard address and above dust. */
|
|
24
|
+
export declare function plannedOutputs(ctx: UtxoContext, outputs: readonly {
|
|
25
|
+
readonly to: string;
|
|
26
|
+
readonly amount: bigint;
|
|
27
|
+
}[]): PlannedOutput[];
|
|
28
|
+
/** The sending wallet: its type (from the address; p2sh is p2sh-p2wpkh) and, with a key, its scripts. */
|
|
29
|
+
export interface Sender {
|
|
30
|
+
readonly from: DecodedAddress;
|
|
31
|
+
readonly type: UtxoAddressType;
|
|
32
|
+
}
|
|
33
|
+
export declare function senderOf(ctx: UtxoContext, from: string): Sender;
|
|
34
|
+
/**
|
|
35
|
+
* The wallet's scripts from its key, which must own the sending address: nothing is ever
|
|
36
|
+
* built for inputs the wallet's key cannot sign (`INVALID_INTENT`).
|
|
37
|
+
*/
|
|
38
|
+
export declare function walletOf(ctx: UtxoContext, sender: Sender, keys: readonly WalletKey[]): {
|
|
39
|
+
readonly wallet: WalletAddress;
|
|
40
|
+
readonly key: WalletKey;
|
|
41
|
+
};
|
|
42
|
+
/** How many indexes `changeAddressOf` searches on each chain of the wallet's xpub. */
|
|
43
|
+
export declare const XPUB_CHANGE_SEARCH = 20;
|
|
44
|
+
/**
|
|
45
|
+
* Where change goes. A configured `changeAddress` must be derivable from the wallet: the
|
|
46
|
+
* sending address, or any of the four wallet types of one of the wallet's keys (a bounded
|
|
47
|
+
* search, at most 4 per key). Otherwise it is refused with `CONFIG_INVALID`, naming no
|
|
48
|
+
* address, because a valid but mistyped address would lose every change output. The
|
|
49
|
+
* wallet opts out with `allowExternalChangeAddress: true`.
|
|
50
|
+
*/
|
|
51
|
+
export declare function changeAddressOf(ctx: UtxoContext, wallet: WalletOptions, sender: Sender, keys: readonly WalletKey[]): DecodedAddress;
|
|
52
|
+
/**
|
|
53
|
+
* The wallet's outputs coin selection may spend. They are read as `listUnspent` reads them:
|
|
54
|
+
* an output the indexer lists twice alike counts once (the funds check sums them), and two
|
|
55
|
+
* listings that disagree decide nothing (retryable).
|
|
56
|
+
*/
|
|
57
|
+
export declare function spendable(ctx: UtxoContext, from: string, exclude: readonly string[] | undefined, minConfirmations: number, signal?: AbortSignal): Promise<Spendable[]>;
|
|
58
|
+
/** The fee rate (sat/kvB) of a speed or a `{ satPerVByte }` override. */
|
|
59
|
+
export declare function rateOf(ctx: UtxoContext, fee: FeeSpeed | FeeOverride, signal?: AbortSignal): Promise<bigint>;
|