crypto-aio 0.1.0 → 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 +151 -1
- package/README.md +32 -12
- package/dist/adapters/evm/builder.js +64 -4
- package/dist/adapters/evm/builder.js.map +1 -1
- package/dist/adapters/evm/decode.js +6 -1
- package/dist/adapters/evm/decode.js.map +1 -1
- package/dist/adapters/evm/ethers-client.js +4 -0
- package/dist/adapters/evm/ethers-client.js.map +1 -1
- package/dist/adapters/evm/fees.d.ts +24 -0
- package/dist/adapters/evm/fees.js +47 -4
- package/dist/adapters/evm/fees.js.map +1 -1
- package/dist/adapters/evm/index.d.ts +1 -1
- package/dist/adapters/evm/index.js +2 -1
- package/dist/adapters/evm/index.js.map +1 -1
- package/dist/adapters/evm/network.d.ts +5 -0
- package/dist/adapters/evm/network.js +21 -2
- package/dist/adapters/evm/network.js.map +1 -1
- package/dist/adapters/evm/plugin.d.ts +5 -6
- package/dist/adapters/evm/plugin.js +50 -2
- package/dist/adapters/evm/plugin.js.map +1 -1
- package/dist/adapters/evm/proofs.js +17 -5
- package/dist/adapters/evm/proofs.js.map +1 -1
- package/dist/adapters/evm/reader.d.ts +18 -0
- package/dist/adapters/evm/reader.js +34 -0
- package/dist/adapters/evm/reader.js.map +1 -1
- package/dist/adapters/evm/tokens.d.ts +3 -0
- package/dist/adapters/evm/tokens.js.map +1 -1
- package/dist/adapters/evm/types.d.ts +10 -0
- package/dist/adapters/evm/types.js.map +1 -1
- package/dist/adapters/evm/web3-client.d.ts +6 -3
- package/dist/adapters/evm/web3-client.js +19 -2
- package/dist/adapters/evm/web3-client.js.map +1 -1
- package/dist/adapters/solana/builder.js +29 -18
- package/dist/adapters/solana/builder.js.map +1 -1
- package/dist/adapters/solana/fees.d.ts +12 -3
- package/dist/adapters/solana/fees.js +13 -4
- package/dist/adapters/solana/fees.js.map +1 -1
- 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/plugin.js +4 -1
- package/dist/adapters/solana/plugin.js.map +1 -1
- package/dist/adapters/solana/types.d.ts +8 -5
- package/dist/adapters/solana/types.js.map +1 -1
- package/dist/adapters/solana/web3.js +10 -32
- package/dist/adapters/solana/web3.js.map +1 -1
- package/dist/adapters/ton/proofs.js +18 -76
- package/dist/adapters/ton/proofs.js.map +1 -1
- package/dist/adapters/ton/reader.d.ts +45 -4
- package/dist/adapters/ton/reader.js +200 -5
- package/dist/adapters/ton/reader.js.map +1 -1
- package/dist/adapters/ton/trace.d.ts +26 -0
- package/dist/adapters/ton/trace.js +35 -9
- package/dist/adapters/ton/trace.js.map +1 -1
- package/dist/adapters/tron/abi.d.ts +2 -0
- package/dist/adapters/tron/abi.js +2 -0
- package/dist/adapters/tron/abi.js.map +1 -1
- package/dist/adapters/tron/builder.js +20 -4
- package/dist/adapters/tron/builder.js.map +1 -1
- package/dist/adapters/tron/decode.d.ts +2 -0
- package/dist/adapters/tron/decode.js +1 -1
- package/dist/adapters/tron/decode.js.map +1 -1
- package/dist/adapters/tron/proofs.js +1 -0
- package/dist/adapters/tron/proofs.js.map +1 -1
- package/dist/adapters/tron/reader.d.ts +10 -0
- package/dist/adapters/tron/reader.js +17 -0
- package/dist/adapters/tron/reader.js.map +1 -1
- package/dist/adapters/tron/tokens.d.ts +2 -0
- package/dist/adapters/tron/tokens.js.map +1 -1
- package/dist/adapters/utxo/builder.js +1 -1
- package/dist/adapters/utxo/builder.js.map +1 -1
- package/dist/adapters/utxo/chains.js +2 -1
- package/dist/adapters/utxo/chains.js.map +1 -1
- package/dist/adapters/utxo/context.d.ts +6 -0
- package/dist/adapters/utxo/context.js +8 -1
- package/dist/adapters/utxo/context.js.map +1 -1
- package/dist/adapters/utxo/decode.d.ts +8 -0
- package/dist/adapters/utxo/decode.js +36 -0
- package/dist/adapters/utxo/decode.js.map +1 -1
- package/dist/adapters/utxo/driver.js +5 -0
- package/dist/adapters/utxo/driver.js.map +1 -1
- package/dist/adapters/utxo/esplora.d.ts +23 -2
- package/dist/adapters/utxo/esplora.js +49 -2
- package/dist/adapters/utxo/esplora.js.map +1 -1
- package/dist/adapters/utxo/proofs.d.ts +15 -6
- package/dist/adapters/utxo/proofs.js +185 -47
- package/dist/adapters/utxo/proofs.js.map +1 -1
- 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 +14 -0
- package/dist/adapters/utxo/rawtx.js +44 -14
- package/dist/adapters/utxo/rawtx.js.map +1 -1
- package/dist/core/blockchain/handle.d.ts +6 -27
- package/dist/core/blockchain/handle.js +112 -112
- package/dist/core/blockchain/handle.js.map +1 -1
- package/dist/core/config/types.d.ts +15 -0
- package/dist/core/config/types.js.map +1 -1
- package/dist/core/container/container.d.ts +1 -8
- package/dist/core/container/container.js +42 -8
- package/dist/core/container/container.js.map +1 -1
- package/dist/core/driver/types.d.ts +34 -1
- package/dist/core/driver/types.js.map +1 -1
- package/dist/core/errors/codes.d.ts +10 -0
- package/dist/core/errors/codes.js +4 -0
- package/dist/core/errors/codes.js.map +1 -1
- package/dist/core/lifecycle/engine-rules.d.ts +3 -4
- package/dist/core/lifecycle/engine-rules.js +16 -6
- package/dist/core/lifecycle/engine-rules.js.map +1 -1
- package/dist/core/lifecycle/engine.d.ts +2 -0
- package/dist/core/lifecycle/engine.js +19 -1
- package/dist/core/lifecycle/engine.js.map +1 -1
- package/dist/core/lifecycle/evaluate.js +9 -4
- package/dist/core/lifecycle/evaluate.js.map +1 -1
- package/dist/core/lifecycle/monitor.js +16 -6
- package/dist/core/lifecycle/monitor.js.map +1 -1
- package/dist/core/lifecycle/reconcile.d.ts +1 -1
- package/dist/core/lifecycle/reconcile.js +1 -1
- package/dist/core/lifecycle/reconcile.js.map +1 -1
- package/dist/core/lifecycle/workers.d.ts +9 -3
- package/dist/core/lifecycle/workers.js +32 -14
- package/dist/core/lifecycle/workers.js.map +1 -1
- package/dist/core/model/ids.d.ts +1 -0
- package/dist/core/model/ids.js +1 -0
- package/dist/core/model/ids.js.map +1 -1
- package/dist/core/model/ordering.d.ts +8 -0
- package/dist/core/model/ordering.js.map +1 -1
- package/dist/core/model/transaction.d.ts +7 -0
- package/dist/core/model/transaction.js.map +1 -1
- package/dist/core/observe/scanner.js +3 -0
- package/dist/core/observe/scanner.js.map +1 -1
- package/dist/core/signing/wallet.js +8 -0
- package/dist/core/signing/wallet.js.map +1 -1
- 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.js +2 -2
- package/dist/core/store/memory.js.map +1 -1
- package/dist/core/store/types.d.ts +15 -3
- package/dist/core/store/types.js +2 -0
- package/dist/core/store/types.js.map +1 -1
- package/dist/core/transport/http-transport.js +21 -13
- package/dist/core/transport/http-transport.js.map +1 -1
- package/dist/core/transport/types.d.ts +16 -1
- package/dist/core/transport/types.js.map +1 -1
- package/dist/core/util/json.d.ts +7 -1
- package/dist/core/util/json.js +13 -4
- package/dist/core/util/json.js.map +1 -1
- package/dist/core/util/names.d.ts +6 -0
- package/dist/core/util/names.js +10 -0
- package/dist/core/util/names.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/testing/contracts/operations.js +20 -1
- package/dist/testing/contracts/operations.js.map +1 -1
- package/dist/testing/env.d.ts +5 -0
- package/dist/testing/env.js +1 -1
- package/dist/testing/env.js.map +1 -1
- package/dist/testing/faulty-store.d.ts +2 -0
- package/dist/testing/faulty-store.js +5 -0
- package/dist/testing/faulty-store.js.map +1 -1
- package/package.json +17 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawblock.js","sourceRoot":"","sources":["../../../src/adapters/utxo/rawblock.ts"],"names":[],"mappings":";;;AAgDA,8BA0CC;AAQD,oCAkBC;AAkBD,sDA6BC;AAnKD;;;;;;;;;;;;;;GAcG;AACH,iDAAmD;AACnD,mCAAyF;AAEzF,6EAA6E;AAChE,QAAA,eAAe,GAAG,SAAS,CAAC;AACzC,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,iGAAiG;AACjG,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,2FAA2F;AAC3F,MAAM,iBAAiB,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5E,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;AAerC,0EAA0E;AACnE,MAAM,cAAc,GAAG,CAAC,KAAkB,EAAW,EAAE,CAC5D,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,IAAA,kBAAU,EAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AADpD,QAAA,cAAc,kBACsC;AAEjE,sFAAsF;AACtF,SAAgB,SAAS,CAAC,KAAiB;IACzC,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACrD,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,uBAAe;QAAE,OAAO,SAAS,CAAC;IAClF,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5E,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,gFAAgF;IAChF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAW,CAAC;IACrC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC7C,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC;QACT,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,SAAS,CAAC;IACrC,CAAC;SAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC7C,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC;QACT,IAAI,KAAK,GAAG,QAAQ;YAAE,OAAO,SAAS,CAAC;IACzC,CAAC;SAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC,CAAC,0CAA0C;IAC9D,CAAC;IACD,gFAAgF;IAChF,2BAA2B;IAC3B,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,QAAQ,IAAI,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAA,gBAAQ,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO;QACL,IAAI,EAAE,IAAA,kBAAU,EAAC,IAAA,eAAO,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,UAAU,EAAE,IAAA,kBAAU,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC;QAC9B,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;QACnC,GAAG;KACJ,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,MAA6B;IAIxD,IAAI,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,IAAI,IAAA,kBAAU,EAAC,KAAK,CAAC,CAAC,CAAe,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAe,CAAC;gBAAE,OAAO,GAAG,IAAI,CAAC;QACrF,CAAC;QACD,MAAM,IAAI,GAAiB,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAe,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,IAAA,eAAO,EAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,qBAAqB,CAAC,KAAe;IACnD,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAA,sBAAc,EAAC,KAAK,CAAC,EAAE,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxE,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAA,kBAAU,EAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,UAAkC,CAAC;IACvC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IACE,MAAM,CAAC,MAAM,IAAI,eAAe;YAChC,IAAA,kBAAU,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,EAC3E,CAAC;YACD,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACrF,MAAM,SAAS,GAAG,YAAY,CAC5B,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAChB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAA,eAAO,EAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CACpE,CACF,CAAC;IACF,OAAO,IAAA,kBAAU,EAAC,IAAA,eAAO,EAAC,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACxE,CAAC","sourcesContent":["/**\n * A linear, SDK-free reader of untrusted block bytes (Esplora's `/block/:hash/raw`), and the\n * checks that bind a block's transactions to its header.\n *\n * A block hash is the double SHA-256 of the 80-byte header, and the header commits to the\n * transactions through the merkle root of their txids, and (BIP141) to their witnesses\n * through the coinbase's witness commitment. So bytes that hash to the block asked for and\n * pass `commitsToTransactions` are that block's transactions, byte for byte, whoever served\n * them: an indexer can neither add, drop nor alter one. bitcoinjs-lib's `Block.fromBuffer`\n * copies the rest of the block for every transaction it reads (quadratic in the block's\n * size), so each transaction is read here by `rawtx.ts`, in one pass over views of the bytes.\n *\n * The format is bitcoind's: the header, a canonical CompactSize count of at most `MAX_SIZE`,\n * then each transaction with witness support, and nothing after the last one.\n */\nimport { equalBytes } from '../../core/util/bytes';\nimport { displayHex, hash256, readTxAt, type ParsedInput, type ParsedTx } from './rawtx';\n\n/** Bitcoin Core's `MAX_BLOCK_SERIALIZED_SIZE`: no block's bytes are more. */\nexport const MAX_BLOCK_BYTES = 4_000_000;\nconst HEADER = 80;\n/** bitcoind's `MAX_SIZE`: the largest CompactSize a deserializer accepts. */\nconst MAX_SIZE = 0x02000000;\n/** The fewest bytes `rawtx.ts` decodes as a transaction (version, two zero bytes, lock time). */\nconst MIN_TX = 10;\n/** BIP141: an output script of at least 38 bytes that starts `OP_RETURN 0x24 aa21a9ed`. */\nconst COMMITMENT_HEADER = Uint8Array.of(0x6a, 0x24, 0xaa, 0x21, 0xa9, 0xed);\nconst COMMITMENT_SIZE = 38;\nconst ZERO_HASH = new Uint8Array(32);\n\nexport interface RawBlock {\n /** The block hash in display order: the double SHA-256 of the header. */\n readonly hash: string;\n /** The previous block's hash in display order (zeros for a genesis block). */\n readonly parentHash: string;\n /** The header's time, in seconds. */\n readonly time: number;\n /** The header's merkle root of the txids, in internal byte order. */\n readonly merkleRoot: Uint8Array;\n /** Every transaction, the coinbase first, as the bytes hold them. */\n readonly txs: readonly ParsedTx[];\n}\n\n/** An input that spends no output (`COutPoint::IsNull`): a coinbase's. */\nexport const isNullOutpoint = (input: ParsedInput): boolean =>\n input.vout === 0xffffffff && equalBytes(input.hash, ZERO_HASH);\n\n/** Block bytes, read in one pass; `undefined` when bitcoind would not decode them. */\nexport function readBlock(bytes: Uint8Array): RawBlock | undefined {\n if (!(bytes instanceof Uint8Array)) return undefined;\n if (bytes.length < HEADER + 1 || bytes.length > MAX_BLOCK_BYTES) return undefined;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let pos = HEADER;\n // A canonical CompactSize of at most `MAX_SIZE` (bitcoind's `ReadCompactSize`).\n const first = bytes[pos++] as number;\n let count = first;\n if (first === 0xfd) {\n if (pos + 2 > bytes.length) return undefined;\n count = view.getUint16(pos, true);\n pos += 2;\n if (count < 0xfd) return undefined;\n } else if (first === 0xfe) {\n if (pos + 4 > bytes.length) return undefined;\n count = view.getUint32(pos, true);\n pos += 4;\n if (count < 0x1_0000) return undefined;\n } else if (first === 0xff) {\n return undefined; // 8 bytes: at least 2^32, beyond MAX_SIZE\n }\n // Every block has a coinbase, and the count is bounded by the bytes left before\n // anything is kept for it.\n if (count < 1 || count > MAX_SIZE || count * MIN_TX > bytes.length - pos) {\n return undefined;\n }\n const txs: ParsedTx[] = [];\n for (let i = 0; i < count; i++) {\n const tx = readTxAt(bytes, pos);\n if (!tx) return undefined;\n txs.push(tx);\n pos += tx.bytes.length;\n }\n if (pos !== bytes.length) return undefined;\n const header = bytes.subarray(0, HEADER);\n return {\n hash: displayHex(hash256([header])),\n parentHash: displayHex(header.subarray(4, 36)),\n time: view.getUint32(68, true),\n merkleRoot: header.subarray(36, 68),\n txs,\n };\n}\n\n/**\n * Bitcoin Core's `ComputeMerkleRoot`: the root of `leaves`, each level's odd last node\n * paired with itself, and whether a level holds two equal nodes at a pair's places. That\n * flags CVE-2012-2459: a list whose last transactions are repeated has the root of the list\n * without them, so equal pairs are refused rather than read as a different block.\n */\nexport function merkleRootOf(leaves: readonly Uint8Array[]): {\n readonly root: Uint8Array;\n readonly mutated: boolean;\n} {\n let level = [...leaves];\n let mutated = false;\n while (level.length > 1) {\n for (let i = 0; i + 1 < level.length; i += 2) {\n if (equalBytes(level[i] as Uint8Array, level[i + 1] as Uint8Array)) mutated = true;\n }\n const next: Uint8Array[] = [];\n for (let i = 0; i < level.length; i += 2) {\n const left = level[i] as Uint8Array;\n next.push(hash256([left, level[i + 1] ?? left]));\n }\n level = next;\n }\n return { root: level[0] ?? ZERO_HASH, mutated };\n}\n\n/**\n * Whether `block`'s transactions are the ones its header commits to, as bitcoind's\n * `CheckMerkleRoot`, `bad-cb-missing` and `CheckWitnessMalleation` check them:\n * - the merkle root of the txids is the header's, with no repeated pair (CVE-2012-2459) and\n * no txid twice: no valid block holds one twice;\n * - the first transaction is a coinbase (one input, spending nothing). A 64-byte\n * transaction's txid is the hash of two merkle nodes, so a list with such \"transactions\"\n * in place of the nodes' subtrees has the same root. Its leftmost one stands for the\n * subtree that holds the coinbase, so it would have to be a coinbase made of hash output,\n * with a null outpoint's 36 fixed bytes in it, which no one can find;\n * - when any transaction carries a witness, the coinbase commits to every witness (BIP141):\n * its last output that starts `OP_RETURN aa21a9ed` holds the double SHA-256 of the\n * wtxids' merkle root (the coinbase's taken as zero) and the coinbase's one 32-byte\n * witness item. A block with no witness at all is checked by its txids alone: an\n * earlier block's coinbase may carry a commitment that segwit's rules did not cover yet.\n */\nexport function commitsToTransactions(block: RawBlock): boolean {\n const { txs } = block;\n const coinbase = txs[0];\n const input = coinbase?.inputs[0];\n if (!coinbase || coinbase.inputs.length !== 1 || !input || !isNullOutpoint(input)) {\n return false;\n }\n if (new Set(txs.map((tx) => tx.txid)).size !== txs.length) return false;\n const ids = merkleRootOf(txs.map((tx) => tx.hash));\n if (ids.mutated || !equalBytes(ids.root, block.merkleRoot)) return false;\n if (!txs.some((tx) => tx.hasWitness)) return true;\n let commitment: Uint8Array | undefined;\n for (const output of coinbase.outputs) {\n const script = output.script;\n if (\n script.length >= COMMITMENT_SIZE &&\n equalBytes(script.subarray(0, COMMITMENT_HEADER.length), COMMITMENT_HEADER)\n ) {\n commitment = script.subarray(COMMITMENT_HEADER.length, COMMITMENT_SIZE);\n }\n }\n const reserved = input.witness;\n if (!commitment || reserved.length !== 1 || reserved[0]?.length !== 32) return false;\n const witnesses = merkleRootOf(\n txs.map((tx, i) =>\n i === 0 ? ZERO_HASH : tx.hasWitness ? hash256([tx.bytes]) : tx.hash,\n ),\n );\n return equalBytes(hash256([witnesses.root, reserved[0]]), commitment);\n}\n"]}
|
|
@@ -23,6 +23,8 @@ export interface ParsedOutput {
|
|
|
23
23
|
}
|
|
24
24
|
export interface ParsedTx {
|
|
25
25
|
readonly txid: string;
|
|
26
|
+
/** The txid's hash in internal byte order: a block's merkle tree leaf. */
|
|
27
|
+
readonly hash: Uint8Array;
|
|
26
28
|
readonly version: number;
|
|
27
29
|
readonly locktime: number;
|
|
28
30
|
readonly inputs: readonly ParsedInput[];
|
|
@@ -30,6 +32,8 @@ export interface ParsedTx {
|
|
|
30
32
|
readonly hasWitness: boolean;
|
|
31
33
|
/** The size without witness data (bitcoind's `TX_NO_WITNESS` serialization). */
|
|
32
34
|
readonly strippedSize: number;
|
|
35
|
+
/** The serialization as read, witness included: a view. */
|
|
36
|
+
readonly bytes: Uint8Array;
|
|
33
37
|
/** The output list as serialized (its count, then each output): a view. */
|
|
34
38
|
readonly outputBytes: Uint8Array;
|
|
35
39
|
/** The serialization without witness data (BIP174 `non_witness_utxo`). */
|
|
@@ -43,6 +47,10 @@ export interface ReadOptions {
|
|
|
43
47
|
*/
|
|
44
48
|
readonly maxStripped?: number;
|
|
45
49
|
}
|
|
50
|
+
/** Double SHA-256 of the given stretches, as one message. */
|
|
51
|
+
export declare function hash256(parts: readonly Uint8Array[]): Uint8Array;
|
|
52
|
+
/** A txid (or block hash) in display order. */
|
|
53
|
+
export declare const displayHex: (hash: Uint8Array) => string;
|
|
46
54
|
/** The txid of a serialization without witness data, given as consecutive stretches. */
|
|
47
55
|
export declare const txidOfParts: (parts: readonly Uint8Array[]) => string;
|
|
48
56
|
/** A little-endian 32-bit field, as bitcoind writes it. */
|
|
@@ -51,6 +59,12 @@ export declare function writeU32(n: number): Uint8Array;
|
|
|
51
59
|
export declare function writeSize(n: number): Uint8Array;
|
|
52
60
|
/** Transaction bytes, read in one pass; `undefined` when bitcoind would not decode them. */
|
|
53
61
|
export declare function readTx(bytes: Uint8Array, options?: ReadOptions): ParsedTx | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* The transaction that starts at `start` of `bytes` (a block's transaction list), read as
|
|
64
|
+
* `readTx` reads one; the next one starts where its `bytes` end. `undefined` when bitcoind
|
|
65
|
+
* would not decode it there.
|
|
66
|
+
*/
|
|
67
|
+
export declare function readTxAt(bytes: Uint8Array, start: number): ParsedTx | undefined;
|
|
54
68
|
/**
|
|
55
69
|
* Transaction hex (either case, no prefix), capped at `MAX_TX_BYTES` before it is
|
|
56
70
|
* decoded, then read by `readTx`. Node's hex decoder is native and linear, and stops at
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.txidOfParts = exports.MAX_STRIPPED_BYTES = exports.MAX_TX_BYTES = void 0;
|
|
3
|
+
exports.txidOfParts = exports.displayHex = exports.MAX_STRIPPED_BYTES = exports.MAX_TX_BYTES = void 0;
|
|
4
|
+
exports.hash256 = hash256;
|
|
4
5
|
exports.writeU32 = writeU32;
|
|
5
6
|
exports.writeSize = writeSize;
|
|
6
7
|
exports.readTx = readTx;
|
|
8
|
+
exports.readTxAt = readTxAt;
|
|
7
9
|
exports.readTxHex = readTxHex;
|
|
8
10
|
/**
|
|
9
11
|
* A linear, SDK-free reader of untrusted transaction bytes.
|
|
10
12
|
*
|
|
11
13
|
* bitcoinjs-lib 7's `Transaction.fromBuffer` is quadratic in the number of inputs and
|
|
12
14
|
* outputs: a 3.98 MB transaction with 92,500 outputs took 53 s. So bytes from a node, an
|
|
13
|
-
* indexer or a coordinator are read here instead, in one pass
|
|
15
|
+
* indexer or a coordinator are read here instead, in one pass, and so are a block's
|
|
16
|
+
* transactions (`readTxAt`, for `rawblock.ts`). Every count is checked
|
|
14
17
|
* against the bytes left before anything is kept, scripts and witness items are views into
|
|
15
18
|
* the input (never copies), and the txid is hashed from the three stretches of the
|
|
16
19
|
* serialization it covers, without copying them.
|
|
@@ -49,8 +52,9 @@ function hash256(parts) {
|
|
|
49
52
|
}
|
|
50
53
|
/** A txid (or block hash) in display order. */
|
|
51
54
|
const displayHex = (hash) => (0, bytes_1.toHex)(Uint8Array.from(hash).reverse());
|
|
55
|
+
exports.displayHex = displayHex;
|
|
52
56
|
/** The txid of a serialization without witness data, given as consecutive stretches. */
|
|
53
|
-
const txidOfParts = (parts) => displayHex(hash256(parts));
|
|
57
|
+
const txidOfParts = (parts) => (0, exports.displayHex)(hash256(parts));
|
|
54
58
|
exports.txidOfParts = txidOfParts;
|
|
55
59
|
/** A little-endian 32-bit field, as bitcoind writes it. */
|
|
56
60
|
function writeU32(n) {
|
|
@@ -72,7 +76,23 @@ function readTx(bytes, options = {}) {
|
|
|
72
76
|
if (!(bytes instanceof Uint8Array) || bytes.length > exports.MAX_TX_BYTES)
|
|
73
77
|
return undefined;
|
|
74
78
|
try {
|
|
75
|
-
|
|
79
|
+
const tx = parse(bytes, 0, maxStripped);
|
|
80
|
+
return tx.bytes.length === bytes.length ? tx : undefined;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error instanceof Malformed)
|
|
84
|
+
return undefined;
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The transaction that starts at `start` of `bytes` (a block's transaction list), read as
|
|
90
|
+
* `readTx` reads one; the next one starts where its `bytes` end. `undefined` when bitcoind
|
|
91
|
+
* would not decode it there.
|
|
92
|
+
*/
|
|
93
|
+
function readTxAt(bytes, start) {
|
|
94
|
+
try {
|
|
95
|
+
return parse(bytes, start, exports.MAX_STRIPPED_BYTES);
|
|
76
96
|
}
|
|
77
97
|
catch (error) {
|
|
78
98
|
if (error instanceof Malformed)
|
|
@@ -95,9 +115,13 @@ function readTxHex(hex, options = {}) {
|
|
|
95
115
|
return undefined;
|
|
96
116
|
return readTx(new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.length), options);
|
|
97
117
|
}
|
|
98
|
-
|
|
118
|
+
/**
|
|
119
|
+
* The transaction that starts at `start`; it ends where its lock time does (`bytes.length`
|
|
120
|
+
* of its result), and whatever follows is the caller's.
|
|
121
|
+
*/
|
|
122
|
+
function parse(bytes, start, maxStripped) {
|
|
99
123
|
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
100
|
-
let pos =
|
|
124
|
+
let pos = start;
|
|
101
125
|
const need = (n) => {
|
|
102
126
|
if (n < 0 || pos + n > bytes.length)
|
|
103
127
|
throw new Malformed();
|
|
@@ -152,7 +176,7 @@ function parse(bytes, maxStripped) {
|
|
|
152
176
|
};
|
|
153
177
|
// `skipped`: the marker and flag bytes, which the stripped serialization leaves out.
|
|
154
178
|
let skipped = 0;
|
|
155
|
-
const strippedSoFar = () => pos - skipped + 4; // with the lock time
|
|
179
|
+
const strippedSoFar = () => pos - start - skipped + 4; // with the lock time to come
|
|
156
180
|
const version = u32() | 0;
|
|
157
181
|
let vinStart = pos;
|
|
158
182
|
let inputCount = count(MIN_INPUT);
|
|
@@ -178,7 +202,7 @@ function parse(bytes, maxStripped) {
|
|
|
178
202
|
const vout = u32();
|
|
179
203
|
const script = slice(size());
|
|
180
204
|
const sequence = u32();
|
|
181
|
-
inputs.push({ txid: displayHex(hash), hash, vout, script, sequence, witness: [] });
|
|
205
|
+
inputs.push({ txid: (0, exports.displayHex)(hash), hash, vout, script, sequence, witness: [] });
|
|
182
206
|
if (strippedSoFar() > maxStripped)
|
|
183
207
|
throw new Malformed();
|
|
184
208
|
}
|
|
@@ -211,24 +235,30 @@ function parse(bytes, maxStripped) {
|
|
|
211
235
|
throw new Malformed(); // a superfluous witness record
|
|
212
236
|
}
|
|
213
237
|
const locktime = u32();
|
|
214
|
-
|
|
215
|
-
throw new Malformed();
|
|
238
|
+
const whole = bytes.subarray(start, pos);
|
|
216
239
|
const parts = extended
|
|
217
|
-
? [
|
|
218
|
-
|
|
240
|
+
? [
|
|
241
|
+
bytes.subarray(start, start + 4),
|
|
242
|
+
bytes.subarray(vinStart, outputEnd),
|
|
243
|
+
bytes.subarray(pos - 4, pos),
|
|
244
|
+
]
|
|
245
|
+
: [whole];
|
|
219
246
|
const stripped = parts.reduce((sum, part) => sum + part.length, 0);
|
|
220
247
|
if (stripped > maxStripped)
|
|
221
248
|
throw new Malformed();
|
|
249
|
+
const hash = hash256(parts);
|
|
222
250
|
return {
|
|
223
|
-
txid: (0, exports.
|
|
251
|
+
txid: (0, exports.displayHex)(hash),
|
|
252
|
+
hash,
|
|
224
253
|
version,
|
|
225
254
|
locktime,
|
|
226
255
|
inputs,
|
|
227
256
|
outputs,
|
|
228
257
|
hasWitness,
|
|
229
258
|
strippedSize: stripped,
|
|
259
|
+
bytes: whole,
|
|
230
260
|
outputBytes: bytes.subarray(outputStart, outputEnd),
|
|
231
|
-
stripped: () => (parts.length === 1 ?
|
|
261
|
+
stripped: () => (parts.length === 1 ? whole : (0, bytes_1.concatBytes)(...parts)),
|
|
232
262
|
};
|
|
233
263
|
}
|
|
234
264
|
//# sourceMappingURL=rawtx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rawtx.js","sourceRoot":"","sources":["../../../src/adapters/utxo/rawtx.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A linear, SDK-free reader of untrusted transaction bytes.\n *\n * bitcoinjs-lib 7's `Transaction.fromBuffer` is quadratic in the number of inputs and\n * outputs: a 3.98 MB transaction with 92,500 outputs took 53 s. So bytes from a node, an\n * indexer or a coordinator are read here instead, in one pass. Every count is checked\n * against the bytes left before anything is kept, scripts and witness items are views into\n * the input (never copies), and the txid is hashed from the three stretches of the\n * serialization it covers, without copying them.\n *\n * The format is exactly bitcoind's `UnserializeTransaction` with witness support (as\n * `sendrawtransaction` decodes): an empty input list is followed by a flags byte; flags 1\n * marks the witness (BIP144), and a witness record whose stacks are all empty, or any other\n * flag, does not decode. Sizes are canonical CompactSize values of at most `MAX_SIZE`, and\n * nothing may follow the lock time. So when this reader refuses bytes, bitcoind refuses them\n * too, which lets the broadcaster check a node's `TX decode failed` itself: a node's\n * rejection is a claim, kept only when it holds for our own bytes.\n */\nimport { sha256 } from '@noble/hashes/sha256';\nimport { concatBytes, toHex } from '../../core/util/bytes';\n\n/** Bitcoin Core's `MAX_BLOCK_SERIALIZED_SIZE`: no transaction's bytes are more. */\nexport const MAX_TX_BYTES = 4_000_000;\n/**\n * Consensus: a transaction's weight (4 × its size without witness data, at least) is at most\n * `MAX_BLOCK_WEIGHT` (4,000,000), so a transaction a chain holds has at most 1,000,000 bytes\n * without its witness.\n */\nexport const MAX_STRIPPED_BYTES = 1_000_000;\n/** bitcoind's `MAX_SIZE`: the largest CompactSize a deserializer accepts. */\nconst MAX_SIZE = 0x02000000;\n/** The fewest bytes an input (outpoint, empty script, sequence) and an output can take. */\nconst MIN_INPUT = 41;\nconst MIN_OUTPUT = 9;\n\nexport interface ParsedInput {\n /** The previous txid, in display order (the reverse of the serialized hash). */\n readonly txid: string;\n /** The previous transaction's hash as serialized (internal byte order): a view. */\n readonly hash: Uint8Array;\n readonly vout: number;\n readonly script: Uint8Array;\n readonly sequence: number;\n readonly witness: readonly Uint8Array[];\n}\n\nexport interface ParsedOutput {\n /** As bitcoind reads it: a signed 64-bit integer. */\n readonly value: bigint;\n readonly script: Uint8Array;\n}\n\nexport interface ParsedTx {\n readonly txid: string;\n readonly version: number;\n readonly locktime: number;\n readonly inputs: readonly ParsedInput[];\n readonly outputs: readonly ParsedOutput[];\n readonly hasWitness: boolean;\n /** The size without witness data (bitcoind's `TX_NO_WITNESS` serialization). */\n readonly strippedSize: number;\n /** The output list as serialized (its count, then each output): a view. */\n readonly outputBytes: Uint8Array;\n /** The serialization without witness data (BIP174 `non_witness_utxo`). */\n stripped(): Uint8Array;\n}\n\nexport interface ReadOptions {\n /**\n * The most bytes without witness data: `MAX_STRIPPED_BYTES` (the default) for data a chain\n * holds; the broadcaster reads what it sent with `MAX_TX_BYTES`, so every size bitcoind\n * decodes is read (bitcoind refuses a larger one later, as `bad-txns-oversize`).\n */\n readonly maxStripped?: number;\n}\n\nclass Malformed extends Error {}\n\n/** Double SHA-256 of the given stretches, as one message. */\nfunction hash256(parts: readonly Uint8Array[]): Uint8Array {\n const inner = sha256.create();\n for (const part of parts) inner.update(part);\n return sha256(inner.digest());\n}\n\n/** A txid (or block hash) in display order. */\nconst displayHex = (hash: Uint8Array): string => toHex(Uint8Array.from(hash).reverse());\n\n/** The txid of a serialization without witness data, given as consecutive stretches. */\nexport const txidOfParts = (parts: readonly Uint8Array[]): string =>\n displayHex(hash256(parts));\n\n/** A little-endian 32-bit field, as bitcoind writes it. */\nexport function writeU32(n: number): Uint8Array {\n const out = new Uint8Array(4);\n new DataView(out.buffer).setUint32(0, n >>> 0, true);\n return out;\n}\n\n/** A CompactSize, as bitcoind writes it (at most `MAX_SIZE` here). */\nexport function writeSize(n: number): Uint8Array {\n if (n < 0xfd) return Uint8Array.of(n);\n if (n <= 0xffff) return Uint8Array.of(0xfd, n & 0xff, n >>> 8);\n return concatBytes(Uint8Array.of(0xfe), writeU32(n));\n}\n\n/** Transaction bytes, read in one pass; `undefined` when bitcoind would not decode them. */\nexport function readTx(\n bytes: Uint8Array,\n options: ReadOptions = {},\n): ParsedTx | undefined {\n const maxStripped = options.maxStripped ?? MAX_STRIPPED_BYTES;\n if (!(bytes instanceof Uint8Array) || bytes.length > MAX_TX_BYTES) return undefined;\n try {\n return parse(bytes, maxStripped);\n } catch (error) {\n if (error instanceof Malformed) return undefined;\n throw error;\n }\n}\n\n/**\n * Transaction hex (either case, no prefix), capped at `MAX_TX_BYTES` before it is\n * decoded, then read by `readTx`. Node's hex decoder is native and linear, and stops at\n * the first pair that is not hex, so a short result means the text was not plain hex.\n */\nexport function readTxHex(hex: string, options: ReadOptions = {}): ParsedTx | undefined {\n if (typeof hex !== 'string' || hex.length > 2 * MAX_TX_BYTES) return undefined;\n if (hex.length % 2 !== 0) return undefined;\n const decoded = Buffer.from(hex, 'hex');\n if (decoded.length * 2 !== hex.length) return undefined;\n return readTx(\n new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.length),\n options,\n );\n}\n\nfunction parse(bytes: Uint8Array, maxStripped: number): ParsedTx {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let pos = 0;\n const need = (n: number): void => {\n if (n < 0 || pos + n > bytes.length) throw new Malformed();\n };\n const u8 = (): number => {\n need(1);\n return bytes[pos++] as number;\n };\n const u32 = (): number => {\n need(4);\n const value = view.getUint32(pos, true);\n pos += 4;\n return value;\n };\n const slice = (n: number): Uint8Array => {\n need(n);\n const part = bytes.subarray(pos, pos + n);\n pos += n;\n return part;\n };\n /** A canonical CompactSize of at most `MAX_SIZE` (bitcoind's `ReadCompactSize`). */\n const size = (): number => {\n const first = u8();\n let value: number;\n if (first < 0xfd) return first;\n if (first === 0xfd) {\n need(2);\n value = view.getUint16(pos, true);\n pos += 2;\n if (value < 0xfd) throw new Malformed();\n } else if (first === 0xfe) {\n value = u32();\n if (value < 0x1_0000) throw new Malformed();\n } else {\n throw new Malformed(); // 8 bytes: at least 2^32, beyond MAX_SIZE\n }\n if (value > MAX_SIZE) throw new Malformed();\n return value;\n };\n /** Bounds a count by the bytes left, before anything is kept for it. */\n const count = (least: number): number => {\n const n = size();\n if (n * least > bytes.length - pos) throw new Malformed();\n return n;\n };\n\n // `skipped`: the marker and flag bytes, which the stripped serialization leaves out.\n let skipped = 0;\n const strippedSoFar = (): number => pos - skipped + 4; // with the lock time still to come\n const version = u32() | 0;\n let vinStart = pos;\n let inputCount = count(MIN_INPUT);\n let extended = false;\n let outputsKnown = true;\n if (inputCount === 0) {\n const flags = u8();\n if (flags === 0) {\n outputsKnown = false; // bitcoind reads no output list after an empty one and no flags\n } else {\n if (flags !== 1) throw new Malformed(); // unknown optional data\n extended = true;\n skipped = 2;\n vinStart = pos;\n inputCount = count(MIN_INPUT);\n }\n }\n const inputs: {\n txid: string;\n hash: Uint8Array;\n vout: number;\n script: Uint8Array;\n sequence: number;\n witness: readonly Uint8Array[];\n }[] = [];\n for (let i = 0; i < inputCount; i++) {\n const hash = slice(32);\n const vout = u32();\n const script = slice(size());\n const sequence = u32();\n inputs.push({ txid: displayHex(hash), hash, vout, script, sequence, witness: [] });\n if (strippedSoFar() > maxStripped) throw new Malformed();\n }\n const outputStart = pos;\n const outputs: ParsedOutput[] = [];\n if (outputsKnown) {\n const outputCount = count(MIN_OUTPUT);\n for (let i = 0; i < outputCount; i++) {\n need(8);\n const value = view.getBigInt64(pos, true);\n pos += 8;\n outputs.push({ value, script: slice(size()) });\n if (strippedSoFar() > maxStripped) throw new Malformed();\n }\n }\n const outputEnd = pos;\n let hasWitness = false;\n if (extended) {\n for (const input of inputs) {\n const items = count(1);\n const stack: Uint8Array[] = [];\n for (let i = 0; i < items; i++) stack.push(slice(size()));\n input.witness = stack;\n if (items > 0) hasWitness = true;\n }\n if (!hasWitness) throw new Malformed(); // a superfluous witness record\n }\n const locktime = u32();\n if (pos !== bytes.length) throw new Malformed();\n const parts = extended\n ? [bytes.subarray(0, 4), bytes.subarray(vinStart, outputEnd), bytes.subarray(pos - 4)]\n : [bytes];\n const stripped = parts.reduce((sum, part) => sum + part.length, 0);\n if (stripped > maxStripped) throw new Malformed();\n return {\n txid: txidOfParts(parts),\n version,\n locktime,\n inputs,\n outputs,\n hasWitness,\n strippedSize: stripped,\n outputBytes: bytes.subarray(outputStart, outputEnd),\n stripped: () => (parts.length === 1 ? bytes : concatBytes(...parts)),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rawtx.js","sourceRoot":"","sources":["../../../src/adapters/utxo/rawtx.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A linear, SDK-free reader of untrusted transaction bytes.\n *\n * bitcoinjs-lib 7's `Transaction.fromBuffer` is quadratic in the number of inputs and\n * outputs: a 3.98 MB transaction with 92,500 outputs took 53 s. So bytes from a node, an\n * indexer or a coordinator are read here instead, in one pass, and so are a block's\n * transactions (`readTxAt`, for `rawblock.ts`). Every count is checked\n * against the bytes left before anything is kept, scripts and witness items are views into\n * the input (never copies), and the txid is hashed from the three stretches of the\n * serialization it covers, without copying them.\n *\n * The format is exactly bitcoind's `UnserializeTransaction` with witness support (as\n * `sendrawtransaction` decodes): an empty input list is followed by a flags byte; flags 1\n * marks the witness (BIP144), and a witness record whose stacks are all empty, or any other\n * flag, does not decode. Sizes are canonical CompactSize values of at most `MAX_SIZE`, and\n * nothing may follow the lock time. So when this reader refuses bytes, bitcoind refuses them\n * too, which lets the broadcaster check a node's `TX decode failed` itself: a node's\n * rejection is a claim, kept only when it holds for our own bytes.\n */\nimport { sha256 } from '@noble/hashes/sha256';\nimport { concatBytes, toHex } from '../../core/util/bytes';\n\n/** Bitcoin Core's `MAX_BLOCK_SERIALIZED_SIZE`: no transaction's bytes are more. */\nexport const MAX_TX_BYTES = 4_000_000;\n/**\n * Consensus: a transaction's weight (4 × its size without witness data, at least) is at most\n * `MAX_BLOCK_WEIGHT` (4,000,000), so a transaction a chain holds has at most 1,000,000 bytes\n * without its witness.\n */\nexport const MAX_STRIPPED_BYTES = 1_000_000;\n/** bitcoind's `MAX_SIZE`: the largest CompactSize a deserializer accepts. */\nconst MAX_SIZE = 0x02000000;\n/** The fewest bytes an input (outpoint, empty script, sequence) and an output can take. */\nconst MIN_INPUT = 41;\nconst MIN_OUTPUT = 9;\n\nexport interface ParsedInput {\n /** The previous txid, in display order (the reverse of the serialized hash). */\n readonly txid: string;\n /** The previous transaction's hash as serialized (internal byte order): a view. */\n readonly hash: Uint8Array;\n readonly vout: number;\n readonly script: Uint8Array;\n readonly sequence: number;\n readonly witness: readonly Uint8Array[];\n}\n\nexport interface ParsedOutput {\n /** As bitcoind reads it: a signed 64-bit integer. */\n readonly value: bigint;\n readonly script: Uint8Array;\n}\n\nexport interface ParsedTx {\n readonly txid: string;\n /** The txid's hash in internal byte order: a block's merkle tree leaf. */\n readonly hash: Uint8Array;\n readonly version: number;\n readonly locktime: number;\n readonly inputs: readonly ParsedInput[];\n readonly outputs: readonly ParsedOutput[];\n readonly hasWitness: boolean;\n /** The size without witness data (bitcoind's `TX_NO_WITNESS` serialization). */\n readonly strippedSize: number;\n /** The serialization as read, witness included: a view. */\n readonly bytes: Uint8Array;\n /** The output list as serialized (its count, then each output): a view. */\n readonly outputBytes: Uint8Array;\n /** The serialization without witness data (BIP174 `non_witness_utxo`). */\n stripped(): Uint8Array;\n}\n\nexport interface ReadOptions {\n /**\n * The most bytes without witness data: `MAX_STRIPPED_BYTES` (the default) for data a chain\n * holds; the broadcaster reads what it sent with `MAX_TX_BYTES`, so every size bitcoind\n * decodes is read (bitcoind refuses a larger one later, as `bad-txns-oversize`).\n */\n readonly maxStripped?: number;\n}\n\nclass Malformed extends Error {}\n\n/** Double SHA-256 of the given stretches, as one message. */\nexport function hash256(parts: readonly Uint8Array[]): Uint8Array {\n const inner = sha256.create();\n for (const part of parts) inner.update(part);\n return sha256(inner.digest());\n}\n\n/** A txid (or block hash) in display order. */\nexport const displayHex = (hash: Uint8Array): string =>\n toHex(Uint8Array.from(hash).reverse());\n\n/** The txid of a serialization without witness data, given as consecutive stretches. */\nexport const txidOfParts = (parts: readonly Uint8Array[]): string =>\n displayHex(hash256(parts));\n\n/** A little-endian 32-bit field, as bitcoind writes it. */\nexport function writeU32(n: number): Uint8Array {\n const out = new Uint8Array(4);\n new DataView(out.buffer).setUint32(0, n >>> 0, true);\n return out;\n}\n\n/** A CompactSize, as bitcoind writes it (at most `MAX_SIZE` here). */\nexport function writeSize(n: number): Uint8Array {\n if (n < 0xfd) return Uint8Array.of(n);\n if (n <= 0xffff) return Uint8Array.of(0xfd, n & 0xff, n >>> 8);\n return concatBytes(Uint8Array.of(0xfe), writeU32(n));\n}\n\n/** Transaction bytes, read in one pass; `undefined` when bitcoind would not decode them. */\nexport function readTx(\n bytes: Uint8Array,\n options: ReadOptions = {},\n): ParsedTx | undefined {\n const maxStripped = options.maxStripped ?? MAX_STRIPPED_BYTES;\n if (!(bytes instanceof Uint8Array) || bytes.length > MAX_TX_BYTES) return undefined;\n try {\n const tx = parse(bytes, 0, maxStripped);\n return tx.bytes.length === bytes.length ? tx : undefined;\n } catch (error) {\n if (error instanceof Malformed) return undefined;\n throw error;\n }\n}\n\n/**\n * The transaction that starts at `start` of `bytes` (a block's transaction list), read as\n * `readTx` reads one; the next one starts where its `bytes` end. `undefined` when bitcoind\n * would not decode it there.\n */\nexport function readTxAt(bytes: Uint8Array, start: number): ParsedTx | undefined {\n try {\n return parse(bytes, start, MAX_STRIPPED_BYTES);\n } catch (error) {\n if (error instanceof Malformed) return undefined;\n throw error;\n }\n}\n\n/**\n * Transaction hex (either case, no prefix), capped at `MAX_TX_BYTES` before it is\n * decoded, then read by `readTx`. Node's hex decoder is native and linear, and stops at\n * the first pair that is not hex, so a short result means the text was not plain hex.\n */\nexport function readTxHex(hex: string, options: ReadOptions = {}): ParsedTx | undefined {\n if (typeof hex !== 'string' || hex.length > 2 * MAX_TX_BYTES) return undefined;\n if (hex.length % 2 !== 0) return undefined;\n const decoded = Buffer.from(hex, 'hex');\n if (decoded.length * 2 !== hex.length) return undefined;\n return readTx(\n new Uint8Array(decoded.buffer, decoded.byteOffset, decoded.length),\n options,\n );\n}\n\n/**\n * The transaction that starts at `start`; it ends where its lock time does (`bytes.length`\n * of its result), and whatever follows is the caller's.\n */\nfunction parse(bytes: Uint8Array, start: number, maxStripped: number): ParsedTx {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let pos = start;\n const need = (n: number): void => {\n if (n < 0 || pos + n > bytes.length) throw new Malformed();\n };\n const u8 = (): number => {\n need(1);\n return bytes[pos++] as number;\n };\n const u32 = (): number => {\n need(4);\n const value = view.getUint32(pos, true);\n pos += 4;\n return value;\n };\n const slice = (n: number): Uint8Array => {\n need(n);\n const part = bytes.subarray(pos, pos + n);\n pos += n;\n return part;\n };\n /** A canonical CompactSize of at most `MAX_SIZE` (bitcoind's `ReadCompactSize`). */\n const size = (): number => {\n const first = u8();\n let value: number;\n if (first < 0xfd) return first;\n if (first === 0xfd) {\n need(2);\n value = view.getUint16(pos, true);\n pos += 2;\n if (value < 0xfd) throw new Malformed();\n } else if (first === 0xfe) {\n value = u32();\n if (value < 0x1_0000) throw new Malformed();\n } else {\n throw new Malformed(); // 8 bytes: at least 2^32, beyond MAX_SIZE\n }\n if (value > MAX_SIZE) throw new Malformed();\n return value;\n };\n /** Bounds a count by the bytes left, before anything is kept for it. */\n const count = (least: number): number => {\n const n = size();\n if (n * least > bytes.length - pos) throw new Malformed();\n return n;\n };\n\n // `skipped`: the marker and flag bytes, which the stripped serialization leaves out.\n let skipped = 0;\n const strippedSoFar = (): number => pos - start - skipped + 4; // with the lock time to come\n const version = u32() | 0;\n let vinStart = pos;\n let inputCount = count(MIN_INPUT);\n let extended = false;\n let outputsKnown = true;\n if (inputCount === 0) {\n const flags = u8();\n if (flags === 0) {\n outputsKnown = false; // bitcoind reads no output list after an empty one and no flags\n } else {\n if (flags !== 1) throw new Malformed(); // unknown optional data\n extended = true;\n skipped = 2;\n vinStart = pos;\n inputCount = count(MIN_INPUT);\n }\n }\n const inputs: {\n txid: string;\n hash: Uint8Array;\n vout: number;\n script: Uint8Array;\n sequence: number;\n witness: readonly Uint8Array[];\n }[] = [];\n for (let i = 0; i < inputCount; i++) {\n const hash = slice(32);\n const vout = u32();\n const script = slice(size());\n const sequence = u32();\n inputs.push({ txid: displayHex(hash), hash, vout, script, sequence, witness: [] });\n if (strippedSoFar() > maxStripped) throw new Malformed();\n }\n const outputStart = pos;\n const outputs: ParsedOutput[] = [];\n if (outputsKnown) {\n const outputCount = count(MIN_OUTPUT);\n for (let i = 0; i < outputCount; i++) {\n need(8);\n const value = view.getBigInt64(pos, true);\n pos += 8;\n outputs.push({ value, script: slice(size()) });\n if (strippedSoFar() > maxStripped) throw new Malformed();\n }\n }\n const outputEnd = pos;\n let hasWitness = false;\n if (extended) {\n for (const input of inputs) {\n const items = count(1);\n const stack: Uint8Array[] = [];\n for (let i = 0; i < items; i++) stack.push(slice(size()));\n input.witness = stack;\n if (items > 0) hasWitness = true;\n }\n if (!hasWitness) throw new Malformed(); // a superfluous witness record\n }\n const locktime = u32();\n const whole = bytes.subarray(start, pos);\n const parts = extended\n ? [\n bytes.subarray(start, start + 4),\n bytes.subarray(vinStart, outputEnd),\n bytes.subarray(pos - 4, pos),\n ]\n : [whole];\n const stripped = parts.reduce((sum, part) => sum + part.length, 0);\n if (stripped > maxStripped) throw new Malformed();\n const hash = hash256(parts);\n return {\n txid: displayHex(hash),\n hash,\n version,\n locktime,\n inputs,\n outputs,\n hasWitness,\n strippedSize: stripped,\n bytes: whole,\n outputBytes: bytes.subarray(outputStart, outputEnd),\n stripped: () => (parts.length === 1 ? whole : concatBytes(...parts)),\n };\n}\n"]}
|
|
@@ -8,15 +8,13 @@ import type { FeeEstimate, FeeOverride, FeeSpeed } from '../model/fee';
|
|
|
8
8
|
import type { ChainId, ExtOf, LibraryOf, NetworkOf } from '../model/ids';
|
|
9
9
|
import { type TransferIntent } from '../model/intent';
|
|
10
10
|
import type { Block, RawTx, Transaction, TxStatus } from '../model/transaction';
|
|
11
|
-
import { type
|
|
12
|
-
import { type ConfirmationResult, type
|
|
11
|
+
import { type TransferOptions } from '../lifecycle/engine';
|
|
12
|
+
import { type ConfirmationResult, type TxStatusEvent, type WaitOptions } from '../lifecycle/monitor';
|
|
13
13
|
import { type OperationView, type PreparedOperation, type Submission } from '../lifecycle/views';
|
|
14
14
|
import { Scanner, type ScannerOptions } from '../observe/scanner';
|
|
15
15
|
import type { SignatureBundle } from '../signing/types';
|
|
16
|
-
import type { OperationRecord } from '../store/types';
|
|
17
16
|
import type { EndpointStatus } from '../transport/types';
|
|
18
17
|
import { type HandleInternals } from './internal';
|
|
19
|
-
import { type MappingContext } from './mapping';
|
|
20
18
|
export interface Balance {
|
|
21
19
|
readonly address: Address;
|
|
22
20
|
readonly asset: AssetInfo;
|
|
@@ -32,8 +30,8 @@ export interface NetworkStatus {
|
|
|
32
30
|
}
|
|
33
31
|
/** Immutable handle bound to one chain, network, library, provider set and wallet. */
|
|
34
32
|
export declare class Blockchain<C extends ChainId = ChainId> {
|
|
35
|
-
/**
|
|
36
|
-
constructor(
|
|
33
|
+
/** Handles come from `CryptoAio#blockchain` or `Blockchain.create`. */
|
|
34
|
+
private constructor();
|
|
37
35
|
/** Creates a handle on the default container (see `configure`). */
|
|
38
36
|
static create<C extends ChainId>(config: HandleConfig<C>): Blockchain<C>;
|
|
39
37
|
get chain(): C;
|
|
@@ -176,25 +174,6 @@ export declare class Blockchain<C extends ChainId = ChainId> {
|
|
|
176
174
|
getOperation(operationId: string): Promise<OperationView | null>;
|
|
177
175
|
/** Typed family extensions: `bc.ext.<family>.<method>(...)` (async, loads the adapter on demand). */
|
|
178
176
|
get ext(): ExtOf<C>;
|
|
179
|
-
/** @internal The driver's address for `publicKey` under options the core built. */
|
|
180
|
-
protected driverAddress(publicKey: Uint8Array, options: WalletOptions): Promise<Address>;
|
|
181
|
-
/** @internal */
|
|
182
|
-
protected mapping(): Promise<MappingContext>;
|
|
183
|
-
/** @internal */
|
|
184
|
-
protected engine(): OperationEngine;
|
|
185
|
-
/** @internal */
|
|
186
|
-
protected monitor(): Monitor;
|
|
187
|
-
/** @internal */
|
|
188
|
-
protected readTarget(): Promise<ReadTarget>;
|
|
189
|
-
/** @internal */
|
|
190
|
-
protected target(): Promise<OperationTarget>;
|
|
191
|
-
/** @internal */
|
|
192
|
-
protected view(record: OperationRecord): Promise<OperationView>;
|
|
193
|
-
/** @internal */
|
|
194
|
-
protected submission(record: OperationRecord): Promise<Submission>;
|
|
195
|
-
/**
|
|
196
|
-
* @internal Signing material only while the Operation awaits signatures: an idempotent
|
|
197
|
-
* repeat of an abandoned Operation returns its view alone.
|
|
198
|
-
*/
|
|
199
|
-
protected prepared(target: OperationTarget, record: OperationRecord): Promise<PreparedOperation>;
|
|
200
177
|
}
|
|
178
|
+
/** A handle on `internals`; the container's way past the private constructor. */
|
|
179
|
+
export declare function createBlockchain<C extends ChainId>(internals: HandleInternals): Blockchain<C>;
|