crypto-aio 0.0.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +144 -14
- package/dist/adapters/avalanche/address.d.ts +15 -0
- package/dist/adapters/avalanche/address.js +74 -0
- package/dist/adapters/avalanche/address.js.map +1 -0
- package/dist/adapters/avalanche/api.d.ts +100 -0
- package/dist/adapters/avalanche/api.js +381 -0
- package/dist/adapters/avalanche/api.js.map +1 -0
- package/dist/adapters/avalanche/builder.d.ts +13 -0
- package/dist/adapters/avalanche/builder.js +336 -0
- package/dist/adapters/avalanche/builder.js.map +1 -0
- package/dist/adapters/avalanche/cb58.d.ts +7 -0
- package/dist/adapters/avalanche/cb58.js +49 -0
- package/dist/adapters/avalanche/cb58.js.map +1 -0
- package/dist/adapters/avalanche/chains.d.ts +21 -0
- package/dist/adapters/avalanche/chains.js +79 -0
- package/dist/adapters/avalanche/chains.js.map +1 -0
- package/dist/adapters/avalanche/codec.d.ts +94 -0
- package/dist/adapters/avalanche/codec.js +371 -0
- package/dist/adapters/avalanche/codec.js.map +1 -0
- package/dist/adapters/avalanche/context.d.ts +59 -0
- package/dist/adapters/avalanche/context.js +114 -0
- package/dist/adapters/avalanche/context.js.map +1 -0
- package/dist/adapters/avalanche/decode.d.ts +16 -0
- package/dist/adapters/avalanche/decode.js +101 -0
- package/dist/adapters/avalanche/decode.js.map +1 -0
- package/dist/adapters/avalanche/driver.d.ts +22 -0
- package/dist/adapters/avalanche/driver.js +81 -0
- package/dist/adapters/avalanche/driver.js.map +1 -0
- package/dist/adapters/avalanche/errors.d.ts +18 -0
- package/dist/adapters/avalanche/errors.js +61 -0
- package/dist/adapters/avalanche/errors.js.map +1 -0
- package/dist/adapters/avalanche/fees.d.ts +23 -0
- package/dist/adapters/avalanche/fees.js +105 -0
- package/dist/adapters/avalanche/fees.js.map +1 -0
- package/dist/adapters/avalanche/index.d.ts +19 -0
- package/dist/adapters/avalanche/index.js +8 -0
- package/dist/adapters/avalanche/index.js.map +1 -0
- package/dist/adapters/avalanche/network.d.ts +37 -0
- package/dist/adapters/avalanche/network.js +135 -0
- package/dist/adapters/avalanche/network.js.map +1 -0
- package/dist/adapters/avalanche/plugin.d.ts +21 -0
- package/dist/adapters/avalanche/plugin.js +46 -0
- package/dist/adapters/avalanche/plugin.js.map +1 -0
- package/dist/adapters/avalanche/presets.d.ts +6 -0
- package/dist/adapters/avalanche/presets.js +86 -0
- package/dist/adapters/avalanche/presets.js.map +1 -0
- package/dist/adapters/avalanche/proofs.d.ts +41 -0
- package/dist/adapters/avalanche/proofs.js +270 -0
- package/dist/adapters/avalanche/proofs.js.map +1 -0
- package/dist/adapters/avalanche/reader.d.ts +40 -0
- package/dist/adapters/avalanche/reader.js +231 -0
- package/dist/adapters/avalanche/reader.js.map +1 -0
- package/dist/adapters/avalanche/sdk.d.ts +182 -0
- package/dist/adapters/avalanche/sdk.js +21 -0
- package/dist/adapters/avalanche/sdk.js.map +1 -0
- package/dist/adapters/avalanche/types.d.ts +86 -0
- package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
- package/dist/adapters/avalanche/types.js.map +1 -0
- package/dist/adapters/evm/builder.d.ts +11 -0
- package/dist/adapters/evm/builder.js +326 -0
- package/dist/adapters/evm/builder.js.map +1 -0
- package/dist/adapters/evm/chains.d.ts +6 -0
- package/dist/adapters/evm/chains.js +203 -0
- package/dist/adapters/evm/chains.js.map +1 -0
- package/dist/adapters/evm/client.d.ts +84 -0
- package/dist/adapters/evm/client.js +335 -0
- package/dist/adapters/evm/client.js.map +1 -0
- package/dist/adapters/evm/decode.d.ts +35 -0
- package/dist/adapters/evm/decode.js +170 -0
- package/dist/adapters/evm/decode.js.map +1 -0
- package/dist/adapters/evm/driver.d.ts +8 -0
- package/dist/adapters/evm/driver.js +61 -0
- package/dist/adapters/evm/driver.js.map +1 -0
- package/dist/adapters/evm/errors.d.ts +20 -0
- package/dist/adapters/evm/errors.js +110 -0
- package/dist/adapters/evm/errors.js.map +1 -0
- package/dist/adapters/evm/ethers-client.d.ts +43 -0
- package/dist/adapters/evm/ethers-client.js +135 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -0
- package/dist/adapters/evm/fees.d.ts +79 -0
- package/dist/adapters/evm/fees.js +234 -0
- package/dist/adapters/evm/fees.js.map +1 -0
- package/dist/adapters/evm/index.d.ts +20 -0
- package/dist/adapters/evm/index.js +11 -0
- package/dist/adapters/evm/index.js.map +1 -0
- package/dist/adapters/evm/network.d.ts +60 -0
- package/dist/adapters/evm/network.js +131 -0
- package/dist/adapters/evm/network.js.map +1 -0
- package/dist/adapters/evm/plugin.d.ts +36 -0
- package/dist/adapters/evm/plugin.js +102 -0
- package/dist/adapters/evm/plugin.js.map +1 -0
- package/dist/adapters/evm/presets.d.ts +2 -0
- package/dist/adapters/evm/presets.js +105 -0
- package/dist/adapters/evm/presets.js.map +1 -0
- package/dist/adapters/evm/proofs.d.ts +19 -0
- package/dist/adapters/evm/proofs.js +358 -0
- package/dist/adapters/evm/proofs.js.map +1 -0
- package/dist/adapters/evm/rawtx.d.ts +25 -0
- package/dist/adapters/evm/rawtx.js +176 -0
- package/dist/adapters/evm/rawtx.js.map +1 -0
- package/dist/adapters/evm/reader.d.ts +65 -0
- package/dist/adapters/evm/reader.js +292 -0
- package/dist/adapters/evm/reader.js.map +1 -0
- package/dist/adapters/evm/rpc.d.ts +39 -0
- package/dist/adapters/evm/rpc.js +152 -0
- package/dist/adapters/evm/rpc.js.map +1 -0
- package/dist/adapters/evm/tokens.d.ts +7 -0
- package/dist/adapters/evm/tokens.js +23 -0
- package/dist/adapters/evm/tokens.js.map +1 -0
- package/dist/adapters/evm/types.d.ts +255 -0
- package/dist/{type/account.js → adapters/evm/types.js} +1 -1
- package/dist/adapters/evm/types.js.map +1 -0
- package/dist/adapters/evm/web3-client.d.ts +23 -0
- package/dist/adapters/evm/web3-client.js +159 -0
- package/dist/adapters/evm/web3-client.js.map +1 -0
- package/dist/adapters/solana/builder.d.ts +18 -0
- package/dist/adapters/solana/builder.js +545 -0
- package/dist/adapters/solana/builder.js.map +1 -0
- package/dist/adapters/solana/chains.d.ts +13 -0
- package/dist/adapters/solana/chains.js +37 -0
- package/dist/adapters/solana/chains.js.map +1 -0
- package/dist/adapters/solana/decode.d.ts +111 -0
- package/dist/adapters/solana/decode.js +595 -0
- package/dist/adapters/solana/decode.js.map +1 -0
- package/dist/adapters/solana/driver.d.ts +15 -0
- package/dist/adapters/solana/driver.js +72 -0
- package/dist/adapters/solana/driver.js.map +1 -0
- package/dist/adapters/solana/errors.d.ts +36 -0
- package/dist/adapters/solana/errors.js +154 -0
- package/dist/adapters/solana/errors.js.map +1 -0
- package/dist/adapters/solana/fees.d.ts +68 -0
- package/dist/adapters/solana/fees.js +205 -0
- package/dist/adapters/solana/fees.js.map +1 -0
- package/dist/adapters/solana/heights.d.ts +47 -0
- package/dist/adapters/solana/heights.js +185 -0
- package/dist/adapters/solana/heights.js.map +1 -0
- package/dist/adapters/solana/history.d.ts +10 -0
- package/dist/adapters/solana/history.js +71 -0
- package/dist/adapters/solana/history.js.map +1 -0
- package/dist/adapters/solana/index.d.ts +16 -0
- package/dist/adapters/solana/index.js +9 -0
- package/dist/adapters/solana/index.js.map +1 -0
- package/dist/adapters/solana/keys.d.ts +13 -0
- package/dist/adapters/solana/keys.js +69 -0
- package/dist/adapters/solana/keys.js.map +1 -0
- package/dist/adapters/solana/network.d.ts +24 -0
- package/dist/adapters/solana/network.js +95 -0
- package/dist/adapters/solana/network.js.map +1 -0
- package/dist/adapters/solana/plugin.d.ts +18 -0
- package/dist/adapters/solana/plugin.js +41 -0
- package/dist/adapters/solana/plugin.js.map +1 -0
- package/dist/adapters/solana/presets.d.ts +2 -0
- package/dist/adapters/solana/presets.js +77 -0
- package/dist/adapters/solana/presets.js.map +1 -0
- package/dist/adapters/solana/programs.d.ts +44 -0
- package/dist/adapters/solana/programs.js +159 -0
- package/dist/adapters/solana/programs.js.map +1 -0
- package/dist/adapters/solana/proofs.d.ts +56 -0
- package/dist/adapters/solana/proofs.js +540 -0
- package/dist/adapters/solana/proofs.js.map +1 -0
- package/dist/adapters/solana/reader.d.ts +82 -0
- package/dist/adapters/solana/reader.js +326 -0
- package/dist/adapters/solana/reader.js.map +1 -0
- package/dist/adapters/solana/rpc.d.ts +102 -0
- package/dist/adapters/solana/rpc.js +301 -0
- package/dist/adapters/solana/rpc.js.map +1 -0
- package/dist/adapters/solana/tokens.d.ts +7 -0
- package/dist/adapters/solana/tokens.js +19 -0
- package/dist/adapters/solana/tokens.js.map +1 -0
- package/dist/adapters/solana/types.d.ts +121 -0
- package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
- package/dist/adapters/solana/types.js.map +1 -0
- package/dist/adapters/solana/web3.d.ts +5 -0
- package/dist/adapters/solana/web3.js +83 -0
- package/dist/adapters/solana/web3.js.map +1 -0
- package/dist/adapters/solana/wire.d.ts +62 -0
- package/dist/adapters/solana/wire.js +168 -0
- package/dist/adapters/solana/wire.js.map +1 -0
- package/dist/adapters/ton/address.d.ts +43 -0
- package/dist/adapters/ton/address.js +168 -0
- package/dist/adapters/ton/address.js.map +1 -0
- package/dist/adapters/ton/api.d.ts +344 -0
- package/dist/adapters/ton/api.js +942 -0
- package/dist/adapters/ton/api.js.map +1 -0
- package/dist/adapters/ton/builder.d.ts +18 -0
- package/dist/adapters/ton/builder.js +701 -0
- package/dist/adapters/ton/builder.js.map +1 -0
- package/dist/adapters/ton/chains.d.ts +16 -0
- package/dist/adapters/ton/chains.js +39 -0
- package/dist/adapters/ton/chains.js.map +1 -0
- package/dist/adapters/ton/decode.d.ts +43 -0
- package/dist/adapters/ton/decode.js +219 -0
- package/dist/adapters/ton/decode.js.map +1 -0
- package/dist/adapters/ton/driver.d.ts +10 -0
- package/dist/adapters/ton/driver.js +117 -0
- package/dist/adapters/ton/driver.js.map +1 -0
- package/dist/adapters/ton/errors.d.ts +36 -0
- package/dist/adapters/ton/errors.js +89 -0
- package/dist/adapters/ton/errors.js.map +1 -0
- package/dist/adapters/ton/fees.d.ts +28 -0
- package/dist/adapters/ton/fees.js +121 -0
- package/dist/adapters/ton/fees.js.map +1 -0
- package/dist/adapters/ton/index.d.ts +16 -0
- package/dist/adapters/ton/index.js +9 -0
- package/dist/adapters/ton/index.js.map +1 -0
- package/dist/adapters/ton/messages.d.ts +157 -0
- package/dist/adapters/ton/messages.js +397 -0
- package/dist/adapters/ton/messages.js.map +1 -0
- package/dist/adapters/ton/native-client.d.ts +10 -0
- package/dist/adapters/ton/native-client.js +47 -0
- package/dist/adapters/ton/native-client.js.map +1 -0
- package/dist/adapters/ton/network.d.ts +58 -0
- package/dist/adapters/ton/network.js +207 -0
- package/dist/adapters/ton/network.js.map +1 -0
- package/dist/adapters/ton/plugin.d.ts +24 -0
- package/dist/adapters/ton/plugin.js +57 -0
- package/dist/adapters/ton/plugin.js.map +1 -0
- package/dist/adapters/ton/presets.d.ts +6 -0
- package/dist/adapters/ton/presets.js +94 -0
- package/dist/adapters/ton/presets.js.map +1 -0
- package/dist/adapters/ton/proofs.d.ts +66 -0
- package/dist/adapters/ton/proofs.js +813 -0
- package/dist/adapters/ton/proofs.js.map +1 -0
- package/dist/adapters/ton/reader.d.ts +194 -0
- package/dist/adapters/ton/reader.js +781 -0
- package/dist/adapters/ton/reader.js.map +1 -0
- package/dist/adapters/ton/tokens.d.ts +10 -0
- package/dist/adapters/ton/tokens.js +27 -0
- package/dist/adapters/ton/tokens.js.map +1 -0
- package/dist/adapters/ton/trace.d.ts +48 -0
- package/dist/adapters/ton/trace.js +277 -0
- package/dist/adapters/ton/trace.js.map +1 -0
- package/dist/adapters/ton/types.d.ts +105 -0
- package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
- package/dist/adapters/ton/types.js.map +1 -0
- package/dist/adapters/ton/wallets.d.ts +86 -0
- package/dist/adapters/ton/wallets.js +373 -0
- package/dist/adapters/ton/wallets.js.map +1 -0
- package/dist/adapters/tron/abi.d.ts +39 -0
- package/dist/adapters/tron/abi.js +110 -0
- package/dist/adapters/tron/abi.js.map +1 -0
- package/dist/adapters/tron/address.d.ts +20 -0
- package/dist/adapters/tron/address.js +110 -0
- package/dist/adapters/tron/address.js.map +1 -0
- package/dist/adapters/tron/builder.d.ts +12 -0
- package/dist/adapters/tron/builder.js +553 -0
- package/dist/adapters/tron/builder.js.map +1 -0
- package/dist/adapters/tron/chains.d.ts +12 -0
- package/dist/adapters/tron/chains.js +35 -0
- package/dist/adapters/tron/chains.js.map +1 -0
- package/dist/adapters/tron/codec.d.ts +10 -0
- package/dist/adapters/tron/codec.js +322 -0
- package/dist/adapters/tron/codec.js.map +1 -0
- package/dist/adapters/tron/decode.d.ts +50 -0
- package/dist/adapters/tron/decode.js +280 -0
- package/dist/adapters/tron/decode.js.map +1 -0
- package/dist/adapters/tron/driver.d.ts +12 -0
- package/dist/adapters/tron/driver.js +106 -0
- package/dist/adapters/tron/driver.js.map +1 -0
- package/dist/adapters/tron/errors.d.ts +74 -0
- package/dist/adapters/tron/errors.js +261 -0
- package/dist/adapters/tron/errors.js.map +1 -0
- package/dist/adapters/tron/fees.d.ts +49 -0
- package/dist/adapters/tron/fees.js +166 -0
- package/dist/adapters/tron/fees.js.map +1 -0
- package/dist/adapters/tron/http.d.ts +173 -0
- package/dist/adapters/tron/http.js +729 -0
- package/dist/adapters/tron/http.js.map +1 -0
- package/dist/adapters/tron/index.d.ts +16 -0
- package/dist/adapters/tron/index.js +15 -0
- package/dist/adapters/tron/index.js.map +1 -0
- package/dist/adapters/tron/network.d.ts +44 -0
- package/dist/adapters/tron/network.js +163 -0
- package/dist/adapters/tron/network.js.map +1 -0
- package/dist/adapters/tron/plugin.d.ts +17 -0
- package/dist/adapters/tron/plugin.js +39 -0
- package/dist/adapters/tron/plugin.js.map +1 -0
- package/dist/adapters/tron/presets.d.ts +5 -0
- package/dist/adapters/tron/presets.js +68 -0
- package/dist/adapters/tron/presets.js.map +1 -0
- package/dist/adapters/tron/proofs.d.ts +80 -0
- package/dist/adapters/tron/proofs.js +370 -0
- package/dist/adapters/tron/proofs.js.map +1 -0
- package/dist/adapters/tron/protobuf.d.ts +36 -0
- package/dist/adapters/tron/protobuf.js +90 -0
- package/dist/adapters/tron/protobuf.js.map +1 -0
- package/dist/adapters/tron/reader.d.ts +47 -0
- package/dist/adapters/tron/reader.js +203 -0
- package/dist/adapters/tron/reader.js.map +1 -0
- package/dist/adapters/tron/tokens.d.ts +7 -0
- package/dist/adapters/tron/tokens.js +14 -0
- package/dist/adapters/tron/tokens.js.map +1 -0
- package/dist/adapters/tron/types.d.ts +166 -0
- package/dist/adapters/tron/types.js +3 -0
- package/dist/adapters/tron/types.js.map +1 -0
- package/dist/adapters/utxo/address.d.ts +51 -0
- package/dist/adapters/utxo/address.js +341 -0
- package/dist/adapters/utxo/address.js.map +1 -0
- package/dist/adapters/utxo/builder.d.ts +35 -0
- package/dist/adapters/utxo/builder.js +380 -0
- package/dist/adapters/utxo/builder.js.map +1 -0
- package/dist/adapters/utxo/chains.d.ts +17 -0
- package/dist/adapters/utxo/chains.js +99 -0
- package/dist/adapters/utxo/chains.js.map +1 -0
- package/dist/adapters/utxo/codec.d.ts +120 -0
- package/dist/adapters/utxo/codec.js +408 -0
- package/dist/adapters/utxo/codec.js.map +1 -0
- package/dist/adapters/utxo/coinselect.d.ts +48 -0
- package/dist/adapters/utxo/coinselect.js +131 -0
- package/dist/adapters/utxo/coinselect.js.map +1 -0
- package/dist/adapters/utxo/context.d.ts +57 -0
- package/dist/adapters/utxo/context.js +118 -0
- package/dist/adapters/utxo/context.js.map +1 -0
- package/dist/adapters/utxo/decode.d.ts +14 -0
- package/dist/adapters/utxo/decode.js +85 -0
- package/dist/adapters/utxo/decode.js.map +1 -0
- package/dist/adapters/utxo/driver.d.ts +16 -0
- package/dist/adapters/utxo/driver.js +74 -0
- package/dist/adapters/utxo/driver.js.map +1 -0
- package/dist/adapters/utxo/ecc.d.ts +9 -0
- package/dist/adapters/utxo/ecc.js +26 -0
- package/dist/adapters/utxo/ecc.js.map +1 -0
- package/dist/adapters/utxo/errors.d.ts +52 -0
- package/dist/adapters/utxo/errors.js +191 -0
- package/dist/adapters/utxo/errors.js.map +1 -0
- package/dist/adapters/utxo/esplora.d.ts +79 -0
- package/dist/adapters/utxo/esplora.js +451 -0
- package/dist/adapters/utxo/esplora.js.map +1 -0
- package/dist/adapters/utxo/fees.d.ts +41 -0
- package/dist/adapters/utxo/fees.js +125 -0
- package/dist/adapters/utxo/fees.js.map +1 -0
- package/dist/adapters/utxo/index.d.ts +17 -0
- package/dist/adapters/utxo/index.js +8 -0
- package/dist/adapters/utxo/index.js.map +1 -0
- package/dist/adapters/utxo/network.d.ts +50 -0
- package/dist/adapters/utxo/network.js +165 -0
- package/dist/adapters/utxo/network.js.map +1 -0
- package/dist/adapters/utxo/plugin.d.ts +17 -0
- package/dist/adapters/utxo/plugin.js +41 -0
- package/dist/adapters/utxo/plugin.js.map +1 -0
- package/dist/adapters/utxo/presets.d.ts +12 -0
- package/dist/adapters/utxo/presets.js +47 -0
- package/dist/adapters/utxo/presets.js.map +1 -0
- package/dist/adapters/utxo/preview.d.ts +3 -0
- package/dist/adapters/utxo/preview.js +65 -0
- package/dist/adapters/utxo/preview.js.map +1 -0
- package/dist/adapters/utxo/proofs.d.ts +57 -0
- package/dist/adapters/utxo/proofs.js +331 -0
- package/dist/adapters/utxo/proofs.js.map +1 -0
- package/dist/adapters/utxo/rawtx.d.ts +59 -0
- package/dist/adapters/utxo/rawtx.js +234 -0
- package/dist/adapters/utxo/rawtx.js.map +1 -0
- package/dist/adapters/utxo/reader.d.ts +36 -0
- package/dist/adapters/utxo/reader.js +265 -0
- package/dist/adapters/utxo/reader.js.map +1 -0
- package/dist/adapters/utxo/sdk.d.ts +18 -0
- package/dist/adapters/utxo/sdk.js +17 -0
- package/dist/adapters/utxo/sdk.js.map +1 -0
- package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
- package/dist/adapters/utxo/signed-psbt.js +428 -0
- package/dist/adapters/utxo/signed-psbt.js.map +1 -0
- package/dist/adapters/utxo/spend.d.ts +59 -0
- package/dist/adapters/utxo/spend.js +230 -0
- package/dist/adapters/utxo/spend.js.map +1 -0
- package/dist/adapters/utxo/types.d.ts +167 -0
- package/dist/adapters/utxo/types.js +3 -0
- package/dist/adapters/utxo/types.js.map +1 -0
- package/dist/core/assets/service.d.ts +18 -0
- package/dist/core/assets/service.js +69 -0
- package/dist/core/assets/service.js.map +1 -0
- package/dist/core/blockchain/default-ref.d.ts +4 -0
- package/dist/core/blockchain/default-ref.js +16 -0
- package/dist/core/blockchain/default-ref.js.map +1 -0
- package/dist/core/blockchain/handle.d.ts +200 -0
- package/dist/core/blockchain/handle.js +579 -0
- package/dist/core/blockchain/handle.js.map +1 -0
- package/dist/core/blockchain/internal.d.ts +19 -0
- package/dist/core/blockchain/internal.js +16 -0
- package/dist/core/blockchain/internal.js.map +1 -0
- package/dist/core/blockchain/mapping.d.ts +22 -0
- package/dist/core/blockchain/mapping.js +136 -0
- package/dist/core/blockchain/mapping.js.map +1 -0
- package/dist/core/config/env.d.ts +8 -0
- package/dist/core/config/env.js +60 -0
- package/dist/core/config/env.js.map +1 -0
- package/dist/core/config/merge.d.ts +26 -0
- package/dist/core/config/merge.js +144 -0
- package/dist/core/config/merge.js.map +1 -0
- package/dist/core/config/resolve.d.ts +12 -0
- package/dist/core/config/resolve.js +251 -0
- package/dist/core/config/resolve.js.map +1 -0
- package/dist/core/config/types.d.ts +165 -0
- package/dist/core/config/types.js +3 -0
- package/dist/core/config/types.js.map +1 -0
- package/dist/core/container/builtins.d.ts +4 -0
- package/dist/core/container/builtins.js +13 -0
- package/dist/core/container/builtins.js.map +1 -0
- package/dist/core/container/container.d.ts +69 -0
- package/dist/core/container/container.js +466 -0
- package/dist/core/container/container.js.map +1 -0
- package/dist/core/container/default.d.ts +15 -0
- package/dist/core/container/default.js +70 -0
- package/dist/core/container/default.js.map +1 -0
- package/dist/core/container/internals.d.ts +54 -0
- package/dist/core/container/internals.js +21 -0
- package/dist/core/container/internals.js.map +1 -0
- package/dist/core/container/pool.d.ts +27 -0
- package/dist/core/container/pool.js +77 -0
- package/dist/core/container/pool.js.map +1 -0
- package/dist/core/driver/types.d.ts +346 -0
- package/dist/core/driver/types.js +3 -0
- package/dist/core/driver/types.js.map +1 -0
- package/dist/core/errors/codes.d.ts +153 -0
- package/dist/core/errors/codes.js +49 -0
- package/dist/core/errors/codes.js.map +1 -0
- package/dist/core/errors/error.d.ts +66 -0
- package/dist/core/errors/error.js +129 -0
- package/dist/core/errors/error.js.map +1 -0
- package/dist/core/events/bus.d.ts +12 -0
- package/dist/core/events/bus.js +46 -0
- package/dist/core/events/bus.js.map +1 -0
- package/dist/core/events/logger.d.ts +13 -0
- package/dist/core/events/logger.js +42 -0
- package/dist/core/events/logger.js.map +1 -0
- package/dist/core/events/types.d.ts +131 -0
- package/dist/core/events/types.js +3 -0
- package/dist/core/events/types.js.map +1 -0
- package/dist/core/lifecycle/engine-rules.d.ts +107 -0
- package/dist/core/lifecycle/engine-rules.js +257 -0
- package/dist/core/lifecycle/engine-rules.js.map +1 -0
- package/dist/core/lifecycle/engine.d.ts +500 -0
- package/dist/core/lifecycle/engine.js +1732 -0
- package/dist/core/lifecycle/engine.js.map +1 -0
- package/dist/core/lifecycle/evaluate.d.ts +19 -0
- package/dist/core/lifecycle/evaluate.js +72 -0
- package/dist/core/lifecycle/evaluate.js.map +1 -0
- package/dist/core/lifecycle/intent.d.ts +11 -0
- package/dist/core/lifecycle/intent.js +88 -0
- package/dist/core/lifecycle/intent.js.map +1 -0
- package/dist/core/lifecycle/monitor.d.ts +138 -0
- package/dist/core/lifecycle/monitor.js +606 -0
- package/dist/core/lifecycle/monitor.js.map +1 -0
- package/dist/core/lifecycle/observations.d.ts +17 -0
- package/dist/core/lifecycle/observations.js +59 -0
- package/dist/core/lifecycle/observations.js.map +1 -0
- package/dist/core/lifecycle/reconcile.d.ts +58 -0
- package/dist/core/lifecycle/reconcile.js +112 -0
- package/dist/core/lifecycle/reconcile.js.map +1 -0
- package/dist/core/lifecycle/views.d.ts +49 -0
- package/dist/core/lifecycle/views.js +57 -0
- package/dist/core/lifecycle/views.js.map +1 -0
- package/dist/core/lifecycle/workers.d.ts +82 -0
- package/dist/core/lifecycle/workers.js +329 -0
- package/dist/core/lifecycle/workers.js.map +1 -0
- package/dist/core/model/address.d.ts +32 -0
- package/dist/core/model/address.js +43 -0
- package/dist/core/model/address.js.map +1 -0
- package/dist/core/model/amount.d.ts +25 -0
- package/dist/core/model/amount.js +102 -0
- package/dist/core/model/amount.js.map +1 -0
- package/dist/core/model/asset.d.ts +28 -0
- package/dist/core/model/asset.js +47 -0
- package/dist/core/model/asset.js.map +1 -0
- package/dist/core/model/capability.d.ts +3 -0
- package/dist/core/model/capability.js +18 -0
- package/dist/core/model/capability.js.map +1 -0
- package/dist/core/model/chain.d.ts +63 -0
- package/dist/core/model/chain.js +8 -0
- package/dist/core/model/chain.js.map +1 -0
- package/dist/core/model/fee.d.ts +36 -0
- package/dist/core/model/fee.js +17 -0
- package/dist/core/model/fee.js.map +1 -0
- package/dist/core/model/ids.d.ts +37 -0
- package/dist/core/model/ids.js +13 -0
- package/dist/core/model/ids.js.map +1 -0
- package/dist/core/model/intent.d.ts +63 -0
- package/dist/core/model/intent.js +81 -0
- package/dist/core/model/intent.js.map +1 -0
- package/dist/core/model/ordering.d.ts +20 -0
- package/dist/core/model/ordering.js +29 -0
- package/dist/core/model/ordering.js.map +1 -0
- package/dist/core/model/transaction.d.ts +116 -0
- package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
- package/dist/core/model/transaction.js.map +1 -0
- package/dist/core/observe/scanner.d.ts +135 -0
- package/dist/core/observe/scanner.js +355 -0
- package/dist/core/observe/scanner.js.map +1 -0
- package/dist/core/ordering/reservations.d.ts +16 -0
- package/dist/core/ordering/reservations.js +53 -0
- package/dist/core/ordering/reservations.js.map +1 -0
- package/dist/core/ordering/sequence.d.ts +61 -0
- package/dist/core/ordering/sequence.js +155 -0
- package/dist/core/ordering/sequence.js.map +1 -0
- package/dist/core/registry/adapters.d.ts +10 -0
- package/dist/core/registry/adapters.js +56 -0
- package/dist/core/registry/adapters.js.map +1 -0
- package/dist/core/registry/assets.d.ts +18 -0
- package/dist/core/registry/assets.js +90 -0
- package/dist/core/registry/assets.js.map +1 -0
- package/dist/core/registry/chains.d.ts +10 -0
- package/dist/core/registry/chains.js +80 -0
- package/dist/core/registry/chains.js.map +1 -0
- package/dist/core/registry/plugin.d.ts +41 -0
- package/dist/core/registry/plugin.js +109 -0
- package/dist/core/registry/plugin.js.map +1 -0
- package/dist/core/registry/providers.d.ts +31 -0
- package/dist/core/registry/providers.js +43 -0
- package/dist/core/registry/providers.js.map +1 -0
- package/dist/core/registry/schemes.d.ts +30 -0
- package/dist/core/registry/schemes.js +84 -0
- package/dist/core/registry/schemes.js.map +1 -0
- package/dist/core/secret/fragments.d.ts +33 -0
- package/dist/core/secret/fragments.js +110 -0
- package/dist/core/secret/fragments.js.map +1 -0
- package/dist/core/secret/redact.d.ts +10 -0
- package/dist/core/secret/redact.js +110 -0
- package/dist/core/secret/redact.js.map +1 -0
- package/dist/core/secret/secret.d.ts +14 -0
- package/dist/core/secret/secret.js +42 -0
- package/dist/core/secret/secret.js.map +1 -0
- package/dist/core/signing/callback.d.ts +10 -0
- package/dist/core/signing/callback.js +22 -0
- package/dist/core/signing/callback.js.map +1 -0
- package/dist/core/signing/guard.d.ts +18 -0
- package/dist/core/signing/guard.js +72 -0
- package/dist/core/signing/guard.js.map +1 -0
- package/dist/core/signing/hd.d.ts +36 -0
- package/dist/core/signing/hd.js +167 -0
- package/dist/core/signing/hd.js.map +1 -0
- package/dist/core/signing/local.d.ts +48 -0
- package/dist/core/signing/local.js +190 -0
- package/dist/core/signing/local.js.map +1 -0
- package/dist/core/signing/orchestrator.d.ts +40 -0
- package/dist/core/signing/orchestrator.js +300 -0
- package/dist/core/signing/orchestrator.js.map +1 -0
- package/dist/core/signing/types.d.ts +64 -0
- package/dist/core/signing/types.js +3 -0
- package/dist/core/signing/types.js.map +1 -0
- package/dist/core/signing/wallet.d.ts +48 -0
- package/dist/core/signing/wallet.js +153 -0
- package/dist/core/signing/wallet.js.map +1 -0
- package/dist/core/store/clone.d.ts +25 -0
- package/dist/core/store/clone.js +71 -0
- package/dist/core/store/clone.js.map +1 -0
- package/dist/core/store/memory.d.ts +38 -0
- package/dist/core/store/memory.js +325 -0
- package/dist/core/store/memory.js.map +1 -0
- package/dist/core/store/types.d.ts +246 -0
- package/dist/core/store/types.js +117 -0
- package/dist/core/store/types.js.map +1 -0
- package/dist/core/transport/backoff.d.ts +8 -0
- package/dist/core/transport/backoff.js +27 -0
- package/dist/core/transport/backoff.js.map +1 -0
- package/dist/core/transport/circuit.d.ts +25 -0
- package/dist/core/transport/circuit.js +61 -0
- package/dist/core/transport/circuit.js.map +1 -0
- package/dist/core/transport/http-transport.d.ts +30 -0
- package/dist/core/transport/http-transport.js +1695 -0
- package/dist/core/transport/http-transport.js.map +1 -0
- package/dist/core/transport/rate-limit.d.ts +27 -0
- package/dist/core/transport/rate-limit.js +78 -0
- package/dist/core/transport/rate-limit.js.map +1 -0
- package/dist/core/transport/stale-view.d.ts +11 -0
- package/dist/core/transport/stale-view.js +17 -0
- package/dist/core/transport/stale-view.js.map +1 -0
- package/dist/core/transport/types.d.ts +144 -0
- package/dist/core/transport/types.js +6 -0
- package/dist/core/transport/types.js.map +1 -0
- package/dist/core/util/bytes.d.ts +9 -0
- package/dist/core/util/bytes.js +40 -0
- package/dist/core/util/bytes.js.map +1 -0
- package/dist/core/util/clock.d.ts +6 -0
- package/dist/core/util/clock.js +26 -0
- package/dist/core/util/clock.js.map +1 -0
- package/dist/core/util/freeze.d.ts +8 -0
- package/dist/core/util/freeze.js +31 -0
- package/dist/core/util/freeze.js.map +1 -0
- package/dist/core/util/json.d.ts +29 -0
- package/dist/core/util/json.js +165 -0
- package/dist/core/util/json.js.map +1 -0
- package/dist/core/util/names.d.ts +21 -0
- package/dist/core/util/names.js +46 -0
- package/dist/core/util/names.js.map +1 -0
- package/dist/index.d.ts +64 -14
- package/dist/index.js +105 -49
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +21 -0
- package/dist/native.js +44 -0
- package/dist/native.js.map +1 -0
- package/dist/testing/contracts/api.d.ts +12 -0
- package/dist/testing/contracts/api.js +58 -0
- package/dist/testing/contracts/api.js.map +1 -0
- package/dist/testing/contracts/cursors.d.ts +6 -0
- package/dist/testing/contracts/cursors.js +43 -0
- package/dist/testing/contracts/cursors.js.map +1 -0
- package/dist/testing/contracts/locks.d.ts +10 -0
- package/dist/testing/contracts/locks.js +63 -0
- package/dist/testing/contracts/locks.js.map +1 -0
- package/dist/testing/contracts/operations.d.ts +21 -0
- package/dist/testing/contracts/operations.js +718 -0
- package/dist/testing/contracts/operations.js.map +1 -0
- package/dist/testing/contracts/sequences.d.ts +6 -0
- package/dist/testing/contracts/sequences.js +68 -0
- package/dist/testing/contracts/sequences.js.map +1 -0
- package/dist/testing/env.d.ts +63 -0
- package/dist/testing/env.js +105 -0
- package/dist/testing/env.js.map +1 -0
- package/dist/testing/fake-chain.d.ts +118 -0
- package/dist/testing/fake-chain.js +536 -0
- package/dist/testing/fake-chain.js.map +1 -0
- package/dist/testing/fake-clock.d.ts +15 -0
- package/dist/testing/fake-clock.js +86 -0
- package/dist/testing/fake-clock.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +15 -0
- package/dist/testing/fake-driver.js +458 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/fake-fetch.d.ts +32 -0
- package/dist/testing/fake-fetch.js +81 -0
- package/dist/testing/fake-fetch.js.map +1 -0
- package/dist/testing/fake-plugin.d.ts +30 -0
- package/dist/testing/fake-plugin.js +66 -0
- package/dist/testing/fake-plugin.js.map +1 -0
- package/dist/testing/faulty-store.d.ts +36 -0
- package/dist/testing/faulty-store.js +66 -0
- package/dist/testing/faulty-store.js.map +1 -0
- package/dist/testing/generation.d.ts +60 -0
- package/dist/testing/generation.js +252 -0
- package/dist/testing/generation.js.map +1 -0
- package/dist/testing/index.d.ts +28 -0
- package/dist/testing/index.js +51 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +188 -45
- package/dist/libs/eth/account.d.ts +0 -9
- package/dist/libs/eth/account.js +0 -58
- package/dist/libs/eth/account.js.map +0 -1
- package/dist/libs/eth/contract.d.ts +0 -7
- package/dist/libs/eth/contract.js +0 -42
- package/dist/libs/eth/contract.js.map +0 -1
- package/dist/libs/eth/index.d.ts +0 -24
- package/dist/libs/eth/index.js +0 -72
- package/dist/libs/eth/index.js.map +0 -1
- package/dist/libs/eth/transact.d.ts +0 -7
- package/dist/libs/eth/transact.js +0 -26
- package/dist/libs/eth/transact.js.map +0 -1
- package/dist/libs/index.d.ts +0 -2
- package/dist/libs/index.js +0 -19
- package/dist/libs/index.js.map +0 -1
- package/dist/libs/trx/account.d.ts +0 -9
- package/dist/libs/trx/account.js +0 -55
- package/dist/libs/trx/account.js.map +0 -1
- package/dist/libs/trx/contract.d.ts +0 -7
- package/dist/libs/trx/contract.js +0 -27
- package/dist/libs/trx/contract.js.map +0 -1
- package/dist/libs/trx/index.d.ts +0 -22
- package/dist/libs/trx/index.js +0 -64
- package/dist/libs/trx/index.js.map +0 -1
- package/dist/libs/trx/transact.d.ts +0 -7
- package/dist/libs/trx/transact.js +0 -26
- package/dist/libs/trx/transact.js.map +0 -1
- package/dist/tool/common.d.ts +0 -28
- package/dist/tool/common.js +0 -33
- package/dist/tool/common.js.map +0 -1
- package/dist/tool/eth-tools.d.ts +0 -3
- package/dist/tool/eth-tools.js +0 -33
- package/dist/tool/eth-tools.js.map +0 -1
- package/dist/tool/index.d.ts +0 -5
- package/dist/tool/index.js +0 -22
- package/dist/tool/index.js.map +0 -1
- package/dist/tool/logging.d.ts +0 -3
- package/dist/tool/logging.js +0 -11
- package/dist/tool/logging.js.map +0 -1
- package/dist/tool/options.d.ts +0 -6
- package/dist/tool/options.js +0 -41
- package/dist/tool/options.js.map +0 -1
- package/dist/tool/trx-tools.d.ts +0 -3
- package/dist/tool/trx-tools.js +0 -20
- package/dist/tool/trx-tools.js.map +0 -1
- package/dist/type/account.d.ts +0 -9
- package/dist/type/account.js.map +0 -1
- package/dist/type/common.d.ts +0 -18
- package/dist/type/common.js.map +0 -1
- package/dist/type/contract.d.ts +0 -10
- package/dist/type/contract.js.map +0 -1
- package/dist/type/index.d.ts +0 -5
- package/dist/type/index.js +0 -22
- package/dist/type/index.js.map +0 -1
- package/dist/type/lib-types.d.ts +0 -9
- package/dist/type/lib-types.js.map +0 -1
- package/dist/type/transact.d.ts +0 -7
- package/dist/type/transact.js.map +0 -1
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FakeChain = exports.REVERT_ADDRESS = void 0;
|
|
4
|
+
exports.fakeAddress = fakeAddress;
|
|
5
|
+
exports.isFakeAddress = isFakeAddress;
|
|
6
|
+
exports.fakeDigest = fakeDigest;
|
|
7
|
+
exports.encodeEnvelope = encodeEnvelope;
|
|
8
|
+
exports.decodeEnvelope = decodeEnvelope;
|
|
9
|
+
exports.fakeTxId = fakeTxId;
|
|
10
|
+
exports.signFake = signFake;
|
|
11
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
12
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
13
|
+
const schemes_1 = require("../core/registry/schemes");
|
|
14
|
+
const bytes_1 = require("../core/util/bytes");
|
|
15
|
+
const clock_1 = require("../core/util/clock");
|
|
16
|
+
const json_1 = require("../core/util/json");
|
|
17
|
+
exports.REVERT_ADDRESS = `fk1${'dead'.repeat(10)}`;
|
|
18
|
+
const HOST = 'fake-chain.test';
|
|
19
|
+
function fakeAddress(publicKey) {
|
|
20
|
+
return `fk1${(0, json_1.sha256Hex)(publicKey).slice(0, 40)}`;
|
|
21
|
+
}
|
|
22
|
+
function isFakeAddress(value) {
|
|
23
|
+
return /^fk1[0-9a-f]{40}$/i.test(value);
|
|
24
|
+
}
|
|
25
|
+
function fakeDigest(tx) {
|
|
26
|
+
return (0, sha256_1.sha256)((0, bytes_1.utf8ToBytes)((0, json_1.canonicalJson)(tx)));
|
|
27
|
+
}
|
|
28
|
+
function encodeEnvelope(envelope) {
|
|
29
|
+
return Buffer.from(JSON.stringify(envelope), 'utf8').toString('base64');
|
|
30
|
+
}
|
|
31
|
+
function decodeEnvelope(raw) {
|
|
32
|
+
try {
|
|
33
|
+
const value = JSON.parse(Buffer.from(raw, 'base64').toString('utf8'));
|
|
34
|
+
return value && typeof value === 'object' && value.tx && typeof value.tx === 'object'
|
|
35
|
+
? value
|
|
36
|
+
: undefined;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function fakeTxId(raw) {
|
|
43
|
+
return (0, json_1.sha256Hex)(raw);
|
|
44
|
+
}
|
|
45
|
+
/** Signs outside the library (for tests that craft conflicting transactions). */
|
|
46
|
+
function signFake(tx, privateKey) {
|
|
47
|
+
const signature = secp256k1_1.secp256k1.sign(fakeDigest(tx), privateKey, { lowS: true });
|
|
48
|
+
return encodeEnvelope({
|
|
49
|
+
tx,
|
|
50
|
+
sig: (0, bytes_1.toHex)(signature.toCompactRawBytes()),
|
|
51
|
+
recovery: signature.recovery,
|
|
52
|
+
pub: (0, bytes_1.toHex)(secp256k1_1.secp256k1.getPublicKey(privateKey, true)),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** A node-style JSON-RPC rejection. `code` defaults to -32000 (application error); framework-level
|
|
56
|
+
* failures (parse error, invalid request, method not found, invalid params) use their standard
|
|
57
|
+
* JSON-RPC codes so callers can distinguish "malformed request" from "the node said no". */
|
|
58
|
+
class RpcFailure extends Error {
|
|
59
|
+
code;
|
|
60
|
+
constructor(message, code = -32000) {
|
|
61
|
+
super(message);
|
|
62
|
+
this.code = code;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
class FakeChain {
|
|
66
|
+
ordering;
|
|
67
|
+
chainId;
|
|
68
|
+
finalityDepth;
|
|
69
|
+
minFee;
|
|
70
|
+
bumpPercent;
|
|
71
|
+
#clock;
|
|
72
|
+
#blocks = [];
|
|
73
|
+
#mempool = new Map();
|
|
74
|
+
#funding = new Map();
|
|
75
|
+
#endpoints = new Map();
|
|
76
|
+
#sends = new Map();
|
|
77
|
+
#salt = 0;
|
|
78
|
+
constructor(options = {}) {
|
|
79
|
+
this.ordering = options.ordering ?? 'nonce';
|
|
80
|
+
this.chainId = options.chainId ?? 'fake-local';
|
|
81
|
+
this.finalityDepth = options.finalityDepth ?? 3;
|
|
82
|
+
this.minFee = options.minFee ?? 1n;
|
|
83
|
+
this.bumpPercent = BigInt(options.replacementBumpPercent ?? 10);
|
|
84
|
+
this.#clock = options.clock ?? clock_1.systemClock;
|
|
85
|
+
this.#blocks.push({
|
|
86
|
+
height: 0n,
|
|
87
|
+
hash: (0, json_1.sha256Hex)(`genesis:${this.chainId}`),
|
|
88
|
+
parentHash: '0'.repeat(64),
|
|
89
|
+
timestamp: this.#clock.now(),
|
|
90
|
+
txs: [],
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
get head() {
|
|
94
|
+
return this.#tip().height;
|
|
95
|
+
}
|
|
96
|
+
finalizedHeight() {
|
|
97
|
+
const height = this.head - BigInt(this.finalityDepth);
|
|
98
|
+
return height > 0n ? height : 0n;
|
|
99
|
+
}
|
|
100
|
+
block(height) {
|
|
101
|
+
const block = this.#blocks[Number(height)];
|
|
102
|
+
return (block && {
|
|
103
|
+
height: block.height,
|
|
104
|
+
hash: block.hash,
|
|
105
|
+
parentHash: block.parentHash,
|
|
106
|
+
txIds: block.txs.map((t) => t.id),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
fund(address, amount) {
|
|
110
|
+
const key = address.toLowerCase();
|
|
111
|
+
this.#funding.set(key, (this.#funding.get(key) ?? 0n) + amount);
|
|
112
|
+
}
|
|
113
|
+
balance(address, height = this.head) {
|
|
114
|
+
return this.#state(height).balances.get(address.toLowerCase()) ?? 0n;
|
|
115
|
+
}
|
|
116
|
+
nonce(address, height = this.head) {
|
|
117
|
+
return this.#state(height).nonces.get(address.toLowerCase()) ?? 0n;
|
|
118
|
+
}
|
|
119
|
+
receipt(id, height = this.head) {
|
|
120
|
+
return this.#state(height).receipts.get(id);
|
|
121
|
+
}
|
|
122
|
+
inMempool(id) {
|
|
123
|
+
return this.#mempool.has(id);
|
|
124
|
+
}
|
|
125
|
+
sendCount(id) {
|
|
126
|
+
return this.#sends.get(id) ?? 0;
|
|
127
|
+
}
|
|
128
|
+
dropFromMempool(id) {
|
|
129
|
+
this.#mempool.delete(id);
|
|
130
|
+
}
|
|
131
|
+
/** Admits a raw transaction directly (bypassing endpoints). Throws the node's error message. */
|
|
132
|
+
submit(raw) {
|
|
133
|
+
return this.#admit(raw);
|
|
134
|
+
}
|
|
135
|
+
mine(count = 1) {
|
|
136
|
+
for (let i = 0; i < count; i++) {
|
|
137
|
+
const parent = this.#tip();
|
|
138
|
+
const height = parent.height + 1n;
|
|
139
|
+
const { balances, nonces } = this.#state(parent.height);
|
|
140
|
+
const included = [];
|
|
141
|
+
const candidates = [...this.#mempool.values()];
|
|
142
|
+
let progressed = true;
|
|
143
|
+
while (progressed) {
|
|
144
|
+
progressed = false;
|
|
145
|
+
for (const tx of candidates) {
|
|
146
|
+
if (included.includes(tx))
|
|
147
|
+
continue;
|
|
148
|
+
if (this.ordering === 'expiry') {
|
|
149
|
+
if ((tx.lastValidHeight ?? -1n) < height)
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
else if (tx.nonce !== (nonces.get(tx.from) ?? 0n)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if ((balances.get(tx.from) ?? 0n) < tx.amount + tx.fee)
|
|
156
|
+
continue;
|
|
157
|
+
this.#apply(tx, balances, nonces);
|
|
158
|
+
included.push(tx);
|
|
159
|
+
progressed = true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const hash = (0, json_1.sha256Hex)(`${height}:${parent.hash}:${included.map((t) => t.id).join(',')}:${this.#salt}`);
|
|
163
|
+
this.#blocks.push({
|
|
164
|
+
height,
|
|
165
|
+
hash,
|
|
166
|
+
parentHash: parent.hash,
|
|
167
|
+
timestamp: this.#clock.now(),
|
|
168
|
+
txs: included,
|
|
169
|
+
});
|
|
170
|
+
for (const tx of included)
|
|
171
|
+
this.#mempool.delete(tx.id);
|
|
172
|
+
for (const tx of [...this.#mempool.values()]) {
|
|
173
|
+
const stale = this.ordering === 'expiry'
|
|
174
|
+
? (tx.lastValidHeight ?? -1n) <= height
|
|
175
|
+
: (tx.nonce ?? -1n) < (nonces.get(tx.from) ?? 0n);
|
|
176
|
+
if (stale)
|
|
177
|
+
this.#mempool.delete(tx.id);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Replaces the last `depth` blocks with `depth + 1` new ones; dropped txs do not return.
|
|
183
|
+
* `options.force` bypasses the finalized-height guard; it exists only to simulate an
|
|
184
|
+
* adversarial "chain lied about finality" scenario and is never needed for an honest reorg.
|
|
185
|
+
*/
|
|
186
|
+
reorg(depth, options = {}) {
|
|
187
|
+
if (depth < 1)
|
|
188
|
+
throw new Error('reorg depth must be >= 1');
|
|
189
|
+
const keep = this.head - BigInt(depth);
|
|
190
|
+
if (keep < 0n)
|
|
191
|
+
throw new Error('cannot reorg past genesis');
|
|
192
|
+
if (keep < this.finalizedHeight() && !options.force) {
|
|
193
|
+
throw new Error('cannot reorg below the finalized height');
|
|
194
|
+
}
|
|
195
|
+
const removed = this.#blocks.splice(Number(keep) + 1);
|
|
196
|
+
this.#salt += 1;
|
|
197
|
+
for (const block of removed) {
|
|
198
|
+
for (const tx of block.txs)
|
|
199
|
+
if (!options.drop?.includes(tx.id))
|
|
200
|
+
this.#mempool.set(tx.id, tx);
|
|
201
|
+
}
|
|
202
|
+
this.mine(depth + 1);
|
|
203
|
+
}
|
|
204
|
+
endpoint(name, options = {}) {
|
|
205
|
+
this.#endpoints.set(name, { lag: 0, seesMempool: true, ...options });
|
|
206
|
+
return `https://${HOST}/${name}`;
|
|
207
|
+
}
|
|
208
|
+
configureEndpoint(name, patch) {
|
|
209
|
+
const current = this.#endpoints.get(name);
|
|
210
|
+
if (!current)
|
|
211
|
+
throw new Error(`unknown endpoint ${name}`);
|
|
212
|
+
Object.assign(current, patch);
|
|
213
|
+
}
|
|
214
|
+
fetch = (async (input, init) => {
|
|
215
|
+
const url = new URL(typeof input === 'string' ? input : input instanceof URL ? input.href : input.url);
|
|
216
|
+
const name = url.pathname.split('/').filter(Boolean)[0] ?? '';
|
|
217
|
+
const endpoint = this.#endpoints.get(name);
|
|
218
|
+
if (url.host !== HOST || !endpoint) {
|
|
219
|
+
throw new TypeError('fetch failed', {
|
|
220
|
+
cause: new Error(`getaddrinfo ENOTFOUND ${url.host}`),
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
const signal = init?.signal ?? undefined;
|
|
224
|
+
if (signal?.aborted)
|
|
225
|
+
throw signal.reason;
|
|
226
|
+
if (endpoint.down)
|
|
227
|
+
return new Response('service unavailable', { status: 503 });
|
|
228
|
+
if (endpoint.html)
|
|
229
|
+
return new Response('<html>maintenance</html>', { status: 200 });
|
|
230
|
+
// `requestId` stays null until a well-formed request is parsed; -32700/-32600 replies echo
|
|
231
|
+
// null (their request never yielded a trustworthy id), everything else echoes the real id.
|
|
232
|
+
let requestId = null;
|
|
233
|
+
const reply = (payload) => new Response(JSON.stringify({ jsonrpc: '2.0', id: requestId, ...payload }), {
|
|
234
|
+
status: 200,
|
|
235
|
+
headers: { 'content-type': 'application/json' },
|
|
236
|
+
});
|
|
237
|
+
// Nothing below this point may reject the returned promise: every failure, including bugs in
|
|
238
|
+
// `#handle` or `#admit`, is reported as a JSON-RPC error reply or (last resort) an HTTP 500.
|
|
239
|
+
try {
|
|
240
|
+
let parsed;
|
|
241
|
+
try {
|
|
242
|
+
parsed = JSON.parse(typeof init?.body === 'string' ? init.body : 'null');
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
throw new RpcFailure('parse error', -32700);
|
|
246
|
+
}
|
|
247
|
+
if (parsed === null ||
|
|
248
|
+
typeof parsed !== 'object' ||
|
|
249
|
+
Array.isArray(parsed) ||
|
|
250
|
+
typeof parsed.method !== 'string' ||
|
|
251
|
+
!('id' in parsed)) {
|
|
252
|
+
throw new RpcFailure('invalid request', -32600);
|
|
253
|
+
}
|
|
254
|
+
const request = parsed;
|
|
255
|
+
requestId = request.id;
|
|
256
|
+
const result = this.#handle(endpoint, request.method, request.params ?? []);
|
|
257
|
+
if (request.method === 'fake_sendRawTransaction' && endpoint.acceptThenFail) {
|
|
258
|
+
endpoint.acceptThenFail = false;
|
|
259
|
+
return new Response('gateway timeout', { status: 504 });
|
|
260
|
+
}
|
|
261
|
+
return reply({ result });
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
if (error instanceof RpcFailure) {
|
|
265
|
+
return reply({ error: { code: error.code, message: error.message } });
|
|
266
|
+
}
|
|
267
|
+
return new Response('internal error', { status: 500 });
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
#tip() {
|
|
271
|
+
return this.#blocks[this.#blocks.length - 1];
|
|
272
|
+
}
|
|
273
|
+
#apply(tx, balances, nonces) {
|
|
274
|
+
const success = tx.to !== exports.REVERT_ADDRESS;
|
|
275
|
+
balances.set(tx.from, (balances.get(tx.from) ?? 0n) - tx.fee - (success ? tx.amount : 0n));
|
|
276
|
+
if (success)
|
|
277
|
+
balances.set(tx.to, (balances.get(tx.to) ?? 0n) + tx.amount);
|
|
278
|
+
if (this.ordering !== 'expiry')
|
|
279
|
+
nonces.set(tx.from, (nonces.get(tx.from) ?? 0n) + 1n);
|
|
280
|
+
return success;
|
|
281
|
+
}
|
|
282
|
+
#state(height) {
|
|
283
|
+
const balances = new Map(this.#funding);
|
|
284
|
+
const nonces = new Map();
|
|
285
|
+
const receipts = new Map();
|
|
286
|
+
for (const block of this.#blocks) {
|
|
287
|
+
if (block.height > height)
|
|
288
|
+
break;
|
|
289
|
+
for (const tx of block.txs) {
|
|
290
|
+
receipts.set(tx.id, {
|
|
291
|
+
success: this.#apply(tx, balances, nonces),
|
|
292
|
+
height: block.height,
|
|
293
|
+
hash: block.hash,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return { balances, nonces, receipts };
|
|
298
|
+
}
|
|
299
|
+
#admit(raw) {
|
|
300
|
+
const envelope = decodeEnvelope(raw);
|
|
301
|
+
if (!envelope)
|
|
302
|
+
throw new RpcFailure('malformed transaction');
|
|
303
|
+
const { tx } = envelope;
|
|
304
|
+
if (tx.chainId !== this.chainId)
|
|
305
|
+
throw new RpcFailure('invalid chain id');
|
|
306
|
+
let publicKey;
|
|
307
|
+
let signature;
|
|
308
|
+
try {
|
|
309
|
+
publicKey = (0, bytes_1.fromHex)(envelope.pub);
|
|
310
|
+
signature = (0, bytes_1.fromHex)(envelope.sig);
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
throw new RpcFailure('malformed transaction');
|
|
314
|
+
}
|
|
315
|
+
if (fakeAddress(publicKey) !== tx.from)
|
|
316
|
+
throw new RpcFailure('invalid sender');
|
|
317
|
+
if (!schemes_1.secp256k1Ecdsa.verify({
|
|
318
|
+
publicKey,
|
|
319
|
+
payload: fakeDigest(tx),
|
|
320
|
+
signature,
|
|
321
|
+
recovery: envelope.recovery,
|
|
322
|
+
})) {
|
|
323
|
+
throw new RpcFailure('invalid signature');
|
|
324
|
+
}
|
|
325
|
+
const id = fakeTxId(raw);
|
|
326
|
+
const state = this.#state(this.head);
|
|
327
|
+
if (state.receipts.has(id)) {
|
|
328
|
+
throw new RpcFailure(this.ordering === 'expiry' ? 'already processed' : 'nonce too low');
|
|
329
|
+
}
|
|
330
|
+
if (this.#mempool.has(id))
|
|
331
|
+
throw new RpcFailure('already known');
|
|
332
|
+
let entry;
|
|
333
|
+
try {
|
|
334
|
+
entry = {
|
|
335
|
+
id,
|
|
336
|
+
tx,
|
|
337
|
+
from: tx.from,
|
|
338
|
+
to: tx.to.toLowerCase(),
|
|
339
|
+
amount: BigInt(tx.amount),
|
|
340
|
+
fee: BigInt(tx.fee),
|
|
341
|
+
...(tx.nonce !== undefined ? { nonce: BigInt(tx.nonce) } : {}),
|
|
342
|
+
...(tx.lastValidHeight !== undefined
|
|
343
|
+
? { lastValidHeight: BigInt(tx.lastValidHeight) }
|
|
344
|
+
: {}),
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
throw new RpcFailure('malformed transaction');
|
|
349
|
+
}
|
|
350
|
+
if (entry.fee < this.minFee)
|
|
351
|
+
throw new RpcFailure('fee too low');
|
|
352
|
+
if (this.ordering === 'expiry') {
|
|
353
|
+
if (entry.lastValidHeight === undefined || entry.lastValidHeight <= this.head) {
|
|
354
|
+
throw new RpcFailure('transaction expired');
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
const expected = state.nonces.get(entry.from) ?? 0n;
|
|
359
|
+
if (entry.nonce === undefined || entry.nonce < expected)
|
|
360
|
+
throw new RpcFailure('nonce too low');
|
|
361
|
+
const sameSlot = [...this.#mempool.values()].find((t) => t.from === entry.from && t.nonce === entry.nonce);
|
|
362
|
+
if (this.ordering === 'seqno') {
|
|
363
|
+
if (entry.nonce !== expected || sameSlot)
|
|
364
|
+
throw new RpcFailure('seqno mismatch');
|
|
365
|
+
}
|
|
366
|
+
else if (sameSlot) {
|
|
367
|
+
if (entry.fee * 100n < sameSlot.fee * (100n + this.bumpPercent)) {
|
|
368
|
+
throw new RpcFailure('replacement transaction underpriced');
|
|
369
|
+
}
|
|
370
|
+
this.#mempool.delete(sameSlot.id);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if ((state.balances.get(entry.from) ?? 0n) < entry.amount + entry.fee) {
|
|
374
|
+
throw new RpcFailure('insufficient funds');
|
|
375
|
+
}
|
|
376
|
+
this.#mempool.set(id, entry);
|
|
377
|
+
return id;
|
|
378
|
+
}
|
|
379
|
+
#findMined(id) {
|
|
380
|
+
for (const block of this.#blocks)
|
|
381
|
+
for (const tx of block.txs)
|
|
382
|
+
if (tx.id === id)
|
|
383
|
+
return { tx, block };
|
|
384
|
+
return undefined;
|
|
385
|
+
}
|
|
386
|
+
#wire(tx, block) {
|
|
387
|
+
return {
|
|
388
|
+
id: tx.id,
|
|
389
|
+
from: tx.from,
|
|
390
|
+
to: tx.to,
|
|
391
|
+
amount: tx.amount.toString(),
|
|
392
|
+
fee: tx.fee.toString(),
|
|
393
|
+
...(tx.nonce !== undefined ? { nonce: tx.nonce.toString() } : {}),
|
|
394
|
+
...(tx.tx.memo !== undefined ? { memo: tx.tx.memo } : {}),
|
|
395
|
+
...(block
|
|
396
|
+
? {
|
|
397
|
+
blockHeight: block.height.toString(),
|
|
398
|
+
blockHash: block.hash,
|
|
399
|
+
success: tx.to !== exports.REVERT_ADDRESS,
|
|
400
|
+
}
|
|
401
|
+
: { pending: true }),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
#wireTx(id, height, includeMempool) {
|
|
405
|
+
const mined = this.#findMined(id);
|
|
406
|
+
if (mined && mined.block.height <= height)
|
|
407
|
+
return this.#wire(mined.tx, mined.block);
|
|
408
|
+
const pending = includeMempool ? this.#mempool.get(id) : undefined;
|
|
409
|
+
return pending ? this.#wire(pending) : null;
|
|
410
|
+
}
|
|
411
|
+
#wireBlock(block, full) {
|
|
412
|
+
return {
|
|
413
|
+
height: block.height.toString(),
|
|
414
|
+
hash: block.hash,
|
|
415
|
+
parentHash: block.parentHash,
|
|
416
|
+
timestamp: block.timestamp,
|
|
417
|
+
txIds: block.txs.map((t) => t.id),
|
|
418
|
+
...(full ? { txs: block.txs.map((t) => this.#wire(t, block)) } : {}),
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
#handle(endpoint, method, params) {
|
|
422
|
+
const lagged = this.head - BigInt(endpoint.lag ?? 0);
|
|
423
|
+
const view = lagged > 0n ? lagged : 0n;
|
|
424
|
+
const finalizedRaw = view - BigInt(this.finalityDepth);
|
|
425
|
+
const finalized = finalizedRaw > 0n ? finalizedRaw : 0n;
|
|
426
|
+
const arg = (index) => String(params[index] ?? '');
|
|
427
|
+
const forkAbove = endpoint.forkAbove === undefined ? undefined : BigInt(endpoint.forkAbove);
|
|
428
|
+
const forked = (height) => forkAbove !== undefined && height > forkAbove;
|
|
429
|
+
const hashAt = (block) => forked(block.height)
|
|
430
|
+
? (0, json_1.sha256Hex)(`fork:${forkAbove}:${block.height}:${this.chainId}`)
|
|
431
|
+
: block.hash;
|
|
432
|
+
switch (method) {
|
|
433
|
+
case 'fake_identity':
|
|
434
|
+
return endpoint.identity ?? this.chainId;
|
|
435
|
+
case 'fake_blockNumber':
|
|
436
|
+
return view.toString();
|
|
437
|
+
case 'fake_feeRate':
|
|
438
|
+
return this.minFee.toString();
|
|
439
|
+
case 'fake_finalizedBlock': {
|
|
440
|
+
const block = this.#blocks[Number(finalized)];
|
|
441
|
+
return {
|
|
442
|
+
height: finalized.toString(),
|
|
443
|
+
hash: endpoint.forkFinalized ? 'f'.repeat(64) : block.hash,
|
|
444
|
+
timestamp: block.timestamp,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
case 'fake_getBlock': {
|
|
448
|
+
const ref = arg(0);
|
|
449
|
+
let block;
|
|
450
|
+
if (/^[0-9a-f]{64}$/.test(ref)) {
|
|
451
|
+
block = this.#blocks.find((b) => b.hash === ref && !forked(b.height));
|
|
452
|
+
}
|
|
453
|
+
else if (ref === 'latest') {
|
|
454
|
+
block = this.#blocks[Number(view)];
|
|
455
|
+
}
|
|
456
|
+
else if (ref === 'finalized') {
|
|
457
|
+
block = this.#blocks[Number(finalized)];
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
let refHeight;
|
|
461
|
+
try {
|
|
462
|
+
refHeight = BigInt(ref);
|
|
463
|
+
}
|
|
464
|
+
catch {
|
|
465
|
+
throw new RpcFailure('invalid params: fake_getBlock ref', -32602);
|
|
466
|
+
}
|
|
467
|
+
block = this.#blocks[Number(refHeight)];
|
|
468
|
+
}
|
|
469
|
+
if (!block || block.height > view)
|
|
470
|
+
return null;
|
|
471
|
+
if (!forked(block.height))
|
|
472
|
+
return this.#wireBlock(block, params[1] === true);
|
|
473
|
+
return {
|
|
474
|
+
height: block.height.toString(),
|
|
475
|
+
hash: hashAt(block),
|
|
476
|
+
parentHash: hashAt(this.#blocks[Number(block.height - 1n)]),
|
|
477
|
+
timestamp: block.timestamp,
|
|
478
|
+
txIds: [],
|
|
479
|
+
...(params[1] === true ? { txs: [] } : {}),
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
case 'fake_getBlockHash': {
|
|
483
|
+
let height;
|
|
484
|
+
try {
|
|
485
|
+
height = BigInt(arg(0));
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
throw new RpcFailure('invalid params: fake_getBlockHash height', -32602);
|
|
489
|
+
}
|
|
490
|
+
const limit = arg(1) === 'finalized' ? finalized : view;
|
|
491
|
+
const block = height >= 0n && height <= limit ? this.#blocks[Number(height)] : null;
|
|
492
|
+
return block ? hashAt(block) : null;
|
|
493
|
+
}
|
|
494
|
+
case 'fake_getBalance': {
|
|
495
|
+
const height = arg(1) === 'finalized' ? finalized : view;
|
|
496
|
+
return (this.#state(height).balances.get(arg(0).toLowerCase()) ?? 0n).toString();
|
|
497
|
+
}
|
|
498
|
+
case 'fake_getNonce': {
|
|
499
|
+
const address = arg(0).toLowerCase();
|
|
500
|
+
const level = arg(1);
|
|
501
|
+
let next = this.#state(level === 'finalized' ? finalized : view).nonces.get(address) ?? 0n;
|
|
502
|
+
if (level === 'pending' && endpoint.seesMempool !== false) {
|
|
503
|
+
const queued = new Set([...this.#mempool.values()]
|
|
504
|
+
.filter((t) => t.from === address)
|
|
505
|
+
.map((t) => t.nonce));
|
|
506
|
+
while (queued.has(next))
|
|
507
|
+
next += 1n;
|
|
508
|
+
}
|
|
509
|
+
return next.toString();
|
|
510
|
+
}
|
|
511
|
+
case 'fake_sendRawTransaction': {
|
|
512
|
+
const raw = arg(0);
|
|
513
|
+
const id = fakeTxId(raw);
|
|
514
|
+
this.#sends.set(id, (this.#sends.get(id) ?? 0) + 1);
|
|
515
|
+
if (endpoint.refuseNext) {
|
|
516
|
+
const message = endpoint.refuseNext;
|
|
517
|
+
endpoint.refuseNext = undefined;
|
|
518
|
+
throw new RpcFailure(message);
|
|
519
|
+
}
|
|
520
|
+
return this.#admit(raw);
|
|
521
|
+
}
|
|
522
|
+
case 'fake_getTransaction': {
|
|
523
|
+
const wire = this.#wireTx(arg(0), view, endpoint.seesMempool !== false);
|
|
524
|
+
return wire?.blockHeight !== undefined && forked(BigInt(wire.blockHeight))
|
|
525
|
+
? null
|
|
526
|
+
: wire;
|
|
527
|
+
}
|
|
528
|
+
case 'fake_getFinalizedTransaction':
|
|
529
|
+
return endpoint.forkFinalized ? null : this.#wireTx(arg(0), finalized, false);
|
|
530
|
+
default:
|
|
531
|
+
throw new RpcFailure(`method not found: ${method}`, -32601);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
exports.FakeChain = FakeChain;
|
|
536
|
+
//# sourceMappingURL=fake-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-chain.js","sourceRoot":"","sources":["../../src/testing/fake-chain.ts"],"names":[],"mappings":"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","sourcesContent":["import { secp256k1 } from '@noble/curves/secp256k1';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { secp256k1Ecdsa } from '../core/registry/schemes';\nimport { fromHex, toHex, utf8ToBytes } from '../core/util/bytes';\nimport { systemClock, type Clock } from '../core/util/clock';\nimport { canonicalJson, sha256Hex } from '../core/util/json';\n\nexport type FakeOrdering = 'nonce' | 'seqno' | 'expiry';\n\n/** Unsigned fake transaction; numbers travel as decimal strings. */\nexport interface FakeUnsigned {\n readonly chainId: string;\n readonly from: string;\n readonly to: string;\n readonly amount: string;\n readonly fee: string;\n readonly nonce?: string;\n readonly lastValidHeight?: string;\n readonly memo?: string;\n}\n\nexport interface FakeEnvelope {\n readonly tx: FakeUnsigned;\n readonly sig: string;\n readonly recovery: number;\n readonly pub: string;\n}\n\nexport interface FakeWireTx {\n readonly id: string;\n readonly from: string;\n readonly to: string;\n readonly amount: string;\n readonly fee: string;\n readonly nonce?: string;\n readonly memo?: string;\n readonly blockHeight?: string;\n readonly blockHash?: string;\n readonly success?: boolean;\n readonly pending?: boolean;\n}\n\nexport interface FakeWireBlock {\n readonly height: string;\n readonly hash: string;\n readonly parentHash: string;\n readonly timestamp: number;\n readonly txIds: readonly string[];\n readonly txs?: readonly FakeWireTx[];\n}\n\nexport interface FakeEndpointOptions {\n lag?: number;\n identity?: string;\n seesMempool?: boolean;\n down?: boolean;\n html?: boolean;\n acceptThenFail?: boolean;\n refuseNext?: string;\n forkFinalized?: boolean;\n /**\n * A single endpoint lying about blocks: above this height its block reads\n * (`fake_getBlock`, `fake_getBlockHash`) serve a private fork, with other hashes and none\n * of the chain's transactions, and `fake_getTransaction` does not see transactions mined\n * there. Heights, nonces, balances and finality stay honest.\n */\n forkAbove?: number;\n}\n\nexport interface FakeChainOptions {\n readonly ordering?: FakeOrdering;\n readonly chainId?: string;\n readonly finalityDepth?: number;\n readonly minFee?: bigint;\n readonly replacementBumpPercent?: number;\n readonly clock?: Clock;\n}\n\nexport const REVERT_ADDRESS = `fk1${'dead'.repeat(10)}`;\nconst HOST = 'fake-chain.test';\n\nexport function fakeAddress(publicKey: Uint8Array): string {\n return `fk1${sha256Hex(publicKey).slice(0, 40)}`;\n}\n\nexport function isFakeAddress(value: string): boolean {\n return /^fk1[0-9a-f]{40}$/i.test(value);\n}\n\nexport function fakeDigest(tx: FakeUnsigned): Uint8Array {\n return sha256(utf8ToBytes(canonicalJson(tx)));\n}\n\nexport function encodeEnvelope(envelope: FakeEnvelope): string {\n return Buffer.from(JSON.stringify(envelope), 'utf8').toString('base64');\n}\n\nexport function decodeEnvelope(raw: string): FakeEnvelope | undefined {\n try {\n const value = JSON.parse(\n Buffer.from(raw, 'base64').toString('utf8'),\n ) as FakeEnvelope | null;\n return value && typeof value === 'object' && value.tx && typeof value.tx === 'object'\n ? value\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function fakeTxId(raw: string): string {\n return sha256Hex(raw);\n}\n\n/** Signs outside the library (for tests that craft conflicting transactions). */\nexport function signFake(tx: FakeUnsigned, privateKey: Uint8Array): string {\n const signature = secp256k1.sign(fakeDigest(tx), privateKey, { lowS: true });\n return encodeEnvelope({\n tx,\n sig: toHex(signature.toCompactRawBytes()),\n recovery: signature.recovery,\n pub: toHex(secp256k1.getPublicKey(privateKey, true)),\n });\n}\n\ninterface ChainTx {\n readonly id: string;\n readonly tx: FakeUnsigned;\n readonly from: string;\n readonly to: string;\n readonly amount: bigint;\n readonly fee: bigint;\n readonly nonce?: bigint;\n readonly lastValidHeight?: bigint;\n}\n\ninterface FakeBlock {\n readonly height: bigint;\n readonly hash: string;\n readonly parentHash: string;\n readonly timestamp: number;\n readonly txs: readonly ChainTx[];\n}\n\nexport interface FakeReceipt {\n readonly success: boolean;\n readonly height: bigint;\n readonly hash: string;\n}\n\ninterface ChainState {\n readonly balances: Map<string, bigint>;\n readonly nonces: Map<string, bigint>;\n readonly receipts: Map<string, FakeReceipt>;\n}\n\n/** A node-style JSON-RPC rejection. `code` defaults to -32000 (application error); framework-level\n * failures (parse error, invalid request, method not found, invalid params) use their standard\n * JSON-RPC codes so callers can distinguish \"malformed request\" from \"the node said no\". */\nclass RpcFailure extends Error {\n readonly code: number;\n\n constructor(message: string, code = -32000) {\n super(message);\n this.code = code;\n }\n}\n\nexport class FakeChain {\n readonly ordering: FakeOrdering;\n readonly chainId: string;\n readonly finalityDepth: number;\n readonly minFee: bigint;\n readonly bumpPercent: bigint;\n readonly #clock: Clock;\n readonly #blocks: FakeBlock[] = [];\n readonly #mempool = new Map<string, ChainTx>();\n readonly #funding = new Map<string, bigint>();\n readonly #endpoints = new Map<string, FakeEndpointOptions>();\n readonly #sends = new Map<string, number>();\n #salt = 0;\n\n constructor(options: FakeChainOptions = {}) {\n this.ordering = options.ordering ?? 'nonce';\n this.chainId = options.chainId ?? 'fake-local';\n this.finalityDepth = options.finalityDepth ?? 3;\n this.minFee = options.minFee ?? 1n;\n this.bumpPercent = BigInt(options.replacementBumpPercent ?? 10);\n this.#clock = options.clock ?? systemClock;\n this.#blocks.push({\n height: 0n,\n hash: sha256Hex(`genesis:${this.chainId}`),\n parentHash: '0'.repeat(64),\n timestamp: this.#clock.now(),\n txs: [],\n });\n }\n\n get head(): bigint {\n return this.#tip().height;\n }\n\n finalizedHeight(): bigint {\n const height = this.head - BigInt(this.finalityDepth);\n return height > 0n ? height : 0n;\n }\n\n block(\n height: bigint,\n ): { height: bigint; hash: string; parentHash: string; txIds: string[] } | undefined {\n const block = this.#blocks[Number(height)];\n return (\n block && {\n height: block.height,\n hash: block.hash,\n parentHash: block.parentHash,\n txIds: block.txs.map((t) => t.id),\n }\n );\n }\n\n fund(address: string, amount: bigint): void {\n const key = address.toLowerCase();\n this.#funding.set(key, (this.#funding.get(key) ?? 0n) + amount);\n }\n\n balance(address: string, height: bigint = this.head): bigint {\n return this.#state(height).balances.get(address.toLowerCase()) ?? 0n;\n }\n\n nonce(address: string, height: bigint = this.head): bigint {\n return this.#state(height).nonces.get(address.toLowerCase()) ?? 0n;\n }\n\n receipt(id: string, height: bigint = this.head): FakeReceipt | undefined {\n return this.#state(height).receipts.get(id);\n }\n\n inMempool(id: string): boolean {\n return this.#mempool.has(id);\n }\n\n sendCount(id: string): number {\n return this.#sends.get(id) ?? 0;\n }\n\n dropFromMempool(id: string): void {\n this.#mempool.delete(id);\n }\n\n /** Admits a raw transaction directly (bypassing endpoints). Throws the node's error message. */\n submit(raw: string): string {\n return this.#admit(raw);\n }\n\n mine(count = 1): void {\n for (let i = 0; i < count; i++) {\n const parent = this.#tip();\n const height = parent.height + 1n;\n const { balances, nonces } = this.#state(parent.height);\n const included: ChainTx[] = [];\n const candidates = [...this.#mempool.values()];\n let progressed = true;\n while (progressed) {\n progressed = false;\n for (const tx of candidates) {\n if (included.includes(tx)) continue;\n if (this.ordering === 'expiry') {\n if ((tx.lastValidHeight ?? -1n) < height) continue;\n } else if (tx.nonce !== (nonces.get(tx.from) ?? 0n)) {\n continue;\n }\n if ((balances.get(tx.from) ?? 0n) < tx.amount + tx.fee) continue;\n this.#apply(tx, balances, nonces);\n included.push(tx);\n progressed = true;\n }\n }\n const hash = sha256Hex(\n `${height}:${parent.hash}:${included.map((t) => t.id).join(',')}:${this.#salt}`,\n );\n this.#blocks.push({\n height,\n hash,\n parentHash: parent.hash,\n timestamp: this.#clock.now(),\n txs: included,\n });\n for (const tx of included) this.#mempool.delete(tx.id);\n for (const tx of [...this.#mempool.values()]) {\n const stale =\n this.ordering === 'expiry'\n ? (tx.lastValidHeight ?? -1n) <= height\n : (tx.nonce ?? -1n) < (nonces.get(tx.from) ?? 0n);\n if (stale) this.#mempool.delete(tx.id);\n }\n }\n }\n\n /**\n * Replaces the last `depth` blocks with `depth + 1` new ones; dropped txs do not return.\n * `options.force` bypasses the finalized-height guard; it exists only to simulate an\n * adversarial \"chain lied about finality\" scenario and is never needed for an honest reorg.\n */\n reorg(\n depth: number,\n options: { readonly drop?: readonly string[]; readonly force?: boolean } = {},\n ): void {\n if (depth < 1) throw new Error('reorg depth must be >= 1');\n const keep = this.head - BigInt(depth);\n if (keep < 0n) throw new Error('cannot reorg past genesis');\n if (keep < this.finalizedHeight() && !options.force) {\n throw new Error('cannot reorg below the finalized height');\n }\n const removed = this.#blocks.splice(Number(keep) + 1);\n this.#salt += 1;\n for (const block of removed) {\n for (const tx of block.txs)\n if (!options.drop?.includes(tx.id)) this.#mempool.set(tx.id, tx);\n }\n this.mine(depth + 1);\n }\n\n endpoint(name: string, options: FakeEndpointOptions = {}): string {\n this.#endpoints.set(name, { lag: 0, seesMempool: true, ...options });\n return `https://${HOST}/${name}`;\n }\n\n configureEndpoint(name: string, patch: FakeEndpointOptions): void {\n const current = this.#endpoints.get(name);\n if (!current) throw new Error(`unknown endpoint ${name}`);\n Object.assign(current, patch);\n }\n\n readonly fetch = (async (\n input: string | URL | Request,\n init?: RequestInit,\n ): Promise<Response> => {\n const url = new URL(\n typeof input === 'string' ? input : input instanceof URL ? input.href : input.url,\n );\n const name = url.pathname.split('/').filter(Boolean)[0] ?? '';\n const endpoint = this.#endpoints.get(name);\n if (url.host !== HOST || !endpoint) {\n throw new TypeError('fetch failed', {\n cause: new Error(`getaddrinfo ENOTFOUND ${url.host}`),\n });\n }\n const signal = init?.signal ?? undefined;\n if (signal?.aborted) throw signal.reason;\n if (endpoint.down) return new Response('service unavailable', { status: 503 });\n if (endpoint.html) return new Response('<html>maintenance</html>', { status: 200 });\n // `requestId` stays null until a well-formed request is parsed; -32700/-32600 replies echo\n // null (their request never yielded a trustworthy id), everything else echoes the real id.\n let requestId: unknown = null;\n const reply = (payload: object) =>\n new Response(JSON.stringify({ jsonrpc: '2.0', id: requestId, ...payload }), {\n status: 200,\n headers: { 'content-type': 'application/json' },\n });\n // Nothing below this point may reject the returned promise: every failure, including bugs in\n // `#handle` or `#admit`, is reported as a JSON-RPC error reply or (last resort) an HTTP 500.\n try {\n let parsed: unknown;\n try {\n parsed = JSON.parse(typeof init?.body === 'string' ? init.body : 'null');\n } catch {\n throw new RpcFailure('parse error', -32700);\n }\n if (\n parsed === null ||\n typeof parsed !== 'object' ||\n Array.isArray(parsed) ||\n typeof (parsed as { method?: unknown }).method !== 'string' ||\n !('id' in parsed)\n ) {\n throw new RpcFailure('invalid request', -32600);\n }\n const request = parsed as { id: unknown; method: string; params?: unknown[] };\n requestId = request.id;\n const result = this.#handle(endpoint, request.method, request.params ?? []);\n if (request.method === 'fake_sendRawTransaction' && endpoint.acceptThenFail) {\n endpoint.acceptThenFail = false;\n return new Response('gateway timeout', { status: 504 });\n }\n return reply({ result });\n } catch (error) {\n if (error instanceof RpcFailure) {\n return reply({ error: { code: error.code, message: error.message } });\n }\n return new Response('internal error', { status: 500 });\n }\n }) as typeof fetch;\n\n #tip(): FakeBlock {\n return this.#blocks[this.#blocks.length - 1] as FakeBlock;\n }\n\n #apply(\n tx: ChainTx,\n balances: Map<string, bigint>,\n nonces: Map<string, bigint>,\n ): boolean {\n const success = tx.to !== REVERT_ADDRESS;\n balances.set(\n tx.from,\n (balances.get(tx.from) ?? 0n) - tx.fee - (success ? tx.amount : 0n),\n );\n if (success) balances.set(tx.to, (balances.get(tx.to) ?? 0n) + tx.amount);\n if (this.ordering !== 'expiry') nonces.set(tx.from, (nonces.get(tx.from) ?? 0n) + 1n);\n return success;\n }\n\n #state(height: bigint): ChainState {\n const balances = new Map(this.#funding);\n const nonces = new Map<string, bigint>();\n const receipts = new Map<string, FakeReceipt>();\n for (const block of this.#blocks) {\n if (block.height > height) break;\n for (const tx of block.txs) {\n receipts.set(tx.id, {\n success: this.#apply(tx, balances, nonces),\n height: block.height,\n hash: block.hash,\n });\n }\n }\n return { balances, nonces, receipts };\n }\n\n #admit(raw: string): string {\n const envelope = decodeEnvelope(raw);\n if (!envelope) throw new RpcFailure('malformed transaction');\n const { tx } = envelope;\n if (tx.chainId !== this.chainId) throw new RpcFailure('invalid chain id');\n let publicKey: Uint8Array;\n let signature: Uint8Array;\n try {\n publicKey = fromHex(envelope.pub);\n signature = fromHex(envelope.sig);\n } catch {\n throw new RpcFailure('malformed transaction');\n }\n if (fakeAddress(publicKey) !== tx.from) throw new RpcFailure('invalid sender');\n if (\n !secp256k1Ecdsa.verify({\n publicKey,\n payload: fakeDigest(tx),\n signature,\n recovery: envelope.recovery,\n })\n ) {\n throw new RpcFailure('invalid signature');\n }\n const id = fakeTxId(raw);\n const state = this.#state(this.head);\n if (state.receipts.has(id)) {\n throw new RpcFailure(\n this.ordering === 'expiry' ? 'already processed' : 'nonce too low',\n );\n }\n if (this.#mempool.has(id)) throw new RpcFailure('already known');\n let entry: ChainTx;\n try {\n entry = {\n id,\n tx,\n from: tx.from,\n to: tx.to.toLowerCase(),\n amount: BigInt(tx.amount),\n fee: BigInt(tx.fee),\n ...(tx.nonce !== undefined ? { nonce: BigInt(tx.nonce) } : {}),\n ...(tx.lastValidHeight !== undefined\n ? { lastValidHeight: BigInt(tx.lastValidHeight) }\n : {}),\n };\n } catch {\n throw new RpcFailure('malformed transaction');\n }\n if (entry.fee < this.minFee) throw new RpcFailure('fee too low');\n if (this.ordering === 'expiry') {\n if (entry.lastValidHeight === undefined || entry.lastValidHeight <= this.head) {\n throw new RpcFailure('transaction expired');\n }\n } else {\n const expected = state.nonces.get(entry.from) ?? 0n;\n if (entry.nonce === undefined || entry.nonce < expected)\n throw new RpcFailure('nonce too low');\n const sameSlot = [...this.#mempool.values()].find(\n (t) => t.from === entry.from && t.nonce === entry.nonce,\n );\n if (this.ordering === 'seqno') {\n if (entry.nonce !== expected || sameSlot) throw new RpcFailure('seqno mismatch');\n } else if (sameSlot) {\n if (entry.fee * 100n < sameSlot.fee * (100n + this.bumpPercent)) {\n throw new RpcFailure('replacement transaction underpriced');\n }\n this.#mempool.delete(sameSlot.id);\n }\n }\n if ((state.balances.get(entry.from) ?? 0n) < entry.amount + entry.fee) {\n throw new RpcFailure('insufficient funds');\n }\n this.#mempool.set(id, entry);\n return id;\n }\n\n #findMined(id: string): { tx: ChainTx; block: FakeBlock } | undefined {\n for (const block of this.#blocks)\n for (const tx of block.txs) if (tx.id === id) return { tx, block };\n return undefined;\n }\n\n #wire(tx: ChainTx, block?: FakeBlock): FakeWireTx {\n return {\n id: tx.id,\n from: tx.from,\n to: tx.to,\n amount: tx.amount.toString(),\n fee: tx.fee.toString(),\n ...(tx.nonce !== undefined ? { nonce: tx.nonce.toString() } : {}),\n ...(tx.tx.memo !== undefined ? { memo: tx.tx.memo } : {}),\n ...(block\n ? {\n blockHeight: block.height.toString(),\n blockHash: block.hash,\n success: tx.to !== REVERT_ADDRESS,\n }\n : { pending: true }),\n };\n }\n\n #wireTx(id: string, height: bigint, includeMempool: boolean): FakeWireTx | null {\n const mined = this.#findMined(id);\n if (mined && mined.block.height <= height) return this.#wire(mined.tx, mined.block);\n const pending = includeMempool ? this.#mempool.get(id) : undefined;\n return pending ? this.#wire(pending) : null;\n }\n\n #wireBlock(block: FakeBlock, full: boolean): FakeWireBlock {\n return {\n height: block.height.toString(),\n hash: block.hash,\n parentHash: block.parentHash,\n timestamp: block.timestamp,\n txIds: block.txs.map((t) => t.id),\n ...(full ? { txs: block.txs.map((t) => this.#wire(t, block)) } : {}),\n };\n }\n\n #handle(\n endpoint: FakeEndpointOptions,\n method: string,\n params: readonly unknown[],\n ): unknown {\n const lagged = this.head - BigInt(endpoint.lag ?? 0);\n const view = lagged > 0n ? lagged : 0n;\n const finalizedRaw = view - BigInt(this.finalityDepth);\n const finalized = finalizedRaw > 0n ? finalizedRaw : 0n;\n const arg = (index: number): string => String(params[index] ?? '');\n const forkAbove =\n endpoint.forkAbove === undefined ? undefined : BigInt(endpoint.forkAbove);\n const forked = (height: bigint) => forkAbove !== undefined && height > forkAbove;\n const hashAt = (block: FakeBlock): string =>\n forked(block.height)\n ? sha256Hex(`fork:${forkAbove}:${block.height}:${this.chainId}`)\n : block.hash;\n switch (method) {\n case 'fake_identity':\n return endpoint.identity ?? this.chainId;\n case 'fake_blockNumber':\n return view.toString();\n case 'fake_feeRate':\n return this.minFee.toString();\n case 'fake_finalizedBlock': {\n const block = this.#blocks[Number(finalized)] as FakeBlock;\n return {\n height: finalized.toString(),\n hash: endpoint.forkFinalized ? 'f'.repeat(64) : block.hash,\n timestamp: block.timestamp,\n };\n }\n case 'fake_getBlock': {\n const ref = arg(0);\n let block: FakeBlock | undefined;\n if (/^[0-9a-f]{64}$/.test(ref)) {\n block = this.#blocks.find((b) => b.hash === ref && !forked(b.height));\n } else if (ref === 'latest') {\n block = this.#blocks[Number(view)];\n } else if (ref === 'finalized') {\n block = this.#blocks[Number(finalized)];\n } else {\n let refHeight: bigint;\n try {\n refHeight = BigInt(ref);\n } catch {\n throw new RpcFailure('invalid params: fake_getBlock ref', -32602);\n }\n block = this.#blocks[Number(refHeight)];\n }\n if (!block || block.height > view) return null;\n if (!forked(block.height)) return this.#wireBlock(block, params[1] === true);\n return {\n height: block.height.toString(),\n hash: hashAt(block),\n parentHash: hashAt(this.#blocks[Number(block.height - 1n)] as FakeBlock),\n timestamp: block.timestamp,\n txIds: [],\n ...(params[1] === true ? { txs: [] } : {}),\n };\n }\n case 'fake_getBlockHash': {\n let height: bigint;\n try {\n height = BigInt(arg(0));\n } catch {\n throw new RpcFailure('invalid params: fake_getBlockHash height', -32602);\n }\n const limit = arg(1) === 'finalized' ? finalized : view;\n const block =\n height >= 0n && height <= limit ? this.#blocks[Number(height)] : null;\n return block ? hashAt(block) : null;\n }\n case 'fake_getBalance': {\n const height = arg(1) === 'finalized' ? finalized : view;\n return (this.#state(height).balances.get(arg(0).toLowerCase()) ?? 0n).toString();\n }\n case 'fake_getNonce': {\n const address = arg(0).toLowerCase();\n const level = arg(1);\n let next =\n this.#state(level === 'finalized' ? finalized : view).nonces.get(address) ?? 0n;\n if (level === 'pending' && endpoint.seesMempool !== false) {\n const queued = new Set(\n [...this.#mempool.values()]\n .filter((t) => t.from === address)\n .map((t) => t.nonce),\n );\n while (queued.has(next)) next += 1n;\n }\n return next.toString();\n }\n case 'fake_sendRawTransaction': {\n const raw = arg(0);\n const id = fakeTxId(raw);\n this.#sends.set(id, (this.#sends.get(id) ?? 0) + 1);\n if (endpoint.refuseNext) {\n const message = endpoint.refuseNext;\n endpoint.refuseNext = undefined;\n throw new RpcFailure(message);\n }\n return this.#admit(raw);\n }\n case 'fake_getTransaction': {\n const wire = this.#wireTx(arg(0), view, endpoint.seesMempool !== false);\n return wire?.blockHeight !== undefined && forked(BigInt(wire.blockHeight))\n ? null\n : wire;\n }\n case 'fake_getFinalizedTransaction':\n return endpoint.forkFinalized ? null : this.#wireTx(arg(0), finalized, false);\n default:\n throw new RpcFailure(`method not found: ${method}`, -32601);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Clock } from '../core/util/clock';
|
|
2
|
+
/** Lets pending promise chains and I/O callbacks run. */
|
|
3
|
+
export declare function settle(rounds?: number): Promise<void>;
|
|
4
|
+
/** Deterministic clock for tests: time moves only when `advance` is called. */
|
|
5
|
+
export declare class FakeClock implements Clock {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(start?: number);
|
|
8
|
+
now(): number;
|
|
9
|
+
get pending(): number;
|
|
10
|
+
sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
11
|
+
/** Moves time forward, waking due sleepers in order and settling async work between them. */
|
|
12
|
+
advance(ms: number): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Advances `clock` in steps until `promise` settles, then returns its value or rethrows. */
|
|
15
|
+
export declare function drive<T>(clock: FakeClock, promise: Promise<T>, stepMs?: number, maxSteps?: number): Promise<T>;
|