crypto-aio 0.0.3 → 0.2.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 +167 -0
- package/README.md +163 -13
- 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 +386 -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 +175 -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 +139 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +103 -0
- package/dist/adapters/evm/fees.js +277 -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 +12 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +65 -0
- package/dist/adapters/evm/network.js +150 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +35 -0
- package/dist/adapters/evm/plugin.js +150 -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 +370 -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 +83 -0
- package/dist/adapters/evm/reader.js +326 -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 +10 -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 +265 -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 +26 -0
- package/dist/adapters/evm/web3-client.js +176 -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 +556 -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 +77 -0
- package/dist/adapters/solana/fees.js +214 -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/message.d.ts +15 -0
- package/dist/adapters/solana/message.js +120 -0
- package/dist/adapters/solana/message.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 +44 -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 +124 -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 +61 -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 +755 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +235 -0
- package/dist/adapters/ton/reader.js +976 -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 +74 -0
- package/dist/adapters/ton/trace.js +303 -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 +41 -0
- package/dist/adapters/tron/abi.js +112 -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 +569 -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 +52 -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 +371 -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 +57 -0
- package/dist/adapters/tron/reader.js +220 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +9 -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 +100 -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 +63 -0
- package/dist/adapters/utxo/context.js +125 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +22 -0
- package/dist/adapters/utxo/decode.js +121 -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 +79 -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 +100 -0
- package/dist/adapters/utxo/esplora.js +498 -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 +66 -0
- package/dist/adapters/utxo/proofs.js +469 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawblock.d.ts +46 -0
- package/dist/adapters/utxo/rawblock.js +159 -0
- package/dist/adapters/utxo/rawblock.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +73 -0
- package/dist/adapters/utxo/rawtx.js +264 -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 +179 -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 +180 -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 +62 -0
- package/dist/core/container/container.js +500 -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 +379 -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 +163 -0
- package/dist/core/errors/codes.js +53 -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 +106 -0
- package/dist/core/lifecycle/engine-rules.js +267 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +502 -0
- package/dist/core/lifecycle/engine.js +1750 -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 +77 -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 +616 -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 +88 -0
- package/dist/core/lifecycle/workers.js +347 -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 +38 -0
- package/dist/core/model/ids.js +14 -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 +28 -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 +123 -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 +358 -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 +161 -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/format.d.ts +20 -0
- package/dist/core/store/format.js +86 -0
- package/dist/core/store/format.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 +258 -0
- package/dist/core/store/types.js +119 -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 +1703 -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 +159 -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 +35 -0
- package/dist/core/util/json.js +174 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +27 -0
- package/dist/core/util/names.js +56 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +65 -14
- package/dist/index.js +107 -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 +737 -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 +68 -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 +38 -0
- package/dist/testing/faulty-store.js +71 -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 +198 -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":"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';\nimport { storableText } from '../util/names';\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 (!storableText(cursorKey))\n throw invalid('cursorKey must be well-formed text without U+0000');\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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reservations.js","sourceRoot":"","sources":["../../../src/core/ordering/reservations.ts"],"names":[],"mappings":";;AAMA,wCAiBC;AAGD,kCAWC;AAMD,wDAWC;AAtDD,0CAAkE;AAElE;;;GAGG;AACH,SAAgB,cAAc,CAC5B,UAAsC,EACtC,QAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAA,kBAAU,EAAC,EAAE,CAAC,KAAK,CAAC;YAAE,SAAS;QACzD,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,QAAQ;YACnC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,KAAK,QAAQ;YACzC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrE,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBACpC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM;oBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,qGAAqG;AACrG,SAAgB,WAAW,CACzB,UAAsC,EACtC,QAAiB;IAEjB,OAAO,UAAU,CAAC,IAAI,CACpB,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,EAAE,KAAK,QAAQ;QAClB,CAAC,IAAA,kBAAU,EAAC,EAAE,CAAC,KAAK,CAAC;QACrB,EAAE,CAAC,KAAK,KAAK,UAAU;QACvB,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,OAAO,CACnC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,UAAsC;IAEtC,IAAI,MAA0D,CAAC;IAC/D,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAA,kBAAU,EAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,UAAU;YAAE,SAAS;QAC9D,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,OAAO;YAAE,SAAS;QAC/C,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;YAChD,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { isTerminal, type OperationRecord } from '../store/types';\n\n/**\n * Inputs held by live Operations: their reservation, unsigned payload and every Attempt.\n * Coin selection excludes them, so two Operations of a wallet never pick the same coin.\n */\nexport function reservedInputs(\n operations: readonly OperationRecord[],\n exceptId?: string,\n): string[] {\n const inputs = new Set<string>();\n for (const op of operations) {\n if (op.id === exceptId || isTerminal(op.state)) continue;\n if (op.reservation?.kind === 'inputs')\n for (const input of op.reservation.inputs) inputs.add(input);\n if (op.unsigned?.ordering.kind === 'inputs')\n for (const input of op.unsigned.ordering.inputs) inputs.add(input);\n for (const attempt of op.attempts) {\n if (attempt.ordering.kind === 'inputs')\n for (const input of attempt.ordering.inputs) inputs.add(input);\n }\n }\n return [...inputs].sort();\n}\n\n/** The live Operation that may still consume the wallet's current seqno (TON is strictly serial). */\nexport function seqnoHolder(\n operations: readonly OperationRecord[],\n exceptId?: string,\n): OperationRecord | undefined {\n return operations.find(\n (op) =>\n op.id !== exceptId &&\n !isTerminal(op.state) &&\n op.state !== 'included' &&\n op.reservation?.kind === 'seqno',\n );\n}\n\n/**\n * The lowest nonce still reserved by a live, not-yet-included Operation. Included\n * nonces are already consumed on chain, so counting them would mask a gap above them.\n */\nexport function lowestOutstandingNonce(\n operations: readonly OperationRecord[],\n): { nonce: bigint; operationId: string } | undefined {\n let lowest: { nonce: bigint; operationId: string } | undefined;\n for (const op of operations) {\n if (isTerminal(op.state) || op.state === 'included') continue;\n if (op.reservation?.kind !== 'nonce') continue;\n if (!lowest || op.reservation.nonce < lowest.nonce)\n lowest = { nonce: op.reservation.nonce, operationId: op.id };\n }\n return lowest;\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Lease, LockManager, SequenceStore } from '../store/types';
|
|
2
|
+
import type { Clock } from '../util/clock';
|
|
3
|
+
export declare function sequenceKey(namespace: string, chain: string, network: string, address: string): string;
|
|
4
|
+
/** A held lease that can be renewed; renewal failure means another worker took over. */
|
|
5
|
+
export declare class LeaseHandle {
|
|
6
|
+
#private;
|
|
7
|
+
private readonly locks;
|
|
8
|
+
private readonly ttlMs;
|
|
9
|
+
constructor(locks: LockManager, ttlMs: number, lease: Lease);
|
|
10
|
+
get current(): Lease;
|
|
11
|
+
renew(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface SequenceCoordinatorDeps {
|
|
14
|
+
readonly locks: LockManager;
|
|
15
|
+
readonly sequences: SequenceStore;
|
|
16
|
+
readonly clock: Clock;
|
|
17
|
+
readonly owner: string;
|
|
18
|
+
readonly leaseMs: number;
|
|
19
|
+
/** How long to wait for a busy address before failing with SEQUENCE_BUSY (default: leaseMs). */
|
|
20
|
+
readonly acquireTimeoutMs?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Observes a failed best-effort lease release (the lease then lapses by its TTL).
|
|
23
|
+
* Its own failure is ignored. Log only the error code: messages may carry store detail.
|
|
24
|
+
*/
|
|
25
|
+
onReleaseError?(error: unknown): void;
|
|
26
|
+
}
|
|
27
|
+
export declare class SequenceCoordinator {
|
|
28
|
+
#private;
|
|
29
|
+
private readonly deps;
|
|
30
|
+
constructor(deps: SequenceCoordinatorDeps);
|
|
31
|
+
/**
|
|
32
|
+
* Runs `fn` while holding the address lease for `key`, then releases it.
|
|
33
|
+
*
|
|
34
|
+
* Not re-entrant: a nested `withLease` on the same key waits like any other caller.
|
|
35
|
+
* It fails with SEQUENCE_BUSY after `acquireTimeoutMs`, or, when that is not shorter
|
|
36
|
+
* than `leaseMs`, it can outlive the outer lease, take it over and fence the outer
|
|
37
|
+
* caller. Code that already holds the lease must pass its `LeaseHandle` down instead.
|
|
38
|
+
* The lease is not renewed automatically; long callbacks call `lease.renew()`.
|
|
39
|
+
* `options.acquireTimeoutMs` overrides the wait for this call (`0`: a single try).
|
|
40
|
+
*/
|
|
41
|
+
withLease<T>(key: string, fn: (lease: LeaseHandle) => Promise<T>, signal?: AbortSignal, options?: {
|
|
42
|
+
readonly acquireTimeoutMs?: number;
|
|
43
|
+
}): Promise<T>;
|
|
44
|
+
allocate(lease: LeaseHandle, key: string, chainPending: bigint): Promise<bigint>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns a reserved value for reuse. Only legal while no valid signed bytes exist for
|
|
47
|
+
* it. Precondition: called at most once per allocation, by the Operation holding the
|
|
48
|
+
* value, after its terminal CAS or after a failure before its reservation was persisted.
|
|
49
|
+
* Releasing a value that is at or above `next`, or already released, is a no-op.
|
|
50
|
+
*/
|
|
51
|
+
release(lease: LeaseHandle, key: string, value: bigint): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Nonce reconciliation: returns to `released` every value in [chainPending, next) that is
|
|
54
|
+
* neither released already nor in `reserved`, and returns those values (ascending). It
|
|
55
|
+
* never touches a value below `chainPending` (the chain consumed it) or at or above
|
|
56
|
+
* `next` (never allocated). The caller holds `lease` and reads `reserved` (the values live
|
|
57
|
+
* Operations hold) under it, so no allocation can interleave; nothing is written when
|
|
58
|
+
* there is nothing to reclaim.
|
|
59
|
+
*/
|
|
60
|
+
reclaim(lease: LeaseHandle, key: string, chainPending: bigint, reserved: readonly bigint[]): Promise<bigint[]>;
|
|
61
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SequenceCoordinator = exports.LeaseHandle = void 0;
|
|
4
|
+
exports.sequenceKey = sequenceKey;
|
|
5
|
+
const error_1 = require("../errors/error");
|
|
6
|
+
function sequenceKey(namespace, chain, network, address) {
|
|
7
|
+
return `seq:${namespace}:${chain}:${network}:${address}`;
|
|
8
|
+
}
|
|
9
|
+
const byValue = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
10
|
+
/** A held lease that can be renewed; renewal failure means another worker took over. */
|
|
11
|
+
class LeaseHandle {
|
|
12
|
+
locks;
|
|
13
|
+
ttlMs;
|
|
14
|
+
#lease;
|
|
15
|
+
constructor(locks, ttlMs, lease) {
|
|
16
|
+
this.locks = locks;
|
|
17
|
+
this.ttlMs = ttlMs;
|
|
18
|
+
this.#lease = lease;
|
|
19
|
+
}
|
|
20
|
+
get current() {
|
|
21
|
+
return this.#lease;
|
|
22
|
+
}
|
|
23
|
+
async renew() {
|
|
24
|
+
const renewed = await this.locks.renew(this.#lease, this.ttlMs);
|
|
25
|
+
if (!renewed)
|
|
26
|
+
throw new error_1.StateError('FENCING', 'the address lease was lost to another worker');
|
|
27
|
+
this.#lease = renewed;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.LeaseHandle = LeaseHandle;
|
|
31
|
+
/**
|
|
32
|
+
* Lease tokens increase per key only, so a lease for another key cannot fence this one.
|
|
33
|
+
* Messages omit the key: it embeds the wallet address, and error messages reach logs.
|
|
34
|
+
*/
|
|
35
|
+
function fenceFor(lease, key) {
|
|
36
|
+
const { key: leased, token } = lease.current;
|
|
37
|
+
if (leased !== key) {
|
|
38
|
+
throw new error_1.StateError('FENCING', 'a lease for another address cannot write this sequence');
|
|
39
|
+
}
|
|
40
|
+
return token;
|
|
41
|
+
}
|
|
42
|
+
class SequenceCoordinator {
|
|
43
|
+
deps;
|
|
44
|
+
constructor(deps) {
|
|
45
|
+
this.deps = deps;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Runs `fn` while holding the address lease for `key`, then releases it.
|
|
49
|
+
*
|
|
50
|
+
* Not re-entrant: a nested `withLease` on the same key waits like any other caller.
|
|
51
|
+
* It fails with SEQUENCE_BUSY after `acquireTimeoutMs`, or, when that is not shorter
|
|
52
|
+
* than `leaseMs`, it can outlive the outer lease, take it over and fence the outer
|
|
53
|
+
* caller. Code that already holds the lease must pass its `LeaseHandle` down instead.
|
|
54
|
+
* The lease is not renewed automatically; long callbacks call `lease.renew()`.
|
|
55
|
+
* `options.acquireTimeoutMs` overrides the wait for this call (`0`: a single try).
|
|
56
|
+
*/
|
|
57
|
+
async withLease(key, fn, signal, options = {}) {
|
|
58
|
+
signal?.throwIfAborted();
|
|
59
|
+
const deadline = this.deps.clock.now() +
|
|
60
|
+
(options.acquireTimeoutMs ?? this.deps.acquireTimeoutMs ?? this.deps.leaseMs);
|
|
61
|
+
let lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);
|
|
62
|
+
while (!lease) {
|
|
63
|
+
if (this.deps.clock.now() >= deadline) {
|
|
64
|
+
throw new error_1.StateError('SEQUENCE_BUSY', 'the address lease is held by another operation', { retryable: true });
|
|
65
|
+
}
|
|
66
|
+
await this.deps.clock.sleep(25, signal);
|
|
67
|
+
lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);
|
|
68
|
+
}
|
|
69
|
+
const handle = new LeaseHandle(this.deps.locks, this.deps.leaseMs, lease);
|
|
70
|
+
try {
|
|
71
|
+
return await fn(handle);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
// Best effort: a failed release must not replace the callback's outcome (for
|
|
75
|
+
// example a completed broadcast). The lease then lapses by its TTL, and fencing
|
|
76
|
+
// still guards every write.
|
|
77
|
+
await this.#release(handle.current);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A release that throws, synchronously or not, is reported and absorbed, and so
|
|
82
|
+
* is the observer's own failure, including an async observer's rejection.
|
|
83
|
+
*/
|
|
84
|
+
async #release(lease) {
|
|
85
|
+
try {
|
|
86
|
+
await this.deps.locks.release(lease);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
try {
|
|
90
|
+
const observed = this.deps.onReleaseError?.(error);
|
|
91
|
+
if (typeof observed?.then === 'function') {
|
|
92
|
+
Promise.resolve(observed).catch(() => undefined);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// An observer failure must not replace the outcome either.
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async allocate(lease, key, chainPending) {
|
|
101
|
+
const fence = fenceFor(lease, key);
|
|
102
|
+
const state = await this.deps.sequences.get(key);
|
|
103
|
+
const released = [...(state?.released ?? [])]
|
|
104
|
+
.filter((n) => n >= chainPending)
|
|
105
|
+
.sort(byValue);
|
|
106
|
+
const floor = state && state.next > chainPending ? state.next : chainPending;
|
|
107
|
+
const pick = released[0] ?? floor;
|
|
108
|
+
const next = pick >= floor ? pick + 1n : floor;
|
|
109
|
+
await this.deps.sequences.put(key, { next, released: released.filter((n) => n !== pick), fence }, state?.version ?? null);
|
|
110
|
+
return pick;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns a reserved value for reuse. Only legal while no valid signed bytes exist for
|
|
114
|
+
* it. Precondition: called at most once per allocation, by the Operation holding the
|
|
115
|
+
* value, after its terminal CAS or after a failure before its reservation was persisted.
|
|
116
|
+
* Releasing a value that is at or above `next`, or already released, is a no-op.
|
|
117
|
+
*/
|
|
118
|
+
async release(lease, key, value) {
|
|
119
|
+
const fence = fenceFor(lease, key);
|
|
120
|
+
const state = await this.deps.sequences.get(key);
|
|
121
|
+
if (!state || value >= state.next || state.released.includes(value))
|
|
122
|
+
return;
|
|
123
|
+
await this.deps.sequences.put(key, { next: state.next, released: [...state.released, value].sort(byValue), fence }, state.version);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Nonce reconciliation: returns to `released` every value in [chainPending, next) that is
|
|
127
|
+
* neither released already nor in `reserved`, and returns those values (ascending). It
|
|
128
|
+
* never touches a value below `chainPending` (the chain consumed it) or at or above
|
|
129
|
+
* `next` (never allocated). The caller holds `lease` and reads `reserved` (the values live
|
|
130
|
+
* Operations hold) under it, so no allocation can interleave; nothing is written when
|
|
131
|
+
* there is nothing to reclaim.
|
|
132
|
+
*/
|
|
133
|
+
async reclaim(lease, key, chainPending, reserved) {
|
|
134
|
+
const fence = fenceFor(lease, key);
|
|
135
|
+
const state = await this.deps.sequences.get(key);
|
|
136
|
+
if (!state)
|
|
137
|
+
return [];
|
|
138
|
+
const held = new Set([...state.released, ...reserved]);
|
|
139
|
+
const reclaimed = [];
|
|
140
|
+
for (let value = chainPending; value < state.next; value++) {
|
|
141
|
+
if (!held.has(value))
|
|
142
|
+
reclaimed.push(value);
|
|
143
|
+
}
|
|
144
|
+
if (reclaimed.length === 0)
|
|
145
|
+
return [];
|
|
146
|
+
await this.deps.sequences.put(key, {
|
|
147
|
+
next: state.next,
|
|
148
|
+
released: [...state.released, ...reclaimed].sort(byValue),
|
|
149
|
+
fence,
|
|
150
|
+
}, state.version);
|
|
151
|
+
return reclaimed;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.SequenceCoordinator = SequenceCoordinator;
|
|
155
|
+
//# sourceMappingURL=sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../../src/core/ordering/sequence.ts"],"names":[],"mappings":"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","sourcesContent":["import { StateError } from '../errors/error';\nimport type { Lease, LockManager, SequenceStore } from '../store/types';\nimport type { Clock } from '../util/clock';\n\nexport function sequenceKey(\n namespace: string,\n chain: string,\n network: string,\n address: string,\n): string {\n return `seq:${namespace}:${chain}:${network}:${address}`;\n}\n\nconst byValue = (a: bigint, b: bigint): number => (a < b ? -1 : a > b ? 1 : 0);\n\n/** A held lease that can be renewed; renewal failure means another worker took over. */\nexport class LeaseHandle {\n #lease: Lease;\n\n constructor(\n private readonly locks: LockManager,\n private readonly ttlMs: number,\n lease: Lease,\n ) {\n this.#lease = lease;\n }\n\n get current(): Lease {\n return this.#lease;\n }\n\n async renew(): Promise<void> {\n const renewed = await this.locks.renew(this.#lease, this.ttlMs);\n if (!renewed)\n throw new StateError('FENCING', 'the address lease was lost to another worker');\n this.#lease = renewed;\n }\n}\n\n/**\n * Lease tokens increase per key only, so a lease for another key cannot fence this one.\n * Messages omit the key: it embeds the wallet address, and error messages reach logs.\n */\nfunction fenceFor(lease: LeaseHandle, key: string): bigint {\n const { key: leased, token } = lease.current;\n if (leased !== key) {\n throw new StateError(\n 'FENCING',\n 'a lease for another address cannot write this sequence',\n );\n }\n return token;\n}\n\nexport interface SequenceCoordinatorDeps {\n readonly locks: LockManager;\n readonly sequences: SequenceStore;\n readonly clock: Clock;\n readonly owner: string;\n readonly leaseMs: number;\n /** How long to wait for a busy address before failing with SEQUENCE_BUSY (default: leaseMs). */\n readonly acquireTimeoutMs?: number;\n /**\n * Observes a failed best-effort lease release (the lease then lapses by its TTL).\n * Its own failure is ignored. Log only the error code: messages may carry store detail.\n */\n onReleaseError?(error: unknown): void;\n}\n\nexport class SequenceCoordinator {\n constructor(private readonly deps: SequenceCoordinatorDeps) {}\n\n /**\n * Runs `fn` while holding the address lease for `key`, then releases it.\n *\n * Not re-entrant: a nested `withLease` on the same key waits like any other caller.\n * It fails with SEQUENCE_BUSY after `acquireTimeoutMs`, or, when that is not shorter\n * than `leaseMs`, it can outlive the outer lease, take it over and fence the outer\n * caller. Code that already holds the lease must pass its `LeaseHandle` down instead.\n * The lease is not renewed automatically; long callbacks call `lease.renew()`.\n * `options.acquireTimeoutMs` overrides the wait for this call (`0`: a single try).\n */\n async withLease<T>(\n key: string,\n fn: (lease: LeaseHandle) => Promise<T>,\n signal?: AbortSignal,\n options: { readonly acquireTimeoutMs?: number } = {},\n ): Promise<T> {\n signal?.throwIfAborted();\n const deadline =\n this.deps.clock.now() +\n (options.acquireTimeoutMs ?? this.deps.acquireTimeoutMs ?? this.deps.leaseMs);\n let lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);\n while (!lease) {\n if (this.deps.clock.now() >= deadline) {\n throw new StateError(\n 'SEQUENCE_BUSY',\n 'the address lease is held by another operation',\n { retryable: true },\n );\n }\n await this.deps.clock.sleep(25, signal);\n lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);\n }\n const handle = new LeaseHandle(this.deps.locks, this.deps.leaseMs, lease);\n try {\n return await fn(handle);\n } finally {\n // Best effort: a failed release must not replace the callback's outcome (for\n // example a completed broadcast). The lease then lapses by its TTL, and fencing\n // still guards every write.\n await this.#release(handle.current);\n }\n }\n\n /**\n * A release that throws, synchronously or not, is reported and absorbed, and so\n * is the observer's own failure, including an async observer's rejection.\n */\n async #release(lease: Lease): Promise<void> {\n try {\n await this.deps.locks.release(lease);\n } catch (error) {\n try {\n const observed: unknown = this.deps.onReleaseError?.(error);\n if (typeof (observed as { then?: unknown } | null)?.then === 'function') {\n Promise.resolve(observed).catch(() => undefined);\n }\n } catch {\n // An observer failure must not replace the outcome either.\n }\n }\n }\n\n async allocate(lease: LeaseHandle, key: string, chainPending: bigint): Promise<bigint> {\n const fence = fenceFor(lease, key);\n const state = await this.deps.sequences.get(key);\n const released = [...(state?.released ?? [])]\n .filter((n) => n >= chainPending)\n .sort(byValue);\n const floor = state && state.next > chainPending ? state.next : chainPending;\n const pick = released[0] ?? floor;\n const next = pick >= floor ? pick + 1n : floor;\n await this.deps.sequences.put(\n key,\n { next, released: released.filter((n) => n !== pick), fence },\n state?.version ?? null,\n );\n return pick;\n }\n\n /**\n * Returns a reserved value for reuse. Only legal while no valid signed bytes exist for\n * it. Precondition: called at most once per allocation, by the Operation holding the\n * value, after its terminal CAS or after a failure before its reservation was persisted.\n * Releasing a value that is at or above `next`, or already released, is a no-op.\n */\n async release(lease: LeaseHandle, key: string, value: bigint): Promise<void> {\n const fence = fenceFor(lease, key);\n const state = await this.deps.sequences.get(key);\n if (!state || value >= state.next || state.released.includes(value)) return;\n await this.deps.sequences.put(\n key,\n { next: state.next, released: [...state.released, value].sort(byValue), fence },\n state.version,\n );\n }\n\n /**\n * Nonce reconciliation: returns to `released` every value in [chainPending, next) that is\n * neither released already nor in `reserved`, and returns those values (ascending). It\n * never touches a value below `chainPending` (the chain consumed it) or at or above\n * `next` (never allocated). The caller holds `lease` and reads `reserved` (the values live\n * Operations hold) under it, so no allocation can interleave; nothing is written when\n * there is nothing to reclaim.\n */\n async reclaim(\n lease: LeaseHandle,\n key: string,\n chainPending: bigint,\n reserved: readonly bigint[],\n ): Promise<bigint[]> {\n const fence = fenceFor(lease, key);\n const state = await this.deps.sequences.get(key);\n if (!state) return [];\n const held = new Set([...state.released, ...reserved]);\n const reclaimed: bigint[] = [];\n for (let value = chainPending; value < state.next; value++) {\n if (!held.has(value)) reclaimed.push(value);\n }\n if (reclaimed.length === 0) return [];\n await this.deps.sequences.put(\n key,\n {\n next: state.next,\n released: [...state.released, ...reclaimed].sort(byValue),\n fence,\n },\n state.version,\n );\n return reclaimed;\n }\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AdapterManifest, DriverFactory } from '../driver/types';
|
|
2
|
+
export declare class AdapterCatalog {
|
|
3
|
+
#private;
|
|
4
|
+
register(manifest: AdapterManifest): void;
|
|
5
|
+
/** Manifests for a chain in registration order; the first is the family default. */
|
|
6
|
+
forChain(chainId: string): AdapterManifest[];
|
|
7
|
+
get(chainId: string, library: string): AdapterManifest | undefined;
|
|
8
|
+
load(manifest: AdapterManifest): Promise<DriverFactory>;
|
|
9
|
+
clone(): AdapterCatalog;
|
|
10
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdapterCatalog = void 0;
|
|
4
|
+
const error_1 = require("../errors/error");
|
|
5
|
+
const keyOf = (m) => `${m.family}/${m.library}`;
|
|
6
|
+
function dependencyError(manifest, error) {
|
|
7
|
+
const code = error?.code;
|
|
8
|
+
if (code !== 'MODULE_NOT_FOUND' && code !== 'ERR_MODULE_NOT_FOUND')
|
|
9
|
+
return error;
|
|
10
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
11
|
+
const deps = manifest.peerDependencies.filter((d) => message.includes(`'${d.name}'`) || message.includes(`"${d.name}"`));
|
|
12
|
+
// Only a missing peer dependency is the user's to install. Any other missing module
|
|
13
|
+
// (the adapter's own file, a broken build) keeps its own error.
|
|
14
|
+
if (deps.length === 0)
|
|
15
|
+
return error;
|
|
16
|
+
const install = deps.map((d) => `${d.name}@${d.range}`).join(' ');
|
|
17
|
+
return new error_1.ConfigError('DEPENDENCY_MISSING', `library '${manifest.library}' (${manifest.family}) needs ${deps.map((d) => d.name).join(', ')}; install it: npm i ${install}`, { cause: error, details: { packages: deps.map((d) => d.name) } });
|
|
18
|
+
}
|
|
19
|
+
class AdapterCatalog {
|
|
20
|
+
#manifests = new Map();
|
|
21
|
+
#loaded = new Map();
|
|
22
|
+
register(manifest) {
|
|
23
|
+
const key = keyOf(manifest);
|
|
24
|
+
if (this.#manifests.has(key)) {
|
|
25
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `adapter '${key}' is already registered`);
|
|
26
|
+
}
|
|
27
|
+
this.#manifests.set(key, manifest);
|
|
28
|
+
}
|
|
29
|
+
/** Manifests for a chain in registration order; the first is the family default. */
|
|
30
|
+
forChain(chainId) {
|
|
31
|
+
return [...this.#manifests.values()].filter((m) => m.chains.includes(chainId));
|
|
32
|
+
}
|
|
33
|
+
get(chainId, library) {
|
|
34
|
+
return this.forChain(chainId).find((m) => m.library === library);
|
|
35
|
+
}
|
|
36
|
+
load(manifest) {
|
|
37
|
+
const key = keyOf(manifest);
|
|
38
|
+
let pending = this.#loaded.get(key);
|
|
39
|
+
if (!pending) {
|
|
40
|
+
pending = manifest.load().catch((error) => {
|
|
41
|
+
this.#loaded.delete(key);
|
|
42
|
+
throw dependencyError(manifest, error);
|
|
43
|
+
});
|
|
44
|
+
this.#loaded.set(key, pending);
|
|
45
|
+
}
|
|
46
|
+
return pending;
|
|
47
|
+
}
|
|
48
|
+
clone() {
|
|
49
|
+
const copy = new AdapterCatalog();
|
|
50
|
+
for (const [key, manifest] of this.#manifests)
|
|
51
|
+
copy.#manifests.set(key, manifest);
|
|
52
|
+
return copy;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.AdapterCatalog = AdapterCatalog;
|
|
56
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../src/core/registry/adapters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdapterManifest, DriverFactory } from '../driver/types';\nimport { ConfigError } from '../errors/error';\n\nconst keyOf = (m: AdapterManifest): string => `${m.family}/${m.library}`;\n\nfunction dependencyError(manifest: AdapterManifest, error: unknown): unknown {\n const code = (error as { code?: unknown } | null)?.code;\n if (code !== 'MODULE_NOT_FOUND' && code !== 'ERR_MODULE_NOT_FOUND') return error;\n const message = error instanceof Error ? error.message : String(error);\n const deps = manifest.peerDependencies.filter(\n (d) => message.includes(`'${d.name}'`) || message.includes(`\"${d.name}\"`),\n );\n // Only a missing peer dependency is the user's to install. Any other missing module\n // (the adapter's own file, a broken build) keeps its own error.\n if (deps.length === 0) return error;\n const install = deps.map((d) => `${d.name}@${d.range}`).join(' ');\n return new ConfigError(\n 'DEPENDENCY_MISSING',\n `library '${manifest.library}' (${manifest.family}) needs ${deps.map((d) => d.name).join(', ')}; install it: npm i ${install}`,\n { cause: error, details: { packages: deps.map((d) => d.name) } },\n );\n}\n\nexport class AdapterCatalog {\n readonly #manifests = new Map<string, AdapterManifest>();\n readonly #loaded = new Map<string, Promise<DriverFactory>>();\n\n register(manifest: AdapterManifest): void {\n const key = keyOf(manifest);\n if (this.#manifests.has(key)) {\n throw new ConfigError('CONFIG_INVALID', `adapter '${key}' is already registered`);\n }\n this.#manifests.set(key, manifest);\n }\n\n /** Manifests for a chain in registration order; the first is the family default. */\n forChain(chainId: string): AdapterManifest[] {\n return [...this.#manifests.values()].filter((m) => m.chains.includes(chainId));\n }\n\n get(chainId: string, library: string): AdapterManifest | undefined {\n return this.forChain(chainId).find((m) => m.library === library);\n }\n\n load(manifest: AdapterManifest): Promise<DriverFactory> {\n const key = keyOf(manifest);\n let pending = this.#loaded.get(key);\n if (!pending) {\n pending = manifest.load().catch((error: unknown) => {\n this.#loaded.delete(key);\n throw dependencyError(manifest, error);\n });\n this.#loaded.set(key, pending);\n }\n return pending;\n }\n\n clone(): AdapterCatalog {\n const copy = new AdapterCatalog();\n for (const [key, manifest] of this.#manifests) copy.#manifests.set(key, manifest);\n return copy;\n }\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type AssetId, type AssetInfo, type AssetMetadata, type AssetRef } from '../model/asset';
|
|
2
|
+
import type { ChainInfo } from '../model/chain';
|
|
3
|
+
export interface AssetRegistration {
|
|
4
|
+
readonly chain: string;
|
|
5
|
+
readonly network: string;
|
|
6
|
+
readonly ref: AssetRef;
|
|
7
|
+
readonly metadata: AssetMetadata;
|
|
8
|
+
readonly aliases?: readonly string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class AssetCatalog {
|
|
11
|
+
#private;
|
|
12
|
+
register(registration: AssetRegistration): AssetInfo;
|
|
13
|
+
registerNative(chain: ChainInfo): void;
|
|
14
|
+
get(id: AssetId): AssetInfo | undefined;
|
|
15
|
+
native(chain: string, network: string): AssetInfo;
|
|
16
|
+
resolveAlias(chain: string, network: string, alias: string): AssetInfo;
|
|
17
|
+
clone(): AssetCatalog;
|
|
18
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AssetCatalog = void 0;
|
|
4
|
+
const error_1 = require("../errors/error");
|
|
5
|
+
const asset_1 = require("../model/asset");
|
|
6
|
+
const names_1 = require("../util/names");
|
|
7
|
+
const ALIAS = /^[A-Z0-9._-]{1,32}$/;
|
|
8
|
+
class AssetCatalog {
|
|
9
|
+
#byId = new Map();
|
|
10
|
+
#aliases = new Map();
|
|
11
|
+
register(registration) {
|
|
12
|
+
const id = (0, asset_1.assetId)(registration.chain, registration.network, registration.ref);
|
|
13
|
+
const problem = (0, asset_1.metadataProblem)(registration.metadata);
|
|
14
|
+
if (problem)
|
|
15
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `asset '${id}': ${problem}`);
|
|
16
|
+
const existing = this.#byId.get(id);
|
|
17
|
+
if (existing &&
|
|
18
|
+
(existing.metadata.symbol !== registration.metadata.symbol ||
|
|
19
|
+
existing.metadata.decimals !== registration.metadata.decimals)) {
|
|
20
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `asset '${id}' is already registered with different metadata`);
|
|
21
|
+
}
|
|
22
|
+
const scopeKey = `${registration.chain}:${registration.network}`;
|
|
23
|
+
const scope = this.#aliases.get(scopeKey) ?? new Map();
|
|
24
|
+
const aliases = (registration.aliases ?? []).map((alias) => {
|
|
25
|
+
const normalized = alias.trim().toUpperCase();
|
|
26
|
+
if (!ALIAS.test(normalized)) {
|
|
27
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `invalid asset alias '${alias}'`);
|
|
28
|
+
}
|
|
29
|
+
const owner = scope.get(normalized);
|
|
30
|
+
if (owner && owner !== id) {
|
|
31
|
+
throw new error_1.ConfigError('CONFIG_INVALID', `alias '${normalized}' on ${scopeKey} already refers to '${owner}'`);
|
|
32
|
+
}
|
|
33
|
+
return normalized;
|
|
34
|
+
});
|
|
35
|
+
const info = existing ??
|
|
36
|
+
Object.freeze({
|
|
37
|
+
id,
|
|
38
|
+
chain: registration.chain,
|
|
39
|
+
network: registration.network,
|
|
40
|
+
ref: registration.ref,
|
|
41
|
+
metadata: Object.freeze({ ...registration.metadata }),
|
|
42
|
+
});
|
|
43
|
+
this.#byId.set(id, info);
|
|
44
|
+
for (const alias of aliases)
|
|
45
|
+
scope.set(alias, id);
|
|
46
|
+
this.#aliases.set(scopeKey, scope);
|
|
47
|
+
return info;
|
|
48
|
+
}
|
|
49
|
+
registerNative(chain) {
|
|
50
|
+
for (const network of Object.keys(chain.networks)) {
|
|
51
|
+
this.register({
|
|
52
|
+
chain: chain.id,
|
|
53
|
+
network,
|
|
54
|
+
ref: 'native',
|
|
55
|
+
metadata: chain.nativeAsset,
|
|
56
|
+
aliases: [chain.nativeAsset.symbol],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
get(id) {
|
|
61
|
+
return this.#byId.get(id);
|
|
62
|
+
}
|
|
63
|
+
native(chain, network) {
|
|
64
|
+
const info = this.#byId.get((0, asset_1.assetId)(chain, network, 'native'));
|
|
65
|
+
if (!info) {
|
|
66
|
+
throw new error_1.ValidationError('ASSET_RESOLUTION', `no native asset registered for ${chain}:${network}`);
|
|
67
|
+
}
|
|
68
|
+
return info;
|
|
69
|
+
}
|
|
70
|
+
resolveAlias(chain, network, alias) {
|
|
71
|
+
const scopeKey = `${chain}:${network}`;
|
|
72
|
+
const scope = this.#aliases.get(scopeKey);
|
|
73
|
+
const id = scope?.get(alias.trim().toUpperCase());
|
|
74
|
+
const info = id ? this.#byId.get(id) : undefined;
|
|
75
|
+
if (!info) {
|
|
76
|
+
throw new error_1.ValidationError('ASSET_RESOLUTION', (0, names_1.unknownName)(`asset alias on ${scopeKey}`, scope?.keys() ?? []));
|
|
77
|
+
}
|
|
78
|
+
return info;
|
|
79
|
+
}
|
|
80
|
+
clone() {
|
|
81
|
+
const copy = new AssetCatalog();
|
|
82
|
+
for (const [id, info] of this.#byId)
|
|
83
|
+
copy.#byId.set(id, info);
|
|
84
|
+
for (const [key, scope] of this.#aliases)
|
|
85
|
+
copy.#aliases.set(key, new Map(scope));
|
|
86
|
+
return copy;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.AssetCatalog = AssetCatalog;
|
|
90
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/core/registry/assets.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigError, ValidationError } from '../errors/error';\nimport {\n assetId,\n metadataProblem,\n type AssetId,\n type AssetInfo,\n type AssetMetadata,\n type AssetRef,\n} from '../model/asset';\nimport type { ChainInfo } from '../model/chain';\nimport { unknownName } from '../util/names';\n\nexport interface AssetRegistration {\n readonly chain: string;\n readonly network: string;\n readonly ref: AssetRef;\n readonly metadata: AssetMetadata;\n readonly aliases?: readonly string[];\n}\n\nconst ALIAS = /^[A-Z0-9._-]{1,32}$/;\n\nexport class AssetCatalog {\n readonly #byId = new Map<AssetId, AssetInfo>();\n readonly #aliases = new Map<string, Map<string, AssetId>>();\n\n register(registration: AssetRegistration): AssetInfo {\n const id = assetId(registration.chain, registration.network, registration.ref);\n const problem = metadataProblem(registration.metadata);\n if (problem) throw new ConfigError('CONFIG_INVALID', `asset '${id}': ${problem}`);\n const existing = this.#byId.get(id);\n if (\n existing &&\n (existing.metadata.symbol !== registration.metadata.symbol ||\n existing.metadata.decimals !== registration.metadata.decimals)\n ) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `asset '${id}' is already registered with different metadata`,\n );\n }\n const scopeKey = `${registration.chain}:${registration.network}`;\n const scope = this.#aliases.get(scopeKey) ?? new Map<string, AssetId>();\n const aliases = (registration.aliases ?? []).map((alias) => {\n const normalized = alias.trim().toUpperCase();\n if (!ALIAS.test(normalized)) {\n throw new ConfigError('CONFIG_INVALID', `invalid asset alias '${alias}'`);\n }\n const owner = scope.get(normalized);\n if (owner && owner !== id) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `alias '${normalized}' on ${scopeKey} already refers to '${owner}'`,\n );\n }\n return normalized;\n });\n const info: AssetInfo =\n existing ??\n Object.freeze({\n id,\n chain: registration.chain,\n network: registration.network,\n ref: registration.ref,\n metadata: Object.freeze({ ...registration.metadata }),\n });\n this.#byId.set(id, info);\n for (const alias of aliases) scope.set(alias, id);\n this.#aliases.set(scopeKey, scope);\n return info;\n }\n\n registerNative(chain: ChainInfo): void {\n for (const network of Object.keys(chain.networks)) {\n this.register({\n chain: chain.id,\n network,\n ref: 'native',\n metadata: chain.nativeAsset,\n aliases: [chain.nativeAsset.symbol],\n });\n }\n }\n\n get(id: AssetId): AssetInfo | undefined {\n return this.#byId.get(id);\n }\n\n native(chain: string, network: string): AssetInfo {\n const info = this.#byId.get(assetId(chain, network, 'native'));\n if (!info) {\n throw new ValidationError(\n 'ASSET_RESOLUTION',\n `no native asset registered for ${chain}:${network}`,\n );\n }\n return info;\n }\n\n resolveAlias(chain: string, network: string, alias: string): AssetInfo {\n const scopeKey = `${chain}:${network}`;\n const scope = this.#aliases.get(scopeKey);\n const id = scope?.get(alias.trim().toUpperCase());\n const info = id ? this.#byId.get(id) : undefined;\n if (!info) {\n throw new ValidationError(\n 'ASSET_RESOLUTION',\n unknownName(`asset alias on ${scopeKey}`, scope?.keys() ?? []),\n );\n }\n return info;\n }\n\n clone(): AssetCatalog {\n const copy = new AssetCatalog();\n for (const [id, info] of this.#byId) copy.#byId.set(id, info);\n for (const [key, scope] of this.#aliases) copy.#aliases.set(key, new Map(scope));\n return copy;\n }\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChainInfo, NetworkInfo } from '../model/chain';
|
|
2
|
+
export declare class ChainCatalog {
|
|
3
|
+
#private;
|
|
4
|
+
register(chain: ChainInfo): void;
|
|
5
|
+
has(id: string): boolean;
|
|
6
|
+
get(id: string): ChainInfo;
|
|
7
|
+
list(): ChainInfo[];
|
|
8
|
+
network(chainId: string, networkId: string): NetworkInfo;
|
|
9
|
+
clone(): ChainCatalog;
|
|
10
|
+
}
|