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 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../src/core/model/transaction.ts"],"names":[],"mappings":"","sourcesContent":["import type { ErrorCode } from '../errors/codes';\nimport type { SigningRequest } from '../signing/types';\nimport type { Address } from './address';\nimport type { Amount } from './amount';\nimport type { AssetInfo, AssetRef } from './asset';\nimport type { FeeEstimateDraft } from './fee';\nimport type { IntentSummary } from './intent';\nimport type { OrderingData } from './ordering';\n\n/** Protocol data only (bytes or protocol JSON), never SDK objects. */\nexport interface RawTx {\n readonly encoding: 'hex' | 'base64' | 'json';\n readonly data: string;\n}\n\nexport type AttemptIdKind = 'tx-hash' | 'txid' | 'signature' | 'message-hash';\n\n/** Identity of a signed payload. `canonical: false` = not the final protocol tx hash (TON). */\nexport interface AttemptRef {\n readonly id: string;\n readonly idKind: AttemptIdKind;\n readonly canonical: boolean;\n}\n\nexport type TxState =\n | 'unknown'\n | 'pending'\n | 'mempool'\n | 'included'\n | 'final'\n | 'failed'\n | 'dropped'\n | 'replaced'\n | 'expired'\n | 'refused'\n | 'rejected';\n\nexport type Evidence = 'observed' | 'proven';\nexport type Finality = 'none' | 'probabilistic' | 'final';\n\nexport interface TxStatus {\n readonly state: TxState;\n readonly evidence: Evidence;\n readonly confirmations: number;\n readonly txHash?: string;\n readonly blockHash?: string;\n readonly blockHeight?: bigint;\n readonly finality: Finality;\n /**\n * Why the transaction did not go through. Present only with `failed`, `refused` or\n * `rejected`. It is either a broadcast's refusal or rejection text, or the chain\n * driver's text for an on-chain failure. It is a short, fixed text with no addresses,\n * amounts or node detail. It is `sensitive` data, so it never appears in events\n * or logs.\n */\n readonly reason?: string;\n readonly replacedBy?: string;\n}\n\nexport interface BlockRef {\n readonly height: bigint;\n readonly hash: string;\n readonly timestamp?: number;\n}\n\nexport interface Block {\n readonly height: bigint;\n readonly hash: string;\n readonly parentHash: string;\n readonly timestamp?: number;\n readonly transactionIds?: readonly string[];\n}\n\nexport type TransferSource = 'native' | 'token-event' | 'internal';\n\ninterface TransferBase {\n /** Deterministic: `${txId}:${locator}`. */\n readonly id: string;\n readonly from: readonly Address[];\n readonly to: Address;\n readonly source: TransferSource;\n readonly memo?: string;\n}\n\n/** A transfer whose asset resolved on this chain and network. */\nexport interface ResolvedTransfer extends TransferBase {\n readonly asset: AssetInfo;\n readonly amount: Amount;\n readonly unresolved?: undefined;\n}\n\n/**\n * A transfer whose asset could not be resolved, for example a token with unusable\n * metadata or a failing decimals call. It has no `asset` and no `amount`: without the\n * asset's decimals there is no `Amount`. `unresolved` keeps the chain's raw data instead,\n * and the transaction's `decoding` is `'partial'`. A read never fails on such a transfer;\n * only a retryable failure fails the read, so it can be retried.\n */\nexport interface UnresolvedTransfer extends TransferBase {\n readonly asset?: undefined;\n readonly amount?: undefined;\n readonly unresolved: {\n /** The asset as the chain names it. */\n readonly asset: AssetRef;\n /** The amount in base units, never scaled. */\n readonly amount: bigint;\n /** Why the asset did not resolve, e.g. `ASSET_RESOLUTION`. */\n readonly code: ErrorCode;\n };\n}\n\n/** Check `unresolved` (or `amount`) before using a transfer's `asset` and `amount`. */\nexport type Transfer = ResolvedTransfer | UnresolvedTransfer;\n\nexport type Decoding = 'complete' | 'partial' | 'none';\n\nexport interface Transaction {\n readonly id: string;\n readonly chain: string;\n readonly network: string;\n readonly status: TxStatus;\n readonly block?: BlockRef;\n readonly fee?: readonly Amount[];\n readonly transfers: readonly Transfer[];\n readonly decoding: Decoding;\n readonly raw?: RawTx;\n readonly details: Readonly<Record<string, unknown>>;\n}\n\nexport interface UnsignedTx {\n readonly payload: RawTx;\n /** Only when identity is fixed before signing (Tron; UTXO with witness-only inputs). */\n readonly expectedRef?: AttemptRef;\n readonly signingRequests: readonly SigningRequest[];\n readonly ordering: OrderingData;\n readonly fee: FeeEstimateDraft;\n readonly summary: IntentSummary;\n}\n\nexport interface SignedTx {\n readonly raw: RawTx;\n readonly ref: AttemptRef;\n}\n"]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { type MappingContext } from '../blockchain/mapping';
|
|
2
|
+
import type { BlockSource } from '../driver/types';
|
|
3
|
+
import type { EventBus } from '../events/bus';
|
|
4
|
+
import type { AssetRef } from '../model/asset';
|
|
5
|
+
import type { Block, Transaction } from '../model/transaction';
|
|
6
|
+
import type { CursorStore } from '../store/types';
|
|
7
|
+
import { type StaleViewSource } from '../transport/stale-view';
|
|
8
|
+
import type { Clock } from '../util/clock';
|
|
9
|
+
export interface ScannerOptions {
|
|
10
|
+
/** Durable name of this consumer's position (namespaced per container, chain and network). */
|
|
11
|
+
readonly cursorKey: string;
|
|
12
|
+
/**
|
|
13
|
+
* Where a NEW cursor starts; ignored when a stored cursor exists. Default `'latest'`. The
|
|
14
|
+
* new cursor also retains the `reorgWindow` blocks below the start, so a rollback within
|
|
15
|
+
* the first window can name blocks that were never delivered, and the replay that follows
|
|
16
|
+
* can start below `from`.
|
|
17
|
+
*/
|
|
18
|
+
readonly from?: 'latest' | bigint;
|
|
19
|
+
/**
|
|
20
|
+
* `'final'` emits finalized blocks only; a rollback can then still come from a provider
|
|
21
|
+
* inconsistency. `'head'` follows the tip and may roll back within the window.
|
|
22
|
+
* Default `'head'`. The mode is not stored with the cursor: resuming a head-mode cursor in
|
|
23
|
+
* final mode keeps the unfinalized blocks it already delivered.
|
|
24
|
+
*/
|
|
25
|
+
readonly mode?: 'final' | 'head';
|
|
26
|
+
/** Passed to the driver's block source; each entry is resolved on this chain and network. */
|
|
27
|
+
readonly filter?: {
|
|
28
|
+
readonly addresses?: readonly string[];
|
|
29
|
+
readonly assets?: readonly (AssetRef | string)[];
|
|
30
|
+
};
|
|
31
|
+
/** Blocks retained for rollback detection (default: the network's reorgWindow). */
|
|
32
|
+
readonly reorgWindow?: number;
|
|
33
|
+
readonly pollIntervalMs?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Stops the scan, also while it waits for new blocks. `iterator.return()` only takes effect
|
|
36
|
+
* once a pending `next()` settles, so an idle scanner is stopped with this signal.
|
|
37
|
+
*/
|
|
38
|
+
readonly signal?: AbortSignal;
|
|
39
|
+
}
|
|
40
|
+
export interface Checkpoint {
|
|
41
|
+
readonly height: bigint;
|
|
42
|
+
readonly hash: string;
|
|
43
|
+
}
|
|
44
|
+
/** A scan event without its `ack()`: a delivered block, or a rollback to a checkpoint. */
|
|
45
|
+
export type ScanEventBody = {
|
|
46
|
+
readonly type: 'block';
|
|
47
|
+
readonly block: Block;
|
|
48
|
+
readonly transactions: readonly Transaction[];
|
|
49
|
+
} | {
|
|
50
|
+
readonly type: 'rollback';
|
|
51
|
+
readonly to: Checkpoint;
|
|
52
|
+
readonly removed: readonly Checkpoint[];
|
|
53
|
+
};
|
|
54
|
+
export type ScanEvent = ScanEventBody & {
|
|
55
|
+
ack(): Promise<void>;
|
|
56
|
+
};
|
|
57
|
+
export interface ScannerDeps {
|
|
58
|
+
readonly load: () => Promise<{
|
|
59
|
+
readonly mapping: MappingContext;
|
|
60
|
+
readonly blocks: BlockSource;
|
|
61
|
+
/** The verified height watermark and lag tolerance behind the stale-view guard. */
|
|
62
|
+
readonly transport: StaleViewSource;
|
|
63
|
+
}>;
|
|
64
|
+
readonly cursors: CursorStore;
|
|
65
|
+
readonly events: EventBus;
|
|
66
|
+
readonly clock: Clock;
|
|
67
|
+
readonly namespace: string;
|
|
68
|
+
readonly defaults: {
|
|
69
|
+
readonly reorgWindow: number;
|
|
70
|
+
readonly pollIntervalMs: number;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Reorg-aware, at-least-once block scanner. Each event's `ack()` commits the
|
|
75
|
+
* cursor (compare-and-set on its version, so two scanners sharing a `cursorKey` never both
|
|
76
|
+
* commit the same advance); asking for the next event first throws `INVALID_TRANSITION`.
|
|
77
|
+
* A view that cannot decide (stale, or missing a block) never causes a rollback: the
|
|
78
|
+
* scanner waits a poll interval and looks again, as it does after a retryable provider error.
|
|
79
|
+
*
|
|
80
|
+
* A cursor stopped by `SCANNER_REORG_TOO_DEEP` is reset explicitly: scan under a new
|
|
81
|
+
* `cursorKey`, or `put` a checkpoint `{ height, hash, recent }` for its key through the
|
|
82
|
+
* `CursorStore`. A checkpoint without `recent` is validated on its own block, and its
|
|
83
|
+
* window is then refilled from the chain below that block.
|
|
84
|
+
*/
|
|
85
|
+
export declare class Scanner implements AsyncIterable<ScanEvent> {
|
|
86
|
+
private readonly deps;
|
|
87
|
+
private readonly options;
|
|
88
|
+
constructor(deps: ScannerDeps, options: ScannerOptions);
|
|
89
|
+
[Symbol.asyncIterator](): AsyncIterator<ScanEvent>;
|
|
90
|
+
private run;
|
|
91
|
+
/** Normalizes the filter on this chain and network (the driver's codec and asset service). */
|
|
92
|
+
private scanFilter;
|
|
93
|
+
/**
|
|
94
|
+
* A new cursor sits just below the start height and retains the `window` blocks beneath
|
|
95
|
+
* it, so a reorg early in the scan is still resolvable. `undefined` (wait) while the
|
|
96
|
+
* chain's tip for this mode is below the start's parent, or its blocks are not visible
|
|
97
|
+
* as one consistent chain yet.
|
|
98
|
+
*/
|
|
99
|
+
private initialCursor;
|
|
100
|
+
/**
|
|
101
|
+
* Up to `count` checkpoints ending at `height`, oldest first, read down the parent links;
|
|
102
|
+
* with `hash`, the block at `height` must have it. `undefined` (wait) when a block is not
|
|
103
|
+
* visible or the links do not hold.
|
|
104
|
+
*/
|
|
105
|
+
private loadWindow;
|
|
106
|
+
/**
|
|
107
|
+
* Extends a window that a rollback trimmed back down to `window` entries from the chain,
|
|
108
|
+
* which is canonical at and below the common ancestor. `undefined` (wait) on a gap.
|
|
109
|
+
*/
|
|
110
|
+
private refill;
|
|
111
|
+
private nextBlock;
|
|
112
|
+
/**
|
|
113
|
+
* Walks the retained window newest-first to the common ancestor with the canonical chain.
|
|
114
|
+
* Returns `'canonical'` when the cursor's own block still is, a rollback step when an older
|
|
115
|
+
* block is, and `undefined` when this view cannot decide: it is stale, or it does not show
|
|
116
|
+
* a block yet (absence is never divergence). Throws `SCANNER_REORG_TOO_DEEP` only when
|
|
117
|
+
* every retained block is visible and none is canonical. The rolled-back cursor's window
|
|
118
|
+
* is refilled from the chain below the ancestor. A rollback or TOO_DEEP verdict of this
|
|
119
|
+
* header walk stands only once the proof quorum confirms it, so one endpoint serving a
|
|
120
|
+
* fork never rolls a cursor back. Only verdicts are confirmed: a block's transactions
|
|
121
|
+
* are still read from the one endpoint that serves them.
|
|
122
|
+
*/
|
|
123
|
+
private findRollback;
|
|
124
|
+
/**
|
|
125
|
+
* Whether the quorum-served hashes confirm a verdict: every `removed` block has been
|
|
126
|
+
* replaced at its height, and `ancestor` (when given) is still canonical. No block at a
|
|
127
|
+
* height decides nothing (`false`); a quorum that disagrees throws a retryable error,
|
|
128
|
+
* which the scan loop also treats as "look again later".
|
|
129
|
+
*/
|
|
130
|
+
private confirmed;
|
|
131
|
+
/** The monitor's stale-view guard (`isStaleView`): a stale view decides nothing. */
|
|
132
|
+
private staleView;
|
|
133
|
+
/** Operational data only: never addresses, amounts or hashes. */
|
|
134
|
+
private emit;
|
|
135
|
+
}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Scanner = void 0;
|
|
4
|
+
const mapping_1 = require("../blockchain/mapping");
|
|
5
|
+
const error_1 = require("../errors/error");
|
|
6
|
+
const stale_view_1 = require("../transport/stale-view");
|
|
7
|
+
const isAssetInput = (value) => typeof value === 'string'
|
|
8
|
+
? value.length > 0
|
|
9
|
+
: typeof value === 'object' &&
|
|
10
|
+
value !== null &&
|
|
11
|
+
typeof value.standard === 'string' &&
|
|
12
|
+
typeof value.contract === 'string';
|
|
13
|
+
function assertFilter(filter, invalid) {
|
|
14
|
+
if (filter === undefined)
|
|
15
|
+
return;
|
|
16
|
+
if (typeof filter !== 'object' || filter === null)
|
|
17
|
+
throw invalid('filter must be an object');
|
|
18
|
+
const { addresses, assets } = filter;
|
|
19
|
+
if (addresses !== undefined &&
|
|
20
|
+
(!Array.isArray(addresses) || !addresses.every((a) => typeof a === 'string')))
|
|
21
|
+
throw invalid('filter.addresses must be an array of address strings');
|
|
22
|
+
if (assets !== undefined && (!Array.isArray(assets) || !assets.every(isAssetInput)))
|
|
23
|
+
throw invalid('filter.assets must be an array of asset refs or asset ids');
|
|
24
|
+
}
|
|
25
|
+
function assertOptions(options) {
|
|
26
|
+
const invalid = (message) => new error_1.ConfigError('CONFIG_INVALID', `scanner ${message}`);
|
|
27
|
+
const { cursorKey, from, mode, reorgWindow, pollIntervalMs } = options;
|
|
28
|
+
assertFilter(options.filter, invalid);
|
|
29
|
+
if (typeof cursorKey !== 'string' || cursorKey.length === 0)
|
|
30
|
+
throw invalid('cursorKey must be a non-empty string');
|
|
31
|
+
if (from !== undefined && from !== 'latest' && (typeof from !== 'bigint' || from < 0n))
|
|
32
|
+
throw invalid("from must be 'latest' or a non-negative bigint height");
|
|
33
|
+
if (mode !== undefined && mode !== 'final' && mode !== 'head')
|
|
34
|
+
throw invalid("mode must be 'final' or 'head'");
|
|
35
|
+
if (reorgWindow !== undefined &&
|
|
36
|
+
(!Number.isSafeInteger(reorgWindow) || reorgWindow < 1))
|
|
37
|
+
throw invalid('reorgWindow must be a positive integer');
|
|
38
|
+
if (pollIntervalMs !== undefined &&
|
|
39
|
+
(typeof pollIntervalMs !== 'number' ||
|
|
40
|
+
!Number.isFinite(pollIntervalMs) ||
|
|
41
|
+
pollIntervalMs <= 0))
|
|
42
|
+
throw invalid('pollIntervalMs must be a finite number greater than 0');
|
|
43
|
+
}
|
|
44
|
+
/** The cursor's window; a reset checkpoint stored without one is its own window. */
|
|
45
|
+
function windowOf(cursor) {
|
|
46
|
+
if (cursor.recent.length > 0 || cursor.height < 0n)
|
|
47
|
+
return cursor.recent;
|
|
48
|
+
return [{ height: cursor.height, hash: cursor.hash }];
|
|
49
|
+
}
|
|
50
|
+
function sameCursor(a, b) {
|
|
51
|
+
return (a.height === b.height &&
|
|
52
|
+
a.hash === b.hash &&
|
|
53
|
+
a.recent.length === b.recent.length &&
|
|
54
|
+
a.recent.every((r, i) => r.height === b.recent[i]?.height && r.hash === b.recent[i]?.hash));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reorg-aware, at-least-once block scanner. Each event's `ack()` commits the
|
|
58
|
+
* cursor (compare-and-set on its version, so two scanners sharing a `cursorKey` never both
|
|
59
|
+
* commit the same advance); asking for the next event first throws `INVALID_TRANSITION`.
|
|
60
|
+
* A view that cannot decide (stale, or missing a block) never causes a rollback: the
|
|
61
|
+
* scanner waits a poll interval and looks again, as it does after a retryable provider error.
|
|
62
|
+
*
|
|
63
|
+
* A cursor stopped by `SCANNER_REORG_TOO_DEEP` is reset explicitly: scan under a new
|
|
64
|
+
* `cursorKey`, or `put` a checkpoint `{ height, hash, recent }` for its key through the
|
|
65
|
+
* `CursorStore`. A checkpoint without `recent` is validated on its own block, and its
|
|
66
|
+
* window is then refilled from the chain below that block.
|
|
67
|
+
*/
|
|
68
|
+
class Scanner {
|
|
69
|
+
deps;
|
|
70
|
+
options;
|
|
71
|
+
constructor(deps, options) {
|
|
72
|
+
this.deps = deps;
|
|
73
|
+
this.options = options;
|
|
74
|
+
assertOptions(options);
|
|
75
|
+
}
|
|
76
|
+
[Symbol.asyncIterator]() {
|
|
77
|
+
return this.run();
|
|
78
|
+
}
|
|
79
|
+
async *run() {
|
|
80
|
+
const { signal } = this.options;
|
|
81
|
+
const { mapping, blocks, transport } = await this.deps.load();
|
|
82
|
+
const reader = mapping.driver.reader;
|
|
83
|
+
const { chain, network } = mapping.selection;
|
|
84
|
+
const key = `${this.deps.namespace}:${chain.id}:${network.id}:${this.options.cursorKey}`;
|
|
85
|
+
const window = this.options.reorgWindow ?? this.deps.defaults.reorgWindow;
|
|
86
|
+
// Resolved inside the loop, so a transient failure resolving filter.assets is retried.
|
|
87
|
+
let source;
|
|
88
|
+
const poll = this.options.pollIntervalMs ?? this.deps.defaults.pollIntervalMs;
|
|
89
|
+
const tip = () => this.options.mode === 'final'
|
|
90
|
+
? reader.getFinalizedHeight()
|
|
91
|
+
: reader.getBlockHeight();
|
|
92
|
+
const stored = await this.deps.cursors.get(key);
|
|
93
|
+
let version = stored?.version ?? null;
|
|
94
|
+
let cursor = stored?.cursor;
|
|
95
|
+
// A stored cursor is re-validated against the canonical chain before anything is emitted.
|
|
96
|
+
let validated = stored === null;
|
|
97
|
+
while (!signal?.aborted) {
|
|
98
|
+
let step;
|
|
99
|
+
try {
|
|
100
|
+
source ??= {
|
|
101
|
+
mapping,
|
|
102
|
+
blocks,
|
|
103
|
+
transport,
|
|
104
|
+
window,
|
|
105
|
+
filter: await this.scanFilter(mapping),
|
|
106
|
+
};
|
|
107
|
+
cursor ??= await this.initialCursor(source, await tip());
|
|
108
|
+
if (cursor) {
|
|
109
|
+
let verdict = validated ? 'canonical' : await this.findRollback(source, cursor);
|
|
110
|
+
if (!validated && verdict === 'canonical') {
|
|
111
|
+
// A short window (a reset checkpoint) is refilled from the chain below the
|
|
112
|
+
// validated block, so a reorg within the window still rolls back.
|
|
113
|
+
const recent = await this.refill(source, windowOf(cursor));
|
|
114
|
+
if (recent)
|
|
115
|
+
cursor = { ...cursor, recent };
|
|
116
|
+
else
|
|
117
|
+
verdict = undefined;
|
|
118
|
+
}
|
|
119
|
+
validated = verdict !== undefined;
|
|
120
|
+
step =
|
|
121
|
+
verdict === 'canonical'
|
|
122
|
+
? await this.nextBlock(source, cursor, await tip())
|
|
123
|
+
: verdict;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
// Like `watch`: a transient provider failure is retried on the next poll.
|
|
128
|
+
if (signal?.aborted)
|
|
129
|
+
return;
|
|
130
|
+
if (!(0, error_1.isCryptoAioError)(error) || !error.retryable)
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
if (signal?.aborted)
|
|
134
|
+
return;
|
|
135
|
+
if (!step) {
|
|
136
|
+
try {
|
|
137
|
+
await this.deps.clock.sleep(poll, signal);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const { event, next } = step;
|
|
145
|
+
let acked = false;
|
|
146
|
+
let commit;
|
|
147
|
+
// Set once one of our puts for this event ended without a known outcome.
|
|
148
|
+
let uncertain = false;
|
|
149
|
+
const commitCursor = async () => {
|
|
150
|
+
try {
|
|
151
|
+
version = await this.deps.cursors.put(key, next, version);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
const conflict = (0, error_1.isCryptoAioError)(error, 'VERSION_CONFLICT');
|
|
155
|
+
// A conflict may be our own put having landed only after one ended unseen (or when
|
|
156
|
+
// the store says so); a first-try conflict is another scanner on this key.
|
|
157
|
+
const recheck = conflict && (uncertain || error.ambiguous);
|
|
158
|
+
const stored = recheck ? await this.deps.cursors.get(key) : null;
|
|
159
|
+
if (!stored || !sameCursor(stored.cursor, next)) {
|
|
160
|
+
if (!conflict)
|
|
161
|
+
uncertain = true;
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
version = stored.version;
|
|
165
|
+
}
|
|
166
|
+
cursor = next;
|
|
167
|
+
acked = true;
|
|
168
|
+
this.emit(event);
|
|
169
|
+
};
|
|
170
|
+
yield {
|
|
171
|
+
...event,
|
|
172
|
+
// Concurrent calls share one commit; a failed commit can be retried.
|
|
173
|
+
ack: () => (commit ??= commitCursor().catch((error) => {
|
|
174
|
+
commit = undefined;
|
|
175
|
+
throw error;
|
|
176
|
+
})),
|
|
177
|
+
};
|
|
178
|
+
if (!acked) {
|
|
179
|
+
throw new error_1.StateError('INVALID_TRANSITION', 'ack() the previous scan event before requesting the next one');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/** Normalizes the filter on this chain and network (the driver's codec and asset service). */
|
|
184
|
+
async scanFilter(mapping) {
|
|
185
|
+
const { addresses, assets } = this.options.filter ?? {};
|
|
186
|
+
if (addresses === undefined && assets === undefined)
|
|
187
|
+
return undefined;
|
|
188
|
+
const { selection, driver } = mapping;
|
|
189
|
+
return {
|
|
190
|
+
...(addresses
|
|
191
|
+
? { addresses: addresses.map((a) => driver.address.normalize(a).canonical) }
|
|
192
|
+
: {}),
|
|
193
|
+
...(assets
|
|
194
|
+
? {
|
|
195
|
+
assets: await Promise.all(assets.map(async (a) => (await mapping.assets.resolve(selection, driver, a)).ref)),
|
|
196
|
+
}
|
|
197
|
+
: {}),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* A new cursor sits just below the start height and retains the `window` blocks beneath
|
|
202
|
+
* it, so a reorg early in the scan is still resolvable. `undefined` (wait) while the
|
|
203
|
+
* chain's tip for this mode is below the start's parent, or its blocks are not visible
|
|
204
|
+
* as one consistent chain yet.
|
|
205
|
+
*/
|
|
206
|
+
async initialCursor(source, tip) {
|
|
207
|
+
const from = this.options.from ?? 'latest';
|
|
208
|
+
const start = from === 'latest' ? tip : from;
|
|
209
|
+
if (start <= 0n)
|
|
210
|
+
return { height: -1n, hash: '', recent: [] };
|
|
211
|
+
if (start - 1n > tip)
|
|
212
|
+
return undefined;
|
|
213
|
+
const recent = await this.loadWindow(source, start - 1n, source.window);
|
|
214
|
+
const top = recent?.[recent.length - 1];
|
|
215
|
+
return recent && top && { height: top.height, hash: top.hash, recent };
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Up to `count` checkpoints ending at `height`, oldest first, read down the parent links;
|
|
219
|
+
* with `hash`, the block at `height` must have it. `undefined` (wait) when a block is not
|
|
220
|
+
* visible or the links do not hold.
|
|
221
|
+
*/
|
|
222
|
+
async loadWindow(source, height, count, hash) {
|
|
223
|
+
const loaded = [];
|
|
224
|
+
let expected = hash;
|
|
225
|
+
for (let h = height; h >= 0n && loaded.length < count; h--) {
|
|
226
|
+
const header = await source.blocks.header(h);
|
|
227
|
+
if (!header || (expected !== undefined && header.hash !== expected))
|
|
228
|
+
return undefined;
|
|
229
|
+
loaded.unshift({ height: header.height, hash: header.hash });
|
|
230
|
+
expected = header.parentHash;
|
|
231
|
+
}
|
|
232
|
+
return loaded;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Extends a window that a rollback trimmed back down to `window` entries from the chain,
|
|
236
|
+
* which is canonical at and below the common ancestor. `undefined` (wait) on a gap.
|
|
237
|
+
*/
|
|
238
|
+
async refill(source, kept) {
|
|
239
|
+
const oldest = kept[0];
|
|
240
|
+
if (!oldest || kept.length >= source.window || oldest.height === 0n)
|
|
241
|
+
return kept;
|
|
242
|
+
const missing = source.window - kept.length;
|
|
243
|
+
const below = await this.loadWindow(source, oldest.height, missing + 1, oldest.hash);
|
|
244
|
+
return below && [...below.slice(0, -1), ...kept];
|
|
245
|
+
}
|
|
246
|
+
async nextBlock(source, cursor, tip) {
|
|
247
|
+
const height = cursor.height + 1n;
|
|
248
|
+
if (height > tip)
|
|
249
|
+
return undefined;
|
|
250
|
+
const header = await source.blocks.header(height);
|
|
251
|
+
if (!header)
|
|
252
|
+
return undefined;
|
|
253
|
+
if (cursor.height >= 0n && header.parentHash !== cursor.hash) {
|
|
254
|
+
const verdict = await this.findRollback(source, cursor);
|
|
255
|
+
// The cursor's block is still canonical, so the two reads disagreed: look again later.
|
|
256
|
+
return verdict === 'canonical' ? undefined : verdict;
|
|
257
|
+
}
|
|
258
|
+
const transactions = await source.blocks.transactions(header, source.filter);
|
|
259
|
+
const reader = source.mapping.driver.reader;
|
|
260
|
+
const [head, finalized] = await Promise.all([
|
|
261
|
+
reader.getBlockHeight(),
|
|
262
|
+
reader.getFinalizedHeight(),
|
|
263
|
+
]);
|
|
264
|
+
const mapped = await Promise.all(transactions.map((tx) => (0, mapping_1.toTransaction)(source.mapping, tx, head, finalized)));
|
|
265
|
+
const checkpoint = { height: header.height, hash: header.hash };
|
|
266
|
+
return {
|
|
267
|
+
event: { type: 'block', block: (0, mapping_1.toBlock)(header), transactions: mapped },
|
|
268
|
+
next: {
|
|
269
|
+
...checkpoint,
|
|
270
|
+
recent: [...windowOf(cursor), checkpoint].slice(-source.window),
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Walks the retained window newest-first to the common ancestor with the canonical chain.
|
|
276
|
+
* Returns `'canonical'` when the cursor's own block still is, a rollback step when an older
|
|
277
|
+
* block is, and `undefined` when this view cannot decide: it is stale, or it does not show
|
|
278
|
+
* a block yet (absence is never divergence). Throws `SCANNER_REORG_TOO_DEEP` only when
|
|
279
|
+
* every retained block is visible and none is canonical. The rolled-back cursor's window
|
|
280
|
+
* is refilled from the chain below the ancestor. A rollback or TOO_DEEP verdict of this
|
|
281
|
+
* header walk stands only once the proof quorum confirms it, so one endpoint serving a
|
|
282
|
+
* fork never rolls a cursor back. Only verdicts are confirmed: a block's transactions
|
|
283
|
+
* are still read from the one endpoint that serves them.
|
|
284
|
+
*/
|
|
285
|
+
async findRollback(source, cursor) {
|
|
286
|
+
if (cursor.height < 0n)
|
|
287
|
+
return 'canonical';
|
|
288
|
+
if (await this.staleView(source))
|
|
289
|
+
return undefined;
|
|
290
|
+
const window = windowOf(cursor);
|
|
291
|
+
const newestFirst = [...window].reverse();
|
|
292
|
+
for (const [i, entry] of newestFirst.entries()) {
|
|
293
|
+
const canonical = await source.blocks.header(entry.height);
|
|
294
|
+
if (!canonical)
|
|
295
|
+
return undefined;
|
|
296
|
+
if (canonical.hash !== entry.hash)
|
|
297
|
+
continue;
|
|
298
|
+
if (i === 0)
|
|
299
|
+
return 'canonical';
|
|
300
|
+
if (!(await this.confirmed(source, newestFirst.slice(0, i), entry)))
|
|
301
|
+
return undefined;
|
|
302
|
+
const recent = await this.refill(source, window.filter((r) => r.height <= entry.height));
|
|
303
|
+
if (!recent)
|
|
304
|
+
return undefined;
|
|
305
|
+
return {
|
|
306
|
+
event: { type: 'rollback', to: entry, removed: newestFirst.slice(0, i) },
|
|
307
|
+
next: { height: entry.height, hash: entry.hash, recent },
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
if (!(await this.confirmed(source, newestFirst)))
|
|
311
|
+
return undefined;
|
|
312
|
+
throw new error_1.StateError('SCANNER_REORG_TOO_DEEP', `the chain diverged deeper than the ${source.window}-block window of cursor '${this.options.cursorKey}'; reset the cursor explicitly`);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Whether the quorum-served hashes confirm a verdict: every `removed` block has been
|
|
316
|
+
* replaced at its height, and `ancestor` (when given) is still canonical. No block at a
|
|
317
|
+
* height decides nothing (`false`); a quorum that disagrees throws a retryable error,
|
|
318
|
+
* which the scan loop also treats as "look again later".
|
|
319
|
+
*/
|
|
320
|
+
async confirmed(source, removed, ancestor) {
|
|
321
|
+
const { proofs } = source.mapping.driver;
|
|
322
|
+
for (const entry of removed) {
|
|
323
|
+
const hash = await proofs.blockHash(entry.height, 'latest');
|
|
324
|
+
if (hash === null || hash === entry.hash)
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
if (ancestor === undefined)
|
|
328
|
+
return true;
|
|
329
|
+
return (await proofs.blockHash(ancestor.height, 'latest')) === ancestor.hash;
|
|
330
|
+
}
|
|
331
|
+
/** The monitor's stale-view guard (`isStaleView`): a stale view decides nothing. */
|
|
332
|
+
async staleView(source) {
|
|
333
|
+
return (0, stale_view_1.isStaleView)(source.transport, await source.mapping.driver.reader.getBlockHeight());
|
|
334
|
+
}
|
|
335
|
+
/** Operational data only: never addresses, amounts or hashes. */
|
|
336
|
+
emit(event) {
|
|
337
|
+
if (event.type === 'block') {
|
|
338
|
+
this.deps.events.emit('scanner.block', {
|
|
339
|
+
namespace: this.deps.namespace,
|
|
340
|
+
cursorKey: this.options.cursorKey,
|
|
341
|
+
height: event.block.height.toString(),
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
this.deps.events.emit('scanner.rollback', {
|
|
346
|
+
namespace: this.deps.namespace,
|
|
347
|
+
cursorKey: this.options.cursorKey,
|
|
348
|
+
toHeight: event.to.height.toString(),
|
|
349
|
+
removed: event.removed.length,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
exports.Scanner = Scanner;
|
|
355
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/core/observe/scanner.ts"],"names":[],"mappings":"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","sourcesContent":["import { toBlock, toTransaction, type MappingContext } from '../blockchain/mapping';\nimport type { BlockSource, ScanFilter } from '../driver/types';\nimport { ConfigError, StateError, isCryptoAioError } from '../errors/error';\nimport type { EventBus } from '../events/bus';\nimport type { AssetRef } from '../model/asset';\nimport type { Block, Transaction } from '../model/transaction';\nimport type { CursorStore, ScanCursor } from '../store/types';\nimport { isStaleView, type StaleViewSource } from '../transport/stale-view';\nimport type { Clock } from '../util/clock';\n\nexport interface ScannerOptions {\n /** Durable name of this consumer's position (namespaced per container, chain and network). */\n readonly cursorKey: string;\n /**\n * Where a NEW cursor starts; ignored when a stored cursor exists. Default `'latest'`. The\n * new cursor also retains the `reorgWindow` blocks below the start, so a rollback within\n * the first window can name blocks that were never delivered, and the replay that follows\n * can start below `from`.\n */\n readonly from?: 'latest' | bigint;\n /**\n * `'final'` emits finalized blocks only; a rollback can then still come from a provider\n * inconsistency. `'head'` follows the tip and may roll back within the window.\n * Default `'head'`. The mode is not stored with the cursor: resuming a head-mode cursor in\n * final mode keeps the unfinalized blocks it already delivered.\n */\n readonly mode?: 'final' | 'head';\n /** Passed to the driver's block source; each entry is resolved on this chain and network. */\n readonly filter?: {\n readonly addresses?: readonly string[];\n readonly assets?: readonly (AssetRef | string)[];\n };\n /** Blocks retained for rollback detection (default: the network's reorgWindow). */\n readonly reorgWindow?: number;\n readonly pollIntervalMs?: number;\n /**\n * Stops the scan, also while it waits for new blocks. `iterator.return()` only takes effect\n * once a pending `next()` settles, so an idle scanner is stopped with this signal.\n */\n readonly signal?: AbortSignal;\n}\n\nexport interface Checkpoint {\n readonly height: bigint;\n readonly hash: string;\n}\n\n/** A scan event without its `ack()`: a delivered block, or a rollback to a checkpoint. */\nexport type ScanEventBody =\n | {\n readonly type: 'block';\n readonly block: Block;\n readonly transactions: readonly Transaction[];\n }\n | {\n readonly type: 'rollback';\n readonly to: Checkpoint;\n readonly removed: readonly Checkpoint[];\n };\n\nexport type ScanEvent = ScanEventBody & { ack(): Promise<void> };\n\nexport interface ScannerDeps {\n readonly load: () => Promise<{\n readonly mapping: MappingContext;\n readonly blocks: BlockSource;\n /** The verified height watermark and lag tolerance behind the stale-view guard. */\n readonly transport: StaleViewSource;\n }>;\n readonly cursors: CursorStore;\n readonly events: EventBus;\n readonly clock: Clock;\n readonly namespace: string;\n readonly defaults: { readonly reorgWindow: number; readonly pollIntervalMs: number };\n}\n\ninterface Step {\n readonly event: ScanEventBody;\n readonly next: ScanCursor;\n}\n\n/** What one iteration of a scan reads through. */\ninterface Source {\n readonly mapping: MappingContext;\n readonly blocks: BlockSource;\n readonly transport: StaleViewSource;\n readonly window: number;\n readonly filter: ScanFilter | undefined;\n}\n\nconst isAssetInput = (value: unknown): boolean =>\n typeof value === 'string'\n ? value.length > 0\n : typeof value === 'object' &&\n value !== null &&\n typeof (value as { standard?: unknown }).standard === 'string' &&\n typeof (value as { contract?: unknown }).contract === 'string';\n\nfunction assertFilter(filter: ScannerOptions['filter'], invalid: (m: string) => Error) {\n if (filter === undefined) return;\n if (typeof filter !== 'object' || filter === null)\n throw invalid('filter must be an object');\n const { addresses, assets } = filter;\n if (\n addresses !== undefined &&\n (!Array.isArray(addresses) || !addresses.every((a) => typeof a === 'string'))\n )\n throw invalid('filter.addresses must be an array of address strings');\n if (assets !== undefined && (!Array.isArray(assets) || !assets.every(isAssetInput)))\n throw invalid('filter.assets must be an array of asset refs or asset ids');\n}\n\nfunction assertOptions(options: ScannerOptions): void {\n const invalid = (message: string) =>\n new ConfigError('CONFIG_INVALID', `scanner ${message}`);\n const { cursorKey, from, mode, reorgWindow, pollIntervalMs } = options;\n assertFilter(options.filter, invalid);\n if (typeof cursorKey !== 'string' || cursorKey.length === 0)\n throw invalid('cursorKey must be a non-empty string');\n if (from !== undefined && from !== 'latest' && (typeof from !== 'bigint' || from < 0n))\n throw invalid(\"from must be 'latest' or a non-negative bigint height\");\n if (mode !== undefined && mode !== 'final' && mode !== 'head')\n throw invalid(\"mode must be 'final' or 'head'\");\n if (\n reorgWindow !== undefined &&\n (!Number.isSafeInteger(reorgWindow) || reorgWindow < 1)\n )\n throw invalid('reorgWindow must be a positive integer');\n if (\n pollIntervalMs !== undefined &&\n (typeof pollIntervalMs !== 'number' ||\n !Number.isFinite(pollIntervalMs) ||\n pollIntervalMs <= 0)\n )\n throw invalid('pollIntervalMs must be a finite number greater than 0');\n}\n\n/** The cursor's window; a reset checkpoint stored without one is its own window. */\nfunction windowOf(cursor: ScanCursor): readonly Checkpoint[] {\n if (cursor.recent.length > 0 || cursor.height < 0n) return cursor.recent;\n return [{ height: cursor.height, hash: cursor.hash }];\n}\n\nfunction sameCursor(a: ScanCursor, b: ScanCursor): boolean {\n return (\n a.height === b.height &&\n a.hash === b.hash &&\n a.recent.length === b.recent.length &&\n a.recent.every(\n (r, i) => r.height === b.recent[i]?.height && r.hash === b.recent[i]?.hash,\n )\n );\n}\n\n/**\n * Reorg-aware, at-least-once block scanner. Each event's `ack()` commits the\n * cursor (compare-and-set on its version, so two scanners sharing a `cursorKey` never both\n * commit the same advance); asking for the next event first throws `INVALID_TRANSITION`.\n * A view that cannot decide (stale, or missing a block) never causes a rollback: the\n * scanner waits a poll interval and looks again, as it does after a retryable provider error.\n *\n * A cursor stopped by `SCANNER_REORG_TOO_DEEP` is reset explicitly: scan under a new\n * `cursorKey`, or `put` a checkpoint `{ height, hash, recent }` for its key through the\n * `CursorStore`. A checkpoint without `recent` is validated on its own block, and its\n * window is then refilled from the chain below that block.\n */\nexport class Scanner implements AsyncIterable<ScanEvent> {\n constructor(\n private readonly deps: ScannerDeps,\n private readonly options: ScannerOptions,\n ) {\n assertOptions(options);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<ScanEvent> {\n return this.run();\n }\n\n private async *run(): AsyncGenerator<ScanEvent> {\n const { signal } = this.options;\n const { mapping, blocks, transport } = await this.deps.load();\n const reader = mapping.driver.reader;\n const { chain, network } = mapping.selection;\n const key = `${this.deps.namespace}:${chain.id}:${network.id}:${this.options.cursorKey}`;\n const window = this.options.reorgWindow ?? this.deps.defaults.reorgWindow;\n // Resolved inside the loop, so a transient failure resolving filter.assets is retried.\n let source: Source | undefined;\n const poll = this.options.pollIntervalMs ?? this.deps.defaults.pollIntervalMs;\n const tip = () =>\n this.options.mode === 'final'\n ? reader.getFinalizedHeight()\n : reader.getBlockHeight();\n const stored = await this.deps.cursors.get(key);\n let version = stored?.version ?? null;\n let cursor = stored?.cursor;\n // A stored cursor is re-validated against the canonical chain before anything is emitted.\n let validated = stored === null;\n while (!signal?.aborted) {\n let step: Step | undefined;\n try {\n source ??= {\n mapping,\n blocks,\n transport,\n window,\n filter: await this.scanFilter(mapping),\n };\n cursor ??= await this.initialCursor(source, await tip());\n if (cursor) {\n let verdict = validated ? 'canonical' : await this.findRollback(source, cursor);\n if (!validated && verdict === 'canonical') {\n // A short window (a reset checkpoint) is refilled from the chain below the\n // validated block, so a reorg within the window still rolls back.\n const recent = await this.refill(source, windowOf(cursor));\n if (recent) cursor = { ...cursor, recent };\n else verdict = undefined;\n }\n validated = verdict !== undefined;\n step =\n verdict === 'canonical'\n ? await this.nextBlock(source, cursor, await tip())\n : verdict;\n }\n } catch (error) {\n // Like `watch`: a transient provider failure is retried on the next poll.\n if (signal?.aborted) return;\n if (!isCryptoAioError(error) || !error.retryable) throw error;\n }\n if (signal?.aborted) return;\n if (!step) {\n try {\n await this.deps.clock.sleep(poll, signal);\n } catch {\n return;\n }\n continue;\n }\n const { event, next } = step;\n let acked = false;\n let commit: Promise<void> | undefined;\n // Set once one of our puts for this event ended without a known outcome.\n let uncertain = false;\n const commitCursor = async (): Promise<void> => {\n try {\n version = await this.deps.cursors.put(key, next, version);\n } catch (error) {\n const conflict = isCryptoAioError(error, 'VERSION_CONFLICT');\n // A conflict may be our own put having landed only after one ended unseen (or when\n // the store says so); a first-try conflict is another scanner on this key.\n const recheck = conflict && (uncertain || error.ambiguous);\n const stored = recheck ? await this.deps.cursors.get(key) : null;\n if (!stored || !sameCursor(stored.cursor, next)) {\n if (!conflict) uncertain = true;\n throw error;\n }\n version = stored.version;\n }\n cursor = next;\n acked = true;\n this.emit(event);\n };\n yield {\n ...event,\n // Concurrent calls share one commit; a failed commit can be retried.\n ack: () =>\n (commit ??= commitCursor().catch((error: unknown) => {\n commit = undefined;\n throw error;\n })),\n };\n if (!acked) {\n throw new StateError(\n 'INVALID_TRANSITION',\n 'ack() the previous scan event before requesting the next one',\n );\n }\n }\n }\n\n /** Normalizes the filter on this chain and network (the driver's codec and asset service). */\n private async scanFilter(mapping: MappingContext): Promise<ScanFilter | undefined> {\n const { addresses, assets } = this.options.filter ?? {};\n if (addresses === undefined && assets === undefined) return undefined;\n const { selection, driver } = mapping;\n return {\n ...(addresses\n ? { addresses: addresses.map((a) => driver.address.normalize(a).canonical) }\n : {}),\n ...(assets\n ? {\n assets: await Promise.all(\n assets.map(\n async (a) => (await mapping.assets.resolve(selection, driver, a)).ref,\n ),\n ),\n }\n : {}),\n };\n }\n\n /**\n * A new cursor sits just below the start height and retains the `window` blocks beneath\n * it, so a reorg early in the scan is still resolvable. `undefined` (wait) while the\n * chain's tip for this mode is below the start's parent, or its blocks are not visible\n * as one consistent chain yet.\n */\n private async initialCursor(\n source: Source,\n tip: bigint,\n ): Promise<ScanCursor | undefined> {\n const from = this.options.from ?? 'latest';\n const start = from === 'latest' ? tip : from;\n if (start <= 0n) return { height: -1n, hash: '', recent: [] };\n if (start - 1n > tip) return undefined;\n const recent = await this.loadWindow(source, start - 1n, source.window);\n const top = recent?.[recent.length - 1];\n return recent && top && { height: top.height, hash: top.hash, recent };\n }\n\n /**\n * Up to `count` checkpoints ending at `height`, oldest first, read down the parent links;\n * with `hash`, the block at `height` must have it. `undefined` (wait) when a block is not\n * visible or the links do not hold.\n */\n private async loadWindow(\n source: Source,\n height: bigint,\n count: number,\n hash?: string,\n ): Promise<Checkpoint[] | undefined> {\n const loaded: Checkpoint[] = [];\n let expected = hash;\n for (let h = height; h >= 0n && loaded.length < count; h--) {\n const header = await source.blocks.header(h);\n if (!header || (expected !== undefined && header.hash !== expected))\n return undefined;\n loaded.unshift({ height: header.height, hash: header.hash });\n expected = header.parentHash;\n }\n return loaded;\n }\n\n /**\n * Extends a window that a rollback trimmed back down to `window` entries from the chain,\n * which is canonical at and below the common ancestor. `undefined` (wait) on a gap.\n */\n private async refill(\n source: Source,\n kept: readonly Checkpoint[],\n ): Promise<readonly Checkpoint[] | undefined> {\n const oldest = kept[0];\n if (!oldest || kept.length >= source.window || oldest.height === 0n) return kept;\n const missing = source.window - kept.length;\n const below = await this.loadWindow(source, oldest.height, missing + 1, oldest.hash);\n return below && [...below.slice(0, -1), ...kept];\n }\n\n private async nextBlock(\n source: Source,\n cursor: ScanCursor,\n tip: bigint,\n ): Promise<Step | undefined> {\n const height = cursor.height + 1n;\n if (height > tip) return undefined;\n const header = await source.blocks.header(height);\n if (!header) return undefined;\n if (cursor.height >= 0n && header.parentHash !== cursor.hash) {\n const verdict = await this.findRollback(source, cursor);\n // The cursor's block is still canonical, so the two reads disagreed: look again later.\n return verdict === 'canonical' ? undefined : verdict;\n }\n const transactions = await source.blocks.transactions(header, source.filter);\n const reader = source.mapping.driver.reader;\n const [head, finalized] = await Promise.all([\n reader.getBlockHeight(),\n reader.getFinalizedHeight(),\n ]);\n const mapped = await Promise.all(\n transactions.map((tx) => toTransaction(source.mapping, tx, head, finalized)),\n );\n const checkpoint = { height: header.height, hash: header.hash };\n return {\n event: { type: 'block', block: toBlock(header), transactions: mapped },\n next: {\n ...checkpoint,\n recent: [...windowOf(cursor), checkpoint].slice(-source.window),\n },\n };\n }\n\n /**\n * Walks the retained window newest-first to the common ancestor with the canonical chain.\n * Returns `'canonical'` when the cursor's own block still is, a rollback step when an older\n * block is, and `undefined` when this view cannot decide: it is stale, or it does not show\n * a block yet (absence is never divergence). Throws `SCANNER_REORG_TOO_DEEP` only when\n * every retained block is visible and none is canonical. The rolled-back cursor's window\n * is refilled from the chain below the ancestor. A rollback or TOO_DEEP verdict of this\n * header walk stands only once the proof quorum confirms it, so one endpoint serving a\n * fork never rolls a cursor back. Only verdicts are confirmed: a block's transactions\n * are still read from the one endpoint that serves them.\n */\n private async findRollback(\n source: Source,\n cursor: ScanCursor,\n ): Promise<Step | 'canonical' | undefined> {\n if (cursor.height < 0n) return 'canonical';\n if (await this.staleView(source)) return undefined;\n const window = windowOf(cursor);\n const newestFirst = [...window].reverse();\n for (const [i, entry] of newestFirst.entries()) {\n const canonical = await source.blocks.header(entry.height);\n if (!canonical) return undefined;\n if (canonical.hash !== entry.hash) continue;\n if (i === 0) return 'canonical';\n if (!(await this.confirmed(source, newestFirst.slice(0, i), entry)))\n return undefined;\n const recent = await this.refill(\n source,\n window.filter((r) => r.height <= entry.height),\n );\n if (!recent) return undefined;\n return {\n event: { type: 'rollback', to: entry, removed: newestFirst.slice(0, i) },\n next: { height: entry.height, hash: entry.hash, recent },\n };\n }\n if (!(await this.confirmed(source, newestFirst))) return undefined;\n throw new StateError(\n 'SCANNER_REORG_TOO_DEEP',\n `the chain diverged deeper than the ${source.window}-block window of cursor '${this.options.cursorKey}'; reset the cursor explicitly`,\n );\n }\n\n /**\n * Whether the quorum-served hashes confirm a verdict: every `removed` block has been\n * replaced at its height, and `ancestor` (when given) is still canonical. No block at a\n * height decides nothing (`false`); a quorum that disagrees throws a retryable error,\n * which the scan loop also treats as \"look again later\".\n */\n private async confirmed(\n source: Source,\n removed: readonly Checkpoint[],\n ancestor?: Checkpoint,\n ): Promise<boolean> {\n const { proofs } = source.mapping.driver;\n for (const entry of removed) {\n const hash = await proofs.blockHash(entry.height, 'latest');\n if (hash === null || hash === entry.hash) return false;\n }\n if (ancestor === undefined) return true;\n return (await proofs.blockHash(ancestor.height, 'latest')) === ancestor.hash;\n }\n\n /** The monitor's stale-view guard (`isStaleView`): a stale view decides nothing. */\n private async staleView(source: Source): Promise<boolean> {\n return isStaleView(\n source.transport,\n await source.mapping.driver.reader.getBlockHeight(),\n );\n }\n\n /** Operational data only: never addresses, amounts or hashes. */\n private emit(event: ScanEventBody): void {\n if (event.type === 'block') {\n this.deps.events.emit('scanner.block', {\n namespace: this.deps.namespace,\n cursorKey: this.options.cursorKey,\n height: event.block.height.toString(),\n });\n } else {\n this.deps.events.emit('scanner.rollback', {\n namespace: this.deps.namespace,\n cursorKey: this.options.cursorKey,\n toHeight: event.to.height.toString(),\n removed: event.removed.length,\n });\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type OperationRecord } from '../store/types';
|
|
2
|
+
/**
|
|
3
|
+
* Inputs held by live Operations: their reservation, unsigned payload and every Attempt.
|
|
4
|
+
* Coin selection excludes them, so two Operations of a wallet never pick the same coin.
|
|
5
|
+
*/
|
|
6
|
+
export declare function reservedInputs(operations: readonly OperationRecord[], exceptId?: string): string[];
|
|
7
|
+
/** The live Operation that may still consume the wallet's current seqno (TON is strictly serial). */
|
|
8
|
+
export declare function seqnoHolder(operations: readonly OperationRecord[], exceptId?: string): OperationRecord | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* The lowest nonce still reserved by a live, not-yet-included Operation. Included
|
|
11
|
+
* nonces are already consumed on chain, so counting them would mask a gap above them.
|
|
12
|
+
*/
|
|
13
|
+
export declare function lowestOutstandingNonce(operations: readonly OperationRecord[]): {
|
|
14
|
+
nonce: bigint;
|
|
15
|
+
operationId: string;
|
|
16
|
+
} | undefined;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reservedInputs = reservedInputs;
|
|
4
|
+
exports.seqnoHolder = seqnoHolder;
|
|
5
|
+
exports.lowestOutstandingNonce = lowestOutstandingNonce;
|
|
6
|
+
const types_1 = require("../store/types");
|
|
7
|
+
/**
|
|
8
|
+
* Inputs held by live Operations: their reservation, unsigned payload and every Attempt.
|
|
9
|
+
* Coin selection excludes them, so two Operations of a wallet never pick the same coin.
|
|
10
|
+
*/
|
|
11
|
+
function reservedInputs(operations, exceptId) {
|
|
12
|
+
const inputs = new Set();
|
|
13
|
+
for (const op of operations) {
|
|
14
|
+
if (op.id === exceptId || (0, types_1.isTerminal)(op.state))
|
|
15
|
+
continue;
|
|
16
|
+
if (op.reservation?.kind === 'inputs')
|
|
17
|
+
for (const input of op.reservation.inputs)
|
|
18
|
+
inputs.add(input);
|
|
19
|
+
if (op.unsigned?.ordering.kind === 'inputs')
|
|
20
|
+
for (const input of op.unsigned.ordering.inputs)
|
|
21
|
+
inputs.add(input);
|
|
22
|
+
for (const attempt of op.attempts) {
|
|
23
|
+
if (attempt.ordering.kind === 'inputs')
|
|
24
|
+
for (const input of attempt.ordering.inputs)
|
|
25
|
+
inputs.add(input);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return [...inputs].sort();
|
|
29
|
+
}
|
|
30
|
+
/** The live Operation that may still consume the wallet's current seqno (TON is strictly serial). */
|
|
31
|
+
function seqnoHolder(operations, exceptId) {
|
|
32
|
+
return operations.find((op) => op.id !== exceptId &&
|
|
33
|
+
!(0, types_1.isTerminal)(op.state) &&
|
|
34
|
+
op.state !== 'included' &&
|
|
35
|
+
op.reservation?.kind === 'seqno');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The lowest nonce still reserved by a live, not-yet-included Operation. Included
|
|
39
|
+
* nonces are already consumed on chain, so counting them would mask a gap above them.
|
|
40
|
+
*/
|
|
41
|
+
function lowestOutstandingNonce(operations) {
|
|
42
|
+
let lowest;
|
|
43
|
+
for (const op of operations) {
|
|
44
|
+
if ((0, types_1.isTerminal)(op.state) || op.state === 'included')
|
|
45
|
+
continue;
|
|
46
|
+
if (op.reservation?.kind !== 'nonce')
|
|
47
|
+
continue;
|
|
48
|
+
if (!lowest || op.reservation.nonce < lowest.nonce)
|
|
49
|
+
lowest = { nonce: op.reservation.nonce, operationId: op.id };
|
|
50
|
+
}
|
|
51
|
+
return lowest;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=reservations.js.map
|