diff --git a/web/bitcoincashjs-lib/.gitignore b/web/bitcoincashjs-lib/.gitignore new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/.gitignore @@ -0,0 +1,4 @@ +coverage +node_modules +.nyc_output +npm-debug.log diff --git a/web/bitcoincashjs-lib/.travis.yml b/web/bitcoincashjs-lib/.travis.yml new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/.travis.yml @@ -0,0 +1,18 @@ +sudo: false +language: node_js +node_js: + - "4" + - "5" + - "6" + - "7" + - "8" +matrix: + include: + - node_js: "7" + env: TEST_SUITE=standard + - node_js: "7" + env: TEST_SUITE=coverage +env: + - TEST_SUITE=integration + - TEST_SUITE=unit +script: npm run-script $TEST_SUITE diff --git a/web/bitcoincashjs-lib/CHANGELOG.md b/web/bitcoincashjs-lib/CHANGELOG.md new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/CHANGELOG.md @@ -0,0 +1,190 @@ +# 3.2.0 + +**added** + +- Added `address.fromBech32/toBech32` (#846) + +# 3.1.0 + +**added** + +- Added `Transaction.prototype.virtualSize` (#811) +- Added `Transaction.prototype.weight` (#811) + +# 3.0.0 + +From this release users can expect out-of-the-box Segregated Witness support. +The majority of breaking changes have been in how `script` encoding/decoding occurs, with the introduction of witness stacks. + +**added** + +- Added `script.types` enums (#679) +- Added `script.*.*.{check,encode,decode[,encodeStack,decodeStack]}` functions (#681, #682) +- Added minimal `TransactionBuilder.prototype.build` absurd fee-safety (#696) +- Added `script.(decompile/compile)PushOnly` and `script.toStack` functions (#700) +- Added `Transaction.prototype.toBuffer` Segregated Witness serialization support (#684, #701) +- Added `Transaction.prototype.hasWitnesses` (#718) +- Added `script.witnessCommitment.*` template +- Added `TransactionBuilder.prototype.sign` now has two additional parameters, `witnessValue`, and `witnessScript` +- Added `Transaction.hashForWitnessV0` and `Transaction.setWitness` (5c2fdb60436714f18440dc709f0be065928c1e49) + +**fixed** + +- Fixed `script` must compile minimally (#638) +- Fixed `Transaction` and `Block` versions should be Int32, signed integers (#662) + +**removed** + +- Removed `ecdsa.calcPubKeyRecoveryParam`, `ecdsa.recoverPubKey` (#456) +- Removed `buffer-equals`/`buffer-compare` dependencies (#650) +- Removed `HDNode.prototype.toString` (#665) +- Removed `dogecoin` network (#675) +- Removed `message` export, moved to [`bitcoinjs-message`](https://github.com/bitcoinjs/bitcoinjs-message) (#456) + +**renamed** + +- Removed `script.*` functions in favour of `bitcoin.script.*.(input/output).(encode/decode/check)` style (#682) + +# 2.3.0 + +**added** + +- Added `HDNode.prototype.isNeutered` (#536) +- Added `HDNode.prototype.derivePath` (#538) +- Added typeforce checking for `HDNode.prototype.derive*` (#539) +- Added `Transaction.prototype.isCoinbase` (#578) +- Added `Block.prototype.checkMerkleRoot` (#580) +- Added `Block.calculateMerkleRoot` (#580) +- Added `TransactionBuilder.prototype.setVersion` (#599) +- Added `script.isWitnessPubKeyHashOutput` (#602) +- Added `script.isWitnessScriptHashOutput` (#602) +- Added `script.witnessPubKeyHashOutput` (#602) +- Added `script.witnessScriptHashOutput` (#602) +- Added `script.witnessScriptHashInput` (#602) + +**fixed** + +- Fixed "BIP32 is undefined" when network list given to `HDNode` but no compatible version found (#550) +- Fixed `writePushDataInt` output to adhere to minimal data push policy (#617) + +# 2.2.0 + +**added** + +- Added `Block.calculateTarget` for difficulty calculations (#509) +- Added `Block.prototype.checkProofOfWork` (#509) +- Added `opcodes.OP_CHECKLOCKTIMEVERIFY` alias for `OP_NOP2` (#511) +- Added `script.number.[encode/decode]` for CScriptNum-encoded `Buffer`s (#516) +- Added `TransactionBuilder.prototype.setLockTime` (#507) + +**fixed** + +- Bumped `typeforce` version to fix erroneous error message from `types.Hash*bit` types (#534) + +# 2.1.4 + +**fixed** + +- script.isPubKeyHashOutput and script.isScriptHashOutput no longer allow for non-minimal data pushes (per bitcoin/bitcoin `IsStandard` policy) (#499) +- TransactionBuilder.addOutput now allows for SIGHASH_SINGLE, throwing if the contract is violated (#504) +- remove use of `const`, use ES5 only (#502) + +# 2.1.3 + +**fixed** + +- Bumped typeforce to 1.5.5 (see #493) + +# 2.1.2 + +**fixed** + +- Add missing CHANGELOG entry for 2.1.1 + +# 2.1.1 + +**changed** + +- removed use of `buffer-reverse`, dependency only kept for `bufferutils.reverse`, to be deprecated (#478) + +**fixed** + +- `isMultisigOutput` no longer allows data chunks for `m`/`n` (#482) +- `isMultisigOutput`'s `n` value must now match the number of public keys (as per bitcoin/bitcoin) (#484) + +# 2.1.0 + +From this release users should use the HDNode directly (compared to accessing `.keyPair`) when performing ECDSA operations such as `sign` or `verify`. +Ideally you shoud not have to directly access `HDNode` internals for general usage, as it can often be confusing and error prone. + +**added** + +- `ECPair.prototype.getNetwork` +- `HDNode.prototype.getNetwork`, wraps the underyling keyPair's `getNetwork` method +- `HDNode.prototype.getPublicKeyBuffer`, wraps the underyling keyPair's `getPublicKeyBuffer` method +- `HDNode.prototype.sign`, wraps the underlying keyPair's `sign` method +- `HDNode.prototype.verify`, wraps the underlying keyPair's `verify` method + +# 2.0.0 + +In this release we have strived to simplify the API, [using native types](https://github.com/bitcoinjs/bitcoinjs-lib/issues/407) wherevever possible to encourage cross-compatibility with other open source community modules. + +The `ecdsa` module has been removed in lieu of using a new ECDSA module (for performance and safety reasons) during the `2.x.y` major release. +Several other cumbersome modules have been removed, with their new independent modules recommended for usage instead for greater modularity in your projects. + +--- + +Backward incompatible changes: + +**added** + +- export `address`, for `address` based [utility functions](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/src/address.js), most compatible, just without `Address` instantiation, see #401, #444 +- export `script`, for `script` based [utility functions](https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/src/script.js), mostly compatible, just without `Script` instantiation, see #438, #444 +- export `ECPair`, a merged replacement for `ECKey`/`ECPubKey`, invalid types will throw via `typeforce` + +**changed** + +- `address.toOutputScript`, `ECPair.prototype.fromWIF` and `HDNode.prototype.fromBase58` no longer automatically detect the network, `networks.bitcoin` is always assumed unless given. +- `assert` was used for type checking, now replaced by `typeforce` +- `BIP66` compliant strict DER signature validation was added to `ECSignature.fromDER`, changing the exact exception messages slightly, see #448. + +- `new HDNode(d/Q, chainCode, network)` -> `new HDNode(keyPair, chainCode)`, now uses `ECPair` +- `HDNode.prototype.toBase58(false)` -> `HDNode.prototype.neutered().toBase58()` for exporting an extended public key +- `HDNode.prototype.toBase58(true)` -> `HDNode.prototype.toBase58()` for exporting an extended private key + +- `Transaction.prototype.hashForSignature(prevOutScript, inIndex, hashType)` -> `Transaction.prototype.hashForSignature(inIndex, prevOutScript, hashType)` +- `Transaction.prototype.addInput(hash, ...)`: `hash` could be a string, Transaction or Buffer -> `hash` can now **only** be a `Buffer`. +- `Transaction.prototype.addOutput(scriptPubKey, ...)`: `scriptPubKey ` could be a string, `Address` or a `Buffer` -> `scriptPubKey` can now **only** be a `Buffer`. +- `TransactionBuilder` API unchanged. + +**removed** + +- export `Address`, `strings` are now used, benchwith no performance loss for most use cases +- export `base58check`, use [`bs58check`](https://github.com/bitcoinjs/bs58check) instead +- export `ecdsa`, use [`ecurve`](https://github.com/cryptocoinjs/ecurve) instead +- export `ECKey`, use new export `ECPair` instead +- export `ECPubKey`, use new export `ECPair` instead +- export `Wallet`, see README.md#complementing-libraries instead +- export `Script`, use new utility export `script` instead (#438 for more information) + +- `crypto.HmacSHA256 `, use [node crypto](https://nodejs.org/api/crypto.html) instead +- `crypto.HmacSHA512 `, use [node crypto](https://nodejs.org/api/crypto.html) instead + +- `Transaction.prototype.sign`, use `TransactionBuilder.prototype.sign` +- `Transaction.prototype.signInput`, use `TransactionBuilder.prototype.sign` +- `Transaction.prototype.validateInput`, use `Transaction.prototype.hashForSignature` and `ECPair.verify` + +- `HDNode.fromBuffer`, use `HDNode.fromBase58` instead +- `HDNode.fromHex`, use `HDNode.fromBase58` instead +- `HDNode.toBuffer`, use `HDNode.prototype.toBase58` instead +- `HDNode.toHex`, use `HDNode.prototype.toBase58` instead + +- `networks.*.magic`, see the comment [here](https://github.com/bitcoinjs/bitcoinjs-lib/pull/432/files#r36715792) +- `networks.[viacoin|viacointestnet|gamerscoin|jumbucks|zetacoin]`, import these yourself (see #383/a0e6ee7) +- `networks.*.estimateFee`, out-dated + +**renamed** + +- `Message` -> `message` +- `scripts` -> `script` +- `scripts.dataOutput ` -> `script.nullDataOutput` (per [convention](https://org/en/glossary/null-data-transaction)) diff --git a/web/bitcoincashjs-lib/LICENSE b/web/bitcoincashjs-lib/LICENSE new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2017 bitcoinjs-lib contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/web/bitcoincashjs-lib/README.md b/web/bitcoincashjs-lib/README.md new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/README.md @@ -0,0 +1,3 @@ +# BitcoinCashJS (bitcoincashjs-lib) + +Fork of the amazing [bitcoinjs-lib](https://github.com/bitcoinjs/bitcoinjs-lib). diff --git a/web/bitcoincashjs-lib/package-lock.json b/web/bitcoincashjs-lib/package-lock.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/package-lock.json @@ -0,0 +1,2751 @@ +{ + "name": "@psf/bitcoincashjs-lib", + "version": "4.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@psf/bitcoincash-ops": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@psf/bitcoincash-ops/-/bitcoincash-ops-2.0.0.tgz", + "integrity": "sha512-M3PWqRpeJq6rli2NqWGbas76z9TrdGOmNuDFACBWBMctPucEAsFQY2AmyFHRSa7hEwythwvrPh9AG/n6ehmEog==" + }, + "@psf/minimaldata": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@psf/minimaldata/-/minimaldata-1.0.2.tgz", + "integrity": "sha512-mpuPpvKhOyzNp/kaU3UBtNHBbrpTJFXWFrFTDWW3zeyJ7Nr0AWIerX8EJHhYEAT8so4o7K1VoYr4F8Pz8MooNQ==", + "dev": true, + "requires": { + "@psf/bitcoincash-ops": "^2.0.0", + "pushdata-bitcoin": "^1.0.1" + }, + "dependencies": { + "pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha1-FZMdPNlnreUiBvUjqnMxrvfUOvc=", + "dev": true, + "requires": { + "bitcoin-ops": "^1.3.0" + } + } + } + }, + "@psf/pushdata-bitcoin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@psf/pushdata-bitcoin/-/pushdata-bitcoin-1.2.2.tgz", + "integrity": "sha512-e1qkZLJFU6Ldg7TMBgSkiR5U1NfpRgSIr2ppk8BeED/Q9wUc9DEVAjXfPMD65xgXdqnlyFEtLbpPMWwyydMVUQ==", + "requires": { + "@psf/bitcoincash-ops": "^2.0.0" + } + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base-x": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz", + "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bech32": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.3.tgz", + "integrity": "sha512-yuVFUvrNcoJi0sv5phmqc6P+Fl1HjRDRNOOkHY2X/3LBy2bIGNSFx4fZ95HMaXHupuS7cZR15AsvtmCIF4UEyg==" + }, + "bigi": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", + "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=" + }, + "bip39": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.6.0.tgz", + "integrity": "sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg==", + "dev": true, + "requires": { + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1", + "safe-buffer": "^5.0.1", + "unorm": "^1.3.3" + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "cb-http-client": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/cb-http-client/-/cb-http-client-0.2.3.tgz", + "integrity": "sha1-+HjtTAcKZfUassiROsJDwZHDZrs=", + "dev": true, + "requires": { + "httpify": "^1.0.0", + "typeforce": "^1.1.3", + "xtend": "^4.0.0" + } + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "coinselect": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/coinselect/-/coinselect-3.1.11.tgz", + "integrity": "sha1-4fBjvRpYgvZzXuBRm52LWsSpMJk=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "dhttp": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/dhttp/-/dhttp-2.5.0.tgz", + "integrity": "sha512-lvS8YbljAR3/dSGeqSXMKXXqwSSrIRwF2S1q+N/nLVm9/A9Mhy05CgqwokHgFL8c1nfsxSMwAVsAIqs61czB3w==", + "dev": true, + "requires": { + "http-status-codes": "^1.1.6", + "parse-headers": "^2.0.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecurve": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ecurve/-/ecurve-1.0.6.tgz", + "integrity": "sha512-/BzEjNfiSuB7jIWKcS/z8FK9jNjmEWvUV2YZ4RLSmcDtP7Lq0m6FvDuSnJpBlDpGRpfRQeTLGLBI8H+kEv0r+w==", + "requires": { + "bigi": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", + "dev": true, + "requires": { + "is-object": "~1.0.1", + "merge-descriptors": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http-status-codes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-1.3.2.tgz", + "integrity": "sha512-nDUtj0ltIt08tGi2VWSpSzNNFye0v3YSe9lX3lIqLTuVvvRiYCvs4QQBSHo0eomFYw1wlUuofurUAlTm+vHnXg==", + "dev": true + }, + "httpify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/httpify/-/httpify-1.0.0.tgz", + "integrity": "sha1-ms0dI60EJE8cCvzCC20NL0/GZ0A=", + "dev": true, + "requires": { + "promise": "^6.0.0", + "request": "^2.44.0", + "xhr": "^1.16.1" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", + "dev": true + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha1-grjbrnXieneFOItz+ddyXQ9vMyY=" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", + "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", + "yargs-unparser": "1.5.0" + } + }, + "module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz", + "integrity": "sha1-nbV0kzzLCMOnYU0VQDLAnqbzOec=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parse-headers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", + "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", + "dev": true, + "requires": { + "for-each": "^0.3.3", + "string.prototype.trim": "^1.1.2" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "dev": true + }, + "promise": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", + "dev": true, + "requires": { + "asap": "~1.0.0" + } + }, + "proxyquire": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", + "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", + "dev": true, + "requires": { + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.0", + "resolve": "~1.1.7" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", + "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.0", + "function-bind": "^1.0.2" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typeforce": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "unorm": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.5.0.tgz", + "integrity": "sha512-sMfSWoiRaXXeDZSXC+YRZ23H4xchQpwxjpw1tmfR+kgbBCaOgln4NI0LXejJIhnBuKINrB3WRn+ZI8IWssirVw==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.0.tgz", + "integrity": "sha512-pPSOFl7VLhZ7LO/SFABPraZEEurkJUWSMn3MuA/r3WQZc+Z1fqou2JqLSOZbCLl73EUIxuUVX8X4jkX2vfJeAA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "object.entries": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "varuint-bitcoin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz", + "integrity": "sha512-jCEPG+COU/1Rp84neKTyDJQr478/hAfVp5xxYn09QEH0yBjbmPeMfuuQIrp+BUD83hybtYZKhr5elV3bvdV1bA==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wif": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", + "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "requires": { + "bs58check": "<3.0.0" + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xhr": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-1.17.1.tgz", + "integrity": "sha1-BTM0nkp7uWfQvYeKlh2VBfkFLf8=", + "dev": true, + "requires": { + "global": "~4.3.0", + "once": "~1.1.1", + "parse-headers": "^2.0.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + }, + "dependencies": { + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } +} diff --git a/web/bitcoincashjs-lib/package.json b/web/bitcoincashjs-lib/package.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/package.json @@ -0,0 +1,62 @@ +{ + "name": "@psf/bitcoincashjs-lib", + "version": "4.0.2", + "description": "Client-side Bitcoin JavaScript library", + "main": "./src/index.js", + "engines": { + "node": ">=10.15.1" + }, + "keywords": [ + "bitcoinjs", + "bitcoin", + "browserify", + "javascript", + "bitcoinjs" + ], + "scripts": { + "coverage-report": "nyc report --reporter=lcov", + "coverage-html": "nyc report --reporter=html", + "coverage": "nyc --check-coverage --branches 90 --functions 90 mocha", + "integration": "mocha test/integration/", + "test": "mocha" + }, + "repository": { + "type": "git", + "url": "https://github.com/bitcoinjs/bitcoinjs-lib.git" + }, + "files": [ + "src" + ], + "dependencies": { + "bech32": "^1.1.2", + "bigi": "^1.4.0", + "bip66": "^1.1.0", + "@psf/bitcoincash-ops": "^2.0.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "ecurve": "^1.0.0", + "merkle-lib": "^2.0.10", + "@psf/pushdata-bitcoin": "^1.2.2", + "randombytes": "^2.0.1", + "safe-buffer": "^5.0.1", + "typeforce": "^1.18.0", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + }, + "devDependencies": { + "async": "^2.0.1", + "bip39": "^2.3.0", + "bs58": "^4.0.0", + "cb-http-client": "^0.2.0", + "chai": "^4.2.0", + "coinselect": "^3.1.1", + "dhttp": "^2.3.5", + "@psf/minimaldata": "^1.0.2", + "mocha": "^6.1.4", + "nyc": "^14.1.1", + "proxyquire": "^1.8.0", + "sinon": "^1.17.7" + }, + "license": "MIT" +} diff --git a/web/bitcoincashjs-lib/src/address.js b/web/bitcoincashjs-lib/src/address.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/address.js @@ -0,0 +1,124 @@ +var Buffer = require('safe-buffer').Buffer; +var bech32 = require('bech32'); +var bs58check = require('bs58check'); +var bscript = require('./script'); +var btemplates = require('./templates'); +var networks = require('./networks'); +var typeforce = require('typeforce'); +var types = require('./types'); + +function fromBase58Check(address) { + var payload = bs58check.decode(address); + + // TODO: 4.0.0, move to "toOutputScript" + if (payload.length < 21) throw new TypeError(address + ' is too short'); + if (payload.length > 21) throw new TypeError(address + ' is too long'); + + var version = payload.readUInt8(0); + var hash = payload.slice(1); + + return { version: version, hash: hash }; +} + +function fromBech32(address) { + var result = bech32.decode(address); + var data = bech32.fromWords(result.words.slice(1)); + + return { + version: result.words[0], + prefix: result.prefix, + data: Buffer.from(data), + }; +} + +function toBase58Check(hash, version) { + typeforce(types.tuple(types.Hash160bit, types.UInt8), arguments); + + var payload = Buffer.allocUnsafe(21); + payload.writeUInt8(version, 0); + hash.copy(payload, 1); + + return bs58check.encode(payload); +} + +function toBech32(data, version, prefix) { + var words = bech32.toWords(data); + words.unshift(version); + + return bech32.encode(prefix, words); +} + +function fromOutputScript(outputScript, network) { + network = network || networks.bitcoin; + + if (btemplates.pubKeyHash.output.check(outputScript)) + return toBase58Check( + bscript.compile(outputScript).slice(3, 23), + network.pubKeyHash, + ); + if (btemplates.scriptHash.output.check(outputScript)) + return toBase58Check( + bscript.compile(outputScript).slice(2, 22), + network.scriptHash, + ); + if (btemplates.witnessPubKeyHash.output.check(outputScript)) + return toBech32( + bscript.compile(outputScript).slice(2, 22), + 0, + network.bech32, + ); + if (btemplates.witnessScriptHash.output.check(outputScript)) + return toBech32( + bscript.compile(outputScript).slice(2, 34), + 0, + network.bech32, + ); + + throw new Error(bscript.toASM(outputScript) + ' has no matching Address'); +} + +function toOutputScript(address, network) { + network = network || networks.bitcoin; + + var decode; + try { + decode = fromBase58Check(address); + } catch (e) {} + + if (decode) { + if (decode.version === network.pubKeyHash) + return btemplates.pubKeyHash.output.encode(decode.hash); + if (decode.version === network.scriptHash) + return btemplates.scriptHash.output.encode(decode.hash); + } else { + try { + decode = fromBech32(address); + } catch (e) {} + + if (decode) { + if (decode.prefix !== network.bech32) + throw new Error(address + ' has an invalid prefix'); + if (decode.version === 0) { + if (decode.data.length === 20) + return btemplates.witnessPubKeyHash.output.encode( + decode.data, + ); + if (decode.data.length === 32) + return btemplates.witnessScriptHash.output.encode( + decode.data, + ); + } + } + } + + throw new Error(address + ' has no matching Script'); +} + +module.exports = { + fromBase58Check: fromBase58Check, + fromBech32: fromBech32, + fromOutputScript: fromOutputScript, + toBase58Check: toBase58Check, + toBech32: toBech32, + toOutputScript: toOutputScript, +}; diff --git a/web/bitcoincashjs-lib/src/block.js b/web/bitcoincashjs-lib/src/block.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/block.js @@ -0,0 +1,182 @@ +var Buffer = require('safe-buffer').Buffer; +var bcrypto = require('./crypto'); +var fastMerkleRoot = require('merkle-lib/fastRoot'); +var typeforce = require('typeforce'); +var types = require('./types'); +var varuint = require('varuint-bitcoin'); + +var Transaction = require('./transaction'); + +function Block() { + this.version = 1; + this.prevHash = null; + this.merkleRoot = null; + this.timestamp = 0; + this.bits = 0; + this.nonce = 0; +} + +Block.fromBuffer = function (buffer) { + if (buffer.length < 80) throw new Error('Buffer too small (< 80 bytes)'); + + var offset = 0; + function readSlice(n) { + offset += n; + return buffer.slice(offset - n, offset); + } + + function readUInt32() { + var i = buffer.readUInt32LE(offset); + offset += 4; + return i; + } + + function readInt32() { + var i = buffer.readInt32LE(offset); + offset += 4; + return i; + } + + var block = new Block(); + block.version = readInt32(); + block.prevHash = readSlice(32); + block.merkleRoot = readSlice(32); + block.timestamp = readUInt32(); + block.bits = readUInt32(); + block.nonce = readUInt32(); + + if (buffer.length === 80) return block; + + function readVarInt() { + var vi = varuint.decode(buffer, offset); + offset += varuint.decode.bytes; + return vi; + } + + function readTransaction() { + var tx = Transaction.fromBuffer(buffer.slice(offset), true); + offset += tx.byteLength(); + return tx; + } + + var nTransactions = readVarInt(); + block.transactions = []; + + for (var i = 0; i < nTransactions; ++i) { + var tx = readTransaction(); + block.transactions.push(tx); + } + + return block; +}; + +Block.prototype.byteLength = function (headersOnly) { + if (headersOnly || !this.transactions) return 80; + + return ( + 80 + + varuint.encodingLength(this.transactions.length) + + this.transactions.reduce(function (a, x) { + return a + x.byteLength(); + }, 0) + ); +}; + +Block.fromHex = function (hex) { + return Block.fromBuffer(Buffer.from(hex, 'hex')); +}; + +Block.prototype.getHash = function () { + return bcrypto.hash256(this.toBuffer(true)); +}; + +Block.prototype.getId = function () { + return this.getHash().reverse().toString('hex'); +}; + +Block.prototype.getUTCDate = function () { + var date = new Date(0); // epoch + date.setUTCSeconds(this.timestamp); + + return date; +}; + +// TODO: buffer, offset compatibility +Block.prototype.toBuffer = function (headersOnly) { + var buffer = Buffer.allocUnsafe(this.byteLength(headersOnly)); + + var offset = 0; + function writeSlice(slice) { + slice.copy(buffer, offset); + offset += slice.length; + } + + function writeInt32(i) { + buffer.writeInt32LE(i, offset); + offset += 4; + } + function writeUInt32(i) { + buffer.writeUInt32LE(i, offset); + offset += 4; + } + + writeInt32(this.version); + writeSlice(this.prevHash); + writeSlice(this.merkleRoot); + writeUInt32(this.timestamp); + writeUInt32(this.bits); + writeUInt32(this.nonce); + + if (headersOnly || !this.transactions) return buffer; + + varuint.encode(this.transactions.length, buffer, offset); + offset += varuint.encode.bytes; + + this.transactions.forEach(function (tx) { + var txSize = tx.byteLength(); // TODO: extract from toBuffer? + tx.toBuffer(buffer, offset); + offset += txSize; + }); + + return buffer; +}; + +Block.prototype.toHex = function (headersOnly) { + return this.toBuffer(headersOnly).toString('hex'); +}; + +Block.calculateTarget = function (bits) { + var exponent = ((bits & 0xff000000) >> 24) - 3; + var mantissa = bits & 0x007fffff; + var target = Buffer.alloc(32, 0); + target.writeUInt32BE(mantissa, 28 - exponent); + return target; +}; + +Block.calculateMerkleRoot = function (transactions) { + typeforce([{ getHash: types.Function }], transactions); + if (transactions.length === 0) + throw TypeError('Cannot compute merkle root for zero transactions'); + + var hashes = transactions.map(function (transaction) { + return transaction.getHash(); + }); + + return fastMerkleRoot(hashes, bcrypto.hash256); +}; + +Block.prototype.checkMerkleRoot = function () { + if (!this.transactions) return false; + + var actualMerkleRoot = Block.calculateMerkleRoot(this.transactions); + return this.merkleRoot.compare(actualMerkleRoot) === 0; +}; + +Block.prototype.checkProofOfWork = function () { + var hash = this.getHash().reverse(); + var target = Block.calculateTarget(this.bits); + + return hash.compare(target) <= 0; +}; + +module.exports = Block; diff --git a/web/bitcoincashjs-lib/src/bufferutils.js b/web/bitcoincashjs-lib/src/bufferutils.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/bufferutils.js @@ -0,0 +1,61 @@ +var pushdata = require('@psf/pushdata-bitcoin'); +var varuint = require('varuint-bitcoin'); + +// https://github.com/feross/buffer/blob/master/index.js#L1127 +function verifuint(value, max) { + if (typeof value !== 'number') + throw new Error('cannot write a non-number as a number'); + if (value < 0) + throw new Error( + 'specified a negative value for writing an unsigned value', + ); + if (value > max) throw new Error('RangeError: value out of range'); + if (Math.floor(value) !== value) + throw new Error('value has a fractional component'); +} + +function readUInt64LE(buffer, offset) { + var a = buffer.readUInt32LE(offset); + var b = buffer.readUInt32LE(offset + 4); + b *= 0x100000000; + + verifuint(b + a, 0x001fffffffffffff); + + return b + a; +} + +function writeUInt64LE(buffer, value, offset) { + verifuint(value, 0x001fffffffffffff); + + buffer.writeInt32LE(value & -1, offset); + buffer.writeUInt32LE(Math.floor(value / 0x100000000), offset + 4); + return offset + 8; +} + +// TODO: remove in 4.0.0? +function readVarInt(buffer, offset) { + var result = varuint.decode(buffer, offset); + + return { + number: result, + size: varuint.decode.bytes, + }; +} + +// TODO: remove in 4.0.0? +function writeVarInt(buffer, number, offset) { + varuint.encode(number, buffer, offset); + return varuint.encode.bytes; +} + +module.exports = { + pushDataSize: pushdata.encodingLength, + readPushDataInt: pushdata.decode, + readUInt64LE: readUInt64LE, + readVarInt: readVarInt, + varIntBuffer: varuint.encode, + varIntSize: varuint.encodingLength, + writePushDataInt: pushdata.encode, + writeUInt64LE: writeUInt64LE, + writeVarInt: writeVarInt, +}; diff --git a/web/bitcoincashjs-lib/src/crypto.js b/web/bitcoincashjs-lib/src/crypto.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/crypto.js @@ -0,0 +1,29 @@ +var createHash = require('create-hash'); + +function ripemd160(buffer) { + return createHash('rmd160').update(buffer).digest(); +} + +function sha1(buffer) { + return createHash('sha1').update(buffer).digest(); +} + +function sha256(buffer) { + return createHash('sha256').update(buffer).digest(); +} + +function hash160(buffer) { + return ripemd160(sha256(buffer)); +} + +function hash256(buffer) { + return sha256(sha256(buffer)); +} + +module.exports = { + hash160: hash160, + hash256: hash256, + ripemd160: ripemd160, + sha1: sha1, + sha256: sha256, +}; diff --git a/web/bitcoincashjs-lib/src/ecdsa.js b/web/bitcoincashjs-lib/src/ecdsa.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/ecdsa.js @@ -0,0 +1,100 @@ +var typeforce = require('typeforce'); +var types = require('./types'); + +var BigInteger = require('bigi'); +var ECSignature = require('./ecsignature'); + +var ecurve = require('ecurve'); +var secp256k1 = ecurve.getCurveByName('secp256k1'); + +var deterministicGenerateK = require('./rfc6979').deterministicGenerateK; + +var N_OVER_TWO = secp256k1.n.shiftRight(1); + +function sign(hash, d) { + typeforce(types.tuple(types.Hash256bit, types.BigInt), arguments); + + var x = d.toBuffer(32); + var e = BigInteger.fromBuffer(hash); + var n = secp256k1.n; + var G = secp256k1.G; + + var r, s; + deterministicGenerateK(hash, x, function (k) { + var Q = G.multiply(k); + + if (secp256k1.isInfinity(Q)) return false; + + r = Q.affineX.mod(n); + if (r.signum() === 0) return false; + + s = k + .modInverse(n) + .multiply(e.add(d.multiply(r))) + .mod(n); + if (s.signum() === 0) return false; + + return true; + }); + + // enforce low S values, see bip62: 'low s values in signatures' + if (s.compareTo(N_OVER_TWO) > 0) { + s = n.subtract(s); + } + + return new ECSignature(r, s); +} + +function verify(hash, signature, Q) { + typeforce( + types.tuple(types.Hash256bit, types.ECSignature, types.ECPoint), + arguments, + ); + + var n = secp256k1.n; + var G = secp256k1.G; + + var r = signature.r; + var s = signature.s; + + // 1.4.1 Enforce r and s are both integers in the interval [1, n − 1] + if (r.signum() <= 0 || r.compareTo(n) >= 0) return false; + if (s.signum() <= 0 || s.compareTo(n) >= 0) return false; + + // 1.4.2 H = Hash(M), already done by the user + // 1.4.3 e = H + var e = BigInteger.fromBuffer(hash); + + // Compute s^-1 + var sInv = s.modInverse(n); + + // 1.4.4 Compute u1 = es^−1 mod n + // u2 = rs^−1 mod n + var u1 = e.multiply(sInv).mod(n); + var u2 = r.multiply(sInv).mod(n); + + // 1.4.5 Compute R = (xR, yR) + // R = u1G + u2Q + var R = G.multiplyTwo(u1, Q, u2); + + // 1.4.5 (cont.) Enforce R is not at infinity + if (secp256k1.isInfinity(R)) return false; + + // 1.4.6 Convert the field element R.x to an integer + var xR = R.affineX; + + // 1.4.7 Set v = xR mod n + var v = xR.mod(n); + + // 1.4.8 If v = r, output "valid", and if v != r, output "invalid" + return v.equals(r); +} + +module.exports = { + deterministicGenerateK: deterministicGenerateK, + sign: sign, + verify: verify, + + // TODO: remove + __curve: secp256k1, +}; diff --git a/web/bitcoincashjs-lib/src/ecpair.js b/web/bitcoincashjs-lib/src/ecpair.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/ecpair.js @@ -0,0 +1,149 @@ +var baddress = require('./address'); +var bcrypto = require('./crypto'); +var ecdsa = require('./ecdsa'); +var schnorr = require('./schnorr'); +var randomBytes = require('randombytes'); +var typeforce = require('typeforce'); +var types = require('./types'); +var wif = require('wif'); +var ECSignature = require('./ecsignature'); + +var NETWORKS = require('./networks'); +var BigInteger = require('bigi'); + +var ecurve = require('ecurve'); +var secp256k1 = ecdsa.__curve; + +function ECPair(d, Q, options) { + if (options) { + typeforce( + { + compressed: types.maybe(types.Boolean), + network: types.maybe(types.Network), + }, + options, + ); + } + + options = options || {}; + + if (d) { + if (d.signum() <= 0) + throw new Error('Private key must be greater than 0'); + if (d.compareTo(secp256k1.n) >= 0) + throw new Error('Private key must be less than the curve order'); + if (Q) throw new TypeError('Unexpected publicKey parameter'); + + this.d = d; + } else { + typeforce(types.ECPoint, Q); + + this.__Q = Q; + } + + this.compressed = + options.compressed === undefined ? true : options.compressed; + this.network = options.network || NETWORKS.bitcoin; +} + +Object.defineProperty(ECPair.prototype, 'Q', { + get: function () { + if (!this.__Q && this.d) { + this.__Q = secp256k1.G.multiply(this.d); + } + + return this.__Q; + }, +}); + +ECPair.fromPublicKeyBuffer = function (buffer, network) { + var Q = ecurve.Point.decodeFrom(secp256k1, buffer); + + return new ECPair(null, Q, { + compressed: Q.compressed, + network: network, + }); +}; + +ECPair.fromWIF = function (string, network) { + var decoded = wif.decode(string); + var version = decoded.version; + + // list of networks? + if (types.Array(network)) { + network = network + .filter(function (x) { + return version === x.wif; + }) + .pop(); + + if (!network) throw new Error('Unknown network version'); + + // otherwise, assume a network object (or default to bitcoin) + } else { + network = network || NETWORKS.bitcoin; + + if (version !== network.wif) throw new Error('Invalid network version'); + } + + var d = BigInteger.fromBuffer(decoded.privateKey); + + return new ECPair(d, null, { + compressed: decoded.compressed, + network: network, + }); +}; + +ECPair.makeRandom = function (options) { + options = options || {}; + + var rng = options.rng || randomBytes; + + var d; + do { + var buffer = rng(32); + typeforce(types.Buffer256bit, buffer); + + d = BigInteger.fromBuffer(buffer); + } while (d.signum() <= 0 || d.compareTo(secp256k1.n) >= 0); + + return new ECPair(d, null, options); +}; + +ECPair.prototype.getAddress = function () { + return baddress.toBase58Check( + bcrypto.hash160(this.getPublicKeyBuffer()), + this.getNetwork().pubKeyHash, + ); +}; + +ECPair.prototype.getNetwork = function () { + return this.network; +}; + +ECPair.prototype.getPublicKeyBuffer = function () { + return this.Q.getEncoded(this.compressed); +}; + +ECPair.prototype.sign = function (hash, signatureAlgorithm) { + if (!this.d) throw new Error('Missing private key'); + if (!signatureAlgorithm) signatureAlgorithm = ECSignature.ECDSA; + + if (signatureAlgorithm === ECSignature.ECDSA) { + return ecdsa.sign(hash, this.d); + } else if (signatureAlgorithm === ECSignature.SCHNORR) { + return schnorr.sign(hash, this.d); + } +}; + +ECPair.prototype.toWIF = function () { + if (!this.d) throw new Error('Missing private key'); + + return wif.encode(this.network.wif, this.d.toBuffer(32), this.compressed); +}; + +ECPair.prototype.verify = function (hash, signature) { + return ecdsa.verify(hash, signature, this.Q); +}; + +module.exports = ECPair; diff --git a/web/bitcoincashjs-lib/src/ecsignature.js b/web/bitcoincashjs-lib/src/ecsignature.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/ecsignature.js @@ -0,0 +1,115 @@ +var bip66 = require('bip66'); +var typeforce = require('typeforce'); +var types = require('./types'); + +var BigInteger = require('bigi'); + +function ECSignature(r, s) { + typeforce(types.tuple(types.BigInt, types.BigInt), arguments); + + this.r = r; + this.s = s; +} + +ECSignature.ECDSA = 0x00; +ECSignature.SCHNORR = 0x01; + +ECSignature.parseCompact = function (buffer) { + typeforce(types.BufferN(65), buffer); + + var flagByte = buffer.readUInt8(0) - 27; + if (flagByte !== (flagByte & 7)) + throw new Error('Invalid signature parameter'); + + var compressed = !!(flagByte & 4); + var recoveryParam = flagByte & 3; + var signature = ECSignature.fromRSBuffer(buffer.slice(1)); + + return { + compressed: compressed, + i: recoveryParam, + signature: signature, + }; +}; + +ECSignature.fromRSBuffer = function (buffer) { + typeforce(types.BufferN(64), buffer); + + var r = BigInteger.fromBuffer(buffer.slice(0, 32)); + var s = BigInteger.fromBuffer(buffer.slice(32, 64)); + return new ECSignature(r, s); +}; + +ECSignature.fromDER = function (buffer) { + var decode = bip66.decode(buffer); + var r = BigInteger.fromDERInteger(decode.r); + var s = BigInteger.fromDERInteger(decode.s); + + return new ECSignature(r, s); +}; + +// BIP62: 1 byte hashType flag (only 0x01, 0x02, 0x03, 0x81, 0x82 and 0x83 are allowed) +ECSignature.parseScriptSignature = function (buffer) { + var hashType = buffer.readUInt8(buffer.length - 1); + var hashTypeMod = hashType & ~0xc0; + + if (hashTypeMod <= 0x00 || hashTypeMod >= 0x04) + throw new Error('Invalid hashType ' + hashType); + + return { + signature: ECSignature.fromDER(buffer.slice(0, -1)), + hashType: hashType, + }; +}; + +ECSignature.prototype.toCompact = function (i, compressed) { + if (compressed) { + i += 4; + } + + i += 27; + + var buffer = Buffer.alloc(65); + buffer.writeUInt8(i, 0); + this.toRSBuffer(buffer, 1); + return buffer; +}; + +ECSignature.prototype.toDER = function () { + var r = Buffer.from(this.r.toDERInteger()); + var s = Buffer.from(this.s.toDERInteger()); + + return bip66.encode(r, s); +}; + +ECSignature.prototype.toRSBuffer = function (buffer, offset) { + if (!offset) offset = 0; + buffer = buffer || Buffer.alloc(64); + this.r.toBuffer(32).copy(buffer, offset); + this.s.toBuffer(32).copy(buffer, offset + 32); + return buffer; +}; + +ECSignature.prototype.toScriptSignature = function ( + hashType, + signatureAlgorithm, +) { + if (!signatureAlgorithm) signatureAlgorithm = ECSignature.ECDSA; + + var hashTypeMod = hashType & ~0xc0; + if (hashTypeMod <= 0 || hashTypeMod >= 4) + throw new Error('Invalid hashType ' + hashType); + + var hashTypeBuffer = Buffer.alloc(1); + hashTypeBuffer.writeUInt8(hashType, 0); + + if (signatureAlgorithm === ECSignature.ECDSA) { + return Buffer.concat([this.toDER(), hashTypeBuffer]); + } else if (signatureAlgorithm === ECSignature.SCHNORR) { + return Buffer.concat([this.toRSBuffer(), hashTypeBuffer]); + } else { + throw new Error('Invalid signature Algorithm'); + } +}; + +module.exports = ECSignature; diff --git a/web/bitcoincashjs-lib/src/hdnode.js b/web/bitcoincashjs-lib/src/hdnode.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/hdnode.js @@ -0,0 +1,331 @@ +var Buffer = require('safe-buffer').Buffer; +var base58check = require('bs58check'); +var bcrypto = require('./crypto'); +var createHmac = require('create-hmac'); +var typeforce = require('typeforce'); +var types = require('./types'); +var NETWORKS = require('./networks'); + +var BigInteger = require('bigi'); +var ECPair = require('./ecpair'); + +var ecurve = require('ecurve'); +var curve = ecurve.getCurveByName('secp256k1'); + +function HDNode(keyPair, chainCode) { + // CT 6/18/2020 Commented this out. It causes problems with Gatsby and other + // web apps that use webpack. Somehow the keyPair comes through in a way that + // is perfectly valid, but failes the type check. + // typeforce(types.tuple('ECPair', types.Buffer256bit), arguments) + + if (!keyPair.compressed) + throw new TypeError('BIP32 only allows compressed keyPairs'); + + this.keyPair = keyPair; + this.chainCode = chainCode; + this.depth = 0; + this.index = 0; + this.parentFingerprint = 0x00000000; +} + +HDNode.HIGHEST_BIT = 0x80000000; +HDNode.LENGTH = 78; +HDNode.MASTER_SECRET = Buffer.from('Bitcoin seed', 'utf8'); + +HDNode.fromSeedBuffer = function (seed, network) { + typeforce(types.tuple(types.Buffer, types.maybe(types.Network)), arguments); + + if (seed.length < 16) + throw new TypeError('Seed should be at least 128 bits'); + if (seed.length > 64) + throw new TypeError('Seed should be at most 512 bits'); + + var I = createHmac('sha512', HDNode.MASTER_SECRET).update(seed).digest(); + var IL = I.slice(0, 32); + var IR = I.slice(32); + + // In case IL is 0 or >= n, the master key is invalid + // This is handled by the ECPair constructor + var pIL = BigInteger.fromBuffer(IL); + var keyPair = new ECPair(pIL, null, { + network: network, + }); + + return new HDNode(keyPair, IR); +}; + +HDNode.fromSeedHex = function (hex, network) { + return HDNode.fromSeedBuffer(Buffer.from(hex, 'hex'), network); +}; + +HDNode.fromBase58 = function (string, networks) { + var buffer = base58check.decode(string); + if (buffer.length !== 78) throw new Error('Invalid buffer length'); + + // 4 bytes: version bytes + var version = buffer.readUInt32BE(0); + var network; + + // list of networks? + if (Array.isArray(networks)) { + network = networks + .filter(function (x) { + return ( + version === x.bip32.private || version === x.bip32.public + ); + }) + .pop(); + + if (!network) throw new Error('Unknown network version'); + + // otherwise, assume a network object (or default to bitcoin) + } else { + network = networks || NETWORKS.bitcoin; + } + + if (version !== network.bip32.private && version !== network.bip32.public) + throw new Error('Invalid network version'); + + // 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, ... + var depth = buffer[4]; + + // 4 bytes: the fingerprint of the parent's key (0x00000000 if master key) + var parentFingerprint = buffer.readUInt32BE(5); + if (depth === 0) { + if (parentFingerprint !== 0x00000000) + throw new Error('Invalid parent fingerprint'); + } + + // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. + // This is encoded in MSB order. (0x00000000 if master key) + var index = buffer.readUInt32BE(9); + if (depth === 0 && index !== 0) throw new Error('Invalid index'); + + // 32 bytes: the chain code + var chainCode = buffer.slice(13, 45); + var keyPair; + + // 33 bytes: private key data (0x00 + k) + if (version === network.bip32.private) { + if (buffer.readUInt8(45) !== 0x00) + throw new Error('Invalid private key'); + + var d = BigInteger.fromBuffer(buffer.slice(46, 78)); + keyPair = new ECPair(d, null, { network: network }); + + // 33 bytes: public key data (0x02 + X or 0x03 + X) + } else { + var Q = ecurve.Point.decodeFrom(curve, buffer.slice(45, 78)); + // Q.compressed is assumed, if somehow this assumption is broken, `new HDNode` will throw + + // Verify that the X coordinate in the public point corresponds to a point on the curve. + // If not, the extended public key is invalid. + curve.validate(Q); + + keyPair = new ECPair(null, Q, { network: network }); + } + + var hd = new HDNode(keyPair, chainCode); + hd.depth = depth; + hd.index = index; + hd.parentFingerprint = parentFingerprint; + + return hd; +}; + +HDNode.prototype.getAddress = function () { + return this.keyPair.getAddress(); +}; + +HDNode.prototype.getIdentifier = function () { + return bcrypto.hash160(this.keyPair.getPublicKeyBuffer()); +}; + +HDNode.prototype.getFingerprint = function () { + return this.getIdentifier().slice(0, 4); +}; + +HDNode.prototype.getNetwork = function () { + return this.keyPair.getNetwork(); +}; + +HDNode.prototype.getPublicKeyBuffer = function () { + return this.keyPair.getPublicKeyBuffer(); +}; + +HDNode.prototype.neutered = function () { + var neuteredKeyPair = new ECPair(null, this.keyPair.Q, { + network: this.keyPair.network, + }); + + var neutered = new HDNode(neuteredKeyPair, this.chainCode); + neutered.depth = this.depth; + neutered.index = this.index; + neutered.parentFingerprint = this.parentFingerprint; + + return neutered; +}; + +HDNode.prototype.sign = function (hash) { + return this.keyPair.sign(hash); +}; + +HDNode.prototype.verify = function (hash, signature) { + return this.keyPair.verify(hash, signature); +}; + +HDNode.prototype.toBase58 = function (__isPrivate) { + if (__isPrivate !== undefined) + throw new TypeError('Unsupported argument in 2.0.0'); + + // Version + var network = this.keyPair.network; + var version = !this.isNeutered() + ? network.bip32.private + : network.bip32.public; + var buffer = Buffer.allocUnsafe(78); + + // 4 bytes: version bytes + buffer.writeUInt32BE(version, 0); + + // 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, .... + buffer.writeUInt8(this.depth, 4); + + // 4 bytes: the fingerprint of the parent's key (0x00000000 if master key) + buffer.writeUInt32BE(this.parentFingerprint, 5); + + // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. + // This is encoded in big endian. (0x00000000 if master key) + buffer.writeUInt32BE(this.index, 9); + + // 32 bytes: the chain code + this.chainCode.copy(buffer, 13); + + // 33 bytes: the public key or private key data + if (!this.isNeutered()) { + // 0x00 + k for private keys + buffer.writeUInt8(0, 45); + this.keyPair.d.toBuffer(32).copy(buffer, 46); + + // 33 bytes: the public key + } else { + // X9.62 encoding for public keys + this.keyPair.getPublicKeyBuffer().copy(buffer, 45); + } + + return base58check.encode(buffer); +}; + +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions +HDNode.prototype.derive = function (index) { + typeforce(types.UInt32, index); + + var isHardened = index >= HDNode.HIGHEST_BIT; + var data = Buffer.allocUnsafe(37); + + // Hardened child + if (isHardened) { + if (this.isNeutered()) + throw new TypeError('Could not derive hardened child key'); + + // data = 0x00 || ser256(kpar) || ser32(index) + data[0] = 0x00; + this.keyPair.d.toBuffer(32).copy(data, 1); + data.writeUInt32BE(index, 33); + + // Normal child + } else { + // data = serP(point(kpar)) || ser32(index) + // = serP(Kpar) || ser32(index) + this.keyPair.getPublicKeyBuffer().copy(data, 0); + data.writeUInt32BE(index, 33); + } + + var I = createHmac('sha512', this.chainCode).update(data).digest(); + var IL = I.slice(0, 32); + var IR = I.slice(32); + + var pIL = BigInteger.fromBuffer(IL); + + // In case parse256(IL) >= n, proceed with the next value for i + if (pIL.compareTo(curve.n) >= 0) { + return this.derive(index + 1); + } + + // Private parent key -> private child key + var derivedKeyPair; + if (!this.isNeutered()) { + // ki = parse256(IL) + kpar (mod n) + var ki = pIL.add(this.keyPair.d).mod(curve.n); + + // In case ki == 0, proceed with the next value for i + if (ki.signum() === 0) { + return this.derive(index + 1); + } + + derivedKeyPair = new ECPair(ki, null, { + network: this.keyPair.network, + }); + + // Public parent key -> public child key + } else { + // Ki = point(parse256(IL)) + Kpar + // = G*IL + Kpar + var Ki = curve.G.multiply(pIL).add(this.keyPair.Q); + + // In case Ki is the point at infinity, proceed with the next value for i + if (curve.isInfinity(Ki)) { + return this.derive(index + 1); + } + + derivedKeyPair = new ECPair(null, Ki, { + network: this.keyPair.network, + }); + } + + var hd = new HDNode(derivedKeyPair, IR); + hd.depth = this.depth + 1; + hd.index = index; + hd.parentFingerprint = this.getFingerprint().readUInt32BE(0); + + return hd; +}; + +HDNode.prototype.deriveHardened = function (index) { + typeforce(types.UInt31, index); + + // Only derives hardened private keys by default + return this.derive(index + HDNode.HIGHEST_BIT); +}; + +// Private === not neutered +// Public === neutered +HDNode.prototype.isNeutered = function () { + return !this.keyPair.d; +}; + +HDNode.prototype.derivePath = function (path) { + typeforce(types.BIP32Path, path); + + var splitPath = path.split('/'); + if (splitPath[0] === 'm') { + if (this.parentFingerprint) { + throw new Error('Not a master node'); + } + + splitPath = splitPath.slice(1); + } + + return splitPath.reduce(function (prevHd, indexStr) { + var index; + if (indexStr.slice(-1) === "'") { + index = parseInt(indexStr.slice(0, -1), 10); + return prevHd.deriveHardened(index); + } else { + index = parseInt(indexStr, 10); + return prevHd.derive(index); + } + }, this); +}; + +module.exports = HDNode; diff --git a/web/bitcoincashjs-lib/src/index.js b/web/bitcoincashjs-lib/src/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/index.js @@ -0,0 +1,23 @@ +var script = require('./script'); + +var templates = require('./templates'); +for (var key in templates) { + script[key] = templates[key]; +} + +module.exports = { + bufferutils: require('./bufferutils'), // TODO: remove in 4.0.0 + + Block: require('./block'), + ECPair: require('./ecpair'), + ECSignature: require('./ecsignature'), + HDNode: require('./hdnode'), + Transaction: require('./transaction'), + TransactionBuilder: require('./transaction_builder'), + + address: require('./address'), + crypto: require('./crypto'), + networks: require('./networks'), + opcodes: require('@psf/bitcoincash-ops'), + script: script, +}; diff --git a/web/bitcoincashjs-lib/src/networks.js b/web/bitcoincashjs-lib/src/networks.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/networks.js @@ -0,0 +1,37 @@ +// https://en.bitcoin.it/wiki/List_of_address_prefixes +// Dogecoin BIP32 is a proposed standard: https://bitcointalk.org/index.php?topic=409731 + +module.exports = { + bitcoin: { + messagePrefix: '\x18Bitcoin Signed Message:\n', + bech32: 'bc', + bip32: { + public: 0x0488b21e, + private: 0x0488ade4, + }, + pubKeyHash: 0x00, + scriptHash: 0x05, + wif: 0x80, + }, + testnet: { + messagePrefix: '\x18Bitcoin Signed Message:\n', + bech32: 'tb', + bip32: { + public: 0x043587cf, + private: 0x04358394, + }, + pubKeyHash: 0x6f, + scriptHash: 0xc4, + wif: 0xef, + }, + litecoin: { + messagePrefix: '\x19Litecoin Signed Message:\n', + bip32: { + public: 0x019da462, + private: 0x019d9cfe, + }, + pubKeyHash: 0x30, + scriptHash: 0x32, + wif: 0xb0, + }, +}; diff --git a/web/bitcoincashjs-lib/src/rfc6979.js b/web/bitcoincashjs-lib/src/rfc6979.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/rfc6979.js @@ -0,0 +1,75 @@ +var Buffer = require('safe-buffer').Buffer; +var createHmac = require('create-hmac'); +var BigInteger = require('bigi'); + +var typeforce = require('typeforce'); +var types = require('./types'); + +var ecurve = require('ecurve'); +var secp256k1 = ecurve.getCurveByName('secp256k1'); + +var ZERO = Buffer.alloc(1, 0); +var ONE = Buffer.alloc(1, 1); + +// https://tools.ietf.org/html/rfc6979#section-3.2 +function deterministicGenerateK(hash, x, checkSig, algo16) { + typeforce( + types.tuple(types.Hash256bit, types.Buffer256bit, types.Function), + arguments, + ); + + // Step A, ignored as hash already provided + // Step B + // Step C + var k = Buffer.alloc(32, 0); + var v = Buffer.alloc(32, 1); + + // Step D + k = createHmac('sha256', k).update(v).update(ZERO).update(x).update(hash); + + if (algo16) { + typeforce(typeforce.BufferN(16), algo16); + + k.update(algo16); + } + + k = k.digest(); + + // Step E + v = createHmac('sha256', k).update(v).digest(); + + // Step F + k = createHmac('sha256', k) + .update(v) + .update(ONE) + .update(x) + .update(hash) + .digest(); + + // Step G + v = createHmac('sha256', k).update(v).digest(); + + // Step H1/H2a, ignored as tlen === qlen (256 bit) + // Step H2b + v = createHmac('sha256', k).update(v).digest(); + + var T = BigInteger.fromBuffer(v); + + // Step H3, repeat until T is within the interval [1, n - 1] and is suitable for ECDSA + while (T.signum() <= 0 || T.compareTo(secp256k1.n) >= 0 || !checkSig(T)) { + k = createHmac('sha256', k).update(v).update(ZERO).digest(); + + v = createHmac('sha256', k).update(v).digest(); + + // Step H1/H2a, again, ignored as tlen === qlen (256 bit) + // Step H2b again + v = createHmac('sha256', k).update(v).digest(); + T = BigInteger.fromBuffer(v); + } + + return T; +} + +module.exports = { + deterministicGenerateK: deterministicGenerateK, +}; diff --git a/web/bitcoincashjs-lib/src/schnorr.js b/web/bitcoincashjs-lib/src/schnorr.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/schnorr.js @@ -0,0 +1,156 @@ +var typeforce = require('typeforce'); +var types = require('./types'); + +var BigInteger = require('bigi'); +var ECSignature = require('./ecsignature'); +var crypto = require('./crypto'); + +var ecurve = require('ecurve'); +var secp256k1 = ecurve.getCurveByName('secp256k1'); + +var deterministicGenerateK = require('./rfc6979').deterministicGenerateK; + +var USE_RFC6979 = true; +function sign(h, x) { + typeforce(types.tuple(types.BufferN(32), types.BigInt), arguments); + + var n = secp256k1.n; + var G = secp256k1.G; + + if (x.compareTo(BigInteger.ZERO) <= 0 || x.compareTo(n) >= 0) { + throw new Error('Private key x not in range'); + } + + var P = G.multiply(x); + + var r, s; + function signWithK(k) { + var R = G.multiply(k); + + // sign chosen so that the Y coordinate of R has Jacobi symbol 1 + if (jacobi(R.affineY, secp256k1.p) != 1) { + k = n.subtract(k); + R = G.multiply(k); + } + + r = R.affineX.mod(n); + + var BP = toCompressedPoint(P); + var Br = r.toBuffer(32); + + var eh = crypto.sha256(Buffer.concat([Br, BP, h])); + var e = BigInteger.fromBuffer(eh).mod(n); + + s = k.add(e.multiply(x)).mod(n); + + return true; + } + + if (USE_RFC6979) { + deterministicGenerateK( + h, + x.toBuffer(32), + signWithK, + Buffer.from('Schnorr+SHA256 ', 'ascii'), + ); + } else { + var kh = crypto.sha256(Buffer.concat([x.toBuffer(32), h])); + var k = BigInteger.fromBuffer(kh).mod(n); + signWithK(k); + } + + return new ECSignature(r, s); +} + +// https://github.com/bitcoincashorg/bitcoincash.org/blob/master/spec/2019-05-15-schnorr.md#signature-verification-algorithm +function verify(h, signature, P) { + typeforce( + types.tuple(types.BufferN(32), types.ECSignature, types.ECPoint), + arguments, + ); + + var n = secp256k1.n; + var G = secp256k1.G; + + var r = signature.r; + var s = signature.s; + + // 1. Fail if point P is not actually on the curve, or if it is the point at infinity. + if (!secp256k1.isOnCurve(P)) return false; + if (secp256k1.isInfinity(P)) return false; + + // 2. Fail if r >= p, where p is the field size used in secp256k1. + if (r.compareTo(secp256k1.p) >= 0) return false; + + // 3. Fail if s >= n, where n is the order of the secp256k1 curve. + if (s.compareTo(n) >= 0) return false; + + // 4. Let BP be the 33-byte encoding of P as a compressed point. + var BP = toCompressedPoint(P); + + // 5. Let Br be the 32-byte encoding of r as an unsigned big-endian 256-bit integer. + var Br = r.toBuffer(32); + + // 6. Compute integer e = H(Br | BP | h) mod n. + var h = crypto.sha256(Buffer.concat([Br, BP, h])); + var e = BigInteger.fromBuffer(h).mod(n); + + // 7. Compute elliptic curve point R' = sG + (-e)P, where G is the secp256k1 generator point. + var R = G.multiply(s).add(P.multiply(n.subtract(e))); + + // 8. Fail if R' is the point at infinity. + if (secp256k1.isInfinity(R)) return false; + + // 9. Fail if the X coordinate of R' is not equal to r. + if (R.affineX.compareTo(r) != 0) return false; + + // 10. Fail if the Jacobi symbol of the Y coordinate of R' is not 1. + if (jacobi(R.affineY, secp256k1.p) != 1) return false; + + // 11. Otherwise, the signature is valid + return true; +} + +function jacobi(a, p) { + return a + .modPow(p.subtract(BigInteger.ONE).divide(BigInteger.valueOf(2)), p) + .intValue(); +} + +function toCompressedPoint(P) { + typeforce(types.tuple(types.ECPoint), arguments); + + return Buffer.concat([ + Buffer.from([P.affineY.isEven() ? 0x02 : 0x03]), + P.affineX.toBuffer(32), + ]); +} + +function fromCompressedPoint(buffer) { + typeforce(types.tuple(types.BufferN(33)), arguments); + + if (buffer.length !== 33) throw new Error('Invalid length of buffer'); + if (buffer[0] !== 0x2 && buffer[0] !== 0x3) + throw new Error('Invalid signum byte'); + + var isOdd = buffer[0] === 0x3; + var x = BigInteger.fromBuffer(buffer.slice(1, 33)); + + return secp256k1.pointFromX(isOdd, x); +} + +module.exports = { + deterministicGenerateK: deterministicGenerateK, + sign: sign, + verify: verify, + + jacobi: jacobi, + toCompressedPoint: toCompressedPoint, + fromCompressedPoint: fromCompressedPoint, + + // TODO: remove + __curve: secp256k1, + __useRFC6979: function (use) { + USE_RFC6979 = use; + }, +}; diff --git a/web/bitcoincashjs-lib/src/script.js b/web/bitcoincashjs-lib/src/script.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/script.js @@ -0,0 +1,285 @@ +var Buffer = require('safe-buffer').Buffer; +var bip66 = require('bip66'); +var pushdata = require('@psf/pushdata-bitcoin'); +var typeforce = require('typeforce'); +var types = require('./types'); +var scriptNumber = require('./script_number'); + +var OPS = require('@psf/bitcoincash-ops'); +var REVERSE_OPS = require('@psf/bitcoincash-ops/map'); +var OP_INT_BASE = OPS.OP_RESERVED; // OP_1 - 1 + +function isOPInt(value) { + return ( + types.Number(value) && + (value === OPS.OP_0 || + (value >= OPS.OP_1 && value <= OPS.OP_16) || + value === OPS.OP_1NEGATE) + ); +} + +function isPushOnlyChunk(value) { + return types.Buffer(value) || isOPInt(value); +} + +function isPushOnly(value) { + return types.Array(value) && value.every(isPushOnlyChunk); +} + +// This function reaks havoc on the OP_RETURN call of an SLP transaction. +function asMinimalOP(buffer) { + if (buffer.length === 0) return OPS.OP_0; + if (buffer.length !== 1) return; + if (buffer[0] >= 1 && buffer[0] <= 16) return OP_INT_BASE + buffer[0]; + if (buffer[0] === 0x81) return OPS.OP_1NEGATE; +} + +// Originalize compile() function. This will not correctly compile some scripts, +// including the OP_RETURN for SLP tokens. Use compile2() for that. +function compile(chunks) { + // TODO: remove me + if (Buffer.isBuffer(chunks)) return chunks; + + typeforce(types.Array, chunks); + + var bufferSize = chunks.reduce(function (accum, chunk) { + // data chunk + if (Buffer.isBuffer(chunk)) { + // adhere to BIP62.3, minimal push policy + if (chunk.length === 1 && asMinimalOP(chunk) !== undefined) { + return accum + 1; + } + + return accum + pushdata.encodingLength(chunk.length) + chunk.length; + } + + // opcode + return accum + 1; + }, 0.0); + + var buffer = Buffer.allocUnsafe(bufferSize); + var offset = 0; + + chunks.forEach(function (chunk) { + // data chunk + if (Buffer.isBuffer(chunk)) { + // adhere to BIP62.3, minimal push policy + var opcode = asMinimalOP(chunk); + if (opcode !== undefined) { + buffer.writeUInt8(opcode, offset); + offset += 1; + return; + } + + offset += pushdata.encode(buffer, chunk.length, offset); + chunk.copy(buffer, offset); + offset += chunk.length; + + // opcode + } else { + buffer.writeUInt8(chunk, offset); + offset += 1; + } + }); + + if (offset !== buffer.length) throw new Error('Could not decode chunks'); + return buffer; +} + +// Compile for non-minimal Script, like for SLP OP_RETURNs. +// Expects an array of Buffers, to be compiled into a binary blob returned +// as a Buffer. This final blob is ready to used as an output of a Bitcoin +// Cash transaction. +function compile2(chunks) { + // If the chunks object is a Buffer, return it. + if (Buffer.isBuffer(chunks)) return chunks; + + // Calculate the final size the buffer should be. Allows error checking in + // case compilation goes wonky. + var bufferSize = chunks.reduce(function (accum, chunk) { + // If the chunk is of type Buffer. + if (Buffer.isBuffer(chunk)) { + // Return the final complied length this Buffer will take up. + return accum + pushdata.encodingLength(chunk.length) + chunk.length; + } + + // Otherwise the chunk object is an OP code. It will take up 1 byte. + return accum + 1; + }, 0.0); + + // buffer will hold final compiled Buffer. + var buffer = Buffer.allocUnsafe(bufferSize); + var offset = 0; + + // Loop through each element in the chunks Array. + chunks.forEach(function (chunk, index) { + // If the chunk is a Buffer and not an OP code. + if (Buffer.isBuffer(chunk)) { + // console.log(" ") + // console.log(`index: ${index}`) + // console.log(`chunk: ${chunk.toString("hex")}`) + // console.log(`original buffer: ${buffer.toString("hex")}`) + + // Calculate the offset for adding this new chunk. + offset += pushdata.encode(buffer, chunk.length, offset); + + // Copy the current chunk into the buffer. + chunk.copy(buffer, offset); + + // Calculate the new offset. + offset += chunk.length; + + // The chunk is an OP code and not a Buffer. + } else { + // Add the 1-byte OP code to the final Buffer output. + buffer.writeUInt8(chunk, offset); + offset += 1; + } + }); + + // If the calculated offset and buffer length don't match, then something + // went wrong. Throw an error. + if (offset !== buffer.length) throw new Error('Could not decode chunks'); + + // Return the final, compiled binary blog as a buffer. + return buffer; +} + +function decompile(buffer) { + // TODO: remove me + if (types.Array(buffer)) return buffer; + + typeforce(types.Buffer, buffer); + + var chunks = []; + var i = 0; + + while (i < buffer.length) { + var opcode = buffer[i]; + + // data chunk + if (opcode > OPS.OP_0 && opcode <= OPS.OP_PUSHDATA4) { + var d = pushdata.decode(buffer, i); + + // did reading a pushDataInt fail? empty script + if (d === null) return []; + i += d.size; + + // attempt to read too much data? empty script + // if (i + d.number > buffer.length) return [] + + var data = buffer.slice(i, i + d.number); + i += d.number; + + // decompile minimally + var op = asMinimalOP(data); + if (op !== undefined) { + chunks.push(op); + } else { + chunks.push(data); + } + + // opcode + } else { + chunks.push(opcode); + + i += 1; + } + } + + return chunks; +} + +function toASM(chunks) { + if (Buffer.isBuffer(chunks)) { + chunks = decompile(chunks); + } + + return chunks + .map(function (chunk) { + // data? + if (Buffer.isBuffer(chunk)) { + var op = asMinimalOP(chunk); + if (op === undefined) return chunk.toString('hex'); + chunk = op; + } + + // opcode! + return REVERSE_OPS[chunk]; + }) + .join(' '); +} + +function fromASM(asm) { + typeforce(types.String, asm); + + return compile( + asm.split(' ').map(function (chunkStr) { + // opcode? + if (OPS[chunkStr] !== undefined) return OPS[chunkStr]; + // typeforce(types.Hex, chunkStr) + + // data! + return Buffer.from(chunkStr, 'hex'); + }), + ); +} + +function toStack(chunks) { + chunks = decompile(chunks); + typeforce(isPushOnly, chunks); + + return chunks.map(function (op) { + if (Buffer.isBuffer(op)) return op; + if (op === OPS.OP_0) return Buffer.allocUnsafe(0); + + return scriptNumber.encode(op - OP_INT_BASE); + }); +} + +function isCanonicalPubKey(buffer) { + if (!Buffer.isBuffer(buffer)) return false; + if (buffer.length < 33) return false; + + switch (buffer[0]) { + case 0x02: + case 0x03: + return buffer.length === 33; + case 0x04: + return buffer.length === 65; + } + + return false; +} + +function isDefinedHashType(hashType) { + var hashTypeMod = hashType & ~0xc0; + + // return hashTypeMod > SIGHASH_ALL && hashTypeMod < SIGHASH_SINGLE + return hashTypeMod > 0x00 && hashTypeMod < 0x04; +} + +function isCanonicalSignature(buffer) { + if (!Buffer.isBuffer(buffer)) return false; + if (!isDefinedHashType(buffer[buffer.length - 1])) return false; + + if (buffer.length === 65) return true; + + return bip66.check(buffer.slice(0, -1)); +} + +module.exports = { + compile: compile, + compile2: compile2, + decompile: decompile, + fromASM: fromASM, + toASM: toASM, + toStack: toStack, + + number: require('./script_number'), + + isCanonicalPubKey: isCanonicalPubKey, + isCanonicalSignature: isCanonicalSignature, + isPushOnly: isPushOnly, + isDefinedHashType: isDefinedHashType, +}; diff --git a/web/bitcoincashjs-lib/src/script_number.js b/web/bitcoincashjs-lib/src/script_number.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/script_number.js @@ -0,0 +1,75 @@ +var Buffer = require('safe-buffer').Buffer; + +function decode(buffer, maxLength, minimal) { + maxLength = maxLength || 4; + minimal = minimal === undefined ? true : minimal; + + var length = buffer.length; + if (length === 0) return 0; + if (length > maxLength) throw new TypeError('Script number overflow'); + if (minimal) { + if ((buffer[length - 1] & 0x7f) === 0) { + if (length <= 1 || (buffer[length - 2] & 0x80) === 0) + throw new Error('Non-minimally encoded script number'); + } + } + + // 40-bit + if (length === 5) { + var a = buffer.readUInt32LE(0); + var b = buffer.readUInt8(4); + + if (b & 0x80) return -((b & ~0x80) * 0x100000000 + a); + return b * 0x100000000 + a; + } + + var result = 0; + + // 32-bit / 24-bit / 16-bit / 8-bit + for (var i = 0; i < length; ++i) { + result |= buffer[i] << (8 * i); + } + + if (buffer[length - 1] & 0x80) + return -(result & ~(0x80 << (8 * (length - 1)))); + return result; +} + +function scriptNumSize(i) { + return i > 0x7fffffff + ? 5 + : i > 0x7fffff + ? 4 + : i > 0x7fff + ? 3 + : i > 0x7f + ? 2 + : i > 0x00 + ? 1 + : 0; +} + +function encode(number) { + var value = Math.abs(number); + var size = scriptNumSize(value); + var buffer = Buffer.allocUnsafe(size); + var negative = number < 0; + + for (var i = 0; i < size; ++i) { + buffer.writeUInt8(value & 0xff, i); + value >>= 8; + } + + if (buffer[size - 1] & 0x80) { + buffer.writeUInt8(negative ? 0x80 : 0x00, size - 1); + } else if (negative) { + buffer[size - 1] |= 0x80; + } + + return buffer; +} + +module.exports = { + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/templates/index.js b/web/bitcoincashjs-lib/src/templates/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/index.js @@ -0,0 +1,75 @@ +var decompile = require('../script').decompile; +var multisig = require('./multisig'); +var nullData = require('./nulldata'); +var pubKey = require('./pubkey'); +var pubKeyHash = require('./pubkeyhash'); +var scriptHash = require('./scripthash'); +var witnessPubKeyHash = require('./witnesspubkeyhash'); +var witnessScriptHash = require('./witnessscripthash'); +var witnessCommitment = require('./witnesscommitment'); + +var types = { + MULTISIG: 'multisig', + NONSTANDARD: 'nonstandard', + NULLDATA: 'nulldata', + P2PK: 'pubkey', + P2PKH: 'pubkeyhash', + P2SH: 'scripthash', + P2WPKH: 'witnesspubkeyhash', + P2WSH: 'witnessscripthash', + WITNESS_COMMITMENT: 'witnesscommitment', +}; + +function classifyOutput(script) { + if (witnessPubKeyHash.output.check(script)) return types.P2WPKH; + if (witnessScriptHash.output.check(script)) return types.P2WSH; + if (pubKeyHash.output.check(script)) return types.P2PKH; + if (scriptHash.output.check(script)) return types.P2SH; + + // XXX: optimization, below functions .decompile before use + var chunks = decompile(script); + if (multisig.output.check(chunks)) return types.MULTISIG; + if (pubKey.output.check(chunks)) return types.P2PK; + if (witnessCommitment.output.check(chunks)) return types.WITNESS_COMMITMENT; + if (nullData.output.check(chunks)) return types.NULLDATA; + + return types.NONSTANDARD; +} + +function classifyInput(script, allowIncomplete) { + // XXX: optimization, below functions .decompile before use + var chunks = decompile(script); + + if (pubKeyHash.input.check(chunks)) return types.P2PKH; + if (scriptHash.input.check(chunks, allowIncomplete)) return types.P2SH; + if (multisig.input.check(chunks, allowIncomplete)) return types.MULTISIG; + if (pubKey.input.check(chunks)) return types.P2PK; + + return types.NONSTANDARD; +} + +function classifyWitness(script, allowIncomplete) { + // XXX: optimization, below functions .decompile before use + var chunks = decompile(script); + + if (witnessPubKeyHash.input.check(chunks)) return types.P2WPKH; + if (witnessScriptHash.input.check(chunks, allowIncomplete)) + return types.P2WSH; + + return types.NONSTANDARD; +} + +module.exports = { + classifyInput: classifyInput, + classifyOutput: classifyOutput, + classifyWitness: classifyWitness, + multisig: multisig, + nullData: nullData, + pubKey: pubKey, + pubKeyHash: pubKeyHash, + scriptHash: scriptHash, + witnessPubKeyHash: witnessPubKeyHash, + witnessScriptHash: witnessScriptHash, + witnessCommitment: witnessCommitment, + types: types, +}; diff --git a/web/bitcoincashjs-lib/src/templates/multisig/index.js b/web/bitcoincashjs-lib/src/templates/multisig/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/multisig/index.js @@ -0,0 +1,4 @@ +module.exports = { + input: require('./input'), + output: require('./output'), +}; diff --git a/web/bitcoincashjs-lib/src/templates/multisig/input.js b/web/bitcoincashjs-lib/src/templates/multisig/input.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/multisig/input.js @@ -0,0 +1,77 @@ +// OP_0 [signatures ...] + +var Buffer = require('safe-buffer').Buffer; +var bscript = require('../../script'); +var p2mso = require('./output'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +function partialSignature(value) { + return value === OPS.OP_0 || bscript.isCanonicalSignature(value); +} + +function check(script, allowIncomplete) { + var chunks = bscript.decompile(script); + if (chunks.length < 2) return false; + if (chunks[0] !== OPS.OP_0) return false; + + if (allowIncomplete) { + return chunks.slice(1).every(partialSignature); + } + + return chunks.slice(1).every(bscript.isCanonicalSignature); +} +check.toJSON = function () { + return 'multisig input'; +}; + +var EMPTY_BUFFER = Buffer.allocUnsafe(0); + +function encodeStack(signatures, scriptPubKey) { + typeforce([partialSignature], signatures); + + if (scriptPubKey) { + var scriptData = p2mso.decode(scriptPubKey); + + if (signatures.length < scriptData.m) { + throw new TypeError('Not enough signatures provided'); + } + + if (signatures.length > scriptData.pubKeys.length) { + throw new TypeError('Too many signatures provided'); + } + } + + return [].concat( + EMPTY_BUFFER, + signatures.map(function (sig) { + if (sig === OPS.OP_0) { + return EMPTY_BUFFER; + } + return sig; + }), + ); +} + +function encode(signatures, scriptPubKey) { + return bscript.compile(encodeStack(signatures, scriptPubKey)); +} + +function decodeStack(stack, allowIncomplete) { + typeforce(typeforce.Array, stack); + typeforce(check, stack, allowIncomplete); + return stack.slice(1); +} + +function decode(buffer, allowIncomplete) { + var stack = bscript.decompile(buffer); + return decodeStack(stack, allowIncomplete); +} + +module.exports = { + check: check, + decode: decode, + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack, +}; diff --git a/web/bitcoincashjs-lib/src/templates/multisig/output.js b/web/bitcoincashjs-lib/src/templates/multisig/output.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/multisig/output.js @@ -0,0 +1,71 @@ +// m [pubKeys ...] n OP_CHECKMULTISIG + +var bscript = require('../../script'); +var types = require('../../types'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); +var OP_INT_BASE = OPS.OP_RESERVED; // OP_1 - 1 + +function check(script, allowIncomplete) { + var chunks = bscript.decompile(script); + + if (chunks.length < 4) return false; + if (chunks[chunks.length - 1] !== OPS.OP_CHECKMULTISIG) return false; + if (!types.Number(chunks[0])) return false; + if (!types.Number(chunks[chunks.length - 2])) return false; + var m = chunks[0] - OP_INT_BASE; + var n = chunks[chunks.length - 2] - OP_INT_BASE; + + if (m <= 0) return false; + if (n > 16) return false; + if (m > n) return false; + if (n !== chunks.length - 3) return false; + if (allowIncomplete) return true; + + var keys = chunks.slice(1, -2); + return keys.every(bscript.isCanonicalPubKey); +} +check.toJSON = function () { + return 'multi-sig output'; +}; + +function encode(m, pubKeys) { + typeforce( + { + m: types.Number, + pubKeys: [bscript.isCanonicalPubKey], + }, + { + m: m, + pubKeys: pubKeys, + }, + ); + + var n = pubKeys.length; + if (n < m) throw new TypeError('Not enough pubKeys provided'); + + return bscript.compile( + [].concat( + OP_INT_BASE + m, + pubKeys, + OP_INT_BASE + n, + OPS.OP_CHECKMULTISIG, + ), + ); +} + +function decode(buffer, allowIncomplete) { + var chunks = bscript.decompile(buffer); + typeforce(check, chunks, allowIncomplete); + + return { + m: chunks[0] - OP_INT_BASE, + pubKeys: chunks.slice(1, -2), + }; +} + +module.exports = { + check: check, + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/templates/nulldata.js b/web/bitcoincashjs-lib/src/templates/nulldata.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/nulldata.js @@ -0,0 +1,35 @@ +// OP_RETURN {data} + +var bscript = require('../script'); +var types = require('../types'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +function check(script) { + var buffer = bscript.compile(script); + + return buffer.length > 1 && buffer[0] === OPS.OP_RETURN; +} +check.toJSON = function () { + return 'null data output'; +}; + +function encode(data) { + typeforce(types.Buffer, data); + + return bscript.compile([OPS.OP_RETURN, data]); +} + +function decode(buffer) { + typeforce(check, buffer); + + return buffer.slice(2); +} + +module.exports = { + output: { + check: check, + decode: decode, + encode: encode, + }, +}; diff --git a/web/bitcoincashjs-lib/src/templates/pubkey/index.js b/web/bitcoincashjs-lib/src/templates/pubkey/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/pubkey/index.js @@ -0,0 +1,4 @@ +module.exports = { + input: require('./input'), + output: require('./output'), +}; diff --git a/web/bitcoincashjs-lib/src/templates/pubkey/input.js b/web/bitcoincashjs-lib/src/templates/pubkey/input.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/pubkey/input.js @@ -0,0 +1,41 @@ +// {signature} + +var bscript = require('../../script'); +var typeforce = require('typeforce'); + +function check(script) { + var chunks = bscript.decompile(script); + + return chunks.length === 1 && bscript.isCanonicalSignature(chunks[0]); +} +check.toJSON = function () { + return 'pubKey input'; +}; + +function encodeStack(signature) { + typeforce(bscript.isCanonicalSignature, signature); + return [signature]; +} + +function encode(signature) { + return bscript.compile(encodeStack(signature)); +} + +function decodeStack(stack) { + typeforce(typeforce.Array, stack); + typeforce(check, stack); + return stack[0]; +} + +function decode(buffer) { + var stack = bscript.decompile(buffer); + return decodeStack(stack); +} + +module.exports = { + check: check, + decode: decode, + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack, +}; diff --git a/web/bitcoincashjs-lib/src/templates/pubkey/output.js b/web/bitcoincashjs-lib/src/templates/pubkey/output.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/pubkey/output.js @@ -0,0 +1,37 @@ +// {pubKey} OP_CHECKSIG + +var bscript = require('../../script'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +function check(script) { + var chunks = bscript.decompile(script); + + return ( + chunks.length === 2 && + bscript.isCanonicalPubKey(chunks[0]) && + chunks[1] === OPS.OP_CHECKSIG + ); +} +check.toJSON = function () { + return 'pubKey output'; +}; + +function encode(pubKey) { + typeforce(bscript.isCanonicalPubKey, pubKey); + + return bscript.compile([pubKey, OPS.OP_CHECKSIG]); +} + +function decode(buffer) { + var chunks = bscript.decompile(buffer); + typeforce(check, chunks); + + return chunks[0]; +} + +module.exports = { + check: check, + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/templates/pubkeyhash/index.js b/web/bitcoincashjs-lib/src/templates/pubkeyhash/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/pubkeyhash/index.js @@ -0,0 +1,4 @@ +module.exports = { + input: require('./input'), + output: require('./output'), +}; diff --git a/web/bitcoincashjs-lib/src/templates/pubkeyhash/input.js b/web/bitcoincashjs-lib/src/templates/pubkeyhash/input.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/pubkeyhash/input.js @@ -0,0 +1,59 @@ +// {signature} {pubKey} + +var bscript = require('../../script'); +var typeforce = require('typeforce'); + +function check(script) { + var chunks = bscript.decompile(script); + + return ( + chunks.length === 2 && + bscript.isCanonicalSignature(chunks[0]) && + bscript.isCanonicalPubKey(chunks[1]) + ); +} +check.toJSON = function () { + return 'pubKeyHash input'; +}; + +function encodeStack(signature, pubKey) { + typeforce( + { + signature: bscript.isCanonicalSignature, + pubKey: bscript.isCanonicalPubKey, + }, + { + signature: signature, + pubKey: pubKey, + }, + ); + + return [signature, pubKey]; +} + +function encode(signature, pubKey) { + return bscript.compile(encodeStack(signature, pubKey)); +} + +function decodeStack(stack) { + typeforce(typeforce.Array, stack); + typeforce(check, stack); + + return { + signature: stack[0], + pubKey: stack[1], + }; +} + +function decode(buffer) { + var stack = bscript.decompile(buffer); + return decodeStack(stack); +} + +module.exports = { + check: check, + decode: decode, + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack, +}; diff --git a/web/bitcoincashjs-lib/src/templates/pubkeyhash/output.js b/web/bitcoincashjs-lib/src/templates/pubkeyhash/output.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/pubkeyhash/output.js @@ -0,0 +1,46 @@ +// OP_DUP OP_HASH160 {pubKeyHash} OP_EQUALVERIFY OP_CHECKSIG + +var bscript = require('../../script'); +var types = require('../../types'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +function check(script) { + var buffer = bscript.compile(script); + + return ( + buffer.length === 25 && + buffer[0] === OPS.OP_DUP && + buffer[1] === OPS.OP_HASH160 && + buffer[2] === 0x14 && + buffer[23] === OPS.OP_EQUALVERIFY && + buffer[24] === OPS.OP_CHECKSIG + ); +} +check.toJSON = function () { + return 'pubKeyHash output'; +}; + +function encode(pubKeyHash) { + typeforce(types.Hash160bit, pubKeyHash); + + return bscript.compile([ + OPS.OP_DUP, + OPS.OP_HASH160, + pubKeyHash, + OPS.OP_EQUALVERIFY, + OPS.OP_CHECKSIG, + ]); +} + +function decode(buffer) { + typeforce(check, buffer); + + return buffer.slice(3, 23); +} + +module.exports = { + check: check, + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/templates/scripthash/index.js b/web/bitcoincashjs-lib/src/templates/scripthash/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/scripthash/index.js @@ -0,0 +1,4 @@ +module.exports = { + input: require('./input'), + output: require('./output'), +}; diff --git a/web/bitcoincashjs-lib/src/templates/scripthash/input.js b/web/bitcoincashjs-lib/src/templates/scripthash/input.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/scripthash/input.js @@ -0,0 +1,100 @@ +// {serialized scriptPubKey script} + +var Buffer = require('safe-buffer').Buffer; +var bscript = require('../../script'); +var typeforce = require('typeforce'); + +var p2ms = require('../multisig/'); +var p2pk = require('../pubkey/'); +var p2pkh = require('../pubkeyhash/'); +var p2wpkho = require('../witnesspubkeyhash/output'); +var p2wsho = require('../witnessscripthash/output'); + +function check(script, allowIncomplete) { + var chunks = bscript.decompile(script); + if (chunks.length < 1) return false; + + var lastChunk = chunks[chunks.length - 1]; + if (!Buffer.isBuffer(lastChunk)) return false; + + var scriptSigChunks = bscript.decompile( + bscript.compile(chunks.slice(0, -1)), + ); + var redeemScriptChunks = bscript.decompile(lastChunk); + + // is redeemScript a valid script? + if (redeemScriptChunks.length === 0) return false; + + // is redeemScriptSig push only? + if (!bscript.isPushOnly(scriptSigChunks)) return false; + + // is witness? + if (chunks.length === 1) { + return ( + p2wsho.check(redeemScriptChunks) || + p2wpkho.check(redeemScriptChunks) + ); + } + + // match types + if ( + p2pkh.input.check(scriptSigChunks) && + p2pkh.output.check(redeemScriptChunks) + ) + return true; + + if ( + p2ms.input.check(scriptSigChunks, allowIncomplete) && + p2ms.output.check(redeemScriptChunks) + ) + return true; + + if ( + p2pk.input.check(scriptSigChunks) && + p2pk.output.check(redeemScriptChunks) + ) + return true; + + return false; +} +check.toJSON = function () { + return 'scriptHash input'; +}; + +function encodeStack(redeemScriptStack, redeemScript) { + var serializedScriptPubKey = bscript.compile(redeemScript); + + return [].concat(redeemScriptStack, serializedScriptPubKey); +} + +function encode(redeemScriptSig, redeemScript) { + var redeemScriptStack = bscript.decompile(redeemScriptSig); + + return bscript.compile(encodeStack(redeemScriptStack, redeemScript)); +} + +function decodeStack(stack) { + typeforce(typeforce.Array, stack); + typeforce(check, stack); + + return { + redeemScriptStack: stack.slice(0, -1), + redeemScript: stack[stack.length - 1], + }; +} + +function decode(buffer) { + var stack = bscript.decompile(buffer); + var result = decodeStack(stack); + result.redeemScriptSig = bscript.compile(result.redeemScriptStack); + delete result.redeemScriptStack; + return result; +} + +module.exports = { + check: check, + decode: decode, + decodeStack: decodeStack, + encode: encode, + encodeStack: encodeStack, +}; diff --git a/web/bitcoincashjs-lib/src/templates/scripthash/output.js b/web/bitcoincashjs-lib/src/templates/scripthash/output.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/scripthash/output.js @@ -0,0 +1,38 @@ +// OP_HASH160 {scriptHash} OP_EQUAL + +var bscript = require('../../script'); +var types = require('../../types'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +function check(script) { + var buffer = bscript.compile(script); + + return ( + buffer.length === 23 && + buffer[0] === OPS.OP_HASH160 && + buffer[1] === 0x14 && + buffer[22] === OPS.OP_EQUAL + ); +} +check.toJSON = function () { + return 'scriptHash output'; +}; + +function encode(scriptHash) { + typeforce(types.Hash160bit, scriptHash); + + return bscript.compile([OPS.OP_HASH160, scriptHash, OPS.OP_EQUAL]); +} + +function decode(buffer) { + typeforce(check, buffer); + + return buffer.slice(2, 22); +} + +module.exports = { + check: check, + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnesscommitment/index.js b/web/bitcoincashjs-lib/src/templates/witnesscommitment/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnesscommitment/index.js @@ -0,0 +1,3 @@ +module.exports = { + output: require('./output'), +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnesscommitment/output.js b/web/bitcoincashjs-lib/src/templates/witnesscommitment/output.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnesscommitment/output.js @@ -0,0 +1,46 @@ +// OP_RETURN {aa21a9ed} {commitment} + +var Buffer = require('safe-buffer').Buffer; +var bscript = require('../../script'); +var types = require('../../types'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +var HEADER = Buffer.from('aa21a9ed', 'hex'); + +function check(script) { + var buffer = bscript.compile(script); + + return ( + buffer.length > 37 && + buffer[0] === OPS.OP_RETURN && + buffer[1] === 0x24 && + buffer.slice(2, 6).equals(HEADER) + ); +} + +check.toJSON = function () { + return 'Witness commitment output'; +}; + +function encode(commitment) { + typeforce(types.Hash256bit, commitment); + + var buffer = Buffer.allocUnsafe(36); + HEADER.copy(buffer, 0); + commitment.copy(buffer, 4); + + return bscript.compile([OPS.OP_RETURN, buffer]); +} + +function decode(buffer) { + typeforce(check, buffer); + + return bscript.decompile(buffer)[1].slice(4, 36); +} + +module.exports = { + check: check, + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/index.js b/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/index.js @@ -0,0 +1,4 @@ +module.exports = { + input: require('./input'), + output: require('./output'), +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/input.js b/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/input.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/input.js @@ -0,0 +1,52 @@ +// {signature} {pubKey} + +var bscript = require('../../script'); +var typeforce = require('typeforce'); + +function isCompressedCanonicalPubKey(pubKey) { + return bscript.isCanonicalPubKey(pubKey) && pubKey.length === 33; +} + +function check(script) { + var chunks = bscript.decompile(script); + + return ( + chunks.length === 2 && + bscript.isCanonicalSignature(chunks[0]) && + isCompressedCanonicalPubKey(chunks[1]) + ); +} +check.toJSON = function () { + return 'witnessPubKeyHash input'; +}; + +function encodeStack(signature, pubKey) { + typeforce( + { + signature: bscript.isCanonicalSignature, + pubKey: isCompressedCanonicalPubKey, + }, + { + signature: signature, + pubKey: pubKey, + }, + ); + + return [signature, pubKey]; +} + +function decodeStack(stack) { + typeforce(typeforce.Array, stack); + typeforce(check, stack); + + return { + signature: stack[0], + pubKey: stack[1], + }; +} + +module.exports = { + check: check, + decodeStack: decodeStack, + encodeStack: encodeStack, +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/output.js b/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/output.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnesspubkeyhash/output.js @@ -0,0 +1,33 @@ +// OP_0 {pubKeyHash} + +var bscript = require('../../script'); +var types = require('../../types'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +function check(script) { + var buffer = bscript.compile(script); + + return buffer.length === 22 && buffer[0] === OPS.OP_0 && buffer[1] === 0x14; +} +check.toJSON = function () { + return 'Witness pubKeyHash output'; +}; + +function encode(pubKeyHash) { + typeforce(types.Hash160bit, pubKeyHash); + + return bscript.compile([OPS.OP_0, pubKeyHash]); +} + +function decode(buffer) { + typeforce(check, buffer); + + return buffer.slice(2); +} + +module.exports = { + check: check, + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnessscripthash/index.js b/web/bitcoincashjs-lib/src/templates/witnessscripthash/index.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnessscripthash/index.js @@ -0,0 +1,4 @@ +module.exports = { + input: require('./input'), + output: require('./output'), +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnessscripthash/input.js b/web/bitcoincashjs-lib/src/templates/witnessscripthash/input.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnessscripthash/input.js @@ -0,0 +1,78 @@ +// {serialized scriptPubKey script} + +var bscript = require('../../script'); +var types = require('../../types'); +var typeforce = require('typeforce'); + +var p2ms = require('../multisig/'); +var p2pk = require('../pubkey/'); +var p2pkh = require('../pubkeyhash/'); + +function check(chunks, allowIncomplete) { + typeforce(types.Array, chunks); + if (chunks.length < 1) return false; + + var witnessScript = chunks[chunks.length - 1]; + if (!Buffer.isBuffer(witnessScript)) return false; + + var witnessScriptChunks = bscript.decompile(witnessScript); + + // is witnessScript a valid script? + if (witnessScriptChunks.length === 0) return false; + + var witnessRawScriptSig = bscript.compile(chunks.slice(0, -1)); + + // match types + if ( + p2pkh.input.check(witnessRawScriptSig) && + p2pkh.output.check(witnessScriptChunks) + ) + return true; + + if ( + p2ms.input.check(witnessRawScriptSig, allowIncomplete) && + p2ms.output.check(witnessScriptChunks) + ) + return true; + + if ( + p2pk.input.check(witnessRawScriptSig) && + p2pk.output.check(witnessScriptChunks) + ) + return true; + + return false; +} +check.toJSON = function () { + return 'witnessScriptHash input'; +}; + +function encodeStack(witnessData, witnessScript) { + typeforce( + { + witnessData: [types.Buffer], + witnessScript: types.Buffer, + }, + { + witnessData: witnessData, + witnessScript: witnessScript, + }, + ); + + return [].concat(witnessData, witnessScript); +} + +function decodeStack(stack) { + typeforce(typeforce.Array, stack); + typeforce(check, stack); + return { + witnessData: stack.slice(0, -1), + witnessScript: stack[stack.length - 1], + }; +} + +module.exports = { + check: check, + decodeStack: decodeStack, + encodeStack: encodeStack, +}; diff --git a/web/bitcoincashjs-lib/src/templates/witnessscripthash/output.js b/web/bitcoincashjs-lib/src/templates/witnessscripthash/output.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/templates/witnessscripthash/output.js @@ -0,0 +1,33 @@ +// OP_0 {scriptHash} + +var bscript = require('../../script'); +var types = require('../../types'); +var typeforce = require('typeforce'); +var OPS = require('@psf/bitcoincash-ops'); + +function check(script) { + var buffer = bscript.compile(script); + + return buffer.length === 34 && buffer[0] === OPS.OP_0 && buffer[1] === 0x20; +} +check.toJSON = function () { + return 'Witness scriptHash output'; +}; + +function encode(scriptHash) { + typeforce(types.Hash256bit, scriptHash); + + return bscript.compile([OPS.OP_0, scriptHash]); +} + +function decode(buffer) { + typeforce(check, buffer); + + return buffer.slice(2); +} + +module.exports = { + check: check, + decode: decode, + encode: encode, +}; diff --git a/web/bitcoincashjs-lib/src/transaction.js b/web/bitcoincashjs-lib/src/transaction.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/transaction.js @@ -0,0 +1,623 @@ +var Buffer = require('safe-buffer').Buffer; +var bcrypto = require('./crypto'); +var bscript = require('./script'); +var bufferutils = require('./bufferutils'); +var opcodes = require('@psf/bitcoincash-ops'); +var typeforce = require('typeforce'); +var types = require('./types'); +var varuint = require('varuint-bitcoin'); + +function varSliceSize(someScript) { + var length = someScript.length; + + return varuint.encodingLength(length) + length; +} + +function vectorSize(someVector) { + var length = someVector.length; + + return ( + varuint.encodingLength(length) + + someVector.reduce(function (sum, witness) { + return sum + varSliceSize(witness); + }, 0) + ); +} + +function Transaction() { + this.version = 2; + this.locktime = 0; + this.ins = []; + this.outs = []; +} + +Transaction.DEFAULT_SEQUENCE = 0xffffffff; +Transaction.SIGHASH_ALL = 0x01; +Transaction.SIGHASH_NONE = 0x02; +Transaction.SIGHASH_SINGLE = 0x03; +Transaction.SIGHASH_ANYONECANPAY = 0x80; +Transaction.SIGHASH_BITCOINCASHBIP143 = 0x40; +Transaction.ADVANCED_TRANSACTION_MARKER = 0x00; +Transaction.ADVANCED_TRANSACTION_FLAG = 0x01; + +var EMPTY_SCRIPT = Buffer.allocUnsafe(0); +var EMPTY_WITNESS = []; +var ZERO = Buffer.from( + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex', +); +var ONE = Buffer.from( + '0000000000000000000000000000000000000000000000000000000000000001', + 'hex', +); +var VALUE_UINT64_MAX = Buffer.from('ffffffffffffffff', 'hex'); +var BLANK_OUTPUT = { + script: EMPTY_SCRIPT, + valueBuffer: VALUE_UINT64_MAX, +}; + +Transaction.fromBuffer = function (buffer, __noStrict) { + var offset = 0; + function readSlice(n) { + offset += n; + return buffer.slice(offset - n, offset); + } + + function readUInt32() { + var i = buffer.readUInt32LE(offset); + offset += 4; + return i; + } + + function readInt32() { + var i = buffer.readInt32LE(offset); + offset += 4; + return i; + } + + function readUInt64() { + var i = bufferutils.readUInt64LE(buffer, offset); + offset += 8; + return i; + } + + function readVarInt() { + var vi = varuint.decode(buffer, offset); + offset += varuint.decode.bytes; + return vi; + } + + function readVarSlice() { + return readSlice(readVarInt()); + } + + function readVector() { + var count = readVarInt(); + var vector = []; + for (var i = 0; i < count; i++) vector.push(readVarSlice()); + return vector; + } + + var tx = new Transaction(); + tx.version = readInt32(); + + var marker = buffer.readUInt8(offset); + var flag = buffer.readUInt8(offset + 1); + + var hasWitnesses = false; + if ( + marker === Transaction.ADVANCED_TRANSACTION_MARKER && + flag === Transaction.ADVANCED_TRANSACTION_FLAG + ) { + offset += 2; + hasWitnesses = true; + } + + var vinLen = readVarInt(); + for (var i = 0; i < vinLen; ++i) { + tx.ins.push({ + hash: readSlice(32), + index: readUInt32(), + script: readVarSlice(), + sequence: readUInt32(), + witness: EMPTY_WITNESS, + }); + } + + var voutLen = readVarInt(); + for (i = 0; i < voutLen; ++i) { + tx.outs.push({ + value: readUInt64(), + script: readVarSlice(), + }); + } + + if (hasWitnesses) { + for (i = 0; i < vinLen; ++i) { + tx.ins[i].witness = readVector(); + } + + // was this pointless? + if (!tx.hasWitnesses()) + throw new Error('Transaction has superfluous witness data'); + } + + tx.locktime = readUInt32(); + + if (__noStrict) return tx; + if (offset !== buffer.length) + throw new Error('Transaction has unexpected data'); + + return tx; +}; + +Transaction.fromHex = function (hex) { + return Transaction.fromBuffer(Buffer.from(hex, 'hex')); +}; + +Transaction.isCoinbaseHash = function (buffer) { + typeforce(types.Hash256bit, buffer); + for (var i = 0; i < 32; ++i) { + if (buffer[i] !== 0) return false; + } + return true; +}; + +Transaction.prototype.isCoinbase = function () { + return ( + this.ins.length === 1 && Transaction.isCoinbaseHash(this.ins[0].hash) + ); +}; + +Transaction.prototype.addInput = function (hash, index, sequence, scriptSig) { + typeforce( + types.tuple( + types.Hash256bit, + types.UInt32, + types.maybe(types.UInt32), + types.maybe(types.Buffer), + ), + arguments, + ); + + if (types.Null(sequence)) { + sequence = Transaction.DEFAULT_SEQUENCE; + } + + // Add the input and return the input's index + return ( + this.ins.push({ + hash: hash, + index: index, + script: scriptSig || EMPTY_SCRIPT, + sequence: sequence, + witness: EMPTY_WITNESS, + }) - 1 + ); +}; + +Transaction.prototype.addOutput = function (scriptPubKey, value) { + typeforce(types.tuple(types.Buffer, types.Satoshi), arguments); + + // Add the output and return the output's index + return ( + this.outs.push({ + script: scriptPubKey, + value: value, + }) - 1 + ); +}; + +Transaction.prototype.hasWitnesses = function () { + return this.ins.some(function (x) { + return x.witness.length !== 0; + }); +}; + +Transaction.prototype.weight = function () { + var base = this.__byteLength(false); + var total = this.__byteLength(true); + return base * 3 + total; +}; + +Transaction.prototype.virtualSize = function () { + return Math.ceil(this.weight() / 4); +}; + +Transaction.prototype.byteLength = function () { + return this.__byteLength(true); +}; + +Transaction.prototype.__byteLength = function (__allowWitness) { + var hasWitnesses = __allowWitness && this.hasWitnesses(); + + return ( + (hasWitnesses ? 10 : 8) + + varuint.encodingLength(this.ins.length) + + varuint.encodingLength(this.outs.length) + + this.ins.reduce(function (sum, input) { + return sum + 40 + varSliceSize(input.script); + }, 0) + + this.outs.reduce(function (sum, output) { + return sum + 8 + varSliceSize(output.script); + }, 0) + + (hasWitnesses + ? this.ins.reduce(function (sum, input) { + return sum + vectorSize(input.witness); + }, 0) + : 0) + ); +}; + +Transaction.prototype.clone = function () { + var newTx = new Transaction(); + newTx.version = this.version; + newTx.locktime = this.locktime; + + newTx.ins = this.ins.map(function (txIn) { + return { + hash: txIn.hash, + index: txIn.index, + script: txIn.script, + sequence: txIn.sequence, + witness: txIn.witness, + }; + }); + + newTx.outs = this.outs.map(function (txOut) { + return { + script: txOut.script, + value: txOut.value, + }; + }); + + return newTx; +}; + +/** + * Hash transaction for signing a specific input. + * + * Bitcoin uses a different hash for each signed transaction input. + * This method copies the transaction, makes the necessary changes based on the + * hashType, and then hashes the result. + * This hash can then be used to sign the provided transaction input. + */ +Transaction.prototype.hashForSignature = function ( + inIndex, + prevOutScript, + hashType, +) { + typeforce( + types.tuple(types.UInt32, types.Buffer, /* types.UInt8 */ types.Number), + arguments, + ); + + // https://github.com/bitcoin/bitcoin/blob/master/src/test/sighash_tests.cpp#L29 + if (inIndex >= this.ins.length) return ONE; + + // ignore OP_CODESEPARATOR + var ourScript = bscript.compile( + bscript.decompile(prevOutScript).filter(function (x) { + return x !== opcodes.OP_CODESEPARATOR; + }), + ); + + var txTmp = this.clone(); + + // SIGHASH_NONE: ignore all outputs? (wildcard payee) + if ((hashType & 0x1f) === Transaction.SIGHASH_NONE) { + txTmp.outs = []; + + // ignore sequence numbers (except at inIndex) + txTmp.ins.forEach(function (input, i) { + if (i === inIndex) return; + + input.sequence = 0; + }); + + // SIGHASH_SINGLE: ignore all outputs, except at the same index? + } else if ((hashType & 0x1f) === Transaction.SIGHASH_SINGLE) { + // https://github.com/bitcoin/bitcoin/blob/master/src/test/sighash_tests.cpp#L60 + if (inIndex >= this.outs.length) return ONE; + + // truncate outputs after + txTmp.outs.length = inIndex + 1; + + // "blank" outputs before + for (var i = 0; i < inIndex; i++) { + txTmp.outs[i] = BLANK_OUTPUT; + } + + // ignore sequence numbers (except at inIndex) + txTmp.ins.forEach(function (input, y) { + if (y === inIndex) return; + + input.sequence = 0; + }); + } + + // SIGHASH_ANYONECANPAY: ignore inputs entirely? + if (hashType & Transaction.SIGHASH_ANYONECANPAY) { + txTmp.ins = [txTmp.ins[inIndex]]; + txTmp.ins[0].script = ourScript; + + // SIGHASH_ALL: only ignore input scripts + } else { + // "blank" others input scripts + txTmp.ins.forEach(function (input) { + input.script = EMPTY_SCRIPT; + }); + txTmp.ins[inIndex].script = ourScript; + } + + // serialize and hash + var buffer = Buffer.allocUnsafe(txTmp.__byteLength(false) + 4); + buffer.writeInt32LE(hashType, buffer.length - 4); + txTmp.__toBuffer(buffer, 0, false); + + return bcrypto.hash256(buffer); +}; + +Transaction.prototype.hashForWitnessV0 = function ( + inIndex, + prevOutScript, + value, + hashType, +) { + typeforce( + types.tuple(types.UInt32, types.Buffer, types.Satoshi, types.UInt32), + arguments, + ); + + var tbuffer, toffset; + function writeSlice(slice) { + toffset += slice.copy(tbuffer, toffset); + } + function writeUInt32(i) { + toffset = tbuffer.writeUInt32LE(i, toffset); + } + function writeUInt64(i) { + toffset = bufferutils.writeUInt64LE(tbuffer, i, toffset); + } + function writeVarInt(i) { + varuint.encode(i, tbuffer, toffset); + toffset += varuint.encode.bytes; + } + function writeVarSlice(slice) { + writeVarInt(slice.length); + writeSlice(slice); + } + + var hashOutputs = ZERO; + var hashPrevouts = ZERO; + var hashSequence = ZERO; + + if (!(hashType & Transaction.SIGHASH_ANYONECANPAY)) { + tbuffer = Buffer.allocUnsafe(36 * this.ins.length); + toffset = 0; + + this.ins.forEach(function (txIn) { + writeSlice(txIn.hash); + writeUInt32(txIn.index); + }); + + hashPrevouts = bcrypto.hash256(tbuffer); + } + + if ( + !(hashType & Transaction.SIGHASH_ANYONECANPAY) && + (hashType & 0x1f) !== Transaction.SIGHASH_SINGLE && + (hashType & 0x1f) !== Transaction.SIGHASH_NONE + ) { + tbuffer = Buffer.allocUnsafe(4 * this.ins.length); + toffset = 0; + + this.ins.forEach(function (txIn) { + writeUInt32(txIn.sequence); + }); + + hashSequence = bcrypto.hash256(tbuffer); + } + + if ( + (hashType & 0x1f) !== Transaction.SIGHASH_SINGLE && + (hashType & 0x1f) !== Transaction.SIGHASH_NONE + ) { + var txOutsSize = this.outs.reduce(function (sum, output) { + return sum + 8 + varSliceSize(output.script); + }, 0); + + tbuffer = Buffer.allocUnsafe(txOutsSize); + toffset = 0; + + this.outs.forEach(function (out) { + writeUInt64(out.value); + writeVarSlice(out.script); + }); + + hashOutputs = bcrypto.hash256(tbuffer); + } else if ( + (hashType & 0x1f) === Transaction.SIGHASH_SINGLE && + inIndex < this.outs.length + ) { + var output = this.outs[inIndex]; + + tbuffer = Buffer.allocUnsafe(8 + varSliceSize(output.script)); + toffset = 0; + writeUInt64(output.value); + writeVarSlice(output.script); + + hashOutputs = bcrypto.hash256(tbuffer); + } + + tbuffer = Buffer.allocUnsafe(156 + varSliceSize(prevOutScript)); + toffset = 0; + + var input = this.ins[inIndex]; + writeUInt32(this.version); + writeSlice(hashPrevouts); + writeSlice(hashSequence); + writeSlice(input.hash); + writeUInt32(input.index); + writeVarSlice(prevOutScript); + writeUInt64(value); + writeUInt32(input.sequence); + writeSlice(hashOutputs); + writeUInt32(this.locktime); + writeUInt32(hashType); + return bcrypto.hash256(tbuffer); +}; + +/** + * Hash transaction for signing a specific input for Bitcoin Cash. + */ +Transaction.prototype.hashForCashSignature = function ( + inIndex, + prevOutScript, + inAmount, + hashType, +) { + typeforce( + types.tuple( + types.UInt32, + types.Buffer, + /* types.UInt8 */ types.Number, + types.maybe(types.UInt53), + ), + arguments, + ); + + // This function works the way it does because Bitcoin Cash + // uses BIP143 as their replay protection, AND their algo + // includes `forkId | hashType`, AND since their forkId=0, + // this is a NOP, and has no difference to segwit. To support + // other forks, another parameter is required, and a new parameter + // would be required in the hashForWitnessV0 function, or + // it could be broken into two.. + + // BIP143 sighash activated in BitcoinCash via 0x40 bit + if (hashType & Transaction.SIGHASH_BITCOINCASHBIP143) { + if (types.Null(inAmount)) { + throw new Error( + 'Bitcoin Cash sighash requires value of input to be signed.', + ); + } + return this.hashForWitnessV0( + inIndex, + prevOutScript, + inAmount, + hashType, + ); + } else { + return this.hashForSignature(inIndex, prevOutScript, hashType); + } +}; + +Transaction.prototype.getHash = function () { + return bcrypto.hash256(this.__toBuffer(undefined, undefined, false)); +}; + +Transaction.prototype.getId = function () { + // transaction hash's are displayed in reverse order + return this.getHash().reverse().toString('hex'); +}; + +Transaction.prototype.toBuffer = function (buffer, initialOffset) { + return this.__toBuffer(buffer, initialOffset, true); +}; + +Transaction.prototype.__toBuffer = function ( + buffer, + initialOffset, + __allowWitness, +) { + if (!buffer) buffer = Buffer.allocUnsafe(this.__byteLength(__allowWitness)); + + var offset = initialOffset || 0; + function writeSlice(slice) { + offset += slice.copy(buffer, offset); + } + function writeUInt8(i) { + offset = buffer.writeUInt8(i, offset); + } + function writeUInt32(i) { + offset = buffer.writeUInt32LE(i, offset); + } + function writeInt32(i) { + offset = buffer.writeInt32LE(i, offset); + } + function writeUInt64(i) { + offset = bufferutils.writeUInt64LE(buffer, i, offset); + } + function writeVarInt(i) { + varuint.encode(i, buffer, offset); + offset += varuint.encode.bytes; + } + function writeVarSlice(slice) { + writeVarInt(slice.length); + writeSlice(slice); + } + function writeVector(vector) { + writeVarInt(vector.length); + vector.forEach(writeVarSlice); + } + + writeInt32(this.version); + + var hasWitnesses = __allowWitness && this.hasWitnesses(); + + if (hasWitnesses) { + writeUInt8(Transaction.ADVANCED_TRANSACTION_MARKER); + writeUInt8(Transaction.ADVANCED_TRANSACTION_FLAG); + } + + writeVarInt(this.ins.length); + + this.ins.forEach(function (txIn) { + writeSlice(txIn.hash); + writeUInt32(txIn.index); + writeVarSlice(txIn.script); + writeUInt32(txIn.sequence); + }); + + writeVarInt(this.outs.length); + this.outs.forEach(function (txOut) { + if (!txOut.valueBuffer) { + writeUInt64(txOut.value); + } else { + writeSlice(txOut.valueBuffer); + } + + writeVarSlice(txOut.script); + }); + + if (hasWitnesses) { + this.ins.forEach(function (input) { + writeVector(input.witness); + }); + } + + writeUInt32(this.locktime); + + // avoid slicing unless necessary + if (initialOffset !== undefined) return buffer.slice(initialOffset, offset); + return buffer; +}; + +Transaction.prototype.toHex = function () { + return this.toBuffer().toString('hex'); +}; + +Transaction.prototype.setInputScript = function (index, scriptSig) { + typeforce(types.tuple(types.Number, types.Buffer), arguments); + + this.ins[index].script = scriptSig; +}; + +Transaction.prototype.setWitness = function (index, witness) { + typeforce(types.tuple(types.Number, [types.Buffer]), arguments); + + this.ins[index].witness = witness; +}; + +module.exports = Transaction; diff --git a/web/bitcoincashjs-lib/src/transaction_builder.js b/web/bitcoincashjs-lib/src/transaction_builder.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/transaction_builder.js @@ -0,0 +1,962 @@ +var Buffer = require('safe-buffer').Buffer; +var baddress = require('./address'); +var bcrypto = require('./crypto'); +var bscript = require('./script'); +var btemplates = require('./templates'); +var networks = require('./networks'); +var ops = require('@psf/bitcoincash-ops'); +var typeforce = require('typeforce'); +var types = require('./types'); +var scriptTypes = btemplates.types; +var SIGNABLE = [ + btemplates.types.P2PKH, + btemplates.types.P2PK, + btemplates.types.MULTISIG, +]; +var P2SH = SIGNABLE.concat([btemplates.types.P2WPKH, btemplates.types.P2WSH]); + +var ECPair = require('./ecpair'); +var ECSignature = require('./ecsignature'); +var Transaction = require('./transaction'); + +function supportedType(type) { + return SIGNABLE.indexOf(type) !== -1; +} + +function supportedP2SHType(type) { + return P2SH.indexOf(type) !== -1; +} + +function extractChunks(type, chunks, script) { + var pubKeys = []; + var signatures = []; + switch (type) { + case scriptTypes.P2PKH: + // if (redeemScript) throw new Error('Nonstandard... P2SH(P2PKH)') + pubKeys = chunks.slice(1); + signatures = chunks.slice(0, 1); + break; + + case scriptTypes.P2PK: + pubKeys[0] = script + ? btemplates.pubKey.output.decode(script) + : undefined; + signatures = chunks.slice(0, 1); + break; + + case scriptTypes.MULTISIG: + if (script) { + var multisig = btemplates.multisig.output.decode(script); + pubKeys = multisig.pubKeys; + } + + signatures = chunks.slice(1).map(function (chunk) { + return chunk.length === 0 ? undefined : chunk; + }); + break; + } + + return { + pubKeys: pubKeys, + signatures: signatures, + }; +} +function expandInput(scriptSig, witnessStack) { + if (scriptSig.length === 0 && witnessStack.length === 0) return {}; + + var prevOutScript; + var prevOutType; + var scriptType; + var script; + var redeemScript; + var witnessScript; + var witnessScriptType; + var redeemScriptType; + var witness = false; + var p2wsh = false; + var p2sh = false; + var witnessProgram; + var chunks; + + var scriptSigChunks = bscript.decompile(scriptSig); + var sigType = btemplates.classifyInput(scriptSigChunks, true); + if (sigType === scriptTypes.P2SH) { + p2sh = true; + redeemScript = scriptSigChunks[scriptSigChunks.length - 1]; + redeemScriptType = btemplates.classifyOutput(redeemScript); + prevOutScript = btemplates.scriptHash.output.encode( + bcrypto.hash160(redeemScript), + ); + prevOutType = scriptTypes.P2SH; + script = redeemScript; + } + + var classifyWitness = btemplates.classifyWitness(witnessStack, true); + if (classifyWitness === scriptTypes.P2WSH) { + witnessScript = witnessStack[witnessStack.length - 1]; + witnessScriptType = btemplates.classifyOutput(witnessScript); + p2wsh = true; + witness = true; + if (scriptSig.length === 0) { + prevOutScript = btemplates.witnessScriptHash.output.encode( + bcrypto.sha256(witnessScript), + ); + prevOutType = scriptTypes.P2WSH; + if (redeemScript !== undefined) { + throw new Error('Redeem script given when unnecessary'); + } + // bare witness + } else { + if (!redeemScript) { + throw new Error( + 'No redeemScript provided for P2WSH, but scriptSig non-empty', + ); + } + witnessProgram = btemplates.witnessScriptHash.output.encode( + bcrypto.sha256(witnessScript), + ); + if (!redeemScript.equals(witnessProgram)) { + throw new Error("Redeem script didn't match witnessScript"); + } + } + + if (!supportedType(btemplates.classifyOutput(witnessScript))) { + throw new Error('unsupported witness script'); + } + + script = witnessScript; + scriptType = witnessScriptType; + chunks = witnessStack.slice(0, -1); + } else if (classifyWitness === scriptTypes.P2WPKH) { + witness = true; + var key = witnessStack[witnessStack.length - 1]; + var keyHash = bcrypto.hash160(key); + if (scriptSig.length === 0) { + prevOutScript = btemplates.witnessPubKeyHash.output.encode(keyHash); + prevOutType = scriptTypes.P2WPKH; + if (typeof redeemScript !== 'undefined') { + throw new Error('Redeem script given when unnecessary'); + } + } else { + if (!redeemScript) { + throw new Error( + "No redeemScript provided for P2WPKH, but scriptSig wasn't empty", + ); + } + witnessProgram = + btemplates.witnessPubKeyHash.output.encode(keyHash); + if (!redeemScript.equals(witnessProgram)) { + throw new Error( + 'Redeem script did not have the right witness program', + ); + } + } + + scriptType = scriptTypes.P2PKH; + chunks = witnessStack; + } else if (redeemScript) { + if (!supportedP2SHType(redeemScriptType)) { + throw new Error('Bad redeemscript!'); + } + + script = redeemScript; + scriptType = redeemScriptType; + chunks = scriptSigChunks.slice(0, -1); + } else { + prevOutType = scriptType = btemplates.classifyInput(scriptSig); + chunks = scriptSigChunks; + } + + var expanded = extractChunks(scriptType, chunks, script); + + var result = { + pubKeys: expanded.pubKeys, + signatures: expanded.signatures, + prevOutScript: prevOutScript, + prevOutType: prevOutType, + signType: scriptType, + signScript: script, + witness: Boolean(witness), + }; + + if (p2sh) { + result.redeemScript = redeemScript; + result.redeemScriptType = redeemScriptType; + } + + if (p2wsh) { + result.witnessScript = witnessScript; + result.witnessScriptType = witnessScriptType; + } + + return result; +} + +// could be done in expandInput, but requires the original Transaction for hashForSignature +function fixMultisigOrder(input, transaction, vin, value, bitcoinCash) { + if (input.redeemScriptType !== scriptTypes.MULTISIG || !input.redeemScript) + return; + if (input.pubKeys.length === input.signatures.length) return; + + var unmatched = input.signatures.concat(); + + input.signatures = input.pubKeys.map(function (pubKey) { + var keyPair = ECPair.fromPublicKeyBuffer(pubKey); + var match; + + // check for a signature + unmatched.some(function (signature, i) { + // skip if undefined || OP_0 + if (!signature) return false; + + // TODO: avoid O(n) hashForSignature + var parsed = ECSignature.parseScriptSignature(signature); + var hash; + if (bitcoinCash) { + hash = transaction.hashForCashSignature( + vin, + input.signScript, + value, + parsed.hashType, + ); + } else { + if (input.witness) { + hash = transaction.hashForWitnessV0( + vin, + input.signScript, + value, + parsed.hashType, + ); + } else { + hash = transaction.hashForSignature( + vin, + input.signScript, + parsed.hashType, + ); + } + } + + // skip if signature does not match pubKey + if (!keyPair.verify(hash, parsed.signature)) return false; + + // remove matched signature from unmatched + unmatched[i] = undefined; + match = signature; + + return true; + }); + + return match; + }); +} + +function expandOutput(script, scriptType, ourPubKey) { + typeforce(types.Buffer, script); + + var scriptChunks = bscript.decompile(script); + if (!scriptType) { + scriptType = btemplates.classifyOutput(script); + } + + var pubKeys = []; + + switch (scriptType) { + // does our hash160(pubKey) match the output scripts? + case scriptTypes.P2PKH: + if (!ourPubKey) break; + + var pkh1 = scriptChunks[2]; + var pkh2 = bcrypto.hash160(ourPubKey); + if (pkh1.equals(pkh2)) pubKeys = [ourPubKey]; + break; + + // does our hash160(pubKey) match the output scripts? + case scriptTypes.P2WPKH: + if (!ourPubKey) break; + + var wpkh1 = scriptChunks[1]; + var wpkh2 = bcrypto.hash160(ourPubKey); + if (wpkh1.equals(wpkh2)) pubKeys = [ourPubKey]; + break; + + case scriptTypes.P2PK: + pubKeys = scriptChunks.slice(0, 1); + break; + + case scriptTypes.MULTISIG: + pubKeys = scriptChunks.slice(1, -2); + break; + + default: + return { scriptType: scriptType }; + } + + return { + pubKeys: pubKeys, + scriptType: scriptType, + signatures: pubKeys.map(function () { + return undefined; + }), + }; +} + +function checkP2SHInput(input, redeemScriptHash) { + if (input.prevOutType) { + if (input.prevOutType !== scriptTypes.P2SH) + throw new Error('PrevOutScript must be P2SH'); + + var prevOutScriptScriptHash = bscript.decompile(input.prevOutScript)[1]; + if (!prevOutScriptScriptHash.equals(redeemScriptHash)) + throw new Error('Inconsistent hash160(RedeemScript)'); + } +} + +function checkP2WSHInput(input, witnessScriptHash) { + if (input.prevOutType) { + if (input.prevOutType !== scriptTypes.P2WSH) + throw new Error('PrevOutScript must be P2WSH'); + + var scriptHash = bscript.decompile(input.prevOutScript)[1]; + if (!scriptHash.equals(witnessScriptHash)) + throw new Error('Inconsistent sha25(WitnessScript)'); + } +} + +function prepareInput( + input, + kpPubKey, + redeemScript, + witnessValue, + witnessScript, +) { + var expanded; + var prevOutType; + var prevOutScript; + + var p2sh = false; + var p2shType; + var redeemScriptHash; + + var witness = false; + var p2wsh = false; + var witnessType; + var witnessScriptHash; + + var signType; + var signScript; + + if (redeemScript && witnessScript) { + redeemScriptHash = bcrypto.hash160(redeemScript); + witnessScriptHash = bcrypto.sha256(witnessScript); + checkP2SHInput(input, redeemScriptHash); + + if ( + !redeemScript.equals( + btemplates.witnessScriptHash.output.encode(witnessScriptHash), + ) + ) + throw new Error('Witness script inconsistent with redeem script'); + + expanded = expandOutput(witnessScript, undefined, kpPubKey); + if (!expanded.pubKeys) + throw new Error( + 'WitnessScript not supported "' + + bscript.toASM(redeemScript) + + '"', + ); + + prevOutType = btemplates.types.P2SH; + prevOutScript = btemplates.scriptHash.output.encode(redeemScriptHash); + p2sh = witness = p2wsh = true; + p2shType = btemplates.types.P2WSH; + signType = witnessType = expanded.scriptType; + signScript = witnessScript; + } else if (redeemScript) { + redeemScriptHash = bcrypto.hash160(redeemScript); + checkP2SHInput(input, redeemScriptHash); + + expanded = expandOutput(redeemScript, undefined, kpPubKey); + if (!expanded.pubKeys) + throw new Error( + 'RedeemScript not supported "' + + bscript.toASM(redeemScript) + + '"', + ); + + prevOutType = btemplates.types.P2SH; + prevOutScript = btemplates.scriptHash.output.encode(redeemScriptHash); + p2sh = true; + signType = p2shType = expanded.scriptType; + signScript = redeemScript; + witness = signType === btemplates.types.P2WPKH; + } else if (witnessScript) { + witnessScriptHash = bcrypto.sha256(witnessScript); + checkP2WSHInput(input, witnessScriptHash); + + expanded = expandOutput(witnessScript, undefined, kpPubKey); + if (!expanded.pubKeys) + throw new Error( + 'WitnessScript not supported "' + + bscript.toASM(redeemScript) + + '"', + ); + + prevOutType = btemplates.types.P2WSH; + prevOutScript = + btemplates.witnessScriptHash.output.encode(witnessScriptHash); + witness = p2wsh = true; + signType = witnessType = expanded.scriptType; + signScript = witnessScript; + } else if (input.prevOutType) { + // embedded scripts are not possible without a redeemScript + if ( + input.prevOutType === scriptTypes.P2SH || + input.prevOutType === scriptTypes.P2WSH + ) { + throw new Error( + 'PrevOutScript is ' + + input.prevOutType + + ', requires redeemScript', + ); + } + + prevOutType = input.prevOutType; + prevOutScript = input.prevOutScript; + expanded = expandOutput( + input.prevOutScript, + input.prevOutType, + kpPubKey, + ); + if (!expanded.pubKeys) return; + + witness = input.prevOutType === scriptTypes.P2WPKH; + signType = prevOutType; + signScript = prevOutScript; + } else { + prevOutScript = btemplates.pubKeyHash.output.encode( + bcrypto.hash160(kpPubKey), + ); + expanded = expandOutput(prevOutScript, scriptTypes.P2PKH, kpPubKey); + + prevOutType = scriptTypes.P2PKH; + witness = false; + signType = prevOutType; + signScript = prevOutScript; + } + + if (signType === scriptTypes.P2WPKH) { + signScript = btemplates.pubKeyHash.output.encode( + btemplates.witnessPubKeyHash.output.decode(signScript), + ); + } + + if (p2sh) { + input.redeemScript = redeemScript; + input.redeemScriptType = p2shType; + } + + if (p2wsh) { + input.witnessScript = witnessScript; + input.witnessScriptType = witnessType; + } + + input.pubKeys = expanded.pubKeys; + input.signatures = expanded.signatures; + input.signScript = signScript; + input.signType = signType; + input.prevOutScript = prevOutScript; + input.prevOutType = prevOutType; + input.witness = witness; +} + +function buildStack(type, signatures, pubKeys, allowIncomplete) { + if (type === scriptTypes.P2PKH) { + if ( + signatures.length === 1 && + Buffer.isBuffer(signatures[0]) && + pubKeys.length === 1 + ) + return btemplates.pubKeyHash.input.encodeStack( + signatures[0], + pubKeys[0], + ); + } else if (type === scriptTypes.P2PK) { + if (signatures.length === 1 && Buffer.isBuffer(signatures[0])) + return btemplates.pubKey.input.encodeStack(signatures[0]); + } else if (type === scriptTypes.MULTISIG) { + if (signatures.length > 0) { + signatures = signatures.map(function (signature) { + return signature || ops.OP_0; + }); + if (!allowIncomplete) { + // remove blank signatures + signatures = signatures.filter(function (x) { + return x !== ops.OP_0; + }); + } + + return btemplates.multisig.input.encodeStack(signatures); + } + } else { + throw new Error('Not yet supported'); + } + + if (!allowIncomplete) throw new Error('Not enough signatures provided'); + return []; +} + +function buildInput(input, allowIncomplete) { + var scriptType = input.prevOutType; + var sig = []; + var witness = []; + + if (supportedType(scriptType)) { + sig = buildStack( + scriptType, + input.signatures, + input.pubKeys, + allowIncomplete, + ); + } + + var p2sh = false; + if (scriptType === btemplates.types.P2SH) { + // We can remove this error later when we have a guarantee prepareInput + // rejects unsignable scripts - it MUST be signable at this point. + if (!allowIncomplete && !supportedP2SHType(input.redeemScriptType)) { + throw new Error('Impossible to sign this type'); + } + + if (supportedType(input.redeemScriptType)) { + sig = buildStack( + input.redeemScriptType, + input.signatures, + input.pubKeys, + allowIncomplete, + ); + } + + // If it wasn't SIGNABLE, it's witness, defer to that + if (input.redeemScriptType) { + p2sh = true; + scriptType = input.redeemScriptType; + } + } + + switch (scriptType) { + // P2WPKH is a special case of P2PKH + case btemplates.types.P2WPKH: + witness = buildStack( + btemplates.types.P2PKH, + input.signatures, + input.pubKeys, + allowIncomplete, + ); + break; + + case btemplates.types.P2WSH: + // We can remove this check later + if (!allowIncomplete && !supportedType(input.witnessScriptType)) { + throw new Error('Impossible to sign this type'); + } + + if (supportedType(input.witnessScriptType)) { + witness = buildStack( + input.witnessScriptType, + input.signatures, + input.pubKeys, + allowIncomplete, + ); + witness.push(input.witnessScript); + scriptType = input.witnessScriptType; + } + + break; + } + + // append redeemScript if necessary + if (p2sh) { + sig.push(input.redeemScript); + } + + return { + type: scriptType, + script: bscript.compile(sig), + witness: witness, + }; +} + +function TransactionBuilder(network, maximumFeeRate) { + this.prevTxMap = {}; + this.network = network || networks.bitcoin; + + // WARNING: This is __NOT__ to be relied on, its just another potential safety mechanism (safety in-depth) + this.maximumFeeRate = maximumFeeRate || 2500; + + this.inputs = []; + this.bitcoinCash = true; + this.tx = new Transaction(); +} + +TransactionBuilder.prototype.setLockTime = function (locktime) { + typeforce(types.UInt32, locktime); + + // if any signatures exist, throw + if ( + this.inputs.some(function (input) { + if (!input.signatures) return false; + + return input.signatures.some(function (s) { + return s; + }); + }) + ) { + throw new Error('No, this would invalidate signatures'); + } + + this.tx.locktime = locktime; +}; + +TransactionBuilder.fromTransaction = function ( + transaction, + network, + bitcoinCashTx, +) { + var txb = new TransactionBuilder(network); + + // Copy transaction fields + txb.setLockTime(transaction.locktime); + + // Copy outputs (done first to avoid signature invalidation) + transaction.outs.forEach(function (txOut) { + txb.addOutput(txOut.script, txOut.value); + }); + + // Copy inputs + transaction.ins.forEach(function (txIn) { + txb.__addInputUnsafe(txIn.hash, txIn.index, { + sequence: txIn.sequence, + script: txIn.script, + witness: txIn.witness, + value: txIn.value, + }); + }); + + // fix some things not possible through the public API + txb.inputs.forEach(function (input, i) { + fixMultisigOrder(input, transaction, i, input.value, bitcoinCashTx); + }); + + return txb; +}; + +TransactionBuilder.prototype.addInput = function ( + txHash, + vout, + sequence, + prevOutScript, +) { + if (!this.__canModifyInputs()) { + throw new Error('No, this would invalidate signatures'); + } + + var value; + + // is it a hex string? + if (typeof txHash === 'string') { + // transaction hashs's are displayed in reverse order, un-reverse it + txHash = Buffer.from(txHash, 'hex').reverse(); + + // is it a Transaction object? + } else if (txHash instanceof Transaction) { + var txOut = txHash.outs[vout]; + prevOutScript = txOut.script; + value = txOut.value; + + txHash = txHash.getHash(); + } + + return this.__addInputUnsafe(txHash, vout, { + sequence: sequence, + prevOutScript: prevOutScript, + value: value, + }); +}; + +TransactionBuilder.prototype.__addInputUnsafe = function ( + txHash, + vout, + options, +) { + if (Transaction.isCoinbaseHash(txHash)) { + throw new Error('coinbase inputs not supported'); + } + + var prevTxOut = txHash.toString('hex') + ':' + vout; + if (this.prevTxMap[prevTxOut] !== undefined) + throw new Error('Duplicate TxOut: ' + prevTxOut); + + var input = {}; + + // derive what we can from the scriptSig + if (options.script !== undefined) { + input = expandInput(options.script, options.witness || []); + } + + // if an input value was given, retain it + if (options.value !== undefined) { + input.value = options.value; + } + + // derive what we can from the previous transactions output script + if (!input.prevOutScript && options.prevOutScript) { + var prevOutType; + + if (!input.pubKeys && !input.signatures) { + var expanded = expandOutput(options.prevOutScript); + + if (expanded.pubKeys) { + input.pubKeys = expanded.pubKeys; + input.signatures = expanded.signatures; + } + + prevOutType = expanded.scriptType; + } + + input.prevOutScript = options.prevOutScript; + input.prevOutType = + prevOutType || btemplates.classifyOutput(options.prevOutScript); + } + + var vin = this.tx.addInput( + txHash, + vout, + options.sequence, + options.scriptSig, + ); + this.inputs[vin] = input; + this.prevTxMap[prevTxOut] = vin; + return vin; +}; + +TransactionBuilder.prototype.addOutput = function (scriptPubKey, value) { + if (!this.__canModifyOutputs()) { + throw new Error('No, this would invalidate signatures'); + } + + // Attempt to get a script if it's a base58 address string + if (typeof scriptPubKey === 'string') { + scriptPubKey = baddress.toOutputScript(scriptPubKey, this.network); + } + + return this.tx.addOutput(scriptPubKey, value); +}; + +TransactionBuilder.prototype.build = function () { + return this.__build(false); +}; +TransactionBuilder.prototype.buildIncomplete = function () { + return this.__build(true); +}; + +TransactionBuilder.prototype.__build = function (allowIncomplete) { + if (!allowIncomplete) { + if (!this.tx.ins.length) throw new Error('Transaction has no inputs'); + if (!this.tx.outs.length) throw new Error('Transaction has no outputs'); + } + + var tx = this.tx.clone(); + // Create script signatures from inputs + this.inputs.forEach(function (input, i) { + var scriptType = + input.witnessScriptType || + input.redeemScriptType || + input.prevOutType; + if (!scriptType && !allowIncomplete) + throw new Error('Transaction is not complete'); + var result = buildInput(input, allowIncomplete); + + // skip if no result + if (!allowIncomplete) { + if ( + !supportedType(result.type) && + result.type !== btemplates.types.P2WPKH + ) { + throw new Error(result.type + ' not supported'); + } + } + + tx.setInputScript(i, result.script); + tx.setWitness(i, result.witness); + }); + + if (!allowIncomplete) { + // do not rely on this, its merely a last resort + if (this.__overMaximumFees(tx.virtualSize())) { + throw new Error('Transaction has absurd fees'); + } + } + + return tx; +}; + +function canSign(input) { + return ( + input.prevOutScript !== undefined && + input.signScript !== undefined && + input.pubKeys !== undefined && + input.signatures !== undefined && + input.signatures.length === input.pubKeys.length && + input.pubKeys.length > 0 && + (input.witness === false || + (input.witness === true && input.value !== undefined)) + ); +} + +TransactionBuilder.prototype.sign = function ( + vin, + keyPair, + redeemScript, + hashType, + witnessValue, + witnessScript, + signatureAlgorithm, +) { + hashType = hashType | Transaction.SIGHASH_BITCOINCASHBIP143; + + if (!this.inputs[vin]) throw new Error('No input at index: ' + vin); + hashType = hashType || Transaction.SIGHASH_ALL; + + var input = this.inputs[vin]; + + // if redeemScript was previously provided, enforce consistency + if ( + input.redeemScript !== undefined && + redeemScript && + !input.redeemScript.equals(redeemScript) + ) { + throw new Error('Inconsistent redeemScript'); + } + + var kpPubKey = keyPair.publicKey || keyPair.getPublicKeyBuffer(); + if (!canSign(input)) { + if (witnessValue !== undefined) { + if (input.value !== undefined && input.value !== witnessValue) + throw new Error("Input didn't match witnessValue"); + typeforce(types.Satoshi, witnessValue); + input.value = witnessValue; + } + + if (!canSign(input)) + prepareInput( + input, + kpPubKey, + redeemScript, + witnessValue, + witnessScript, + ); + if (!canSign(input)) throw Error(input.prevOutType + ' not supported'); + } + + // ready to sign + // var signatureHash = this.tx.hashForCashSignature(vin, input.signScript, witnessValue, hashType) + var signatureHash = this.tx.hashForCashSignature( + vin, + input.signScript, + witnessValue, + hashType, + ); + // if (this.bitcoinCash) { + // signatureHash = this.tx.hashForCashSignature(vin, input.signScript, witnessValue, hashType) + // } else { + // if (input.witness) { + // signatureHash = this.tx.hashForWitnessV0(vin, input.signScript, witnessValue, hashType) + // } else { + // signatureHash = this.tx.hashForSignature(vin, input.signScript, hashType) + // } + // } + + // enforce in order signing of public keys + var signed = input.pubKeys.some(function (pubKey, i) { + if (!kpPubKey.equals(pubKey)) return false; + if (input.signatures[i]) throw new Error('Signature already exists'); + if (kpPubKey.length !== 33 && input.signType === scriptTypes.P2WPKH) + throw new Error( + 'BIP143 rejects uncompressed public keys in P2WPKH or P2WSH', + ); + + var signature = keyPair.sign(signatureHash, signatureAlgorithm); + if (Buffer.isBuffer(signature)) + signature = ECSignature.fromRSBuffer(signature); + + input.signatures[i] = signature.toScriptSignature( + hashType, + signatureAlgorithm, + ); + return true; + }); + + if (!signed) throw new Error('Key pair cannot sign for this input'); +}; + +function signatureHashType(buffer) { + return buffer.readUInt8(buffer.length - 1); +} + +TransactionBuilder.prototype.__canModifyInputs = function () { + return this.inputs.every(function (input) { + // any signatures? + if (input.signatures === undefined) return true; + + return input.signatures.every(function (signature) { + if (!signature) return true; + var hashType = signatureHashType(signature); + + // if SIGHASH_ANYONECANPAY is set, signatures would not + // be invalidated by more inputs + return hashType & Transaction.SIGHASH_ANYONECANPAY; + }); + }); +}; + +TransactionBuilder.prototype.__canModifyOutputs = function () { + var nInputs = this.tx.ins.length; + var nOutputs = this.tx.outs.length; + + return this.inputs.every(function (input) { + if (input.signatures === undefined) return true; + + return input.signatures.every(function (signature) { + if (!signature) return true; + var hashType = signatureHashType(signature); + + var hashTypeMod = hashType & 0x1f; + if (hashTypeMod === Transaction.SIGHASH_NONE) return true; + if (hashTypeMod === Transaction.SIGHASH_SINGLE) { + // if SIGHASH_SINGLE is set, and nInputs > nOutputs + // some signatures would be invalidated by the addition + // of more outputs + return nInputs <= nOutputs; + } + }); + }); +}; + +TransactionBuilder.prototype.__overMaximumFees = function (bytes) { + // not all inputs will have .value defined + var incoming = this.inputs.reduce(function (a, x) { + return a + (x.value >>> 0); + }, 0); + + // but all outputs do, and if we have any input value + // we can immediately determine if the outputs are too small + var outgoing = this.tx.outs.reduce(function (a, x) { + return a + x.value; + }, 0); + var fee = incoming - outgoing; + var feeRate = fee / bytes; + + return feeRate > this.maximumFeeRate; +}; + +module.exports = TransactionBuilder; diff --git a/web/bitcoincashjs-lib/src/types.js b/web/bitcoincashjs-lib/src/types.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/src/types.js @@ -0,0 +1,55 @@ +var typeforce = require('typeforce'); + +var UINT31_MAX = Math.pow(2, 31) - 1; +function UInt31(value) { + return typeforce.UInt32(value) && value <= UINT31_MAX; +} + +function BIP32Path(value) { + return typeforce.String(value) && value.match(/^(m\/)?(\d+'?\/)*\d+'?$/); +} +BIP32Path.toJSON = function () { + return 'BIP32 derivation path'; +}; + +var SATOSHI_MAX = 21 * 1e14; +function Satoshi(value) { + return typeforce.UInt53(value) && value <= SATOSHI_MAX; +} + +// external dependent types +var BigInt = typeforce.quacksLike('BigInteger'); +var ECPoint = typeforce.quacksLike('Point'); + +// exposed, external API +var ECSignature = typeforce.compile({ r: BigInt, s: BigInt }); +var Network = typeforce.compile({ + messagePrefix: typeforce.oneOf(typeforce.Buffer, typeforce.String), + bip32: { + public: typeforce.UInt32, + private: typeforce.UInt32, + }, + pubKeyHash: typeforce.UInt8, + scriptHash: typeforce.UInt8, + wif: typeforce.UInt8, +}); + +// extend typeforce types with ours +var types = { + BigInt: BigInt, + BIP32Path: BIP32Path, + Buffer256bit: typeforce.BufferN(32), + ECPoint: ECPoint, + ECSignature: ECSignature, + Hash160bit: typeforce.BufferN(20), + Hash256bit: typeforce.BufferN(32), + Network: Network, + Satoshi: Satoshi, + UInt31: UInt31, +}; + +for (var typeName in typeforce) { + types[typeName] = typeforce[typeName]; +} + +module.exports = types; diff --git a/web/bitcoincashjs-lib/test/address.js b/web/bitcoincashjs-lib/test/address.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/address.js @@ -0,0 +1,156 @@ +/* global describe, it */ + +var assert = require('assert'); +var baddress = require('../src/address'); +var networks = require('../src/networks'); +var bscript = require('../src/script'); +var fixtures = require('./fixtures/address.json'); + +describe('address', function () { + describe('fromBase58Check', function () { + fixtures.standard.forEach(function (f) { + if (!f.base58check) return; + + it('decodes ' + f.base58check, function () { + var decode = baddress.fromBase58Check(f.base58check); + + assert.strictEqual(decode.version, f.version); + assert.strictEqual(decode.hash.toString('hex'), f.hash); + }); + }); + + fixtures.invalid.fromBase58Check.forEach(function (f) { + it('throws on ' + f.exception, function () { + assert.throws(function () { + baddress.fromBase58Check(f.address); + }, new RegExp(f.address + ' ' + f.exception)); + }); + }); + }); + + describe('fromBech32', function () { + fixtures.standard.forEach(f => { + if (!f.bech32) return; + + it('decodes ' + f.bech32, function () { + var actual = baddress.fromBech32(f.bech32); + + assert.strictEqual(actual.version, f.version); + assert.strictEqual(actual.prefix, networks[f.network].bech32); + assert.strictEqual(actual.data.toString('hex'), f.data); + }); + }); + + fixtures.invalid.bech32.forEach((f, i) => { + it( + 'decode fails for ' + f.bech32 + '(' + f.exception + ')', + function () { + assert.throws(function () { + baddress.fromBech32(f.address); + }, new RegExp(f.exception)); + }, + ); + }); + }); + + describe('fromOutputScript', function () { + fixtures.standard.forEach(function (f) { + it( + 'encodes ' + f.script.slice(0, 30) + '... (' + f.network + ')', + function () { + var script = bscript.fromASM(f.script); + var address = baddress.fromOutputScript( + script, + networks[f.network], + ); + + assert.strictEqual( + address, + f.base58check || f.bech32.toLowerCase(), + ); + }, + ); + }); + + fixtures.invalid.fromOutputScript.forEach(function (f) { + it( + 'throws when ' + f.script.slice(0, 30) + '... ' + f.exception, + function () { + var script = bscript.fromASM(f.script); + + assert.throws(function () { + baddress.fromOutputScript(script); + }, new RegExp(f.script + ' ' + f.exception)); + }, + ); + }); + }); + + describe('toBase58Check', function () { + fixtures.standard.forEach(function (f) { + if (!f.base58check) return; + + it('encodes ' + f.hash + ' (' + f.network + ')', function () { + var address = baddress.toBase58Check( + Buffer.from(f.hash, 'hex'), + f.version, + ); + + assert.strictEqual(address, f.base58check); + }); + }); + }); + + describe('toBech32', function () { + fixtures.bech32.forEach((f, i) => { + if (!f.bech32) return; + var data = Buffer.from(f.data, 'hex'); + + it('encode ' + f.address, function () { + assert.deepEqual( + baddress.toBech32(data, f.version, f.prefix), + f.address, + ); + }); + }); + + fixtures.invalid.bech32.forEach((f, i) => { + if (!f.prefix || f.version === undefined || f.data === undefined) + return; + + it('encode fails (' + f.exception, function () { + assert.throws(function () { + baddress.toBech32( + Buffer.from(f.data, 'hex'), + f.version, + f.prefix, + ); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('toOutputScript', function () { + fixtures.standard.forEach(function (f) { + it( + 'decodes ' + f.script.slice(0, 30) + '... (' + f.network + ')', + function () { + var script = baddress.toOutputScript( + f.base58check || f.bech32, + networks[f.network], + ); + + assert.strictEqual(bscript.toASM(script), f.script); + }, + ); + }); + + fixtures.invalid.toOutputScript.forEach(function (f) { + it('throws when ' + f.exception, function () { + assert.throws(function () { + baddress.toOutputScript(f.address, f.network); + }, new RegExp(f.address + ' ' + f.exception)); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/bitcoin.core.js b/web/bitcoincashjs-lib/test/bitcoin.core.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/bitcoin.core.js @@ -0,0 +1,256 @@ +/* global describe, it */ + +var assert = require('assert'); +var base58 = require('bs58'); +var bitcoin = require('../'); + +var base58EncodeDecode = require('./fixtures/core/base58_encode_decode.json'); +var base58KeysInvalid = require('./fixtures/core/base58_keys_invalid.json'); +var base58KeysValid = require('./fixtures/core/base58_keys_valid.json'); +var blocksValid = require('./fixtures/core/blocks.json'); +var sigCanonical = require('./fixtures/core/sig_canonical.json'); +var sigHash = require('./fixtures/core/sighash.json'); +var sigNoncanonical = require('./fixtures/core/sig_noncanonical.json'); +var txValid = require('./fixtures/core/tx_valid.json'); + +describe('Bitcoin-core', function () { + // base58EncodeDecode + describe('base58', function () { + base58EncodeDecode.forEach(function (f) { + var fhex = f[0]; + var fb58 = f[1]; + + it('can decode ' + fb58, function () { + var buffer = base58.decode(fb58); + var actual = buffer.toString('hex'); + + assert.strictEqual(actual, fhex); + }); + + it('can encode ' + fhex, function () { + var buffer = Buffer.from(fhex, 'hex'); + var actual = base58.encode(buffer); + + assert.strictEqual(actual, fb58); + }); + }); + }); + + // base58KeysValid + describe('address.toBase58Check', function () { + var typeMap = { + pubkey: 'pubKeyHash', + script: 'scriptHash', + }; + + base58KeysValid.forEach(function (f) { + var expected = f[0]; + var hash = Buffer.from(f[1], 'hex'); + var params = f[2]; + + if (params.isPrivkey) return; + + var network = params.isTestnet + ? bitcoin.networks.testnet + : bitcoin.networks.bitcoin; + var version = network[typeMap[params.addrType]]; + + it('can export ' + expected, function () { + assert.strictEqual( + bitcoin.address.toBase58Check(hash, version), + expected, + ); + }); + }); + }); + + // base58KeysInvalid + describe('address.fromBase58Check', function () { + var allowedNetworks = [ + bitcoin.networks.bitcoin.pubkeyhash, + bitcoin.networks.bitcoin.scripthash, + bitcoin.networks.testnet.pubkeyhash, + bitcoin.networks.testnet.scripthash, + ]; + + base58KeysInvalid.forEach(function (f) { + var string = f[0]; + + it('throws on ' + string, function () { + assert.throws(function () { + var address = bitcoin.address.fromBase58Check(string); + + assert.notEqual( + allowedNetworks.indexOf(address.version), + -1, + 'Invalid network', + ); + }, /(Invalid (checksum|network))|(too (short|long))/); + }); + }); + }); + + // base58KeysValid + describe('ECPair', function () { + base58KeysValid.forEach(function (f) { + var string = f[0]; + var hex = f[1]; + var params = f[2]; + + if (!params.isPrivkey) return; + + var network = params.isTestnet + ? bitcoin.networks.testnet + : bitcoin.networks.bitcoin; + var keyPair = bitcoin.ECPair.fromWIF(string, network); + + it('fromWIF imports ' + string, function () { + assert.strictEqual(keyPair.d.toHex(), hex); + assert.strictEqual(keyPair.compressed, params.isCompressed); + }); + + it('toWIF exports ' + hex + ' to ' + string, function () { + assert.strictEqual(keyPair.toWIF(), string); + }); + }); + }); + + // base58KeysInvalid + describe('ECPair.fromWIF', function () { + var allowedNetworks = [ + bitcoin.networks.bitcoin, + bitcoin.networks.testnet, + ]; + + base58KeysInvalid.forEach(function (f) { + var string = f[0]; + + it('throws on ' + string, function () { + assert.throws(function () { + bitcoin.ECPair.fromWIF(string, allowedNetworks); + }, /(Invalid|Unknown) (checksum|compression flag|network version|WIF length)/); + }); + }); + }); + + describe('Block.fromHex', function () { + blocksValid.forEach(function (f) { + it('can parse ' + f.id, function () { + var block = bitcoin.Block.fromHex(f.hex); + + assert.strictEqual(block.getId(), f.id); + assert.strictEqual(block.transactions.length, f.transactions); + }); + }); + }); + + // txValid + describe('Transaction.fromHex', function () { + txValid.forEach(function (f) { + // Objects that are only a single string are ignored + if (f.length === 1) return; + + var inputs = f[0]; + var fhex = f[1]; + // var verifyFlags = f[2] // TODO: do we need to test this? + + it('can decode ' + fhex, function () { + var transaction = bitcoin.Transaction.fromHex(fhex); + + transaction.ins.forEach(function (txIn, i) { + var input = inputs[i]; + + // reverse because test data is reversed + var prevOutHash = Buffer.from(input[0], 'hex').reverse(); + var prevOutIndex = input[1]; + + assert.deepEqual(txIn.hash, prevOutHash); + + // we read UInt32, not Int32 + assert.strictEqual(txIn.index & 0xffffffff, prevOutIndex); + }); + }); + }); + }); + + // sighash + describe('Transaction', function () { + sigHash.forEach(function (f) { + // Objects that are only a single string are ignored + if (f.length === 1) return; + + var txHex = f[0]; + var scriptHex = f[1]; + var inIndex = f[2]; + var hashType = f[3]; + var expectedHash = f[4]; + + var hashTypes = []; + if ((hashType & 0x1f) === bitcoin.Transaction.SIGHASH_NONE) + hashTypes.push('SIGHASH_NONE'); + else if ((hashType & 0x1f) === bitcoin.Transaction.SIGHASH_SINGLE) + hashTypes.push('SIGHASH_SINGLE'); + else hashTypes.push('SIGHASH_ALL'); + if (hashType & bitcoin.Transaction.SIGHASH_ANYONECANPAY) + hashTypes.push('SIGHASH_ANYONECANPAY'); + + var hashTypeName = hashTypes.join(' | '); + + it( + 'should hash ' + + txHex.slice(0, 40) + + '... (' + + hashTypeName + + ')', + function () { + var transaction = bitcoin.Transaction.fromHex(txHex); + assert.strictEqual(transaction.toHex(), txHex); + + var script = Buffer.from(scriptHex, 'hex'); + var scriptChunks = bitcoin.script.decompile(script); + assert.strictEqual( + bitcoin.script.compile(scriptChunks).toString('hex'), + scriptHex, + ); + + var hash = transaction.hashForSignature( + inIndex, + script, + hashType, + ); + + // reverse because test data is reversed + assert.equal(hash.reverse().toString('hex'), expectedHash); + }, + ); + }); + }); + + describe('ECSignature.parseScriptSignature', function () { + sigCanonical.forEach(function (hex) { + var buffer = Buffer.from(hex, 'hex'); + + it('can parse ' + hex, function () { + var parsed = bitcoin.ECSignature.parseScriptSignature(buffer); + var actual = parsed.signature.toScriptSignature( + parsed.hashType, + ); + assert.strictEqual(actual.toString('hex'), hex); + }); + }); + + sigNoncanonical.forEach(function (hex, i) { + if (i === 0) return; + if (i % 2 !== 0) return; + + var description = sigNoncanonical[i - 1].slice(0, -1); + var buffer = Buffer.from(hex, 'hex'); + + it('throws on ' + description, function () { + assert.throws(function () { + bitcoin.ECSignature.parseScriptSignature(buffer); + }, /Expected DER (integer|sequence)|(R|S) value (excessively padded|is negative)|(R|S|DER sequence) length is (zero|too short|too long|invalid)|Invalid hashType/); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/bitcoincash.test.js b/web/bitcoincashjs-lib/test/bitcoincash.test.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/bitcoincash.test.js @@ -0,0 +1,40 @@ +/* global describe, it */ + +var assert = require('assert'); +var bscript = require('../src/script'); +var ECPair = require('../src/ecpair'); +var NETWORKS = require('../src/networks'); +var TransactionBuilder = require('../src/transaction_builder'); +var Transaction = require('../src/transaction'); + +describe('TransactionBuilder', function () { + var network = NETWORKS['testnet']; + it('cashtestcase3', function () { + var value = 50 * 1e8; + var txid = + '40c8a218923f23df3692530fa8e475251c50c7d630dccbdfbd92ba8092f4aa13'; + var vout = 0; + + var wif = 'cTNwkxh7nVByhc3i7BH6eaBFQ4yVs6WvXBGBoA9xdKiorwcYVACc'; + var keyPair = ECPair.fromWIF(wif, network); + + var pk = keyPair.getPublicKeyBuffer(); + var spk = bscript.pubKey.output.encode(pk); + + var txb = new TransactionBuilder(network); + txb.addInput(txid, vout, Transaction.DEFAULT_SEQUENCE, spk); + txb.addOutput('mzDktdwPcWwqg8aZkPotx6aYi4mKvDD7ay', value); + + var hashType = + Transaction.SIGHASH_ALL | Transaction.SIGHASH_BITCOINCASHBIP143; + + txb.sign(0, keyPair, null, hashType, value); + + var tx = txb.build(); + var hex = tx.toHex(); + assert.equal( + '020000000113aaf49280ba92bddfcbdc30d6c7501c2575e4a80f539236df233f9218a2c8400000000049483045022100c5874e39da4dd427d35e24792bf31dcd63c25684deec66b426271b4043e21c3002201bfdc0621ad4237e8db05aa6cad69f3d5ab4ae32ebb2048f65b12165da6cc69341ffffffff0100f2052a010000001976a914cd29cc97826c37281ac61301e4d5ed374770585688ac00000000', + hex, + ); + }); +}); diff --git a/web/bitcoincashjs-lib/test/block.js b/web/bitcoincashjs-lib/test/block.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/block.js @@ -0,0 +1,161 @@ +/* global describe, it, beforeEach */ + +var assert = require('assert'); +var Block = require('../src/block'); + +var fixtures = require('./fixtures/block'); + +describe('Block', function () { + describe('version', function () { + it('should be interpreted as an int32le', function () { + var blockHex = + 'ffffffff0000000000000000000000000000000000000000000000000000000000000000414141414141414141414141414141414141414141414141414141414141414101000000020000000300000000'; + var block = Block.fromHex(blockHex); + assert.equal(-1, block.version); + assert.equal(1, block.timestamp); + }); + }); + + describe('calculateTarget', function () { + fixtures.targets.forEach(function (f) { + it('returns ' + f.expected + ' for 0x' + f.bits, function () { + var bits = parseInt(f.bits, 16); + + assert.equal( + Block.calculateTarget(bits).toString('hex'), + f.expected, + ); + }); + }); + }); + + describe('fromBuffer/fromHex', function () { + fixtures.valid.forEach(function (f) { + it('imports ' + f.description, function () { + var block = Block.fromHex(f.hex); + + assert.strictEqual(block.version, f.version); + assert.strictEqual(block.prevHash.toString('hex'), f.prevHash); + assert.strictEqual( + block.merkleRoot.toString('hex'), + f.merkleRoot, + ); + assert.strictEqual(block.timestamp, f.timestamp); + assert.strictEqual(block.bits, f.bits); + assert.strictEqual(block.nonce, f.nonce); + assert.strictEqual(!block.transactions, f.hex.length === 160); + }); + }); + + fixtures.invalid.forEach(function (f) { + it('throws on ' + f.exception, function () { + assert.throws(function () { + Block.fromHex(f.hex); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('toBuffer/toHex', function () { + fixtures.valid.forEach(function (f) { + var block; + + beforeEach(function () { + block = Block.fromHex(f.hex); + }); + + it('exports ' + f.description, function () { + assert.strictEqual(block.toHex(true), f.hex.slice(0, 160)); + assert.strictEqual(block.toHex(), f.hex); + }); + }); + }); + + describe('getHash/getId', function () { + fixtures.valid.forEach(function (f) { + var block; + + beforeEach(function () { + block = Block.fromHex(f.hex); + }); + + it('returns ' + f.id + ' for ' + f.description, function () { + assert.strictEqual(block.getHash().toString('hex'), f.hash); + assert.strictEqual(block.getId(), f.id); + }); + }); + }); + + describe('getUTCDate', function () { + fixtures.valid.forEach(function (f) { + var block; + + beforeEach(function () { + block = Block.fromHex(f.hex); + }); + + it('returns UTC date of ' + f.id, function () { + var utcDate = block.getUTCDate().getTime(); + + assert.strictEqual(utcDate, f.timestamp * 1e3); + }); + }); + }); + + describe('calculateMerkleRoot', function () { + it('should throw on zero-length transaction array', function () { + assert.throws(function () { + Block.calculateMerkleRoot([]); + }, /Cannot compute merkle root for zero transactions/); + }); + + fixtures.valid.forEach(function (f) { + if (f.hex.length === 160) return; + + var block; + + beforeEach(function () { + block = Block.fromHex(f.hex); + }); + + it('returns ' + f.merkleRoot + ' for ' + f.id, function () { + assert.strictEqual( + Block.calculateMerkleRoot(block.transactions).toString( + 'hex', + ), + f.merkleRoot, + ); + }); + }); + }); + + describe('checkMerkleRoot', function () { + fixtures.valid.forEach(function (f) { + if (f.hex.length === 160) return; + + var block; + + beforeEach(function () { + block = Block.fromHex(f.hex); + }); + + it('returns ' + f.valid + ' for ' + f.id, function () { + assert.strictEqual(block.checkMerkleRoot(), true); + }); + }); + }); + + describe('checkProofOfWork', function () { + fixtures.valid.forEach(function (f) { + var block; + + beforeEach(function () { + block = Block.fromHex(f.hex); + }); + + it('returns ' + f.valid + ' for ' + f.id, function () { + assert.strictEqual(block.checkProofOfWork(), f.valid); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/bufferutils.js b/web/bitcoincashjs-lib/test/bufferutils.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/bufferutils.js @@ -0,0 +1,171 @@ +/* global describe, it */ + +var assert = require('assert'); +var bufferutils = require('../src/bufferutils'); + +var fixtures = require('./fixtures/bufferutils.json'); + +describe('bufferutils', function () { + describe('pushDataSize', function () { + fixtures.valid.forEach(function (f) { + it( + 'determines the pushDataSize of ' + f.dec + ' correctly', + function () { + if (!f.hexPD) return; + + var size = bufferutils.pushDataSize(f.dec); + + assert.strictEqual(size, f.hexPD.length / 2); + }, + ); + }); + }); + + describe('readPushDataInt', function () { + fixtures.valid.forEach(function (f) { + if (!f.hexPD) return; + + it('decodes ' + f.hexPD + ' correctly', function () { + var buffer = Buffer.from(f.hexPD, 'hex'); + var d = bufferutils.readPushDataInt(buffer, 0); + var fopcode = parseInt(f.hexPD.substr(0, 2), 16); + + assert.strictEqual(d.opcode, fopcode); + assert.strictEqual(d.number, f.dec); + assert.strictEqual(d.size, buffer.length); + }); + }); + + fixtures.invalid.readPushDataInt.forEach(function (f) { + if (!f.hexPD) return; + + it('decodes ' + f.hexPD + ' as null', function () { + var buffer = Buffer.from(f.hexPD, 'hex'); + + var n = bufferutils.readPushDataInt(buffer, 0); + assert.strictEqual(n, null); + }); + }); + }); + + describe('readUInt64LE', function () { + fixtures.valid.forEach(function (f) { + it('decodes ' + f.hex64 + ' correctly', function () { + var buffer = Buffer.from(f.hex64, 'hex'); + var number = bufferutils.readUInt64LE(buffer, 0); + + assert.strictEqual(number, f.dec); + }); + }); + + fixtures.invalid.readUInt64LE.forEach(function (f) { + it('throws on ' + f.description, function () { + var buffer = Buffer.from(f.hex64, 'hex'); + + assert.throws(function () { + bufferutils.readUInt64LE(buffer, 0); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('readVarInt', function () { + fixtures.valid.forEach(function (f) { + it('decodes ' + f.hexVI + ' correctly', function () { + var buffer = Buffer.from(f.hexVI, 'hex'); + var d = bufferutils.readVarInt(buffer, 0); + + assert.strictEqual(d.number, f.dec); + assert.strictEqual(d.size, buffer.length); + }); + }); + + fixtures.invalid.readUInt64LE.forEach(function (f) { + it('throws on ' + f.description, function () { + var buffer = Buffer.from(f.hexVI, 'hex'); + + assert.throws(function () { + bufferutils.readVarInt(buffer, 0); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('varIntBuffer', function () { + fixtures.valid.forEach(function (f) { + it('encodes ' + f.dec + ' correctly', function () { + var buffer = bufferutils.varIntBuffer(f.dec); + + assert.strictEqual(buffer.toString('hex'), f.hexVI); + }); + }); + }); + + describe('varIntSize', function () { + fixtures.valid.forEach(function (f) { + it( + 'determines the varIntSize of ' + f.dec + ' correctly', + function () { + var size = bufferutils.varIntSize(f.dec); + + assert.strictEqual(size, f.hexVI.length / 2); + }, + ); + }); + }); + + describe('writePushDataInt', function () { + fixtures.valid.forEach(function (f) { + if (!f.hexPD) return; + + it('encodes ' + f.dec + ' correctly', function () { + var buffer = Buffer.alloc(5, 0); + + var n = bufferutils.writePushDataInt(buffer, f.dec, 0); + assert.strictEqual(buffer.slice(0, n).toString('hex'), f.hexPD); + }); + }); + }); + + describe('writeUInt64LE', function () { + fixtures.valid.forEach(function (f) { + it('encodes ' + f.dec + ' correctly', function () { + var buffer = Buffer.alloc(8, 0); + + bufferutils.writeUInt64LE(buffer, f.dec, 0); + assert.strictEqual(buffer.toString('hex'), f.hex64); + }); + }); + + fixtures.invalid.readUInt64LE.forEach(function (f) { + it('throws on ' + f.description, function () { + var buffer = Buffer.alloc(8, 0); + + assert.throws(function () { + bufferutils.writeUInt64LE(buffer, f.dec, 0); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('writeVarInt', function () { + fixtures.valid.forEach(function (f) { + it('encodes ' + f.dec + ' correctly', function () { + var buffer = Buffer.alloc(9, 0); + + var n = bufferutils.writeVarInt(buffer, f.dec, 0); + assert.strictEqual(buffer.slice(0, n).toString('hex'), f.hexVI); + }); + }); + + fixtures.invalid.readUInt64LE.forEach(function (f) { + it('throws on ' + f.description, function () { + var buffer = Buffer.alloc(9, 0); + + assert.throws(function () { + bufferutils.writeVarInt(buffer, f.dec, 0); + }, new RegExp(f.exception)); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/compile.js b/web/bitcoincashjs-lib/test/compile.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/compile.js @@ -0,0 +1,52 @@ +/* + Tests to fix the compile issues with BITBOX.Script class. +*/ + +'use strict'; + +const mocha = require('mocha'); +const chai = require('chai'); +const assert = chai.assert; + +const opcodes = require('@psf/bitcoincash-ops'); + +var script = require('../src/script'); + +describe('#compile', () => { + it('should correctly compile OP_RETURN SLP SEND transaction', () => { + const scriptArr = [ + opcodes.OP_RETURN, + Buffer.from('534c5000', 'hex'), + Buffer.from('01', 'hex'), + Buffer.from(`SEND`), + Buffer.from( + '73db55368981e4878440637e448d4abe7f661be5c3efdcbcb63bd86a01a76b5a', + 'hex', + ), + Buffer.from('00000001', 'hex'), + ]; + + const data = script.compile(scriptArr); + + // convert data to a hex string + let str = ''; + for (let i = 0; i < data.length; i++) { + let hex = Number(data[i]).toString(16); + + // zero pad when its a single digit. + hex = '0' + hex; + hex = hex.slice(-2); + //console.log(`hex: ${hex}`) + + str += hex; + } + console.log(`Hex string: ${str}`); + + //console.log(`scriptArr: ${JSON.stringify(data,null,2)}`) + + const correctStr = + '6a04534c500001010453454e442073db55368981e4878440637e448d4abe7f661be5c3efdcbcb63bd86a01a76b5a0400000001'; + + assert.equal(str, correctStr); + }); +}); diff --git a/web/bitcoincashjs-lib/test/crypto.js b/web/bitcoincashjs-lib/test/crypto.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/crypto.js @@ -0,0 +1,26 @@ +/* global describe, it */ + +var assert = require('assert'); +var bcrypto = require('../src/crypto'); + +var fixtures = require('./fixtures/crypto'); + +describe('crypto', function () { + ['hash160', 'hash256', 'ripemd160', 'sha1', 'sha256'].forEach(function ( + algorithm, + ) { + describe(algorithm, function () { + fixtures.forEach(function (f) { + var fn = bcrypto[algorithm]; + var expected = f[algorithm]; + + it('returns ' + expected + ' for ' + f.hex, function () { + var data = Buffer.from(f.hex, 'hex'); + var actual = fn(data).toString('hex'); + + assert.strictEqual(actual, expected); + }); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/ecdsa.js b/web/bitcoincashjs-lib/test/ecdsa.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/ecdsa.js @@ -0,0 +1,168 @@ +/* global describe, it */ + +var assert = require('assert'); +var bcrypto = require('../src/crypto'); +var ecdsa = require('../src/ecdsa'); +var sinon = require('sinon'); + +var BigInteger = require('bigi'); +var ECSignature = require('../src/ecsignature'); + +var curve = ecdsa.__curve; + +var fixtures = require('./fixtures/ecdsa.json'); + +describe('ecdsa', function () { + describe('deterministicGenerateK', function () { + function checkSig() { + return true; + } + + fixtures.valid.ecdsa.forEach(function (f) { + it('for "' + f.message + '"', function () { + var x = BigInteger.fromHex(f.d).toBuffer(32); + var h1 = bcrypto.sha256(f.message); + + var k = ecdsa.deterministicGenerateK(h1, x, checkSig); + assert.strictEqual(k.toHex(), f.k); + }); + }); + + it( + 'loops until an appropriate k value is found', + sinon.test(function () { + this.mock(BigInteger) + .expects('fromBuffer') + .exactly(3) + .onCall(0) + .returns(new BigInteger('0')) // < 1 + .onCall(1) + .returns(curve.n) // > n-1 + .onCall(2) + .returns(new BigInteger('42')); // valid + + var x = new BigInteger('1').toBuffer(32); + var h1 = Buffer.alloc(32); + var k = ecdsa.deterministicGenerateK(h1, x, checkSig); + + assert.strictEqual(k.toString(), '42'); + }), + ); + + it( + 'loops until a suitable signature is found', + sinon.test(function () { + this.mock(BigInteger) + .expects('fromBuffer') + .exactly(4) + .onCall(0) + .returns(new BigInteger('0')) // < 1 + .onCall(1) + .returns(curve.n) // > n-1 + .onCall(2) + .returns(new BigInteger('42')) // valid, but 'bad' signature + .onCall(3) + .returns(new BigInteger('53')); // valid, good signature + + var mockCheckSig = this.mock(); + mockCheckSig.exactly(2); + mockCheckSig.onCall(0).returns(false); // bad signature + mockCheckSig.onCall(1).returns(true); // good signature + + var x = new BigInteger('1').toBuffer(32); + var h1 = Buffer.alloc(32); + var k = ecdsa.deterministicGenerateK(h1, x, mockCheckSig); + + assert.strictEqual(k.toString(), '53'); + }), + ); + + fixtures.valid.rfc6979.forEach(function (f) { + it( + 'produces the expected k values for ' + + f.message + + " if k wasn't suitable", + function () { + var x = BigInteger.fromHex(f.d).toBuffer(32); + var h1 = bcrypto.sha256(f.message); + + var results = []; + ecdsa.deterministicGenerateK(h1, x, function (k) { + results.push(k); + + return results.length === 16; + }); + + assert.strictEqual(results[0].toHex(), f.k0); + assert.strictEqual(results[1].toHex(), f.k1); + assert.strictEqual(results[15].toHex(), f.k15); + }, + ); + }); + }); + + describe('sign', function () { + fixtures.valid.ecdsa.forEach(function (f) { + it( + 'produces a deterministic signature for "' + f.message + '"', + function () { + var d = BigInteger.fromHex(f.d); + var hash = bcrypto.sha256(f.message); + var signature = ecdsa.sign(hash, d).toDER(); + + assert.strictEqual(signature.toString('hex'), f.signature); + }, + ); + }); + + it('should sign with low S value', function () { + var hash = bcrypto.sha256('Vires in numeris'); + var sig = ecdsa.sign(hash, BigInteger.ONE); + + // See BIP62 for more information + var N_OVER_TWO = curve.n.shiftRight(1); + assert(sig.s.compareTo(N_OVER_TWO) <= 0); + }); + }); + + describe('verify', function () { + fixtures.valid.ecdsa.forEach(function (f) { + it( + 'verifies a valid signature for "' + f.message + '"', + function () { + var d = BigInteger.fromHex(f.d); + var H = bcrypto.sha256(f.message); + var signature = ECSignature.fromDER( + Buffer.from(f.signature, 'hex'), + ); + var Q = curve.G.multiply(d); + + assert(ecdsa.verify(H, signature, Q)); + }, + ); + }); + + fixtures.invalid.verify.forEach(function (f) { + it('fails to verify with ' + f.description, function () { + var H = bcrypto.sha256(f.message); + var d = BigInteger.fromHex(f.d); + + var signature; + if (f.signature) { + signature = ECSignature.fromDER( + Buffer.from(f.signature, 'hex'), + ); + } else if (f.signatureRaw) { + signature = new ECSignature( + new BigInteger(f.signatureRaw.r, 16), + new BigInteger(f.signatureRaw.s, 16), + ); + } + + var Q = curve.G.multiply(d); + + assert.strictEqual(ecdsa.verify(H, signature, Q), false); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/ecpair.js b/web/bitcoincashjs-lib/test/ecpair.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/ecpair.js @@ -0,0 +1,288 @@ +/* global describe, it, beforeEach */ +/* eslint-disable no-new */ + +var assert = require('assert'); +var ecdsa = require('../src/ecdsa'); +var ecurve = require('ecurve'); +var proxyquire = require('proxyquire'); +var sinon = require('sinon'); + +var BigInteger = require('bigi'); +var ECPair = require('../src/ecpair'); + +var fixtures = require('./fixtures/ecpair.json'); +var curve = ecdsa.__curve; + +var NETWORKS = require('../src/networks'); +var NETWORKS_LIST = []; // Object.values(NETWORKS) +for (var networkName in NETWORKS) { + NETWORKS_LIST.push(NETWORKS[networkName]); +} + +describe('ECPair', function () { + describe('constructor', function () { + it('defaults to compressed', function () { + var keyPair = new ECPair(BigInteger.ONE); + + assert.strictEqual(keyPair.compressed, true); + }); + + it('supports the uncompressed option', function () { + var keyPair = new ECPair(BigInteger.ONE, null, { + compressed: false, + }); + + assert.strictEqual(keyPair.compressed, false); + }); + + it('supports the network option', function () { + var keyPair = new ECPair(BigInteger.ONE, null, { + compressed: false, + network: NETWORKS.testnet, + }); + + assert.strictEqual(keyPair.network, NETWORKS.testnet); + }); + + fixtures.valid.forEach(function (f) { + it('calculates the public point for ' + f.WIF, function () { + var d = new BigInteger(f.d); + var keyPair = new ECPair(d, null, { + compressed: f.compressed, + }); + + assert.strictEqual( + keyPair.getPublicKeyBuffer().toString('hex'), + f.Q, + ); + }); + }); + + fixtures.invalid.constructor.forEach(function (f) { + it('throws ' + f.exception, function () { + var d = f.d && new BigInteger(f.d); + var Q = + f.Q && + ecurve.Point.decodeFrom(curve, Buffer.from(f.Q, 'hex')); + + assert.throws(function () { + new ECPair(d, Q, f.options); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('getPublicKeyBuffer', function () { + var keyPair; + + beforeEach(function () { + keyPair = new ECPair(BigInteger.ONE); + }); + + it( + 'wraps Q.getEncoded', + sinon.test(function () { + this.mock(keyPair.Q) + .expects('getEncoded') + .once() + .withArgs(keyPair.compressed); + + keyPair.getPublicKeyBuffer(); + }), + ); + }); + + describe('fromWIF', function () { + fixtures.valid.forEach(function (f) { + it('imports ' + f.WIF + ' (' + f.network + ')', function () { + var network = NETWORKS[f.network]; + var keyPair = ECPair.fromWIF(f.WIF, network); + + assert.strictEqual(keyPair.d.toString(), f.d); + assert.strictEqual(keyPair.compressed, f.compressed); + assert.strictEqual(keyPair.network, network); + }); + }); + + fixtures.valid.forEach(function (f) { + it('imports ' + f.WIF + ' (via list of networks)', function () { + var keyPair = ECPair.fromWIF(f.WIF, NETWORKS_LIST); + + assert.strictEqual(keyPair.d.toString(), f.d); + assert.strictEqual(keyPair.compressed, f.compressed); + assert.strictEqual(keyPair.network, NETWORKS[f.network]); + }); + }); + + fixtures.invalid.fromWIF.forEach(function (f) { + it('throws on ' + f.WIF, function () { + assert.throws(function () { + var networks = f.network + ? NETWORKS[f.network] + : NETWORKS_LIST; + + ECPair.fromWIF(f.WIF, networks); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('toWIF', function () { + fixtures.valid.forEach(function (f) { + it('exports ' + f.WIF, function () { + var keyPair = ECPair.fromWIF(f.WIF, NETWORKS_LIST); + var result = keyPair.toWIF(); + + assert.strictEqual(result, f.WIF); + }); + }); + }); + + describe('makeRandom', function () { + var d = Buffer.from( + '0404040404040404040404040404040404040404040404040404040404040404', + 'hex', + ); + var exWIF = 'KwMWvwRJeFqxYyhZgNwYuYjbQENDAPAudQx5VEmKJrUZcq6aL2pv'; + + describe('uses randombytes RNG', function () { + it('generates a ECPair', function () { + var stub = { + randombytes: function () { + return d; + }, + }; + var ProxiedECPair = proxyquire('../src/ecpair', stub); + + var keyPair = ProxiedECPair.makeRandom(); + assert.strictEqual(keyPair.toWIF(), exWIF); + }); + }); + + it('allows a custom RNG to be used', function () { + var keyPair = ECPair.makeRandom({ + rng: function (size) { + return d.slice(0, size); + }, + }); + + assert.strictEqual(keyPair.toWIF(), exWIF); + }); + + it('retains the same defaults as ECPair constructor', function () { + var keyPair = ECPair.makeRandom(); + + assert.strictEqual(keyPair.compressed, true); + assert.strictEqual(keyPair.network, NETWORKS.bitcoin); + }); + + it('supports the options parameter', function () { + var keyPair = ECPair.makeRandom({ + compressed: false, + network: NETWORKS.testnet, + }); + + assert.strictEqual(keyPair.compressed, false); + assert.strictEqual(keyPair.network, NETWORKS.testnet); + }); + + it( + 'loops until d is within interval [1, n - 1] : 1', + sinon.test(function () { + var rng = this.mock(); + rng.exactly(2); + rng.onCall(0).returns(BigInteger.ZERO.toBuffer(32)); // invalid length + rng.onCall(1).returns(BigInteger.ONE.toBuffer(32)); // === 1 + + ECPair.makeRandom({ rng: rng }); + }), + ); + + it( + 'loops until d is within interval [1, n - 1] : n - 1', + sinon.test(function () { + var rng = this.mock(); + rng.exactly(3); + rng.onCall(0).returns(BigInteger.ZERO.toBuffer(32)); // < 1 + rng.onCall(1).returns(curve.n.toBuffer(32)); // > n-1 + rng.onCall(2).returns( + curve.n.subtract(BigInteger.ONE).toBuffer(32), + ); // === n-1 + + ECPair.makeRandom({ rng: rng }); + }), + ); + }); + + describe('getAddress', function () { + fixtures.valid.forEach(function (f) { + it('returns ' + f.address + ' for ' + f.WIF, function () { + var keyPair = ECPair.fromWIF(f.WIF, NETWORKS_LIST); + + assert.strictEqual(keyPair.getAddress(), f.address); + }); + }); + }); + + describe('getNetwork', function () { + fixtures.valid.forEach(function (f) { + it('returns ' + f.network + ' for ' + f.WIF, function () { + var network = NETWORKS[f.network]; + var keyPair = ECPair.fromWIF(f.WIF, NETWORKS_LIST); + + assert.strictEqual(keyPair.getNetwork(), network); + }); + }); + }); + + describe('ecdsa wrappers', function () { + var keyPair, hash; + + beforeEach(function () { + keyPair = ECPair.makeRandom(); + hash = Buffer.alloc(32); + }); + + describe('signing', function () { + it( + 'wraps ecdsa.sign', + sinon.test(function () { + this.mock(ecdsa) + .expects('sign') + .once() + .withArgs(hash, keyPair.d); + + keyPair.sign(hash); + }), + ); + + it('throws if no private key is found', function () { + keyPair.d = null; + + assert.throws(function () { + keyPair.sign(hash); + }, /Missing private key/); + }); + }); + + describe('verify', function () { + var signature; + + beforeEach(function () { + signature = keyPair.sign(hash); + }); + + it( + 'wraps ecdsa.verify', + sinon.test(function () { + this.mock(ecdsa) + .expects('verify') + .once() + .withArgs(hash, signature, keyPair.Q); + + keyPair.verify(hash, signature); + }), + ); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/ecsignature.js b/web/bitcoincashjs-lib/test/ecsignature.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/ecsignature.js @@ -0,0 +1,154 @@ +/* global describe, it */ + +var assert = require('assert'); + +var BigInteger = require('bigi'); +var ECSignature = require('../src/ecsignature'); + +var fixtures = require('./fixtures/ecsignature.json'); + +describe('ECSignature', function () { + describe('toCompact', function () { + fixtures.valid.forEach(function (f) { + it('exports ' + f.compact.hex + ' correctly', function () { + var signature = new ECSignature( + new BigInteger(f.signature.r), + new BigInteger(f.signature.s), + ); + + var buffer = signature.toCompact( + f.compact.i, + f.compact.compressed, + ); + assert.strictEqual(buffer.toString('hex'), f.compact.hex); + }); + }); + }); + + describe('parseCompact', function () { + fixtures.valid.forEach(function (f) { + it('imports ' + f.compact.hex + ' correctly', function () { + var buffer = Buffer.from(f.compact.hex, 'hex'); + var parsed = ECSignature.parseCompact(buffer); + + assert.strictEqual(parsed.compressed, f.compact.compressed); + assert.strictEqual(parsed.i, f.compact.i); + assert.strictEqual( + parsed.signature.r.toString(), + f.signature.r, + ); + assert.strictEqual( + parsed.signature.s.toString(), + f.signature.s, + ); + }); + }); + + fixtures.invalid.compact.forEach(function (f) { + it('throws on ' + f.hex, function () { + var buffer = Buffer.from(f.hex, 'hex'); + + assert.throws(function () { + ECSignature.parseCompact(buffer); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('toDER', function () { + fixtures.valid.forEach(function (f) { + it('exports ' + f.DER + ' correctly', function () { + var signature = new ECSignature( + new BigInteger(f.signature.r), + new BigInteger(f.signature.s), + ); + + var DER = signature.toDER(); + assert.strictEqual(DER.toString('hex'), f.DER); + }); + }); + }); + + describe('fromDER', function () { + fixtures.valid.forEach(function (f) { + it('imports ' + f.DER + ' correctly', function () { + var buffer = Buffer.from(f.DER, 'hex'); + var signature = ECSignature.fromDER(buffer); + + assert.strictEqual(signature.r.toString(), f.signature.r); + assert.strictEqual(signature.s.toString(), f.signature.s); + }); + }); + + fixtures.invalid.DER.forEach(function (f) { + it('throws "' + f.exception + '" for ' + f.hex, function () { + var buffer = Buffer.from(f.hex, 'hex'); + + assert.throws(function () { + ECSignature.fromDER(buffer); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('toScriptSignature', function () { + fixtures.valid.forEach(function (f) { + it('exports ' + f.scriptSignature.hex + ' correctly', function () { + var signature = new ECSignature( + new BigInteger(f.signature.r), + new BigInteger(f.signature.s), + ); + + var scriptSignature = signature.toScriptSignature( + f.scriptSignature.hashType, + ); + assert.strictEqual( + scriptSignature.toString('hex'), + f.scriptSignature.hex, + ); + }); + }); + + fixtures.invalid.scriptSignature.forEach(function (f) { + it('throws ' + f.exception, function () { + var signature = new ECSignature( + new BigInteger(f.signature.r), + new BigInteger(f.signature.s), + ); + + assert.throws(function () { + signature.toScriptSignature(f.hashType); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('parseScriptSignature', function () { + fixtures.valid.forEach(function (f) { + it('imports ' + f.scriptSignature.hex + ' correctly', function () { + var buffer = Buffer.from(f.scriptSignature.hex, 'hex'); + var parsed = ECSignature.parseScriptSignature(buffer); + + assert.strictEqual( + parsed.signature.r.toString(), + f.signature.r, + ); + assert.strictEqual( + parsed.signature.s.toString(), + f.signature.s, + ); + assert.strictEqual(parsed.hashType, f.scriptSignature.hashType); + }); + }); + + fixtures.invalid.scriptSignature.forEach(function (f) { + it('throws on ' + f.hex, function () { + var buffer = Buffer.from(f.hex, 'hex'); + + assert.throws(function () { + ECSignature.parseScriptSignature(buffer); + }, new RegExp(f.exception)); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/fixtures/address.json b/web/bitcoincashjs-lib/test/fixtures/address.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/address.json @@ -0,0 +1,180 @@ +{ + "standard": [ + { + "network": "bitcoin", + "version": 0, + "hash": "751e76e8199196d454941c45d1b3a323f1433bd6", + "base58check": "1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH", + "script": "OP_DUP OP_HASH160 751e76e8199196d454941c45d1b3a323f1433bd6 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "network": "bitcoin", + "version": 5, + "hash": "cd7b44d0b03f2d026d1e586d7ae18903b0d385f6", + "base58check": "3LRW7jeCvQCRdPF8S3yUCfRAx4eqXFmdcr", + "script": "OP_HASH160 cd7b44d0b03f2d026d1e586d7ae18903b0d385f6 OP_EQUAL" + }, + { + "network": "litecoin", + "version": 50, + "hash": "332bdfb31f688c0be0137c7c038a6d0fea0de0b6", + "base58check": "MCZjFcwYJwwYqXAbd3bbnxaCVGs81cp43Z", + "script": "OP_HASH160 332bdfb31f688c0be0137c7c038a6d0fea0de0b6 OP_EQUAL" + }, + { + "network": "litecoin", + "version": 48, + "hash": "6ac624143d19a3c91d2ac5605f0aebdfeac5b826", + "base58check": "LUxXFcwXFPpRZdMv4aYu6bDwPdC2skQ5YW", + "script": "OP_DUP OP_HASH160 6ac624143d19a3c91d2ac5605f0aebdfeac5b826 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "network": "testnet", + "version": 111, + "hash": "751e76e8199196d454941c45d1b3a323f1433bd6", + "base58check": "mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r", + "script": "OP_DUP OP_HASH160 751e76e8199196d454941c45d1b3a323f1433bd6 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "network": "testnet", + "version": 196, + "hash": "cd7b44d0b03f2d026d1e586d7ae18903b0d385f6", + "base58check": "2NByiBUaEXrhmqAsg7BbLpcQSAQs1EDwt5w", + "script": "OP_HASH160 cd7b44d0b03f2d026d1e586d7ae18903b0d385f6 OP_EQUAL" + }, + { + "network": "bitcoin", + "version": 0, + "bech32": "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", + "data": "751e76e8199196d454941c45d1b3a323f1433bd6", + "script": "OP_0 751e76e8199196d454941c45d1b3a323f1433bd6" + }, + { + "network": "testnet", + "version": 0, + "bech32": "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", + "data": "1863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262", + "script": "OP_0 1863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262" + }, + { + "network": "testnet", + "version": 0, + "bech32": "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", + "data": "000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433", + "script": "OP_0 000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433" + } + ], + "bech32": [ + { + "address": "bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx", + "version": 1, + "prefix": "bc", + "data": "751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6" + }, + { + "address": "bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj", + "version": 2, + "prefix": "bc", + "data": "751e76e8199196d454941c45d1b3a323" + }, + { + "address": "BC1SW50QA3JX3S", + "version": 16, + "prefix": "bc", + "data": "751e" + } + ], + "invalid": { + "bech32": [ + { + "address": "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", + "exception": "Invalid checksum" + }, + { + "address": "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7", + "exception": "Mixed-case string" + }, + { + "address": "tb1pw508d6qejxtdg4y5r3zarqfsj6c3", + "exception": "Excess padding" + }, + { + "address": "bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du", + "exception": "Excess padding" + }, + { + "address": "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv", + "exception": "Non-zero padding" + } + ], + "fromBase58Check": [ + { + "address": "7SeEnXWPaCCALbVrTnszCVGfRU8cGfx", + "exception": "is too short" + }, + { + "address": "j9ywUkWg2fTQrouxxh5rSZhRvrjMkEUfuiKe", + "exception": "is too long" + } + ], + "fromOutputScript": [ + { + "exception": "has no matching Address", + "script": "031f1e68f82112b373f0fe980b3a89d212d2b5c01fb51eb25acb8b4c4b4299ce95 OP_CHECKSIG" + }, + { + "exception": "has no matching Address", + "script": "OP_TRUE 032487c2a32f7c8d57d2a93906a6457afd00697925b0e6e145d89af6d3bca33016 02308673d16987eaa010e540901cc6fe3695e758c19f46ce604e174dac315e685a OP_2 OP_CHECKMULTISIG" + }, + { + "exception": "has no matching Address", + "script": "OP_RETURN 06deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474" + }, + { + "exception": "has no matching Address", + "script": "OP_0 75" + }, + { + "exception": "has no matching Address", + "script": "OP_0 751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd675" + } + ], + "toOutputScript": [ + { + "exception": "has no matching Script", + "address": "24kPZCmVgzfkpGdXExy56234MRHrsqQxNWE" + }, + { + "exception": "has an invalid prefix", + "address": "BC1SW50QA3JX3S", + "network": { + "bech32": "foo" + } + }, + { + "exception": "has no matching Script", + "address": "bc1rw5uspcuh" + }, + { + "exception": "has no matching Script", + "address": "bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx" + }, + { + "exception": "has no matching Script", + "address": "bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj" + }, + { + "exception": "has no matching Script", + "address": "BC1SW50QA3JX3S" + }, + { + "exception": "has no matching Script", + "address": "bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90" + }, + { + "exception": "has no matching Script", + "address": "BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2" + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/block.json b/web/bitcoincashjs-lib/test/fixtures/block.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/block.json @@ -0,0 +1,126 @@ +{ + "targets": [ + { + "bits": "1d00ffff", + "expected": "00000000ffff0000000000000000000000000000000000000000000000000000" + }, + { + "bits": "1b80ffff", + "expected": "000000000000ffff000000000000000000000000000000000000000000000000" + }, + { + "bits": "1b0404cb", + "expected": "00000000000404cb000000000000000000000000000000000000000000000000" + }, + { + "bits": "1814dd04", + "expected": "000000000000000014dd04000000000000000000000000000000000000000000" + }, + { + "bits": "cffca00", + "expected": "00000000000000000000000000000000000000007fca00000000000000000000" + } + ], + "valid": [ + { + "description": "Headers only", + "hash": "55388f8f9b326bd0b8e50fbe44c1903d4be14febcfad4dffa50c846c00000000", + "id": "000000006c840ca5ff4dadcfeb4fe14b3d90c144be0fe5b8d06b329b8f8f3855", + "version": 2, + "prevHash": "3385c4b2a3499669987f5d04fa4127b59dbf2ee625694fa0bf08000000000000", + "merkleRoot": "cf52f0ed6571367818a801a169e64030d8cab1a9f17e27170a6924127e19dbb8", + "timestamp": 1413391595, + "bits": 486604799, + "nonce": 3760981266, + "hex": "020000003385c4b2a3499669987f5d04fa4127b59dbf2ee625694fa0bf08000000000000cf52f0ed6571367818a801a169e64030d8cab1a9f17e27170a6924127e19dbb8eba43e54ffff001d12052ce0", + "valid": true + }, + { + "description": "Headers only", + "bits": 404020484, + "hash": "20f7df301c756a285af5298543d7e26e66bfba3229730f110000000000000000", + "height": 370090, + "hex": "03000000af7b8278e9c67a6d6b3453239d83406a1b21aaed2bfeb10e0000000000000000a4a4dda66b46547ff41d668543f1f20a5974488257a1f35a07c1815187b30ab9913dd05504dd14189f370acd", + "id": "0000000000000000110f732932babf666ee2d7438529f55a286a751c30dff720", + "merkleRoot": "a4a4dda66b46547ff41d668543f1f20a5974488257a1f35a07c1815187b30ab9", + "nonce": 3439998879, + "prevHash": "af7b8278e9c67a6d6b3453239d83406a1b21aaed2bfeb10e0000000000000000", + "timestamp": 1439710609, + "valid": true, + "version": 3 + }, + { + "description": "Headers + Coinbase", + "hash": "55388f8f9b326bd0b8e50fbe44c1903d4be14febcfad4dffa50c846c00000000", + "id": "000000006c840ca5ff4dadcfeb4fe14b3d90c144be0fe5b8d06b329b8f8f3855", + "version": 2, + "prevHash": "3385c4b2a3499669987f5d04fa4127b59dbf2ee625694fa0bf08000000000000", + "merkleRoot": "cf52f0ed6571367818a801a169e64030d8cab1a9f17e27170a6924127e19dbb8", + "timestamp": 1413391595, + "bits": 486604799, + "nonce": 3760981266, + "hex": "020000003385c4b2a3499669987f5d04fa4127b59dbf2ee625694fa0bf08000000000000cf52f0ed6571367818a801a169e64030d8cab1a9f17e27170a6924127e19dbb8eba43e54ffff001d12052ce00101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2403089904174b6e434d696e65724251521defe5cdcf04ad543ea4eb0101000000165e0000ffffffff0100f90295000000001976a9149e8985f82bc4e0f753d0492aa8d11cc39925774088ac00000000", + "valid": true + }, + { + "description": "Block (~3 KiB)", + "hash": "f0ca57cf84cc953194cd87de4bd9142720a056dc6f27484767f3e85e00000000", + "id": "000000005ee8f3674748276fdc56a0202714d94bde87cd943195cc84cf57caf0", + "version": 2, + "prevHash": "0cccf0b884a20113ea2c53a381dacc92a68ae9db1cf86525eb259f0c00000000", + "merkleRoot": "0ebdaf5341d911e69ab53928e3f9f46e5ece27b950f3b43eae521a602bde41d3", + "timestamp": 1413393997, + "bits": 486604799, + "nonce": 3126400832, + "hex": "020000000cccf0b884a20113ea2c53a381dacc92a68ae9db1cf86525eb259f0c000000000ebdaf5341d911e69ab53928e3f9f46e5ece27b950f3b43eae521a602bde41d34dae3e54ffff001d401759ba0a01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e030a9904026309062f503253482fffffffff01700a049500000000232103b441d74dccfe4d9a3b343149557107a68feacbe95b5ea3af63f4259b4f278b24ac0000000001000000014c959784efb5b2e8d19e2aaca588f7591c10d8f9833dfaa70db9fcaaca123ce6010000008b48304502200d4e79a0aaa162413b812aa9a5a9af18933bb9ee8adabbbe745785ecd0a41d7d022100909f15d27633127727b02a36c2986c37fda5df7ac686002dc9d0b892678b42b40141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a914ff6d383fc1eb0560b5bf63bac7988763098ee7b688acb10abba80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac0000000001000000012568651e80bd1f2c08fde0b10ef507c19ca95e0f7249d6d8b473eada36963866010000006b4830450221008be9aff4a081f7c734e2b679ca3483e205711fad2733c5f5afb8c0bb5213930a02206322d9eb1808e5633da787bf56966418169fcb0a2b964b9a35053c4859cfd35f012103bb318b00de944086fad67ab78a832eb1bf26916053ecd3b14a3f48f9fbe0821fffffffff02a8610000000000001976a91452bc36b0497a027d1c5637d8df7389a48b34245a88ac101aff03000000001976a9148e8c1d4adef86c11154fd04b5012306715fd4baf88ac00000000010000000103642c8bfac609738fb1b17f270ba2baf5df8e87108fc795070c8bf2e415210c010000006b4830450221009714a186283b0d97ae5b24f538618f96e0cca42269e69c389c9c5211bb095bcf02200e3992501e90f44a8b03b26cf9c3f2b16d73d150ddefcae607fc1e7c2dcc02c40121027ccca0e0a9c86180431340aa14038f22428b196a7a97f4c63b4afe142afb55e5ffffffff03781e0000000000001976a914a4547646725696134124fdf5b465438b940d43aa88ac781e000000000000475121027ccca0e0a9c86180431340aa14038f22428b196a7a97f4c63b4afe142afb55e5211c434e5452505254590000000000f0a6c9ae7ec80100000000000000030000000052ae035cad01000000001976a91421cd98f4b804dc07f992559cb551158a078472f688ac00000000010000000183f2c7c9ccba010eeb72a53f83a41970c2cf2e2f2deac895e917fc1a8da11aec000000006a4730440220068e182f5528c1752414bb8db48637b8e329b700018d02056d4ed01721daef9f02202bb66702d586e4ece02e70ebac251b5e5e7af0914ceda2f5efd1ed0e7fbe51030121031765feada1e5d93645b514bced2ac7135bb4d14c41c5e1f9f973803537299c20ffffffff02a0860100000000001976a91436e875fe44ff4a4b13838d73ed32b5c62722096588acb09a9600000000001976a9141d6131f1ffad58a7d091f1fab29ee36b27b091c288ac000000000100000001387daacc7861110fc52535e8a9733d40fb9c56b281708993e1678c79ed927677000000006a47304402205b082eea0f426dc753b7489df44f2b979d1cccd3b6f0ec9bb2ca002cae4cf78a02203733f049ac70354ffa8eb290c7c470352802339ddcb940659340d15fac89c880012103e1a574d02cd9d0231cf53cb2ea5bba86d570f0edc9b5cdff613a46d381103fb0ffffffff01e054e111000000001976a9140744f9fd5a3b73a656694171412182a32f2971b788ac000000000100000001be200e8543914878d90b147f5a43bfc3828af510a043a4e0512293df5ea4ad60010000006b483045022025f5128d9d2c66a32e8fb80c733054a3ab74fcba6499a84f55918e52551e8d01022100a11f183fb8da767fb16b71fbe737f062983793509fc6b8286a6a2c84f6553a690121037beaee4dcb1fdf673665256608d3ad0beacde433b117ea8f0a8d23b8a0ee8307ffffffff01e092f505000000001976a9140744f9fd5a3b73a656694171412182a32f2971b788ac0000000001000000010f5ed77b8816242642a5ba39464e48fcd1cacce6dfc27862d922407b760fadaf010000008b483045022019737d8bebf06ae5588888dcf403b456484cd8a1eef73e5890f980dc9ef88aa002210088e8d47f7c719482ae74ba6bea8a70a76bbfd72f751bb78e49a9499e931608c50141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a9145bd3695ed80d96ad480bcc3e252030e30b1c2b1c88ac015db9a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac0000000001000000016f367591e290ecc8d36a27e00d03a789df873dda395a1c5dfc6e52ecd6d8630f020000006c493046022100e1a59d90352d278499ed252fe5318bef60aa4e6c12aea5b6308014db01370983022100e583dad2651f1cc4769e533d5f398fc49856f1d8500b75bb1970dc893231ceba0121027ccca0e0a9c86180431340aa14038f22428b196a7a97f4c63b4afe142afb55e5ffffffff0338570900000000001976a9141b0247a0ec998ce4774193e6629708a5112f3cee88ac10980200000000001976a914a4547646725696134124fdf5b465438b940d43aa88acab45a101000000001976a91421cd98f4b804dc07f992559cb551158a078472f688ac00000000010000000187bbd96b486f78f8f80a6c19d60c50637c3c56a08d96d61e941fdf7b30aa9a9c010000006b483045022100aaf951927b28c66f32e26c1ba29563fe04ba245cd5f30af7887b3881c30914320220692f588b0a31f730a70e99cf143ef09b29b2216268f15f71d7f0255842a4fd65012103d850746fc0287d8550dfba1ec81c340d3c192d10fa9c918908fc913910667f01ffffffff0280969800000000001976a9140bccecf71c0b232d9f89dabc3f2b5c4ee7170e7b88ac00000000000000001976a91418751b7839491fb642b370760c5887037d30aefc88ac00000000", + "valid": true + }, + { + "description": "Block (~32 KiB)", + "hash": "0cccf0b884a20113ea2c53a381dacc92a68ae9db1cf86525eb259f0c00000000", + "id": "000000000c9f25eb2565f81cdbe98aa692ccda81a3532cea1301a284b8f0cc0c", + "version": 2, + "prevHash": "55388f8f9b326bd0b8e50fbe44c1903d4be14febcfad4dffa50c846c00000000", + "merkleRoot": "0c40f497466fe67a94dd9dd6851844097ec0e30656959ccc26efde12e119f770", + "timestamp": 1413392796, + "bits": 486604799, + "nonce": 1810450624, + "valid": true, + "hex": "0200000055388f8f9b326bd0b8e50fbe44c1903d4be14febcfad4dffa50c846c000000000c40f497466fe67a94dd9dd6851844097ec0e30656959ccc26efde12e119f7709ca93e54ffff001dc048e96b6701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e0309990402db00062f503253482fffffffff0110801f9500000000232103a552615caaf1a5f824a47fffede99bc845d182d66daf5eba55a881bb596c6530ac000000000100000001d0fe6ff5a3cdd1ebaafec5489e7cffd5e15269fc06492a1b948bc3d503725621010000006b4830450221008dbd58f7d83223f7354e6c6c4201bf0723a107b2472294c51c0e8633df026ae502201a625322146f421562e139735ad960baf084335e7df445105838ac2d4b591af2012103c1d0ed4e6a4ed6a60e87021a98bbeb838cad9474fbc3bb45df1b2152f1ecc79dffffffff0200ac23fc060000001976a914b6c4f76334fa9c78ab90a136495366d4dfd6a8bb88ac40e179ca0d0000001976a9145001e1cceab6a9a5d29360c9e38e30010638437688ac000000000100000001e4dacf5f5d9856e5cc5503639f03030cb1325e5957d45fa018de00892379f680010000006a473044022075fe3a93ee65b18b1f2c7b32051a54b55e4497e8413da313b79f134bd562c5f4022002cfd7e72c81e7e7a4d7cc20e7a357ee9bf1ea837820968126d8880b98027bb8012103f5ae0228e424648dea53ed5e913ce2627d5b920ad4154816b0778a23dec0eb74ffffffff03781e0000000000001976a9149864a73e6d46d4a0ca10c693b450a868cd72a2a188ac781e00000000000047512103f5ae0228e424648dea53ed5e913ce2627d5b920ad4154816b0778a23dec0eb74211c434e5452505254590000000000000000000000010000002650170ae70000000052ae6821052a010000001976a914460e23da200cbaab6c3ced3f4e28bfc98a63be8288ac00000000010000000c9538dede63932e2fe2982c545ea6998718d1b5605090dd58519616b453db7e5e020000006b483045022100bbd78f28b3865fc2e4f9cd803a25d479fd0d9327a4ad96a99d1d47ca3f15094e022054173cba9e535f413552dacba5c1a50c52ac48466ae01638437716ae49d2ef960121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffffb59e4f1a7ebdbdff556b31302dd8a91a33d77b3957ae6ca72b489748afdbe9b2010000006b4830450221009c28408dd0164c3bd5c1b79540c916e851625826de9086fb8450e7bd439715b602207f90e0e898bd4c83c78cb4c1c9374e5257ace1ec854ffe8ac40198f2581bf74d0121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff91dd9ba2209e55d744ddee54086dc30593841c27f1103afbbecc27fd39e0fa36010000006b483045022062dae6848b1a56a90f4ef78f820685c4502bf265db2df71217f9473115f56fd8022100eba07d1665f5d51a9aafeffe2f6fc8a14088d638480718bbfaafed724b6c4e050121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff805e418a77068a845f6f9fc1b70e786cd69fb7ba0a377b732fac7468ac5f38fe010000006c493046022100a4bf26f55c6ab6ed7a93d2b2ea7d61fffef97240d2aa898bc1e66a23ee4e9c420221009b4d8e4105d7d7d0e518b8588f241c3768406747a16238d19ca3ac9be91a6e790121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff352e5fee82e0bc6602f384cf70955516a7704408c0ffe1e9cf8653f83834df0a000000006b483045022009bf389f60989afc68ce3c95bbbb101cc459e8563560726a2ad96fb3d78c28e6022100ca37cb90c653202004ec55df1719714ecc2d93ac4a79e1d01ce6e28499edada00121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff7dd3e25567c59fb11ff5d51e1df5721e791ce45177ffe1b03bde5f6f381530a6000000006c493046022100c1c4cd0032c8b492f8cb1cee933119ffe3af098ac9a83af6dff8beddb9f025770221009f397a74a31e2864b49ab52ba05df6a91434a4796aee8615854f5fab38645e330121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff4f1dccb3840dc9b283f40bcedde013952b5f63de3cd55637bdb107cddde18e90010000006c493046022100acca38436760d65b1255001c8e28e4b56a465ae0ced00339dc4624a9ace4ad8e022100d41a6a2176b0448ac0a42bd1c9c66b1b1d2fffbe27aeb78815f3ebe66fd40bc60121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff55f0f7040e86dc63abb338fe084aef5eb6212a94eee96511dd1e7dc1a0276e25000000006a4730440220249ba7396f8c00bde4c1175b6d23ddd6b0b316472a09a7c257d692305de7c97502206f8700e708155ea0ea7f21666b849c8c458555d6eba1f2efa33402619bef61a00121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffffad66cade8d08afb220204659a195c8b5d0ee3835d943b5f1e696ddbca24e6a46000000006c493046022100e7c30711e1824bbac03e4797fb989b1de1097868714933734fcbb5bf64861b5f022100892eddbb854a0415628a1b03f0adb45cb47b397cba03ff00536cab86c3f4c6e90121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff6c2fd410949b573b0f9ecf05f93c1e5bd23333d25a219dcf59e9422049d04369000000006b483045022100f38eb4802ae149ca498b6d0f9398e1724d659f75f6ce953868d3761b0b1bc4c50220067a29a68bc1ac0c85489949e069ed336d33b0b5c437bfb85733dcf971362e0a0121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff3d78262970277034a0d6fe72724be0901875e5a6998d52e9d086d4548adbb194000000006b483045022100d0f74329ebbc2377707143ac5f6a9c88e99cbd610fdd60a5d79229a69fadfaff022033c07ab93c23a41b9fc88a330e9c5a7b904f80085400ee21bdd217675de68cdb0121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffffa5ab972cc8ca1f10df69bc3ca1b05f68b23414b6f9efc486d8732a1ede6da29c000000006a47304402206d3d945226f41fee7f266c57089c96e1d75aa5c03675357617cd6781e38e5c3b022064f3f32221c26a9b4e33d3d78625210942c508d679c999e385d0d58fefa330350121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff02009ce4a6000000001976a9149864a73e6d46d4a0ca10c693b450a868cd72a2a188ac20114e00000000001976a9146c39ee7c8f3a5ffa6121b0304a7a0de9d3d9a15288ac000000000100000009f09b59178c8494f17e829c5c06295492024cfc97cd5286435bf3ffc8c0420809020000006c493046022100f0cacaeded00fb8f4c84f999f2052b6c4ab6ec5b41e5ef6223beb7fb33adfc1a02210084a5ca4e74ee0ff13d1e6840f6cc8d210e6d2411cec6b336a968ab62bc6ebe04012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff46b64a680c290c0eeddabc01d4de0dc736400b615324262348bfa0ba9fba249d000000006c4930460221008e6d830527e941d79a6fafc832a58173e7de92614275263b2746753f605a9d69022100baf17b1a870e0ee617aeffe726fe02a45c8fe19c09840b01851c64be2363fcd1012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dfffffffffe5db21f92158086e8a062f5d458c8652895815b0b550f8847e1c544b59a205f000000006a473044022017e1890c25400567aedc52fd0c87eb1411bd19b47e44411438eef2c7cfffb6bb022077f93849ed0fad655b48ddbab1c0b0dc0c704184000bcef7b22b6303956a9571012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff794c2f1b57dd6f54fe53bdb7220ec59b57f4114786e820355ecdb16f6d66dfbf000000006b483045022100b3cdad56c0451610957f474f1e21f30440cfbc4e8da8bf1e0e6b2df7df268f13022000f17c04a04d0b5f1daf4a11e78d581387d8371b690a435deafd9e5d425a57e4012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff09b1e86b31fd61037056116b96fd7e09edf83c414808d50975cf307cf1859c53000000006a473044022012887712278e9ec9fe936bdab5b46fbe4aa7232a37201e6f4871949ac32b47470220427b8ca31f60d45dbe892d5dad571c3e9844827894d0816520ff59e15ff47e03012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff559bda6c35d2bea892e02d1bd1a8ceb6cfb8ec6da4c5e64095aa6ece16da9fa2000000006b4830450220376f947fd4f6a34a6962af5f6a6b90aae828ff68a2312f0ed4abbdbb10311455022100ac3d53e42df05c62cf1874744a70d9f9a88a20cbb7fa9e3bc2f008fc0cf747a8012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff3bb1a45cb905a09a7fa335455e4a2403bdd3e2e07aa9de8e858f2df282e841ae000000006b4830450220058a3cda301167c4030eb8793870f2fc8b62b17ccbf04e35e733e2db1d9a33410221009163811a84710f73d043e6c72b932d257f566760752d13abeddcda878f4bffc1012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff73e038fd3ca63a87cb5f754e87151d5d4690005907d1fec8a585ac01269ed3ec000000006a47304402207c0f6cbce98127749da512ee7368dcb8973c5b5fe254a2b667a08636acda487f02202be9c33b4d49e6c3615116a0633cbd6fcfb8606dab768b66baae83069a6a5f79012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff9538dede63932e2fe2982c545ea6998718d1b5605090dd58519616b453db7e5e000000006b483045022100e2212e01176bced817130de9031785a25e41fb8f40449ea4b8ff74ef59badaa102207458caeafa0d38b6e9f5d13c8bf95b16c7a075a2b0e6225b025954a2e71a72e2012103a4ab022465616cca59be2fabce9601fd8226b681b05d62cfd61a1653da0cb59dffffffff01d8defd09000000001976a9147f6394009ab59c0ff5f5cda27ddf2fddfae4167988ac000000000100000004cbaef29b3dadd2016ef2e3e646dc75ef97438bbd22ca1ccc775172519d22962a010000006a4730440220329e18e737bc060d43596d2326edb43ed445b89e7ecb19682a2a59f4c50589ef022005fef3ad6601070ccaff7bae890259b6a7754284a54d00598c2d46e0c0c4a1730121037dcd7819ce02547f96a93deaf7ea5c6244d79f13c21a855be672eb28af964c16ffffffffa634945cbb12e719a9997387202aa589a4318f8416804aac1674d14ee5ad1e1c000000006b483045022100ed0d21ee6bf1a288525f8beb39596f844201bc2287aa1993bc3d6a67d246d33602206130710bf1ef50655c9dfa1713f28eba4e03d3084e2d317802e1a15347fa647b0121037dcd7819ce02547f96a93deaf7ea5c6244d79f13c21a855be672eb28af964c16ffffffff1fe00780bc3e272f758f6892b7eebc58798e2c253685720e944c484657b045db000000006a47304402200df0e0c3bab3e8d9c784237fb81ffd7fffe1dd56b4d026e1f423a0658732836b0220209c70ef792bb0912b4cad295ea53075f224f8121d0204fce5e3ed16b40b39c10121039e3480be13ca86714045e1d28da159e0b3647d4bfb51dcebd8b33985a47a51c9ffffffff06d9254a072fb767bf04fbc22f76332826f5b63532b1d11daa731605ef7a54ed000000006a4730440220636fc2e4e2ab68dbfacce1bc0741d6f2106a581b65077a2e2e08e3536a0436a302201a2a1967b4e990832fc03d5647e6f2512d12dc99fdf6a0a5fc125787a5305e490121037dcd7819ce02547f96a93deaf7ea5c6244d79f13c21a855be672eb28af964c16ffffffff01e84a867d000000001976a9140744f9fd5a3b73a656694171412182a32f2971b788ac000000000100000001b57bd3ac69dcbc285633cb4cf12c765c019e51f910c631fc1c74ad660dc5e7b201000000da0048304502204aa9b763abccd2409d63c618381c87b844dd7e7db093e14e37c8301272cd0be9022100fb59b59c39c2c4314ff2f08d1ab3fed224caf141e29605973b45c24a2540ccd50147304402202bc760c7f98446731f6aa2bbc0e3913229724e228bf8acc7f42f16107be158290220336e90a92a5aa6cd0d386895f4cdf8ec9ad313d9a458b7ca9d9193fee92abf210147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a9145bee13302ba496c3b2d3ccc89202fd76831228dc8768a4a6280100000017a9148ce5408cfeaddb7ccb2545ded41ef478109454848700000000010000000149c6ab2ace8003a6a1b5bf67e6e0fa897e1d2d2608172255f45bfb324532a09e01000000da004730440220214317cad717a1cd6baa040c52e697d4cd2b17ac4c85e18c6f258e412778bdb202205707884f09b4afb60063520004e8af694c6dbc7f6e111cf40ec0e0079041cb8601483045022100e2c9b18f26892a97b0008b8176b1d68f464994640d0208761e321390c4ce47b0022016e9d87c32d36e2add90a89abaa585eb164a756ded0136937e93fef3982ec5a70147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a914c4c9057cfe2b9083b6533f51f747ae3c77c5c3da87405e97280100000017a9148ce5408cfeaddb7ccb2545ded41ef47810945484870000000001000000017a22d9a45dc865bee7642eb16c60ec0a6717d8554772e0640a705c12e549018501000000dc00483045022100839f66f053917dd03a84a949b4bb539f8fc06c95ac0aafc9e78f6cc040ab419f022001eac1a450ca2613d6ce47db4a548565bb70886dcc555b495b77ed2a7140fd5901493046022100d35e6c8f71eed0114f8787d078a17310483a36100eb6cd7c9a0fb7eefce4e0b5022100d7640cdf302734a1a8e2ea81f3bb6319652134234859725a4f16ba780495f4e00147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a914d1e450d11ce446fc45d57001351842aa3b810cde8768a4a6280100000017a9148ce5408cfeaddb7ccb2545ded41ef4781094548487000000000100000001ac7c2b917cf245c06be4d59250bd433f367387c727b46616ad2594de8396105601000000dc00493046022100dc62b5a197b6bf7cc90d5d0f87fa97499e3bd456a7f8bdfef40df55d6a41b6d802210081db312d90ef3353aefdab24c58391c2337412b889a0160982e6312a9430c77001483045022100b5e89e670ad5aaa51ab412fbaa6718586fdb1b298fb3920ea90b4732c38063050220307721a03a54b4362abfdfc4d994b020e42a5b869c85fc089b9498d9d5ddc7550147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a914a49d822d44e0ef8d20022843032de6bc420b2f5e8768a4a6280100000017a9148ce5408cfeaddb7ccb2545ded41ef47810945484870000000001000000018f30d8ad625b6605299ed2f66a6b28e2912b4391937f7329ce2424ed178d7a3101000000dc00483045022005bcbe24a3511f401be2f94f5ec9414050d7b5d4c8a9c262d6a438a080559c09022100f6c5f4422bd702ba4fdc403c342c0796a6c4b34b236f15362827636448f02a1c01493046022100aef5108bafd191e519bd633460d334bc3ce662f513fecaf3a8d48ee93c3c2c04022100df30ec6fecf165cc187194b82c534b102d62c66e97c21291d8192b5b00a3b2aa0147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a9141ce06aa7fb344bfffa8252abb5100777a8baa5068768a4a6280100000017a9148ce5408cfeaddb7ccb2545ded41ef4781094548487000000000100000001054b9393e69e0d71bfd194558ec2182e38167e0a7256ceb0869ccacc3a5acf8d01000000dc0048304502207d21bee5933283111d4af205e3366e0ec8497e77553570737de9631c9554ef7f022100d284bd8ec48c58b879ac1e7f39ddc9e62ceae440636e9179602a666b6bd1a36d01493046022100af4c6387b30b0050af7ee32d7b900ba6e6051aaa41c876d54fbab95bde62d583022100c3893f9bea39253ec1997717ed50f4797522b41ca5732364d506be31342a82e40147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a914edb50dd706eba79f59fed2980843190799abc74187405e97280100000017a9148ce5408cfeaddb7ccb2545ded41ef4781094548487000000000100000001dfbc1c58a49e3a41a6d3ac9891124f49631f8a590a8abf788e971a59a155352c01000000dc00493046022100e04d51aed1ceee5b3dd16977f32fcb0ecca486b15483b792ccbf72fd444e93ea022100c6c1ef150716597a57d5efb3859c3a519b6099f8fcd76fd88dee51d9de6deefd01483045022100a0adc0d0ee2f333a0377ed97f233944b5017be97869f1ad3c0a4f63b7583bff0022019f9033576e8a1557e8c341290e04378ce8c11b59451aa1c99b36875f04b4a760147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a9148821c06dd300e0c5e715a7c4764bcff9725447778768a4a6280100000017a9148ce5408cfeaddb7ccb2545ded41ef47810945484870000000001000000016fd309077d56f72e8e479c41c20181edabef98b64a6b67412edbf24025d5a53a01000000db00483045022067574c4d4ab1a0c8ec6a8af7ece7ea7239612f447e06c7332049692694dc3bd0022100a04b4c0d3159c6b32087971d6ec50818d74136472cd671df9b3991ab72a127e101483045022011357745d9e0516b8d11f38959e1d16fb6135f43c52235c541bd50f0ab4af3e5022100a2b34b41173d7c2de383559264aaf67fdf4cb3a59de1774e809a9c362da72f2e0147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a914765d0d258d3d0e6a59bfee9bfbb20596518b95d08768a4a6280100000017a9148ce5408cfeaddb7ccb2545ded41ef478109454848700000000010000000284f9f2e4e397cce58c844dcf5ec258dcae775d5bb6c8e1bb9bd0f53f127f7cea010000006b483045022100a6e72fc5e8a0e07853b9015874d8e40e6861185ba440fa4d79ffe925206133d5022006fb2812553d16e46559ba2260536e5809c9e8e420ea98033b85d91f3726a3ae012103e5481d0ff7e3d8ce9190647281f5475724b349444ada4bbe8faacebf92ee94f7fffffffff93a9a177906a0ef7ef0232ccc9a2933a99b3369b996c39f8afdff5a0b95188d000000006b483045022100dca4ecdf7c3449c434fa0cf32193afe1aced32c7491e9cdaac592a61bb3ad8180220143cfc0cf38b68531699bbb8a6723205376cecdd254e33711b73c7b5fac9db0d012103e5481d0ff7e3d8ce9190647281f5475724b349444ada4bbe8faacebf92ee94f7ffffffff020065cd1d000000001976a91472b06fb7c4eadb3c789cf719f7799baeca7e760788acbf874711000000001976a9140744f9fd5a3b73a656694171412182a32f2971b788ac00000000010000000240a16cc443545b1ae809148704511609154d4a9d8dbe31dcd54bdee791eecf7f010000006a47304402207efad34302f84d50c02836b684670f4a94fd13983e23351de3b29441234204d40220242f0522da0602877f7d25f71b8a261db67eee197bd991961714eed2a63121f4012103e5481d0ff7e3d8ce9190647281f5475724b349444ada4bbe8faacebf92ee94f7ffffffff12aacb63b4b92d7ed823e660c33ca21e68322a2c6e7aebbcf7b1213f545baca3010000006b483045022100ab60c956a9ba34c406833c9311ab09ef7970ffafcb06ffa8d8a92f31a74a983d02200eaebf14c4b5ba4c8f48a4771dfd8e03ec2d14ae11d8ad3d9d487a738946344a012103e5481d0ff7e3d8ce9190647281f5475724b349444ada4bbe8faacebf92ee94f7ffffffff020065cd1d000000001976a914ee2af5db7aa20a3ba7626a94cdb2da48c0701b4188acd753ee35000000001976a9140744f9fd5a3b73a656694171412182a32f2971b788ac0000000001000000015adb3c14dbd5a07721af2b787c85a95c4cb133dd17f9063dc129ac849067813b01000000dc00483045022100c8fad8eece220e207e2dbdda58b8952a1dbc704d65665af4de527fb01b3734d60220085531162e2448ac58c769c60187a013aef46d26288dd97113e71e0b888ebd3401493046022100a55e1af65f9cdcfccf05c15e536c3d491831a3eda3fba686c7eeaec276f1d3cd022100ca4e818f811d3635710226623c892c0b31cd7740b8e74d4a0d7a59dfc1a76c0b0147522102632178d046673c9729d828cfee388e121f497707f810c131e0d3fc0fe0bd66d62103a0951ec7d3a9da9de171617026442fcd30f34d66100fab539853b43f508787d452aeffffffff0240420f000000000017a914c07e34dff7613b421fd17ae714ac2915cdcc54de8780a5e2ce0000000017a9148ce5408cfeaddb7ccb2545ded41ef47810945484870000000001000000010b121a3f08fbdf2e8ba32c5f60953eecf80dd67e121fb14d4209ffa0c4c2ec0f010000008c493046022100875bf2629f2cf6acdc2302f657ba7aca44eddd5fe37dd754b8a6fba8c47f4fd7022100bfcf0ed84925391c96c75caa5a914f786430bdc29ded3634e043aff339fa08ee0141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a914db2045e8f7c6327732dd242c865e0e418910644188ac9162c9a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac0000000001000000017419cb2cdb61340f43882c2e034bcc919fcc742444ec41406e72f7897ce64aa0000000006a47304402205144fb84c7af6981c727ee6866ddc9a37a5ed49557dcd1042721ec2d78b7c71f02207968261f681fc3a0531bebf366cb92c88e454325a4a2c98cf3dd66dacf0363920121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833ffffffff03781e0000000000001976a9149864a73e6d46d4a0ca10c693b450a868cd72a2a188ac781e000000000000475121037af2e06061b54cdfe3657bbc8496d69000b822e2db0c86ccbe376346a700b833211c434e545250525459000000000000000000000001000000dd0aff99340000000052ae80329800000000001976a9146c39ee7c8f3a5ffa6121b0304a7a0de9d3d9a15288ac000000000100000001b4702c4f28336cff691596e14170507ed9d64b732cf519a61287acb2edd773c2010000006a4730440220050fc133e55a1bd033b84931e1b62569f98737f099593c784609e03bacf231a1022029afb388fbe52e7819d9dac0d73cd0ed2035d9f917bae304ff224ce144198f40012103e86cf84b12237867a327cfa3f34cee931db055a06312b4bef003bb784b4ca74fffffffff0200688909000000001976a91449eee8f4d96e60d8bbfcc9f82747c4496ce33b9888ac406c026c030000001976a91443dd90e9647903ea668e4ea3f5feb8469630d5a188ac000000000100000001d22f69c205c88c4f52f7e148ca579f5cb3a93cc5e52689594e0f33306ac8694b000000006a473044022021fe708e2fc6d0dd2bbf7d022860f5e8c68e6b1fd6306fc3079360a48afbbd6d02203fd0d67f89e3cced810028ee8b48c47b9078438e99b0bfb4386f57afe9d3d23e012102ddda164bba2b1435b04a8205ca5eefb5115270e6d19f6daf8960211b17df086cffffffff0100e1f505000000001976a914eba91c185a67b207f461c7661ff36890fd43e38888ac0000000001000000017aaef574e423163a2fffa556544bd9483ba415e023d56bb40a9e3a9f805e934e000000006b4830450221008db13e8a38e3c10b41f740eff8b5f5789c1c134d68d97cf4b3ab1fd72d3c8a76022061972edc83147ac6cce1d03272a0afbcceec3fe840b43170e6acd427d6423653012103c117f27c03a87e09ae1b0c6f49d2ab79c1c199580a1d0ff2fd682e227a60c427ffffffff0100e1f505000000001976a914ebf067bf6053b3834f6154fecdf31ba28bcb0e7e88ac000000000100000001f0ba13339fb4d5f722a02bb31383427014d967cca259fc51ba6b1209129d09eb000000006a47304402201382d8ed4c3948a33da4131910d060b79e74afd2d890a9f99bcd5358bb6d5f6802204720beb06bb6f1a51528941e587d547e2efbe0b3f96c8d19edf71ca09dddff0c01210222e624e056d0de15bb97e28c7fb8c149dee686f3027f17a032617152c7676d09ffffffff0100e1f505000000001976a9146d2276d2ff9bdc3e3da97c2761bdac3d3104241388ac0000000001000000010df8c6a9c06786b269b6db1dcff3b766fbb13532352d48ae175245594178f949000000006a47304402204715e1ba8c869d7574cd4f4ad4ffe7eda44b3e4c11640e03dbcdf538afcb2bc80220614d5a17c60e84e1bf38e0d2d2a4c7fef7a91a2a42466bc8cbfcf0b48a650761012102c9bf3691bbd97c2a6bcb8610f547cac3ee169f5d59e947069d85f2f35df1a6beffffffff0100e1f505000000001976a9140693c924d0650fd0cbe51d87de977faf13c6a29088ac000000000100000003bd698ace3161ce9e9bd493c24dd43e78fb61f079c4aa047932244d8c9948c2b8010000006b48304502206e82747317df2734e5f2c74514c575ddb7d79ec928649fd1734ae11d53703c4402210094f7f303c2ead5b0fb33b9d7663e4a0bc2711390ac5b8d742bf0bc747b16cf100121025c25273e23fc94e9bdef68279ce4b2eda49dbf09635af064b8bc89061c2d334cffffffff06d9254a072fb767bf04fbc22f76332826f5b63532b1d11daa731605ef7a54ed010000006c493046022100a67df7840a93b3f19d8fbad4383557585017fcff853b488292c626ed155e3b350221009b3aecea5f29b7420ec53b0d119996a569e421a752b1fe30efdebb9f158b498d0121022ee4f8d242ad07274e4deccf0523dcbf6da2e55cdac0f92e8a79e40c721a7350ffffffffcbaef29b3dadd2016ef2e3e646dc75ef97438bbd22ca1ccc775172519d22962a000000006b483045022045df4b9c83159061ba910a07886a5eb312fd244faa963cddf6dd5af20b685bf3022100dc29ca5952f74934d589b838bf785042e78b638756fc92e71d3ef8e4bec8aa8c0121039b1a29bea54d0482295ebef1d023c686dc156722bba16bf317b38636bb1717b2ffffffff01a834f20d000000001976a9140744f9fd5a3b73a656694171412182a32f2971b788ac00000000010000000136e0ee46b394e3e665ad264d6b0e813f510ebd49c9cf4ee9fea66394a3cdd516000000006a4730440220547205d8dc30ae833b82cf0acc2c76079e9344ceea410bef3dba06b96ae2f0fc02206a3b175b1229079b64892d99bccffbe8cccf9ce634a11e6cdccb2d740a89c938012102c6052392f63433a8874a85e632960df44f901bbcb81e75e91c502eafe8437b88ffffffff0239660902000000001976a914e31b53d30d08216f5b7e8b8fb153f424f0cf2c2d88ac7493f901000000001976a914474a84925c770102eaa92c509e95812507f3f7d188ac0000000001000000015559373139aeb2fa33fcf78ba3e571663b20486cfb7d896528f97091975c5605000000006b4830450221009112b1958627956e05b5468f60931317b83dccdb9c91a195f49ceac2fd42bba7022005b57df3119060ffe82d478d834dc3d6b4c743787aee2801dc3cc504578ef3af0121020f4f9616ef316d44aed4f0fa971cf32e455b8f82e90a7a9c54dfe37d5c3ec135ffffffff02c9658b01000000001976a914066d59ecda788373e3206282d5255777b92a893188ac69256002000000001976a91418db620c4ec4593d76fdc6d4a30a531d08ca959a88ac00000000010000000262ee525e057cd877f7ceca8b3d3dcbd977fcfc993e6c1edb8577e707b4b5f61f000000006a4730440220292a063728cadfadd7cba2599cf5cd0460e9295fac92f50fe73da9c1c949979d022079794d70e84787a720b535cb1122cdf8c76486c7466ea6d12032784cd2776e230121030fdb4faabae84b19a7b192ed101ea5c8bbe5067acef3caf3553d23d1328fe74bffffffff2eae185b608e4598ee77e575f2ed39cd1cea745549aaf0288bc4e9cf696abeaf000000006b483045022100d338cf96525cf590a9f67046bb669f0636614b2ed9b85f07ae4db15c8d03ad8b022001ccf28b1733b03a218a5a6f1aeba5e35f424e39578730e50d927a574a6835c2012103612de64d269ed8a44f4fd3b5584ae7e5620909b5991d20b534525ed1b54ebc1cffffffff0220c15500000000001976a914f091a6cb3afa861e0dea0139dd26c60ea21cb8f388ac50690f00000000001976a914e8255ec318662f530c71ecb9ec1bfdb98ae7e45088ac0000000001000000016ad4fa5b8f91a88aed9fe60c2954b839d0d3f8345deb5f31ca6abb66e0213d3e000000006b48304502210093612fd6c14ff3f01f88e1f96d579b20af951c38fc3f96334c7f55a9f2df2d2b02201279f695bcd933bc2bd89a6849111a9987058a24cdc11b2838e0ebfdd702c9a3012103d850746fc0287d8550dfba1ec81c340d3c192d10fa9c918908fc913910667f01ffffffff0280969800000000001976a91421620cd6d05d98cd15d2c7957d3c07bcf9731f8d88ac80969800000000001976a91418751b7839491fb642b370760c5887037d30aefc88ac00000000010000000214b9b3fd8986001e9dffafcbd08b5cf96d893b326eca48e1a6e600875ba7c1d6000000006a4730440220771ac11af98c9f3356c72c57e6d7b61d0ec6b1fd472c879e72f3b65adef3bd9c022006184aadbd78eb46494771b7a8636273c4a43b2369e57a921fe1966a4f684fd9012103e4b47eb68ccad5cf770836ba84d7450767432eda7ad62aea7c593db7a133cea8fffffffff53570346a73aa9ceed9ccc525985b06f412babf2d7441e52db9db6cc83551d2610000006b483045022100a67e312945d4b56a559352c743e4a981aba2856469697dc629db85f0e4f2e54302206ed43173e5e65af5df9e55303ac9689d63f458d9554e4fd37035aa8547736ef501210253244eaa74d1b79c722e062a98a7ca2be46e7a26edd948b5b5b141c5f1d15475ffffffff0296ef0800000000001976a91414da5dde04bc5bf7358984bcb227ed431419ef4d88acaa520600000000001976a91491859a64a061038dee95e6be293c7a9849db22ff88ac000000000100000002a186000a255c2cf7b6ccb4ec2774365629a6687c55643387e89ada264c5fd65c000000006a47304402203e1d65edfa06295a66899d5f3c5494fbe109c473afdb699ecda484e70f77e1e0022063a0c24b65b5c54aaaaac006161ac77bb4cfc402fe955654e993c1bb39e82fc0012102a7fc839c0427d33a1158f5b1d60d6d88fe6a790a838c6255cdb15f1a417af601ffffffffe0f8c952e4dfe597864519f34b292bb4b0094978b8f7bcbf0066d55b5198e934570000006a473044022008d5f4cca8362a1735a62e6ca1c95626fc9e9add2bbd24ec19d3eadca1791c9f02205ca558bd7cc3131ca6a4f89a86f78e83298dc98bc7a3ce1b109d020a398dffa1012103f9b986f00ef7410d06f50eaf324deb4513f83079ab7a42acdf470c12bb078adaffffffff02908e0800000000001976a9147605eab76b8020350291bd3d22d8999d991a757688acb0b30600000000001976a91414da5dde04bc5bf7358984bcb227ed431419ef4d88ac0000000001000000010bb8f053cdf88a3048c9dc92f014cecf514e1841c5cbc6eb21218ffe60b4706c010000006a473044022071eb972e731146779d208e378a521e098bd063143ddd3b10271f1d1a94e934ef022068a48334b2a92c52e97de4c1a41acf777ad68fa76fd2917cbe32eefcd057ae2a012103f29b04e608b2e2247969d0488dfec01a2ad4b83ba7bbf3c5ba4460c5782acf41ffffffff0210270000000000001976a91417a149e8da478715292c372a8dee19453f72293888ac605af405000000001976a914dae4b5b55ef3219a9a79cd0143379e73ad3185e288ac00000000010000000195fb54d349c2d732001dd6f3b373cd3880e28c9e421af34801f1a6d2b88a41a8010000006b483045022100cab333e2c20a2003b410a2f013800b3107fdf0d6c42bd3235369beabae73ed6102205ce3c234ff199a2d742e83a00420a3f071d68f6732a6dfc141e2b86f8b988afe012103f54d81de4eec9215803c88d4097bd6990523e5a69ca6c20aff080f94d8925f39ffffffff023074f105000000001976a91400a469197c35da3fa892ff221c22840c2d15ce8788ac10270000000000001976a914f1c5145f86267d64199a22e2c420d022eb56575d88ac00000000010000000136e0ee46b394e3e665ad264d6b0e813f510ebd49c9cf4ee9fea66394a3cdd516010000006b4830450221008eddddd407132af0fdebbdd756db68f3440a3d41047bce5fd30a08a6fe5adbb502200825ca373a426ac1471c44eeebd29f10f1459d949a3cea09c7b95d1ff269cf3e012103c70fe3608fd1a6cfb79a66552a2ead99a3d20716ac20b8988ca87636f9c422a8ffffffff02a0860100000000001976a9140172c2761cef7a82f63cd1bd9921306d66fbb93d88ac9312f101000000001976a91424eb20998407878b5d704e54a8c0ace7b1be0eb888ac0000000001000000014fb19d79fb214b86b0fb0a6577c4250b2cba5358a14d0afd7acfdd7b2b055bfa010000006a47304402200692f6d951f2cd66c7a0d9aaa530fd6a07689c65cb5cd5b6d04faaddf75408bb02201e9c0e192ea7d59e1ac9ec2be449f3706fb0f9227c743defed62b3ba5b47f3880121021225b15301c1facaacac0104d6bd05a33046b2ba4731edaa565da41d7b4c2715ffffffff02f0490200000000001976a9142591497f043482f83f30aeeac043291dffebbd0188acfd03ea01000000001976a91457207e70a8aabb9479c5b4716fdbdf0c4238a9b088ac000000000100000001600f3a2aef32b8275f72e356af3cb94ac371c2d40464f899cef86390282f16f1000000006a4730440220521bda4b96e98e37a734ea9ae79c22f2da9b2ba4b1888d1af544b1172ba13b670220609121425bc54c61390bc9a73c92ef4c8e041c5da5d01de72d56d95340845e20012102f543b68df48df748df773d7c6359cf1ff90f81552c513572602733408c3f27eeffffffff0290f60e00000000001976a914b00e35e1b56764175f33e7caa14ccf14f94b5f3088accb85dc01000000001976a91478b58ed969d5df656b5a2bc42c8355656dd354ed88ac000000000100000001287a6ba0a3a61b4132b374c62ebf576790b80c1679accd0b8a655fe2daf9f282010000006a4730440220325c6e862d0c076cefdbe9bc768be8c417a63289aa12c85218e574a979577b3f022042288b09b904764e16019ce51cd3ee9bfbf9e20349f458f27319ae4df67d22b5012103c8fad558718b44e388695b2969d17cf7daaa1fb872ba072d0dd4b97fa1c8b594ffffffff0253c6a501000000001976a914aa2a1b4b7cb551c663c91280e83b11ef25bf488b88ac40420f00000000001976a914fde75662f6e3aaec042bf3670345e070286b6e5b88ac00000000010000000189f749d3a7c6ef70b549a3f7502bdeadc3ab0c98bf80b716d961bf3830150012010000006b483045022100fe8ed68b63c84e3a251f8717caeae551117f52187cf6d591f1d448ce68a57fa202206182a016acaa14438bb25a87345b55340098f4ed6d7833b51f1b2364ae2b328e012103cc3e7ded16d0d2a09b40faf7ba90da7ee77f71ed8086b6bb8d5a97ed287740a9ffffffff026e3b9401000000001976a914a4a2e8d23729124e04dd84b6abfeb53f1a3e22d588ac20a10700000000001976a914b5fdc18f8d82cf96dfea700f7a4dfc434a07fd1788ac00000000010000000129160bfe0aad2936e867fb84f49b484ce6d0c8831cfa88d214641acbbb0ed3a2000000006b483045022100fe49582a0906dc7ae9a167a67249ab22e54b91c4e08335e2924724afafb415df02201f557f540f20ecae35a06f40a1bea9ee7563bfb5f9738fe56bb2673e11690af5012102fab3570778a8b802b52d2fdb583f4d800bc0321b707a3b5b2e78cb4167da4e11ffffffff029df58001000000001976a914cfb467700301f9406e82047b49043907e9b9036b88ac20a10700000000001976a914b5fdc18f8d82cf96dfea700f7a4dfc434a07fd1788ac0000000001000000010fcf7953a6e8f88c430c24b630a61d5a49181afe2e767ce76119ade9fe07c231000000006a47304402201bdc04089297f83336c6e75db11eda95e417d816566f8b89a692f032127d771c02204cfd078b03f01916b5104c44e33067c38338c15e7f243c45e0c8204553f096c10121039b790ac2e936f461b9aa4c93ad40aaf715c800e35c7280f8f71ad222c4aec018ffffffff0253607101000000001976a9145ffd1ab701aaf92210c9125a3e8631505db4ce2088ac20a10700000000001976a914a54a4680732fb4ab0a5893690f8606cbe24fbc5588ac000000000100000001918ca179557f97ca12aadbfb9ba1c18dee32afac64e5ea292790b468c7edabde000000006a47304402206ecdde1cb4c048911c1f271e60edd7d2892181fe262b50b12cf55971e288ee3202205cdf0b06ed964700860c6c266004a9ee5199d80835145c6f153e78056996a1bf012102c28e3e4e6e25d5d7590f4a7ce318c32c0a98c380aab803873a9628c7e0d5c8f4ffffffff025b227000000000001976a9142baef9004079d373df20c22b0dfe40017433db0c88ac154d2800000000001976a914ec0e8c940a0d3c9a786268e2dcae2e3d641b632288ac000000000100000001d9fc92b02970e558021a15e5f6597ed3075a3972705db1990e6eb22d8f21d8fc010000006b483045022100828a4eac23959ec1574f060a7207161e49e4267807bc9744bcc190b5d8caf39a022007c8eb27f14b7f5670f5611a9e6f30a8a206763eccee0b7a5331d0ad552befb001210317f6cc241d8f0a0123378475e52267b6f6870f134b66e9135ecdbde79df4dce5ffffffff0240cc5705000000001976a914b29f68300e3e489fd301a7a8e01d25ea6f1320f588ac10270000000000001976a914f1c5145f86267d64199a22e2c420d022eb56575d88ac000000000100000002d04ddebd5d7076fb60a39b977208d67fefa431a91f47628304f913605c25a68c000000006a473044022050fd6cde2008b312900692a3928d4bcf1b7d150c22fc77598752a75b94d5dbc0022045715e024c59b5060e8246fbd0b9e86ff2408a6cf4b79695a457d131543afa87012103b5ebafa7223a8b4dcebf89d14fba39f5393ecd839e02e09c691180d29974795cffffffffe0f8c952e4dfe597864519f34b292bb4b0094978b8f7bcbf0066d55b5198e934520000006b483045022100a2e0690726c6a8f45a3d4685676c81a43deae953e0a3069e8045cdebafa1fbfa02206327b98b5da80b494830b5654f6844878a7ea06161279fa879cab1d1b337f01d012103f9b986f00ef7410d06f50eaf324deb4513f83079ab7a42acdf470c12bb078adaffffffff02b5a20100000000001976a914665f2d69bd3aeff8581cf66e2764b849a63ab81f88accb770400000000001976a91414da5dde04bc5bf7358984bcb227ed431419ef4d88ac000000000100000001048f282287120e94e0a87bcb4c4c4c07c8c2f8f6e09ced38d861e0331789f14b000000006b48304502202fd11730a933bf595803f10b8c634aea441263bff45200fe29982ee663c89acd022100f51c76447481326553925c1becd5eb86c0fae7ec2fd2ebf7b93ab6ad86a9ce5501210234eece87d535b56c12df83f70e479fc409957df7929b0c4b08eabaacde1b0a82ffffffff0240420f00000000001976a914153a6b7f423b4e51c69039635260eedfe2b584e088ac307eae02000000001976a9145481ed9fdde635476f602b9c9816fe2ce6d5c28588ac000000000100000002e33ed9cab58586d309378728d5644c1913b919c7a1b8675a603f48d2df256631010000006a4730440220015a7513ef719c26f32c97ecde8d570ab3d2196add683430d64a8302dfec8bc002200d9a65d86419813df213a95070731412b6fb2615aab1a495c256046ee40f6a00012102073132dc08c82ec0b01dd90494b27311cc8062cdd543e1ccd25ea9a042e10e6cffffffffe0f8c952e4dfe597864519f34b292bb4b0094978b8f7bcbf0066d55b5198e934100000006a47304402207d850910a0a6766f59338a4d9bf7c735a54c1ab0b6355bac08e668260a3e85f90220586e1043c5a68c7ffe35271cee0aee1b20272e6e722f18f0f5d532b4b027b73f012103f9b986f00ef7410d06f50eaf324deb4513f83079ab7a42acdf470c12bb078adaffffffff023aa00300000000001976a9146ac3dedcb939dd161cf1cbb79d476e54acf811fb88ac7e111400000000001976a914c3f5faffd3dc6f58e0accdc372e14beaa16e3d3088ac00000000010000000241504c537ef2c3e8a8e967d1c560bbadf257c6287fb248c99ea8c87d7d93973a000000006b48304502210094742457c5afa6e809e502e120bfdce94df70a84346916a1d3058c1ed722ca9202201cedf2acc9b309a20c2c4c6f5ebb3fdbae48a81002de7fc4379ef327af53db74012103f0260d1e5394ecaacbeffbd3081d48ad882a83dd1f6e2911a494af3760a879ceffffffffe0f8c952e4dfe597864519f34b292bb4b0094978b8f7bcbf0066d55b5198e934180000006a47304402200cfa32de673d5e505348b0132f09dd3932a0d6950d64a635726808bf27cd13f102200f0985fe3a11f4c0d80bdb8f58e7ed182b154f611162e11cae353778c875b6fa012103f9b986f00ef7410d06f50eaf324deb4513f83079ab7a42acdf470c12bb078adaffffffff02dac40300000000001976a914b18e3c27cda57acac294c7dcd0fa4af5f03a143888ac51401400000000001976a91479450defec6479b2f87fce094c215749528474b688ac00000000010000000272bd1b874963895687dcd5858f9e623c5274e662a95ddb5965cbdeae95028ec1000000006a473044022049f4841b790589647ad484b55e5c8c2c52be4900e492b7e38b1aa2532a76571202200ebaf2ea0a81eca80de1664d9a24c4f38471bebefba0308e380ceb4e872d6a980121022467cc3e4628dbb9ae6fefb534db67c6856adf85bd9843596260b16f1a394fe8ffffffffe90d2e51a4374b3975923f4f1acc37aff14288a40a4593f79742a382cb81465f590000006b483045022100c92e92776ac2884d6543faf2715f8914cc1950afc22e369a752e731fd6ae65ae022078234809f091f7ea344e54c3e77c6397275a1e7d50131991e3b36825648b5235012103f1b4d21e0b344248185408c1af96bdf05f8ee8921dfe400fb1873add6c6e1cadffffffff020dbf0300000000001976a914a642ba657b0dc95190d7067ff2539594f118d01988ac111b1400000000001976a914a2f8422e68f88d6e5fefd3c3c67b6ce8ed4f8e7788ac000000000100000001204a4dc8fed37cfa57e18b042563b311ebe380e6961c65babd7f3c782d0df3fa000000006b483045022100bdb2b7f8c4391a3567d5d5723188d5f3e385aed4c0681e88a0565fa49401ff5f02202153542de0c016fc041cf0078186ce0014997b0134a031d2c4756fb0e1118f4c012103b9d19bda4f288d75fd43add98605285948554aa94c45a3a5e011ad2ffcae07c0ffffffff0240420f00000000001976a91446840e50aaf1b883089b042e4273fbb5ce2b9c4f88acfce4f101000000001976a91454cb919bcc7807e505b1e4ccad4117c4fadc316c88ac000000000100000001e9acf2718a51f0342117707862a54d4e88dc4687602f10c10c7349a7f0776358010000006b483045022100e80e54812e6f2861bfbf1ac81e7bf3ee6dadfc29a66a90ebaf8a5697e030e4be02203be9e88ddf7c60a350468fc45cdd6bd0b282520720f9c4e920e61e7c6d0509ac012102736a6327cc55da03a66dc9191f05f75f79aeb478a45690f5073f3fa6d25f8df2ffffffff029ce2c201000000001976a9146de811dd2dcf0b5bb946a9674a55a65e97fbe36388ac40420f00000000001976a914a27ce59535bf7df916438477091db364acf7497b88ac000000000100000001cdf2b8d3a53caf43e95573519e367727afaa6b3ca56b81f488a672fe3530dfa9000000006b483045022100c17f5d83727c41cc5e1d6f344543d3608af8e0e601d9e58a6662471bf6691b6d02206ab1fc3af73117c68e3a45298f5eca826abdffc3bd2e45051518e35e2800c14e01210206b70a4bc82d2440036bd60dbac15f86d37c7371d59b7b319bd6070808bde174ffffffff010e4223000000000017a91420a28c44599f373d0634cfc252a687aaf173921e87000000000100000001d1ee1f739f2fb1858c4f3718a6d921e907b4f5e297d824f154ee439c4e928f20000000006a473044022067fbda22575e4350242bc38ad56b96c2f9e218110ff43b5f9ed91cd3b9d97ff5022052ff6569053c08c28db9380abe0454e0210c0b97d86ddb8c1fed6543011c5bc3012103bd9ec3c65e09ab45889e362be3272c407c12c643b3eae3b2ac811d7ad30a1025ffffffff0140420f00000000001976a914276c786a1b5b683e67ca92a7d9f80ddf7a65c90c88ac0000000001000000013fd68ae235d1348d4f53445593744a8983dfdda5381ef8f38597097a27a7ade4010000006a47304402200c4160c7a8c145ac41502326071938cc6c5a4b1504f22c6e0687f7ce7686ef3b022014aea6e911fe99eb7c45b8f3408666713c768987e4605e5e0ce14d75b79e5d1c012103addc0d975ec1447c0dd7c0c5eccb3e090b4da22ffea512b1dd1e52ae45491deeffffffff0271991900000000001976a914b9c5b763d69ac9423bde2514c9c84ea206d45a5188ac7ea10200000000001976a9140df5cdbd67f672f755e2610ce35b574f630f0d0188ac0000000001000000014967704cecca8b905658a6049da6e289b6a1ab3b801766d2ec36378257636f3c010000006a473044022010b961d5a7777595b5237eaf85ded87fa59fad12ee150b35143f9edd9b6097de02204af3dd8d2510bfc7e52cca75612054df417e6754f3b16c023551de5680438fc6012103b403c42ab014e8f24bd8f87bdfa685f3a18efb61a9c1a29992feb259d6b22c5bffffffff0230c80700000000001976a914062ba22c85d9460833e8ffb67d4119c95428136688acdc997d05000000001976a91414c402f2c30b8d80c3719d090f7f8a2316f103e688ac000000000100000001deb965b7a5839de16d9c0142838205b623cc3b8bd7e3cb4b1851330bca7150b4010000006a47304402207120969cc910ef2dade86d1a705e1b7bde0de5837879b4805acdf9226e910530022027807755fbecc227f50613559a528addd58f6c9e9c1ea73b6b4e2ebcce0e0a99012102666ffbffcd2c9987e267dc625cb91bdede1636b2bb744dfb0b5e93e11703d77cffffffff0240420f00000000001976a914145ea67c48eb66b0156b13d2305034e27163f53388ac08c43601000000001976a914f3972c052c64a5b3f05b02c4acad74be76c908c588ac000000000100000001294947ed1ef282bb674293138130056dfb4078fa0b82d34ec1e3dabb88fa7430000000006b483045022100957129e2616f81701f469e80bc264076ffcf7ed6ce1f69c736580c1404095b1f0220549d845704eb8eef6f1a0e77b14d34319b930a82aa7c4320ab48a347e2599254012103eb6cbbcf67da9fd27ebe2ef28b94b0ed0e9006f13a3d4b5948ecdc7c2c8d6d60ffffffff026b9e7b01000000001976a914e5ab2575d010b9648f1a54c9cd8f3fb75785728488ac40420f00000000001976a914dd903bb6103c60287e830caaa39295240e90528e88ac000000000100000001a409a263f66a4d28c5be76d8221db433c1de8616555b1847c446eecfcac37ef8010000006b483045022100ba4592ef246a1eccc09a5c7c8a2468e56dea93561661feaa1303fce25c18eb6702206ed78d93cf92fc9315460a0c059ea60f4d3fdf2755773716b80cab5bb44ad170012103f7f2362d11e2b082387b6802a773adfa3c252cb21485c85f737e7cf62e95249affffffff02905f0100000000001976a914a55e832067cdd5c1e1e59288afd7b2b0f59be37a88ac30629500000000001976a914efe4eebd29f5b7a86492584993e05fac65ed6f5688ac000000000100000001e84d537ccdddbe145c8f872abeb9461067426cb6b6eff86a3859b18bb9d05d5f000000006c493046022100810396dbef50bf434b1ab80feb0b2d46f4180da583302f1324de61e5c25a0d9d0221009f84dd37b27f6663937088034a2b726ba6effc107396653270849a91ab44a632012103166654d5cbdc31d65b81e34cf0631a5a0a29019841b20cbf9ea599e049e5f0b2ffffffff02b8a51000000000001976a914630d1618b712c0404d6068985b80f6c1cf86cbd888ac28230000000000001976a91490fb956fb515c4a1695851d083b92142426d13b488ac000000000100000001d7134cb635b71a79f0b9cfdcac9ef9d6832115864c04683b7c577574c168507f010000008c493046022100a63d1a3a217243f50487f1a86c0217676bf846be2fa59bdee6f5f81dd966a143022100a331c9734918d427167514628a84e0d4d9c2899a3e4288ba188ae78abf1530e40141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02204e00000000000017a91422c4270d877177c1dd33037fb5b7bb3fd76cbb8b8761edc8a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac000000000100000001d0d7fa24b502e8a08472047696daf53d08807494734fd8459b67eeebfe13f63b010000008b483045022100ac7686b9768ef38d86123e7416ec05558795b2aa1603087f364a433bf9515e4002204656b488276b84cd2c05fdc775b3daf890d4d69d5ce62383580e41b78a6d3bcf0141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02204e00000000000017a91422c4270d877177c1dd33037fb5b7bb3fd76cbb8b873178c8a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac000000000100000001e1798c22f27e5ba948fe9c5e4de74046191b8723309063ef60f8198bdf67930c010000008b483045022022d734a8eeffdaebd54f42586679e75b428c6f4f230d3f587d3f9019ac25f4350221008efe331e7b69696bab645ac85c305b9f9d2b35419e59c2d0dc89ab12f4b49daf0141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a9146f743423659b1a2b5b52bd3ffaa2f6c30c9b6cc288ac81cac6a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac0000000001000000019347ffb287b7205e817f096b0d4d424dc54bcfd9cf7412b289090cdc16d78eda010000008b483045022100c5537059373bc3cd04bf559970dc25d83bb4338c2e0f2b321b412873ae0b64430220343358577015b688515b4f950f2d5f8ea4053615558e11552929a0552a4bc3210141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a914ce5da921afe91686f53affbea099dfc7626a64e688acd11cc5a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac000000000100000001d66a7959dbbcdd5a0b2e089008452227074013fa4030ca947ee74d54f06f2490010000008c49304602210087a40aa7da76d295a133c570757b42aa015b212b548556af3e2f3fb196ccc450022100d14bb406b48694d7da93bb8eb551a5ac9dcfe9bf744d1760b0b3b2c482a2c7960141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a91409154d402a0cf4cf0ccb474e806671409604c13388ac216fc3a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac000000000100000001416c037d85e6f29c3a60509aedc44bffb6ebfa433b6b17629f1f449f6a8a420b010000008b48304502200f5a1836326e868e3489564ff3ec1ceab1f2b1c833a116a5080fb3af4b1e2880022100bfb66b1f5ee9aa74b453fb06d1241653986bc754368fdd125ce1c0867622aefc0141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a914a602986d920c4f2e95d9a0711eed72883181e22888ac71c1c1a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac00000000010000000109a635ac99aaa207c92dca0903b6db615f1f2e612286f6af75cd7c9558d608b5010000008c493046022100ac53716a177736b1144ca67722e94ca94bdc5645701908eae0d3f142b4530858022100975419f603798b46555ca0d996f4ddbdaabe689d81c7a274af54c823dbbb9b2c0141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a9146ec46e89f8dcce3e4e714b82b64ca8f5fab551af88acc113c0a80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac00000000010000000175e44081f8cf0b6bb3cd1a93946f54484ab1bed18acd94217bd1d94e6408a640010000008c493046022100fdd199b1b921c272db35ec2ca3bf3e555885d0f9917855be169d2520bb9127eb022100fbf87fc8dbb685079a3c7f09c5cfe57e4c4cd9c574f6c6b03080942b3bdd54d60141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a91468e6a1c0f63f1d62c964da9aa16c393f9198bb7288ac1166bea80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac000000000100000001280e2a0c3b17dbac7ded07a5e029cb84c4db6ecaeda742bc241f024b6e757ad8010000008a473044022022cea724cd06f841d78522bd936724b89bf3f3e0340bf4820a619612d45e2f4102201a55dfceeecb157ec1c36565322ce2f7ebb512de7cb9c85d89842a186a55ddc20141040cfa3dfb357bdff37c8748c7771e173453da5d7caa32972ab2f5c888fff5bbaeb5fc812b473bf808206930fade81ef4e373e60039886b51022ce68902d96ef70ffffffff02a0860100000000001976a914afb415d51ee8df29280c362356aacf8198cf1e7488ac61b8bca80a0000001976a91461b469ada61f37c620010912a9d5d56646015f1688ac0000000001000000017a0c07421a1e3cf12aa73cc193154a2095079b82bb3edf80eb4c32aa2ebcb119000000006a47304402206845ebe0b479193a19cc2360845440680e3258933b03c54019589891840761a2022032366f67ba41bdfe00b41fe95ffc371b2d1146f6de6a0cdb011ebb787a09651d0121024f74d640e1f02b40e9bcba20e72fc8c0d7842429d42dfa16fcb52fd15f3284bcffffffff03781e0000000000001976a9143bb7cb7944b25a8a7b394078311fee351efb170188ac781e000000000000475121024f74d640e1f02b40e9bcba20e72fc8c0d7842429d42dfa16fcb52fd15f3284bc211c434e545250525459000000000053d3fedcce940100000000000000050000000052ae805fc901000000001976a914393971070071930ccd8d1248cf8c7de28cbfdea588ac00000000010000000100e2a34591dad16e1de7259cceee8ea6497b1f3fdf26e412fcf15e70dcd03407020000006a473044022058b96022f23049c347d4bc8f371fff98d768dbb1a43d5becf03a85ff16a6675102204113231cc11471246af502c79686b248dbee3eb392654693caac740382d4fe320121024f74d640e1f02b40e9bcba20e72fc8c0d7842429d42dfa16fcb52fd15f3284bcffffffff0290d00300000000001976a9143bb7cb7944b25a8a7b394078311fee351efb170188ace067c501000000001976a914393971070071930ccd8d1248cf8c7de28cbfdea588ac000000000100000001a50c3619d797f67d512435740d826c651d547d76046cd9415b1bd1d5cd326fb4000000006b48304502210098a9cce4ec26f205d9f0251763abd449c302b9eafcd3b4fae414ab8094ae79220220064f7f6739266e8c19746b063a5d8886a84b41ed76a677bcfed389f6e26f9ba8012103f7f2362d11e2b082387b6802a773adfa3c252cb21485c85f737e7cf62e95249affffffff03781e0000000000001976a914a55e832067cdd5c1e1e59288afd7b2b0f59be37a88ac781e00000000000047512103f7f2362d11e2b082387b6802a773adfa3c252cb21485c85f737e7cf62e95249a211c434e5452505254590000000000000000765c056c0000000005f5e1000000000052ae80329800000000001976a914efe4eebd29f5b7a86492584993e05fac65ed6f5688ac0000000001000000012e286507e0ee9e50dbb9994c0b901122e064797f5399204409ae89f5a2e2d797010000006b483045022100b0eae1db5ada154a646e8b651c554978435f74de527cfb11225e11fc5c05d193022037842a670b6a7428f9b876d61341c3fd8a5f9383eba34e2167cca9d9933c34f20121035b7c88183988d374c281c222a6bf0dbcb19dc4dcb946f36fb097efeffd62fc5bffffffff03781e0000000000001976a914b59e93e7dad549bc109245ca27935d06625d703588ac781e000000000000475121035b7c88183988d374c281c222a6bf0dbcb19dc4dcb946f36fb097efeffd62fc5b211c434e5452505254590000000000000000765c056c0000000005f5e1000000000052ae4021a913000000001976a9142bc7076ced236341c9baef7bd618e7bbfa87675f88ac000000000100000001d0e4440e74cd457503e07431bbbc8759cfffd261b610ecc9c9bde6d11dfe121b020000006b48304502207132240141ce3483cd13a8061ee5b9ec3bc722f195f55238e20f22ee83956ebf022100ee7a635ac62a824a95dd6e5b60f2295dbe1217f44a9cf5d25aab1bca13d1d00f0121035b7c88183988d374c281c222a6bf0dbcb19dc4dcb946f36fb097efeffd62fc5bffffffff02905f0100000000001976a914b59e93e7dad549bc109245ca27935d06625d703588aca09aa713000000001976a9142bc7076ced236341c9baef7bd618e7bbfa87675f88ac0000000001000000012e286507e0ee9e50dbb9994c0b901122e064797f5399204409ae89f5a2e2d797000000006c493046022100ec31bde14bae7ccfc6cf01bef40c91914c5d5adbb1b3ea8de7a5dbf1603666fe022100ab36b5fed2db1ec66a1b34fa9b246dfb6322e09245eaebaf2058ff138632d75d0121030787462dda0f7a77337453482ad9789b6cec5993cbb4275255b731f7dfda3281ffffffff03781e0000000000001976a9142bc7076ced236341c9baef7bd618e7bbfa87675f88ac781e000000000000475121030787462dda0f7a77337453482ad9789b6cec5993cbb4275255b731f7dfda3281211c434e5452505254590000000000f0a6c9ae7ec80100000000000000040000000052aea0220100000000001976a914d80cb565a29d5b5c56595b7f1cd332abad7be5e888ac000000000100000001c3e7aafba938dd71b9819421a490e9c12fbe1841297ec92ea24ab94dea929a06010000006c493046022100c1f207f20c2f29175d6cdb5ffb1fa9654cf499cbaa9a316909341e7fa427321c022100f642360759d1e90a5ddf48901de6f9bd7627ebbd7ea9cb422a0944eaf4483a8b012102754dc3568d9ae70e8fcfcff6508b9e70119b1b17ab3090f7335c46d15fb15779ffffffff03781e00000000000047512102754dc3568d9ae70e8fcfcff6508b9e70119b1b17ab3090f7335c46d15fb157792120434e545250525459000000140000001d4c4105ae00005af3107a40000100000052ae781e00000000000047512102754dc3568d9ae70e8fcfcff6508b9e70119b1b17ab3090f7335c46d15fb1577921120000000000000b50726976617465206b2031000000000000000000000000000052aef0822607000000001976a9140d7ec8cf14b0ea73621e9c831338a7921653b6cd88ac000000000100000001b6f0d9b6197830a4c06df6f4467fb99e87f63bfcea55030dc55863d11758276f00000000fd1b0100483045022100e2a0104a7ac38bec2f6a1fd82402d55272e2355d2456dc5a2dd29dbb50dd98ea02205153cf827bdf8a9304cc14ef40cff099b0ebc4d85a118883d9af54ed0ce4fad3014730440220108371557cb344c7725132d04ebaeeb4c6f7e878051068698a92452970d2b44302204a4497706bf6bd791b63753ad3ad5b326781557a96ad7202b91a011265637809014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52aeffffffff0110270000000000001976a9141f29cee3509e8268d9500b9b23cc85da1c3b4e5688ac000000000100000002e6c757e91edc7c913416e2306f8cdb3d2e21c49d8f8623e0d92823b9819cbc98000000006a4730440220211e50bb3111449f331f296e2f56558f53a92762ee743d7cbc35b54a5bde2ef1022012783fef6ff4f8586fefe6c4d2bd6f63cdca175332908d494a2db0e10c02f8f60121039c07e5148dbacdf029b3a0fbfc67351b60cc0a347ab4be269a1504318bd26267ffffffff4179331d95be875383f3fcc8d6c280a455064d64328fedf03d1930d4e581e756260000006b48304502210086de5a7d428ba954357f7888c43614533609d5f3a6810ee9395b673f911d88ee022027f6fcd1ffaea6461ef2825c4943f2bc29eada728ddf9751f4dbdd90838e1a6b012103f909a8dc00e2085dabd71213674c090ab0405b903993218eec92bc7c80dfdc54ffffffff02c23b0200000000001976a9147558fc21c84a2aeb097c82489afbc3294608247688ac7fb00600000000001976a914d6f9e26b826174e180fd3f57ce7fecf10a74c7a288ac00000000010000000229e0a2630e8d0070e35f90fc61b77c5d1a67fd3cf7fa870ffeae8e3a4c202f46010000006a473044022031c22aed1b4f58aacfab2a4af552b2d74bae8042d03845e2cf56867748d962a402202cdf57d88dc679461128fec07cd7dc91ca7a87d6e578c65ac817ed30c44841780121030f25bb21ff95d1cf698f0c8b300258d41c64063a2ca81ed68ffdadda803c4bd9ffffffffe90d2e51a4374b3975923f4f1acc37aff14288a40a4593f79742a382cb81465f0a0000006b483045022100901e7427547385db1156b1d823042b88ee8a89e44b92796e9f8587c529cd14c002204786800018ef9c0c39079e08a768fbbe01b02568ea3bbd4c8b670b41b5310c40012103f1b4d21e0b344248185408c1af96bdf05f8ee8921dfe400fb1873add6c6e1cadffffffff027fb00600000000001976a91495267bdeedeb4a5974f46b3dea5f21f81eaa610d88ac51070200000000001976a914311a5aefdb4085af5853d880c8390ea6a1615b4588ac0000000001000000018f631fa01a6797c8fb406b01d2f2dfb9c4c3e2928e77048bce829b0e287c87be00000000fd1c0100483045022100dfd6c4112bbe482a960cffaa6bc534139fc8c035b482610faee2a1ce372728520220257d43ba08c16122601281aea02f2afd501ce67ada619c30583881982483957d01483045022100e0cdfbf616cdffc5a580cd802899daf0cff68a16d7637ae9b80f18b2c46cc8d402203dc2679a41469ef89d037d6bcbc0be5c0fe73de7c3e3c268e2b47aa6ce54ef63014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52aeffffffff0110270000000000001976a9146fbccef8c5e7553abc4cffa28baf0a604262248488ac0000000001000000024fb19d79fb214b86b0fb0a6577c4250b2cba5358a14d0afd7acfdd7b2b055bfa000000006a47304402204bfc5e7e31f233a2d2ec9e3a72b40f05788ced58783c8f49ba341be427229aae02204ce55d0cceeee999e788fccff011514ac4dc3b776a68a687b84cfb9c5feda1c0012102b5a5c192d56c23f98a057b8f78caaca88363030e50de36452db77d012cf8f3c0ffffffffba76e2bd51af115649e9ee6dee6e89114ab8526749e0a977214aef78c07b090f000000006a47304402202f41bae81d296b5280a25874e5ef6c8dca05a749ed90082ea77aab824a837a06022055f73d4a2c7aad0b90e27d324d9ca91791a79e76552773cacf882a85d9f31af201210282d40b989ce5de98c89e3b240cee339bbee4a086c8520839a4bf3c11b8a18d23ffffffff0240420f00000000001976a9149b99fea987e53dbaea95816444d90975733b3d6e88ac399f1600000000001976a914b48cb92c7c89edf19643d54989cb54608bfaa4e488ac00000000010000000241d4b068fbc46dab6de7b3c6dc3b5b770b37b981b993d06b4333b8a643f10d7f000000006a473044022100bb259144bf62fa224757ae18877b27865dc27ff61d04b76315040666386dadea021f2d66e54f5a6856a2c91a71f05952650c9d5ae92ad29c5896a8963f629fc32201210321182abbb202e124e62864a66396d34d2492bbd08edf6686382dcc6e04d85b45fffffffffc68edf481ba98601dada97a71d6cf7583a36e1e135f082de6f0f7d0eda70b1b010000006a473044022034ee4482a0ce32c87644081dd423c80840081ebd47a0359e5fa29a717b658da10220018401a23671472033d4b963cfafd2c9c333e319baa676b79ced8bd1e362657d0121025313094076052c8ba1884cf800018d1e9371b6ba6819bfc5f1c66a2566d6c433ffffffff0240420f00000000001976a9144546c0d280d292c8fd2bbee8419ef05fb4e385fa88aca02c1000000000001976a91412eaf230e8991ce934e3050d5c6006c050d7b82a88ac000000000100000002ed9934a2a3b72442fd5e1946ebfc9f230bbc8012722ab828e3f028ed76e8c9d8010000006a47304402200614fe73c43fe79d0bfc793e7887d0a4e5507386199e42182b27fd6cfac49f6f0220759322264b80d45ec676dd7225d0d27ed413e0e049744dbcc76d3fd998f54c7b0121029a6793c92d2859d20204ba1738af4aaaefff1113d95668d0fdf1fc268c17a31effffffffc45fde728eec6c6e103e371d36c91a0d743b44557aeaec1b68d485db2223d0a3010000006a473044022020b63c7729c84a7e800ab94fa1c4a05fd15ec2e93da3089193b09f681d54123f02207192509619af256b9f81fe1205ac57d65c98306cc862eb4bb7e0722f2c0aa4e80121037f6f4e51362069dd7380bb1ac09dd430e85bd796d3e41eb88e4058414e5e94b1ffffffff0250da1100000000001976a9142de3d38ba5d6ef95cd1ec2fd025b4873b779fbb888ac40420f00000000001976a914e4d16ca2b60dc603ae9590672e05cfabed2d7cf588ac0000000001000000025559373139aeb2fa33fcf78ba3e571663b20486cfb7d896528f97091975c5605010000006b483045022100afeae347a631c6cf353f75f4898126845d94c45702ee72ebac3928f1a1403e350220038a6dd69dd4d0ae2438aff188e2b05fd108f79b247e6429f1e5ab6b304d322801210208e3d272bc6b00638268d8b192e20fa56415e4522c567ed84ffca8ad2b004bbbffffffff38161aa5e73aaa5bcaa96dbc120fd8019710542c1015ac7fe5067459492c07da010000006a4730440220381e5b8979b34e0ea5aaf5083b5f84090c7a39786a2a774a38b37bdb7387627d0220622787d68e383296cc4c1953f83670881fd64ce478e8a03b5b27e95fb505aa47012102f6052c249e6de26e1f27d36c795ffb17d47d3210cd4ee103c1586f60b2fcdc61ffffffff0240420f00000000001976a914ceb65b1b5b7d14f8ed093cfd7213a8855c7bf94888ac50bc1600000000001976a914aae22d7d8641a83d5c2420ff7c2082a2908d5fb388ac000000000100000002ba0b4f41996673c775527a6cafe9eab0bd4554e8be55d12048837e53f79e5f6b010000006b4830450221009fe8275ddf2dbbeae2a693b4d4468b166611b5ee94c8fe306cb7a54e527bde9302207278a8b5f74dc7ba662040369e397bc41f6651bf6c9f0a0a8dd2e9b0918f6a5501210332c45c0a00234618027fa964a5be59f690bd860cc23c49fefb75d0fd8a2073a9ffffffffba76e2bd51af115649e9ee6dee6e89114ab8526749e0a977214aef78c07b090f010000006a47304402203eac533197a2658d16313906ff9728753f3fdcb0f5aaa2ea30ce813372ba5571022076bb0965ae283df0de9cc5b025aa0f5429051cfcb4108095b7985f3898766de5012102841ff04be8832522f6cda876a21165c6f751df17d11c604ac8ed4b51292d572effffffff02c0c11600000000001976a914c24947532dc8bcb742419c25dd73d25e429b01ba88ac20a10700000000001976a914a54a4680732fb4ab0a5893690f8606cbe24fbc5588ac00000000010000000213dfa0edbf17bea78fa7c124f6f54fad33fc5274892ba95a653d6fe436861313000000006b483045022100dcfd73f39e2261f22fd1a240f55a52cbfa22a6fbb74bbd49abbeb0421a99fd3d0220557e3890c9db89880c5714c88b470f54d59ad986b4cfb93491ead3322101d7ba0121035dba8a054a8ea2d65977fcff2c0c5b875c32a3efcfc8fe01934e2563e0210fc0ffffffffd1ee1f739f2fb1858c4f3718a6d921e907b4f5e297d824f154ee439c4e928f20010000006a473044022060cabd516735ab67636fa62eb3928f3797ad168f8baa713070242d1b0492036102206047245ce7a60bd0310aefd3f49862baaf1dc59cd71a19e5e9716b8611cddee50121020b3a10541b08f1b637f077ff6f2932b0bfb11829ecc8bcff39728ad47327d9e6ffffffff0250bc1600000000001976a914f01d73bde764f82a6bd101d4f361e4a1e789853f88ac20a10700000000001976a914ceb65b1b5b7d14f8ed093cfd7213a8855c7bf94888ac0000000001000000029b6b975a0b360bdd9b5bd4b9a80f73bc2f11b5a637aa2dd8c1bff635795d3fe5000000006a47304402201be59c88a100439f3546508721f189b8d1b6b7e335bb8accdcd5a66729f1f0fa02201e0793e95f44dc1d90af05ad5ce477aa26cb324f58a0e15f5bbd858ded38d037012102b76651433e6c776213507d5c0c83e6a98a6fa6779ddddf78dfbb152fb510f4c2ffffffff81ea989407217d690564d59d9e6d82303842df3a56d0703fc96d39cc563e4ab8010000006b483045022100ace96baaebee4bb4f2365c73bf87ab66c880a725b842d97d17afbc4d63650a42022069850a754204808e5218d94029a458ba41690cb6a32f189f958bcadf35bd39de012103b9a14855a4c79bcd753274b6d8e00c42a20fd584a6d86c48990e032d7a594eeeffffffff0240420f00000000001976a9143740f53b25dd242cf19eb0bb518e4d84633e2b5488acf0601300000000001976a914ec6f79c75930c650ec0a2b018d8d6535dd5c0b1c88ac000000000100000002f18f2189eb6623167a70bb99325b934d9affafe83b6c9cb4cdc93ad8bb9ec2cf010000006b48304502210086340c01a8dd74b983b54f61edd0d8e0c1631877afb9a17dd60174a3d96b1c4102203b3ca5a9c24c7004c18c0844745e38f92f45211484e7d6a177c7f6a844bebbef01210255d19ddbad95e5c05687c5a6a1e6a63fe9f474877601a2339543d372857ecb22ffffffff5397951f23d44e270d3a40178f0beed922c876bd2007bad9d6620d4a451ac7b4000000006a4730440220017efb6435e7bcde15b846727067675a4c3fa046e0bfea1c9acc543a499e848a02203a7d765e9d8a815f6cb2a15cbe2c6fbd3b65ca35d8f2ffd9a1302dd2081fce46012103c6661178c98e7e9d301a0c6939bdc62da7e0f0dad8afa34f1a1d11fad4b546e8ffffffff0240420f00000000001976a9142709334a6bb7493012424df2712989501b87099688acd0a11000000000001976a914a9d84f0654b8131196be4982d9d6e88d4253872388ac0000000001000000027ecc038b50f20ee0f3032fc7b5caa7740339e7851abcb64b810e3a26cbe676e1010000006a473044022075a9dc1c3d8a5a2a8f1edd1e30088533acad905b83bead4d585ed124fd52f679022074a84fdd5a1e0365d6df9dde0fc18c4a681518bc1aed29a9ce42b155edbbe8870121039e060af0c8c0b3af4a4a980bcc19e4c277565705fbe0dbe648b3235cd0201f5fffffffff25d03e44e8983694a421e551facd631ec6b8f7cfcaccf8eda8fba1762db006d0000000006b483045022100b42c8a06c066a827869343d374c9520b7b7c84e11e75aa68df3d42e5b52865c402203b1aeaf33c7c3b0012fde9910ef811ef243bd5f103a7157519369e160c208b0b012102843a5d13cb9b19441ce8e871d39f821c2dba0599be5066e24ccbb22379676ecaffffffff0250da1100000000001976a91497cc9c5302fbcfd8b8d4cf98539499674fb1bba088ac40420f00000000001976a914f34c5ac23e9f429f127c2c2df80d47df470359dc88ac000000000100000002fe61b8289c169cb90feb37e8b00210618764f090798aa3ff606e21832adbb6b2000000006b483045022100e750d15b7673525643f26ffb6ab014616ffb40eca397c96a4767df625ea1a3a40220141282de969b92e3c06301637b0eb5c7f2088b4c6327c562055230ca355407450121038f88fc8b8b0a05b19aa975e51a4e5744b629dbe789918ef2d7c7b4cbf4e53872ffffffffb6e58f2a4270845a5756bb90e4fae997715217143618f7b8e3f494545e2d0cab010000006a4730440220536361adf93c952b14462f4afdf498ed9cb280c84f6ae329bb7f9bd56155cb7c022015397abeec9088b7f2f68c6822a9ba868016deb47cc13143599af92d23f9399501210307c106b32cb3429706df12b46aab8bbea8299ba86f19c8ac047f729ea0712b8cffffffff0240b31100000000001976a91481d09c73c10beee8414d8e6b2f46d219db9ed9b488ac40420f00000000001976a9146abafcc33f777900180fe642440b781f47bd9be888ac000000000100000002deddeb747d0f9a92dc10c981aa473d6b45dcf65bd6f6ca45971f83a7c1ebedcf000000006b483045022100c8d09b2f037c33ee2c25b4c7623cb354af6c134147fa5b2680792b2728cf7b6302202ccf5c97c0b220ba01519eb307e17d76ac788f199670ce8b155ec2f52325d8f201210345004779de4fcb7677310a210849beb5118a149af6607b65e0e41cff77d5d2c3ffffffffd60177b4e5e63c9c466b628c4e9033590b25f23f0d83a933f4935c30dfa7a533000000006a47304402206ad7dfc4e7eb9c8f988c77162e67f296f9e07e9ffbbcf2bb9cdbf5157210586202202ce81877bdcf6106ceff9e9e02b7ed2936583770a2ea690b075d576ef7b198940121024bba329b6047900251f9eb90f54c1a14960a8efc3cf4fee620c5c6e2b9633e2cffffffff02308c1100000000001976a9140621ba5066df4ef72087082967f8f0488545674588ac006a1800000000001976a914f339a2e7e2adb584f07415b84ab7268226e340f688ac000000000100000002d22091c47e75c4b4c113f3c5e334a19cda256809955bd49f416bc95a0d6b8303000000006b483045022100be8bf43aad3d0011ce275ac230e550466235cad09ef5c741e7bfd46ce43dc2560220011ac7da44c43db4a12e7351d7924ddb3ef1fc70bcf521c19c6c0401fb520824012102dff4ded472831dce0e4870cc6546b726a7659fb8ddd93b3abba82e96bef94d6affffffffd22091c47e75c4b4c113f3c5e334a19cda256809955bd49f416bc95a0d6b8303010000006b483045022100ad5f38fc133c9d7a222ff37c4e244b06d22f923e04daad84de20227759aba27002200193f056a202bd224ebad0683f798c234c4f938cd2e515c95428415762595a16012103d5b11e96151847cbe29062265f92d29efbd62c1ad06a2b3b5e478f7282c42cc7ffffffff0240420f00000000001976a9145af5e14c39eb6f41f873e2f14c44a8cb8f0bfd2f88acd0d61c00000000001976a9147b807912b8099aaa2876c921ee48d57d4184561288ac000000000100000002d8fb1ade0575c53bde1c1caff080ed3af2de1da95ac078dd309e77ccf8e55fdf000000006b483045022100e2eb212aa293d02e8547cb1a763e4f798d667fde3997e5876456debb876ce15e02205db9df52ed1185f0e925a594ef315006fc40317b133348ac6572d71a66fef41b0121030249f823cdfcfc2bdc72ca2f75c04c739af3c5c22cbdc03866739d30b0f968beffffffff5faa04057e21f08df130728030585623b316081908175cbabd9a668bda6bd82a000000006b483045022100f0bf6b0ed5e82a14739a62dbe5c2273ae7e268856f8fe99eec2167032b172e97022046a52017f2cb376fd5dd50301a876876ed2e5123682185e4302740efd126d83c0121024146e08c6d6d6ea2c0270c3277d831259de638d27b5be4e265f3ed6305091d4fffffffff0270281200000000001976a914319d0899408cb8a79e5772d7f113fbe25992dbba88ac40420f00000000001976a914c7290c0a5688926f1e30a23b2cf0ec2b4e456a3188ac00000000010000000266e3d4ba8989e71decb07927e8ef373ee8b6c205496eee0e838a9b6cb1753b83000000006b483045022100f314e2775e6d220b492b6fe35515291b041743b46d0e3b3307cc95167bbb6b010220325ed68888406e1bd7e1e5ccfd592bdee4486307f22c3e382d48d6b831ccbddd012103c7f26643421de501c0a1fa9766a2693e153f29df258cb813ba62864fc956dd99ffffffff20c40362cc8e89914af42a74bdff742686efc0ac3479bf4b431d1e6a587a40b8010000006b483045022100cd934bc91a5c48fb71b8607bd7026f99602041dac596ff9086d3553ce49a88af022050e5b94aa701edaa055da221e64dc09d49b3374c094d1fe0d835d93737d669e60121023ba5487e3278e4abdd44b1ee011124909577480de2eff99c1c889cd84ae8f31effffffff0240061900000000001976a9147ca41603764079bf62c4a4e3f8f66baa669d66fc88ac40420f00000000001976a9149f3f25b06eda2318869d40c6af69eba67137221b88ac00000000010000000250be20e7e9f25515c6af564c41ba49b3ff95fa476768801a943ee0bcc8eed476000000006b483045022100d6b8121fa93efe013daecfa6804603758a35931fbbd6435c9fba43c093f3d16902200744263cbe0975fc0eeb2b7d08363fd3f6e62a072dda7a7e9bab56bd1e620b9f0121028d83f9b1491994790ec76ef598c8ba0436183b466b32bddabb1a462c70e29ea6ffffffff40a16cc443545b1ae809148704511609154d4a9d8dbe31dcd54bdee791eecf7f000000006b48304502205d0911a8ac32ed04d602111ef5e664e2bd146c9d7fad88f6388ff008664f7682022100982367a9b3f72d178ed2e7c2cba3ebb51386d6b2ce8df92b797d3767984ebb7a01210325f1f40c9bd38dcdaabe19034c59caf578a8457ca0d6ab88be63f583d2ff1559ffffffff0200e9a435000000001976a914df073d4a974f8134a21608e19dddbb6cf5bfad2f88acf0b9f505000000001976a9143df52b2dc885ba0bc17ccd77cd2146d7bb52f06c88ac000000000100000001be200e8543914878d90b147f5a43bfc3828af510a043a4e0512293df5ea4ad60000000006a4730440220126b0742ea548b8ae80c708f2978563bf0aad9bd44056b585a4d7dc4e7d05bc902205ad040b48dd756f409b921f6bb0e58ea9913215b26b8e1a90a3fd10026810e840121037dcd7819ce02547f96a93deaf7ea5c6244d79f13c21a855be672eb28af964c16ffffffff02f07be111000000001976a914c0ee975d1a949a6bb1161611dcdba5a13b798f8088ac0046c323000000001976a91467e955c5c4a7489f549bd401f003fdc44d0dd93b88ac000000000100000001387daacc7861110fc52535e8a9733d40fb9c56b281708993e1678c79ed927677010000006b483045022018ee4a970e5410210c715e127d289427dca1ab3fae4d06ecaac1c86887fb0132022100cffa070278a90cb98eed8f0bcc18972153073c9360f6ea1b6e4bc7b65917105d01210387a2e1288a74d1b6824bedf9058a788fc84be8bf549f2f091f4618ed95e23d7dffffffff01f01ec323000000001976a9140744f9fd5a3b73a656694171412182a32f2971b788ac0000000001000000025960889040faa5f580fa8ef80023163878bc3be210f6d0684fcebf5f7885fb62000000006b483045022100c3065feaa69ae01789dc2926205bacabc1687df6c0eda39c13f605ad25970b55022012c5e38ba14efa243ed043d9f984707b301efaf2ef84471059b76a45cc3526a90121035b7c88183988d374c281c222a6bf0dbcb19dc4dcb946f36fb097efeffd62fc5bffffffffe22128623c5c237568cec96afa71054779a91aa5737d1f915e10ddf563c4f662010000006c493046022100e598d9f46a70537e27c04bd6bcf5f69e3a50fc638bbf6de3e7cbe00ad707160a022100b15daa637999657d26bd5fe6ca87cc3fd5de9948f2fb8d3167ac2a377a049c520121035b7c88183988d374c281c222a6bf0dbcb19dc4dcb946f36fb097efeffd62fc5bffffffff0240420f00000000001976a914d43ced8367edd29adc6c364fe31b3651046e287788acc84f9813000000001976a9142bc7076ced236341c9baef7bd618e7bbfa87675f88ac00000000010000000298dd0309ce613a9fcf77ec93e5a00202dc91dc383a2f8676e07188df62c50277000000006b483045022100a6559c0df204031a8d9cb2ba05361b4f370887b2558dff3f01e69511e2f82fe002205961193e15f0b1257686ea5019b706538a6fa54dde545352180102420a4a49fb012103c1c329eea1fb6a6eb10da4394b147b2ddc3c8984dda3006933d17edb214be0eafffffffffa2333d87762d7f47a9cb376c1c6b2eed6441d0cebfb7883b14a1b18b6303d20000000006a47304402206772ff2ad24ae7b5cd9c1c723a141bffc84bfa03fc3ae05c90615b7f7075941402204b0f149a190a450b8c08084169f277a9b11d38b3738413915717778bed3aaf8c0121030ae4453a932caeff36af7a222f5e3a78e06c4a41fbd32872e76afa2f5ddc0b32ffffffff0440420f00000000001976a9149a1349d4d28bd2c7eb295578a8db7e900a88dbef88aca02c1000000000001976a9145ea1c5883f45c0f739052222186de2a97d2b477f88ac40420f00000000001976a914b61ff592088a0848653d10f1ee64934e5048320488ac40420f00000000001976a9142ae828b6dace8aa95f7e427406117f3ad979f31e88ac00000000010000000338161aa5e73aaa5bcaa96dbc120fd8019710542c1015ac7fe5067459492c07da000000006a4730440220488cabf142f1f5ec3ba43423fb527319a4ce24e1151429ecd46d2345cb5382f602203304608e4341d6174f91f72b9936482c442ae8f448e846b41ca7d88b9e1d9e0b012103d733c28935de6c3ffb2bb672642b7ad3e40eefdfc4a9a99bc8fc2c71eca165bcffffffff1279ba15d5879005507f98e4817b559c7197365908a289983702976413748147010000006b483045022100cf35ac9a86679ab434f70e6ae77a01afd7794c180813a25b4d2b3f1b7489a897022004171d5fe92535e16e9b5b584437c00b9c0f6fa61da691186fe5f30d4701ea4901210291b5f1bf2ea4f3606c7ed34d573a015f5720b9286b2f8fb3e1ac6bd08eab2f42ffffffff287a6ba0a3a61b4132b374c62ebf576790b80c1679accd0b8a655fe2daf9f282000000006b483045022100db8692c3731454de56c26068ef24bacb339503229c5f07341e5c984bd66914e402202f12b313e94bd3256b0a00f02ca0667d729deeda53e0f46cad19b6aeb5b9fd76012102ed3c03c968b75d5845cd59fbe31f93d4d73f19f375ff3e4de3ab062755fb42f5ffffffff0280841e00000000001976a914f370186a729515e8621421ee5093730b2535d76988ac103e1100000000001976a914477aa18bae7b229784a7857f27f0c4491337674888ac00000000010000000343a4217ec03a86dbd666e2d50a4f81e6ec78888501d9fe8be407315105e327e4010000006a473044022035ad18774bb1ea6ce5851c3453fa4d1bbb919c152bd70c5846c8dae8fd5768d702201cbf6085713047f0ef706d916ca02b5a64485364a2c15cb22c7b8be5585fafc8012103c8a1ce8275752d7fce768b8e2575f6ed8d770282dca77c0e92edc728e9a52660ffffffff9f3a39e94c21c9badce0da020823e1731ce83b9463f67df74cf60e67b0f1380a000000006b483045022100d2b742a1846f5ef083ad196faad1ee2ba65d1880c09070291a166c7075b5ce5a0220070410a486fef2907ae683d51b16b58367bb2e63ae83da0be06436972a5b8953012103fac77292a178d2a13e9c1cd34b62a3e97c9b67f85dc5ecf2cdc00ea30070ead6ffffffffd342b7c9bc1b211cd022e66d639a4f2529aa29e9cd144c65136cefbdf641a23e000000006b483045022100a961bd3d95a8185d81605b348fd2ec26327cb2bb8a0912cdaebd53d67325d4a902204738f384eb47aa8b30fd3255244ddf12d4e9ceadf781f909414c589f4c033f9901210242b91c415dead69340de6589ffc960181773aa85d79561d1bbe628b320a77913ffffffff0240420f00000000001976a914fe22a31bfb0d128784ec50e9bd23a5ab17ece81988ac006d1000000000001976a9141212aa3479493b3783d632cebb8b1b7f85e0f08e88ac00000000010000000363696517922487df9fafdcd2dfa016271bc74a20ff9981bb07309f74fa2ebf77010000006b483045022100800f701f92e9019ce8799c5e34d34bdff474c95fa1ee208bc42a4db94ce3a2b4022015afdf9c6abf97cf10f71f6938c1e14ec24c0ad48a029262f6f83dd228e7a935012103a6e9d75fed339936435f7b934ab24597ac47979619d6024491bc6b3ce7a18a72ffffffffd4676e4b2debcaeb558c34f9bac6b599085b3e872a18e321d59af6012438d91a010000006a473044022071e14e8ef73cf9e0aab6da408e1a03b0b14e5c58b7f7b2e6a85782ee894cc3f402201921f77148d2f88d9bb2c5fd75eb22e71f17b1b31d502519db78e1791703553801210337122f84beb41ee6b26ad030e1161363b2f6bbd46dd4147960ce7203aa4d2d1fffffffff3fd68ae235d1348d4f53445593744a8983dfdda5381ef8f38597097a27a7ade4000000006b483045022100862a808bac6390a0835d2e1ba9a2686d74d6258456df24c3256db2d75bafe96202207e59df20b49da81977ce7fab71a43ff113c8c7adc47b8e9096a42c1b6e27842601210337122f84beb41ee6b26ad030e1161363b2f6bbd46dd4147960ce7203aa4d2d1fffffffff02f2860f00000000001976a914ba9b1adb0717ed39ba70f6017f7d1ba233dcddb588ac7ea10200000000001976a9140df5cdbd67f672f755e2610ce35b574f630f0d0188ac000000000100000004ba0b4f41996673c775527a6cafe9eab0bd4554e8be55d12048837e53f79e5f6b000000006b483045022100e9f596937f73fbf760b8812d2949239013ccf689d210f344a4799bde555b8b3102205eb9f820510cfdbc1c5d14e069649d4ef107448f7dfc43abe4eb789d3db5efdb0121025efb6cf542a84987701be92bbbcb2b7da729a91e46fc82412de2c3121e29c1afffffffff89f749d3a7c6ef70b549a3f7502bdeadc3ab0c98bf80b716d961bf3830150012000000006a4730440220790dc4db98320dd0a5f5bdce54c24ff1aa22bfceafad0a78b7888c367ab4142d02203f2f55e3a6bca3908da221d23d7f7f103254d9cc6bdde398a7c3de6e4f5824c3012102c55d1894bb30e518dc8f04cbf0a839eea6fdd2f84cb7ee8dfb4df2df543d0081ffffffff0fcf7953a6e8f88c430c24b630a61d5a49181afe2e767ce76119ade9fe07c231010000006b4830450221009e5f130a7a3a1b38e69ee04467aae9974ec16323c6931d1143322ad365de2277022034ae51f6bc8683874fca0cc042ffaf10ec2c0843fca16cb817195c0b2e52678a012102c55d1894bb30e518dc8f04cbf0a839eea6fdd2f84cb7ee8dfb4df2df543d0081ffffffff3373ce2c64e6d6ff443dd48d493401b5ef2c7d1cc6838de0bd157492546f2570010000006b483045022100b94000fc2d47ada82eb93b214a715b0269c1fc1f27ef5de03bdde0bfa867a1f202206994d434eb63e9398da5e42d0ddd1991863416e93d8cf3f56606456fe89e813001210208e3d272bc6b00638268d8b192e20fa56415e4522c567ed84ffca8ad2b004bbbffffffff0260e31600000000001976a9143db4f4e6c67e1540ff43420b226d79dc7d8e168f88ac50bc1600000000001976a914cf3b5cc3a0aa4e24de74d38f7643500a73d6c07f88ac0000000001000000015c9cf5021b59f07ef2ed5970b410bfe6470690d309e03f495b4874a50b372b96010000006b483045022100b633d5fa3838c6753fe9fd5a656719a109ff0579cca9bb3272d5614715ba2202022040089f8af701ce448ce69217f731b013a917d9da6f23d9a408779b7a485b0c6d012103d850746fc0287d8550dfba1ec81c340d3c192d10fa9c918908fc913910667f01ffffffff02a0860100000000001976a91421620cd6d05d98cd15d2c7957d3c07bcf9731f8d88acc89f2e00000000001976a91418751b7839491fb642b370760c5887037d30aefc88ac000000000100000001fa16fe96c11d1541c39de3acee0ddf222a4093b4554ec0b79c3cb230b0105faa010000006b483045022100a19ebbf182c5c26605070915d5c93698fc7145e2f96a7e1981d7eaef99b18c9b02204bd5f9729790f2b7073440c71af9e781b10b1be6a20f5295ca10a9cbc390dc260121038463a2dc022b91a5db8c88b115c2beb647ee226f3876818d81a301cc682b49ceffffffff0200688909000000001976a9141cd4c2807911d65d5ff4c575ddf9141ad022458988ac40047962030000001976a9149dec6baca88fd80aa04d2320fbff60225eb8e9e588ac0000000001000000014e417cfa0ddc6a5627e5a312a7a3300a1e96e9f32489b3faaa35317c907d36a5010000006b483045022100fc52565e014c25cccb61913a08e66106791c3dad63d41e4ea8c20fda5631509e02200e495fd33a06809be1965fb2e9cb757c46b3b0aab6cbe4ce775b9b87123654fb012103d850746fc0287d8550dfba1ec81c340d3c192d10fa9c918908fc913910667f01ffffffff0210270000000000001976a91421620cd6d05d98cd15d2c7957d3c07bcf9731f8d88acb8782e00000000001976a91418751b7839491fb642b370760c5887037d30aefc88ac00000000" + }, + { + "description": "Headers only - nonce changed", + "bits": 404020484, + "hash": "0fec37f0c7eb77e7f395cc1d51c41c2a3f9940e65d69cbc443bf4413a8967e3d", + "height": 370090, + "hex": "03000000af7b8278e9c67a6d6b3453239d83406a1b21aaed2bfeb10e0000000000000000a4a4dda66b46547ff41d668543f1f20a5974488257a1f35a07c1815187b30ab9913dd05504dd141800000000", + "id": "3d7e96a81344bf43c4cb695de640993f2a1cc4511dcc95f3e777ebc7f037ec0f", + "merkleRoot": "a4a4dda66b46547ff41d668543f1f20a5974488257a1f35a07c1815187b30ab9", + "nonce": 0, + "prevHash": "af7b8278e9c67a6d6b3453239d83406a1b21aaed2bfeb10e0000000000000000", + "timestamp": 1439710609, + "valid": false, + "version": 3 + }, + { + "description": "Genesis Block", + "bits": 486604799, + "hash": "6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000", + "height": 0, + "hex": "0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000", + "id": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + "merkleRoot": "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a", + "nonce": 2083236893, + "prevHash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1231006505, + "valid": true, + "version": 1 + } + ], + "invalid": [ + { + "exception": "Buffer too small \\(< 80 bytes\\)", + "hex": "020000003385c4b2a3499669987f5d04fa4127b59dbf2ee625694fa0bf08000000000000cf52f0eb" + } + ] +} diff --git a/web/bitcoincashjs-lib/test/fixtures/bufferutils.json b/web/bitcoincashjs-lib/test/fixtures/bufferutils.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/bufferutils.json @@ -0,0 +1,117 @@ +{ + "valid": [ + { + "dec": 0, + "hex64": "0000000000000000", + "hexVI": "00", + "hexPD": "00" + }, + { + "dec": 1, + "hex64": "0100000000000000", + "hexVI": "01", + "hexPD": "01" + }, + { + "dec": 252, + "hex64": "fc00000000000000", + "hexVI": "fc", + "hexPD": "4cfc" + }, + { + "dec": 253, + "hex64": "fd00000000000000", + "hexVI": "fdfd00", + "hexPD": "4cfd" + }, + { + "dec": 254, + "hex64": "fe00000000000000", + "hexVI": "fdfe00", + "hexPD": "4cfe" + }, + { + "dec": 255, + "hex64": "ff00000000000000", + "hexVI": "fdff00", + "hexPD": "4cff" + }, + { + "dec": 65534, + "hex64": "feff000000000000", + "hexVI": "fdfeff", + "hexPD": "4dfeff" + }, + { + "dec": 65535, + "hex64": "ffff000000000000", + "hexVI": "fdffff", + "hexPD": "4dffff" + }, + { + "dec": 65536, + "hex64": "0000010000000000", + "hexVI": "fe00000100", + "hexPD": "4e00000100" + }, + { + "dec": 65537, + "hex64": "0100010000000000", + "hexVI": "fe01000100", + "hexPD": "4e01000100" + }, + { + "dec": 4294967295, + "hex64": "ffffffff00000000", + "hexVI": "feffffffff", + "hexPD": "4effffffff" + }, + { + "dec": 4294967296, + "hex64": "0000000001000000", + "hexVI": "ff0000000001000000" + }, + { + "dec": 4294967297, + "hex64": "0100000001000000", + "hexVI": "ff0100000001000000" + }, + { + "dec": 9007199254740991, + "hex64": "ffffffffffff1f00", + "hexVI": "ffffffffffffff1f00" + } + ], + "invalid": { + "readUInt64LE": [ + { + "description": "n === 2^53", + "exception": "RangeError: value out of range", + "hex64": "0000000000002000", + "hexVI": "ff0000000000000020", + "dec": 9007199254740992 + }, + { + "description": "n > 2^53", + "exception": "RangeError: value out of range", + "hex64": "0100000000002000", + "hexVI": "ff0100000000000020", + "dec": 9007199254740993 + } + ], + "readPushDataInt": [ + { + "description": "OP_PUSHDATA1, no size", + "hexPD": "4c" + }, + { + "description": "OP_PUSHDATA2, no size", + "hexPD": "4d" + }, + { + "description": "OP_PUSHDATA4, no size", + "hexPD": "4e" + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/core/README.md b/web/bitcoincashjs-lib/test/fixtures/core/README.md new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/README.md @@ -0,0 +1,26 @@ +## Description + +This directory contains data-driven tests for various aspects of Bitcoin. + +## Bitcoinjs-lib notes + +This directory does not contain all the Bitcoin core tests. +Missing core test data includes: + +- `alertTests.raw` + Bitcoin-js does not interact with the Bitcoin network directly. + +- `tx_invalid.json` + Bitcoin-js can not evaluate Scripts, making testing this irrelevant. + It can decode valid Transactions, therefore `tx_valid.json` remains. + +- `script*.json` + Bitcoin-js can not evaluate Scripts, making testing this irrelevant. + +## License + +The data files in this directory are + + Copyright (c) 2012-2014 The Bitcoin Core developers + Distributed under the MIT/X11 software license, see the accompanying + file COPYING or http://www.opensource.org/licenses/mit-license.php. diff --git a/web/bitcoincashjs-lib/test/fixtures/core/base58_encode_decode.json b/web/bitcoincashjs-lib/test/fixtures/core/base58_encode_decode.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/base58_encode_decode.json @@ -0,0 +1,20 @@ +[ + ["", ""], + ["61", "2g"], + ["626262", "a3gV"], + ["636363", "aPEr"], + [ + "73696d706c792061206c6f6e6720737472696e67", + "2cFupjhnEsSn59qHXstmK2ffpLv2" + ], + [ + "00eb15231dfceb60925886b67d065299925915aeb172c06647", + "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L" + ], + ["516b6fcd0f", "ABnLTmg"], + ["bf4f89001e670274dd", "3SEo3LWLoPntC"], + ["572e4794", "3EFU7m"], + ["ecac89cad93923c02321", "EJDM8drfXA6uyA"], + ["10c8511e", "Rt5zm"], + ["00000000000000000000", "1111111111"] +] diff --git a/web/bitcoincashjs-lib/test/fixtures/core/base58_keys_invalid.json b/web/bitcoincashjs-lib/test/fixtures/core/base58_keys_invalid.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/base58_keys_invalid.json @@ -0,0 +1,102 @@ +[ + [""], + ["x"], + [ + "37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y" + ], + ["dzb7VV1Ui55BARxv7ATxAtCUeJsANKovDGWFVgpTbhq9gvPqP3yv"], + [ + "MuNu7ZAEDFiHthiunm7dPjwKqrVNCM3mAz6rP9zFveQu14YA8CxExSJTHcVP9DErn6u84E6Ej7S" + ], + [ + "rPpQpYknyNQ5AEHuY6H8ijJJrYc2nDKKk9jjmKEXsWzyAQcFGpDLU2Zvsmoi8JLR7hAwoy3RQWf" + ], + [ + "4Uc3FmN6NQ6zLBK5QQBXRBUREaaHwCZYsGCueHauuDmJpZKn6jkEskMB2Zi2CNgtb5r6epWEFfUJq" + ], + ["7aQgR5DFQ25vyXmqZAWmnVCjL3PkBcdVkBUpjrjMTcghHx3E8wb"], + [ + "17QpPprjeg69fW1DV8DcYYCKvWjYhXvWkov6MJ1iTTvMFj6weAqW7wybZeH57WTNxXVCRH4veVs" + ], + ["KxuACDviz8Xvpn1xAh9MfopySZNuyajYMZWz16Dv2mHHryznWUp3"], + [ + "7nK3GSmqdXJQtdohvGfJ7KsSmn3TmGqExug49583bDAL91pVSGq5xS9SHoAYL3Wv3ijKTit65th" + ], + ["cTivdBmq7bay3RFGEBBuNfMh2P1pDCgRYN2Wbxmgwr4ki3jNUL2va"], + [ + "gjMV4vjNjyMrna4fsAr8bWxAbwtmMUBXJS3zL4NJt5qjozpbQLmAfK1uA3CquSqsZQMpoD1g2nk" + ], + ["emXm1naBMoVzPjbk7xpeTVMFy4oDEe25UmoyGgKEB1gGWsK8kRGs"], + [ + "7VThQnNRj1o3Zyvc7XHPRrjDf8j2oivPTeDXnRPYWeYGE4pXeRJDZgf28ppti5hsHWXS2GSobdqyo" + ], + [ + "1G9u6oCVCPh2o8m3t55ACiYvG1y5BHewUkDSdiQarDcYXXhFHYdzMdYfUAhfxn5vNZBwpgUNpso" + ], + [ + "31QQ7ZMLkScDiB4VyZjuptr7AEc9j1SjstF7pRoLhHTGkW4Q2y9XELobQmhhWxeRvqcukGd1XCq" + ], + ["DHqKSnpxa8ZdQyH8keAhvLTrfkyBMQxqngcQA5N8LQ9KVt25kmGN"], + [ + "2LUHcJPbwLCy9GLH1qXmfmAwvadWw4bp4PCpDfduLqV17s6iDcy1imUwhQJhAoNoN1XNmweiJP4i" + ], + [ + "7USRzBXAnmck8fX9HmW7RAb4qt92VFX6soCnts9s74wxm4gguVhtG5of8fZGbNPJA83irHVY6bCos" + ], + [ + "1DGezo7BfVebZxAbNT3XGujdeHyNNBF3vnficYoTSp4PfK2QaML9bHzAMxke3wdKdHYWmsMTJVu" + ], + [ + "2D12DqDZKwCxxkzs1ZATJWvgJGhQ4cFi3WrizQ5zLAyhN5HxuAJ1yMYaJp8GuYsTLLxTAz6otCfb" + ], + ["8AFJzuTujXjw1Z6M3fWhQ1ujDW7zsV4ePeVjVo7D1egERqSW9nZ"], + [ + "163Q17qLbTCue8YY3AvjpUhotuaodLm2uqMhpYirsKjVqnxJRWTEoywMVY3NbBAHuhAJ2cF9GAZ" + ], + ["2MnmgiRH4eGLyLc9eAqStzk7dFgBjFtUCtu"], + ["461QQ2sYWxU7H2PV4oBwJGNch8XVTYYbZxU"], + [ + "2UCtv53VttmQYkVU4VMtXB31REvQg4ABzs41AEKZ8UcB7DAfVzdkV9JDErwGwyj5AUHLkmgZeobs" + ], + ["cSNjAsnhgtiFMi6MtfvgscMB2Cbhn2v1FUYfviJ1CdjfidvmeW6mn"], + [ + "gmsow2Y6EWAFDFE1CE4Hd3Tpu2BvfmBfG1SXsuRARbnt1WjkZnFh1qGTiptWWbjsq2Q6qvpgJVj" + ], + [ + "nksUKSkzS76v8EsSgozXGMoQFiCoCHzCVajFKAXqzK5on9ZJYVHMD5CKwgmX3S3c7M1U3xabUny" + ], + ["L3favK1UzFGgdzYBF2oBT5tbayCo4vtVBLJhg2iYuMeePxWG8SQc"], + [ + "7VxLxGGtYT6N99GdEfi6xz56xdQ8nP2dG1CavuXx7Rf2PrvNMTBNevjkfgs9JmkcGm6EXpj8ipyPZ" + ], + ["2mbZwFXF6cxShaCo2czTRB62WTx9LxhTtpP"], + ["dB7cwYdcPSgiyAwKWL3JwCVwSk6epU2txw"], + ["HPhFUhUAh8ZQQisH8QQWafAxtQYju3SFTX"], + ["4ctAH6AkHzq5ioiM1m9T3E2hiYEev5mTsB"], + [ + "Hn1uFi4dNexWrqARpjMqgT6cX1UsNPuV3cHdGg9ExyXw8HTKadbktRDtdeVmY3M1BxJStiL4vjJ" + ], + ["Sq3fDbvutABmnAHHExJDgPLQn44KnNC7UsXuT7KZecpaYDMU9Txs"], + ["6TqWyrqdgUEYDQU1aChMuFMMEimHX44qHFzCUgGfqxGgZNMUVWJ"], + [ + "giqJo7oWqFxNKWyrgcBxAVHXnjJ1t6cGoEffce5Y1y7u649Noj5wJ4mmiUAKEVVrYAGg2KPB3Y4" + ], + ["cNzHY5e8vcmM3QVJUcjCyiKMYfeYvyueq5qCMV3kqcySoLyGLYUK"], + [ + "37uTe568EYc9WLoHEd9jXEvUiWbq5LFLscNyqvAzLU5vBArUJA6eydkLmnMwJDjkL5kXc2VK7ig" + ], + ["EsYbG4tWWWY45G31nox838qNdzksbPySWc"], + ["nbuzhfwMoNzA3PaFnyLcRxE9bTJPDkjZ6Rf6Y6o2ckXZfzZzXBT"], + ["cQN9PoxZeCWK1x56xnz6QYAsvR11XAce3Ehp3gMUdfSQ53Y2mPzx"], + [ + "1Gm3N3rkef6iMbx4voBzaxtXcmmiMTqZPhcuAepRzYUJQW4qRpEnHvMojzof42hjFRf8PE2jPde" + ], + ["2TAq2tuN6x6m233bpT7yqdYQPELdTDJn1eU"], + [ + "ntEtnnGhqPii4joABvBtSEJG6BxjT2tUZqE8PcVYgk3RHpgxgHDCQxNbLJf7ardf1dDk2oCQ7Cf" + ], + ["Ky1YjoZNgQ196HJV3HpdkecfhRBmRZdMJk89Hi5KGfpfPwS2bUbfd"], + [ + "2A1q1YsMZowabbvta7kTy2Fd6qN4r5ZCeG3qLpvZBMzCixMUdkN2Y4dHB1wPsZAeVXUGD83MfRED" + ] +] diff --git a/web/bitcoincashjs-lib/test/fixtures/core/base58_keys_valid.json b/web/bitcoincashjs-lib/test/fixtures/core/base58_keys_valid.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/base58_keys_valid.json @@ -0,0 +1,452 @@ +[ + [ + "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", + "65a16059864a2fdbc7c99a4723a8395bc6f188eb", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "3CMNFxN1oHBc4R1EpboAL5yzHGgE611Xou", + "74f209f6ea907e2ea48f74fae05782ae8a665257", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs", + "53c0307d6851aa0ce7825ba883c6bd9ad242b486", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br", + "6349a418fc4578d10a372b54b45c280cc8c4382f", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "5Kd3NBUAdUnhyzenEwVLy9pBKxSwXvE9FMPyR4UKZvpe6E3AgLr", + "eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "Kz6UJmQACJmLtaQj5A3JAge4kVTNQ8gbvXuwbmCj7bsaabudb3RD", + "55c9bccb9ed68446d1b75273bbce89d7fe013a8acd1625514420fb2aca1a21c4", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko", + "36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "cTpB4YiyKiBcPxnefsDpbnDxFDffjqJob8wGCEDXxgQ7zQoMXJdH", + "b9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f3", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "1Ax4gZtb7gAit2TivwejZHYtNNLT18PUXJ", + "6d23156cbbdcc82a5a47eee4c2c7c583c18b6bf4", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy", + "fcc5460dd6e2487c7d75b1963625da0e8f4c5975", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "n3ZddxzLvAY9o7184TB4c6FJasAybsw4HZ", + "f1d470f9b02370fdec2e6b708b08ac431bf7a5f7", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n", + "c579342c2c4c9220205e2cdc285617040c924a0a", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "5K494XZwps2bGyeL71pWid4noiSNA2cfCibrvRWqcHSptoFn7rc", + "a326b95ebae30164217d7a7f57d72ab2b54e3be64928a19da0210b9568d4015e", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "L1RrrnXkcKut5DEMwtDthjwRcTTwED36thyL1DebVrKuwvohjMNi", + "7d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb4", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "93DVKyFYwSN6wEo3E2fCrFPUp17FtrtNi2Lf7n4G3garFb16CRj", + "d6bca256b5abc5602ec2e1c121a08b0da2556587430bcf7e1898af2224885203", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "cTDVKtMGVYWTHCb1AFjmVbEbWjvKpKqKgMaR3QJxToMSQAhmCeTN", + "a81ca4e8f90181ec4b61b6a7eb998af17b2cb04de8a03b504b9e34c4c61db7d9", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "1C5bSj1iEGUgSTbziymG7Cn18ENQuT36vv", + "7987ccaa53d02c8873487ef919677cd3db7a6912", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "3AnNxabYGoTxYiTEZwFEnerUoeFXK2Zoks", + "63bcc565f9e68ee0189dd5cc67f1b0e5f02f45cb", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "n3LnJXCqbPjghuVs8ph9CYsAe4Sh4j97wk", + "ef66444b5b17f14e8fae6e7e19b045a78c54fd79", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "2NB72XtkjpnATMggui83aEtPawyyKvnbX2o", + "c3e55fceceaa4391ed2a9677f4a4d34eacd021a0", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "5KaBW9vNtWNhc3ZEDyNCiXLPdVPHCikRxSBWwV9NrpLLa4LsXi9", + "e75d936d56377f432f404aabb406601f892fd49da90eb6ac558a733c93b47252", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "L1axzbSyynNYA8mCAhzxkipKkfHtAXYF4YQnhSKcLV8YXA874fgT", + "8248bd0375f2f75d7e274ae544fb920f51784480866b102384190b1addfbaa5c", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "927CnUkUbasYtDwYwVn2j8GdTuACNnKkjZ1rpZd2yBB1CLcnXpo", + "44c4f6a096eac5238291a94cc24c01e3b19b8d8cef72874a079e00a242237a52", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "cUcfCMRjiQf85YMzzQEk9d1s5A4K7xL5SmBCLrezqXFuTVefyhY7", + "d1de707020a9059d6d3abaf85e17967c6555151143db13dbb06db78df0f15c69", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "1Gqk4Tv79P91Cc1STQtU3s1W6277M2CVWu", + "adc1cc2081a27206fae25792f28bbc55b831549d", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "33vt8ViH5jsr115AGkW6cEmEz9MpvJSwDk", + "188f91a931947eddd7432d6e614387e32b244709", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "mhaMcBxNh5cqXm4aTQ6EcVbKtfL6LGyK2H", + "1694f5bc1a7295b600f40018a618a6ea48eeb498", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "2MxgPqX1iThW3oZVk9KoFcE5M4JpiETssVN", + "3b9b3fd7a50d4f08d1a5b0f62f644fa7115ae2f3", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "5HtH6GdcwCJA4ggWEL1B3jzBBUB8HPiBi9SBc5h9i4Wk4PSeApR", + "091035445ef105fa1bb125eccfb1882f3fe69592265956ade751fd095033d8d0", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "L2xSYmMeVo3Zek3ZTsv9xUrXVAmrWxJ8Ua4cw8pkfbQhcEFhkXT8", + "ab2b4bcdfc91d34dee0ae2a8c6b6668dadaeb3a88b9859743156f462325187af", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "92xFEve1Z9N8Z641KQQS7ByCSb8kGjsDzw6fAmjHN1LZGKQXyMq", + "b4204389cef18bbe2b353623cbf93e8678fbc92a475b664ae98ed594e6cf0856", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "cVM65tdYu1YK37tNoAyGoJTR13VBYFva1vg9FLuPAsJijGvG6NEA", + "e7b230133f1b5489843260236b06edca25f66adb1be455fbd38d4010d48faeef", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "1JwMWBVLtiqtscbaRHai4pqHokhFCbtoB4", + "c4c1b72491ede1eedaca00618407ee0b772cad0d", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "3QCzvfL4ZRvmJFiWWBVwxfdaNBT8EtxB5y", + "f6fe69bcb548a829cce4c57bf6fff8af3a5981f9", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "mizXiucXRCsEriQCHUkCqef9ph9qtPbZZ6", + "261f83568a098a8638844bd7aeca039d5f2352c0", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "2NEWDzHWwY5ZZp8CQWbB7ouNMLqCia6YRda", + "e930e1834a4d234702773951d627cce82fbb5d2e", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "5KQmDryMNDcisTzRp3zEq9e4awRmJrEVU1j5vFRTKpRNYPqYrMg", + "d1fab7ab7385ad26872237f1eb9789aa25cc986bacc695e07ac571d6cdac8bc0", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "L39Fy7AC2Hhj95gh3Yb2AU5YHh1mQSAHgpNixvm27poizcJyLtUi", + "b0bbede33ef254e8376aceb1510253fc3550efd0fcf84dcd0c9998b288f166b3", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "91cTVUcgydqyZLgaANpf1fvL55FH53QMm4BsnCADVNYuWuqdVys", + "037f4192c630f399d9271e26c575269b1d15be553ea1a7217f0cb8513cef41cb", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "cQspfSzsgLeiJGB2u8vrAiWpCU4MxUT6JseWo2SjXy4Qbzn2fwDw", + "6251e205e8ad508bab5596bee086ef16cd4b239e0cc0c5d7c4e6035441e7d5de", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "19dcawoKcZdQz365WpXWMhX6QCUpR9SY4r", + "5eadaf9bb7121f0f192561a5a62f5e5f54210292", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "37Sp6Rv3y4kVd1nQ1JV5pfqXccHNyZm1x3", + "3f210e7277c899c3a155cc1c90f4106cbddeec6e", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "myoqcgYiehufrsnnkqdqbp69dddVDMopJu", + "c8a3c2a09a298592c3e180f02487cd91ba3400b5", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "2N7FuwuUuoTBrDFdrAZ9KxBmtqMLxce9i1C", + "99b31df7c9068d1481b596578ddbb4d3bd90baeb", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": true + } + ], + [ + "5KL6zEaMtPRXZKo1bbMq7JDjjo1bJuQcsgL33je3oY8uSJCR5b4", + "c7666842503db6dc6ea061f092cfb9c388448629a6fe868d068c42a488b478ae", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "KwV9KAfwbwt51veZWNscRTeZs9CKpojyu1MsPnaKTF5kz69H1UN2", + "07f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": false + } + ], + [ + "93N87D6uxSBzwXvpokpzg8FFmfQPmvX4xHoWQe3pLdYpbiwT5YV", + "ea577acfb5d1d14d3b7b195c321566f12f87d2b77ea3a53f68df7ebf8604a801", + { + "isCompressed": false, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "cMxXusSihaX58wpJ3tNuuUcZEQGt6DKJ1wEpxys88FFaQCYjku9h", + "0b3b34f0958d8a268193a9814da92c3e8b58b4a4378a542863e34ac289cd830c", + { + "isCompressed": true, + "isPrivkey": true, + "isTestnet": true + } + ], + [ + "13p1ijLwsnrcuyqcTvJXkq2ASdXqcnEBLE", + "1ed467017f043e91ed4c44b4e8dd674db211c4e6", + { + "addrType": "pubkey", + "isPrivkey": false, + "isTestnet": false + } + ], + [ + "3ALJH9Y951VCGcVZYAdpA3KchoP9McEj1G", + "5ece0cadddc415b1980f001785947120acdb36fc", + { + "addrType": "script", + "isPrivkey": false, + "isTestnet": false + } + ] +] diff --git a/web/bitcoincashjs-lib/test/fixtures/core/blocks.json b/web/bitcoincashjs-lib/test/fixtures/core/blocks.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/blocks.json @@ -0,0 +1,27 @@ +[ + { + "id": "0000000000013b8ab2cd513b0261a14096412195a72a0c4827d229dcc7e0f7af", + "transactions": 9, + "hex": "0100000090f0a9f110702f808219ebea1173056042a714bad51b916cb6800000000000005275289558f51c9966699404ae2294730c3c9f9bda53523ce50e9b95e558da2fdb261b4d4c86041b1ab1bf930901000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0146ffffffff0100f2052a01000000434104e18f7afbe4721580e81e8414fc8c24d7cfacf254bb5c7b949450c3e997c2dc1242487a8169507b631eb3771f2b425483fb13102c4eb5d858eef260fe70fbfae0ac00000000010000000196608ccbafa16abada902780da4dc35dafd7af05fa0da08cf833575f8cf9e836000000004a493046022100dab24889213caf43ae6adc41cf1c9396c08240c199f5225acf45416330fd7dbd022100fe37900e0644bf574493a07fc5edba06dbc07c311b947520c2d514bc5725dcb401ffffffff0100f2052a010000001976a914f15d1921f52e4007b146dfa60f369ed2fc393ce288ac000000000100000001fb766c1288458c2bafcfec81e48b24d98ec706de6b8af7c4e3c29419bfacb56d000000008c493046022100f268ba165ce0ad2e6d93f089cfcd3785de5c963bb5ea6b8c1b23f1ce3e517b9f022100da7c0f21adc6c401887f2bfd1922f11d76159cbc597fbd756a23dcbb00f4d7290141042b4e8625a96127826915a5b109852636ad0da753c9e1d5606a50480cd0c40f1f8b8d898235e571fe9357d9ec842bc4bba1827daaf4de06d71844d0057707966affffffff0280969800000000001976a9146963907531db72d0ed1a0cfb471ccb63923446f388ac80d6e34c000000001976a914f0688ba1c0d1ce182c7af6741e02658c7d4dfcd388ac000000000100000002c40297f730dd7b5a99567eb8d27b78758f607507c52292d02d4031895b52f2ff010000008b483045022100f7edfd4b0aac404e5bab4fd3889e0c6c41aa8d0e6fa122316f68eddd0a65013902205b09cc8b2d56e1cd1f7f2fafd60a129ed94504c4ac7bdc67b56fe67512658b3e014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffffca5065ff9617cbcba45eb23726df6498a9b9cafed4f54cbab9d227b0035ddefb000000008a473044022068010362a13c7f9919fa832b2dee4e788f61f6f5d344a7c2a0da6ae740605658022006d1af525b9a14a35c003b78b72bd59738cd676f845d1ff3fc25049e01003614014104732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ecffffffff01001ec4110200000043410469ab4181eceb28985b9b4e895c13fa5e68d85761b7eee311db5addef76fa8621865134a221bd01f28ec9999ee3e021e60766e9d1f3458c115fb28650605f11c9ac000000000100000001cdaf2f758e91c514655e2dc50633d1e4c84989f8aa90a0dbc883f0d23ed5c2fa010000008b48304502207ab51be6f12a1962ba0aaaf24a20e0b69b27a94fac5adf45aa7d2d18ffd9236102210086ae728b370e5329eead9accd880d0cb070aea0c96255fae6c4f1ddcce1fd56e014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff02404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac002d3101000000001976a9141befba0cdc1ad56529371864d9f6cb042faa06b588ac000000000100000001b4a47603e71b61bc3326efd90111bf02d2f549b067f4c4a8fa183b57a0f800cb010000008a4730440220177c37f9a505c3f1a1f0ce2da777c339bd8339ffa02c7cb41f0a5804f473c9230220585b25a2ee80eb59292e52b987dad92acb0c64eced92ed9ee105ad153cdb12d001410443bd44f683467e549dae7d20d1d79cbdb6df985c6e9c029c8d0c6cb46cc1a4d3cf7923c5021b27f7a0b562ada113bc85d5fda5a1b41e87fe6e8802817cf69996ffffffff0280651406000000001976a9145505614859643ab7b547cd7f1f5e7e2a12322d3788ac00aa0271000000001976a914ea4720a7a52fc166c55ff2298e07baf70ae67e1b88ac00000000010000000586c62cd602d219bb60edb14a3e204de0705176f9022fe49a538054fb14abb49e010000008c493046022100f2bc2aba2534becbdf062eb993853a42bbbc282083d0daf9b4b585bd401aa8c9022100b1d7fd7ee0b95600db8535bbf331b19eed8d961f7a8e54159c53675d5f69df8c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff03ad0e58ccdac3df9dc28a218bcf6f1997b0a93306faaa4b3a28ae83447b2179010000008b483045022100be12b2937179da88599e27bb31c3525097a07cdb52422d165b3ca2f2020ffcf702200971b51f853a53d644ebae9ec8f3512e442b1bcb6c315a5b491d119d10624c83014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff2acfcab629bbc8685792603762c921580030ba144af553d271716a95089e107b010000008b483045022100fa579a840ac258871365dd48cd7552f96c8eea69bd00d84f05b283a0dab311e102207e3c0ee9234814cfbb1b659b83671618f45abc1326b9edcc77d552a4f2a805c0014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffdcdc6023bbc9944a658ddc588e61eacb737ddf0a3cd24f113b5a8634c517fcd2000000008b4830450221008d6df731df5d32267954bd7d2dda2302b74c6c2a6aa5c0ca64ecbabc1af03c75022010e55c571d65da7701ae2da1956c442df81bbf076cdbac25133f99d98a9ed34c014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffffe15557cd5ce258f479dfd6dc6514edf6d7ed5b21fcfa4a038fd69f06b83ac76e010000008b483045022023b3e0ab071eb11de2eb1cc3a67261b866f86bf6867d4558165f7c8c8aca2d86022100dc6e1f53a91de3efe8f63512850811f26284b62f850c70ca73ed5de8771fb451014104462e76fd4067b3a0aa42070082dcb0bf2f388b6495cf33d789904f07d0f55c40fbd4b82963c69b3dc31895d0c772c812b1d5fbcade15312ef1c0e8ebbb12dcd4ffffffff01404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000010000000166d7577163c932b4f9690ca6a80b6e4eb001f0a2fa9023df5595602aae96ed8d000000008a4730440220262b42546302dfb654a229cefc86432b89628ff259dc87edd1154535b16a67e102207b4634c020a97c3e7bbd0d4d19da6aa2269ad9dded4026e896b213d73ca4b63f014104979b82d02226b3a4597523845754d44f13639e3bf2df5e82c6aab2bdc79687368b01b1ab8b19875ae3c90d661a3d0a33161dab29934edeb36aa01976be3baf8affffffff02404b4c00000000001976a9144854e695a02af0aeacb823ccbc272134561e0a1688ac40420f00000000001976a914abee93376d6b37b5c2940655a6fcaf1c8e74237988ac0000000001000000014e3f8ef2e91349a9059cb4f01e54ab2597c1387161d3da89919f7ea6acdbb371010000008c49304602210081f3183471a5ca22307c0800226f3ef9c353069e0773ac76bb580654d56aa523022100d4c56465bdc069060846f4fbf2f6b20520b2a80b08b168b31e66ddb9c694e240014104976c79848e18251612f8940875b2b08d06e6dc73b9840e8860c066b7e87432c477e9a59a453e71e6d76d5fe34058b800a098fc1740ce3012e8fc8a00c96af966ffffffff02c0e1e400000000001976a9144134e75a6fcb6042034aab5e18570cf1f844f54788ac404b4c00000000001976a9142b6ba7c9d796b75eef7942fc9288edd37c32f5c388ac00000000" + }, + { + "id": "000000005a4ded781e667e06ceefafb71410b511fe0d5adc3e5a27ecbec34ae6", + "transactions": 4, + "hex": "0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000" + }, + { + "id": "000000005a4ded781e667e06ceefafb71410b511fe0d5adc3e5a27ecbec34ae6", + "transactions": 4, + "hex": "0100000075616236cc2126035fadb38deb65b9102cc2c41c09cdf29fc051906800000000fe7d5e12ef0ff901f6050211249919b1c0653771832b3a80c66cea42847f0ae1d4d26e49ffff001d00f0a4410401000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d029105ffffffff0100f2052a010000004341046d8709a041d34357697dfcb30a9d05900a6294078012bf3bb09c6f9b525f1d16d5503d7905db1ada9501446ea00728668fc5719aa80be2fdfc8a858a4dbdd4fbac00000000010000000255605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d28350000000049483045022100aa46504baa86df8a33b1192b1b9367b4d729dc41e389f2c04f3e5c7f0559aae702205e82253a54bf5c4f65b7428551554b2045167d6d206dfe6a2e198127d3f7df1501ffffffff55605dc6f5c3dc148b6da58442b0b2cd422be385eab2ebea4119ee9c268d2835010000004847304402202329484c35fa9d6bb32a55a70c0982f606ce0e3634b69006138683bcd12cbb6602200c28feb1e2555c3210f1dddb299738b4ff8bbe9667b68cb8764b5ac17b7adf0001ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac0000000001000000025f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028000000004847304402205d6058484157235b06028c30736c15613a28bdb768ee628094ca8b0030d4d6eb0220328789c9a2ec27ddaec0ad5ef58efded42e6ea17c2e1ce838f3d6913f5e95db601ffffffff5f9a06d3acdceb56be1bfeaa3e8a25e62d182fa24fefe899d1c17f1dad4c2028010000004a493046022100c45af050d3cea806cedd0ab22520c53ebe63b987b8954146cdca42487b84bdd6022100b9b027716a6b59e640da50a864d6dd8a0ef24c76ce62391fa3eabaf4d2886d2d01ffffffff0200e1f505000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac000000000100000002e2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b0000000048473044022016e7a727a061ea2254a6c358376aaa617ac537eb836c77d646ebda4c748aac8b0220192ce28bf9f2c06a6467e6531e27648d2b3e2e2bae85159c9242939840295ba501ffffffffe2274e5fea1bf29d963914bd301aa63b64daaf8a3e88f119b5046ca5738a0f6b010000004a493046022100b7a1a755588d4190118936e15cd217d133b0e4a53c3c15924010d5648d8925c9022100aaef031874db2114f2d869ac2de4ae53908fbfea5b2b1862e181626bb9005c9f01ffffffff0200e1f505000000004341044a656f065871a353f216ca26cef8dde2f03e8c16202d2e8ad769f02032cb86a5eb5e56842e92e19141d60a01928f8dd2c875a390f67c1f6c94cfc617c0ea45afac00180d8f000000004341046a0765b5865641ce08dd39690aade26dfbf5511430ca428a3089261361cef170e3929a68aee3d8d4848b0c5111b0a37b82b86ad559fd2a745b44d8e8d9dfdc0cac00000000" + }, + { + "id": "000000000000dab0130bbcc991d3d7ae6b81aa6f50a798888dfe62337458dc45", + "transactions": 1, + "hex": "0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff08044c86041b020a02ffffffff0100f2052a01000000434104ecd3229b0571c3be876feaac0442a9f13c5a572742927af1dc623353ecf8c202225f64868137a18cdd85cbbb4c74fbccfd4f49639cf1bdc94a5672bb15ad5d4cac00000000" + }, + { + "id": "000000000000b731f2eef9e8c63173adfb07e41bd53eb0ef0a6b720d6cb6dea4", + "transactions": 7, + "hex": "0100000082bb869cf3a793432a66e826e05a6fc37469f8efb7421dc880670100000000007f16c5962e8bd963659c793ce370d95f093bc7e367117b3c30c1f8fdd0d9728776381b4d4c86041b554b85290701000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b0136ffffffff0100f2052a01000000434104eaafc2314def4ca98ac970241bcab022b9c1e1f4ea423a20f134c876f2c01ec0f0dd5b2e86e7168cefe0d81113c3807420ce13ad1357231a2252247d97a46a91ac000000000100000001bcad20a6a29827d1424f08989255120bf7f3e9e3cdaaa6bb31b0737fe048724300000000494830450220356e834b046cadc0f8ebb5a8a017b02de59c86305403dad52cd77b55af062ea10221009253cd6c119d4729b77c978e1e2aa19f5ea6e0e52b3f16e32fa608cd5bab753901ffffffff02008d380c010000001976a9142b4b8072ecbba129b6453c63e129e643207249ca88ac0065cd1d000000001976a9141b8dd13b994bcfc787b32aeadf58ccb3615cbd5488ac000000000100000003fdacf9b3eb077412e7a968d2e4f11b9a9dee312d666187ed77ee7d26af16cb0b000000008c493046022100ea1608e70911ca0de5af51ba57ad23b9a51db8d28f82c53563c56a05c20f5a87022100a8bdc8b4a8acc8634c6b420410150775eb7f2474f5615f7fccd65af30f310fbf01410465fdf49e29b06b9a1582287b6279014f834edc317695d125ef623c1cc3aaece245bd69fcad7508666e9c74a49dc9056d5fc14338ef38118dc4afae5fe2c585caffffffff309e1913634ecb50f3c4f83e96e70b2df071b497b8973a3e75429df397b5af83000000004948304502202bdb79c596a9ffc24e96f4386199aba386e9bc7b6071516e2b51dda942b3a1ed022100c53a857e76b724fc14d45311eac5019650d415c3abb5428f3aae16d8e69bec2301ffffffff2089e33491695080c9edc18a428f7d834db5b6d372df13ce2b1b0e0cbcb1e6c10000000049483045022100d4ce67c5896ee251c810ac1ff9ceccd328b497c8f553ab6e08431e7d40bad6b5022033119c0c2b7d792d31f1187779c7bd95aefd93d90a715586d73801d9b47471c601ffffffff0100714460030000001976a914c7b55141d097ea5df7a0ed330cf794376e53ec8d88ac0000000001000000045bf0e214aa4069a3e792ecee1e1bf0c1d397cde8dd08138f4b72a00681743447000000008b48304502200c45de8c4f3e2c1821f2fc878cba97b1e6f8807d94930713aa1c86a67b9bf1e40221008581abfef2e30f957815fc89978423746b2086375ca8ecf359c85c2a5b7c88ad01410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffffd669f7d7958d40fc59d2253d88e0f248e29b599c80bbcec344a83dda5f9aa72c000000008a473044022078124c8beeaa825f9e0b30bff96e564dd859432f2d0cb3b72d3d5d93d38d7e930220691d233b6c0f995be5acb03d70a7f7a65b6bc9bdd426260f38a1346669507a3601410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95fffffffff878af0d93f5229a68166cf051fd372bb7a537232946e0a46f53636b4dafdaa4000000008c493046022100c717d1714551663f69c3c5759bdbb3a0fcd3fab023abc0e522fe6440de35d8290221008d9cbe25bffc44af2b18e81c58eb37293fd7fe1c2e7b46fc37ee8c96c50ab1e201410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff27f2b668859cd7f2f894aa0fd2d9e60963bcd07c88973f425f999b8cbfd7a1e2000000008c493046022100e00847147cbf517bcc2f502f3ddc6d284358d102ed20d47a8aa788a62f0db780022100d17b2d6fa84dcaf1c95d88d7e7c30385aecf415588d749afd3ec81f6022cecd701410462bb73f76ca0994fcb8b4271e6fb7561f5c0f9ca0cf6485261c4a0dc894f4ab844c6cdfb97cd0b60ffb5018ffd6238f4d87270efb1d3ae37079b794a92d7ec95ffffffff0100c817a8040000001976a914b6efd80d99179f4f4ff6f4dd0a007d018c385d2188ac000000000100000001834537b2f1ce8ef9373a258e10545ce5a50b758df616cd4356e0032554ebd3c4000000008b483045022100e68f422dd7c34fdce11eeb4509ddae38201773dd62f284e8aa9d96f85099d0b002202243bd399ff96b649a0fad05fa759d6a882f0af8c90cf7632c2840c29070aec20141045e58067e815c2f464c6a2a15f987758374203895710c2d452442e28496ff38ba8f5fd901dc20e29e88477167fe4fc299bf818fd0d9e1632d467b2a3d9503b1aaffffffff0280d7e636030000001976a914f34c3e10eb387efe872acb614c89e78bfca7815d88ac404b4c00000000001976a914a84e272933aaf87e1715d7786c51dfaeb5b65a6f88ac00000000010000000143ac81c8e6f6ef307dfe17f3d906d999e23e0189fda838c5510d850927e03ae7000000008c4930460221009c87c344760a64cb8ae6685a3eec2c1ac1bed5b88c87de51acd0e124f266c16602210082d07c037359c3a257b5c63ebd90f5a5edf97b2ac1c434b08ca998839f346dd40141040ba7e521fa7946d12edbb1d1e95a15c34bd4398195e86433c92b431cd315f455fe30032ede69cad9d1e1ed6c3c4ec0dbfced53438c625462afb792dcb098544bffffffff0240420f00000000001976a9144676d1b820d63ec272f1900d59d43bc6463d96f888ac40420f00000000001976a914648d04341d00d7968b3405c034adc38d4d8fb9bd88ac00000000010000000248cc917501ea5c55f4a8d2009c0567c40cfe037c2e71af017d0a452ff705e3f1000000008b483045022100bf5fdc86dc5f08a5d5c8e43a8c9d5b1ed8c65562e280007b52b133021acd9acc02205e325d613e555f772802bf413d36ba807892ed1a690a77811d3033b3de226e0a01410429fa713b124484cb2bd7b5557b2c0b9df7b2b1fee61825eadc5ae6c37a9920d38bfccdc7dc3cb0c47d7b173dbc9db8d37db0a33ae487982c59c6f8606e9d1791ffffffff41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068000000008b4830450221008513ad65187b903aed1102d1d0c47688127658c51106753fed0151ce9c16b80902201432b9ebcb87bd04ceb2de66035fbbaf4bf8b00d1cfe41f1a1f7338f9ad79d210141049d4cf80125bf50be1709f718c07ad15d0fc612b7da1f5570dddc35f2a352f0f27c978b06820edca9ef982c35fda2d255afba340068c5035552368bc7200c1488ffffffff0100093d00000000001976a9148edb68822f1ad580b043c7b3df2e400f8699eb4888ac00000000" + } +] diff --git a/web/bitcoincashjs-lib/test/fixtures/core/sig_canonical.json b/web/bitcoincashjs-lib/test/fixtures/core/sig_canonical.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/sig_canonical.json @@ -0,0 +1,7 @@ +[ + "300602010002010001", + "3008020200ff020200ff01", + "304402203932c892e2e550f3af8ee4ce9c215a87f9bb831dcac87b2838e2c2eaa891df0c022030b61dd36543125d56b9f9f3a1f9353189e5af33cdda8d77a5209aec03978fa001", + "30450220076045be6f9eca28ff1ec606b833d0b87e70b2a630f5e3a496b110967a40f90a0221008fffd599910eefe00bc803c688c2eca1d2ba7f6b180620eaa03488e6585db6ba01", + "3046022100876045be6f9eca28ff1ec606b833d0b87e70b2a630f5e3a496b110967a40f90a0221008fffd599910eefe00bc803c688c2eca1d2ba7f6b180620eaa03488e6585db6ba01" +] diff --git a/web/bitcoincashjs-lib/test/fixtures/core/sig_noncanonical.json b/web/bitcoincashjs-lib/test/fixtures/core/sig_noncanonical.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/sig_noncanonical.json @@ -0,0 +1,36 @@ +[ + "non-hex strings are ignored", + + "too short:", + "30050201FF020001", + "too long:", + "30470221005990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba6105022200002d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "hashtype:", + "304402205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610502202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed11", + "type:", + "314402205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610502202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "total length:", + "304502205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610502202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "S len oob:", + "301F01205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb101", + "R+S:", + "304502205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610502202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed0001", + + "R type:", + "304401205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610502202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "R len = 0:", + "3024020002202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "R<0:", + "304402208990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610502202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "R padded:", + "30450221005990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610502202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + + "S type:", + "304402205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba610501202d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "S len = 0:", + "302402205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba6105020001", + "S<0:", + "304402205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba61050220fd5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01", + "S padded:", + "304502205990e0584b2b238e1dfaad8d6ed69ecc1a4a13ac85fc0b31d0df395eb1ba61050221002d5876262c288beb511d061691bf26777344b702b00f8fe28621fe4e566695ed01" +] diff --git a/web/bitcoincashjs-lib/test/fixtures/core/sighash.json b/web/bitcoincashjs-lib/test/fixtures/core/sighash.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/sighash.json @@ -0,0 +1,3503 @@ +[ + ["raw_transaction, script, input_index, hashType, signature_hash (result)"], + [ + "907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000004ab65ababfd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de802000000096aab5253ab52000052ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000009ab53526500636a52ab599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec229", + "", + 2, + 1864164639, + "31af167a6cf3f9d5f6875caa4d31704ceb0eba078d132b78dab52c3b8997317e" + ], + [ + "a0aa3126041621a6dea5b800141aa696daf28408959dfb2df96095db9fa425ad3f427f2f6103000000015360290e9c6063fa26912c2e7fb6a0ad80f1c5fea1771d42f12976092e7a85a4229fdb6e890000000001abc109f6e47688ac0e4682988785744602b8c87228fcef0695085edf19088af1a9db126e93000000000665516aac536affffffff8fe53e0806e12dfd05d67ac68f4768fdbe23fc48ace22a5aa8ba04c96d58e2750300000009ac51abac63ab5153650524aa680455ce7b000000000000499e50030000000008636a00ac526563ac5051ee030000000003abacabd2b6fe000000000003516563910fb6b5", + "65", + 0, + -1391424484, + "48d6a1bd2cd9eec54eb866fc71209418a950402b5d7e52363bfb75c98e141175" + ], + [ + "6e7e9d4b04ce17afa1e8546b627bb8d89a6a7fefd9d892ec8a192d79c2ceafc01694a6a7e7030000000953ac6a51006353636a33bced1544f797f08ceed02f108da22cd24c9e7809a446c61eb3895914508ac91f07053a01000000055163ab516affffffff11dc54eee8f9e4ff0bcf6b1a1a35b1cd10d63389571375501af7444073bcec3c02000000046aab53514a821f0ce3956e235f71e4c69d91abe1e93fb703bd33039ac567249ed339bf0ba0883ef300000000090063ab65000065ac654bec3cc504bcf499020000000005ab6a52abac64eb060100000000076a6a5351650053bbbc130100000000056a6aab53abd6e1380100000000026a51c4e509b8", + "acab655151", + 0, + 479279909, + "2a3d95b09237b72034b23f2d2bb29fa32a58ab5c6aa72f6aafdfa178ab1dd01c" + ], + [ + "73107cbd025c22ebc8c3e0a47b2a760739216a528de8d4dab5d45cbeb3051cebae73b01ca10200000007ab6353656a636affffffffe26816dffc670841e6a6c8c61c586da401df1261a330a6c6b3dd9f9a0789bc9e000000000800ac6552ac6aac51ffffffff0174a8f0010000000004ac52515100000000", + "5163ac63635151ac", + 1, + 1190874345, + "06e328de263a87b09beabe222a21627a6ea5c7f560030da31610c4611f4a46bc" + ], + [ + "e93bbf6902be872933cb987fc26ba0f914fcfc2f6ce555258554dd9939d12032a8536c8802030000000453ac5353eabb6451e074e6fef9de211347d6a45900ea5aaf2636ef7967f565dce66fa451805c5cd10000000003525253ffffffff047dc3e6020000000007516565ac656aabec9eea010000000001633e46e600000000000015080a030000000001ab00000000", + "5300ac6a53ab6a", + 1, + -886562767, + "f03aa4fc5f97e826323d0daa03343ebf8a34ed67a1ce18631f8b88e5c992e798" + ], + [ + "50818f4c01b464538b1e7e7f5ae4ed96ad23c68c830e78da9a845bc19b5c3b0b20bb82e5e9030000000763526a63655352ffffffff023b3f9c040000000008630051516a6a5163a83caf01000000000553ab65510000000000", + "6aac", + 0, + 946795545, + "746306f322de2b4b58ffe7faae83f6a72433c22f88062cdde881d4dd8a5a4e2d" + ], + [ + "a93e93440250f97012d466a6cc24839f572def241c814fe6ae94442cf58ea33eb0fdd9bcc1030000000600636a0065acffffffff5dee3a6e7e5ad6310dea3e5b3ddda1a56bf8de7d3b75889fc024b5e233ec10f80300000007ac53635253ab53ffffffff0160468b04000000000800526a5300ac526a00000000", + "ac00636a53", + 1, + 1773442520, + "5c9d3a2ce9365bb72cfabbaa4579c843bb8abf200944612cf8ae4b56a908bcbd" + ], + [ + "ce7d371f0476dda8b811d4bf3b64d5f86204725deeaa3937861869d5b2766ea7d17c57e40b0100000003535265ffffffff7e7e9188f76c34a46d0bbe856bde5cb32f089a07a70ea96e15e92abb37e479a10100000006ab6552ab655225bcab06d1c2896709f364b1e372814d842c9c671356a1aa5ca4e060462c65ae55acc02d0000000006abac0063ac5281b33e332f96beebdbc6a379ebe6aea36af115c067461eb99d22ba1afbf59462b59ae0bd0200000004ab635365be15c23801724a1704000000000965006a65ac00000052ca555572", + "53ab530051ab", + 1, + 2030598449, + "c336b2f7d3702fbbdeffc014d106c69e3413c7c71e436ba7562d8a7a2871f181" + ], + [ + "d3b7421e011f4de0f1cea9ba7458bf3486bee722519efab711a963fa8c100970cf7488b7bb0200000003525352dcd61b300148be5d05000000000000000000", + "535251536aac536a", + 0, + -1960128125, + "29aa6d2d752d3310eba20442770ad345b7f6a35f96161ede5f07b33e92053e2a" + ], + [ + "04bac8c5033460235919a9c63c42b2db884c7c8f2ed8fcd69ff683a0a2cccd9796346a04050200000003655351fcad3a2c5a7cbadeb4ec7acc9836c3f5c3e776e5c566220f7f965cf194f8ef98efb5e3530200000007526a006552526526a2f55ba5f69699ece76692552b399ba908301907c5763d28a15b08581b23179cb01eac03000000075363ab6a516351073942c2025aa98a05000000000765006aabac65abd7ffa6030000000004516a655200000000", + "53ac6365ac526a", + 1, + 764174870, + "bf5fdc314ded2372a0ad078568d76c5064bf2affbde0764c335009e56634481b" + ], + [ + "c363a70c01ab174230bbe4afe0c3efa2d7f2feaf179431359adedccf30d1f69efe0c86ed390200000002ab51558648fe0231318b04000000000151662170000000000008ac5300006a63acac00000000", + "", + 0, + 2146479410, + "191ab180b0d753763671717d051f138d4866b7cb0d1d4811472e64de595d2c70" + ], + [ + "8d437a7304d8772210a923fd81187c425fc28c17a5052571501db05c7e89b11448b36618cd02000000026a6340fec14ad2c9298fde1477f1e8325e5747b61b7e2ff2a549f3d132689560ab6c45dd43c3010000000963ac00ac000051516a447ed907a7efffebeb103988bf5f947fc688aab2c6a7914f48238cf92c337fad4a79348102000000085352ac526a5152517436edf2d80e3ef06725227c970a816b25d0b58d2cd3c187a7af2cea66d6b27ba69bf33a0300000007000063ab526553f3f0d6140386815d030000000003ab6300de138f00000000000900525153515265abac1f87040300000000036aac6500000000", + "51", + 3, + -315779667, + "b6632ac53578a741ae8c36d8b69e79f39b89913a2c781cdf1bf47a8c29d997a5" + ], + [ + "fd878840031e82fdbe1ad1d745d1185622b0060ac56638290ec4f66b1beef4450817114a2c0000000009516a63ab53650051abffffffff37b7a10322b5418bfd64fb09cd8a27ddf57731aeb1f1f920ffde7cb2dfb6cdb70300000008536a5365ac53515369ecc034f1594690dbe189094dc816d6d57ea75917de764cbf8eccce4632cbabe7e116cd0100000003515352ffffffff035777fc000000000003515200abe9140300000000050063005165bed6d10200000000076300536363ab65195e9110", + "635265", + 0, + 1729787658, + "6e3735d37a4b28c45919543aabcb732e7a3e1874db5315abb7cc6b143d62ff10" + ], + [ + "f40a750702af06efff3ea68e5d56e42bc41cdb8b6065c98f1221fe04a325a898cb61f3d7ee030000000363acacffffffffb5788174aef79788716f96af779d7959147a0c2e0e5bfb6c2dba2df5b4b97894030000000965510065535163ac6affffffff0445e6fd0200000000096aac536365526a526aa6546b000000000008acab656a6552535141a0fd010000000000c897ea030000000008526500ab526a6a631b39dba3", + "00abab5163ac", + 1, + -1778064747, + "d76d0fc0abfa72d646df888bce08db957e627f72962647016eeae5a8412354cf" + ], + [ + "a63bc673049c75211aa2c09ecc38e360eaa571435fedd2af1116b5c1fa3d0629c269ecccbf0000000008ac65ab516352ac52ffffffffbf1a76fdda7f451a5f0baff0f9ccd0fe9136444c094bb8c544b1af0fa2774b06010000000463535253ffffffff13d6b7c3ddceef255d680d87181e100864eeb11a5bb6a3528cb0d70d7ee2bbbc02000000056a0052abab951241809623313b198bb520645c15ec96bfcc74a2b0f3db7ad61d455cc32db04afc5cc702000000016309c9ae25014d9473020000000004abab6aac3bb1e803", + "", + 3, + -232881718, + "6e48f3da3a4ac07eb4043a232df9f84e110485d7c7669dd114f679c27d15b97e" + ], + [ + "4c565efe04e7d32bac03ae358d63140c1cfe95de15e30c5b84f31bb0b65bb542d637f49e0f010000000551abab536348ae32b31c7d3132030a510a1b1aacf7b7c3f19ce8dc49944ef93e5fa5fe2d356b4a73a00100000009abac635163ac00ab514c8bc57b6b844e04555c0a4f4fb426df139475cd2396ae418bc7015820e852f711519bc202000000086a00510000abac52488ff4aec72cbcfcc98759c58e20a8d2d9725aa4a80f83964e69bc4e793a4ff25cd75dc701000000086a52ac6aac5351532ec6b10802463e0200000000000553005265523e08680100000000002f39a6b0", + "", + 3, + 70712784, + "c6076b6a45e6fcfba14d3df47a34f6aadbacfba107e95621d8d7c9c0e40518ed" + ], + [ + "1233d5e703403b3b8b4dae84510ddfc126b4838dcb47d3b23df815c0b3a07b55bf3098110e010000000163c5c55528041f480f40cf68a8762d6ed3efe2bd402795d5233e5d94bf5ddee71665144898030000000965525165655151656affffffff6381667e78bb74d0880625993bec0ea3bd41396f2bcccc3cc097b240e5e92d6a01000000096363acac6a63536365ffffffff04610ad60200000000065251ab65ab52e90d680200000000046351516ae30e98010000000008abab52520063656a671856010000000004ac6aac514c84e383", + "6aabab636300", + 1, + -114996813, + "aeb8c5a62e8a0b572c28f2029db32854c0b614dbecef0eaa726abebb42eebb8d" + ], + [ + "0c69702103b25ceaed43122cc2672de84a3b9aa49872f2a5bb458e19a52f8cc75973abb9f102000000055365656aacffffffff3ffb1cf0f76d9e3397de0942038c856b0ebbea355dc9d8f2b06036e19044b0450100000000ffffffff4b7793f4169617c54b734f2cd905ed65f1ce3d396ecd15b6c426a677186ca0620200000008655263526551006a181a25b703240cce0100000000046352ab53dee22903000000000865526a6a516a51005e121602000000000852ab52ababac655200000000", + "6a516aab63", + 1, + -2040012771, + "a6e6cb69f409ec14e10dd476f39167c29e586e99bfac93a37ed2c230fcc1dbbe" + ], + [ + "fd22692802db8ae6ab095aeae3867305a954278f7c076c542f0344b2591789e7e33e4d29f4020000000151ffffffffb9409129cfed9d3226f3b6bab7a2c83f99f48d039100eeb5796f00903b0e5e5e0100000006656552ac63abd226abac0403e649000000000007abab51ac5100ac8035f10000000000095165006a63526a52510d42db030000000007635365ac6a63ab24ef5901000000000453ab6a0000000000", + "536a52516aac6a", + 1, + 309309168, + "7ca0f75e6530ec9f80d031fc3513ca4ecd67f20cb38b4dacc6a1d825c3cdbfdb" + ], + [ + "a43f85f701ffa54a3cc57177510f3ea28ecb6db0d4431fc79171cad708a6054f6e5b4f89170000000008ac6a006a536551652bebeaa2013e779c05000000000665ac5363635100000000", + "ac", + 0, + 2028978692, + "58294f0d7f2e68fe1fd30c01764fe1619bcc7961d68968944a0e263af6550437" + ], + [ + "c2b0b99001acfecf7da736de0ffaef8134a9676811602a6299ba5a2563a23bb09e8cbedf9300000000026300ffffffff042997c50300000000045252536a272437030000000007655353ab6363ac663752030000000002ab6a6d5c900000000000066a6a5265abab00000000", + "52ac525163515251", + 0, + -894181723, + "8b300032a1915a4ac05cea2f7d44c26f2a08d109a71602636f15866563eaafdc" + ], + [ + "82f9f10304c17a9d954cf3380db817814a8c738d2c811f0412284b2c791ec75515f38c4f8c020000000265ab5729ca7db1b79abee66c8a757221f29280d0681355cb522149525f36da760548dbd7080a0100000001510b477bd9ce9ad5bb81c0306273a3a7d051e053f04ecf3a1dbeda543e20601a5755c0cfae030000000451ac656affffffff71141a04134f6c292c2e0d415e6705dfd8dcee892b0d0807828d5aeb7d11f5ef0300000001520b6c6dc802a6f3dd0000000000056aab515163bfb6800300000000015300000000", + "", + 3, + -635779440, + "d55ed1e6c53510f2608716c12132a11fb5e662ec67421a513c074537eeccc34b" + ], + [ + "8edcf5a1014b604e53f0d12fe143cf4284f86dc79a634a9f17d7e9f8725f7beb95e8ffcd2403000000046aabac52ffffffff01c402b5040000000005ab6a63525100000000", + "6351525251acabab6a", + 0, + 1520147826, + "2765bbdcd3ebb8b1a316c04656b28d637f80bffbe9b040661481d3dc83eea6d6" + ], + [ + "2074bad5011847f14df5ea7b4afd80cd56b02b99634893c6e3d5aaad41ca7c8ee8e5098df003000000026a6affffffff018ad59700000000000900ac656a526551635300000000", + "65635265", + 0, + -1804671183, + "663c999a52288c9999bff36c9da2f8b78d5c61b8347538f76c164ccba9868d0a" + ], + [ + "7100b11302e554d4ef249ee416e7510a485e43b2ba4b8812d8fe5529fe33ea75f36d392c4403000000020000ffffffff3d01a37e075e9a7715a657ae1bdf1e44b46e236ad16fd2f4c74eb9bf370368810000000007636553ac536365ffffffff01db696a0400000000065200ac656aac00000000", + "63005151", + 0, + -1210499507, + "b9c3aee8515a4a3b439de1ffc9c156824bda12cb75bfe5bc863164e8fd31bd7a" + ], + [ + "02c1017802091d1cb08fec512db7b012fe4220d57a5f15f9e7676358b012786e1209bcff950100000004acab6352ffffffff799bc282724a970a6fea1828984d0aeb0f16b67776fa213cbdc4838a2f1961a3010000000951516a536552ab6aabffffffff016c7b4b03000000000865abac5253ac5352b70195ad", + "65655200516a", + 0, + -241626954, + "be567cb47170b34ff81c66c1142cb9d27f9b6898a384d6dfc4fce16b75b6cb14" + ], + [ + "cb3178520136cd294568b83bb2520f78fecc507898f4a2db2674560d72fd69b9858f75b3b502000000066aac00515100ffffffff03ab005a01000000000563526363006e3836030000000001abfbda3200000000000665ab0065006500000000", + "ab516a0063006a5300", + 0, + 1182109299, + "2149e79c3f4513da4e4378608e497dcfdfc7f27c21a826868f728abd2b8a637a" + ], + [ + "18a4b0c004702cf0e39686ac98aab78ad788308f1d484b1ddfe70dc1997148ba0e28515c310300000000ffffffff05275a52a23c59da91129093364e275da5616c4070d8a05b96df5a2080ef259500000000096aac51656a6aac53ab66e64966b3b36a07dd2bb40242dd4a3743d3026e7e1e0d9e9e18f11d068464b989661321030000000265ac383339c4fae63379cafb63b0bab2eca70e1f5fc7d857eb5c88ccd6c0465093924bba8b2a000000000300636ab5e0545402bc2c4c010000000000cd41c002000000000000000000", + "abac635253656a00", + 3, + 2052372230, + "32db877b6b1ca556c9e859442329406f0f8246706522369839979a9f7a235a32" + ], + [ + "1d9c5df20139904c582285e1ea63dec934251c0f9cf5c47e86abfb2b394ebc57417a81f67c010000000353515222ba722504800d3402000000000353656a3c0b4a0200000000000fb8d20500000000076300ab005200516462f30400000000015200000000", + "ab65", + 0, + -210854112, + "edf73e2396694e58f6b619f68595b0c1cdcb56a9b3147845b6d6afdb5a80b736" + ], + [ + "4504cb1904c7a4acf375ddae431a74de72d5436efc73312cf8e9921f431267ea6852f9714a01000000066a656a656553a2fbd587c098b3a1c5bd1d6480f730a0d6d9b537966e20efc0e352d971576d0f87df0d6d01000000016321aeec3c4dcc819f1290edb463a737118f39ab5765800547522708c425306ebfca3f396603000000055300ac656a1d09281d05bfac57b5eb17eb3fa81ffcedfbcd3a917f1be0985c944d473d2c34d245eb350300000007656a51525152ac263078d9032f470f0500000000066aac00000052e12da60200000000003488410200000000076365006300ab539981e432", + "52536a52526a", + 1, + -31909119, + "f0a2deee7fd8a3a9fad6927e763ded11c940ee47e9e6d410f94fda5001f82e0c" + ], + [ + "14bc7c3e03322ec0f1311f4327e93059c996275302554473104f3f7b46ca179bfac9ef753503000000016affffffff9d405eaeffa1ca54d9a05441a296e5cc3a3e32bb8307afaf167f7b57190b07e00300000008abab51ab5263abab45533aa242c61bca90dd15d46079a0ab0841d85df67b29ba87f2393cd764a6997c372b55030000000452005263ffffffff0250f40e02000000000651516a0063630e95ab0000000000046a5151ac00000000", + "6a65005151", + 0, + -1460947095, + "aa418d096929394c9147be8818d8c9dafe6d105945ab9cd7ec682df537b5dd79" + ], + [ + "2b3bd0dd04a1832f893bf49a776cd567ec4b43945934f4786b615d6cb850dfc0349b33301a000000000565ac000051cf80c670f6ddafab63411adb4d91a69c11d9ac588898cbfb4cb16061821cc104325c895103000000025163ffffffffa9e2d7506d2d7d53b882bd377bbcc941f7a0f23fd15d2edbef3cd9df8a4c39d10200000009ac63006a52526a5265ffffffff44c099cdf10b10ce87d4b38658d002fd6ea17ae4a970053c05401d86d6e75f99000000000963ab53526a5252ab63ffffffff035af69c01000000000100ba9b8b0400000000004cead10500000000026a520b77d667", + "ab52abac526553", + 3, + -1955078165, + "eb9ceecc3b401224cb79a44d23aa8f428e29f1405daf69b4e01910b848ef1523" + ], + [ + "35df11f004a48ba439aba878fe9df20cc935b4a761c262b1b707e6f2b33e2bb7565cd68b130000000000ffffffffb2a2f99abf64163bb57ca900500b863f40c02632dfd9ea2590854c5fb4811da90200000006ac006363636affffffffaf9d89b2a8d2670ca37c8f7c140600b81259f2e037cb4590578ec6e37af8bf200000000005abac6a655270a4751eb551f058a93301ffeda2e252b6614a1fdd0e283e1d9fe53c96c5bbaafaac57b8030000000153ffffffff020d9f3b02000000000100ed7008030000000004abac000000000000", + "abac", + 3, + 593793071, + "88fdee1c2d4aeead71d62396e28dc4d00e5a23498eea66844b9f5d26d1f21042" + ], + [ + "a08ff466049fb7619e25502ec22fedfb229eaa1fe275aa0b5a23154b318441bf547989d0510000000005ab5363636affffffff2b0e335cb5383886751cdbd993dc0720817745a6b1c9b8ab3d15547fc9aafd03000000000965656a536a52656a532b53d10584c290d3ac1ab74ab0a19201a4a039cb59dc58719821c024f6bf2eb26322b33f010000000965ac6aac0053ab6353ffffffff048decba6ebbd2db81e416e39dde1f821ba69329725e702bcdea20c5cc0ecc6402000000086363ab5351ac6551466e377b0468c0fa00000000000651ab53ac6a513461c6010000000008636a636365535100eeb3dc010000000006526a52ac516a43f362010000000005000063536500000000", + "0063516a", + 1, + -1158911348, + "f6a1ecb50bd7c2594ebecea5a1aa23c905087553e40486dade793c2f127fdfae" + ], + [ + "5ac2f17d03bc902e2bac2469907ec7d01a62b5729340bc58c343b7145b66e6b97d434b30fa000000000163ffffffff44028aa674192caa0d0b4ebfeb969c284cb16b80c312d096efd80c6c6b094cca000000000763acabac516a52ffffffff10c809106e04b10f9b43085855521270fb48ab579266e7474657c6c625062d2d030000000351636595a0a97004a1b69603000000000465ab005352ad68010000000008636a5263acac5100da7105010000000002acab90325200000000000000000000", + "6a6aab516a63526353", + 2, + 1518400956, + "f7efb74b1dcc49d316b49c632301bc46f98d333c427e55338be60c7ef0d953be" + ], + [ + "aeb2e11902dc3770c218b97f0b1960d6ee70459ecb6a95eff3f05295dc1ef4a0884f10ba460300000005516352526393e9b1b3e6ae834102d699ddd3845a1e159aa7cf7635edb5c02003f7830fee3788b795f20100000009ab006a526553ac006ad8809c570469290e0400000000050000abab00b10fd5040000000008ab655263abac53ab630b180300000000009d9993040000000002516300000000", + "5351ababac6a65", + 0, + 1084852870, + "f2286001af0b0170cbdad92693d0a5ebaa8262a4a9d66e002f6d79a8c94026d1" + ], + [ + "9860ca9a0294ff4812534def8c3a3e3db35b817e1a2ddb7f0bf673f70eab71bb79e90a2f3100000000086a636551acac5165ffffffffed4d6d3cd9ff9b2d490e0c089739121161a1445844c3e204296816ab06e0a83702000000035100ac88d0db5201c3b59a050000000005ac6a0051ab00000000", + "535263ab006a526aab", + 1, + -962088116, + "30df2473e1403e2b8e637e576825f785528d998af127d501556e5f7f5ed89a2a" + ], + [ + "4ddaa680026ec4d8060640304b86823f1ac760c260cef81d85bd847952863d629a3002b54b0200000008526365636a656aab65457861fc6c24bdc760c8b2e906b6656edaf9ed22b5f50e1fb29ec076ceadd9e8ebcb6b000000000152ffffffff033ff04f00000000000551526a00657a1d900300000000002153af040000000003006a6300000000", + "ab526a53acabab", + 0, + 1055317633, + "7f21b62267ed52462e371a917eb3542569a4049b9dfca2de3c75872b39510b26" + ], + [ + "01e76dcd02ad54cbc8c71d68eaf3fa7c883b65d74217b30ba81f1f5144ef80b706c0dc82ca000000000352ab6a078ec18bcd0514825feced2e8b8ea1ccb34429fae41c70cc0b73a2799e85603613c6870002000000086363ab6365536a53ffffffff043acea90000000000016ad20e1803000000000100fa00830200000000056352515351e864ee00000000000865535253ab6a6551d0c46672", + "6a6365abacab", + 0, + -1420559003, + "8af0b4cbdbc011be848edf4dbd2cde96f0578d662cfebc42252495387114224a" + ], + [ + "fa00b26402670b97906203434aa967ce1559d9bd097d56dbe760469e6032e7ab61accb54160100000006635163630052fffffffffe0d3f4f0f808fd9cfb162e9f0c004601acf725cd7ea5683bbdc9a9a433ef15a0200000005ab52536563d09c7bef049040f305000000000153a7c7b9020000000004ac63ab52847a2503000000000553ab00655390ed80010000000005006553ab52860671d4", + "536565ab52", + 0, + 799022412, + "40ed8e7bbbd893e15f3cce210ae02c97669818de5946ca37eefc7541116e2c78" + ], + [ + "cb5c06dc01b022ee6105ba410f0eb12b9ce5b5aa185b28532492d839a10cef33d06134b91b010000000153ffffffff02cec0530400000000005e1e4504000000000865656551acacac6a00000000", + "ab53", + 0, + -1514251329, + "136beb95459fe6b126cd6cefd54eb5d971524b0e883e41a292a78f78015cb8d5" + ], + [ + "f10a0356031cd569d652dbca8e7a4d36c8da33cdff428d003338602b7764fe2c96c505175b010000000465ac516affffffffbb54563c71136fa944ee20452d78dc87073ac2365ba07e638dce29a5d179da600000000003635152ffffffff9a411d8e2d421b1e6085540ee2809901e590940bbb41532fa38bd7a16b68cc350100000007535251635365636195df1603b61c45010000000002ab65bf6a310400000000026352fcbba10200000000016aa30b7ff0", + "5351", + 0, + 1552495929, + "9eb8adf2caecb4bf9ac59d7f46bd20e83258472db2f569ee91aba4cf5ee78e29" + ], + [ + "c3325c9b012f659466626ca8f3c61dfd36f34670abc054476b7516a1839ec43cd0870aa0c0000000000753525265005351e7e3f04b0112650500000000000363ac6300000000", + "acac", + 0, + -68961433, + "5ca70e727d91b1a42b78488af2ed551642c32d3de4712a51679f60f1456a8647" + ], + [ + "2333e54c044370a8af16b9750ac949b151522ea6029bacc9a34261599549581c7b4e5ece470000000007510052006563abffffffff80630fc0155c750ce20d0ca4a3d0c8e8d83b014a5b40f0b0be0dd4c63ac28126020000000465000000ffffffff1b5f1433d38cdc494093bb1d62d84b10abbdae57e3d04e82e600857ab3b1dc990300000003515100b76564be13e4890a908ea7508afdad92ec1b200a9a67939fadce6eb7a29eb4550a0a28cb0300000001acffffffff02926c930300000000016373800201000000000153d27ee740", + "ab6365ab516a53", + 3, + 598653797, + "2be27a686eb7940dd32c44ff3a97c1b28feb7ab9c5c0b1593b2d762361cfc2db" + ], + [ + "b500ca48011ec57c2e5252e5da6432089130603245ffbafb0e4c5ffe6090feb629207eeb0e010000000652ab6a636aab8302c9d2042b44f40500000000015278c05a050000000004ac5251524be080020000000007636aac63ac5252c93a9a04000000000965ab6553636aab5352d91f9ddb", + "52005100", + 0, + -2024394677, + "49c8a6940a461cc7225637f1e512cdd174c99f96ec05935a59637ededc77124c" + ], + [ + "f52ff64b02ee91adb01f3936cc42e41e1672778962b68cf013293d649536b519bc3271dd2c00000000020065afee11313784849a7c15f44a61cd5fd51ccfcdae707e5896d131b082dc9322a19e12858501000000036aac654e8ca882022deb7c020000000006006a515352abd3defc0000000000016300000000", + "63520063", + 0, + 1130989496, + "7f208df9a5507e98c62cebc5c1e2445eb632e95527594929b9577b53363e96f6" + ], + [ + "ab7d6f36027a7adc36a5cf7528fe4fb5d94b2c96803a4b38a83a675d7806dda62b380df86a0000000003000000ffffffff5bc00131e29e22057c04be854794b4877dda42e416a7a24706b802ff9da521b20000000007ac6a0065ac52ac957cf45501b9f06501000000000500ac6363ab25f1110b", + "00526500536a635253", + 0, + 911316637, + "5fa09d43c8aef6f6fa01c383a69a5a61a609cd06e37dce35a39dc9eae3ddfe6c" + ], + [ + "f940888f023dce6360263c850372eb145b864228fdbbb4c1186174fa83aab890ff38f8c9a90300000000ffffffff01e80ccdb081e7bbae1c776531adcbfb77f2e5a7d0e5d0d0e2e6c8758470e85f00000000020053ffffffff03b49088050000000004656a52ab428bd604000000000951630065ab63ac636a0cbacf0400000000070063ac5265ac53d6e16604", + "ac63", + 0, + 39900215, + "713ddeeefcfe04929e7b6593c792a4efbae88d2b5280d1f0835d2214eddcbad6" + ], + [ + "530ecd0b01ec302d97ef6f1b5a6420b9a239714013e20d39aa3789d191ef623fc215aa8b940200000005ac5351ab6a3823ab8202572eaa04000000000752ab6a51526563fd8a270100000000036a006581a798f0", + "525153656a0063", + 0, + 1784562684, + "fe42f73a8742676e640698222b1bd6b9c338ff1ccd766d3d88d7d3c6c6ac987e" + ], + [ + "5d781d9303acfcce964f50865ddfddab527ea971aee91234c88e184979985c00b4de15204b0100000003ab6352a009c8ab01f93c8ef2447386c434b4498538f061845862c3f9d5751ad0fce52af442b3a902000000045165ababb909c66b5a3e7c81b3c45396b944be13b8aacfc0204f3f3c105a66fa8fa6402f1b5efddb01000000096a65ac636aacab656ac3c677c402b79fa4050000000004006aab5133e35802000000000751ab635163ab0078c2e025", + "6aac51636a6a005265", + 0, + -882306874, + "551ce975d58647f10adefb3e529d9bf9cda34751627ec45e690f135ef0034b95" + ], + [ + "25ee54ef0187387564bb86e0af96baec54289ca8d15e81a507a2ed6668dc92683111dfb7a50100000004005263634cecf17d0429aa4d000000000007636a6aabab5263daa75601000000000251ab4df70a01000000000151980a890400000000065253ac6a006377fd24e3", + "65ab", + 0, + 797877378, + "069f38fd5d47abff46f04ee3ae27db03275e9aa4737fa0d2f5394779f9654845" + ], + [ + "a9c57b1a018551bcbc781b256642532bbc09967f1cbe30a227d352a19365d219d3f11649a3030000000451655352b140942203182894030000000006ab00ac6aab654add350400000000003d379505000000000553abacac00e1739d36", + "5363", + 0, + -1069721025, + "6da32416deb45a0d720a1dbe6d357886eabc44029dd5db74d50feaffbe763245" + ], + [ + "05c4fb94040f5119dc0b10aa9df054871ed23c98c890f1e931a98ffb0683dac45e98619fdc0200000007acab6a525263513e7495651c9794c4d60da835d303eb4ee6e871f8292f6ad0b32e85ef08c9dc7aa4e03c9c010000000500ab52acacfffffffffee953259cf14ced323fe8d567e4c57ba331021a1ef5ac2fa90f7789340d7c550100000007ac6aacac6a6a53ffffffff08d9dc820d00f18998af247319f9de5c0bbd52a475ea587f16101af3afab7c210100000003535363569bca7c0468e34f00000000000863536353ac51ac6584e319010000000006650052ab6a533debea030000000003ac0053ee7070020000000006ac52005253ac00000000", + "6351005253", + 2, + 1386916157, + "76c4013c40bfa1481badd9d342b6d4b8118de5ab497995fafbf73144469e5ff0" + ], + [ + "c95ab19104b63986d7303f4363ca8f5d2fa87c21e3c5d462b99f1ebcb7c402fc012f5034780000000009006aac63ac65655265ffffffffbe91afa68af40a8700fd579c86d4b706c24e47f7379dad6133de389f815ef7f501000000046aac00abffffffff1520db0d81be4c631878494668d258369f30b8f2b7a71e257764e9a27f24b48701000000076a515100535300b0a989e1164db9499845bac01d07a3a7d6d2c2a76e4c04abe68f808b6e2ef5068ce6540e0100000009ac53636a63ab65656affffffff0309aac6050000000005ab6563656a6067e8020000000003ac536aec91c8030000000009655251ab65ac6a53acc7a45bc5", + "63526a65abac", + 1, + 512079270, + "fb7eca81d816354b6aedec8cafc721d5b107336657acafd0d246049556f9e04b" + ], + [ + "ca66ae10049533c2b39f1449791bd6d3f039efe0a121ab7339d39ef05d6dcb200ec3fb2b3b020000000465006a53ffffffff534b8f97f15cc7fb4f4cea9bf798472dc93135cd5b809e4ca7fe4617a61895980100000000ddd83c1dc96f640929dd5e6f1151dab1aa669128591f153310d3993e562cc7725b6ae3d903000000046a52536582f8ccddb8086d8550f09128029e1782c3f2624419abdeaf74ecb24889cc45ac1a64492a0100000002516a4867b41502ee6ccf03000000000752acacab52ab6a4b7ba80000000000075151ab0052536300000000", + "6553", + 2, + -62969257, + "8085e904164ab9a8c20f58f0d387f6adb3df85532e11662c03b53c3df8c943cb" + ], + [ + "ba646d0b0453999f0c70cb0430d4cab0e2120457bb9128ed002b6e9500e9c7f8d7baa20abe0200000001652a4e42935b21db02b56bf6f08ef4be5adb13c38bc6a0c3187ed7f6197607ba6a2c47bc8a03000000040052516affffffffa55c3cbfc19b1667594ac8681ba5d159514b623d08ed4697f56ce8fcd9ca5b0b00000000096a6a5263ac655263ab66728c2720fdeabdfdf8d9fb2bfe88b295d3b87590e26a1e456bad5991964165f888c03a0200000006630051ac00acffffffff0176fafe0100000000070063acac65515200000000", + "63", + 1, + 2002322280, + "9db4e320208185ee70edb4764ee195deca00ba46412d5527d9700c1cf1c3d057" + ], + [ + "2ddb8f84039f983b45f64a7a79b74ff939e3b598b38f436def7edd57282d0803c7ef34968d02000000026a537eb00c4187de96e6e397c05f11915270bcc383959877868ba93bac417d9f6ed9f627a7930300000004516551abffffffffacc12f1bb67be3ae9f1d43e55fda8b885340a0df1175392a8bbd9f959ad3605003000000025163ffffffff02ff0f4700000000000070bd99040000000003ac53abf8440b42", + "", + 2, + -393923011, + "0133f1a161363b71dfb3a90065c7128c56bd0028b558b610142df79e055ab5c7" + ], + [ + "b21fc15403b4bdaa994204444b59323a7b8714dd471bd7f975a4e4b7b48787e720cbd1f5f00000000000ffffffff311533001cb85c98c1d58de0a5fbf27684a69af850d52e22197b0dc941bc6ca9030000000765ab6363ab5351a8ae2c2c7141ece9a4ff75c43b7ea9d94ec79b7e28f63e015ac584d984a526a73fe1e04e0100000007526352536a5365ffffffff02a0a9ea030000000002ab52cfc4f300000000000465525253e8e0f342", + "000000", + 1, + 1305253970, + "d1df1f4bba2484cff8a816012bb6ec91c693e8ca69fe85255e0031711081c46a" + ], + [ + "d1704d6601acf710b19fa753e307cfcee2735eada0d982b5df768573df690f460281aad12d0000000007656300005100acffffffff0232205505000000000351ab632ca1bc0300000000016300000000", + "ac65ab65ab51", + 0, + 165179664, + "40b4f03c68288bdc996011b0f0ddb4b48dc3be6762db7388bdc826113266cd6c" + ], + [ + "d2f6c096025cc909952c2400bd83ac3d532bfa8a1f8f3e73c69b1fd7b8913379793f3ce92202000000076a00ab6a53516ade5332d81d58b22ed47b2a249ab3a2cb3a6ce9a6b5a6810e18e3e1283c1a1b3bd73e3ab00300000002acabffffffff01a9b2d40500000000056352abab00dc4b7f69", + "ab0065", + 0, + -78019184, + "2ef025e907f0fa454a2b48a4f3b81346ba2b252769b5c35d742d0c8985e0bf5e" + ], + [ + "3e6db1a1019444dba461247224ad5933c997256d15c5d37ade3d700506a0ba0a57824930d7010000000852ab6500ab00ac00ffffffff03389242020000000001aba8465a0200000000086a6a636a5100ab52394e6003000000000953ac51526351000053d21d9800", + "abababacab53ab65", + 0, + 1643661850, + "1f8a3aca573a609f4aea0c69522a82fcb4e15835449da24a05886ddc601f4f6a" + ], + [ + "f821a042036ad43634d29913b77c0fc87b4af593ac86e9a816a9d83fd18dfcfc84e1e1d57102000000076a63ac52006351ffffffffbcdaf490fc75086109e2f832c8985716b3a624a422cf9412fe6227c10585d21203000000095252abab5352ac526affffffff2efed01a4b73ad46c7f7bc7fa3bc480f8e32d741252f389eaca889a2e9d2007e000000000353ac53ffffffff032ac8b3020000000009636300000063516300d3d9f2040000000006510065ac656aafa5de0000000000066352ab5300ac9042b57d", + "525365", + 1, + 667065611, + "0d17a92c8d5041ba09b506ddf9fd48993be389d000aad54f9cc2a44fcc70426b" + ], + [ + "58e3f0f704a186ef55d3919061459910df5406a9121f375e7502f3be872a449c3f2bb058380100000000f0e858da3ac57b6c973f889ad879ffb2bd645e91b774006dfa366c74e2794aafc8bbc871010000000751ac65516a515131a68f120fd88ca08687ceb4800e1e3fbfea7533d34c84fef70cc5a96b648d580369526d000000000600ac00515363f6191d5b3e460fa541a30a6e83345dedfa3ed31ad8574d46d7bbecd3c9074e6ba5287c24020000000151e3e19d6604162602010000000004005100ac71e17101000000000065b5e90300000000040053ab53f6b7d101000000000200ac00000000", + "6563ab", + 1, + -669018604, + "8221d5dfb75fc301a80e919e158e0b1d1e86ffb08870a326c89408d9bc17346b" + ], + [ + "efec1cce044a676c1a3d973f810edb5a9706eb4cf888a240f2b5fb08636bd2db482327cf500000000005ab51656a52ffffffff46ef019d7c03d9456e5134eb0a7b5408d274bd8e33e83df44fab94101f7c5b650200000009ac5100006353630051407aadf6f5aaffbd318fdbbc9cae4bd883e67d524df06bb006ce2f7c7e2725744afb76960100000005536aab53acec0d64eae09e2fa1a7c4960354230d51146cf6dc45ee8a51f489e20508a785cbe6ca86fc000000000651536a516300ffffffff014ef598020000000006636aac655265a6ae1b75", + "53516a5363526563ab", + 2, + -1823982010, + "13e8b5ab4e5b2ceeff0045c625e19898bda2d39fd7af682e2d1521303cfe1154" + ], + [ + "3c436c2501442a5b700cbc0622ee5143b34b1b8021ea7bbc29e4154ab1f5bdfb3dff9d640501000000086aab5251ac5252acffffffff0170b9a20300000000066aab6351525114b13791", + "63acabab52ab51ac65", + 0, + -2140612788, + "87ddf1f9acb6640448e955bd1968f738b4b3e073983af7b83394ab7557f5cd61" + ], + [ + "d62f183e037e0d52dcf73f9b31f70554bce4f693d36d17552d0e217041e01f15ad3840c838000000000963acac6a6a6a63ab63ffffffffabdfb395b6b4e63e02a763830f536fc09a35ff8a0cf604021c3c751fe4c88f4d0300000006ab63ab65ac53aa4d30de95a2327bccf9039fb1ad976f84e0b4a0936d82e67eafebc108993f1e57d8ae39000000000165ffffffff04364ad30500000000036a005179fd84010000000007ab636aac6363519b9023030000000008510065006563ac6acd2a4a02000000000000000000", + "52", + 1, + 595020383, + "da8405db28726dc4e0f82b61b2bfd82b1baa436b4e59300305cc3b090b157504" + ], + [ + "44c200a5021238de8de7d80e7cce905606001524e21c8d8627e279335554ca886454d692e6000000000500acac52abbb8d1dc876abb1f514e96b21c6e83f429c66accd961860dc3aed5071e153e556e6cf076d02000000056553526a51870a928d0360a580040000000004516a535290e1e302000000000851ab6a00510065acdd7fc5040000000007515363ab65636abb1ec182", + "6363", + 0, + -785766894, + "ed53cc766cf7cb8071cec9752460763b504b2183442328c5a9761eb005c69501" + ], + [ + "d682d52d034e9b062544e5f8c60f860c18f029df8b47716cabb6c1b4a4b310a0705e754556020000000400656a0016eeb88eef6924fed207fba7ddd321ff3d84f09902ff958c815a2bf2bb692eb52032c4d803000000076365ac516a520099788831f8c8eb2552389839cfb81a9dc55ecd25367acad4e03cfbb06530f8cccf82802701000000085253655300656a53ffffffff02d543200500000000056a510052ac03978b05000000000700ac51525363acfdc4f784", + "", + 2, + -696035135, + "e1a256854099907050cfee7778f2018082e735a1f1a3d91437584850a74c87bb" + ], + [ + "e8c0dec5026575ddf31343c20aeeca8770afb33d4e562aa8ee52eeda6b88806fdfd4fe0a97030000000953acabab65ab516552ffffffffdde122c2c3e9708874286465f8105f43019e837746686f442666629088a970e0010000000153ffffffff01f98eee0100000000025251fe87379a", + "63", + 1, + 633826334, + "abe441209165d25bc6d8368f2e7e7dc21019056719fef1ace45542aa2ef282e2" + ], + [ + "b288c331011c17569293c1e6448e33a64205fc9dc6e35bc756a1ac8b97d18e912ea88dc0770200000007635300ac6aacabfc3c890903a3ccf8040000000004656500ac9c65c9040000000009ab6a6aabab65abac63ac5f7702000000000365005200000000", + "526a63", + 0, + 1574937329, + "0dd1bd5c25533bf5f268aa316ce40f97452cca2061f0b126a59094ca5b65f7a0" + ], + [ + "fc0a092003cb275fa9a25a72cf85d69c19e4590bfde36c2b91cd2c9c56385f51cc545530210000000004ab530063ffffffff729b006eb6d14d6e5e32b1c376acf1c62830a5d9246da38dbdb4db9f51fd1c74020000000463636500ffffffff0ae695c6d12ab7dcb8d3d4b547b03f178c7268765d1de9af8523d244e3836b12030000000151ffffffff0115c1e20100000000066a6aabac6a6a1ff59aec", + "ab0053ac", + 0, + 931831026, + "73fe22099c826c34a74edf45591f5d7b3a888c8178cd08facdfd96a9a681261c" + ], + [ + "0fcae7e004a71a4a7c8f66e9450c0c1785268679f5f1a2ee0fb3e72413d70a9049ecff75de020000000452005251ffffffff99c8363c4b95e7ec13b8c017d7bb6e80f7c04b1187d6072961e1c2479b1dc0320200000000ffffffff7cf03b3d66ab53ed740a70c5c392b84f780fff5472aee82971ac3bfeeb09b2df0200000006ab5265636a0058e4fe9257d7c7c7e82ff187757c6eadc14cceb6664dba2de03a018095fd3006682a5b9600000000056353536a636de26b2303ff76de010000000001acdc0a2e020000000001ab0a53ed020000000007530063ab51510088417307", + "ac6aacab5165535253", + 2, + -902160694, + "eea96a48ee572aea33d75d0587ce954fcfb425531a7da39df26ef9a6635201be" + ], + [ + "612701500414271138e30a46b7a5d95c70c78cc45bf8e40491dac23a6a1b65a51af04e6b94020000000451655153ffffffffeb72dc0e49b2fad3075c19e1e6e4b387f1365dca43d510f6a02136318ddecb7f0200000003536352e115ffc4f9bae25ef5baf534a890d18106fb07055c4d7ec9553ba89ed1ac2101724e507303000000080063006563acabac2ff07f69a080cf61a9d19f868239e6a4817c0eeb6a4f33fe254045d8af2bca289a8695de0300000000430736c404d317840500000000086a00abac5351ab65306e0503000000000963ab0051536aabab6a6c8aca01000000000565516351ab5dcf960100000000016a00000000", + "ab", + 2, + -604581431, + "5ec805e74ee934aa815ca5f763425785ae390282d46b5f6ea076b6ad6255a842" + ], + [ + "6b68ba00023bb4f446365ea04d68d48539aae66f5b04e31e6b38b594d2723ab82d44512460000000000200acffffffff5dfc6febb484fff69c9eeb7c7eb972e91b6d949295571b8235b1da8955f3137b020000000851ac6352516a535325828c8a03365da801000000000800636aabac6551ab0f594d03000000000963ac536365ac63636a45329e010000000005abac53526a00000000", + "005151", + 0, + 1317038910, + "42f5ba6f5fe1e00e652a08c46715871dc4b40d89d9799fd7c0ea758f86eab6a7" + ], + [ + "aff5850c0168a67296cc790c1b04a9ed9ad1ba0469263a9432fcb53676d1bb4e0eea8ea1410100000005ac65526a537d5fcb1d01d9c26d0200000000065265ab5153acc0617ca1", + "51ab650063", + 0, + 1712981774, + "8449d5247071325e5f8edcc93cb9666c0fecabb130ce0e5bef050575488477eb" + ], + [ + "e6d6b9d8042c27aec99af8c12b6c1f7a80453e2252c02515e1f391da185df0874e133696b50300000006ac5165650065ffffffff6a4b60a5bfe7af72b198eaa3cde2e02aa5fa36bdf5f24ebce79f6ecb51f3b554000000000652656aababac2ec4c5a6cebf86866b1fcc4c5bd5f4b19785a8eea2cdfe58851febf87feacf6f355324a80100000001537100145149ac1e287cef62f6f5343579189fad849dd33f25c25bfca841cb696f10c5a34503000000046a636a63df9d7c4c018d96e20100000000015100000000", + "53ab", + 1, + -1924777542, + "f98f95d0c5ec3ac3e699d81f6c440d2e7843eab15393eb023bc5a62835d6dcea" + ], + [ + "046ac25e030a344116489cc48025659a363da60bc36b3a8784df137a93b9afeab91a04c1ed020000000951ab0000526a65ac51ffffffff6c094a03869fde55b9a8c4942a9906683f0a96e2d3e5a03c73614ea3223b2c29020000000500ab636a6affffffff3da7aa5ecef9071600866267674b54af1740c5aeb88a290c459caa257a2683cb0000000004ab6565ab7e2a1b900301b916030000000005abac63656308f4ed03000000000852ab53ac63ac51ac73d620020000000003ab00008deb1285", + "6a", + 2, + 1299505108, + "f79e6b776e2592bad45ca328c54abf14050c241d8f822d982c36ea890fd45757" + ], + [ + "bd515acd0130b0ac47c2d87f8d65953ec7d657af8d96af584fc13323d0c182a2e5f9a96573000000000652ac51acac65ffffffff0467aade000000000003655363dc577d050000000006515252ab5300137f60030000000007535163530065004cdc860500000000036a5265241bf53e", + "acab", + 0, + 621090621, + "771d4d87f1591a13d77e51858c16d78f1956712fe09a46ff1abcabbc1e7af711" + ], + [ + "ff1ae37103397245ac0fa1c115b079fa20930757f5b6623db3579cb7663313c2dc4a3ffdb300000000076353656a000053ffffffff83c59e38e5ad91216ee1a312d15b4267bae2dd2e57d1a3fd5c2f0f809eeb5d46010000000800abab6a6a53ab51ffffffff9d5e706c032c1e0ca75915f8c6686f64ec995ebcd2539508b7dd8abc3e4d7d2a01000000006b2bdcda02a8fe070500000000045253000019e31d04000000000700ab63acab526a00000000", + "53656aab6a525251", + 0, + 881938872, + "726bb88cdf3af2f7603a31f33d2612562306d08972a4412a55dbbc0e3363721c" + ], + [ + "ff5400dd02fec5beb9a396e1cbedc82bedae09ed44bae60ba9bef2ff375a6858212478844b03000000025253ffffffff01e46c203577a79d1172db715e9cc6316b9cfc59b5e5e4d9199fef201c6f9f0f000000000900ab6552656a5165acffffffff02e8ce62040000000002515312ce3e00000000000251513f119316", + "", + 0, + 1541581667, + "1e0da47eedbbb381b0e0debbb76e128d042e02e65b11125e17fd127305fc65cd" + ], + [ + "28e3daa603c03626ad91ffd0ff927a126e28d29db5012588b829a06a652ea4a8a5732407030200000004ab6552acffffffff8e643146d3d0568fc2ad854fd7864d43f6f16b84e395db82b739f6f5c84d97b40000000004515165526b01c2dc1469db0198bd884e95d8f29056c48d7e74ff9fd37a9dec53e44b8769a6c99c030200000009ab006a516a53630065eea8738901002398000000000007ac5363516a51abeaef12f5", + "52ab52515253ab", + 2, + 1687390463, + "55591346aec652980885a558cc5fc2e3f8d21cbd09f314a798e5a7ead5113ea6" + ], + [ + "b54bf5ac043b62e97817abb892892269231b9b220ba08bc8dbc570937cd1ea7cdc13d9676c010000000451ab5365a10adb7b35189e1e8c00b86250f769319668189b7993d6bdac012800f1749150415b2deb0200000003655300ffffffff60b9f4fb9a7e17069fd00416d421f804e2ef2f2c67de4ca04e0241b9f9c1cc5d0200000003ab6aacfffffffff048168461cce1d40601b42fbc5c4f904ace0d35654b7cc1937ccf53fe78505a0100000008526563525265abacffffffff01dbf4e6040000000007acac656553636500000000", + "63", + 2, + 882302077, + "f5b38b0f06e246e47ce622e5ee27d5512c509f8ac0e39651b3389815eff2ab93" + ], + [ + "ebf628b30360bab3fa4f47ce9e0dcbe9ceaf6675350e638baff0c2c197b2419f8e4fb17e16000000000452516365ac4d909a79be207c6e5fb44fbe348acc42fc7fe7ef1d0baa0e4771a3c4a6efdd7e2c118b0100000003acacacffffffffa6166e9101f03975721a3067f1636cc390d72617be72e5c3c4f73057004ee0ee010000000863636a6a516a5252c1b1e82102d8d54500000000000153324c900400000000015308384913", + "0063516a51", + 1, + -1658428367, + "eb2d8dea38e9175d4d33df41f4087c6fea038a71572e3bad1ea166353bf22184" + ], + [ + "d6a8500303f1507b1221a91adb6462fb62d741b3052e5e7684ea7cd061a5fc0b0e93549fa50100000004acab65acfffffffffdec79bf7e139c428c7cfd4b35435ae94336367c7b5e1f8e9826fcb0ebaaaea30300000000ffffffffd115fdc00713d52c35ea92805414bd57d1e59d0e6d3b79a77ee18a3228278ada020000000453005151ffffffff040231510300000000085100ac6a6a000063c6041c0400000000080000536a6563acac138a0b04000000000263abd25fbe03000000000900656a00656aac510000000000", + "ac526aac6a00", + 1, + -2007972591, + "13d12a51598b34851e7066cd93ab8c5212d60c6ed2dae09d91672c10ccd7f87c" + ], + [ + "658cb1c1049564e728291a56fa79987a4ed3146775fce078bd2e875d1a5ca83baf6166a82302000000056a656351ab2170e7d0826cbdb45fda0457ca7689745fd70541e2137bb4f52e7b432dcfe2112807bd720300000007006a0052536351ffffffff8715ca2977696abf86d433d5c920ef26974f50e9f4a20c584fecbb68e530af5101000000009e49d864155bf1d3c757186d29f3388fd89c7f55cc4d9158b4cf74ca27a35a1dd93f945502000000096a535353ac656351510d29fa870230b809040000000006ab6a6a526a633b41da050000000004ab6a6a65ed63bf62", + "52acabac", + 2, + -1774073281, + "53ab197fa7e27b8a3f99ff48305e67081eb90e95d89d7e92d80cee25a03a6689" + ], + [ + "e92492cc01aec4e62df67ea3bc645e2e3f603645b3c5b353e4ae967b562d23d6e043badecd0100000003acab65ffffffff02c7e5ea040000000002ab52e1e584010000000005536365515195d16047", + "6551", + 0, + -424930556, + "93c34627f526d73f4bea044392d1a99776b4409f7d3d835f23b03c358f5a61c2" + ], + [ + "02e242db04be2d8ced9179957e98cee395d4767966f71448dd084426844cbc6d15f2182e85030000000200650c8ffce3db9de9c3f9cdb9104c7cb26647a7531ad1ebf7591c259a9c9985503be50f8de30000000007ac6a51636a6353ffffffffa2e33e7ff06fd6469987ddf8a626853dbf30c01719efb259ae768f051f803cd30300000000fffffffffd69d8aead941683ca0b1ee235d09eade960e0b1df3cd99f850afc0af1b73e070300000001ab60bb602a011659670100000000076363526300acac00000000", + "6353ab515251", + 3, + 1451100552, + "bbc9069b8615f3a52ac8a77359098dcc6c1ba88c8372d5d5fe080b99eb781e55" + ], + [ + "b28d5f5e015a7f24d5f9e7b04a83cd07277d452e898f78b50aae45393dfb87f94a26ef57720200000008ababac630053ac52ffffffff046475ed040000000008ab5100526363ac65c9834a04000000000251abae26b30100000000040000ac65ceefb900000000000000000000", + "ac6551ac6a536553", + 0, + -1756558188, + "5848d93491044d7f21884eef7a244fe7d38886f8ae60df49ce0dfb2a342cd51a" + ], + [ + "efb8b09801f647553b91922a5874f8e4bb2ed8ddb3536ed2d2ed0698fac5e0e3a298012391030000000952ac005263ac52006affffffff04cdfa0f050000000007ac53ab51abac65b68d1b02000000000553ab65ac00d057d50000000000016a9e1fda010000000007ac63ac536552ac00000000", + "6aac", + 0, + 1947322973, + "603a9b61cd30fcea43ef0a5c18b88ca372690b971b379ee9e01909c336280511" + ], + [ + "68a59fb901c21946797e7d07a4a3ea86978ce43df0479860d7116ac514ba955460bae78fff0000000001abffffffff03979be80100000000036553639300bc040000000008006552006a656565cfa78d0000000000076552acab63ab5100000000", + "ab65ab", + 0, + 995583673, + "3b320dd47f2702452a49a1288bdc74a19a4b849b132b6cad9a1d945d87dfbb23" + ], + [ + "67761f2a014a16f3940dcb14a22ba5dc057fcffdcd2cf6150b01d516be00ef55ef7eb07a830100000004636a6a51ffffffff01af67bd050000000008526553526300510000000000", + "6a00", + 0, + 1570943676, + "079fa62e9d9d7654da8b74b065da3154f3e63c315f25751b4d896733a1d67807" + ], + [ + "e20fe96302496eb436eee98cd5a32e1c49f2a379ceb71ada8a48c5382df7c8cd88bdc47ced03000000016556aa0e180660925a841b457aed0aae47fca2a92fa1d7afeda647abf67198a3902a7c80dd00000000085152ac636a535265bd18335e01803c810100000000046500ac52f371025e", + "6363ab", + 1, + -651254218, + "2921a0e5e3ba83c57ba57c25569380c17986bf34c366ec216d4188d5ba8b0b47" + ], + [ + "4e1bd9fa011fe7aa14eee8e78f27c9fde5127f99f53d86bc67bdab23ca8901054ee8a8b6eb0300000009ac535153006a6a0063ffffffff044233670500000000000a667205000000000652ab636a51abe5bf35030000000003535351d579e505000000000700630065ab51ac3419ac30", + "52abac52", + 0, + -1807563680, + "4aae6648f856994bed252d319932d78db55da50d32b9008216d5366b44bfdf8a" + ], + [ + "ec02fbee03120d02fde12574649660c441b40d330439183430c6feb404064d4f507e704f3c0100000000ffffffffe108d99c7a4e5f75cc35c05debb615d52fac6e3240a6964a29c1704d98017fb60200000002ab63fffffffff726ec890038977adfc9dadbeaf5e486d5fcb65dc23acff0dd90b61b8e2773410000000002ac65e9dace55010f881b010000000005ac00ab650000000000", + "51ac525152ac6552", + 2, + -1564046020, + "3f988922d8cd11c7adff1a83ce9499019e5ab5f424752d8d361cf1762e04269b" + ], + [ + "23dbdcc1039c99bf11938d8e3ccec53b60c6c1d10c8eb6c31197d62c6c4e2af17f52115c3a0300000008636352000063ababffffffff17823880e1df93e63ad98c29bfac12e36efd60254346cac9d3f8ada020afc0620300000003ab63631c26f002ac66e86cd22a25e3ed3cb39d982f47c5118f03253054842daadc88a6c41a2e1500000000096a00ab636a53635163195314de015570fd0100000000096a5263acab5200005300000000", + "ababac6a6553", + 1, + 11586329, + "bd36a50e0e0a4ecbf2709e68daef41eddc1c0c9769efaee57910e99c0a1d1343" + ], + [ + "33b03bf00222c7ca35c2f8870bbdef2a543b70677e413ce50494ac9b22ea673287b6aa55c50000000005ab00006a52ee4d97b527eb0b427e4514ea4a76c81e68c34900a23838d3e57d0edb5410e62eeb8c92b6000000000553ac6aacac42e59e170326245c000000000009656553536aab516aabb1a10603000000000852ab52ab6a516500cc89c802000000000763ac6a63ac516300000000", + "", + 0, + 557416556, + "41bead1b073e1e9fee065dd612a617ca0689e8f9d3fed9d0acfa97398ebb404c" + ], + [ + "813eda1103ac8159850b4524ef65e4644e0fc30efe57a5db0c0365a30446d518d9b9aa8fdd0000000003656565c2f1e89448b374b8f12055557927d5b33339c52228f7108228149920e0b77ef0bcd69da60000000006abac00ab63ab82cdb7978d28630c5e1dc630f332c4245581f787936f0b1e84d38d33892141974c75b4750300000004ac53ab65ffffffff0137edfb02000000000000000000", + "0063", + 1, + -1948560575, + "71dfcd2eb7f2e6473aed47b16a6d5fcbd0af22813d892e9765023151e07771ec" + ], + [ + "9e45d9aa0248c16dbd7f435e8c54ae1ad086de50c7b25795a704f3d8e45e1886386c653fbf01000000025352fb4a1acefdd27747b60d1fb79b96d14fb88770c75e0da941b7803a513e6d4c908c6445c7010000000163ffffffff014069a8010000000001520a794fb3", + "51ac005363", + 1, + -719113284, + "0d31a221c69bd322ef7193dd7359ddfefec9e0a1521d4a8740326d46e44a5d6a" + ], + [ + "36e42018044652286b19a90e5dd4f8d9f361d0760d080c5c5add1970296ff0f1de630233c8010000000200ac39260c7606017d2246ee14ddb7611586178067e6a4be38e788e33f39a3a95a55a13a6775010000000352ac638bea784f7c2354ed02ea0b93f0240cdfb91796fa77649beee6f7027caa70778b091deee700000000066a65ac656363ffffffff4d9d77ab676d711267ef65363f2d192e1bd55d3cd37f2280a34c72e8b4c559d700000000056a006aab00001764e1020d30220100000000085252516aacab0053472097040000000009635353ab6a636a5100a56407a1", + "006a536551ab53ab", + 0, + 827296034, + "daec2af5622bbe220c762da77bab14dc75e7d28aa1ade9b7f100798f7f0fd97a" + ], + [ + "5e06159a02762b5f3a5edcdfc91fd88c3bff08b202e69eb5ba74743e9f4291c4059ab008200000000001ac348f5446bb069ef977f89dbe925795d59fb5d98562679bafd61f5f5f3150c3559582992d0000000008ab5165515353abac762fc67703847ec6010000000000e200cf040000000002abaca64b86010000000008520000515363acabb82b491b", + "ab53525352ab6a", + 0, + -61819505, + "75a7db0df41485a28bf6a77a37ca15fa8eccc95b5d6014a731fd8adb9ada0f12" + ], + [ + "a1948872013b543d6d902ccdeead231c585195214ccf5d39f136023855958436a43266911501000000086aac006a6a6a51514951c9b2038a538a04000000000452526563c0f345050000000007526a5252ac526af9be8e03000000000752acac51ab006306198db2", + "ab6353", + 0, + -326384076, + "ced7ef84aad4097e1eb96310e0d1c8e512cfcb392a01d9010713459b23bc0cf4" + ], + [ + "c3efabba03cb656f154d1e159aa4a1a4bf9423a50454ebcef07bc3c42a35fb8ad84014864d0000000000d1cc73d260980775650caa272e9103dc6408bdacaddada6b9c67c88ceba6abaa9caa2f7d020000000553536a5265ffffffff9f946e8176d9b11ff854b76efcca0a4c236d29b69fb645ba29d406480427438e01000000066a0065005300ffffffff040419c0010000000003ab6a63cdb5b6010000000009006300ab5352656a63f9fe5e050000000004acac5352611b980100000000086a00acac00006a512d7f0c40", + "0053", + 0, + -59089911, + "c503001c16fbff82a99a18d88fe18720af63656fccd8511bca1c3d0d69bd7fc0" + ], + [ + "efb55c2e04b21a0c25e0e29f6586be9ef09f2008389e5257ebf2f5251051cdc6a79fce2dac020000000351006affffffffaba73e5b6e6c62048ba5676d18c33ccbcb59866470bb7911ccafb2238cfd493802000000026563ffffffffe62d7cb8658a6eca8a8babeb0f1f4fa535b62f5fc0ec70eb0111174e72bbec5e0300000009abababac516365526affffffffbf568789e681032d3e3be761642f25e46c20322fa80346c1146cb47ac999cf1b0300000000b3dbd55902528828010000000001ab0aac7b0100000000015300000000", + "acac52", + 3, + 1638140535, + "e84444d91580da41c8a7dcf6d32229bb106f1be0c811b2292967ead5a96ce9d4" + ], + [ + "91d3b21903629209b877b3e1aef09cd59aca6a5a0db9b83e6b3472aceec3bc2109e64ab85a0200000003530065ffffffffca5f92de2f1b7d8478b8261eaf32e5656b9eabbc58dcb2345912e9079a33c4cd010000000700ab65ab00536ad530611da41bbd51a389788c46678a265fe85737b8d317a83a8ff7a839debd18892ae5c80300000007ab6aac65ab51008b86c501038b8a9a05000000000263525b3f7a040000000007ab535353ab00abd4e3ff04000000000665ac51ab65630b7b656f", + "6551525151516a00", + 2, + 499657927, + "ef4bd7622eb7b2bbbbdc48663c1bc90e01d5bde90ff4cb946596f781eb420a0c" + ], + [ + "5d5c41ad0317aa7e40a513f5141ad5fc6e17d3916eebee4ddb400ddab596175b41a111ead20100000005536a5265acffffffff900ecb5e355c5c9f278c2c6ea15ac1558b041738e4bffe5ae06a9346d66d5b2b00000000080000ab636a65ab6affffffff99f4e08305fa5bd8e38fb9ca18b73f7a33c61ff7b3c68e696b30a04fea87f3ca000000000163d3d1760d019fc13a00000000000000000000", + "ab53acabab6aac6a52", + 2, + 1007461922, + "4012f5ff2f1238a0eb84854074670b4703238ebc15bfcdcd47ffa8498105fcd9" + ], + [ + "ceecfa6c02b7e3345445b82226b15b7a097563fa7d15f3b0c979232b138124b62c0be007890200000009abac51536a63525253ffffffffbae481ccb4f15d94db5ec0d8854c24c1cc8642bd0c6300ede98a91ca13a4539a0200000001ac50b0813d023110f5020000000006acabac526563e2b0d0040000000009656aac0063516a536300000000", + "0063526500", + 0, + -1862053821, + "e1600e6df8a6160a79ac32aa40bb4644daa88b5f76c0d7d13bf003327223f70c" + ], + [ + "ae62d5fd0380c4083a26642159f51af24bf55dc69008e6b7769442b6a69a603edd980a33000000000005ab5100ab53ffffffff49d048324d899d4b8ed5e739d604f5806a1104fede4cb9f92cc825a7fa7b4bfe0200000005536a000053ffffffff42e5cea5673c650881d0b4005fa4550fd86de5f21509c4564a379a0b7252ac0e0000000007530000526a53525f26a68a03bfacc3010000000000e2496f000000000009ab5253acac52636563b11cc600000000000700510065526a6a00000000", + "abab", + 1, + -1600104856, + "05cf0ec9c61f1a15f651a0b3c5c221aa543553ce6c804593f43bb5c50bb91ffb" + ], + [ + "f06f64af04fdcb830464b5efdb3d5ee25869b0744005375481d7b9d7136a0eb8828ad1f0240200000003516563fffffffffd3ba192dabe9c4eb634a1e3079fca4f072ee5ceb4b57deb6ade5527053a92c5000000000165ffffffff39f43401a36ba13a5c6dd7f1190e793933ae32ee3bf3e7bfb967be51e681af760300000009650000536552636a528e34f50b21183952cad945a83d4d56294b55258183e1627d6e8fb3beb8457ec36cadb0630000000005abab530052334a7128014bbfd10100000000085352ab006a63656afc424a7c", + "53650051635253ac00", + 2, + 313255000, + "d309da5afd91b7afa257cfd62df3ca9df036b6a9f4b38f5697d1daa1f587312b" + ], + [ + "6dfd2f98046b08e7e2ef5fff153e00545faf7076699012993c7a30cb1a50ec528281a9022f030000000152ffffffff1f535e4851920b968e6c437d84d6ecf586984ebddb7d5db6ae035bd02ba222a8010000000651006a53ab51605072acb3e17939fa0737bc3ee43bc393b4acd58451fc4ffeeedc06df9fc649828822d5010000000253525a4955221715f27788d302382112cf60719be9ae159c51f394519bd5f7e70a4f9816c7020200000009526a6a51636aab656a36d3a5ff0445548e0100000000086a6a00516a52655167030b050000000004ac6a63525cfda8030000000000e158200000000000010000000000", + "535263ac6a65515153", + 3, + 585774166, + "72b7da10704c3ca7d1deb60c31b718ee12c70dc9dfb9ae3461edce50789fe2ba" + ], + [ + "187eafed01389a45e75e9dda526d3acbbd41e6414936b3356473d1f9793d161603efdb45670100000002ab00ffffffff04371c8202000000000563630063523b3bde02000000000753516563006300e9e765010000000005516aac656a373f9805000000000665525352acab08d46763", + "ab", + 0, + 122457992, + "393aa6c758e0eed15fa4af6d9e2d7c63f49057246dbb92b4268ec24fc87301ca" + ], + [ + "7d50b977035d50411d814d296da9f7965ddc56f3250961ca5ba805cadd0454e7c521e31b0300000000003d0416c2cf115a397bacf615339f0e54f6c35ffec95aa009284d38390bdde1595cc7aa7c0100000005ab52ac5365ffffffff4232c6e796544d5ac848c9dc8d25cfa74e32e847a5fc74c74d8f38ca51188562030000000653ac51006a51ffffffff016bd8bb00000000000465ab5253163526f3", + "51ab526a00005353", + 1, + -1311316785, + "60b7544319b42e4159976c35c32c2644f0adf42eff13be1dc2f726fc0b6bb492" + ], + [ + "2a45cd1001bf642a2315d4a427eddcc1e2b0209b1c6abd2db81a800c5f1af32812de42032702000000050051525200ffffffff032177db050000000005530051abac49186f000000000004ab6aab00645c0000000000000765655263acabac00000000", + "6a65", + 0, + -1774715722, + "6a9ac3f7da4c7735fbc91f728b52ecbd602233208f96ac5592656074a5db118a" + ], + [ + "479358c202427f3c8d19e2ea3def6d6d3ef2281b4a93cd76214f0c7d8f040aa042fe19f71f0300000001abffffffffa2709be556cf6ecaa5ef530df9e4d056d0ed57ce96de55a5b1f369fa40d4e74a020000000700006a51635365c426be3f02af578505000000000363ab63fd8f590500000000065153abac53632dfb14b3", + "520063ab51", + 1, + -763226778, + "cfe147982afacde044ce66008cbc5b1e9f0fd9b8ed52b59fc7c0fecf95a39b0e" + ], + [ + "76179a8e03bec40747ad65ab0f8a21bc0d125b5c3c17ad5565556d5cb03ade7c83b4f32d98030000000151ffffffff99b900504e0c02b97a65e24f3ad8435dfa54e3c368f4e654803b756d011d24150200000003ac5353617a04ac61bb6cf697cfa4726657ba35ed0031432da8c0ffb252a190278830f9bd54f0320100000006656551005153c8e8fc8803677c77020000000007ac6553535253ac70f442030000000001535be0f20200000000026300bf46cb3a", + "6aab52", + 1, + -58495673, + "35e94b3776a6729d20aa2f3ddeeb06d3aad1c14cc4cde52fd21a4efc212ea16c" + ], + [ + "75ae53c2042f7546223ce5d5f9e00a968ddc68d52e8932ef2013fa40ce4e8c6ed0b6195cde01000000056563ac630079da0452c20697382e3dba6f4fc300da5f52e95a9dca379bb792907db872ba751b8024ee0300000009655151536500005163ffffffffe091b6d43f51ff00eff0ccfbc99b72d3aff208e0f44b44dfa5e1c7322cfc0c5f01000000075200005363ab63ffffffff7e96c3b83443260ac5cfd18258574fbc4225c630d3950df812bf51dceaeb0f9103000000065365655165639a6bf70b01b3e14305000000000563530063ac00000000", + "6300ab00ac", + 2, + 982422189, + "ee4ea49d2aae0dbba05f0b9785172da54408eb1ec67d36759ff7ed25bfc28766" + ], + [ + "1cdfa01e01e1b8078e9c2b0ca5082249bd18fdb8b629ead659adedf9a0dd5a04031871ba120200000008525351536565ab6affffffff011e28430200000000076a5363636aac52b2febd4a", + "abacac63656300", + 0, + 387396350, + "299dcaac2bdaa627eba0dfd74767ee6c6f27c9200b49da8ff6270b1041669e7e" + ], + [ + "cc28c1810113dfa6f0fcd9c7d9c9a30fb6f1d774356abeb527a8651f24f4e6b25cf763c4e00300000003ab636affffffff02dfc6050000000000080053636351ab0052afd56903000000000453ab5265f6c90d99", + "006551abacacac", + 0, + 1299280838, + "a4c0773204ab418a939e23f493bd4b3e817375d133d307609e9782f2cc38dbcf" + ], + [ + "ca816e7802cd43d66b9374cd9bf99a8da09402d69c688d8dcc5283ace8f147e1672b757e020200000005516aabab5240fb06c95c922342279fcd88ba6cd915933e320d7becac03192e0941e0345b79223e89570300000004005151ac353ecb5d0264dfbd010000000005ac6aacababd5d70001000000000752ac53ac6a5151ec257f71", + "63ac", + 1, + 774695685, + "cc180c4f797c16a639962e7aec58ec4b209853d842010e4d090895b22e7a7863" + ], + [ + "b42b955303942fedd7dc77bbd9040aa0de858afa100f399d63c7f167b7986d6c2377f66a7403000000066aac00525100ffffffff0577d04b64880425a3174055f94191031ad6b4ca6f34f6da9be7c3411d8b51fc000000000300526a6391e1cf0f22e45ef1c44298523b516b3e1249df153590f592fcb5c5fc432dc66f3b57cb03000000046a6aac65ffffffff0393a6c9000000000004516a65aca674ac0400000000046a525352c82c370000000000030053538e577f89", + "", + 1, + -1237094944, + "566953eb806d40a9fb684d46c1bf8c69dea86273424d562bd407b9461c8509af" + ], + [ + "92c9fe210201e781b72554a0ed5e22507fb02434ddbaa69aff6e74ea8bad656071f1923f3f02000000056a63ac6a514470cef985ba83dcb8eee2044807bedbf0d983ae21286421506ae276142359c8c6a34d68020000000863ac63525265006aa796dd0102ca3f9d05000000000800abab52ab535353cd5c83010000000007ac00525252005322ac75ee", + "5165", + 0, + 97879971, + "6e6307cef4f3a9b386f751a6f40acebab12a0e7e17171d2989293cbec7fd45c2" + ], + [ + "ccca1d5b01e40fe2c6b3ee24c660252134601dab785b8f55bd6201ffaf2fddc7b3e2192325030000000365535100496d4703b4b66603000000000665535253ac633013240000000000015212d2a502000000000951abac636353636a5337b82426", + "0052", + 0, + -1691630172, + "577bf2b3520b40aef44899a20d37833f1cded6b167e4d648fc5abe203e43b649" + ], + [ + "bc1a7a3c01691e2d0c4266136f12e391422f93655c71831d90935fbda7e840e50770c61da20000000008635253abac516353ffffffff031f32aa020000000003636563786dbc0200000000003e950f00000000000563516a655184b8a1de", + "51536a", + 0, + -1627072905, + "730bc25699b46703d7718fd5f5c34c4b5f00f594a9968ddc247fa7d5175124ed" + ], + [ + "076d209e02d904a6c40713c7225d23e7c25d4133c3c3477828f98c7d6dbd68744023dbb66b030000000753ab00536565acffffffff10975f1b8db8861ca94c8cc7c7cff086ddcd83e10b5fffd4fc8f2bdb03f9463c0100000000ffffffff029dff76010000000006526365530051a3be6004000000000000000000", + "515253ac65acacac", + 1, + -1207502445, + "66c488603b2bc53f0d22994a1f0f66fb2958203102eba30fe1d37b27a55de7a5" + ], + [ + "690fd1f80476db1f9eebe91317f2f130a60cbc1f4feadd9d6474d438e9cb7f91e4994600af0300000004ab536a63a15ce9fa6622d0c4171d895b42bff884dc6e8a7452f827fdc68a29c3c88e6fdee364eaf50000000002ab52ffffffff022dc39d3c0956b24d7f410b1e387859e7a72955f45d6ffb1e884d77888d18fe0300000005ac6a63656afffffffff10b06bce1800f5c49153d24748fdefb0bf514c12863247d1042d56018c3e25c03000000086a63ac6365536a52ffffffff031f162f0500000000060000655265abffbcd40500000000045151ac001a9c8c05000000000652ac53656a6300000000", + "ac51ab63acac", + 0, + -67986012, + "051c0df7ac688c2c930808dabde1f50300aea115f2bb3334f4753d5169b51e46" + ], + [ + "49ac2af00216c0307a29e83aa5de19770e6b20845de329290bd69cf0e0db7aed61ae41b39002000000035163ac8b2558ef84635bfc59635150e90b61fc753d34acfd10d97531043053e229cd720133cd95000000000463516a51ffffffff02458471040000000008abab636a51ac0065545aa80000000000096a6553516a5263ac6a00000000", + "51526300ab5363", + 1, + 1449668540, + "ddfd902bba312a06197810da96a0ddccb595f96670b28ded7dba88d8cd0469b8" + ], + [ + "fa4d868b024b010bd5dce46576c2fb489aa60bb797dac3c72a4836f49812c5c564c258414f03000000007a9b3a585e05027bdd89edbadf3c85ac61f8c3a04c773fa746517ae600ff1a9d6b6c02fb0200000004515163abffffffff01b17d020500000000046a65520000000000", + "536565ab65635363", + 0, + -1718953372, + "96c2b32f0a00a5925db7ba72d0b5d39922f30ea0f7443b22bc1b734808513c47" + ], + [ + "cac6382d0462375e83b67c7a86c922b569a7473bfced67f17afd96c3cd2d896cf113febf9e0300000003006a53ffffffffaa4913b7eae6821487dd3ca43a514e94dcbbf350f8cc4cafff9c1a88720711b800000000096a6a525300acac6353ffffffff184fc4109c34ea27014cc2c1536ef7ed1821951797a7141ddacdd6e429fae6ff01000000055251655200ffffffff9e7b79b4e6836e290d7b489ead931cba65d1030ccc06f20bd4ca46a40195b33c030000000008f6bc8304a09a2704000000000563655353511dbc73050000000000cf34c500000000000091f76e0000000000085200ab00005100abd07208cb", + "0063656a", + 2, + -1488731031, + "bf078519fa87b79f40abc38f1831731422722c59f88d86775535f209cb41b9b1" + ], + [ + "1711146502c1a0b82eaa7893976fefe0fb758c3f0e560447cef6e1bde11e42de91a125f71c030000000015bd8c04703b4030496c7461482481f290c623be3e76ad23d57a955807c9e851aaaa20270300000000d04abaf20326dcb7030000000001632225350400000000075263ac00520063dddad9020000000000af23d148", + "52520053510063", + 0, + 1852122830, + "e33d5ee08c0f3c130a44d7ce29606450271b676f4a80c52ab9ffab00cecf67f8" + ], + [ + "8d5b124d0231fbfc640c706ddb1d57bb49a18ba8ca0e1101e32c7e6e65a0d4c7971d93ea360100000008acabac0000abac65ffffffff8fe0fd7696597b845c079c3e7b87d4a44110c445a330d70342a5501955e17dd70100000004ab525363ef22e8a90346629f030000000009516a00ac63acac51657bd57b05000000000200acfd4288050000000009acab5352ab00ab636300000000", + "53ac526553ab65", + 0, + 1253152975, + "8b57a7c3170c6c02dd14ae1d392ce3d828197b20e9145c89c1cfd5de050e1562" + ], + [ + "38146dc502c7430e92b6708e9e107b61cd38e5e773d9395e5c8ad8986e7e4c03ee1c1e1e760100000000c8962ce2ac1bb3b1285c0b9ba07f4d2e5ce87c738c42ac0548cd8cec1100e6928cd6b0b6010000000763ab636aab52527cccefbd04e5f6f8020000000006006aabacac65ab2c4a00000000000351635209a6f40100000000026aacce57dc040000000008ab5353ab516a516a00000000", + "ab", + 0, + -1205978252, + "3cb5b030e7da0b60ccce5b4a7f3793e6ca56f03e3799fe2d6c3cc22d6d841dcb" + ], + [ + "22d81c740469695a6a83a9a4824f77ecff8804d020df23713990afce2b72591ed7de98500502000000065352526a6a6affffffff90dc85e118379b1005d7bbc7d2b8b0bab104dad7eaa49ff5bead892f17d8c3ba010000000665656300ab51ffffffff965193879e1d5628b52005d8560a35a2ba57a7f19201a4045b7cbab85133311d0200000003ac005348af21a13f9b4e0ad90ed20bf84e4740c8a9d7129632590349afc03799414b76fd6e826200000000025353ffffffff04a0d40d04000000000060702700000000000652655151516ad31f1502000000000365ac0069a1ac0500000000095100655300ab53525100000000", + "51636a52ac", + 0, + -1644680765, + "add7f5da27262f13da6a1e2cc2feafdc809bd66a67fb8ae2a6f5e6be95373b6f" + ], + [ + "a27dcbc801e3475174a183586082e0914c314bc9d79d1570f29b54591e5e0dff07fbb45a7f0000000004ac53ab51ffffffff027347f5020000000005535351ab63d0e5c9030000000009ac65ab6a63515200ab7cd632ed", + "ac63636553", + 0, + -686435306, + "883a6ea3b2cc53fe8a803c229106366ca14d25ffbab9fef8367340f65b201da6" + ], + [ + "b123ed2204410d4e8aaaa8cdb95234ca86dad9ff77fb4ae0fd4c06ebed36794f0215ede0040100000002ac63ffffffff3b58b81b19b90d8f402701389b238c3a84ff9ba9aeea298bbf15b41a6766d27a01000000056a6553ab00151824d401786153b819831fb15926ff1944ea7b03d884935a8bde01ed069d5fd80220310200000000ffffffffa9c9d246f1eb8b7b382a9032b55567e9a93f86c77f4e32c092aa1738f7f756c30100000002ab65ffffffff011a2b48000000000000ed44d1fb", + "630051ab63", + 2, + -1118263883, + "b5dab912bcabedff5f63f6dd395fc2cf030d83eb4dd28214baba68a45b4bfff0" + ], + [ + "1339051503e196f730955c5a39acd6ed28dec89b4dadc3f7c79b203b344511270e5747fa9900000000045151636affffffff378c6090e08a3895cedf1d25453bbe955a274657172491fd2887ed5c9aceca7b0100000000ffffffffcf7cc3c36ddf9d4749edfa9cefed496d2f86e870deb814bfcd3b5637a5496461030000000451006300ffffffff04dcf3fa010000000008526a63005263acabb41d84040000000004abac5153800eff020000000005656a535365106c5e00000000000000000000", + "abac5300", + 2, + 2013719928, + "7fc74de39ce6ca46ca25d760d3cec7bb21fd14f7efe1c443b5aa294f2cb5f546" + ], + [ + "0728c606014c1fd6005ccf878196ba71a54e86cc8c53d6db500c3cc0ac369a26fac6fcbc210000000005ab53ac5365ba9668290182d7870100000000066a000053655100000000", + "65", + 0, + 1789961588, + "ab6baa6da3b2bc853868d166f8996ad31d63ef981179f9104f49968fd61c8427" + ], + [ + "a1134397034bf4067b6c81c581e2b73fb63835a08819ba24e4e92df73074bf773c94577df7000000000465525251ffffffff8b6608feaa3c1f35f49c6330a769716fa01c5c6f6e0cdc2eb10dfc99bbc21e77010000000952656aac005352655180a0bda4bc72002c2ea8262e26e03391536ec36867258cab968a6fd6ec7523b64fa1d8c001000000056a53ac6353ffffffff04dbeeed05000000000553650052abcd5d0e01000000000463abab51104b2e0500000000066aac53ac5165283ca7010000000004535252ab00000000", + "ab515151516552ab", + 1, + -324598676, + "91178482112f94d1c8e929de443e4b9c893e18682998d393ca9ca77950412586" + ], + [ + "bcdafbae04aa18eb75855aeb1f5124f30044741351b33794254a80070940cb10552fa4fa8e0300000001acd0423fe6e3f3f88ae606f2e8cfab7a5ef87caa2a8f0401765ff9a47d718afcfb40c0099b0000000008ac6565ab53ac6aac645308009d680202d600e492b31ee0ab77c7c5883ebad5065f1ce87e4dfe6453e54023a0010000000151ffffffffb9d818b14245899e1d440152827c95268a676f14c3389fc47f5a11a7b38b1bde03000000026300ffffffff03cda22102000000000751ac535263005100a4d20400000000045200536ac8bef405000000000700ab51ab6563ac00000000", + "6553516a526aab", + 1, + -2111409753, + "5e1849e7368cf4f042718586d9bd831d61479b775bab97aba9f450042bd9876a" + ], + [ + "ed3bb93802ddbd08cb030ef60a2247f715a0226de390c9c1a81d52e83f8674879065b5f87d0300000003ab6552ffffffff04d2c5e60a21fb6da8de20bf206db43b720e2a24ce26779bca25584c3f765d1e0200000008ab656a6aacab00ab6e946ded025a811d04000000000951abac6352ac00ab5143cfa3030000000005635200636a00000000", + "5352ac650065535300", + 1, + -668727133, + "e9995065e1fddef72a796eef5274de62012249660dc9d233a4f24e02a2979c87" + ], + [ + "59f4629d030fa5d115c33e8d55a79ea3cba8c209821f979ed0e285299a9c72a73c5bba00150200000002636affffffffd8aca2176df3f7a96d0dc4ee3d24e6cecde1582323eec2ebef9a11f8162f17ac0000000007ab6565acab6553ffffffffeebc10af4f99c7a21cbc1d1074bd9f0ee032482a71800f44f26ee67491208e0403000000065352ac656351ffffffff0434e955040000000004ab515152caf2b305000000000365ac007b1473030000000003ab530033da970500000000060051536a5253bb08ab51", + "", + 2, + 396340944, + "0e9c47973ef2c292b2252c623f465bbb92046fe0b893eebf4e1c9e02cb01c397" + ], + [ + "286e3eb7043902bae5173ac3b39b44c5950bc363f474386a50b98c7bdab26f98dc83449c4a020000000752ac6a00510051ffffffff4339cd6a07f5a5a2cb5815e5845da70300f5c7833788363bf7fe67595d3225520100000000fffffffff9c2dd8b06ad910365ffdee1a966f124378a2b8021065c8764f6138bb1e951380200000005ab5153ac6affffffff0370202aba7a68df85436ea7c945139513384ef391fa33d16020420b8ad40e9a000000000900ab5165526353abacffffffff020c1907000000000004abac526a1b490b040000000000df1528f7", + "5353ab", + 3, + -1407529517, + "32154c09174a9906183abf26538c39e78468344ca0848bbd0785e24a3565d932" + ], + [ + "2e245cf80179e2e95cd1b34995c2aff49fe4519cd7cee93ad7587f7f7e8105fc2dff206cd30200000009006a63516a6553ab52350435a201d5ed2d02000000000352ab6558552c89", + "00ab53", + 0, + -233917810, + "4605ae5fd3d50f9c45d37db7118a81a9ef6eb475d2333f59df5d3e216f150d49" + ], + [ + "33a98004029d262f951881b20a8d746c8c707ea802cd2c8b02a33b7e907c58699f97e42be80100000007ac53536552abacdee04cc01d205fd8a3687fdf265b064d42ab38046d76c736aad8865ca210824b7c622ecf02000000070065006a536a6affffffff01431c5d010000000000270d48ee", + "", + 1, + 921554116, + "ff9d7394002f3f196ea25472ea6c46f753bd879a7244795157bb7235c9322902" + ], + [ + "aac18f2b02b144ed481557c53f2146ae523f24fcde40f3445ab0193b6b276c315dc2894d2300000000075165650000636a233526947dbffc76aec7db1e1baa6868ad4799c76e14794dcbaaec9e713a83967f6a65170200000005abac6551ab27d518be01b652a30000000000015300000000", + "52ac5353", + 1, + 1559377136, + "59fc2959bb7bb24576cc8a237961ed95bbb900679d94da6567734c4390cb6ef5" + ], + [ + "5ab79881033555b65fe58c928883f70ce7057426fbdd5c67d7260da0fe8b1b9e6a2674cb850300000009ac516aac6aac006a6affffffffa5be9223b43c2b1a4d120b5c5b6ec0484f637952a3252181d0f8e813e76e11580200000000e4b5ceb8118cb77215bbeedc9a076a4d087bb9cd1473ea32368b71daeeeacc451ec209010000000005acac5153aced7dc34e02bc5d11030000000005ac5363006a54185803000000000552ab00636a00000000", + "5100", + 1, + 1927062711, + "e9f53d531c12cce1c50abed4ac521a372b4449b6a12f9327c80020df6bff66c0" + ], + [ + "6c2c8fac0124b0b7d4b610c3c5b91dee32b7c927ac71abdf2d008990ca1ac40de0dfd530660300000006ababac5253656bd7eada01d847ec000000000004ac52006af4232ec8", + "6a6a6a0051", + 0, + -340809707, + "fb51eb9d7e47d32ff2086205214f90c7c139e08c257a64829ae4d2b301071c6a" + ], + [ + "6e3880af031735a0059c0bb5180574a7dcc88e522c8b56746d130f8d45a52184045f96793e0100000008acabac6a526a6553fffffffffe05f14cdef7d12a9169ec0fd37524b5fcd3295f73f48ca35a36e671da4a2f560000000008006a526a6351ab63ffffffffdfbd869ac9e472640a84caf28bdd82e8c6797f42d03b99817a705a24fde2736600000000010090a090a503db956b04000000000952ac53ab6a536a63ab358390010000000009656a5200525153ac65353ee204000000000763530052526aaba6ad83fb", + "535151ab6300", + 2, + 222014018, + "57a34ddeb1bf36d28c7294dda0432e9228a9c9e5cc5c692db98b6ed2e218d825" + ], + [ + "8df1cd19027db4240718dcaf70cdee33b26ea3dece49ae6917331a028c85c5a1fb7ee3e475020000000865ab6a00510063636157988bc84d8d55a8ba93cdea001b9bf9d0fa65b5db42be6084b5b1e1556f3602f65d4d0100000005ac00ab0052206c852902b2fb54030000000008ac5252536aacac5378c4a5050000000007acabac535163532784439e", + "acab6a", + 0, + 1105620132, + "edb7c74223d1f10f9b3b9c1db8064bc487321ff7bb346f287c6bc2fad83682de" + ], + [ + "0e803682024f79337b25c98f276d412bc27e56a300aa422c42994004790cee213008ff1b8303000000080051ac65ac655165f421a331892b19a44c9f88413d057fea03c3c4a6c7de4911fe6fe79cf2e9b3b10184b1910200000005525163630096cb1c670398277204000000000253acf7d5d502000000000963536a6a636a5363ab381092020000000002ac6a911ccf32", + "6565", + 1, + -1492094009, + "f0672638a0e568a919e9d8a9cbd7c0189a3e132940beeb52f111a89dcc2daa2c" + ], + [ + "7d71669d03022f9dd90edac323cde9e56354c6804c6b8e687e9ae699f46805aafb8bcaa636000000000253abffffffff698a5fdd3d7f2b8b000c68333e4dd58fa8045b3e2f689b889beeb3156cecdb490300000009525353abab0051acabc53f0aa821cdd69b473ec6e6cf45cf9b38996e1c8f52c27878a01ec8bb02e8cb31ad24e500000000055353ab0052ffffffff0447a23401000000000565ab53ab5133aaa0030000000006515163656563057d110300000000056a6aacac52cf13b5000000000003526a5100000000", + "6a6a51", + 1, + -1349253507, + "722efdd69a7d51d3d77bed0ac5544502da67e475ea5857cd5af6bdf640a69945" + ], + [ + "9ff618e60136f8e6bb7eabaaac7d6e2535f5fba95854be6d2726f986eaa9537cb283c701ff02000000026a65ffffffff012d1c0905000000000865ab00ac6a516a652f9ad240", + "51515253635351ac", + 0, + 1571304387, + "659cd3203095d4a8672646add7d77831a1926fc5b66128801979939383695a79" + ], + [ + "9fbd43ac025e1462ecd10b1a9182a8e0c542f6d1089322a41822ab94361e214ed7e1dfdd8a020000000263519d0437581538e8e0b6aea765beff5b4f3a4a202fca6e5d19b34c141078c6688f71ba5b8e0100000003ac6552ffffffff02077774050000000009655153655263acab6a0ae4e10100000000035152524c97136b", + "635152ab", + 0, + 1969622955, + "d82d4ccd9b67810f26a378ad9592eb7a30935cbbd27e859b00981aefd0a72e08" + ], + [ + "0117c92004314b84ed228fc11e2999e657f953b6de3b233331b5f0d0cf40d5cc149b93c7b30300000005515263516a083e8af1bd540e54bf5b309d36ba80ed361d77bbf4a1805c7aa73667ad9df4f97e2da410020000000600ab6351ab524d04f2179455e794b2fcb3d214670001c885f0802e4b5e015ed13a917514a7618f5f332203000000086a536aab51000063ecf029e65a4a009a5d67796c9f1eb358b0d4bd2620c8ad7330fb98f5a802ab92d0038b1002000000036a6551a184a88804b04490000000000009ab6a5152535165526a33d1ab020000000001518e92320000000000002913df04000000000952abac6353525353ac8b19bfdf", + "000051ab0000", + 0, + 489433059, + "8eebac87e60da524bbccaf285a44043e2c9232868dda6c6271a53c153e7f3a55" + ], + [ + "e7f5482903f98f0299e0984b361efb2fddcd9979869102281e705d3001a9d283fe9f3f3a1e02000000025365ffffffffcc5c7fe82feebad32a22715fc30bc584efc9cd9cadd57e5bc4b6a265547e676e0000000001ab579d21235bc2281e08bf5e7f8f64d3afb552839b9aa5c77cf762ba2366fffd7ebb74e49400000000055263ab63633df82cf40100982e05000000000453ac535300000000", + "acacab", + 2, + -1362931214, + "046de666545330e50d53083eb78c9336416902f9b96c77cc8d8e543da6dfc7e4" + ], + [ + "09adb2e90175ca0e816326ae2dce7750c1b27941b16f6278023dbc294632ab97977852a09d030000000465ab006affffffff027739cf0100000000075151ab63ac65ab8a5bb601000000000653ac5151520011313cdc", + "ac", + 0, + -76831756, + "478ee06501b4965b40bdba6cbaad9b779b38555a970912bb791b86b7191c54bc" + ], + [ + "f973867602e30f857855cd0364b5bbb894c049f44abbfd661d7ae5dbfeaafca89fac8959c20100000005ab52536a51ffffffffbeceb68a4715f99ba50e131884d8d20f4a179313691150adf0ebf29d05f8770303000000066352ab00ac63ffffffff021fddb90000000000036a656322a177000000000008526500ac5100acac84839083", + "52acab53ac", + 0, + 1407879325, + "db0329439490efc64b7104d6d009b03fbc6fac597cf54fd786fbbb5fd73b92b4" + ], + [ + "fd22ebaa03bd588ad16795bea7d4aa7f7d48df163d75ea3afebe7017ce2f350f6a0c1cb0bb00000000086aabac5153526363ffffffff488e0bb22e26a565d77ba07178d17d8f85702630ee665ec35d152fa05af3bda10200000004515163abffffffffeb21035849e85ad84b2805e1069a91bb36c425dc9c212d9bae50a95b6bfde1200300000001ab5df262fd02b69848040000000008ab6363636a6363ace23bf2010000000007655263635253534348c1da", + "006353526563516a00", + 0, + -1491036196, + "92364ba3c7a85d4e88885b8cb9b520dd81fc29e9d2b750d0790690e9c1246673" + ], + [ + "130b462d01dd49fac019dc4442d0fb54eaa6b1c2d1ad0197590b7df26969a67abd7f3fbb4f0100000008ac65abac53ab6563ffffffff0345f825000000000004ac53acac9d5816020000000002ababeff8e90500000000086aab006552ac6a53a892dc55", + "ab0065ac530052", + 0, + 944483412, + "1f4209fd4ce7f13d175fdd522474ae9b34776fe11a5f17a27d0796c77a2a7a9d" + ], + [ + "f8e50c2604609be2a95f6d0f31553081f4e1a49a0a30777fe51eb1c596c1a9a92c053cf28c0300000009656a51ac5252630052fffffffff792ed0132ae2bd2f11d4a2aab9d0c4fbdf9a66d9ae2dc4108afccdc14d2b1700100000007ab6a6563ac636a7bfb2fa116122b539dd6a2ab089f88f3bc5923e5050c8262c112ff9ce0a3cd51c6e3e84f02000000066551ac5352650d5e687ddf4cc9a497087cabecf74d236aa4fc3081c3f67b6d323cba795e10e7a171b725000000000852635351ab635100ffffffff02df5409020000000008ac6a53acab5151004156990200000000045163655200000000", + "ac53abac65005300", + 0, + -173065000, + "b596f206d7eba22b7e2d1b7a4f4cf69c7c541b6c84dcc943f84e19a99a923310" + ], + [ + "18020dd1017f149eec65b2ec23300d8df0a7dd64fc8558b36907723c03cd1ba672bbb0f51d0300000005ab65ab6a63ffffffff037cd7ae000000000009ab516a65005352ac65f1e4360400000000056353530053f118f0040000000009536363ab006500abac00000000", + "63ab51acab52ac", + 0, + -550412404, + "e19b796c14a0373674968e342f2741d8b51092a5f8409e9bff7dcd52e56fcbcb" + ], + [ + "b04154610363fdade55ceb6942d5e5a723323863b48a0cb04fdcf56210717955763f56b08d0300000009ac526a525151635151ffffffff93a176e76151a9eabdd7af00ef2af72f9e7af5ecb0aa4d45d00618f394cdd03c030000000074d818b332ebe05dc24c44d776cf9d275c61f471cc01efce12fd5a16464157f1842c65cb00000000066a0000ac6352d3c4134f01d8a1c0030000000005520000005200000000", + "5200656a656351", + 2, + -9757957, + "6e3e5ba77f760b6b5b5557b13043f1262418f3dd2ce7f0298b012811fc8ad5bc" + ], + [ + "9794b3ce033df7b1e32db62d2f0906b589eacdacf5743963dc2255b6b9a6cba211fadd0d41020000000600ab00650065ffffffffaae00687a6a4131152bbcaafedfaed461c86754b0bde39e2bef720e6d1860a0302000000070065516aac6552ffffffff50e4ef784d6230df7486e972e8918d919f005025bc2d9aacba130f58bed7056703000000075265ab52656a52ffffffff02c6f1a9000000000006005251006363cf450c040000000008abab63510053abac00000000", + "ac0063ababab515353", + 1, + 2063905082, + "fad092fc98f17c2c20e10ba9a8eb44cc2bcc964b006f4da45cb9ceb249c69698" + ], + [ + "94533db7015e70e8df715066efa69dbb9c3a42ff733367c18c22ff070392f988f3b93920820000000006535363636300ce4dac3e03169af80300000000080065ac6a53ac65ac39c050020000000006abacab6aacac708a02050000000005ac5251520000000000", + "6553", + 0, + -360458507, + "5418cf059b5f15774836edd93571e0eed3855ba67b2b08c99dccab69dc87d3e9" + ], + [ + "c8597ada04f59836f06c224a2640b79f3a8a7b41ef3efa2602592ddda38e7597da6c639fee0300000009005251635351acabacffffffff4c518f347ee694884b9d4072c9e916b1a1f0a7fc74a1c90c63fdf8e5a185b6ae02000000007113af55afb41af7518ea6146786c7c726641c68c8829a52925e8d4afd07d8945f68e7230300000008ab00ab65ab650063ffffffffc28e46d7598312c420e11dfaae12add68b4d85adb182ae5b28f8340185394b63000000000165ffffffff04dbabb7010000000000ee2f6000000000000852ab6500ab6a51acb62a27000000000009ac53515300ac006a6345fb7505000000000752516a0051636a00000000", + "", + 3, + 15199787, + "0d66003aff5bf78cf492ecbc8fd40c92891acd58d0a271be9062e035897f317e" + ], + [ + "1a28c4f702c8efaad96d879b38ec65c5283b5c084b819ad7db1c086e85e32446c7818dc7a90300000008656351536a525165fa78cef86c982f1aac9c5eb8b707aee8366f74574c8f42ef240599c955ef4401cf578be30200000002ab518893292204c430eb0100000000016503138a0300000000040053abac60e0eb010000000005525200ab63567c2d030000000004abab52006cf81e85", + "ab51525152", + 1, + 2118315905, + "4e4c9a781f626b59b1d3ad8f2c488eb6dee8bb19b9bc138bf0dc33e7799210d4" + ], + [ + "c6c7a87003f772bcae9f3a0ac5e499000b68703e1804b9ddc3e73099663564d53ddc4e1c6e01000000076a536a6aac63636e3102122f4c30056ef8711a6bf11f641ddfa6984c25ac38c3b3e286e74e839198a80a34010000000165867195cd425821dfa2f279cb1390029834c06f018b1e6af73823c867bf3a0524d1d6923b0300000005acab53ab65ffffffff02fa4c49010000000008ab656a0052650053e001100400000000008836d972", + "ac526351acab", + 1, + 978122815, + "a869c18a0edf563d6e5eddd5d5ae8686f41d07f394f95c9feb8b7e52761531ca" + ], + [ + "0ea580ac04c9495ab6af3b8d59108bb4194fcb9af90b3511c83f7bb046d87aedbf8423218e02000000085152acac006363ab9063d7dc25704e0caa5edde1c6f2dd137ded379ff597e055b2977b9c559b07a7134fcef2000000000200aca89e50181f86e9854ae3b453f239e2847cf67300fff802707c8e3867ae421df69274449402000000056365abababffffffff47a4760c881a4d7e51c69b69977707bd2fb3bcdc300f0efc61f5840e1ac72cee0000000000ffffffff0460179a020000000004ab53ab52a5250c0500000000096565acac6365ab52ab6c281e02000000000952635100ac006563654e55070400000000046552526500000000", + "ab526563acac53ab", + 2, + 1426964167, + "b1c50d58b753e8f6c7513752158e9802cf0a729ebe432b99acc0fe5d9b4e9980" + ], + [ + "c33028b301d5093e1e8397270d75a0b009b2a6509a01861061ab022ca122a6ba935b8513320200000000ffffffff013bcf5a0500000000015200000000", + "", + 0, + -513413204, + "6b1459536f51482f5dbf42d7e561896557461e1e3b6bf67871e2b51faae2832c" + ], + [ + "43b2727901a7dd06dd2abf690a1ccedc0b0739cb551200796669d9a25f24f71d8d101379f50300000000ffffffff0418e031040000000000863d770000000000085352ac526563ac5174929e040000000004ac65ac00ec31ac0100000000066a51ababab5300000000", + "65", + 0, + -492874289, + "154ff7a9f0875edcfb9f8657a0b98dd9600fabee3c43eb88af37cf99286d516c" + ], + [ + "4763ed4401c3e6ab204bed280528e84d5288f9cac5fb8a2e7bd699c7b98d4df4ac0c40e55303000000066a6aacab5165ffffffff015b57f80400000000046a63535100000000", + "ac51abab53", + 0, + -592611747, + "849033a2321b5755e56ef4527ae6f51e30e3bca50149d5707368479723d744f8" + ], + [ + "d24f647b02f71708a880e6819a1dc929c1a50b16447e158f8ff62f9ccd644e0ca3c592593702000000050053536a00ffffffff67868cd5414b6ca792030b18d649de5450a456407242b296d936bcf3db79e07b02000000005af6319c016022f50100000000036a516300000000", + "6aab526353516a6a", + 0, + 1350782301, + "8556fe52d1d0782361dc28baaf8774b13f3ce5ed486ae0f124b665111e08e3e3" + ], + [ + "fe6ddf3a02657e42a7496ef170b4a8caf245b925b91c7840fd28e4a22c03cb459cb498b8d603000000065263656a650071ce6bf8d905106f9f1faf6488164f3decac65bf3c5afe1dcee20e6bc3cb6d052561985a030000000163295b117601343dbb0000000000026563dba521df", + "", + 1, + -1696179931, + "d9684685c99ce48f398fb467a91a1a59629a850c429046fb3071f1fa9a5fe816" + ], + [ + "c61523ef0129bb3952533cbf22ed797fa2088f307837dd0be1849f20decf709cf98c6f032f03000000026563c0f1d378044338310400000000066363516a5165a14fcb0400000000095163536a6a00ab53657271d60200000000001d953f0500000000010000000000", + "53516353005153", + 0, + 1141615707, + "7e975a72db5adaa3c48d525d9c28ac11cf116d0f8b16ce08f735ad75a80aec66" + ], + [ + "ba3dac6c0182562b0a26d475fe1e36315f0913b6869bdad0ecf21f1339a5fcbccd32056c840200000000ffffffff04300351050000000000220ed405000000000851abac636565ac53dbbd19020000000007636363ac6a52acbb005a0500000000016abd0c78a8", + "63006a635151005352", + 0, + 1359658828, + "47bc8ab070273e1f4a0789c37b45569a6e16f3f3092d1ce94dddc3c34a28f9f4" + ], + [ + "ac27e7f5025fc877d1d99f7fc18dd4cadbafa50e34e1676748cc89c202f93abf36ed46362101000000036300abffffffff958cd5381962b765e14d87fc9524d751e4752dd66471f973ed38b9d562e525620100000003006500ffffffff02b67120050000000004ac51516adc330c0300000000015200000000", + "656352", + 1, + 15049991, + "f3374253d64ac264055bdbcc32e27426416bd595b7c7915936c70f839e504010" + ], + [ + "edb30140029182b80c8c3255b888f7c7f061c4174d1db45879dca98c9aab8c8fed647a6ffc03000000086a53510052ab6300ffffffff82f65f261db62d517362c886c429c8fbbea250bcaad93356be6f86ba573e9d930100000000ffffffff04daaf150400000000016a86d1300100000000096a6353535252ac5165d4ddaf000000000002abab5f1c6201000000000000000000", + "ab6a6a00ac", + 0, + -2058017816, + "8d7794703dad18e2e40d83f3e65269834bb293e2d2b8525932d6921884b8f368" + ], + [ + "7e50207303146d1f7ad62843ae8017737a698498d4b9118c7a89bb02e8370307fa4fada41d000000000753006300005152b7afefc85674b1104ba33ef2bf37c6ed26316badbc0b4aa6cb8b00722da4f82ff3555a6c020000000900ac656363ac51ac52ffffffff93fab89973bd322c5d7ad7e2b929315453e5f7ada3072a36d8e33ca8bebee6e0020000000300acab930da52b04384b04000000000004650052ac435e380200000000076a6a515263ab6aa9494705000000000600ab6a525252af8ba90100000000096565acab526353536a279b17ad", + "acac005263536aac63", + 1, + -34754133, + "4e6357da0057fb7ff79da2cc0f20c5df27ff8b2f8af4c1709e6530459f7972b0" + ], + [ + "c05764f40244fb4ebe4c54f2c5298c7c798aa90e62c29709acca0b4c2c6ec08430b26167440100000008acab6a6565005253ffffffffc02c2418f398318e7f34a3cf669d034eef2111ea95b9f0978b01493293293a870100000000e563e2e00238ee8d040000000002acab03fb060200000000076500ac656a516aa37f5534", + "52ab6a0065", + 1, + -2033176648, + "83deef4a698b62a79d4877dd9afebc3011a5275dbe06e89567e9ef84e8a4ee19" + ], + [ + "5a59e0b9040654a3596d6dab8146462363cd6549898c26e2476b1f6ae42915f73fd9aedfda00000000036363abffffffff9ac9e9ca90be0187be2214251ff08ba118e6bf5e2fd1ba55229d24e50a510d53010000000165ffffffff41d42d799ac4104644969937522873c0834cc2fcdab7cdbecd84d213c0e96fd60000000000ffffffffd838db2c1a4f30e2eaa7876ef778470f8729fcf258ad228b388df2488709f8410300000000fdf2ace002ceb6d903000000000265654c1310040000000003ac00657e91c0ec", + "536a63ac", + 0, + 82144555, + "98ccde2dc14d14f5d8b1eeea5364bd18fc84560fec2fcea8de4d88b49c00695e" + ], + [ + "156ebc8202065d0b114984ee98c097600c75c859bfee13af75dc93f57c313a877efb09f230010000000463536a51ffffffff81114e8a697be3ead948b43b5005770dd87ffb1d5ccd4089fa6c8b33d3029e9c03000000066a5251656351ffffffff01a87f140000000000050000ac51ac00000000", + "00", + 0, + -362221092, + "a903c84d8c5e71134d1ab6dc1e21ac307c4c1a32c90c90f556f257b8a0ec1bf5" + ], + [ + "15e37793023c7cbf46e073428908fce0331e49550f2a42b92468827852693f0532a01c29f70200000007005353636351acffffffff38426d9cec036f00eb56ec1dcd193647e56a7577278417b8a86a78ac53199bc403000000056353006a53ffffffff04a25ce103000000000900ab5365656a526a63c8eff7030000000004526353537ab6db0200000000016a11a3fa02000000000651acacab526500000000", + "53ac6aab6a6551", + 0, + 1117532791, + "83c68b3c5a89260ce16ce8b4dbf02e1f573c532d9a72f5ea57ab419fa2630214" + ], + [ + "f7a09f10027250fc1b70398fb5c6bffd2be9718d3da727e841a73596fdd63810c9e4520a6a010000000963ac516a636a65acac1d2e2c57ab28d311edc4f858c1663972eebc3bbc93ed774801227fda65020a7ec1965f780200000005ac5252516a8299fddc01dcbf7200000000000463ac6551960fda03", + "65acab51", + 1, + 2017321737, + "9c5fa02abfd34d0f9dec32bf3edb1089fca70016debdb41f4f54affcb13a2a2a" + ], + [ + "6d97a9a5029220e04f4ccc342d8394c751282c328bf1c132167fc05551d4ca4da4795f6d4e02000000076a0052ab525165ffffffff9516a205e555fa2a16b73e6db6c223a9e759a7e09c9a149a8f376c0a7233fa1b0100000007acab51ab63ac6affffffff04868aed04000000000652ac65ac536a396edf01000000000044386c0000000000076aab5363655200894d48010000000001ab8ebefc23", + "6351526aac51", + 1, + 1943666485, + "f0bd4ca8e97203b9b4e86bc24bdc8a1a726db5e99b91000a14519dc83fc55c29" + ], + [ + "8e3fddfb028d9e566dfdda251cd874cd3ce72e9dde837f95343e90bd2a93fe21c5daeb5eed01000000045151525140517dc818181f1e7564b8b1013fd68a2f9a56bd89469686367a0e72c06be435cf99db750000000003635251ffffffff01c051780300000000096552ababac6a65acab099766eb", + "5163ab6a52ababab51", + 1, + 1296295812, + "5509eba029cc11d7dd2808b8c9eb47a19022b8d8b7778893459bbc19ab7ea820" + ], + [ + "a603f37b02a35e5f25aae73d0adc0b4b479e68a734cf722723fd4e0267a26644c36faefdab0200000000ffffffff43374ad26838bf733f8302585b0f9c22e5b8179888030de9bdda180160d770650200000001004c7309ce01379099040000000005526552536500000000", + "abababab005153", + 0, + 1409936559, + "4ca73da4fcd5f1b10da07998706ffe16408aa5dff7cec40b52081a6514e3827e" + ], + [ + "9eeedaa8034471a3a0e3165620d1743237986f060c4434f095c226114dcb4b4ec78274729f03000000086a5365510052ac6afb505af3736e347e3f299a58b1b968fce0d78f7457f4eab69240cbc40872fd61b5bf8b120200000002ac52df8247cf979b95a4c97ecb8edf26b3833f967020cd2fb25146a70e60f82c9ee4b14e88b103000000008459e2fa0125cbcd05000000000000000000", + "52ab5352006353516a", + 0, + -1832576682, + "fb018ae54206fdd20c83ae5873ec82b8e320a27ed0d0662db09cda8a071f9852" + ], + [ + "05921d7c048cf26f76c1219d0237c226454c2a713c18bf152acc83c8b0647a94b13477c07f0300000003ac526afffffffff2f494453afa0cabffd1ba0a626c56f90681087a5c1bd81d6adeb89184b27b7402000000036a6352ffffffff0ad10e2d3ce355481d1b215030820da411d3f571c3f15e8daf22fe15342fed04000000000095f29f7b93ff814a9836f54dc6852ec414e9c4e16a506636715f569151559100ccfec1d100000000055263656a53ffffffff04f4ffef010000000008ac6a6aabacabab6a0e6689040000000006ab536a5352abe364d005000000000965536363655251ab53807e00010000000004526aab63f18003e3", + "6363ac51", + 3, + -375891099, + "001b0b176f0451dfe2d9787b42097ceb62c70d324e925ead4c58b09eebdf7f67" + ], + [ + "b9b44d9f04b9f15e787d7704e6797d51bc46382190c36d8845ec68dfd63ee64cf7a467b21e00000000096aac00530052ab636aba1bcb110a80c5cbe073f12c739e3b20836aa217a4507648d133a8eedd3f02cb55c132b203000000076a000063526352b1c288e3a9ff1f2da603f230b32ef7c0d402bdcf652545e2322ac01d725d75f5024048ad0100000000ffffffffffd882d963be559569c94febc0ef241801d09dc69527c9490210f098ed8203c700000000056a006300ab9109298d01719d9a0300000000066a52ab006365d7894c5b", + "ac6351650063636a", + 3, + -622355349, + "ac87b1b93a6baab6b2c6624f10e8ebf6849b0378ef9660a3329073e8f5553c8d" + ], + [ + "ff60473b02574f46d3e49814c484081d1adb9b15367ba8487291fc6714fd6e3383d5b335f001000000026a6ae0b82da3dc77e5030db23d77b58c3c20fa0b70aa7d341a0f95f3f72912165d751afd57230300000008ac536563516a6363ffffffff04f86c0200000000000553acab636ab13111000000000003510065f0d3f305000000000951ab516a65516aabab730a3a010000000002515200000000", + "ac6a", + 1, + 1895032314, + "0767e09bba8cd66d55915677a1c781acd5054f530d5cf6de2d34320d6c467d80" + ], + [ + "f218026204f4f4fc3d3bd0eada07c57b88570d544a0436ae9f8b753792c0c239810bb30fbc0200000002536affffffff8a468928d6ec4cc10aa0f73047697970e99fa64ae8a3b4dca7551deb0b639149010000000851ab520052650051ffffffffa98dc5df357289c9f6873d0f5afcb5b030d629e8f23aa082cf06ec9a95f3b0cf0000000000ffffffffea2c2850c5107705fd380d6f29b03f533482fd036db88739122aac9eff04e0aa010000000365536a03bd37db034ac4c4020000000007515152655200ac33b27705000000000151efb71e0000000000007b65425b", + "515151", + 3, + -1772252043, + "de35c84a58f2458c33f564b9e58bc57c3e028d629f961ad1b3c10ee020166e5a" + ], + [ + "48e7d42103b260b27577b70530d1ac2fed2551e9dd607cbcf66dca34bb8c03862cf8f5fd5401000000075151526aacab00ffffffff1e3d3b841552f7c6a83ee379d9d66636836673ce0b0eda95af8f2d2523c91813030000000665acac006365ffffffff388b3c386cd8c9ef67c83f3eaddc79f1ff910342602c9152ffe8003bce51b28b0100000008636363006a636a52ffffffff04b8f67703000000000852005353ac6552520cef720200000000085151ab6352ab00ab5096d6030000000005516a005100662582020000000001ac6c137280", + "6a65", + 1, + 1513618429, + "e2fa3e1976aed82c0987ab30d4542da2cb1cffc2f73be13480132da8c8558d5c" + ], + [ + "91ebc4cf01bc1e068d958d72ee6e954b196f1d85b3faf75a521b88a78021c543a06e056279000000000265ab7c12df0503832121030000000000cc41a6010000000005ab5263516540a951050000000006ab63ab65acac00000000", + "526a0065636a6a6aac", + 0, + -614046478, + "7de4ba875b2e584a7b658818c112e51ee5e86226f5a80e5f6b15528c86400573" + ], + [ + "3cd4474201be7a6c25403bf00ca62e2aa8f8f4f700154e1bb4d18c66f7bb7f9b975649f0dc0100000006535151535153ffffffff01febbeb000000000006005151006aac00000000", + "", + 0, + -1674687131, + "6b77ca70cc452cc89acb83b69857cda98efbfc221688fe816ef4cb4faf152f86" + ], + [ + "92fc95f00307a6b3e2572e228011b9c9ed41e58ddbaefe3b139343dbfb3b34182e9fcdc3f50200000002acab847bf1935fde8bcfe41c7dd99683289292770e7f163ad09deff0e0665ed473cd2b56b0f40300000006516551ab6351294dab312dd87b9327ce2e95eb44b712cfae0e50fda15b07816c8282e8365b643390eaab01000000026aacffffffff016e0b6b040000000001ac00000000", + "650065acac005300", + 2, + -1885164012, + "bd7d26bb3a98fc8c90c972500618bf894cb1b4fe37bf5481ff60eef439d3b970" + ], + [ + "4db591ab018adcef5f4f3f2060e41f7829ce3a07ea41d681e8cb70a0e37685561e4767ac3b0000000005000052acabd280e63601ae6ef20000000000036a636326c908f7", + "ac6a51526300630052", + 0, + 862877446, + "355ccaf30697c9c5b966e619a554d3323d7494c3ea280a9b0dfb73f953f5c1cb" + ], + [ + "503fd5ef029e1beb7b242d10032ac2768f9a1aca0b0faffe51cec24770664ec707ef7ede4f01000000045253ac53375e350cc77741b8e96eb1ce2d3ca91858c052e5f5830a0193200ae2a45b413dda31541f0000000003516553ffffffff0175a5ba0500000000015200000000", + "6aab65510053ab65", + 1, + 1603081205, + "353ca9619ccb0210ae18b24d0e57efa7abf8e58fa6f7102738e51e8e72c9f0c4" + ], + [ + "c80abebd042cfec3f5c1958ee6970d2b4586e0abec8305e1d99eb9ee69ecc6c2cbd76374380000000007ac53006300ac510acee933b44817db79320df8094af039fd82111c7726da3b33269d3820123694d849ee5001000000056a65ab526562699bea8530dc916f5d61f0babea709dac578774e8a4dcd9c640ec3aceb6cb2443f24f302000000020063ea780e9e57d1e4245c1e5df19b4582f1bf704049c5654f426d783069bcc039f2d8fa659f030000000851ab53635200006a8d00de0b03654e8500000000000463ab635178ebbb0400000000055100636aab239f1d030000000006ab006300536500000000", + "6565ac515100", + 3, + 1460851377, + "b35bb1b72d02fab866ed6bbbea9726ab32d968d33a776686df3ac16aa445871e" + ], + [ + "0337b2d5043eb6949a76d6632b8bb393efc7fe26130d7409ef248576708e2d7f9d0ced9d3102000000075352636a5163007034384dfa200f52160690fea6ce6c82a475c0ef1caf5c9e5a39f8f9ddc1c8297a5aa0eb02000000026a51ffffffff38e536298799631550f793357795d432fb2d4231f4effa183c4e2f61a816bcf0030000000463ac5300706f1cd3454344e521fde05b59b96e875c8295294da5d81d6cc7efcfe8128f150aa54d6503000000008f4a98c704c1561600000000000072cfa6000000000000e43def01000000000100cf31cc0500000000066365526a6500cbaa8e2e", + "", + 3, + 2029506437, + "7615b4a7b3be865633a31e346bc3db0bcc410502c8358a65b8127089d81b01f8" + ], + [ + "59f6cffd034733f4616a20fe19ea6aaf6abddb30b408a3a6bd86cd343ab6fe90dc58300cc90200000000ffffffffc835430a04c3882066abe7deeb0fa1fdaef035d3233460c67d9eabdb05e95e5a02000000080065ac535353ab00ffffffff4b9a043e89ad1b4a129c8777b0e8d87a014a0ab6a3d03e131c27337bbdcb43b402000000066a5100abac6ad9e9bf62014bb118010000000001526cbe484f", + "ab526352ab65", + 0, + 2103515652, + "4f2ccf981598639bec57f885b4c3d8ea8db445ea6e61cfd45789c69374862e5e" + ], + [ + "cbc79b10020b15d605680a24ee11d8098ad94ae5203cb6b0589e432832e20c27b72a926af20300000006ab65516a53acbb854f3146e55c508ece25fa3d99dbfde641a58ed88c051a8a51f3dacdffb1afb827814b02000000026352c43e6ef30302410a020000000000ff4bd90100000000065100ab63000008aa8e0400000000095265526565ac5365abc52c8a77", + "53526aac0051", + 0, + 202662340, + "984efe0d8d12e43827b9e4b27e97b3777ece930fd1f589d616c6f9b71dab710e" + ], + [ + "7c07419202fa756d29288c57b5c2b83f3c847a807f4a9a651a3f6cd6c46034ae0aa3a7446b0200000004ab6a6365ffffffff9da83cf4219bb96c76f2d77d5df31c1411a421171d9b59ec02e5c1218f29935403000000008c13879002f8b1ac0400000000086a63536a636553653c584f02000000000000000000", + "abac53ab656363", + 1, + -1038419525, + "4a74f365a161bc6c9bddd249cbd70f5dadbe3de70ef4bd745dcb6ee1cd299fbd" + ], + [ + "351cbb57021346e076d2a2889d491e9bfa28c54388c91b46ee8695874ad9aa576f1241874d0200000008ab6563525300516affffffffe13e61b8880b8cd52be4a59e00f9723a4722ea58013ec579f5b3693b9e115b1100000000096363abac5252635351ffffffff027fee02040000000008ab6a5200ab006a65b85f130200000000086a52630053ab52ab00000000", + "ab6aab65", + 1, + 586415826, + "08bbb746a596991ab7f53a76e19acad087f19cf3e1db54054aab403c43682d09" + ], + [ + "a8252ea903f1e8ff953adb16c1d1455a5036222c6ea98207fc21818f0ece2e1fac310f9a0100000000095163ac635363ac0000be6619e9fffcde50a0413078821283ce3340b3993ad00b59950bae7a9f931a9b0a3a035f010000000463005300b8b0583fbd6049a1715e7adacf770162811989f2be20af33f5f60f26eba653dc26b024a00000000006525351636552ffffffff046d2acc030000000002636a9a2d430500000000080065005165ab53abecf63204000000000052b9ed050000000008acacac53ab65656500000000", + "65ab53635253636a51", + 2, + 1442639059, + "8ca11838775822f9a5beee57bdb352f4ee548f122de4a5ca61c21b01a1d50325" + ], + [ + "2f1a425c0471a5239068c4f38f9df135b1d24bf52d730d4461144b97ea637504495aec360801000000055300515365c71801dd1f49f376dd134a9f523e0b4ae611a4bb122d8b26de66d95203f181d09037974300000000025152ffffffff9bdcea7bc72b6e5262e242c94851e3a5bf8f314b3e5de0e389fc9e5b3eadac030000000009525265655151005153ffffffffdbb53ce99b5a2320a4e6e2d13b01e88ed885a0957d222e508e9ec8e4f83496cb0200000007635200abac63ac04c96237020cc5490100000000080000516a51ac6553074a360200000000025152225520ca", + "6551ab65ac65516a", + 1, + -489869549, + "9bc5bb772c553831fb40abe466074e59a469154679c7dee042b8ea3001c20393" + ], + [ + "ef3acfd4024defb48def411b8f8ba2dc408dc9ee97a4e8bde4d6cb8e10280f29c98a6e8e9103000000035100513d5389e3d67e075469dfd9f204a7d16175653a149bd7851619610d7ca6eece85a516b2df0300000005516aac6552ca678bdf02f477f003000000000057e45b0300000000055252525252af35c20a", + "5165ac53ab", + 1, + -1900839569, + "78eb6b24365ac1edc386aa4ffd15772f601059581c8776c34f92f8a7763c9ccf" + ], + [ + "ff4468dc0108475fc8d4959a9562879ce4ab4867a419664bf6e065f17ae25043e6016c70480100000000ffffffff02133c6f0400000000000bd0a8020000000004006a520035afa4f6", + "51ac65ab", + 0, + -537664660, + "f6da59b9deac63e83728850ac791de61f5dfcaeed384ebcbb20e44afcd8c8910" + ], + [ + "4e8594d803b1d0a26911a2bcdd46d7cbc987b7095a763885b1a97ca9cbb747d32c5ab9aa91030000000353ac53a0cc4b215e07f1d648b6eeb5cdbe9fa32b07400aa773b9696f582cebfd9930ade067b2b200000000060065abab6500fc99833216b8e27a02defd9be47fafae4e4a97f52a9d2a210d08148d2a4e5d02730bcd460100000004516351ac37ce3ae1033baa55040000000006006a636a63acc63c990400000000025265eb1919030000000005656a6a516a00000000", + "", + 1, + -75217178, + "04c5ee48514cd033b82a28e336c4d051074f477ef2675ce0ce4bafe565ee9049" + ], + [ + "a88830a7023f13ed19ab14fd757358eb6af10d6520f9a54923a6d613ac4f2c11e249cda8aa030000000851630065abababacffffffff8f5fe0bc04a33504c4b47e3991d25118947a0261a9fa520356731eeabd561dd3020000000363ababffffffff038404bd010000000008ab5153516aab6a63d33a5601000000000263004642dc020000000009655152acac636352004be6f3af", + "5253536565006aab6a", + 0, + 1174417836, + "2e42ead953c9f4f81b72c27557e6dc7d48c37ff2f5c46c1dbe9778fb0d79f5b2" + ], + [ + "44e1a2b4010762af23d2027864c784e34ef322b6e24c70308a28c8f2157d90d17b99cd94a401000000085163656565006300ffffffff0198233d020000000002000000000000", + "52525153656365", + 0, + 1119696980, + "d9096de94d70c6337da6202e6e588166f31bff5d51bb5adc9468594559d65695" + ], + [ + "44ca65b901259245abd50a745037b17eb51d9ce1f41aa7056b4888285f48c6f26cb97b7a25020000000552636363abffffffff047820350400000000040053acab14f3e603000000000652635100ab630ce66c03000000000001bdc704000000000765650065ac51ac3e886381", + "51", + 0, + -263340864, + "ed5622ac642d11f90e68c0feea6a2fe36d880ecae6b8c0d89c4ea4b3d162bd90" + ], + [ + "cfa147d2017fe84122122b4dda2f0d6318e59e60a7207a2d00737b5d89694d480a2c26324b0000000006006351526552ffffffff0456b5b804000000000800516aab525363ab166633000000000004655363ab254c0e02000000000952ab6a6a00ab525151097c1b020000000009656a52ac6300530065ad0d6e50", + "6a535165ac6a536500", + 0, + -574683184, + "f926d4036eac7f019a2b0b65356c4ee2fe50e089dd7a70f1843a9f7bc6997b35" + ], + [ + "91c5d5f6022fea6f230cc4ae446ce040d8313071c5ac1749c82982cc1988c94cb1738aa48503000000016a19e204f30cb45dd29e68ff4ae160da037e5fc93538e21a11b92d9dd51cf0b5efacba4dd70000000005656a6aac51ffffffff03db126905000000000953006a53ab6563636a36a273030000000006656a52656552b03ede00000000000352516500000000", + "530052526a00", + 1, + 1437328441, + "255c125b60ee85f4718b2972174c83588ee214958c3627f51f13b5fb56c8c317" + ], + [ + "03f20dc202c886907b607e278731ebc5d7373c348c8c66cac167560f19b341b782dfb634cb03000000076a51ac6aab63abea3e8de7adb9f599c9caba95aa3fa852e947fc88ed97ee50e0a0ec0d14d164f44c0115c10100000004ab5153516fdd679e0414edbd000000000005ac636a53512021f2040000000007006a0051536a52c73db2050000000005525265ac5369046e000000000003ab006a1ef7bd1e", + "52656a", + 0, + 1360223035, + "5a0a05e32ce4cd0558aabd5d79cd5fcbffa95c07137506e875a9afcba4bef5a2" + ], + [ + "d9611140036881b61e01627078512bc3378386e1d4761f959d480fdb9d9710bebddba2079d020000000763536aab5153ab819271b41e228f5b04daa1d4e72c8e1955230accd790640b81783cfc165116a9f535a74c000000000163ffffffffa2e7bb9a28e810624c251ff5ba6b0f07a356ac082048cf9f39ec036bba3d431a02000000076a000000ac65acffffffff01678a820000000000085363515153ac635100000000", + "535353", + 2, + -82213851, + "52b9e0778206af68998cbc4ebdaad5a9469e04d0a0a6cef251abfdbb74e2f031" + ], + [ + "98b3a0bf034233afdcf0df9d46ac65be84ef839e58ee9fa59f32daaa7d684b6bdac30081c60200000007636351acabababffffffffc71cf82ded4d1593e5825618dc1d5752ae30560ecfaa07f192731d68ea768d0f0100000006650052636563f3a2888deb5ddd161430177ce298242c1a86844619bc60ca2590d98243b5385bc52a5b8f00000000095365acacab520052ac50d4722801c3b8a60300000000035165517e563b65", + "51", + 1, + -168940690, + "b6b684e2d2ecec8a8dce4ed3fc1147f8b2e45732444222aa8f52d860c2a27a9d" + ], + [ + "97be4f7702dc20b087a1fdd533c7de762a3f2867a8f439bddf0dcec9a374dfd0276f9c55cc0300000000cdfb1dbe6582499569127bda6ca4aaff02c132dc73e15dcd91d73da77e92a32a13d1a0ba0200000002ab51ffffffff048cfbe202000000000900516351515363ac535128ce0100000000076aac5365ab6aabc84e8302000000000863536a53ab6a6552f051230500000000066aac535153510848d813", + "ac51", + 0, + 229541474, + "e5da9a416ea883be1f8b8b2d178463633f19de3fa82ae25d44ffb531e35bdbc8" + ], + [ + "085b6e04040b5bff81e29b646f0ed4a45e05890a8d32780c49d09643e69cdccb5bd81357670100000001abffffffffa5c981fe758307648e783217e3b4349e31a557602225e237f62b636ec26df1a80300000004650052ab4792e1da2930cc90822a8d2a0a91ea343317bce5356b6aa8aae6c3956076aa33a5351a9c0300000004abac5265e27ddbcd472a2f13325cc6be40049d53f3e266ac082172f17f6df817db1936d9ff48c02b000000000152ffffffff021aa7670500000000085353635163ab51ac14d584000000000001aca4d136cc", + "6a525300536352536a", + 0, + -1398925877, + "41ecca1e8152ec55074f4c39f8f2a7204dda48e9ec1e7f99d5e7e4044d159d43" + ], + [ + "eec32fff03c6a18b12cd7b60b7bdc2dd74a08977e53fdd756000af221228fe736bd9c42d870100000007005353ac515265ffffffff037929791a188e9980e8b9cc154ad1b0d05fb322932501698195ab5b219488fc02000000070063510065ab6a0bfc176aa7e84f771ea3d45a6b9c24887ceea715a0ff10ede63db8f089e97d927075b4f1000000000551abab63abffffffff02eb933c000000000000262c420000000000036563632549c2b6", + "6352", + 2, + 1480445874, + "ff8a4016dfdd918f53a45d3a1f62b12c407cd147d68ca5c92b7520e12c353ff5" + ], + [ + "98ea7eac0313d9fb03573fb2b8e718180c70ce647bebcf49b97a8403837a2556cb8c9377f30000000004ac53ac65ffffffff8caac77a5e52f0d8213ef6ce998bedbb50cfdf108954771031c0e0cd2a78423900000000010066e99a44937ebb37015be3693761078ad5c73aa73ec623ac7300b45375cc8eef36087eb80000000007515352acac5100ffffffff0114a51b02000000000000000000", + "6aacab", + 0, + 243527074, + "bad77967f98941af4dd52a8517d5ad1e32307c0d511e15461e86465e1b8b5273" + ], + [ + "3ab70f4604e8fc7f9de395ec3e4c3de0d560212e84a63f8d75333b604237aa52a10da17196000000000763526a6553ac63a25de6fd66563d71471716fe59087be0dde98e969e2b359282cf11f82f14b00f1c0ac70f02000000050052516aacdffed6bb6889a13e46956f4b8af20752f10185838fd4654e3191bf49579c961f5597c36c0100000005ac636363abc3a1785bae5b8a1b4be5d0cbfadc240b4f7acaa7dfed6a66e852835df5eb9ac3c553766801000000036a65630733b7530218569602000000000952006a6a6a51acab52777f06030000000007ac0063530052abc08267c9", + "000000536aac0000", + 1, + 1919096509, + "df1c87cf3ba70e754d19618a39fdbd2970def0c1bfc4576260cba5f025b87532" + ], + [ + "bdb6b4d704af0b7234ced671c04ba57421aba7ead0a117d925d7ebd6ca078ec6e7b93eea6600000000026565ffffffff3270f5ad8f46495d69b9d71d4ab0238cbf86cc4908927fbb70a71fa3043108e6010000000700516a65655152ffffffff6085a0fdc03ae8567d0562c584e8bfe13a1bd1094c518690ebcb2b7c6ce5f04502000000095251530052536a53aba576a37f2c516aad9911f687fe83d0ae7983686b6269b4dd54701cb5ce9ec91f0e6828390300000000ffffffff04cc76cc020000000002656a01ffb702000000000253ab534610040000000009acab006565516a00521f55f5040000000000389dfee9", + "6a525165", + 0, + 1336204763, + "71c294523c48fd7747eebefbf3ca06e25db7b36bff6d95b41c522fecb264a919" + ], + [ + "54258edd017d22b274fbf0317555aaf11318affef5a5f0ae45a43d9ca4aa652c6e85f8a040010000000953ac65ab5251656500ffffffff03321d450000000000085265526a51526a529ede8b030000000003635151ce6065020000000001534c56ec1b", + "acac", + 0, + 2094130012, + "110d90fea9470dfe6c5048f45c3af5e8cc0cb77dd58fd13d338268e1c24b1ccc" + ], + [ + "ce0d322e04f0ffc7774218b251530a7b64ebefca55c90db3d0624c0ff4b3f03f918e8cf6f60300000003656500ffffffff9cce943872da8d8af29022d0b6321af5fefc004a281d07b598b95f6dcc07b1830200000007abab515351acab8d926410e69d76b7e584aad1470a97b14b9c879c8b43f9a9238e52a2c2fefc2001c56af8010000000400ab5253cd2cd1fe192ce3a93b5478af82fa250c27064df82ba416dfb0debf4f0eb307a746b6928901000000096500abacac6a0063514214524502947efc0200000000035251652c40340100000000096a6aab52000052656a5231c54c", + "51", + 2, + -2090320538, + "0322ca570446869ec7ec6ad66d9838cff95405002d474c0d3c17708c7ee039c6" + ], + [ + "47ac54940313430712ebb32004679d3a512242c2b33d549bf5bbc8420ec1fd0850ed50eb6d0300000009536aac6a65acacab51ffffffffb843e44266ce2462f92e6bff54316661048c8c17ecb092cb493b39bfca9117850000000001519ab348c05e74ebc3f67423724a3371dd99e3bceb4f098f8860148f48ad70000313c4c223000000000653006565656512c2d8dc033f3c97010000000002636aa993aa010000000006526365ab526ab7cf560300000000076a0065ac6a526500000000", + "005352535300ab6a", + 2, + 59531991, + "8b5b3d00d9c658f062fe6c5298e54b1fe4ed3a3eab2a87af4f3119edc47b1691" + ], + [ + "233cd90b043916fc41eb870c64543f0111fb31f3c486dc72457689dea58f75c16ae59e9eb2000000000500536a6a6affffffff9ae30de76be7cd57fb81220fce78d74a13b2dbcad4d023f3cadb3c9a0e45a3ce000000000965ac6353ac5165515130834512dfb293f87cb1879d8d1b20ebad9d7d3d5c3e399a291ce86a3b4d30e4e32368a9020000000453005165ffffffff26d84ae93eb58c81158c9b3c3cbc24a84614d731094f38d0eea8686dec02824d0300000005636a65abacf02c784001a0bd5d03000000000900655351ab65ac516a416ef503", + "", + 1, + -295106477, + "b79f31c289e95d9dadec48ebf88e27c1d920661e50d090e422957f90ff94cb6e" + ], + [ + "9200e26b03ff36bc4bf908143de5f97d4d02358db642bd5a8541e6ff709c420d1482d471b70000000008abab65536a636553ffffffff61ba6d15f5453b5079fb494af4c48de713a0c3e7f6454d7450074a2a80cb6d880300000007ac6a00ab5165515dfb7574fbce822892c2acb5d978188b1d65f969e4fe874b08db4c791d176113272a5cc10100000000ffffffff0420958d000000000009ac63516a0063516353dd885505000000000465ac00007b79e901000000000066d8bf010000000005525252006a00000000", + "ac5152", + 0, + 2089531339, + "89ec7fab7cfe7d8d7d96956613c49dc48bf295269cfb4ea44f7333d88c170e62" + ], + [ + "45f335ba01ce2073a8b0273884eb5b48f56df474fc3dff310d9706a8ac7202cf5ac188272103000000025363ffffffff049d859502000000000365ab6a8e98b1030000000002ac51f3a80603000000000752535151ac00000306e30300000000020051b58b2b3a", + "", + 0, + 1899564574, + "78e01310a228f645c23a2ad0acbb8d91cedff4ecdf7ca997662c6031eb702b11" + ], + [ + "d8f652a6043b4faeada05e14b81756cd6920cfcf332e97f4086961d49232ad6ffb6bc6c097000000000453526563ffffffff1ea4d60e5e91193fbbc1a476c8785a79a4c11ec5e5d6c9950c668ceacfe07a15020000000352ab51fffffffffe029a374595c4edd382875a8dd3f20b9820abb3e93f877b622598d11d0b09e503000000095351000052ac515152ffffffff9d65fea491b979699ceb13caf2479cd42a354bd674ded3925e760758e85a756803000000046365acabffffffff0169001d00000000000651636a65656300000000", + "ab0063630000ac", + 3, + 1050965951, + "4cc85cbc2863ee7dbce15490d8ca2c5ded61998257b9eeaff968fe38e9f009ae" + ], + [ + "718662be026e1dcf672869ac658fd0c87d6835cfbb34bd854c44e577d5708a7faecda96e260300000004526a636a489493073353b678549adc7640281b9cbcb225037f84007c57e55b874366bb7b0fa03bdc00000000095165ababac65ac00008ab7f2a802eaa53d000000000007acac516aac526ae92f380100000000056aac00536500000000", + "ab00", + 1, + 43296088, + "2d642ceee910abff0af2116af75b2e117ffb7469b2f19ad8fef08f558416d8f7" + ], + [ + "94083c840288d40a6983faca876d452f7c52a07de9268ad892e70a81e150d602a773c175ad03000000007ec3637d7e1103e2e7e0c61896cbbf8d7e205b2ecc93dd0d6d7527d39cdbf6d335789f660300000000ffffffff019e1f7b03000000000800ac0051acac0053539cb363", + "", + 1, + -183614058, + "a17b66d6bb427f42653d08207a22b02353dd19ccf2c7de6a9a3a2bdb7c49c9e7" + ], + [ + "30e0d4d20493d0cd0e640b757c9c47a823120e012b3b64c9c1890f9a087ae4f2001ca22a61010000000152f8f05468303b8fcfaad1fb60534a08fe90daa79bff51675472528ebe1438b6f60e7f60c10100000009526aab6551ac510053ffffffffaaab73957ea2133e32329795221ed44548a0d3a54d1cf9c96827e7cffd1706df0200000009ab00526a005265526affffffffd19a6fe54352015bf170119742821696f64083b5f14fb5c7d1b5a721a3d7786801000000085265abababac53abffffffff020f39bd030000000004ab6aac52049f6c050000000004ab52516aba5b4c60", + "6a6365516a6a655253", + 0, + -624256405, + "8e221a6c4bf81ca0d8a0464562674dcd14a76a32a4b7baf99450dd9195d411e6" + ], + [ + "f9c69d940276ec00f65f9fe08120fc89385d7350388508fd80f4a6ba2b5d4597a9e21c884f010000000663ab63ababab15473ae6d82c744c07fc876ecd53bd0f3018b2dbedad77d757d5bdf3811b23d294e8c0170000000001abafababe00157ede2050000000006ac6a5263635300000000", + "ab53", + 1, + 606547088, + "714d8b14699835b26b2f94c58b6ea4c53da3f7adf0c62ea9966b1e1758272c47" + ], + [ + "5c0ac112032d6885b7a9071d3c5f493aa16c610a4a57228b2491258c38de8302014276e8be030000000300ab6a17468315215262ad5c7393bb5e0c5a6429fd1911f78f6f72dafbbbb78f3149a5073e24740300000003ac5100ffffffff33c7a14a062bdea1be3c9c8e973f54ade53fe4a69dcb5ab019df5f3345050be00100000008ac63655163526aab428defc0033ec36203000000000765516365536a00ae55b2000000000002ab53f4c0080400000000095265516a536563536a00000000", + "6a005151006a", + 2, + 272749594, + "91082410630337a5d89ff19145097090f25d4a20bdd657b4b953927b2f62c73b" + ], + [ + "e3683329026720010b08d4bec0faa244f159ae10aa582252dd0f3f80046a4e145207d54d31000000000852acac52656aacac3aaf2a5017438ad6adfa3f9d05f53ebed9ceb1b10d809d507bcf75e0604254a8259fc29c020000000653526552ab51f926e52c04b44918030000000000f7679c0100000000090000525152005365539e3f48050000000009516500ab635363ab008396c905000000000253650591024f", + "6a6365", + 0, + 908746924, + "458aec3b5089a585b6bad9f99fd37a2b443dc5a2eefac2b7e8c5b06705efc9db" + ], + [ + "48c4afb204204209e1df6805f0697edaa42c0450bbbd767941fe125b9bc40614d63d757e2203000000066a5363005152dc8b6a605a6d1088e631af3c94b8164e36e61445e2c60130292d81dabd30d15f54b355a802000000036a6353ffffffff1d05dcec4f3dedcfd02c042ce5d230587ee92cb22b52b1e59863f3717df2362f0300000005536552ac52ffffffffd4d71c4f0a7d53ba47bb0289ca79b1e33d4c569c1e951dd611fc9c9c1ca8bc6c030000000865536a65ab51abacffffffff042f9aa905000000000753655153656351ab93d8010000000002655337440e0300000000005d4c690000000000015278587acb", + "ab006565526a51", + 0, + 1502064227, + "bbed77ff0f808aa8abd946ba9e7ec1ddb003a969fa223dee0af779643cb841a9" + ], + [ + "00b20fd104dd59705b84d67441019fa26c4c3dec5fd3b50eca1aa549e750ef9ddb774dcabe000000000651ac656aac65ffffffff52d4246f2db568fc9eea143e4d260c698a319f0d0670f84c9c83341204fde48b0200000000ffffffffb8aeabb85d3bcbc67b132f1fd815b451ea12dcf7fc169c1bc2e2cf433eb6777a03000000086a51ac6aab6563acd510d209f413da2cf036a31b0def1e4dcd8115abf2e511afbcccb5ddf41d9702f28c52900100000006ac52ab6a0065ffffffff039c8276000000000008ab53655200656a52401561010000000003acab0082b7160100000000035100ab00000000", + "535265", + 1, + -947367579, + "3212c6d6dd8d9d3b2ac959dec11f4638ccde9be6ed5d36955769294e23343da0" + ], + [ + "455131860220abbaa72015519090a666faf137a0febce7edd49da1eada41feab1505a0028b02000000036365ab453ead4225724eb69beb590f2ec56a7693a608871e0ab0c34f5e96157f90e0a96148f3c502000000085251ab51535163acffffffff022d1249040000000009abac00acac6565630088b310040000000000e3920e59", + "5152ab6a52ac5152", + 0, + 294375737, + "c40fd7dfa72321ac79516502500478d09a35cc22cc264d652c7d18b14400b739" + ], + [ + "624d28cb02c8747915e9af2b13c79b417eb34d2fa2a73547897770ace08c6dd9de528848d3030000000651ab63abab533c69d3f9b75b6ef8ed2df50c2210fd0bf4e889c42477d58682f711cbaece1a626194bb85030000000765acab53ac5353ffffffff018cc280040000000009abacabac52636352ac6859409e", + "ac51ac", + 1, + 1005144875, + "919144aada50db8675b7f9a6849c9d263b86450570293a03c245bd1e3095e292" + ], + [ + "8f28471d02f7d41b2e70e9b4c804f2d90d23fb24d53426fa746bcdcfffea864925bdeabe3e0200000001acffffffff76d1d35d04db0e64d65810c808fe40168f8d1f2143902a1cc551034fd193be0e0000000001acffffffff048a5565000000000005005151516afafb610400000000045263ac53648bb30500000000086363516a6a5165513245de01000000000000000000", + "6a0053510053", + 1, + -1525137460, + "305fc8ff5dc04ebd9b6448b03c9a3d945a11567206c8d5214666b30ec6d0d6cc" + ], + [ + "10ec50d7046b8b40e4222a3c6449490ebe41513aad2eca7848284a08f3069f3352c2a9954f0000000009526aac656352acac53ffffffff0d979f236155aa972472d43ee6f8ce22a2d052c740f10b59211454ff22cb7fd00200000007acacacab63ab53ffffffffbbf97ebde8969b35725b2e240092a986a2cbfd58de48c4475fe077bdd493a20c010000000663ab5365ababffffffff4600722d33b8dba300d3ad037bcfc6038b1db8abfe8008a15a1de2da2264007302000000035351ac6dbdafaf020d0ccf04000000000663ab6a51ab6ae06e5e0200000000036aabab00000000", + "", + 0, + -1658960232, + "2420dd722e229eccafae8508e7b8d75c6920bfdb3b5bac7cb8e23419480637c2" + ], + [ + "fef98b7101bf99277b08a6eff17d08f3fcb862e20e13138a77d66fba55d54f26304143e5360100000006515365abab00ffffffff04265965030000000004655252ace2c775010000000001002b23b4040000000007516a5153ab53ac456a7a00000000000753ab525251acacba521291", + "526aacacab00abab53", + 0, + -1614097109, + "4370d05c07e231d6515c7e454a4e401000b99329d22ed7def323976fa1d2eeb5" + ], + [ + "34a2b8830253661b373b519546552a2c3bff7414ea0060df183b1052683d78d8f54e842442000000000152ffffffffd961a8e34cf374151058dfcddc86509b33832bc57267c63489f69ff01199697c0300000002abacba856cfb01b17c2f050000000008515365ac53ab000000000000", + "5263ab656a", + 1, + -2104480987, + "2f9993e0a84a6ca560d6d1cc2b63ffe7fd71236d9cfe7d809491cef62bbfad84" + ], + [ + "43559290038f32fda86580dd8a4bc4422db88dd22a626b8bd4f10f1c9dd325c8dc49bf479f01000000026351ffffffff401339530e1ed3ffe996578a17c3ec9d6fccb0723dd63e7b3f39e2c44b976b7b0300000006ab6a65656a51ffffffff6fb9ba041c96b886482009f56c09c22e7b0d33091f2ac5418d05708951816ce7000000000551ac525100ffffffff020921e40500000000035365533986f40500000000016a00000000", + "52ac51", + 0, + 1769771809, + "02040283ef2291d8e1f79bb71bdabe7c1546c40d7ed615c375643000a8b9600d" + ], + [ + "6878a6bd02e7e1c8082d5e3ee1b746cfebfac9e8b97e61caa9e0759d8a8ecb3743e36a30de0100000002ab532a911b0f12b73e0071f5d50b6bdaf783f4b9a6ce90ec0cad9eecca27d5abae188241ddec0200000001651c7758d803f7457b0500000000036551515f4e90000000000001007022080200000000035365acc86b6946", + "6351ab", + 0, + -1929374995, + "f24be499c58295f3a07f5f1c6e5084496ae160450bd61fdb2934e615289448f1" + ], + [ + "35b6fc06047ebad04783a5167ab5fc9878a00c4eb5e7d70ef297c33d5abd5137a2dea9912402000000036aacacffffffff21dc291763419a584bdb3ed4f6f8c60b218aaa5b99784e4ba8acfec04993e50c03000000046a00ac6affffffff69e04d77e4b662a82db71a68dd72ef0af48ca5bebdcb40f5edf0caf591bb41020200000000b5db78a16d93f5f24d7d932f93a29bb4b784febd0cbb1943f90216dc80bba15a0567684b000000000853ab52ab5100006a1be2208a02f6bdc103000000000265ab8550ea04000000000365636a00000000", + "", + 0, + -1114114836, + "1c8655969b241e717b841526f87e6bd68b2329905ba3fc9e9f72526c0b3ea20c" + ], + [ + "bebb90c302bf91fd4501d33555a5fc5f2e1be281d9b7743680979b65c3c919108cc2f517510100000003abab00ffffffff969c30053f1276550532d0aa33cfe80ca63758cd215b740448a9c08a84826f3303000000056565ab5153ffffffff04bf6f2a04000000000565ab5265ab903e760100000000026a6a7103fa020000000006526553525365b05b2c000000000006ab000000535300000000", + "51510053ab63635153", + 1, + 1081291172, + "94338cd47a4639be30a71e21a7103cee4c99ef7297e0edd56aaf57a068b004de" + ], + [ + "af48319f031b4eeb4319714a285f44244f283cbff30dcb9275b06f2348ccd0d7f015b54f8500000000066363ac65ac6affffffff2560a9817ebbc738ad01d0c9b9cf657b8f9179b1a7f073eb0b67517409d108180200000005ac6365ab52ffffffff0bdd67cd4ecae96249a2e2a96db1490ee645f042fd9d5579de945e22b799f4d003000000086552ab515153ab00cf187c8202e51abf0300000000066552006a00abadf37d000000000004ac6a535100000000", + "63ab65", + 1, + -1855554446, + "60caf46a7625f303c04706cec515a44b68ec319ee92273acb566cca4f66861c1" + ], + [ + "f35befbc03faf8c25cc4bc0b92f6239f477e663b44b83065c9cb7cf231243032cf367ce3130000000005ab65526a517c4c334149a9c9edc39e29276a4b3ffbbab337de7908ea6f88af331228bd90086a6900ba020000000151279d19950d2fe81979b72ce3a33c6d82ebb92f9a2e164b6471ac857f3bbd3c0ea213b542010000000953ab51635363520065052657c20300a9ba04000000000452636a6a0516ea020000000008535253656365ababcfdd3f01000000000865ac516aac00530000000000", + "", + 2, + -99793521, + "c834a5485e68dc13edb6c79948784712122440d7fa5bbaa5cd2fc3d4dac8185d" + ], + [ + "d3da18520216601acf885414538ce2fb4d910997eeb91582cac42eb6982c9381589587794f0300000000fffffffff1b1c9880356852e10cf41c02e928748dd8fae2e988be4e1c4cb32d0bfaea6f7000000000465ab6aabffffffff02fb0d69050000000002ababeda8580500000000085163526565ac52522b913c95", + "ac", + 1, + -1247973017, + "99b32b5679d91e0f9cdd6737afeb07459806e5acd7630c6a3b9ab5d550d0c003" + ], + [ + "8218eb740229c695c252e3630fc6257c42624f974bc856b7af8208df643a6c520ef681bfd00000000002510066f30f270a09b2b420e274c14d07430008e7886ec621ba45665057120afce58befca96010300000004525153ab84c380a9015d96100000000000076a5300acac526500000000", + "ac005263", + 0, + -1855679695, + "5071f8acf96aea41c7518bd1b5b6bbe16258b529df0c03f9e374b83c66b742c6" + ], + [ + "1123e7010240310013c74e5def60d8e14dd67aedff5a57d07a24abc84d933483431b8cf8ea0300000003530051fc6775ff1a23c627a2e605dd2560e84e27f4208300071e90f4589e762ad9c9fe8d0da95e020000000465655200ffffffff04251598030000000004ab65ab639d28d90400000000096563636aacac525153474df801000000000851525165ac51006a75e23b040000000000e5bd3a4a", + "6363636565", + 0, + -467124448, + "9cb0dd04e9fe287b112e94a1647590d27e8b164ca13c4fe70c610fd13f82c2fd" + ], + [ + "fd92fe1003083c5179f97e77bf7d71975788138147adbdb283306802e261c0aee080fa22630200000000860c643ba9a1816b9badf36077b4554d11720e284e395a1121bc45279e148b2064c65e49020000000651ab6a53636a2c713088d20f4bc4001264d972cce05b9fe004dc33376ad24d0d013e417b91a5f1b6734e000000000100ffffffff02e3064c0500000000066552006a5165b86e8705000000000665ab65ab53522052eadb", + "00ab53525265", + 0, + 776203277, + "47207b48777727532f62e09afcd4104ea6687e723c7657c30504fa2081331cc8" + ], + [ + "d1b6a703038f14d41fcc5cc45455faa135a5322be4bf0f5cbcd526578fc270a236cacb853f0200000001abffffffff135aeff902fa38f202ccf5bd34437ff89c9dc57a028b62447a0a38579383e8ef0000000000ffffffffadf398d2c818d0b90bc474f540c3618a4a643482eeab73d36101987e2ec0335900000000004bd3323504e69fc10000000000055151535251790ada02000000000563ab6aab521337a704000000000963ac63abacac52656a1e9862010000000007656500ac51ab6a8f4ee672", + "ab5251656565ac63", + 2, + 82008394, + "b8f3d255549909c07588ecba10a02e55a2d6f2206d831af9da1a7dae64cfbc8b" + ], + [ + "81dadaa7011556683db3fe95262f4fdb20391b7e75b7ffcee51b176af64d83c06f85545d620200000005ab5151ab52ffffffff044805ef0300000000065353516352639702c802000000000900516351515252ab5270db08040000000009ac516aab526553abac4aabc90500000000096365ab0052636a525100000000", + "6565ab6a5152", + 0, + -2126294159, + "ad01ec9d6dbae325ec3a8e1fd98e2d03b1188378210efef093dd8b0b0ef3f19d" + ], + [ + "3b937e05032b8895d2f4945cb7e3679be2fbd15311e2414f4184706dbfc0558cf7de7b4d000000000001638b91a12668a3c3ce349788c961c26aa893c862f1e630f18d80e7843686b6e1e6fc396310000000000852635353ab65ac51eeb09dd1c9605391258ee6f74b9ae17b5e8c2ef010dc721c5433dcdc6e93a1593e3b6d1700000000085365ac6553526351ffffffff0308b18e04000000000253acb6dd00040000000008536aac5153ac516ab0a88201000000000500ac006500804e3ff2", + "", + 0, + 416167343, + "595a3c02254564634e8085283ec4ea7c23808da97ce9c5da7aecd7b553e7fd7f" + ], + [ + "a48f27ca047997470da74c8ee086ddad82f36d9c22e790bd6f8603ee6e27ad4d3174ea875403000000095153ac636aab6aacabffffffffefc936294e468d2c9a99e09909ba599978a8c0891ad47dc00ba424761627cef202000000056a51630053ffffffff304cae7ed2d3dbb4f2fbd679da442aed06221ffda9aee460a28ceec5a9399f4e0200000000f5bddf82c9c25fc29c5729274c1ff0b43934303e5f595ce86316fc66ad263b96ca46ab8d0100000003536500d7cf226b0146b00c04000000000200ac5c2014ce", + "515100636563", + 0, + 1991799059, + "9c051a7092fe17fa62b1720bc2c4cb2ffc1527d9fb0b006d2e142bb8fe07bf3c" + ], + [ + "180cd53101c5074cf0b7f089d139e837fe49932791f73fa2342bd823c6df6a2f72fe6dba1303000000076a6a63ac53acabffffffff03853bc1020000000007ac526a6a6a6a003c4a8903000000000453515163a0fbbd030000000005ab656a5253253d64cf", + "ac65", + 0, + -1548453970, + "4d8efb3b99b9064d2f6be33b194a903ffabb9d0e7baa97a48fcec038072aac06" + ], + [ + "c21ec8b60376c47e057f2c71caa90269888d0ffd5c46a471649144a920d0b409e56f190b700000000008acac6a526a536365ffffffff5d315d9da8bf643a9ba11299450b1f87272e6030fdb0c8adc04e6c1bfc87de9a0000000000ea43a9a142e5830c96b0ce827663af36b23b0277244658f8f606e95384574b91750b8e940000000007516a63ac0063acffffffff023c61be0400000000055165ab5263313cc8020000000006006a53526551ed8c3d56", + "6a", + 1, + 1160627414, + "a638cc17fd91f4b1e77877e8d82448c84b2a4e100df1373f779de7ad32695112" + ], + [ + "128cd90f04b66a4cbc78bf48748f6eec0f08d5193ee8d0a6f2e8d3e5f138ed12c2c87d01a301000000085200ab6aac00ab00ffffffff09fc88bb1851e3dfb3d30179c38e15aeb1b39929c7c74f6acd071994ed4806490300000000e7fc5ea12ec56f56c0d758ecf4bb88aa95f3b08176b336db3b9bec2f6e27336dce28adbe030000000400530051fffffffffd6ff1adcf1fbe0d883451ee46904f1b7e8820243d395559b2d4ee8190a6e891000000000080fb1ae702f85b400000000000035200ab8d9651010000000006ab6a52536aab00000000", + "ab", + 1, + 1667598199, + "c10ccc9db8a92d7d4b133a2980782dab9d9d1d633d0dde9f9612ada57771fd89" + ], + [ + "da9695a403493d3511c10e1fe1286f954db0366b7667c91ef18ae4578056c1bf752114ac5901000000035351519788d91dd1f9c62dc005d80ea54eb13f7131ca5aace3d5d29f9b58ccc5fbc9a27e779950010000000453ac6a00ffffffffe2556ff29ebe83eb42a32c7a8d93bc598043578f491b5935805a33608538845a030000000252ab65d21b3b018f26c4030000000006acab51535352e1cbcb10", + "006565ab52", + 2, + -1550927794, + "0ca673a1ee66f9625ceb9ab278ebef772c113c188112b02824570c17fdf48194" + ], + [ + "b240517501334021240427adb0b413433641555424f6d24647211e3e6bfbb22a8045cbda2f000000000071bac8630112717802000000000000000000", + "6a5165abac52656551", + 0, + 1790414254, + "2c8be597620d95abd88f9c1cf4967c1ae3ca2309f3afec8928058c9598660e9e" + ], + [ + "96bac43903044a199b4b3efeeec5d196ee23fb05495541fa2cd6fb6405a9432d1723363660010000000151ffffffffe6ce2b66ce1488918a3e880bebb0e750123f007c7bcbac8fcd67ce75cb6fbae80300000000ffffffff9c0955aa07f506455834895c0c56be5a095398f47c62a3d431fe125b161d666a0200000005520000abac7ffdbc540216f2f004000000000165a26dce010000000001ab00000000", + "5151ab656a656a6a63", + 0, + -707123065, + "26b22e18d5d9081fde9631594a4f7c49069ed2e429f3d08caf9d834f685ccab2" + ], + [ + "b8fd394001ed255f49ad491fecc990b7f38688e9c837ccbc7714ddbbf5404f42524e68c18f0000000007ab6353535363ab081e15ee02706f7d050000000008515200535351526364c7ec040000000005636a53acac9206cbe1", + "655352ac", + 0, + -1251578838, + "8e0697d8cd8a9ccea837fd798cc6c5ed29f6fbd1892ee9bcb6c944772778af19" + ], + [ + "e42a76740264677829e30ed610864160c7f97232c16528fe5610fc08814b21c34eefcea69d010000000653006a6a0052ffffffff647046cf44f217d040e6a8ff3f295312ab4dd5a0df231c66968ad1c6d8f4428000000000025352ffffffff0199a7f900000000000000000000", + "655263006a005163", + 1, + 1122505713, + "7cda43f1ff9191c646c56a4e29b1a8c6cb3f7b331da6883ef2f0480a515d0861" + ], + [ + "0f034f32027a8e094119443aa9cfe11737c6d7dda9a52b839bc073dcc0235b847b28e0fab60200000006ac53ac536a63eee63447dfdad80476994b68706e916df1bd9d7cb4f3a4f6b14369de84564bea2e8688bd030000000565636a65acf8434663020b35fe01000000000800abab655163acabb3d6a103000000000353acab345eeda0", + "526a51ac63ab51", + 1, + 66020215, + "4435e62ff6531ac73529aac9cf878a7219e0b6e6cac79af8487c5355d1ad6d43" + ], + [ + "a2dfa4690214c1ab25331815a5128f143219de51a47abdc7ce2d367e683eeb93960a31af9f010000000363636affffffff8be0628abb1861b078fcc19c236bc4cc726fa49068b88ad170adb2a97862e7460200000004ac655363ffffffff0441f11103000000000153dbab0c000000000009ab53ac5365526aab63abbb95050000000004ab52516a29a029040000000003ac526a00000000", + "6a52ac63", + 1, + -1302210567, + "913060c7454e6c80f5ba3835454b54db2188e37dc4ce72a16b37d11a430b3d23" + ], + [ + "9dbc591f04521670af83fb3bb591c5d4da99206f5d38e020289f7db95414390dddbbeb56680100000004ac5100acffffffffb6a40b5e29d5e459f8e72d39f800089529f0889006cad3d734011991da8ef09d0100000009526a5100acab536a515fc427436df97cc51dc8497642ffc868857ee245314d28b356bd70adba671bd6071301fc0000000000ffffffff487efde2f620566a9b017b2e6e6d42525e4070f73a602f85c6dfd58304518db30000000005516353006a8d8090180244904a0200000000046a65656ab1e9c203000000000451ab63aba06a5449", + "", + 0, + -1414953913, + "bae189eb3d64aedbc28a6c28f6c0ccbd58472caaf0cf45a5aabae3e031dd1fea" + ], + [ + "1345fb2c04bb21a35ae33a3f9f295bece34650308a9d8984a989dfe4c977790b0c21ff9a7f0000000006ac52ac6a0053ffffffff7baee9e8717d81d375a43b691e91579be53875350dfe23ba0058ea950029fcb7020000000753ab53ab63ab52ffffffff684b6b3828dfb4c8a92043b49b8cb15dd3a7c98b978da1d314dce5b9570dadd202000000086353ab6a5200ac63d1a8647bf667ceb2eae7ec75569ca249fbfd5d1b582acfbd7e1fcf5886121fca699c011d0100000003ac006affffffff049b1eb00300000000001e46dc0100000000080065ab6a6a630065ca95b40300000000030051520c8499010000000006ab6aac526a6500000000", + "53526aac636300", + 2, + 1809978100, + "cfeaa36790bc398783d4ca45e6354e1ea52ee74e005df7f9ebd10a680e9607bf" + ], + [ + "7d75dc8f011e5f9f7313ba6aedef8dbe10d0a471aca88bbfc0c4a448ce424a2c5580cda1560300000003ab5152ffffffff01997f8e0200000000096552ac6a65656563530d93bbcc", + "00656a6563", + 0, + 1414485913, + "ec91eda1149f75bffb97612569a78855498c5d5386d473752a2c81454f297fa7" + ], + [ + "1459179504b69f01c066e8ade5e124c748ae5652566b34ed673eea38568c483a5a4c4836ca0100000008ac5352006563656affffffff5d4e037880ab1975ce95ea378d2874dcd49d5e01e1cdbfae3343a01f383fa35800000000095251ac52ac6aac6500ffffffff7de3ae7d97373b7f2aeb4c55137b5e947b2d5fb325e892530cb589bc4f92abd503000000086563ac53ab520052ffffffffb4db36a32d6e543ef49f4bafde46053cb85b2a6c4f0e19fa0860d9083901a1190300000003ab51531bbcfe5504a6dbda040000000008536a5365abac6500d660c80300000000096565abab6a53536a6a54e84e010000000003acac52df2ccf0500000000025351220c857e", + "", + 2, + 1879181631, + "3aad18a209fab8db44954eb55fd3cc7689b5ec9c77373a4d5f4dae8f7ae58d14" + ], + [ + "d98b777f04b1b3f4de16b07a05c31d79965579d0edda05600c118908d7cf642c9cd670093f020000000953005351ac65ab5363a268caad6733b7d1718008997f249e1375eb3ab9fe68ab0fe170d8e745ea24f54ce67f9b00000000066500516a5151ffffffff7ef8040dfcc86a0651f5907e8bfd1017c940f51cf8d57e3d3fe78d57e40b1e610200000003535263ffffffff39846cfed4babc098ff465256ba3820c30d710581316afcb67cd31c623b703360300000001acffffffff03d405120100000000056300006a5201a73d050000000004ab636a6a294c8c000000000006ac65536553ac00000000", + "63525351abac", + 1, + 2018694761, + "86970af23c89b72a4f9d6281e46b9ef5220816bed71ebf1ae20df53f38fe16ff" + ], + [ + "cabb1b06045a895e6dcfc0c1e971e94130c46feace286759f69a16d298c8b0f6fd0afef8f20300000004ac006352ffffffffa299f5edac903072bfb7d29b663c1dd1345c2a33546a508ba5cf17aab911234602000000056a65515365ffffffff89a20dc2ee0524b361231092a070ace03343b162e7162479c96b757739c8394a0300000002abab92ec524daf73fabee63f95c1b79fa8b84e92d0e8bac57295e1d0adc55dc7af5534ebea410200000001534d70e79b04674f6f00000000000600abacab53517d60cc0200000000035265ab96c51d040000000004ac6300ac62a787050000000008006a516563ab63639e2e7ff7", + "6551ac6351ac", + 3, + 1942663262, + "d0c4a780e4e0bc22e2f231e23f01c9d536b09f6e5be51c123d218e906ec518be" + ], + [ + "8b96d7a30132f6005b5bd33ea82aa325e2bcb441f46f63b5fca159ac7094499f380f6b7e2e00000000076aacabac6300acffffffff0158056700000000000465005100c319e6d0", + "52006a", + 0, + -1100733473, + "fb4bd26a91b5cf225dd3f170eb09bad0eac314bc1e74503cc2a3f376833f183e" + ], + [ + "112191b7013cfbe18a175eaf09af7a43cbac2c396f3695bbe050e1e5f4250603056d60910e02000000001c8a5bba03738a22010000000005525352656a77a149010000000002510003b52302000000000351ac52722be8e6", + "65ac6565", + 0, + -1847972737, + "8e795aeef18f510d117dfa2b9f4a2bd2e2847a343205276cedd2ba14548fd63f" + ], + [ + "ce6e1a9e04b4c746318424705ea69517e5e0343357d131ad55d071562d0b6ebfedafd6cb840100000003656553ffffffff67bd2fa78e2f52d9f8900c58b84c27ef9d7679f67a0a6f78645ce61b883fb8de000000000100d699a56b9861d99be2838e8504884af4d30b909b1911639dd0c5ad47c557a0773155d4d303000000046a5151abffffffff9fdb84b77c326921a8266854f7bbd5a71305b54385e747fe41af8a397e78b7fa010000000863acac6a51ab00ac0d2e9b9d049b8173010000000007ac53526a650063ba9b7e010000000008526a00525263acac0ab3fd030000000000ea8a0303000000000200aca61a97b9", + "", + 1, + -1276952681, + "b6ed4a3721be3c3c7305a5128c9d418efa58e419580cec0d83f133a93e3a22c5" + ], + [ + "a7721d94021652d90c79aaf5022d98219337d50f836382403ed313adb1116ba507ac28b0b0010000000551ac6300ab89e6d64a7aa81fb9595368f04d1b36d7020e7adf5807535c80d015f994cce29554fe869b01000000065353ab636500ffffffff024944c90100000000046300635369df9f01000000000000000000", + "656a536551ab", + 0, + -1740151687, + "935892c6f02948f3b08bcd463b6acb769b02c1912be4450126768b055e8f183a" + ], + [ + "2f7353dd02e395b0a4d16da0f7472db618857cd3de5b9e2789232952a9b154d249102245fd030000000151617fd88f103280b85b0a198198e438e7cab1a4c92ba58409709997cc7a65a619eb9eec3c0200000003636aabffffffff0397481c0200000000045300636a0dc97803000000000009d389030000000003ac6a53134007bb", + "0000536552526a", + 0, + -1912746174, + "30c4cd4bd6b291f7e9489cc4b4440a083f93a7664ea1f93e77a9597dab8ded9c" + ], + [ + "7d95473604fd5267d0e1bb8c9b8be06d7e83ff18ad597e7a568a0aa033fa5b4e1e2b6f1007020000000465006a6affffffffaee008503bfc5708bd557c7e78d2eab4878216a9f19daa87555f175490c40aaf000000000263abffffffffabd74f0cff6e7ceb9acc2ee25e65af1abcebb50c08306e6c78fa8171c37613dd010000000552acacababffffffff54a3069393f7930fa1b331cdff0cb945ec21c11d4605d8eedba1d3e094c6ae1f01000000026300ffffffff0182edeb050000000009526353ab5153530065a247e8cd", + "51516aab00", + 2, + -426210430, + "2707ca714af09494bb4cf0794abe33c6cba5f29891d619e76070269d1fa8e690" + ], + [ + "221d4718023d9ca9fe1af178dbfce02b2b369bf823ea3f43f00891b7fef98e215c06b94fdd000000000951005153ab000051acffffffffb1c7ad1c64b7441bf5e70cd0f6eb4ec96821d67fc4997d9e6dfdceadecd36dde01000000070051536a635153ffffffff04e883cd00000000000851ab536553ab0052bbb2f70400000000002f1b2e03000000000165259fcb00000000000010dbde99", + "ab", + 1, + 665721280, + "4abce77432a86dfe608e7c1646c18b5253a373392ff962e288e3ab96bba1ba1d" + ], + [ + "6f66c0b3013e6ae6aabae9382a4326df31c981eac169b6bc4f746edaa7fc1f8c796ef4e374000000000665ab6aabac6affffffff0191c8d6030000000002525300000000", + "6a5352516a635352ab", + 0, + -1299629906, + "48411efeb133c6b7fec4e7bdbe613f827093cb06ea0dbcc2ffcfde3a9ac4356c" + ], + [ + "89e7928c04363cb520eff4465251fd8e41550cbd0d2cdf18c456a0be3d634382abcfd4a2130200000006ac516a6a656355042a796061ed72db52ae47d1607b1ceef6ca6aea3b7eea48e7e02429f382b378c4e51901000000085351ab6352ab5252ffffffff53631cbda79b40183000d6ede011c778f70147dc6fa1aed3395d4ce9f7a8e69701000000096a6553ab52516a52abad0de418d80afe059aab5da73237e0beb60af4ac490c3394c12d66665d1bac13bdf29aa8000000000153f2b59ab6027a33eb040000000007005351ac5100ac88b941030000000003ab0052e1e8a143", + "63656a", + 0, + 1258533326, + "b575a04b0bb56e38bbf26e1a396a76b99fb09db01527651673a073a75f0a7a34" + ], + [ + "ca356e2004bea08ec2dd2df203dc275765dc3f6073f55c46513a588a7abcc4cbde2ff011c7020000000553525100003aefec4860ef5d6c1c6be93e13bd2d2a40c6fb7361694136a7620b020ecbaca9413bcd2a030000000965ac00536352535100ace4289e00e97caaea741f2b89c1143060011a1f93090dc230bee3f05e34fbd8d8b6c399010000000365526affffffff48fc444238bda7a757cb6a98cb89fb44338829d3e24e46a60a36d4e24ba05d9002000000026a53ffffffff03d70b440200000000056a6a526aac853c97010000000002515335552202000000000351635300000000", + "0052", + 3, + -528192467, + "fc93cc056c70d5e033933d730965f36ad81ef64f1762e57f0bc5506c5b507e24" + ], + [ + "82d4fa65017958d53e562fac073df233ab154bd0cf6e5a18f57f4badea8200b217975e31030200000004636aab51ac0891a204227cc9050000000006635200655365bfef8802000000000865650051635252acfc2d09050000000006ab65ac51516380195e030000000007ac52525352510063d50572", + "53", + 0, + -713567171, + "e095003ca82af89738c1863f0f5488ec56a96fb81ea7df334f9344fcb1d0cf40" + ], + [ + "75f6949503e0e47dd70426ef32002d6cdb564a45abedc1575425a18a8828bf385fa8e808e600000000036aabab82f9fd14e9647d7a1b5284e6c55169c8bd228a7ea335987cef0195841e83da45ec28aa2e0300000002516350dc6fe239d150efdb1b51aa288fe85f9b9f741c72956c11d9dcd176889963d699abd63f0000000001ab429a63f502777d20010000000007abac52ac516a53d081d9020000000003acac630c3cc3a8", + "535152516551510000", + 1, + 973814968, + "c6ec1b7cb5c16a1bfd8a3790db227d2acc836300534564252b57bd66acf95092" + ], + [ + "24f24cd90132b2162f938f1c22d3ca5e7daa83515883f31a61a5177aebf99d7db6bdfc398c010000000163ffffffff01d5562d0100000000016300000000", + "5265ac5165ac5252ab", + 0, + 1055129103, + "5eeb03e03806cd7bfd44bbba69c30f84c2c5120df9e68cd8facc605fcfbc9693" + ], + [ + "5ff2cac201423064a4d87a96b88f1669b33adddc6fa9acdc840c0d8a243671e0e6de49a5b00300000005ac6353655353b91db50180db5a03000000000663535151006a047a3aff", + "52ab51ab5365005163", + 0, + -1336626596, + "b8db8d57fe40ab3a99cf2f8ed57da7a65050fcc1d34d4280e25faf10108d3110" + ], + [ + "10011f150220ad76a50ccc7bb1a015eda0ff987e64cd447f84b0afb8dc3060bdae5b36a6900200000000ffffffff1e92dd814dfafa830187bc8e5b9258de2445ec07b02c420ee5181d0b203bb334000000000565ab536a65ffffffff0124e65401000000000800ab636553ab53ac00000000", + "53abab0051", + 0, + 440222748, + "c6675bf229737e005b5c8ffa6f81d9e2c4396840921b6151316f67c4315a4270" + ], + [ + "8b95ec900456648d820a9b8df1d8f816db647df8a8dc9f6e7151ebf6079d90ee3f6861352a02000000085200ab00ac535151ffffffff039b10b845f961225ac0bcaac4f5fe1991029a051aa3d06a3811b5762977a67403000000035252abffffffff8559d65f40d5e261f45aec8aad3d2c56c6114b22b26f7ee54a06f0881be3a7f5010000000765635252536363ffffffff38f8b003b50f6412feb2322b06b270197f81ad69c36af02ca5008b94eee5f650020000000165ffffffff01ae2b00010000000001638eb153a2", + "0053ab5300ac53", + 2, + 1266056769, + "205f3653f0142b35ce3ef39625442efebae98cde8cbf0516b97b51073bb0479f" + ], + [ + "babbb7ea01ab5d584727cb44393b17cf66521606dc81e25d85273be0d57bad43e8f6b6d43501000000036a656aba83a68803fb0f4a000000000005536353ab633fcfe4020000000009ac00acab6351006a65182a0c03000000000453ac5363bee74f44", + "536a6a6a6365ac51ab", + 0, + -799187625, + "3275e98dca37243b977525a07b5d8e369d6c3bdc08cb948029a635547d0d1a4e" + ], + [ + "e86a24bc03e4fae784cdf81b24d120348cb5e52d937cd9055402fdba7e43281e482e77a1c100000000046363006affffffffa5447e9bdcdab22bd20d88b19795d4c8fb263fbbf7ce8f4f9a85f865953a6325020000000663ac53535253ffffffff9f8b693bc84e0101fc73748e0513a8cecdc264270d8a4ee1a1b6717607ee1eaa00000000026a513417bf980158d82c020000000009005253005351acac5200000000", + "6353516365536a6a", + 2, + -563792735, + "508129278ef07b43112ac32faf00170ad38a500eed97615a860fd58baaad174b" + ], + [ + "53bd749603798ed78798ef0f1861b498fc61dcee2ee0f2b37cddb115b118e73bc6a5a47a0201000000096a63656a6aab6a000007ff674a0d74f8b4be9d2e8e654840e99d533263adbdd0cf083fa1d5dd38e44d2d163d900100000007abab5251ac6a51c8b6b63f744a9b9273ccfdd47ceb05d3be6400c1ed0f7283d32b34a7f4f0889cccf06be30000000009516a52636551ab516a9ac1fe63030c677e05000000000027bc610000000000086565636a635100526e2dc60200000000015300000000", + "6552536a515351ab", + 1, + -1617066878, + "fe516df92299e995b8e6489be824c6839543071ec5e9286060b2600935bf1f20" + ], + [ + "691bf9fc028ca3099020b79184e70039cf53b3c7b3fe695d661fd62d7b433e65feda2150610000000003ac63abffffffff2c814c15b142bc944192bddccb90a392cd05b968b599c1d8cd99a55a28a243fd0100000009ab5300526a5200abac98516a5803dfd3540500000000046552ac522838120100000000040053ab6a4409a903000000000665636a5300658759621b", + "65ac5165ab", + 0, + -359941441, + "d582c442e0ecc400c7ba33a56c93ad9c8cfd45af820350a13623594b793486f0" + ], + [ + "536bc5e60232eb60954587667d6bcdd19a49048d67a027383cc0c2a29a48b960dc38c5a0370300000005ac636300abffffffff8f1cfc102f39b1c9348a2195d496e602c77d9f57e0769dabde7eaaedf9c69e250100000006acabab6a6351ffffffff0432f56f0400000000046a5365517fd54b0400000000035265539484e4050000000003536a5376dc25020000000008ac536aab6aab536ab978e686", + "ac0051006a006a006a", + 0, + -273074082, + "f151f1ec305f698d9fdce18ea292b145a58d931f1518cf2a4c83484d9a429638" + ], + [ + "74606eba01c2f98b86c29ba5a32dc7a7807c2abe6ed8d89435b3da875d87c12ae05329e6070200000003510052ffffffff02a1e2c4020000000006516563526a63c68bae04000000000952ab6363ab00006363fe19ae4f", + "63ababacac5365", + 0, + 112323400, + "d1b1d79001b4a0324962607b739972d6f39c1493c4500ce814fd3bd72d32a5a0" + ], + [ + "2ed805e20399e52b5bcc9dc075dad5cf19049ff5d7f3de1a77aee9288e59c5f4986751483f020000000165ffffffff967531a5726e7a653a9db75bd3d5208fa3e2c5e6cd5970c4d3aba84eb644c72c0300000000ffffffffd79030d20c65e5f8d3c55b5692e5bdaa2ae78cfa1935a0282efb97515feac43f030000000400006365261ab88c02bdf66a000000000003ab6351d6ad8b000000000005525152abac00000000", + "630053ab5265", + 0, + 2072814938, + "1d25d16d84d5793be1ad5cda2de9c9cf70e04a66c3dae618f1a7ca4026198e7f" + ], + [ + "fab796ee03f737f07669160d1f1c8bf0800041157e3ac7961fea33a293f976d79ce49c02ab0200000003ac5252eb097ea1a6d1a7ae9dace338505ba559e579a1ee98a2e9ad96f30696d6337adcda5a85f403000000096500abab656a6a656396d5d41a9b11f571d91e4242ddc0cf2420eca796ad4882ef1251e84e42b930398ec69dd80100000005526551ac6a8e5d0de804f763bb0400000000015288271a010000000001acf2bf2905000000000300ab51c9641500000000000952655363636365ac5100000000", + "00ac536552", + 0, + -1854521113, + "f3bbab70b759fe6cfae1bf349ce10716dbc64f6e9b32916904be4386eb461f1f" + ], + [ + "f2b539a401e4e8402869d5e1502dbc3156dbce93583f516a4947b333260d5af1a34810c6a00200000003525363ffffffff01d305e2000000000005acab535200a265fe77", + "", + 0, + -1435650456, + "41617b27321a830c712638dbb156dae23d4ef181c7a06728ccbf3153ec53d7dd" + ], + [ + "9f10b1d8033aee81ac04d84ceee0c03416a784d1017a2af8f8a34d2f56b767aea28ff88c8f02000000025352ffffffff748cb29843bea8e9c44ed5ff258df1faf55fbb9146870b8d76454786c4549de100000000016a5ba089417305424d05112c0ca445bc7107339083e7da15e430050d578f034ec0c589223b0200000007abac53ac6565abffffffff025a4ecd010000000006636563ab65ab40d2700000000000056a6553526333fa296c", + "", + 0, + -395044364, + "20fd0eee5b5716d6cbc0ddf852614b686e7a1534693570809f6719b6fcb0a626" + ], + [ + "ab81755f02b325cbd2377acd416374806aa51482f9cc5c3b72991e64f459a25d0ddb52e66703000000036a00ab8727056d48c00cc6e6222be6608c721bc2b1e69d0ffbadd51d131f05ec54bcd83003aac5000000000003f2cdb60454630e020000000007526aac63000000e9e25c040000000003516a0088c97e0000000000076a535265655263771b5805000000000851ab00ac6565515100000000", + "5151ab00ac", + 0, + -230931127, + "ba0a2c987fcdd74b6915f6462f62c3f126a0750aa70048f7aa20f70726e6a20b" + ], + [ + "7a17e0ef0378dab4c601240639139335da3b7d684600fa682f59b7346ef39386fe9abd69350000000004ac5252ab807f26fb3249326813e18260a603b9ad66f41f05eaa8146f66bcca452162a502aac4aa8b02000000026a534ea460faa7e3d7854ec6c70d7e797025697b547ec500b2c09c873b4d5517767d3f3720660300000000ffffffff01b12e7a02000000000900ab006aab65656a63991c03e2", + "6aab6a", + 1, + -1577994103, + "62cd3413d9d819fb7355336365cf8a2a997f7436cc050a7143972044343b3281" + ], + [ + "ff2ecc09041b4cf5abb7b760e910b775268abee2792c7f21cc5301dd3fecc1b4233ee70a2c0200000009acac5300006a51526affffffffeb39c195a5426afff38379fc85369771e4933587218ef4968f3f05c51d6b7c92000000000165453a5f039b8dbef7c1ffdc70ac383b481f72f99f52b0b3a5903c825c45cfa5d2c0642cd50200000001654b5038e6c49daea8c0a9ac8611cfe904fc206dad03a41fb4e5b1d6d85b1ecad73ecd4c0102000000096a51000053ab656565bdb5548302cc719200000000000452655265214a3603000000000300ab6a00000000", + "52516a006a63", + 1, + -2113289251, + "37ed6fae36fcb3360c69cac8b359daa62230fc1419b2cf992a32d8f3e079dcff" + ], + [ + "70a8577804e553e462a859375957db68cfdf724d68caeacf08995e80d7fa93db7ebc04519d02000000045352ab53619f4f2a428109c5fcf9fee634a2ab92f4a09dc01a5015e8ecb3fc0d9279c4a77fb27e900000000006ab6a51006a6affffffff3ed1a0a0d03f25c5e8d279bb5d931b7eb7e99c8203306a6c310db113419a69ad010000000565516300abffffffff6bf668d4ff5005ef73a1b0c51f32e8235e67ab31fe019bf131e1382050b39a630000000004536a6563ffffffff02faf0bb00000000000163cf2b4b05000000000752ac635363acac15ab369f", + "ac", + 0, + -1175809030, + "1c9d6816c20865849078f9777544b5ddf37c8620fe7bd1618e4b72fb72dddca1" + ], + [ + "a3604e5304caa5a6ba3c257c20b45dcd468f2c732a8ca59016e77b6476ac741ce8b16ca8360200000004acac6553ffffffff695e7006495517e0b79bd4770f955040610e74d35f01e41c9932ab8ccfa3b55d0300000007ac5253515365acffffffff6153120efc5d73cd959d72566fc829a4eb00b3ef1a5bd3559677fb5aae116e38000000000400abab52c29e7abd06ff98372a3a06227386609adc7665a602e511cadcb06377cc6ac0b8f63d4fdb03000000055100acabacffffffff04209073050000000009ab5163ac525253ab6514462e05000000000952abacab636300656a20672c0400000000025153b276990000000000056565ab6a5300000000", + "5351", + 0, + 1460890590, + "249c4513a49076c6618aabf736dfd5ae2172be4311844a62cf313950b4ba94be" + ], + [ + "c6a72ed403313b7d027f6864e705ec6b5fa52eb99169f8ea7cd884f5cdb830a150cebade870100000009ac63ab516565ab6a51ffffffff398d5838735ff43c390ca418593dbe43f3445ba69394a6d665b5dc3b4769b5d700000000075265acab515365ffffffff7ee5616a1ee105fd18189806a477300e2a9cf836bf8035464e8192a0d785eea3030000000700ac6a51516a52ffffffff018075fd0000000000015100000000", + "005251acac5252", + 2, + -656067295, + "2cc1c7514fdc512fd45ca7ba4f7be8a9fe6d3318328bc1a61ae6e7675047e654" + ], + [ + "93c12cc30270fc4370c960665b8f774e07942a627c83e58e860e38bd6b0aa2cb7a2c1e060901000000036300abffffffff4d9b618035f9175f564837f733a2b108c0f462f28818093372eec070d9f0a5440300000001acffffffff039c2137020000000001525500990100000000055265ab636a07980e0300000000005ba0e9d1", + "656a5100", + 1, + 18954182, + "6beca0e0388f824ca33bf3589087a3c8ad0857f9fe7b7609ae3704bef0eb83e2" + ], + [ + "97bddc63015f1767619d56598ad0eb5c7e9f880b24a928fea1e040e95429c930c1dc653bdb0100000008ac53acac00005152aaa94eb90235ed10040000000000287bdd0400000000016a8077673a", + "acac6a536352655252", + 0, + -813649781, + "5990b139451847343c9bb89cdba0e6daee6850b60e5b7ea505b04efba15f5d92" + ], + [ + "cc3c9dd303637839fb727270261d8e9ddb8a21b7f6cbdcf07015ba1e5cf01dc3c3a327745d0300000000d2d7804fe20a9fca9659a0e49f258800304580499e8753046276062f69dbbde85d17cd2201000000096352536a520000acabffffffffbc75dfa9b5f81f3552e4143e08f485dfb97ae6187330e6cd6752de6c21bdfd21030000000600ab53650063ffffffff0313d0140400000000096565515253526aacac167f0a040000000008acab00535263536a9a52f8030000000006abab5151ab63f75b66f2", + "6a635353636a65ac65", + 1, + 377286607, + "dbc7935d718328d23d73f8a6dc4f53a267b8d4d9816d0091f33823bd1f0233e9" + ], + [ + "236f91b702b8ffea3b890700b6f91af713480769dda5a085ae219c8737ebae90ff25915a3203000000056300ac6300811a6a10230f12c9faa28dae5be2ebe93f37c06a79e76214feba49bb017fb25305ff84eb020000000100ffffffff041e351703000000000351ac004ff53e050000000003ab53636c1460010000000000cb55f701000000000651520051ab0000000000", + "acac636a6aac5300", + 0, + 406448919, + "793a3d3c37f6494fab79ff10c16702de002f63e34be25dd8561f424b0ea938c4" + ], + [ + "22e10d2003ab4ea9849a2801921113583b7c35c3710ff49a6003489395789a7cfb1e6051900100000006526a65535151ffffffff82f21e249ec60db33831d33b9ead0d56f6496db64337dcb7f1c3327c47729c4a020000000253abffffffff138f098f0e6a4cf51dc3e7a3b749f487d1ebde71b73b731d1d02ad1180ac7b8c02000000036563acda215011027a9484020000000007635165530000ac4bf6cb0400000000066aacabab65ab3ce3f32c", + "ab0052ab", + 2, + 1136359457, + "b5bd080bbcb8cd652f440484311d7a3cb6a973cd48f03c5c00fd6beb52dfc061" + ], + [ + "c47d5ad60485cb2f7a825587b95ea665a593769191382852f3514a486d7a7a11d220b62c54000000000663655253acab8c3cf32b0285b040e50dcf6987ddf7c385b3665048ad2f9317b9e0c5ba0405d8fde4129b00000000095251ab00ac65635300ffffffff549fe963ee410d6435bb2ed3042a7c294d0c7382a83edefba8582a2064af3265000000000152fffffffff7737a85e0e94c2d19cd1cde47328ece04b3e33cd60f24a8a345da7f2a96a6d0000000000865ab6a0051656aab28ff30d5049613ea020000000005ac51000063f06df1050000000008ac63516aabac5153afef5901000000000700656500655253688bc00000000000086aab5352526a53521ff1d5ff", + "51ac52", + 2, + -1296011911, + "0c1fd44476ff28bf603ad4f306e8b6c7f0135a441dc3194a6f227cb54598642a" + ], + [ + "0b43f122032f182366541e7ee18562eb5f39bc7a8e5e0d3c398f7e306e551cdef773941918030000000863006351ac51acabffffffffae586660c8ff43355b685dfa8676a370799865fbc4b641c5a962f0849a13d8250100000005abab63acabffffffff0b2b6b800d8e77807cf130de6286b237717957658443674df047a2ab18e413860100000008ab6aac655200ab63ffffffff04f1dbca03000000000800635253ab656a52a6eefd0300000000036365655d8ca90200000000005a0d530400000000015300000000", + "65ac65acac", + 0, + 351448685, + "86f26e23822afd1bdfc9fff92840fc1e60089f12f54439e3ab9e5167d0361dcf" + ], + [ + "4b0ecc0c03ba35700d2a30a71f28e432ff6ac7e357533b49f4e97cf28f1071119ad6b97f3e0300000008acab516363ac63acffffffffcd6a2019d99b5c2d639ddca0b1aa5ea7c1326a071255ea226960bd88f45ca57d00000000085253655363005353ffffffffba257635191c9f216de3277be548cb5a2313114cb1a4c563b03b4ef6c0f4f7040300000001abda542edf0495cdc40100000000026353c049e903000000000752516a53ab65512b0f9304000000000963ab516aac65516552fa9ece050000000009acab6500005152530000000000", + "65ab51525352510052", + 1, + -1355414590, + "3cd85f84aae6d702436f3f9b8980adcc1f8f202e957759540a27da0a32fc6c87" + ], + [ + "adaac0a803f66811346271c733036d6e0d45e15a9b602092e2e04ad93564f196e7f020b088000000000600526a636a00700ec3f9db07a3a6ce910bf318c7ec87a876e1f2a3366cc69f20cde09203b99c1cb9d15800000000050000ac636a4d0de554ebe95c6cc14faf5ff6361d1deba9474b8b0fd3b93c011cd96aec783abb3f36830200000005ab65005251ffffffff0464eb10050000000007520000ab6a65ab1beaa80300000000005a2f31050000000006526aab65ac52ba7db10000000000045251ab6a0cfb46e7", + "ab0051ac52636a", + 1, + -184733716, + "961ff413850336d3987c550404fc1d923266ca36cc9ffee7113edb3a9fea7f30" + ], + [ + "af1c4ab301ec462f76ee69ba419b1b2557b7ded639f3442a3522d4f9170b2d6859765c3df402000000016affffffff01a5ca6c000000000008ab52536aab00005300000000", + "6a6351", + 0, + 110304602, + "e88ed2eea9143f2517b15c03db00767eb01a5ce12193b99b964a35700607e5f4" + ], + [ + "0bfd34210451c92cdfa02125a62ba365448e11ff1db3fb8bc84f1c7e5615da40233a8cd368010000000252ac9a070cd88dec5cf9aed1eab10d19529720e12c52d3a21b92c6fdb589d056908e43ea910e0200000009ac516a52656a6a5165ffffffffc3edcca8d2f61f34a5296c405c5f6bc58276416c720c956ff277f1fb81541ddd00000000030063abffffffff811247905cdfc973d179c03014c01e37d44e78f087233444dfdce1d1389d97c302000000065163000063ab1724a26e02ca37c902000000000851ab53525352ac529012a90100000000085200525253535353fa32575b", + "5352ac6351", + 1, + -1087700448, + "b8f1e1f35e3e1368bd17008c756e59cced216b3c699bcd7bebdb5b6c8eec4697" + ], + [ + "2c84c0640487a4a695751d3e4be48019dbaea85a6e854f796881697383ea455347d2b2769001000000055265526500ffffffff6aac176d8aa00778d496a7231eeb7d3334f20c512d3db1683276402100d98de5030000000700536a5263526ac1ee9ceb171c0c984ebaf12c234fd1487fbf3b3d73aa0756907f26837efba78d1bed33200300000001ab4d9e8ec0bed837cb929bbed76ee848959cec59de44bd7667b7631a744f880d5c71a20cfd0100000007005363515300abffffffff023753fb0000000000036565532d3873050000000009005152ab6a63acab5200000000", + "ab650053ab", + 0, + -877941183, + "c49af297dffe2d80deddf10ceea84b99f8554bd2d55bbdc34e449728c31f0835" + ], + [ + "1f7e4b1b045d3efa6cd7a11d7873a8bab886c19bd11fcb6712f0948f2db3a7be76ff76c8f100000000095265ab6a0065ac5363ffffffffdaafcfa6029336c997680a541725190f09a6f6da21e54560eca4b5b8ae987da1000000000952ac52acac52515165ffffffff825a38d3b1e5bb4d10f33653ab3ab6882c7abdaec74460257d1528ce7be3f98e0100000007526a006a656a63c14adc8f04953a5d3d3f89237f38b857dd357713896d36215f7e8b77b11d98ea3cdc93df02000000015212484f6104bfafae0300000000025263a2b0120000000000056563ab00516c4d2605000000000653ac6500655301cc93030000000002acab14643b1f", + "63acac53ab", + 0, + 333824258, + "18da6ceb011cd36f15ad7dd6c55ef07e6f6ed48881ce3bb31416d3c290d9a0e9" + ], + [ + "467a3e7602e6d1a7a531106791845ec3908a29b833598e41f610ef83d02a7da3a1900bf2960000000005ab6a636353ffffffff031db6dac6f0bafafe723b9199420217ad2c94221b6880654f2b35114f44b1df010000000965ab52636a63ac6352ffffffff02b3b95c0100000000026300703216030000000001ab3261c0aa", + "6a", + 0, + 2110869267, + "3078b1d1a7713c6d101c64afe35adfae0977a5ab4c7e07a0b170b041258adbf2" + ], + [ + "8713bc4f01b411149d575ebae575f5dd7e456198d61d238695df459dd9b86c4e3b2734b62e0300000004abac6363ffffffff03b58049050000000002ac653c714c04000000000953656a005151526a527b5a9e03000000000652ac5100525300000000", + "52", + 0, + -647281251, + "0e0bed1bf2ff255aef6e5c587f879ae0be6222ab33bd75ee365ec6fbb8acbe38" + ], + [ + "f2ba8a8701b9c401efe3dd0695d655e20532b90ac0142768cee4a3bb0a89646758f544aa8102000000036a52527899f4e4040c6f0b030000000008636565ab530051ab52b60c000000000009515200ab630053ac53a49c5f040000000008ab53ab516300ab63fa27340300000000015100000000", + "ac63abab5251", + 0, + -1328936437, + "ab61497afd39e61fe06bc5677326919716f9b20083c9f3417dcea905090e0411" + ], + [ + "b5a7df6102107beded33ae7f1dec0531d4829dff7477260925aa2cba54119b7a07d92d5a1d02000000046a516a52803b625c334c1d2107a326538a3db92c6c6ae3f7c3516cd90a09b619ec6f58d10e77bd6703000000056563006a63ffffffff0117484b03000000000853acab52526a65abc1b548a1", + "ac006a525100", + 0, + 2074359913, + "680336db57347d8183b8898cd27a83f1ba5884155aeae5ce20b4840b75e12871" + ], + [ + "278cb16204b9dadf400266106392c4aa9df01ba03af988c8139dae4c1818ac009f13fc5f1a00000000065200ac656a52ffffffffd006bbebd8cbd7bdead24cddc9badfcc6bc0c2e63c037e5c29aa858f5d0f3e7d01000000046a0051acffffffffbc62a5f57e58da0b67956003ae81ac97cb4cbd1d694c914fc41515c008c4d8fd020000000165e329c844bcc16164be64b64a81cbf4ffd41ed2934e0daa0040ccb8365bab0b2a9e401c180300000003ab52abffffffff02588460030000000000a25a12030000000005535100005300000000", + "6553ab6a5300acab51", + 3, + 989407546, + "1c29f110576f4a3b257f67454d99dfc0dee62ef5517ca702848ce4bd2ea1a1d7" + ], + [ + "49eb2178020a04fca08612c34959fd41447319c190fb7ffed9f71c235aa77bec28703aa1820200000003ac6353abaff326071f07ec6b77fb651af06e8e8bd171068ec96b52ed584de1d71437fed186aecf0300000001acffffffff03da3dbe02000000000652ac63ac6aab8f3b680400000000096a536a65636a53516a5175470100000000016500000000", + "6a536365", + 0, + 1283691249, + "c670219a93234929f662ecb9aa148a85a2d281e83f4e53d10509461cdea47979" + ], + [ + "0f96cea9019b4b3233c0485d5b1bad770c246fe8d4a58fb24c3b7dfdb3b0fd90ea4e8e947f0300000006006a5163515303571e1e01906956030000000005ab635353abadc0fbbe", + "acac", + 0, + -1491469027, + "716a8180e417228f769dcb49e0491e3fda63badf3d5ea0ceeac7970d483dd7e2" + ], + [ + "9a7d858604577171f5fe3f3fd3e5e039c4b0a06717a5381e9977d80e9f53e025e0f16d2877020000000752636565536353ffffffff5862bd028e8276e63f044be1dddcbb8d0c3fa097678308abf2b0f45104a93dbd0100000001531200667ba8fdd3b28e98a35da73d3ddfe51e210303d8eb580f923de988ee632d77793892030000000752526363526563ffffffffe9744eb44db2658f120847c77f47786d268c302120d269e6004455aa3ea5f5e20200000009ab6300636aab656551ffffffff03c61a3c020000000009ab516a6aab6aab53ab737f1a05000000000853acabab655365ab92a4a00400000000016367edf6c8", + "535352ab", + 3, + 659348595, + "d36ee79fc80db2e63e05cdc50357d186181b40ae20e3720878284228a13ee8b3" + ], + [ + "148e68480196eb52529af8e83e14127cbfdbd4a174e60a86ac2d86eac9665f46f4447cf7aa01000000045200ac538f8f871401cf240c0300000000065252ab52656a5266cf61", + "", + 0, + -344314825, + "eacc47c5a53734d6ae3aedbc6a7c0a75a1565310851b29ef0342dc4745ceb607" + ], + [ + "e2bc29d4013660631ba14ecf75c60ec5e9bed7237524d8c10f66d0675daa66d1492cb834530200000004ac510065e42d0c9e04f2b26c01000000000951525152acac65ababa35b7504000000000953ac6aac00650053ab94688c0400000000056365526553a1bced0300000000016a00000000", + "65ab0063655353", + 0, + -888431789, + "59a34b3ed3a1cce0b104de8f7d733f2d386ffc7445efae67680cd90bc915f7e0" + ], + [ + "0c8a70d70494dca6ab05b2bc941b5b431c43a292bd8f2f02eab5e240a408ca73a676044a4103000000056a51ab006affffffff84496004e54836c035821f14439149f22e1db834f315b24588ba2f031511926c0100000000ffffffffbbc5e70ed1c3060ba1bfe99c1656a3158a7307c3ce8eb362ec32c668596d2bd30000000009636563635351abab00b039344c6fc4f9bec24322e45407af271b2d3dfec5f259ee2fc7227bc5285e22b3be85b40100000009ac00ab53abac6a5352e5ddfcff02d50231020000000005006a51536ab086d9020000000006ababac51ac6a00000000", + "abab636565acac6a", + 3, + 241546088, + "643a7b4c8d832e14d5c10762e74ec84f2c3f7ed96c03053157f1bed226614911" + ], + [ + "f98f79cf0274b745e1d6f36da7cbe205a79132a7ad462bdc434cfb1dcd62a6977c3d2a5dbc010000000553516a5365ffffffff4f89f485b53cdad7fb80cc1b7e314b9735b9383bc92c1248bb0e5c6173a55c0d010000000353655293f9b014045ad96d02000000000963ac526a53ac636365f4c27904000000000952536563635152526a2788f0030000000002516aff5add01000000000863530051655351abd04716ba", + "ab6552536a53", + 1, + -2128899945, + "56d29f5e300ddfed2cd8dcce5d79826e193981d0b70dc7487772c8a0b3b8d7b1" + ], + [ + "6c7913f902aa3f5f939dd1615114ce961beda7c1e0dd195be36a2f0d9d047c28ac62738c3a020000000453abac00ffffffff477bf2c5b5c6733881447ac1ecaff3a6f80d7016eee3513f382ad7f554015b970100000007ab6563acab5152ffffffff04e58fe1040000000009ab00526aabab526553e59790010000000002ab525a834b03000000000035fdaf0200000000086551ac65515200ab00000000", + "63ac53", + 1, + 1285478169, + "1536da582a0b6de017862445e91ba14181bd6bf953f4de2f46b040d351a747c9" + ], + [ + "4624aa9204584f06a8a325c84e3b108cafb97a387af62dc9eab9afd85ae5e2c71e593a3b690200000003636a005eb2b44eabbaeca6257c442fea00107c80e32e8715a1293cc164a42e62ce14fea146220c020000000090b9ee38106e3310037bfc519fd209bdbd21c588522a0e96df5fba4e979392bc993bfe9f01000000086363636a635353ab6f1907d218ef6f3c729d9200e23c1dbff2df58b8b1282c6717b26cf760ee4c880d23f4d100000000086a516a536a525163ffffffff01d6f162050000000000ebbab208", + "525365ab0053", + 1, + -1515409325, + "6cf9cd409b7185b1f118171f0a34217af5b612ea54195ea186505b667c19337f" + ], + [ + "16562fc503f1cf9113987040c408bfd4523f1512da699a2ca6ba122dc65677a4c9bf7763830000000003636552ffffffff1ec1fab5ff099d1c8e6b068156f4e39b5543286bab53c6d61e2582d1e07c96cf02000000045163656affffffffd0ef40003524d54c08cb4d13a5ee61c84fbb28cde9eca7a6d11ba3a9335d8c620100000007635153536a6300fbb84fc2012003a601000000000363ab6a00000000", + "63636a006a6aab", + 0, + -1310262675, + "1efbf3d37a92bc03d9eb950b792f307e95504f7c4998f668aa250707ebb752ac" + ], + [ + "531665d701f86bacbdb881c317ef60d9cd1baeffb2475e57d3b282cd9225e2a3bf9cbe0ded01000000086300ac515263acabffffffff0453a8500100000000086353acab516a6565e5e9200500000000026a52a44caa00000000000453ac000065e41b0500000000076500ac0065526ab4476f4d", + "006563006aab00636a", + 0, + 1770013777, + "0898b26dd3ca08632a5131fa48eb55b44386d0c5070c24d6e329673d5e3693b8" + ], + [ + "0f1227a20140655a3da36e413b9b5d108a866f6f147eb4940f032f5a89854eae6d7c3a91600100000009525363515153515253e37a79480161ab61020000000001ab00000000", + "ab65005200", + 0, + -1996383599, + "979782dc3f36d908d37d7e4046a38d306b4b08ddc60a5eba355fe3d6da1b29a9" + ], + [ + "063ff6eb01aff98d0d2a6db224475010edb634c2f3b46257084676adeb84165a4ff8558d7601000000066353006a5165deb3262c042d109c0000000000076363ab52ac005200b9c4050000000007516300ac510063cfffc800000000000200639e815501000000000700526a52ac6365ac7b07b8", + "656552abac6500", + 0, + -1559847112, + "674a4bcb04247f8dc98780f1792cac86b8aee41a800fc1e6f5032f6e1dccde65" + ], + [ + "3320f6730132f830c4681d0cae542188e4177cad5d526fae84565c60ceb5c0118e844f90bd030000000163ffffffff0257ec5a040000000005525251ac6538344d000000000002515200000000", + "5352656a53ac516a65", + 0, + 788050308, + "3afacaca0ef6be9d39e71d7b1b118994f99e4ea5973c9107ca687d28d8eba485" + ], + [ + "c13aa4b702eedd7cde09d0416e649a890d40e675aa9b5b6d6912686e20e9b9e10dbd40abb1000000000863ab6353515351ac11d24dc4cc22ded7cdbc13edd3f87bd4b226eda3e4408853a57bcd1becf2df2a1671fd1600000000045165516affffffff01baea300100000000076aab52ab53005300000000", + "0065", + 0, + -1195908377, + "241a23e7b1982d5f78917ed97a8678087acbbffe7f624b81df78a5fe5e41e754" + ], + [ + "d9a6f20e019dd1b5fae897fb472843903f9c3c2293a0ffb59cff2b413bae6eceab574aaf9d030000000663ab006a515102f54939032df5100100000000056a51ab65530ec28f010000000004ac5100007e874905000000000651005265ac6a00000000", + "abacab63acacabab", + 0, + 271463254, + "1326a46f4c21e7619f30a992719a905aa1632aaf481a57e1cbd7d7c22139b41e" + ], + [ + "157c81bf0490432b3fcb3f9a5b79e5f91f67f05efb89fa1c8740a3fe7e9bdc18d7cb6acd2203000000026351ffffffff912e48e72bbcf8a540b693cf8b028e532a950e6e63a28801f6eaad1afcc52ad00000000000b1a4b170a2b9e60e0cad88a0085137309f6807d25d5afb5c1e1d32aa10ba1cdf7df596dd0000000009525165656a51ab65ab3674fba32a76fe09b273618d5f14124465933f4190ba4e0fd09d838daafc6223b31642ac00000000086a53536551ac6565ffffffff01fe9fb6030000000008ab51656a5165636a00000000", + "ab00ab6a6551", + 3, + -64357617, + "1ddaab7f973551d71f16bd70c4c4edbf7225e64e784a6da0ee7f7a9fe4f12a0b" + ], + [ + "a2692fff03b2387f5bacd5640c86ba7df574a0ee9ed7f66f22c73cccaef3907eae791cbd230200000004536363abffffffff4d9fe7e5b375de88ba48925d9b2005447a69ea2e00495a96eafb2f144ad475b40000000008000053000052636537259bee3cedd3dcc07c8f423739690c590dc195274a7d398fa196af37f3e9b4a1413f810000000006ac63acac52abffffffff04c65fe60200000000075151536365ab657236fc020000000009005263ab00656a6a5195b8b6030000000007ac5165636aac6a7d7b66010000000002acab00000000", + "51", + 2, + -826546582, + "925037c7dc7625f3f12dc83904755a37016560de8e1cdd153c88270a7201cf15" + ], + [ + "2c5b003201b88654ac2d02ff6762446cb5a4af77586f05e65ee5d54680cea13291efcf930d0100000005ab536a006a37423d2504100367000000000004536a515335149800000000000152166aeb03000000000452510063226c8e03000000000000000000", + "635251", + 0, + 1060344799, + "7e058ca5dd07640e4aae7dea731cfb7d7fef1bfd0d6d7b6ce109d041f4ca2a31" + ], + [ + "f981b9e104acb93b9a7e2375080f3ea0e7a94ce54cd8fb25c57992fa8042bdf4378572859f0100000002630008604febba7e4837da77084d5d1b81965e0ea0deb6d61278b6be8627b0d9a2ecd7aeb06a0300000005ac5353536a42af3ef15ce7a2cd60482fc0d191c4236e66b4b48c9018d7dbe4db820f5925aad0e8b52a0300000008ab0063510052516301863715efc8608bf69c0343f18fb81a8b0c720898a3563eca8fe630736c0440a179129d03000000086aac6a52ac6a63ac44fec4c00408320a03000000000062c21c030000000007ac6a655263006553835f0100000000015303cd60000000000005535263536558b596e0", + "00", + 0, + -2140385880, + "49870a961263354c9baf108c6979b28261f99b374e97605baa532d9fa3848797" + ], + [ + "e7416df901269b7af14a13d9d0507709b3cd751f586ce9d5da8d16a121e1bd481f5a086e1103000000056aab005200ffffffff01aa269c040000000006acac6a6a5263ee718de6", + "ab525363", + 0, + 1309186551, + "eea7d2212bda2d408fff146f9ae5e85e6b640a93b9362622bb9d5e6e36798389" + ], + [ + "402a815902193073625ab13d876190d1bbb72aecb0ea733c3330f2a4c2fe6146f322d8843a0300000008656aab0000535363fffffffff9dccdec5d8509d9297d26dfcb1e789cf02236c77dc4b90ebccbf94d1b5821150300000001510bf1f96a03c5c145000000000002ac6ae11b1c0100000000055163516a5239c8a600000000000365636300000000", + "63536aacab", + 0, + -1811424955, + "0090803a20102a778ab967a74532faee13e03b702083b090b1497bc2267ee2fe" + ], + [ + "c4b702e502f1a54f235224f0e6de961d2e53b506ab45b9a40805d1dacd35148f0acf24ca5e00000000085200ac65ac53acabf34ba6099135658460de9d9b433b84a8562032723635baf21ca1db561dce1c13a06f4407000000000851ac006a63516aabffffffff02a853a603000000000163d17a67030000000005ab63006a5200000000", + "ac5363515153", + 1, + 480734903, + "5c46f7ac3d6460af0da28468fcc5b3c87f2b9093d0f837954b7c8174b4d7b6e7" + ], + [ + "9b83f78704f492b9b353a3faad8d93f688e885030c274856e4037818848b99e490afef27770200000000ffffffff36b60675a5888c0ef4d9e11744ecd90d9fe9e6d8abb4cff5666c898fdce98d9e00000000056aab656352596370fca7a7c139752971e169a1af3e67d7656fc4fc7fd3b98408e607c2f2c836c9f27c030000000653ac51ab6300a0761de7e158947f401b3595b7dc0fe7b75fa9c833d13f1af57b9206e4012de0c41b8124030000000953656a53ab53510052242e5f5601bf83b301000000000465516a6300000000", + "63515200ac656365", + 3, + -150879312, + "9cf05990421ea853782e4a2c67118e03434629e7d52ab3f1d55c37cf7d72cdc4" + ], + [ + "f492a9da04f80b679708c01224f68203d5ea2668b1f442ebba16b1aa4301d2fe5b4e2568f3010000000953005351525263ab65ffffffff93b34c3f37d4a66df255b514419105b56d7d60c24bf395415eda3d3d8aa5cd0101000000020065ffffffff9dba34dabdc4f1643b372b6b77fdf2b482b33ed425914bb4b1a61e4fad33cf390000000002ab52ffffffffbbf3dc82f397ef3ee902c5146c8a80d9a1344fa6e38b7abce0f157be7adaefae0000000009515351005365006a51ffffffff021359ba010000000000403fea0200000000095200ac6353abac635300000000", + "00ac51acacac", + 0, + -2115078404, + "fd44fc98639ca32c927929196fc3f3594578f4c4bd248156a25c04a65bf3a9f3" + ], + [ + "2f73e0b304f154d3a00fde2fdd40e791295e28d6cb76af9c0fd8547acf3771a02e3a92ba37030000000852ac6351ab6565639aa95467b065cec61b6e7dc4d6192b5536a7c569315fb43f470078b31ed22a55dab8265f02000000080065636a6aab6a53ffffffff9e3addbff52b2aaf9fe49c67017395198a9b71f0aa668c5cb354d06c295a691a0100000000ffffffff45c2b4019abaf05c5e484df982a4a07459204d1343a6ee5badade358141f8f990300000007ac516a6aacac6308655cd601f3bc2f0000000000015200000000", + "", + 0, + -2082053939, + "9a95e692e1f78efd3e46bb98f178a1e3a0ef60bd0301d9f064c0e5703dc879c2" + ], + [ + "5a60b9b503553f3c099f775db56af3456330f1e44e67355c4ab290d22764b9144a7b5f959003000000030052acbd63e0564decc8659aa53868be48c1bfcda0a8c9857b0db32a217bc8b46d9e7323fe9649020000000553ac6551abd0ecf806211db989bead96c09c7f3ec5f73c1411d3329d47d12f9e46678f09bac0dc383e0200000000ffffffff01494bb202000000000500516551ac00000000", + "ac", + 0, + 1169947809, + "62a36c6e8da037202fa8aeae03e533665376d5a4e0a854fc4624a75ec52e4eb1" + ], + [ + "7e98d353045569c52347ca0ff2fdba608829e744f61eb779ffdb5830aae0e6d6857ab2690e03000000075365acab656352ffffffffa890dd37818776d12da8dca53d02d243ef23b4535c67016f4c58103eed85360f030000000093dbacdc25ca65d2951e047d6102c4a7da5e37f3d5e3c8b87c29b489360725dcd117ee2003000000056a6300ac53c7e99fa1dc2b8b51733034e6555f6d6de47dbbf1026effac7db80cb2080678687380dc1e02000000075352005263516affffffff04423272040000000008ab6353ab65510051e0f53b0500000000086300516552635152f74a5f04000000000853acab0053ab52ab0e8e5f00000000000951ac5363516a6aabab00000000", + "6a5163ab52", + 3, + 890006103, + "476868cecd1763c91dade98f17defa42d31049547df45acffa1cc5ae5c3d75d6" + ], + [ + "e3649aa40405e6ffe377dbb1bbbb672a40d8424c430fa6512c6165273a2b9b6afa9949ec430200000007630052ab655153a365f62f2792fa90c784efe3f0981134d72aac0b1e1578097132c7f0406671457c332b84020000000353ab6ad780f40cf51be22bb4ff755434779c7f1def4999e4f289d2bd23d142f36b66fbe5cfbb4b01000000076a5252abac52ab1430ffdc67127c9c0fc97dcd4b578dab64f4fb9550d2b59d599773962077a563e8b6732c02000000016affffffff04cb2687000000000002ab636e320904000000000252acf70e9401000000000100dc3393050000000006ab0063536aacbc231765", + "65520053", + 3, + -2016196547, + "f64f805f0ff7f237359fa6b0e58085f3c766d1859003332223444fd29144112a" + ], + [ + "1d033569040700441686672832b531ab55db89b50dc1f9fc00fb72218b652da9dcfbc83be901000000066551ac526a632b390f9ad068e5fdee6563e88e2a8e4e09763c861072713dc069893dc6bbc9db3f00e26502000000096a5363526565525252ffffffff8a36bdd0aaf38f6707592d203e14476ca9f259021e487135c7e8324244057ed90300000000ed3fb2a3dfd4d46b5f3603fe0148653911988457bd0ed7f742b07c452f5476c228ff9f600200000007526aac00525152ffffffff04b88e48030000000000c753d602000000000853510000006553518fda2603000000000853ac52acac5263534839f1030000000006ac006aacac5300000000", + "516553635300ab0052", + 1, + 2075958316, + "c2cefaec2293134acbcf6d2a8bf2b3eb42e4ec04ee8f8bf30ff23e65680677c1" + ], + [ + "4c4be7540344050e3044f0f1d628039a334a7c1f7b4573469cfea46101d6888bb6161fe9710200000000ffffffffac85a4fdad641d8e28523f78cf5b0f4dc74e6c5d903c10b358dd13a5a1fd8a06000000000163e0ae75d05616b72467b691dc207fe2e65ea35e2eadb7e06ea442b2adb9715f212c0924f10200000000ffffffff0194ddfe02000000000265ac00000000", + "00006500", + 1, + -479922562, + "d66924d49f03a6960d3ca479f3415d638c45889ce9ab05e25b65ac260b51d634" + ], + [ + "202c18eb012bc0a987e69e205aea63f0f0c089f96dd8f0e9fcde199f2f37892b1d4e6da90302000000055352ac6565ffffffff0257e5450100000000025300ad257203000000000000000000", + "520052ac6a005265", + 0, + 168054797, + "502967a6f999f7ee25610a443caf8653dda288e6d644a77537bcc115a8a29894" + ], + [ + "32fa0b0804e6ea101e137665a041cc2350b794e59bf42d9b09088b01cde806ec1bbea077df0200000008515153650000006506a11c55904258fa418e57b88b12724b81153260d3f4c9f080439789a391ab147aabb0fa0000000007000052ac51ab510986f2a15c0d5e05d20dc876dd2dafa435276d53da7b47c393f20900e55f163b97ce0b800000000008ab526a520065636a8087df7d4d9c985fb42308fb09dce704650719140aa6050e8955fa5d2ea46b464a333f870000000009636300636a6565006affffffff01994a0d040000000002536500000000", + "516563530065", + 2, + -163068286, + "f58637277d2bc42e18358dc55f7e87e7043f5e33f4ce1fc974e715ef0d3d1c2a" + ], + [ + "ae23424d040cd884ebfb9a815d8f17176980ab8015285e03fdde899449f4ae71e04275e9a80100000007ab006553530053ffffffff018e06db6af519dadc5280c07791c0fd33251500955e43fe4ac747a4df5c54df020000000251ac330e977c0fec6149a1768e0d312fdb53ed9953a3737d7b5d06aad4d86e9970346a4feeb5030000000951ab51ac6563ab526a67cabc431ee3d8111224d5ecdbb7d717aa8fe82ce4a63842c9bd1aa848f111910e5ae1eb0100000004ac515300bfb7e0d7048acddc030000000009636a5253636a655363a3428e040000000001525b99c6050000000004655265ab717e6e020000000000d99011eb", + "ac6a6a516565", + 1, + -716251549, + "b098eb9aff1bbd375c70a0cbb9497882ab51f3abfebbf4e1f8d74c0739dc7717" + ], + [ + "030f44fc01b4a9267335a95677bd190c1c12655e64df74addc53b753641259af1a54146baa020000000152e004b56c04ba11780300000000026a53f125f001000000000251acd2cc7c03000000000763536563655363c9b9e50500000000015200000000", + "ac", + 0, + -1351818298, + "19dd32190ed2a37be22f0224a9b55b91e37290577c6c346d36d32774db0219a3" + ], + [ + "c05f448f02817740b30652c5681a3b128322f9dc97d166bd4402d39c37c0b14506d8adb5890300000003536353ffffffffa188b430357055ba291c648f951cd2f9b28a2e76353bef391b71a889ba68d5fc02000000056565526a6affffffff02745f73010000000001ab3ec34c0400000000036aac5200000000", + "516551510053", + 0, + -267877178, + "3a1c6742d4c374f061b1ebe330b1e169a113a19792a1fdde979b53e094cc4a3c" + ], + [ + "163ba45703dd8c2c5a1c1f8b806afdc710a2a8fc40c0138e2d83e329e0e02a9b6c837ff6b8000000000700655151ab6a522b48b8f134eb1a7e6f5a6fa319ce9d11b36327ba427b7d65ead3b4a6a69f85cda8bbcd22030000000563656552acffffffffdbcf4955232bd11eef0cc6954f3f6279675b2956b9bcc24f08c360894027a60201000000066500006500abffffffff04d0ce9d0200000000008380650000000000015233f360040000000003006aabedcf0801000000000000000000", + "000065006500ac", + 0, + 216965323, + "9afe3f4978df6a86e9a8ebd62ef6a9d48a2203f02629349f1864ef2b8b92fd55" + ], + [ + "07f7f5530453a12ad0c7eb8fbc3f140c7ab6818144d67d2d8752600ca5d9a9358e2dff87d4000000000663526aab526a9e599c379d455e2da36d0cde88d931a863a3e97e01e93b9edb65856f3d958dc08b92b720000000000165bbc8d66dae3b1b170a6e2457f5b161465cb8706e0e6ffc6af55deb918365f14c5f40d4890100000000a7bd77c069ee4b48638e2363fcf2a86b02bea022047bd9fcb16d2b94ad068308d19b31cb00000000066aab5300ab529672aa8f01dbd8a205000000000663536353006a02e99901", + "ac006351006a63ab63", + 1, + 119789359, + "6629a1e75c6ae8f4f9d5f734246b6a71682a5ea57246040ef0584f6b97916175" + ], + [ + "fe647f950311bf8f3a4d90afd7517df306e04a344d2b2a2fea368935faf11fa6882505890d0000000005ab5100516affffffff43c140947d9778718919c49c0535667fc6cc727f5876851cb8f7b6460710c7f60100000000ffffffffce4aa5d90d7ab93cbec2e9626a435afcf2a68dd693c15b0e1ece81a9fcbe025e0300000000ffffffff02f34806020000000002515262e54403000000000965635151ac655363636de5ce24", + "6a005100ac516351", + 2, + 989643518, + "818a7ceaf963f52b5c48a7f01681ac6653c26b63a9f491856f090d9d60f2ffe3" + ], + [ + "a1050f8604d0f9d2feefcdb5051ae0052f38e21bf39daf583fd0c3900faa3eab5d431c0bbe030000000653536a005151683d27e5c6e0da8f22125823f32d5d98477d8098ef36263b9694d61d4d85d3f2ac02b7570200000007000052005165abffffffff0cad981542bcb54a87d9400aa63e514c7c6fab7158c2b1fb37821ea755eb162a0200000000b94feb5100e5ef3bf8ed8d43356c8a8d5ac6c7e80d7ff6040f4f0aa19abbe783f4f461240200000007636500000052655686fd70042be3ad02000000000465ab636a15680b000000000004acac53511277c705000000000452635252d27a0102000000000000000000", + "6a6aacab65655251", + 1, + -982144648, + "dfcf484111801989eb6df8dc2bafb944d7365ffeb36a575a08f3270d3ef24c9f" + ], + [ + "cef7316804c3e77fe67fc6207a1ea6ae6eb06b3bf1b3a4010a45ae5c7ad677bb8a4ebd16d90200000009ac536a5152ac5263005301ab8a0da2b3e0654d31a30264f9356ba1851c820a403be2948d35cafc7f9fe67a06960300000006526a63636a53ffffffffbada0d85465199fa4232c6e4222df790470c5b7afd54704595a48eedd7a4916b030000000865ab63ac006a006ab28dba4ad55e58b5375053f78b8cdf4879f723ea4068aed3dd4138766cb4d80aab0aff3d0300000003ac6a00ffffffff010f5dd6010000000006ab006aab51ab00000000", + "", + 1, + 889284257, + "d0f32a6db43378af84b063a6706d614e2d647031cf066997c48c04de3b493a94" + ], + [ + "7b3ff28004ba3c7590ed6e36f45453ebb3f16636fe716acb2418bb2963df596a50ed954d2e03000000065251515265abffffffff706ee16e32e22179400c9841013971645dabf63a3a6d2d5feb42f83aa468983e030000000653ac51ac5152ffffffffa03a16e5e5de65dfa848b9a64ee8bf8656cc1f96b06a15d35bd5f3d32629876e020000000043c1a3965448b3b46f0f0689f1368f3b2981208a368ec5c30defb35595ef9cf95ffd10e902000000036aac65253a5bbe042e907204000000000800006565656352634203b4020000000002656336b3b7010000000001ab7a063f0100000000026500a233cb76", + "006551636a53ac5251", + 1, + -1144216171, + "68c7bd717b399b1ee33a6562a916825a2fed3019cdf4920418bb72ffd7403c8c" + ], + [ + "d5c1b16f0248c60a3ddccf7ebd1b3f260360bbdf2230577d1c236891a1993725e262e1b6cb000000000363636affffffff0a32362cfe68d25b243a015fc9aa172ea9c6b087c9e231474bb01824fd6bd8bc0300000005ab52ab516affffffff0420d9a70200000000045152656a45765d0000000000055252536a5277bad100000000000252ab3f3f3803000000000463acac5200000000", + "52636a52ab65", + 1, + 1305123906, + "978dc178ecd03d403b048213d904653979d11c51730381c96c4208e3ea24243a" + ], + [ + "1be8ee5604a9937ebecffc832155d9ba7860d0ca451eaced58ca3688945a31d93420c27c460100000006abac5300535288b65458af2f17cbbf7c5fbcdcfb334ffd84c1510d5500dc7d25a43c36679b702e850f7c0200000003005300ffffffff7c237281cb859653eb5bb0a66dbb7aeb2ac11d99ba9ed0f12c766a8ae2a2157203000000086aabac526365acabfffffffff09d3d6639849f442a6a52ad10a5d0e4cb1f4a6b22a98a8f442f60280c9e5be80200000007ab00ab6565ab52ffffffff0398fe83030000000005526aababacbdd6ec010000000005535252ab6a82c1e6040000000001652b71c40c", + "6563526353656351", + 2, + -853634888, + "0d936cceda2f56c7bb87d90a7b508f6208577014ff280910a710580357df25f3" + ], + [ + "9e0f99c504fbca858c209c6d9371ddd78985be1ab52845db0720af9ae5e2664d352f5037d4010000000552ac53636affffffff0e0ce866bc3f5b0a49748f597c18fa47a2483b8a94cef1d7295d9a5d36d31ae7030000000663515263ac635bb5d1698325164cdd3f7f3f7831635a3588f26d47cc30bf0fefd56cd87dc4e84f162ab702000000036a6365ffffffff85c2b1a61de4bcbd1d5332d5f59f338dd5e8accbc466fd860f96eef1f54c28ec030000000165ffffffff04f5cabd010000000007000052ac526563c18f1502000000000465510051dc9157050000000008655363ac525253ac506bb600000000000865656a53ab63006a00000000", + "006a6a0052", + 0, + 1186324483, + "2f9b7348600336512686e7271c53015d1cb096ab1a5e0bce49acd35bceb42bc8" + ], + [ + "11ce51f90164b4b54b9278f0337d95c50d16f6828fcb641df9c7a041a2b274aa70b1250f2b0000000008ab6a6a65006551524c9fe7f604af44be050000000005525365006521f79a0300000000015306bb4e04000000000265ac99611a05000000000765acab656500006dc866d0", + "", + 0, + -1710478768, + "cfa4b7573559b3b199478880c8013fa713ca81ca8754a3fd68a6d7ee6147dc5a" + ], + [ + "86bc233e02ba3c647e356558e7252481a7769491fb46e883dd547a4ce9898fc9a1ca1b77790000000006ab5351abab51f0c1d09c37696d5c7c257788f5dff5583f4700687bcb7d4acfb48521dc953659e325fa390300000003acac5280f29523027225af03000000000963abac0065ab65acab7e59d90400000000016549dac846", + "53006aac52acac", + 0, + 711159875, + "880330ccde00991503ea598a6dfd81135c6cda9d317820352781417f89134d85" + ], + [ + "beac155d03a853bf18cd5c490bb2a245b3b2a501a3ce5967945b0bf388fec2ba9f04c03d68030000000012fe96283aec4d3aafed8f888b0f1534bd903f9cd1af86a7e64006a2fa0d2d30711af770010000000163ffffffffd963a19d19a292104b9021c535d3e302925543fb3b5ed39fb2124ee23a9db00302000000056500ac63acffffffff01ad67f503000000000300ac5189f78db2", + "53536a636500", + 2, + 748992863, + "bde3dd0575164d7ece3b5783ce0783ffddb7df98f178fe6468683230314f285a" + ], + [ + "81dab34a039c9e225ba8ef421ec8e0e9d46b5172e892058a9ade579fe0eb239f7d9c97d45b0300000009ac65655351ab526363ffffffff10c0faaf7f597fc8b00bbc67c3fd4c6b70ca6b22718d15946bf6b032e62dae570000000005536a00ab6a02cddec3acf985bbe62c96fccf17012a87026ed63fc6756fa39e286eb4c2dd79b59d37400300000002516affffffff04f18b8d03000000000753abab5152636564411c02000000000400ab6300e965750300000000001bd2cf02000000000565ab526aab00000000", + "006551ab", + 0, + -1488174485, + "a3d65a8cd0c1eea8558d01396b929520a2221c29d9f25f29035b8abae874447f" + ], + [ + "489ebbf10478e260ba88c0168bd7509a651b36aaee983e400c7063da39c93bf28100011f280100000004abab63ab2fc856f05f59b257a4445253e0d91b6dffe32302d520ac8e7f6f2467f7f6b4b65f2f59e903000000096353abacab6351656affffffff0122d9480db6c45a2c6fd68b7bc57246edffbf6330c39ccd36aa3aa45ec108fc030000000265ab9a7e78a69aadd6b030b12602dff0739bbc346b466c7c0129b34f50ae1f61e634e11e9f3d0000000006516a53525100ffffffff011271070000000000086563ab6353536352c4dd0e2c", + "", + 0, + -293358504, + "4eba3055bc2b58765593ec6e11775cea4b6493d8f785e28d01e2d5470ea71575" + ], + [ + "6911195d04f449e8eade3bc49fd09b6fb4b7b7ec86529918b8593a9f6c34c2f2d301ec378b000000000263ab49162266af054643505b572c24ff6f8e4c920e601b23b3c42095881857d00caf56b28acd030000000565525200ac3ac4d24cb59ee8cfec0950312dcdcc14d1b360ab343e834004a5628d629642422f3c5acc02000000035100accf99b663e3c74787aba1272129a34130668a877cc6516bfb7574af9fa6d07f9b4197303400000000085351ab5152635252ffffffff042b3c95000000000000ff92330200000000046a5252ab884a2402000000000853530065520063000d78be03000000000953abab52ab53ac65aba72cb34b", + "6a", + 2, + -637739405, + "6b80d74eb0e7ee59d14f06f30ba7d72a48d3a8ff2d68d3b99e770dec23e9284f" + ], + [ + "746347cf03faa548f4c0b9d2bd96504d2e780292730f690bf0475b188493fb67ca58dcca4f0000000002005336e3521bfb94c254058e852a32fc4cf50d99f9cc7215f7c632b251922104f638aa0b9d080100000008656aac5351635251ffffffff4da22a678bb5bb3ad1a29f97f6f7e5b5de11bb80bcf2f7bb96b67b9f1ac44d09030000000365ababffffffff036f02b30000000000076353ab6aac63ac50b72a050000000002acaba8abf804000000000663006a6a6353797eb999", + "acac5100", + 1, + -1484493812, + "164c32a263f357e385bd744619b91c3f9e3ce6c256d6a827d6defcbdff38fa75" + ], + [ + "e17149010239dd33f847bf1f57896db60e955117d8cf013e7553fae6baa9acd3d0f1412ad90200000006516500516500cb7b32a8a67d58dddfb6ceb5897e75ef1c1ff812d8cd73875856487826dec4a4e2d2422a0100000004ac525365196dbb69039229270400000000070000535351636a8b7596020000000006ab51ac52655131e99d040000000003516551ee437f5c", + "ac656a53", + 1, + 1102662601, + "8858bb47a042243f369f27d9ab4a9cd6216adeac1c1ac413ed0890e46f23d3f3" + ], + [ + "144971940223597a2d1dec49c7d4ec557e4f4bd207428618bafa3c96c411752d494249e1fb0100000004526a5151ffffffff340a545b1080d4f7e2225ff1c9831f283a7d4ca4d3d0a29d12e07d86d6826f7f0200000003006553ffffffff03c36965000000000000dfa9af00000000000451636aac7f7d140300000000016300000000", + "", + 1, + -108117779, + "c84fcaf9d779df736a26cc3cabd04d0e61150d4d5472dd5358d6626e610be57f" + ], + [ + "b11b6752044e650b9c4744fb9c930819227d2ac4040d8c91a133080e090b042a142e93906e0000000003650053ffffffff6b9ce7e29550d3c1676b702e5e1537567354b002c8b7bb3d3535e63ad03b50ea01000000055100516300fffffffffcf7b252fea3ad5a108af3640a9bc2cd724a7a3ce22a760fba95496e88e2f2e801000000036a00ac7c58df5efba193d33d9549547f6ca839f93e14fa0e111f780c28c60cc938f785b363941b000000000863ab51516552ac5265e51fcd0308e9830400000000036a00abab72190300000000016a63d0710000000000050051ab6a6300000000", + "53005165ac51ab65", + 0, + 229563932, + "e562579d1a2b10d1c5e45c06513456002a6bec157d7eb42511d30b118103c052" + ], + [ + "2aee6b9a02172a8288e02fac654520c9dd9ab93cf514d73163701f4788b4caeeb9297d2e250300000004ab6363008fb36695528d7482710ea2926412f877a3b20acae31e9d3091406bfa6b62ebf9d9d2a6470100000009535165536a63520065ffffffff03f7b560050000000003acab6a9a8338050000000000206ce90000000000056552516a5100000000", + "5252", + 1, + -1102319963, + "fa4676c374ae3a417124b4c970d1ed3319dc3ac91fb36efca1aa9ed981a8aa1b" + ], + [ + "9554595203ad5d687f34474685425c1919e3d2cd05cf2dac89d5f33cd3963e5bb43f8706480100000000ffffffff9de2539c2fe3000d59afbd376cb46cefa8bd01dbc43938ff6089b63d68acdc2b02000000096553655251536a6500fffffffff9695e4016cd4dfeb5f7dadf00968e6a409ef048f81922cec231efed4ac78f5d010000000763abab6a5365006caaf0070162cc640200000000045163ab5100000000", + "", + 0, + -1105256289, + "e8e10ed162b1a43bfd23bd06b74a6c2f138b8dc1ab094ffb2fa11d5b22869bee" + ], + [ + "04f51f2a0484cba53d63de1cb0efdcb222999cdf2dd9d19b3542a896ca96e23a643dfc45f00200000007acac53510063002b091fd0bfc0cfb386edf7b9e694f1927d7a3cf4e1d2ce937c1e01610313729ef6419ae7030000000165a3372a913c59b8b3da458335dc1714805c0db98992fd0d93f16a7f28c55dc747fe66a5b503000000095351ab65ab52536351ffffffff5650b318b3e236802a4e41ed9bc0a19c32b7aa3f9b2cda1178f84499963a0cde000000000165ffffffff0383954f04000000000553ac536363a8fc90030000000000a2e315000000000005acab00ab5100000000", + "0053", + 2, + -1424653648, + "a5bc0356f56b2b41a2314ec05bee7b91ef57f1074bcd2efc4da442222269d1a3" + ], + [ + "5e4fab42024a27f0544fe11abc781f46596f75086730be9d16ce948b04cc36f86db7ad50fd01000000026a00613330f4916285b5305cc2d3de6f0293946aa6362fc087727e5203e558c676b314ef8dd401000000001af590d202ba496f040000000001009e3c9604000000000351ac51943d64d3", + "51acabab5100ab52", + 1, + -129301207, + "556c3f90aa81f9b4df5b92a23399fe6432cf8fecf7bba66fd8fdb0246440036c" + ], + [ + "a115284704b88b45a5f060af429a3a8eab10b26b7c15ed421258f5320fa22f4882817d6c2b0300000003005300ffffffff4162f4d738e973e5d26991452769b2e1be4b2b5b7e8cbeab79b9cf9df2882c040000000006636aac63ac5194abc8aa22f8ddc8a7ab102a58e39671683d1891799d19bd1308d24ea6d365e571172f1e030000000700515352515153ffffffff4da7ad75ce6d8541acbb0226e9818a1784e9c97c54b7d1ff82f791df1c6578f60000000000ffffffff01b1f265040000000009ab0051ac656a516a5300000000", + "51abab6352535265", + 0, + -1269106800, + "0ef7b6e87c782fa33fe109aab157a2d9cddc4472864f629510a1c92fa1fe7fc1" + ], + [ + "f3f771ae02939752bfe309d6c652c0d271b7cab14107e98032f269d92b2a8c8853ab057da8010000000563ab6a6365670c305c38f458e30a7c0ab45ee9abd9a8dc03bae1860f965ffced879cb2e5d0bb156821020000000153ffffffff025dc619050000000002ac51ec0d250100000000076a5200636a6363333aecd8", + "650053ac515100ab", + 1, + 1812404608, + "a7aa34bf8a5644f03c6dd8801f9b15ba2e07e07256dbf1e02dad59f0d3e17ea9" + ], + [ + "fd3e267203ae7d6d3975e738ca84f12540229bb237dd228d5f688e9d5ba53fce4302b0334d01000000026353ffffffff602a3ab75af7aa951d93093e345ef0037a2863f3f580a9b1a575fffe68e677450300000000239e476d1e8f81e8b6313880d8a49b27c1b00af467f29756e76f675f084a5676539636ab030000000765ab6351acac52d9217747044d773204000000000752ac51526353acc33e45050000000005516500005115d889040000000004ab5163510cbbbd0200000000016500000000", + "65ac526aac6a53ab52", + 2, + -886179388, + "bc46f3f83058ddf5bebd9e1f2c117a673847c4dc5e31cfb24bac91adf30877cf" + ], + [ + "f380ae23033646af5dfc186f6599098015139e961919aea28502ea2d69474413d94a555ea2000000000853635265abacac5314da394b99b07733341ddba9e86022637be3b76492992fb0f58f23c915098979250a96620300000003ab6300ffffffff4bb6d1c0a0d84eac7f770d3ad0fdc5369ae42a21bbe4c06e0b5060d5990776220300000000ffffffff0486fd70020000000007ac6500635252acf3fd72010000000005656a6a6551212de90500000000096365006a63635153000fa33100000000000600535151656300000000", + "ab52", + 2, + -740890152, + "f804fc4d81f039009ed1f2cccb5c91da797543f235ac71b214c20e763a6d86d7" + ], + [ + "5c45d09801bb4d8e7679d857b86b97697472d514f8b76d862460e7421e8617b15a2df217c6010000000863acacab6565006affffffff01156dbc03000000000952ac63516551ac6aac00000000", + "6aabac", + 0, + 1310125891, + "270445ab77258ced2e5e22a6d0d8c36ac7c30fff9beefa4b3e981867b03fa0ad" + ], + [ + "4ecc6bde030ca0f83c0ed3d4b777f94c0c88708c6c933fe1df6874f296d425cac95355c23d0000000006ac6a51536a52f286a0969d6170e20f2a8000193807f5bc556770e9d82341ef8e17b0035eace89c76edd50200000007ac65525100656affffffff5bade6e462fac1927f078d69d3a981f5b4c1e59311a38efcb9a910aa436afaa80000000007ac6a006352ab52ffffffff0331e58902000000000763ac53636352abb8b3ca000000000001637a1d26040000000009535263ac6a5352ab655ae34a39", + "6a65ab", + 2, + 2142728517, + "4a3415eb1677ae4e0c939644a4cfd5dc6299780b55cd0dc735967057b6b1526a" + ], + [ + "a59484b501eb50114be0fc79e72ab9bc9f4a5f7acdf274a56d6b68684eb68cf8b07ec5d1c2000000000765abab00ab00639e09aa940141e3530200000000046500ac6500000000", + "00516565ab", + 0, + -1561622405, + "d60bbadd2cc0674100baa08d0e0493ee4248f0304b3eb778da942041f503a896" + ], + [ + "53dc1a88046531c7b57a35f4d9adf101d068bf8d63fbbedaf4741dba8bc5e92c8725def571030000000453655251fcdf116a226b3ec240739c4c7493800e4edfe67275234e371a227721eac43d3d9ecaf1b50300000003ac0052ffffffff2c9279ffeea4718d167e9499bd067600715c14484e373ef93ae4a31d2f5671ab0000000009516553ac636a6a65001977752eeba95a8f16b88c571a459c2f2a204e23d48cc7090e4f4cc35846ca7fc0a455ce00000000055165ac0063188143f80205972902000000000765ac63ac516353c7b6a50000000000036a510000000000", + "655351536a", + 0, + 103806788, + "b276584d3514e5b4e058167c41dc02915b9d97f6795936a51f40e894ed8508bc" + ], + [ + "53f8959f01ddb36afdcd20167edcbb75a63d18654fdcf10bc0004c761ab450fe236d79cb2702000000065151650063653435003a033a5e34050000000009ac52516a630000516ab86db3030000000002006344ac090500000000046363ab00f3644537", + "5263abab63ac656353", + 0, + -218513553, + "f1f2a489682e42a6fc20025dfc89584d17f150b2d7ae3ddedd2bf43d5e24f37f" + ], + [ + "5a06cb4602dcfc85f49b8d14513f33c48f67146f2ee44959bbca092788e6823b2719f3160b0200000001ab3c013f2518035b9ea635f9a1c74ec1a3fb7496a160f46aae2e09bfc5cd5111a0f20969e003000000015158c89ab7049f20d6010000000008ac6a52abac53515349765e00000000000300ab638292630100000000045351ab0086da09010000000006656a6365525300000000", + "526a63", + 1, + 1502936586, + "bdfaff8a4e775379c5dc26e024968efa805f923de53fa8272dd53ec582afa0c5" + ], + [ + "ca9d84fa0129011e1bf27d7cb71819650b59fb292b053d625c6f02b0339249b498ff7fd4b601000000025352ffffffff032173a0040000000008525253abab5152639473bb030000000009005153526a53535151d085bd0000000000086a5365ab5165655300000000", + "005152ac51", + 0, + 580353445, + "c629d93b02037f40aa110e46d903edb34107f64806aa0c418d435926feef68b8" + ], + [ + "e3cdbfb4014d90ae6a4401e85f7ac717adc2c035858bf6ff48979dd399d155bce1f150daea0300000002ac51a67a0d39017f6c71040000000005535200535200000000", + "", + 0, + -1899950911, + "c1c7df8206e661d593f6455db1d61a364a249407f88e99ecad05346e495b38d7" + ], + [ + "b2b6b9ab0283d9d73eeae3d847f41439cd88279c166aa805e44f8243adeb3b09e584efb1df00000000026300ffffffff7dfe653bd67ca094f8dab51007c6adaced09de2af745e175b9714ca1f5c68d050000000003ac6500aa8e596903fd3f3204000000000553ac6a6a533a2e210500000000075253acabab526392d0ee020000000008520065635200ab5200000000", + "65acacac65005365", + 0, + 28298553, + "39c2aaa2496212b3ab120ab7d7f37c5e852bfe38d20f5226413a2268663eeae8" + ], + [ + "f30c5c3d01a6edb9e10fafaf7e85db14e7fec558b9dca4a80b05d7c3a2944d282c5018f4680200000003005263ffffffff04aac3530300000000026551bc2419010000000009005163acab6a5100658e7085050000000000c5e4ec050000000007656a6a635365ab2d8e8882", + "abac53ab005251ac52", + 0, + -490287546, + "877e347ec7487497769e2581142276d1a8d813b652e4483cf9cc993d16354417" + ], + [ + "4314339e01de40faabcb1b970245a7f19eedbc17c507dac86cf986c2973715035cf95736ae0200000007abababababab65bde67b900151510b04000000000853ac00655200535300000000", + "52", + 0, + 399070095, + "47585dc25469d04ff3a60939d0a03779e3e81a411bf0ca18b91bb925ebd30718" + ], + [ + "2d4cf4e9031b3e175b2ff18cd933151379d9cfac4713d8bd0e63b70bd4a92277aa7af901ab000000000565515353abffffffff557666c7f3be9cdecdad44c3df206eb63a2da4ed1f159d21193882a9f0340081020000000963ab53ab5252ac63abffffffff8a8c897bdb87e93886aad5ded9d82a13101d5476554386373646ca5e23612e450300000009006a526552abab6a635ac03fc00198bb02040000000009525100526a6563636a1d052834", + "ab52ac00acac6a", + 0, + -1469882480, + "09ed6563a454814ab7e3b4c28d56d8751162b77df1825b37ba66c6147750b2a3" + ], + [ + "f063171b03e1830fdc1d685a30a377537363ccafdc68b42bf2e3acb908dac61ee24b37595c020000000765ac5100ab6aacf447bc8e037b89d6cadd62d960cc442d5ced901d188867b5122b42a862929ce45e7b628d010000000253aba009a1ba42b00f1490b0b857052820976c675f335491cda838fb7934d5eea0257684a2a202000000001e83cf2401a7f777030000000008ab6553526a53526a00000000", + "", + 2, + 1984790332, + "c19caada8e71535e29a86fa29cfd9b74a0c7412003fc722a121005e461e01636" + ], + [ + "cf7bdc250249e22cbe23baf6b648328d31773ea0e771b3b76a48b4748d7fbd390e88a004d30000000003ac536a4ab8cce0e097136c90b2037f231b7fde2063017facd40ed4e5896da7ad00e9c71dd70ae600000000096a0063516352525365ffffffff01b71e3e00000000000300536a00000000", + "", + 1, + 546970113, + "6a815ba155270af102322c882f26d22da11c5330a751f520807936b320b9af5d" + ], + [ + "ac7a125a0269d35f5dbdab9948c48674616e7507413cd10e1acebeaf85b369cd8c88301b7c030000000963656aac6a530053abffffffffed94c39a582e1a46ce4c6bffda2ccdb16cda485f3a0d94b06206066da12aecfe010000000752abab63536363ef71dcfb02ee07fa0400000000016a6908c802000000000751656a6551abac688c2c2d", + "6a6351526551", + 0, + 858400684, + "552ff97d7924f51cda6d1b94be53483153ef725cc0a3a107adbef220c753f9a6" + ], + [ + "3a1f454a03a4591e46cf1f7605a3a130b631bf4dfd81bd2443dc4fac1e0a224e74112884fe0000000005516aac6a53a87e78b55548601ffc941f91d75eab263aa79cd498c88c37fdf275a64feff89fc1710efe03000000016a39d7ef6f2a52c00378b4f8f8301853b61c54792c0f1c4e2cd18a08cb97a7668caa008d970200000002656affffffff017642b20100000000096a63535253abac6a6528271998", + "51", + 2, + 1459585400, + "e9a7f21fc2d38be7be47095fbc8f1bf8923660aa4d71df6d797ae0ba5ca4d5b0" + ], + [ + "f59366cc0114c2a18e6bd1347ed9470f2522284e9e835dd5c5f7ef243639ebea95d9b232b6020000000153474b62eb045c00170500000000096352ab516352ab5200038a520400000000086aab5253656a63005b968904000000000963536353ac0053635387106002000000000000000000", + "ab52526300ab51", + 0, + 1834116153, + "cdf51f6e3a9dc2be5a59ea4c00f5aac1e1426a5202c325e6cf2567d07d8d8de4" + ], + [ + "6269e0fa0173e76e89657ca495913f1b86af5b8f1c1586bcd6c960aede9bc759718dfd5044000000000352ac530e2c7bd90219849b000000000007ab00ab6a53006319f281000000000007ab00515165ac5200000000", + "6a", + 0, + -2039568300, + "62094f98234a05bf1b9c7078c5275ed085656856fb5bdfd1b48090e86b53dd85" + ], + [ + "eb2bc00604815b9ced1c604960d54beea4a3a74b5c0035d4a8b6bfec5d0c9108f143c0e99a0000000000ffffffff22645b6e8da5f11d90e5130fd0a0df8cf79829b2647957471d881c2372c527d8010000000263acffffffff1179dbaf17404109f706ae27ad7ba61e860346f63f0c81cb235d2b05d14f2c1003000000025300264cb23aaffdc4d6fa8ec0bb94eff3a2e50a83418a8e9473a16aaa4ef8b855625ed77ef40100000003ac51acf8414ad404dd328901000000000652526500006ab6261c000000000002526a72a4c9020000000006ac526500656586d2e7000000000006656aac00ac5279cd8908", + "51", + 1, + -399279379, + "d37532e7b2b8e7db5c7c534197600397ebcc15a750e3af07a3e2d2e4f84b024f" + ], + [ + "dc9fe6a8038b84209bbdae5d848e8c040433237f415437592907aa798bf30d9dbbddf0ff85010000000153ffffffff23269a7ea29fcf788db483b8d4c4b35669e582608644259e950ce152b0fa6e050000000003acababffffffff65de94857897ae9ea3aa0b938ba6e5adf374d48469922d2b36dbb83d3b8c8261010000000452ac5200ffffffff02856e9b0300000000026a51980c8e02000000000365ab63d2648db4", + "00ab0051ac526565", + 2, + 1562581941, + "5cef9d8e18a2d5a70448f17b465d411a19dab78f0ddf1672ffd518b188f52433" + ], + [ + "eba8b0de04ac276293c272d0d3636e81400b1aaa60db5f11561480592f99e6f6fa13ad387002000000070053acab536563bebb23d66fd17d98271b182019864a90e60a54f5a615e40b643a54f8408fa8512cfac927030000000963ac6a6aabac65ababffffffff890a72192bc01255058314f376bab1dc72b5fea104c154a15d6faee75dfa5dba020000000100592b3559b0085387ac7575c05b29b1f35d9a2c26a0c27903cc0f43e7e6e37d5a60d8305a030000000252abffffffff0126518f05000000000000000000", + "005300635252635351", + 1, + 664344756, + "26dc2cba4bd5334e5c0b3a520b44cc1640c6b923d10e576062f1197171724097" + ], + [ + "91bd040802c92f6fe97411b159df2cd60fb9571764b001f31657f2d616964637605875c2a901000000055263006a65ffffffff3651df372645f50cf4e32fdf6e61c766e912e16335db2b40c5d52fe89eefe7cd00000000040065ab65ffffffff03ca8625030000000009ab51ac63530052ab52c6bf14020000000006ab00ab52005167d270000000000007ab53525351636a00000000", + "5151ab63005252ac", + 1, + 1983087664, + "3e5aa0200248d8d86ede3b315ca1b857018b89184a4bd023bd88ab12e499f6e1" + ], + [ + "185cda1a01ecf7a8a8c28466725b60431545fc7a3367ab68e34d486e8ea85ee3128e0d8384000000000465ac63abec88b7bb031c56eb04000000000965636a51005252006a7c78d5040000000007acac63abac51ac3024a40500000000086300526a51abac51464c0e8c", + "0065535265515352", + 0, + 1594558917, + "b5280b9610c0625a65b36a8c2402a95019a7bbb9dd3de77f7c3cb1d82c3263ba" + ], + [ + "a9531f07034091668b65fea8b1a79700d586ac9e2f42ca0455a26abe41f9e1805d009a0f5702000000096365516365ac5263ab3619bac643a9e28ee47855118cf80c3a74531cdf198835d206d0fe41804e325a4f9f105e03000000016a58e3ab0d46375d98994daf0fa7c600d2bb4669e726fca0e3a3f21ea0d9e777396740328f0100000008636a5363ab526a538d3ea7700304cb66030000000007515163ab52ab510184030500000000085353636565ac0051d9cff402000000000751ab52ab5352abf0e36254", + "ab5353ac5365acab", + 2, + 1633101834, + "04c9ef72f33668ca449c0415becf62cc0b8e0c75f9c8813852d42a58acf107c8" + ], + [ + "6b5ecc7903fe0ba37ea551df92a59e12bad0a3065846ba69179a8f4a741a2b4fcf679aac810200000004535263529a3d343293b99ab425e7ef8529549d84f480bcd92472bab972ea380a302128ae14dfcd0200000000025163ffffffff24636e4545cab9bf87009119b7fc3ec4d5ee9e206b90f35d1df8a563b6cd097a010000000852abac53005153abc64467860406e832020000000009526300006a53ac6352ac1395010000000002ac53b117f300000000000863655351acab00651edf02030000000008ab51ac6353535252628ef71d", + "ab63ab6a52ac526563", + 2, + -1559697626, + "8f07ece7d65e509f1e0780584ef8d271c1c61a13b10335d5faafc7afc8b5b8ec" + ], + [ + "92c9fb780138abc472e589d5b59489303f234acc838ca66ffcdf0164517a8679bb622a4267020000000153468e373d04de03fa020000000009ac006a5265ab5163006af649050000000007515153006a00658ceb59030000000001ac36afa0020000000009ab53006351ab51000000000000", + "6a", + 0, + 2059357502, + "e2358dfb51831ee81d7b0bc602a65287d6cd2dbfacf55106e2bf597e22a4b573" + ], + [ + "6f62138301436f33a00b84a26a0457ccbfc0f82403288b9cbae39986b34357cb2ff9b889b302000000045253655335a7ff6701bac9960400000000086552ab656352635200000000", + "6aac51", + 0, + 1444414211, + "502a2435fd02898d2ff3ab08a3c19078414b32ec9b73d64a944834efc9dae10c" + ], + [ + "9981143a040a88c2484ac3abe053849e72d04862120f424f373753161997dd40505dcb4783030000000700536365536565a2e10da3f4b1c1ad049d97b33f0ae0ea48c5d7c30cc8810e144ad93be97789706a5ead180100000003636a00ffffffffbdcbac84c4bcc87f03d0ad83fbe13b369d7e42ddb3aecf40870a37e814ad8bb5010000000963536a5100636a53abffffffff883609905a80e34202101544f69b58a0b4576fb7391e12a769f890eef90ffb72020000000651656352526affffffff04243660000000000004ab5352534a9ce001000000000863656363ab6a53652df19d030000000003ac65acedc51700000000000000000000", + "ac6300acac", + 2, + 293672388, + "7ba99b289c04718a7283f150d831175ed6303081e191a0608ea81f78926c5bdf" + ], + [ + "a2bb630b01989bc5d643f2da4fb9b55c0cdf846ba06d1dbe372893024dbbe5b9b8a1900af802000000055265ac63aca7a68d2f04916c74010000000003abac007077f0040000000001007d4127010000000005ac516aac000f31e8030000000000571079c9", + "65ab0051ac", + 0, + -1103627693, + "92d53b4390262e6b288e8a32e0cfc36cd5adfdfabfe96c7bfd4a19d65e233761" + ], + [ + "49f7d0b6037bba276e910ad3cd74966c7b3bc197ffbcfefd6108d6587006947e97789835ea0300000008526a52006a650053ffffffff8d7b6c07cd10f4c4010eac7946f61aff7fb5f3920bdf3467e939e58a1d4100ab03000000076aac63ac535351ffffffff8f48c3ba2d52ad67fbcdc90d8778f3c8a3894e3c35b9730562d7176b81af23c80100000003ab5265ffffffff0301e3ef0300000000046a525353e899ac0500000000075153ab6a65abac259bea0400000000007b739972", + "53516aacac6aac", + 1, + 955403557, + "5d366a7f4346ae18aeb7c9fc4dab5af71173184aa20ed22fcb4ea8511ad25449" + ], + [ + "58a4fed801fbd8d92db9dfcb2e26b6ff10b120204243fee954d7dcb3b4b9b53380e7bb8fb60100000003006351ffffffff02a0795b050000000006536351ac6aac2718d00200000000075151acabac515354d21ba1", + "005363515351", + 0, + -1322430665, + "bbee941bbad950424bf40e3623457db47f60ed29deaa43c99dec702317cb3326" + ], + [ + "32765a0b02e455793d9ce530e9f6a44bcbc612e893a875b5da61d822dc56d8245166c398b403000000085353abac6300006a6bdee2a78d0d0b6a5ea666eed70b9bfea99d1d612ba3878f615c4da10d4a521cba27155002000000035363abffffffff043cd42401000000000551656a53653685320100000000030000511881bc0500000000065165abab636a20169f010000000007acab656aac63acdb0706a8", + "65ac53ab53", + 0, + 1936499176, + "5c5a9c3a5de7dc7a82bc171c9d3505913b8bcc450bc8b2d11772c1a1d781210b" + ], + [ + "17fad0d303da0d764fedf9f2887a91ea625331b28704940f41e39adf3903d8e75683ef6d46020000000151ffffffffff376eea4e880bcf0f03d33999104aafed2b3daf4907950bb06496af6b51720a020000000900636a63525253525196521684f3b08497bad2c660b00b43a6a517edc58217876eb5e478aa3b5fda0f29ee1bea00000000046aacab6affffffff03dde8e2050000000007ac5365ac51516a14772e000000000005630000abacbbb360010000000006ab5251ab656a50f180f0", + "0053", + 0, + -1043701251, + "a3bdf8771c8990971bff9b4e7d59b7829b067ed0b8d3ac1ec203429811384668" + ], + [ + "236c32850300045e292c84ede2b9ab5733ba08315a2bb09ab234c4b4e8894808edbdac0d3b020000000653635363abacffffffffd3f696bb31fdd18a72f3fc2bb9ae54b416a253fc37c1a0f0180b52d35bad49440100000004650053abffffffffa85c75a2406d82a93b12e555b66641c1896a4e83ae41ef1038218311e38ace060200000006abab006a51ac104b5e6701e2842c04000000000800630051ac0000ab00000000", + "ab63ac6a516a", + 1, + -1709887524, + "8c29ea8ef60c5a927fccdba8ea385db6b6b84d98e891db45f5d4ee3148d3f5a7" + ], + [ + "b78d5fd601345f3100af494cdf447e7d4076179f940035b0ebe8962587d4d0c9c6c9fc34ee0300000003516a6affffffff03dc5c890100000000085353ac53ac6a52534ac941040000000007ac63656a51ab51d4266b0100000000036aacac70731f2d", + "005351ab0053", + 0, + -1789071265, + "d5f1c1cb35956a5711d67bfb4cedbc67e77c089b912d688ad440ff735adb390d" + ], + [ + "5a2257df03554550b774e677f348939b37f8e765a212e566ce6b60b4ea8fed4c9504b7f7d1000000000653655265ab5258b67bb931df15b041177cf9599b0604160b79e30f3d7a594e7826bae2c29700f6d8f8f40300000005515300ac6a159cf8808a41f504eb5c2e0e8a9279f3801a5b5d7bc6a70515fbf1c5edc875bb4c9ffac500000000050063510052ffffffff0422a90105000000000965006a650000516a006417d2020000000006526363ab00524d969d0100000000035153acc4f077040000000005ac5200636500000000", + "6a52", + 1, + -1482463464, + "37b794b05d0687c9b93d5917ab068f6b2f0e38406ff04e7154d104fc1fb14cdc" + ], + [ + "e0032ad601269154b3fa72d3888a3151da0aed32fb2e1a15b3ae7bee57c3ddcffff76a1321010000000100110d93ae03f5bd080100000000075263516a6551002871e60100000000046a005252eaa753040000000004ab6aab526e325c71", + "630052", + 0, + -1857873018, + "ea117348e94de86381bb8ad1c7f93b8c623f0272104341701bb54e6cb433596c" + ], + [ + "014b2a5304d46764817aca180dca50f5ab25f2e0d5749f21bb74a2f8bf6b8b7b3fa8189cb7030000000965ac5165ab6a51ac6360ecd91e8abc7e700a4c36c1a708a494c94bb20cbe695c408543146566ab22be43beae9103000000045163ab00ffffffffffa48066012829629a9ec06ccd4905a05df0e2b745b966f6a269c9c8e13451fc00000000026565ffffffffc40ccadc21e65fe8a4b1e072f4994738ccaf4881ae6fede2a2844d7da4d199ab02000000065152ab536aabffffffff01b6e054030000000004515352ab3e063432", + "", + 0, + 1056459916, + "a7aff48f3b8aeb7a4bfe2e6017c80a84168487a69b69e46681e0d0d8e63a84b6" + ], + [ + "c4ef04c103c5dde65410fced19bf6a569549ecf01ceb0db4867db11f2a3a3eef0320c9e8e001000000085100536a53516aabffffffff2a0354fa5bd96f1e28835ffe30f52e19bd7d5150c687d255021a6bec03cf4cfd03000000056a006300514900c5b01d3d4ae1b97370ff1155b9dd0510e198d266c356d6168109c54c11b4c283dca00300000002ababffffffff02e19e3003000000000451655351fa5c0003000000000163ef1fc64b", + "51636a51ab630065", + 1, + -1754709177, + "0a281172d306b6a32e166e6fb2a2cc52c505c5d60ea448e9ba7029aa0a2211e1" + ], + [ + "29083fe00398bd2bb76ceb178f22c51b49b5c029336a51357442ed1bac35b67e1ae6fdf13100000000066a6500acab51ffffffffe4ca45c9dc84fd2c9c47c7281575c2ba4bf33b0b45c7eca8a2a483f9e3ebe4b3010000000200abffffffffdf47ad2b8c263fafb1e3908158b18146357c3a6e0832f718cd464518a219d18303000000096352ac656351ac0052daddfb3b0231c36f00000000000400526a5275c7e0020000000001ab00000000", + "acab536aac52", + 2, + 300802386, + "82ebc07b16cff0077e9c1a279373185b3494e39d08fd3194aae6a4a019377509" + ], + [ + "1201ab5d04f89f07c0077abd009762e59db4bb0d86048383ba9e1dad2c9c2ad96ef660e6d00200000007ab6a65ac5200652466fa5143ab13d55886b6cdc3d0f226f47ec1c3020c1c6e32602cd3428aceab544ef43e00000000086a6a6a526a6a5263ffffffffd5be0b0be13ab75001243749c839d779716f46687e2e9978bd6c9e2fe457ee48020000000365abab1e1bac0f72005cf638f71a3df2e3bbc0fa35bf00f32d9c7dc9c39a5e8909f7d53170c8ae0200000008ab6a51516363516affffffff02f0a6210500000000036300ac867356010000000009acab65ac6353536a659356d367", + "ac53535252", + 0, + 917543338, + "418acc156c2bc76a5d7baa58db29f1b4cf6c266c9222ed167ef5b4d47f0e0f41" + ], + [ + "344fa11e01c19c4dd232c77742f0dd0aeb3695f18f76da627628741d0ee362b0ea1fb3a2180200000007635151005100529bab25af01937c1f0500000000055153ab53656e7630af", + "6351005163ac51", + 0, + -629732125, + "228ca52a0a376fe0527a61cfa8da6d7baf87486bba92d49dfd3899cac8a1034f" + ], + [ + "b2fda1950191358a2b855f5626a0ebc830ab625bea7480f09f9cd3b388102e35c0f303124c030000000565ac65ab53ffffffff03f9c5ec04000000000765ab51516551650e2b9f0500000000045365525284e8f6040000000001ac00000000", + "ac51655253", + 0, + 1433027632, + "d2fa7e13c34cecda5105156bd2424c9b84ee0a07162642b0706f83243ff811a8" + ], + [ + "a4a6bbd201aa5d882957ac94f2c74d4747ae32d69fdc765add4acc2b68abd1bdb8ee333d6e0300000008516a6552515152abffffffff02c353cb040000000007ac6351ab51536588bd320500000000066552525253ac00000000", + "", + 0, + 1702060459, + "499da7d74032388f820645191ac3c8d20f9dba8e8ded7fa3a5401ea2942392a1" + ], + [ + "584e8d6c035a6b2f9dac2791b980a485994bf38e876d9dda9b77ad156eee02fa39e19224a60300000003ab636529db326cc8686a339b79ab6b6e82794a18e0aabc19d9ad13f31dee9d7aad8eff38288588020000000452530052ffffffff09a41f07755c16cea1c7e193c765807d18cadddca6ec1c2ed7f5dcdca99e90e80000000001acffffffff01cba62305000000000451ac63acccdf1f67", + "ab536a6363", + 2, + -27393461, + "1125645b49202dca2df2d76dae51877387903a096a9d3f66b5ac80e042c95788" + ], + [ + "83a583d204d926f2ee587a83dd526cf1e25a44bb668e45370798f91a2907d184f7cddcbbc7030000000700ab6565536a539f71d3776300dffdfa0cdd1c3784c9a1f773e34041ca400193612341a9c42df64e3f550e01000000050052515251ffffffff52dab2034ab0648553a1bb8fc4e924b2c89ed97c18dfc8a63e248b454035564b01000000015139ab54708c7d4d2c2886290f08a5221cf69592a810fd1979d7b63d35c271961e710424fd0300000005ac65ac5251ffffffff01168f7c030000000000a85e5fb0", + "6a536353656a00", + 0, + 179595345, + "5350a31ac954a0b49931239d0ecafbf34d035a537fd0c545816b8fdc355e9961" + ], + [ + "ffd35d51042f290108fcb6ea49a560ba0a6560f9181da7453a55dfdbdfe672dc800b39e7320200000006630065516a65f2166db2e3827f44457e86dddfd27a8af3a19074e216348daa0204717d61825f198ec0030100000006ab51abab00abffffffffdf41807adb7dff7db9f14d95fd6dc4e65f8402c002d009a3f1ddedf6f4895fc8030000000500ab006a65a5a848345052f860620abd5fcd074195548ce3bd0839fa9ad8642ed80627bf43a0d47dbd010000000765ab006a656a53b38cdd6502a186da05000000000765ab00ab006a53527c0e0100000000085365ab51acacac52534bd1b1", + "6a635253ac0000", + 0, + 1095082149, + "3c05473a816621a3613f0e903faa1a1e44891dd40862b029e41fc520776350fa" + ], + [ + "6c9a4b98013c8f1cae1b1df9f0f2de518d0c50206a0ab871603ac682155504c0e0ce946f460100000000ffffffff04e9266305000000000753535100ac6aacded39e04000000000365ac6ab93ccd010000000002515397bf3d050000000003ab636300000000", + "63520052ac656353", + 0, + -352633155, + "936eff8cdfd771be24124da87c7b24feb48da7cbc2c25fb5ba13d1a23255d902" + ], + [ + "e01dc7f0021dc07928906b2946ca3e9ac95f14ad4026887101e2d722c26982c27dc2b59fdb0000000005ac5200516ab5a31ffadcbe74957a5a3f97d7f1475cc6423fc6dbc4f96471bd44c70cc736e7dec0d1ea020000000951636a526a52abac53ffffffff04bc2edd05000000000252ab528c7b02000000000952ac51526500525353324820040000000002005380c713000000000009630065ab00ac525252451bbb48", + "53ab65ac", + 0, + -552384418, + "69c0b30f4c630a6c878fde6ea6b74dae94f4eb3bcfbde2dc3649e1a9ada00757" + ], + [ + "009046a1023f266d0113556d604931374d7932b4d6a7952d08fbd9c9b87cbd83f4f4c178b4030000000452ac526346e73b438c4516c60edd5488023131f07acb5f9ea1540b3e84de92f4e3c432289781ea4900000000046500655357dfd6da02baef910100000000026a007d101703000000000800516500abacac5100000000", + "6aab6553ac", + 0, + -802456605, + "f8757fbb4448ca34e0cd41b997685b37238d331e70316659a9cc9087d116169d" + ], + [ + "df76ec0801a3fcf3d18862c5f686b878266dd5083f16cf655facab888b4cb3123b3ce5db7e01000000010010e7ac6a0233c83803000000000365ac51faf14a040000000004ac51655100000000", + "6353acab", + 0, + 15705861, + "e7d873aa079a19ec712b269a37d2670f60d8cb334c4f97e2e3fd10eeb8ee5f5e" + ], + [ + "828fd3e0031084051ccef9cfdd97fae4d9cc50c0dae36bd22a3ff332881f17e9756c3e288e0200000004ab535363961a2ccccaf0218ec6a16ba0c1d8b5e93cfd025c95b6e72bc629ec0a3f47da7a4c396dad01000000025353ffffffff19ad28747fb32b4caf7b5dbd9b2da5a264bedb6c86d3a4805cd294ae53a86ac40200000009ab53535351ab6551abffffffff04a41650030000000005656aab6aab8331a304000000000700516365ac516a0d2a47010000000007abac516353abacdebc19040000000006ab5300636a6300000000", + "51ab52ab53ac52", + 0, + 1866105980, + "311094b4d73e31aefc77e97859ef07ca2f07a7b7e4d7def80c69d3f5d58527e5" + ], + [ + "c4b80f850323022205b3e1582f1ed097911a81be593471a8dce93d5c3a7bded92ef6c7c1260100000002006affffffff70294d62f37c3da7c5eae5d67dce6e1b28fedd7316d03f4f48e1829f78a88ae801000000096a5200530000516351f6b7b544f7c39189d3a2106ca58ce4130605328ce7795204be592a90acd81bef517d6f170200000000ffffffff012ab8080000000000075100006365006335454c1e", + "53ac6a536aacac", + 0, + -1124103895, + "06277201504e6bf8b8c94136fad81b6e3dadacb9d4a2c21a8e10017bfa929e0e" + ], + [ + "8ab69ed50351b47b6e04ac05e12320984a63801716739ed7a940b3429c9c9fed44d3398ad40300000006536a516a52638171ef3a46a2adb8025a4884b453889bc457d63499971307a7e834b0e76eec69c943038a0300000000ffffffff566bb96f94904ed8d43d9d44a4a6301073cef2c011bf5a12a89bedbaa03e4724030000000265acb606affd01edea38050000000008515252516aacac6300000000", + "65000000006365ac53", + 0, + -1338942849, + "7912573937824058103cb921a59a7f910a854bf2682f4116a393a2045045a8c3" + ], + [ + "2484991e047f1cf3cfe38eab071f915fe86ebd45d111463b315217bf9481daf0e0d10902a402000000006e71a424eb1347ffa638363604c0d5eccbc90447ff371e000bf52fc743ec832851bb564a0100000001abffffffffef7d014fad3ae7927948edbbb3afe247c1bcbe7c4c8f5d6cf97c799696412612020000000851536a5353006a001dfee0d7a0dd46ada63b925709e141863f7338f34f7aebde85d39268ae21b77c3068c01d0000000008535151ab00636563ffffffff018478070200000000095200635365ac52ab5341b08cd3", + "", + 3, + 265623923, + "24cb420a53b4f8bb477f7cbb293caabfd2fc47cc400ce37dbbab07f92d3a9575" + ], + [ + "54839ef9026f65db30fc9cfcb71f5f84d7bb3c48731ab9d63351a1b3c7bc1e7da22bbd508e0300000000442ad138f170e446d427d1f64040016032f36d8325c3b2f7a4078766bdd8fb106e52e8d20000000003656500ffffffff02219aa101000000000851ababac52ab00659646bd02000000000552acacabac24c394a5", + "ac", + 0, + 906807497, + "69264faadcd1a581f7000570a239a0a26b82f2ad40374c5b9c1f58730514de96" + ], + [ + "5036d7080434eb4eef93efda86b9131b0b4c6a0c421e1e5feb099a28ff9dd8477728639f77030000000951516aab535152ab5391429be9cce85d9f3d358c5605cf8c3666f034af42740e94d495e28b9aaa1001ba0c87580300000008006552ab00ab006affffffffd838978e10c0c78f1cd0a0830d6815f38cdcc631408649c32a25170099669daa0000000002acab8984227e804ad268b5b367285edcdf102d382d027789250a2c0641892b480c21bf84e3fb0100000000b518041e023d8653010000000001004040fb0100000000080051ac5200636a6300000000", + "52ac", + 0, + 366357656, + "bd0e88829afa6bdc1e192bb8b2d9d14db69298a4d81d464cbd34df0302c634c6" + ], + [ + "9ad5ccf503fa4facf6a27b538bc910cce83c118d6dfd82f3fb1b8ae364a1aff4dcefabd38f03000000096365655263ac655300807c48130c5937190a996105a69a8eba585e0bd32fadfc57d24029cbed6446d30ebc1f100100000004000053650f0ccfca1356768df7f9210cbf078a53c72e0712736d9a7a238e0115faac0ca383f219d0010000000600ab536552002799982b0221b8280000000000000c41320000000000086552ac6365636a6595f233a3", + "6a5152", + 2, + 553208588, + "f99c29a79f1d73d2a69c59abbb5798e987639e36d4c44125d8dc78a94ddcfb13" + ], + [ + "669538a204047214ce058aed6a07ca5ad4866c821c41ac1642c7d63ed0054f84677077a84f030000000853abacab6a655353ffffffff70c2a071c115282924e3cb678b13800c1d29b6a028b3c989a598c491bc7c76c5030000000752ac52ac5163ac80420e8a6e43d39af0163271580df6b936237f15de998e9589ec39fe717553d415ac02a4030000000463635153184ad8a5a4e69a8969f71288c331aff3c2b7d1b677d2ebafad47234840454b624bf7ac1d03000000056a63abab63df38c24a02fbc63a040000000002ab535ec3dc050000000002536500000000", + "635153", + 3, + -190399351, + "9615541884dfb1feeb08073a6a6aa73ef694bc5076e52187fdf4138a369f94d9" + ], + [ + "a7f139e502af5894be88158853b7cbea49ba08417fbbca876ca6614b5a41432be34499987b000000000765635165abac63ffffffff8b8d70e96c7f54eb70da0229b548ced438e1ca2ba5ddd648a027f72277ee1efc0100000001abffffffff044f2c4204000000000165e93f550100000000050000526a6a94550304000000000365536aadc21c0300000000016300000000", + "6aacac6363ab5265ac", + 1, + 2143189425, + "6e3f97955490d93d6a107c18d7fe402f1cada79993bb0ff0d096357261b3a724" + ], + [ + "3b94438f0366f9f53579a9989b86a95d134256ce271da63ca7cd16f7dd5e4bffa17d35133f010000000100ffffffff1aaad0c721e06ec00d07e61a84fb6dc840b9a968002ce7e142f943f06fd143a10100000008535151ac51ab0053b68b8e9c672daf66041332163e04db3f6048534bd718e1940b3fc3811c4eef5b7a56888b01000000001d58e38c012e38e700000000000852ab53ac6365536a00000000", + "ab655352", + 1, + -935223304, + "b3b336de141d4f071313a2207b2a0c7cf54a070dd8d234a511b7f1d13e23b0c4" + ], + [ + "e5dca8a20456de0a67e185fa6ea94085ceae478d2c15c73cb931a500db3a1b6735dd1649ec0200000005ab536aabab32d11bbdcb81361202681df06a6b824b12b5cb40bb1a672cf9af8f2a836e4d95b7839327030000000951005365ab65abacabb345085932939eef0c724adef8a57f9e1bf5813852d957c039b6a12d9c2f201ea520fb030000000009ac5352005165acac6a5efc6072f1a421dc7dc714fc6368f6d763a5d76d0278b95fc0503b9268ccfadb48213a2500000000026a53ffffffff039ee1c4020000000009ac5353ab6353535163184018000000000005655265526a9a4a8a050000000001ac00000000", + "65ab53ab6a00ab6553", + 2, + 1902561212, + "7928ae8e86c0b0cad1b2c120ea313087437974382ee6d46443ca5ac3f5878b88" + ], + [ + "972128b904e7b673517e96e98d80c0c8ceceae76e2f5c126d63da77ffd7893fb53308bb2da0300000006ac6552ab52acffffffff4cac767c797d297c079a93d06dc8569f016b4bf7a7d79b605c526e1d36a40e2202000000095365ab636aac6a6a6a69928d2eddc836133a690cfb72ec2d3115bf50fb3b0d10708fa5d2ebb09b4810c426a1db01000000060052526300001e8e89585da7e77b2dd2e30625887f0660accdf29e53a614d23cf698e6fc8ab03310e87700000000076a520051acac6555231ddb0330ec2d03000000000200abfaf457040000000004ab6a6352bdc42400000000000153d6dd2f04", + "", + 0, + 209234698, + "4a92fec1eb03f5bd754ee9bfd70707dc4420cc13737374f4675f48529be518e4" + ], + [ + "1fb4085b022c6cfb848f8af7ba3ba8d21bd23ffa9f0bfd181cb68bcaaf2074e66d4974a31602000000090000006a6a6500acab6c12c07d9f3dbd2d93295c3a49e3757119767097e7fd5371f7d1ba9ba32f1a67a5a426f00000000000ffffffff018fd2fc04000000000363ac5100000000", + "65ab006a6aab526a", + 0, + 1431502299, + "8b7dd0ff12ca0d8f4dbf9abf0abba00e897c2f6fd3b92c79f5f6a534e0b33b32" + ], + [ + "5374f0c603d727f63006078bd6c3dce48bd5d0a4b6ea00a47e5832292d86af258ea0825c260000000009655353636352526a6af2221067297d42a9f8933dfe07f61a574048ff9d3a44a3535cd8eb7de79fb7c45b6f47320200000003ac006affffffff153d917c447d367e75693c5591e0abf4c94bbdd88a98ab8ad7f75bfe69a08c470200000005ac65516365ffffffff037b5b7b000000000001515dc4d904000000000004bb26010000000004536a6aac00000000", + "516552516352ac", + 2, + 328538756, + "8bb7a0129eaf4b8fc23e911c531b9b7637a21ab11a246352c6c053ff6e93fcb6" + ], + [ + "c441132102cc82101b6f31c1025066ab089f28108c95f18fa67db179610247086350c163bd010000000651525263ab00ffffffff9b8d56b1f16746f075249b215bdb3516cbbe190fef6292c75b1ad8a8988897c3000000000751ab6553abab00ffffffff02f9078b000000000009ab0053ac51ac00ab51c0422105000000000651006563525200000000", + "ac51", + 0, + -197051790, + "55acd8293ed0be6792150a3d7ced6c5ccd153ca7daf09cee035c1b0dac92bb96" + ], + [ + "ab82ad3b04545bd86b3bb937eb1af304d3ef1a6d1343ed809b4346cafb79b7297c09e1648202000000086351ac5200535353ffffffff95d32795bbaaf5977a81c2128a9ec0b3c7551b9b1c3d952876fcb423b2dfb9e80000000005515363acac47a7d050ec1a603627ce6cd606b3af314fa7964abcc579d92e19c7aba00cf6c3090d6d4601000000056a516551633e794768bfe39277ebc0db18b5afb5f0c8117dde9b4dfd5697e9027210eca76a9be20d63000000000700520063ab6aacffffffff01ec2ddc050000000008ac52ac65ac65ac5100000000", + "536300abab", + 1, + -2070209841, + "b362da5634f20be7267de78b545d81773d711b82fe9310f23cd0414a8280801d" + ], + [ + "8bff9d170419fa6d556c65fa227a185fe066efc1decf8a1c490bc5cbb9f742d68da2ab7f320100000007ab000053525365a7a43a80ab9593b9e8b6130a7849603b14b5c9397a190008d89d362250c3a2257504eb810200000007acabacac00ab51ee141be418f003e75b127fd3883dbf4e8c3f6cd05ca4afcaac52edd25dd3027ae70a62a00000000008ac52526a5200536affffffffb8058f4e1d7f220a1d1fa17e96d81dfb9a304a2de4e004250c9a576963a586ae0300000005abacac5363b9bc856c039c01d804000000000951656aac53005365acb0724e00000000000565abab63acea7c7a0000000000036a00ac00000000", + "6565", + 1, + -1349282084, + "2b822737c2affeefae13451d7c9db22ff98e06490005aba57013f6b9bbc97250" + ], + [ + "0e1633b4041c50f656e882a53fde964e7f0c853b0ada0964fc89ae124a2b7ffc5bc97ea6230100000006ac6aacacabacffffffff2e35f4dfcad2d53ea1c8ada8041d13ea6c65880860d96a14835b025f76b1fbd9000000000351515121270867ef6bf63a91adbaf790a43465c61a096acc5a776b8e5215d4e5cd1492e611f761000000000600ac6aab5265ffffffff63b5fc39bcac83ca80ac36124abafc5caee608f9f63a12479b68473bd4bae769000000000965ac52acac5263acabffffffff0163153e020000000008ab005165ab65515300000000", + "6a6aac00", + 0, + -968477862, + "20732d5073805419f275c53784e78db45e53332ee618a9fcf60a3417a6e2ca69" + ], + [ + "2b052c24022369e956a8d318e38780ef73b487ba6a8f674a56bdb80a9a63634c6110fb5154010000000251acffffffff48fe138fb7fdaa014d67044bc05940f4127e70c113c6744fbd13f8d51d45143e01000000005710db3804e01aa9030000000008acac6a516a5152abfd55aa01000000000751ab510000ac636d6026010000000000b97da9000000000000fddf3b53", + "006552", + 0, + 595461670, + "685d67d84755906d67a007a7d4fa311519467b9bdc6a351913246a41e082a29f" + ], + [ + "073bc856015245f03b2ea2da62ccedc44ecb99e4250c7042f596bcb23b294c9dc92cfceb6b02000000095163abab52abab636afe292fb303b7c3f001000000000352636af3c49502000000000400ac6a535851850100000000066aac6553ab6500000000", + "ab6aab53006aab52", + 0, + 247114317, + "123916c6485cf23bfea95654a8815fbf04ce4d21a3b7f862805c241472906658" + ], + [ + "7888b71403f6d522e414d4ca2e12786247acf3e78f1918f6d727d081a79813d129ee8befce0100000009ab516a6353ab6365abffffffff4a882791bf6400fda7a8209fb2c83c6eef51831bdf0f5dacde648859090797ec030000000153ffffffffbb08957d59fa15303b681bad19ccf670d7d913697a2f4f51584bf85fcf91f1f30200000008526565ac52ac63acffffffff0227c0e8050000000001ac361dc801000000000800515165ab00ab0000000000", + "656a", + 2, + 1869281295, + "f43378a0b7822ad672773944884e866d7a46579ee34f9afc17b20afc1f6cf197" + ], + [ + "cc4dda57047bd0ca6806243a6a4b108f7ced43d8042a1acaa28083c9160911cf47eab910c40200000007526a0000ab6a63e4154e581fcf52567836c9a455e8b41b162a78c85906ccc1c2b2b300b4c69caaaa2ba0230300000008ab5152ac5100ab65ffffffff69696b523ed4bd41ecd4d65b4af73c9cf77edf0e066138712a8e60a04614ea1c0300000004ab6a000016c9045c7df7836e05ac4b2e397e2dd72a5708f4a8bf6d2bc36adc5af3cacefcf074b8b403000000065352ac5252acffffffff01d7e380050000000000cf4e699a", + "525163656351", + 1, + -776533694, + "ff18c5bffd086e00917c2234f880034d24e7ea2d1e1933a28973d134ca9e35d2" + ], + [ + "b7877f82019c832707a60cf14fba44cfa254d787501fdd676bd58c744f6e951dbba0b3b77f0200000009ac515263ac53525300a5a36e500148f89c0500000000085265ac6a6a65acab00000000", + "6563", + 0, + -1785108415, + "cb6e4322955af12eb29613c70e1a00ddbb559c887ba844df0bcdebed736dffbd" + ], + [ + "aeb14046045a28cc59f244c2347134d3434faaf980961019a084f7547218785a2bd03916f3000000000165f852e6104304955bda5fa0b75826ee176211acc4a78209816bbb4419feff984377b2352200000000003a94a5032df1e0d60390715b4b188c330e4bb7b995f07cdef11ced9d17ee0f60bb7ffc8e0100000002516513e343a5c1dc1c80cd4561e9dddad22391a2dbf9c8d2b6048e519343ca1925a9c6f0800a020000000665516365ac513180144a0290db27000000000006ab655151ab5138b187010000000007ab5363abac516a9e5cd98a", + "53ac", + 0, + 478591320, + "e8d89a302ae626898d4775d103867a8d9e81f4fd387af07212adab99946311ef" + ], + [ + "c9270fe004c7911b791a00999d108ce42f9f1b19ec59143f7b7b04a67400888808487bd59103000000066a0052ac6565b905e76687be2dd7723b22c5e8269bc0f2000a332a289cfc40bc0d617cfe3214a61a85a30300000007ac63ac00635251560871209f21eb0268f175b8b4a06edd0b04162a974cf8b5dada43e499a1f22380d35ede0300000000792213fc58b6342cc8100079f9f5f046fb89f2d92cf0a2cb6d07304d32d9da858757037c0000000008abab51636565516affffffff02c72a8b03000000000452acac530dfb9f05000000000096f94307", + "5253ab536351", + 3, + 543688436, + "0278adbcc476d135493ae9bdcd7b3c2002df17f2d81c17d631c50c73e546c264" + ], + [ + "57a5a04c0278c8c8e243d2df4bb716f81d41ac41e2df153e7096f5682380c4f441888d9d260300000004ab63ab6afdbe4203525dff42a7b1e628fe22bccaa5edbb34d8ab02faff198e085580ea5fcdb0c61b0000000002ac6affffffff03375e6c05000000000663ab516a6a513cb6260400000000007ca328020000000006516a636a52ab94701cc7", + "0053ac5152", + 0, + -550925626, + "b7ca991ab2e20d0158168df2d3dd842a57ab4a3b67cca8f45b07c4b7d1d11126" + ], + [ + "072b75a504ad2550c2e9a02614bc9b2a2f50b5b553af7b87c0ef07c64ddc8d8934c96d216401000000036aabaca1387242a5bcd21099b016ad6045bed7dce603472757d9822cc5f602caa4ae20414d378b02000000026a63e4ac816734acdc969538d6f70b8ab43a2589f55e0177a4dc471bdd0eb61d59f0f46f6bb801000000065351526aab52d9f2977be76a492c3a7617b7a16dc29a3b0a7618f328c2f7d4fd9bafe760dc427a5066ef000000000465635165ffffffff02c5793600000000000165296820050000000002ac6300000000", + "53006a6aac0052ab", + 2, + 66084636, + "437e89bb6f70fd2ed2feef33350b6f6483b891305e574da03e580b3efd81ae13" + ], + [ + "7e27c42d0279c1a05eeb9b9faedcc9be0cab6303bde351a19e5cbb26dd0d594b9d74f40d2b020000000200518c8689a08a01e862d5c4dcb294a2331912ff11c13785be7dce3092f154a005624970f84e0200000000500cf5a601e74c1f0000000000076aab52636a6a5200000000", + "6500006a5351", + 0, + 449533391, + "535ba819d74770d4d613ee19369001576f98837e18e1777b8246238ff2381dd0" + ], + [ + "11414de403d7f6c0135a9df01cb108c1359b8d4e105be50a3dcba5e6be595c8817217490b20000000003005263ffffffff0c6becb9c3ad301c8dcd92f5cbc07c8bed7973573806d1489316fc77a829da03030000000700005253535352ffffffff2346d74ff9e12e5111aa8779a2025981850d4bf788a48de72baa2e321e4bc9ca00000000056352acab63cc585b64045e0385050000000009ab5253ab516aacac00efa9cf0300000000065200635151acbe80330400000000070063635100ab000be159050000000007525300655300ac00000000", + "51656a0051ab", + 0, + 683137826, + "d4737f3b58f3e5081b35f36f91acde89dda00a6a09d447e516b523e7a99264d5" + ], + [ + "1c6b5f29033fc139338658237a42456123727c8430019ca25bd71c6168a9e35a2bf54538d80100000008536aac52ac6a6a52ffffffff3fb36be74036ff0c940a0247c451d923c65f826793d0ac2bb3f01ecbec8033290100000007ab000051ab6363ffffffff5d9eca0cf711685105bd060bf7a67321eaef95367acffab36ce8dedddd632ee2000000000652ac6a63ac517167319e032d26de040000000003516363dc38fb010000000000b37b00000000000006ab520051ac534baba51f", + "636300ababac6563", + 0, + -2049129935, + "3282a2ec6b8c87c9303e6060c17b421687db1bd35fbfa0345b48f2490e15b6cc" + ], + [ + "978b9dad0214cfc7ce392d74d9dcc507350dc34007d72e4125861c63071ebf2cc0a6fd4856020000000651ac6a6aab52ffffffff47f20734e3370e733f87a6edab95a7a268ae44db7a8974e255614836b22938720200000008635265ac51516553ffffffff0137b2560100000000035252ac2f3363e9", + "006aab6352", + 1, + 2014249801, + "55611a5fb1483bce4c14c33ed15198130e788b72cd8929b2ceef4dd68b1806bf" + ], + [ + "442f1c8703ab39876153c241ab3d69f432ba6db4732bea5002be45c8ca10c3a2356fe0e9590300000001accb2b679cab7c58a660cb6d4b3452c21cd7251a1b77a52c300f655f5baeb6fa27ff5b79880300000003005252e5ccf55712bc8ed6179f6726f8a78f3018a7a0391594b7e286ef5ee99efdcde302a102cc0200000009006352526351536a63ffffffff04443f63030000000006536a63ab63651405fb020000000009ac535351525300ab6a9f172b000000000004ab535263ad5c50050000000008656a65ab630000ac00000000", + "65636aab006552", + 2, + 2125838294, + "b3ff10f21e71ebc8b25fe058c4074c42f08617e0dcc03f9e75d20539d3242644" + ], + [ + "2b3470dd028083910117f86614cdcfb459ee56d876572510be4df24c72e8f58c70d5f5948b03000000066aab65635265da2c3aac9d42c9baafd4b655c2f3efc181784d8cba5418e053482132ee798408ba43ccf90300000000ffffffff047dda4703000000000765516a52ac53009384a603000000000651636a63ab6a8cf57a03000000000352ab6a8cf6a405000000000952636a6a6565525100661e09cb", + "ac520063ac6a6a52", + 1, + 1405647183, + "9b360c3310d55c845ef537125662b9fe56840c72136891274e9fedfef56f9bb5" + ], + [ + "d74282b501be95d3c19a5d9da3d49c8a88a7049c573f3788f2c42fc6fa594f59715560b9b00000000009655353525265ac52ac9772121f028f8303030000000003510065af5f47040000000007ac516a6551630000000000", + "acab53006363ac", + 0, + -1113209770, + "2f482b97178f17286f693796a756f4d7bd2dfcdbecd4142528eec1c7a3e5101a" + ], + [ + "3a5644a9010f199f253f858d65782d3caec0ac64c3262b56893022b9796086275c9d4d097b02000000009d168f7603a67b30050000000007ac51536a0053acd9d88a050000000007655363535263ab3cf1f403000000000352ac6a00000000", + "005363536565acac6a", + 0, + -1383947195, + "6390ab0963cf611e0cea35a71dc958b494b084e6fd71d22217fdc5524787ade6" + ], + [ + "67b3cc43049d13007485a8133b90d94648bcf30e83ba174f5486ab42c9107c69c5530c5e1f0000000003005100ffffffff9870ebb65c14263282ea8d41e4f4f40df16b565c2cf86f1d22a9494cad03a67f01000000016a5a121bee5e359da548e808ae1ad6dfccae7c67cbb8898d811638a1f455a671e822f228ef030000000151c1fcc9f9825f27c0dde27ea709da62a80a2ff9f6b1b86a5874c50d6c37d39ae31fb6c8a0030000000163553b8786020ca74a00000000000665635153ab5275c0760000000000020052e659b05d", + "636aab6a6a", + 0, + -342795451, + "f77c3322c97b1681c17b1eba461fa27b07e04c1534e8aaf735a49cab72c7c2e2" + ], + [ + "bda1ff6804a3c228b7a12799a4c20917301dd501c67847d35da497533a606701ad31bf9d5e0300000001ac16a6c5d03cf516cd7364e4cbbf5aeccd62f8fd03cb6675883a0636a7daeb650423cb1291010000000500656553ac4a63c30b6a835606909c9efbae1b2597e9db020c5ecfc0642da6dc583fba4e84167539a8020000000865525353515200acffffffff990807720a5803c305b7da08a9f24b92abe343c42ac9e917a84e1f335aad785d00000000026a52ffffffff04981f20030000000001ab8c762200000000000253ab690b9605000000000151ce88b301000000000753526a6a51006500000000", + "000052ac52530000", + 1, + -1809193140, + "5299b0fb7fc16f40a5d6b337e71fcd1eb04d2600aefd22c06fe9c71fe0b0ba54" + ], + [ + "2ead28ff0243b3ab285e5d1067f0ec8724224402b21b9cef9be962a8b0d153d401be99bbee0000000004ac635153ffffffff6985987b7c1360c9fa8406dd6e0a61141709f0d5195f946da55ed83be4e3895301000000020053ffffffff016503d20500000000085251ac6a65656a6a00000000", + "51abab", + 1, + 1723793403, + "67483ee62516be17a2431a163e96fd88a08ff2ce8634a52e42c1bc04e30f3f8a" + ], + [ + "db4904e6026b6dd8d898f278c6428a176410d1ffbde75a4fa37cda12263108ccd4ca6137440100000007656a0000515263ffffffff1db7d5005c1c40da0ed17b74cf6b2a6ee2c33c9e0bacda76c0da2017dcac2fc70200000004abab6a53ffffffff0454cf2103000000000153463aef000000000009ab6a630065ab52636387e0ed050000000000e8d16f05000000000352ac63e4521b22", + "", + 1, + 1027042424, + "48315a95e49277ab6a2d561ee4626820b7bab919eea372b6bf4e9931ab221d04" + ], + [ + "dca31ad10461ead74751e83d9a81dcee08db778d3d79ad9a6d079cfdb93919ac1b0b61871102000000086500525365ab51ac7f7e9aed78e1ef8d213d40a1c50145403d196019985c837ffe83836222fe3e5955e177e70100000006525152525300ffffffff5e98482883cc08a6fe946f674cca479822f0576a43bf4113de9cbf414ca628060100000006ac53516a5253ffffffff07490b0b898198ec16c23b75d606e14fa16aa3107ef9818594f72d5776805ec502000000036a0052ffffffff01932a2803000000000865ab6551ac6a516a2687aa06", + "635300ac", + 2, + -1880362326, + "74d6a2fa7866fd8b74b2e34693e2d6fd690410384b7afdcd6461b1ae71d265ce" + ], + [ + "e14e1a9f0442ab44dfc5f6d945ad1ff8a376bc966aad5515421e96ddbe49e529614995cafc03000000055165515165fffffffff97582b8290e5a5cfeb2b0f018882dbe1b43f60b7f45e4dd21dbd3a8b0cfca3b0200000000daa267726fe075db282d694b9fee7d6216d17a8c1f00b2229085495c5dc5b260c8f8cd5d000000000363ac6affffffffaab083d22d0465471c896a438c6ac3abf4d383ae79420617a8e0ba8b9baa872b010000000963526563ac5363ababd948b5ce022113440200000000076a636552006a53229017040000000000e6f62ac8", + "526353636a65", + 3, + -485265025, + "1bc8ad76f9b7c366c5d052dc479d6a8a2015566d3a42e93ab12f727692c89d65" + ], + [ + "720d4693025ca3d347360e219e9bc746ef8f7bc88e8795162e5e2f0b0fc99dc17116fc937100000000046353520045cb1fd79824a100d30b6946eab9b219daea2b0cdca6c86367c0c36af98f19ac64f3575002000000008a1c881003ed16f3050000000008536a63630000abac45e0e704000000000151f6551a05000000000963536565515363abab00000000", + "6553ab6a6a510000ab", + 1, + 1249091393, + "a575fa4f59a8e90cd07de012c78fe8f981183bb170b9c50fcc292b8c164cbc3b" + ], + [ + "69df842a04c1410bfca10896467ce664cfa31c681a5dac10106b34d4b9d4d6d0dc1eac01c1000000000551536a5165269835ca4ad7268667b16d0a2df154ec81e304290d5ed69e0069b43f8c89e673328005e200000000076a5153006aacabffffffffc9314bd80b176488f3d634360fcba90c3a659e74a52e100ac91d3897072e3509010000000765abac51636363ffffffff0e0768b13f10f0fbd2fa3f68e4b4841809b3b5ba0e53987c3aaffcf09eee12bf0300000008ac535263526a53ac514f4c2402da8fab0400000000001ef15201000000000451526a52d0ec9aca", + "525365ac52", + 1, + 313967049, + "a72a760b361af41832d2c667c7488dc9702091918d11e344afc234a4aea3ec44" + ], + [ + "adf2340d03af5c589cb5d28c06635ac07dd0757b884d4777ba85a6a7c410408ad5efa8b19001000000045100ab00ffffffff808dc0231c96e6667c04786865727013922bcb7db20739b686f0c17f5ba70e8f0300000000fd2332a654b580881a5e2bfec8313f5aa878ae94312f37441bf2d226e7fc953dcf0c77ab000000000163aa73dc580412f8c2050000000005636aacac63da02d502000000000153e74b52020000000001536b293d030000000009636552ababacab526500000000", + "000052ab52ababab", + 0, + -568651175, + "2c45d021db545df7167ac03c9ee56473f2398d9b2b739cf3ff3e074501d324f8" + ], + [ + "e4fec9f10378a95199c1dd23c6228732c9de0d7997bf1c83918a5cfd36012476c0c3cba24002000000085165536500ac0000ad08ab93fb49d77d12a7ccdbb596bc5110876451b53a79fdce43104ff1c316ad63501de801000000046a6352ab76af9908463444aeecd32516a04dd5803e02680ed7f16307242a794024d93287595250f4000000000089807279041a82e603000000000200521429100200000000055253636a63f20b940400000000004049ed04000000000500ab5265ab43dfaf7d", + "6563526aac", + 2, + -1923470368, + "32f3c012eca9a823bebb9b282240aec40ca65df9f38da43b1dcfa0cac0c0df7e" + ], + [ + "4000d3600100b7a3ff5b41ec8d6ccdc8b2775ad034765bad505192f05d1f55d2bc39d0cbe10100000007ab5165ac6a5163ffffffff034949150100000000026a6a92c9f6000000000008ab6553ab6aab635200e697040000000007636a5353525365237ae7d2", + "52000063", + 0, + -880046683, + "c76146f68f43037289aaeb2bacf47408cddc0fb326b350eb4f5ef6f0f8564793" + ], + [ + "eabc0aa701fe489c0e4e6222d72b52f083166b49d63ad1410fb98caed027b6a71c02ab830c03000000075253ab63530065ffffffff01a5dc0b05000000000253533e820177", + "", + 0, + 954499283, + "1d849b92eedb9bf26bd4ced52ce9cb0595164295b0526842ab1096001fcd31b1" + ], + [ + "d48d55d304aad0139783b44789a771539d052db565379f668def5084daba0dfd348f7dcf6b00000000006826f59e5ffba0dd0ccbac89c1e2d69a346531d7f995dea2ca6d7e6d9225d81aec257c6003000000096a655200ac656552acffffffffa188ffbd5365cae844c8e0dea6213c4d1b2407274ae287b769ab0bf293e049eb0300000005ac6a6aab51ad1c407c5b116ca8f65ed496b476183f85f072c5f8a0193a4273e2015b1cc288bf03e9e2030000000252abffffffff04076f44040000000006655353abab53be6500050000000003ac65ac3c15040500000000095100ab536353516a52ed3aba04000000000900ac53ab53636aabac00000000", + "5253526563acac", + 2, + -1506108646, + "bbee17c8582514744bab5df50012c94b0db4aff5984d2e13a8d09421674404e2" + ], + [ + "9746f45b039bfe723258fdb6be77eb85917af808211eb9d43b15475ee0b01253d33fc3bfc502000000065163006a655312b12562dc9c54e11299210266428632a7d0ee31d04dfc7375dcad2da6e9c11947ced0e000000000009074095a5ac4df057554566dd04740c61490e1d3826000ad9d8f777a93373c8dddc4918a00000000025351ffffffff01287564030000000004636a00ab00000000", + "52", + 2, + -1380411075, + "84af1623366c4db68d81f452b86346832344734492b9c23fbb89015e516c60b2" + ], + [ + "8731b64903d735ba16da64af537eaf487b57d73977f390baac57c7b567cb2770dfa2ef65870100000001635aedd990c42645482340eacb0bfa4a0a9e888057389c728b5b6a8691cdeb1a6a67b45e140200000008ac53526a52516551ffffffff45c4f567c47b8d999916fd49642cbc5d10d43c304b99e32d044d35091679cb860100000003006a51ffffffff0176d6c200000000000000000000", + "ab6a65ab53", + 2, + -1221546710, + "ccfdba36d9445f4451fb7cbf0752cc89c23d4fc6fff0f3930d20e116f9db0b95" + ], + [ + "f5cfc52f016209ab1385e890c2865a74e93076595d1ca77cbe8fbf2022a2f2061a90fb0f3e010000000253acffffffff027de73f0200000000085252ac510052acac49cd6a020000000000e6c2cb56", + "516552535300ab63", + 0, + -1195302704, + "5532717402a2da01a1da912d824964024185ca7e8d4ad1748659dc393a14182b" + ], + [ + "df0a32ae01c4672fd1abd0b2623aae0a1a8256028df57e532f9a472d1a9ceb194267b6ee190200000009536a6a51516a525251b545f9e803469a2302000000000465526500810631040000000000441f5b050000000006530051006aaceb183c76", + "536a635252ac6a", + 0, + 1601138113, + "9a0435996cc58bdba09643927fe48c1fc908d491a050abbef8daec87f323c58f" + ], + [ + "d102d10c028b9c721abb259fe70bc68962f6cae384dabd77477c59cbeb1fb26266e091ba3e0100000002516affffffffe8d7305a74f43e30c772109849f4cd6fb867c7216e6d92e27605e69a0818899700000000026a65ecf82d58027db4620500000000026552c28ed3010000000001ab00000000", + "0051ab515365", + 1, + -131815460, + "1d1757a782cb5860302128bcbe9398243124a2f82d671a113f74f8e582c7a182" + ], + [ + "cef930ed01c36fcb1d62ceef931bef57098f27a77a4299904cc0cbb44504802d535fb11557010000000153ffffffff02c8657403000000000863ac655253520063d593380400000000046aab536a00000000", + "656a0051ab6365ab53", + 0, + -351313308, + "e69dba3efb5c02af2ab1087d0a990678784671f4744d01ca097d71aec14dd8e9" + ], + [ + "b1c0b71804dff30812b92eefb533ac77c4b9fdb9ab2f77120a76128d7da43ad70c20bbfb990200000002536392693e6001bc59411aebf15a3dc62a6566ec71a302141b0c730a3ecc8de5d76538b30f55010000000665535252ac514b740c6271fb9fe69fdf82bf98b459a7faa8a3b62f3af34943ad55df4881e0d93d3ce0ac0200000000c4158866eb9fb73da252102d1e64a3ce611b52e873533be43e6883137d0aaa0f63966f060000000001abffffffff04a605b604000000000851006a656a630052f49a0300000000000252515a94e1050000000009abac65ab0052abab00fd8dd002000000000651535163526a2566852d", + "ac5363", + 0, + -1718831517, + "b0dc030661783dd9939e4bf1a6dfcba809da2017e1b315a6312e5942d714cf05" + ], + [ + "6a270ee404ebc8d137cfd4bb6b92aa3702213a3139a579c1fc6f56fbc7edd9574ef17b13f30100000009ab00ab656565ababacffffffffaa65b1ab6c6d87260d9e27a472edceb7dd212483e72d90f08857abf1dbfd46d10100000000fffffffff93c4c9c84c4dbbe8a912b99a2830cfe3401aebc919041de063d660e585fc9f002000000096aabacab52ac6a53acfa6dcef3f28355a8d98eee53839455445eeee83eecd2c854e784efa53cee699dbfecaebd0100000003ab6a51ffffffff04f7d71b050000000009ac6a536aac6a6365513c37650500000000065265abab6a53fa742002000000000039ed82030000000009516aac635165ab51ab2fdabd17", + "ab535252526563", + 1, + -1326210506, + "1dec0d5eb921bf5b2df39c8576e19c38d0c17254a4a0b78ac4b5422bcc426258" + ], + [ + "3657e4260304ccdc19936e47bdf058d36167ee3d4eb145c52b224eff04c9eb5d1b4e434dfc0000000001ab58aefe57707c66328d3cceef2e6f56ab6b7465e587410c5f73555a513ace2b232793a74400000000036a006522e69d3a785b61ad41a635d59b3a06b2780a92173f85f8ed428491d0aaa436619baa9c4501000000046351abab2609629902eb7793050000000000a1b967040000000003525353a34d6192", + "516a", + 0, + -1761874713, + "0a2ff41f6d155d8d0e37cd9438f3b270df9f9214cda8e95c76d5a239ca189df2" + ], + [ + "a0eb6dc402994e493c787b45d1f946d267b09c596c5edde043e620ce3d59e95b2b5b93d43002000000096a5252526aac63ab6555694287a279e29ee491c177a801cd685b8744a2eab83824255a3bcd08fc0e3ea13fb8820000000009abab6365ab52ab0063ffffffff029e424a040000000008acab53ab516a636a23830f0400000000016adf49c1f9", + "ac0065ac6500005252", + 1, + 669294500, + "e05e3d383631a7ed1b78210c13c2eb26564e5577db7ddfcea2583c7c014091d4" + ], + [ + "6e67c0d3027701ef71082204c85ed63c700ef1400c65efb62ce3580d187fb348376a23e9710200000001655b91369d3155ba916a0bc6fe4f5d94cad461d899bb8aaac3699a755838bfc229d6828920010000000765536353526a52ffffffff04c0c792000000000005650052535372f79e000000000001527fc0ee010000000005ac5300ab65d1b3e902000000000251aba942b278", + "6a5151", + 0, + 1741407676, + "e657e2c8ec4ebc769ddd3198a83267b47d4f2a419fc737e813812acefad92ff7" + ], + [ + "8f53639901f1d643e01fc631f632b7a16e831d846a0184cdcda289b8fa7767f0c292eb221a00000000046a53abacffffffff037a2daa01000000000553ac6a6a51eac349020000000005ac526552638421b3040000000007006a005100ac63048a1492", + "ac65", + 0, + 1033685559, + "da86c260d42a692358f46893d6f91563985d86eeb9ea9e21cd38c2d8ffcfcc4d" + ], + [ + "491f99cb01bdfba1aa235e5538dac081fae9ce55f9622de483afe7e65105c2b0db75d360d200000000045251636340b60f0f041421330300000000096351ac000051636553ce2822040000000005516a00ac5180c8e40300000000025100caa8570400000000020000cfdc8da6", + "6a5100516aab655365", + 0, + -953727341, + "397c68803b7ce953666830b0221a5e2bcf897aa2ded8e36a6b76c497dcb1a2e1" + ], + [ + "b3cad3a7041c2c17d90a2cd994f6c37307753fa3635e9ef05ab8b1ff121ca11239a0902e700300000009ab635300006aac5163ffffffffcec91722c7468156dce4664f3c783afef147f0e6f80739c83b5f09d5a09a57040200000004516a6552ffffffff969d1c6daf8ef53a70b7cdf1b4102fb3240055a8eaeaed2489617cd84cfd56cf020000000352ab53ffffffff46598b6579494a77b593681c33422a99559b9993d77ca2fa97833508b0c169f80200000009655300655365516351ffffffff04d7ddf800000000000853536a65ac6351ab09f3420300000000056aab65abac33589d04000000000952656a65655151acac944d6f0400000000006a8004ba", + "005165", + 1, + 1035865506, + "fe1dc9e8554deecf8f50c417c670b839cc9d650722ebaaf36572418756075d58" + ], + [ + "e1cfd73b0125add9e9d699f5a45dca458355af175a7bd4486ebef28f1928d87864384d02df02000000036a0051ffffffff0357df030100000000036a5365777e2d04000000000763ab6a00005265f434a601000000000351655100000000", + "ab53ab", + 0, + -1936500914, + "950f4b4f72ccdf8a6a0f381265d6c8842fdb7e8b3df3e9742905f643b2432b69" + ], + [ + "cf781855040a755f5ba85eef93837236b34a5d3daeb2dbbdcf58bb811828d806ed05754ab8010000000351ac53ffffffffda1e264727cf55c67f06ebcc56dfe7fa12ac2a994fecd0180ce09ee15c480f7d00000000096351516a51acac00ab53dd49ff9f334befd6d6f87f1a832cddfd826a90b78fd8cf19a52cb8287788af94e939d6020000000700525251ac526310d54a7e8900ed633f0f6f0841145aae7ee0cbbb1e2a0cae724ee4558dbabfdc58ba6855010000000552536a53abfd1b101102c51f910500000000096300656a525252656a300bee010000000009ac52005263635151abe19235c9", + "53005365", + 2, + 1422854188, + "d5981bd4467817c1330da72ddb8760d6c2556cd809264b2d85e6d274609fc3a3" + ], + [ + "fea256ce01272d125e577c0a09570a71366898280dda279b021000db1325f27edda41a53460100000002ab53c752c21c013c2b3a01000000000000000000", + "65", + 0, + 1145543262, + "076b9f844f6ae429de228a2c337c704df1652c292b6c6494882190638dad9efd" + ] +] diff --git a/web/bitcoincashjs-lib/test/fixtures/core/tx_valid.json b/web/bitcoincashjs-lib/test/fixtures/core/tx_valid.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/core/tx_valid.json @@ -0,0 +1,1959 @@ +[ + ["The following are deserialized transactions which are valid."], + ["They are in the form"], + ["[[[prevout hash, prevout index, prevout scriptPubKey], [input 2], ...],"], + ["serializedTransaction, verifyFlags]"], + ["Objects that are only a single string (like this one) are ignored"], + + [ + "The following is 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63" + ], + [ + "It is of particular interest because it contains an invalidly-encoded signature which OpenSSL accepts" + ], + ["See http://r6.ca/blog/20111119T211504Z.html"], + ["It is also the first OP_CHECKMULTISIG transaction in standard form"], + [ + [ + [ + "60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", + 0, + "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG" + ] + ], + "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", + "P2SH" + ], + + [ + "The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63" + ], + [ + "It is an OP_CHECKMULTISIG with an arbitrary extra byte stuffed into the signature at pos length - 2" + ], + ["The dummy byte is fine however, so the NULLDUMMY flag should be happy"], + [ + [ + [ + "60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", + 0, + "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG" + ] + ], + "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", + "P2SH,NULLDUMMY" + ], + + [ + "The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63" + ], + [ + "It is an OP_CHECKMULTISIG with the dummy value set to something other than an empty string" + ], + [ + [ + [ + "60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", + 0, + "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG" + ] + ], + "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", + "P2SH" + ], + + ["As above, but using a OP_1"], + [ + [ + [ + "60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", + 0, + "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG" + ] + ], + "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000495147304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", + "P2SH" + ], + + ["As above, but using a OP_1NEGATE"], + [ + [ + [ + "60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", + 0, + "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG" + ] + ], + "0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000494f47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", + "P2SH" + ], + + [ + "The following is c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73" + ], + [ + "It is of interest because it contains a 0-sequence as well as a signature of SIGHASH type 0 (which is not a real type)" + ], + [ + [ + [ + "406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602", + 0, + "DUP HASH160 0x14 0xdc44b1164188067c3a32d4780f5996fa14a4f2d9 EQUALVERIFY CHECKSIG" + ] + ], + "01000000010276b76b07f4935c70acf54fbf1f438a4c397a9fb7e633873c4dd3bc062b6b40000000008c493046022100d23459d03ed7e9511a47d13292d3430a04627de6235b6e51a40f9cd386f2abe3022100e7d25b080f0bb8d8d5f878bba7d54ad2fda650ea8d158a33ee3cbd11768191fd004104b0e2c879e4daf7b9ab68350228c159766676a14f5815084ba166432aab46198d4cca98fa3e9981d0a90b2effc514b76279476550ba3663fdcaff94c38420e9d5000000000100093d00000000001976a9149a7b0f3b80c6baaeedce0a0842553800f832ba1f88ac00000000", + "P2SH" + ], + + ["A nearly-standard transaction with CHECKSIGVERIFY 1 instead of CHECKSIG"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000", + "P2SH" + ], + + [ + "Same as above, but with the signature duplicated in the scriptPubKey with the proper pushdata prefix" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a01" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000", + "P2SH" + ], + + [ + "The following is f7fdd091fa6d8f5e7a8c2458f5c38faffff2d3f1406b6e4fe2c99dcc0d2d1cbb" + ], + [ + "It caught a bug in the workaround for 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63 in an overly simple implementation" + ], + [ + [ + [ + "b464e85df2a238416f8bdae11d120add610380ea07f4ef19c5f9dfd472f96c3d", + 0, + "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG" + ], + [ + "b7978cc96e59a8b13e0865d3f95657561a7f725be952438637475920bac9eb21", + 1, + "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG" + ] + ], + "01000000023d6cf972d4dff9c519eff407ea800361dd0a121de1da8b6f4138a2f25de864b4000000008a4730440220ffda47bfc776bcd269da4832626ac332adfca6dd835e8ecd83cd1ebe7d709b0e022049cffa1cdc102a0b56e0e04913606c70af702a1149dc3b305ab9439288fee090014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff21ebc9ba20594737864352e95b727f1a565756f9d365083eb1a8596ec98c97b7010000008a4730440220503ff10e9f1e0de731407a4a245531c9ff17676eda461f8ceeb8c06049fa2c810220c008ac34694510298fa60b3f000df01caa244f165b727d4896eb84f81e46bcc4014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff01f0da5200000000001976a914857ccd42dded6df32949d4646dfa10a92458cfaa88ac00000000", + "P2SH" + ], + + [ + "The following tests for the presence of a bug in the handling of SIGHASH_SINGLE" + ], + [ + "It results in signing the constant 1, instead of something generated based on the transaction," + ], + [ + "when the input doing the signing has an index greater than the maximum output index" + ], + [ + "bitcoinjs note, these inputs have been reversed for convenience, as the original data was unordered, and it is easier to check the inputs if they are ordered" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000200", + 0, + "1" + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "DUP HASH160 0x14 0xe52b482f2faa8ecbf0db344f93c84ac908557f33 EQUALVERIFY CHECKSIG" + ] + ], + "01000000020002000000000000000000000000000000000000000000000000000000000000000000000151ffffffff0001000000000000000000000000000000000000000000000000000000000000000000006b483045022100c9cdd08798a28af9d1baf44a6c77bcc7e279f47dc487c8c899911bc48feaffcc0220503c5c50ae3998a733263c5c0f7061b483e2b56c4c41b456e7d2f5a78a74c077032102d5c25adb51b61339d2b05315791e21bbe80ea470a49db0135720983c905aace0ffffffff010000000000000000015100000000", + "P2SH" + ], + + ["An invalid P2SH Transaction"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL" + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000", + "NONE" + ], + + [ + "A valid P2SH Transaction using the standard transaction type put forth in BIP 16" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0x8febbed40483661de6958d957412f82deed8e2f7 EQUAL" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000006e493046022100c66c9cdf4c43609586d15424c54707156e316d88b0a1534c9e6b0d4f311406310221009c0fe51dbc9c4ab7cc25d3fdbeccf6679fe6827f08edf2b4a9f16ee3eb0e438a0123210338e8034509af564c62644c07691942e0c056752008a173c89f60ab2a88ac2ebfacffffffff010000000000000000015100000000", + "P2SH" + ], + + ["Tests for CheckTransaction()"], + ["MAX_MONEY output"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0x32afac281462b822adbec5094b8d4d337dd5bd6a EQUAL" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000006e493046022100e1eadba00d9296c743cb6ecc703fd9ddc9b3cd12906176a226ae4c18d6b00796022100a71aef7d2874deff681ba6080f1b278bac7bb99c61b08a85f4311970ffe7f63f012321030c0588dc44d92bdcbf8e72093466766fdc265ead8db64517b0c542275b70fffbacffffffff010040075af0750700015100000000", + "P2SH" + ], + + ["MAX_MONEY output + 0 output"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0xb558cbf4930954aa6a344363a15668d7477ae716 EQUAL" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000006d483045022027deccc14aa6668e78a8c9da3484fbcd4f9dcc9bb7d1b85146314b21b9ae4d86022100d0b43dece8cfb07348de0ca8bc5b86276fa88f7f2138381128b7c36ab2e42264012321029bb13463ddd5d2cc05da6e84e37536cb9525703cfd8f43afdb414988987a92f6acffffffff020040075af075070001510000000000000000015100000000", + "P2SH" + ], + + ["Coinbase of size 2"], + ["Note the input is just required to make the tester happy"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000000", + -1, + "1" + ] + ], + "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025151ffffffff010000000000000000015100000000", + "P2SH" + ], + + ["Coinbase of size 100"], + ["Note the input is just required to make the tester happy"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000000", + -1, + "1" + ] + ], + "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff6451515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151ffffffff010000000000000000015100000000", + "P2SH" + ], + + [ + "Simple transaction with first input is signed with SIGHASH_ALL, second with SIGHASH_ANYONECANPAY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG" + ], + [ + "0000000000000000000000000000000000000000000000000000000000000200", + 0, + "0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG" + ] + ], + "010000000200010000000000000000000000000000000000000000000000000000000000000000000049483045022100d180fd2eb9140aeb4210c9204d3f358766eb53842b2a9473db687fa24b12a3cc022079781799cd4f038b85135bbe49ec2b57f306b2bb17101b17f71f000fcab2b6fb01ffffffff0002000000000000000000000000000000000000000000000000000000000000000000004847304402205f7530653eea9b38699e476320ab135b74771e1c48b81a5d041e2ca84b9be7a802200ac8d1f40fb026674fe5a5edd3dea715c27baa9baca51ed45ea750ac9dc0a55e81ffffffff010100000000000000015100000000", + "P2SH" + ], + + [ + "Same as above, but we change the sequence number of the first input to check that SIGHASH_ANYONECANPAY is being followed" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG" + ], + [ + "0000000000000000000000000000000000000000000000000000000000000200", + 0, + "0x21 0x035e7f0d4d0841bcd56c39337ed086b1a633ee770c1ffdd94ac552a95ac2ce0efc CHECKSIG" + ] + ], + "01000000020001000000000000000000000000000000000000000000000000000000000000000000004948304502203a0f5f0e1f2bdbcd04db3061d18f3af70e07f4f467cbc1b8116f267025f5360b022100c792b6e215afc5afc721a351ec413e714305cb749aae3d7fee76621313418df101010000000002000000000000000000000000000000000000000000000000000000000000000000004847304402205f7530653eea9b38699e476320ab135b74771e1c48b81a5d041e2ca84b9be7a802200ac8d1f40fb026674fe5a5edd3dea715c27baa9baca51ed45ea750ac9dc0a55e81ffffffff010100000000000000015100000000", + "P2SH" + ], + + [ + "afd9c17f8913577ec3509520bd6e5d63e9c0fd2a5f70c787993b097ba6ca9fae which has several SIGHASH_SINGLE signatures" + ], + [ + [ + [ + "63cfa5a09dc540bf63e53713b82d9ea3692ca97cd608c384f2aa88e51a0aac70", + 0, + "DUP HASH160 0x14 0xdcf72c4fd02f5a987cf9b02f2fabfcac3341a87d EQUALVERIFY CHECKSIG" + ], + [ + "04e8d0fcf3846c6734477b98f0f3d4badfb78f020ee097a0be5fe347645b817d", + 1, + "DUP HASH160 0x14 0xdcf72c4fd02f5a987cf9b02f2fabfcac3341a87d EQUALVERIFY CHECKSIG" + ], + [ + "ee1377aff5d0579909e11782e1d2f5f7b84d26537be7f5516dd4e43373091f3f", + 1, + "DUP HASH160 0x14 0xdcf72c4fd02f5a987cf9b02f2fabfcac3341a87d EQUALVERIFY CHECKSIG" + ] + ], + "010000000370ac0a1ae588aaf284c308d67ca92c69a39e2db81337e563bf40c59da0a5cf63000000006a4730440220360d20baff382059040ba9be98947fd678fb08aab2bb0c172efa996fd8ece9b702201b4fb0de67f015c90e7ac8a193aeab486a1f587e0f54d0fb9552ef7f5ce6caec032103579ca2e6d107522f012cd00b52b9a65fb46f0c57b9b8b6e377c48f526a44741affffffff7d815b6447e35fbea097e00e028fb7dfbad4f3f0987b4734676c84f3fcd0e804010000006b483045022100c714310be1e3a9ff1c5f7cacc65c2d8e781fc3a88ceb063c6153bf950650802102200b2d0979c76e12bb480da635f192cc8dc6f905380dd4ac1ff35a4f68f462fffd032103579ca2e6d107522f012cd00b52b9a65fb46f0c57b9b8b6e377c48f526a44741affffffff3f1f097333e4d46d51f5e77b53264db8f7f5d2e18217e1099957d0f5af7713ee010000006c493046022100b663499ef73273a3788dea342717c2640ac43c5a1cf862c9e09b206fcb3f6bb8022100b09972e75972d9148f2bdd462e5cb69b57c1214b88fc55ca638676c07cfc10d8032103579ca2e6d107522f012cd00b52b9a65fb46f0c57b9b8b6e377c48f526a44741affffffff0380841e00000000001976a914bfb282c70c4191f45b5a6665cad1682f2c9cfdfb88ac80841e00000000001976a9149857cc07bed33a5cf12b9c5e0500b675d500c81188ace0fd1c00000000001976a91443c52850606c872403c0601e69fa34b26f62db4a88ac00000000", + "P2SH" + ], + + [ + "ddc454a1c0c35c188c98976b17670f69e586d9c0f3593ea879928332f0a069e7, which spends an input that pushes using a PUSHDATA1 that is negative when read as signed" + ], + [ + [ + [ + "c5510a5dd97a25f43175af1fe649b707b1df8e1a41489bac33a23087027a2f48", + 0, + "0x4c 0xae 0x606563686f2022553246736447566b58312b5a536e587574356542793066794778625456415675534a6c376a6a334878416945325364667657734f53474f36633338584d7439435c6e543249584967306a486956304f376e775236644546673d3d22203e20743b206f70656e73736c20656e63202d7061737320706173733a5b314a564d7751432d707269766b65792d6865785d202d64202d6165732d3235362d636263202d61202d696e207460 DROP DUP HASH160 0x14 0xbfd7436b6265aa9de506f8a994f881ff08cc2872 EQUALVERIFY CHECKSIG" + ] + ], + "0100000001482f7a028730a233ac9b48411a8edfb107b749e61faf7531f4257ad95d0a51c5000000008b483045022100bf0bbae9bde51ad2b222e87fbf67530fbafc25c903519a1e5dcc52a32ff5844e022028c4d9ad49b006dd59974372a54291d5764be541574bb0c4dc208ec51f80b7190141049dd4aad62741dc27d5f267f7b70682eee22e7e9c1923b9c0957bdae0b96374569b460eb8d5b40d972e8c7c0ad441de3d94c4a29864b212d56050acb980b72b2bffffffff0180969800000000001976a914e336d0017a9d28de99d16472f6ca6d5a3a8ebc9988ac00000000", + "P2SH" + ], + + ["Correct signature order"], + ["Note the input is just required to make the tester happy"], + [ + [ + [ + "b3da01dd4aae683c7aee4d5d8b52a540a508e1115f77cd7fa9a291243f501223", + 0, + "HASH160 0x14 0xb1ce99298d5f07364b57b1e5c9cc00be0b04a954 EQUAL" + ] + ], + "01000000012312503f2491a2a97fcd775f11e108a540a5528b5d4dee7a3c68ae4add01dab300000000fdfe0000483045022100f6649b0eddfdfd4ad55426663385090d51ee86c3481bdc6b0c18ea6c0ece2c0b0220561c315b07cffa6f7dd9df96dbae9200c2dee09bf93cc35ca05e6cdf613340aa0148304502207aacee820e08b0b174e248abd8d7a34ed63b5da3abedb99934df9fddd65c05c4022100dfe87896ab5ee3df476c2655f9fbe5bd089dccbef3e4ea05b5d121169fe7f5f4014c695221031d11db38972b712a9fe1fc023577c7ae3ddb4a3004187d41c45121eecfdbb5b7210207ec36911b6ad2382860d32989c7b8728e9489d7bbc94a6b5509ef0029be128821024ea9fac06f666a4adc3fc1357b7bec1fd0bdece2b9d08579226a8ebde53058e453aeffffffff0180380100000000001976a914c9b99cddf847d10685a4fabaa0baf505f7c3dfab88ac00000000", + "P2SH" + ], + + [ + "cc60b1f899ec0a69b7c3f25ddf32c4524096a9c5b01cbd84c6d0312a0c478984, which is a fairly strange transaction which relies on OP_CHECKSIG returning 0 when checking a completely invalid sig of length 0" + ], + [ + [ + [ + "cbebc4da731e8995fe97f6fadcd731b36ad40e5ecb31e38e904f6e5982fa09f7", + 0, + "0x2102085c6600657566acc2d6382a47bc3f324008d2aa10940dd7705a48aa2a5a5e33ac7c2103f5d0fb955f95dd6be6115ce85661db412ec6a08abcbfce7da0ba8297c6cc0ec4ac7c5379a820d68df9e32a147cffa36193c6f7c43a1c8c69cda530e1c6db354bfabdcfefaf3c875379a820f531f3041d3136701ea09067c53e7159c8f9b2746a56c3d82966c54bbc553226879a5479827701200122a59a5379827701200122a59a6353798277537982778779679a68" + ] + ], + "0100000001f709fa82596e4f908ee331cb5e0ed46ab331d7dcfaf697fe95891e73dac4ebcb000000008c20ca42095840735e89283fec298e62ac2ddea9b5f34a8cbb7097ad965b87568100201b1b01dc829177da4a14551d2fc96a9db00c6501edfa12f22cd9cefd335c227f483045022100a9df60536df5733dd0de6bc921fab0b3eee6426501b43a228afa2c90072eb5ca02201c78b74266fac7d1db5deff080d8a403743203f109fbcabf6d5a760bf87386d20100ffffffff01c075790000000000232103611f9a45c18f28f06f19076ad571c344c82ce8fcfe34464cf8085217a2d294a6ac00000000", + "P2SH" + ], + + ["Empty pubkey"], + [ + [ + [ + "229257c295e7f555421c1bfec8538dd30a4b5c37c1c8810bbe83cafa7811652c", + 0, + "0x00 CHECKSIG NOT" + ] + ], + "01000000012c651178faca83be0b81c8c1375c4b0ad38d53c8fe1b1c4255f5e795c25792220000000049483045022100d6044562284ac76c985018fc4a90127847708c9edb280996c507b28babdc4b2a02203d74eca3f1a4d1eea7ff77b528fde6d5dc324ec2dbfdb964ba885f643b9704cd01ffffffff010100000000000000232102c2410f8891ae918cab4ffc4bb4a3b0881be67c7a1e7faa8b5acf9ab8932ec30cac00000000", + "P2SH" + ], + + ["Empty signature"], + [ + [ + [ + "9ca93cfd8e3806b9d9e2ba1cf64e3cc6946ee0119670b1796a09928d14ea25f7", + 0, + "0x21 0x028a1d66975dbdf97897e3a4aef450ebeb5b5293e4a0b4a6d3a2daaa0b2b110e02 CHECKSIG NOT" + ] + ], + "0100000001f725ea148d92096a79b1709611e06e94c63c4ef61cbae2d9b906388efd3ca99c000000000100ffffffff0101000000000000002321028a1d66975dbdf97897e3a4aef450ebeb5b5293e4a0b4a6d3a2daaa0b2b110e02ac00000000", + "P2SH" + ], + + [ + [ + [ + "444e00ed7840d41f20ecd9c11d3f91982326c731a02f3c05748414a4fa9e59be", + 0, + "1 0x00 0x21 0x02136b04758b0b6e363e7a6fbe83aaf527a153db2b060d36cc29f7f8309ba6e458 2 CHECKMULTISIG" + ] + ], + "0100000001be599efaa4148474053c2fa031c7262398913f1dc1d9ec201fd44078ed004e44000000004900473044022022b29706cb2ed9ef0cb3c97b72677ca2dfd7b4160f7b4beb3ba806aa856c401502202d1e52582412eba2ed474f1f437a427640306fd3838725fab173ade7fe4eae4a01ffffffff010100000000000000232103ac4bba7e7ca3e873eea49e08132ad30c7f03640b6539e9b59903cf14fd016bbbac00000000", + "P2SH" + ], + + [ + [ + [ + "e16abbe80bf30c080f63830c8dbf669deaef08957446e95940227d8c5e6db612", + 0, + "1 0x21 0x03905380c7013e36e6e19d305311c1b81fce6581f5ee1c86ef0627c68c9362fc9f 0x00 2 CHECKMULTISIG" + ] + ], + "010000000112b66d5e8c7d224059e946749508efea9d66bf8d0c83630f080cf30be8bb6ae100000000490047304402206ffe3f14caf38ad5c1544428e99da76ffa5455675ec8d9780fac215ca17953520220779502985e194d84baa36b9bd40a0dbd981163fa191eb884ae83fc5bd1c86b1101ffffffff010100000000000000232103905380c7013e36e6e19d305311c1b81fce6581f5ee1c86ef0627c68c9362fc9fac00000000", + "P2SH" + ], + + [ + [ + [ + "ebbcf4bfce13292bd791d6a65a2a858d59adbf737e387e40370d4e64cc70efb0", + 0, + "2 0x21 0x033bcaa0a602f0d44cc9d5637c6e515b0471db514c020883830b7cefd73af04194 0x21 0x03a88b326f8767f4f192ce252afe33c94d25ab1d24f27f159b3cb3aa691ffe1423 2 CHECKMULTISIG NOT" + ] + ], + "0100000001b0ef70cc644e0d37407e387e73bfad598d852a5aa6d691d72b2913cebff4bceb000000004a00473044022068cd4851fc7f9a892ab910df7a24e616f293bcb5c5fbdfbc304a194b26b60fba022078e6da13d8cb881a22939b952c24f88b97afd06b4c47a47d7f804c9a352a6d6d0100ffffffff0101000000000000002321033bcaa0a602f0d44cc9d5637c6e515b0471db514c020883830b7cefd73af04194ac00000000", + "P2SH" + ], + + [ + [ + [ + "ba4cd7ae2ad4d4d13ebfc8ab1d93a63e4a6563f25089a18bf0fc68f282aa88c1", + 0, + "2 0x21 0x037c615d761e71d38903609bf4f46847266edc2fb37532047d747ba47eaae5ffe1 0x21 0x02edc823cd634f2c4033d94f5755207cb6b60c4b1f1f056ad7471c47de5f2e4d50 2 CHECKMULTISIG NOT" + ] + ], + "0100000001c188aa82f268fcf08ba18950f263654a3ea6931dabc8bf3ed1d4d42aaed74cba000000004b0000483045022100940378576e069aca261a6b26fb38344e4497ca6751bb10905c76bb689f4222b002204833806b014c26fd801727b792b1260003c55710f87c5adbd7a9cb57446dbc9801ffffffff0101000000000000002321037c615d761e71d38903609bf4f46847266edc2fb37532047d747ba47eaae5ffe1ac00000000", + "P2SH" + ], + + ["OP_CODESEPARATOR tests"], + + ["Test that SignatureHash() removes OP_CODESEPARATOR with FindAndDelete()"], + [ + [ + [ + "bc7fd132fcf817918334822ee6d9bd95c889099c96e07ca2c1eb2cc70db63224", + 0, + "CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG" + ] + ], + "01000000012432b60dc72cebc1a27ce0969c0989c895bdd9e62e8234839117f8fc32d17fbc000000004a493046022100a576b52051962c25e642c0fd3d77ee6c92487048e5d90818bcf5b51abaccd7900221008204f8fb121be4ec3b24483b1f92d89b1b0548513a134e345c5442e86e8617a501ffffffff010000000000000000016a00000000", + "P2SH" + ], + [ + [ + [ + "83e194f90b6ef21fa2e3a365b63794fb5daa844bdc9b25de30899fcfe7b01047", + 0, + "CODESEPARATOR CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIG" + ] + ], + "01000000014710b0e7cf9f8930de259bdc4b84aa5dfb9437b665a3e3a21ff26e0bf994e183000000004a493046022100a166121a61b4eeb19d8f922b978ff6ab58ead8a5a5552bf9be73dc9c156873ea02210092ad9bc43ee647da4f6652c320800debcf08ec20a094a0aaf085f63ecb37a17201ffffffff010000000000000000016a00000000", + "P2SH" + ], + + ["Hashed data starts at the CODESEPARATOR"], + [ + [ + [ + "326882a7f22b5191f1a0cc9962ca4b878cd969cf3b3a70887aece4d801a0ba5e", + 0, + "0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CODESEPARATOR CHECKSIG" + ] + ], + "01000000015ebaa001d8e4ec7a88703a3bcf69d98c874bca6299cca0f191512bf2a7826832000000004948304502203bf754d1c6732fbf87c5dcd81258aefd30f2060d7bd8ac4a5696f7927091dad1022100f5bcb726c4cf5ed0ed34cc13dadeedf628ae1045b7cb34421bc60b89f4cecae701ffffffff010000000000000000016a00000000", + "P2SH" + ], + + ["But only if execution has reached it"], + [ + [ + [ + "a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", + 0, + "0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 0x21 0x038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041 CHECKSIGVERIFY CODESEPARATOR 1" + ] + ], + "010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a900000000924830450221009c0a27f886a1d8cb87f6f595fbc3163d28f7a81ec3c4b252ee7f3ac77fd13ffa02203caa8dfa09713c8c4d7ef575c75ed97812072405d932bd11e6a1593a98b679370148304502201e3861ef39a526406bad1e20ecad06be7375ad40ddb582c9be42d26c3a0d7b240221009d0a3985e96522e59635d19cc4448547477396ce0ef17a58e7d74c3ef464292301ffffffff010000000000000000016a00000000", + "P2SH" + ], + + ["CODESEPARATOR in an unexecuted IF block does not change what is hashed"], + [ + [ + [ + "a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", + 0, + "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1" + ] + ], + "010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a48304502207a6974a77c591fa13dff60cabbb85a0de9e025c09c65a4b2285e47ce8e22f761022100f0efaac9ff8ac36b10721e0aae1fb975c90500b50c56e8a0cc52b0403f0425dd0100ffffffff010000000000000000016a00000000", + "P2SH" + ], + + ["As above, with the IF block executed"], + [ + [ + [ + "a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", + 0, + "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1" + ] + ], + "010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510151ffffffff010000000000000000016a00000000", + "P2SH" + ], + + ["CHECKSIG is legal in scriptSigs"], + [ + [ + [ + "ccf7f4053a02e653c36ac75c891b7496d0dc5ce5214f6c913d9cf8f1329ebee0", + 0, + "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG" + ] + ], + "0100000001e0be9e32f1f89c3d916c4f21e55cdcd096741b895cc76ac353e6023a05f4f7cc00000000d86149304602210086e5f736a2c3622ebb62bd9d93d8e5d76508b98be922b97160edc3dcca6d8c47022100b23c312ac232a4473f19d2aeb95ab7bdf2b65518911a0d72d50e38b5dd31dc820121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac4730440220508fa761865c8abd81244a168392876ee1d94e8ed83897066b5e2df2400dad24022043f5ee7538e87e9c6aef7ef55133d3e51da7cc522830a9c4d736977a76ef755c0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", + "P2SH" + ], + + ["Same semantics for OP_CODESEPARATOR"], + [ + [ + [ + "10c9f0effe83e97f80f067de2b11c6a00c3088a4bce42c5ae761519af9306f3c", + 1, + "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG" + ] + ], + "01000000013c6f30f99a5161e75a2ce4bca488300ca0c6112bde67f0807fe983feeff0c91001000000e608646561646265656675ab61493046022100ce18d384221a731c993939015e3d1bcebafb16e8c0b5b5d14097ec8177ae6f28022100bcab227af90bab33c3fe0a9abfee03ba976ee25dc6ce542526e9b2e56e14b7f10121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac493046022100c3b93edcc0fd6250eb32f2dd8a0bba1754b0f6c3be8ed4100ed582f3db73eba2022100bf75b5bd2eff4d6bf2bda2e34a40fcc07d4aa3cf862ceaa77b47b81eff829f9a01ab21038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", + "P2SH" + ], + + [ + "Signatures are removed from the script they are in by FindAndDelete() in the CHECKSIG code; even multiple instances of one signature can be removed." + ], + [ + [ + [ + "6056ebd549003b10cbbd915cea0d82209fe40b8617104be917a26fa92cbe3d6f", + 0, + "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG" + ] + ], + "01000000016f3dbe2ca96fa217e94b1017860be49f20820dea5c91bdcb103b0049d5eb566000000000fd1d0147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140147304402203989ac8f9ad36b5d0919d97fa0a7f70c5272abee3b14477dc646288a8b976df5022027d19da84a066af9053ad3d1d7459d171b7e3a80bc6c4ef7a330677a6be548140121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ac47304402203757e937ba807e4a5da8534c17f9d121176056406a6465054bdd260457515c1a02200f02eccf1bec0f3a0d65df37889143c2e88ab7acec61a7b6f5aa264139141a2b0121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", + "P2SH" + ], + + ["That also includes ahead of the opcode being executed."], + [ + [ + [ + "5a6b0021a6042a686b6b94abc36b387bef9109847774e8b1e51eb8cc55c53921", + 1, + "DUP HASH160 0x14 0xee5a6aa40facefb2655ac23c0c28c57c65c41f9b EQUALVERIFY CHECKSIG" + ] + ], + "01000000012139c555ccb81ee5b1e87477840991ef7b386bc3ab946b6b682a04a621006b5a01000000fdb40148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390121038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f2204148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a5800390175ac4830450220646b72c35beeec51f4d5bc1cbae01863825750d7f490864af354e6ea4f625e9c022100f04b98432df3a9641719dbced53393022e7249fb59db993af1118539830aab870148304502201723e692e5f409a7151db386291b63524c5eb2030df652b1f53022fd8207349f022100b90d9bbf2f3366ce176e5e780a00433da67d9e5c79312c6388312a296a580039017521038479a0fa998cd35259a2ef0a7a5c68662c1474f88ccb6d08a7677bbec7f22041ffffffff010000000000000000016a00000000", + "P2SH" + ], + + [ + "Finally CHECKMULTISIG removes all signatures prior to hashing the script containing those signatures. In conjunction with the SIGHASH_SINGLE bug this lets us test whether or not FindAndDelete() is actually present in scriptPubKey/redeemScript evaluation by including a signature of the digest 0x01 We can compute in advance for our pubkey, embed it it in the scriptPubKey, and then also using a normal SIGHASH_ALL signature. If FindAndDelete() wasn't run, the 'bugged' signature would still be in the hashed script, and the normal signature would fail." + ], + + [ + "Here's an example on mainnet within a P2SH redeemScript. Remarkably it's a standard transaction in <0.9" + ], + [ + [ + [ + "b5b598de91787439afd5938116654e0b16b7a0d0f82742ba37564219c5afcbf9", + 0, + "DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG" + ], + [ + "ab9805c6d57d7070d9a42c5176e47bb705023e6b67249fb6760880548298e742", + 0, + "HASH160 0x14 0xd8dacdadb7462ae15cd906f1878706d0da8660e6 EQUAL" + ] + ], + "0100000002f9cbafc519425637ba4227f8d0a0b7160b4e65168193d5af39747891de98b5b5000000006b4830450221008dd619c563e527c47d9bd53534a770b102e40faa87f61433580e04e271ef2f960220029886434e18122b53d5decd25f1f4acb2480659fea20aabd856987ba3c3907e0121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffff42e7988254800876b69f24676b3e0205b77be476512ca4d970707dd5c60598ab00000000fd260100483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a53034930460221008431bdfa72bc67f9d41fe72e94c88fb8f359ffa30b33c72c121c5a877d922e1002210089ef5fc22dd8bfc6bf9ffdb01a9862d27687d424d1fefbab9e9c7176844a187a014c9052483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71210378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c7153aeffffffff01a08601000000000017a914d8dacdadb7462ae15cd906f1878706d0da8660e68700000000", + "P2SH" + ], + + ["Same idea, but with bare CHECKMULTISIG"], + [ + [ + [ + "ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db", + 0, + "DUP HASH160 0x14 0xf6f365c40f0739b61de827a44751e5e99032ed8f EQUALVERIFY CHECKSIG" + ], + [ + "ceafe58e0f6e7d67c0409fbbf673c84c166e3c5d3c24af58f7175b18df3bb3db", + 1, + "2 0x48 0x3045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 3 CHECKMULTISIG" + ] + ], + "0100000002dbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce000000006b4830450221009627444320dc5ef8d7f68f35010b4c050a6ed0d96b67a84db99fda9c9de58b1e02203e4b4aaa019e012e65d69b487fdf8719df72f488fa91506a80c49a33929f1fd50121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffffdbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce010000009300483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303ffffffff01a0860100000000001976a9149bc0bbdd3024da4d0c38ed1aecf5c68dd1d3fa1288ac00000000", + "P2SH" + ], + + ["CHECKLOCKTIMEVERIFY tests"], + + ["By-height locks, with argument == 0 and == tx nLockTime"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0 CHECKLOCKTIMEVERIFY 1" + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "499999999 CHECKLOCKTIMEVERIFY 1" + ] + ], + "0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0 CHECKLOCKTIMEVERIFY 1" + ] + ], + "0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + [ + "By-time locks, with argument just beyond tx nLockTime (but within numerical boundaries)" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "500000000 CHECKLOCKTIMEVERIFY 1" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4294967295 CHECKLOCKTIMEVERIFY 1" + ] + ], + "0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "500000000 CHECKLOCKTIMEVERIFY 1" + ] + ], + "0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + ["Any non-maxint nSequence is fine"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0 CHECKLOCKTIMEVERIFY 1" + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + [ + "The argument can be calculated rather than created directly by a PUSHDATA" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "499999999 1ADD CHECKLOCKTIMEVERIFY 1" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + [ + "Perhaps even by an ADD producing a 5-byte result that is out of bounds for other opcodes" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483647 2147483647 ADD CHECKLOCKTIMEVERIFY 1" + ] + ], + "0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000feffffff", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + ["5 byte non-minimally-encoded arguments are valid"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x05 0x0000000000 CHECKLOCKTIMEVERIFY 1" + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + ["Valid CHECKLOCKTIMEVERIFY in scriptSig"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "1" + ] + ], + "01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b1000000000100000000000000000001000000", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + ["Valid CHECKLOCKTIMEVERIFY in redeemScript"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0xc5b93064159b3b2d6ab506a41b1f50463771b988 EQUAL" + ] + ], + "0100000001000100000000000000000000000000000000000000000000000000000000000000000000030251b1000000000100000000000000000001000000", + "P2SH,CHECKLOCKTIMEVERIFY" + ], + + ["A transaction with a non-standard DER signature."], + [ + [ + [ + "b1dbc81696c8a9c0fccd0693ab66d7c368dbc38c0def4e800685560ddd1b2132", + 0, + "DUP HASH160 0x14 0x4b3bd7eba3bc0284fd3007be7f3be275e94f5826 EQUALVERIFY CHECKSIG" + ] + ], + "010000000132211bdd0d568506804eef0d8cc3db68c3d766ab9306cdfcc0a9c89616c8dbb1000000006c493045022100c7bb0faea0522e74ff220c20c022d2cb6033f8d167fb89e75a50e237a35fd6d202203064713491b1f8ad5f79e623d0219ad32510bfaa1009ab30cbee77b59317d6e30001210237af13eb2d84e4545af287b919c2282019c9691cc509e78e196a9d8274ed1be0ffffffff0100000000000000001976a914f1b3ed2eda9a2ebe5a9374f692877cdf87c0f95b88ac00000000", + "P2SH" + ], + + ["CHECKSEQUENCEVERIFY tests"], + + ["By-height locks, with argument == 0 and == txin.nSequence"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "65535 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "65535 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["By-time locks, with argument == 0 and == txin.nSequence"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4194304 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4259839 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff40000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4259839 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4194304 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["Upper sequence with upper sequence is fine"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483648 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4294967295 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000800100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483648 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4294967295 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483648 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4294967295 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["Argument 2^31 with various nSequence"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483648 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483648 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483648 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["Argument 2^32-1 with various nSequence"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4294967295 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4294967295 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4294967295 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["Argument 3<<31 with various nSequence"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "6442450944 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffbf7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "6442450944 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffff7f0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "6442450944 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["5 byte non-minimally-encoded operandss are valid"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x05 0x0000000000 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + [ + "The argument can be calculated rather than created directly by a PUSHDATA" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4194303 1ADD CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "4194304 1SUB CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000ffff00000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + [ + "An ADD producing a 5-byte result that sets CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483647 65536 CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "2147483647 4259840 ADD CHECKSEQUENCEVERIFY 1" + ] + ], + "020000000100010000000000000000000000000000000000000000000000000000000000000000000000000040000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["Valid CHECKSEQUENCEVERIFY in scriptSig"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "1" + ] + ], + "02000000010001000000000000000000000000000000000000000000000000000000000000000000000251b2010000000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + ["Valid CHECKSEQUENCEVERIFY in redeemScript"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0x7c17aff532f22beb54069942f9bf567a66133eaf EQUAL" + ] + ], + "0200000001000100000000000000000000000000000000000000000000000000000000000000000000030251b2010000000100000000000000000000000000", + "P2SH,CHECKSEQUENCEVERIFY" + ], + + [ + "Valid P2WPKH (Private key of segwit tests is L5AQtV2HDm4xGsseLokK2VAT2EtYKcTm3c7HwqnJBFt9LdaQULsM)" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1000 + ] + ], + "0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100cfb07164b36ba64c1b1e8c7720a56ad64d96f6ef332d3d37f9cb3c96477dc44502200a464cd7a9cf94cd70f66ce4f4f0625ef650052c7afcfe29d7d7e01830ff91ed012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", + "P2SH,WITNESS" + ], + + ["Valid P2WSH"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x00 0x20 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3db", + 1000 + ] + ], + "0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f74d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000", + "P2SH,WITNESS" + ], + + ["Valid P2SH(P2WPKH)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0xfe9c7dacc9fcfbf7e3b7d5ad06aa2b28c5a7b7e3 EQUAL", + 1000 + ] + ], + "01000000000101000100000000000000000000000000000000000000000000000000000000000000000000171600144c9c3dfac4207d5d8cb89df5722cb3d712385e3fffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100cfb07164b36ba64c1b1e8c7720a56ad64d96f6ef332d3d37f9cb3c96477dc44502200a464cd7a9cf94cd70f66ce4f4f0625ef650052c7afcfe29d7d7e01830ff91ed012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", + "P2SH,WITNESS" + ], + + ["Valid P2SH(P2WSH)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "HASH160 0x14 0x2135ab4f0981830311e35600eebc7376dce3a914 EQUAL", + 1000 + ] + ], + "0100000000010100010000000000000000000000000000000000000000000000000000000000000000000023220020ff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f74d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash Single|AnyoneCanPay"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3100 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1100 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 3, + "0x51", + 4100 + ] + ], + "0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff05540b0000000000000151d0070000000000000151840300000000000001513c0f00000000000001512c010000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71000000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash Single|AnyoneCanPay (same signature as previous)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000248304502210092f4777a0f17bf5aeb8ae768dec5f2c14feabf9d1fe2c89c78dfed0f13fdb86902206da90a86042e252bcd1e80a168c719e4a1ddcc3cebea24b9812c5453c79107e9832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash Single"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff0484030000000000000151d0070000000000000151540b0000000000000151c800000000000000015100024730440220699e6b0cfe015b64ca3283e6551440a34f901ba62dd4c72fe1cb815afb2e6761022021cc5e84db498b1479de14efda49093219441adc6c543e5534979605e273d80b032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash Single (same signature as previous)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b000000000000015100024730440220699e6b0cfe015b64ca3283e6551440a34f901ba62dd4c72fe1cb815afb2e6761022021cc5e84db498b1479de14efda49093219441adc6c543e5534979605e273d80b032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash None|AnyoneCanPay"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3100 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1100 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 3, + "0x51", + 4100 + ] + ], + "0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff04b60300000000000001519e070000000000000151860b00000000000001009600000000000000015100000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash None|AnyoneCanPay (same signature as previous)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000248304502210091b32274295c2a3fa02f5bce92fb2789e3fc6ea947fbe1a76e52ea3f4ef2381a022079ad72aefa3837a2e0c033a8652a59731da05fa4a813f4fc48e87c075037256b822103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash None"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff04b60300000000000001519e070000000000000151860b0000000000000100960000000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash None (same signature as previous)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash None (same signature, only sequences changed)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "01000000000103000100000000000000000000000000000000000000000000000000000000000000000000000200000000010000000000000000000000000000000000000000000000000000000000000100000000ffffffff000100000000000000000000000000000000000000000000000000000000000002000000000200000003e8030000000000000151d0070000000000000151b80b00000000000001510002473044022022fceb54f62f8feea77faac7083c3b56c4676a78f93745adc8a35800bc36adfa022026927df9abcf0a8777829bcfcce3ff0a385fa54c3f9df577405e3ef24ee56479022103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash All|AnyoneCanPay"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3100 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1100 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 3, + "0x51", + 4100 + ] + ], + "0100000000010400010000000000000000000000000000000000000000000000000000000000000200000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000300000000ffffffff03e8030000000000000151d0070000000000000151b80b0000000000000151000002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with SigHash All|AnyoneCanPay (same signature as previous)"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623eeef89e0ba1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + [ + "Unknown witness program version (without DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM)" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 2000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "0x51", + 3000 + ] + ], + "0100000000010300010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000200000000ffffffff03e8030000000000000151d0070000000000000151b80b00000000000001510002483045022100a3cec69b52cba2d2de623ffffffffff1606184ea55476c0f8189fda231bc9cbb022003181ad597f7c380a7d1c740286b1d022b8b04ded028b833282e055e03b8efef812103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Witness with a push of 520 bytes"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x00 0x20 0x33198a9bfef674ebddb9ffaa52928017b8472791e54c609cb95f278ac6b1e349", + 1000 + ] + ], + "0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff010000000000000000015102fd08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002755100000000", + "P2SH,WITNESS" + ], + + ["Transaction mixing all SigHash, segwit and normal inputs"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1001 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 2, + "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", + 1002 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 3, + "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", + 1003 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 4, + "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", + 1004 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 5, + "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", + 1005 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 6, + "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", + 1006 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 7, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1007 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 8, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1008 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 9, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1009 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 10, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1010 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 11, + "DUP HASH160 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f EQUALVERIFY CHECKSIG", + 1011 + ] + ], + "0100000000010c00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff0001000000000000000000000000000000000000000000000000000000000000020000006a473044022026c2e65b33fcd03b2a3b0f25030f0244bd23cc45ae4dec0f48ae62255b1998a00220463aa3982b718d593a6b9e0044513fd67a5009c2fdccc59992cffc2b167889f4012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000030000006a4730440220008bd8382911218dcb4c9f2e75bf5c5c3635f2f2df49b36994fde85b0be21a1a02205a539ef10fb4c778b522c1be852352ea06c67ab74200977c722b0bc68972575a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000040000006b483045022100d9436c32ff065127d71e1a20e319e4fe0a103ba0272743dbd8580be4659ab5d302203fd62571ee1fe790b182d078ecfd092a509eac112bea558d122974ef9cc012c7012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000050000006a47304402200e2c149b114ec546015c13b2b464bbcb0cdc5872e6775787527af6cbc4830b6c02207e9396c6979fb15a9a2b96ca08a633866eaf20dc0ff3c03e512c1d5a1654f148012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0001000000000000000000000000000000000000000000000000000000000000060000006b483045022100b20e70d897dc15420bccb5e0d3e208d27bdd676af109abbd3f88dbdb7721e6d6022005836e663173fbdfe069f54cde3c2decd3d0ea84378092a5d9d85ec8642e8a41012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff00010000000000000000000000000000000000000000000000000000000000000700000000ffffffff00010000000000000000000000000000000000000000000000000000000000000800000000ffffffff00010000000000000000000000000000000000000000000000000000000000000900000000ffffffff00010000000000000000000000000000000000000000000000000000000000000a00000000ffffffff00010000000000000000000000000000000000000000000000000000000000000b0000006a47304402206639c6e05e3b9d2675a7f3876286bdf7584fe2bbd15e0ce52dd4e02c0092cdc60220757d60b0a61fc95ada79d23746744c72bac1545a75ff6c2c7cdb6ae04e7e9592012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ffffffff0ce8030000000000000151e9030000000000000151ea030000000000000151eb030000000000000151ec030000000000000151ed030000000000000151ee030000000000000151ef030000000000000151f0030000000000000151f1030000000000000151f2030000000000000151f30300000000000001510248304502210082219a54f61bf126bfc3fa068c6e33831222d1d7138c6faa9d33ca87fd4202d6022063f9902519624254d7c2c8ea7ba2d66ae975e4e229ae38043973ec707d5d4a83012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7102473044022017fb58502475848c1b09f162cb1688d0920ff7f142bed0ef904da2ccc88b168f02201798afa61850c65e77889cbcd648a5703b487895517c88f85cdd18b021ee246a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000000247304402202830b7926e488da75782c81a54cd281720890d1af064629ebf2e31bf9f5435f30220089afaa8b455bbeb7d9b9c3fe1ed37d07685ade8455c76472cda424d93e4074a012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7102473044022026326fcdae9207b596c2b05921dbac11d81040c4d40378513670f19d9f4af893022034ecd7a282c0163b89aaa62c22ec202cef4736c58cd251649bad0d8139bcbf55012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71024730440220214978daeb2f38cd426ee6e2f44131a33d6b191af1c216247f1dd7d74c16d84a02205fdc05529b0bc0c430b4d5987264d9d075351c4f4484c16e91662e90a72aab24012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710247304402204a6e9f199dc9672cf2ff8094aaa784363be1eb62b679f7ff2df361124f1dca3302205eeb11f70fab5355c9c8ad1a0700ea355d315e334822fa182227e9815308ee8f012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710000000000", + "P2SH,WITNESS" + ], + + ["Unknown version witness program with empty witness"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x60 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1000 + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", + "P2SH,WITNESS" + ], + + ["Witness SIGHASH_SINGLE with output out of bound"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x51", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x20 0x4d6c2a32c87821d68fc016fca70797abdb80df6cd84651d40a9300c6bad79e62", + 1000 + ] + ], + "0100000000010200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff01d00700000000000001510003483045022100e078de4e96a0e05dcdc0a414124dd8475782b5f3f0ed3f607919e9a5eeeb22bf02201de309b3a3109adb3de8074b3610d4cf454c49b61247a2779a0bcbf31c889333032103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc711976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac00000000", + "P2SH,WITNESS" + ], + + ["1 byte push should not be considered a witness scriptPubKey"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x60 0x01 0x01", + 1000 + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", + "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM" + ], + + ["41 bytes push should not be considered a witness scriptPubKey"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x60 0x29 0xff25429251b5a84f452230a3c75fd886b7fc5a7865ce4a7bb7a9d7c5be6da3dbff0000000000000000", + 1000 + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", + "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM" + ], + + ["The witness version must use OP_1 to OP_16 only"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x01 0x10 0x02 0x0001", + 1000 + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", + "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM" + ], + + ["The witness program push must be canonical"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x60 0x4c02 0x0001", + 1000 + ] + ], + "010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e803000000000000015100000000", + "P2SH,WITNESS,DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM" + ], + + ["Witness Single|AnyoneCanPay does not hash input's position"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1001 + ] + ], + "0100000000010200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00010000000000000000000000000000000000000000000000000000000000000100000000ffffffff02e8030000000000000151e90300000000000001510247304402206d59682663faab5e4cb733c562e22cdae59294895929ec38d7c016621ff90da0022063ef0af5f970afe8a45ea836e3509b8847ed39463253106ac17d19c437d3d56b832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710248304502210085001a820bfcbc9f9de0298af714493f8a37b3b354bfd21a7097c3e009f2018c022050a8b4dbc8155d4d04da2f5cdd575dcf8dd0108de8bec759bd897ea01ecb3af7832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", + "P2SH,WITNESS" + ], + + [ + "Witness Single|AnyoneCanPay does not hash input's position (permutation)" + ], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1001 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", + 1000 + ] + ], + "0100000000010200010000000000000000000000000000000000000000000000000000000000000100000000ffffffff00010000000000000000000000000000000000000000000000000000000000000000000000ffffffff02e9030000000000000151e80300000000000001510248304502210085001a820bfcbc9f9de0298af714493f8a37b3b354bfd21a7097c3e009f2018c022050a8b4dbc8155d4d04da2f5cdd575dcf8dd0108de8bec759bd897ea01ecb3af7832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc710247304402206d59682663faab5e4cb733c562e22cdae59294895929ec38d7c016621ff90da0022063ef0af5f970afe8a45ea836e3509b8847ed39463253106ac17d19c437d3d56b832103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", + "P2SH,WITNESS" + ], + + ["Non witness Single|AnyoneCanPay hash input's position"], + [ + [ + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 0, + "0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG", + 1000 + ], + [ + "0000000000000000000000000000000000000000000000000000000000000100", + 1, + "0x21 0x03596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71 CHECKSIG", + 1001 + ] + ], + "01000000020001000000000000000000000000000000000000000000000000000000000000000000004847304402202a0b4b1294d70540235ae033d78e64b4897ec859c7b6f1b2b1d8a02e1d46006702201445e756d2254b0f1dfda9ab8e1e1bc26df9668077403204f32d16a49a36eb6983ffffffff00010000000000000000000000000000000000000000000000000000000000000100000049483045022100acb96cfdbda6dc94b489fd06f2d720983b5f350e31ba906cdbd800773e80b21c02200d74ea5bdf114212b4bbe9ed82c36d2e369e302dff57cb60d01c428f0bd3daab83ffffffff02e8030000000000000151e903000000000000015100000000", + "P2SH,WITNESS" + ], + + ["BIP143 examples: details and private keys are available in BIP143"], + [ + "BIP143 example: P2WSH with OP_CODESEPARATOR and out-of-range SIGHASH_SINGLE." + ], + [ + [ + [ + "6eb316926b1c5d567cd6f5e6a84fec606fc53d7b474526d1fff3948020c93dfe", + 0, + "0x21 0x036d5c20fa14fb2f635474c1dc4ef5909d4568e5569b79fc94d3448486e14685f8 CHECKSIG", + 156250000 + ], + [ + "f825690aee1b3dc247da796cacb12687a5e802429fd291cfd63e010f02cf1508", + 0, + "0x00 0x20 0x5d1b56b63d714eebe542309525f484b7e9d6f686b3781b6f61ef925d66d6f6a0", + 4900000000 + ] + ], + "01000000000102fe3dc9208094f3ffd12645477b3dc56f60ec4fa8e6f5d67c565d1c6b9216b36e000000004847304402200af4e47c9b9629dbecc21f73af989bdaa911f7e6f6c2e9394588a3aa68f81e9902204f3fcf6ade7e5abb1295b6774c8e0abd94ae62217367096bc02ee5e435b67da201ffffffff0815cf020f013ed6cf91d29f4202e8a58726b1ac6c79da47c23d1bee0a6925f80000000000ffffffff0100f2052a010000001976a914a30741f8145e5acadf23f751864167f32e0963f788ac000347304402200de66acf4527789bfda55fc5459e214fa6083f936b430a762c629656216805ac0220396f550692cd347171cbc1ef1f51e15282e837bb2b30860dc77c8f78bc8501e503473044022027dc95ad6b740fe5129e7e62a75dd00f291a2aeb1200b84b09d9e3789406b6c002201a9ecd315dd6a0e632ab20bbb98948bc0c6fb204f2c286963bb48517a7058e27034721026dccc749adc2a9d0d89497ac511f760f45c47dc5ed9cf352a58ac706453880aeadab210255a9626aebf5e29c0e6538428ba0d1dcf6ca98ffdf086aa8ced5e0d0215ea465ac00000000", + "P2SH,WITNESS" + ], + + [ + "BIP143 example: P2WSH with unexecuted OP_CODESEPARATOR and SINGLE|ANYONECANPAY" + ], + [ + [ + [ + "01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", + 0, + "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", + 16777215 + ], + [ + "1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", + 0, + "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", + 16777215 + ] + ], + "01000000000102e9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff80e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffff0280969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac80969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", + "P2SH,WITNESS" + ], + + [ + "BIP143 example: Same as the previous example with input-output paris swapped" + ], + [ + [ + [ + "1b2a9a426ba603ba357ce7773cb5805cb9c7c2b386d100d1fc9263513188e680", + 0, + "0x00 0x20 0xd9bbfbe56af7c4b7f960a70d7ea107156913d9e5a26b0a71429df5e097ca6537", + 16777215 + ], + [ + "01c0cf7fba650638e55eb91261b183251fbb466f90dff17f10086817c542b5e9", + 0, + "0x00 0x20 0xba468eea561b26301e4cf69fa34bde4ad60c81e70f059f045ca9a79931004a4d", + 16777215 + ] + ], + "0100000000010280e68831516392fcd100d186b3c2c7b95c80b53c77e77c35ba03a66b429a2a1b0000000000ffffffffe9b542c5176808107ff1df906f46bb1f2583b16112b95ee5380665ba7fcfc0010000000000ffffffff0280969800000000001976a9146648a8cd4531e1ec47f35916de8e259237294d1e88ac80969800000000001976a914de4b231626ef508c9a74a8517e6783c0546d6b2888ac024730440220032521802a76ad7bf74d0e2c218b72cf0cbc867066e2e53db905ba37f130397e02207709e2188ed7f08f4c952d9d13986da504502b8c3be59617e043552f506c46ff83275163ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac02483045022100f6a10b8604e6dc910194b79ccfc93e1bc0ec7c03453caaa8987f7d6c3413566002206216229ede9b4d6ec2d325be245c5b508ff0339bf1794078e20bfe0babc7ffe683270063ab68210392972e2eb617b2388771abe27235fd5ac44af8e61693261550447a4c3e39da98ac00000000", + "P2SH,WITNESS" + ], + + [ + "BIP143 example: P2SH-P2WSH 6-of-6 multisig signed with 6 different SIGHASH types" + ], + [ + [ + [ + "6eb98797a21c6c10aa74edf29d618be109f48a8e94c694f3701e08ca69186436", + 1, + "HASH160 0x14 0x9993a429037b5d912407a71c252019287b8d27a5 EQUAL", + 987654321 + ] + ], + "0100000000010136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000023220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac080047304402206ac44d672dac41f9b00e28f4df20c52eeb087207e8d758d76d92c6fab3b73e2b0220367750dbbe19290069cba53d096f44530e4f98acaa594810388cf7409a1870ce01473044022068c7946a43232757cbdf9176f009a928e1cd9a1a8c212f15c1e11ac9f2925d9002205b75f937ff2f9f3c1246e547e54f62e027f64eefa2695578cc6432cdabce271502473044022059ebf56d98010a932cf8ecfec54c48e6139ed6adb0728c09cbe1e4fa0915302e022007cd986c8fa870ff5d2b3a89139c9fe7e499259875357e20fcbb15571c76795403483045022100fbefd94bd0a488d50b79102b5dad4ab6ced30c4069f1eaa69a4b5a763414067e02203156c6a5c9cf88f91265f5a942e96213afae16d83321c8b31bb342142a14d16381483045022100a5263ea0553ba89221984bd7f0b13613db16e7a70c549a86de0cc0444141a407022005c360ef0ae5a5d4f9f2f87a56c1546cc8268cab08c73501d6b3be2e1e1a8a08824730440220525406a1482936d5a21888260dc165497a90a15669636d8edca6b9fe490d309c022032af0c646a34a44d1f4576bf6a4a74b67940f8faa84c7df9abe12a01a11e2b4783cf56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae00000000", + "P2SH,WITNESS" + ], + + ["FindAndDelete tests"], + [ + "This is a test of FindAndDelete. The first tx is a spend of normal P2SH and the second tx is a spend of bare P2WSH." + ], + [ + "The redeemScript/witnessScript is CHECKSIGVERIFY <0x30450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01>." + ], + [ + "The signature is <0x30450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01> ," + ], + [ + "where the pubkey is obtained through key recovery with sig and correct sighash." + ], + [ + "This is to show that FindAndDelete is applied only to non-segwit scripts" + ], + [ + "Non-segwit: correct sighash (with FindAndDelete) = 1ba1fe3bc90c5d1265460e684ce6774e324f0fabdf67619eda729e64e8b6bc08" + ], + [ + [ + [ + "f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169", + 7000, + "HASH160 0x14 0x0c746489e2d83cdbb5b90b432773342ba809c134 EQUAL", + 200000 + ] + ], + "010000000169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f1581b0000b64830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0121037a3fb04bcdb09eba90f69961ba1692a3528e45e67c85b200df820212d7594d334aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e01ffffffff0101000000000000000000000000", + "P2SH,WITNESS" + ], + [ + "BIP143: correct sighash (without FindAndDelete) = 71c9cd9b2869b9c70b01b1f0360c148f42dee72297db312638df136f43311f23" + ], + [ + [ + [ + "f18783ace138abac5d3a7a5cf08e88fe6912f267ef936452e0c27d090621c169", + 7500, + "0x00 0x20 0x9e1be07558ea5cc8e02ed1d80c0911048afad949affa36d5c3951e3159dbea19", + 200000 + ] + ], + "0100000000010169c12106097dc2e0526493ef67f21269fe888ef05c7a3a5dacab38e1ac8387f14c1d000000ffffffff01010000000000000000034830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e012102a9781d66b61fb5a7ef00ac5ad5bc6ffc78be7b44a566e3c87870e1079368df4c4aad4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0100000000", + "P2SH,WITNESS" + ], + ["This is multisig version of the FindAndDelete tests"], + ["Script is 2 CHECKMULTISIGVERIFY DROP"], + [ + "52af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175" + ], + ["Signature is 0 2 "], + [ + "Non-segwit: correct sighash (with FindAndDelete) = 1d50f00ba4db2917b903b0ec5002e017343bb38876398c9510570f5dce099295" + ], + [ + [ + [ + "9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592", + 7000, + "HASH160 0x14 0x5748407f5ca5cdca53ba30b79040260770c9ee1b EQUAL", + 200000 + ] + ], + "01000000019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a662896581b0000fd6f01004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c03959601522102cd74a2809ffeeed0092bc124fd79836706e41f048db3f6ae9df8708cefb83a1c2102e615999372426e46fd107b76eaf007156a507584aa2cc21de9eee3bdbd26d36c4c9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960175ffffffff0101000000000000000000000000", + "P2SH,WITNESS" + ], + [ + "BIP143: correct sighash (without FindAndDelete) = c1628a1e7c67f14ca0c27c06e4fdeec2e6d1a73c7a91d7c046ff83e835aebb72" + ], + [ + [ + [ + "9628667ad48219a169b41b020800162287d2c0f713c04157e95c484a8dcb7592", + 7500, + "0x00 0x20 0x9b66c15b4e0b4eb49fa877982cafded24859fe5b0e2dbfbe4f0df1de7743fd52", + 200000 + ] + ], + "010000000001019275cb8d4a485ce95741c013f7c0d28722160008021bb469a11982d47a6628964c1d000000ffffffff0101000000000000000007004830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c0395960101022102966f109c54e85d3aee8321301136cedeb9fc710fdef58a9de8a73942f8e567c021034ffc99dd9a79dd3cb31e2ab3e0b09e0e67db41ac068c625cd1f491576016c84e9552af4830450220487fb382c4974de3f7d834c1b617fe15860828c7f96454490edd6d891556dcc9022100baf95feb48f845d5bfc9882eb6aeefa1bc3790e39f59eaa46ff7f15ae626c53e0148304502205286f726690b2e9b0207f0345711e63fa7012045b9eb0f19c2458ce1db90cf43022100e89f17f86abc5b149eba4115d4f128bcf45d77fb3ecdd34f594091340c039596017500000000", + "P2SH,WITNESS" + ], + + ["Make diffs cleaner by leaving a comment here without comma at the end"] +] diff --git a/web/bitcoincashjs-lib/test/fixtures/crypto.json b/web/bitcoincashjs-lib/test/fixtures/crypto.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/crypto.json @@ -0,0 +1,34 @@ +[ + { + "hex": "0000000000000001", + "hash160": "cdb00698f02afd929ffabea308340fa99ac2afa8", + "hash256": "3ae5c198d17634e79059c2cd735491553d22c4e09d1d9fea3ecf214565df2284", + "ripemd160": "8d1a05d1bc08870968eb8a81ad4393fd3aac6633", + "sha1": "cb473678976f425d6ec1339838f11011007ad27d", + "sha256": "cd2662154e6d76b2b2b92e70c0cac3ccf534f9b74eb5b89819ec509083d00a50" + }, + { + "hex": "0101010101010101", + "hash160": "abaf1119f83e384210fe8e222eac76e2f0da39dc", + "hash256": "728338d99f356175c4945ef5cccfa61b7b56143cbbf426ddd0e0fc7cfe8c3c23", + "ripemd160": "5825701b4b9767fd35063b286dca3582853e0630", + "sha1": "c0357a32ed1f6a03be92dd094476f7f1a2e214ec", + "sha256": "04abc8821a06e5a30937967d11ad10221cb5ac3b5273e434f1284ee87129a061" + }, + { + "hex": "ffffffffffffffff", + "hash160": "f86221f5a1fca059a865c0b7d374dfa9d5f3aeb4", + "hash256": "752adad0a7b9ceca853768aebb6965eca126a62965f698a0c1bc43d83db632ad", + "ripemd160": "cb760221600ed34337ca3ab70016b5f58c838120", + "sha1": "be673e8a56eaa9d8c1d35064866701c11ef8e089", + "sha256": "12a3ae445661ce5dee78d0650d33362dec29c4f82af05e7e57fb595bbbacf0ca" + }, + { + "hex": "4c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e20446f6e65632061742066617563696275732073617069656e2c2076656c20666163696c6973697320617263752e20536564207574206d61737361206e6962682e205574206d6f6c6c69732070756c76696e6172206d617373612e20557420756c6c616d636f7270657220646f6c6f7220656e696d2c20696e206d6f6c657374696520656e696d20636f6e64696d656e74756d2061632e20416c697175616d206572617420766f6c75747061742e204e756c6c6120736f64616c657320617420647569206e656320", + "hash160": "9763e6b367c363bd6b88a7b361c98e6beee243a5", + "hash256": "033588797115feb3545052670cac2a46584ab3cb460de63756ee0275e66b5799", + "ripemd160": "cad8593dcdef12ee334c97bab9787f07b3f3a1a5", + "sha1": "10d96fb43aca84e342206887bbeed3065d4e4344", + "sha256": "a7fb8276035057ed6479c5f2305a96da100ac43f0ac10f277e5ab8c5457429da" + } +] diff --git a/web/bitcoincashjs-lib/test/fixtures/ecdsa.json b/web/bitcoincashjs-lib/test/fixtures/ecdsa.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/ecdsa.json @@ -0,0 +1,200 @@ +{ + "valid": { + "ecdsa": [ + { + "d": "01", + "k": "ec633bd56a5774a0940cb97e27a9e4e51dc94af737596a0c5cbb3d30332d92a5", + "message": "Everything should be made as simple as possible, but not simpler.", + "i": 0, + "signature": "3044022033a69cd2065432a30f3d1ce4eb0d59b8ab58c74f27c41a7fdb5696ad4e6108c902206f807982866f785d3f6418d24163ddae117b7db4d5fdf0071de069fa54342262" + }, + { + "d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "k": "9dc74cbfd383980fb4ae5d2680acddac9dac956dca65a28c80ac9c847c2374e4", + "message": "Equations are more important to me, because politics is for the present, but an equation is something for eternity.", + "i": 0, + "signature": "3044022054c4a33c6423d689378f160a7ff8b61330444abb58fb470f96ea16d99d4a2fed022007082304410efa6b2943111b6a4e0aaa7b7db55a07e9861d1fb3cb1f421044a5" + }, + { + "d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "k": "fd27071f01648ebbdd3e1cfbae48facc9fa97edc43bbbc9a7fdc28eae13296f5", + "message": "Not only is the Universe stranger than we think, it is stranger than we can think.", + "i": 0, + "signature": "3045022100ff466a9f1b7b273e2f4c3ffe032eb2e814121ed18ef84665d0f515360dab3dd002206fc95f5132e5ecfdc8e5e6e616cc77151455d46ed48f5589b7db7771a332b283" + }, + { + "d": "0000000000000000000000000000000000000000000000000000000000000001", + "k": "f0cd2ba5fc7c183de589f6416220a36775a146740798756d8d949f7166dcc87f", + "message": "How wonderful that we have met with a paradox. Now we have some hope of making progress.", + "i": 1, + "signature": "3045022100c0dafec8251f1d5010289d210232220b03202cba34ec11fec58b3e93a85b91d3022075afdc06b7d6322a590955bf264e7aaa155847f614d80078a90292fe205064d3" + }, + { + "d": "69ec59eaa1f4f2e36b639716b7c30ca86d9a5375c7b38d8918bd9c0ebc80ba64", + "k": "6bb4a594ad57c1aa22dbe991a9d8501daf4688bf50a4892ef21bd7c711afda97", + "message": "Computer science is no more about computers than astronomy is about telescopes.", + "i": 0, + "signature": "304402207186363571d65e084e7f02b0b77c3ec44fb1b257dee26274c38c928986fea45d02200de0b38e06807e46bda1f1e293f4f6323e854c86d58abdd00c46c16441085df6" + }, + { + "d": "00000000000000000000000000007246174ab1e92e9149c6e446fe194d072637", + "k": "097b5c8ee22c3ea78a4d3635e0ff6fe85a1eb92ce317ded90b9e71aab2b861cb", + "message": "...if you aren't, at any given time, scandalized by code you wrote five or even three years ago, you're not learning anywhere near enough", + "i": 1, + "signature": "3045022100fbfe5076a15860ba8ed00e75e9bd22e05d230f02a936b653eb55b61c99dda48702200e68880ebb0050fe4312b1b1eb0899e1b82da89baa5b895f612619edf34cbd37" + }, + { + "d": "000000000000000000000000000000000000000000056916d0f9b31dc9b637f3", + "k": "19355c36c8cbcdfb2382e23b194b79f8c97bf650040fc7728dfbf6b39a97c25b", + "message": "The question of whether computers can think is like the question of whether submarines can swim.", + "i": 1, + "signature": "3045022100cde1302d83f8dd835d89aef803c74a119f561fbaef3eb9129e45f30de86abbf9022006ce643f5049ee1f27890467b77a6a8e11ec4661cc38cd8badf90115fbd03cef" + } + ], + "rfc6979": [ + { + "message": "test data", + "d": "fee0a1f7afebf9d2a5a80c0c98a31c709681cce195cbcd06342b517970c0be1e", + "k0": "fcce1de7a9bcd6b2d3defade6afa1913fb9229e3b7ddf4749b55c4848b2a196e", + "k1": "727fbcb59eb48b1d7d46f95a04991fc512eb9dbf9105628e3aec87428df28fd8", + "k15": "398f0e2c9f79728f7b3d84d447ac3a86d8b2083c8f234a0ffa9c4043d68bd258" + }, + { + "message": "Everything should be made as simple as possible, but not simpler.", + "d": "0000000000000000000000000000000000000000000000000000000000000001", + "k0": "ec633bd56a5774a0940cb97e27a9e4e51dc94af737596a0c5cbb3d30332d92a5", + "k1": "df55b6d1b5c48184622b0ead41a0e02bfa5ac3ebdb4c34701454e80aabf36f56", + "k15": "def007a9a3c2f7c769c75da9d47f2af84075af95cadd1407393dc1e26086ef87" + }, + { + "message": "Satoshi Nakamoto", + "d": "0000000000000000000000000000000000000000000000000000000000000002", + "k0": "d3edc1b8224e953f6ee05c8bbf7ae228f461030e47caf97cde91430b4607405e", + "k1": "f86d8e43c09a6a83953f0ab6d0af59fb7446b4660119902e9967067596b58374", + "k15": "241d1f57d6cfd2f73b1ada7907b199951f95ef5ad362b13aed84009656e0254a" + }, + { + "message": "Diffie Hellman", + "d": "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "k0": "c378a41cb17dce12340788dd3503635f54f894c306d52f6e9bc4b8f18d27afcc", + "k1": "90756c96fef41152ac9abe08819c4e95f16da2af472880192c69a2b7bac29114", + "k15": "7b3f53300ab0ccd0f698f4d67db87c44cf3e9e513d9df61137256652b2e94e7c" + }, + { + "message": "Japan", + "d": "8080808080808080808080808080808080808080808080808080808080808080", + "k0": "f471e61b51d2d8db78f3dae19d973616f57cdc54caaa81c269394b8c34edcf59", + "k1": "6819d85b9730acc876fdf59e162bf309e9f63dd35550edf20869d23c2f3e6d17", + "k15": "d8e8bae3ee330a198d1f5e00ad7c5f9ed7c24c357c0a004322abca5d9cd17847" + }, + { + "message": "Bitcoin", + "d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "k0": "36c848ffb2cbecc5422c33a994955b807665317c1ce2a0f59c689321aaa631cc", + "k1": "4ed8de1ec952a4f5b3bd79d1ff96446bcd45cabb00fc6ca127183e14671bcb85", + "k15": "56b6f47babc1662c011d3b1f93aa51a6e9b5f6512e9f2e16821a238d450a31f8" + }, + { + "message": "i2FLPP8WEus5WPjpoHwheXOMSobUJVaZM1JPMQZq", + "d": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + "k0": "6e9b434fcc6bbb081a0463c094356b47d62d7efae7da9c518ed7bac23f4e2ed6", + "k1": "ae5323ae338d6117ce8520a43b92eacd2ea1312ae514d53d8e34010154c593bb", + "k15": "3eaa1b61d1b8ab2f1ca71219c399f2b8b3defa624719f1e96fe3957628c2c4ea" + }, + { + "message": "lEE55EJNP7aLrMtjkeJKKux4Yg0E8E1SAJnWTCEh", + "d": "3881e5286abc580bb6139fe8e83d7c8271c6fe5e5c2d640c1f0ed0e1ee37edc9", + "k0": "5b606665a16da29cc1c5411d744ab554640479dd8abd3c04ff23bd6b302e7034", + "k1": "f8b25263152c042807c992eacd2ac2cc5790d1e9957c394f77ea368e3d9923bd", + "k15": "ea624578f7e7964ac1d84adb5b5087dd14f0ee78b49072aa19051cc15dab6f33" + }, + { + "message": "2SaVPvhxkAPrayIVKcsoQO5DKA8Uv5X/esZFlf+y", + "d": "7259dff07922de7f9c4c5720d68c9745e230b32508c497dd24cb95ef18856631", + "k0": "3ab6c19ab5d3aea6aa0c6da37516b1d6e28e3985019b3adb388714e8f536686b", + "k1": "19af21b05004b0ce9cdca82458a371a9d2cf0dc35a813108c557b551c08eb52e", + "k15": "117a32665fca1b7137a91c4739ac5719fec0cf2e146f40f8e7c21b45a07ebc6a" + }, + { + "message": "00A0OwO2THi7j5Z/jp0FmN6nn7N/DQd6eBnCS+/b", + "d": "0d6ea45d62b334777d6995052965c795a4f8506044b4fd7dc59c15656a28f7aa", + "k0": "79487de0c8799158294d94c0eb92ee4b567e4dc7ca18addc86e49d31ce1d2db6", + "k1": "9561d2401164a48a8f600882753b3105ebdd35e2358f4f808c4f549c91490009", + "k15": "b0d273634129ff4dbdf0df317d4062a1dbc58818f88878ffdb4ec511c77976c0" + } + ] + }, + "invalid": { + "verify": [ + { + "description": "The wrong signature", + "d": "01", + "message": "foo", + "signature": "3044022054c4a33c6423d689378f160a7ff8b61330444abb58fb470f96ea16d99d4a2fed022007082304410efa6b2943111b6a4e0aaa7b7db55a07e9861d1fb3cb1f421044a5" + }, + { + "description": "Invalid r value (< 0)", + "d": "01", + "message": "foo", + "signatureRaw": { + "r": "-01", + "s": "02" + } + }, + { + "description": "Invalid r value (== 0)", + "d": "01", + "message": "foo", + "signatureRaw": { + "r": "00", + "s": "02" + } + }, + { + "description": "Invalid r value (>= n)", + "d": "01", + "message": "foo", + "signatureRaw": { + "r": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "s": "02" + } + }, + { + "description": "Invalid s value (< 0)", + "d": "01", + "message": "foo", + "signatureRaw": { + "r": "02", + "s": "-01" + } + }, + { + "description": "Invalid s value (== 0)", + "d": "01", + "message": "foo", + "signatureRaw": { + "r": "02", + "s": "00" + } + }, + { + "description": "Invalid s value (>= n)", + "d": "01", + "message": "foo", + "signatureRaw": { + "r": "02", + "s": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + }, + { + "description": "Invalid r, s values (r = s = -n)", + "d": "01", + "message": "foo", + "signatureRaw": { + "r": "-fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", + "s": "-fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141" + } + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/ecpair.json b/web/bitcoincashjs-lib/test/fixtures/ecpair.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/ecpair.json @@ -0,0 +1,130 @@ +{ + "valid": [ + { + "d": "1", + "Q": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "compressed": true, + "network": "bitcoin", + "address": "1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH", + "WIF": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + }, + { + "d": "1", + "Q": "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "compressed": false, + "network": "bitcoin", + "address": "1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm", + "WIF": "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf" + }, + { + "d": "19898843618908353587043383062236220484949425084007183071220218307100305431102", + "Q": "02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340", + "compressed": true, + "network": "bitcoin", + "address": "1MasfEKgSiaSeri2C6kgznaqBNtyrZPhNq", + "WIF": "KxhEDBQyyEFymvfJD96q8stMbJMbZUb6D1PmXqBWZDU2WvbvVs9o" + }, + { + "d": "48968302285117906840285529799176770990048954789747953886390402978935544927851", + "Q": "024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34", + "compressed": true, + "network": "bitcoin", + "address": "1LwwMWdSEMHJ2dMhSvAHZ3g95tG2UBv9jg", + "WIF": "KzrA86mCVMGWnLGBQu9yzQa32qbxb5dvSK4XhyjjGAWSBKYX4rHx" + }, + { + "d": "48968302285117906840285529799176770990048954789747953886390402978935544927851", + "Q": "044289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34cec320a0565fb7caf11b1ca2f445f9b7b012dda5718b3cface369ee3a034ded6", + "compressed": false, + "network": "bitcoin", + "address": "1zXcfvKCLgsFdJDYPuqpu1sF3q92tnnUM", + "WIF": "5JdxzLtFPHNe7CAL8EBC6krdFv9pwPoRo4e3syMZEQT9srmK8hh" + }, + { + "d": "48968302285117906840285529799176770990048954789747953886390402978935544927851", + "Q": "024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34", + "compressed": true, + "network": "testnet", + "address": "n1TteZiR3NiYojqKAV8fNxtTwsrjM7kVdj", + "WIF": "cRD9b1m3vQxmwmjSoJy7Mj56f4uNFXjcWMCzpQCEmHASS4edEwXv" + }, + { + "d": "48968302285117906840285529799176770990048954789747953886390402978935544927851", + "Q": "044289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34cec320a0565fb7caf11b1ca2f445f9b7b012dda5718b3cface369ee3a034ded6", + "compressed": false, + "network": "testnet", + "address": "mgWUuj1J1N882jmqFxtDepEC73Rr22E9GU", + "WIF": "92Qba5hnyWSn5Ffcka56yMQauaWY6ZLd91Vzxbi4a9CCetaHtYj" + }, + { + "d": "115792089237316195423570985008687907852837564279074904382605163141518161494336", + "Q": "0379be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "compressed": true, + "network": "bitcoin", + "address": "1GrLCmVQXoyJXaPJQdqssNqwxvha1eUo2E", + "WIF": "L5oLkpV3aqBjhki6LmvChTCV6odsp4SXM6FfU2Gppt5kFLaHLuZ9" + } + ], + "invalid": { + "constructor": [ + { + "exception": "Private key must be greater than 0", + "d": "-1" + }, + { + "exception": "Private key must be greater than 0", + "d": "0" + }, + { + "exception": "Private key must be less than the curve order", + "d": "115792089237316195423570985008687907852837564279074904382605163141518161494337" + }, + { + "exception": "Private key must be less than the curve order", + "d": "115792089237316195423570985008687907853269984665640564039457584007913129639935" + }, + { + "exception": "Expected property \"compressed\" of type \\?Boolean, got Number 2", + "d": "1", + "options": { + "compressed": 2 + } + }, + { + "exception": "Unexpected publicKey parameter", + "d": "1", + "Q": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" + }, + { + "exception": "Expected property \"network.messagePrefix\" of type Buffer|String, got undefined", + "d": "1", + "options": { + "network": {} + } + } + ], + "fromWIF": [ + { + "exception": "Invalid network version", + "network": "bitcoin", + "WIF": "92Qba5hnyWSn5Ffcka56yMQauaWY6ZLd91Vzxbi4a9CCetaHtYj" + }, + { + "exception": "Unknown network version", + "WIF": "brQnSed3Fia1w9VcbbS6ZGDgJ6ENkgwuQY2LS7pEC5bKHD1fMF" + }, + { + "exception": "Invalid compression flag", + "WIF": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sfZr2ym" + }, + { + "exception": "Invalid WIF length", + "WIF": "3tq8Vmhh9SN5XhjTGSWgx8iKk59XbKG6UH4oqpejRuJhfYD" + }, + { + "exception": "Invalid WIF length", + "WIF": "38uMpGARR2BJy5p4dNFKYg9UsWNoBtkpbdrXDjmfvz8krCtw3T1W92ZDSR" + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/ecsignature.json b/web/bitcoincashjs-lib/test/fixtures/ecsignature.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/ecsignature.json @@ -0,0 +1,214 @@ +{ + "valid": [ + { + "compact": { + "hex": "1f33a69cd2065432a30f3d1ce4eb0d59b8ab58c74f27c41a7fdb5696ad4e6108c96f807982866f785d3f6418d24163ddae117b7db4d5fdf0071de069fa54342262", + "compressed": true, + "i": 0 + }, + "scriptSignature": { + "hex": "3044022033a69cd2065432a30f3d1ce4eb0d59b8ab58c74f27c41a7fdb5696ad4e6108c902206f807982866f785d3f6418d24163ddae117b7db4d5fdf0071de069fa5434226201", + "hashType": 1 + }, + "DER": "3044022033a69cd2065432a30f3d1ce4eb0d59b8ab58c74f27c41a7fdb5696ad4e6108c902206f807982866f785d3f6418d24163ddae117b7db4d5fdf0071de069fa54342262", + "signature": { + "r": "23362334225185207751494092901091441011938859014081160902781146257181456271561", + "s": "50433721247292933944369538617440297985091596895097604618403996029256432099938" + } + }, + { + "compact": { + "hex": "1b54c4a33c6423d689378f160a7ff8b61330444abb58fb470f96ea16d99d4a2fed07082304410efa6b2943111b6a4e0aaa7b7db55a07e9861d1fb3cb1f421044a5", + "compressed": false, + "i": 0 + }, + "DER": "3044022054c4a33c6423d689378f160a7ff8b61330444abb58fb470f96ea16d99d4a2fed022007082304410efa6b2943111b6a4e0aaa7b7db55a07e9861d1fb3cb1f421044a5", + "scriptSignature": { + "hex": "3044022054c4a33c6423d689378f160a7ff8b61330444abb58fb470f96ea16d99d4a2fed022007082304410efa6b2943111b6a4e0aaa7b7db55a07e9861d1fb3cb1f421044a502", + "hashType": 2 + }, + "signature": { + "r": "38341707918488238920692284707283974715538935465589664377561695343399725051885", + "s": "3180566392414476763164587487324397066658063772201694230600609996154610926757" + } + }, + { + "compact": { + "hex": "1fff466a9f1b7b273e2f4c3ffe032eb2e814121ed18ef84665d0f515360dab3dd06fc95f5132e5ecfdc8e5e6e616cc77151455d46ed48f5589b7db7771a332b283", + "compressed": true, + "i": 0 + }, + "scriptSignature": { + "hex": "3045022100ff466a9f1b7b273e2f4c3ffe032eb2e814121ed18ef84665d0f515360dab3dd002206fc95f5132e5ecfdc8e5e6e616cc77151455d46ed48f5589b7db7771a332b28303", + "hashType": 3 + }, + "DER": "3045022100ff466a9f1b7b273e2f4c3ffe032eb2e814121ed18ef84665d0f515360dab3dd002206fc95f5132e5ecfdc8e5e6e616cc77151455d46ed48f5589b7db7771a332b283", + "signature": { + "r": "115464191557905790016094131873849783294273568009648050793030031933291767741904", + "s": "50562520307781850052192542766631199590053690478900449960232079510155113443971" + } + }, + { + "compact": { + "hex": "1cc0dafec8251f1d5010289d210232220b03202cba34ec11fec58b3e93a85b91d375afdc06b7d6322a590955bf264e7aaa155847f614d80078a90292fe205064d3", + "compressed": false, + "i": 1 + }, + "scriptSignature": { + "hex": "3045022100c0dafec8251f1d5010289d210232220b03202cba34ec11fec58b3e93a85b91d3022075afdc06b7d6322a590955bf264e7aaa155847f614d80078a90292fe205064d381", + "hashType": 129 + }, + "DER": "3045022100c0dafec8251f1d5010289d210232220b03202cba34ec11fec58b3e93a85b91d3022075afdc06b7d6322a590955bf264e7aaa155847f614d80078a90292fe205064d3", + "signature": { + "r": "87230998027579607140680851455601772643840468630989315269459846730712163783123", + "s": "53231320085894623106179381504478252331065330583563809963303318469380290929875" + } + }, + { + "compact": { + "hex": "1f7186363571d65e084e7f02b0b77c3ec44fb1b257dee26274c38c928986fea45d0de0b38e06807e46bda1f1e293f4f6323e854c86d58abdd00c46c16441085df6", + "compressed": true, + "i": 0 + }, + "scriptSignature": { + "hex": "304402207186363571d65e084e7f02b0b77c3ec44fb1b257dee26274c38c928986fea45d02200de0b38e06807e46bda1f1e293f4f6323e854c86d58abdd00c46c16441085df682", + "hashType": 130 + }, + "DER": "304402207186363571d65e084e7f02b0b77c3ec44fb1b257dee26274c38c928986fea45d02200de0b38e06807e46bda1f1e293f4f6323e854c86d58abdd00c46c16441085df6", + "signature": { + "r": "51348483531757779992459563033975330355971795607481991320287437101831125115997", + "s": "6277080015686056199074771961940657638578000617958603212944619747099038735862" + } + }, + { + "compact": { + "hex": "1cfbfe5076a15860ba8ed00e75e9bd22e05d230f02a936b653eb55b61c99dda4870e68880ebb0050fe4312b1b1eb0899e1b82da89baa5b895f612619edf34cbd37", + "compressed": false, + "i": 1 + }, + "scriptSignature": { + "hex": "3045022100fbfe5076a15860ba8ed00e75e9bd22e05d230f02a936b653eb55b61c99dda48702200e68880ebb0050fe4312b1b1eb0899e1b82da89baa5b895f612619edf34cbd3783", + "hashType": 131 + }, + "DER": "3045022100fbfe5076a15860ba8ed00e75e9bd22e05d230f02a936b653eb55b61c99dda48702200e68880ebb0050fe4312b1b1eb0899e1b82da89baa5b895f612619edf34cbd37", + "signature": { + "r": "113979859486826658566290715281614250298918272782414232881639314569529560769671", + "s": "6517071009538626957379450615706485096874328019806177698938278220732027419959" + } + }, + { + "compact": { + "hex": "20cde1302d83f8dd835d89aef803c74a119f561fbaef3eb9129e45f30de86abbf906ce643f5049ee1f27890467b77a6a8e11ec4661cc38cd8badf90115fbd03cef", + "compressed": true, + "i": 1 + }, + "scriptSignature": { + "hex": "3045022100cde1302d83f8dd835d89aef803c74a119f561fbaef3eb9129e45f30de86abbf9022006ce643f5049ee1f27890467b77a6a8e11ec4661cc38cd8badf90115fbd03cef81", + "hashType": 129 + }, + "DER": "3045022100cde1302d83f8dd835d89aef803c74a119f561fbaef3eb9129e45f30de86abbf9022006ce643f5049ee1f27890467b77a6a8e11ec4661cc38cd8badf90115fbd03cef", + "signature": { + "r": "93122007060065279508564838030979550535085999589142852106617159184757394422777", + "s": "3078539468410661027472930027406594684630312677495124015420811882501887769839" + } + } + ], + "invalid": { + "compact": [ + { + "exception": "Invalid signature parameter", + "hex": "23987ceade6a304fc5823ab38f99fc3c5f772a2d3e89ea05931e2726105fc53b9e601fc3231f35962c714fcbce5c95b427496edc7ae8b3d12e93791d7629795b62" + }, + { + "exception": "Expected Buffer\\(Length: 65\\), got Buffer\\(Length: 68\\)", + "hex": "1c987ceade6a304fc5823ab38f99fc3c5f772a2d3e89ea05931e2726105fc53b9e601fc3231f35962c714fcbce5c95b427496edc7ae8b3d12e93791d7629795b62000000" + }, + { + "exception": "Expected Buffer\\(Length: 65\\), got Buffer\\(Length: 59\\)", + "hex": "1c987ceade6a304fc5823ab38f99fc3c5f772a2d3e89ea05931e2726105fc53b9e601fc3231f35962c714fcbce5c95b427496edc7ae8b3d12e9379" + } + ], + "DER": [ + { + "exception": "DER sequence length is too short", + "hex": "ffffffffffffff" + }, + { + "exception": "DER sequence length is too long", + "hex": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + { + "exception": "Expected DER sequence", + "hex": "00ffff0400ffffff020400ffffff" + }, + { + "exception": "DER sequence length is invalid", + "hex": "30ff020400ffffff020400ffffff" + }, + { + "exception": "DER sequence length is invalid", + "hex": "300c030400ffffff030400ffffff0000" + }, + { + "exception": "Expected DER integer", + "hex": "300cff0400ffffff020400ffffff" + }, + { + "exception": "Expected DER integer \\(2\\)", + "hex": "300c020200ffffff020400ffffff" + }, + { + "exception": "R length is zero", + "hex": "30080200020400ffffff" + }, + { + "exception": "S length is zero", + "hex": "3008020400ffffff0200" + }, + { + "exception": "R length is too long", + "hex": "300c02dd00ffffff020400ffffff" + }, + { + "exception": "S length is invalid", + "hex": "300c020400ffffff02dd00ffffff" + }, + { + "exception": "R value is negative", + "hex": "300c020480000000020400ffffff" + }, + { + "exception": "S value is negative", + "hex": "300c020400ffffff020480000000" + }, + { + "exception": "R value excessively padded", + "hex": "300c02040000ffff020400ffffff" + }, + { + "exception": "S value excessively padded", + "hex": "300c020400ffffff02040000ffff" + } + ], + "scriptSignature": [ + { + "exception": "Invalid hashType 7", + "hashType": 7, + "hex": "3044022033a69cd2065432a30f3d1ce4eb0d59b8ab58c74f27c41a7fdb5696ad4e6108c902206f807982866f785d3f6418d24163ddae117b7db4d5fdf0071de069fa5434226207", + "signature": { + "r": "23362334225185207751494092901091441011938859014081160902781146257181456271561", + "s": "50433721247292933944369538617440297985091596895097604618403996029256432099938" + } + }, + { + "exception": "Invalid hashType 140", + "hashType": 140, + "hex": "3044022033a69cd2065432a30f3d1ce4eb0d59b8ab58c74f27c41a7fdb5696ad4e6108c902206f807982866f785d3f6418d24163ddae117b7db4d5fdf0071de069fa543422628c", + "signature": { + "r": "23362334225185207751494092901091441011938859014081160902781146257181456271561", + "s": "50433721247292933944369538617440297985091596895097604618403996029256432099938" + } + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/hdnode.json b/web/bitcoincashjs-lib/test/fixtures/hdnode.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/hdnode.json @@ -0,0 +1,313 @@ +{ + "valid": [ + { + "network": "bitcoin", + "master": { + "seed": "000102030405060708090a0b0c0d0e0f", + "wif": "L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW", + "pubKey": "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2", + "chainCode": "873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508", + "base58": "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + "base58Priv": "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + "identifier": "3442193e1bb70916e914552172cd4e2dbc9df811", + "fingerprint": "3442193e", + "address": "15mKKb2eos1hWa6tisdPwwDC1a5J1y9nma" + }, + "children": [ + { + "path": "m/0'", + "m": 0, + "hardened": true, + "wif": "L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT", + "pubKey": "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56", + "chainCode": "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141", + "base58": "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", + "base58Priv": "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + "identifier": "5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7", + "fingerprint": "5c1bd648", + "address": "19Q2WoS5hSS6T8GjhK8KZLMgmWaq4neXrh", + "index": 2147483648, + "depth": 1 + }, + { + "path": "m/0'/1", + "m": 1, + "wif": "KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM", + "pubKey": "03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c", + "chainCode": "2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19", + "base58": "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", + "base58Priv": "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", + "identifier": "bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe", + "fingerprint": "bef5a2f9", + "address": "1JQheacLPdM5ySCkrZkV66G2ApAXe1mqLj", + "index": 1, + "depth": 2 + }, + { + "path": "m/0'/1/2'", + "m": 2, + "hardened": true, + "wif": "L43t3od1Gh7Lj55Bzjj1xDAgJDcL7YFo2nEcNaMGiyRZS1CidBVU", + "pubKey": "0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2", + "chainCode": "04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f", + "base58": "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + "base58Priv": "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", + "identifier": "ee7ab90cde56a8c0e2bb086ac49748b8db9dce72", + "fingerprint": "ee7ab90c", + "address": "1NjxqbA9aZWnh17q1UW3rB4EPu79wDXj7x", + "index": 2147483650, + "depth": 3 + }, + { + "path": "m/0'/1/2'/2", + "m": 2, + "wif": "KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR", + "pubKey": "02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29", + "chainCode": "cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd", + "base58": "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", + "base58Priv": "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + "identifier": "d880d7d893848509a62d8fb74e32148dac68412f", + "fingerprint": "d880d7d8", + "address": "1LjmJcdPnDHhNTUgrWyhLGnRDKxQjoxAgt", + "index": 2, + "depth": 4 + }, + { + "path": "m/0'/1/2'/2/1000000000", + "m": 1000000000, + "wif": "Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs", + "pubKey": "022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011", + "chainCode": "c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e", + "base58": "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", + "base58Priv": "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", + "identifier": "d69aa102255fed74378278c7812701ea641fdf32", + "fingerprint": "d69aa102", + "address": "1LZiqrop2HGR4qrH1ULZPyBpU6AUP49Uam", + "index": 1000000000, + "depth": 5 + } + ] + }, + { + "network": "bitcoin", + "master": { + "seed": "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + "wif": "KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy", + "pubKey": "03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7", + "chainCode": "60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689", + "base58": "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + "base58Priv": "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + "identifier": "bd16bee53961a47d6ad888e29545434a89bdfe95", + "fingerprint": "bd16bee5", + "address": "1JEoxevbLLG8cVqeoGKQiAwoWbNYSUyYjg" + }, + "children": [ + { + "path": "m/0", + "m": 0, + "wif": "L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj", + "pubKey": "02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea", + "chainCode": "f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c", + "base58": "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + "base58Priv": "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + "identifier": "5a61ff8eb7aaca3010db97ebda76121610b78096", + "fingerprint": "5a61ff8e", + "address": "19EuDJdgfRkwCmRzbzVBHZWQG9QNWhftbZ", + "index": 0, + "depth": 1 + }, + { + "path": "m/0/2147483647'", + "m": 2147483647, + "hardened": true, + "wif": "L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr", + "pubKey": "03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b", + "chainCode": "be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9", + "base58": "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", + "base58Priv": "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", + "identifier": "d8ab493736da02f11ed682f88339e720fb0379d1", + "fingerprint": "d8ab4937", + "address": "1Lke9bXGhn5VPrBuXgN12uGUphrttUErmk", + "index": 4294967295, + "depth": 2 + }, + { + "path": "m/0/2147483647'/1", + "m": 1, + "wif": "KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2", + "pubKey": "03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9", + "chainCode": "f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb", + "base58": "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", + "base58Priv": "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", + "identifier": "78412e3a2296a40de124307b6485bd19833e2e34", + "fingerprint": "78412e3a", + "address": "1BxrAr2pHpeBheusmd6fHDP2tSLAUa3qsW", + "index": 1, + "depth": 3 + }, + { + "path": "m/0/2147483647'/1/2147483646'", + "m": 2147483646, + "hardened": true, + "wif": "L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF", + "pubKey": "02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0", + "chainCode": "637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29", + "base58": "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", + "base58Priv": "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", + "identifier": "31a507b815593dfc51ffc7245ae7e5aee304246e", + "fingerprint": "31a507b8", + "address": "15XVotxCAV7sRx1PSCkQNsGw3W9jT9A94R", + "index": 4294967294, + "depth": 4 + }, + { + "path": "m/0/2147483647'/1/2147483646'/2", + "m": 2, + "wif": "L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK", + "pubKey": "024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c", + "chainCode": "9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271", + "base58": "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", + "base58Priv": "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", + "identifier": "26132fdbe7bf89cbc64cf8dafa3f9f88b8666220", + "fingerprint": "26132fdb", + "address": "14UKfRV9ZPUp6ZC9PLhqbRtxdihW9em3xt", + "index": 2, + "depth": 5 + } + ] + }, + { + "comment": "Private key has leading zeros, see PR #673", + "network": "bitcoin", + "master": { + "seed": "d13de7bd1e54422d1a3b3b699a27fb460de2849e7e66a005c647e8e4a54075cb", + "wif": "KwDiCU5bs8xQwsRgxjhkcJcVuR7NE4Mei8X9uSAVviVTE7JmMoS6", + "pubKey": "0298ccc720d5dea817c7077605263bae52bca083cf8888fee77ff4c1b4797ee180", + "chainCode": "c23ab32b36ddff49fae350a1bed8ec6b4d9fc252238dd789b7273ba4416054eb", + "base58": "xpub661MyMwAqRbcGUbHLLJ5n2DzFAt8mmaDxbmbdimh68m8EiXGEQPiJya4BJat5yMzy4e68VSUoLGCu5uvzf8dUoGvwuJsLE6F1cibmWsxFNn", + "base58Priv": "xprv9s21ZrQH143K3zWpEJm5QtHFh93eNJrNbNqzqLN5XoE9MvC7gs5TmBFaL2PpaXpDc8FBYVe5EChc73ApjSQ5fWsXS7auHy1MmG6hdpywE1q", + "identifier": "1a87677be6f73cc9655e8b4c5d2fd0aeeb1b23c7", + "fingerprint": "1a87677b", + "address": "KyDarNhq8WK8rSU36UY7bDv9MAwdpKFZYKPN89Geh2dUwHjTqVh5" + }, + "children": [ + { + "path": "m/44'/0'/0'/0/0'", + "wif": "L3z3MSqZtDQ1FPHKi7oWf1nc9rMEGFtZUDCoFa7n4F695g5qZiSu", + "pubKey": "027c3591221e28939e45f8ea297d62c3640ebb09d7058b01d09c963d984a40ad49", + "chainCode": "ca27553aa89617e982e621637d6478f564b32738f8bbe2e48d0a58a8e0f6da40", + "base58": "xpub6GcBnm7FfDg5ERWACCvtuotN6Tdoc37r3SZ1asBHvCWzPkqWn3MVKPWKzy6GsfmdMUGanR3D12dH1cp5tJauuubwc4FAJDn67SH2uUjwAT1", + "base58Priv": "xprvA3cqPFaMpr7n1wRh6BPtYfwdYRoKCaPzgDdQnUmgMrz1WxWNEW3EmbBr9ieh9BJAsRGKFPLvotb4p4Aq79jddUVKPVJt7exVzLHcv777JVf", + "identifier": "e371d69b5dae6eacee832a130ee9f55545275a09", + "fingerprint": "e371d69b", + "address": "1MjcmArHeqorgm9uJi4kPNQ6CbsrmCtASH", + "index": 2147483648, + "depth": 5 + } + ] + }, + { + "network": "litecoin", + "master": { + "seed": "000102030405060708090a0b0c0d0e0f", + "wif": "TAroS5Knm8GZcnpPycBgzjwwDLWMyQjDrcuGPPoArgrbW7Ln22qp", + "pubKey": "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2", + "chainCode": "873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508", + "base58": "Ltub2SSUS19CirucWFod2ZsYA2J4v4U76YiCXHdcQttnoiy5aGanFHCPDBX7utfG6f95u1cUbZJNafmvzNCzZZJTw1EmyFoL8u1gJbGM8ipu491", + "base58Priv": "Ltpv71G8qDifUiNetP6nmxPA5STrUVmv2J9YSmXajv8VsYBUyuPhvN9xCaQrfX2wo5xxJNtEazYCFRUu5FmokYMM79pcqz8pcdo4rNXAFPgyB4k", + "identifier": "3442193e1bb70916e914552172cd4e2dbc9df811", + "fingerprint": "3442193e", + "address": "LPzGaoLUtXFkmNo3u1chDxGxDnSaBQTTxm" + }, + "children": [ + { + "path": "m/0'", + "m": 0, + "hardened": true, + "wif": "TB22qU2V9EJCVKJ8cdYaTfvDhnYcCzthcWgFm1k6hbvbKM1NLxoL", + "pubKey": "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56", + "chainCode": "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141", + "base58": "Ltub2UhtRiSfp82berwLEKkB34QBEt2TUdCDCu4WNzGumvAMwYsxfWjULKsXhADxqy3cuDu3TnqoKJr1xmB8Wb2qzthWAtbb4CutpXPuSU1YMgG", + "base58Priv": "Ltpv73XYpw28ZyVe2zEVyiFnxUZxoKLGQNdZ8NxUi1WcqjNmMBgtLbh3KimGSnPHCoLv1RmvxHs4dnKmo1oXQ8dXuDu8uroxrbVxZPA1gXboYvx", + "identifier": "5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7", + "fingerprint": "5c1bd648", + "address": "LTcyn1jun6g9hvxtsT7cqMRSyix7AULC76", + "index": 2147483648, + "depth": 1 + } + ] + } + ], + "invalid": { + "fromBase58": [ + { + "exception": "Invalid checksum", + "string": "xprvQQQQQQQQQQQQQQQQCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334" + }, + { + "exception": "Invalid buffer length", + "network": "bitcoin", + "string": "HAsbc6CgKmTYEQg2CTz7m5STEPAB" + }, + { + "exception": "Invalid parent fingerprint", + "network": "bitcoin", + "string": "xprv9tnJFvAXAXPfPnMTKfwpwnkty7MzJwELVgp4NTBquaKXy4RndyfJJCJJf7zNaVpBpzrwVRutZNLRCVLEcZHcvuCNG3zGbGBcZn57FbNnmSP" + }, + { + "exception": "Invalid private key", + "network": "bitcoin", + "string": "xprv9s21ZrQH143K3yLysFvsu3n1dMwhNusmNHr7xArzAeCc7MQYqDBBStmqnZq6WLi668siBBNs3SjiyaexduHu9sXT9ixTsqptL67ADqcaBdm" + }, + { + "exception": "Invalid index", + "network": "bitcoin", + "string": "xprv9s21ZrQYdgnodnKW4Drm1Qg7poU6Gf2WUDsjPxvYiK7iLBMrsjbnF1wsZZQgmXNeMSG3s7jmHk1b3JrzhG5w8mwXGxqFxfrweico7k8DtxR" + }, + { + "exception": "Unknown network version", + "string": "1111111111111adADjFaSNPxwXqLjHLj4mBfYxuewDPbw9hEj1uaXCzMxRPXDFF3cUoezTFYom4sEmEVSQmENPPR315cFk9YUFVek73wE9" + }, + { + "exception": "Invalid network version", + "network": "bitcoin", + "string": "Ltpv73XYpw28ZyVe2zEVyiFnxUZxoKLGQNdZ8NxUi1WcqjNmMBgtLbh3KimGSnPHCoLv1RmvxHs4dnKmo1oXQ8dXuDu8uroxrbVxZPA1gXboYvx" + }, + { + "exception": "Invalid buffer length", + "string": "9XpNiB4DberdMn4jZiMhNGtuZUd7xUrCEGw4MG967zsVNvUKBEC9XLrmVmFasanWGp15zXfTNw4vW4KdvUAynEwyKjdho9QdLMPA2H5uyt" + }, + { + "exception": "Invalid buffer length", + "string": "7JJikZQ2NUXjSAnAF2SjFYE3KXbnnVxzRBNddFE1DjbDEHVGEJzYC7zqSgPoauBJS3cWmZwsER94oYSFrW9vZ4Ch5FtGeifdzmtS3FGYDB1vxFZsYKgMc" + }, + { + "exception": "Invalid parent fingerprint", + "string": "xpub67tVq9SuNQCfm2PXBqjGRAtNZ935kx2uHJaURePth4JBpMfEy6jum7Euj7FTpbs7fnjhfZcNEktCucWHcJf74dbKLKNSTZCQozdDVwvkJhs" + }, + { + "exception": "Invalid index", + "string": "xpub661MyMwTWkfYZq6BEh3ywGVXFvNj5hhzmWMhFBHSqmub31B1LZ9wbJ3DEYXZ8bHXGqnHKfepTud5a2XxGdnnePzZa2m2DyzTnFGBUXtaf9M" + }, + { + "exception": "Unknown network version", + "string": "8FH81Rao5EgGmdScoN66TJAHsQP7phEMeyMTku9NBJd7hXgaj3HTvSNjqJjoqBpxdbuushwPEM5otvxXt2p9dcw33AqNKzZEPMqGHmz7Dpayi6Vb" + }, + { + "exception": "Point is not on the curve", + "string": "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gYymDsxxRe3WWeZQ7TadaLSdKUffezzczTCpB8j3JP96UwE2n6w1" + } + ], + "deriveHardened": [2147483648, null, "foo", -1], + "derive": [4294967296, null, "foo", -1], + "derivePath": [ + 2, + [2, 3, 4], + "/", + "m/m/123", + "a/0/1/2", + "m/0/ 1 /2", + "m/0/1.5/2" + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/schnorr.json b/web/bitcoincashjs-lib/test/fixtures/schnorr.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/schnorr.json @@ -0,0 +1,103 @@ +{ + "sign": [ + { + "x": "0000000000000000000000000000000000000000000000000000000000000001", + "m": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "787A848E71043D280C50470E8E1532B2DD5D20EE912A45DBDD2BD1DFBF187EF67031A98831859DC34DFFEEDDA86831842CCD0079E1F92AF177F7F22CC1DCED05" + }, + { + "x": "B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD" + }, + { + "x": "C90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B14E5C7", + "m": "5E2D58D8B3BCDF1ABADEC7829054F90DDA9805AAB56C77333024B9D0A508B75C", + "sig": "00DA9B08172A9B6F0466A2DEFD817F2D7AB437E0D253CB5395A963866B3574BE00880371D01766935B92D2AB4CD5C8A2A5837EC57FED7660773A05F0DE142380" + } + ], + "valid": [ + { + "P": "0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "m": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "787A848E71043D280C50470E8E1532B2DD5D20EE912A45DBDD2BD1DFBF187EF67031A98831859DC34DFFEEDDA86831842CCD0079E1F92AF177F7F22CC1DCED05" + }, + { + "P": "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD" + }, + { + "P": "03FAC2114C2FBB091527EB7C64ECB11F8021CB45E8E7809D3C0938E4B8C0E5F84B", + "m": "5E2D58D8B3BCDF1ABADEC7829054F90DDA9805AAB56C77333024B9D0A508B75C", + "sig": "00DA9B08172A9B6F0466A2DEFD817F2D7AB437E0D253CB5395A963866B3574BE00880371D01766935B92D2AB4CD5C8A2A5837EC57FED7660773A05F0DE142380" + }, + { + "P": "03DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34", + "m": "4DF3C3F68FCC83B27E9D42C90431A72499F17875C81A599B566C9889B9696703", + "sig": "00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C6302A8DC32E64E86A333F20EF56EAC9BA30B7246D6D25E22ADB8C6BE1AEB08D49D" + }, + { + "P": "031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F", + "m": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "52818579ACA59767E3291D91B76B637BEF062083284992F2D95F564CA6CB4E3530B1DA849C8E8304ADC0CFE870660334B3CFC18E825EF1DB34CFAE3DFC5D8187" + }, + { + "P": "03FAC2114C2FBB091527EB7C64ECB11F8021CB45E8E7809D3C0938E4B8C0E5F84B", + "m": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "sig": "570DD4CA83D4E6317B8EE6BAE83467A1BF419D0767122DE409394414B05080DCE9EE5F237CBD108EABAE1E37759AE47F8E4203DA3532EB28DB860F33D62D49BD" + } + ], + "invalid": [ + { + "P": "03EEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34", + "m": "4DF3C3F68FCC83B27E9D42C90431A72499F17875C81A599B566C9889B9696703", + "sig": "00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C6302A8DC32E64E86A333F20EF56EAC9BA30B7246D6D25E22ADB8C6BE1AEB08D49D" + }, + { + "P": "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1DFA16AEE06609280A19B67A24E1977E4697712B5FD2943914ECD5F730901B4AB7" + }, + { + "P": "03FAC2114C2FBB091527EB7C64ECB11F8021CB45E8E7809D3C0938E4B8C0E5F84B", + "m": "5E2D58D8B3BCDF1ABADEC7829054F90DDA9805AAB56C77333024B9D0A508B75C", + "sig": "00DA9B08172A9B6F0466A2DEFD817F2D7AB437E0D253CB5395A963866B3574BED092F9D860F1776A1F7412AD8A1EB50DACCC222BC8C0E26B2056DF2F273EFDEC" + }, + { + "P": "0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "m": "0000000000000000000000000000000000000000000000000000000000000000", + "sig": "787A848E71043D280C50470E8E1532B2DD5D20EE912A45DBDD2BD1DFBF187EF68FCE5677CE7A623CB20011225797CE7A8DE1DC6CCD4F754A47DA6C600E59543C" + }, + { + "P": "03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD" + }, + { + "P": "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "00000000000000000000000000000000000000000000000000000000000000009E9D01AF988B5CEDCE47221BFA9B222721F3FA408915444A4B489021DB55775F" + }, + { + "P": "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "0000000000000000000000000000000000000000000000000000000000000001D37DDF0254351836D84B1BD6A795FD5D523048F298C4214D187FE4892947F728" + }, + { + "P": "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "4A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD" + }, + { + "P": "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2F1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD" + }, + { + "P": "02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659", + "m": "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89", + "sig": "2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141" + } + ] +} diff --git a/web/bitcoincashjs-lib/test/fixtures/script.json b/web/bitcoincashjs-lib/test/fixtures/script.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/script.json @@ -0,0 +1,187 @@ +{ + "valid": [ + { + "asm": "OP_1NEGATE", + "script": "4f", + "stack": ["81"] + }, + { + "asm": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "script": "47304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "stack": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801" + ] + }, + { + "asm": "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 OP_CHECKSIG", + "script": "2102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1ac" + }, + { + "asm": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "script": "47304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca28012102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "stack": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1" + ] + }, + { + "asm": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "script": "76a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac" + }, + { + "asm": "OP_0 304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "script": "0047304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801483045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "stack": [ + "", + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501" + ] + }, + { + "asm": "OP_2 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 0395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a OP_2 OP_CHECKMULTISIG", + "script": "522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae" + }, + { + "asm": "OP_0 3045022100fe324541215798b2df68cbd44039615e23c506d4ec1a05572064392a98196b82022068c849fa6699206da2fc6d7848efc1d3804a5816d6293615fe34c1a7f34e1c2f01 3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901 3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "script": "00483045022100fe324541215798b2df68cbd44039615e23c506d4ec1a05572064392a98196b82022068c849fa6699206da2fc6d7848efc1d3804a5816d6293615fe34c1a7f34e1c2f01473044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901483045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "stack": [ + "", + "3045022100fe324541215798b2df68cbd44039615e23c506d4ec1a05572064392a98196b82022068c849fa6699206da2fc6d7848efc1d3804a5816d6293615fe34c1a7f34e1c2f01", + "3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901", + "3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01" + ] + }, + { + "asm": "OP_3 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34 OP_3 OP_CHECKMULTISIG", + "script": "53210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817982102b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f84834021024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a3453ae" + }, + { + "asm": "OP_0 304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501 522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae", + "script": "0047304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801483045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d14050147522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae", + "stack": [ + "", + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae" + ] + }, + { + "asm": "OP_HASH160 722ff0bc2c3f47b35c20df646c395594da24e90e OP_EQUAL", + "script": "a914722ff0bc2c3f47b35c20df646c395594da24e90e87" + }, + { + "asm": "OP_0 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5", + "script": "0014aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5", + "stack": ["", "aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5"] + }, + { + "asm": "OP_0 32447752937d355ca2defddcd1f6b4fc53d182f8901cebbcff42f5e381bf0b80", + "script": "002032447752937d355ca2defddcd1f6b4fc53d182f8901cebbcff42f5e381bf0b80", + "stack": [ + "", + "32447752937d355ca2defddcd1f6b4fc53d182f8901cebbcff42f5e381bf0b80" + ] + }, + { + "asm": "OP_RETURN 06deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474", + "script": "6a2606deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474" + }, + { + "asm": "OP_RETURN deadffffffffffffffffffffffffffffffffbeef", + "script": "6a14deadffffffffffffffffffffffffffffffffbeef" + }, + { + "asm": "OP_0 OP_0 3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901 3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "script": "0000473044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901483045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "stack": [ + "", + "", + "3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901", + "3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01" + ] + }, + { + "asm": "OP_0 OP_0 OP_0 OP_0", + "script": "00000000", + "stack": ["", "", "", ""] + }, + { + "asm": "OP_0 OP_0 30450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a801 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae", + "script": "00004830450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a8014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae", + "stack": [ + "", + "", + "30450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a801", + "52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + ] + }, + { + "asm": "OP_HASH256 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000 OP_EQUAL", + "script": "aa206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d619000000000087" + }, + { + "asm": "OP_0 OP_0 OP_0 OP_CHECKMULTISIG", + "script": "000000ae" + }, + { + "asm": "OP_0", + "script": "00", + "stack": [""] + }, + { + "asm": "OP_0 00", + "script": "000100", + "stack": ["", "00"] + }, + { + "asm": "OP_6", + "script": "56", + "stack": ["06"], + "nonstandard": { + "scriptSig": "OP_6", + "scriptSigHex": "0106" + } + }, + { + "asm": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "script": "4cff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "stack": [ + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "asm": "OP_RETURN aa21a9ed4db4fb830efe3e804337413ffe8ad7393af301e0ec8e71b6e6f2b860a56f4dcd", + "script": "6a24aa21a9ed4db4fb830efe3e804337413ffe8ad7393af301e0ec8e71b6e6f2b860a56f4dcd" + } + ], + "invalid": { + "decompile": [ + { + "description": "Not enough data: OP_1", + "script": "01" + }, + { + "description": "Not enough data: OP_2", + "script": "0201" + }, + { + "description": "Not enough data: OP_PUSHDATA1 0x02", + "script": "4c0201" + }, + { + "description": "Not enough data: OP_PUSHDATA2 0xffff", + "script": "4dffff01" + }, + { + "description": "Not enough data: OP_PUSHDATA4 0xffffffff", + "script": "4effffffff01" + } + ], + "fromASM": [ + { + "description": "Expected Hex, got String \"0xff\"", + "script": "0xff OP_CHECKSIG" + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/script_number.json b/web/bitcoincashjs-lib/test/fixtures/script_number.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/script_number.json @@ -0,0 +1,225 @@ +[ + { + "hex": "", + "number": 0 + }, + { + "hex": "01", + "number": 1 + }, + { + "hex": "02", + "number": 2 + }, + { + "hex": "03", + "number": 3 + }, + { + "hex": "7e", + "number": 126 + }, + { + "hex": "7f", + "number": 127 + }, + { + "hex": "8000", + "number": 128 + }, + { + "hex": "8100", + "number": 129 + }, + { + "hex": "8200", + "number": 130 + }, + { + "hex": "ff00", + "number": 255 + }, + { + "hex": "fe7f", + "number": 32766 + }, + { + "hex": "ff7f", + "number": 32767 + }, + { + "hex": "008000", + "number": 32768 + }, + { + "hex": "ffff00", + "number": 65535 + }, + { + "hex": "018000", + "number": 32769 + }, + { + "hex": "028000", + "number": 32770 + }, + { + "hex": "ffffff00", + "number": 16777215 + }, + { + "hex": "feff7f", + "number": 8388606 + }, + { + "hex": "ffff7f", + "number": 8388607 + }, + { + "hex": "00008000", + "number": 8388608 + }, + { + "hex": "01008000", + "number": 8388609 + }, + { + "hex": "02008000", + "number": 8388610 + }, + { + "hex": "feffff7f", + "number": 2147483646 + }, + { + "hex": "ffffff7f", + "number": 2147483647 + }, + { + "bytes": 5, + "hex": "0000008000", + "number": 2147483648 + }, + { + "bytes": 5, + "hex": "0100008000", + "number": 2147483649 + }, + { + "bytes": 5, + "hex": "0200008000", + "number": 2147483650 + }, + { + "bytes": 5, + "hex": "ffffffff00", + "number": 4294967295 + }, + { + "bytes": 5, + "hex": "0200008080", + "number": -2147483650 + }, + { + "bytes": 5, + "hex": "0100008080", + "number": -2147483649 + }, + { + "bytes": 5, + "hex": "0000008080", + "number": -2147483648 + }, + { + "hex": "ffffffff", + "number": -2147483647 + }, + { + "hex": "feffffff", + "number": -2147483646 + }, + { + "hex": "fdffffff", + "number": -2147483645 + }, + { + "hex": "ffffff80", + "number": -16777215 + }, + { + "hex": "01008080", + "number": -8388609 + }, + { + "hex": "00008080", + "number": -8388608 + }, + { + "hex": "ffffff", + "number": -8388607 + }, + { + "hex": "feffff", + "number": -8388606 + }, + { + "hex": "fdffff", + "number": -8388605 + }, + { + "hex": "ffff80", + "number": -65535 + }, + { + "hex": "018080", + "number": -32769 + }, + { + "hex": "008080", + "number": -32768 + }, + { + "hex": "ffff", + "number": -32767 + }, + { + "hex": "feff", + "number": -32766 + }, + { + "hex": "fdff", + "number": -32765 + }, + { + "hex": "ff80", + "number": -255 + }, + { + "hex": "8180", + "number": -129 + }, + { + "hex": "8080", + "number": -128 + }, + { + "hex": "ff", + "number": -127 + }, + { + "hex": "fe", + "number": -126 + }, + { + "hex": "fd", + "number": -125 + }, + { + "hex": "82", + "number": -2 + }, + { + "hex": "81", + "number": -1 + } +] diff --git a/web/bitcoincashjs-lib/test/fixtures/templates.json b/web/bitcoincashjs-lib/test/fixtures/templates.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/templates.json @@ -0,0 +1,503 @@ +{ + "valid": [ + { + "type": "pubkey", + "pubKey": "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "signature": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "output": "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 OP_CHECKSIG", + "input": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "inputHex": "47304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "outputHex": "2102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1ac", + "inputStack": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801" + ] + }, + { + "type": "pubkeyhash", + "pubKey": "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "signature": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "output": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "input": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "inputHex": "47304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca28012102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "outputHex": "76a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac", + "inputStack": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1" + ] + }, + { + "type": "multisig", + "pubKeys": [ + "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "0395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a" + ], + "signatures": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501" + ], + "output": "OP_2 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 0395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a OP_2 OP_CHECKMULTISIG", + "input": "OP_0 304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "inputHex": "0047304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801483045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "outputHex": "522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae", + "inputStack": [ + "", + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501" + ] + }, + { + "type": "multisig", + "pubKeys": [ + "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340", + "024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34" + ], + "signatures": [ + "3045022100fe324541215798b2df68cbd44039615e23c506d4ec1a05572064392a98196b82022068c849fa6699206da2fc6d7848efc1d3804a5816d6293615fe34c1a7f34e1c2f01", + "3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901", + "3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01" + ], + "output": "OP_3 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34 OP_3 OP_CHECKMULTISIG", + "input": "OP_0 3045022100fe324541215798b2df68cbd44039615e23c506d4ec1a05572064392a98196b82022068c849fa6699206da2fc6d7848efc1d3804a5816d6293615fe34c1a7f34e1c2f01 3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901 3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "inputHex": "00483045022100fe324541215798b2df68cbd44039615e23c506d4ec1a05572064392a98196b82022068c849fa6699206da2fc6d7848efc1d3804a5816d6293615fe34c1a7f34e1c2f01473044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901483045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "outputHex": "53210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817982102b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f84834021024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a3453ae", + "inputStack": [ + "", + "3045022100fe324541215798b2df68cbd44039615e23c506d4ec1a05572064392a98196b82022068c849fa6699206da2fc6d7848efc1d3804a5816d6293615fe34c1a7f34e1c2f01", + "3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901", + "3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01" + ] + }, + { + "type": "scripthash", + "redeemScript": "OP_2 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 0395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a OP_2 OP_CHECKMULTISIG", + "redeemScriptSig": "OP_0 304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "input": "OP_0 304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501 522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae", + "output": "OP_HASH160 722ff0bc2c3f47b35c20df646c395594da24e90e OP_EQUAL", + "inputHex": "0047304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801483045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d14050147522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae", + "outputHex": "a914722ff0bc2c3f47b35c20df646c395594da24e90e87", + "inputStack": [ + "", + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae" + ] + }, + { + "type": "witnesspubkeyhash", + "pubKey": "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1", + "signature": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "output": "OP_0 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5", + "outputHex": "0014aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5", + "inputStack": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1" + ] + }, + { + "type": "witnessscripthash", + "witnessScript": "OP_2 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 0395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a OP_2 OP_CHECKMULTISIG", + "witnessData": [ + "", + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501" + ], + "output": "OP_0 32447752937d355ca2defddcd1f6b4fc53d182f8901cebbcff42f5e381bf0b80", + "outputHex": "002032447752937d355ca2defddcd1f6b4fc53d182f8901cebbcff42f5e381bf0b80", + "inputStack": [ + "", + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "522102359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1210395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a52ae" + ] + }, + { + "type": "nulldata", + "data": "06deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474", + "output": "OP_RETURN 06deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474", + "outputHex": "6a2606deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474" + }, + { + "type": "nulldata", + "data": "deadffffffffffffffffffffffffffffffffbeef", + "output": "OP_RETURN deadffffffffffffffffffffffffffffffffbeef", + "outputHex": "6a14deadffffffffffffffffffffffffffffffffbeef" + }, + { + "type": "nonstandard", + "typeIncomplete": "multisig", + "pubKeys": [ + "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340", + "024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34" + ], + "signatures": [ + null, + "3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901", + "3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01" + ], + "input": "OP_0 OP_0 3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901 3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "inputHex": "0000473044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901483045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01", + "inputStack": [ + "", + "", + "3044022001ab168e80b863fdec694350b587339bb72a37108ac3c989849251444d13ebba02201811272023e3c1038478eb972a82d3ad431bfc2408e88e4da990f1a7ecbb263901", + "3045022100aaeb7204c17eee2f2c4ff1c9f8b39b79e75e7fbf33e92cc67ac51be8f15b75f90220659eee314a4943a6384d2b154fa5821ef7a084814d7ee2c6f9f7f0ffb53be34b01" + ] + }, + { + "type": "nonstandard", + "typeIncomplete": "multisig", + "pubKeys": [ + "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340", + "024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34" + ], + "signatures": [null, null, null], + "input": "OP_0 OP_0 OP_0 OP_0", + "inputHex": "00000000", + "inputStack": ["", "", "", ""] + }, + { + "type": "scripthash", + "redeemScript": "OP_2 0327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a49372 03251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f 02cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde47 OP_3 OP_CHECKMULTISIG", + "redeemScriptSig": "OP_0 304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e8525201", + "input": "OP_0 304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e8525201 52210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753ae", + "inputHex": "0048304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e85252014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753ae", + "output": "OP_HASH160 fcc42dd4aa770d75cb6796bbd7853a325e746659 OP_EQUAL", + "outputHex": "a914fcc42dd4aa770d75cb6796bbd7853a325e74665987" + }, + { + "type": "nonstandard", + "typeIncomplete": "scripthash", + "pubKeys": [ + "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a" + ], + "signatures": [ + null, + "30450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a801" + ], + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "redeemScriptSig": "OP_0 OP_0 30450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a801", + "input": "OP_0 OP_0 30450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a801 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae", + "inputHex": "00004830450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a8014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae", + "inputStack": [ + "", + "", + "30450221009c92c1ae1767ac04e424da7f6db045d979b08cde86b1ddba48621d59a109d818022004f5bb21ad72255177270abaeb2d7940ac18f1e5ca1f53db4f3fd1045647a8a801", + "52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + ] + }, + { + "type": "nonstandard", + "output": "OP_HASH256 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000 OP_EQUAL", + "outputHex": "aa206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d619000000000087" + }, + { + "type": "nonstandard", + "output": "OP_0 OP_0 OP_0 OP_CHECKMULTISIG", + "outputHex": "000000ae" + }, + { + "type": "nonstandard", + "output": "OP_0", + "outputHex": "00" + }, + { + "type": "nonstandard", + "input": "OP_0 00", + "inputHex": "000100", + "inputStack": ["", "00"] + }, + { + "type": "nonstandard", + "input": "OP_6", + "inputHex": "56", + "nonstandard": { + "input": "06", + "inputHex": "0106" + }, + "inputStack": ["06"] + }, + { + "type": "nonstandard", + "input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "inputHex": "4cff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "inputStack": [ + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "invalid": { + "pubKey": { + "inputs": [ + { + "description": "non-canonical signature (too short)", + "input": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf7593" + }, + { + "description": "non-canonical signature (too long)", + "input": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca28ffffffff01" + }, + { + "description": "non-canonical signature (invalid hashType)", + "input": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca28ff" + } + ], + "outputs": [ + { + "description": "non-canonical pubkey (too short)", + "output": "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce OP_CHECKSIG" + }, + { + "description": "non-canonical pubkey (too long)", + "output": "02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1ffffff OP_CHECKSIG" + }, + { + "description": "last operator is wrong for pubkey-output", + "outputHex": "21027a71801ab59336de37785c50005b6abd8ea859eecce1edbe8e81afa74ee5c752ae" + }, + { + "description": "missing OP_CHECKSIG", + "outputHex": "21027a71801ab59336de37785c50005b6abd8ea859eecce1edbe8e81afa74ee5c752" + }, + { + "description": "non-canonical pubkey (bad prefix)", + "output": "427a71801ab59336de37785c50005b6abd8ea859eecce1edbe8e81afa74ee5c752 OP_CHECKSIG" + }, + { + "description": "has extra opcode at the end isPubKeyOutput", + "output": "027a71801ab59336de37785c50005b6abd8ea859eecce1edbe8e81afa74ee5c752 OP_CHECKSIG OP_0" + } + ] + }, + "pubKeyHash": { + "inputs": [ + { + "description": "pubKeyHash input : extraneous data", + "input": "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 ffffffff" + } + ], + "outputs": [ + { + "description": "non-minimal encoded isPubKeyHashOutput (non BIP62 compliant)", + "outputHex": "76a94c14aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac" + }, + { + "description": "bad OP_DUP isPubKeyHashOutput", + "outputHex": "aca914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac" + }, + { + "description": "bad OP_HASH160 isPubKeyHashOutput", + "outputHex": "76ac14aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac" + }, + { + "description": "bad OP_EQUALVERIFY isPubKeyHashOutput", + "outputHex": "76a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5acac" + }, + { + "description": "bad OP_CHECKSIG isPubKeyHashOutput", + "outputHex": "76a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c58888" + }, + { + "description": "bad length isPubKeyHashOutput", + "outputHex": "76a920aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac" + }, + { + "description": "has something at the end isPubKeyHashOutput", + "outputHex": "76a920aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00" + }, + { + "exception": "Expected Buffer\\(Length: 20\\), got Buffer\\(Length: 2\\)", + "hash": "ffff" + } + ] + }, + "scriptHash": { + "inputs": [ + { + "description": "redeemScript not data", + "input": "OP_0 304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801 3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501 OP_RESERVED" + }, + { + "description": "redeemScript is a signature, therefore not a valid script", + "input": "OP_0 3045022100e12b17b3a4c80c401a1687487bd2bafee9e5f1f8f1ffc6180ce186672ad7b43a02205e316d1e5e71822f5ef301b694e578fa9c94af4f5f098c952c833f4691307f4e01" + } + ], + "outputs": [ + { + "description": "non-minimal encoded isScriptHashOutput (non BIP62 compliant)", + "outputHex": "a94c14c286a1af0947f58d1ad787385b1c2c4a976f9e7187" + }, + { + "description": "wrong OP_HASH160 opcode", + "outputHex": "ac4c14c286a1af0947f58d1ad787385b1c2c4a976f9e7187" + }, + { + "description": "wrong length marker", + "outputHex": "a916c286a1af0947f58d1ad787385b1c2c4a976f9e7187" + }, + { + "description": "wrong OP_EQUAL opcode", + "outputHex": "a914c286a1af0947f58d1ad787385b1c2c4a976f9e7188" + }, + { + "exception": "Expected Buffer\\(Length: 20\\), got Buffer\\(Length: 3\\)", + "hash": "ffffff" + } + ] + }, + "multisig": { + "inputs": [ + { + "description": "Not enough signatures provided", + "type": "multisig", + "output": "OP_2 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_2 OP_CHECKMULTISIG", + "signatures": [] + }, + { + "exception": "Not enough signatures provided", + "output": "OP_2 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 0395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a OP_2 OP_CHECKMULTISIG", + "signatures": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801" + ] + }, + { + "exception": "Too many signatures provided", + "output": "OP_2 02359c6e3f04cefbf089cf1d6670dc47c3fb4df68e2bad1fa5a369f9ce4b42bbd1 0395a9d84d47d524548f79f435758c01faec5da2b7e551d3b8c995b7e06326ae4a OP_2 OP_CHECKMULTISIG", + "signatures": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501", + "3045022100ef253c1faa39e65115872519e5f0a33bbecf430c0f35cf562beabbad4da24d8d02201742be8ee49812a73adea3007c9641ce6725c32cd44ddb8e3a3af460015d140501" + ] + } + ], + "outputs": [ + { + "description": "OP_CHECKMULTISIG not found", + "output": "OP_0 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_2 OP_HASH160" + }, + { + "description": "less than 4 chunks", + "output": "OP_0 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 OP_HASH160" + }, + { + "description": "m === 0", + "output": "OP_0 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_2 OP_CHECKMULTISIG" + }, + { + "description": "m < OP_1", + "output": "OP_1NEGATE 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_2 OP_CHECKMULTISIG" + }, + { + "description": "m > OP_16", + "output": "OP_NOP 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_2 OP_CHECKMULTISIG" + }, + { + "description": "n === 0", + "output": "OP_1 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_0 OP_CHECKMULTISIG" + }, + { + "description": "n < OP_1", + "output": "OP_1 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_1NEGATE OP_CHECKMULTISIG" + }, + { + "description": "n > OP_16", + "output": "OP_1 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_NOP OP_CHECKMULTISIG" + }, + { + "description": "n < m", + "output": "OP_2 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 OP_1 OP_CHECKMULTISIG" + }, + { + "description": "n < len(pubKeys)", + "output": "OP_2 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 02b80011a883a0fd621ad46dfc405df1e74bf075cbaf700fd4aebef6e96f848340 024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34 OP_2 OP_CHECKMULTISIG" + }, + { + "description": "n > len(pubKeys)", + "output": "OP_1 024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34 OP_2 OP_CHECKMULTISIG" + }, + { + "description": "m is data", + "output": "ffff 024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34 OP_1 OP_CHECKMULTISIG" + }, + { + "description": "n is data", + "output": "OP_1 024289801366bcee6172b771cf5a7f13aaecd237a0b9a1ff9d769cabc2e6b70a34 ffff OP_CHECKMULTISIG" + }, + { + "description": "non-canonical pubKey (bad length)", + "output": "OP_1 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffff OP_1 OP_CHECKMULTISIG" + }, + { + "exception": "Not enough pubKeys provided", + "m": 4, + "pubKeys": [ + "02ea1297665dd733d444f31ec2581020004892cdaaf3dd6c0107c615afb839785f", + "02fab2dea1458990793f56f42e4a47dbf35a12a351f26fa5d7e0cc7447eaafa21f", + "036c6802ce7e8113723dd92cdb852e492ebb157a871ca532c3cb9ed08248ff0e19" + ], + "signatures": [ + "304402207515cf147d201f411092e6be5a64a6006f9308fad7b2a8fdaab22cd86ce764c202200974b8aca7bf51dbf54150d3884e1ae04f675637b926ec33bf75939446f6ca2801" + ] + } + ] + }, + "witnessPubKeyHash": { + "inputs": [], + "outputs": [ + { + "description": "wrong version", + "outputHex": "51149090909090909090909090909090909090909090" + }, + { + "description": "wrong length marker", + "outputHex": "00209090909090909090909090909090909090909090" + }, + { + "exception": "Expected Buffer\\(Length: 20\\), got Buffer\\(Length: 3\\)", + "hash": "ffffff" + } + ] + }, + "witnessScriptHash": { + "inputs": [], + "outputs": [ + { + "description": "wrong version", + "outputHex": "51209090909090909090909090909090909090909090909090909090909090909090" + }, + { + "description": "wrong length marker", + "outputHex": "00219090909090909090909090909090909090909090909090909090909090909090" + }, + { + "exception": "Expected Buffer\\(Length: 32\\), got Buffer\\(Length: 3\\)", + "hash": "ffffff" + } + ] + }, + "witnessCommitment": { + "inputs": [], + "outputs": [ + { + "exception": "", + "commitment": "abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd1234abcd" + }, + { + "description": "wrong OPCODE at the start", + "scriptPubKeyHex": "6024aa21a9ed4db4fb830efe3e804337413ffe8ad7393af301e0ec8e71b6e6f2b860a56f4dcd" + }, + { + "description": "wrong length marker", + "scriptPubKeyHex": "6a23aa21a9ed4db4fb830efe3e804337413ffe8ad7393af301e0ec8e71b6e6f2b860a56f4dcd" + }, + { + "description": "commitment of wrong length", + "scriptPubKeyHex": "6a23aa21a9ed4db4fb830efe3e804337413ffe8ad7393af301e0ec8e71b6e6f2b860a56f4d" + } + ] + } + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/transaction.json b/web/bitcoincashjs-lib/test/fixtures/transaction.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/transaction.json @@ -0,0 +1,835 @@ +{ + "valid": [ + { + "description": "Standard transaction (1:1)", + "id": "a0ff943d3f644d8832b1fa74be4d0ad2577615dc28a7ef74ff8c271b603a082a", + "hash": "2a083a601b278cff74efa728dc157657d20a4dbe74fab132884d643f3d94ffa0", + "hex": "0100000001f1fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe000000006b4830450221008732a460737d956fd94d49a31890b2908f7ed7025a9c1d0f25e43290f1841716022004fa7d608a291d44ebbbebbadaac18f943031e7de39ef3bf9920998c43e60c0401210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff01a0860100000000001976a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88ac00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "f1fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe", + "index": 0, + "script": "30450221008732a460737d956fd94d49a31890b2908f7ed7025a9c1d0f25e43290f1841716022004fa7d608a291d44ebbbebbadaac18f943031e7de39ef3bf9920998c43e60c0401 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798" + } + ], + "outs": [ + { + "script": "OP_DUP OP_HASH160 c42e7ef92fdb603af844d064faad95db9bcdfd3d OP_EQUALVERIFY OP_CHECKSIG", + "value": 100000 + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 192, + "weight": 768 + }, + { + "description": "Standard transaction (2:2)", + "id": "fcdd6d89c43e76dcff94285d9b6e31d5c60cb5e397a76ebc4920befad30907bc", + "hash": "bc0709d3fabe2049bc6ea797e3b50cc6d5316e9b5d2894ffdc763ec4896dddfc", + "hex": "0100000002f1fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe000000006b483045022100e661badd8d2cf1af27eb3b82e61b5d3f5d5512084591796ae31487f5b82df948022006df3c2a2cac79f68e4b179f4bbb8185a0bb3c4a2486d4405c59b2ba07a74c2101210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798fffffffff2fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe0100000083483045022100be54a46a44fb7e6bf4ebf348061d0dace7ddcbb92d4147ce181cf4789c7061f0022068ccab2a89a47fc29bb5074bca99ae846ab446eecf3c3aaeb238a13838783c78012102c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee517a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687000000800250c30000000000001976a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88acf04902000000000017a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc768700000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "f1fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe", + "index": 0, + "script": "3045022100e661badd8d2cf1af27eb3b82e61b5d3f5d5512084591796ae31487f5b82df948022006df3c2a2cac79f68e4b179f4bbb8185a0bb3c4a2486d4405c59b2ba07a74c2101 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", + "sequence": 4294967295 + }, + { + "hash": "f2fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe", + "index": 1, + "script": "3045022100be54a46a44fb7e6bf4ebf348061d0dace7ddcbb92d4147ce181cf4789c7061f0022068ccab2a89a47fc29bb5074bca99ae846ab446eecf3c3aaeb238a13838783c7801 02c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5 a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687", + "sequence": 2147483648 + } + ], + "outs": [ + { + "script": "OP_DUP OP_HASH160 c42e7ef92fdb603af844d064faad95db9bcdfd3d OP_EQUALVERIFY OP_CHECKSIG", + "value": 50000 + }, + { + "script": "OP_HASH160 7ccb85f0ab2d599bc17246c98babd5a20b1cdc76 OP_EQUAL", + "value": 150000 + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 396, + "weight": 1584 + }, + { + "description": "Standard transaction (14:2)", + "id": "39d57bc27f72e904d81f6b5ef7b4e6e17fa33a06b11e5114a43435830d7b5563", + "hash": "63557b0d833534a414511eb1063aa37fe1e6b4f75e6b1fd804e9727fc27bd539", + "hex": "010000000ee7b73e229790c1e79a02f0c871813b3cf26a4156c5b8d942e88b38fe8d3f43a0000000008c493046022100fd3d8fef44fb0962ba3f07bee1d4cafb84e60e38e6c7d9274504b3638a8d2f520221009fce009044e615b6883d4bf62e04c48f9fe236e19d644b082b2f0ae5c98e045c014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffff7bfc005f3880a606027c7cd7dd02a0f6a6572eeb84a91aa158311be13695a7ea010000008b483045022100e2e61c40f26e2510b76dc72ea2f568ec514fce185c719e18bca9caaef2b20e9e02207f1100fc79eb0584e970c7f18fb226f178951d481767b4092d50d13c50ccba8b014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffff0e0f8e6bf951fbb84d7d8ef833a1cbf5bb046ea7251973ac6e7661c755386ee3010000008a473044022048f1611e403710f248f7caf479965a6a5f63cdfbd9a714fef4ec1b68331ade1d022074919e79376c363d4575b2fc21513d5949471703efebd4c5ca2885e810eb1fa4014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffffe6f17f35bf9f0aa7a4242ab3e29edbdb74c5274bf263e53043dddb8045cb585b000000008b483045022100886c07cad489dfcf4b364af561835d5cf985f07adf8bd1d5bd6ddea82b0ce6b2022045bdcbcc2b5fc55191bb997039cf59ff70e8515c56b62f293a9add770ba26738014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffffe6f17f35bf9f0aa7a4242ab3e29edbdb74c5274bf263e53043dddb8045cb585b010000008a4730440220535d49b819fdf294d27d82aff2865ed4e18580f0ca9796d793f611cb43a44f47022019584d5e300c415f642e37ba2a814a1e1106b4a9b91dc2a30fb57ceafe041181014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffffd3051677216ea53baa2e6d7f6a75434ac338438c59f314801c8496d1e6d1bf6d010000008b483045022100bf612b0fa46f49e70ab318ca3458d1ed5f59727aa782f7fac5503f54d9b43a590220358d7ed0e3cee63a5a7e972d9fad41f825d95de2fd0c5560382468610848d489014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffff1e751ccc4e7d973201e9174ec78ece050ef2fadd6a108f40f76a9fa314979c31010000008b483045022006e263d5f73e05c48a603e3bd236e8314e5420721d5e9020114b93e8c9220e1102210099d3dead22f4a792123347a238c87e67b55b28a94a0bb7793144cc7ad94a0168014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffff25c4cf2c61743b3f4252d921d937cca942cf32e4f3fa4a544d0b26f014337084010000008a47304402207d6e87588be47bf2d97eaf427bdd992e9d6b306255711328aee38533366a88b50220623099595ae442cb77eaddb3f91753a4fc9df56fde69cfec584c7f97e05533c8014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffffecd93c87eb43c48481e6694904305349bdea94b01104579fa9f02bff66c89663010000008a473044022020f59498aee0cf82cb113768ef3cb721000346d381ff439adb4d405f791252510220448de723aa59412266fabbc689ec25dc94b1688c27a614982047513a80173514014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffffa1fdc0a79ff98d5b6154176e321c22f4f8450dbd950bd013ad31135f5604411e010000008b48304502210088167867f87327f9c0db0444267ff0b6a026eedd629d8f16fe44a34c18e706bf0220675c8baebf89930e2d6e4463adefc50922653af99375242e38f5ee677418738a014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffffb89e8249c3573b58bf1ec7433185452dd57ab8e1daab01c3cc6ddc8b66ad3de8000000008b4830450220073d50ac5ec8388d5b3906921f9368c31ad078c8e1fb72f26d36b533f35ee327022100c398b23e6692e11dca8a1b64aae2ff70c6a781ed5ee99181b56a2f583a967cd4014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffff45ee07e182084454dacfad1e61b04ffdf9c7b01003060a6c841a01f4fff8a5a0010000008b483045022100991d1bf60c41358f08b20e53718a24e05ac0608915df4f6305a5b47cb61e5da7022003f14fc1cc5b737e2c3279a4f9be1852b49dbb3d9d6cc4c8af6a666f600dced8014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffff4cba12549f1d70f8e60aea8b546c8357f7c099e7c7d9d8691d6ee16e7dfa3170010000008c493046022100f14e2b0ef8a8e206db350413d204bc0a5cd779e556b1191c2d30b5ec023cde6f022100b90b2d2bf256c98a88f7c3a653b93cec7d25bb6a517db9087d11dbd189e8851c014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffffa4b3aed39eb2a1dc6eae4609d9909724e211c153927c230d02bd33add3026959010000008b483045022100a8cebb4f1c58f5ba1af91cb8bd4a2ed4e684e9605f5a9dc8b432ed00922d289d0220251145d2d56f06d936fd0c51fa884b4a6a5fafd0c3318f72fb05a5c9aa372195014104aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19fffffffff0240d52303000000001976a914167c3e1f10cc3b691c73afbdb211e156e3e3f25c88ac15462e00000000001976a914290f7d617b75993e770e5606335fa0999a28d71388ac00000000", + "raw": { + "version": 1, + "locktime": 0, + "ins": [ + { + "hash": "e7b73e229790c1e79a02f0c871813b3cf26a4156c5b8d942e88b38fe8d3f43a0", + "index": 0, + "script": "3046022100fd3d8fef44fb0962ba3f07bee1d4cafb84e60e38e6c7d9274504b3638a8d2f520221009fce009044e615b6883d4bf62e04c48f9fe236e19d644b082b2f0ae5c98e045c01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f", + "sequence": null + }, + { + "hash": "7bfc005f3880a606027c7cd7dd02a0f6a6572eeb84a91aa158311be13695a7ea", + "index": 1, + "script": "3045022100e2e61c40f26e2510b76dc72ea2f568ec514fce185c719e18bca9caaef2b20e9e02207f1100fc79eb0584e970c7f18fb226f178951d481767b4092d50d13c50ccba8b01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "0e0f8e6bf951fbb84d7d8ef833a1cbf5bb046ea7251973ac6e7661c755386ee3", + "index": 1, + "script": "3044022048f1611e403710f248f7caf479965a6a5f63cdfbd9a714fef4ec1b68331ade1d022074919e79376c363d4575b2fc21513d5949471703efebd4c5ca2885e810eb1fa401 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "e6f17f35bf9f0aa7a4242ab3e29edbdb74c5274bf263e53043dddb8045cb585b", + "index": 0, + "script": "3045022100886c07cad489dfcf4b364af561835d5cf985f07adf8bd1d5bd6ddea82b0ce6b2022045bdcbcc2b5fc55191bb997039cf59ff70e8515c56b62f293a9add770ba2673801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "e6f17f35bf9f0aa7a4242ab3e29edbdb74c5274bf263e53043dddb8045cb585b", + "index": 1, + "script": "30440220535d49b819fdf294d27d82aff2865ed4e18580f0ca9796d793f611cb43a44f47022019584d5e300c415f642e37ba2a814a1e1106b4a9b91dc2a30fb57ceafe04118101 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "d3051677216ea53baa2e6d7f6a75434ac338438c59f314801c8496d1e6d1bf6d", + "index": 1, + "script": "3045022100bf612b0fa46f49e70ab318ca3458d1ed5f59727aa782f7fac5503f54d9b43a590220358d7ed0e3cee63a5a7e972d9fad41f825d95de2fd0c5560382468610848d48901 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "1e751ccc4e7d973201e9174ec78ece050ef2fadd6a108f40f76a9fa314979c31", + "index": 1, + "script": "3045022006e263d5f73e05c48a603e3bd236e8314e5420721d5e9020114b93e8c9220e1102210099d3dead22f4a792123347a238c87e67b55b28a94a0bb7793144cc7ad94a016801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "25c4cf2c61743b3f4252d921d937cca942cf32e4f3fa4a544d0b26f014337084", + "index": 1, + "script": "304402207d6e87588be47bf2d97eaf427bdd992e9d6b306255711328aee38533366a88b50220623099595ae442cb77eaddb3f91753a4fc9df56fde69cfec584c7f97e05533c801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "ecd93c87eb43c48481e6694904305349bdea94b01104579fa9f02bff66c89663", + "index": 1, + "script": "3044022020f59498aee0cf82cb113768ef3cb721000346d381ff439adb4d405f791252510220448de723aa59412266fabbc689ec25dc94b1688c27a614982047513a8017351401 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "a1fdc0a79ff98d5b6154176e321c22f4f8450dbd950bd013ad31135f5604411e", + "index": 1, + "script": "304502210088167867f87327f9c0db0444267ff0b6a026eedd629d8f16fe44a34c18e706bf0220675c8baebf89930e2d6e4463adefc50922653af99375242e38f5ee677418738a01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "b89e8249c3573b58bf1ec7433185452dd57ab8e1daab01c3cc6ddc8b66ad3de8", + "index": 0, + "script": "30450220073d50ac5ec8388d5b3906921f9368c31ad078c8e1fb72f26d36b533f35ee327022100c398b23e6692e11dca8a1b64aae2ff70c6a781ed5ee99181b56a2f583a967cd401 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "45ee07e182084454dacfad1e61b04ffdf9c7b01003060a6c841a01f4fff8a5a0", + "index": 1, + "script": "3045022100991d1bf60c41358f08b20e53718a24e05ac0608915df4f6305a5b47cb61e5da7022003f14fc1cc5b737e2c3279a4f9be1852b49dbb3d9d6cc4c8af6a666f600dced801 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "4cba12549f1d70f8e60aea8b546c8357f7c099e7c7d9d8691d6ee16e7dfa3170", + "index": 1, + "script": "3046022100f14e2b0ef8a8e206db350413d204bc0a5cd779e556b1191c2d30b5ec023cde6f022100b90b2d2bf256c98a88f7c3a653b93cec7d25bb6a517db9087d11dbd189e8851c01 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + }, + { + "hash": "a4b3aed39eb2a1dc6eae4609d9909724e211c153927c230d02bd33add3026959", + "index": 1, + "script": "3045022100a8cebb4f1c58f5ba1af91cb8bd4a2ed4e684e9605f5a9dc8b432ed00922d289d0220251145d2d56f06d936fd0c51fa884b4a6a5fafd0c3318f72fb05a5c9aa37219501 04aa592c859fd00ed2a02609aad3a1bf72e0b42de67713e632c70a33cc488c15598a0fb419370a54d1c275b44380e8777fc01b6dc3cd43a416c6bab0e30dc1e19f" + } + ], + "outs": [ + { + "value": 52680000, + "script": "OP_DUP OP_HASH160 167c3e1f10cc3b691c73afbdb211e156e3e3f25c OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 3032597, + "script": "OP_DUP OP_HASH160 290f7d617b75993e770e5606335fa0999a28d713 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + "coinbase": false, + "virtualSize": 2596, + "weight": 10384 + }, + { + "description": "Coinbase transaction", + "id": "8e070d4eb85eb02e02dd938d6552316b9d723330707870c518064b7a0d232da3", + "hash": "a32d230d7a4b0618c57078703033729d6b3152658d93dd022eb05eb84e0d078e", + "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff29032832051c4d696e656420627920416e74506f6f6c20626a343a45ef0454c5de8d5e5300004e2c0000ffffffff01414f1995000000001976a914b05793fe86a9f51a5f5ae3a6f07fd31932128a3f88ac00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 4294967295, + "data": "032832051c4d696e656420627920416e74506f6f6c20626a343a45ef0454c5de8d5e5300004e2c0000" + } + ], + "outs": [ + { + "script": "OP_DUP OP_HASH160 b05793fe86a9f51a5f5ae3a6f07fd31932128a3f OP_EQUALVERIFY OP_CHECKSIG", + "value": 2501463873 + } + ], + "locktime": 0 + }, + "coinbase": true, + "virtualSize": 126, + "weight": 504 + }, + { + "description": "Transaction that ignores script chunking rules - Bug #367", + "id": "ebc9fa1196a59e192352d76c0f6e73167046b9d37b8302b6bb6968dfd279b767", + "hash": "67b779d2df6869bbb602837bd3b9467016736e0f6cd75223199ea59611fac9eb", + "hex": "01000000019ac03d5ae6a875d970128ef9086cef276a1919684a6988023cc7254691d97e6d010000006b4830450221009d41dc793ba24e65f571473d40b299b6459087cea1509f0d381740b1ac863cb6022039c425906fcaf51b2b84d8092569fb3213de43abaff2180e2a799d4fcb4dd0aa012102d5ede09a8ae667d0f855ef90325e27f6ce35bbe60a1e6e87af7f5b3c652140fdffffffff080100000000000000010101000000000000000202010100000000000000014c0100000000000000034c02010100000000000000014d0100000000000000044dffff010100000000000000014e0100000000000000064effffffff0100000000", + "raw": { + "version": 1, + "locktime": 0, + "ins": [ + { + "hash": "9ac03d5ae6a875d970128ef9086cef276a1919684a6988023cc7254691d97e6d", + "index": 1, + "script": "30450221009d41dc793ba24e65f571473d40b299b6459087cea1509f0d381740b1ac863cb6022039c425906fcaf51b2b84d8092569fb3213de43abaff2180e2a799d4fcb4dd0aa01 02d5ede09a8ae667d0f855ef90325e27f6ce35bbe60a1e6e87af7f5b3c652140fd" + } + ], + "outs": [ + { + "data": "01", + "value": 1 + }, + { + "data": "0201", + "value": 1 + }, + { + "data": "4c", + "value": 1 + }, + { + "data": "4c0201", + "value": 1 + }, + { + "data": "4d", + "value": 1 + }, + { + "data": "4dffff01", + "value": 1 + }, + { + "data": "4e", + "value": 1 + }, + { + "data": "4effffffff01", + "value": 1 + } + ] + }, + "coinbase": false, + "virtualSize": 249, + "weight": 996 + }, + { + "description": "P2PK", + "id": "8d4733995be9b3331a65eeb31bce24b213d4fabcbadf7f6634a8fea442c13e6a", + "hash": "6a3ec142a4fea834667fdfbabcfad413b224ce1bb3ee651a33b3e95b9933478d", + "hex": "010000000193aef40ae141694895e99e18e49d0181b086dd7c011c0241175c6eaf320099970000000049483045022100e57eba5380dcc8a7bdb5370b423dadd43070e1ca268f94bc97b2ded55ca45e9502206a43151c8af03a00f0ac86526d07981e303fc0daea8c6ed435abe8961533046d01ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "", + "raw": { + "version": 1, + "ins": [ + { + "hash": "93aef40ae141694895e99e18e49d0181b086dd7c011c0241175c6eaf32009997", + "index": 0, + "script": "3045022100e57eba5380dcc8a7bdb5370b423dadd43070e1ca268f94bc97b2ded55ca45e9502206a43151c8af03a00f0ac86526d07981e303fc0daea8c6ed435abe8961533046d01", + "value": 80000 + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 158, + "weight": 632 + }, + { + "description": "P2SH P2PK", + "id": "d4ebb5e09c06dd375f265b51eb7f1a14d12deba71329500e2a00a905fdfdc27d", + "hash": "7dc2fdfd05a9002a0e502913a7eb2dd1141a7feb515b265f37dd069ce0b5ebd4", + "hex": "0100000001a30e865fa60f6c25a8b218bb5a6b9acc7cf3f1db2f2e3a7114b51af5d6ae811f000000006c473044022026d2b56b6cb0269bf4e80dd655b9e917019e2ccef57f4b858d03bb45a2da59d9022010519a7f327f03e7c9613e0694f929544af29d3682e7ec8f19147e7a86651ecd012321038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bacffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "", + "raw": { + "version": 1, + "ins": [ + { + "hash": "a30e865fa60f6c25a8b218bb5a6b9acc7cf3f1db2f2e3a7114b51af5d6ae811f", + "index": 0, + "script": "3044022026d2b56b6cb0269bf4e80dd655b9e917019e2ccef57f4b858d03bb45a2da59d9022010519a7f327f03e7c9613e0694f929544af29d3682e7ec8f19147e7a86651ecd01 21038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac", + "value": 80000 + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "scriptHex": "76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 193, + "weight": 772 + }, + { + "description": "P2WSH P2PK", + "id": "60f04167a0c94d6439102f7fde9ad77c08a8716419805e77ef66b286cc5c7f87", + "hash": "877f5ccc86b266ef775e80196471a8087cd79ade7f2f1039644dc9a06741f060", + "hex": "01000000014533a3bc1e039bd787656068e135aaee10aee95a64776bfc047ee6a7c1ebdd2f0000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "010000000001014533a3bc1e039bd787656068e135aaee10aee95a64776bfc047ee6a7c1ebdd2f0000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac02473044022039725bb7291a14dd182dafdeaf3ea0d5c05c34f4617ccbaa46522ca913995c4e02203b170d072ed2e489e7424ad96d8fa888deb530be2d4c5d9aaddf111a7efdb2d3012321038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "4533a3bc1e039bd787656068e135aaee10aee95a64776bfc047ee6a7c1ebdd2f", + "index": 0, + "witness": [ + "3044022039725bb7291a14dd182dafdeaf3ea0d5c05c34f4617ccbaa46522ca913995c4e02203b170d072ed2e489e7424ad96d8fa888deb530be2d4c5d9aaddf111a7efdb2d301", + "21038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "scriptHex": "76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 113, + "weight": 451 + }, + { + "description": "P2SH P2WSH P2PK", + "id": "da24fd5a422f72e3bde593628c2b47ff9ca7454e1f3ba5fb916344c218d31052", + "hash": "5210d318c2446391fba53b1f4e45a79cff472b8c6293e5bde3722f425afd24da", + "hex": "0100000001e0779d448aaa203a96b3de14d0482e26dd75a4278ae5bb6d7cc18e6874f3866000000000232200200f9ea7bae7166c980169059e39443ed13324495b0d6678ce716262e879591210ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "01000000000101e0779d448aaa203a96b3de14d0482e26dd75a4278ae5bb6d7cc18e6874f3866000000000232200200f9ea7bae7166c980169059e39443ed13324495b0d6678ce716262e879591210ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac024730440220014207a5f0601ed7b3c3f9d82309b32e8f76dd6776a55cb5f8684b9ff029e0850220693afd7b69471b51d9354cc1a956b68b8d48e32f6b0ad7a19bb5dd3e4499179a012321038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "e0779d448aaa203a96b3de14d0482e26dd75a4278ae5bb6d7cc18e6874f38660", + "index": 0, + "script": "00200f9ea7bae7166c980169059e39443ed13324495b0d6678ce716262e879591210", + "witness": [ + "30440220014207a5f0601ed7b3c3f9d82309b32e8f76dd6776a55cb5f8684b9ff029e0850220693afd7b69471b51d9354cc1a956b68b8d48e32f6b0ad7a19bb5dd3e4499179a01", + "21038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 148, + "weight": 591 + }, + { + "description": "P2PKH", + "id": "c7a77aeadf529759c8db9b3f205d690cdaed3df0eaf441ead648086e85a6a280", + "hash": "80a2a6856e0848d6ea41f4eaf03dedda0c695d203f9bdbc8599752dfea7aa7c7", + "hex": "010000000176d7b05b96e69d9760bacf14e496ea01085eff32be8f4e08b299eb92057826e5000000006b4830450221009bd6ff2561437155913c289923175d3f114cca1c0e2bc5989315d5261502c2c902201b71ad90dce076a5eb872330ed729e7c2c4bc2d0513efff099dbefb3b62eab4f0121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "", + "raw": { + "version": 1, + "ins": [ + { + "hash": "76d7b05b96e69d9760bacf14e496ea01085eff32be8f4e08b299eb92057826e5", + "index": 0, + "script": "30450221009bd6ff2561437155913c289923175d3f114cca1c0e2bc5989315d5261502c2c902201b71ad90dce076a5eb872330ed729e7c2c4bc2d0513efff099dbefb3b62eab4f01 038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b" + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 192, + "weight": 768 + }, + { + "description": "P2SH P2PKH", + "id": "0b8fa64f89b95666a23e424fe94e9114806726be9753e140dbd74c0d673c9593", + "hash": "93953c670d4cd7db40e15397be26678014914ee94f423ea26656b9894fa68f0b", + "hex": "01000000014b9ffc17c3cce03ee66980bf32d36aaa13462980c3af9d9d29ec6b97ab1c91650000000084473044022003d738d855d0c54a419ac62ebe1a1c0bf2dc6993c9585adb9a8666736658107002204d57ff62ee7efae6df73430bba62494faeba8c125a4abcf2488757a4f8877dd50121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b1976a914851a33a5ef0d4279bd5854949174e2c65b1d450088acffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "", + "raw": { + "version": 1, + "ins": [ + { + "hash": "4b9ffc17c3cce03ee66980bf32d36aaa13462980c3af9d9d29ec6b97ab1c9165", + "index": 0, + "script": "3044022003d738d855d0c54a419ac62ebe1a1c0bf2dc6993c9585adb9a8666736658107002204d57ff62ee7efae6df73430bba62494faeba8c125a4abcf2488757a4f8877dd501 038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b 76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 217, + "weight": 868 + }, + { + "description": "P2WSH P2PKH", + "id": "62c62316f80beb10d9b1ce9183eb66e7e18a18324ca5f5e6f839be03f64aba83", + "hash": "83ba4af603be39f8e6f5a54c32188ae1e766eb8391ceb1d910eb0bf81623c662", + "hex": "010000000123539877e39a273819006de1c433e09f9e9af201fc178dd0f2cf2eaa5ad53b480000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "0100000000010123539877e39a273819006de1c433e09f9e9af201fc178dd0f2cf2eaa5ad53b480000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac03483045022100f02a82b0a94a5d5dc4d2127ac34be62cb066713d71d56bdf5ef7810ab57a157302205f24abdde1dab554a02edcf378e98828024e57272e5e474a5b04accdca080a030121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b1976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "23539877e39a273819006de1c433e09f9e9af201fc178dd0f2cf2eaa5ad53b48", + "index": 0, + "script": "", + "witness": [ + "3045022100f02a82b0a94a5d5dc4d2127ac34be62cb066713d71d56bdf5ef7810ab57a157302205f24abdde1dab554a02edcf378e98828024e57272e5e474a5b04accdca080a0301", + "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b", + "76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "scriptHex": "76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 119, + "weight": 476 + }, + { + "description": "P2SH P2WSH P2PKH", + "id": "2ef1431ec41a75791b75d16526f23534ae66d8d4abfb483d98d14bcb259311c0", + "hash": "c0119325cb4bd1983d48fbabd4d866ae3435f22665d1751b79751ac41e43f12e", + "hex": "0100000001363dfbfe2566db77e3b1195bedf1d0daeb9ce526cd7611ba81759b2654ce415c0000000023220020578db4b54a6961060b71385c17d3280379a557224c52b11b19a3a1c1eef606a0ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "01000000000101363dfbfe2566db77e3b1195bedf1d0daeb9ce526cd7611ba81759b2654ce415c0000000023220020578db4b54a6961060b71385c17d3280379a557224c52b11b19a3a1c1eef606a0ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac03483045022100c8bd5ebb26ba6719158650c3e7c5e80be4c886ba025c44cc41f5149b3114705a02203ac6e1f38f6c081d506f28f1b5e38ebec9e0f0fa911d0e3f68d48d8b0e77b34b0121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b1976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "363dfbfe2566db77e3b1195bedf1d0daeb9ce526cd7611ba81759b2654ce415c", + "index": 0, + "script": "0020578db4b54a6961060b71385c17d3280379a557224c52b11b19a3a1c1eef606a0", + "witness": [ + "3045022100c8bd5ebb26ba6719158650c3e7c5e80be4c886ba025c44cc41f5149b3114705a02203ac6e1f38f6c081d506f28f1b5e38ebec9e0f0fa911d0e3f68d48d8b0e77b34b01", + "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b", + "76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 154, + "weight": 616 + }, + { + "description": "Multisig", + "id": "7f5d96a866a815f5a1896fcd3b49cd00ac4c366a371fe8555f124e628e977a5e", + "hash": "5e7a978e624e125f55e81f376a364cac00cd493bcd6f89a1f515a866a8965d7f", + "hex": "010000000179310ec46e734b3490ee839c5ae4a09d28561ee9fff2d051f733d201f958d6d2000000004a00483045022100d269531f120f377ed2f94f42bef893ff2fe6544ac97fb477fa291bc6cfb7647e02200983f6a5bbd4ce6cf97f571995634805a7324cc5d8353ed954fa62477b0fcd0901ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "", + "raw": { + "version": 1, + "ins": [ + { + "hash": "79310ec46e734b3490ee839c5ae4a09d28561ee9fff2d051f733d201f958d6d2", + "index": 0, + "script": "OP_0 3045022100d269531f120f377ed2f94f42bef893ff2fe6544ac97fb477fa291bc6cfb7647e02200983f6a5bbd4ce6cf97f571995634805a7324cc5d8353ed954fa62477b0fcd0901" + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 159, + "weight": 636 + }, + { + "description": "P2SH Multisig", + "id": "3aef827e4306bab01f118a8eccad74713bcd1695362caf9fed55202ed54ef88b", + "hash": "8bf84ed52e2055ed9faf2c369516cd3b7174adcc8e8a111fb0ba06437e82ef3a", + "hex": "010000000152882c661c49dd2f53bd9ced7e9f44b184888ad2fe7d86737f0efaa7aecdced1000000006f00473044022025f2e161f0a97888df948f4dcc7c04fe502510b8d8260ca9920f38d55e4d17720220271b6843224b3a34542a4df31781d048da56ee46b8c5fb99043e30abd527b2d801255121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51aeffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "", + "raw": { + "version": 1, + "ins": [ + { + "hash": "52882c661c49dd2f53bd9ced7e9f44b184888ad2fe7d86737f0efaa7aecdced1", + "index": 0, + "script": "OP_0 3044022025f2e161f0a97888df948f4dcc7c04fe502510b8d8260ca9920f38d55e4d17720220271b6843224b3a34542a4df31781d048da56ee46b8c5fb99043e30abd527b2d801 5121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51ae" + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "scriptHex": "76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 196, + "weight": 784 + }, + { + "description": "P2WSH Multisig", + "id": "03e6b741d25cbd061b8d0999a521788ef90263dd8ba96d91c2136a4386afdf8e", + "hash": "8edfaf86436a13c2916da98bdd6302f98e7821a599098d1b06bd5cd241b7e603", + "hex": "0100000001c1eced6216de0889d4629ff64a8af8e8ec6d0b414de0c57b46c02cc303d321fe0000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "01000000000101c1eced6216de0889d4629ff64a8af8e8ec6d0b414de0c57b46c02cc303d321fe0000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac0300483045022100d4c0cbdb45915b8a3162362fa5f74556de919aeda5337fc44a7fb000e833460d022017742c37d7a061e2ae3a086c7c585c9c85e5d31af468d3e00045c0f35b8f8eb601255121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51ae00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "c1eced6216de0889d4629ff64a8af8e8ec6d0b414de0c57b46c02cc303d321fe", + "index": 0, + "script": "", + "witness": [ + "", + "3045022100d4c0cbdb45915b8a3162362fa5f74556de919aeda5337fc44a7fb000e833460d022017742c37d7a061e2ae3a086c7c585c9c85e5d31af468d3e00045c0f35b8f8eb601", + "5121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51ae" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 114, + "weight": 455 + }, + { + "description": "P2SH P2WSH Multisig", + "id": "e77fd9ea35346e295e1e15de9724fff42b5c127da4c5447a4ffddd361f66b1c1", + "hash": "c1b1661f36ddfd4f7a44c5a47d125c2bf4ff2497de151e5e296e3435ead97fe7", + "hex": "01000000013a5a2ab0223d3b504b52af76d650329750666fbf1be13d4cb08d0d9fc550a47d00000000232200201b8c0c2878c5634c3ce738cdc568c592e99783dbd28ff4c6cb5b7b4675d9ee99ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "010000000001013a5a2ab0223d3b504b52af76d650329750666fbf1be13d4cb08d0d9fc550a47d00000000232200201b8c0c2878c5634c3ce738cdc568c592e99783dbd28ff4c6cb5b7b4675d9ee99ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac0300483045022100c97a5e205ce0023d3d44f846abf1f0e21b6f2646bd2496bbe92e4333fe4401be02201247e047d669f713582713e35d2eba430abc3d75a924bb500362bf47d6234ed501255121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51ae00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "3a5a2ab0223d3b504b52af76d650329750666fbf1be13d4cb08d0d9fc550a47d", + "index": 0, + "script": "00201b8c0c2878c5634c3ce738cdc568c592e99783dbd28ff4c6cb5b7b4675d9ee99", + "witness": [ + "", + "3045022100c97a5e205ce0023d3d44f846abf1f0e21b6f2646bd2496bbe92e4333fe4401be02201247e047d669f713582713e35d2eba430abc3d75a924bb500362bf47d6234ed501", + "5121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51ae" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "scriptHex": "76a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 149, + "weight": 595 + }, + { + "description": "P2WKH", + "id": "10bbdf7e9301bc21f1da8684f25fd66bc1314904c30da25a8ebf967c58c89269", + "hash": "6992c8587c96bf8e5aa20dc3044931c16bd65ff28486daf121bc01937edfbb10", + "hex": "010000000133defbe3e28860007ff3e21222774c220cb35d554fa3e3796d25bf8ee983e1080000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "0100000000010133defbe3e28860007ff3e21222774c220cb35d554fa3e3796d25bf8ee983e1080000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac0248304502210097c3006f0b390982eb47f762b2853773c6cedf83668a22d710f4c13c4fd6b15502205e26ef16a81fc818a37f3a34fc6d0700e61100ea6c6773907c9c046042c440340121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "33defbe3e28860007ff3e21222774c220cb35d554fa3e3796d25bf8ee983e108", + "index": 0, + "script": "", + "witness": [ + "304502210097c3006f0b390982eb47f762b2853773c6cedf83668a22d710f4c13c4fd6b15502205e26ef16a81fc818a37f3a34fc6d0700e61100ea6c6773907c9c046042c4403401", + "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 113, + "weight": 450 + }, + { + "description": "P2SH P2WKH", + "id": "a0dd6714722a577c5db08f740cd1525f5383f8771dd0ebecd9ae96eb6623408a", + "hash": "8a402366eb96aed9ecebd01d77f883535f52d10c748fb05d7c572a721467dda0", + "hex": "01000000015df9a0b9ade2d835881704e0f53b51a4b19ecfc794ea1f3555783dd7f68659ce0000000017160014851a33a5ef0d4279bd5854949174e2c65b1d4500ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "whex": "010000000001015df9a0b9ade2d835881704e0f53b51a4b19ecfc794ea1f3555783dd7f68659ce0000000017160014851a33a5ef0d4279bd5854949174e2c65b1d4500ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac02483045022100cb3929c128fec5108071b662e5af58e39ac8708882753a421455ca80462956f6022030c0f4738dd1a13fc7a34393002d25c6e8a6399f29c7db4b98f53a9475d94ca20121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b00000000", + "raw": { + "version": 1, + "ins": [ + { + "hash": "5df9a0b9ade2d835881704e0f53b51a4b19ecfc794ea1f3555783dd7f68659ce", + "index": 0, + "script": "0014851a33a5ef0d4279bd5854949174e2c65b1d4500", + "witness": [ + "3045022100cb3929c128fec5108071b662e5af58e39ac8708882753a421455ca80462956f6022030c0f4738dd1a13fc7a34393002d25c6e8a6399f29c7db4b98f53a9475d94ca201", + "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b" + ] + } + ], + "outs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + "coinbase": false, + "virtualSize": 136, + "weight": 542 + }, + { + "description": "Coinbase transaction w/ witness", + "id": "c881f7b084a367b0603abbcb9c5c639318e6166770e3f9b27a1ee3f8b6a16517", + "hash": "1765a1b6f8e31e7ab2f9e3706716e61893635c9ccbbb3a60b067a384b0f781c8", + "hex": "02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff05022b020101ffffffff02c0cf402500000000232103c6c5964853fd00fb3271ac002831c66825102d223c706ce0ee99e73db3be4aa1ac0000000000000000266a24aa21a9edff828eb21f40ab251d9f107792670aba9299028b894a364fda570f6a089dcfe900000000", + "whex": "020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff05022b020101ffffffff02c0cf402500000000232103c6c5964853fd00fb3271ac002831c66825102d223c706ce0ee99e73db3be4aa1ac0000000000000000266a24aa21a9edff828eb21f40ab251d9f107792670aba9299028b894a364fda570f6a089dcfe90120000000000000000000000000000000000000000000000000000000000000000000000000", + "raw": { + "version": 2, + "ins": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 4294967295, + "data": "022b020101", + "sequence": 4294967295, + "witness": [ + "0000000000000000000000000000000000000000000000000000000000000000" + ] + } + ], + "outs": [ + { + "script": "03c6c5964853fd00fb3271ac002831c66825102d223c706ce0ee99e73db3be4aa1 OP_CHECKSIG", + "value": 625004480 + }, + { + "script": "OP_RETURN aa21a9edff828eb21f40ab251d9f107792670aba9299028b894a364fda570f6a089dcfe9", + "value": 0 + } + ], + "locktime": 0 + }, + "coinbase": true, + "virtualSize": 156, + "weight": 624 + } + ], + "hashForSignature": [ + { + "description": "Out of range inIndex", + "txHex": "010000000200000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000000000000000", + "inIndex": 2, + "script": "OP_0", + "type": 0, + "hash": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "description": "inIndex > nOutputs (SIGHASH_SINGLE)", + "txHex": "010000000200000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000000000000000", + "inIndex": 2, + "script": "OP_0", + "type": 3, + "hash": "0000000000000000000000000000000000000000000000000000000000000001" + }, + { + "txHex": "010000000200000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000000000000000", + "inIndex": 0, + "script": "OP_0 OP_3", + "type": 0, + "hash": "3d56a632462b9fc9b89eeddcad7dbe476297f34aff7e5f9320e2a99fb5e97136" + }, + { + "txHex": "010000000200000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000000000000000", + "inIndex": 0, + "script": "OP_0 OP_CODESEPARATOR OP_3", + "type": 0, + "hash": "3d56a632462b9fc9b89eeddcad7dbe476297f34aff7e5f9320e2a99fb5e97136" + }, + { + "txHex": "010000000200000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000000000000000", + "inIndex": 0, + "script": "OP_0 OP_CODESEPARATOR OP_4", + "type": 0, + "hash": "fa075877cb54916236806a6562e4a8cdad48adf1268e73d72d1f9fdd867df463" + } + ], + "hashForWitnessV0": [ + { + "description": "Native P2WPKH with SIGHASH_ALL", + "txHex": "0100000002fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f0000000000eeffffffef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a0100000000ffffffff02202cb206000000001976a9148280b37df378db99f66f85c95a783a76ac7a6d5988ac9093510d000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac11000000", + "inIndex": 1, + "script": "OP_DUP OP_HASH160 1d0f172a0ecb48aee1be1f2687d2963ae33f71a1 OP_EQUALVERIFY OP_CHECKSIG", + "type": 1, + "hash": "c37af31116d1b27caf68aae9e3ac82f1477929014d5b917657d0eb49478cb670", + "value": 600000000 + }, + { + "description": "P2WPKH with SIGHASH_ALL", + "txHex": "0100000001db6b1b20aa0fd7b23880be2ecbd4a98130974cf4748fb66092ac4d3ceb1a54770100000000feffffff02b8b4eb0b000000001976a914a457b684d7f0d539a46a45bbc043f35b59d0d96388ac0008af2f000000001976a914fd270b1ee6abcaea97fea7ad0402e8bd8ad6d77c88ac92040000", + "inIndex": 0, + "script": "OP_DUP OP_HASH160 79091972186c449eb1ded22b78e40d009bdf0089 OP_EQUALVERIFY OP_CHECKSIG", + "type": 1, + "hash": "64f3b0f4dd2bb3aa1ce8566d220cc74dda9df97d8490cc81d89d735c92e59fb6", + "value": 1000000000 + }, + { + "description": "P2WSH with SIGHASH_ALL", + "txHex": "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000000ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "inIndex": 0, + "script": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "type": 1, + "hash": "185c0be5263dce5b4bb50a047973c1b6272bfbd0103a89444597dc40b248ee7c", + "value": 987654321 + }, + { + "description": "P2WSH with SIGHASH_NONE", + "txHex": "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000000ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "inIndex": 0, + "script": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "type": 2, + "hash": "e9733bc60ea13c95c6527066bb975a2ff29a925e80aa14c213f686cbae5d2f36", + "value": 987654321 + }, + { + "description": "P2WSH with SIGHASH_SINGLE", + "txHex": "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000000ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "inIndex": 0, + "script": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "type": 3, + "hash": "1e1f1c303dc025bd664acb72e583e933fae4cff9148bf78c157d1e8f78530aea", + "value": 987654321 + }, + { + "description": "P2WSH with SIGHASH_ALL | SIGHASH_ANYONECANPAY", + "txHex": "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000000ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "inIndex": 0, + "script": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "type": 129, + "hash": "2a67f03e63a6a422125878b40b82da593be8d4efaafe88ee528af6e5a9955c6e", + "value": 987654321 + }, + { + "description": "P2WSH with SIGHASH_NONE | SIGHASH_ANYONECANPAY", + "txHex": "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000000ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "inIndex": 0, + "script": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "type": 130, + "hash": "781ba15f3779d5542ce8ecb5c18716733a5ee42a6f51488ec96154934e2c890a", + "value": 987654321 + }, + { + "description": "P2WSH with SIGHASH_SINGLE | SIGHASH_ANYONECANPAY", + "txHex": "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000000ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "inIndex": 0, + "script": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "type": 131, + "hash": "511e8e52ed574121fc1b654970395502128263f62662e076dc6baf05c2e6a99b", + "value": 987654321 + } + ], + "invalid": { + "addInput": [ + { + "exception": "Expected property \"0\" of type Buffer\\(Length: 32\\), got Buffer\\(Length: 30\\)", + "hash": "0aed1366a73b6057ee7800d737bff1bdf8c448e98d86bc0998f2b009816d", + "index": 0 + }, + { + "exception": "Expected property \"0\" of type Buffer\\(Length: 32\\), got Buffer\\(Length: 34\\)", + "hash": "0aed1366a73b6057ee7800d737bff1bdf8c448e98d86bc0998f2b009816da9b0ffff", + "index": 0 + } + ], + "fromBuffer": [ + { + "exception": "Transaction has unexpected data", + "hex": "0100000002f1fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe000000006b483045022100e661badd8d2cf1af27eb3b82e61b5d3f5d5512084591796ae31487f5b82df948022006df3c2a2cac79f68e4b179f4bbb8185a0bb3c4a2486d4405c59b2ba07a74c2101210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798fffffffff2fefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefe0100000083483045022100be54a46a44fb7e6bf4ebf348061d0dace7ddcbb92d4147ce181cf4789c7061f0022068ccab2a89a47fc29bb5074bca99ae846ab446eecf3c3aaeb238a13838783c78012102c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee517a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc7687ffffffff0250c30000000000001976a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88acf04902000000000017a9147ccb85f0ab2d599bc17246c98babd5a20b1cdc768700000000ffffffff" + }, + { + "exception": "Transaction has superfluous witness data", + "hex": "0100000000010113ae35a2063ba413c3a1bb9b3820c76291e40e83bd3f23c8ff83333f0c64d623000000004a00483045022100e332e8367d5fee22c205ce1bf4e01e39f1a8decb3ba20d1336770cf38b8ee72d022076b5f83b3ee15390133b7ebf526ec189eb73cc6ee0a726f70b939bc51fa18d8001ffffffff0180969800000000001976a914b1ae3ceac136e4bdb733663e7a1e2f0961198a1788ac0000000000" + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/fixtures/transaction_builder.json b/web/bitcoincashjs-lib/test/fixtures/transaction_builder.json new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/fixtures/transaction_builder.json @@ -0,0 +1,2144 @@ +{ + "valid": { + "build": [ + { + "description": "Transaction w/ pubKeyHash -> pubKeyHash", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006b483045022100a3b254e1c10b5d039f36c05f323995d6e5a367d98dd78a13d5bbc3991b35720e022022fccea3897d594de0689601fbd486588d5bfa6915be2386db0397ee9a6e80b601210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ pubKey -> pubKeyHash", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000494830450221009833abb3ab49d7004c06bcc79eafd6905ada3eee91f3376ad388548034acd9a702202e84dda6ef2678c82256afcfc459aaa68e179b2bb0e6b2dc3f1410e132c5e6c301ffffffff0100f90295000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 OP_CHECKSIG", + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 2500000000 + } + ] + }, + { + "description": "Transaction w/ scriptHash(pubKeyHash) -> pubKeyHash", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000085483045022100a3b254e1c10b5d039f36c05f323995d6e5a367d98dd78a13d5bbc3991b35720e022022fccea3897d594de0689601fbd486588d5bfa6915be2386db0397ee9a6e80b601210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817981976a914751e76e8199196d454941c45d1b3a323f1433bd688acffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "redeemScript": "OP_DUP OP_HASH160 751e76e8199196d454941c45d1b3a323f1433bd6 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ scriptHash(multisig 2-of-2) -> pubKeyHash", + "network": "testnet", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000fd1b0100483045022100b7a9bab60c4307349de9571ce0bd26ebb9d68d4e9ab3f9173e1f736f1390a04a022020931ff70e87033cdd94bdf434e865993b2258065c5c222a53f29d077bcfa4480147304402206d79ad83f1ab12fc9feee9e66412de842fcbf8de0632beb4433d469f24f0fb4e022079e6df186582f2686a3292bde8e50dac36cb9bec3991995fe331e1daef7df8a4014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52aeffffffff0110270000000000001976a914faf1d99bf040ea9c7f8cc9f14ac6733ad75ce24688ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG" + }, + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 faf1d99bf040ea9c7f8cc9f14ac6733ad75ce246 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ multisig 2-of-2 -> pubKeyHash", + "network": "testnet", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009200483045022100b7a9bab60c4307349de9571ce0bd26ebb9d68d4e9ab3f9173e1f736f1390a04a022020931ff70e87033cdd94bdf434e865993b2258065c5c222a53f29d077bcfa4480147304402206d79ad83f1ab12fc9feee9e66412de842fcbf8de0632beb4433d469f24f0fb4e022079e6df186582f2686a3292bde8e50dac36cb9bec3991995fe331e1daef7df8a401ffffffff0110270000000000001976a914faf1d99bf040ea9c7f8cc9f14ac6733ad75ce24688ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "signs": [ + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx" + }, + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 faf1d99bf040ea9c7f8cc9f14ac6733ad75ce246 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ multisig 2-of-3 -> pubKeyHash", + "network": "testnet", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000910047304402206b2fc7d3182e2853cab5bcffb85c3ef5470d2d05c496295538c9947af3bfd0ec0220300aa705a985c74f76c26c6d68da9b61b5c4cd5432e8c6a54623f376c8bf8cde01473044022031059c4dd6a97d84e3a4eb1ca21a9870bd1762fbd5db7c1932d75e56da78794502200f22d85be3c5f7035e89a147ee2619a066df19aff14a62e6bb3f649b6da19edf01ffffffff0110270000000000001976a914faf1d99bf040ea9c7f8cc9f14ac6733ad75ce24688ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG", + "signs": [ + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx" + }, + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 faf1d99bf040ea9c7f8cc9f14ac6733ad75ce246 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ multisig 2-of-2 (reverse order) -> pubKeyHash", + "network": "testnet", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009200483045022100b7a9bab60c4307349de9571ce0bd26ebb9d68d4e9ab3f9173e1f736f1390a04a022020931ff70e87033cdd94bdf434e865993b2258065c5c222a53f29d077bcfa4480147304402206d79ad83f1ab12fc9feee9e66412de842fcbf8de0632beb4433d469f24f0fb4e022079e6df186582f2686a3292bde8e50dac36cb9bec3991995fe331e1daef7df8a401ffffffff0110270000000000001976a914faf1d99bf040ea9c7f8cc9f14ac6733ad75ce24688ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "signs": [ + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT" + }, + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 faf1d99bf040ea9c7f8cc9f14ac6733ad75ce246 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ scriptHash(multisig 2-of-3)", + "network": "testnet", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000fd5e0100483045022100eec19e061cad41610f9b42d2b06638b6b0fec3da0de9c6858e7f8c06053979900220622936dd47e202b2ad17639cda680e52334d407149252959936bb1f38e4acc52014830450221009aac215157a74a18234fd06be27448dccee809986bbf93be457a9262f0c69a9402203ff41d7c757f0e8951e4471f205087ecff499f986400ab18210eaad9a628e33c014cc952410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG" + }, + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Transaction w/ scriptHash(multisig 2-of-3), different hash types", + "network": "testnet", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000fd5e0100483045022100eec19e061cad41610f9b42d2b06638b6b0fec3da0de9c6858e7f8c06053979900220622936dd47e202b2ad17639cda680e52334d407149252959936bb1f38e4acc5201483045022100d404fb6de6cf42efb9d7948d2e8fb6618f8eba55ecd25907d18d576d9aa6f39d02205ec2e7fa7c5f8a9793732ca9d2f9aba3b2bb04ca6d467ba36940e0f695e48de5024cc952410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG", + "hashType": 1 + }, + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe", + "hashType": 2 + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Transaction w/ scriptHash(pubKey) -> pubKeyHash", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006c47304402201115644b134932c8a7a8e925769d130a801288d477130e2bf6fadda20b33754d02202ecefbf63844d7cb2d5868539c39f973fe019f72e5c31a707836c0d61ef317db012321033e29aea1168a835d5e386c292082db7b7807172a10ec634ad34226f36d79e70facffffffff0100f90295000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "OP_HASH160 e89677d91455e541630d62c63718bef738b478b1 OP_EQUAL", + "signs": [ + { + "keyPair": "KxLDMPtVM7sLSu2v5n1LybDibw6P9FFbL4pUwJ51UDm7rp5AmXWW", + "redeemScript": "033e29aea1168a835d5e386c292082db7b7807172a10ec634ad34226f36d79e70f OP_CHECKSIG" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 2500000000 + } + ] + }, + { + "description": "Transaction w/ non-zero vin inputs", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000006a47304402205c80bbb5125b35d5e5a8324b1336832d29a6fc004859c8a9ff6bef47ba7fc348022018612216e57a521b2c4543f1f4fd738a76814c37c074e88adfe12464fff31cf901210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ non-default input sequence numbers, version and locktime", + "txHex": "0400000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020000006a47304402200e7c0330f39c04e3c1b9e3daf71d106c7129c095f6ebb494d06f0ef8013b74ea022003fc0fe05e71a2a4f8434feb0632cdb6883676d0ccb9b19d7a8a9e5fc02a616401210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b9c220000110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac09990400", + "version": 4, + "locktime": 301321, + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 2, + "sequence": 2147001, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ nLockTime, pubKeyHash -> pubKeyHash", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006b483045022100e31ef1bcc6f060cb6a53675a11606b9180f4f8b1ec823113fb4c0bf1c5b99b8e02204234690c19cd89e544002d26dbcbd49bf9d1b4cfc5a617fd8ab2607acfd869b001210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588acffff0000", + "locktime": 65535, + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ 1 pubKeyHash transaction input (Issue #644)", + "network": "testnet", + "txHex": "010000000132595835c74fccf097db4ccae9dc2de621e58e0d3f697a27b469b61c7a223b39000000006a47304402202fd41f18f1d7915bc811610236e1d708f9cd3515734abd5db7ac607f030728af02206bee7d163f04c470ce55561523824eb8b3abce80c214aabf7dfb78a073ea4a70012103f29374a4c2c218a4077db9ba0b9d674cde3719560460af4eb3190d512dd5de92ffffffff01808d5b00000000001976a914ff99e06c1a4ac394b4e1cb3d3a4b2b47749e339a88ac00000000", + "inputs": [ + { + "txHex": "0100000001f7e6430096cd2790bac115aaab22c0a50fb0a1794305302e1a399e81d8d354f4020000006a47304402205793a862d193264afc32713e2e14541e1ff9ebb647dd7e7e6a0051d0faa87de302205216653741ecbbed573ea2fc053209dd6980616701c27be5b958a159fc97f45a012103e877e7deb32d19250dcfe534ea82c99ad739800295cd5429a7f69e2896c36fcdfeffffff0340420f00000000001976a9145c7b8d623fba952d2387703d051d8e931a6aa0a188ac8bda2702000000001976a9145a0ef60784137d03e7868d063b05424f2f43799f88ac40420f00000000001976a9145c7b8d623fba952d2387703d051d8e931a6aa0a188ac2fcc0e00", + "vout": 0, + "signs": [ + { + "keyPair": "cQ6483mDWwoG8o4tn6nU9Jg52RKMjPUWXSY1vycAyPRXQJ1Pn2Rq" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 ff99e06c1a4ac394b4e1cb3d3a4b2b47749e339a OP_EQUALVERIFY OP_CHECKSIG", + "value": 6000000 + } + ] + }, + { + "description": "Transaction w/ pubKeyHash -> P2WPKH", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006b4830450221009a524a3257b8bd0c77ba4cba65fc00954f2030243f2eb16571838a3b951c8c07022008f5af9de672b365fd257377db1cf6da4da1b49b9637ceb651ac0eb4181dc3ca01210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff011027000000000000160014aa4d7985c57e011a8b3dd8e0e5a73aaef41629c500000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + } + ], + "outputs": [ + { + "script": "OP_0 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ pubKeyHash -> P2WSH", + "txHex": "0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006a473044022056c99ba23eb15b3e666b188f87b04d5ef23eeda5298939cdaec35a3bddf3835602205887a5a460f299819b0c93948fafab8b2d64d8c051934431e3bb9acebef5d1b001210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff01102700000000000022002032447752937d355ca2defddcd1f6b4fc53d182f8901cebbcff42f5e381bf0b8000000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + } + ], + "outputs": [ + { + "script": "OP_0 32447752937d355ca2defddcd1f6b4fc53d182f8901cebbcff42f5e381bf0b80", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ P2WPKH -> P2WPKH", + "txHex": "01000000000101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff011027000000000000160014aa4d7985c57e011a8b3dd8e0e5a73aaef41629c502483045022100a8fc5e4c6d7073474eff2af5d756966e75be0cdfbba299518526080ce8b584be02200f26d41082764df89e3c815b8eaf51034a3b68a25f1be51208f54222c1bb6c1601210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179800000000", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "OP_0 751e76e8199196d454941c45d1b3a323f1433bd6", + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "value": 10000 + } + ] + } + ], + "outputs": [ + { + "script": "OP_0 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5", + "value": 10000 + } + ] + }, + { + "description": "Transaction w/ P2WSH|P2PK -> P2PKH", + "txHex": "010000000001014533a3bc1e039bd787656068e135aaee10aee95a64776bfc047ee6a7c1ebdd2f0000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac02473044022039725bb7291a14dd182dafdeaf3ea0d5c05c34f4617ccbaa46522ca913995c4e02203b170d072ed2e489e7424ad96d8fa888deb530be2d4c5d9aaddf111a7efdb2d3012321038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac00000000", + "inputs": [ + { + "txId": "2fddebc1a7e67e04fc6b77645ae9ae10eeaa35e168606587d79b031ebca33345", + "vout": 0, + "prevTxScript": "OP_0 0f9ea7bae7166c980169059e39443ed13324495b0d6678ce716262e879591210", + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "witnessScript": "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_CHECKSIG", + "value": 80000 + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "value": 60000 + } + ] + }, + + { + "description": "Sighash: SINGLE (random)", + "txHex": "01000000012ffb29d53528ad30c37c267fbbeda3c6fce08f5f6f5d3b1eab22193599a3612a010000006b483045022100f963f1d9564075a934d7c3cfa333bd1378859b84cba947e149926fc9ec89b5ae02202b5b912e507bae65002aff972f9752e2aeb2e22c5fdbaaad672090378184df37032102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff0260a62f01000000001976a9140de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b888ac80969800000000001976a91454d0e925d5ee0ee26768a237067dee793d01a70688ac00000000", + "inputs": [ + { + "txId": "2a61a399351922ab1e3b5d6f5f8fe0fcc6a3edbb7f267cc330ad2835d529fb2f", + "vout": 1, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 3, + "value": 30000000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 19900000, + "script": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 10000000, + "script": "OP_DUP OP_HASH160 54d0e925d5ee0ee26768a237067dee793d01a706 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + { + "description": "Sighash: ALL", + "txHex": "01000000037db7f0b2a345ded6ddf28da3211a7d7a95a2943e9a879493d6481b7d69613f04010000006a47304402206abb0622b8b6ca83f1f4de84830cf38bf4615dc9e47a7dcdcc489905f26aa9cb02201d2d8a7815242b88e4cd66390ca46da802238f9b1395e0d118213d30dad38184012102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff652c491e5a781a6a3c547fa8d980741acbe4623ae52907278f10e1f064f67e05000000006b483045022100de13b42804f87a09bb46def12ab4608108d8c2db41db4bc09064f9c46fcf493102205e5c759ab7b2895c9b0447e56029f6895ff7bb20e0847c564a88a3cfcf080c4f012102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffffb9fa270fa3e4dd8c79f9cbfe5f1953cba071ed081f7c277a49c33466c695db35000000006b4830450221009100a3f5b30182d1cb0172792af6947b6d8d42badb0539f2c209aece5a0628f002200ae91702ca63347e344c85fcb536f30ee97b75cdf4900de534ed5e040e71a548012102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff03204e0000000000001976a9149ed1f577c60e4be1dbf35318ec12f51d25e8577388ac30750000000000001976a914fb407e88c48921d5547d899e18a7c0a36919f54d88ac50c30000000000001976a91404ccb4eed8cfa9f6e394e945178960f5ccddb38788ac00000000", + "inputs": [ + { + "txId": "043f61697d1b48d69394879a3e94a2957a7d1a21a38df2ddd6de45a3b2f0b77d", + "vout": 1, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 1, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "057ef664f0e1108f270729e53a62e4cb1a7480d9a87f543c6a1a785a1e492c65", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 1, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "35db95c66634c3497a277c1f08ed71a0cb53195ffecbf9798cdde4a30f27fab9", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 1, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 20000, + "script": "OP_DUP OP_HASH160 9ed1f577c60e4be1dbf35318ec12f51d25e85773 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 30000, + "script": "OP_DUP OP_HASH160 fb407e88c48921d5547d899e18a7c0a36919f54d OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 50000, + "script": "OP_DUP OP_HASH160 04ccb4eed8cfa9f6e394e945178960f5ccddb387 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + { + "description": "Sighash: ALL | ANYONECANPAY", + "txHex": "01000000037db7f0b2a345ded6ddf28da3211a7d7a95a2943e9a879493d6481b7d69613f04010000006b483045022100bd2829550e9b3a081747281029b5f5a96bbd83bb6a92fa2f8310f1bd0d53abc90220071b469417c55cdb3b04171fd7900d2768981b7ab011553d84d24ea85d277079812102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff652c491e5a781a6a3c547fa8d980741acbe4623ae52907278f10e1f064f67e05000000006a47304402206295e17c45c6356ffb20365b696bcbb869db7e8697f4b8a684098ee2bff85feb02202905c441abe39ec9c480749236b84fdd3ebd91ecd25b559136370aacfcf2815c812102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffffb9fa270fa3e4dd8c79f9cbfe5f1953cba071ed081f7c277a49c33466c695db35000000006b483045022100f58e7c98ac8412944d575bcdece0e5966d4018f05988b5b60b6f46b8cb7a543102201c5854d3361e29b58123f34218cec2c722f5ec7a08235ebd007ec637b07c193a812102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff03204e0000000000001976a9149ed1f577c60e4be1dbf35318ec12f51d25e8577388ac30750000000000001976a914fb407e88c48921d5547d899e18a7c0a36919f54d88ac50c30000000000001976a91404ccb4eed8cfa9f6e394e945178960f5ccddb38788ac00000000", + "inputs": [ + { + "txId": "043f61697d1b48d69394879a3e94a2957a7d1a21a38df2ddd6de45a3b2f0b77d", + "vout": 1, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 129, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "057ef664f0e1108f270729e53a62e4cb1a7480d9a87f543c6a1a785a1e492c65", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 129, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "35db95c66634c3497a277c1f08ed71a0cb53195ffecbf9798cdde4a30f27fab9", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 129, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 20000, + "script": "OP_DUP OP_HASH160 9ed1f577c60e4be1dbf35318ec12f51d25e85773 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 30000, + "script": "OP_DUP OP_HASH160 fb407e88c48921d5547d899e18a7c0a36919f54d OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 50000, + "script": "OP_DUP OP_HASH160 04ccb4eed8cfa9f6e394e945178960f5ccddb387 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + { + "description": "Sighash: SINGLE", + "txHex": "01000000037db7f0b2a345ded6ddf28da3211a7d7a95a2943e9a879493d6481b7d69613f04010000006b483045022100e822f152bb15a1d623b91913cd0fb915e9f85a8dc6c26d51948208bbc0218e800220255f78549d9614c88eac9551429bc00224f22cdcb41a3af70d52138f7e98d333032102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff652c491e5a781a6a3c547fa8d980741acbe4623ae52907278f10e1f064f67e05000000006a47304402206f37f79adeb86e0e2da679f79ff5c3ba206c6d35cd9a21433f0de34ee83ddbc00220118cabbac5d83b3aa4c2dc01b061e4b2fe83750d85a72ae6a1752300ee5d9aff032102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffffb9fa270fa3e4dd8c79f9cbfe5f1953cba071ed081f7c277a49c33466c695db35000000006a473044022042ac843d220a56b3de05f24c85a63e71efa7e5fc7c2ec766a2ffae82a88572b0022051a816b317313ea8d90010a77c3e02d41da4a500e67e6a5347674f836f528d82032102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff03204e0000000000001976a9149ed1f577c60e4be1dbf35318ec12f51d25e8577388ac30750000000000001976a914fb407e88c48921d5547d899e18a7c0a36919f54d88ac50c30000000000001976a91404ccb4eed8cfa9f6e394e945178960f5ccddb38788ac00000000", + "inputs": [ + { + "txId": "043f61697d1b48d69394879a3e94a2957a7d1a21a38df2ddd6de45a3b2f0b77d", + "vout": 1, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 3, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "057ef664f0e1108f270729e53a62e4cb1a7480d9a87f543c6a1a785a1e492c65", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 3, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "35db95c66634c3497a277c1f08ed71a0cb53195ffecbf9798cdde4a30f27fab9", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 3, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 20000, + "script": "OP_DUP OP_HASH160 9ed1f577c60e4be1dbf35318ec12f51d25e85773 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 30000, + "script": "OP_DUP OP_HASH160 fb407e88c48921d5547d899e18a7c0a36919f54d OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 50000, + "script": "OP_DUP OP_HASH160 04ccb4eed8cfa9f6e394e945178960f5ccddb387 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + { + "description": "Sighash: SINGLE|ANYONECANPAY", + "txHex": "01000000037db7f0b2a345ded6ddf28da3211a7d7a95a2943e9a879493d6481b7d69613f04010000006b483045022100d05a3b6cf2f0301000b0e45c09054f2c61570ce8798ebf571eef72da3b1c94a1022016d7ef3c133fa703bae2c75158ea08d335ac698506f99b3c369c37a9e8fc4beb832102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff652c491e5a781a6a3c547fa8d980741acbe4623ae52907278f10e1f064f67e05000000006b483045022100ee6bf07b051001dcbfa062692a40adddd070303286b714825b3fb4693dd8fcdb022056610885e5053e5d47f2be3433051305abe7978ead8f7cf2d0368947aff6b307832102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffffb9fa270fa3e4dd8c79f9cbfe5f1953cba071ed081f7c277a49c33466c695db35000000006b483045022100cfc930d5b5272d0220d9da98fabec97b9e66306f735efa837f43f6adc675cad902202f9dff76b8b9ec8f613d46094f17f64d875804292d8804aa59fd295b6fc1416b832102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff03204e0000000000001976a9149ed1f577c60e4be1dbf35318ec12f51d25e8577388ac30750000000000001976a914fb407e88c48921d5547d899e18a7c0a36919f54d88ac50c30000000000001976a91404ccb4eed8cfa9f6e394e945178960f5ccddb38788ac00000000", + "inputs": [ + { + "txId": "043f61697d1b48d69394879a3e94a2957a7d1a21a38df2ddd6de45a3b2f0b77d", + "vout": 1, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 131, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "057ef664f0e1108f270729e53a62e4cb1a7480d9a87f543c6a1a785a1e492c65", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 131, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "35db95c66634c3497a277c1f08ed71a0cb53195ffecbf9798cdde4a30f27fab9", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 131, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 20000, + "script": "OP_DUP OP_HASH160 9ed1f577c60e4be1dbf35318ec12f51d25e85773 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 30000, + "script": "OP_DUP OP_HASH160 fb407e88c48921d5547d899e18a7c0a36919f54d OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 50000, + "script": "OP_DUP OP_HASH160 04ccb4eed8cfa9f6e394e945178960f5ccddb387 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + { + "description": "Sighash: NONE", + "txHex": "01000000037db7f0b2a345ded6ddf28da3211a7d7a95a2943e9a879493d6481b7d69613f04010000006b483045022100e7f0a1ddd2c0b81e093e029b8a503afa27fe43549b0668d2141abf35eb3a63be022037f12d12cd50fc94a135f933406a8937557de9b9566a8841ff1548c1b6984531022102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff652c491e5a781a6a3c547fa8d980741acbe4623ae52907278f10e1f064f67e05000000006a473044022008451123ec2535dab545ade9d697519e63b28df5e311ea05e0ce28d39877a7c8022061ce5dbfb7ab478dd9e05b0acfd959ac3eb2641f61958f5d352f37621073d7c0022102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffffb9fa270fa3e4dd8c79f9cbfe5f1953cba071ed081f7c277a49c33466c695db35000000006a47304402205c001bcdfb35c70d8aa3bdbc75399afb72eb7cf1926ca7c1dfcddcb4d4d3e0f8022028992fffdcd4e9f34ab726f97c24157917641c2ef99361f588e3d4147d46eea5022102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff03204e0000000000001976a9149ed1f577c60e4be1dbf35318ec12f51d25e8577388ac30750000000000001976a914fb407e88c48921d5547d899e18a7c0a36919f54d88ac50c30000000000001976a91404ccb4eed8cfa9f6e394e945178960f5ccddb38788ac00000000", + "inputs": [ + { + "txId": "043f61697d1b48d69394879a3e94a2957a7d1a21a38df2ddd6de45a3b2f0b77d", + "vout": 1, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 2, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "057ef664f0e1108f270729e53a62e4cb1a7480d9a87f543c6a1a785a1e492c65", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 2, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "35db95c66634c3497a277c1f08ed71a0cb53195ffecbf9798cdde4a30f27fab9", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 2, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 20000, + "script": "OP_DUP OP_HASH160 9ed1f577c60e4be1dbf35318ec12f51d25e85773 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 30000, + "script": "OP_DUP OP_HASH160 fb407e88c48921d5547d899e18a7c0a36919f54d OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 50000, + "script": "OP_DUP OP_HASH160 04ccb4eed8cfa9f6e394e945178960f5ccddb387 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + { + "description": "Sighash: NONE | ANYONECANPAY", + "txHex": "01000000037db7f0b2a345ded6ddf28da3211a7d7a95a2943e9a879493d6481b7d69613f04010000006a47304402204ed272952177aaa5a1b171c2ca5a7a3d300ffcd7e04b040c0baaa4e3561862a502207e65a5b8f99c8a632b186c8a60496a12bf3116f51909b7497413aefdc3be7bf6822102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff652c491e5a781a6a3c547fa8d980741acbe4623ae52907278f10e1f064f67e05000000006a47304402203ec365300cc67602f4cc5be027959d3667b48db34c6c87d267c94a7e210d5c1f02204843350311c0a9711cad1960b17ce9e323a1ce6f37deefc3ffe63082d480be92822102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffffb9fa270fa3e4dd8c79f9cbfe5f1953cba071ed081f7c277a49c33466c695db35000000006b48304502210084f86f905c36372eff9c54ccd509a519a3325bcace8abfeed7ed3f0d579979e902201ff330dd2402e5ca9989a8a294fa36d6cf3a093edb18d29c9d9644186a3efeb4822102f1c7eac9200f8dee7e34e59318ff2076c8b3e3ac7f43121e57569a1aec1803d4ffffffff03204e0000000000001976a9149ed1f577c60e4be1dbf35318ec12f51d25e8577388ac30750000000000001976a914fb407e88c48921d5547d899e18a7c0a36919f54d88ac50c30000000000001976a91404ccb4eed8cfa9f6e394e945178960f5ccddb38788ac00000000", + "inputs": [ + { + "txId": "043f61697d1b48d69394879a3e94a2957a7d1a21a38df2ddd6de45a3b2f0b77d", + "vout": 1, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 130, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "057ef664f0e1108f270729e53a62e4cb1a7480d9a87f543c6a1a785a1e492c65", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 130, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "txId": "35db95c66634c3497a277c1f08ed71a0cb53195ffecbf9798cdde4a30f27fab9", + "vout": 0, + "signs": [ + { + "keyPair": "KzRGFiqhXB7SyX6idHQkt77B8mX7adnujdg3VG47jdVK2x4wbUYg", + "hashType": 130, + "value": 40000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 0de1f9b92d2ab6d8ead83f9a0ff5cf518dcb03b8 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 20000, + "script": "OP_DUP OP_HASH160 9ed1f577c60e4be1dbf35318ec12f51d25e85773 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 30000, + "script": "OP_DUP OP_HASH160 fb407e88c48921d5547d899e18a7c0a36919f54d OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 50000, + "script": "OP_DUP OP_HASH160 04ccb4eed8cfa9f6e394e945178960f5ccddb387 OP_EQUALVERIFY OP_CHECKSIG" + } + ] + }, + { + "description": "Sighash V1: ALL", + "txHex": "01000000000102fff7f7881a8099afa6940d42d1e7f6362bec38171ea3edf433541db4e4ad969f00000000484730440220691a19d365c8d75f921346c70271506bde136f13a4b566dd796902c262e2ec6d02202b00c4aa030eedf294552bdfc163936d2f4e91c59e7798c4471250cf07cb859501eeffffffef51e1b804cc89d182d279655c3aa89e815b1b309fe287d9b2b55d57b90ec68a0100000000ffffffff0230f45e13000000001976a9148280b37df378db99f66f85c95a783a76ac7a6d5988ac00e9a435000000001976a9143bde42dbee7e4dbe6a21b2d50ce2f0167faa815988ac0002483045022100fddd014889f18d489b5400bfa8cb0a32301a768d934b1a0e2b55398119f26cab02207676c64c16ffa7ffaaf8e16b3b74e916687eebdfdb36b9b7997e838384d464640121025476c2e83188368da1ff3e292e7acafcdb3566bb0ad253f62fc70f07aeee635711000000", + "inputs": [ + { + "txId": "9f96ade4b41d5433f4eda31e1738ec2b36f6e7d1420d94a6af99801a88f7f7ff", + "vout": 0, + "signs": [ + { + "keyPair": "L3Wh2WPg21MWqzMFYsVC7PeBXcq1ow32KRccRihnTUnAhJaZUvg1", + "hashType": 1, + "value": 625000000 + } + ], + "sequence": 4294967278, + "prevTxScript": "03c9f4836b9a4f77fc0d81f7bcb01b7f1b35916864b9476c241ce9fc198bd25432 OP_CHECKSIG" + }, + { + "txId": "8ac60eb9575db5b2d987e29f301b5b819ea83a5c6579d282d189cc04b8e151ef", + "vout": 1, + "signs": [ + { + "keyPair": "KzVTBhbMaKrAYagJ11VdTaBrb6yzLykLGyuMBkf9sCFPDxdT8shL", + "hashType": 1, + "value": 600000000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_0 1d0f172a0ecb48aee1be1f2687d2963ae33f71a1" + } + ], + "outputs": [ + { + "value": 324990000, + "script": "OP_DUP OP_HASH160 8280b37df378db99f66f85c95a783a76ac7a6d59 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 900000000, + "script": "OP_DUP OP_HASH160 3bde42dbee7e4dbe6a21b2d50ce2f0167faa8159 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 17 + }, + { + "description": "Sighash V1: ALL 2", + "txHex": "01000000000101db6b1b20aa0fd7b23880be2ecbd4a98130974cf4748fb66092ac4d3ceb1a5477010000001716001479091972186c449eb1ded22b78e40d009bdf0089feffffff02b8b4eb0b000000001976a914a457b684d7f0d539a46a45bbc043f35b59d0d96388ac0008af2f000000001976a914fd270b1ee6abcaea97fea7ad0402e8bd8ad6d77c88ac02473044022047ac8e878352d3ebbde1c94ce3a10d057c24175747116f8288e5d794d12d482f0220217f36a485cae903c713331d877c1f64677e3622ad4010726870540656fe9dcb012103ad1d8e89212f0b92c74d23bb710c00662ad1470198ac48c43f7d6f93a2a2687392040000", + "inputs": [ + { + "txId": "77541aeb3c4dac9260b68f74f44c973081a9d4cb2ebe8038b2d70faa201b6bdb", + "vout": 1, + "signs": [ + { + "keyPair": "L57KYn5isHFThD4cohjJgLTZA2vaxnMMKWngnzbttF159yH9dARf", + "hashType": 1, + "redeemScript": "OP_0 79091972186c449eb1ded22b78e40d009bdf0089", + "value": 1000000000 + } + ], + "sequence": 4294967294, + "prevTxScript": "OP_HASH160 4733f37cf4db86fbc2efed2500b4f4e49f312023 OP_EQUAL" + } + ], + "outputs": [ + { + "value": 199996600, + "script": "OP_DUP OP_HASH160 a457b684d7f0d539a46a45bbc043f35b59d0d963 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 800000000, + "script": "OP_DUP OP_HASH160 fd270b1ee6abcaea97fea7ad0402e8bd8ad6d77c OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 1170 + }, + { + "description": "Sighash V1: 6-of-6", + "txHex": "0100000000010136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e0100000023220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff02e6312761010000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688ac583e0f00000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac0800483045022100f902f491c4df15199e584790ae8c7202569a977accac0a09fa3f4f3b6ec3517602205961a951c4a12fa966da67b6fd75975b9de156b9895f8ab5f289ecaee12b9b3501473044022068c7946a43232757cbdf9176f009a928e1cd9a1a8c212f15c1e11ac9f2925d9002205b75f937ff2f9f3c1246e547e54f62e027f64eefa2695578cc6432cdabce271502483045022100bd5294e145d729e9593f49079b74e6e4b8aeba63440408595ce0949d5c6450a702207f9c9fb45907fe0180d3f4bee499006007bb90894b5f824a26dfa5d3afec543303483045022100febf9409d7f3c091ddc4d296a483aae7b3d2a91d38f6ea2a153f7ff085fe7766022078d11972c74cd78f816152463a5e1a5d986dfb94b55cf5f7242e4f6d5df000ff81483045022100a5263ea0553ba89221984bd7f0b13613db16e7a70c549a86de0cc0444141a407022005c360ef0ae5a5d4f9f2f87a56c1546cc8268cab08c73501d6b3be2e1e1a8a088247304402201a0e125aed6a700e45d6c86017d5a9d2264c8079319d868f3f163f5d63cb5bfe02200887608f2322ca0d82df67316275371028b0b21750417d594117963fe23b67ec83cf56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae00000000", + "inputs": [ + { + "txId": "6eb98797a21c6c10aa74edf29d618be109f48a8e94c694f3701e08ca69186436", + "vout": 1, + "signs": [ + { + "keyPair": "L15NqbRvcqso8ZCqD8aFaZV3CTypw6svjk8oCWsAfMmNViahS2Mw", + "hashType": 1, + "witnessScript": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "redeemScript": "OP_0 a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54", + "value": 987654321 + }, + { + "keyPair": "Kwpf3fycToLH1ymZUkezFrYwTjhKaucHD861Ft5A4Tih855LBxVx", + "hashType": 2, + "witnessScript": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "redeemScript": "OP_0 a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54", + "value": 987654321 + }, + { + "keyPair": "L1EV111k2WzNTapY2etd1TaB2aWbjUgouko9YyipS2S8H8WdGkQi", + "hashType": 3, + "witnessScript": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "redeemScript": "OP_0 a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54", + "value": 987654321 + }, + { + "keyPair": "KwuvEmpBtJaw8SQLnpi3CoEHZJvv33EnYBHn13VcDuwprJqmkfSH", + "hashType": 129, + "witnessScript": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "redeemScript": "OP_0 a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54", + "value": 987654321 + }, + { + "keyPair": "L5kdM8eWyfj8pdRDWA8j5SmBwAQt2yyhqjb2ZZQxtRGJfCquC6TB", + "hashType": 130, + "witnessScript": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "redeemScript": "OP_0 a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54", + "value": 987654321 + }, + { + "keyPair": "KyT4JbJVRy5FZ6ZEZhkaocP2JSBXiF7X3Cx6DBAGLrydR9fiXQUK", + "hashType": 131, + "witnessScript": "OP_6 0307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba3 03b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b 034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a 033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f4 03a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac16 02d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b OP_6 OP_CHECKMULTISIG", + "redeemScript": "OP_0 a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54", + "value": 987654321 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 9993a429037b5d912407a71c252019287b8d27a5 OP_EQUAL" + } + ], + "outputs": [ + { + "value": 5924925926, + "script": "OP_DUP OP_HASH160 389ffce9cd9ae88dcc0631e88a821ffdbe9bfe26 OP_EQUALVERIFY OP_CHECKSIG" + }, + { + "value": 999000, + "script": "OP_DUP OP_HASH160 7480a33f950689af511e6e84c138dbbd3c3ee415 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2PK", + "txHex": "010000000193aef40ae141694895e99e18e49d0181b086dd7c011c0241175c6eaf320099970000000049483045022100e57eba5380dcc8a7bdb5370b423dadd43070e1ca268f94bc97b2ded55ca45e9502206a43151c8af03a00f0ac86526d07981e303fc0daea8c6ed435abe8961533046d01ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "97990032af6e5c1741021c017cdd86b081019de4189ee995486941e10af4ae93", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH P2PK", + "txHex": "0100000001a30e865fa60f6c25a8b218bb5a6b9acc7cf3f1db2f2e3a7114b51af5d6ae811f000000006c473044022026d2b56b6cb0269bf4e80dd655b9e917019e2ccef57f4b858d03bb45a2da59d9022010519a7f327f03e7c9613e0694f929544af29d3682e7ec8f19147e7a86651ecd012321038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bacffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "1f81aed6f51ab514713a2e2fdbf1f37ccc9a6b5abb18b2a8256c0fa65f860ea3", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "redeemScript": "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_CHECKSIG", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 c99d9ebb5a4828e4e1b606dd6a51a2babebbdc09 OP_EQUAL" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2WSH P2PK", + "txHex": "010000000001014533a3bc1e039bd787656068e135aaee10aee95a64776bfc047ee6a7c1ebdd2f0000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac02473044022039725bb7291a14dd182dafdeaf3ea0d5c05c34f4617ccbaa46522ca913995c4e02203b170d072ed2e489e7424ad96d8fa888deb530be2d4c5d9aaddf111a7efdb2d3012321038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac00000000", + "inputs": [ + { + "txId": "2fddebc1a7e67e04fc6b77645ae9ae10eeaa35e168606587d79b031ebca33345", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "witnessScript": "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_CHECKSIG", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_0 0f9ea7bae7166c980169059e39443ed13324495b0d6678ce716262e879591210" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH P2WSH P2PK", + "txHex": "01000000000101e0779d448aaa203a96b3de14d0482e26dd75a4278ae5bb6d7cc18e6874f3866000000000232200200f9ea7bae7166c980169059e39443ed13324495b0d6678ce716262e879591210ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac024730440220014207a5f0601ed7b3c3f9d82309b32e8f76dd6776a55cb5f8684b9ff029e0850220693afd7b69471b51d9354cc1a956b68b8d48e32f6b0ad7a19bb5dd3e4499179a012321038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bac00000000", + "inputs": [ + { + "txId": "6086f374688ec17c6dbbe58a27a475dd262e48d014deb3963a20aa8a449d77e0", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "witnessScript": "038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_CHECKSIG", + "redeemScript": "OP_0 0f9ea7bae7166c980169059e39443ed13324495b0d6678ce716262e879591210", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 6d185c7042d01ea8276dc6be6603101dc441d8a4 OP_EQUAL" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2PKH", + "txHex": "010000000176d7b05b96e69d9760bacf14e496ea01085eff32be8f4e08b299eb92057826e5000000006b4830450221009bd6ff2561437155913c289923175d3f114cca1c0e2bc5989315d5261502c2c902201b71ad90dce076a5eb872330ed729e7c2c4bc2d0513efff099dbefb3b62eab4f0121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2bffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "e526780592eb99b2084e8fbe32ff5e0801ea96e414cfba60979de6965bb0d776", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH P2PKH", + "txHex": "01000000014b9ffc17c3cce03ee66980bf32d36aaa13462980c3af9d9d29ec6b97ab1c91650000000084473044022003d738d855d0c54a419ac62ebe1a1c0bf2dc6993c9585adb9a8666736658107002204d57ff62ee7efae6df73430bba62494faeba8c125a4abcf2488757a4f8877dd50121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b1976a914851a33a5ef0d4279bd5854949174e2c65b1d450088acffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "65911cab976bec299d9dafc380294613aa6ad332bf8069e63ee0ccc317fc9f4b", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "redeemScript": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 2162ff7c23d47a0c331f95c67d7c3e22abb12a02 OP_EQUAL" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2WSH P2PKH", + "txHex": "0100000000010123539877e39a273819006de1c433e09f9e9af201fc178dd0f2cf2eaa5ad53b480000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac03483045022100f02a82b0a94a5d5dc4d2127ac34be62cb066713d71d56bdf5ef7810ab57a157302205f24abdde1dab554a02edcf378e98828024e57272e5e474a5b04accdca080a030121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b1976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "483bd55aaa2ecff2d08d17fc01f29a9e9fe033c4e16d001938279ae377985323", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "witnessScript": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_0 578db4b54a6961060b71385c17d3280379a557224c52b11b19a3a1c1eef606a0" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH P2WSH P2PKH", + "txHex": "01000000000101363dfbfe2566db77e3b1195bedf1d0daeb9ce526cd7611ba81759b2654ce415c0000000023220020578db4b54a6961060b71385c17d3280379a557224c52b11b19a3a1c1eef606a0ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac03483045022100c8bd5ebb26ba6719158650c3e7c5e80be4c886ba025c44cc41f5149b3114705a02203ac6e1f38f6c081d506f28f1b5e38ebec9e0f0fa911d0e3f68d48d8b0e77b34b0121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b1976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "5c41ce54269b7581ba1176cd26e59cebdad0f1ed5b19b1e377db6625fefb3d36", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "witnessScript": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG", + "redeemScript": "OP_0 578db4b54a6961060b71385c17d3280379a557224c52b11b19a3a1c1eef606a0", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 44a641c4e06eb6118c99e5ed29954b705b50fb6a OP_EQUAL" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "Multisig", + "txHex": "010000000179310ec46e734b3490ee839c5ae4a09d28561ee9fff2d051f733d201f958d6d2000000004a00483045022100d269531f120f377ed2f94f42bef893ff2fe6544ac97fb477fa291bc6cfb7647e02200983f6a5bbd4ce6cf97f571995634805a7324cc5d8353ed954fa62477b0fcd0901ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "d2d658f901d233f751d0f2ffe91e56289da0e45a9c83ee90344b736ec40e3179", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_1 038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_1 OP_CHECKMULTISIG" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH Multisig", + "txHex": "010000000152882c661c49dd2f53bd9ced7e9f44b184888ad2fe7d86737f0efaa7aecdced1000000006f00473044022025f2e161f0a97888df948f4dcc7c04fe502510b8d8260ca9920f38d55e4d17720220271b6843224b3a34542a4df31781d048da56ee46b8c5fb99043e30abd527b2d801255121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51aeffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac00000000", + "inputs": [ + { + "txId": "d1cecdaea7fa0e7f73867dfed28a8884b1449f7eed9cbd532fdd491c662c8852", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "redeemScript": "OP_1 038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_1 OP_CHECKMULTISIG", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 38c064c6387d1071eeb5c3d90350054aea0b3fc1 OP_EQUAL" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2WSH Multisig", + "txHex": "01000000000101c1eced6216de0889d4629ff64a8af8e8ec6d0b414de0c57b46c02cc303d321fe0000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac0300483045022100d4c0cbdb45915b8a3162362fa5f74556de919aeda5337fc44a7fb000e833460d022017742c37d7a061e2ae3a086c7c585c9c85e5d31af468d3e00045c0f35b8f8eb601255121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51ae00000000", + "inputs": [ + { + "txId": "fe21d303c32cc0467bc5e04d410b6dece8f88a4af69f62d48908de1662edecc1", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "witnessScript": "OP_1 038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_1 OP_CHECKMULTISIG", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_0 1b8c0c2878c5634c3ce738cdc568c592e99783dbd28ff4c6cb5b7b4675d9ee99" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH P2WSH Multisig", + "txHex": "010000000001013a5a2ab0223d3b504b52af76d650329750666fbf1be13d4cb08d0d9fc550a47d00000000232200201b8c0c2878c5634c3ce738cdc568c592e99783dbd28ff4c6cb5b7b4675d9ee99ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac0300483045022100c97a5e205ce0023d3d44f846abf1f0e21b6f2646bd2496bbe92e4333fe4401be02201247e047d669f713582713e35d2eba430abc3d75a924bb500362bf47d6234ed501255121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b51ae00000000", + "inputs": [ + { + "txId": "7da450c59f0d8db04c3de11bbf6f6650973250d676af524b503b3d22b02a5a3a", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "witnessScript": "OP_1 038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b OP_1 OP_CHECKMULTISIG", + "redeemScript": "OP_0 1b8c0c2878c5634c3ce738cdc568c592e99783dbd28ff4c6cb5b7b4675d9ee99", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 cc6ea17c33de7996471e40892acdd6e5f61b9b6f OP_EQUAL" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2WKH", + "txHex": "0100000000010133defbe3e28860007ff3e21222774c220cb35d554fa3e3796d25bf8ee983e1080000000000ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac0248304502210097c3006f0b390982eb47f762b2853773c6cedf83668a22d710f4c13c4fd6b15502205e26ef16a81fc818a37f3a34fc6d0700e61100ea6c6773907c9c046042c440340121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b00000000", + "inputs": [ + { + "txId": "08e183e98ebf256d79e3a34f555db30c224c772212e2f37f006088e2e3fbde33", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_0 851a33a5ef0d4279bd5854949174e2c65b1d4500" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH P2WKH", + "txHex": "010000000001015df9a0b9ade2d835881704e0f53b51a4b19ecfc794ea1f3555783dd7f68659ce0000000017160014851a33a5ef0d4279bd5854949174e2c65b1d4500ffffffff0160ea0000000000001976a914851a33a5ef0d4279bd5854949174e2c65b1d450088ac02483045022100cb3929c128fec5108071b662e5af58e39ac8708882753a421455ca80462956f6022030c0f4738dd1a13fc7a34393002d25c6e8a6399f29c7db4b98f53a9475d94ca20121038de63cf582d058a399a176825c045672d5ff8ea25b64d28d4375dcdb14c02b2b00000000", + "inputs": [ + { + "txId": "ce5986f6d73d7855351fea94c7cf9eb1a4513bf5e004178835d8e2adb9a0f95d", + "vout": 0, + "signs": [ + { + "keyPair": "L2FroWqrUgsPpTMhpXcAFnVDLPTToDbveh3bhDaU4jhe7Cw6YujN", + "hashType": 1, + "redeemScript": "OP_0 851a33a5ef0d4279bd5854949174e2c65b1d4500", + "value": 80000 + } + ], + "sequence": 4294967295, + "prevTxScript": "OP_HASH160 0d061ae2c8ad224a81142a2e02181f5173b576b3 OP_EQUAL" + } + ], + "outputs": [ + { + "value": 60000, + "script": "OP_DUP OP_HASH160 851a33a5ef0d4279bd5854949174e2c65b1d4500 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "locktime": 0 + }, + { + "description": "P2SH(P2WSH(multisig 2-of-2)), incomplete", + "network": "testnet", + "txHex": "010000000001012915794541ffa77ca795ec7c23ee989a63ccd1a71fab73e1c27ed20c4b6c69a4010000002322002024376a0a9abab599d0e028248d48ebe817bc899efcffa1cd2984d67289daf5afffffffff01b8820100000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac040047304402203b334650f1f13574a1c2edc76421867f7252950968bf0293c8b3ed086ab89e3d0220565cafab0a5044617e94756b948241525b2483a52504e1064d29f641fb18129e010047522102bbbd6eb01efcbe4bd9664b886f26f69de5afcb2e479d72596c8bf21929e352e22102d9c3f7180ef13ec5267723c9c2ffab56a4215241f837502ea8977c8532b9ea1952ae00000000", + "incomplete": true, + "inputs": [ + { + "txId": "a4696c4b0cd27ec2e173ab1fa7d1cc639a98ee237cec95a77ca7ff4145791529", + "vout": 1, + "signs": [ + { + "keyPair": "cRAwuVuVSBZMPu7hdrYvMCZ8eevzmkExjFbaBLhqnDdrezxN3nTS", + "witnessScript": "OP_2 02bbbd6eb01efcbe4bd9664b886f26f69de5afcb2e479d72596c8bf21929e352e2 02d9c3f7180ef13ec5267723c9c2ffab56a4215241f837502ea8977c8532b9ea19 OP_2 OP_CHECKMULTISIG", + "redeemScript": "OP_0 24376a0a9abab599d0e028248d48ebe817bc899efcffa1cd2984d67289daf5af", + "value": 100000 + } + ], + "prevTxScript": "OP_HASH160 b64f1a3eacc1c8515592a6f10457e8ff90e4db6a OP_EQUAL" + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 99000 + } + ] + }, + { + "description": "P2SH(P2WSH(multisig 2-of-2))", + "network": "testnet", + "txHex": "010000000001012915794541ffa77ca795ec7c23ee989a63ccd1a71fab73e1c27ed20c4b6c69a4010000002322002024376a0a9abab599d0e028248d48ebe817bc899efcffa1cd2984d67289daf5afffffffff01b8820100000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac040047304402203b334650f1f13574a1c2edc76421867f7252950968bf0293c8b3ed086ab89e3d0220565cafab0a5044617e94756b948241525b2483a52504e1064d29f641fb18129e0148304502210096e859827fb629b6547658c613f7c8298de151513d74b224560aa8608d521d600220736fb5564322237716ec940de44c67c428198adf5dedfda183c17aa77cd28d640147522102bbbd6eb01efcbe4bd9664b886f26f69de5afcb2e479d72596c8bf21929e352e22102d9c3f7180ef13ec5267723c9c2ffab56a4215241f837502ea8977c8532b9ea1952ae00000000", + "incomplete": true, + "inputs": [ + { + "txId": "a4696c4b0cd27ec2e173ab1fa7d1cc639a98ee237cec95a77ca7ff4145791529", + "vout": 1, + "signs": [ + { + "keyPair": "cRAwuVuVSBZMPu7hdrYvMCZ8eevzmkExjFbaBLhqnDdrezxN3nTS", + "witnessScript": "OP_2 02bbbd6eb01efcbe4bd9664b886f26f69de5afcb2e479d72596c8bf21929e352e2 02d9c3f7180ef13ec5267723c9c2ffab56a4215241f837502ea8977c8532b9ea19 OP_2 OP_CHECKMULTISIG", + "redeemScript": "OP_0 24376a0a9abab599d0e028248d48ebe817bc899efcffa1cd2984d67289daf5af", + "value": 100000 + }, + { + "keyPair": "cTUFsNeVd8TKU4yREN8nMdViNnHyNvCCYVRmRUmkMLgomiMWTiii", + "witnessScript": "OP_2 02bbbd6eb01efcbe4bd9664b886f26f69de5afcb2e479d72596c8bf21929e352e2 02d9c3f7180ef13ec5267723c9c2ffab56a4215241f837502ea8977c8532b9ea19 OP_2 OP_CHECKMULTISIG", + "redeemScript": "OP_0 24376a0a9abab599d0e028248d48ebe817bc899efcffa1cd2984d67289daf5af", + "value": 100000 + } + ], + "prevTxScript": "OP_HASH160 b64f1a3eacc1c8515592a6f10457e8ff90e4db6a OP_EQUAL" + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 99000 + } + ] + }, + { + "description": "P2WSH(multisig 2-of-3) -> P2PKH", + "network": "testnet", + "txHex": "01000000000101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01000000232200201b48bf145648b9492ecd6d76754ea3def4b90e22e4ef7aee9ca291b2de455701ffffffff01f07e0e00000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac0400473044022036c9ecb03cb04c09be1f52766725dcfe9a815973bd2f34ce19a345f2d925a45502207b90737852d2508db104ad17612de473687e67928c045555a1ed8d495c0570d901483045022100aec0e58e4e597b35ca5a727702a0da3d4f2ef4759914da7fc80aecb3c479a6d902201ec27ea8dcca4b73ee81e4b627f52f9e627c3497f61e4beeb98f86e02979640a0169522103c411cf39aca4395c81c35921dc832a0d1585d652ab1b52ccc619ff9fbbc5787721020636d944458a4663b75a912c37dc1cd59b11f9a00106783a65ba230d929b96b02102d1448cbf19528a1a27e5958ba73d930b5b3facdbe5c30c7094951a287fcc914953ae00000000", + "stages": [ + "01000000000101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01000000232200201b48bf145648b9492ecd6d76754ea3def4b90e22e4ef7aee9ca291b2de455701ffffffff01f07e0e00000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac0500473044022036c9ecb03cb04c09be1f52766725dcfe9a815973bd2f34ce19a345f2d925a45502207b90737852d2508db104ad17612de473687e67928c045555a1ed8d495c0570d901000069522103c411cf39aca4395c81c35921dc832a0d1585d652ab1b52ccc619ff9fbbc5787721020636d944458a4663b75a912c37dc1cd59b11f9a00106783a65ba230d929b96b02102d1448cbf19528a1a27e5958ba73d930b5b3facdbe5c30c7094951a287fcc914953ae00000000" + ], + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "signs": [ + { + "keyPair": "cUxccFVBdJRq6HnyxiFMd8Z15GLThXaNLcnPBgoXLEv9iX6wuV2b", + "witnessScript": "OP_2 03c411cf39aca4395c81c35921dc832a0d1585d652ab1b52ccc619ff9fbbc57877 020636d944458a4663b75a912c37dc1cd59b11f9a00106783a65ba230d929b96b0 02d1448cbf19528a1a27e5958ba73d930b5b3facdbe5c30c7094951a287fcc9149 OP_3 OP_CHECKMULTISIG", + "redeemScript": "OP_0 1b48bf145648b9492ecd6d76754ea3def4b90e22e4ef7aee9ca291b2de455701", + "value": 1000000, + "stage": true + }, + { + "keyPair": "cVSNe9ZdZRsRvEBL8YRR7YiZmH4cLsf5FthgERWkZezJVrGseaXy", + "witnessScript": "OP_2 03c411cf39aca4395c81c35921dc832a0d1585d652ab1b52ccc619ff9fbbc57877 020636d944458a4663b75a912c37dc1cd59b11f9a00106783a65ba230d929b96b0 02d1448cbf19528a1a27e5958ba73d930b5b3facdbe5c30c7094951a287fcc9149 OP_3 OP_CHECKMULTISIG", + "redeemScript": "OP_0 1b48bf145648b9492ecd6d76754ea3def4b90e22e4ef7aee9ca291b2de455701", + "value": 1000000 + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 950000 + } + ] + } + ], + "fromTransaction": [ + { + "description": "Transaction w/ scriptHash(multisig 2-of-2) -> OP_RETURN | 1 OP_0, no signatures", + "network": "testnet", + "incomplete": true, + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "scriptSig": "OP_0 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae", + "scriptSigAfter": "OP_0 OP_0 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Transaction w/ scriptHash(multisig 2-of-2) -> OP_RETURN | missing OP_0, 1 signature", + "network": "testnet", + "incomplete": true, + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "scriptSig": "OP_0 3045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b0657601 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae", + "scriptSigAfter": "OP_0 OP_0 3045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b0657601 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Transaction w/ scriptHash(multisig 2-of-2) -> OP_RETURN | no OP_0, 2 signatures", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "scriptSig": "OP_0 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae", + "scriptSigAfter": "OP_0 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + } + ], + "classification": { + "hex": "01000000059c06fb641a8cd69be81ca91e68d8a115cb698396876ecd77120ec1e4ab9002279f000000b500483045022100d58f828ab39cfac592f89fe372fb520992975218698c683a893f29e39cf0080302207cc0485dab5ce621089bdd15e1f15db0ecbde8dd4bb661bcf0e3af6ecab075e6014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffff0821dc00213d2b7993f8f2a1553800c6f2f31106da176505d0ade467b68401d795000000b400473044022028e937a7bba888fe3428f442f6e22d92ce2ddba01548c38780d40890fa6cc305022043204d0bcfb1150b045d54cf9b13462e44e2ef47fee03d3cea08e84a8060fc30014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffffaa997ac385dc666af1f5947ef615431024eb314cac2308d5e1b903e28ca466f499000000b50048304502210093efc26facedc5f51e304aa270a7b4f1a911b2d912c3674e5c6e2ad4ac7a410402201cf0b62c240461902f9f16d8a0bc3a210b7bfcd2c06523dd4b4b63be22e85252014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffffd9f61bf98a021ee144f33ba5a6b04274de8fcb5c05f1ff7c12367fb7a608b2dd9e000000b4004730440220456e1201c1fa727288cba7fa0054dc02d8dd6c7418cae1e97006ef0652891c9202201192d0fbf3a9c00afb99a415f2bf515509e1150805acd8de95c496c27cb6570f014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffff1f8119e3bc7c2f451feaa79f42ec5a63502afb425c253c935e43d217d5c29bdea1000000b500483045022100f669004f770490093eba4ac4903cb7581f7d18ea9245c538585ef5367e520e4702205485fafe0be178563a599d41e0cc172bb01314ed65d0e48df19a5258f17bdbc4014c6952210327e023a353d111808f61d554c2e1934721eaf87f33b7a771e807006908a493722103251670bb6a179a0d43b75476c7e580c0ba274378a18077e8de0832c870e5381f2102cca7f9a64425a0466d26d5c7e9eb3ad6b64cd48ea89edb38bc08f58a792dde4753aeffffffff0380f0fa02000000001976a91439692085cf9d27e8c1cf63e76bd32d9bd15cab8b88ac50c300000000000017a9147204bb26950ce1595255897f63d205779f033f3e875b5409000000000017a9142538893d984a4b5695e4bfde1a90a9f02fabf8e38700000000" + }, + "multisig": [ + { + "description": "P2SH 2-of-2 multisig, signed in correct order", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + }, + { + "pubKeyIndex": 1, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT", + "scriptSig": "OP_0 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 3045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b0657601 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd1c0100483045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001483045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b06576014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + }, + { + "description": "P2SH 2-of-2 multisig, signed in shuffled order", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 1, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT", + "scriptSig": "OP_0 OP_0 3045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b0657601 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + }, + { + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 3045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b0657601 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd1c0100483045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001483045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b06576014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + }, + { + "description": "P2SH 2-of-2 multisig, manually messed up order of signatures", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + }, + { + "pubKeyIndex": 1, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT", + "scriptSig": "OP_0 3045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001 3045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b0657601 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd1c0100483045022100e37e33a4fe5fccfb87afb0e951e83fcea4820d73b327d21edc1adec3b916c437022061c5786908b674e323a1863cc2feeb60e1679f1892c10ee08ac21e51fd50ba9001483045022100aa0c323bc639d3d71591be98ccaf7b8cb8c86aa95f060aef5e36fc3f04c4d029022010e2b18de17e307a12ae7e0e88518fe814f18a0ca1ee4510ba23a65628b06576014c8752410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a52aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + }, + { + "description": "P2SH 2-of-3 multisig, signed by key 1 and 2", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 OP_0 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + }, + { + "pubKeyIndex": 1, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 3045022100ae06d8269b79b5cfa0297d1d88261b0061e52fc2814948c3aa05fa78ee76894302206e0c79a5c90569d8c72a542ef9a06471cbbcd2c651b312339983dfba4f8ff46301 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd5e0100483045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01483045022100ae06d8269b79b5cfa0297d1d88261b0061e52fc2814948c3aa05fa78ee76894302206e0c79a5c90569d8c72a542ef9a06471cbbcd2c651b312339983dfba4f8ff463014cc952410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + }, + { + "description": "P2SH 2-of-3 multisig, signed by key 1 and 3", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 OP_0 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + }, + { + "pubKeyIndex": 2, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 OP_0 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd5e0100483045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01483045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af0014cc952410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + }, + { + "description": "P2SH 2-of-3 multisig, signed by key 3 and 1", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 2, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe", + "scriptSig": "OP_0 OP_0 OP_0 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + }, + { + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 OP_0 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd5e0100483045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01483045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af0014cc952410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + }, + { + "description": "P2SH 2-of-3 multisig, signed by key 1 and 3, manually messed up order of signatures", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 OP_0 OP_0 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + }, + { + "pubKeyIndex": 2, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 OP_0 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd5e0100483045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01483045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af0014cc952410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + }, + { + "description": "P2SH 2-of-3 multisig, signed by key 3 and 1, manually removing OP_0s", + "network": "testnet", + "inputs": [ + { + "txId": "4971f016798a167331bcbc67248313fbc444c6e92e4416efd06964425588f5cf", + "vout": 0, + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG", + "signs": [ + { + "pubKeyIndex": 2, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe", + "scriptSig": "OP_0 OP_0 OP_0 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + }, + { + "filterOP_0": true, + "pubKeyIndex": 0, + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "scriptSig": "OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 OP_0 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae", + "scriptSigFiltered": "OP_0 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ], + "txHex": "0100000001cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f0714900000000fd5e0100483045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01483045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af0014cc952410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253aeffffffff01e8030000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + } + ] + }, + "invalid": { + "build": [ + { + "exception": "Transaction has no inputs", + "inputs": [], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "exception": "Transaction has no outputs", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0 + } + ], + "outputs": [] + }, + { + "exception": "Transaction has absurd fees", + "inputs": [ + { + "txRaw": { + "inputs": [], + "outputs": [ + { + "address": "1C5XhB1UkFuyCV1CG9dmXaXGu3xDL4nAjv", + "value": 1000000000 + } + ], + "incomplete": true + }, + "vout": 0, + "signs": [ + { + "keyPair": "KzBQVXYUGDAvqG7VeU3C7ZMRYiwtsxSVVFcYGzKU9E4aUVDUquZU" + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 ff99e06c1a4ac394b4e1cb3d3a4b2b47749e339a OP_EQUALVERIFY OP_CHECKSIG", + "value": 200000 + } + ] + }, + { + "description": "Incomplete transaction, nothing assumed", + "exception": "Transaction is not complete", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0 + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Incomplete transaction, known prevTxScript, thereby throws for missing signatures", + "exception": "Not enough signatures provided", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + } + ] + }, + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "prevTxScript": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG" + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Duplicate transaction outs", + "exception": "Duplicate TxOut: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff:0", + "incomplete": true, + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0 + }, + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0 + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Complete transaction w/ non-standard inputs", + "exception": "nonstandard not supported", + "txHex": "010000000100000000171a0000e028f2000000000050178500000000000d0000000e000000000000002009f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1ffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + } + ], + "sign": [ + { + "description": "Transaction w/ witness value mismatch", + "exception": "Input didn\\'t match witnessValue", + "network": "testnet", + "inputs": [ + { + "txHex": "0100000001f7e6430096cd2790bac115aaab22c0a50fb0a1794305302e1a399e81d8d354f4020000006a47304402205793a862d193264afc32713e2e14541e1ff9ebb647dd7e7e6a0051d0faa87de302205216653741ecbbed573ea2fc053209dd6980616701c27be5b958a159fc97f45a012103e877e7deb32d19250dcfe534ea82c99ad739800295cd5429a7f69e2896c36fcdfeffffff0340420f00000000001976a9145c7b8d623fba952d2387703d051d8e931a6aa0a188ac8bda2702000000001976a9145a0ef60784137d03e7868d063b05424f2f43799f88ac40420f00000000001976a9145c7b8d623fba952d2387703d051d8e931a6aa0a188ac2fcc0e00", + "vout": 0, + "signs": [ + { + "keyPair": "cQ6483mDWwoG8o4tn6nU9Jg52RKMjPUWXSY1vycAyPRXQJ1Pn2Rq", + "throws": true, + "value": 22500000000 + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 ff99e06c1a4ac394b4e1cb3d3a4b2b47749e339a OP_EQUALVERIFY OP_CHECKSIG", + "value": 6000000 + } + ] + }, + { + "description": "Too many signatures - pubKeyHash", + "exception": "Signature already exists", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn" + }, + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "exception": "BIP143 rejects uncompressed public keys in P2WPKH or P2WSH", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "OP_0 15a71ffa7b5bb70cddefcf364494071022efe390", + "signs": [ + { + "keyPair": "5JiHJJjdufSiMxbvnyNcKtQNLYH6SvUpQnRv9yZENFDWTQKQkzC", + "value": 10000, + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_0 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5", + "value": 10000 + } + ] + }, + { + "exception": "RedeemScript not supported \"OP_RETURN 06deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474\"", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "redeemScript": "OP_RETURN 06deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "exception": "PrevOutScript is scripthash, requires redeemScript", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "prevTxScript": "OP_HASH160 7f67f0521934a57d3039f77f9f32cf313f3ac74b OP_EQUAL", + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "exception": "Inconsistent redeemScript", + "network": "testnet", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "redeemScript": "OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx" + }, + { + "redeemScript": "OP_1 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a OP_2 OP_CHECKMULTISIG", + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "exception": "RedeemScript not supported \"OP_HASH160 7f67f0521934a57d3039f77f9f32cf313f3ac74b OP_EQUAL\"", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "redeemScript": "OP_HASH160 7f67f0521934a57d3039f77f9f32cf313f3ac74b OP_EQUAL", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "exception": "PrevOutScript must be P2SH", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "prevTxScript": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "signs": [ + { + "keyPair": "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn", + "redeemScript": "OP_1 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 OP_1 OP_CHECKMULTISIG", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Too many signatures - scriptHash(multisig 1-of-1)", + "exception": "Signature already exists", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "signs": [ + { + "keyPair": "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", + "redeemScript": "OP_1 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 OP_1 OP_CHECKMULTISIG" + }, + { + "keyPair": "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Wrong network for keyPair", + "exception": "Inconsistent network", + "network": "bitcoin", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "signs": [ + { + "keyPair": "91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx", + "network": "testnet", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "description": "Wrong key pair for multisig redeemScript", + "exception": "Key pair cannot sign for this input", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 1, + "signs": [ + { + "keyPair": "KzrA86mCVMGWnLGBQu9yzQa32qbxb5dvSK4XhyjjGAWSBKYX4rHx", + "redeemScript": "OP_1 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 OP_1 OP_CHECKMULTISIG", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + }, + { + "exception": "nulldata not supported", + "inputs": [ + { + "txId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "vout": 0, + "prevTxScript": "OP_RETURN 06deadbeef03f895a2ad89fb6d696497af486cb7c644a27aa568c7a18dd06113401115185474", + "signs": [ + { + "keyPair": "KzrA86mCVMGWnLGBQu9yzQa32qbxb5dvSK4XhyjjGAWSBKYX4rHx", + "throws": true + } + ] + } + ], + "outputs": [ + { + "script": "OP_DUP OP_HASH160 aa4d7985c57e011a8b3dd8e0e5a73aaef41629c5 OP_EQUALVERIFY OP_CHECKSIG", + "value": 1000 + } + ] + } + ], + "fromTransaction": [ + { + "exception": "coinbase inputs not supported", + "txHex": "01000000010000000000000000000000000000000000000000000000000000000000000000000000006b483045022100a3b254e1c10b5d039f36c05f323995d6e5a367d98dd78a13d5bbc3991b35720e022022fccea3897d594de0689601fbd486588d5bfa6915be2386db0397ee9a6e80b601210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ffffffff0110270000000000001976a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac00000000" + } + ] + } +} diff --git a/web/bitcoincashjs-lib/test/hdnode.js b/web/bitcoincashjs-lib/test/hdnode.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/hdnode.js @@ -0,0 +1,476 @@ +/* global describe, it, beforeEach */ +/* eslint-disable no-new */ + +var assert = require('assert'); +var ecdsa = require('../src/ecdsa'); +var sinon = require('sinon'); + +var BigInteger = require('bigi'); +var ECPair = require('../src/ecpair'); +var HDNode = require('../src/hdnode'); + +var fixtures = require('./fixtures/hdnode.json'); +var curve = ecdsa.__curve; + +var NETWORKS = require('../src/networks'); +var NETWORKS_LIST = []; // Object.values(NETWORKS) +for (var networkName in NETWORKS) { + NETWORKS_LIST.push(NETWORKS[networkName]); +} + +var validAll = []; +fixtures.valid.forEach(function (f) { + function addNetwork(n) { + n.network = f.network; + return n; + } + + validAll = validAll.concat( + addNetwork(f.master), + f.children.map(addNetwork), + ); +}); + +describe('HDNode', function () { + describe('Constructor', function () { + var keyPair, chainCode; + + beforeEach(function () { + var d = BigInteger.ONE; + + keyPair = new ECPair(d, null); + chainCode = Buffer.alloc(32, 1); + }); + + it('stores the keyPair/chainCode directly', function () { + var hd = new HDNode(keyPair, chainCode); + + assert.strictEqual(hd.keyPair, keyPair); + assert.strictEqual(hd.chainCode, chainCode); + }); + + it('has a default depth/index of 0', function () { + var hd = new HDNode(keyPair, chainCode); + + assert.strictEqual(hd.depth, 0); + assert.strictEqual(hd.index, 0); + }); + + it('throws on uncompressed keyPair', function () { + keyPair.compressed = false; + + assert.throws(function () { + new HDNode(keyPair, chainCode); + }, /BIP32 only allows compressed keyPairs/); + }); + + it('throws when an invalid length chain code is given', function () { + assert.throws(function () { + new HDNode(keyPair, Buffer.alloc(20)); + }, /Expected property "1" of type Buffer\(Length: 32\), got Buffer\(Length: 20\)/); + }); + }); + + describe('fromSeed*', function () { + fixtures.valid.forEach(function (f) { + it( + 'calculates privKey and chainCode for ' + f.master.fingerprint, + function () { + var network = NETWORKS[f.network]; + var hd = HDNode.fromSeedHex(f.master.seed, network); + + assert.strictEqual(hd.keyPair.toWIF(), f.master.wif); + assert.strictEqual( + hd.chainCode.toString('hex'), + f.master.chainCode, + ); + }, + ); + }); + + it( + 'throws if IL is not within interval [1, n - 1] | IL === 0', + sinon.test(function () { + this.mock(BigInteger) + .expects('fromBuffer') + .once() + .returns(BigInteger.ZERO); + + assert.throws(function () { + HDNode.fromSeedHex('ffffffffffffffffffffffffffffffff'); + }, /Private key must be greater than 0/); + }), + ); + + it( + 'throws if IL is not within interval [1, n - 1] | IL === n', + sinon.test(function () { + this.mock(BigInteger) + .expects('fromBuffer') + .once() + .returns(curve.n); + + assert.throws(function () { + HDNode.fromSeedHex('ffffffffffffffffffffffffffffffff'); + }, /Private key must be less than the curve order/); + }), + ); + + it('throws on low entropy seed', function () { + assert.throws(function () { + HDNode.fromSeedHex('ffffffffff'); + }, /Seed should be at least 128 bits/); + }); + + it('throws on too high entropy seed', function () { + assert.throws(function () { + HDNode.fromSeedHex( + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + ); + }, /Seed should be at most 512 bits/); + }); + }); + + describe('ECPair wrappers', function () { + var keyPair, hd, hash; + + beforeEach(function () { + keyPair = ECPair.makeRandom(); + hash = Buffer.alloc(32); + + var chainCode = Buffer.alloc(32); + hd = new HDNode(keyPair, chainCode); + }); + + describe('getAddress', function () { + it( + 'wraps keyPair.getAddress', + sinon.test(function () { + this.mock(keyPair) + .expects('getAddress') + .once() + .withArgs() + .returns('foobar'); + + assert.strictEqual(hd.getAddress(), 'foobar'); + }), + ); + }); + + describe('getNetwork', function () { + it( + 'wraps keyPair.getNetwork', + sinon.test(function () { + this.mock(keyPair) + .expects('getNetwork') + .once() + .withArgs() + .returns('network'); + + assert.strictEqual(hd.getNetwork(), 'network'); + }), + ); + }); + + describe('getPublicKeyBuffer', function () { + it( + 'wraps keyPair.getPublicKeyBuffer', + sinon.test(function () { + this.mock(keyPair) + .expects('getPublicKeyBuffer') + .once() + .withArgs() + .returns('pubKeyBuffer'); + + assert.strictEqual(hd.getPublicKeyBuffer(), 'pubKeyBuffer'); + }), + ); + }); + + describe('sign', function () { + it( + 'wraps keyPair.sign', + sinon.test(function () { + this.mock(keyPair) + .expects('sign') + .once() + .withArgs(hash) + .returns('signed'); + + assert.strictEqual(hd.sign(hash), 'signed'); + }), + ); + }); + + describe('verify', function () { + var signature; + + beforeEach(function () { + signature = hd.sign(hash); + }); + + it( + 'wraps keyPair.verify', + sinon.test(function () { + this.mock(keyPair) + .expects('verify') + .once() + .withArgs(hash, signature) + .returns('verified'); + + assert.strictEqual(hd.verify(hash, signature), 'verified'); + }), + ); + }); + }); + + describe('fromBase58 / toBase58', function () { + validAll.forEach(function (f) { + it('exports ' + f.base58 + ' (public) correctly', function () { + var hd = HDNode.fromBase58(f.base58, NETWORKS_LIST); + + assert.strictEqual(hd.toBase58(), f.base58); + assert.throws(function () { + hd.keyPair.toWIF(); + }, /Missing private key/); + }); + }); + + validAll.forEach(function (f) { + it('exports ' + f.base58Priv + ' (private) correctly', function () { + var hd = HDNode.fromBase58(f.base58Priv, NETWORKS_LIST); + + assert.strictEqual(hd.toBase58(), f.base58Priv); + assert.strictEqual(hd.keyPair.toWIF(), f.wif); + }); + }); + + fixtures.invalid.fromBase58.forEach(function (f) { + it('throws on ' + f.string, function () { + assert.throws(function () { + var networks = f.network + ? NETWORKS[f.network] + : NETWORKS_LIST; + + HDNode.fromBase58(f.string, networks); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('getIdentifier', function () { + validAll.forEach(function (f) { + it('returns the identifier for ' + f.fingerprint, function () { + var hd = HDNode.fromBase58(f.base58, NETWORKS_LIST); + + assert.strictEqual( + hd.getIdentifier().toString('hex'), + f.identifier, + ); + }); + }); + }); + + describe('getFingerprint', function () { + validAll.forEach(function (f) { + it('returns the fingerprint for ' + f.fingerprint, function () { + var hd = HDNode.fromBase58(f.base58, NETWORKS_LIST); + + assert.strictEqual( + hd.getFingerprint().toString('hex'), + f.fingerprint, + ); + }); + }); + }); + + describe('neutered / isNeutered', function () { + validAll.forEach(function (f) { + it('drops the private key for ' + f.fingerprint, function () { + var hd = HDNode.fromBase58(f.base58Priv, NETWORKS_LIST); + var hdn = hd.neutered(); + + assert.notEqual(hdn.keyPair, hd.keyPair); + assert.throws(function () { + hdn.keyPair.toWIF(); + }, /Missing private key/); + assert.strictEqual(hdn.toBase58(), f.base58); + assert.strictEqual(hdn.chainCode, hd.chainCode); + assert.strictEqual(hdn.depth, f.depth >>> 0); + assert.strictEqual(hdn.index, f.index >>> 0); + assert.strictEqual(hdn.isNeutered(), true); + + // does not modify the original + assert.strictEqual(hd.toBase58(), f.base58Priv); + assert.strictEqual(hd.isNeutered(), false); + }); + }); + }); + + describe('derive', function () { + function verifyVector(hd, v) { + if (hd.isNeutered()) { + assert.strictEqual(hd.toBase58(), v.base58); + } else { + assert.strictEqual(hd.neutered().toBase58(), v.base58); + assert.strictEqual(hd.toBase58(), v.base58Priv); + } + + assert.strictEqual( + hd.getFingerprint().toString('hex'), + v.fingerprint, + ); + assert.strictEqual( + hd.getIdentifier().toString('hex'), + v.identifier, + ); + assert.strictEqual(hd.getAddress(), v.address); + assert.strictEqual(hd.keyPair.toWIF(), v.wif); + assert.strictEqual( + hd.keyPair.getPublicKeyBuffer().toString('hex'), + v.pubKey, + ); + assert.strictEqual(hd.chainCode.toString('hex'), v.chainCode); + assert.strictEqual(hd.depth, v.depth >>> 0); + assert.strictEqual(hd.index, v.index >>> 0); + } + + fixtures.valid.forEach(function (f) { + var network = NETWORKS[f.network]; + var hd = HDNode.fromSeedHex(f.master.seed, network); + var master = hd; + + // testing deriving path from master + f.children.forEach(function (c) { + it( + c.path + ' from ' + f.master.fingerprint + ' by path', + function () { + var child = master.derivePath(c.path); + var childNoM = master.derivePath(c.path.slice(2)); // no m/ on path + + verifyVector(child, c); + verifyVector(childNoM, c); + }, + ); + }); + + // testing deriving path from children + f.children.forEach(function (c, i) { + var cn = master.derivePath(c.path); + + f.children.slice(i + 1).forEach(function (cc) { + it( + cc.path + ' from ' + c.fingerprint + ' by path', + function () { + var ipath = cc.path + .slice(2) + .split('/') + .slice(i + 1) + .join('/'); + var child = cn.derivePath(ipath); + verifyVector(child, cc); + + assert.throws(function () { + cn.derivePath('m/' + ipath); + }, /Not a master node/); + }, + ); + }); + }); + + // FIXME: test data is only testing Private -> private for now + f.children.forEach(function (c) { + if (c.m === undefined) return; + + it(c.path + ' from ' + f.master.fingerprint, function () { + if (c.hardened) { + hd = hd.deriveHardened(c.m); + } else { + hd = hd.derive(c.m); + } + + verifyVector(hd, c); + }); + }); + }); + + it('works for Private -> public (neutered)', function () { + var f = fixtures.valid[1]; + var c = f.children[0]; + + var master = HDNode.fromBase58(f.master.base58Priv, NETWORKS_LIST); + var child = master.derive(c.m).neutered(); + + assert.strictEqual(child.toBase58(), c.base58); + }); + + it('works for Private -> public (neutered, hardened)', function () { + var f = fixtures.valid[0]; + var c = f.children[0]; + + var master = HDNode.fromBase58(f.master.base58Priv, NETWORKS_LIST); + var child = master.deriveHardened(c.m).neutered(); + + assert.strictEqual(c.base58, child.toBase58()); + }); + + it('works for Public -> public', function () { + var f = fixtures.valid[1]; + var c = f.children[0]; + + var master = HDNode.fromBase58(f.master.base58, NETWORKS_LIST); + var child = master.derive(c.m); + + assert.strictEqual(c.base58, child.toBase58()); + }); + + it('throws on Public -> public (hardened)', function () { + var f = fixtures.valid[0]; + var c = f.children[0]; + + var master = HDNode.fromBase58(f.master.base58, NETWORKS_LIST); + + assert.throws(function () { + master.deriveHardened(c.m); + }, /Could not derive hardened child key/); + }); + + it('throws on wrong types', function () { + var f = fixtures.valid[0]; + var master = HDNode.fromBase58(f.master.base58, NETWORKS_LIST); + + fixtures.invalid.derive.forEach(function (fx) { + assert.throws(function () { + master.derive(fx); + }, /Expected UInt32/); + }); + + fixtures.invalid.deriveHardened.forEach(function (fx) { + assert.throws(function () { + master.deriveHardened(fx); + }, /Expected UInt31/); + }); + + fixtures.invalid.derivePath.forEach(function (fx) { + assert.throws(function () { + master.derivePath(fx); + }, /Expected BIP32 derivation path/); + }); + }); + + it('works when private key has leading zeros', function () { + var key = + 'xprv9s21ZrQH143K3ckY9DgU79uMTJkQRLdbCCVDh81SnxTgPzLLGax6uHeBULTtaEtcAvKjXfT7ZWtHzKjTpujMkUd9dDb8msDeAfnJxrgAYhr'; + var hdkey = HDNode.fromBase58(key); + assert.strictEqual( + hdkey.keyPair.d.toBuffer(32).toString('hex'), + '00000055378cf5fafb56c711c674143f9b0ee82ab0ba2924f19b64f5ae7cdbfd', + ); + var child = hdkey.derivePath("m/44'/0'/0'/0/0'"); + assert.strictEqual( + child.keyPair.d.toBuffer().toString('hex'), + '3348069561d2a0fb925e74bf198762acc47dce7db27372257d2d959a9e6f8aeb', + ); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/integration/_mainnet.js b/web/bitcoincashjs-lib/test/integration/_mainnet.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/_mainnet.js @@ -0,0 +1,7 @@ +var Blockchain = require('cb-http-client'); +var BLOCKTRAIL_API_KEY = + process.env.BLOCKTRAIL_API_KEY || + 'c0bd8155c66e3fb148bb1664adc1e4dacd872548'; +module.exports = new Blockchain('https://api.blocktrail.com/cb/v0.2.1/BTC', { + api_key: BLOCKTRAIL_API_KEY, +}); diff --git a/web/bitcoincashjs-lib/test/integration/_testnet.js b/web/bitcoincashjs-lib/test/integration/_testnet.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/_testnet.js @@ -0,0 +1,130 @@ +var async = require('async'); +var bitcoin = require('../../'); +var Blockchain = require('cb-http-client'); +var coinSelect = require('coinselect'); +var dhttp = require('dhttp/200'); +var typeforce = require('typeforce'); +var types = require('../../src/types'); + +var BLOCKTRAIL_API_KEY = + process.env.BLOCKTRAIL_API_KEY || + 'c0bd8155c66e3fb148bb1664adc1e4dacd872548'; +var blockchain = new Blockchain('https://api.blocktrail.com/cb/v0.2.1/tBTC', { + api_key: BLOCKTRAIL_API_KEY, +}); +var kpNetwork = bitcoin.networks.testnet; +var keyPair = bitcoin.ECPair.fromWIF( + 'cQqjeq2rxqwnqwMewJhkNtJDixtX8ctA4bYoWHdxY4xRPVvAEjmk', + kpNetwork, +); +var kpAddress = keyPair.getAddress(); +var conflicts = {}; + +function fundAddress(unspents, outputs, callback) { + // avoid too-long-mempool-chain + unspents = unspents.filter(function (x) { + return x.confirmations > 0 && !conflicts[x.txId + x.vout]; + }); + + var result = coinSelect(unspents, outputs, 10); + if (!result.inputs) return callback(new Error('Faucet empty')); + + var txb = new bitcoin.TransactionBuilder(kpNetwork); + result.inputs.forEach(function (x) { + conflicts[x.txId + x.vout] = true; + txb.addInput(x.txId, x.vout); + }); + + result.outputs.forEach(function (x) { + if (x.address) console.warn('funding ' + x.address + ' w/ ' + x.value); + txb.addOutput(x.address || kpAddress, x.value); + }); + + result.inputs.forEach(function (_, i) { + txb.sign(i, keyPair); + }); + + var tx = txb.build(); + + blockchain.transactions.propagate(tx.toHex(), function (err) { + if (err) return callback(err); + + var txId = tx.getId(); + callback( + null, + outputs.map(function (x, i) { + return { txId: txId, vout: i, value: x.value }; + }), + ); + }); +} + +blockchain.faucetMany = function faucetMany(outputs, callback) { + blockchain.addresses.unspents(kpAddress, function (err, unspents) { + if (err) return callback(err); + + typeforce( + [ + { + txId: types.Hex, + vout: types.UInt32, + value: types.Satoshi, + }, + ], + unspents, + ); + + fundAddress(unspents, outputs, callback); + }); +}; + +blockchain.faucet = function faucet(address, value, callback) { + blockchain.faucetMany( + [{ address: address, value: value }], + function (err, unspents) { + callback(err, unspents && unspents[0]); + }, + ); +}; + +// verify TX was accepted +blockchain.verify = function verify(address, txId, value, done) { + async.retry( + 5, + function (callback) { + setTimeout(function () { + // check that the above transaction included the intended address + dhttp( + { + method: 'POST', + url: 'https://api.ei8ht.com.au:9443/3/txs', + body: [txId], + }, + function (err, result) { + if (err) return callback(err); + if (!result[txId]) + return callback( + new Error('Could not find ' + txId), + ); + callback(); + }, + ); + }, 400); + }, + done, + ); +}; + +blockchain.transactions.propagate = function broadcast(txHex, callback) { + dhttp( + { + method: 'POST', + url: 'https://api.ei8ht.com.au:9443/3/pushtx', + body: txHex, + }, + callback, + ); +}; + +blockchain.RETURN_ADDRESS = kpAddress; +module.exports = blockchain; diff --git a/web/bitcoincashjs-lib/test/integration/addresses.js b/web/bitcoincashjs-lib/test/integration/addresses.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/addresses.js @@ -0,0 +1,186 @@ +/* global describe, it */ + +var assert = require('assert'); +var bigi = require('bigi'); +var bitcoin = require('../../'); +var dhttp = require('dhttp/200'); + +// deterministic RNG for testing only +function rng() { + return Buffer.from('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'); +} + +describe('bitcoinjs-lib (addresses)', function () { + it('can generate a random address', function () { + var keyPair = bitcoin.ECPair.makeRandom({ rng: rng }); + var address = keyPair.getAddress(); + + assert.strictEqual(address, '1F5VhMHukdnUES9kfXqzPzMeF1GPHKiF64'); + }); + + it('can generate an address from a SHA256 hash', function () { + var hash = bitcoin.crypto.sha256('correct horse battery staple'); + var d = bigi.fromBuffer(hash); + + var keyPair = new bitcoin.ECPair(d); + var address = keyPair.getAddress(); + + assert.strictEqual(address, '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8'); + }); + + it('can import an address via WIF', function () { + var keyPair = bitcoin.ECPair.fromWIF( + 'Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct', + ); + var address = keyPair.getAddress(); + + assert.strictEqual(address, '19AAjaTUbRjQCMuVczepkoPswiZRhjtg31'); + }); + + it('can generate a 2-of-3 multisig P2SH address', function () { + var pubKeys = [ + '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01', + '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9', + '03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9', + ].map(function (hex) { + return Buffer.from(hex, 'hex'); + }); + + var redeemScript = bitcoin.script.multisig.output.encode(2, pubKeys); // 2 of 3 + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey); + + assert.strictEqual(address, '36NUkt6FWUi3LAWBqWRdDmdTWbt91Yvfu7'); + }); + + it('can generate a SegWit address', function () { + var keyPair = bitcoin.ECPair.fromWIF( + 'Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct', + ); + var pubKey = keyPair.getPublicKeyBuffer(); + + var scriptPubKey = bitcoin.script.witnessPubKeyHash.output.encode( + bitcoin.crypto.hash160(pubKey), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey); + + assert.strictEqual( + address, + 'bc1qt97wqg464zrhnx23upykca5annqvwkwujjglky', + ); + }); + + it('can generate a SegWit address (via P2SH)', function () { + var keyPair = bitcoin.ECPair.fromWIF( + 'Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct', + ); + var pubKey = keyPair.getPublicKeyBuffer(); + + var redeemScript = bitcoin.script.witnessPubKeyHash.output.encode( + bitcoin.crypto.hash160(pubKey), + ); + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey); + + assert.strictEqual(address, '34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53'); + }); + + it('can generate a SegWit 3-of-4 multisig address', function () { + var pubKeys = [ + '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01', + '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9', + '023e4740d0ba639e28963f3476157b7cf2fb7c6fdf4254f97099cf8670b505ea59', + '03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9', + ].map(function (hex) { + return Buffer.from(hex, 'hex'); + }); + + var witnessScript = bitcoin.script.multisig.output.encode(3, pubKeys); // 3 of 4 + var scriptPubKey = bitcoin.script.witnessScriptHash.output.encode( + bitcoin.crypto.sha256(witnessScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey); + + assert.strictEqual( + address, + 'bc1q75f6dv4q8ug7zhujrsp5t0hzf33lllnr3fe7e2pra3v24mzl8rrqtp3qul', + ); + }); + + it('can generate a SegWit 2-of-2 multisig address (via P2SH)', function () { + var pubKeys = [ + '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01', + '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9', + ].map(function (hex) { + return Buffer.from(hex, 'hex'); + }); + + var witnessScript = bitcoin.script.multisig.output.encode(2, pubKeys); // 2 of 2 + var redeemScript = bitcoin.script.witnessScriptHash.output.encode( + bitcoin.crypto.sha256(witnessScript), + ); + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey); + + assert.strictEqual(address, '3P4mrxQfmExfhxqjLnR2Ah4WES5EB1KBrN'); + }); + + it('can support the retrieval of transactions for an address (3rd party blockchain)', function (done) { + var keyPair = bitcoin.ECPair.makeRandom(); + var address = keyPair.getAddress(); + + dhttp( + { + method: 'POST', + url: 'https://api.ei8ht.com.au/3/addrtxs', + body: { + addrs: [address], + height: 0, + }, + }, + function (err, transactions) { + if (err) return done(err); + + // random private keys [probably] have no transactions + assert.strictEqual(Object.keys(transactions).length, 0); + done(); + }, + ); + }); + + // other networks + it('can generate a Testnet address', function () { + var testnet = bitcoin.networks.testnet; + var keyPair = bitcoin.ECPair.makeRandom({ network: testnet, rng: rng }); + var wif = keyPair.toWIF(); + var address = keyPair.getAddress(); + + assert.strictEqual(address, 'mubSzQNtZfDj1YdNP6pNDuZy6zs6GDn61L'); + assert.strictEqual( + wif, + 'cRgnQe9MUu1JznntrLaoQpB476M8PURvXVQB5R2eqms5tXnzNsrr', + ); + }); + + it('can generate a Litecoin address', function () { + var litecoin = bitcoin.networks.litecoin; + var keyPair = bitcoin.ECPair.makeRandom({ + network: litecoin, + rng: rng, + }); + var wif = keyPair.toWIF(); + var address = keyPair.getAddress(); + + assert.strictEqual(address, 'LZJSxZbjqJ2XVEquqfqHg1RQTDdfST5PTn'); + assert.strictEqual( + wif, + 'T7A4PUSgTDHecBxW1ZiYFrDNRih2o7M8Gf9xpoCgudPF9gDiNvuS', + ); + }); +}); diff --git a/web/bitcoincashjs-lib/test/integration/bip32.js b/web/bitcoincashjs-lib/test/integration/bip32.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/bip32.js @@ -0,0 +1,135 @@ +/* global describe, it */ + +var assert = require('assert'); +var bip39 = require('bip39'); +var bitcoin = require('../../'); + +describe('bitcoinjs-lib (BIP32)', function () { + it('can import a BIP32 testnet xpriv and export to WIF', function () { + var xpriv = + 'tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK'; + var node = bitcoin.HDNode.fromBase58(xpriv, bitcoin.networks.testnet); + + assert.equal( + node.keyPair.toWIF(), + 'cQfoY67cetFNunmBUX5wJiw3VNoYx3gG9U9CAofKE6BfiV1fSRw7', + ); + }); + + it('can export a BIP32 xpriv, then import it', function () { + var mnemonic = + 'praise you muffin lion enable neck grocery crumble super myself license ghost'; + var seed = bip39.mnemonicToSeed(mnemonic); + var node = bitcoin.HDNode.fromSeedBuffer(seed); + var string = node.toBase58(); + var restored = bitcoin.HDNode.fromBase58(string); + + assert.equal(node.getAddress(), restored.getAddress()); // same public key + assert.equal(node.keyPair.toWIF(), restored.keyPair.toWIF()); // same private key + }); + + it('can export a BIP32 xpub', function () { + var mnemonic = + 'praise you muffin lion enable neck grocery crumble super myself license ghost'; + var seed = bip39.mnemonicToSeed(mnemonic); + var node = bitcoin.HDNode.fromSeedBuffer(seed); + var string = node.neutered().toBase58(); + + assert.equal( + string, + 'xpub661MyMwAqRbcGhVeaVfEBA25e3cP9DsJQZoE8iep5fZSxy3TnPBNBgWnMZx56oreNc48ZoTkQfatNJ9VWnQ7ZcLZcVStpaXLTeG8bGrzX3n', + ); + }); + + it('can create a BIP32, bitcoin, account 0, external address', function () { + var path = "m/0'/0/0"; + var root = bitcoin.HDNode.fromSeedHex( + 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', + ); + + var child1 = root.derivePath(path); + + // option 2, manually + var child1b = root.deriveHardened(0).derive(0).derive(0); + + assert.equal(child1.getAddress(), '1JHyB1oPXufr4FXkfitsjgNB5yRY9jAaa7'); + assert.equal( + child1b.getAddress(), + '1JHyB1oPXufr4FXkfitsjgNB5yRY9jAaa7', + ); + }); + + it('can create a BIP44, bitcoin, account 0, external address', function () { + var root = bitcoin.HDNode.fromSeedHex( + 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', + ); + + var child1 = root.derivePath("m/44'/0'/0'/0/0"); + + // option 2, manually + var child1b = root + .deriveHardened(44) + .deriveHardened(0) + .deriveHardened(0) + .derive(0) + .derive(0); + + assert.equal(child1.getAddress(), '12Tyvr1U8A3ped6zwMEU5M8cx3G38sP5Au'); + assert.equal( + child1b.getAddress(), + '12Tyvr1U8A3ped6zwMEU5M8cx3G38sP5Au', + ); + }); + + it('can create a BIP49, bitcoin testnet, account 0, external address', function () { + var mnemonic = + 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about'; + var seed = bip39.mnemonicToSeed(mnemonic); + var root = bitcoin.HDNode.fromSeedBuffer(seed); + + var path = "m/49'/1'/0'/0/0"; + var child = root.derivePath(path); + + var keyhash = bitcoin.crypto.hash160(child.getPublicKeyBuffer()); + var scriptSig = bitcoin.script.witnessPubKeyHash.output.encode(keyhash); + var addressBytes = bitcoin.crypto.hash160(scriptSig); + var outputScript = + bitcoin.script.scriptHash.output.encode(addressBytes); + var address = bitcoin.address.fromOutputScript( + outputScript, + bitcoin.networks.testnet, + ); + + assert.equal(address, '2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2'); + }); + + it('can use BIP39 to generate BIP32 addresses', function () { + // var mnemonic = bip39.generateMnemonic() + var mnemonic = + 'praise you muffin lion enable neck grocery crumble super myself license ghost'; + assert(bip39.validateMnemonic(mnemonic)); + + var seed = bip39.mnemonicToSeed(mnemonic); + var root = bitcoin.HDNode.fromSeedBuffer(seed); + + // receive addresses + assert.strictEqual( + root.derivePath("m/0'/0/0").getAddress(), + '1AVQHbGuES57wD68AJi7Gcobc3RZrfYWTC', + ); + assert.strictEqual( + root.derivePath("m/0'/0/1").getAddress(), + '1Ad6nsmqDzbQo5a822C9bkvAfrYv9mc1JL', + ); + + // change addresses + assert.strictEqual( + root.derivePath("m/0'/1/0").getAddress(), + '1349KVc5NgedaK7DvuD4xDFxL86QN1Hvdn', + ); + assert.strictEqual( + root.derivePath("m/0'/1/1").getAddress(), + '1EAvj4edpsWcSer3duybAd4KiR4bCJW5J6', + ); + }); +}); diff --git a/web/bitcoincashjs-lib/test/integration/cltv.js b/web/bitcoincashjs-lib/test/integration/cltv.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/cltv.js @@ -0,0 +1,175 @@ +/* global describe, it */ + +var assert = require('assert'); +var bitcoin = require('../../'); +var testnetUtils = require('./_testnet'); + +var testnet = bitcoin.networks.testnet; +var alice = bitcoin.ECPair.fromWIF( + 'cScfkGjbzzoeewVWmU2hYPUHeVGJRDdFt7WhmrVVGkxpmPP8BHWe', + testnet, +); +var bob = bitcoin.ECPair.fromWIF( + 'cMkopUXKWsEzAjfa1zApksGRwjVpJRB3831qM9W4gKZsLwjHXA9x', + testnet, +); + +describe('bitcoinjs-lib (transactions w/ CLTV)', function () { + var hashType = bitcoin.Transaction.SIGHASH_ALL; + + // IF MTP > utcSeconds, aQ can redeem, ELSE bQ, aQ joint redeem + function cltvCheckSigOutput(aQ, bQ, utcSeconds) { + return bitcoin.script.compile([ + bitcoin.opcodes.OP_IF, + bitcoin.script.number.encode(utcSeconds), + bitcoin.opcodes.OP_CHECKLOCKTIMEVERIFY, + bitcoin.opcodes.OP_DROP, + + bitcoin.opcodes.OP_ELSE, + bQ.getPublicKeyBuffer(), + bitcoin.opcodes.OP_CHECKSIGVERIFY, + bitcoin.opcodes.OP_ENDIF, + + aQ.getPublicKeyBuffer(), + bitcoin.opcodes.OP_CHECKSIG, + ]); + } + + function utcNow() { + return Math.floor(Date.now() / 1000); + } + + // expiry past, {Alice's signature} OP_TRUE + it('can create (and broadcast via 3PBP) a Transaction where Alice can redeem the output after the expiry', function (done) { + this.timeout(30000); + + // three hours ago + var timeUtc = utcNow() - 3600 * 3; + var redeemScript = cltvCheckSigOutput(alice, bob, timeUtc); + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey, testnet); + + // fund the P2SH(CLTV) address + testnetUtils.faucet(address, 2e4, function (err, unspent) { + if (err) return done(err); + + var tx = new bitcoin.TransactionBuilder(testnet); + tx.setLockTime(timeUtc); + tx.addInput(unspent.txId, 0, 0xfffffffe); + tx.addOutput(testnetUtils.RETURN_ADDRESS, 1e4); + + var txRaw = tx.buildIncomplete(); + var signatureHash = txRaw.hashForSignature( + 0, + redeemScript, + hashType, + ); + + // {Alice's signature} OP_TRUE + var redeemScriptSig = bitcoin.script.scriptHash.input.encode( + [ + alice.sign(signatureHash).toScriptSignature(hashType), + bitcoin.opcodes.OP_TRUE, + ], + redeemScript, + ); + + txRaw.setInputScript(0, redeemScriptSig); + + testnetUtils.transactions.propagate(txRaw.toHex(), done); + }); + }); + + // expiry ignored, {Bob's signature} {Alice's signature} OP_FALSE + it('can create (and broadcast via 3PBP) a Transaction where Alice and Bob can redeem the output at any time', function (done) { + this.timeout(30000); + + // two hours ago + var timeUtc = utcNow() - 3600 * 2; + var redeemScript = cltvCheckSigOutput(alice, bob, timeUtc); + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey, testnet); + + // fund the P2SH(CLTV) address + testnetUtils.faucet(address, 2e4, function (err, unspent) { + if (err) return done(err); + + var tx = new bitcoin.TransactionBuilder(testnet); + tx.setLockTime(timeUtc); + tx.addInput(unspent.txId, 0, 0xfffffffe); + tx.addOutput(testnetUtils.RETURN_ADDRESS, 1e4); + + var txRaw = tx.buildIncomplete(); + var signatureHash = txRaw.hashForSignature( + 0, + redeemScript, + hashType, + ); + var redeemScriptSig = bitcoin.script.scriptHash.input.encode( + [ + alice.sign(signatureHash).toScriptSignature(hashType), + bob.sign(signatureHash).toScriptSignature(hashType), + bitcoin.opcodes.OP_FALSE, + ], + redeemScript, + ); + + txRaw.setInputScript(0, redeemScriptSig); + + testnetUtils.transactions.propagate(txRaw.toHex(), done); + }); + }); + + // expiry in the future, {Alice's signature} OP_TRUE + it('can create (but fail to broadcast via 3PBP) a Transaction where Alice attempts to redeem before the expiry', function (done) { + this.timeout(30000); + + // two hours from now + var timeUtc = utcNow() + 3600 * 2; + var redeemScript = cltvCheckSigOutput(alice, bob, timeUtc); + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey, testnet); + + // fund the P2SH(CLTV) address + testnetUtils.faucet(address, 2e4, function (err, unspent) { + if (err) return done(err); + + var tx = new bitcoin.TransactionBuilder(testnet); + tx.setLockTime(timeUtc); + tx.addInput(unspent.txId, 0, 0xfffffffe); + tx.addOutput(testnetUtils.RETURN_ADDRESS, 1e4); + + var txRaw = tx.buildIncomplete(); + var signatureHash = txRaw.hashForSignature( + 0, + redeemScript, + hashType, + ); + + // {Alice's signature} OP_TRUE + var redeemScriptSig = bitcoin.script.scriptHash.input.encode( + [ + alice.sign(signatureHash).toScriptSignature(hashType), + bitcoin.opcodes.OP_TRUE, + ], + redeemScript, + ); + + txRaw.setInputScript(0, redeemScriptSig); + + testnetUtils.transactions.propagate(txRaw.toHex(), function (err) { + assert.throws(function () { + if (err) throw err; + }, /Error: 64: non-final/); + + done(); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/integration/crypto.js b/web/bitcoincashjs-lib/test/integration/crypto.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/crypto.js @@ -0,0 +1,210 @@ +/* global describe, it */ + +var assert = require('assert'); +var async = require('async'); +var bigi = require('bigi'); +var bitcoin = require('../../'); +var mainnet = require('./_mainnet'); +var crypto = require('crypto'); + +var ecurve = require('ecurve'); +var secp256k1 = ecurve.getCurveByName('secp256k1'); + +describe('bitcoinjs-lib (crypto)', function () { + it('can recover a private key from duplicate R values', function (done) { + this.timeout(30000); + + var inputs = [ + { + txId: 'f4c16475f2a6e9c602e4a287f9db3040e319eb9ece74761a4b84bc820fbeef50', + vout: 0, + }, + { + txId: 'f4c16475f2a6e9c602e4a287f9db3040e319eb9ece74761a4b84bc820fbeef50', + vout: 1, + }, + ]; + + var txIds = inputs.map(function (x) { + return x.txId; + }); + + // first retrieve the relevant transactions + mainnet.transactions.get(txIds, function (err, results) { + assert.ifError(err); + + var transactions = {}; + results.forEach(function (tx) { + transactions[tx.txId] = bitcoin.Transaction.fromHex(tx.txHex); + }); + + var tasks = []; + + // now we need to collect/transform a bit of data from the selected inputs + inputs.forEach(function (input) { + var transaction = transactions[input.txId]; + var script = transaction.ins[input.vout].script; + var scriptChunks = bitcoin.script.decompile(script); + + assert( + bitcoin.script.pubKeyHash.input.check(scriptChunks), + 'Expected pubKeyHash script', + ); + + var prevOutTxId = Buffer.from(transaction.ins[input.vout].hash) + .reverse() + .toString('hex'); + var prevVout = transaction.ins[input.vout].index; + + tasks.push(function (callback) { + mainnet.transactions.get( + prevOutTxId, + function (err, result) { + if (err) return callback(err); + + var prevOut = bitcoin.Transaction.fromHex( + result.txHex, + ); + var prevOutScript = prevOut.outs[prevVout].script; + + var scriptSignature = + bitcoin.ECSignature.parseScriptSignature( + scriptChunks[0], + ); + var publicKey = bitcoin.ECPair.fromPublicKeyBuffer( + scriptChunks[1], + ); + + var m = transaction.hashForSignature( + input.vout, + prevOutScript, + scriptSignature.hashType, + ); + assert( + publicKey.verify(m, scriptSignature.signature), + 'Invalid m', + ); + + // store the required information + input.signature = scriptSignature.signature; + input.z = bigi.fromBuffer(m); + + return callback(); + }, + ); + }); + }); + + // finally, run the tasks, then on to the math + async.parallel(tasks, function (err) { + if (err) throw err; + + var n = secp256k1.n; + + for (var i = 0; i < inputs.length; ++i) { + for (var j = i + 1; j < inputs.length; ++j) { + var inputA = inputs[i]; + var inputB = inputs[j]; + + // enforce matching r values + assert.strictEqual( + inputA.signature.r.toString(), + inputB.signature.r.toString(), + ); + var r = inputA.signature.r; + var rInv = r.modInverse(n); + + var s1 = inputA.signature.s; + var s2 = inputB.signature.s; + var z1 = inputA.z; + var z2 = inputB.z; + + var zz = z1.subtract(z2).mod(n); + var ss = s1.subtract(s2).mod(n); + + // k = (z1 - z2) / (s1 - s2) + // d1 = (s1 * k - z1) / r + // d2 = (s2 * k - z2) / r + var k = zz.multiply(ss.modInverse(n)).mod(n); + var d1 = s1 + .multiply(k) + .mod(n) + .subtract(z1) + .mod(n) + .multiply(rInv) + .mod(n); + var d2 = s2 + .multiply(k) + .mod(n) + .subtract(z2) + .mod(n) + .multiply(rInv) + .mod(n); + + // enforce matching private keys + assert.strictEqual(d1.toString(), d2.toString()); + } + } + + done(); + }); + }); + }); + + it('can recover a BIP32 parent private key from the parent public key, and a derived, non-hardened child private key', function () { + function recoverParent(master, child) { + assert( + !master.keyPair.d, + 'You already have the parent private key', + ); + assert(child.keyPair.d, 'Missing child private key'); + + var curve = secp256k1; + var QP = master.keyPair.Q; + var serQP = master.keyPair.getPublicKeyBuffer(); + + var d1 = child.keyPair.d; + var d2; + var data = Buffer.alloc(37); + serQP.copy(data, 0); + + // search index space until we find it + for (var i = 0; i < bitcoin.HDNode.HIGHEST_BIT; ++i) { + data.writeUInt32BE(i, 33); + + // calculate I + var I = crypto + .createHmac('sha512', master.chainCode) + .update(data) + .digest(); + var IL = I.slice(0, 32); + var pIL = bigi.fromBuffer(IL); + + // See hdnode.js:273 to understand + d2 = d1.subtract(pIL).mod(curve.n); + + var Qp = new bitcoin.ECPair(d2).Q; + if (Qp.equals(QP)) break; + } + + var node = new bitcoin.HDNode( + new bitcoin.ECPair(d2), + master.chainCode, + master.network, + ); + node.depth = master.depth; + node.index = master.index; + node.masterFingerprint = master.masterFingerprint; + return node; + } + + var seed = crypto.randomBytes(32); + var master = bitcoin.HDNode.fromSeedBuffer(seed); + var child = master.derive(6); // m/6 + + // now for the recovery + var neuteredMaster = master.neutered(); + var recovered = recoverParent(neuteredMaster, child); + assert.strictEqual(recovered.toBase58(), master.toBase58()); + }); +}); diff --git a/web/bitcoincashjs-lib/test/integration/stealth.js b/web/bitcoincashjs-lib/test/integration/stealth.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/stealth.js @@ -0,0 +1,207 @@ +/* global describe, it */ + +var assert = require('assert'); +var bigi = require('bigi'); +var bitcoin = require('../../'); + +var ecurve = require('ecurve'); +var secp256k1 = ecurve.getCurveByName('secp256k1'); +var G = secp256k1.G; +var n = secp256k1.n; + +// vG = (dG \+ sha256(e * dG)G) +function stealthSend(e, Q) { + var eQ = Q.multiply(e); // shared secret + var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded())); + var cG = G.multiply(c); + var vG = new bitcoin.ECPair(null, Q.add(cG)); + + return vG; +} + +// v = (d + sha256(eG * d)) +function stealthReceive(d, eG) { + var eQ = eG.multiply(d); // shared secret + var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded())); + var v = new bitcoin.ECPair(d.add(c).mod(n)); + + return v; +} + +// d = (v - sha256(e * dG)) +function stealthRecoverLeaked(v, e, Q) { + var eQ = Q.multiply(e); // shared secret + var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded())); + var d = new bitcoin.ECPair(v.subtract(c).mod(n)); + + return d; +} + +// vG = (rG \+ sha256(e * dG)G) +function stealthDualSend(e, R, Q) { + var eQ = Q.multiply(e); // shared secret + var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded())); + var cG = G.multiply(c); + var vG = new bitcoin.ECPair(null, R.add(cG)); + + return vG; +} + +// vG = (rG \+ sha256(eG * d)G) +function stealthDualScan(d, R, eG) { + var eQ = eG.multiply(d); // shared secret + var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded())); + var cG = G.multiply(c); + var vG = new bitcoin.ECPair(null, R.add(cG)); + + return vG; +} + +// v = (r + sha256(eG * d)) +function stealthDualReceive(d, r, eG) { + var eQ = eG.multiply(d); // shared secret + var c = bigi.fromBuffer(bitcoin.crypto.sha256(eQ.getEncoded())); + var v = new bitcoin.ECPair(r.add(c).mod(n)); + + return v; +} + +describe('bitcoinjs-lib (crypto)', function () { + it('can generate a single-key stealth address', function () { + // XXX: should be randomly generated, see next test for example + var recipient = bitcoin.ECPair.fromWIF( + '5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss', + ); // private to recipient + var nonce = bitcoin.ECPair.fromWIF( + 'KxVqB96pxbw1pokzQrZkQbLfVBjjHFfp2mFfEp8wuEyGenLFJhM9', + ); // private to sender + + // ... recipient reveals public key (recipient.Q) to sender + var forSender = stealthSend(nonce.d, recipient.Q); + assert.equal( + forSender.getAddress(), + '1CcZWwCpACJL3AxqoDbwEt4JgDFuTHUspE', + ); + assert.throws(function () { + forSender.toWIF(); + }, /Error: Missing private key/); + + // ... sender reveals nonce public key (nonce.Q) to recipient + var forRecipient = stealthReceive(recipient.d, nonce.Q); + assert.equal( + forRecipient.getAddress(), + '1CcZWwCpACJL3AxqoDbwEt4JgDFuTHUspE', + ); + assert.equal( + forRecipient.toWIF(), + 'L1yjUN3oYyCXV3LcsBrmxCNTa62bZKWCybxVJMvqjMmmfDE8yk7n', + ); + + // sender and recipient, both derived same address + assert.equal(forSender.getAddress(), forRecipient.getAddress()); + }); + + it('can generate a single-key stealth address (randomly)', function () { + var recipient = bitcoin.ECPair.makeRandom(); // private to recipient + var nonce = bitcoin.ECPair.makeRandom(); // private to sender + + // ... recipient reveals public key (recipient.Q) to sender + var forSender = stealthSend(nonce.d, recipient.Q); + assert.throws(function () { + forSender.toWIF(); + }, /Error: Missing private key/); + + // ... sender reveals nonce public key (nonce.Q) to recipient + var forRecipient = stealthReceive(recipient.d, nonce.Q); + assert.doesNotThrow(function () { + forRecipient.toWIF(); + }); + + // sender and recipient, both derived same address + assert.equal(forSender.getAddress(), forRecipient.getAddress()); + }); + + it('can recover parent recipient.d, if a derived private key is leaked [and nonce was revealed]', function () { + var recipient = bitcoin.ECPair.makeRandom(); // private to recipient + var nonce = bitcoin.ECPair.makeRandom(); // private to sender + + // ... recipient reveals public key (recipient.Q) to sender + var forSender = stealthSend(nonce.d, recipient.Q); + assert.throws(function () { + forSender.toWIF(); + }, /Error: Missing private key/); + + // ... sender reveals nonce public key (nonce.Q) to recipient + var forRecipient = stealthReceive(recipient.d, nonce.Q); + assert.doesNotThrow(function () { + forRecipient.toWIF(); + }); + + // ... recipient accidentally leaks forRecipient.d on the blockchain + var leaked = stealthRecoverLeaked(forRecipient.d, nonce.d, recipient.Q); + assert.equal(leaked.toWIF(), recipient.toWIF()); + }); + + it('can generate a dual-key stealth address', function () { + // XXX: should be randomly generated, see next test for example + var recipient = bitcoin.ECPair.fromWIF( + '5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss', + ); // private to recipient + var scan = bitcoin.ECPair.fromWIF( + 'L5DkCk3xLLoGKncqKsWQTdaPSR4V8gzc14WVghysQGkdryRudjBM', + ); // private to scanner/recipient + var nonce = bitcoin.ECPair.fromWIF( + 'KxVqB96pxbw1pokzQrZkQbLfVBjjHFfp2mFfEp8wuEyGenLFJhM9', + ); // private to sender + + // ... recipient reveals public key(s) (recipient.Q, scan.Q) to sender + var forSender = stealthDualSend(nonce.d, recipient.Q, scan.Q); + assert.throws(function () { + forSender.toWIF(); + }, /Error: Missing private key/); + + // ... sender reveals nonce public key (nonce.Q) to scanner + var forScanner = stealthDualScan(scan.d, recipient.Q, nonce.Q); + assert.throws(function () { + forScanner.toWIF(); + }, /Error: Missing private key/); + + // ... scanner reveals relevant transaction + nonce public key (nonce.Q) to recipient + var forRecipient = stealthDualReceive(scan.d, recipient.d, nonce.Q); + assert.doesNotThrow(function () { + forRecipient.toWIF(); + }); + + // scanner, sender and recipient, all derived same address + assert.equal(forSender.getAddress(), forScanner.getAddress()); + assert.equal(forSender.getAddress(), forRecipient.getAddress()); + }); + + it('can generate a dual-key stealth address (randomly)', function () { + var recipient = bitcoin.ECPair.makeRandom(); // private to recipient + var scan = bitcoin.ECPair.makeRandom(); // private to scanner/recipient + var nonce = bitcoin.ECPair.makeRandom(); // private to sender + + // ... recipient reveals public key(s) (recipient.Q, scan.Q) to sender + var forSender = stealthDualSend(nonce.d, recipient.Q, scan.Q); + assert.throws(function () { + forSender.toWIF(); + }, /Error: Missing private key/); + + // ... sender reveals nonce public key (nonce.Q) to scanner + var forScanner = stealthDualScan(scan.d, recipient.Q, nonce.Q); + assert.throws(function () { + forScanner.toWIF(); + }, /Error: Missing private key/); + + // ... scanner reveals relevant transaction + nonce public key (nonce.Q) to recipient + var forRecipient = stealthDualReceive(scan.d, recipient.d, nonce.Q); + assert.doesNotThrow(function () { + forRecipient.toWIF(); + }); + + // scanner, sender and recipient, all derived same address + assert.equal(forSender.getAddress(), forScanner.getAddress()); + assert.equal(forSender.getAddress(), forRecipient.getAddress()); + }); +}); diff --git a/web/bitcoincashjs-lib/test/integration/transactions.js b/web/bitcoincashjs-lib/test/integration/transactions.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/integration/transactions.js @@ -0,0 +1,329 @@ +/* global describe, it */ + +var assert = require('assert'); +var bitcoin = require('../../'); +var dhttp = require('dhttp/200'); +var testnet = bitcoin.networks.testnet; +var testnetUtils = require('./_testnet'); + +function rng() { + return Buffer.from( + 'YT8dAtK4d16A3P1z+TpwB2jJ4aFH3g9M1EioIBkLEV4=', + 'base64', + ); +} + +describe('bitcoinjs-lib (transactions)', function () { + it('can create a 1-to-1 Transaction', function () { + var alice = bitcoin.ECPair.fromWIF( + 'L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy', + ); + var txb = new bitcoin.TransactionBuilder(); + + txb.addInput( + '61d520ccb74288c96bc1a2b20ea1c0d5a704776dd0164a396efec3ea7040349d', + 0, + ); // Alice's previous transaction output, has 15000 satoshis + txb.addOutput('1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP', 12000); + // (in)15000 - (out)12000 = (fee)3000, this is the miner fee + + txb.sign(0, alice); + + // prepare for broadcast to the Bitcoin network, see "can broadcast a Transaction" below + assert.strictEqual( + txb.build().toHex(), + '01000000019d344070eac3fe6e394a16d06d7704a7d5c0a10eb2a2c16bc98842b7cc20d561000000006b48304502210088828c0bdfcdca68d8ae0caeb6ec62cd3fd5f9b2191848edae33feb533df35d302202e0beadd35e17e7f83a733f5277028a9b453d525553e3f5d2d7a7aa8010a81d60121029f50f51d63b345039a290c94bffd3180c99ed659ff6ea6b1242bca47eb93b59fffffffff01e02e0000000000001976a91406afd46bcdfd22ef94ac122aa11f241244a37ecc88ac00000000', + ); + }); + + it('can create a 2-to-2 Transaction', function () { + var alice = bitcoin.ECPair.fromWIF( + 'L1Knwj9W3qK3qMKdTvmg3VfzUs3ij2LETTFhxza9LfD5dngnoLG1', + ); + var bob = bitcoin.ECPair.fromWIF( + 'KwcN2pT3wnRAurhy7qMczzbkpY5nXMW2ubh696UBc1bcwctTx26z', + ); + + var txb = new bitcoin.TransactionBuilder(); + txb.addInput( + 'b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c', + 6, + ); // Alice's previous transaction output, has 200000 satoshis + txb.addInput( + '7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730', + 0, + ); // Bob's previous transaction output, has 300000 satoshis + txb.addOutput('1CUNEBjYrCn2y1SdiUMohaKUi4wpP326Lb', 180000); + txb.addOutput('1JtK9CQw1syfWj1WtFMWomrYdV3W2tWBF9', 170000); + // (in)(200000 + 300000) - (out)(180000 + 150000) = (fee)170000, this is the miner fee + + txb.sign(1, bob); // Bob signs his input, which was the second input (1th) + txb.sign(0, alice); // Alice signs her input, which was the first input (0th) + + // prepare for broadcast to the Bitcoin network, see "can broadcast a Transaction" below + assert.strictEqual( + txb.build().toHex(), + '01000000024c94e48a870b85f41228d33cf25213dfcc8dd796e7211ed6b1f9a014809dbbb5060000006a473044022041450c258ce7cac7da97316bf2ea1ce66d88967c4df94f3e91f4c2a30f5d08cb02203674d516e6bb2b0afd084c3551614bd9cec3c2945231245e891b145f2d6951f0012103e05ce435e462ec503143305feb6c00e06a3ad52fbf939e85c65f3a765bb7baacffffffff3077d9de049574c3af9bc9c09a7c9db80f2d94caaf63988c9166249b955e867d000000006b483045022100aeb5f1332c79c446d3f906e4499b2e678500580a3f90329edf1ba502eec9402e022072c8b863f8c8d6c26f4c691ac9a6610aa4200edc697306648ee844cfbc089d7a012103df7940ee7cddd2f97763f67e1fb13488da3fbdd7f9c68ec5ef0864074745a289ffffffff0220bf0200000000001976a9147dd65592d0ab2fe0d0257d571abf032cd9db93dc88ac10980200000000001976a914c42e7ef92fdb603af844d064faad95db9bcdfd3d88ac00000000', + ); + }); + + it('can create (and broadcast via 3PBP) a typical Transaction', function (done) { + this.timeout(30000); + + var alice1 = bitcoin.ECPair.makeRandom({ network: testnet }); + var alice2 = bitcoin.ECPair.makeRandom({ network: testnet }); + var aliceChange = bitcoin.ECPair.makeRandom({ + rng: rng, + network: testnet, + }); + + // "simulate" on testnet that Alice has 2 unspent outputs + testnetUtils.faucetMany( + [ + { + address: alice1.getAddress(), + value: 5e4, + }, + { + address: alice2.getAddress(), + value: 7e4, + }, + ], + function (err, unspents) { + if (err) return done(err); + + var txb = new bitcoin.TransactionBuilder(testnet); + txb.addInput(unspents[0].txId, unspents[0].vout); // alice1 unspent + txb.addInput(unspents[1].txId, unspents[1].vout); // alice2 unspent + txb.addOutput('mwCwTceJvYV27KXBc3NJZys6CjsgsoeHmf', 8e4); // the actual "spend" + txb.addOutput(aliceChange.getAddress(), 1e4); // Alice's change + // (in)(4e4 + 2e4) - (out)(1e4 + 3e4) = (fee)2e4 = 20000, this is the miner fee + + // Alice signs each input with the respective private keys + txb.sign(0, alice1); + txb.sign(1, alice2); + + // build and broadcast to the Bitcoin Testnet network + dhttp( + { + method: 'POST', + url: 'https://api.ei8ht.com.au:9443/3/pushtx', + // url: 'http://tbtc.blockr.io/api/v1/tx/push', + body: txb.build().toHex(), + }, + done, + ); + // to build and broadcast to the actual Bitcoin network, see https://github.com/bitcoinjs/bitcoinjs-lib/issues/839 + }, + ); + }); + + it('can create (and broadcast via 3PBP) a Transaction with an OP_RETURN output', function (done) { + this.timeout(30000); + + var keyPair = bitcoin.ECPair.makeRandom({ network: testnet }); + var address = keyPair.getAddress(); + + testnetUtils.faucet(address, 5e4, function (err, unspent) { + if (err) return done(err); + + var txb = new bitcoin.TransactionBuilder(testnet); + var data = Buffer.from('bitcoinjs-lib', 'utf8'); + var dataScript = bitcoin.script.nullData.output.encode(data); + + txb.addInput(unspent.txId, unspent.vout); + txb.addOutput(dataScript, 1000); + txb.addOutput(testnetUtils.RETURN_ADDRESS, 4e4); + txb.sign(0, keyPair); + + // build and broadcast to the Bitcoin Testnet network + dhttp( + { + method: 'POST', + url: 'https://api.ei8ht.com.au:9443/3/pushtx', + body: txb.build().toHex(), + }, + done, + ); + }); + }); + + it('can create (and broadcast via 3PBP) a Transaction with a 2-of-4 P2SH(multisig) input', function (done) { + this.timeout(30000); + + var keyPairs = [ + '91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx', + '91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT', + '91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe', + '91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx9rcrL7', + ].map(function (wif) { + return bitcoin.ECPair.fromWIF(wif, testnet); + }); + var pubKeys = keyPairs.map(function (x) { + return x.getPublicKeyBuffer(); + }); + + var redeemScript = bitcoin.script.multisig.output.encode(2, pubKeys); + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey, testnet); + + testnetUtils.faucet(address, 2e4, function (err, unspent) { + if (err) return done(err); + + var txb = new bitcoin.TransactionBuilder(testnet); + txb.addInput(unspent.txId, unspent.vout); + txb.addOutput(testnetUtils.RETURN_ADDRESS, 1e4); + + txb.sign(0, keyPairs[0], redeemScript); + txb.sign(0, keyPairs[2], redeemScript); + + var tx = txb.build(); + + // build and broadcast to the Bitcoin Testnet network + testnetUtils.transactions.propagate(tx.toHex(), function (err) { + if (err) return done(err); + + testnetUtils.verify(address, tx.getId(), 1e4, done); + }); + }); + }); + + it('can create (and broadcast via 3PBP) a Transaction with a SegWit P2SH(P2WPKH) input', function (done) { + this.timeout(30000); + + var keyPair = bitcoin.ECPair.fromWIF( + 'cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87JcbXMTcA', + testnet, + ); + var pubKey = keyPair.getPublicKeyBuffer(); + var pubKeyHash = bitcoin.crypto.hash160(pubKey); + + var redeemScript = + bitcoin.script.witnessPubKeyHash.output.encode(pubKeyHash); + var redeemScriptHash = bitcoin.crypto.hash160(redeemScript); + + var scriptPubKey = + bitcoin.script.scriptHash.output.encode(redeemScriptHash); + var address = bitcoin.address.fromOutputScript(scriptPubKey, testnet); + + testnetUtils.faucet(address, 5e4, function (err, unspent) { + if (err) return done(err); + + var txb = new bitcoin.TransactionBuilder(testnet); + txb.addInput(unspent.txId, unspent.vout); + txb.addOutput(testnetUtils.RETURN_ADDRESS, 4e4); + txb.sign(0, keyPair, redeemScript, null, unspent.value); + + var tx = txb.build(); + + // build and broadcast to the Bitcoin Testnet network + testnetUtils.transactions.propagate(tx.toHex(), function (err) { + if (err) return done(err); + + testnetUtils.verify(address, tx.getId(), 1e4, done); + }); + }); + }); + + it('can create (and broadcast via 3PBP) a Transaction with a SegWit 3-of-4 P2SH(P2WSH(multisig)) input', function (done) { + this.timeout(50000); + + var keyPairs = [ + 'cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87JcbXMTcA', + 'cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87K7XCyj5v', + 'cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87KcLPVfXz', + 'cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87L7FgDCKE', + ].map(function (wif) { + return bitcoin.ECPair.fromWIF(wif, testnet); + }); + var pubKeys = keyPairs.map(function (x) { + return x.getPublicKeyBuffer(); + }); + + var witnessScript = bitcoin.script.multisig.output.encode(3, pubKeys); + var redeemScript = bitcoin.script.witnessScriptHash.output.encode( + bitcoin.crypto.sha256(witnessScript), + ); + var scriptPubKey = bitcoin.script.scriptHash.output.encode( + bitcoin.crypto.hash160(redeemScript), + ); + var address = bitcoin.address.fromOutputScript(scriptPubKey, testnet); + + testnetUtils.faucet(address, 6e4, function (err, unspent) { + if (err) return done(err); + + var txb = new bitcoin.TransactionBuilder(testnet); + txb.addInput(unspent.txId, unspent.vout); + txb.addOutput(testnetUtils.RETURN_ADDRESS, 4e4); + txb.sign( + 0, + keyPairs[0], + redeemScript, + null, + unspent.value, + witnessScript, + ); + txb.sign( + 0, + keyPairs[2], + redeemScript, + null, + unspent.value, + witnessScript, + ); + txb.sign( + 0, + keyPairs[3], + redeemScript, + null, + unspent.value, + witnessScript, + ); + + var tx = txb.build(); + + // build and broadcast to the Bitcoin Testnet network + testnetUtils.transactions.propagate(tx.toHex(), function (err) { + if (err) return done(err); + + testnetUtils.verify(address, tx.getId(), 4e4, done); + }); + }); + }); + + it('can verify Transaction signatures', function () { + var txHex = + '010000000321c5f7e7bc98b3feda84aad36a5c99a02bcb8823a2f3eccbcd5da209698b5c20000000006b48304502210099e021772830207cf7c55b69948d3b16b4dcbf1f55a9cd80ebf8221a169735f9022064d33f11d62cd28240b3862afc0b901adc9f231c7124dd19bdb30367b61964c50121032b4c06c06c3ec0b7fa29519dfa5aae193ee2cc35ca127f29f14ec605d62fb63dffffffff8a75ce85441ddb3f342708ee33cc8ed418b07d9ba9e0e7c4e1cccfe9f52d8a88000000006946304302207916c23dae212c95a920423902fa44e939fb3d542f4478a7b46e9cde53705800021f0d74e9504146e404c1b8f9cba4dff2d4782e3075491c9ed07ce4a7d1c4461a01210216c92abe433106491bdeb4a261226f20f5a4ac86220cc6e37655aac6bf3c1f2affffffffdfef93f69fe32e944fad79fa8f882b3a155d80383252348caba1a77a5abbf7ef000000006b483045022100faa6e9ca289b46c64764a624c59ac30d9abcf1d4a04c4de9089e67cbe0d300a502206930afa683f6807502de5c2431bf9a1fd333c8a2910a76304df0f3d23d83443f0121039e05da8b8ea4f9868ecebb25998c7701542986233f4401799551fbecf316b18fffffffff01ff4b0000000000001976a9146c86476d1d85cd60116cd122a274e6a570a5a35c88acc96d0700'; + var keyPairs = [ + '032b4c06c06c3ec0b7fa29519dfa5aae193ee2cc35ca127f29f14ec605d62fb63d', + '0216c92abe433106491bdeb4a261226f20f5a4ac86220cc6e37655aac6bf3c1f2a', + '039e05da8b8ea4f9868ecebb25998c7701542986233f4401799551fbecf316b18f', + ].map(function (q) { + return bitcoin.ECPair.fromPublicKeyBuffer(Buffer.from(q, 'hex')); + }); + + var tx = bitcoin.Transaction.fromHex(txHex); + + tx.ins.forEach(function (input, i) { + var keyPair = keyPairs[i]; + var prevOutScript = bitcoin.address.toOutputScript( + keyPair.getAddress(), + ); + var scriptSig = bitcoin.script.pubKeyHash.input.decode( + input.script, + ); + var ss = bitcoin.ECSignature.parseScriptSignature( + scriptSig.signature, + ); + var hash = tx.hashForSignature(i, prevOutScript, ss.hashType); + + assert.strictEqual( + scriptSig.pubKey.toString('hex'), + keyPair.getPublicKeyBuffer().toString('hex'), + ); + assert.strictEqual(keyPair.verify(hash, ss.signature), true); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/schnorr.js b/web/bitcoincashjs-lib/test/schnorr.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/schnorr.js @@ -0,0 +1,74 @@ +/* global describe, it */ + +var assert = require('assert'); +var bcrypto = require('../src/crypto'); +var schnorr = require('../src/schnorr'); +var sinon = require('sinon'); + +var BigInteger = require('bigi'); +var ECSignature = require('../src/ecsignature'); + +var curve = schnorr.__curve; + +var fixtures = require('./fixtures/schnorr.json'); + +describe('schnorr', function () { + schnorr.__useRFC6979(false); + + describe('sign', function () { + fixtures.sign.forEach(function (d) { + it( + 'produces a deterministic signature for "' + d.m + '"', + function () { + var x = BigInteger.fromHex(d.x); + var m = Buffer.from(d.m, 'hex'); + var signature = schnorr.sign(m, x).toRSBuffer(); + + assert.strictEqual( + signature.toString('hex'), + d.sig.toLowerCase(), + ); + }, + ); + }); + }); + + describe('verify', function () { + fixtures.sign.forEach(function (d) { + it('verifies own signature for "' + d.m + '"', function () { + var x = BigInteger.fromHex(d.x); + var P = curve.G.multiply(x); + var m = Buffer.from(d.m, 'hex'); + var signature = schnorr.sign(m, x); + + assert(schnorr.verify(m, signature, P)); + }); + }); + + fixtures.valid.forEach(function (d) { + it('verifies a valid signature for "' + d.m + '"', function () { + var P = schnorr.fromCompressedPoint(Buffer.from(d.P, 'hex')); + var m = Buffer.from(d.m, 'hex'); + var signature = ECSignature.fromRSBuffer( + Buffer.from(d.sig, 'hex'), + ); + + assert(schnorr.verify(m, signature, P)); + }); + }); + + fixtures.invalid.forEach(function (d) { + it('fails to verify with "' + d.m + '"', function () { + var P = schnorr.fromCompressedPoint(Buffer.from(d.P, 'hex')); + var m = Buffer.from(d.m, 'hex'); + var signature = ECSignature.fromRSBuffer( + Buffer.from(d.sig, 'hex'), + ); + + assert.strictEqual(schnorr.verify(m, signature, P), false); + }); + }); + }); + + schnorr.__useRFC6979(false); +}); diff --git a/web/bitcoincashjs-lib/test/script.js b/web/bitcoincashjs-lib/test/script.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/script.js @@ -0,0 +1,193 @@ +/* global describe, it */ + +var assert = require('assert'); +var bscript = require('../src/script'); +var minimalData = require('@psf/minimaldata'); + +var fixtures = require('./fixtures/script.json'); +var fixtures2 = require('./fixtures/templates.json'); + +describe('script', function () { + // TODO + describe('isCanonicalPubKey', function () { + it('rejects if not provided a Buffer', function () { + assert.strictEqual(false, bscript.isCanonicalPubKey(0)); + }); + it('rejects smaller than 33', function () { + for (var i = 0; i < 33; i++) { + assert.strictEqual( + false, + bscript.isCanonicalPubKey(Buffer.from('', i)), + ); + } + }); + }); + describe.skip('isCanonicalSignature', function () {}); + + describe('fromASM/toASM', function () { + fixtures.valid.forEach(function (f) { + it('encodes/decodes ' + f.asm, function () { + var script = bscript.fromASM(f.asm); + assert.strictEqual(bscript.toASM(script), f.asm); + }); + }); + + fixtures.invalid.fromASM.forEach(function (f) { + it('throws ' + f.description, function () { + assert.throws(function () { + bscript.fromASM(f.script); + }, new RegExp(f.description)); + }); + }); + }); + + describe('fromASM/toASM (templates)', function () { + fixtures2.valid.forEach(function (f) { + if (f.inputHex) { + var ih = bscript.toASM(Buffer.from(f.inputHex, 'hex')); + + it('encodes/decodes ' + ih, function () { + var script = bscript.fromASM(f.input); + assert.strictEqual(script.toString('hex'), f.inputHex); + assert.strictEqual(bscript.toASM(script), f.input); + }); + } + + if (f.outputHex) { + it('encodes/decodes ' + f.output, function () { + var script = bscript.fromASM(f.output); + assert.strictEqual(script.toString('hex'), f.outputHex); + assert.strictEqual(bscript.toASM(script), f.output); + }); + } + }); + }); + + describe('isPushOnly', function () { + fixtures.valid.forEach(function (f) { + it('returns ' + !!f.stack + ' for ' + f.asm, function () { + var script = bscript.fromASM(f.asm); + var chunks = bscript.decompile(script); + + assert.strictEqual(bscript.isPushOnly(chunks), !!f.stack); + }); + }); + }); + + describe('toStack', function () { + fixtures.valid.forEach(function (f) { + it('returns ' + !!f.stack + ' for ' + f.asm, function () { + if (!f.stack || !f.asm) return; + + var script = bscript.fromASM(f.asm); + + var stack = bscript.toStack(script); + assert.deepEqual( + stack.map(function (x) { + return x.toString('hex'); + }), + f.stack, + ); + + assert.equal( + bscript.toASM(bscript.compile(stack)), + f.asm, + 'should rebuild same script from stack', + ); + }); + }); + }); + + describe('compile (via fromASM)', function () { + fixtures.valid.forEach(function (f) { + it('(' + f.type + ') compiles ' + f.asm, function () { + var scriptSig = bscript.fromASM(f.asm); + + assert.strictEqual(scriptSig.toString('hex'), f.script); + + if (f.nonstandard) { + var scriptSigNS = bscript.fromASM(f.nonstandard.scriptSig); + + assert.strictEqual(scriptSigNS.toString('hex'), f.script); + } + }); + }); + }); + + describe('decompile', function () { + fixtures.valid.forEach(function (f) { + it('decompiles ' + f.asm, function () { + var chunks = bscript.decompile(Buffer.from(f.script, 'hex')); + + assert.strictEqual( + bscript.compile(chunks).toString('hex'), + f.script, + ); + assert.strictEqual(bscript.toASM(chunks), f.asm); + + if (f.nonstandard) { + var chunksNS = bscript.decompile( + Buffer.from(f.nonstandard.scriptSigHex, 'hex'), + ); + + assert.strictEqual( + bscript.compile(chunksNS).toString('hex'), + f.script, + ); + + // toASM converts verbatim, only `compile` transforms the script to a minimalpush compliant script + assert.strictEqual( + bscript.toASM(chunksNS), + f.nonstandard.scriptSig, + ); + } + }); + }); + + fixtures.invalid.decompile.forEach(function (f) { + it( + 'decompiles ' + + f.script + + ' to [] because of "' + + f.description + + '"', + function () { + var chunks = bscript.decompile( + Buffer.from(f.script, 'hex'), + ); + + assert.strictEqual(chunks.length, 0); + }, + ); + }); + }); + + describe('SCRIPT_VERIFY_MINIMALDATA policy', function () { + fixtures.valid.forEach(function (f) { + it('compliant for ' + f.type + ' scriptSig ' + f.asm, function () { + var script = Buffer.from(f.script, 'hex'); + + assert(minimalData(script)); + }); + }); + + function testEncodingForSize(i) { + it('compliant for data PUSH of length ' + i, function () { + var buffer = Buffer.alloc(i); + var script = bscript.compile([buffer]); + + assert( + minimalData(script), + 'Failed for ' + + i + + ' length script: ' + + script.toString('hex'), + ); + }); + } + + for (var i = 0; i < 520; ++i) { + testEncodingForSize(i); + } + }); +}); diff --git a/web/bitcoincashjs-lib/test/script_number.js b/web/bitcoincashjs-lib/test/script_number.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/script_number.js @@ -0,0 +1,30 @@ +/* global describe, it */ + +var assert = require('assert'); +var scriptNumber = require('../src/script_number'); +var fixtures = require('./fixtures/script_number.json'); + +describe('script-number', function () { + describe('decode', function () { + fixtures.forEach(function (f) { + it(f.hex + ' returns ' + f.number, function () { + var actual = scriptNumber.decode( + Buffer.from(f.hex, 'hex'), + f.bytes, + ); + + assert.strictEqual(actual, f.number); + }); + }); + }); + + describe('encode', function () { + fixtures.forEach(function (f) { + it(f.number + ' returns ' + f.hex, function () { + var actual = scriptNumber.encode(f.number); + + assert.strictEqual(actual.toString('hex'), f.hex); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/templates.js b/web/bitcoincashjs-lib/test/templates.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/templates.js @@ -0,0 +1,611 @@ +/* global describe, it */ + +var assert = require('assert'); +var bcrypto = require('../src/crypto'); +var bscript = require('../src/script'); +var btemplates = require('../src/templates'); +var ops = require('@psf/bitcoincash-ops'); + +var fixtures = require('./fixtures/templates.json'); + +function fromHex(x) { + return Buffer.from(x, 'hex'); +} +function toHex(x) { + return x.toString('hex'); +} + +describe('script-templates', function () { + describe('classifyInput', function () { + fixtures.valid.forEach(function (f) { + if (!f.input) return; + + it('classifies ' + f.input + ' as ' + f.type, function () { + var input = bscript.fromASM(f.input); + var type = btemplates.classifyInput(input); + + assert.strictEqual(type, f.type); + }); + }); + + fixtures.valid.forEach(function (f) { + if (!f.input) return; + if (!f.typeIncomplete) return; + + it( + 'classifies incomplete ' + f.input + ' as ' + f.typeIncomplete, + function () { + var input = bscript.fromASM(f.input); + var type = btemplates.classifyInput(input, true); + + assert.strictEqual(type, f.typeIncomplete); + }, + ); + }); + }); + + describe('classifyOutput', function () { + fixtures.valid.forEach(function (f) { + if (!f.output) return; + + it('classifies ' + f.output + ' as ' + f.type, function () { + var output = bscript.fromASM(f.output); + var type = btemplates.classifyOutput(output); + + assert.strictEqual(type, f.type); + }); + }); + }); + [ + 'pubKey', + 'pubKeyHash', + 'scriptHash', + 'witnessPubKeyHash', + 'witnessScriptHash', + 'multisig', + 'nullData', + 'witnessCommitment', + ].forEach(function (name) { + var inputType = btemplates[name].input; + var outputType = btemplates[name].output; + + describe(name + '.input.check', function () { + fixtures.valid.forEach(function (f) { + if (name.toLowerCase() === btemplates.types.P2WPKH) return; + if (name.toLowerCase() === btemplates.types.P2WSH) return; + var expected = name.toLowerCase() === f.type.toLowerCase(); + + if (inputType && f.input) { + var input = bscript.fromASM(f.input); + + it('returns ' + expected + ' for ' + f.input, function () { + assert.strictEqual(inputType.check(input), expected); + }); + + if (f.typeIncomplete) { + var expectedIncomplete = + name.toLowerCase() === f.typeIncomplete; + + it( + 'returns ' + expected + ' for ' + f.input, + function () { + assert.strictEqual( + inputType.check(input, true), + expectedIncomplete, + ); + }, + ); + } + } + }); + + if (!fixtures.invalid[name]) return; + + fixtures.invalid[name].inputs.forEach(function (f) { + if (!f.input && !f.inputHex) return; + + it( + 'returns false for ' + + f.description + + ' (' + + (f.input || f.inputHex) + + ')', + function () { + var input; + + if (f.input) { + input = bscript.fromASM(f.input); + } else { + input = Buffer.from(f.inputHex, 'hex'); + } + + assert.strictEqual(inputType.check(input), false); + }, + ); + }); + }); + + describe(name + '.output.check', function () { + fixtures.valid.forEach(function (f) { + var expected = name.toLowerCase() === f.type; + + if (outputType && f.output) { + it('returns ' + expected + ' for ' + f.output, function () { + var output = bscript.fromASM(f.output); + + if ( + name.toLowerCase() === 'nulldata' && + f.type === btemplates.types.WITNESS_COMMITMENT + ) + return; + if ( + name.toLowerCase() === 'witnesscommitment' && + f.type === btemplates.types.NULLDATA + ) + return; + assert.strictEqual(outputType.check(output), expected); + }); + } + }); + + if (!fixtures.invalid[name]) return; + + fixtures.invalid[name].outputs.forEach(function (f) { + if (!f.output && !f.outputHex) return; + + it( + 'returns false for ' + + f.description + + ' (' + + (f.output || f.outputHex) + + ')', + function () { + var output; + + if (f.output) { + output = bscript.fromASM(f.output); + } else { + output = Buffer.from(f.outputHex, 'hex'); + } + + assert.strictEqual(outputType.check(output), false); + }, + ); + }); + }); + }); + + describe('pubKey.input', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'pubkey') return; + + var signature = Buffer.from(f.signature, 'hex'); + var input = btemplates.pubKey.input.encode(signature); + + it('encodes to ' + f.input, function () { + assert.strictEqual(bscript.toASM(input), f.input); + }); + + it('decodes to ' + f.signature, function () { + assert.deepEqual( + btemplates.pubKey.input.decode(input), + signature, + ); + }); + }); + }); + + describe('pubKey.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'pubkey') return; + + var pubKey = Buffer.from(f.pubKey, 'hex'); + var output = btemplates.pubKey.output.encode(pubKey); + + it('encodes to ' + f.output, function () { + assert.strictEqual(bscript.toASM(output), f.output); + }); + + it('decodes to ' + f.pubKey, function () { + assert.deepEqual( + btemplates.pubKey.output.decode(output), + pubKey, + ); + }); + }); + }); + + describe('pubKeyHash.input', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'pubkeyhash') return; + + var pubKey = Buffer.from(f.pubKey, 'hex'); + var signature = Buffer.from(f.signature, 'hex'); + var input = btemplates.pubKeyHash.input.encode(signature, pubKey); + + it('encodes to ' + f.input, function () { + assert.strictEqual(bscript.toASM(input), f.input); + }); + + it('decodes to original arguments', function () { + assert.deepEqual(btemplates.pubKeyHash.input.decode(input), { + signature: signature, + pubKey: pubKey, + }); + }); + }); + }); + + describe('pubKeyHash.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'pubkeyhash') return; + + var pubKey = Buffer.from(f.pubKey, 'hex'); + var pubKeyHash = bcrypto.hash160(pubKey); + var output = btemplates.pubKeyHash.output.encode(pubKeyHash); + + it('encodes to ' + f.output, function () { + assert.strictEqual(bscript.toASM(output), f.output); + }); + + it('decodes to ' + pubKeyHash.toString('hex'), function () { + assert.deepEqual( + btemplates.pubKeyHash.output.decode(output), + pubKeyHash, + ); + }); + }); + + fixtures.invalid.pubKeyHash.outputs.forEach(function (f) { + if (!f.hash) return; + var hash = Buffer.from(f.hash, 'hex'); + + it('throws on ' + f.exception, function () { + assert.throws(function () { + btemplates.pubKeyHash.output.encode(hash); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('multisig.input', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'multisig' && f.typeIncomplete !== 'multisig') + return; + var allowIncomplete = f.typeIncomplete !== undefined; + + var signatures = f.signatures.map(function (signature) { + return signature ? Buffer.from(signature, 'hex') : ops.OP_0; + }); + + var input = btemplates.multisig.input.encode(signatures); + + it('encodes to ' + f.input, function () { + assert.strictEqual(bscript.toASM(input), f.input); + }); + + it( + 'decodes to ' + + signatures.map(function (x) { + return x === ops.OP_0 ? 'OP_0' : x.toString('hex'); + }), + function () { + assert.deepEqual( + btemplates.multisig.input.decode( + input, + allowIncomplete, + ), + signatures, + ); + }, + ); + }); + + fixtures.invalid.multisig.inputs.forEach(function (f) { + if (!f.output) return; + var output = bscript.fromASM(f.output); + + it('throws on ' + f.exception, function () { + var signatures = f.signatures.map(function (signature) { + return signature ? Buffer.from(signature, 'hex') : ops.OP_0; + }); + + assert.throws(function () { + btemplates.multisig.input.encode(signatures, output); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('multisig.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'multisig') return; + + var pubKeys = f.pubKeys.map(function (p) { + return Buffer.from(p, 'hex'); + }); + var m = pubKeys.length; + + var output = btemplates.multisig.output.encode(m, pubKeys); + + it('encodes ' + f.output, function () { + assert.strictEqual(bscript.toASM(output), f.output); + }); + + it('decodes to original arguments', function () { + assert.deepEqual(btemplates.multisig.output.decode(output), { + m: m, + pubKeys: pubKeys, + }); + }); + }); + + fixtures.invalid.multisig.outputs.forEach(function (f) { + if (!f.pubKeys) return; + var pubKeys = f.pubKeys.map(function (p) { + return Buffer.from(p, 'hex'); + }); + + it('throws on ' + f.exception, function () { + assert.throws(function () { + btemplates.multisig.output.encode(f.m, pubKeys); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('scriptHash.input', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'scripthash') return; + + var redeemScriptSig = bscript.fromASM(f.redeemScriptSig); + var redeemScript = bscript.fromASM(f.redeemScript); + var input = btemplates.scriptHash.input.encode( + redeemScriptSig, + redeemScript, + ); + + it('encodes to ' + f.output, function () { + if (f.input) { + assert.strictEqual(bscript.toASM(input), f.input); + } else { + assert.strictEqual(input.toString('hex'), f.inputHex); + } + }); + + it('decodes to original arguments', function () { + assert.deepEqual(btemplates.scriptHash.input.decode(input), { + redeemScriptSig: redeemScriptSig, + redeemScript: redeemScript, + }); + }); + }); + }); + + describe('scriptHash.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'scripthash') return; + if (!f.output) return; + + var redeemScript = bscript.fromASM(f.redeemScript); + var scriptHash = bcrypto.hash160(redeemScript); + var output = btemplates.scriptHash.output.encode(scriptHash); + + it('encodes to ' + f.output, function () { + assert.strictEqual(bscript.toASM(output), f.output); + }); + + it('decodes to ' + scriptHash.toString('hex'), function () { + assert.deepEqual( + btemplates.scriptHash.output.decode(output), + scriptHash, + ); + }); + }); + + fixtures.invalid.scriptHash.outputs.forEach(function (f) { + if (!f.hash) return; + var hash = Buffer.from(f.hash, 'hex'); + + it('throws on ' + f.exception, function () { + assert.throws(function () { + btemplates.scriptHash.output.encode(hash); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('witnessPubKeyHash.input', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'pubkeyhash' && f.type !== 'witnesspubkeyhash') + return; + if (!f.inputStack) return; + + var pubKey = Buffer.from(f.pubKey, 'hex'); + var signature = Buffer.from(f.signature, 'hex'); + + it('encodes to ' + f.input, function () { + var inputStack = btemplates.witnessPubKeyHash.input.encodeStack( + signature, + pubKey, + ); + + assert.deepEqual(inputStack.map(toHex), f.inputStack); + }); + + it('decodes to original arguments', function () { + var fInputStack = f.inputStack.map(fromHex); + + assert.deepEqual( + btemplates.witnessPubKeyHash.input.decodeStack(fInputStack), + { + signature: signature, + pubKey: pubKey, + }, + ); + }); + }); + }); + + describe('witnessPubKeyHash.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'witnesspubkeyhash') return; + if (!f.output) return; + + var pubKey = Buffer.from(f.pubKey, 'hex'); + var pubKeyHash = bcrypto.hash160(pubKey); + var output = btemplates.witnessPubKeyHash.output.encode(pubKeyHash); + + it('encodes to ' + f.output, function () { + assert.strictEqual(bscript.toASM(output), f.output); + }); + + it('decodes to ' + pubKeyHash.toString('hex'), function () { + assert.deepEqual( + btemplates.witnessPubKeyHash.output.decode(output), + pubKeyHash, + ); + }); + }); + + fixtures.invalid.witnessPubKeyHash.outputs.forEach(function (f) { + if (!f.hash) return; + var hash = Buffer.from(f.hash, 'hex'); + + it('throws on ' + f.exception, function () { + assert.throws(function () { + btemplates.witnessPubKeyHash.output.encode(hash); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('witnessScriptHash.input', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'witnessscripthash') return; + if (!f.inputStack || !f.witnessData) return; + + var witnessData = f.witnessData.map(fromHex); + var witnessScript = bscript.fromASM( + f.witnessScript || f.redeemScript, + ); + + it('encodes to ' + f.input, function () { + var inputStack = btemplates.witnessScriptHash.input.encodeStack( + witnessData, + witnessScript, + ); + + assert.deepEqual(inputStack.map(toHex), f.inputStack); + }); + + it('decodes to original arguments', function () { + var result = btemplates.witnessScriptHash.input.decodeStack( + f.inputStack.map(fromHex), + ); + + assert.deepEqual(result.witnessData.map(toHex), f.witnessData); + assert.strictEqual( + bscript.toASM(result.witnessScript), + f.witnessScript, + ); + }); + }); + }); + + describe('witnessScriptHash.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'witnessscripthash') return; + if (!f.output) return; + + var witnessScriptPubKey = bscript.fromASM(f.witnessScript); + var scriptHash = bcrypto.hash256(witnessScriptPubKey); + var output = btemplates.witnessScriptHash.output.encode(scriptHash); + + it('encodes to ' + f.output, function () { + assert.strictEqual(bscript.toASM(output), f.output); + }); + + it('decodes to ' + scriptHash.toString('hex'), function () { + assert.deepEqual( + btemplates.witnessScriptHash.output.decode(output), + scriptHash, + ); + }); + }); + + fixtures.invalid.witnessScriptHash.outputs.forEach(function (f) { + if (!f.hash) return; + var hash = Buffer.from(f.hash, 'hex'); + + it('throws on ' + f.exception, function () { + assert.throws(function () { + btemplates.witnessScriptHash.output.encode(hash); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('witnessCommitment.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'witnesscommitment') return; + if (!f.scriptPubKey) return; + + var commitment = Buffer.from(f.witnessCommitment, 'hex'); + var scriptPubKey = + btemplates.witnessCommitment.output.encode(commitment); + + it('encodes to ' + f.scriptPubKey, function () { + assert.strictEqual(bscript.toASM(scriptPubKey), f.scriptPubKey); + }); + + it('decodes to ' + commitment.toString('hex'), function () { + assert.deepEqual( + btemplates.witnessCommitment.output.decode(scriptPubKey), + commitment, + ); + }); + }); + + fixtures.invalid.witnessCommitment.outputs.forEach(function (f) { + if (f.commitment) { + var hash = Buffer.from(f.commitment, 'hex'); + it('throws on bad encode data', function () { + assert.throws(function () { + btemplates.witnessCommitment.output.encode(hash); + }, new RegExp(f.exception)); + }); + } + + if (f.scriptPubKeyHex) { + it('.decode throws on ' + f.description, function () { + assert.throws(function () { + btemplates.witnessCommitment.output.decode( + Buffer.from(f.scriptPubKeyHex, 'hex'), + ); + }, new RegExp(f.exception)); + }); + } + }); + }); + + describe('nullData.output', function () { + fixtures.valid.forEach(function (f) { + if (f.type !== 'nulldata') return; + + var data = Buffer.from(f.data, 'hex'); + var output = btemplates.nullData.output.encode(data); + + it('encodes to ' + f.output, function () { + assert.strictEqual(bscript.toASM(output), f.output); + }); + + it('decodes to ' + f.data, function () { + assert.deepEqual( + btemplates.nullData.output.decode(output), + data, + ); + }); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/transaction.js b/web/bitcoincashjs-lib/test/transaction.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/transaction.js @@ -0,0 +1,352 @@ +/* global describe, it, beforeEach */ + +var assert = require('assert'); +var bscript = require('../src/script'); +var fixtures = require('./fixtures/transaction'); +var Transaction = require('../src/transaction'); + +describe('Transaction', function () { + function fromRaw(raw, noWitness) { + var tx = new Transaction(); + tx.version = raw.version; + tx.locktime = raw.locktime; + + raw.ins.forEach(function (txIn, i) { + var txHash = Buffer.from(txIn.hash, 'hex'); + var scriptSig; + + if (txIn.data) { + scriptSig = Buffer.from(txIn.data, 'hex'); + } else if (txIn.script) { + scriptSig = bscript.fromASM(txIn.script); + } + + tx.addInput(txHash, txIn.index, txIn.sequence, scriptSig); + + if (!noWitness && txIn.witness) { + var witness = txIn.witness.map(function (x) { + return Buffer.from(x, 'hex'); + }); + + tx.setWitness(i, witness); + } + }); + + raw.outs.forEach(function (txOut) { + var script; + + if (txOut.data) { + script = Buffer.from(txOut.data, 'hex'); + } else if (txOut.script) { + script = bscript.fromASM(txOut.script); + } + + tx.addOutput(script, txOut.value); + }); + + return tx; + } + + describe('fromBuffer/fromHex', function () { + function importExport(f) { + var id = f.id || f.hash; + var txHex = f.hex || f.txHex; + + it('imports ' + f.description + ' (' + id + ')', function () { + var actual = Transaction.fromHex(txHex); + + assert.strictEqual(actual.toHex(), txHex); + }); + + if (f.whex) { + it( + 'imports ' + f.description + ' (' + id + ') as witness', + function () { + var actual = Transaction.fromHex(f.whex); + + assert.strictEqual(actual.toHex(), f.whex); + }, + ); + } + } + + fixtures.valid.forEach(importExport); + fixtures.hashForSignature.forEach(importExport); + fixtures.hashForWitnessV0.forEach(importExport); + + fixtures.invalid.fromBuffer.forEach(function (f) { + it('throws on ' + f.exception, function () { + assert.throws(function () { + Transaction.fromHex(f.hex); + }, new RegExp(f.exception)); + }); + }); + + it('.version should be interpreted as an int32le', function () { + var txHex = 'ffffffff0000ffffffff'; + var tx = Transaction.fromHex(txHex); + assert.equal(-1, tx.version); + assert.equal(0xffffffff, tx.locktime); + }); + }); + + describe('toBuffer/toHex', function () { + fixtures.valid.forEach(function (f) { + it('exports ' + f.description + ' (' + f.id + ')', function () { + var actual = fromRaw(f.raw, true); + assert.strictEqual(actual.toHex(), f.hex); + }); + + if (f.whex) { + it( + 'exports ' + f.description + ' (' + f.id + ') as witness', + function () { + var wactual = fromRaw(f.raw); + assert.strictEqual(wactual.toHex(), f.whex); + }, + ); + } + }); + + it('accepts target Buffer and offset parameters', function () { + var f = fixtures.valid[0]; + var actual = fromRaw(f.raw); + var byteLength = actual.byteLength(); + + var target = Buffer.alloc(byteLength * 2); + var a = actual.toBuffer(target, 0); + var b = actual.toBuffer(target, byteLength); + + assert.strictEqual(a.length, byteLength); + assert.strictEqual(b.length, byteLength); + assert.strictEqual(a.toString('hex'), f.hex); + assert.strictEqual(b.toString('hex'), f.hex); + assert.deepEqual(a, b); + assert.deepEqual(a, target.slice(0, byteLength)); + assert.deepEqual(b, target.slice(byteLength)); + }); + }); + + describe('hasWitnesses', function () { + fixtures.valid.forEach(function (f) { + it( + 'detects if the transaction has witnesses: ' + + (f.whex ? 'true' : 'false'), + function () { + assert.strictEqual( + Transaction.fromHex( + f.whex ? f.whex : f.hex, + ).hasWitnesses(), + !!f.whex, + ); + }, + ); + }); + }); + + describe('weight/virtualSize', function () { + it('computes virtual size', function () { + fixtures.valid.forEach(function (f) { + var transaction = Transaction.fromHex(f.whex ? f.whex : f.hex); + + assert.strictEqual(transaction.virtualSize(), f.virtualSize); + }); + }); + + it('computes weight', function () { + fixtures.valid.forEach(function (f) { + var transaction = Transaction.fromHex(f.whex ? f.whex : f.hex); + + assert.strictEqual(transaction.weight(), f.weight); + }); + }); + }); + + describe('addInput', function () { + var prevTxHash; + beforeEach(function () { + prevTxHash = Buffer.from( + 'ffffffff00ffff000000000000000000000000000000000000000000101010ff', + 'hex', + ); + }); + + it('returns an index', function () { + var tx = new Transaction(); + assert.strictEqual(tx.addInput(prevTxHash, 0), 0); + assert.strictEqual(tx.addInput(prevTxHash, 0), 1); + }); + + it('defaults to empty script, witness and 0xffffffff SEQUENCE number', function () { + var tx = new Transaction(); + tx.addInput(prevTxHash, 0); + + assert.strictEqual(tx.ins[0].script.length, 0); + assert.strictEqual(tx.ins[0].witness.length, 0); + assert.strictEqual(tx.ins[0].sequence, 0xffffffff); + }); + + fixtures.invalid.addInput.forEach(function (f) { + it('throws on ' + f.exception, function () { + var tx = new Transaction(); + var hash = Buffer.from(f.hash, 'hex'); + + assert.throws(function () { + tx.addInput(hash, f.index); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('addOutput', function () { + it('returns an index', function () { + var tx = new Transaction(); + assert.strictEqual(tx.addOutput(Buffer.alloc(0), 0), 0); + assert.strictEqual(tx.addOutput(Buffer.alloc(0), 0), 1); + }); + }); + + describe('clone', function () { + fixtures.valid.forEach(function (f) { + var actual, expected; + + beforeEach(function () { + expected = Transaction.fromHex(f.hex); + actual = expected.clone(); + }); + + it('should have value equality', function () { + assert.deepEqual(actual, expected); + }); + + it('should not have reference equality', function () { + assert.notEqual(actual, expected); + }); + }); + }); + + describe('getHash/getId', function () { + function verify(f) { + it( + 'should return the id for ' + f.id + '(' + f.description + ')', + function () { + var tx = Transaction.fromHex(f.whex || f.hex); + + assert.strictEqual(tx.getHash().toString('hex'), f.hash); + assert.strictEqual(tx.getId(), f.id); + }, + ); + } + + fixtures.valid.forEach(verify); + }); + + describe('isCoinbase', function () { + function verify(f) { + it( + 'should return ' + + f.coinbase + + ' for ' + + f.id + + '(' + + f.description + + ')', + function () { + var tx = Transaction.fromHex(f.hex); + + assert.strictEqual(tx.isCoinbase(), f.coinbase); + }, + ); + } + + fixtures.valid.forEach(verify); + }); + + describe('hashForSignature', function () { + it('does not use Witness serialization', function () { + var randScript = Buffer.from('6a', 'hex'); + + var tx = new Transaction(); + tx.addInput( + Buffer.from( + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex', + ), + 0, + ); + tx.addOutput(randScript, 5000000000); + + var original = tx.__toBuffer; + tx.__toBuffer = function (a, b, c) { + if (c !== false) + throw new Error('hashForSignature MUST pass false'); + + return original.call(this, a, b, c); + }; + + assert.throws(function () { + tx.__toBuffer(undefined, undefined, true); + }, /hashForSignature MUST pass false/); + + // assert hashForSignature does not pass false + assert.doesNotThrow(function () { + tx.hashForSignature(0, randScript, 1); + }); + }); + + fixtures.hashForSignature.forEach(function (f) { + it( + 'should return ' + + f.hash + + ' for ' + + (f.description ? 'case "' + f.description + '"' : f.script), + function () { + var tx = Transaction.fromHex(f.txHex); + var script = bscript.fromASM(f.script); + + assert.strictEqual( + tx + .hashForSignature(f.inIndex, script, f.type) + .toString('hex'), + f.hash, + ); + }, + ); + }); + }); + + describe('hashForWitnessV0', function () { + fixtures.hashForWitnessV0.forEach(function (f) { + it( + 'should return ' + + f.hash + + ' for ' + + (f.description ? 'case "' + f.description + '"' : ''), + function () { + var tx = Transaction.fromHex(f.txHex); + var script = bscript.fromASM(f.script); + + assert.strictEqual( + tx + .hashForWitnessV0( + f.inIndex, + script, + f.value, + f.type, + ) + .toString('hex'), + f.hash, + ); + }, + ); + }); + }); + + describe('setWitness', function () { + it('only accepts a a witness stack (Array of Buffers)', function () { + assert.throws(function () { + new Transaction().setWitness(0, 'foobar'); + }, /Expected property "1" of type \[Buffer], got String "foobar"/); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/transaction_builder.js b/web/bitcoincashjs-lib/test/transaction_builder.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/transaction_builder.js @@ -0,0 +1,738 @@ +/* global describe, it, beforeEach */ + +var assert = require('assert'); +var baddress = require('../src/address'); +var bscript = require('../src/script'); +var btemplates = require('../src/templates'); +var ops = require('@psf/bitcoincash-ops'); + +var BigInteger = require('bigi'); +var ECPair = require('../src/ecpair'); +var Transaction = require('../src/transaction'); +var TransactionBuilder = require('../src/transaction_builder'); +var NETWORKS = require('../src/networks'); + +var fixtures = require('./fixtures/transaction_builder'); + +function construct(f, dontSign) { + var network = NETWORKS[f.network]; + var txb = new TransactionBuilder(network); + + if (f.version !== undefined) txb.setVersion(f.version); + if (f.locktime !== undefined) txb.setLockTime(f.locktime); + + f.inputs.forEach(function (input) { + var prevTx; + if (input.txRaw) { + var constructed = construct(input.txRaw); + if (input.txRaw.incomplete) prevTx = constructed.buildIncomplete(); + else prevTx = constructed.build(); + } else if (input.txHex) { + prevTx = Transaction.fromHex(input.txHex); + } else { + prevTx = input.txId; + } + + var prevTxScript; + if (input.prevTxScript) { + prevTxScript = bscript.fromASM(input.prevTxScript); + } + + txb.addInput(prevTx, input.vout, input.sequence, prevTxScript); + }); + + f.outputs.forEach(function (output) { + if (output.address) { + txb.addOutput(output.address, output.value); + } else { + txb.addOutput(bscript.fromASM(output.script), output.value); + } + }); + + if (dontSign) return txb; + + var stages = f.stages && f.stages.concat(); + f.inputs.forEach(function (input, index) { + if (!input.signs) return; + input.signs.forEach(function (sign) { + var keyPair = ECPair.fromWIF(sign.keyPair, network); + var redeemScript; + var witnessScript; + var value; + if (sign.redeemScript) { + redeemScript = bscript.fromASM(sign.redeemScript); + } + if (sign.value) { + value = sign.value; + } + if (sign.witnessScript) { + witnessScript = bscript.fromASM(sign.witnessScript); + } + txb.sign( + index, + keyPair, + redeemScript, + sign.hashType, + value, + witnessScript, + ); + + if (sign.stage) { + var tx = txb.buildIncomplete(); + assert.strictEqual(tx.toHex(), stages.shift()); + txb = TransactionBuilder.fromTransaction(tx, network); + } + }); + }); + + return txb; +} + +describe('TransactionBuilder', function () { + // constants + var keyPair = new ECPair(BigInteger.ONE); + var scripts = [ + '1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH', + '1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP', + ].map(function (x) { + return baddress.toOutputScript(x); + }); + var txHash = Buffer.from( + '0e7cea811c0be9f73c0aca591034396e7264473fc25c1ca45195d7417b36cbe2', + 'hex', + ); + + describe('fromTransaction', function () { + fixtures.valid.build.forEach(function (f) { + it( + 'returns TransactionBuilder, with ' + f.description, + function () { + var network = NETWORKS[f.network || 'bitcoin']; + + var tx = Transaction.fromHex(f.txHex); + var txb = TransactionBuilder.fromTransaction(tx, network); + var txAfter = f.incomplete + ? txb.buildIncomplete() + : txb.build(); + + assert.strictEqual(txAfter.toHex(), f.txHex); + assert.strictEqual(txb.network, network); + }, + ); + }); + + fixtures.valid.fromTransaction.forEach(function (f) { + it( + 'returns TransactionBuilder, with ' + f.description, + function () { + var tx = new Transaction(); + + f.inputs.forEach(function (input) { + var txHash2 = Buffer.from(input.txId, 'hex').reverse(); + + tx.addInput( + txHash2, + input.vout, + undefined, + bscript.fromASM(input.scriptSig), + ); + }); + + f.outputs.forEach(function (output) { + tx.addOutput( + bscript.fromASM(output.script), + output.value, + ); + }); + + var txb = TransactionBuilder.fromTransaction(tx); + var txAfter = f.incomplete + ? txb.buildIncomplete() + : txb.build(); + + txAfter.ins.forEach(function (input, i) { + assert.equal( + bscript.toASM(input.script), + f.inputs[i].scriptSigAfter, + ); + }); + + txAfter.outs.forEach(function (output, i) { + assert.equal( + bscript.toASM(output.script), + f.outputs[i].script, + ); + }); + }, + ); + }); + + it('correctly classifies transaction inputs', function () { + var tx = Transaction.fromHex(fixtures.valid.classification.hex); + var txb = TransactionBuilder.fromTransaction(tx); + txb.inputs.forEach(function (i) { + assert.strictEqual(i.prevOutType, 'scripthash'); + assert.strictEqual(i.redeemScriptType, 'multisig'); + assert.strictEqual(i.signType, 'multisig'); + }); + }); + + fixtures.invalid.fromTransaction.forEach(function (f) { + it('throws ' + f.exception, function () { + var tx = Transaction.fromHex(f.txHex); + + assert.throws(function () { + TransactionBuilder.fromTransaction(tx); + }, new RegExp(f.exception)); + }); + }); + }); + + describe('addInput', function () { + var txb; + beforeEach(function () { + txb = new TransactionBuilder(); + }); + + it('accepts a txHash, index [and sequence number]', function () { + var vin = txb.addInput(txHash, 1, 54); + assert.strictEqual(vin, 0); + + var txIn = txb.tx.ins[0]; + assert.strictEqual(txIn.hash, txHash); + assert.strictEqual(txIn.index, 1); + assert.strictEqual(txIn.sequence, 54); + assert.strictEqual(txb.inputs[0].prevOutScript, undefined); + }); + + it('accepts a txHash, index [, sequence number and scriptPubKey]', function () { + var vin = txb.addInput(txHash, 1, 54, scripts[1]); + assert.strictEqual(vin, 0); + + var txIn = txb.tx.ins[0]; + assert.strictEqual(txIn.hash, txHash); + assert.strictEqual(txIn.index, 1); + assert.strictEqual(txIn.sequence, 54); + assert.strictEqual(txb.inputs[0].prevOutScript, scripts[1]); + }); + + it('accepts a prevTx, index [and sequence number]', function () { + var prevTx = new Transaction(); + prevTx.addOutput(scripts[0], 0); + prevTx.addOutput(scripts[1], 1); + + var vin = txb.addInput(prevTx, 1, 54); + assert.strictEqual(vin, 0); + + var txIn = txb.tx.ins[0]; + assert.deepEqual(txIn.hash, prevTx.getHash()); + assert.strictEqual(txIn.index, 1); + assert.strictEqual(txIn.sequence, 54); + assert.strictEqual(txb.inputs[0].prevOutScript, scripts[1]); + }); + + it('returns the input index', function () { + assert.strictEqual(txb.addInput(txHash, 0), 0); + assert.strictEqual(txb.addInput(txHash, 1), 1); + }); + + it('throws if SIGHASH_ALL has been used to sign any existing scriptSigs', function () { + txb.addInput(txHash, 0); + txb.sign(0, keyPair); + + assert.throws(function () { + txb.addInput(txHash, 0); + }, /No, this would invalidate signatures/); + }); + }); + + describe('addOutput', function () { + var txb; + beforeEach(function () { + txb = new TransactionBuilder(); + }); + + it('accepts an address string and value', function () { + var vout = txb.addOutput(keyPair.getAddress(), 1000); + assert.strictEqual(vout, 0); + + var txout = txb.tx.outs[0]; + assert.deepEqual(txout.script, scripts[0]); + assert.strictEqual(txout.value, 1000); + }); + + it('accepts a ScriptPubKey and value', function () { + var vout = txb.addOutput(scripts[0], 1000); + assert.strictEqual(vout, 0); + + var txout = txb.tx.outs[0]; + assert.deepEqual(txout.script, scripts[0]); + assert.strictEqual(txout.value, 1000); + }); + + it('throws if address is of the wrong network', function () { + assert.throws(function () { + txb.addOutput('2NGHjvjw83pcVFgMcA7QvSMh2c246rxLVz9', 1000); + }, /2NGHjvjw83pcVFgMcA7QvSMh2c246rxLVz9 has no matching Script/); + }); + + it('add second output after signed first input with SIGHASH_NONE', function () { + txb.addInput(txHash, 0); + txb.addOutput(scripts[0], 2000); + txb.sign(0, keyPair, undefined, Transaction.SIGHASH_NONE); + assert.equal(txb.addOutput(scripts[1], 9000), 1); + }); + + it('add first output after signed first input with SIGHASH_NONE', function () { + txb.addInput(txHash, 0); + txb.sign(0, keyPair, undefined, Transaction.SIGHASH_NONE); + assert.equal(txb.addOutput(scripts[0], 2000), 0); + }); + + it('add second output after signed first input with SIGHASH_SINGLE', function () { + txb.addInput(txHash, 0); + txb.addOutput(scripts[0], 2000); + txb.sign(0, keyPair, undefined, Transaction.SIGHASH_SINGLE); + assert.equal(txb.addOutput(scripts[1], 9000), 1); + }); + + it('add first output after signed first input with SIGHASH_SINGLE', function () { + txb.addInput(txHash, 0); + txb.sign(0, keyPair, undefined, Transaction.SIGHASH_SINGLE); + assert.throws(function () { + txb.addOutput(scripts[0], 2000); + }, /No, this would invalidate signatures/); + }); + + it('throws if SIGHASH_ALL has been used to sign any existing scriptSigs', function () { + txb.addInput(txHash, 0); + txb.addOutput(scripts[0], 2000); + txb.sign(0, keyPair); + + assert.throws(function () { + txb.addOutput(scripts[1], 9000); + }, /No, this would invalidate signatures/); + }); + }); + + describe('setLockTime', function () { + it('throws if if there exist any scriptSigs', function () { + var txb = new TransactionBuilder(); + txb.addInput(txHash, 0); + txb.sign(0, keyPair); + + assert.throws(function () { + txb.setLockTime(65535); + }, /No, this would invalidate signatures/); + }); + }); + + describe('sign', function () { + it('supports the alternative abstract interface { publicKey, sign }', function () { + var keyPair = { + publicKey: Buffer.alloc(33, 0x03), + sign: function (hash) { + return Buffer.alloc(64); + }, + }; + + var txb = new TransactionBuilder(); + txb.addInput( + 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + 1, + ); + txb.addOutput('1111111111111111111114oLvT2', 100000); + txb.sign(0, keyPair); + assert.equal( + txb.build().toHex(), + '0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000002c0930060201000201000121030303030303030303030303030303030303030303030303030303030303030303ffffffff01a0860100000000001976a914000000000000000000000000000000000000000088ac00000000', + ); + }); + + fixtures.invalid.sign.forEach(function (f) { + it( + 'throws on ' + + f.exception + + (f.description ? ' (' + f.description + ')' : ''), + function () { + var txb = construct(f, true); + + f.inputs.forEach(function (input, index) { + input.signs.forEach(function (sign) { + var keyPairNetwork = + NETWORKS[sign.network || f.network]; + var keyPair2 = ECPair.fromWIF( + sign.keyPair, + keyPairNetwork, + ); + var redeemScript; + + if (sign.redeemScript) { + redeemScript = bscript.fromASM( + sign.redeemScript, + ); + } + + if (!sign.throws) { + txb.sign( + index, + keyPair2, + redeemScript, + sign.hashType, + sign.value, + ); + } else { + assert.throws(function () { + txb.sign( + index, + keyPair2, + redeemScript, + sign.hashType, + sign.value, + ); + }, new RegExp(f.exception)); + } + }); + }); + }, + ); + }); + }); + + describe('build', function () { + fixtures.valid.build.forEach(function (f) { + it('builds "' + f.description + '"', function () { + var txb = construct(f); + var tx = f.incomplete ? txb.buildIncomplete() : txb.build(); + + assert.strictEqual(tx.toHex(), f.txHex); + }); + }); + + // TODO: remove duplicate test code + fixtures.invalid.build.forEach(function (f) { + describe('for ' + (f.description || f.exception), function () { + it('throws ' + f.exception, function () { + assert.throws(function () { + var txb; + if (f.txHex) { + txb = TransactionBuilder.fromTransaction( + Transaction.fromHex(f.txHex), + ); + } else { + txb = construct(f); + } + + txb.build(); + }, new RegExp(f.exception)); + }); + + // if throws on incomplete too, enforce that + if (f.incomplete) { + it('throws if ' + f.exception, function () { + assert.throws(function () { + var txb; + if (f.txHex) { + txb = TransactionBuilder.fromTransaction( + Transaction.fromHex(f.txHex), + ); + } else { + txb = construct(f); + } + + txb.buildIncomplete(); + }, new RegExp(f.exception)); + }); + } else { + it('does not throw if buildIncomplete', function () { + var txb; + if (f.txHex) { + txb = TransactionBuilder.fromTransaction( + Transaction.fromHex(f.txHex), + ); + } else { + txb = construct(f); + } + + txb.buildIncomplete(); + }); + } + }); + }); + + it('for incomplete with 0 signatures', function () { + var randomTxData = + '0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f74d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000'; + var randomAddress = '1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH'; + + var randomTx = Transaction.fromHex(randomTxData); + var tx = new TransactionBuilder(); + tx.addInput(randomTx, 0); + tx.addOutput(randomAddress, 1000); + tx = tx.buildIncomplete(); + assert(tx); + }); + + it('for incomplete P2SH with 0 signatures', function () { + var inp = Buffer.from( + '010000000173120703f67318aef51f7251272a6816d3f7523bb25e34b136d80be959391c100000000000ffffffff0100c817a80400000017a91471a8ec07ff69c6c4fee489184c462a9b1b9237488700000000', + 'hex', + ); // arbitrary P2SH input + var inpTx = Transaction.fromBuffer(inp); + + var txb = new TransactionBuilder(NETWORKS.testnet); + txb.addInput(inpTx, 0); + txb.addOutput('2NAkqp5xffoomp5RLBcakuGpZ12GU4twdz4', 1e8); // arbitrary output + + txb.buildIncomplete(); + }); + + it('for incomplete P2WPKH with 0 signatures', function () { + var inp = Buffer.from( + '010000000173120703f67318aef51f7251272a6816d3f7523bb25e34b136d80be959391c100000000000ffffffff0100c817a8040000001600141a15805e1f4040c9f68ccc887fca2e63547d794b00000000', + 'hex', + ); + var inpTx = Transaction.fromBuffer(inp); + + var txb = new TransactionBuilder(NETWORKS.testnet); + txb.addInput(inpTx, 0); + txb.addOutput('2NAkqp5xffoomp5RLBcakuGpZ12GU4twdz4', 1e8); // arbitrary output + + txb.buildIncomplete(); + }); + + it('for incomplete P2WSH with 0 signatures', function () { + var inpTx = Transaction.fromBuffer( + Buffer.from( + '010000000173120703f67318aef51f7251272a6816d3f7523bb25e34b136d80be959391c100000000000ffffffff0100c817a80400000022002072df76fcc0b231b94bdf7d8c25d7eef4716597818d211e19ade7813bff7a250200000000', + 'hex', + ), + ); + + var txb = new TransactionBuilder(NETWORKS.testnet); + txb.addInput(inpTx, 0); + txb.addOutput('2NAkqp5xffoomp5RLBcakuGpZ12GU4twdz4', 1e8); // arbitrary output + + txb.buildIncomplete(); + }); + }); + + describe('multisig', function () { + fixtures.valid.multisig.forEach(function (f) { + it(f.description, function () { + var txb = construct(f, true); + var tx; + var network = NETWORKS[f.network]; + + f.inputs.forEach(function (input, i) { + var redeemScript = bscript.fromASM(input.redeemScript); + + input.signs.forEach(function (sign) { + // rebuild the transaction each-time after the first + if (tx) { + // do we filter OP_0's beforehand? + if (sign.filterOP_0) { + var scriptSig = tx.ins[i].script; + + // ignore OP_0 on the front, ignore redeemScript + var signatures = bscript + .decompile(scriptSig) + .slice(1, -1) + .filter(function (x) { + return x !== ops.OP_0; + }); + + // rebuild/replace the scriptSig without them + var replacement = + btemplates.scriptHash.input.encode( + btemplates.multisig.input.encode( + signatures, + ), + redeemScript, + ); + assert.strictEqual( + bscript.toASM(replacement), + sign.scriptSigFiltered, + ); + + tx.ins[i].script = replacement; + } + // now import it + txb = TransactionBuilder.fromTransaction( + tx, + network, + ); + } + + var keyPair2 = ECPair.fromWIF(sign.keyPair, network); + txb.sign(i, keyPair2, redeemScript, sign.hashType); + + // update the tx + tx = txb.buildIncomplete(); + // now verify the serialized scriptSig is as expected + assert.strictEqual( + bscript.toASM(tx.ins[i].script), + sign.scriptSig, + ); + }); + }); + + tx = txb.build(); + assert.strictEqual(tx.toHex(), f.txHex); + }); + }); + }); + + describe('various edge case', function () { + var network = NETWORKS.testnet; + + it('should warn of high fee for segwit transaction based on VSize, not Size', function () { + var rawtx = + '01000000000104fdaac89627208b4733484ca56bc291f4cf4fa8d7c5f29893c52b46788a0a' + + '1df90000000000fffffffffdaac89627208b4733484ca56bc291f4cf4fa8d7c5f29893c52b46788a0a1df9' + + '0100000000ffffffffa2ef7aaab316a3e5b5b0a78d1d35c774b95a079f9f0c762277a49caf1f26bca40000' + + '000000ffffffffa2ef7aaab316a3e5b5b0a78d1d35c774b95a079f9f0c762277a49caf1f26bca401000000' + + '00ffffffff0100040000000000001976a914cf307285359ab7ef6a2daa0522c7908ddf5fe7a988ac024730' + + '440220113324438816338406841775e079b04c50d04f241da652a4035b1017ea1ecf5502205802191eb49c' + + '54bf2a5667aea72e51c3ca92085efc60f12d1ebda3a64aff343201210283409659355b6d1cc3c32decd5d5' + + '61abaac86c37a353b52895a5e6c196d6f44802483045022100dc2892874e6d8708e3f5a058c5c9263cdf03' + + '969492270f89ee4933caf6daf8bb0220391dfe61a002709b63b9d64422d3db09b727839d1287e10a128a5d' + + 'b52a82309301210283409659355b6d1cc3c32decd5d561abaac86c37a353b52895a5e6c196d6f448024830' + + '450221009e3ed3a6ae93a018f443257b43e47b55cf7f7f3547d8807178072234686b22160220576121cfe6' + + '77c7eddf5575ea0a7c926247df6eca723c4f85df306e8bc08ea2df01210283409659355b6d1cc3c32decd5' + + 'd561abaac86c37a353b52895a5e6c196d6f44802473044022007be81ffd4297441ab10e740fc9bab9545a2' + + '194a565cd6aa4cc38b8eaffa343402201c5b4b61d73fa38e49c1ee68cc0e6dfd2f5dae453dd86eb142e87a' + + '0bafb1bc8401210283409659355b6d1cc3c32decd5d561abaac86c37a353b52895a5e6c196d6f44800000000'; + var txb = TransactionBuilder.fromTransaction( + Transaction.fromHex(rawtx), + ); + txb.inputs[0].value = 241530; + txb.inputs[1].value = 241530; + txb.inputs[2].value = 248920; + txb.inputs[3].value = 248920; + + assert.throws(function () { + txb.build(); + }, new RegExp('Transaction has absurd fees')); + }); + + it('should classify witness inputs with witness = true during multisigning', function () { + var keyPair = ECPair.fromWIF( + 'cRAwuVuVSBZMPu7hdrYvMCZ8eevzmkExjFbaBLhqnDdrezxN3nTS', + network, + ); + var witnessScript = Buffer.from( + '522102bbbd6eb01efcbe4bd9664b886f26f69de5afcb2e479d72596c8bf21929e352e22102d9c3f7180ef13ec5267723c9c2ffab56a4215241f837502ea8977c8532b9ea1952ae', + 'hex', + ); + var redeemScript = Buffer.from( + '002024376a0a9abab599d0e028248d48ebe817bc899efcffa1cd2984d67289daf5af', + 'hex', + ); + var scriptPubKey = Buffer.from( + 'a914b64f1a3eacc1c8515592a6f10457e8ff90e4db6a87', + 'hex', + ); + var txb = new TransactionBuilder(network); + txb.addInput( + 'a4696c4b0cd27ec2e173ab1fa7d1cc639a98ee237cec95a77ca7ff4145791529', + 1, + 0xffffffff, + scriptPubKey, + ); + txb.addOutput(scriptPubKey, 99000); + txb.sign(0, keyPair, redeemScript, null, 100000, witnessScript); + // 2-of-2 signed only once + var tx = txb.buildIncomplete(); + // Only input is segwit, so txid should be accurate with the final tx + assert.equal( + tx.getId(), + 'f15d0a65b21b4471405b21a099f8b18e1ae4d46d55efbd0f4766cf11ad6cb821', + ); + var txHex = tx.toHex(); + var newTxb = TransactionBuilder.fromTransaction( + Transaction.fromHex(txHex), + ); + // input should have the key 'witness' set to true + assert.equal(newTxb.inputs[0].witness, true); + }); + + it('should handle badly pre-filled OP_0s', function () { + // OP_0 is used where a signature is missing + var redeemScripSig = bscript.fromASM( + 'OP_0 OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae', + ); + var redeemScript = bscript.fromASM( + 'OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672 OP_3 OP_CHECKMULTISIG', + ); + + var tx = new Transaction(); + tx.addInput( + Buffer.from( + 'cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f07149', + 'hex', + ), + 0, + undefined, + redeemScripSig, + ); + tx.addOutput( + Buffer.from( + '76a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac', + 'hex', + ), + 1000, + ); + + // now import the Transaction + var txb = TransactionBuilder.fromTransaction(tx, NETWORKS.testnet); + + var keyPair2 = ECPair.fromWIF( + '91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe', + network, + ); + txb.sign(0, keyPair2, redeemScript); + + var tx2 = txb.build(); + assert.equal( + tx2.getId(), + 'eab59618a564e361adef6d918bd792903c3d41bcf1220137364fb847880467f9', + ); + assert.equal( + bscript.toASM(tx2.ins[0].script), + 'OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691d6b48c0d4283d7d01 3045022100a346c61738304eac5e7702188764d19cdf68f4466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881d7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67253ae', + ); + }); + + it('should not classify blank scripts as nonstandard', function () { + var tx = new TransactionBuilder(); + tx.addInput( + 'aa94ab02c182214f090e99a0d57021caffd0f195a81c24602b1028b130b63e31', + 0, + ); + + var incomplete = tx.buildIncomplete().toHex(); + var keyPair = ECPair.fromWIF( + 'L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy', + ); + + // sign, as expected + tx.addOutput('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 15000); + tx.sign(0, keyPair); + var txId = tx.build().getId(); + assert.equal( + txId, + '54f097315acbaedb92a95455da3368eb45981cdae5ffbc387a9afc872c0f29b3', + ); + + // and, repeat + tx = TransactionBuilder.fromTransaction( + Transaction.fromHex(incomplete), + ); + tx.addOutput('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 15000); + tx.sign(0, keyPair); + var txId2 = tx.build().getId(); + assert.equal(txId, txId2); + }); + }); +}); diff --git a/web/bitcoincashjs-lib/test/types.js b/web/bitcoincashjs-lib/test/types.js new file mode 100644 --- /dev/null +++ b/web/bitcoincashjs-lib/test/types.js @@ -0,0 +1,73 @@ +/* global describe, it */ + +var assert = require('assert'); +var types = require('../src/types'); +var typeforce = require('typeforce'); + +describe('types', function () { + describe('BigInt/ECPoint', function () { + it('return true for duck types', function () { + assert(types.BigInt(new (function BigInteger() {})())); + assert(types.ECPoint(new (function Point() {})())); + }); + + it('return false for bad types', function () { + assert(!types.BigInt(new (function NotABigInteger() {})())); + assert(!types.ECPoint(new (function NotAPoint() {})())); + }); + }); + + describe('Buffer Hash160/Hash256', function () { + var buffer20byte = Buffer.alloc(20); + var buffer32byte = Buffer.alloc(32); + + it('return true for valid size', function () { + assert(types.Hash160bit(buffer20byte)); + assert(types.Hash256bit(buffer32byte)); + }); + + it('return true for oneOf', function () { + assert.doesNotThrow(function () { + typeforce( + types.oneOf(types.Hash160bit, types.Hash256bit), + buffer32byte, + ); + }); + + assert.doesNotThrow(function () { + typeforce( + types.oneOf(types.Hash256bit, types.Hash160bit), + buffer32byte, + ); + }); + }); + + it('throws for invalid size', function () { + assert.throws(function () { + types.Hash160bit(buffer32byte); + }, /Expected Buffer\(Length: 20\), got Buffer\(Length: 32\)/); + + assert.throws(function () { + types.Hash256bit(buffer20byte); + }, /Expected Buffer\(Length: 32\), got Buffer\(Length: 20\)/); + }); + }); + + describe('Satoshi', function () { + [ + { value: -1, result: false }, + { value: 0, result: true }, + { value: 1, result: true }, + { value: 20999999 * 1e8, result: true }, + { value: 21000000 * 1e8, result: true }, + { value: 21000001 * 1e8, result: false }, + ].forEach(function (f) { + it( + 'returns ' + f.result + ' for valid for ' + f.value, + function () { + assert.strictEqual(types.Satoshi(f.value), f.result); + }, + ); + }); + }); +});