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,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalSigner = void 0;
|
|
4
|
+
exports.curveOfScheme = curveOfScheme;
|
|
5
|
+
exports.tweakPrivateKey = tweakPrivateKey;
|
|
6
|
+
exports.localSigner = localSigner;
|
|
7
|
+
const modular_1 = require("@noble/curves/abstract/modular");
|
|
8
|
+
const utils_1 = require("@noble/curves/abstract/utils");
|
|
9
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
10
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
11
|
+
const error_1 = require("../errors/error");
|
|
12
|
+
const secret_1 = require("../secret/secret");
|
|
13
|
+
const bytes_1 = require("../util/bytes");
|
|
14
|
+
const hd_1 = require("./hd");
|
|
15
|
+
const SCHEME_CURVE = {
|
|
16
|
+
'secp256k1-ecdsa': 'secp256k1',
|
|
17
|
+
'secp256k1-schnorr': 'secp256k1',
|
|
18
|
+
ed25519: 'ed25519',
|
|
19
|
+
};
|
|
20
|
+
const CURVE_SCHEMES = {
|
|
21
|
+
secp256k1: ['secp256k1-ecdsa', 'secp256k1-schnorr'],
|
|
22
|
+
ed25519: ['ed25519'],
|
|
23
|
+
};
|
|
24
|
+
function curveOfScheme(scheme) {
|
|
25
|
+
return SCHEME_CURVE[scheme];
|
|
26
|
+
}
|
|
27
|
+
/** In-process signer. Keys live only in private fields and are never serialized. */
|
|
28
|
+
class LocalSigner {
|
|
29
|
+
id;
|
|
30
|
+
schemes;
|
|
31
|
+
#keys;
|
|
32
|
+
#exportable;
|
|
33
|
+
constructor(id, curves, keys, exportable) {
|
|
34
|
+
this.id = id;
|
|
35
|
+
this.schemes = curves.flatMap((curve) => CURVE_SCHEMES[curve]);
|
|
36
|
+
this.#keys = keys;
|
|
37
|
+
this.#exportable = exportable;
|
|
38
|
+
}
|
|
39
|
+
async getPublicKey(scheme, keyRef) {
|
|
40
|
+
return publicKeyFor(scheme, this.#key(scheme, keyRef));
|
|
41
|
+
}
|
|
42
|
+
async sign(requests, _ctx) {
|
|
43
|
+
const signatures = requests.map((request) => signOne(request, this.#key(request.scheme, request.keyRef)));
|
|
44
|
+
return { status: 'signed', signatures };
|
|
45
|
+
}
|
|
46
|
+
async exportKey(scheme, keyRef) {
|
|
47
|
+
if (!this.#exportable) {
|
|
48
|
+
throw new error_1.SigningError('KEY_NOT_EXPORTABLE', `signer '${this.id}' was not created as exportable`);
|
|
49
|
+
}
|
|
50
|
+
return (0, secret_1.secret)(Uint8Array.from(this.#key(scheme, keyRef)));
|
|
51
|
+
}
|
|
52
|
+
toJSON() {
|
|
53
|
+
return { id: this.id, schemes: this.schemes };
|
|
54
|
+
}
|
|
55
|
+
#key(scheme, keyRef) {
|
|
56
|
+
const curve = SCHEME_CURVE[scheme];
|
|
57
|
+
if (!curve || !this.schemes.includes(scheme)) {
|
|
58
|
+
throw new error_1.SigningError('SIGNER_UNAVAILABLE', `signer '${this.id}' does not support scheme '${scheme}'`);
|
|
59
|
+
}
|
|
60
|
+
return this.#keys(curve, keyRef);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.LocalSigner = LocalSigner;
|
|
64
|
+
function publicKeyFor(scheme, key) {
|
|
65
|
+
if (scheme === 'secp256k1-ecdsa')
|
|
66
|
+
return secp256k1_1.secp256k1.getPublicKey(key, true);
|
|
67
|
+
if (scheme === 'secp256k1-schnorr')
|
|
68
|
+
return secp256k1_1.schnorr.getPublicKey(key);
|
|
69
|
+
return ed25519_1.ed25519.getPublicKey(key);
|
|
70
|
+
}
|
|
71
|
+
function assertOwnKey(request, publicKey) {
|
|
72
|
+
if (!(0, bytes_1.equalBytes)(request.publicKey, publicKey)) {
|
|
73
|
+
throw new error_1.SigningError('SIGNING_FAILED', `request '${request.id}': public key does not belong to this signer`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function assertDigest(request) {
|
|
77
|
+
if (request.payload.length !== 32) {
|
|
78
|
+
throw new error_1.SigningError('SIGNING_FAILED', `request '${request.id}': ${request.scheme} signs 32-byte digests`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function signOne(request, key) {
|
|
82
|
+
if (request.scheme === 'secp256k1-ecdsa') {
|
|
83
|
+
assertOwnKey(request, secp256k1_1.secp256k1.getPublicKey(key, true));
|
|
84
|
+
assertDigest(request);
|
|
85
|
+
const signature = secp256k1_1.secp256k1.sign(request.payload, key, { lowS: true });
|
|
86
|
+
return {
|
|
87
|
+
requestId: request.id,
|
|
88
|
+
bytes: signature.toCompactRawBytes(),
|
|
89
|
+
recovery: signature.recovery,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (request.scheme === 'secp256k1-schnorr') {
|
|
93
|
+
const signingKey = request.params?.tweak
|
|
94
|
+
? tweakPrivateKey(key, request.params.tweak)
|
|
95
|
+
: key;
|
|
96
|
+
assertOwnKey(request, secp256k1_1.schnorr.getPublicKey(signingKey));
|
|
97
|
+
assertDigest(request);
|
|
98
|
+
return { requestId: request.id, bytes: secp256k1_1.schnorr.sign(request.payload, signingKey) };
|
|
99
|
+
}
|
|
100
|
+
assertOwnKey(request, ed25519_1.ed25519.getPublicKey(key));
|
|
101
|
+
return { requestId: request.id, bytes: ed25519_1.ed25519.sign(request.payload, key) };
|
|
102
|
+
}
|
|
103
|
+
/** BIP341 key-path tweak: negate for odd Y, then add the tweak modulo n. */
|
|
104
|
+
function tweakPrivateKey(key, tweak) {
|
|
105
|
+
const n = secp256k1_1.secp256k1.CURVE.n;
|
|
106
|
+
const t = (0, utils_1.bytesToNumberBE)(tweak);
|
|
107
|
+
if (tweak.length !== 32 || t >= n)
|
|
108
|
+
throw new error_1.SigningError('SIGNING_FAILED', 'invalid taproot tweak');
|
|
109
|
+
let d = (0, utils_1.bytesToNumberBE)(key);
|
|
110
|
+
if (!secp256k1_1.secp256k1.ProjectivePoint.fromPrivateKey(key).hasEvenY())
|
|
111
|
+
d = n - d;
|
|
112
|
+
const tweaked = (0, modular_1.mod)(d + t, n);
|
|
113
|
+
if (tweaked === 0n)
|
|
114
|
+
throw new error_1.SigningError('SIGNING_FAILED', 'tweaked key is zero');
|
|
115
|
+
return (0, utils_1.numberToBytesBE)(tweaked, 32);
|
|
116
|
+
}
|
|
117
|
+
function parseKey(input, curve) {
|
|
118
|
+
const raw = (0, secret_1.reveal)(input);
|
|
119
|
+
let bytes;
|
|
120
|
+
try {
|
|
121
|
+
bytes = typeof raw === 'string' ? (0, bytes_1.fromHex)(raw.trim()) : Uint8Array.from(raw);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `${curve} private key is not valid hex`);
|
|
125
|
+
}
|
|
126
|
+
if (bytes.length !== 32)
|
|
127
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `${curve} private key must be 32 bytes`);
|
|
128
|
+
if (curve === 'secp256k1' && !secp256k1_1.secp256k1.utils.isValidPrivateKey(bytes)) {
|
|
129
|
+
throw new error_1.ConfigError('CONFIG_INVALID', 'secp256k1 private key is out of range');
|
|
130
|
+
}
|
|
131
|
+
return bytes;
|
|
132
|
+
}
|
|
133
|
+
function fromKeys(id, keys, exportable) {
|
|
134
|
+
const curves = ['secp256k1', 'ed25519'].filter((curve) => keys[curve]);
|
|
135
|
+
if (curves.length === 0)
|
|
136
|
+
throw new error_1.ConfigError('CONFIG_INVALID', 'localSigner needs at least one key');
|
|
137
|
+
return new LocalSigner(id, curves, (curve) => {
|
|
138
|
+
const key = keys[curve];
|
|
139
|
+
if (!key)
|
|
140
|
+
throw new error_1.SigningError('SIGNER_UNAVAILABLE', `signer '${id}' holds no ${curve} key`);
|
|
141
|
+
return key;
|
|
142
|
+
}, exportable);
|
|
143
|
+
}
|
|
144
|
+
function localSigner(options) {
|
|
145
|
+
const keys = {};
|
|
146
|
+
if (options.secp256k1)
|
|
147
|
+
keys.secp256k1 = parseKey(options.secp256k1, 'secp256k1');
|
|
148
|
+
if (options.ed25519)
|
|
149
|
+
keys.ed25519 = parseKey(options.ed25519, 'ed25519');
|
|
150
|
+
return fromKeys(options.id ?? 'local', keys, options.exportable ?? false);
|
|
151
|
+
}
|
|
152
|
+
localSigner.generate = function generate(options) {
|
|
153
|
+
const keys = {};
|
|
154
|
+
const publicKeys = {};
|
|
155
|
+
for (const curve of options.curves) {
|
|
156
|
+
if (curve === 'secp256k1') {
|
|
157
|
+
keys.secp256k1 = secp256k1_1.secp256k1.utils.randomPrivateKey();
|
|
158
|
+
publicKeys.secp256k1 = secp256k1_1.secp256k1.getPublicKey(keys.secp256k1, true);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
keys.ed25519 = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
162
|
+
publicKeys.ed25519 = ed25519_1.ed25519.getPublicKey(keys.ed25519);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
signer: fromKeys(options.id ?? 'local', keys, options.exportable ?? false),
|
|
167
|
+
publicKeys,
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
/** BIP39 mnemonic signer; keys are derived per request from `keyRef.path` and cached in memory. */
|
|
171
|
+
localSigner.fromMnemonic = function fromMnemonic(phrase, options = {}) {
|
|
172
|
+
const seed = (0, hd_1.mnemonicToSeed)((0, secret_1.reveal)(phrase), options.passphrase ? (0, secret_1.reveal)(options.passphrase) : '');
|
|
173
|
+
const cache = new Map();
|
|
174
|
+
const source = (curve, keyRef) => {
|
|
175
|
+
const path = keyRef?.path;
|
|
176
|
+
if (!path) {
|
|
177
|
+
throw new error_1.ConfigError('CONFIG_INVALID', 'mnemonic signers need keyRef.path (set keyRef on the wallet)');
|
|
178
|
+
}
|
|
179
|
+
const cacheKey = `${curve}:${path}`;
|
|
180
|
+
let key = cache.get(cacheKey);
|
|
181
|
+
if (!key) {
|
|
182
|
+
key =
|
|
183
|
+
curve === 'secp256k1' ? (0, hd_1.deriveSecp256k1)(seed, path) : (0, hd_1.deriveEd25519)(seed, path);
|
|
184
|
+
cache.set(cacheKey, key);
|
|
185
|
+
}
|
|
186
|
+
return key;
|
|
187
|
+
};
|
|
188
|
+
return new LocalSigner(options.id ?? 'mnemonic', options.curves ?? ['secp256k1', 'ed25519'], source, options.exportable ?? false);
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/core/signing/local.ts"],"names":[],"mappings":"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","sourcesContent":["import { mod } from '@noble/curves/abstract/modular';\nimport { bytesToNumberBE, numberToBytesBE } from '@noble/curves/abstract/utils';\nimport { ed25519 } from '@noble/curves/ed25519';\nimport { schnorr, secp256k1 } from '@noble/curves/secp256k1';\nimport { ConfigError, SigningError } from '../errors/error';\nimport { reveal, secret, type Secret } from '../secret/secret';\nimport { equalBytes, fromHex } from '../util/bytes';\nimport { deriveEd25519, deriveSecp256k1, mnemonicToSeed } from './hd';\nimport type {\n KeyRef,\n SignatureBundle,\n Signer,\n SigningContext,\n SigningRequest,\n SigningResult,\n} from './types';\n\nexport type Curve = 'secp256k1' | 'ed25519';\nexport type KeySource = (curve: Curve, keyRef: KeyRef | undefined) => Uint8Array;\n\nconst SCHEME_CURVE: Readonly<Record<string, Curve>> = {\n 'secp256k1-ecdsa': 'secp256k1',\n 'secp256k1-schnorr': 'secp256k1',\n ed25519: 'ed25519',\n};\nconst CURVE_SCHEMES: Readonly<Record<Curve, readonly string[]>> = {\n secp256k1: ['secp256k1-ecdsa', 'secp256k1-schnorr'],\n ed25519: ['ed25519'],\n};\n\nexport function curveOfScheme(scheme: string): Curve | undefined {\n return SCHEME_CURVE[scheme];\n}\n\n/** In-process signer. Keys live only in private fields and are never serialized. */\nexport class LocalSigner implements Signer {\n readonly id: string;\n readonly schemes: readonly string[];\n readonly #keys: KeySource;\n readonly #exportable: boolean;\n\n constructor(\n id: string,\n curves: readonly Curve[],\n keys: KeySource,\n exportable: boolean,\n ) {\n this.id = id;\n this.schemes = curves.flatMap((curve) => CURVE_SCHEMES[curve]);\n this.#keys = keys;\n this.#exportable = exportable;\n }\n\n async getPublicKey(scheme: string, keyRef?: KeyRef): Promise<Uint8Array> {\n return publicKeyFor(scheme, this.#key(scheme, keyRef));\n }\n\n async sign(\n requests: readonly SigningRequest[],\n _ctx: SigningContext,\n ): Promise<SigningResult> {\n const signatures: SignatureBundle[] = requests.map((request) =>\n signOne(request, this.#key(request.scheme, request.keyRef)),\n );\n return { status: 'signed', signatures };\n }\n\n async exportKey(scheme: string, keyRef?: KeyRef): Promise<Secret<Uint8Array>> {\n if (!this.#exportable) {\n throw new SigningError(\n 'KEY_NOT_EXPORTABLE',\n `signer '${this.id}' was not created as exportable`,\n );\n }\n return secret(Uint8Array.from(this.#key(scheme, keyRef)));\n }\n\n toJSON(): { id: string; schemes: readonly string[] } {\n return { id: this.id, schemes: this.schemes };\n }\n\n #key(scheme: string, keyRef: KeyRef | undefined): Uint8Array {\n const curve = SCHEME_CURVE[scheme];\n if (!curve || !this.schemes.includes(scheme)) {\n throw new SigningError(\n 'SIGNER_UNAVAILABLE',\n `signer '${this.id}' does not support scheme '${scheme}'`,\n );\n }\n return this.#keys(curve, keyRef);\n }\n}\n\nfunction publicKeyFor(scheme: string, key: Uint8Array): Uint8Array {\n if (scheme === 'secp256k1-ecdsa') return secp256k1.getPublicKey(key, true);\n if (scheme === 'secp256k1-schnorr') return schnorr.getPublicKey(key);\n return ed25519.getPublicKey(key);\n}\n\nfunction assertOwnKey(request: SigningRequest, publicKey: Uint8Array): void {\n if (!equalBytes(request.publicKey, publicKey)) {\n throw new SigningError(\n 'SIGNING_FAILED',\n `request '${request.id}': public key does not belong to this signer`,\n );\n }\n}\n\nfunction assertDigest(request: SigningRequest): void {\n if (request.payload.length !== 32) {\n throw new SigningError(\n 'SIGNING_FAILED',\n `request '${request.id}': ${request.scheme} signs 32-byte digests`,\n );\n }\n}\n\nfunction signOne(request: SigningRequest, key: Uint8Array): SignatureBundle {\n if (request.scheme === 'secp256k1-ecdsa') {\n assertOwnKey(request, secp256k1.getPublicKey(key, true));\n assertDigest(request);\n const signature = secp256k1.sign(request.payload, key, { lowS: true });\n return {\n requestId: request.id,\n bytes: signature.toCompactRawBytes(),\n recovery: signature.recovery,\n };\n }\n if (request.scheme === 'secp256k1-schnorr') {\n const signingKey = request.params?.tweak\n ? tweakPrivateKey(key, request.params.tweak)\n : key;\n assertOwnKey(request, schnorr.getPublicKey(signingKey));\n assertDigest(request);\n return { requestId: request.id, bytes: schnorr.sign(request.payload, signingKey) };\n }\n assertOwnKey(request, ed25519.getPublicKey(key));\n return { requestId: request.id, bytes: ed25519.sign(request.payload, key) };\n}\n\n/** BIP341 key-path tweak: negate for odd Y, then add the tweak modulo n. */\nexport function tweakPrivateKey(key: Uint8Array, tweak: Uint8Array): Uint8Array {\n const n = secp256k1.CURVE.n;\n const t = bytesToNumberBE(tweak);\n if (tweak.length !== 32 || t >= n)\n throw new SigningError('SIGNING_FAILED', 'invalid taproot tweak');\n let d = bytesToNumberBE(key);\n if (!secp256k1.ProjectivePoint.fromPrivateKey(key).hasEvenY()) d = n - d;\n const tweaked = mod(d + t, n);\n if (tweaked === 0n) throw new SigningError('SIGNING_FAILED', 'tweaked key is zero');\n return numberToBytesBE(tweaked, 32);\n}\n\nfunction parseKey(input: Secret<string | Uint8Array>, curve: Curve): Uint8Array {\n const raw = reveal(input);\n let bytes: Uint8Array;\n try {\n bytes = typeof raw === 'string' ? fromHex(raw.trim()) : Uint8Array.from(raw);\n } catch {\n throw new ConfigError('CONFIG_INVALID', `${curve} private key is not valid hex`);\n }\n if (bytes.length !== 32)\n throw new ConfigError('CONFIG_INVALID', `${curve} private key must be 32 bytes`);\n if (curve === 'secp256k1' && !secp256k1.utils.isValidPrivateKey(bytes)) {\n throw new ConfigError('CONFIG_INVALID', 'secp256k1 private key is out of range');\n }\n return bytes;\n}\n\nexport interface LocalSignerOptions {\n readonly id?: string;\n readonly secp256k1?: Secret<string | Uint8Array>;\n readonly ed25519?: Secret<string | Uint8Array>;\n readonly exportable?: boolean;\n}\n\nexport interface GenerateOptions {\n readonly id?: string;\n readonly curves: readonly Curve[];\n readonly exportable?: boolean;\n}\n\nexport interface GeneratedSigner {\n readonly signer: Signer;\n /** secp256k1: 33-byte compressed; ed25519: 32 bytes. */\n readonly publicKeys: Readonly<Partial<Record<Curve, Uint8Array>>>;\n}\n\nfunction fromKeys(\n id: string,\n keys: Partial<Record<Curve, Uint8Array>>,\n exportable: boolean,\n): LocalSigner {\n const curves = (['secp256k1', 'ed25519'] as const).filter((curve) => keys[curve]);\n if (curves.length === 0)\n throw new ConfigError('CONFIG_INVALID', 'localSigner needs at least one key');\n return new LocalSigner(\n id,\n curves,\n (curve) => {\n const key = keys[curve];\n if (!key)\n throw new SigningError(\n 'SIGNER_UNAVAILABLE',\n `signer '${id}' holds no ${curve} key`,\n );\n return key;\n },\n exportable,\n );\n}\n\nexport function localSigner(options: LocalSignerOptions): Signer {\n const keys: Partial<Record<Curve, Uint8Array>> = {};\n if (options.secp256k1) keys.secp256k1 = parseKey(options.secp256k1, 'secp256k1');\n if (options.ed25519) keys.ed25519 = parseKey(options.ed25519, 'ed25519');\n return fromKeys(options.id ?? 'local', keys, options.exportable ?? false);\n}\n\nlocalSigner.generate = function generate(options: GenerateOptions): GeneratedSigner {\n const keys: Partial<Record<Curve, Uint8Array>> = {};\n const publicKeys: Partial<Record<Curve, Uint8Array>> = {};\n for (const curve of options.curves) {\n if (curve === 'secp256k1') {\n keys.secp256k1 = secp256k1.utils.randomPrivateKey();\n publicKeys.secp256k1 = secp256k1.getPublicKey(keys.secp256k1, true);\n } else {\n keys.ed25519 = ed25519.utils.randomPrivateKey();\n publicKeys.ed25519 = ed25519.getPublicKey(keys.ed25519);\n }\n }\n return {\n signer: fromKeys(options.id ?? 'local', keys, options.exportable ?? false),\n publicKeys,\n };\n};\n\nexport interface MnemonicSignerOptions {\n readonly id?: string;\n readonly passphrase?: Secret<string>;\n readonly exportable?: boolean;\n readonly curves?: readonly Curve[];\n}\n\n/** BIP39 mnemonic signer; keys are derived per request from `keyRef.path` and cached in memory. */\nlocalSigner.fromMnemonic = function fromMnemonic(\n phrase: Secret<string>,\n options: MnemonicSignerOptions = {},\n): Signer {\n const seed = mnemonicToSeed(\n reveal(phrase),\n options.passphrase ? reveal(options.passphrase) : '',\n );\n const cache = new Map<string, Uint8Array>();\n const source: KeySource = (curve, keyRef) => {\n const path = keyRef?.path;\n if (!path) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n 'mnemonic signers need keyRef.path (set keyRef on the wallet)',\n );\n }\n const cacheKey = `${curve}:${path}`;\n let key = cache.get(cacheKey);\n if (!key) {\n key =\n curve === 'secp256k1' ? deriveSecp256k1(seed, path) : deriveEd25519(seed, path);\n cache.set(cacheKey, key);\n }\n return key;\n };\n return new LocalSigner(\n options.id ?? 'mnemonic',\n options.curves ?? ['secp256k1', 'ed25519'],\n source,\n options.exportable ?? false,\n );\n};\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Hooks } from '../config/types';
|
|
2
|
+
import type { EventBus } from '../events/bus';
|
|
3
|
+
import type { SchemeCatalog } from '../registry/schemes';
|
|
4
|
+
import type { Clock } from '../util/clock';
|
|
5
|
+
import type { SignatureBundle, SignerTicket, SigningContext, SigningRequest } from './types';
|
|
6
|
+
import type { ResolvedWallet } from './wallet';
|
|
7
|
+
export type OrchestratedResult = {
|
|
8
|
+
readonly status: 'signed';
|
|
9
|
+
readonly signatures: readonly SignatureBundle[];
|
|
10
|
+
} | {
|
|
11
|
+
readonly status: 'pending';
|
|
12
|
+
/** One entry per pending signer that issued a ticket. */
|
|
13
|
+
readonly tickets: readonly SignerTicket[];
|
|
14
|
+
readonly signatures: readonly SignatureBundle[];
|
|
15
|
+
};
|
|
16
|
+
export interface OrchestratorDeps {
|
|
17
|
+
readonly schemes: () => SchemeCatalog;
|
|
18
|
+
readonly events: EventBus;
|
|
19
|
+
readonly clock: Clock;
|
|
20
|
+
readonly hooks: () => Hooks;
|
|
21
|
+
}
|
|
22
|
+
export declare class SigningOrchestrator {
|
|
23
|
+
#private;
|
|
24
|
+
private readonly deps;
|
|
25
|
+
constructor(deps: OrchestratorDeps);
|
|
26
|
+
/** Runs the `beforeSign` policy hook; any throw is a veto. */
|
|
27
|
+
authorize(ctx: SigningContext): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Signs requests not covered by `existing`, batching per signer and verifying every
|
|
30
|
+
* signature. Each `existing` entry for one of `requests` is shape-checked, copied and
|
|
31
|
+
* re-verified first (SIGNATURE_MISMATCH otherwise); entries for other ids are ignored.
|
|
32
|
+
*/
|
|
33
|
+
sign(wallet: ResolvedWallet, callerRequests: readonly SigningRequest[], ctx: SigningContext, existing?: readonly SignatureBundle[]): Promise<OrchestratedResult>;
|
|
34
|
+
verify(request: SigningRequest, signature: SignatureBundle): void;
|
|
35
|
+
/**
|
|
36
|
+
* Merges externally produced signatures (cold/offline/MPC) after verifying each one, and
|
|
37
|
+
* re-verifies `existing` the same way `sign()` does.
|
|
38
|
+
*/
|
|
39
|
+
accept(requests: readonly SigningRequest[], provided: readonly SignatureBundle[], existing: readonly SignatureBundle[]): SignatureBundle[];
|
|
40
|
+
}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SigningOrchestrator = void 0;
|
|
4
|
+
const error_1 = require("../errors/error");
|
|
5
|
+
const redact_1 = require("../secret/redact");
|
|
6
|
+
const guard_1 = require("./guard");
|
|
7
|
+
/** Validates one signature bundle and returns a copy its producer cannot mutate later. */
|
|
8
|
+
function checkBundle(value, reject) {
|
|
9
|
+
if (typeof value !== 'object' || value === null)
|
|
10
|
+
reject('is not an object');
|
|
11
|
+
const { requestId, bytes, recovery } = value;
|
|
12
|
+
if (typeof requestId !== 'string')
|
|
13
|
+
reject('has no string requestId');
|
|
14
|
+
if (!(bytes instanceof Uint8Array))
|
|
15
|
+
reject('has bytes that are not a Uint8Array');
|
|
16
|
+
if (recovery !== undefined) {
|
|
17
|
+
if (typeof recovery !== 'number' || !Number.isInteger(recovery)) {
|
|
18
|
+
reject('has a recovery that is not an integer');
|
|
19
|
+
}
|
|
20
|
+
if (recovery < 0 || recovery > 3)
|
|
21
|
+
reject('has a recovery outside 0..3');
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
requestId,
|
|
25
|
+
bytes: new Uint8Array(bytes),
|
|
26
|
+
...(recovery !== undefined ? { recovery } : {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function checkResult(value, reject) {
|
|
30
|
+
if (typeof value !== 'object' || value === null)
|
|
31
|
+
reject('result is not an object');
|
|
32
|
+
const { status, signatures, ticket } = value;
|
|
33
|
+
if (status === 'pending') {
|
|
34
|
+
if (ticket !== undefined && typeof ticket !== 'string')
|
|
35
|
+
reject('ticket is not a string');
|
|
36
|
+
return ticket === undefined ? { status } : { status, ticket };
|
|
37
|
+
}
|
|
38
|
+
if (status !== 'signed')
|
|
39
|
+
reject('status is neither signed nor pending');
|
|
40
|
+
if (!Array.isArray(signatures))
|
|
41
|
+
reject('signatures is not an array');
|
|
42
|
+
// An index loop, not `.map`: an own `map` property on the array cannot skip the checks.
|
|
43
|
+
const checked = [];
|
|
44
|
+
for (let index = 0; index < signatures.length; index++) {
|
|
45
|
+
const entry = signatures[index];
|
|
46
|
+
checked.push(checkBundle(entry, (problem) => reject(`signature #${index} ${problem}`)));
|
|
47
|
+
}
|
|
48
|
+
return { status, signatures: checked };
|
|
49
|
+
}
|
|
50
|
+
/** Copies a request's bytes (and keyRef/params) so its holder cannot change the original. */
|
|
51
|
+
function snapshotRequest(request) {
|
|
52
|
+
const { keyRef, params } = request;
|
|
53
|
+
return {
|
|
54
|
+
id: request.id,
|
|
55
|
+
scheme: request.scheme,
|
|
56
|
+
payload: new Uint8Array(request.payload),
|
|
57
|
+
payloadKind: request.payloadKind,
|
|
58
|
+
publicKey: new Uint8Array(request.publicKey),
|
|
59
|
+
...(keyRef ? { keyRef: { ...keyRef } } : {}),
|
|
60
|
+
...(params
|
|
61
|
+
? {
|
|
62
|
+
params: {
|
|
63
|
+
...params,
|
|
64
|
+
...(params.tweak ? { tweak: new Uint8Array(params.tweak) } : {}),
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
: {}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** Cancels one ticket; false when the signer cannot cancel or its cancellation failed. */
|
|
71
|
+
async function cancelTicket(signer, ticket) {
|
|
72
|
+
try {
|
|
73
|
+
if (typeof signer?.cancelRequest !== 'function')
|
|
74
|
+
return false;
|
|
75
|
+
await signer.cancelRequest(ticket);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
class SigningOrchestrator {
|
|
83
|
+
deps;
|
|
84
|
+
constructor(deps) {
|
|
85
|
+
this.deps = deps;
|
|
86
|
+
}
|
|
87
|
+
/** Runs the `beforeSign` policy hook; any throw is a veto. */
|
|
88
|
+
async authorize(ctx) {
|
|
89
|
+
const hook = this.deps.hooks().beforeSign;
|
|
90
|
+
if (!hook)
|
|
91
|
+
return;
|
|
92
|
+
try {
|
|
93
|
+
await hook(ctx);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
if ((0, error_1.isCryptoAioError)(error, 'POLICY_REJECTED'))
|
|
97
|
+
throw error;
|
|
98
|
+
const cause = (0, redact_1.sanitizeError)(error);
|
|
99
|
+
throw new error_1.SigningError('POLICY_REJECTED', error instanceof Error ? cause.message : 'signing vetoed by policy', { cause, context: { operationId: ctx.operationId } });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Signs requests not covered by `existing`, batching per signer and verifying every
|
|
104
|
+
* signature. Each `existing` entry for one of `requests` is shape-checked, copied and
|
|
105
|
+
* re-verified first (SIGNATURE_MISMATCH otherwise); entries for other ids are ignored.
|
|
106
|
+
*/
|
|
107
|
+
async sign(wallet, callerRequests, ctx, existing = []) {
|
|
108
|
+
// Private snapshots: neither the caller nor a signer can change what gets verified.
|
|
109
|
+
const requests = callerRequests.map(snapshotRequest);
|
|
110
|
+
const done = this.#adopt(existing, new Map(requests.map((r) => [r.id, r])));
|
|
111
|
+
const groups = new Map();
|
|
112
|
+
for (const request of requests) {
|
|
113
|
+
if (done.has(request.id))
|
|
114
|
+
continue;
|
|
115
|
+
const route = this.#route(wallet, request, { operationId: ctx.operationId });
|
|
116
|
+
const group = groups.get(route.id) ?? { signer: route.signer, requests: [] };
|
|
117
|
+
group.requests.push(request);
|
|
118
|
+
groups.set(route.id, group);
|
|
119
|
+
}
|
|
120
|
+
let pending = false;
|
|
121
|
+
const tickets = [];
|
|
122
|
+
for (const [signerId, group] of groups) {
|
|
123
|
+
let result;
|
|
124
|
+
try {
|
|
125
|
+
result = await this.#signGroup(signerId, group.signer, group.requests, ctx, done);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw await this.#withdraw(error, tickets, groups);
|
|
129
|
+
}
|
|
130
|
+
if (result.status === 'pending') {
|
|
131
|
+
pending = true;
|
|
132
|
+
if (result.ticket !== undefined)
|
|
133
|
+
tickets.push({ signerId, ticket: result.ticket });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const signatures = requests
|
|
137
|
+
.map((request) => done.get(request.id))
|
|
138
|
+
.filter((s) => s !== undefined);
|
|
139
|
+
return pending
|
|
140
|
+
? { status: 'pending', tickets, signatures }
|
|
141
|
+
: { status: 'signed', signatures };
|
|
142
|
+
}
|
|
143
|
+
verify(request, signature) {
|
|
144
|
+
const valid = this.deps
|
|
145
|
+
.schemes()
|
|
146
|
+
.get(request.scheme)
|
|
147
|
+
.verify({
|
|
148
|
+
publicKey: request.publicKey,
|
|
149
|
+
payload: request.payload,
|
|
150
|
+
signature: signature.bytes,
|
|
151
|
+
...(signature.recovery !== undefined ? { recovery: signature.recovery } : {}),
|
|
152
|
+
...(request.params ? { params: request.params } : {}),
|
|
153
|
+
});
|
|
154
|
+
if (!valid) {
|
|
155
|
+
throw new error_1.SigningError('SIGNATURE_MISMATCH', `signature for request '${request.id}' does not verify against the expected public key`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Merges externally produced signatures (cold/offline/MPC) after verifying each one, and
|
|
160
|
+
* re-verifies `existing` the same way `sign()` does.
|
|
161
|
+
*/
|
|
162
|
+
accept(requests, provided, existing) {
|
|
163
|
+
if (!Array.isArray(provided)) {
|
|
164
|
+
throw new error_1.ValidationError('INVALID_INTENT', 'external signatures must be an array');
|
|
165
|
+
}
|
|
166
|
+
const byId = new Map(requests.map((r) => [r.id, r]));
|
|
167
|
+
const merged = this.#adopt(existing, byId);
|
|
168
|
+
for (const [index, entry] of provided.entries()) {
|
|
169
|
+
const signature = checkBundle(entry, (problem) => {
|
|
170
|
+
throw new error_1.ValidationError('INVALID_INTENT', `external signature #${index} ${problem}`);
|
|
171
|
+
});
|
|
172
|
+
const request = byId.get(signature.requestId);
|
|
173
|
+
if (!request) {
|
|
174
|
+
throw new error_1.ValidationError('INVALID_INTENT', `unknown signing request '${signature.requestId}'`);
|
|
175
|
+
}
|
|
176
|
+
this.verify(request, signature);
|
|
177
|
+
merged.set(signature.requestId, signature);
|
|
178
|
+
}
|
|
179
|
+
return requests
|
|
180
|
+
.map((r) => merged.get(r.id))
|
|
181
|
+
.filter((s) => s !== undefined);
|
|
182
|
+
}
|
|
183
|
+
/** Picks the signer for a request; the routing reads are guarded like signer calls. */
|
|
184
|
+
#route(wallet, request, context) {
|
|
185
|
+
const unavailable = `no signer of wallet '${wallet.name}' can sign request '${request.id}' (${request.scheme})`;
|
|
186
|
+
let route;
|
|
187
|
+
try {
|
|
188
|
+
route = wallet.signerFor(request.keyRef);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
throw (0, guard_1.signerFailure)(error, 'SIGNER_UNAVAILABLE', unavailable, context);
|
|
192
|
+
}
|
|
193
|
+
if (!route ||
|
|
194
|
+
!(0, guard_1.signerSchemes)(route.id, route.signer, context).includes(request.scheme)) {
|
|
195
|
+
throw new error_1.SigningError('SIGNER_UNAVAILABLE', unavailable, { context });
|
|
196
|
+
}
|
|
197
|
+
return route;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Re-checks previously collected signatures before trusting them: each entry whose
|
|
201
|
+
* `requestId` names one of `byId` is shape-checked, copied and verified; others are ignored.
|
|
202
|
+
*/
|
|
203
|
+
#adopt(existing, byId) {
|
|
204
|
+
const adopted = new Map();
|
|
205
|
+
for (let index = 0; index < existing.length; index++) {
|
|
206
|
+
const entry = existing[index];
|
|
207
|
+
const id = typeof entry === 'object' && entry !== null
|
|
208
|
+
? entry.requestId
|
|
209
|
+
: undefined;
|
|
210
|
+
if (typeof id !== 'string' || !byId.has(id))
|
|
211
|
+
continue;
|
|
212
|
+
const signature = checkBundle(entry, (problem) => {
|
|
213
|
+
throw new error_1.SigningError('SIGNATURE_MISMATCH', `existing signature for request '${id}' ${problem}`);
|
|
214
|
+
});
|
|
215
|
+
const request = byId.get(signature.requestId);
|
|
216
|
+
if (!request)
|
|
217
|
+
continue;
|
|
218
|
+
this.verify(request, signature);
|
|
219
|
+
adopted.set(request.id, signature);
|
|
220
|
+
}
|
|
221
|
+
return adopted;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Asks one signer for its batch. The signer gets fresh copies; its signatures are verified
|
|
225
|
+
* against `requests` (the orchestrator's snapshots) and land in `done`.
|
|
226
|
+
*/
|
|
227
|
+
async #signGroup(signerId, signer, requests, ctx, done) {
|
|
228
|
+
const started = this.deps.clock.now();
|
|
229
|
+
this.deps.events.emit('signer.requested', {
|
|
230
|
+
namespace: ctx.namespace,
|
|
231
|
+
operationId: ctx.operationId,
|
|
232
|
+
signerId,
|
|
233
|
+
requests: requests.length,
|
|
234
|
+
});
|
|
235
|
+
try {
|
|
236
|
+
const result = await this.#request(signerId, signer, requests.map(snapshotRequest), ctx);
|
|
237
|
+
if (result.status === 'signed') {
|
|
238
|
+
for (const request of requests) {
|
|
239
|
+
const signature = result.signatures.find((s) => s.requestId === request.id);
|
|
240
|
+
if (!signature) {
|
|
241
|
+
throw new error_1.SigningError('SIGNING_FAILED', `signer '${signerId}' returned no signature for request '${request.id}'`, { context: { operationId: ctx.operationId } });
|
|
242
|
+
}
|
|
243
|
+
this.verify(request, signature);
|
|
244
|
+
done.set(request.id, signature);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
this.#completed(ctx, signerId, result.status, started);
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
this.#completed(ctx, signerId, 'error', started);
|
|
252
|
+
throw error;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Before a failure escapes `sign()`, cancels (best effort) every ticket issued earlier
|
|
257
|
+
* in the same call through the signer that issued it. A ticket that could not be cancelled
|
|
258
|
+
* (no `cancelRequest`, or it threw) is counted in `details.cancelFailures`.
|
|
259
|
+
*/
|
|
260
|
+
async #withdraw(error, tickets, groups) {
|
|
261
|
+
if (tickets.length === 0)
|
|
262
|
+
return error;
|
|
263
|
+
let cancelFailures = 0;
|
|
264
|
+
for (const { signerId, ticket } of tickets) {
|
|
265
|
+
if (!(await cancelTicket(groups.get(signerId)?.signer, ticket)))
|
|
266
|
+
cancelFailures += 1;
|
|
267
|
+
}
|
|
268
|
+
if (!(0, error_1.isCryptoAioError)(error))
|
|
269
|
+
return error;
|
|
270
|
+
return (0, error_1.withContext)(error, {}, { details: { ...error.details, cancelFailures } });
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Calls one signer and validates what it returns. A non-CryptoAioError failure (including
|
|
274
|
+
* a malformed result that cannot even be read) becomes SIGNING_FAILED with a sanitized
|
|
275
|
+
* cause: custody backends put URLs and credentials in their messages.
|
|
276
|
+
*/
|
|
277
|
+
async #request(signerId, signer, requests, ctx) {
|
|
278
|
+
const context = { operationId: ctx.operationId };
|
|
279
|
+
try {
|
|
280
|
+
const raw = await signer.sign(requests, ctx);
|
|
281
|
+
return checkResult(raw, (problem) => {
|
|
282
|
+
throw new error_1.SigningError('SIGNING_FAILED', `signer '${signerId}' returned a malformed result: ${problem}`, { context });
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
throw (0, guard_1.signerFailure)(error, 'SIGNING_FAILED', `signer '${signerId}' failed`, context);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
#completed(ctx, signerId, status, started) {
|
|
290
|
+
this.deps.events.emit('signer.completed', {
|
|
291
|
+
namespace: ctx.namespace,
|
|
292
|
+
operationId: ctx.operationId,
|
|
293
|
+
signerId,
|
|
294
|
+
status,
|
|
295
|
+
latencyMs: this.deps.clock.now() - started,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
exports.SigningOrchestrator = SigningOrchestrator;
|
|
300
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/core/signing/orchestrator.ts"],"names":[],"mappings":";;;AACA,2CAMyB;AAGzB,6CAAiD;AASjD,mCAAuD;AA0BvD,0FAA0F;AAC1F,SAAS,WAAW,CAAC,KAAc,EAAE,MAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5E,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAgC,CAAC;IACxE,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACrE,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;QAAE,MAAM,CAAC,qCAAqC,CAAC,CAAC;IAClF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,uCAAuC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC;YAAE,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO;QACL,SAAS;QACT,KAAK,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC;QAC5B,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,MAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACnF,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAgC,CAAC;IACxE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ;YACpD,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACnC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ;QAAE,MAAM,CAAC,sCAAsC,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,MAAM,CAAC,4BAA4B,CAAC,CAAC;IACrE,wFAAwF;IACxF,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,KAAK,GAAY,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CACV,WAAW,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED,6FAA6F;AAC7F,SAAS,eAAe,CAAC,OAAuB;IAC9C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACnC,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,MAAM;YACR,CAAC,CAAC;gBACE,MAAM,EAAE;oBACN,GAAG,MAAM;oBACT,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACjE;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,KAAK,UAAU,YAAY,CACzB,MAA0B,EAC1B,MAAc;IAEd,IAAI,CAAC;QACH,IAAI,OAAO,MAAM,EAAE,aAAa,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9D,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAa,mBAAmB;IACD;IAA7B,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,8DAA8D;IAC9D,KAAK,CAAC,SAAS,CAAC,GAAmB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAA,wBAAgB,EAAC,KAAK,EAAE,iBAAiB,CAAC;gBAAE,MAAM,KAAK,CAAC;YAC5D,MAAM,KAAK,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,CAAC;YACnC,MAAM,IAAI,oBAAY,CACpB,iBAAiB,EACjB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,EACnE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CACrD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CACR,MAAsB,EACtB,cAAyC,EACzC,GAAmB,EACnB,WAAuC,EAAE;QAEzC,oFAAoF;QACpF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0D,CAAC;QACjF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC7E,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACvC,IAAI,MAAqB,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ;aACxB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACxD,OAAO,OAAO;YACZ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE;YAC5C,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,OAAuB,EAAE,SAA0B;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI;aACpB,OAAO,EAAE;aACT,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;aACnB,MAAM,CAAC;YACN,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,SAAS,CAAC,KAAK;YAC1B,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,oBAAY,CACpB,oBAAoB,EACpB,0BAA0B,OAAO,CAAC,EAAE,mDAAmD,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CACJ,QAAmC,EACnC,QAAoC,EACpC,QAAoC;QAEpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,uBAAe,CAAC,gBAAgB,EAAE,sCAAsC,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC/C,MAAM,IAAI,uBAAe,CACvB,gBAAgB,EAChB,uBAAuB,KAAK,IAAI,OAAO,EAAE,CAC1C,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,uBAAe,CACvB,gBAAgB,EAChB,4BAA4B,SAAS,CAAC,SAAS,GAAG,CACnD,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,uFAAuF;IACvF,MAAM,CACJ,MAAsB,EACtB,OAAuB,EACvB,OAAqB;QAErB,MAAM,WAAW,GAAG,wBAAwB,MAAM,CAAC,IAAI,uBAAuB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC;QAChH,IAAI,KAAmE,CAAC;QACxE,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,qBAAa,EAAC,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACzE,CAAC;QACD,IACE,CAAC,KAAK;YACN,CAAC,IAAA,qBAAa,EAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EACxE,CAAC;YACD,MAAM,IAAI,oBAAY,CAAC,oBAAoB,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,MAAM,CACJ,QAAoC,EACpC,IAAyC;QAEzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;QACnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,KAAK,GAAY,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,EAAE,GACN,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;gBACzC,CAAC,CAAE,KAAiC,CAAC,SAAS;gBAC9C,CAAC,CAAC,SAAS,CAAC;YAChB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YACtD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC/C,MAAM,IAAI,oBAAY,CACpB,oBAAoB,EACpB,mCAAmC,EAAE,KAAK,OAAO,EAAE,CACpD,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CACd,QAAgB,EAChB,MAAc,EACd,QAAmC,EACnC,GAAmB,EACnB,IAAkC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACxC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,QAAQ;YACR,QAAQ,EAAE,QAAQ,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,QAAQ,EACR,MAAM,EACN,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,EAC7B,GAAG,CACJ,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC5E,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,MAAM,IAAI,oBAAY,CACpB,gBAAgB,EAChB,WAAW,QAAQ,wCAAwC,OAAO,CAAC,EAAE,GAAG,EACxE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAC9C,CAAC;oBACJ,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACvD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CACb,KAAc,EACd,OAAgC,EAChC,MAAwD;QAExD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC7D,cAAc,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,IAAA,wBAAgB,EAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,OAAO,IAAA,mBAAW,EAAC,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,MAAc,EACd,QAAmC,EACnC,GAAmB;QAEnB,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAY,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtD,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;gBAClC,MAAM,IAAI,oBAAY,CACpB,gBAAgB,EAChB,WAAW,QAAQ,kCAAkC,OAAO,EAAE,EAC9D,EAAE,OAAO,EAAE,CACZ,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAA,qBAAa,EACjB,KAAK,EACL,gBAAgB,EAChB,WAAW,QAAQ,UAAU,EAC7B,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC;IAED,UAAU,CACR,GAAmB,EACnB,QAAgB,EAChB,MAAsC,EACtC,OAAe;QAEf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACxC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,QAAQ;YACR,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO;SAC3C,CAAC,CAAC;IACL,CAAC;CACF;AA5RD,kDA4RC","sourcesContent":["import type { Hooks } from '../config/types';\nimport {\n SigningError,\n ValidationError,\n isCryptoAioError,\n withContext,\n type ErrorContext,\n} from '../errors/error';\nimport type { EventBus } from '../events/bus';\nimport type { SchemeCatalog } from '../registry/schemes';\nimport { sanitizeError } from '../secret/redact';\nimport type { Clock } from '../util/clock';\nimport type {\n SignatureBundle,\n Signer,\n SignerTicket,\n SigningContext,\n SigningRequest,\n} from './types';\nimport { signerFailure, signerSchemes } from './guard';\nimport type { ResolvedWallet } from './wallet';\n\nexport type OrchestratedResult =\n | { readonly status: 'signed'; readonly signatures: readonly SignatureBundle[] }\n | {\n readonly status: 'pending';\n /** One entry per pending signer that issued a ticket. */\n readonly tickets: readonly SignerTicket[];\n readonly signatures: readonly SignatureBundle[];\n };\n\nexport interface OrchestratorDeps {\n readonly schemes: () => SchemeCatalog;\n readonly events: EventBus;\n readonly clock: Clock;\n readonly hooks: () => Hooks;\n}\n\n/** A signer's `SigningResult` after shape validation, holding the orchestrator's own copies. */\ntype CheckedResult =\n | { readonly status: 'signed'; readonly signatures: readonly SignatureBundle[] }\n | { readonly status: 'pending'; readonly ticket?: string };\n\ntype Reject = (problem: string) => never;\n\n/** Validates one signature bundle and returns a copy its producer cannot mutate later. */\nfunction checkBundle(value: unknown, reject: Reject): SignatureBundle {\n if (typeof value !== 'object' || value === null) reject('is not an object');\n const { requestId, bytes, recovery } = value as Record<string, unknown>;\n if (typeof requestId !== 'string') reject('has no string requestId');\n if (!(bytes instanceof Uint8Array)) reject('has bytes that are not a Uint8Array');\n if (recovery !== undefined) {\n if (typeof recovery !== 'number' || !Number.isInteger(recovery)) {\n reject('has a recovery that is not an integer');\n }\n if (recovery < 0 || recovery > 3) reject('has a recovery outside 0..3');\n }\n return {\n requestId,\n bytes: new Uint8Array(bytes),\n ...(recovery !== undefined ? { recovery } : {}),\n };\n}\n\nfunction checkResult(value: unknown, reject: Reject): CheckedResult {\n if (typeof value !== 'object' || value === null) reject('result is not an object');\n const { status, signatures, ticket } = value as Record<string, unknown>;\n if (status === 'pending') {\n if (ticket !== undefined && typeof ticket !== 'string')\n reject('ticket is not a string');\n return ticket === undefined ? { status } : { status, ticket };\n }\n if (status !== 'signed') reject('status is neither signed nor pending');\n if (!Array.isArray(signatures)) reject('signatures is not an array');\n // An index loop, not `.map`: an own `map` property on the array cannot skip the checks.\n const checked: SignatureBundle[] = [];\n for (let index = 0; index < signatures.length; index++) {\n const entry: unknown = signatures[index];\n checked.push(\n checkBundle(entry, (problem) => reject(`signature #${index} ${problem}`)),\n );\n }\n return { status, signatures: checked };\n}\n\n/** Copies a request's bytes (and keyRef/params) so its holder cannot change the original. */\nfunction snapshotRequest(request: SigningRequest): SigningRequest {\n const { keyRef, params } = request;\n return {\n id: request.id,\n scheme: request.scheme,\n payload: new Uint8Array(request.payload),\n payloadKind: request.payloadKind,\n publicKey: new Uint8Array(request.publicKey),\n ...(keyRef ? { keyRef: { ...keyRef } } : {}),\n ...(params\n ? {\n params: {\n ...params,\n ...(params.tweak ? { tweak: new Uint8Array(params.tweak) } : {}),\n },\n }\n : {}),\n };\n}\n\n/** Cancels one ticket; false when the signer cannot cancel or its cancellation failed. */\nasync function cancelTicket(\n signer: Signer | undefined,\n ticket: string,\n): Promise<boolean> {\n try {\n if (typeof signer?.cancelRequest !== 'function') return false;\n await signer.cancelRequest(ticket);\n return true;\n } catch {\n return false;\n }\n}\n\nexport class SigningOrchestrator {\n constructor(private readonly deps: OrchestratorDeps) {}\n\n /** Runs the `beforeSign` policy hook; any throw is a veto. */\n async authorize(ctx: SigningContext): Promise<void> {\n const hook = this.deps.hooks().beforeSign;\n if (!hook) return;\n try {\n await hook(ctx);\n } catch (error) {\n if (isCryptoAioError(error, 'POLICY_REJECTED')) throw error;\n const cause = sanitizeError(error);\n throw new SigningError(\n 'POLICY_REJECTED',\n error instanceof Error ? cause.message : 'signing vetoed by policy',\n { cause, context: { operationId: ctx.operationId } },\n );\n }\n }\n\n /**\n * Signs requests not covered by `existing`, batching per signer and verifying every\n * signature. Each `existing` entry for one of `requests` is shape-checked, copied and\n * re-verified first (SIGNATURE_MISMATCH otherwise); entries for other ids are ignored.\n */\n async sign(\n wallet: ResolvedWallet,\n callerRequests: readonly SigningRequest[],\n ctx: SigningContext,\n existing: readonly SignatureBundle[] = [],\n ): Promise<OrchestratedResult> {\n // Private snapshots: neither the caller nor a signer can change what gets verified.\n const requests = callerRequests.map(snapshotRequest);\n const done = this.#adopt(existing, new Map(requests.map((r) => [r.id, r])));\n const groups = new Map<string, { signer: Signer; requests: SigningRequest[] }>();\n for (const request of requests) {\n if (done.has(request.id)) continue;\n const route = this.#route(wallet, request, { operationId: ctx.operationId });\n const group = groups.get(route.id) ?? { signer: route.signer, requests: [] };\n group.requests.push(request);\n groups.set(route.id, group);\n }\n let pending = false;\n const tickets: SignerTicket[] = [];\n for (const [signerId, group] of groups) {\n let result: CheckedResult;\n try {\n result = await this.#signGroup(signerId, group.signer, group.requests, ctx, done);\n } catch (error) {\n throw await this.#withdraw(error, tickets, groups);\n }\n if (result.status === 'pending') {\n pending = true;\n if (result.ticket !== undefined)\n tickets.push({ signerId, ticket: result.ticket });\n }\n }\n const signatures = requests\n .map((request) => done.get(request.id))\n .filter((s): s is SignatureBundle => s !== undefined);\n return pending\n ? { status: 'pending', tickets, signatures }\n : { status: 'signed', signatures };\n }\n\n verify(request: SigningRequest, signature: SignatureBundle): void {\n const valid = this.deps\n .schemes()\n .get(request.scheme)\n .verify({\n publicKey: request.publicKey,\n payload: request.payload,\n signature: signature.bytes,\n ...(signature.recovery !== undefined ? { recovery: signature.recovery } : {}),\n ...(request.params ? { params: request.params } : {}),\n });\n if (!valid) {\n throw new SigningError(\n 'SIGNATURE_MISMATCH',\n `signature for request '${request.id}' does not verify against the expected public key`,\n );\n }\n }\n\n /**\n * Merges externally produced signatures (cold/offline/MPC) after verifying each one, and\n * re-verifies `existing` the same way `sign()` does.\n */\n accept(\n requests: readonly SigningRequest[],\n provided: readonly SignatureBundle[],\n existing: readonly SignatureBundle[],\n ): SignatureBundle[] {\n if (!Array.isArray(provided)) {\n throw new ValidationError('INVALID_INTENT', 'external signatures must be an array');\n }\n const byId = new Map(requests.map((r) => [r.id, r]));\n const merged = this.#adopt(existing, byId);\n for (const [index, entry] of provided.entries()) {\n const signature = checkBundle(entry, (problem) => {\n throw new ValidationError(\n 'INVALID_INTENT',\n `external signature #${index} ${problem}`,\n );\n });\n const request = byId.get(signature.requestId);\n if (!request) {\n throw new ValidationError(\n 'INVALID_INTENT',\n `unknown signing request '${signature.requestId}'`,\n );\n }\n this.verify(request, signature);\n merged.set(signature.requestId, signature);\n }\n return requests\n .map((r) => merged.get(r.id))\n .filter((s): s is SignatureBundle => s !== undefined);\n }\n\n /** Picks the signer for a request; the routing reads are guarded like signer calls. */\n #route(\n wallet: ResolvedWallet,\n request: SigningRequest,\n context: ErrorContext,\n ): { readonly id: string; readonly signer: Signer } {\n const unavailable = `no signer of wallet '${wallet.name}' can sign request '${request.id}' (${request.scheme})`;\n let route: { readonly id: string; readonly signer: Signer } | undefined;\n try {\n route = wallet.signerFor(request.keyRef);\n } catch (error) {\n throw signerFailure(error, 'SIGNER_UNAVAILABLE', unavailable, context);\n }\n if (\n !route ||\n !signerSchemes(route.id, route.signer, context).includes(request.scheme)\n ) {\n throw new SigningError('SIGNER_UNAVAILABLE', unavailable, { context });\n }\n return route;\n }\n\n /**\n * Re-checks previously collected signatures before trusting them: each entry whose\n * `requestId` names one of `byId` is shape-checked, copied and verified; others are ignored.\n */\n #adopt(\n existing: readonly SignatureBundle[],\n byId: ReadonlyMap<string, SigningRequest>,\n ): Map<string, SignatureBundle> {\n const adopted = new Map<string, SignatureBundle>();\n for (let index = 0; index < existing.length; index++) {\n const entry: unknown = existing[index];\n const id =\n typeof entry === 'object' && entry !== null\n ? (entry as { requestId?: unknown }).requestId\n : undefined;\n if (typeof id !== 'string' || !byId.has(id)) continue;\n const signature = checkBundle(entry, (problem) => {\n throw new SigningError(\n 'SIGNATURE_MISMATCH',\n `existing signature for request '${id}' ${problem}`,\n );\n });\n const request = byId.get(signature.requestId);\n if (!request) continue;\n this.verify(request, signature);\n adopted.set(request.id, signature);\n }\n return adopted;\n }\n\n /**\n * Asks one signer for its batch. The signer gets fresh copies; its signatures are verified\n * against `requests` (the orchestrator's snapshots) and land in `done`.\n */\n async #signGroup(\n signerId: string,\n signer: Signer,\n requests: readonly SigningRequest[],\n ctx: SigningContext,\n done: Map<string, SignatureBundle>,\n ): Promise<CheckedResult> {\n const started = this.deps.clock.now();\n this.deps.events.emit('signer.requested', {\n namespace: ctx.namespace,\n operationId: ctx.operationId,\n signerId,\n requests: requests.length,\n });\n try {\n const result = await this.#request(\n signerId,\n signer,\n requests.map(snapshotRequest),\n ctx,\n );\n if (result.status === 'signed') {\n for (const request of requests) {\n const signature = result.signatures.find((s) => s.requestId === request.id);\n if (!signature) {\n throw new SigningError(\n 'SIGNING_FAILED',\n `signer '${signerId}' returned no signature for request '${request.id}'`,\n { context: { operationId: ctx.operationId } },\n );\n }\n this.verify(request, signature);\n done.set(request.id, signature);\n }\n }\n this.#completed(ctx, signerId, result.status, started);\n return result;\n } catch (error) {\n this.#completed(ctx, signerId, 'error', started);\n throw error;\n }\n }\n\n /**\n * Before a failure escapes `sign()`, cancels (best effort) every ticket issued earlier\n * in the same call through the signer that issued it. A ticket that could not be cancelled\n * (no `cancelRequest`, or it threw) is counted in `details.cancelFailures`.\n */\n async #withdraw(\n error: unknown,\n tickets: readonly SignerTicket[],\n groups: ReadonlyMap<string, { readonly signer: Signer }>,\n ): Promise<unknown> {\n if (tickets.length === 0) return error;\n let cancelFailures = 0;\n for (const { signerId, ticket } of tickets) {\n if (!(await cancelTicket(groups.get(signerId)?.signer, ticket)))\n cancelFailures += 1;\n }\n if (!isCryptoAioError(error)) return error;\n return withContext(error, {}, { details: { ...error.details, cancelFailures } });\n }\n\n /**\n * Calls one signer and validates what it returns. A non-CryptoAioError failure (including\n * a malformed result that cannot even be read) becomes SIGNING_FAILED with a sanitized\n * cause: custody backends put URLs and credentials in their messages.\n */\n async #request(\n signerId: string,\n signer: Signer,\n requests: readonly SigningRequest[],\n ctx: SigningContext,\n ): Promise<CheckedResult> {\n const context = { operationId: ctx.operationId };\n try {\n const raw: unknown = await signer.sign(requests, ctx);\n return checkResult(raw, (problem) => {\n throw new SigningError(\n 'SIGNING_FAILED',\n `signer '${signerId}' returned a malformed result: ${problem}`,\n { context },\n );\n });\n } catch (error) {\n throw signerFailure(\n error,\n 'SIGNING_FAILED',\n `signer '${signerId}' failed`,\n context,\n );\n }\n }\n\n #completed(\n ctx: SigningContext,\n signerId: string,\n status: 'signed' | 'pending' | 'error',\n started: number,\n ): void {\n this.deps.events.emit('signer.completed', {\n namespace: ctx.namespace,\n operationId: ctx.operationId,\n signerId,\n status,\n latencyMs: this.deps.clock.now() - started,\n });\n }\n}\n"]}
|