From d9a8e7807391182464543b1efcb9404df1678cc0 Mon Sep 17 00:00:00 2001 From: tenthirtyone Date: Mon, 9 Oct 2017 19:58:41 -0400 Subject: [PATCH 1/2] merge up --- .eslintfiles | 16 + .eslintrc.json | 95 +- .gitignore | 1 + .npmignore | 1 + bench/bech32.js | 33 +- bench/bench.js | 8 +- bench/buffer.js | 44 +- bench/chacha.js | 72 +- bench/coins-old.js | 39 - bench/coins.js | 61 +- bench/merkle.js | 9 +- bench/mnemonic.js | 17 +- bench/script.js | 36 +- bench/tx.js | 248 +- bench/walletdb.js | 173 +- bin/cli | 385 +- bin/node | 9 +- bin/spvnode | 14 +- browser/server.js | 12 +- browser/wsproxy.js | 57 +- docs/Example-Connecting-to-the-P2P-Network.md | 86 - ...ample-Creating-a-Blockchain-and-Mempool.md | 35 - docs/Example-Fullnode-Object.md | 72 - docs/Example-SPV-Sync.md | 44 - .../client.js => docs/Examples/client-api.js | 68 +- .../Examples/connect-to-peer.js | 16 +- docs/Examples/connect-to-the-p2p-network.js | 98 + .../create-a-blockchain-and-mempool.js | 42 + .../tx.js => docs/Examples/create-sign-tx.js | 26 +- docs/Examples/fullnode-and-wallet.js | 83 + examples/node.js => docs/Examples/fullnode.js | 8 +- docs/Examples/get-tx-from-chain.js | 52 + .../Examples/miner-configs.js | 22 +- .../Examples/peers-plugin.js | 10 +- docs/Examples/spv-sync-wallet.js | 56 + {examples => docs/Examples}/wallet.js | 29 +- docs/README.md | 26 +- docs/REST-RPC-API.md | 38 +- docs/Scripting.md | 45 +- examples/chain.js | 17 - lib/bcoin-browser.js | 1 + lib/bcoin.js | 15 +- lib/bip70/payment.js | 24 +- lib/bip70/paymentack.js | 4 +- lib/bip70/paymentdetails.js | 24 +- lib/bip70/paymentrequest.js | 57 +- lib/bip70/x509.js | 93 +- lib/blockchain/chain.js | 434 +- lib/blockchain/chaindb.js | 564 +- lib/blockchain/chainentry.js | 101 +- lib/blockchain/layout-browser.js | 59 +- lib/blockchain/layout.js | 83 +- lib/btc/amount.js | 338 +- lib/btc/uri.js | 32 +- lib/coins/coinentry.js | 277 + lib/coins/coins.js | 658 +- lib/coins/coinview.js | 416 +- lib/coins/compress.js | 168 +- lib/coins/undocoins.js | 230 +- lib/crypto/aead.js | 14 +- lib/crypto/aes-browser.js | 1695 +- lib/crypto/aes.js | 10 +- lib/crypto/ccmp.js | 13 +- lib/crypto/chacha20.js | 10 +- lib/crypto/digest-browser.js | 35 +- lib/crypto/digest.js | 8 +- lib/crypto/ecdsa.js | 15 +- lib/crypto/hkdf.js | 12 +- lib/crypto/hmac-drbg.js | 12 +- lib/crypto/merkle.js | 23 +- lib/crypto/pbkdf2-browser.js | 24 +- lib/crypto/poly1305.js | 63 +- lib/crypto/random-browser.js | 6 +- lib/crypto/random.js | 2 +- lib/crypto/rsa-browser.js | 53 +- lib/crypto/rsa.js | 17 +- lib/crypto/schnorr.js | 84 +- lib/crypto/scrypt.js | 36 +- lib/crypto/secp256k1-browser.js | 120 +- lib/crypto/secp256k1-native.js | 14 +- lib/crypto/secp256k1.js | 2 +- lib/crypto/sha256.js | 14 +- lib/crypto/siphash.js | 50 +- lib/db/ldb.js | 10 +- lib/db/level.js | 12 +- lib/db/lowlevelup.js | 84 +- lib/db/memdb.js | 52 +- lib/hd/common.js | 85 +- lib/hd/mnemonic.js | 178 +- lib/hd/private.js | 163 +- lib/hd/public.js | 134 +- lib/http/base.js | 289 +- lib/http/client.js | 80 +- lib/http/request.js | 109 +- lib/http/rpc.js | 1056 +- lib/http/rpcbase.js | 16 +- lib/http/rpcclient.js | 7 +- lib/http/server.js | 247 +- lib/http/wallet.js | 9 +- lib/mempool/fees.js | 123 +- lib/mempool/layout-browser.js | 7 +- lib/mempool/layout.js | 9 +- lib/mempool/mempool.js | 555 +- lib/mempool/mempoolentry.js | 52 +- lib/mining/common.js | 14 +- lib/mining/cpuminer.js | 86 +- lib/mining/miner.js | 89 +- lib/mining/template.js | 171 +- lib/native.js | 2 +- lib/net/bip150.js | 181 +- lib/net/bip151.js | 70 +- lib/net/bip152.js | 206 +- lib/net/dns.js | 10 +- lib/net/external.js | 40 +- lib/net/framer.js | 22 +- lib/net/hostlist.js | 306 +- lib/net/packets.js | 142 +- lib/net/parser.js | 33 +- lib/net/peer.js | 212 +- lib/net/pool.js | 536 +- lib/net/proxysocket.js | 29 +- lib/net/socks.js | 162 +- lib/net/tcp-browser.js | 2 +- lib/net/tcp.js | 21 +- lib/net/upnp.js | 176 +- lib/node/config.js | 520 +- lib/node/fullnode.js | 74 +- lib/node/logger.js | 211 +- lib/node/node.js | 28 +- lib/node/spvnode.js | 23 +- lib/primitives/abstractblock.js | 107 +- lib/primitives/address.js | 187 +- lib/primitives/block.js | 189 +- lib/primitives/coin.js | 26 +- lib/primitives/headers.js | 61 +- lib/primitives/input.js | 70 +- lib/primitives/invitem.js | 2 +- lib/primitives/keyring.js | 178 +- lib/primitives/memblock.js | 47 +- lib/primitives/merkleblock.js | 155 +- lib/primitives/mtx.js | 686 +- lib/primitives/netaddress.js | 43 +- lib/primitives/outpoint.js | 56 +- lib/primitives/output.js | 59 +- lib/primitives/tx.js | 689 +- lib/primitives/txmeta.js | 62 +- lib/protocol/consensus.js | 14 +- lib/protocol/errors.js | 3 +- lib/protocol/network.js | 25 +- lib/protocol/networks.js | 217 +- lib/protocol/policy.js | 8 +- lib/protocol/timedata.js | 11 +- lib/script/common.js | 446 +- lib/script/index.js | 3 +- lib/script/opcode.js | 579 +- lib/script/program.js | 10 +- lib/script/script.js | 2081 +- lib/script/scripterror.js | 50 + lib/script/scriptnum.js | 495 +- lib/script/sigcache.js | 22 +- lib/script/stack.js | 519 +- lib/script/witness.js | 358 +- lib/types.js | 2 +- lib/utils/asn1.js | 99 +- lib/utils/asyncemitter.js | 64 +- lib/utils/asyncobject.js | 19 +- lib/utils/base32.js | 13 +- lib/utils/base58.js | 40 +- lib/utils/bech32.js | 66 +- lib/utils/bloom.js | 28 +- lib/utils/co.js | 27 +- lib/utils/encoding.js | 297 +- lib/utils/enforce.js | 165 + lib/utils/fs.js | 24 +- lib/utils/gcs.js | 163 +- lib/utils/heap.js | 41 +- lib/utils/index.js | 1 + lib/utils/ip.js | 86 +- lib/utils/list.js | 12 +- lib/utils/lock.js | 49 +- lib/utils/lru.js | 63 +- lib/utils/mappedlock.js | 17 +- lib/utils/murmur3.js | 22 +- lib/utils/pem.js | 70 +- lib/utils/protoreader.js | 47 +- lib/utils/protowriter.js | 70 +- lib/utils/rbt.js | 89 +- lib/utils/reader.js | 187 +- lib/utils/rollingfilter.js | 97 +- lib/utils/staticwriter.js | 150 +- lib/utils/util.js | 731 +- lib/utils/validator.js | 350 +- lib/utils/writer.js | 282 +- lib/wallet/account.js | 167 +- lib/wallet/client.js | 28 +- lib/wallet/common.js | 59 +- lib/wallet/http.js | 480 +- lib/wallet/layout-browser.js | 59 +- lib/wallet/layout.js | 105 +- lib/wallet/masterkey.js | 79 +- lib/wallet/nodeclient.js | 24 +- lib/wallet/path.js | 12 +- lib/wallet/plugin.js | 13 +- lib/wallet/records.js | 172 +- lib/wallet/rpc.js | 825 +- lib/wallet/server.js | 61 +- lib/wallet/txdb.js | 697 +- lib/wallet/wallet.js | 520 +- lib/wallet/walletdb.js | 471 +- lib/wallet/walletkey.js | 5 +- lib/workers/child-browser.js | 3 +- lib/workers/child.js | 30 +- lib/workers/framer.js | 19 +- lib/workers/jobs.js | 20 +- lib/workers/master.js | 4 +- lib/workers/packets.js | 194 +- lib/workers/parent-browser.js | 3 +- lib/workers/parent.js | 3 +- lib/workers/parser.js | 32 +- lib/workers/workerpool.js | 71 +- migrate/chaindb0to1.js | 29 +- migrate/chaindb1to2.js | 58 +- migrate/chaindb2to3.js | 706 + migrate/coins-old.js | 99 +- migrate/coins/coins.js | 756 + migrate/coins/coinview.js | 476 + migrate/coins/compress.js | 413 + migrate/coins/index.js | 16 + migrate/coins/undocoins.js | 338 + migrate/coinview-old.js | 12 +- migrate/compress-old.js | 26 +- migrate/ensure-tip-index.js | 55 +- migrate/walletdb2to3.js | 120 +- migrate/walletdb3to4.js | 55 +- migrate/walletdb4to5.js | 19 +- migrate/walletdb5to6.js | 102 +- package.json | 41 +- scripts/dump.js | 35 +- scripts/fuzz.js | 202 +- scripts/gen.js | 65 +- test/aes-test.js | 177 +- test/bech32-test.js | 330 +- test/bip150-test.js | 147 +- test/bip151-test.js | 113 +- test/bip70-test.js | 247 +- test/block-test.js | 581 +- test/bloom-test.js | 199 +- test/chachapoly-test.js | 155 +- test/chain-test.js | 740 +- test/coins-test.js | 130 +- test/consensus-test.js | 67 + test/data/block1087400-undo.raw | Bin 0 -> 6836 bytes test/data/block300025-undo.raw | Bin 0 -> 48950 bytes test/data/block300025.json | 38912 ---------------- test/data/block300025.raw | Bin 0 -> 284231 bytes test/data/{cmpct2.bin => block426884.raw} | Bin test/data/block898352.raw | Bin 0 -> 5123 bytes test/data/block928816-undo.raw | Bin 0 -> 269631 bytes test/data/block928816.raw | Bin 0 -> 1589046 bytes test/data/block928828-undo.raw | Bin 0 -> 63254 bytes test/data/block928831-undo.raw | Bin 0 -> 309515 bytes test/data/block928831.raw | Bin 0 -> 1804017 bytes test/data/block928848-undo.raw | Bin 0 -> 347687 bytes test/data/block928848.raw | Bin 0 -> 1902605 bytes test/data/block928849-undo.raw | Bin 0 -> 266651 bytes test/data/block928849.raw | Bin 0 -> 1608067 bytes test/data/block928927-undo.raw | Bin 0 -> 309483 bytes test/data/cmpct2 | 1 - test/data/compact426884.raw | Bin 0 -> 2722 bytes test/data/compact898352.raw | Bin 0 -> 265 bytes test/data/compactblock.hex | 2 - test/data/coolest-tx-ever-sent.hex | 3 - test/data/merkle300025.raw | Bin 0 -> 409 bytes test/data/mnemonic-english.json | 170 + test/data/mnemonic-japanese.json | 170 + test/data/mnemonic1.json | 148 - test/data/mnemonic2.json | 193 - .../{script_tests.json => script-tests.json} | 10 +- .../data/{sighash.json => sighash-tests.json} | 0 .../data/{tx_invalid.json => tx-invalid.json} | 2 +- test/data/{tx_valid.json => tx-valid.json} | 24 +- test/data/tx1-undo.raw | Bin 0 -> 34 bytes test/data/tx1.hex | 2 - test/data/tx1.raw | Bin 0 -> 481 bytes test/data/tx10-undo.raw | Bin 0 -> 534 bytes test/data/tx10.raw | Bin 0 -> 534 bytes test/data/tx2-undo.raw | Bin 0 -> 34 bytes test/data/tx2.hex | 2 - test/data/tx2.raw | Bin 0 -> 226 bytes test/data/tx3-undo.raw | Bin 0 -> 188 bytes test/data/tx3.hex | 3 - test/data/tx3.raw | Bin 0 -> 354 bytes test/data/tx4-undo.raw | Bin 0 -> 32 bytes test/data/tx4.hex | 2 - test/data/tx4.raw | Bin 0 -> 305 bytes test/data/tx5.raw | Bin 0 -> 62138 bytes test/data/tx6-undo.raw | Bin 0 -> 64 bytes test/data/tx6.raw | Bin 0 -> 709 bytes test/data/tx7-undo.raw | Bin 0 -> 34 bytes test/data/tx7.raw | Bin 0 -> 226 bytes test/data/tx8.raw | Bin 0 -> 1155 bytes test/data/tx9.raw | Bin 0 -> 295 bytes test/data/undo1087400.raw | Bin 6046 -> 0 bytes test/data/undo928828.raw | Bin 50178 -> 0 bytes test/data/undo928927.raw | Bin 289521 -> 0 bytes test/data/wtx.hex | 2 - test/gcs-test.js | 191 +- test/hd-test.js | 116 +- test/hkdf-test.js | 84 + test/http-test.js | 189 +- test/key-address-test.js | 46 - test/keyring-test.js | 52 + test/mempool-test.js | 337 +- test/mnemonic-test.js | 102 +- test/node-test.js | 555 +- test/protocol-test.js | 199 +- test/schnorr-test.js | 20 + test/script-test.js | 437 +- test/scrypt-test.js | 74 +- test/siphash-test.js | 23 +- test/tx-test.js | 749 +- test/util/assert.js | 215 + test/util/common.js | 230 +- test/util/memwallet.js | 152 +- test/util/node-context.js | 43 +- test/utils-test.js | 378 +- test/wallet-test.js | 1744 +- webpack.browser.js | 2 +- webpack.compat.js | 5 +- webpack.node.js | 2 +- 330 files changed, 23079 insertions(+), 58762 deletions(-) create mode 100644 .eslintfiles delete mode 100644 bench/coins-old.js delete mode 100644 docs/Example-Connecting-to-the-P2P-Network.md delete mode 100644 docs/Example-Creating-a-Blockchain-and-Mempool.md delete mode 100644 docs/Example-Fullnode-Object.md delete mode 100644 docs/Example-SPV-Sync.md rename examples/client.js => docs/Examples/client-api.js (54%) rename examples/peer.js => docs/Examples/connect-to-peer.js (62%) create mode 100644 docs/Examples/connect-to-the-p2p-network.js create mode 100644 docs/Examples/create-a-blockchain-and-mempool.js rename examples/tx.js => docs/Examples/create-sign-tx.js (75%) create mode 100644 docs/Examples/fullnode-and-wallet.js rename examples/node.js => docs/Examples/fullnode.js (73%) create mode 100644 docs/Examples/get-tx-from-chain.js rename examples/miner.js => docs/Examples/miner-configs.js (61%) rename examples/plugin.js => docs/Examples/peers-plugin.js (83%) create mode 100644 docs/Examples/spv-sync-wallet.js rename {examples => docs/Examples}/wallet.js (50%) delete mode 100644 examples/chain.js create mode 100644 lib/coins/coinentry.js create mode 100644 lib/script/scripterror.js create mode 100644 lib/utils/enforce.js create mode 100644 migrate/chaindb2to3.js create mode 100644 migrate/coins/coins.js create mode 100644 migrate/coins/coinview.js create mode 100644 migrate/coins/compress.js create mode 100644 migrate/coins/index.js create mode 100644 migrate/coins/undocoins.js create mode 100644 test/consensus-test.js create mode 100644 test/data/block1087400-undo.raw create mode 100644 test/data/block300025-undo.raw delete mode 100644 test/data/block300025.json create mode 100644 test/data/block300025.raw rename test/data/{cmpct2.bin => block426884.raw} (100%) create mode 100644 test/data/block898352.raw create mode 100644 test/data/block928816-undo.raw create mode 100644 test/data/block928816.raw create mode 100644 test/data/block928828-undo.raw create mode 100644 test/data/block928831-undo.raw create mode 100644 test/data/block928831.raw create mode 100644 test/data/block928848-undo.raw create mode 100644 test/data/block928848.raw create mode 100644 test/data/block928849-undo.raw create mode 100644 test/data/block928849.raw create mode 100644 test/data/block928927-undo.raw delete mode 100644 test/data/cmpct2 create mode 100644 test/data/compact426884.raw create mode 100644 test/data/compact898352.raw delete mode 100644 test/data/compactblock.hex delete mode 100644 test/data/coolest-tx-ever-sent.hex create mode 100644 test/data/merkle300025.raw create mode 100644 test/data/mnemonic-english.json create mode 100644 test/data/mnemonic-japanese.json delete mode 100644 test/data/mnemonic1.json delete mode 100644 test/data/mnemonic2.json rename test/data/{script_tests.json => script-tests.json} (99%) rename test/data/{sighash.json => sighash-tests.json} (100%) rename test/data/{tx_invalid.json => tx-invalid.json} (99%) rename test/data/{tx_valid.json => tx-valid.json} (99%) create mode 100644 test/data/tx1-undo.raw delete mode 100644 test/data/tx1.hex create mode 100644 test/data/tx1.raw create mode 100644 test/data/tx10-undo.raw create mode 100644 test/data/tx10.raw create mode 100644 test/data/tx2-undo.raw delete mode 100644 test/data/tx2.hex create mode 100644 test/data/tx2.raw create mode 100644 test/data/tx3-undo.raw delete mode 100644 test/data/tx3.hex create mode 100644 test/data/tx3.raw create mode 100644 test/data/tx4-undo.raw delete mode 100644 test/data/tx4.hex create mode 100644 test/data/tx4.raw create mode 100644 test/data/tx5.raw create mode 100644 test/data/tx6-undo.raw create mode 100644 test/data/tx6.raw create mode 100644 test/data/tx7-undo.raw create mode 100644 test/data/tx7.raw create mode 100644 test/data/tx8.raw create mode 100644 test/data/tx9.raw delete mode 100644 test/data/undo1087400.raw delete mode 100644 test/data/undo928828.raw delete mode 100644 test/data/undo928927.raw delete mode 100644 test/data/wtx.hex create mode 100644 test/hkdf-test.js delete mode 100644 test/key-address-test.js create mode 100644 test/keyring-test.js create mode 100644 test/schnorr-test.js create mode 100644 test/util/assert.js diff --git a/.eslintfiles b/.eslintfiles new file mode 100644 index 000000000..d91e3c883 --- /dev/null +++ b/.eslintfiles @@ -0,0 +1,16 @@ +bench/ +bin/cli +bin/node +bin/spvnode +bin/wallet +browser/server.js +browser/wsproxy.js +examples/ +lib/ +migrate/ +scripts/ +test/ +webpack/ +webpack.browser.js +webpack.compat.js +webpack.node.js diff --git a/.eslintrc.json b/.eslintrc.json index 7b6ba3b8c..dc2f6a3e7 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,41 +1,98 @@ { - "extends": "eslint:recommended", "env": { - "browser": true, "es6": true, - "node": true, - "mocha": true + "node": true }, + "extends": "eslint:recommended", "parserOptions": { "ecmaVersion": 8 }, + "root": true, "rules": { - "strict": 2, - "indent": ["error", 2, { + "array-bracket-spacing": ["error", "never"], + "arrow-parens": ["error", "as-needed", { + "requireForBlockBody": true + }], + "arrow-spacing": "error", + "block-spacing": ["error", "always"], + "brace-style": ["error", "1tbs"], + "camelcase": ["error", { + "properties": "never" + }], + "comma-dangle": ["error", "never"], + "consistent-return": "error", + "eol-last": ["error", "always"], + "eqeqeq": ["error", "always", { + "null": "ignore" + }], + "func-name-matching": "error", + "indent": ["off", 2, { "SwitchCase": 1, "CallExpression": { "arguments": "off" }, "ArrayExpression": "off" }], + "handle-callback-err": "off", "linebreak-style": ["error", "unix"], - "quotes": ["error", "single"], - "semi": ["error", "always"], - "no-console": 0, + "max-len": ["error", { + "code": 80, + "ignorePattern": "function \\w+\\(", + "ignoreUrls": true + }], + "max-statements-per-line": ["error", { + "max": 1 + }], + "new-cap": ["error", { + "newIsCap": true, + "capIsNew": false + }], + "new-parens": "error", + "no-buffer-constructor": "error", + "no-console": "off", + "no-extra-semi": "off", + "no-fallthrough": "off", + "no-func-assign": "off", + "no-implicit-coercion": "error", + "no-multi-assign": "error", + "no-multiple-empty-lines": ["error", { + "max": 1 + }], + "no-nested-ternary": "error", + "no-param-reassign": "off", + "no-return-assign": "error", + "no-return-await": "off", + "no-shadow-restricted-names": "error", + "no-tabs": "error", + "no-trailing-spaces": "error", "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": false }], - "no-func-assign": 0, - "no-cond-assign": 0, - "no-unreachable": 0, - "no-fallthrough": 0, - "no-useless-escape": 0, - "no-unsafe-finally": 0, - "no-extra-semi": 0, - "handle-callback-err": 0, - "no-buffer-constructor": 2, - "no-tabs": 2 + "no-use-before-define": ["error", { + "functions": false, + "classes": false + }], + "no-useless-escape": "off", + "no-var": "error", + "nonblock-statement-body-position": ["error", "below"], + "padded-blocks": ["error", "never"], + "prefer-arrow-callback": "error", + "prefer-const": ["error", { + "destructuring": "all", + "ignoreReadBeforeAssign": true + }], + "prefer-template": "off", + "quotes": ["error", "single"], + "semi": ["error", "always"], + "spaced-comment": ["error", "always", { + "exceptions": ["!"] + }], + "space-before-blocks": "error", + "strict": "error", + "unicode-bom": ["error", "never"], + "valid-jsdoc": "error", + "wrap-iife": ["error", "inside"] } } diff --git a/.gitignore b/.gitignore index 39e2841b0..f7ff5cd23 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ node_modules/ docs/reference/ docker_data/ browser/bcoin* +package-lock.json npm-debug.log diff --git a/.npmignore b/.npmignore index 897dc0df6..c93e8534f 100644 --- a/.npmignore +++ b/.npmignore @@ -5,4 +5,5 @@ docker_data/ test/ node_modules/ browser/bcoin* +package-lock.json npm-debug.log diff --git a/bench/bech32.js b/bench/bech32.js index 18a90b9e3..3b19c307a 100644 --- a/bench/bech32.js +++ b/bench/bech32.js @@ -3,24 +3,25 @@ const Address = require('../lib/primitives/address'); const random = require('../lib/crypto/random'); const bench = require('./bench'); +const addrs = []; -let i, end, addr; - -let addrs = []; - -end = bench('serialize'); -for (i = 0; i < 100000; i++) { - addr = Address.fromProgram(0, random.randomBytes(20)); - addrs.push(addr.toBech32()); +{ + const end = bench('serialize'); + for (let i = 0; i < 100000; i++) { + const addr = Address.fromProgram(0, random.randomBytes(20)); + addrs.push(addr.toBech32()); + } + end(100000); } -end(i); -end = bench('parse'); -for (i = 0; i < 100000; i++) { - addr = addrs[i]; - addr = Address.fromBech32(addr); - addrs[i] = addr; +{ + const end = bench('parse'); + for (let i = 0; i < 100000; i++) { + const b32 = addrs[i]; + const addr = Address.fromBech32(b32); + addrs[i] = addr; + } + end(100000); } -end(i); -console.error(addrs); +console.error(addrs[0][0]); diff --git a/bench/bench.js b/bench/bench.js index bcccbe722..8e486c082 100644 --- a/bench/bench.js +++ b/bench/bench.js @@ -1,11 +1,11 @@ 'use strict'; module.exports = function bench(name) { - let start = process.hrtime(); + const start = process.hrtime(); return function end(ops) { - let elapsed = process.hrtime(start); - let time = elapsed[0] + elapsed[1] / 1e9; - let rate = ops / time; + const elapsed = process.hrtime(start); + const time = elapsed[0] + elapsed[1] / 1e9; + const rate = ops / time; console.log('%s: ops=%d, time=%d, rate=%s', name, ops, time, rate.toFixed(5)); diff --git a/bench/buffer.js b/bench/buffer.js index f2af99cc1..847a0e94e 100644 --- a/bench/buffer.js +++ b/bench/buffer.js @@ -1,31 +1,33 @@ 'use strict'; -const fs = require('fs'); -const TX = require('../lib/primitives/tx'); const BufferWriter = require('../lib/utils/writer'); const StaticWriter = require('../lib/utils/staticwriter'); +const common = require('../test/util/common'); const bench = require('./bench'); -let wtx = fs.readFileSync(`${__dirname}/../test/data/wtx.hex`, 'utf8'); -let i, tx, end; +const tx5 = common.readTX('tx5'); -wtx = Buffer.from(wtx.trim(), 'hex'); -tx = TX.fromRaw(wtx); - -end = bench('serialize (static-writer)'); -for (i = 0; i < 10000; i++) { - tx._raw = null; - tx._size = -1; - tx._witness = -1; - tx.writeWitness(new StaticWriter(tx.getWitnessSizes().total)).render(); +{ + const [tx] = tx5.getTX(); + const end = bench('serialize (static-writer)'); + for (let i = 0; i < 10000; i++) { + tx.refresh(); + const {size} = tx.getWitnessSizes(); + const bw = new StaticWriter(size); + tx.toWitnessWriter(bw); + bw.render(); + } + end(10000); } -end(i); -end = bench('serialize (buffer-writer)'); -for (i = 0; i < 10000; i++) { - tx._raw = null; - tx._size = -1; - tx._witness = -1; - tx.writeWitness(new BufferWriter()).render(); +{ + const [tx] = tx5.getTX(); + const end = bench('serialize (buffer-writer)'); + for (let i = 0; i < 10000; i++) { + tx.refresh(); + const bw = new BufferWriter(); + tx.toWitnessWriter(bw); + bw.render(); + } + end(10000); } -end(i); diff --git a/bench/chacha.js b/bench/chacha.js index c8a58ff4d..00249d33d 100644 --- a/bench/chacha.js +++ b/bench/chacha.js @@ -4,47 +4,53 @@ const ChaCha20 = require('../lib/crypto/chacha20'); const Poly1305 = require('../lib/crypto/poly1305'); const digest = require('../lib/crypto/digest'); const bench = require('./bench'); -let i, chacha, iv, poly, key, data, end; console.log('note: rate measured in kb/s'); -chacha = new ChaCha20(); -key = Buffer.allocUnsafe(32); -key.fill(2); -iv = Buffer.from('0102030405060708', 'hex'); +const chacha = new ChaCha20(); +const poly = new Poly1305(); +const key = Buffer.alloc(32, 0x02); +const iv = Buffer.from('0102030405060708', 'hex'); +const chunk = Buffer.allocUnsafe(32); +const data = Buffer.allocUnsafe(32); + +for (let i = 0; i < 32; i++) + chunk[i] = i; + +for (let i = 0; i < 32; i++) + data[i] = i & 0xff; + chacha.init(key, iv, 0); -data = Buffer.allocUnsafe(32); -for (i = 0; i < 32; i++) - data[i] = i; -end = bench('encrypt'); -for (i = 0; i < 1000000; i++) - chacha.encrypt(data); -end(i * 32 / 1024); - -poly = new Poly1305(); -key = Buffer.allocUnsafe(32); -key.fill(2); poly.init(key); -data = Buffer.allocUnsafe(32); -for (i = 0; i < 32; i++) - data[i] = i & 0xff; +{ + const end = bench('encrypt'); + for (let i = 0; i < 1000000; i++) + chacha.encrypt(chunk); + end(1000000 * 32 / 1024); +} -end = bench('update'); -for (i = 0; i < 1000000; i++) - poly.update(data); -end(i * 32 / 1024); +{ + const end = bench('update'); + for (let i = 0; i < 1000000; i++) + poly.update(data); + end(1000000 * 32 / 1024); +} -end = bench('finish'); -for (i = 0; i < 1000000; i++) { - poly.init(key); - poly.update(data); - poly.finish(); +{ + const end = bench('finish'); + for (let i = 0; i < 1000000; i++) { + poly.init(key); + poly.update(data); + poly.finish(); + } + end(1000000 * 32 / 1024); } -end(i * 32 / 1024); // For reference: -end = bench('sha256'); -for (i = 0; i < 1000000; i++) - digest.hash256(data); -end(i * 32 / 1024); +{ + const end = bench('sha256'); + for (let i = 0; i < 1000000; i++) + digest.hash256(data); + end(1000000 * 32 / 1024); +} diff --git a/bench/coins-old.js b/bench/coins-old.js deleted file mode 100644 index 4fcf5dfcd..000000000 --- a/bench/coins-old.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const bench = require('./bench'); -const Coins = require('../migrate/coins-old'); -const TX = require('../lib/primitives/tx'); - -let wtx = fs.readFileSync(`${__dirname}/../test/data/wtx.hex`, 'utf8'); -wtx = TX.fromRaw(wtx.trim(), 'hex'); - -let coins = Coins.fromTX(wtx); -let i, j, end, raw, hash; - -//raw = coins.toRaw(); -//console.log(Coins.fromRaw(raw)); - -end = bench('serialize'); -for (i = 0; i < 10000; i++) - raw = coins.toRaw(); -end(i); - -end = bench('parse'); -for (i = 0; i < 10000; i++) - Coins.fromRaw(raw); -end(i); - -end = bench('parse-single'); -hash = wtx.hash('hex'); -for (i = 0; i < 10000; i++) - Coins.parseCoin(raw, hash, 5); -end(i); - -coins = Coins.fromRaw(raw); -end = bench('get'); - -for (i = 0; i < 10000; i++) - for (j = 0; j < coins.outputs.length; j++) - coins.get(j); -end(i * coins.outputs.length); diff --git a/bench/coins.js b/bench/coins.js index 3392b05f4..31f63c6b1 100644 --- a/bench/coins.js +++ b/bench/coins.js @@ -1,35 +1,38 @@ 'use strict'; -const fs = require('fs'); const Coins = require('../lib/coins/coins'); -const TX = require('../lib/primitives/tx'); +const common = require('../test/util/common'); const bench = require('./bench'); -let raw = fs.readFileSync(`${__dirname}/../test/data/wtx.hex`, 'utf8'); -let wtx = TX.fromRaw(raw.trim(), 'hex'); -let coins = Coins.fromTX(wtx, 1); -let i, j, end, hash; - -end = bench('serialize'); -for (i = 0; i < 10000; i++) - raw = coins.toRaw(); -end(i); - -end = bench('parse'); -for (i = 0; i < 10000; i++) - Coins.fromRaw(raw); -end(i); - -end = bench('parse-single'); -hash = wtx.hash('hex'); -for (i = 0; i < 10000; i++) - Coins.parseCoin(raw, hash, 5); -end(i); - -coins = Coins.fromRaw(raw); -end = bench('get'); -for (i = 0; i < 10000; i++) { - for (j = 0; j < coins.outputs.length; j++) - coins.get(j); +const [tx] = common.readTX('tx5').getTX(); +const coins = Coins.fromTX(tx, 1); +const raw = coins.toRaw(); + +{ + const end = bench('serialize'); + + for (let i = 0; i < 10000; i++) + coins.toRaw(); + + end(10000); +} + +{ + const end = bench('parse'); + + for (let i = 0; i < 10000; i++) + Coins.fromRaw(raw); + + end(10000); +} + +{ + const end = bench('get'); + + for (let i = 0; i < 10000; i++) { + for (let j = 0; j < coins.outputs.length; j++) + coins.get(j); + } + + end(10000 * coins.outputs.length); } -end(i * coins.outputs.length); diff --git a/bench/merkle.js b/bench/merkle.js index bcbe090a8..85f6d6a09 100644 --- a/bench/merkle.js +++ b/bench/merkle.js @@ -11,12 +11,11 @@ for (let i = 0; i < 3000; i++) leaves.push(random.randomBytes(32)); { - let end = bench('tree'); - let i; - for (i = 0; i < 1000; i++) { - let [n, m] = merkle.createTree(leaves.slice()); + const end = bench('tree'); + for (let i = 0; i < 1000; i++) { + const [n, m] = merkle.createTree(leaves.slice()); assert(n); assert(!m); } - end(i); + end(1000); } diff --git a/bench/mnemonic.js b/bench/mnemonic.js index e37e5953a..ce9f250e4 100644 --- a/bench/mnemonic.js +++ b/bench/mnemonic.js @@ -5,15 +5,16 @@ const bench = require('./bench'); const HD = require('../lib/hd'); const Mnemonic = require('../lib/hd/mnemonic'); -let mnemonic = new Mnemonic(); +const mnemonic = new Mnemonic(); HD.fromMnemonic(mnemonic); -let phrase = mnemonic.getPhrase(); -let i, end; +const phrase = mnemonic.getPhrase(); -assert.equal(Mnemonic.fromPhrase(phrase).getPhrase(), phrase); +assert.strictEqual(Mnemonic.fromPhrase(phrase).getPhrase(), phrase); -end = bench('fromPhrase'); -for (i = 0; i < 10000; i++) - Mnemonic.fromPhrase(phrase); -end(i); +{ + const end = bench('fromPhrase'); + for (let i = 0; i < 10000; i++) + Mnemonic.fromPhrase(phrase); + end(10000); +} diff --git a/bench/script.js b/bench/script.js index c867073a9..e138b43ca 100644 --- a/bench/script.js +++ b/bench/script.js @@ -1,37 +1,17 @@ 'use strict'; -const assert = require('assert'); const random = require('../lib/crypto/random'); const Script = require('../lib/script/script'); const bench = require('./bench'); -const opcodes = Script.opcodes; -let i, hashes, end; -Script.prototype.fromPubkeyhashOld = function fromScripthash(hash) { - assert(Buffer.isBuffer(hash) && hash.length === 20); - this.push(opcodes.OP_DUP); - this.push(opcodes.OP_HASH160); - this.push(hash); - this.push(opcodes.OP_EQUALVERIFY); - this.push(opcodes.OP_CHECKSIG); - this.compile(); - return this; -}; +const hashes = []; -Script.fromPubkeyhashOld = function fromScripthash(hash) { - return new Script().fromPubkeyhashOld(hash); -}; - -hashes = []; -for (i = 0; i < 100000; i++) +for (let i = 0; i < 100000; i++) hashes.push(random.randomBytes(20)); -end = bench('old'); -for (i = 0; i < hashes.length; i++) - Script.fromPubkeyhashOld(hashes[i]); -end(i); - -end = bench('hash'); -for (i = 0; i < hashes.length; i++) - Script.fromPubkeyhash(hashes[i]); -end(i); +{ + const end = bench('hash'); + for (let i = 0; i < hashes.length; i++) + Script.fromPubkeyhash(hashes[i]); + end(100000); +} diff --git a/bench/tx.js b/bench/tx.js index 7d0374260..b6baa7cef 100644 --- a/bench/tx.js +++ b/bench/tx.js @@ -1,144 +1,200 @@ 'use strict'; -const fs = require('fs'); -const Block = require('../lib/primitives/block'); const Address = require('../lib/primitives/address'); const TX = require('../lib/primitives/tx'); const Script = require('../lib/script/script'); const MTX = require('../lib/primitives/mtx'); -const Coin = require('../lib/primitives/coin'); -const CoinView = require('../lib/coins/coinview'); const encoding = require('../lib/utils/encoding'); const random = require('../lib/crypto/random'); +const common = require('../test/util/common'); const bench = require('./bench'); -let json = require('../test/data/block300025.json'); -let block = Block.fromJSON(json); -let btx = { tx: block.txs[397], view: new CoinView() }; +const tx3 = common.readTX('tx3'); +const tx5 = common.readTX('tx5'); +const tx10 = common.readTX('tx10'); -let tx3 = parseTX('../test/data/tx3.hex'); -let wtx = fs.readFileSync(`${__dirname}/../test/data/wtx.hex`, 'utf8'); -let i, tx, end, flags, input; +{ + const raw = tx5.getRaw(); + const end = bench('parse'); -wtx = Buffer.from(wtx.trim(), 'hex'); + for (let i = 0; i < 10000; i++) + TX.fromRaw(raw); -tx = json.txs[397]; -for (i = 0; i < tx.inputs.length; i++) { - input = tx.inputs[i]; - btx.view.addCoin(Coin.fromJSON(input.coin)); + end(10000); } -function parseTX(file) { - let data = fs.readFileSync(`${__dirname}/${file}`, 'utf8'); - let parts = data.trim().split(/\n+/); - let raw = parts[0]; - let tx = TX.fromRaw(raw.trim(), 'hex'); - let view = new CoinView(); - let i, prev; +{ + const [tx, view] = tx5.getTX(); + const end = bench('sigops'); - for (i = 1; i < parts.length; i++) { - raw = parts[i]; - prev = TX.fromRaw(raw.trim(), 'hex'); - view.addTX(prev, -1); + for (let i = 0; i < 100000; i++) + tx.getSigopsCost(view); + + end(100000); +} + +{ + const [tx] = tx5.getTX(); + const end = bench('serialize'); + + for (let i = 0; i < 10000; i++) { + tx._raw = null; + tx.toRaw(); } - return { tx: tx, view: view }; + end(10000); } -end = bench('parse'); -for (i = 0; i < 1000; i++) - tx = TX.fromRaw(wtx); -end(i); +{ + const [tx] = tx3.getTX(); + const end = bench('hash'); + + for (let i = 0; i < 30000; i++) { + tx.hash(); + tx._hash = null; + } -end = bench('serialize'); -for (i = 0; i < 1000; i++) { - tx._raw = null; - tx.toRaw(); + end(30000); } -end(i); -end = bench('hash'); -for (i = 0; i < 3000; i++) { - tx3.tx.hash(); - tx3.tx._hash = null; +{ + const [tx] = tx5.getTX(); + const end = bench('witness hash'); + + for (let i = 0; i < 30000; i++) { + tx.witnessHash(); + tx._whash = null; + } + + end(30000); } -end(i); -end = bench('witness hash'); -for (i = 0; i < 3000; i++) { - tx.witnessHash(); - tx._whash = null; +{ + const [tx] = tx5.getTX(); + const end = bench('sanity'); + + for (let i = 0; i < 10000; i++) + tx.isSane(); + + end(10000); } -end(i); -end = bench('sanity'); -for (i = 0; i < 1000; i++) - tx.isSane(); -end(i); +{ + const [tx] = tx5.getTX(); + const end = bench('input hashes'); -end = bench('input hashes'); -for (i = 0; i < 1000; i++) - tx.getInputHashes(null, 'hex'); -end(i); + for (let i = 0; i < 10000; i++) + tx.getInputHashes(null, 'hex'); -end = bench('output hashes'); -for (i = 0; i < 1000; i++) - tx.getOutputHashes('hex'); -end(i); + end(10000); +} + +{ + const [tx] = tx5.getTX(); + const end = bench('output hashes'); + + for (let i = 0; i < 10000; i++) + tx.getOutputHashes('hex'); + + end(10000); +} -end = bench('all hashes'); -for (i = 0; i < 1000; i++) - tx.getHashes(null, 'hex'); -end(i); +{ + const [tx] = tx5.getTX(); + const end = bench('all hashes'); -end = bench('verify'); -for (i = 0; i < 3000; i++) - tx3.tx.verify(tx3.view, Script.flags.VERIFY_P2SH); -end(i * tx3.tx.inputs.length); + for (let i = 0; i < 10000; i++) + tx.getHashes(null, 'hex'); -end = bench('fee'); -for (i = 0; i < 1000; i++) - tx3.tx.getFee(tx3.view); -end(i); + end(10000); +} + +{ + const [tx, view] = tx3.getTX(); + const end = bench('verify'); + + for (let i = 0; i < 30000; i++) + tx.verify(view, Script.flags.VERIFY_P2SH); + + end(30000 * tx.inputs.length); +} -flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_DERSIG; -end = bench('verify multisig'); -for (i = 0; i < 3000; i++) - btx.tx.verify(btx.view, flags); -end(i * btx.tx.inputs.length); +{ + const [tx, view] = tx3.getTX(); + const {script} = view.getOutputFor(tx.inputs[0]); + const end = bench('sighash'); -tx = new MTX(); + for (let i = 0; i < 1000000; i++) + tx.signatureHashV0(0, script, Script.hashType.ALL); -for (i = 0; i < 100; i++) { - tx.addInput({ + end(1000000); +} + +{ + const [tx, view] = tx3.getTX(); + const end = bench('fee'); + + for (let i = 0; i < 10000; i++) + tx.getFee(view); + + end(10000); +} + +{ + const [tx, view] = tx10.getTX(); + const flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_DERSIG; + const end = bench('verify multisig'); + + for (let i = 0; i < 30000; i++) + tx.verify(view, flags); + + end(30000 * tx.inputs.length); +} + +const mtx = new MTX(); + +for (let i = 0; i < 100; i++) { + mtx.addInput({ prevout: { hash: encoding.NULL_HASH, index: 0 }, - script: [ - Buffer.allocUnsafe(9), - random.randomBytes(33) - ] + script: new Script() + .pushData(Buffer.allocUnsafe(9)) + .pushData(random.randomBytes(33)) + .compile() }); - tx.addOutput({ + mtx.addOutput({ address: Address.fromHash(random.randomBytes(20)), value: 0 }); } -tx = tx.toTX(); +const tx2 = mtx.toTX(); + +{ + const end = bench('input hashes'); + + for (let i = 0; i < 10000; i++) + tx2.getInputHashes(null, 'hex'); + + end(10000); +} + +{ + const end = bench('output hashes'); + + for (let i = 0; i < 10000; i++) + tx2.getOutputHashes('hex'); -end = bench('input hashes'); -for (i = 0; i < 1000; i++) - tx.getInputHashes(null, 'hex'); -end(i); + end(10000); +} -end = bench('output hashes'); -for (i = 0; i < 1000; i++) - tx.getOutputHashes('hex'); -end(i); +{ + const end = bench('all hashes'); -end = bench('all hashes'); -for (i = 0; i < 1000; i++) - tx.getHashes(null, 'hex'); -end(i); + for (let i = 0; i < 10000; i++) + tx2.getHashes(null, 'hex'); + + end(10000); +} diff --git a/bench/walletdb.js b/bench/walletdb.js index 2d7c04930..226024c86 100644 --- a/bench/walletdb.js +++ b/bench/walletdb.js @@ -5,115 +5,128 @@ const random = require('../lib/crypto/random'); const WalletDB = require('../lib/wallet/walletdb'); const MTX = require('../lib/primitives/mtx'); const Outpoint = require('../lib/primitives/outpoint'); -let walletdb; function dummy() { - let hash = random.randomBytes(32).toString('hex'); + const hash = random.randomBytes(32).toString('hex'); return new Outpoint(hash, 0); } -walletdb = new WalletDB({ +const walletdb = new WalletDB({ name: 'wallet-test', db: 'memory', resolution: false, verify: false }); -async function runBench() { - let i, j, wallet, addrs, jobs, end; - let result, tx, mtx, options; - +(async () => { // Open and Create await walletdb.open(); - wallet = await walletdb.create(); - addrs = []; + + const wallet = await walletdb.create(); + const addrs = []; + let tx; // Accounts - jobs = []; - for (i = 0; i < 1000; i++) - jobs.push(wallet.createAccount({})); + { + const jobs = []; + for (let i = 0; i < 1000; i++) + jobs.push(wallet.createAccount({})); - end = bench('accounts'); - result = await Promise.all(jobs); - end(1000); + const end = bench('accounts'); + const result = await Promise.all(jobs); + end(1000); - for (i = 0; i < result.length; i++) - addrs.push(result[i].receive.getAddress()); + for (const addr of result) + addrs.push(addr.receive.getAddress()); + } // Keys - jobs = []; - for (i = 0; i < 1000; i++) { - for (j = 0; j < 10; j++) - jobs.push(wallet.createReceive(i)); + { + const jobs = []; + for (let i = 0; i < 1000; i++) { + for (let j = 0; j < 10; j++) + jobs.push(wallet.createReceive(i)); + } + + const end = bench('keys'); + const result = await Promise.all(jobs); + end(1000 * 10); + + for (const addr of result) + addrs.push(addr.getAddress()); } - end = bench('keys'); - result = await Promise.all(jobs); - end(1000 * 10); - - for (i = 0; i < result.length; i++) - addrs.push(result[i].getAddress()); - // TX deposit - jobs = []; - for (i = 0; i < 10000; i++) { - mtx = new MTX(); - mtx.addOutpoint(dummy()); - mtx.addOutput(addrs[(i + 0) % addrs.length], 50460); - mtx.addOutput(addrs[(i + 1) % addrs.length], 50460); - mtx.addOutput(addrs[(i + 2) % addrs.length], 50460); - mtx.addOutput(addrs[(i + 3) % addrs.length], 50460); - tx = mtx.toTX(); - - jobs.push(walletdb.addTX(tx)); + { + const jobs = []; + for (let i = 0; i < 10000; i++) { + const mtx = new MTX(); + mtx.addOutpoint(dummy()); + mtx.addOutput(addrs[(i + 0) % addrs.length], 50460); + mtx.addOutput(addrs[(i + 1) % addrs.length], 50460); + mtx.addOutput(addrs[(i + 2) % addrs.length], 50460); + mtx.addOutput(addrs[(i + 3) % addrs.length], 50460); + tx = mtx.toTX(); + + jobs.push(walletdb.addTX(tx)); + } + + const end = bench('deposit'); + await Promise.all(jobs); + end(10000); } - end = bench('deposit'); - result = await Promise.all(jobs); - end(10000); - // TX redemption - jobs = []; - for (i = 0; i < 10000; i++) { - mtx = new MTX(); - mtx.addTX(tx, 0); - mtx.addTX(tx, 1); - mtx.addTX(tx, 2); - mtx.addTX(tx, 3); - mtx.addOutput(addrs[(i + 0) % addrs.length], 50460); - mtx.addOutput(addrs[(i + 1) % addrs.length], 50460); - mtx.addOutput(addrs[(i + 2) % addrs.length], 50460); - mtx.addOutput(addrs[(i + 3) % addrs.length], 50460); - tx = mtx.toTX(); - - jobs.push(walletdb.addTX(tx)); + { + const jobs = []; + for (let i = 0; i < 10000; i++) { + const mtx = new MTX(); + mtx.addTX(tx, 0); + mtx.addTX(tx, 1); + mtx.addTX(tx, 2); + mtx.addTX(tx, 3); + mtx.addOutput(addrs[(i + 0) % addrs.length], 50460); + mtx.addOutput(addrs[(i + 1) % addrs.length], 50460); + mtx.addOutput(addrs[(i + 2) % addrs.length], 50460); + mtx.addOutput(addrs[(i + 3) % addrs.length], 50460); + tx = mtx.toTX(); + + jobs.push(walletdb.addTX(tx)); + } + + const end = bench('redemption'); + await Promise.all(jobs); + end(10000); } - end = bench('redemption'); - result = await Promise.all(jobs); - end(10000); - // Balance - end = bench('balance'); - result = await wallet.getBalance(); - end(1); + { + const end = bench('balance'); + await wallet.getBalance(); + end(1); + } // Coins - end = bench('coins'); - result = await wallet.getCoins(); - end(1); + { + const end = bench('coins'); + await wallet.getCoins(); + end(1); + } // Create - end = bench('create'); - options = { - rate: 10000, - outputs: [{ - value: 50460, - address: addrs[0] - }] - }; - await wallet.createTX(options); - end(1); -} - -runBench().then(process.exit); + { + const end = bench('create'); + const options = { + rate: 10000, + outputs: [{ + value: 50460, + address: addrs[0] + }] + }; + await wallet.createTX(options); + end(1); + } +})().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/bin/cli b/bin/cli index 353237ee3..77abe537c 100755 --- a/bin/cli +++ b/bin/cli @@ -7,6 +7,10 @@ const util = require('../lib/utils/util'); const Client = require('../lib/http/client'); const Wallet = require('../lib/http/wallet'); +const ANTIREPLAY = '' + + '6a2e426974636f696e3a204120506565722d746f2d5065657' + + '220456c656374726f6e696320436173682053797374656d'; + function CLI() { this.config = new Config('bcoin'); @@ -25,29 +29,27 @@ function CLI() { CLI.prototype.log = function log(json) { if (typeof json === 'string') return console.log.apply(console, arguments); - console.log(JSON.stringify(json, null, 2)); + return console.log(JSON.stringify(json, null, 2)); }; CLI.prototype.getInfo = async function getInfo() { - let info = await this.client.getInfo(); + const info = await this.client.getInfo(); this.log(info); }; CLI.prototype.getWallets = async function getWallets() { - let wallets = await this.client.getWallets(); + const wallets = await this.client.getWallets(); this.log(wallets); }; CLI.prototype.createWallet = async function createWallet() { - let options, wallet; - - options = { + const options = { id: this.config.str([0, 'id']), type: this.config.str('type'), master: this.config.str('master'), mnemonic: this.config.str('mnemonic'), - m: this.config.num('m'), - n: this.config.num('n'), + m: this.config.uint('m'), + n: this.config.uint('n'), witness: this.config.bool('witness'), passphrase: this.config.str('passphrase'), watchOnly: false, @@ -59,111 +61,117 @@ CLI.prototype.createWallet = async function createWallet() { options.accountKey = this.config.str('watch'); } - wallet = await this.client.createWallet(options); + const wallet = await this.client.createWallet(options); this.log(wallet); }; CLI.prototype.getMaster = async function getMaster() { - let master = await this.wallet.getMaster(); + const master = await this.wallet.getMaster(); this.log(master); }; CLI.prototype.getKey = async function getKey() { - let address = this.config.str(0); - let key = await this.wallet.getKey(address); + const address = this.config.str(0); + const key = await this.wallet.getKey(address); this.log(key); }; CLI.prototype.getWIF = async function getWIF() { - let address = this.config.str(0); - let passphrase = this.config.str('passphrase'); - let key = await this.wallet.getWIF(address, passphrase); + const address = this.config.str(0); + const passphrase = this.config.str('passphrase'); + const key = await this.wallet.getWIF(address, passphrase); + if (!key) { + this.log('Key not found.'); + return; + } this.log(key.privateKey); }; CLI.prototype.addSharedKey = async function addSharedKey() { - let key = this.config.str(0); - let account = this.config.str('account'); + const key = this.config.str(0); + const account = this.config.str('account'); await this.wallet.addSharedKey(account, key); this.log('Added key.'); }; CLI.prototype.removeSharedKey = async function removeSharedKey() { - let key = this.config.str(0); - let account = this.config.str('account'); + const key = this.config.str(0); + const account = this.config.str('account'); await this.wallet.removeSharedKey(account, key); this.log('Removed key.'); }; CLI.prototype.getSharedKeys = async function getSharedKeys() { - let acct = this.config.str([0, 'account']); - let account = await this.wallet.getAccount(acct); + const acct = this.config.str([0, 'account']); + const account = await this.wallet.getAccount(acct); + if (!account) { + this.log('Account not found.'); + return; + } this.log(account.keys); }; CLI.prototype.getAccount = async function getAccount() { - let acct = this.config.str([0, 'account']); - let account = await this.wallet.getAccount(acct); + const acct = this.config.str([0, 'account']); + const account = await this.wallet.getAccount(acct); this.log(account); }; CLI.prototype.createAccount = async function createAccount() { - let name = this.config.str([0, 'name']); - let options, account; + const name = this.config.str([0, 'name']); - options = { + const options = { type: this.config.str('type'), - m: this.config.num('m'), - n: this.config.num('n'), + m: this.config.uint('m'), + n: this.config.uint('n'), witness: this.config.bool('witness'), accountKey: this.config.str('watch') }; - account = await this.wallet.createAccount(name, options); + const account = await this.wallet.createAccount(name, options); this.log(account); }; CLI.prototype.createAddress = async function createAddress() { - let account = this.config.str([0, 'account']); - let addr = await this.wallet.createAddress(account); + const account = this.config.str([0, 'account']); + const addr = await this.wallet.createAddress(account); this.log(addr); }; CLI.prototype.createChange = async function createChange() { - let account = this.config.str([0, 'account']); - let addr = await this.wallet.createChange(account); + const account = this.config.str([0, 'account']); + const addr = await this.wallet.createChange(account); this.log(addr); }; CLI.prototype.createNested = async function createNested() { - let account = this.config.str([0, 'account']); - let addr = await this.wallet.createNested(account); + const account = this.config.str([0, 'account']); + const addr = await this.wallet.createNested(account); this.log(addr); }; CLI.prototype.getAccounts = async function getAccounts() { - let accounts = await this.wallet.getAccounts(); + const accounts = await this.wallet.getAccounts(); this.log(accounts); }; CLI.prototype.getWallet = async function getWallet() { - let info = await this.wallet.getInfo(); + const info = await this.wallet.getInfo(); this.log(info); }; CLI.prototype.getTX = async function getTX() { - let hash = this.config.str(0); - let txs, tx; + const hash = this.config.str(0); if (util.isBase58(hash)) { - txs = await this.client.getTXByAddress(hash); + const txs = await this.client.getTXByAddress(hash); this.log(txs); return; } - tx = await this.client.getTX(hash); + const tx = await this.client.getTX(hash); if (!tx) { this.log('TX not found.'); @@ -175,12 +183,11 @@ CLI.prototype.getTX = async function getTX() { CLI.prototype.getBlock = async function getBlock() { let hash = this.config.str(0); - let block; if (hash.length !== 64) - hash = +hash; + hash = parseInt(hash, 10); - block = await this.client.getBlock(hash); + const block = await this.client.getBlock(hash); if (!block) { this.log('Block not found.'); @@ -191,17 +198,16 @@ CLI.prototype.getBlock = async function getBlock() { }; CLI.prototype.getCoin = async function getCoin() { - let hash = this.config.str(0); - let index = this.config.num(1); - let coins, coin; + const hash = this.config.str(0); + const index = this.config.uint(1); if (util.isBase58(hash)) { - coins = await this.client.getCoinsByAddress(hash); + const coins = await this.client.getCoinsByAddress(hash); this.log(coins); return; } - coin = await this.client.getCoin(hash, index); + const coin = await this.client.getCoin(hash, index); if (!coin) { this.log('Coin not found.'); @@ -212,20 +218,20 @@ CLI.prototype.getCoin = async function getCoin() { }; CLI.prototype.getWalletHistory = async function getWalletHistory() { - let account = this.config.str('account'); - let txs = await this.wallet.getHistory(account); + const account = this.config.str('account'); + const txs = await this.wallet.getHistory(account); this.log(txs); }; CLI.prototype.getWalletPending = async function getWalletPending() { - let account = this.config.str('account'); - let txs = await this.wallet.getPending(account); + const account = this.config.str('account'); + const txs = await this.wallet.getPending(account); this.log(txs); }; CLI.prototype.getWalletCoins = async function getWalletCoins() { - let account = this.config.str('account'); - let coins = await this.wallet.getCoins(account); + const account = this.config.str('account'); + const coins = await this.wallet.getCoins(account); this.log(coins); }; @@ -266,124 +272,132 @@ CLI.prototype.listenWallet = async function listenWallet() { }; CLI.prototype.getBalance = async function getBalance() { - let account = this.config.str('account'); - let balance = await this.wallet.getBalance(account); + const account = this.config.str('account'); + const balance = await this.wallet.getBalance(account); this.log(balance); }; CLI.prototype.getMempool = async function getMempool() { - let txs = await this.client.getMempool(); + const txs = await this.client.getMempool(); this.log(txs); }; CLI.prototype.sendTX = async function sendTX() { - let output, options, tx; + const outputs = []; if (this.config.has('script')) { - output = { + outputs.push({ script: this.config.str('script'), - value: this.config.amt([0, 'value']) - }; + value: this.config.ufixed([0, 'value'], 8) + }); } else { - output = { + outputs.push({ address: this.config.str([0, 'address']), - value: this.config.amt([1, 'value']) - }; + value: this.config.ufixed([1, 'value'], 8) + }); } - options = { + if (this.config.bool('no-replay')) { + outputs.push({ + script: ANTIREPLAY, + value: 0 + }); + } + + const options = { account: this.config.str('account'), passphrase: this.config.str('passphrase'), - outputs: [output], + outputs: outputs, smart: this.config.bool('smart'), - rate: this.config.amt('rate'), + rate: this.config.ufixed('rate', 8), subtractFee: this.config.bool('subtract-fee') }; - tx = await this.wallet.send(options); + const tx = await this.wallet.send(options); this.log(tx); }; CLI.prototype.createTX = async function createTX() { - let output, options, tx; + let output; if (this.config.has('script')) { output = { script: this.config.str('script'), - value: this.config.amt([0, 'value']) + value: this.config.ufixed([0, 'value'], 8) }; } else { output = { address: this.config.str([0, 'address']), - value: this.config.amt([1, 'value']) + value: this.config.ufixed([1, 'value'], 8) }; } - options = { + const options = { account: this.config.str('account'), passphrase: this.config.str('passphrase'), outputs: [output], smart: this.config.bool('smart'), - rate: this.config.amt('rate') + rate: this.config.ufixed('rate', 8), + subtractFee: this.config.bool('subtract-fee') }; - tx = await this.wallet.createTX(options); + const tx = await this.wallet.createTX(options); this.log(tx); }; CLI.prototype.signTX = async function signTX() { - let passphrase = this.config.str('passphrase'); - let raw = this.config.str([0, 'tx']); - let tx = await this.wallet.sign(raw, { passphrase }); + const passphrase = this.config.str('passphrase'); + const raw = this.config.str([0, 'tx']); + const tx = await this.wallet.sign(raw, { passphrase }); this.log(tx); }; CLI.prototype.zapWallet = async function zapWallet() { - let age = this.config.num([0, 'age'], 72 * 60 * 60); + const age = this.config.uint([0, 'age'], 72 * 60 * 60); await this.wallet.zap(this.config.str('account'), age); this.log('Zapped!'); }; CLI.prototype.broadcast = async function broadcast() { - let raw = this.config.str([0, 'tx']); - let tx = await this.client.broadcast(raw); + const raw = this.config.str([0, 'tx']); + const tx = await this.client.broadcast(raw); this.log('Broadcasted:'); this.log(tx); }; CLI.prototype.viewTX = async function viewTX() { - let raw = this.config.str([0, 'tx']); - let tx = await this.wallet.fill(raw); + const raw = this.config.str([0, 'tx']); + const tx = await this.wallet.fill(raw); this.log(tx); }; CLI.prototype.getDetails = async function getDetails() { - let hash = this.config.str(0); - let details = await this.wallet.getTX(hash); + const hash = this.config.str(0); + const details = await this.wallet.getTX(hash); this.log(details); }; CLI.prototype.getWalletBlocks = async function getWalletBlocks() { - let blocks = await this.wallet.getBlocks(); + const blocks = await this.wallet.getBlocks(); this.log(blocks); }; CLI.prototype.getWalletBlock = async function getWalletBlock() { - let height = this.config.num(0); - let block = await this.wallet.getBlock(height); + const height = this.config.uint(0); + const block = await this.wallet.getBlock(height); this.log(block); }; CLI.prototype.retoken = async function retoken() { - let result = await this.wallet.retoken(); + const result = await this.wallet.retoken(); this.log(result); }; CLI.prototype.rescan = async function rescan() { - let height = this.config.num(0); + const height = this.config.uint(0); await this.client.rescan(height); this.log('Rescanning...'); }; @@ -392,7 +406,7 @@ CLI.prototype.reset = async function reset() { let hash = this.config.str(0); if (hash.length !== 64) - hash = +hash; + hash = parseInt(hash, 10); await this.client.reset(hash); @@ -410,7 +424,7 @@ CLI.prototype.resendWallet = async function resendWallet() { }; CLI.prototype.backup = async function backup() { - let path = this.config.str(0); + const path = this.config.str(0); await this.client.backup(path); @@ -418,8 +432,8 @@ CLI.prototype.backup = async function backup() { }; CLI.prototype.importKey = async function importKey() { - let key = this.config.str(0); - let account = this.config.str('account'); + const key = this.config.str(0); + const account = this.config.str('account'); if (!key) throw new Error('No key for import.'); @@ -439,9 +453,9 @@ CLI.prototype.importKey = async function importKey() { throw new Error('Bad key for import.'); }; -CLI.prototype.importAddress = async function importKey() { - let address = this.config.str(0); - let account = this.config.str('account'); +CLI.prototype.importAddress = async function importAddress() { + const address = this.config.str(0); + const account = this.config.str('account'); await this.wallet.importAddress(account, address); this.log('Imported address.'); }; @@ -452,18 +466,17 @@ CLI.prototype.lock = async function lock() { }; CLI.prototype.unlock = async function unlock() { - let passphrase = this.config.str(0); - let timeout = this.config.num(1); + const passphrase = this.config.str(0); + const timeout = this.config.uint(1); await this.wallet.unlock(passphrase, timeout); this.log('Unlocked.'); }; CLI.prototype.rpc = async function rpc() { - let method = this.argv.shift(); - let params = []; - let result; + const method = this.argv.shift(); + const params = []; - for (let arg of this.argv) { + for (const arg of this.argv) { let param; try { param = JSON.parse(arg); @@ -473,6 +486,7 @@ CLI.prototype.rpc = async function rpc() { params.push(param); } + let result; try { result = await this.client.rpc.execute(method, params); } catch (e) { @@ -497,81 +511,113 @@ CLI.prototype.handleWallet = async function handleWallet() { switch (this.argv.shift()) { case 'listen': - return await this.listenWallet(); + await this.listenWallet(); + break; case 'get': - return await this.getWallet(); + await this.getWallet(); + break; case 'master': - return await this.getMaster(); + await this.getMaster(); + break; case 'shared': if (this.argv[0] === 'add') { this.argv.shift(); - return await this.addSharedKey(); + await this.addSharedKey(); + break; } if (this.argv[0] === 'remove') { this.argv.shift(); - return await this.removeSharedKey(); + await this.removeSharedKey(); + break; } if (this.argv[0] === 'list') this.argv.shift(); - return await this.getSharedKeys(); + await this.getSharedKeys(); + break; case 'balance': - return await this.getBalance(); + await this.getBalance(); + break; case 'history': - return await this.getWalletHistory(); + await this.getWalletHistory(); + break; case 'pending': - return await this.getWalletPending(); + await this.getWalletPending(); + break; case 'coins': - return await this.getWalletCoins(); + await this.getWalletCoins(); + break; case 'account': if (this.argv[0] === 'list') { this.argv.shift(); - return await this.getAccounts(); + await this.getAccounts(); + break; } if (this.argv[0] === 'create') { this.argv.shift(); - return await this.createAccount(); + await this.createAccount(); + break; } if (this.argv[0] === 'get') this.argv.shift(); - return await this.getAccount(); + await this.getAccount(); + break; case 'address': - return await this.createAddress(); + await this.createAddress(); + break; case 'change': - return await this.createChange(); + await this.createChange(); + break; case 'nested': - return await this.createNested(); + await this.createNested(); + break; case 'retoken': - return await this.retoken(); + await this.retoken(); + break; case 'sign': - return await this.signTX(); + await this.signTX(); + break; case 'mktx': - return await this.createTX(); + await this.createTX(); + break; case 'send': - return await this.sendTX(); + await this.sendTX(); + break; case 'zap': - return await this.zapWallet(); + await this.zapWallet(); + break; case 'tx': - return await this.getDetails(); + await this.getDetails(); + break; case 'blocks': - return await this.getWalletBlocks(); + await this.getWalletBlocks(); + break; case 'block': - return await this.getWalletBlock(); + await this.getWalletBlock(); + break; case 'view': - return await this.viewTX(); + await this.viewTX(); + break; case 'import': - return await this.importKey(); + await this.importKey(); + break; case 'watch': - return await this.importAddress(); + await this.importAddress(); + break; case 'key': - return await this.getKey(); + await this.getKey(); + break; case 'dump': - return await this.getWIF(); + await this.getWIF(); + break; case 'lock': - return await this.lock(); + await this.lock(); + break; case 'unlock': - return await this.unlock(); + await this.unlock(); + break; case 'resend': - return await this.resendWallet(); + await this.resendWallet(); + break; default: this.log('Unrecognized command.'); this.log('Commands:'); @@ -607,9 +653,9 @@ CLI.prototype.handleWallet = async function handleWallet() { this.log(' $ unlock [passphrase] [timeout?]: Unlock wallet.'); this.log(' $ resend: Resend pending transactions.'); this.log('Other Options:'); - this.log(' --passphrase [passphrase]: For signing and account creation.'); + this.log(' --passphrase [passphrase]: For signing & account creation.'); this.log(' --account [account-name]: Account name.'); - return; + break; } }; @@ -622,31 +668,44 @@ CLI.prototype.handleNode = async function handleNode() { switch (this.argv.shift()) { case 'info': - return await this.getInfo(); + await this.getInfo(); + break; case 'wallets': - return await this.getWallets(); + await this.getWallets(); + break; case 'mkwallet': - return await this.createWallet(); + await this.createWallet(); + break; case 'broadcast': - return await this.broadcast(); + await this.broadcast(); + break; case 'mempool': - return await this.getMempool(); + await this.getMempool(); + break; case 'tx': - return await this.getTX(); + await this.getTX(); + break; case 'coin': - return await this.getCoin(); + await this.getCoin(); + break; case 'block': - return await this.getBlock(); + await this.getBlock(); + break; case 'rescan': - return await this.rescan(); + await this.rescan(); + break; case 'reset': - return await this.reset(); + await this.reset(); + break; case 'resend': - return await this.resend(); + await this.resend(); + break; case 'backup': - return await this.backup(); + await this.backup(); + break; case 'rpc': - return await this.rpc(); + await this.rpc(); + break; default: this.log('Unrecognized command.'); this.log('Commands:'); @@ -663,7 +722,7 @@ CLI.prototype.handleNode = async function handleNode() { this.log(' $ resend: Resend pending transactions.'); this.log(' $ backup [path]: Backup the wallet db.'); this.log(' $ rpc [command] [args]: Execute RPC command.'); - return; + break; } }; @@ -674,29 +733,33 @@ CLI.prototype.open = async function open() { this.argv.shift(); if (this.argv[0] === 'create') { this.argv[0] = 'mkwallet'; - return await this.handleNode(); + await this.handleNode(); + break; } - return await this.handleWallet(); + await this.handleWallet(); + break; default: - return await this.handleNode(); + await this.handleNode(); + break; } }; CLI.prototype.destroy = function destroy() { if (this.wallet) this.wallet.client.destroy(); + if (this.client) this.client.destroy(); + return Promise.resolve(); }; -async function main() { - let cli = new CLI(); +(async () => { + const cli = new CLI(); await cli.open(); await cli.destroy(); -} - -main().then(process.exit).catch((err) => { - console.error(err.stack + ''); - return process.exit(1); + process.exit(0); +})().catch((err) => { + console.error(err.stack); + process.exit(1); }); diff --git a/bin/node b/bin/node index e3b15645f..3ed9a5ee5 100755 --- a/bin/node +++ b/bin/node @@ -19,10 +19,9 @@ if (process.argv.indexOf('--version') !== -1 throw new Error('Could not exit.'); } -const bcoin = require('../'); -const plugin = require('../lib/wallet/plugin'); +const FullNode = require('../lib/node/fullnode'); -const node = new bcoin.fullnode({ +const node = new FullNode({ config: true, argv: true, env: true, @@ -37,8 +36,10 @@ const node = new bcoin.fullnode({ }); // Temporary hack -if (!node.config.bool('no-wallet') && !node.has('walletdb')) +if (!node.config.bool('no-wallet') && !node.has('walletdb')) { + const plugin = require('../lib/wallet/plugin'); node.use(plugin); +} process.on('unhandledRejection', (err, promise) => { throw err; diff --git a/bin/spvnode b/bin/spvnode index d10e981ad..71fae73e3 100755 --- a/bin/spvnode +++ b/bin/spvnode @@ -5,11 +5,11 @@ process.title = 'bcoin'; const assert = require('assert'); -const bcoin = require('../'); -const plugin = require('../lib/wallet/plugin'); -const util = bcoin.util; +const SPVNode = require('../lib/node/spvnode'); +const util = require('../lib/utils/util'); +const Outpoint = require('../lib/primitives/outpoint'); -const node = bcoin.spvnode({ +const node = SPVNode({ config: true, argv: true, env: true, @@ -24,8 +24,10 @@ const node = bcoin.spvnode({ }); // Temporary hack -if (!node.has('walletdb')) +if (!node.has('walletdb')) { + const plugin = require('../lib/wallet/plugin'); node.use(plugin); +} process.on('unhandledRejection', (err, promise) => { throw err; @@ -38,7 +40,7 @@ process.on('unhandledRejection', (err, promise) => { if (node.config.bool('test')) { node.pool.watchAddress('1VayNert3x1KzbpzMGt2qdqrAThiRovi8'); - node.pool.watchOutpoint(new bcoin.outpoint()); + node.pool.watchOutpoint(new Outpoint()); node.on('block', (block) => { assert(block.txs.length >= 1); if (block.txs.length > 1) diff --git a/browser/server.js b/browser/server.js index ea3775126..9d914fbf6 100644 --- a/browser/server.js +++ b/browser/server.js @@ -1,6 +1,6 @@ 'use strict'; -const fs = require('fs'); +const fs = require('../lib/utils/fs'); const HTTPBase = require('../lib/http/base'); const WSProxy = require('./wsproxy'); @@ -10,22 +10,22 @@ const debug = fs.readFileSync(`${__dirname}/debug.html`); const bcoin = fs.readFileSync(`${__dirname}/bcoin.js`); const worker = fs.readFileSync(`${__dirname}/bcoin-worker.js`); -let proxy = new WSProxy({ +const proxy = new WSProxy({ pow: process.argv.indexOf('--pow') !== -1, ports: [8333, 18333, 18444, 28333, 28901] }); -let server = new HTTPBase({ - port: +process.argv[2] || 8080, +const server = new HTTPBase({ + port: Number(process.argv[2]) || 8080, sockets: false }); proxy.on('error', (err) => { - console.error(err.stack + ''); + console.error(err.stack); }); server.on('error', (err) => { - console.error(err.stack + ''); + console.error(err.stack); }); server.get('/favicon.ico', (req, res) => { diff --git a/browser/wsproxy.js b/browser/wsproxy.js index 5aef4e16b..b92121174 100644 --- a/browser/wsproxy.js +++ b/browser/wsproxy.js @@ -1,5 +1,6 @@ 'use strict'; +const assert = require('assert'); const net = require('net'); const EventEmitter = require('events').EventEmitter; const IOServer = require('socket.io'); @@ -8,8 +9,6 @@ const digest = require('../lib/crypto/digest'); const IP = require('../lib/utils/ip'); const BufferWriter = require('../lib/utils/writer'); -const NAME_REGEX = /^[a-z0-9\-\.]+?\.(?:be|me|org|com|net|ch|de)$/i; - const TARGET = Buffer.from( '0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 'hex'); @@ -26,27 +25,32 @@ function WSProxy(options) { this.options = options; this.target = options.target || TARGET; this.pow = options.pow === true; - this.ports = options.ports || []; + this.ports = new Set(); this.io = new IOServer(); this.sockets = new WeakMap(); - this._init(); + if (options.ports) { + for (const port of options.ports) + this.ports.add(port); + } + + this.init(); } -util.inherits(WSProxy, EventEmitter); +Object.setPrototypeOf(WSProxy.prototype, EventEmitter.prototype); -WSProxy.prototype._init = function _init() { +WSProxy.prototype.init = function init() { this.io.on('error', (err) => { this.emit('error', err); }); this.io.on('connection', (ws) => { - this._handleSocket(ws); + this.handleSocket(ws); }); }; -WSProxy.prototype._handleSocket = function _handleSocket(ws) { - let state = new SocketState(this, ws); +WSProxy.prototype.handleSocket = function handleSocket(ws) { + const state = new SocketState(this, ws); // Use a weak map to avoid // mutating the websocket object. @@ -59,20 +63,20 @@ WSProxy.prototype._handleSocket = function _handleSocket(ws) { }); ws.on('tcp connect', (port, host, nonce) => { - this._handleConnect(ws, port, host, nonce); + this.handleConnect(ws, port, host, nonce); }); }; -WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce) { - let state = this.sockets.get(ws); - let socket, pow, raw; +WSProxy.prototype.handleConnect = function handleConnect(ws, port, host, nonce) { + const state = this.sockets.get(ws); + assert(state); if (state.socket) { this.log('Client is trying to reconnect (%s).', state.host); return; } - if (!util.isNumber(port) + if (!util.isU16(port) || typeof host !== 'string' || host.length === 0) { this.log('Client gave bad arguments (%s).', state.host); @@ -82,19 +86,20 @@ WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce } if (this.pow) { - if (!util.isNumber(nonce)) { + if (!util.isU32(nonce)) { this.log('Client did not solve proof of work (%s).', state.host); ws.emit('tcp close'); ws.disconnect(); return; } - pow = new BufferWriter(); - pow.writeU32(nonce); - pow.writeBytes(state.snonce); - pow.writeU32(port); - pow.writeString(host, 'ascii'); - pow = pow.render(); + const bw = new BufferWriter(); + bw.writeU32(nonce); + bw.writeBytes(state.snonce); + bw.writeU32(port); + bw.writeString(host, 'ascii'); + + const pow = bw.render(); if (digest.hash256(pow).compare(this.target) > 0) { this.log('Client did not solve proof of work (%s).', state.host); @@ -104,9 +109,10 @@ WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce } } + let raw, addr; try { raw = IP.toBuffer(host); - host = IP.toString(raw); + addr = IP.toString(raw); } catch (e) { this.log('Client gave a bad host: %s (%s).', host, state.host); ws.emit('tcp error', { @@ -120,7 +126,7 @@ WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce if (!IP.isRoutable(raw) || IP.isOnion(raw)) { this.log( 'Client is trying to connect to a bad ip: %s (%s).', - host, state.host); + addr, state.host); ws.emit('tcp error', { message: 'ENETUNREACH', code: 'ENETUNREACH' @@ -129,7 +135,7 @@ WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce return; } - if (this.ports.indexOf(port) === -1) { + if (!this.ports.has(port)) { this.log('Client is connecting to non-whitelist port (%s).', state.host); ws.emit('tcp error', { message: 'ENETUNREACH', @@ -139,8 +145,9 @@ WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce return; } + let socket; try { - socket = state.connect(port, host); + socket = state.connect(port, addr); this.log('Connecting to %s (%s).', state.remoteHost, state.host); } catch (e) { this.log(e.message); diff --git a/docs/Example-Connecting-to-the-P2P-Network.md b/docs/Example-Connecting-to-the-P2P-Network.md deleted file mode 100644 index c25453d91..000000000 --- a/docs/Example-Connecting-to-the-P2P-Network.md +++ /dev/null @@ -1,86 +0,0 @@ -``` js -var bcoin = require('bcoin').set('main'); - -// Create a blockchain and store it in leveldb. -// `db` also accepts `rocksdb` and `lmdb`. -var prefix = process.env.HOME + '/my-bcoin-environment'; -var chain = new bcoin.chain({ db: 'leveldb', location: prefix + '/chain' }); - -var mempool = new bcoin.mempool({ chain: chain }); - -// Create a network pool of peers with a limit of 8 peers. -var pool = new bcoin.pool({ chain: chain, mempool: mempool, maxPeers: 8 }); - -// Open the pool (implicitly opens mempool and chain). -(async function() { - await pool.open(); - - // Connect, start retrieving and relaying txs - await pool.connect(); - - // Start the blockchain sync. - pool.startSync(); - - // Watch the action - chain.on('block', function(block) { - console.log('Connected block to blockchain:'); - console.log(block); - }); - - mempool.on('tx', function(tx) { - console.log('Added tx to mempool:'); - console.log(tx); - }); - - pool.on('tx', function(tx) { - console.log('Saw transaction:'); - console.log(tx.rhash); - }); -})(); - -// Start up a segnet4 sync in-memory -// while we're at it (because we can). - -var tchain = new bcoin.chain({ - network: 'segnet4', - db: 'memory' -}); - -var tmempool = new bcoin.mempool({ - network: 'segnet4', - chain: tchain -}); - -var tpool = new bcoin.pool({ - network: 'segnet4', - chain: tchain, - mempool: tmempool, - size: 8 -}); - -(async function() { - await pool.open(); - - // Connect, start retrieving and relaying txs - await tpool.connect(); - - // Start the blockchain sync. - tpool.startSync(); - - tchain.on('block', function(block) { - console.log('Added segnet4 block:'); - console.log(block); - }); - - tmempool.on('tx', function(tx) { - console.log('Added segnet4 tx to mempool:'); - console.log(tx); - }); - - tpool.on('tx', function(tx) { - console.log('Saw segnet4 transaction:'); - console.log(tx); - }); -})(); - -``` \ No newline at end of file diff --git a/docs/Example-Creating-a-Blockchain-and-Mempool.md b/docs/Example-Creating-a-Blockchain-and-Mempool.md deleted file mode 100644 index 0941d9319..000000000 --- a/docs/Example-Creating-a-Blockchain-and-Mempool.md +++ /dev/null @@ -1,35 +0,0 @@ -``` js -var bcoin = require('bcoin'); - -bcoin.set({ - // Default network (so we can avoid passing - // the `network` option into every object below. - network: 'regtest', - // Enable the global worker pool - // for mining and transaction verification. - useWorkers: true -}); - -// Start up a blockchain, mempool, and miner using in-memory -// databases (stored in a red-black tree instead of on-disk). -var chain = new bcoin.chain({ db: 'memory' }); -var mempool = new bcoin.mempool({ chain: chain }); -var miner = new bcoin.miner({ chain: chain, mempool: mempool }); - -// Open the miner (initialize the databases, etc). -// Miner will implicitly call `open` on chain and mempool. -miner.open().then(function() { - // Create a Cpu miner job - return miner.createJob(); -}).then(function(job) { - // Mine the block on the worker pool (use mine() for the master process) - return job.mineAsync(); -}).then(function(block) { - // Add the block to the chain - console.log('Adding %s to the blockchain.', block.rhash); - console.log(block); - return chain.add(block); -}).then(function() { - console.log('Added block!'); -}); -``` \ No newline at end of file diff --git a/docs/Example-Fullnode-Object.md b/docs/Example-Fullnode-Object.md deleted file mode 100644 index 92ddf4715..000000000 --- a/docs/Example-Fullnode-Object.md +++ /dev/null @@ -1,72 +0,0 @@ -``` js -var bcoin = require('bcoin').set('main'); - -var node = bcoin.fullnode({ - checkpoints: true, - // Primary wallet passphrase - passsphrase: 'node', - logLevel: 'info' -}); - -// We get a lot of errors sometimes, -// usually from peers hanging up on us. -// Just ignore them for now. -node.on('error', function(err) { - ; -}); - -// Start the node -node.open().then(function() { - // Create a new wallet (or get an existing one with the same ID) - var options = { - id: 'mywallet', - passphrase: 'foo', - witness: false, - type: 'pubkeyhash' - }; - - return node.walletdb.create(options); -}).then(function(wallet) { - console.log('Created wallet with address: %s', wallet.getAddress('base58')); - - node.connect().then(function() { - // Start syncing the blockchain - node.startSync(); - }); - - // Wait for balance and send it to a new address. - wallet.once('balance', function(balance) { - // Create a transaction, fill - // it with coins, and sign it. - var options = { - subtractFee: true, - outputs: [{ - address: newReceiving, - value: balance.total - }] - }; - wallet.createTX(options).then(function(tx) { - // Need to pass our passphrase back in to sign! - return wallet.sign(tx, 'foo'); - }).then(function(tx) { - console.log('sending tx:'); - console.log(tx); - return node.sendTX(tx); - }).then(function() { - console.log('tx sent!'); - }); - }); -}); - -node.chain.on('block', function(block) { - ; -}); - -node.mempool.on('tx', function(tx) { - ; -}); - -node.chain.on('full', function() { - node.mempool.getHistory().then(console.log); -}); -``` \ No newline at end of file diff --git a/docs/Example-SPV-Sync.md b/docs/Example-SPV-Sync.md deleted file mode 100644 index 1a08fc25a..000000000 --- a/docs/Example-SPV-Sync.md +++ /dev/null @@ -1,44 +0,0 @@ -``` js -var bcoin = require('bcoin').set('testnet'); - -// SPV chains only store the chain headers. -var chain = new bcoin.chain({ - db: 'leveldb', - location: process.env.HOME + '/spvchain', - spv: true -}); - -var pool = new bcoin.pool({ - chain: chain, - spv: true, - maxPeers: 8 -}); - -var walletdb = new bcoin.walletdb({ db: 'memory' }); - -pool.open().then(function() { - return walletdb.open(); -}).then(function() { - return walletdb.create(); -}).then(function(wallet) { - console.log('Created wallet with address %s', wallet.getAddress('base58')); - - // Add our address to the spv filter. - pool.watchAddress(wallet.getAddress()); - - // Connect, start retrieving and relaying txs - pool.connect().then(function() { - // Start the blockchain sync. - pool.startSync(); - - pool.on('tx', function(tx) { - walletdb.addTX(tx); - }); - - wallet.on('balance', function(balance) { - console.log('Balance updated.'); - console.log(bcoin.amount.btc(balance.unconfirmed)); - }); - }); -}); -``` \ No newline at end of file diff --git a/examples/client.js b/docs/Examples/client-api.js similarity index 54% rename from examples/client.js rename to docs/Examples/client-api.js index bce7efae8..2dbf1d0e2 100644 --- a/examples/client.js +++ b/docs/Examples/client-api.js @@ -1,15 +1,15 @@ 'use strict'; -const encoding = require('bcoin/lib/utils/encoding'); -const co = require('bcoin/lib/utils/co'); -const Outpoint = require('bcoin/lib/primitives/outpoint'); -const MTX = require('bcoin/lib/primitives/mtx'); -const HTTP = require('bcoin/lib/http'); -const FullNode = require('bcoin/lib/node/fullnode'); -const plugin = require('bcoin/lib/wallet/plugin'); -let node, wallet; - -node = new FullNode({ +const bcoin = require('../..'); +const encoding = bcoin.encoding; +const co = bcoin.co; +const Outpoint = bcoin.outpoint; +const MTX = bcoin.mtx; +const HTTP = bcoin.http; +const FullNode = bcoin.fullnode; +const plugin = bcoin.wallet.plugin; + +const node = new FullNode({ network: 'regtest', apiKey: 'foo', walletAuth: true, @@ -18,22 +18,21 @@ node = new FullNode({ node.use(plugin); -wallet = new HTTP.Wallet({ +const wallet = new HTTP.Wallet({ network: 'regtest', apiKey: 'foo' }); async function fundWallet(wdb, addr) { - let tx; - // Coinbase - tx = new MTX(); - tx.addOutpoint(new Outpoint(encoding.NULL_HASH, 0)); - tx.addOutput(addr, 50460); - tx.addOutput(addr, 50460); - tx.addOutput(addr, 50460); - tx.addOutput(addr, 50460); - tx = tx.toTX(); + const mtx = new MTX(); + mtx.addOutpoint(new Outpoint(encoding.NULL_HASH, 0)); + mtx.addOutput(addr, 50460); + mtx.addOutput(addr, 50460); + mtx.addOutput(addr, 50460); + mtx.addOutput(addr, 50460); + + const tx = mtx.toTX(); wallet.once('balance', (balance) => { console.log('New Balance:'); @@ -55,9 +54,7 @@ async function fundWallet(wdb, addr) { } async function sendTX(addr, value) { - let options, tx; - - options = { + const options = { rate: 10000, outputs: [{ value: value, @@ -65,31 +62,29 @@ async function sendTX(addr, value) { }] }; - tx = await wallet.send(options); + const tx = await wallet.send(options); return tx.hash; } async function callNodeApi() { - let info = await wallet.client.getInfo(); - let json; + const info = await wallet.client.getInfo(); console.log('Server Info:'); console.log(info); - json = await wallet.client.rpc.execute('getblocktemplate', []); + const json = await wallet.client.rpc.execute('getblocktemplate', []); console.log('Block Template (RPC):'); console.log(json); } (async () => { - let wdb = node.require('walletdb'); - let w, acct, hash, balance, tx; + const wdb = node.require('walletdb'); await node.open(); - w = await wallet.create({ id: 'test' }); + const w = await wallet.create({ id: 'test' }); console.log('Wallet:'); console.log(w); @@ -97,26 +92,29 @@ async function callNodeApi() { // Fund default account. await fundWallet(wdb, w.account.receiveAddress); - balance = await wallet.getBalance(); + const balance = await wallet.getBalance(); console.log('Balance:'); console.log(balance); - acct = await wallet.createAccount('foo'); + const acct = await wallet.createAccount('foo'); console.log('Account:'); console.log(acct); // Send to our new account. - hash = await sendTX(acct.receiveAddress, 10000); + const hash = await sendTX(acct.receiveAddress, 10000); console.log('Sent TX:'); console.log(hash); - tx = await wallet.getTX(hash); + const tx = await wallet.getTX(hash); console.log('Sent TX details:'); console.log(tx); await callNodeApi(); -})(); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/examples/peer.js b/docs/Examples/connect-to-peer.js similarity index 62% rename from examples/peer.js rename to docs/Examples/connect-to-peer.js index a98757991..321cd141b 100644 --- a/examples/peer.js +++ b/docs/Examples/connect-to-peer.js @@ -1,14 +1,14 @@ 'use strict'; -// Usage: $ node ./examples/peer.js [ip]:[port] +// Usage: $ node ./docs/Examples/connect-to-peer.js [ip]:[port] -const Peer = require('bcoin/lib/net/peer'); -const NetAddress = require('bcoin/lib/primitives/netaddress'); -const Network = require('bcoin/lib/protocol/network'); +const bcoin = require('../..'); +const Peer = bcoin.peer; +const NetAddress = bcoin.netaddress; +const Network = bcoin.network; const network = Network.get('testnet'); -let peer, addr; -peer = Peer.fromOptions({ +const peer = Peer.fromOptions({ network: 'testnet', agent: 'my-subversion', hasWitness: () => { @@ -16,7 +16,9 @@ peer = Peer.fromOptions({ } }); -addr = NetAddress.fromHostname(process.argv[2], 'testnet'); +const addr = NetAddress.fromHostname(process.argv[2], 'testnet'); + +console.log(`Connecting to ${addr.hostname}`); peer.connect(addr); peer.tryOpen(); diff --git a/docs/Examples/connect-to-the-p2p-network.js b/docs/Examples/connect-to-the-p2p-network.js new file mode 100644 index 000000000..8024fa66d --- /dev/null +++ b/docs/Examples/connect-to-the-p2p-network.js @@ -0,0 +1,98 @@ +'use strict'; +const bcoin = require('../..').set('main'); +const Chain = bcoin.chain; +const Mempool = bcoin.mempool; +const Pool = bcoin.pool; + +// Create a blockchain and store it in leveldb. +// `db` also accepts `rocksdb` and `lmdb`. +const prefix = process.env.HOME + '/my-bcoin-environment'; +const chain = new Chain({ + db: 'leveldb', + location: prefix + '/chain', + network: 'main' +}); + +const mempool = new Mempool({ chain: chain }); + +// Create a network pool of peers with a limit of 8 peers. +const pool = new Pool({ + chain: chain, + mempool: mempool, + maxPeers: 8 +}); + +// Open the pool (implicitly opens mempool and chain). +(async function() { + await pool.open(); + + // Connect, start retrieving and relaying txs + await pool.connect(); + + // Start the blockchain sync. + pool.startSync(); + + // Watch the action + chain.on('block', (block) => { + console.log('Connected block to blockchain:'); + console.log(block); + }); + + mempool.on('tx', (tx) => { + console.log('Added tx to mempool:'); + console.log(tx); + }); + + pool.on('tx', (tx) => { + console.log('Saw transaction:'); + console.log(tx.rhash); + }); +})(); + +// Start up a testnet sync in-memory +// while we're at it (because we can). + +const tchain = new Chain({ + network: 'testnet', + db: 'memory' +}); + +const tmempool = new Mempool({ + network: 'testnet', + chain: tchain +}); + +const tpool = new Pool({ + network: 'testnet', + chain: tchain, + mempool: tmempool, + size: 8 +}); + +(async function() { + await tpool.open(); + + // Connect, start retrieving and relaying txs + await tpool.connect(); + + // Start the blockchain sync. + tpool.startSync(); + + tchain.on('block', (block) => { + console.log('Added testnet block:'); + console.log(block); + }); + + tmempool.on('tx', (tx) => { + console.log('Added testnet tx to mempool:'); + console.log(tx); + }); + + tpool.on('tx', (tx) => { + console.log('Saw testnet transaction:'); + console.log(tx); + }); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/docs/Examples/create-a-blockchain-and-mempool.js b/docs/Examples/create-a-blockchain-and-mempool.js new file mode 100644 index 000000000..1c3d42802 --- /dev/null +++ b/docs/Examples/create-a-blockchain-and-mempool.js @@ -0,0 +1,42 @@ +'use strict'; +const bcoin = require('../..'); +const Chain = bcoin.chain; +const Mempool = bcoin.mempool; +const Miner = bcoin.miner; + +// Default network (so we can avoid passing +// the `network` option into every object below.) +bcoin.set('regtest'); + +// Start up a blockchain, mempool, and miner using in-memory +// databases (stored in a red-black tree instead of on-disk). +const chain = new Chain({ db: 'memory' }); +const mempool = new Mempool({ chain: chain }); +const miner = new Miner({ + chain: chain, + mempool: mempool, + + // Make sure miner won't block the main thread. + useWorkers: true +}); + +(async () => { + // Open the miner (initialize the databases, etc). + // Miner will implicitly call `open` on chain and mempool. + await miner.open(); + + // Create a Cpu miner job + const job = await miner.createJob(); + + // run miner + const block = await job.mineAsync(); + + // Add the block to the chain + console.log('Adding %s to the blockchain.', block.rhash); + console.log(block); + await chain.add(block); + console.log('Added block!'); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/examples/tx.js b/docs/Examples/create-sign-tx.js similarity index 75% rename from examples/tx.js rename to docs/Examples/create-sign-tx.js index 42cfed458..6661626c2 100644 --- a/examples/tx.js +++ b/docs/Examples/create-sign-tx.js @@ -1,13 +1,15 @@ 'use strict'; -const bcoin = require('bcoin'); +/* eslint new-cap: "off" */ + +const bcoin = require('../..'); const assert = require('assert'); (async () => { - let master = bcoin.hd.generate(); - let key = master.derivePath('m/44/0/0/0/0'); - let keyring = new bcoin.keyring(key.privateKey); - let cb = new bcoin.mtx(); + const master = bcoin.hd.generate(); + const key = master.derivePath('m/44/0/0/0/0'); + const keyring = new bcoin.keyring(key.privateKey); + const cb = new bcoin.mtx(); cb.addInput({ prevout: new bcoin.outpoint(), @@ -22,16 +24,16 @@ const assert = require('assert'); }); // Our available coins. - let coins = []; + const coins = []; // Convert the coinbase output to a Coin // object and add it to our available coins. // In reality you might get these coins from a wallet. - let coin = bcoin.coin.fromTX(cb, 0, -1); + const coin = bcoin.coin.fromTX(cb, 0, -1); coins.push(coin); // Create our redeeming transaction. - let mtx = new bcoin.mtx(); + const mtx = new bcoin.mtx(); // Send 10,000 satoshis to ourself. mtx.addOutput({ @@ -39,9 +41,9 @@ const assert = require('assert'); value: 10000 }); - // Now that we've created the output, we can do some coin selection (the output - // must be added first so we know how much money is needed and also so we can - // accurately estimate the size for fee calculation). + // Now that we've created the output, we can do some coin selection (the + // output must be added first so we know how much money is needed and also so + // we can accurately estimate the size for fee calculation). // Select coins from our array and add inputs. // Calculate fee and add a change output. @@ -63,7 +65,7 @@ const assert = require('assert'); // Commit our transaction and make it immutable. // This turns it from an MTX into a TX. - let tx = mtx.toTX(); + const tx = mtx.toTX(); // The transaction should still verify. // Regular transactions require a coin diff --git a/docs/Examples/fullnode-and-wallet.js b/docs/Examples/fullnode-and-wallet.js new file mode 100644 index 000000000..50d64198f --- /dev/null +++ b/docs/Examples/fullnode-and-wallet.js @@ -0,0 +1,83 @@ +'use strict'; +const bcoin = require('../..').set('main'); +const walletPlugin = bcoin.wallet.plugin; + +const node = bcoin.fullnode({ + checkpoints: true, + // Primary wallet passphrase + passsphrase: 'node', + logLevel: 'info' +}); + +node.use(walletPlugin); + +// We get a lot of errors sometimes, +// usually from peers hanging up on us. +// Just ignore them for now. +node.on('error', (err) => { + ; +}); + +// New Address we'll be sending to. +const newReceiving = 'AddressHere'; + +// Start the node +(async () => { + await node.open(); + + const options = { + id: 'mywallet', + passphrase: 'foo', + witness: false, + type: 'pubkeyhash' + }; + + const walletdb = node.require('walletdb'); + + await walletdb.open(); + const wallet = await walletdb.create(options); + + console.log('Created wallet with address: %s', wallet.getAddress('base58')); + + await node.connect(); + + // Start syncing the blockchain + node.startSync(); + + // Wait for balance and send it to a new address. + wallet.once('balance', async (balance) => { + // Create a transaction, fill + // it with coins, and sign it. + const options = { + subtractFee: true, + outputs: [{ + address: newReceiving, + value: balance.total + }] + }; + + const tx = await wallet.createTX(options); + const stx = await wallet.sign(tx, 'foo'); + + console.log('sending tx:'); + console.log(stx); + + await node.sendTX(stx); + console.log('tx sent!'); + }); + + node.chain.on('block', (block) => { + ; + }); + + node.mempool.on('tx', (tx) => { + ; + }); + + node.chain.on('full', () => { + node.mempool.getHistory().then(console.log); + }); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/examples/node.js b/docs/Examples/fullnode.js similarity index 73% rename from examples/node.js rename to docs/Examples/fullnode.js index e9f2694e4..c63ec67ed 100644 --- a/examples/node.js +++ b/docs/Examples/fullnode.js @@ -1,6 +1,7 @@ 'use strict'; -const FullNode = require('bcoin/lib/node/fullnode'); +const bcoin = require('../..'); +const FullNode = bcoin.fullnode; const node = new FullNode({ network: 'testnet', @@ -21,4 +22,7 @@ const node = new FullNode({ }); node.startSync(); -})(); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/docs/Examples/get-tx-from-chain.js b/docs/Examples/get-tx-from-chain.js new file mode 100644 index 000000000..39c1646fc --- /dev/null +++ b/docs/Examples/get-tx-from-chain.js @@ -0,0 +1,52 @@ +'use strict'; + +const path = require('path'); +const bcoin = require('../..'); +const Chain = bcoin.chain; +const Logger = bcoin.logger; +const util = bcoin.util; + +const HOME = process.env.HOME; + +// Setup logger to see what's Bcoin doing. +const logger = new Logger({ + level: 'debug' +}); + +// Create chain for testnet, specify chain directory +const chain = new Chain({ + logger: logger, + network: 'testnet', + db: 'leveldb', + prefix: path.join(HOME, '.bcoin/testnet'), + indexTX: true, + indexAddress: true +}); + +(async () => { + await logger.open(); + await chain.open(); + + console.log('Current height:', chain.height); + + const entry = await chain.getEntry(50000); + console.log('Block at 50k:', entry); + + // eslint-disable-next-line max-len + const txhash = '4dd628123dcde4f2fb3a8b8a18b806721b56007e32497ebe76cde598ce1652af'; + const txmeta = await chain.db.getMeta(util.revHex(txhash)); + const tx = txmeta.tx; + const coinview = await chain.db.getSpentView(tx); + + console.log(`Tx with hash ${txhash}:`, txmeta); + console.log(`Tx input: ${tx.getInputValue(coinview)},` + + ` output: ${tx.getOutputValue()}, fee: ${tx.getFee(coinview)}`); + + // eslint-disable-next-line max-len + const bhash = '00000000077eacdd2c803a742195ba430a6d9545e43128ba55ec3c80beea6c0c'; + const block = await chain.db.getBlock(util.revHex(bhash)); + console.log(`Block with hash ${bhash}:`, block); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/examples/miner.js b/docs/Examples/miner-configs.js similarity index 61% rename from examples/miner.js rename to docs/Examples/miner-configs.js index e9ad7efe8..b6ad820b4 100644 --- a/examples/miner.js +++ b/docs/Examples/miner-configs.js @@ -1,9 +1,10 @@ 'use strict'; -const KeyRing = require('bcoin/lib/primitives/keyring'); -const WorkerPool = require('bcoin/lib/workers/workerpool'); -const Chain = require('bcoin/lib/blockchain/chain'); -const Miner = require('bcoin/lib/mining/miner'); +const bcoin = require('../..'); +const KeyRing = bcoin.keyring; +const WorkerPool = bcoin.workerpool; +const Chain = bcoin.chain; +const Miner = bcoin.miner; const key = KeyRing.generate('regtest'); @@ -24,17 +25,15 @@ const miner = new Miner({ }); (async () => { - let tmpl, job, block; - await miner.open(); - tmpl = await miner.createBlock(); + const tmpl = await miner.createBlock(); console.log('Block template:'); console.log(tmpl); - job = await miner.cpu.createJob(); - block = await job.mineAsync(); + const job = await miner.createJob(); + const block = await job.mineAsync(); console.log('Mined block:'); console.log(block); @@ -44,4 +43,7 @@ const miner = new Miner({ console.log('New tip:'); console.log(chain.tip); -})(); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/examples/plugin.js b/docs/Examples/peers-plugin.js similarity index 83% rename from examples/plugin.js rename to docs/Examples/peers-plugin.js index 3f9361bec..fb7881825 100644 --- a/examples/plugin.js +++ b/docs/Examples/peers-plugin.js @@ -1,6 +1,7 @@ 'use strict'; -const FullNode = require('bcoin/lib/node/fullnode'); +const bcoin = require('../..'); +const FullNode = bcoin.fullnode; function MyPlugin(node) { this.node = node; @@ -35,7 +36,7 @@ const node = new FullNode({ node.use(MyPlugin); (async () => { - let plugin = node.require('my-plugin'); + const plugin = node.require('my-plugin'); await node.open(); @@ -52,4 +53,7 @@ node.use(MyPlugin); }); node.startSync(); -})(); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/docs/Examples/spv-sync-wallet.js b/docs/Examples/spv-sync-wallet.js new file mode 100644 index 000000000..75f5992d5 --- /dev/null +++ b/docs/Examples/spv-sync-wallet.js @@ -0,0 +1,56 @@ +'use strict'; + +const bcoin = require('../..'); +const Chain = bcoin.chain; +const Pool = bcoin.pool; +const WalletDB = bcoin.walletdb; + +bcoin.set('testnet'); + +// SPV chains only store the chain headers. +const chain = Chain({ + db: 'leveldb', + location: process.env.HOME + '/spvchain', + spv: true +}); + +const pool = new Pool({ + chain: chain, + spv: true, + maxPeers: 8 +}); + +const walletdb = new WalletDB({ db: 'memory' }); + +(async () => { + await pool.open(); + await walletdb.open(); + + const wallet = await walletdb.create(); + + console.log('Created wallet with address %s', wallet.getAddress('base58')); + + // Add our address to the spv filter. + pool.watchAddress(wallet.getAddress()); + + // Connect, start retrieving and relaying txs + await pool.connect(); + + // Start the blockchain sync. + pool.startSync(); + + pool.on('tx', async (tx) => { + console.log('received TX'); + + await walletdb.addTX(tx); + console.log('Transaction added to walletDB'); + }); + + wallet.on('balance', (balance) => { + console.log('Balance updated.'); + console.log(bcoin.amount.btc(balance.unconfirmed)); + }); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/examples/wallet.js b/docs/Examples/wallet.js similarity index 50% rename from examples/wallet.js rename to docs/Examples/wallet.js index 7268dfe79..fc066e14e 100644 --- a/examples/wallet.js +++ b/docs/Examples/wallet.js @@ -1,12 +1,13 @@ 'use strict'; -const random = require('bcoin/lib/crypto/random'); -const WalletDB = require('bcoin/lib/wallet/walletdb'); -const MTX = require('bcoin/lib/primitives/mtx'); -const Outpoint = require('bcoin/lib/primitives/outpoint'); +const bcoin = require('../..'); +const random = bcoin.crypto.random; +const WalletDB = bcoin.walletdb; +const MTX = bcoin.mtx; +const Outpoint = bcoin.outpoint; function dummy() { - let hash = random.randomBytes(32).toString('hex'); + const hash = random.randomBytes(32).toString('hex'); return new Outpoint(hash, 0); } @@ -16,31 +17,33 @@ const walletdb = new WalletDB({ }); (async () => { - let wallet, acct, mtx, tx, wtx; - await walletdb.open(); - wallet = await walletdb.create(); + const wallet = await walletdb.create(); console.log('Created wallet'); console.log(wallet); - acct = await wallet.createAccount({ + const acct = await wallet.createAccount({ name: 'foo' }); console.log('Created account'); console.log(acct); - mtx = new MTX(); + const mtx = new MTX(); mtx.addOutpoint(dummy()); mtx.addOutput(acct.getReceive(), 50460); - tx = mtx.toTX(); + + const tx = mtx.toTX(); await walletdb.addTX(tx); - wtx = await wallet.getTX(tx.hash('hex')); + const wtx = await wallet.getTX(tx.hash('hex')); console.log('Added transaction'); console.log(wtx); -})(); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/docs/README.md b/docs/README.md index 6c9e14677..928cedaa8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,10 +13,18 @@ Welcome to the bcoin docs! - [REST and RPC API][rest-rpc] ## Code Examples +- [Simple Fullnode][example-simple-fullnode] +- [Connect to Peer][example-connect-peer] - [Connecting to the P2P Network][example-p2p] - [Creating a Blockchain and Mempool][example-blockchain] -- [Fullnode Object][example-fullnode] +- [Wallet with Dummy TX][example-wallet-dummy] +- [Fullnode Object][example-fullnode-wallet] - [SPV Sync][example-spv] +- [Plugin Example][example-peers-plugin] +- [Client API Usage][example-client-api] +- [Miner with WorkerPool][example-miner-configs] +- [Create and Sign TX][example-tx-create-sign] +- [Get Transaction from Chain][example-tx-from-chain] ## Advanced - [Working with transactions][work-transactions] @@ -36,7 +44,15 @@ Welcome to the bcoin docs! [work-transactions]: Working-with-transactions.md [scripting]: Scripting.md -[example-p2p]: Example-Connecting-to-the-P2P-Network.md -[example-blockchain]: Example-Creating-a-Blockchain-and-Mempool.md -[example-fullnode]: Example-Fullnode-Object.md -[example-spv]: Example-SPV-Sync.md +[example-p2p]: Examples/connect-to-the-p2p-network.js +[example-blockchain]: Examples/create-a-blockchain-and-mempool.js +[example-fullnode-wallet]: Examples/fullnode-and-wallet.js +[example-spv]: Examples/spv-sync-wallet.js +[example-wallet-dummy]: Examples/wallet.js +[example-peers-plugin]: Examples/peers-plugin.js +[example-client-api]: Examples/client-api.js +[example-miner-configs]: Examples/miner-configs.js +[example-connect-peer]: Examples/connect-to-peer.js +[example-simple-fullnode]: Examples/fullnode.js +[example-tx-create-sign]: Examples/create-sign-tx.js +[example-tx-from-chain]: Examples/get-tx-from-chain.js diff --git a/docs/REST-RPC-API.md b/docs/REST-RPC-API.md index a37f9f61d..132d70687 100644 --- a/docs/REST-RPC-API.md +++ b/docs/REST-RPC-API.md @@ -80,6 +80,8 @@ Example: Get coins by address. Returns coins in bcoin coin json format. +*Note: Without `index-address` option, it won't return from chain(only mempool).* + ### GET /coin/:hash/:index Get coin by outpoint (hash and index). Returns coin in bcoin coin json format. @@ -95,7 +97,9 @@ Example: ### GET /tx/:hash -Get transaction by TXID. Returns TX in bcoin transaction json format. +Get transaction by TXID from Chain or Mempool. Returns TX in bcoin transaction json format. + +*Note: Without `index-tx` option, it won't return from chain.* ### GET /tx/address/:address @@ -173,29 +177,29 @@ POST /wallet/:id/send GET /wallet/:id/tx/:hash?token=[64 character hex string] ``` -### POST /rescan +### POST /wallet/_admin/rescan Initiates a blockchain rescan for the walletdb. Wallets will be rolled back to the specified height (transactions above this height will be unconfirmed). Example: -- Request: POST /rescan?height=100000 +- Request: POST /wallet/_admin/rescan?height=100000 - Response Body: `{"success":true}` -### POST /resend +### POST /wallet/_admin/resend Rebroadcast all pending transactions in all wallets. -### POST /backup +### POST /wallet/_admin/backup Safely backup the wallet database to specified path (creates a clone of the database). Example: -- Request: POST /backup?path=/home/user/walletdb-backup.ldb +- Request: POST /wallet/_admin/backup?path=/home/user/walletdb-backup.ldb - Response Body: `{"success":true}` -### GET /wallets +### GET /wallet/_admin/wallets List all wallet IDs. Returns an array of strings. @@ -478,8 +482,8 @@ Example: "hash": "0de09025e68b78e13f5543f46a9516fa37fcc06409bf03eda0e85ed34018f822", "height": -1, "block": null, - "ts": 0, - "ps": 1486685530, + "time": 0, + "mtime": 1486685530, "date": "2017-02-10T00:12:10Z", "index": -1, "size": 226, @@ -549,7 +553,7 @@ Do not broadcast or add to wallet. "witnessHash": "0799a1d3ebfd108d2578a60e1b685350d42e1ef4d5cd326f99b8bf794c81ed17", "fee": "0.0000454", "rate": "0.00020088", - "ps": 1486686322, + "mtime": 1486686322, "version": 1, "flag": 1, "inputs": [ @@ -626,7 +630,7 @@ Example: { "hash": "39864ce2f29635638bbdc3e943b3a182040fdceb6679fa3dabc8c827e05ff6a7", "height": 3, - "ts": 1485471341, + "time": 1485471341, "hashes": [ "dd1a110edcdcbb3110a1cbe0a545e4b0a7813ffa5e77df691478205191dad66f" ] @@ -716,7 +720,7 @@ Example: List all wallet coins available. -### GET /wallet/:id/coin/locked +### GET /wallet/:id/locked Get all locked outpoints. @@ -728,11 +732,11 @@ Example: [{"hash":"dd1a110edcdcbb3110a1cbe0a545e4b0a7813ffa5e77df691478205191dad66f","index":0}] ``` -### PUT /wallet/:id/coin/locked +### PUT /wallet/:id/locked/:hash/:index Lock outpoints. -### DEL /wallet/:id/coin/locked +### DEL /wallet/:id/locked/:hash/:index Unlock outpoints. @@ -846,8 +850,8 @@ Example: "hash": "0de09025e68b78e13f5543f46a9516fa37fcc06409bf03eda0e85ed34018f822", "height": -1, "block": null, - "ts": 0, - "ps": 1486685530, + "time": 0, + "mtime": 1486685530, "date": "2017-02-10T00:12:10Z", "index": -1, "size": 226, @@ -951,4 +955,4 @@ Example: "type": "pubkeyhash", "address": "mwX8J1CDGUqeQcJPnjNBG4s97vhQsJG7Eq" } -``` \ No newline at end of file +``` diff --git a/docs/Scripting.md b/docs/Scripting.md index d6c7682aa..dc44083dd 100644 --- a/docs/Scripting.md +++ b/docs/Scripting.md @@ -1,37 +1,38 @@ Scripts are array-like objects with some helper functions. ``` js -var bcoin = require('bcoin'); -var assert = require('assert'); -var BN = bcoin.bn; -var opcodes = bcoin.script.opcodes; +const bcoin = require('bcoin'); +const assert = require('assert'); +const Script = bcoin.script; +const Witness = bcoin.witness; +const Stack = bcoin.stack; -var output = new bcoin.script(); -output.push(opcodes.OP_DROP); -output.push(opcodes.OP_ADD); -output.push(new BN(7)); -output.push(opcodes.OP_NUMEQUAL); +const output = new Script(); +output.pushSym('OP_DROP'); +output.pushSym('OP_ADD'); +output.pushInt(7); +output.pushSym('OP_NUMEQUAL'); // Compile the script to its binary representation // (you must do this if you change something!). -output.compile(); assert(output.getSmall(2) === 7); // compiled as OP_7 +output.compile(); -var input = new bcoin.script(); -input.set(0, 'hello world'); // add some metadata -input.push(new BN(2)); -input.push(new BN(5)); +const input = new Script(); +input.setString(0, 'hello world'); // add some metadata +input.pushInt(2); +input.pushInt(5); input.push(input.shift()); assert(input.getString(2) === 'hello world'); input.compile(); // A stack is another array-like object which contains // only Buffers (whereas scripts contain Opcode objects). -var stack = new bcoin.stack(); +const stack = new Stack(); input.execute(stack); output.execute(stack); // Verify the script was successful in its execution: assert(stack.length === 1); -assert(bcoin.script.bool(stack.pop()) === true); +assert(stack.getBool(-1) === true); ``` Using a witness would be similar, but witnesses do not get executed, they @@ -39,11 +40,11 @@ simply _become_ the stack. The witness object itself is very similar to the Stack object (an array-like object containing Buffers). ``` js -var witness = new bcoin.witness(); -witness.push(new BN(2)); -witness.push(new BN(5)); -witness.push('hello world'); +const witness = new Witness(); +witness.pushInt(2); +witness.pushInt(5); +witness.pushString('hello world'); -var stack = witness.toStack(); +const stack = witness.toStack(); output.execute(stack); -``` \ No newline at end of file +``` diff --git a/examples/chain.js b/examples/chain.js deleted file mode 100644 index 703b7dc26..000000000 --- a/examples/chain.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -const Chain = require('bcoin/lib/blockchain/chain'); - -const chain = new Chain({ - network: 'testnet' -}); - -(async () => { - let entry; - - await chain.open(); - - entry = await chain.getEntry(0); - - console.log(entry); -})(); diff --git a/lib/bcoin-browser.js b/lib/bcoin-browser.js index 17374c9b9..1bd05f0f8 100644 --- a/lib/bcoin-browser.js +++ b/lib/bcoin-browser.js @@ -240,6 +240,7 @@ bcoin.txscript = require('./script'); bcoin.opcode = require('./script/opcode'); bcoin.program = require('./script/program'); bcoin.script = require('./script/script'); +bcoin.scriptnum = require('./script/scriptnum'); bcoin.sigcache = require('./script/sigcache'); bcoin.stack = require('./script/stack'); bcoin.witness = require('./script/witness'); diff --git a/lib/bcoin.js b/lib/bcoin.js index b6b37b2de..92dc153f5 100644 --- a/lib/bcoin.js +++ b/lib/bcoin.js @@ -5,6 +5,8 @@ * https://github.com/bcoin-org/bcoin */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; /** @@ -130,12 +132,14 @@ const bcoin = exports; * @param {String} path */ -bcoin.define = function _require(name, path) { +bcoin.define = function define(name, path) { let cache; - bcoin.__defineGetter__(name, function() { - if (!cache) - cache = require(path); - return cache; + Object.defineProperty(bcoin, name, { + get() { + if (!cache) + cache = require(path); + return cache; + } }); }; @@ -273,6 +277,7 @@ bcoin.define('txscript', './script'); bcoin.define('opcode', './script/opcode'); bcoin.define('program', './script/program'); bcoin.define('script', './script/script'); +bcoin.define('scriptnum', './script/scriptnum'); bcoin.define('sigcache', './script/sigcache'); bcoin.define('stack', './script/stack'); bcoin.define('witness', './script/witness'); diff --git a/lib/bip70/payment.js b/lib/bip70/payment.js index 7c0ff6e12..d5ab654b9 100644 --- a/lib/bip70/payment.js +++ b/lib/bip70/payment.js @@ -51,16 +51,16 @@ Payment.prototype.fromOptions = function fromOptions(options) { if (options.transactions) { assert(Array.isArray(options.transactions)); - for (let item of options.transactions) { - let tx = new TX(item); + for (const item of options.transactions) { + const tx = new TX(item); this.transactions.push(tx); } } if (options.refundTo) { assert(Array.isArray(options.refundTo)); - for (let item of options.refundTo) { - let output = new Output(item); + for (const item of options.refundTo) { + const output = new Output(item); this.refundTo.push(output); } } @@ -111,18 +111,18 @@ Payment.prototype.getData = PaymentDetails.prototype.getData; */ Payment.prototype.fromRaw = function fromRaw(data) { - let br = new ProtoReader(data); + const br = new ProtoReader(data); this.merchantData = br.readFieldBytes(1, true); while (br.nextTag() === 2) { - let tx = TX.fromRaw(br.readFieldBytes(2)); + const tx = TX.fromRaw(br.readFieldBytes(2)); this.transactions.push(tx); } while (br.nextTag() === 3) { - let op = new ProtoReader(br.readFieldBytes(3)); - let output = new Output(); + const op = new ProtoReader(br.readFieldBytes(3)); + const output = new Output(); output.value = op.readFieldU64(1, true); output.script = Script.fromRaw(op.readFieldBytes(2, true)); this.refundTo.push(output); @@ -151,16 +151,16 @@ Payment.fromRaw = function fromRaw(data, enc) { */ Payment.prototype.toRaw = function toRaw() { - let bw = new ProtoWriter(); + const bw = new ProtoWriter(); if (this.merchantData) bw.writeFieldBytes(1, this.merchantData); - for (let tx of this.transactions) + for (const tx of this.transactions) bw.writeFieldBytes(2, tx.toRaw()); - for (let output of this.refundTo) { - let op = new ProtoWriter(); + for (const output of this.refundTo) { + const op = new ProtoWriter(); op.writeFieldU64(1, output.value); op.writeFieldBytes(2, output.script.toRaw()); bw.writeFieldBytes(3, op.render()); diff --git a/lib/bip70/paymentack.js b/lib/bip70/paymentack.js index 0ded9bcc6..b755ee848 100644 --- a/lib/bip70/paymentack.js +++ b/lib/bip70/paymentack.js @@ -68,7 +68,7 @@ PaymentACK.fromOptions = function fromOptions(options) { */ PaymentACK.prototype.fromRaw = function fromRaw(data) { - let br = new ProtoReader(data); + const br = new ProtoReader(data); this.payment.fromRaw(br.readFieldBytes(1)); this.memo = br.readFieldString(2, true); @@ -94,7 +94,7 @@ PaymentACK.fromRaw = function fromRaw(data, enc) { */ PaymentACK.prototype.toRaw = function toRaw() { - let bw = new ProtoWriter(); + const bw = new ProtoWriter(); bw.writeFieldBytes(1, this.payment.toRaw()); diff --git a/lib/bip70/paymentdetails.js b/lib/bip70/paymentdetails.js index 94904c3ba..c33d8c421 100644 --- a/lib/bip70/paymentdetails.js +++ b/lib/bip70/paymentdetails.js @@ -57,19 +57,19 @@ PaymentDetails.prototype.fromOptions = function fromOptions(options) { if (options.outputs) { assert(Array.isArray(options.outputs)); - for (let item of options.outputs) { - let output = new Output(item); + for (const item of options.outputs) { + const output = new Output(item); this.outputs.push(output); } } if (options.time != null) { - assert(util.isNumber(options.time)); + assert(util.isInt(options.time)); this.time = options.time; } if (options.expires != null) { - assert(util.isNumber(options.expires)); + assert(util.isInt(options.expires)); this.expires = options.expires; } @@ -141,7 +141,7 @@ PaymentDetails.prototype.getData = function getData(enc) { let data = this.merchantData; if (!data) - return; + return null; if (!enc) return data; @@ -151,7 +151,7 @@ PaymentDetails.prototype.getData = function getData(enc) { try { data = JSON.parse(data); } catch (e) { - return; + return null; } return data; } @@ -167,13 +167,13 @@ PaymentDetails.prototype.getData = function getData(enc) { */ PaymentDetails.prototype.fromRaw = function fromRaw(data) { - let br = new ProtoReader(data); + const br = new ProtoReader(data); this.network = br.readFieldString(1, true); while (br.nextTag() === 2) { - let op = new ProtoReader(br.readFieldBytes(2)); - let output = new Output(); + const op = new ProtoReader(br.readFieldBytes(2)); + const output = new Output(); output.value = op.readFieldU64(1, true); output.script.fromRaw(op.readFieldBytes(2, true)); this.outputs.push(output); @@ -206,13 +206,13 @@ PaymentDetails.fromRaw = function fromRaw(data, enc) { */ PaymentDetails.prototype.toRaw = function toRaw() { - let bw = new ProtoWriter(); + const bw = new ProtoWriter(); if (this.network != null) bw.writeFieldString(1, this.network); - for (let output of this.outputs) { - let op = new ProtoWriter(); + for (const output of this.outputs) { + const op = new ProtoWriter(); op.writeFieldU64(1, output.value); op.writeFieldBytes(2, output.script.toRaw()); bw.writeFieldBytes(2, op.render()); diff --git a/lib/bip70/paymentrequest.js b/lib/bip70/paymentrequest.js index d76fc9a7d..6fb17555f 100644 --- a/lib/bip70/paymentrequest.js +++ b/lib/bip70/paymentrequest.js @@ -50,7 +50,7 @@ function PaymentRequest(options) { PaymentRequest.prototype.fromOptions = function fromOptions(options) { if (options.version != null) { - assert(util.isNumber(options.version)); + assert(util.isInt(options.version)); this.version = options.version; } @@ -96,7 +96,7 @@ PaymentRequest.fromOptions = function fromOptions(options) { */ PaymentRequest.prototype.fromRaw = function fromRaw(data) { - let br = new ProtoReader(data); + const br = new ProtoReader(data); this.version = br.readFieldU32(1, true); this.pkiType = br.readFieldString(2, true); @@ -125,7 +125,7 @@ PaymentRequest.fromRaw = function fromRaw(data, enc) { */ PaymentRequest.prototype.toRaw = function toRaw() { - let bw = new ProtoWriter(); + const bw = new ProtoWriter(); if (this.version !== -1) bw.writeFieldU32(1, this.version); @@ -150,12 +150,10 @@ PaymentRequest.prototype.toRaw = function toRaw() { */ PaymentRequest.prototype.getAlgorithm = function getAlgorithm() { - let parts; - if (!this.pkiType) throw new Error('No PKI type available.'); - parts = this.pkiType.split('+'); + const parts = this.pkiType.split('+'); if (parts.length !== 2) throw new Error('Could not parse PKI algorithm.'); @@ -175,12 +173,11 @@ PaymentRequest.prototype.getAlgorithm = function getAlgorithm() { */ PaymentRequest.prototype.signatureData = function signatureData() { - let signature = this.signature; - let data; + const signature = this.signature; this.signature = Buffer.alloc(0); - data = this.toRaw(); + const data = this.toRaw(); this.signature = signature; @@ -193,7 +190,7 @@ PaymentRequest.prototype.signatureData = function signatureData() { */ PaymentRequest.prototype.signatureHash = function signatureHash() { - let alg = this.getAlgorithm(); + const alg = this.getAlgorithm(); return digest.hash(alg.hash, this.signatureData()); }; @@ -203,13 +200,13 @@ PaymentRequest.prototype.signatureHash = function signatureHash() { */ PaymentRequest.prototype.setChain = function setChain(chain) { - let bw = new ProtoWriter(); + const bw = new ProtoWriter(); assert(Array.isArray(chain), 'Chain must be an array.'); for (let cert of chain) { if (typeof cert === 'string') { - let pem = PEM.decode(cert); + const pem = PEM.decode(cert); assert(pem.type === 'certificate', 'Bad certificate PEM.'); cert = pem.data; } @@ -226,13 +223,12 @@ PaymentRequest.prototype.setChain = function setChain(chain) { */ PaymentRequest.prototype.getChain = function getChain() { - let chain = []; - let br; + const chain = []; if (!this.pkiData) return chain; - br = new ProtoReader(this.pkiData); + const br = new ProtoReader(this.pkiData); while (br.nextTag() === 1) chain.push(br.readFieldBytes(1)); @@ -243,21 +239,19 @@ PaymentRequest.prototype.getChain = function getChain() { /** * Sign payment request (chain must be set). * @param {Buffer} key - * @param {Buffer[]?} chain + * @param {Buffer[]?} certs */ -PaymentRequest.prototype.sign = function sign(key, chain) { - let alg, msg; - - if (chain) - this.setChain(chain); +PaymentRequest.prototype.sign = function sign(key, certs) { + if (certs) + this.setChain(certs); if (!this.pkiType) this.pkiType = 'x509+sha256'; - alg = this.getAlgorithm(); - msg = this.signatureData(); - chain = this.getChain(); + const alg = this.getAlgorithm(); + const msg = this.signatureData(); + const chain = this.getChain(); this.signature = x509.signSubject(alg.hash, msg, key, chain); }; @@ -268,23 +262,22 @@ PaymentRequest.prototype.sign = function sign(key, chain) { */ PaymentRequest.prototype.verify = function verify() { - let alg, msg, sig, chain; - if (!this.pkiType || this.pkiType === 'none') return false; if (!this.signature) return false; + let alg; try { alg = this.getAlgorithm(); } catch (e) { return false; } - msg = this.signatureData(); - sig = this.signature; - chain = this.getChain(); + const msg = this.signatureData(); + const sig = this.signature; + const chain = this.getChain(); try { return x509.verifySubject(alg.hash, msg, sig, chain); @@ -315,17 +308,15 @@ PaymentRequest.prototype.verifyChain = function verifyChain() { */ PaymentRequest.prototype.getCA = function getCA() { - let chain, root; - if (!this.pkiType || this.pkiType === 'none') throw new Error('No CA found (pkiType).'); - chain = this.getChain(); + const chain = this.getChain(); if (chain.length === 0) throw new Error('No CA found (chain).'); - root = x509.parse(chain[chain.length - 1]); + const root = x509.parse(chain[chain.length - 1]); return new CA(root); }; diff --git a/lib/bip70/x509.js b/lib/bip70/x509.js index 4620caec9..87bf3507f 100644 --- a/lib/bip70/x509.js +++ b/lib/bip70/x509.js @@ -22,10 +22,10 @@ const x509 = exports; /** * Map of trusted root certs. - * @type {Object} + * @type {Set} */ -x509.trusted = {}; +x509.trusted = new Set(); /** * Whether to allow untrusted root @@ -86,12 +86,14 @@ x509.curves = { */ x509.getSubjectOID = function getSubjectOID(cert, oid) { - let subject = cert.tbs.subject; + const subject = cert.tbs.subject; - for (let entry of subject) { + for (const entry of subject) { if (entry.type === oid) return entry.value; } + + return null; }; /** @@ -125,9 +127,9 @@ x509.getCAName = function getCAName(cert) { */ x509.isTrusted = function isTrusted(cert) { - let fingerprint = digest.sha256(cert.raw); - let hash = fingerprint.toString('hex'); - return x509.trusted[hash] === true; + const fingerprint = digest.sha256(cert.raw); + const hash = fingerprint.toString('hex'); + return x509.trusted.has(hash); }; /** @@ -139,10 +141,8 @@ x509.setTrust = function setTrust(certs) { assert(Array.isArray(certs), 'Certs must be an array.'); for (let cert of certs) { - let hash; - if (typeof cert === 'string') { - let pem = PEM.decode(cert); + const pem = PEM.decode(cert); assert(pem.type === 'certificate', 'Must add certificates to trust.'); cert = pem.data; } @@ -151,10 +151,10 @@ x509.setTrust = function setTrust(certs) { cert = x509.parse(cert); - hash = digest.sha256(cert.raw); - hash = hash.toString('hex'); + const hash = digest.sha256(cert.raw); + const fingerprint = hash.toString('hex'); - x509.trusted[hash] = true; + x509.trusted.add(fingerprint); } }; @@ -174,7 +174,7 @@ x509.setFingerprints = function setFingerprints(hashes) { assert(hash.length === 32, 'Fingerprint must be a sha256 hash.'); hash = hash.toString('hex'); - x509.trusted[hash] = true; + x509.trusted.add(hash); } }; @@ -185,8 +185,8 @@ x509.setFingerprints = function setFingerprints(hashes) { */ x509.getKeyAlgorithm = function getKeyAlgorithm(cert) { - let oid = cert.tbs.pubkey.alg.alg; - let alg = x509.oid[oid]; + const oid = cert.tbs.pubkey.alg.alg; + const alg = x509.oid[oid]; if (!alg) throw new Error(`Unknown key algorithm: ${oid}.`); @@ -201,8 +201,8 @@ x509.getKeyAlgorithm = function getKeyAlgorithm(cert) { */ x509.getSigAlgorithm = function getSigAlgorithm(cert) { - let oid = cert.sigAlg.alg; - let alg = x509.oid[oid]; + const oid = cert.sigAlg.alg; + const alg = x509.oid[oid]; if (!alg || !alg.hash) throw new Error(`Unknown signature algorithm: ${oid}.`); @@ -217,7 +217,7 @@ x509.getSigAlgorithm = function getSigAlgorithm(cert) { */ x509.getCurve = function getCurve(params) { - let oid, curve; + let oid; try { oid = ASN1.parseOID(params); @@ -225,7 +225,7 @@ x509.getCurve = function getCurve(params) { throw new Error('Could not parse curve OID.'); } - curve = x509.curves[oid]; + const curve = x509.curves[oid]; if (!curve) throw new Error(`Unknown ECDSA curve: ${oid}.`); @@ -254,10 +254,10 @@ x509.parse = function parse(der) { */ x509.getPublicKey = function getPublicKey(cert) { - let alg = x509.getKeyAlgorithm(cert); - let key = cert.tbs.pubkey.pubkey; - let params = cert.tbs.pubkey.alg.params; - let curve; + const alg = x509.getKeyAlgorithm(cert); + const key = cert.tbs.pubkey.pubkey; + const params = cert.tbs.pubkey.alg.params; + let curve = null; if (alg.key === 'ecdsa') { if (!params) @@ -281,8 +281,8 @@ x509.getPublicKey = function getPublicKey(cert) { */ x509.verifyTime = function verifyTime(cert) { - let time = cert.tbs.validity; - let now = util.now(); + const time = cert.tbs.validity; + const now = util.now(); return now > time.notBefore && now < time.notAfter; }; @@ -297,7 +297,7 @@ x509.getSigningKey = function getSigningKey(key, chain) { assert(chain.length !== 0, 'No chain available.'); if (typeof key === 'string') { - let curve; + let curve = null; key = PEM.decode(key); @@ -315,8 +315,8 @@ x509.getSigningKey = function getSigningKey(key, chain) { curve: curve }; } else { - let cert = x509.parse(chain[0]); - let pub = x509.getPublicKey(cert); + const cert = x509.parse(chain[0]); + const pub = x509.getPublicKey(cert); key = { alg: pub.alg, @@ -339,7 +339,7 @@ x509.getSigningKey = function getSigningKey(key, chain) { */ x509.signSubject = function signSubject(hash, msg, key, chain) { - let priv = x509.getSigningKey(key, chain); + const priv = x509.getSigningKey(key, chain); return pk.sign(hash, msg, priv); }; @@ -350,15 +350,12 @@ x509.signSubject = function signSubject(hash, msg, key, chain) { */ x509.getVerifyKey = function getVerifyKey(chain) { - let cert, key; - if (chain.length === 0) throw new Error('No verify key available (cert chain).'); - cert = x509.parse(chain[0]); - key = x509.getPublicKey(cert); + const cert = x509.parse(chain[0]); - return key; + return x509.getPublicKey(cert); }; /** @@ -371,7 +368,7 @@ x509.getVerifyKey = function getVerifyKey(chain) { */ x509.verifySubject = function verifySubject(hash, msg, sig, chain) { - let key = x509.getVerifyKey(chain); + const key = x509.getVerifyKey(chain); return pk.verify(hash, msg, sig, key); }; @@ -382,10 +379,10 @@ x509.verifySubject = function verifySubject(hash, msg, sig, chain) { */ x509.parseChain = function parseChain(chain) { - let certs = []; + const certs = []; - for (let item of chain) { - let cert = x509.parse(item); + for (const item of chain) { + const cert = x509.parse(item); certs.push(cert); } @@ -399,7 +396,7 @@ x509.parseChain = function parseChain(chain) { */ x509.verifyTimes = function verifyTimes(chain) { - for (let cert of chain) { + for (const cert of chain) { if (!x509.verifyTime(cert)) return false; } @@ -422,7 +419,7 @@ x509.verifyTrust = function verifyTrust(chain) { // Make sure we trust one // of the certs in the chain. - for (let cert of chain) { + for (const cert of chain) { // If any certificate in the chain // is trusted, assume we also trust // the parent. @@ -440,7 +437,7 @@ x509.verifyTrust = function verifyTrust(chain) { */ x509.verifyChain = function verifyChain(certs) { - let chain = x509.parseChain(certs); + const chain = x509.parseChain(certs); // Parse certificates and // check validity time. @@ -449,12 +446,12 @@ x509.verifyChain = function verifyChain(certs) { // Verify signatures. for (let i = 1; i < chain.length; i++) { - let child = chain[i - 1]; - let parent = chain[i]; - let alg = x509.getSigAlgorithm(child); - let key = x509.getPublicKey(parent); - let msg = child.tbs.raw; - let sig = child.sig; + const child = chain[i - 1]; + const parent = chain[i]; + const alg = x509.getSigAlgorithm(child); + const key = x509.getPublicKey(parent); + const msg = child.tbs.raw; + const sig = child.sig; if (!pk.verify(alg.hash, msg, sig, key)) throw new Error(`${alg.key} verification failed for chain.`); diff --git a/lib/blockchain/chain.js b/lib/blockchain/chain.js index 8a3f6cb4c..bfbdb59f3 100644 --- a/lib/blockchain/chain.js +++ b/lib/blockchain/chain.js @@ -71,13 +71,12 @@ function Chain(options) { this.network = this.options.network; this.logger = this.options.logger.context('chain'); this.workers = this.options.workers; - this.checkpoints = this.options.checkpoints; this.locker = new Lock(true); this.invalid = new LRU(100); this.state = new DeploymentState(); - this.tip = null; + this.tip = new ChainEntry(this); this.height = -1; this.synced = false; @@ -87,7 +86,7 @@ function Chain(options) { this.db = new ChainDB(this); } -util.inherits(Chain, AsyncObject); +Object.setPrototypeOf(Chain.prototype, AsyncObject.prototype); /** * Open the chain, wait for the database to load. @@ -96,9 +95,7 @@ util.inherits(Chain, AsyncObject); * @returns {Promise} */ -Chain.prototype._open = async function open() { - let tip, state; - +Chain.prototype._open = async function _open() { this.logger.info('Chain is loading.'); if (this.options.checkpoints) @@ -115,7 +112,7 @@ Chain.prototype._open = async function open() { await this.db.open(); - tip = await this.db.getTip(); + const tip = await this.db.getTip(); assert(tip); @@ -126,7 +123,7 @@ Chain.prototype._open = async function open() { this.logger.memory(); - state = await this.getDeploymentState(); + const state = await this.getDeploymentState(); this.setDeploymentState(state); @@ -143,7 +140,7 @@ Chain.prototype._open = async function open() { * @returns {Promise} */ -Chain.prototype._close = function close() { +Chain.prototype._close = function _close() { return this.db.close(); }; @@ -158,16 +155,14 @@ Chain.prototype._close = function close() { */ Chain.prototype.verifyContext = async function verifyContext(block, prev, flags) { - let state, view; - // Initial non-contextual verification. - state = await this.verify(block, prev, flags); + const state = await this.verify(block, prev, flags); // BIP30 - Verify there are no duplicate txids. await this.verifyDuplicates(block, prev, state); // Verify scripts, spend and add coins. - view = await this.verifyInputs(block, prev, state); + const view = await this.verifyInputs(block, prev, state); return [view, state]; }; @@ -181,7 +176,7 @@ Chain.prototype.verifyContext = async function verifyContext(block, prev, flags) */ Chain.prototype.verifyBlock = async function verifyBlock(block) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._verifyBlock(block); } finally { @@ -198,8 +193,8 @@ Chain.prototype.verifyBlock = async function verifyBlock(block) { * @returns {Promise} */ -Chain.prototype._verifyBlock = async function verifyBlock(block) { - let flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; +Chain.prototype._verifyBlock = async function _verifyBlock(block) { + const flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; return await this.verifyContext(block, this.tip, flags); }; @@ -226,11 +221,10 @@ Chain.prototype.isGenesis = function isGenesis(block) { */ Chain.prototype.verify = async function verify(block, prev, flags) { - let deployments = this.network.deployments; - let hash = block.hash('hex'); - let now = this.network.now(); - let height = prev.height + 1; - let ts, mtp, commit, state, bits; + const deployments = this.network.deployments; + const hash = block.hash('hex'); + const now = this.network.now(); + const height = prev.height + 1; assert(typeof flags === 'number'); @@ -264,7 +258,7 @@ Chain.prototype.verify = async function verify(block, prev, flags) { // Non-contextual checks. if (flags & common.flags.VERIFY_BODY) { - let [valid, reason, score] = block.checkBody(); + const [valid, reason, score] = block.checkBody(); if (!valid) throw new VerifyError(block, 'invalid', reason, score, true); @@ -275,7 +269,7 @@ Chain.prototype.verify = async function verify(block, prev, flags) { return this.state; // Ensure the POW is what we expect. - bits = await this.getTarget(block.ts, prev); + const bits = await this.getTarget(block.time, prev); if (block.bits !== bits) { throw new VerifyError(block, @@ -285,9 +279,9 @@ Chain.prototype.verify = async function verify(block, prev, flags) { } // Ensure the timestamp is correct. - mtp = await prev.getMedianTime(); + const mtp = await prev.getMedianTime(); - if (block.ts <= mtp) { + if (block.time <= mtp) { throw new VerifyError(block, 'invalid', 'time-too-old', @@ -297,7 +291,7 @@ Chain.prototype.verify = async function verify(block, prev, flags) { // Check timestamp against adj-time+2hours. // If this fails we may be able to accept // the block later. - if (block.ts > now + 2 * 60 * 60) { + if (block.time > now + 2 * 60 * 60) { throw new VerifyError(block, 'invalid', 'time-too-new', @@ -321,7 +315,7 @@ Chain.prototype.verify = async function verify(block, prev, flags) { throw new VerifyError(block, 'obsolete', 'bad-version', 0); // Get the new deployment state. - state = await this.getDeployments(block.ts, prev); + const state = await this.getDeployments(block.time, prev); // Enforce BIP91/BIP148. if (state.hasBIP91() || state.hasBIP148()) { @@ -330,12 +324,12 @@ Chain.prototype.verify = async function verify(block, prev, flags) { } // Get timestamp for tx.isFinal(). - ts = state.hasMTP() ? mtp : block.ts; + const time = state.hasMTP() ? mtp : block.time; // Transactions must be finalized with // regards to nSequence and nLockTime. - for (let tx of block.txs) { - if (!tx.isFinal(height, ts)) { + for (const tx of block.txs) { + if (!tx.isFinal(height, time)) { throw new VerifyError(block, 'invalid', 'bad-txns-nonfinal', @@ -355,6 +349,7 @@ Chain.prototype.verify = async function verify(block, prev, flags) { } // Check the commitment hash for segwit. + let commit; if (state.hasWitness()) { commit = block.getCommitmentHash(); if (commit) { @@ -409,16 +404,15 @@ Chain.prototype.verify = async function verify(block, prev, flags) { /** * Check all deployments on a chain, ranging from p2sh to segwit. * @method - * @param {Number} ts + * @param {Number} time * @param {ChainEntry} prev * @returns {Promise} - Returns {@link DeploymentState}. */ -Chain.prototype.getDeployments = async function getDeployments(ts, prev) { - let deployments = this.network.deployments; - let height = prev.height + 1; - let state = new DeploymentState(); - let witness; +Chain.prototype.getDeployments = async function getDeployments(time, prev) { + const deployments = this.network.deployments; + const height = prev.height + 1; + const state = new DeploymentState(); // For some reason bitcoind has p2sh in the // mandatory flags by default, when in reality @@ -428,7 +422,7 @@ Chain.prototype.getDeployments = async function getDeployments(ts, prev) { // not have a signature. See: // 6a26d2ecb67f27d1fa5524763b49029d7106e91e3cc05743073461a719776192 // 9c08a4d78931342b37fd5f72900fb9983087e6f46c4a097d8a1f52c74e28eaf6 - if (ts >= consensus.BIP16_TIME) + if (time >= consensus.BIP16_TIME) state.flags |= Script.flags.VERIFY_P2SH; // Coinbase heights are now enforced (bip34). @@ -452,7 +446,7 @@ Chain.prototype.getDeployments = async function getDeployments(ts, prev) { } // Check the state of the segwit deployment. - witness = await this.getState(prev, deployments.segwit); + const witness = await this.getState(prev, deployments.segwit); // Segregrated witness (bip141) is now usable // along with SCRIPT_VERIFY_NULLDUMMY (bip147). @@ -480,7 +474,7 @@ Chain.prototype.getDeployments = async function getDeployments(ts, prev) { // assumption that deployment checks should // only ever examine the values of the // previous block (necessary for mining). - let mtp = await prev.getMedianTime(ts); + const mtp = await prev.getMedianTime(time); if (mtp >= 1501545600 && mtp <= 1510704000) state.bip148 = true; } @@ -495,6 +489,11 @@ Chain.prototype.getDeployments = async function getDeployments(ts, prev) { */ Chain.prototype.setDeploymentState = function setDeploymentState(state) { + if (this.options.checkpoints && this.height < this.network.lastCheckpoint) { + this.state = state; + return; + } + if (!this.state.hasP2SH() && state.hasP2SH()) this.logger.warning('P2SH has been activated.'); @@ -547,11 +546,11 @@ Chain.prototype.verifyDuplicates = async function verifyDuplicates(block, prev, return; // Check all transactions. - for (let tx of block.txs) { - let result = await this.db.hasCoins(tx.hash()); + for (const tx of block.txs) { + const result = await this.db.hasCoins(tx); if (result) { - let height = prev.height + 1; + const height = prev.height + 1; // Blocks 91842 and 91880 created duplicate // txids by using the same exact output script @@ -586,24 +585,25 @@ Chain.prototype.verifyDuplicates = async function verifyDuplicates(block, prev, */ Chain.prototype.verifyInputs = async function verifyInputs(block, prev, state) { - let interval = this.network.halvingInterval; - let view = new CoinView(); - let height = prev.height + 1; - let historical = prev.isHistorical(); - let jobs = []; - let sigops = 0; - let reward = 0; + const view = new CoinView(); if (this.options.spv) return view; + const interval = this.network.halvingInterval; + const height = prev.height + 1; + const historical = prev.isHistorical(); + + let sigops = 0; + let reward = 0; + // Check all transactions for (let i = 0; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; // Ensure tx is not double spending an output. if (i > 0) { - if (!(await view.spendInputs(this.db, tx))) { + if (!await view.spendInputs(this.db, tx)) { assert(!historical, 'BUG: Spent inputs in historical data!'); throw new VerifyError(block, 'invalid', @@ -621,7 +621,7 @@ Chain.prototype.verifyInputs = async function verifyInputs(block, prev, state) { // Verify sequence locks. if (i > 0 && tx.version >= 2) { - let valid = await this.verifyLocks(prev, tx, view, state.lockFlags); + const valid = await this.verifyLocks(prev, tx, view, state.lockFlags); if (!valid) { throw new VerifyError(block, @@ -643,7 +643,7 @@ Chain.prototype.verifyInputs = async function verifyInputs(block, prev, state) { // Contextual sanity checks. if (i > 0) { - let [fee, reason, score] = tx.checkInputs(view, height); + const [fee, reason, score] = tx.checkInputs(view, height); if (fee === -1) { throw new VerifyError(block, @@ -681,13 +681,14 @@ Chain.prototype.verifyInputs = async function verifyInputs(block, prev, state) { } // Push onto verification queue. + const jobs = []; for (let i = 1; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; jobs.push(tx.verifyAsync(view, state.flags, this.workers)); } // Verify all txs in parallel. - if (!(await co.every(jobs))) { + if (!await co.every(jobs)) { throw new VerifyError(block, 'invalid', 'mandatory-script-verify-flag-failed', @@ -705,7 +706,7 @@ Chain.prototype.verifyInputs = async function verifyInputs(block, prev, state) { */ Chain.prototype.checkHeight = function checkHeight(hash) { - let entry = this.db.getCache(hash); + const entry = this.db.getCache(hash); if (!entry) return -1; @@ -753,16 +754,14 @@ Chain.prototype.findFork = async function findFork(fork, longer) { */ Chain.prototype.reorganize = async function reorganize(competitor) { - let tip = this.tip; - let fork = await this.findFork(tip, competitor); - let disconnect = []; - let connect = []; - let entry; + const tip = this.tip; + const fork = await this.findFork(tip, competitor); assert(fork, 'No free space or data corruption.'); // Blocks to disconnect. - entry = tip; + const disconnect = []; + let entry = tip; while (entry.hash !== fork.hash) { disconnect.push(entry); entry = await entry.getPrevious(); @@ -770,6 +769,7 @@ Chain.prototype.reorganize = async function reorganize(competitor) { } // Blocks to connect. + const connect = []; entry = competitor; while (entry.hash !== fork.hash) { connect.push(entry); @@ -779,7 +779,7 @@ Chain.prototype.reorganize = async function reorganize(competitor) { // Disconnect blocks/txs. for (let i = 0; i < disconnect.length; i++) { - let entry = disconnect[i]; + const entry = disconnect[i]; await this.disconnect(entry); } @@ -787,7 +787,7 @@ Chain.prototype.reorganize = async function reorganize(competitor) { // We don't want to connect the new tip here. // That will be done outside in setBestChain. for (let i = connect.length - 1; i >= 1; i--) { - let entry = connect[i]; + const entry = connect[i]; await this.reconnect(entry); } @@ -812,14 +812,14 @@ Chain.prototype.reorganize = async function reorganize(competitor) { */ Chain.prototype.reorganizeSPV = async function reorganizeSPV(competitor) { - let tip = this.tip; - let fork = await this.findFork(tip, competitor); - let disconnect = []; - let entry = tip; + const tip = this.tip; + const fork = await this.findFork(tip, competitor); assert(fork, 'No free space or data corruption.'); // Buffer disconnected blocks. + const disconnect = []; + let entry = tip; while (entry.hash !== fork.hash) { disconnect.push(entry); entry = await entry.getPrevious(); @@ -834,9 +834,9 @@ Chain.prototype.reorganizeSPV = async function reorganizeSPV(competitor) { // Emit disconnection events now that // the chain has successfully reset. - for (let entry of disconnect) { - let headers = entry.toHeaders(); - let view = new CoinView(); + for (const entry of disconnect) { + const headers = entry.toHeaders(); + const view = new CoinView(); await this.fire('disconnect', entry, headers, view); } @@ -864,7 +864,6 @@ Chain.prototype.reorganizeSPV = async function reorganizeSPV(competitor) { Chain.prototype.disconnect = async function disconnect(entry) { let block = await this.db.getBlock(entry.hash); - let prev, view; if (!block) { if (!this.options.spv) @@ -872,8 +871,8 @@ Chain.prototype.disconnect = async function disconnect(entry) { block = entry.toHeaders(); } - prev = await entry.getPrevious(); - view = await this.db.disconnect(entry, block); + const prev = await entry.getPrevious(); + const view = await this.db.disconnect(entry, block); assert(prev); @@ -897,9 +896,9 @@ Chain.prototype.disconnect = async function disconnect(entry) { */ Chain.prototype.reconnect = async function reconnect(entry) { - let flags = common.flags.VERIFY_NONE; + const flags = common.flags.VERIFY_NONE; + let block = await this.db.getBlock(entry.hash); - let prev, view, state; if (!block) { if (!this.options.spv) @@ -907,9 +906,10 @@ Chain.prototype.reconnect = async function reconnect(entry) { block = entry.toHeaders(); } - prev = await entry.getPrevious(); + const prev = await entry.getPrevious(); assert(prev); + let view, state; try { [view, state] = await this.verifyContext(block, prev, flags); } catch (err) { @@ -950,8 +950,6 @@ Chain.prototype.reconnect = async function reconnect(entry) { */ Chain.prototype.setBestChain = async function setBestChain(entry, block, prev, flags) { - let view, state; - // A higher fork has arrived. // Time to reorganize the chain. if (entry.prevBlock !== this.tip.hash) { @@ -959,8 +957,10 @@ Chain.prototype.setBestChain = async function setBestChain(entry, block, prev, f // In spv-mode, we reset the // chain and redownload the blocks. - if (this.options.spv) - return await this.reorganizeSPV(entry); + if (this.options.spv) { + await this.reorganizeSPV(entry); + return; + } await this.reorganize(entry); } @@ -976,6 +976,7 @@ Chain.prototype.setBestChain = async function setBestChain(entry, block, prev, f // Do "contextual" verification on our block // now that we're certain its previous // block is in the chain. + let view, state; try { [view, state] = await this.verifyContext(block, prev, flags); } catch (err) { @@ -1067,7 +1068,7 @@ Chain.prototype.saveAlternate = async function saveAlternate(entry, block, prev, */ Chain.prototype.reset = async function reset(block) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._reset(block, false); } finally { @@ -1083,16 +1084,15 @@ Chain.prototype.reset = async function reset(block) { * @returns {Promise} */ -Chain.prototype._reset = async function reset(block, silent) { - let tip = await this.db.reset(block); - let state; +Chain.prototype._reset = async function _reset(block, silent) { + const tip = await this.db.reset(block); // Reset state. this.tip = tip; this.height = tip.height; this.synced = false; - state = await this.getDeploymentState(); + const state = await this.getDeploymentState(); this.setDeploymentState(state); @@ -1118,7 +1118,7 @@ Chain.prototype._reset = async function reset(block, silent) { */ Chain.prototype.replay = async function replay(block) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._replay(block, true); } finally { @@ -1135,17 +1135,19 @@ Chain.prototype.replay = async function replay(block) { * @returns {Promise} */ -Chain.prototype._replay = async function replay(block, silent) { - let entry = await this.db.getEntry(block); +Chain.prototype._replay = async function _replay(block, silent) { + const entry = await this.db.getEntry(block); if (!entry) throw new Error('Block not found.'); - if (!(await entry.isMainChain())) + if (!await entry.isMainChain()) throw new Error('Cannot reset on alternate chain.'); - if (entry.isGenesis()) - return await this._reset(entry.hash, silent); + if (entry.isGenesis()) { + await this._reset(entry.hash, silent); + return; + } await this._reset(entry.prevBlock, silent); }; @@ -1158,7 +1160,7 @@ Chain.prototype._replay = async function replay(block, silent) { */ Chain.prototype.invalidate = async function invalidate(hash) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._invalidate(hash); } finally { @@ -1175,7 +1177,7 @@ Chain.prototype.invalidate = async function invalidate(hash) { Chain.prototype._invalidate = async function _invalidate(hash) { await this._replay(hash, false); - this.chain.setInvalid(hash); + this.setInvalid(hash); }; /** @@ -1185,7 +1187,7 @@ Chain.prototype._invalidate = async function _invalidate(hash) { */ Chain.prototype.prune = async function prune() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this.db.prune(this.tip.hash); } finally { @@ -1203,7 +1205,7 @@ Chain.prototype.prune = async function prune() { */ Chain.prototype.scan = async function scan(start, filter, iter) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this.db.scan(start, filter, iter); } finally { @@ -1221,8 +1223,8 @@ Chain.prototype.scan = async function scan(start, filter, iter) { */ Chain.prototype.add = async function add(block, flags, id) { - let hash = block.hash('hex'); - let unlock = await this.locker.lock(hash); + const hash = block.hash('hex'); + const unlock = await this.locker.lock(hash); try { return await this._add(block, flags, id); } finally { @@ -1240,9 +1242,8 @@ Chain.prototype.add = async function add(block, flags, id) { * @returns {Promise} */ -Chain.prototype._add = async function add(block, flags, id) { - let hash = block.hash('hex'); - let entry, prev; +Chain.prototype._add = async function _add(block, flags, id) { + const hash = block.hash('hex'); if (flags == null) flags = common.flags.DEFAULT_FLAGS; @@ -1288,7 +1289,7 @@ Chain.prototype._add = async function add(block, flags, id) { } // Find the previous block entry. - prev = await this.db.getEntry(block.prevBlock); + const prev = await this.db.getEntry(block.prevBlock); // If previous block wasn't ever seen, // add it current to orphans and return. @@ -1298,7 +1299,7 @@ Chain.prototype._add = async function add(block, flags, id) { } // Connect the block. - entry = await this.connect(prev, block, flags); + const entry = await this.connect(prev, block, flags); // Handle any orphans. if (this.hasNextOrphan(hash)) @@ -1318,8 +1319,7 @@ Chain.prototype._add = async function add(block, flags, id) { */ Chain.prototype.connect = async function connect(prev, block, flags) { - let start = util.hrtime(); - let entry; + const start = util.hrtime(); // Sanity check. assert(block.prevBlock === prev.hash); @@ -1334,7 +1334,7 @@ Chain.prototype.connect = async function connect(prev, block, flags) { // validated, and connected. Hopefully the // deserialized blocks get cleaned up by the // GC quickly. - if (block.memory) { + if (block.isMemory()) { try { block = block.toBlock(); } catch (e) { @@ -1342,12 +1342,13 @@ Chain.prototype.connect = async function connect(prev, block, flags) { throw new VerifyError(block, 'malformed', 'error parsing message', - 10); + 10, + true); } } // Create a new chain entry. - entry = ChainEntry.fromBlock(this, block, prev); + const entry = ChainEntry.fromBlock(this, block, prev); // The block is on a alternate chain if the // chainwork is less than or equal to @@ -1382,7 +1383,7 @@ Chain.prototype.handleOrphans = async function handleOrphans(entry) { let orphan = this.resolveOrphan(entry.hash); while (orphan) { - let {block, flags, id} = orphan; + const {block, flags, id} = orphan; try { entry = await this.connect(entry, block, flags); @@ -1441,15 +1442,13 @@ Chain.prototype.isSlow = function isSlow() { */ Chain.prototype.logStatus = function logStatus(start, block, entry) { - let elapsed; - if (!this.isSlow()) return; // Report memory for debugging. this.logger.memory(); - elapsed = util.hrtime(start); + const elapsed = util.hrtime(start); this.logger.info( 'Block %s (%d) added to chain (size=%d txs=%d time=%d).', @@ -1474,13 +1473,11 @@ Chain.prototype.logStatus = function logStatus(start, block, entry) { */ Chain.prototype.verifyCheckpoint = function verifyCheckpoint(prev, hash) { - let height, checkpoint; - - if (!this.checkpoints) + if (!this.options.checkpoints) return true; - height = prev.height + 1; - checkpoint = this.network.checkpointMap[height]; + const height = prev.height + 1; + const checkpoint = this.network.checkpointMap[height]; if (!checkpoint) return true; @@ -1517,8 +1514,8 @@ Chain.prototype.verifyCheckpoint = function verifyCheckpoint(prev, hash) { */ Chain.prototype.storeOrphan = function storeOrphan(block, flags, id) { - let hash = block.hash('hex'); - let height = block.getCoinbaseHeight(); + const hash = block.hash('hex'); + const height = block.getCoinbaseHeight(); let orphan = this.orphanPrev.get(block.prevBlock); // The orphan chain forked. @@ -1554,8 +1551,8 @@ Chain.prototype.storeOrphan = function storeOrphan(block, flags, id) { */ Chain.prototype.addOrphan = function addOrphan(orphan) { - let block = orphan.block; - let hash = block.hash('hex'); + const block = orphan.block; + const hash = block.hash('hex'); assert(!this.orphanMap.has(hash)); assert(!this.orphanPrev.has(block.prevBlock)); @@ -1575,8 +1572,8 @@ Chain.prototype.addOrphan = function addOrphan(orphan) { */ Chain.prototype.removeOrphan = function removeOrphan(orphan) { - let block = orphan.block; - let hash = block.hash('hex'); + const block = orphan.block; + const hash = block.hash('hex'); assert(this.orphanMap.has(hash)); assert(this.orphanPrev.has(block.prevBlock)); @@ -1607,10 +1604,10 @@ Chain.prototype.hasNextOrphan = function hasNextOrphan(hash) { */ Chain.prototype.resolveOrphan = function resolveOrphan(hash) { - let orphan = this.orphanPrev.get(hash); + const orphan = this.orphanPrev.get(hash); if (!orphan) - return; + return null; return this.removeOrphan(orphan); }; @@ -1620,7 +1617,7 @@ Chain.prototype.resolveOrphan = function resolveOrphan(hash) { */ Chain.prototype.purgeOrphans = function purgeOrphans() { - let count = this.orphanMap.size; + const count = this.orphanMap.size; if (count === 0) return; @@ -1637,12 +1634,12 @@ Chain.prototype.purgeOrphans = function purgeOrphans() { */ Chain.prototype.limitOrphans = function limitOrphans() { - let now = util.now(); - let oldest; + const now = util.now(); - for (let orphan of this.orphanMap.values()) { - if (now < orphan.ts + 60 * 60) { - if (!oldest || orphan.ts < oldest.ts) + let oldest; + for (const orphan of this.orphanMap.values()) { + if (now < orphan.time + 60 * 60) { + if (!oldest || orphan.time < oldest.time) oldest = orphan; continue; } @@ -1667,7 +1664,7 @@ Chain.prototype.limitOrphans = function limitOrphans() { */ Chain.prototype.hasInvalid = function hasInvalid(block) { - let hash = block.hash('hex'); + const hash = block.hash('hex'); if (this.invalid.has(hash)) return true; @@ -1779,7 +1776,7 @@ Chain.prototype.hasPending = function hasPending(hash) { */ Chain.prototype.getSpentView = async function getSpentView(tx) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this.db.getSpentView(tx); } finally { @@ -1805,15 +1802,12 @@ Chain.prototype.maybeSync = function maybeSync() { if (this.synced) return; - if (this.checkpoints) { - if (this.tip.height < this.network.lastCheckpoint) + if (this.options.checkpoints) { + if (this.height < this.network.lastCheckpoint) return; - - this.logger.info('Last checkpoint reached. Disabling checkpoints.'); - this.checkpoints = false; } - if (this.tip.ts < util.now() - this.network.block.maxTipAge) + if (this.tip.time < util.now() - this.network.block.maxTipAge) return; if (!this.hasChainwork()) @@ -1831,7 +1825,7 @@ Chain.prototype.maybeSync = function maybeSync() { */ Chain.prototype.hasChainwork = function hasChainwork() { - return this.tip.chainwork.cmp(this.network.pow.chainwork) >= 0; + return this.tip.chainwork.gte(this.network.pow.chainwork); }; /** @@ -1840,9 +1834,9 @@ Chain.prototype.hasChainwork = function hasChainwork() { */ Chain.prototype.getProgress = function getProgress() { - let start = this.network.genesis.ts; - let current = this.tip.ts - start; - let end = util.now() - start - 40 * 60; + const start = this.network.genesis.time; + const current = this.tip.time - start; + const end = util.now() - start - 40 * 60; return Math.min(1, current / end); }; @@ -1856,7 +1850,7 @@ Chain.prototype.getProgress = function getProgress() { */ Chain.prototype.getLocator = async function getLocator(start) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._getLocator(start); } finally { @@ -1872,26 +1866,24 @@ Chain.prototype.getLocator = async function getLocator(start) { * @returns {Promise} */ -Chain.prototype._getLocator = async function getLocator(start) { - let hashes = []; - let step = 1; - let height, entry, main, hash; - +Chain.prototype._getLocator = async function _getLocator(start) { if (start == null) start = this.tip.hash; assert(typeof start === 'string'); - entry = await this.db.getEntry(start); + let entry = await this.db.getEntry(start); + const hashes = []; if (!entry) { entry = this.tip; hashes.push(start); } - hash = entry.hash; - height = entry.height; - main = await entry.isMainChain(); + let hash = entry.hash; + let height = entry.height; + const main = await entry.isMainChain(); + let step = 1; hashes.push(hash); @@ -1910,9 +1902,9 @@ Chain.prototype._getLocator = async function getLocator(start) { hash = await this.db.getHash(height); assert(hash); } else { - let entry = await entry.getAncestor(height); - assert(entry); - hash = entry.hash; + const ancestor = await entry.getAncestor(height); + assert(ancestor); + hash = ancestor.hash; } hashes.push(hash); @@ -1928,12 +1920,12 @@ Chain.prototype._getLocator = async function getLocator(start) { */ Chain.prototype.getOrphanRoot = function getOrphanRoot(hash) { - let root; + let root = null; assert(hash); for (;;) { - let orphan = this.orphanMap.get(hash); + const orphan = this.orphanMap.get(hash); if (!orphan) break; @@ -1954,7 +1946,7 @@ Chain.prototype.getOrphanRoot = function getOrphanRoot(hash) { */ Chain.prototype.getProofTime = function getProofTime(to, from) { - let pow = this.network.pow; + const pow = this.network.pow; let sign, work; if (to.chainwork.cmp(from.chainwork) > 0) { @@ -1988,19 +1980,18 @@ Chain.prototype.getCurrentTarget = async function getCurrentTarget() { /** * Calculate the next target. * @method - * @param {Number} ts - Next block timestamp. + * @param {Number} time - Next block timestamp. * @param {ChainEntry} prev - Previous entry. * @returns {Promise} - returns Number * (target is in compact/mantissa form). */ -Chain.prototype.getTarget = async function getTarget(ts, prev) { - let pow = this.network.pow; - let first, height; +Chain.prototype.getTarget = async function getTarget(time, prev) { + const pow = this.network.pow; // Genesis if (!prev) { - assert(ts === this.network.genesis.ts); + assert(time === this.network.genesis.time); return pow.bits; } @@ -2008,13 +1999,13 @@ Chain.prototype.getTarget = async function getTarget(ts, prev) { if ((prev.height + 1) % pow.retargetInterval !== 0) { if (pow.targetReset) { // Special behavior for testnet: - if (ts > prev.ts + pow.targetSpacing * 2) + if (time > prev.time + pow.targetSpacing * 2) return pow.bits; while (prev.height !== 0 && prev.height % pow.retargetInterval !== 0 && prev.bits === pow.bits) { - let cache = prev.getPrevCache(); + const cache = prev.getPrevCache(); if (cache) { prev = cache; @@ -2029,10 +2020,10 @@ Chain.prototype.getTarget = async function getTarget(ts, prev) { } // Back 2 weeks - height = prev.height - (pow.retargetInterval - 1); + const height = prev.height - (pow.retargetInterval - 1); assert(height >= 0); - first = await prev.getAncestor(height); + const first = await prev.getAncestor(height); assert(first); return this.retarget(prev, first); @@ -2047,15 +2038,15 @@ Chain.prototype.getTarget = async function getTarget(ts, prev) { */ Chain.prototype.retarget = function retarget(prev, first) { - let pow = this.network.pow; - let targetTimespan = pow.targetTimespan; - let actualTimespan, target; + const pow = this.network.pow; + const targetTimespan = pow.targetTimespan; if (pow.noRetargeting) return prev.bits; - actualTimespan = prev.ts - first.ts; - target = consensus.fromCompact(prev.bits); + const target = consensus.fromCompact(prev.bits); + + let actualTimespan = prev.time - first.time; if (actualTimespan < targetTimespan / 4 | 0) actualTimespan = targetTimespan / 4 | 0; @@ -2081,7 +2072,7 @@ Chain.prototype.retarget = function retarget(prev, first) { */ Chain.prototype.findLocator = async function findLocator(locator) { - for (let hash of locator) { + for (const hash of locator) { if (await this.db.isMainChain(hash)) return hash; } @@ -2101,7 +2092,7 @@ Chain.prototype.findLocator = async function findLocator(locator) { */ Chain.prototype.isActive = async function isActive(prev, deployment) { - let state = await this.getState(prev, deployment); + const state = await this.getState(prev, deployment); return state === thresholdStates.ACTIVE; }; @@ -2119,9 +2110,7 @@ Chain.prototype.isActive = async function isActive(prev, deployment) { Chain.prototype.getState = async function getState(prev, deployment) { let window = this.network.minerWindow; let threshold = this.network.activationThreshold; - let bit = deployment.bit; - let compute = []; - let entry, state; + const bit = deployment.bit; if (deployment.threshold !== -1) threshold = deployment.threshold; @@ -2130,7 +2119,7 @@ Chain.prototype.getState = async function getState(prev, deployment) { window = deployment.window; if (((prev.height + 1) % window) !== 0) { - let height = prev.height - ((prev.height + 1) % window); + const height = prev.height - ((prev.height + 1) % window); prev = await prev.getAncestor(height); if (!prev) @@ -2140,19 +2129,19 @@ Chain.prototype.getState = async function getState(prev, deployment) { assert(((prev.height + 1) % window) === 0); } - entry = prev; - state = thresholdStates.DEFINED; + let entry = prev; + let state = thresholdStates.DEFINED; + const compute = []; while (entry) { - let cached = this.db.stateCache.get(bit, entry); - let time, height; + const cached = this.db.stateCache.get(bit, entry); if (cached !== -1) { state = cached; break; } - time = await entry.getMedianTime(); + const time = await entry.getMedianTime(); if (time < deployment.startTime) { state = thresholdStates.DEFINED; @@ -2162,16 +2151,16 @@ Chain.prototype.getState = async function getState(prev, deployment) { compute.push(entry); - height = entry.height - window; + const height = entry.height - window; entry = await entry.getAncestor(height); } while (compute.length) { - let entry = compute.pop(); + const entry = compute.pop(); switch (state) { case thresholdStates.DEFINED: { - let time = await entry.getMedianTime(); + const time = await entry.getMedianTime(); if (time >= deployment.timeout) { state = thresholdStates.FAILED; @@ -2186,7 +2175,7 @@ Chain.prototype.getState = async function getState(prev, deployment) { break; } case thresholdStates.STARTED: { - let time = await entry.getMedianTime(); + const time = await entry.getMedianTime(); let block = entry; let count = 0; @@ -2241,8 +2230,8 @@ Chain.prototype.getState = async function getState(prev, deployment) { Chain.prototype.computeBlockVersion = async function computeBlockVersion(prev) { let version = 0; - for (let deployment of this.network.deploys) { - let state = await this.getState(prev, deployment); + for (const deployment of this.network.deploys) { + const state = await this.getState(prev, deployment); if (state === thresholdStates.LOCKED_IN || state === thresholdStates.STARTED) { @@ -2264,7 +2253,7 @@ Chain.prototype.computeBlockVersion = async function computeBlockVersion(prev) { */ Chain.prototype.getDeploymentState = async function getDeploymentState() { - let prev = await this.tip.getPrevious(); + const prev = await this.tip.getPrevious(); if (!prev) { assert(this.tip.isGenesis()); @@ -2274,7 +2263,7 @@ Chain.prototype.getDeploymentState = async function getDeploymentState() { if (this.options.spv) return this.state; - return await this.getDeployments(this.tip.ts, prev); + return await this.getDeployments(this.tip.time, prev); }; /** @@ -2288,15 +2277,15 @@ Chain.prototype.getDeploymentState = async function getDeploymentState() { */ Chain.prototype.verifyFinal = async function verifyFinal(prev, tx, flags) { - let height = prev.height + 1; + const height = prev.height + 1; // We can skip MTP if the locktime is height. if (tx.locktime < consensus.LOCKTIME_THRESHOLD) return tx.isFinal(height, -1); if (flags & common.lockFlags.MEDIAN_TIME_PAST) { - let ts = await prev.getMedianTime(); - return tx.isFinal(height, ts); + const time = await prev.getMedianTime(); + return tx.isFinal(height, time); } return tx.isFinal(height, this.network.now()); @@ -2313,40 +2302,42 @@ Chain.prototype.verifyFinal = async function verifyFinal(prev, tx, flags) { */ Chain.prototype.getLocks = async function getLocks(prev, tx, view, flags) { - let mask = consensus.SEQUENCE_MASK; - let granularity = consensus.SEQUENCE_GRANULARITY; - let disableFlag = consensus.SEQUENCE_DISABLE_FLAG; - let typeFlag = consensus.SEQUENCE_TYPE_FLAG; - let hasFlag = flags & common.lockFlags.VERIFY_SEQUENCE; - let minHeight = -1; - let minTime = -1; + const GRANULARITY = consensus.SEQUENCE_GRANULARITY; + const DISABE_FLAG = consensus.SEQUENCE_DISABLE_FLAG; + const TYPE_FLAG = consensus.SEQUENCE_TYPE_FLAG; + const MASK = consensus.SEQUENCE_MASK; - if (tx.isCoinbase() || tx.version < 2 || !hasFlag) - return [minHeight, minTime]; + if (!(flags & common.lockFlags.VERIFY_SEQUENCE)) + return [-1, -1]; - for (let input of tx.inputs) { - let height, time, entry; + if (tx.isCoinbase() || tx.version < 2) + return [-1, -1]; - if (input.sequence & disableFlag) + let minHeight = -1; + let minTime = -1; + + for (const {prevout, sequence} of tx.inputs) { + if (sequence & DISABE_FLAG) continue; - height = view.getHeight(input); + let height = view.getHeight(prevout); if (height === -1) height = this.height + 1; - if ((input.sequence & typeFlag) === 0) { - height += (input.sequence & mask) - 1; + if (!(sequence & TYPE_FLAG)) { + height += (sequence & MASK) - 1; minHeight = Math.max(minHeight, height); continue; } height = Math.max(height - 1, 0); - entry = await prev.getAncestor(height); + + const entry = await prev.getAncestor(height); assert(entry, 'Database is corrupt.'); - time = await entry.getMedianTime(); - time += ((input.sequence & mask) << granularity) - 1; + let time = await entry.getMedianTime(); + time += ((sequence & MASK) << GRANULARITY) - 1; minTime = Math.max(minTime, time); } @@ -2364,8 +2355,7 @@ Chain.prototype.getLocks = async function getLocks(prev, tx, view, flags) { */ Chain.prototype.verifyLocks = async function verifyLocks(prev, tx, view, flags) { - let [height, time] = await this.getLocks(prev, tx, view, flags); - let mtp; + const [height, time] = await this.getLocks(prev, tx, view, flags); // Also catches case where // height is `-1`. Fall through. @@ -2375,7 +2365,7 @@ Chain.prototype.verifyLocks = async function verifyLocks(prev, tx, view, flags) if (time === -1) return true; - mtp = await prev.getMedianTime(); + const mtp = await prev.getMedianTime(); if (time >= mtp) return false; @@ -2468,12 +2458,12 @@ ChainOptions.prototype.fromOptions = function fromOptions(options) { } if (options.maxFiles != null) { - assert(util.isNumber(options.maxFiles)); + assert(util.isU32(options.maxFiles)); this.maxFiles = options.maxFiles; } if (options.cacheSize != null) { - assert(util.isNumber(options.cacheSize)); + assert(util.isU64(options.cacheSize)); this.cacheSize = options.cacheSize; } @@ -2513,17 +2503,17 @@ ChainOptions.prototype.fromOptions = function fromOptions(options) { } if (options.coinCache != null) { - assert(util.isNumber(options.coinCache)); + assert(util.isU64(options.coinCache)); this.coinCache = options.coinCache; } if (options.entryCache != null) { - assert(util.isNumber(options.entryCache)); + assert(util.isU32(options.entryCache)); this.entryCache = options.entryCache; } if (options.maxOrphans != null) { - assert(util.isNumber(options.maxOrphans)); + assert(util.isU32(options.maxOrphans)); this.maxOrphans = options.maxOrphans; } @@ -2657,7 +2647,7 @@ function Orphan(block, flags, id) { this.block = block; this.flags = flags; this.id = id; - this.ts = util.now(); + this.time = util.now(); } /* diff --git a/lib/blockchain/chaindb.js b/lib/blockchain/chaindb.js index dbbc25772..cf742bce0 100644 --- a/lib/blockchain/chaindb.js +++ b/lib/blockchain/chaindb.js @@ -25,6 +25,7 @@ const Outpoint = require('../primitives/outpoint'); const Address = require('../primitives/address'); const ChainEntry = require('./chainentry'); const TXMeta = require('../primitives/txmeta'); +const CoinEntry = require('../coins/coinentry'); const U8 = encoding.U8; const U32 = encoding.U32; @@ -78,14 +79,12 @@ ChainDB.layout = layout; */ ChainDB.prototype.open = async function open() { - let state; - this.logger.info('Opening ChainDB...'); await this.db.open(); - await this.db.checkVersion('V', 2); + await this.db.checkVersion('V', 3); - state = await this.getState(); + const state = await this.getState(); if (state) { // Verify options have not changed. @@ -184,7 +183,7 @@ ChainDB.prototype.batch = function batch() { */ ChainDB.prototype.drop = function drop() { - let batch = this.current; + const batch = this.current; assert(this.current); assert(this.pending); @@ -274,8 +273,6 @@ ChainDB.prototype.getCache = function getCache(block) { */ ChainDB.prototype.getHeight = async function getHeight(hash) { - let entry, height; - if (typeof hash === 'number') return hash; @@ -284,12 +281,12 @@ ChainDB.prototype.getHeight = async function getHeight(hash) { if (hash === encoding.NULL_HASH) return -1; - entry = this.cacheHash.get(hash); + const entry = this.cacheHash.get(hash); if (entry) return entry.height; - height = await this.db.get(layout.h(hash)); + const height = await this.db.get(layout.h(hash)); if (!height) return -1; @@ -306,25 +303,23 @@ ChainDB.prototype.getHeight = async function getHeight(hash) { */ ChainDB.prototype.getHash = async function getHash(height) { - let entry, hash; - if (typeof height === 'string') return height; assert(typeof height === 'number'); if (height < 0) - return; + return null; - entry = this.cacheHeight.get(height); + const entry = this.cacheHeight.get(height); if (entry) return entry.hash; - hash = await this.db.get(layout.H(height)); + const hash = await this.db.get(layout.H(height)); if (!hash) - return; + return null; return hash.toString('hex'); }; @@ -337,30 +332,28 @@ ChainDB.prototype.getHash = async function getHash(height) { */ ChainDB.prototype.getEntryByHeight = async function getEntryByHeight(height) { - let state, entry, hash; - assert(typeof height === 'number'); if (height < 0) - return; + return null; - entry = this.cacheHeight.get(height); + const cache = this.cacheHeight.get(height); - if (entry) - return entry; + if (cache) + return cache; - hash = await this.db.get(layout.H(height)); + const data = await this.db.get(layout.H(height)); - if (!hash) - return; + if (!data) + return null; - hash = hash.toString('hex'); - state = this.chain.state; + const hash = data.toString('hex'); - entry = await this.getEntryByHash(hash); + const state = this.chain.state; + const entry = await this.getEntryByHash(hash); if (!entry) - return; + return null; // By the time getEntry has completed, // a reorg may have occurred. This entry @@ -379,24 +372,22 @@ ChainDB.prototype.getEntryByHeight = async function getEntryByHeight(height) { */ ChainDB.prototype.getEntryByHash = async function getEntryByHash(hash) { - let entry, raw; - assert(typeof hash === 'string'); if (hash === encoding.NULL_HASH) - return; + return null; - entry = this.cacheHash.get(hash); + const cache = this.cacheHash.get(hash); - if (entry) - return entry; + if (cache) + return cache; - raw = await this.db.get(layout.e(hash)); + const raw = await this.db.get(layout.e(hash)); if (!raw) - return; + return null; - entry = ChainEntry.fromRaw(this.chain, raw); + const entry = ChainEntry.fromRaw(this.chain, raw); // There's no efficient way to check whether // this is in the main chain or not, so @@ -426,7 +417,7 @@ ChainDB.prototype.getEntry = function getEntry(block) { */ ChainDB.prototype.hasEntry = async function hasEntry(hash) { - let height = await this.getHeight(hash); + const height = await this.getHeight(hash); return height !== -1; }; @@ -446,10 +437,10 @@ ChainDB.prototype.getTip = function getTip() { */ ChainDB.prototype.getState = async function getState() { - let data = await this.db.get(layout.R); + const data = await this.db.get(layout.R); if (!data) - return; + return null; return ChainState.fromRaw(data); }; @@ -461,9 +452,9 @@ ChainDB.prototype.getState = async function getState() { */ ChainDB.prototype.saveGenesis = async function saveGenesis() { - let genesis = this.network.genesisBlock; - let block = Block.fromRaw(genesis, 'hex'); - let entry = ChainEntry.fromBlock(this.chain, block); + const genesis = this.network.genesisBlock; + const block = Block.fromRaw(genesis, 'hex'); + const entry = ChainEntry.fromBlock(this.chain, block); this.logger.info('Writing genesis block to ChainDB.'); @@ -477,10 +468,10 @@ ChainDB.prototype.saveGenesis = async function saveGenesis() { */ ChainDB.prototype.getFlags = async function getFlags() { - let data = await this.db.get(layout.O); + const data = await this.db.get(layout.O); if (!data) - return; + return null; return ChainFlags.fromRaw(data); }; @@ -493,8 +484,8 @@ ChainDB.prototype.getFlags = async function getFlags() { */ ChainDB.prototype.verifyFlags = async function verifyFlags(state) { - let options = this.options; - let flags = await this.getFlags(); + const options = this.options; + const flags = await this.getFlags(); let needsSave = false; let needsPrune = false; @@ -567,17 +558,17 @@ ChainDB.prototype.verifyFlags = async function verifyFlags(state) { */ ChainDB.prototype.getStateCache = async function getStateCache() { - let stateCache = new StateCache(this.network); + const stateCache = new StateCache(this.network); - let items = await this.db.range({ + const items = await this.db.range({ gte: layout.v(0, encoding.ZERO_HASH), lte: layout.v(255, encoding.MAX_HASH), values: true }); - for (let item of items) { - let [bit, hash] = layout.vv(item.key); - let state = item.value[0]; + for (const item of items) { + const [bit, hash] = layout.vv(item.key); + const state = item.value[0]; stateCache.insert(bit, hash, state); } @@ -590,7 +581,7 @@ ChainDB.prototype.getStateCache = async function getStateCache() { */ ChainDB.prototype.saveDeployments = function saveDeployments() { - let batch = this.db.batch(); + const batch = this.db.batch(); this.writeDeployments(batch); return batch.write(); }; @@ -601,16 +592,16 @@ ChainDB.prototype.saveDeployments = function saveDeployments() { */ ChainDB.prototype.writeDeployments = function writeDeployments(batch) { - let bw = new StaticWriter(1 + 17 * this.network.deploys.length); + const bw = new StaticWriter(1 + 17 * this.network.deploys.length); bw.writeU8(this.network.deploys.length); - for (let deployment of this.network.deploys) { + for (const deployment of this.network.deploys) { bw.writeU8(deployment.bit); bw.writeU32(deployment.startTime); bw.writeU32(deployment.timeout); - bw.write32(deployment.threshold); - bw.write32(deployment.window); + bw.writeI32(deployment.threshold); + bw.writeI32(deployment.window); } batch.put(layout.V, bw.render()); @@ -624,22 +615,21 @@ ChainDB.prototype.writeDeployments = function writeDeployments(batch) { */ ChainDB.prototype.checkDeployments = async function checkDeployments() { - let raw = await this.db.get(layout.V); - let invalid = []; - let br, count; + const raw = await this.db.get(layout.V); assert(raw, 'No deployment table found.'); - br = new BufferReader(raw); - count = br.readU8(); + const br = new BufferReader(raw); + const count = br.readU8(); + const invalid = []; for (let i = 0; i < count; i++) { - let bit = br.readU8(); - let start = br.readU32(); - let timeout = br.readU32(); - let threshold = br.read32(); - let window = br.read32(); - let deployment = this.network.byBit(bit); + const bit = br.readU8(); + const start = br.readU32(); + const timeout = br.readU32(); + const threshold = br.readI32(); + const window = br.readI32(); + const deployment = this.network.byBit(bit); if (deployment && start === deployment.startTime @@ -662,7 +652,7 @@ ChainDB.prototype.checkDeployments = async function checkDeployments() { */ ChainDB.prototype.verifyDeployments = async function verifyDeployments() { - let invalid, batch; + let invalid; try { invalid = await this.checkDeployments(); @@ -670,16 +660,16 @@ ChainDB.prototype.verifyDeployments = async function verifyDeployments() { if (e.type !== 'EncodingError') throw e; invalid = []; - for (let {bit} of this.network.deploys) - invalid.push(bit); + for (let i = 0; i < 32; i++) + invalid.push(i); } if (invalid.length === 0) return true; - batch = this.db.batch(); + const batch = this.db.batch(); - for (let bit of invalid) { + for (const bit of invalid) { this.logger.warning('Versionbit deployment params modified.'); this.logger.warning('Invalidating cache for bit %d.', bit); await this.invalidateCache(bit, batch); @@ -700,12 +690,12 @@ ChainDB.prototype.verifyDeployments = async function verifyDeployments() { */ ChainDB.prototype.invalidateCache = async function invalidateCache(bit, batch) { - let keys = await this.db.keys({ + const keys = await this.db.keys({ gte: layout.v(bit, encoding.ZERO_HASH), lte: layout.v(bit, encoding.MAX_HASH) }); - for (let key of keys) + for (const key of keys) batch.del(key); }; @@ -717,25 +707,26 @@ ChainDB.prototype.invalidateCache = async function invalidateCache(bit, batch) { */ ChainDB.prototype.prune = async function prune(tip) { - let options = this.options; - let keepBlocks = this.network.block.keepBlocks; - let pruneAfter = this.network.block.pruneAfterHeight; - let flags = await this.getFlags(); - let height = await this.getHeight(tip); - let start, end, batch; + const options = this.options; + const keepBlocks = this.network.block.keepBlocks; + const pruneAfter = this.network.block.pruneAfterHeight; + + const flags = await this.getFlags(); if (flags.prune) throw new Error('Chain is already pruned.'); + const height = await this.getHeight(tip); + if (height <= pruneAfter + keepBlocks) return false; - start = pruneAfter + 1; - end = height - keepBlocks; - batch = this.db.batch(); + const start = pruneAfter + 1; + const end = height - keepBlocks; + const batch = this.db.batch(); for (let i = start; i <= end; i++) { - let hash = await this.getHash(i); + const hash = await this.getHash(i); if (!hash) throw new Error(`Cannot find hash for ${i}.`); @@ -747,7 +738,7 @@ ChainDB.prototype.prune = async function prune(tip) { try { options.prune = true; - flags = ChainFlags.fromOptions(options); + const flags = ChainFlags.fromOptions(options); assert(flags.prune); batch.put(layout.O, flags.toRaw()); @@ -771,10 +762,10 @@ ChainDB.prototype.prune = async function prune(tip) { */ ChainDB.prototype.getNextHash = async function getNextHash(hash) { - let data = await this.db.get(layout.n(hash)); + const data = await this.db.get(layout.n(hash)); if (!data) - return; + return null; return data.toString('hex'); }; @@ -787,8 +778,6 @@ ChainDB.prototype.getNextHash = async function getNextHash(hash) { */ ChainDB.prototype.isMainChain = async function isMainChain(hash) { - let entry; - assert(typeof hash === 'string'); if (hash === this.chain.tip.hash @@ -799,12 +788,12 @@ ChainDB.prototype.isMainChain = async function isMainChain(hash) { if (hash === encoding.NULL_HASH) return false; - entry = this.cacheHash.get(hash); + const cacheHash = this.cacheHash.get(hash); - if (entry) { - entry = this.cacheHeight.get(entry.height); - if (entry) - return entry.hash === hash; + if (cacheHash) { + const cacheHeight = this.cacheHeight.get(cacheHash.height); + if (cacheHeight) + return cacheHeight.hash === hash; } if (await this.getNextHash(hash)) @@ -842,69 +831,67 @@ ChainDB.prototype.getTips = function getTips() { /** * Get a coin (unspents only). * @method - * @param {Hash} hash - * @param {Number} index - * @returns {Promise} - Returns {@link Coin}. + * @private + * @param {Outpoint} prevout + * @returns {Promise} - Returns {@link CoinEntry}. */ -ChainDB.prototype.getCoin = async function getCoin(hash, index) { - let state = this.state; - let raw; - +ChainDB.prototype.readCoin = async function readCoin(prevout) { if (this.options.spv) - return; + return null; + + const {hash, index} = prevout; + const key = prevout.toKey(); + const state = this.state; - raw = this.coinCache.get(hash); + const cache = this.coinCache.get(key); - if (raw) - return Coins.parseCoin(raw, hash, index); + if (cache) + return CoinEntry.fromRaw(cache); - raw = await this.db.get(layout.c(hash)); + const raw = await this.db.get(layout.c(hash, index)); if (!raw) - return; + return null; if (state === this.state) - this.coinCache.set(hash, raw); + this.coinCache.set(key, raw); - return Coins.parseCoin(raw, hash, index); + return CoinEntry.fromRaw(raw); }; /** - * Get coins (unspents only). + * Get a coin (unspents only). * @method * @param {Hash} hash - * @returns {Promise} - Returns {@link Coins}. + * @param {Number} index + * @returns {Promise} - Returns {@link Coin}. */ -ChainDB.prototype.getCoins = async function getCoins(hash) { - let raw; - - if (this.options.spv) - return; - - raw = this.coinCache.get(hash); - - if (raw) - return Coins.fromRaw(raw, hash); +ChainDB.prototype.getCoin = async function getCoin(hash, index) { + const prevout = new Outpoint(hash, index); + const coin = await this.readCoin(prevout); - raw = await this.db.get(layout.c(hash)); + if (!coin) + return null; - if (!raw) - return; - - return Coins.fromRaw(raw, hash); + return coin.toCoin(prevout); }; /** * Check whether coins are still unspent. Necessary for bip30. * @see https://bitcointalk.org/index.php?topic=67738.0 - * @param {Hash} hash + * @param {TX} tx * @returns {Promise} - Returns Boolean. */ -ChainDB.prototype.hasCoins = function hasCoins(hash) { - return this.db.has(layout.c(hash)); +ChainDB.prototype.hasCoins = async function hasCoins(tx) { + for (let i = 0; i < tx.outputs.length; i++) { + const key = layout.c(tx.hash(), i); + if (await this.db.has(key)) + return true; + } + return false; }; /** @@ -915,20 +902,18 @@ ChainDB.prototype.hasCoins = function hasCoins(hash) { */ ChainDB.prototype.getCoinView = async function getCoinView(tx) { - let view = new CoinView(); - let prevout = tx.getPrevout(); + const view = new CoinView(); - for (let hash of prevout) { - let coins = await this.getCoins(hash); + for (const {prevout} of tx.inputs) { + const coin = await this.readCoin(prevout); - if (!coins) { - coins = new Coins(); - coins.hash = hash; - view.add(coins); + if (!coin) { + const coins = new Coins(); + view.add(prevout.hash, coins); continue; } - view.add(coins); + view.addEntry(prevout, coin); } return view; @@ -942,15 +927,13 @@ ChainDB.prototype.getCoinView = async function getCoinView(tx) { */ ChainDB.prototype.getSpentView = async function getSpentView(tx) { - let view = await this.getCoinView(tx); - - for (let coins of view.map.values()) { - let meta; + const view = await this.getCoinView(tx); + for (const [hash, coins] of view.map) { if (!coins.isEmpty()) continue; - meta = await this.getMeta(coins.hash); + const meta = await this.getMeta(hash); if (!meta) continue; @@ -969,9 +952,11 @@ ChainDB.prototype.getSpentView = async function getSpentView(tx) { */ ChainDB.prototype.getUndoCoins = async function getUndoCoins(hash) { - let data = await this.db.get(layout.u(hash)); + const data = await this.db.get(layout.u(hash)); + if (!data) return new UndoCoins(); + return UndoCoins.fromRaw(data); }; @@ -983,10 +968,10 @@ ChainDB.prototype.getUndoCoins = async function getUndoCoins(hash) { */ ChainDB.prototype.getBlock = async function getBlock(hash) { - let data = await this.getRawBlock(hash); + const data = await this.getRawBlock(hash); if (!data) - return; + return null; return Block.fromRaw(data); }; @@ -999,15 +984,13 @@ ChainDB.prototype.getBlock = async function getBlock(hash) { */ ChainDB.prototype.getRawBlock = async function getRawBlock(block) { - let hash; - if (this.options.spv) - return; + return null; - hash = await this.getHash(block); + const hash = await this.getHash(block); if (!hash) - return; + return null; return await this.db.get(layout.b(hash)); }; @@ -1020,30 +1003,17 @@ ChainDB.prototype.getRawBlock = async function getRawBlock(block) { */ ChainDB.prototype.getBlockView = async function getBlockView(block) { - let view = new CoinView(); - let undo = await this.getUndoCoins(block.hash()); + const view = new CoinView(); + const undo = await this.getUndoCoins(block.hash()); if (undo.isEmpty()) return view; for (let i = block.txs.length - 1; i > 0; i--) { - let tx = block.txs[i]; + const tx = block.txs[i]; for (let j = tx.inputs.length - 1; j >= 0; j--) { - let input = tx.inputs[j]; - let prev = input.prevout.hash; - - if (!view.has(prev)) { - assert(!undo.isEmpty()); - - if (undo.top().height === -1) { - let coins = new Coins(); - coins.hash = prev; - coins.coinbase = false; - view.add(coins); - } - } - + const input = tx.inputs[j]; undo.apply(view, input.prevout); } } @@ -1062,15 +1032,13 @@ ChainDB.prototype.getBlockView = async function getBlockView(block) { */ ChainDB.prototype.getMeta = async function getMeta(hash) { - let data; - if (!this.options.indexTX) - return; + return null; - data = await this.db.get(layout.t(hash)); + const data = await this.db.get(layout.t(hash)); if (!data) - return; + return null; return TXMeta.fromRaw(data); }; @@ -1083,9 +1051,11 @@ ChainDB.prototype.getMeta = async function getMeta(hash) { */ ChainDB.prototype.getTX = async function getTX(hash) { - let meta = await this.getMeta(hash); + const meta = await this.getMeta(hash); + if (!meta) - return; + return null; + return meta.tx; }; @@ -1094,11 +1064,11 @@ ChainDB.prototype.getTX = async function getTX(hash) { * @returns {Promise} - Returns Boolean. */ -ChainDB.prototype.hasTX = function hasTX(hash) { +ChainDB.prototype.hasTX = async function hasTX(hash) { if (!this.options.indexTX) - return Promise.resolve(); + return false; - return this.db.has(layout.t(hash)); + return await this.db.has(layout.t(hash)); }; /** @@ -1109,25 +1079,25 @@ ChainDB.prototype.hasTX = function hasTX(hash) { */ ChainDB.prototype.getCoinsByAddress = async function getCoinsByAddress(addrs) { - let coins = []; - if (!this.options.indexAddress) - return coins; + return []; if (!Array.isArray(addrs)) addrs = [addrs]; - for (let addr of addrs) { - let hash = Address.getHash(addr); + const coins = []; + + for (const addr of addrs) { + const hash = Address.getHash(addr); - let keys = await this.db.keys({ + const keys = await this.db.keys({ gte: layout.C(hash, encoding.ZERO_HASH, 0), lte: layout.C(hash, encoding.MAX_HASH, 0xffffffff), parse: layout.Cc }); - for (let [hash, index] of keys) { - let coin = await this.getCoin(hash, index); + for (const [hash, index] of keys) { + const coin = await this.getCoin(hash, index); assert(coin); coins.push(coin); } @@ -1144,19 +1114,19 @@ ChainDB.prototype.getCoinsByAddress = async function getCoinsByAddress(addrs) { */ ChainDB.prototype.getHashesByAddress = async function getHashesByAddress(addrs) { - let hashes = {}; - if (!this.options.indexTX || !this.options.indexAddress) return []; - for (let addr of addrs) { - let hash = Address.getHash(addr); + const hashes = Object.create(null); + + for (const addr of addrs) { + const hash = Address.getHash(addr); await this.db.keys({ gte: layout.T(hash, encoding.ZERO_HASH), lte: layout.T(hash, encoding.MAX_HASH), parse: (key) => { - let hash = layout.Tt(key); + const hash = layout.Tt(key); hashes[hash] = true; } }); @@ -1173,10 +1143,10 @@ ChainDB.prototype.getHashesByAddress = async function getHashesByAddress(addrs) */ ChainDB.prototype.getTXByAddress = async function getTXByAddress(addrs) { - let mtxs = await this.getMetaByAddress(addrs); - let out = []; + const mtxs = await this.getMetaByAddress(addrs); + const out = []; - for (let mtx of mtxs) + for (const mtx of mtxs) out.push(mtx.tx); return out; @@ -1189,20 +1159,18 @@ ChainDB.prototype.getTXByAddress = async function getTXByAddress(addrs) { * @returns {Promise} - Returns {@link TXMeta}[]. */ -ChainDB.prototype.getMetaByAddress = async function getTXByAddress(addrs) { - let txs = []; - let hashes; - +ChainDB.prototype.getMetaByAddress = async function getMetaByAddress(addrs) { if (!this.options.indexTX || !this.options.indexAddress) - return txs; + return []; if (!Array.isArray(addrs)) addrs = [addrs]; - hashes = await this.getHashesByAddress(addrs); + const hashes = await this.getHashesByAddress(addrs); + const txs = []; - for (let hash of hashes) { - let tx = await this.getMeta(hash); + for (const hash of hashes) { + const tx = await this.getMeta(hash); assert(tx); txs.push(tx); } @@ -1220,9 +1188,6 @@ ChainDB.prototype.getMetaByAddress = async function getTXByAddress(addrs) { */ ChainDB.prototype.scan = async function scan(start, filter, iter) { - let total = 0; - let entry; - if (start == null) start = this.network.genesis.hash; @@ -1231,17 +1196,19 @@ ChainDB.prototype.scan = async function scan(start, filter, iter) { else this.logger.info('Scanning from block %s.', util.revHex(start)); - entry = await this.getEntry(start); + let entry = await this.getEntry(start); if (!entry) return; - if (!(await entry.isMainChain())) + if (!await entry.isMainChain()) throw new Error('Cannot rescan an alternate chain.'); + let total = 0; + while (entry) { - let block = await this.getBlock(entry.hash); - let txs = []; + const block = await this.getBlock(entry.hash); + const txs = []; total++; @@ -1258,18 +1225,18 @@ ChainDB.prototype.scan = async function scan(start, filter, iter) { entry.rhash(), entry.height); for (let i = 0; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; let found = false; for (let j = 0; j < tx.outputs.length; j++) { - let output = tx.outputs[j]; - let hash = output.getHash(); + const output = tx.outputs[j]; + const hash = output.getHash(); if (!hash) continue; if (filter.test(hash)) { - let prevout = Outpoint.fromTX(tx, j); + const prevout = Outpoint.fromTX(tx, j); filter.add(prevout.toRaw()); found = true; } @@ -1283,7 +1250,7 @@ ChainDB.prototype.scan = async function scan(start, filter, iter) { if (i === 0) continue; - for (let {prevout} of tx.inputs) { + for (const {prevout} of tx.inputs) { if (filter.test(prevout.toRaw())) { txs.push(tx); break; @@ -1332,8 +1299,8 @@ ChainDB.prototype.save = async function save(entry, block, view) { * @returns {Promise} */ -ChainDB.prototype._save = async function save(entry, block, view) { - let hash = block.hash(); +ChainDB.prototype._save = async function _save(entry, block, view) { + const hash = block.hash(); // Hash->height index. this.put(layout.h(hash), U32(entry.height)); @@ -1400,8 +1367,8 @@ ChainDB.prototype.reconnect = async function reconnect(entry, block, view) { * @returns {Promise} */ -ChainDB.prototype._reconnect = async function reconnect(entry, block, view) { - let hash = block.hash(); +ChainDB.prototype._reconnect = async function _reconnect(entry, block, view) { + const hash = block.hash(); assert(!entry.isGenesis()); @@ -1434,10 +1401,9 @@ ChainDB.prototype._reconnect = async function reconnect(entry, block, view) { */ ChainDB.prototype.disconnect = async function disconnect(entry, block) { - let view; - this.start(); + let view; try { view = await this._disconnect(entry, block); } catch (e) { @@ -1459,9 +1425,7 @@ ChainDB.prototype.disconnect = async function disconnect(entry, block) { * @returns {Promise} - Returns {@link CoinView}. */ -ChainDB.prototype._disconnect = async function disconnect(entry, block) { - let view; - +ChainDB.prototype._disconnect = async function _disconnect(entry, block) { // Remove hash->next-block index. this.del(layout.n(entry.prevBlock)); @@ -1473,7 +1437,7 @@ ChainDB.prototype._disconnect = async function disconnect(entry, block) { this.saveUpdates(); // Disconnect inputs. - view = await this.disconnectBlock(entry, block); + const view = await this.disconnectBlock(entry, block); // Revert chain state to previous tip. this.put(layout.R, this.pending.commit(entry.prevBlock)); @@ -1487,15 +1451,15 @@ ChainDB.prototype._disconnect = async function disconnect(entry, block) { */ ChainDB.prototype.saveUpdates = function saveUpdates() { - let updates = this.stateCache.updates; + const updates = this.stateCache.updates; if (updates.length === 0) return; this.logger.info('Saving %d state cache updates.', updates.length); - for (let update of updates) { - let {bit, hash} = update; + for (const update of updates) { + const {bit, hash} = update; this.put(layout.v(bit, hash), update.toRaw()); } }; @@ -1509,13 +1473,12 @@ ChainDB.prototype.saveUpdates = function saveUpdates() { */ ChainDB.prototype.reset = async function reset(block) { - let entry = await this.getEntry(block); - let tip; + const entry = await this.getEntry(block); if (!entry) throw new Error('Block not found.'); - if (!(await entry.isMainChain())) + if (!await entry.isMainChain()) throw new Error('Cannot reset on alternate chain.'); if (this.options.prune) @@ -1527,7 +1490,7 @@ ChainDB.prototype.reset = async function reset(block) { // the chain. await this.removeChains(); - tip = await this.getTip(); + let tip = await this.getTip(); assert(tip); this.logger.debug('Resetting main chain to: %s', entry.rhash()); @@ -1586,14 +1549,14 @@ ChainDB.prototype.reset = async function reset(block) { */ ChainDB.prototype.removeChains = async function removeChains() { - let tips = await this.getTips(); + const tips = await this.getTips(); // Note that this has to be // one giant atomic write! this.start(); try { - for (let tip of tips) + for (const tip of tips) await this._removeChain(tip); } catch (e) { this.drop(); @@ -1611,7 +1574,7 @@ ChainDB.prototype.removeChains = async function removeChains() { * @returns {Promise} */ -ChainDB.prototype._removeChain = async function removeChain(hash) { +ChainDB.prototype._removeChain = async function _removeChain(hash) { let tip = await this.getEntry(hash); if (!tip) @@ -1651,7 +1614,7 @@ ChainDB.prototype._removeChain = async function removeChain(hash) { */ ChainDB.prototype.saveBlock = async function saveBlock(entry, block, view) { - let hash = block.hash(); + const hash = block.hash(); if (this.options.spv) return; @@ -1675,12 +1638,10 @@ ChainDB.prototype.saveBlock = async function saveBlock(entry, block, view) { */ ChainDB.prototype.removeBlock = async function removeBlock(entry) { - let block; - if (this.options.spv) - return; + return new CoinView(); - block = await this.getBlock(entry.hash); + const block = await this.getBlock(entry.hash); if (!block) throw new Error('Block not found.'); @@ -1697,14 +1658,18 @@ ChainDB.prototype.removeBlock = async function removeBlock(entry) { */ ChainDB.prototype.saveView = function saveView(view) { - for (let coins of view.map.values()) { - if (coins.isEmpty()) { - this.del(layout.c(coins.hash)); - this.coinCache.unpush(coins.hash); - } else { - let raw = coins.toRaw(); - this.put(layout.c(coins.hash), raw); - this.coinCache.push(coins.hash, raw); + for (const [hash, coins] of view.map) { + for (const [index, coin] of coins.outputs) { + if (coin.spent) { + this.del(layout.c(hash, index)); + this.coinCache.unpush(hash + index); + continue; + } + + const raw = coin.toRaw(); + + this.put(layout.c(hash, index), raw); + this.coinCache.push(hash + index, raw); } } }; @@ -1719,11 +1684,11 @@ ChainDB.prototype.saveView = function saveView(view) { */ ChainDB.prototype.connectBlock = async function connectBlock(entry, block, view) { - let hash = block.hash(); - if (this.options.spv) return; + const hash = block.hash(); + this.pending.connect(block); // Genesis block's coinbase is unspendable. @@ -1732,14 +1697,14 @@ ChainDB.prototype.connectBlock = async function connectBlock(entry, block, view) // Update chain state value. for (let i = 0; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; if (i > 0) { - for (let input of tx.inputs) - this.pending.spend(view.getOutput(input)); + for (const {prevout} of tx.inputs) + this.pending.spend(view.getOutput(prevout)); } - for (let output of tx.outputs) { + for (const output of tx.outputs) { if (output.script.isUnspendable()) continue; @@ -1770,28 +1735,25 @@ ChainDB.prototype.connectBlock = async function connectBlock(entry, block, view) */ ChainDB.prototype.disconnectBlock = async function disconnectBlock(entry, block) { - let view = new CoinView(); - let hash = block.hash(); - let undo; + const view = new CoinView(); if (this.options.spv) return view; - undo = await this.getUndoCoins(hash); + const hash = block.hash(); + const undo = await this.getUndoCoins(hash); this.pending.disconnect(block); // Disconnect all transactions. for (let i = block.txs.length - 1; i >= 0; i--) { - let tx = block.txs[i]; + const tx = block.txs[i]; if (i > 0) { - await view.ensureInputs(this, tx); - for (let j = tx.inputs.length - 1; j >= 0; j--) { - let input = tx.inputs[j]; - undo.apply(view, input.prevout); - this.pending.add(view.getOutput(input)); + const {prevout} = tx.inputs[j]; + undo.apply(view, prevout); + this.pending.add(view.getOutput(prevout)); } } @@ -1799,7 +1761,7 @@ ChainDB.prototype.disconnectBlock = async function disconnectBlock(entry, block) view.removeTX(tx, entry.height); for (let j = tx.outputs.length - 1; j >= 0; j--) { - let output = tx.outputs[j]; + const output = tx.outputs[j]; if (output.script.isUnspendable()) continue; @@ -1833,20 +1795,18 @@ ChainDB.prototype.disconnectBlock = async function disconnectBlock(entry, block) */ ChainDB.prototype.pruneBlock = async function pruneBlock(entry) { - let height, hash; - if (this.options.spv) return; if (!this.options.prune) return; - height = entry.height - this.network.block.keepBlocks; + const height = entry.height - this.network.block.keepBlocks; if (height <= this.network.block.pruneAfterHeight) return; - hash = await this.getHash(height); + const hash = await this.getHash(height); if (!hash) return; @@ -1861,7 +1821,7 @@ ChainDB.prototype.pruneBlock = async function pruneBlock(entry) { */ ChainDB.prototype.saveFlags = function saveFlags() { - let flags = ChainFlags.fromOptions(this.options); + const flags = ChainFlags.fromOptions(this.options); return this.db.put(layout.O, flags.toRaw()); }; @@ -1875,16 +1835,16 @@ ChainDB.prototype.saveFlags = function saveFlags() { */ ChainDB.prototype.indexTX = function indexTX(tx, view, entry, index) { - let hash = tx.hash(); + const hash = tx.hash(); if (this.options.indexTX) { - let meta = TXMeta.fromTX(tx, entry, index); + const meta = TXMeta.fromTX(tx, entry, index); this.put(layout.t(hash), meta.toRaw()); if (this.options.indexAddress) { - let hashes = tx.getHashes(view); - for (let addr of hashes) + const hashes = tx.getHashes(view); + for (const addr of hashes) this.put(layout.T(addr, hash), null); } } @@ -1893,9 +1853,8 @@ ChainDB.prototype.indexTX = function indexTX(tx, view, entry, index) { return; if (!tx.isCoinbase()) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let addr = view.getOutput(input).getHash(); + for (const {prevout} of tx.inputs) { + const addr = view.getOutput(prevout).getHash(); if (!addr) continue; @@ -1905,8 +1864,8 @@ ChainDB.prototype.indexTX = function indexTX(tx, view, entry, index) { } for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let addr = output.getHash(); + const output = tx.outputs[i]; + const addr = output.getHash(); if (!addr) continue; @@ -1923,13 +1882,13 @@ ChainDB.prototype.indexTX = function indexTX(tx, view, entry, index) { */ ChainDB.prototype.unindexTX = function unindexTX(tx, view) { - let hash = tx.hash(); + const hash = tx.hash(); if (this.options.indexTX) { this.del(layout.t(hash)); if (this.options.indexAddress) { - let hashes = tx.getHashes(view); - for (let addr of hashes) + const hashes = tx.getHashes(view); + for (const addr of hashes) this.del(layout.T(addr, hash)); } } @@ -1938,9 +1897,8 @@ ChainDB.prototype.unindexTX = function unindexTX(tx, view) { return; if (!tx.isCoinbase()) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let addr = view.getOutput(input).getHash(); + for (const {prevout} of tx.inputs) { + const addr = view.getOutput(prevout).getHash(); if (!addr) continue; @@ -1950,8 +1908,8 @@ ChainDB.prototype.unindexTX = function unindexTX(tx, view) { } for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let addr = output.getHash(); + const output = tx.outputs[i]; + const addr = output.getHash(); if (!addr) continue; @@ -2024,7 +1982,7 @@ ChainFlags.fromOptions = function fromOptions(data) { }; ChainFlags.prototype.toRaw = function toRaw() { - let bw = new StaticWriter(12); + const bw = new StaticWriter(12); let flags = 0; if (this.spv) @@ -2056,12 +2014,11 @@ ChainFlags.prototype.toRaw = function toRaw() { }; ChainFlags.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let flags; + const br = new BufferReader(data); this.network = Network.fromMagic(br.readU32()); - flags = br.readU32(); + const flags = br.readU32(); this.spv = (flags & 1) !== 0; this.witness = (flags & 2) !== 0; @@ -2101,7 +2058,7 @@ ChainState.prototype.rhash = function rhash() { }; ChainState.prototype.clone = function clone() { - let state = new ChainState(); + const state = new ChainState(); state.tip = this.tip; state.tx = this.tx; state.coin = this.coin; @@ -2113,7 +2070,7 @@ ChainState.prototype.connect = function connect(block) { this.tx += block.txs.length; }; -ChainState.prototype.disconnect = function connect(block) { +ChainState.prototype.disconnect = function disconnect(block) { this.tx -= block.txs.length; }; @@ -2136,7 +2093,7 @@ ChainState.prototype.commit = function commit(hash) { }; ChainState.prototype.toRaw = function toRaw() { - let bw = new StaticWriter(56); + const bw = new StaticWriter(56); bw.writeHash(this.tip); bw.writeU64(this.tx); bw.writeU64(this.coin); @@ -2145,8 +2102,8 @@ ChainState.prototype.toRaw = function toRaw() { }; ChainState.fromRaw = function fromRaw(data) { - let state = new ChainState(); - let br = new BufferReader(data); + const state = new ChainState(); + const br = new BufferReader(data); state.tip = br.readHash(); state.tx = br.readU53(); state.coin = br.readU53(); @@ -2171,14 +2128,14 @@ StateCache.prototype._init = function _init() { for (let i = 0; i < 32; i++) this.bits.push(null); - for (let {bit} of this.network.deploys) { + for (const {bit} of this.network.deploys) { assert(!this.bits[bit]); this.bits[bit] = new Map(); } }; StateCache.prototype.set = function set(bit, entry, state) { - let cache = this.bits[bit]; + const cache = this.bits[bit]; assert(cache); @@ -2189,12 +2146,11 @@ StateCache.prototype.set = function set(bit, entry, state) { }; StateCache.prototype.get = function get(bit, entry) { - let cache = this.bits[bit]; - let state; + const cache = this.bits[bit]; assert(cache); - state = cache.get(entry.hash); + const state = cache.get(entry.hash); if (state == null) return -1; @@ -2207,8 +2163,8 @@ StateCache.prototype.commit = function commit() { }; StateCache.prototype.drop = function drop() { - for (let {bit, hash} of this.updates) { - let cache = this.bits[bit]; + for (const {bit, hash} of this.updates) { + const cache = this.bits[bit]; assert(cache); cache.delete(hash); } @@ -2217,7 +2173,7 @@ StateCache.prototype.drop = function drop() { }; StateCache.prototype.insert = function insert(bit, hash, state) { - let cache = this.bits[bit]; + const cache = this.bits[bit]; assert(cache); cache.set(hash, state); }; diff --git a/lib/blockchain/chainentry.js b/lib/blockchain/chainentry.js index e4782082e..b18d0e3fb 100644 --- a/lib/blockchain/chainentry.js +++ b/lib/blockchain/chainentry.js @@ -17,6 +17,7 @@ const BufferReader = require('../utils/reader'); const StaticWriter = require('../utils/staticwriter'); const Headers = require('../primitives/headers'); const InvItem = require('../primitives/invitem'); +const ZERO = new BN(0); /** * Represents an entry in the chain. Unlike @@ -35,7 +36,7 @@ const InvItem = require('../primitives/invitem'); * This value will never be negative. * @property {Hash} prevBlock * @property {Hash} merkleRoot - * @property {Number} ts + * @property {Number} time * @property {Number} bits * @property {Number} nonce * @property {Number} height @@ -52,11 +53,11 @@ function ChainEntry(chain, options, prev) { this.version = 1; this.prevBlock = encoding.NULL_HASH; this.merkleRoot = encoding.NULL_HASH; - this.ts = 0; + this.time = 0; this.bits = 0; this.nonce = 0; - this.height = -1; - this.chainwork = null; + this.height = 0; + this.chainwork = ZERO; if (options) this.fromOptions(options, prev); @@ -87,23 +88,24 @@ ChainEntry.MEDIAN_TIMESPAN = 11; ChainEntry.prototype.fromOptions = function fromOptions(options, prev) { assert(options, 'Block data is required.'); assert(typeof options.hash === 'string'); - assert(util.isNumber(options.version)); + assert(util.isU32(options.version)); assert(typeof options.prevBlock === 'string'); assert(typeof options.merkleRoot === 'string'); - assert(util.isNumber(options.ts)); - assert(util.isNumber(options.bits)); - assert(util.isNumber(options.nonce)); + assert(util.isU32(options.time)); + assert(util.isU32(options.bits)); + assert(util.isU32(options.nonce)); + assert(util.isU32(options.height)); assert(!options.chainwork || BN.isBN(options.chainwork)); this.hash = options.hash; this.version = options.version; this.prevBlock = options.prevBlock; this.merkleRoot = options.merkleRoot; - this.ts = options.ts; + this.time = options.time; this.bits = options.bits; this.nonce = options.nonce; this.height = options.height; - this.chainwork = options.chainwork; + this.chainwork = options.chainwork || ZERO; if (!this.chainwork) this.chainwork = this.getChainwork(prev); @@ -129,9 +131,11 @@ ChainEntry.fromOptions = function fromOptions(chain, options, prev) { */ ChainEntry.prototype.getProof = function getProof() { - let target = consensus.fromCompact(this.bits); + const target = consensus.fromCompact(this.bits); + if (target.isNeg() || target.cmpn(0) === 0) return new BN(0); + return ChainEntry.MAX_CHAINWORK.div(target.iaddn(1)); }; @@ -142,7 +146,7 @@ ChainEntry.prototype.getProof = function getProof() { */ ChainEntry.prototype.getChainwork = function getChainwork(prev) { - let proof = this.getProof(); + const proof = this.getProof(); if (!prev) return proof; @@ -166,14 +170,12 @@ ChainEntry.prototype.isGenesis = function isGenesis() { */ ChainEntry.prototype.isMainChain = async function isMainChain() { - let entry; - if (this.hash === this.chain.tip.hash || this.hash === this.chain.network.genesis.hash) { return true; } - entry = this.chain.db.getCache(this.height); + const entry = this.chain.db.getCache(this.height); if (entry) { if (entry.hash === this.hash) @@ -195,10 +197,8 @@ ChainEntry.prototype.isMainChain = async function isMainChain() { */ ChainEntry.prototype.getAncestor = async function getAncestor(height) { - let entry = this; - if (height < 0) - return; + return null; assert(height >= 0); assert(height <= this.height); @@ -206,6 +206,7 @@ ChainEntry.prototype.getAncestor = async function getAncestor(height) { if (await this.isMainChain()) return await this.chain.db.getEntry(height); + let entry = this; while (entry.height !== height) { entry = await entry.getPrevious(); assert(entry); @@ -239,9 +240,11 @@ ChainEntry.prototype.getPrevCache = function getPrevCache() { */ ChainEntry.prototype.getNext = async function getNext() { - let hash = await this.chain.db.getNextHash(this.hash); + const hash = await this.chain.db.getNextHash(this.hash); + if (!hash) - return; + return null; + return await this.chain.db.getEntry(hash); }; @@ -252,14 +255,14 @@ ChainEntry.prototype.getNext = async function getNext() { */ ChainEntry.prototype.getNextEntry = async function getNextEntry() { - let entry = await this.chain.db.getEntry(this.height + 1); + const entry = await this.chain.db.getEntry(this.height + 1); if (!entry) - return; + return null; // Not on main chain. if (entry.prevBlock !== this.hash) - return; + return null; return entry; }; @@ -267,29 +270,27 @@ ChainEntry.prototype.getNextEntry = async function getNextEntry() { /** * Calculate median time past. * @method - * @param {Number?} ts + * @param {Number?} time * @returns {Promise} - Returns Number. */ -ChainEntry.prototype.getMedianTime = async function getMedianTime(ts) { +ChainEntry.prototype.getMedianTime = async function getMedianTime(time) { let timespan = ChainEntry.MEDIAN_TIMESPAN; - let entry = this; - let median = []; + const median = []; // In case we ever want to check // the MTP of the _current_ block // (necessary for BIP148). - if (ts != null) { - median.push(ts); + if (time != null) { + median.push(time); timespan -= 1; } + let entry = this; for (let i = 0; i < timespan && entry; i++) { - let cache; - - median.push(entry.ts); + median.push(entry.time); - cache = entry.getPrevCache(); + const cache = entry.getPrevCache(); if (cache) { entry = cache; @@ -311,7 +312,7 @@ ChainEntry.prototype.getMedianTime = async function getMedianTime(ts) { */ ChainEntry.prototype.isHistorical = function isHistorical() { - if (this.chain.checkpoints) { + if (this.chain.options.checkpoints) { if (this.height + 1 <= this.chain.network.lastCheckpoint) return true; } @@ -324,8 +325,8 @@ ChainEntry.prototype.isHistorical = function isHistorical() { */ ChainEntry.prototype.hasUnknown = function hasUnknown() { - let bits = this.version & consensus.VERSION_TOP_MASK; - let topBits = consensus.VERSION_TOP_BITS; + const bits = this.version & consensus.VERSION_TOP_MASK; + const topBits = consensus.VERSION_TOP_BITS; if ((bits >>> 0) !== topBits) return false; @@ -364,7 +365,7 @@ ChainEntry.prototype.fromBlock = function fromBlock(block, prev) { this.version = block.version; this.prevBlock = block.prevBlock; this.merkleRoot = block.merkleRoot; - this.ts = block.ts; + this.time = block.time; this.bits = block.bits; this.nonce = block.nonce; this.height = prev ? prev.height + 1: 0; @@ -390,16 +391,16 @@ ChainEntry.fromBlock = function fromBlock(chain, block, prev) { */ ChainEntry.prototype.toRaw = function toRaw() { - let bw = new StaticWriter(116); + const bw = new StaticWriter(116); bw.writeU32(this.version); bw.writeHash(this.prevBlock); bw.writeHash(this.merkleRoot); - bw.writeU32(this.ts); + bw.writeU32(this.time); bw.writeU32(this.bits); bw.writeU32(this.nonce); bw.writeU32(this.height); - bw.writeBytes(this.chainwork.toBuffer('le', 32)); + bw.writeBytes(this.chainwork.toArrayLike(Buffer, 'le', 32)); return bw.render(); }; @@ -411,8 +412,8 @@ ChainEntry.prototype.toRaw = function toRaw() { */ ChainEntry.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let hash = digest.hash256(br.readBytes(80)); + const br = new BufferReader(data, true); + const hash = digest.hash256(br.readBytes(80)); br.seek(-80); @@ -420,7 +421,7 @@ ChainEntry.prototype.fromRaw = function fromRaw(data) { this.version = br.readU32(); this.prevBlock = br.readHash('hex'); this.merkleRoot = br.readHash('hex'); - this.ts = br.readU32(); + this.time = br.readU32(); this.bits = br.readU32(); this.nonce = br.readU32(); this.height = br.readU32(); @@ -452,7 +453,7 @@ ChainEntry.prototype.toJSON = function toJSON() { version: this.version, prevBlock: util.revHex(this.prevBlock), merkleRoot: util.revHex(this.merkleRoot), - ts: this.ts, + time: this.time, bits: this.bits, nonce: this.nonce, height: this.height, @@ -469,19 +470,19 @@ ChainEntry.prototype.toJSON = function toJSON() { ChainEntry.prototype.fromJSON = function fromJSON(json) { assert(json, 'Block data is required.'); assert(typeof json.hash === 'string'); - assert(util.isUInt32(json.version)); + assert(util.isU32(json.version)); assert(typeof json.prevBlock === 'string'); assert(typeof json.merkleRoot === 'string'); - assert(util.isUInt32(json.ts)); - assert(util.isUInt32(json.bits)); - assert(util.isUInt32(json.nonce)); + assert(util.isU32(json.time)); + assert(util.isU32(json.bits)); + assert(util.isU32(json.nonce)); assert(typeof json.chainwork === 'string'); this.hash = util.revHex(json.hash); this.version = json.version; this.prevBlock = util.revHex(json.prevBlock); this.merkleRoot = util.revHex(json.merkleRoot); - this.ts = json.ts; + this.time = json.time; this.bits = json.bits; this.nonce = json.nonce; this.height = json.height; @@ -525,7 +526,7 @@ ChainEntry.prototype.toInv = function toInv() { */ ChainEntry.prototype.inspect = function inspect() { - let json = this.toJSON(); + const json = this.toJSON(); json.version = util.hex32(json.version); return json; }; diff --git a/lib/blockchain/layout-browser.js b/lib/blockchain/layout-browser.js index fc82b13c2..701a627b8 100644 --- a/lib/blockchain/layout-browser.js +++ b/lib/blockchain/layout-browser.js @@ -6,6 +6,7 @@ 'use strict'; +const assert = require('assert'); const util = require('../utils/util'); const pad8 = util.pad8; const pad32 = util.pad32; @@ -36,8 +37,8 @@ const layout = { t: function t(hash) { return 't' + hex(hash); }, - c: function c(hash) { - return 'c' + hex(hash); + c: function c(hash, index) { + return 'c' + hex(hash) + pad32(index); }, u: function u(hash) { return 'u' + hex(hash); @@ -46,44 +47,57 @@ const layout = { return 'v' + pad8(bit) + hex(hash); }, vv: function vv(key) { - return [+key.slice(1, 4), key.slice(4, 36)]; + assert(typeof key === 'string'); + assert(key.length === 36); + return [parseInt(key.slice(1, 4), 10), key.slice(4, 36)]; }, - T: function T(address, hash) { - address = hex(address); + T: function T(addr, hash) { + addr = hex(addr); - if (address.length === 64) - return 'W' + address + hex(hash); + if (addr.length === 64) + return 'W' + addr + hex(hash); - return 'T' + address + hex(hash); + assert(addr.length === 40); + return 'T' + addr + hex(hash); }, - C: function C(address, hash, index) { - address = hex(address); + C: function C(addr, hash, index) { + addr = hex(addr); - if (address.length === 64) - return 'X' + address + hex(hash) + pad32(index); + if (addr.length === 64) + return 'X' + addr + hex(hash) + pad32(index); - return 'C' + address + hex(hash) + pad32(index); + assert(addr.length === 40); + return 'C' + addr + hex(hash) + pad32(index); }, - pp: function aa(key) { + pp: function pp(key) { + assert(typeof key === 'string'); + assert(key.length === 65); return key.slice(1, 65); }, Cc: function Cc(key) { - let hash, index; + assert(typeof key === 'string'); + let hash, index; if (key.length === 139) { hash = key.slice(65, 129); - index = +key.slice(129); - } else { + index = parseInt(key.slice(129), 10); + } else if (key.length === 115) { hash = key.slice(41, 105); - index = +key.slice(105); + index = parseInt(key.slice(105), 10); + } else { + assert(false); } return [hash, index]; }, Tt: function Tt(key) { - return key.length === 129 - ? key.slice(64) - : key.slice(41); + assert(typeof key === 'string'); + + if (key.length === 129) + return key.slice(64); + + assert(key.length === 105); + return key.slice(41); } }; @@ -92,8 +106,9 @@ const layout = { */ function hex(hash) { - if (typeof hash !== 'string') + if (Buffer.isBuffer(hash)) hash = hash.toString('hex'); + assert(typeof hash === 'string'); return hash; } diff --git a/lib/blockchain/layout.js b/lib/blockchain/layout.js index 162ffaee3..5a232962e 100644 --- a/lib/blockchain/layout.js +++ b/lib/blockchain/layout.js @@ -6,6 +6,8 @@ 'use strict'; +const assert = require('assert'); + /* * Database Layout: * R -> tip hash @@ -53,86 +55,104 @@ const layout = { t: function t(hash) { return pair(0x74, hash); }, - c: function c(hash) { - return pair(0x63, hash); + c: function c(hash, index) { + return bpair(0x63, hash, index); }, u: function u(hash) { return pair(0x75, hash); }, v: function v(bit, hash) { - let key = Buffer.allocUnsafe(1 + 1 + 32); + const key = Buffer.allocUnsafe(1 + 1 + 32); + assert(typeof bit === 'number'); key[0] = 0x76; key[1] = bit; write(key, hash, 2); return key; }, vv: function vv(key) { + assert(Buffer.isBuffer(key)); + assert(key.length === 34); return [key[1], key.toString('hex', 2, 34)]; }, - T: function T(address, hash) { - let len = address.length; - let key; + T: function T(addr, hash) { + let len = addr.length; - if (typeof address === 'string') + if (typeof addr === 'string') len /= 2; + let key; if (len === 32) { key = Buffer.allocUnsafe(65); key[0] = 0xab; // W + T - write(key, address, 1); + write(key, addr, 1); write(key, hash, 33); - } else { + } else if (len === 20) { key = Buffer.allocUnsafe(53); key[0] = 0x54; // T - write(key, address, 1); + write(key, addr, 1); write(key, hash, 21); + } else { + assert(false); } return key; }, - C: function C(address, hash, index) { - let len = address.length; - let key; + C: function C(addr, hash, index) { + let len = addr.length; - if (typeof address === 'string') + assert(typeof index === 'number'); + + if (typeof addr === 'string') len /= 2; + let key; if (len === 32) { key = Buffer.allocUnsafe(69); key[0] = 0x9a; // W + C - write(key, address, 1); + write(key, addr, 1); write(key, hash, 33); key.writeUInt32BE(index, 65, true); - } else { + } else if (len === 20) { key = Buffer.allocUnsafe(57); key[0] = 0x43; // C - write(key, address, 1); + write(key, addr, 1); write(key, hash, 21); key.writeUInt32BE(index, 53, true); + } else { + assert(false); } return key; }, - pp: function aa(key) { + pp: function pp(key) { + assert(Buffer.isBuffer(key)); + assert(key.length === 33); return key.toString('hex', 1, 33); }, Cc: function Cc(key) { - let hash, index; + assert(Buffer.isBuffer(key)); + let hash, index; if (key.length === 69) { hash = key.toString('hex', 33, 65); index = key.readUInt32BE(65, 0); - } else { + } else if (key.length === 57) { hash = key.toString('hex', 21, 53); index = key.readUInt32BE(53, 0); + } else { + assert(false); } return [hash, index]; }, Tt: function Tt(key) { - return key.length === 65 - ? key.toString('hex', 33, 65) - : key.toString('hex', 21, 53); + assert(Buffer.isBuffer(key)); + + if (key.length === 65) + return key.toString('hex', 33, 65); + + assert(key.length === 53); + return key.toString('hex', 21, 53); } }; @@ -143,23 +163,34 @@ const layout = { function write(data, str, off) { if (Buffer.isBuffer(str)) return str.copy(data, off); - data.write(str, off, 'hex'); + assert(typeof str === 'string'); + return data.write(str, off, 'hex'); } function pair(prefix, hash) { - let key = Buffer.allocUnsafe(33); + const key = Buffer.allocUnsafe(33); key[0] = prefix; write(key, hash, 1); return key; } function ipair(prefix, num) { - let key = Buffer.allocUnsafe(5); + const key = Buffer.allocUnsafe(5); + assert(typeof num === 'number'); key[0] = prefix; key.writeUInt32BE(num, 1, true); return key; } +function bpair(prefix, hash, index) { + const key = Buffer.allocUnsafe(37); + assert(typeof index === 'number'); + key[0] = prefix; + write(key, hash, 1); + key.writeUInt32BE(index, 33, true); + return key; +} + /* * Expose */ diff --git a/lib/btc/amount.js b/lib/btc/amount.js index b92669020..7c9bb45d0 100644 --- a/lib/btc/amount.js +++ b/lib/btc/amount.js @@ -15,18 +15,17 @@ const util = require('../utils/util'); * @constructor * @param {(String|Number)?} value * @param {String?} unit - * @param {Boolean?} num * @property {Amount} value */ -function Amount(value, unit, num) { +function Amount(value, unit) { if (!(this instanceof Amount)) - return new Amount(value, unit, num); + return new Amount(value, unit); this.value = 0; if (value != null) - this.fromOptions(value, unit, num); + this.fromOptions(value, unit); } /** @@ -34,13 +33,12 @@ function Amount(value, unit, num) { * @private * @param {(String|Number)?} value * @param {String?} unit - * @param {Boolean?} num * @returns {Amount} */ -Amount.prototype.fromOptions = function fromOptions(value, unit, num) { +Amount.prototype.fromOptions = function fromOptions(value, unit) { if (typeof unit === 'string') - return this.from(unit, value, num); + return this.from(unit, value); if (typeof value === 'number') return this.fromValue(value); @@ -77,7 +75,7 @@ Amount.prototype.toSatoshis = function toSatoshis(num) { */ Amount.prototype.toBits = function toBits(num) { - return Amount.serialize(this.value, 2, num); + return Amount.encode(this.value, 2, num); }; /** @@ -87,7 +85,7 @@ Amount.prototype.toBits = function toBits(num) { */ Amount.prototype.toMBTC = function toMBTC(num) { - return Amount.serialize(this.value, 5, num); + return Amount.encode(this.value, 5, num); }; /** @@ -97,7 +95,7 @@ Amount.prototype.toMBTC = function toMBTC(num) { */ Amount.prototype.toBTC = function toBTC(num) { - return Amount.serialize(this.value, 8, num); + return Amount.encode(this.value, 8, num); }; /** @@ -140,7 +138,7 @@ Amount.prototype.toString = function toString() { */ Amount.prototype.fromValue = function fromValue(value) { - assert(util.isInt53(value), 'Value must be an int64.'); + assert(util.isI64(value), 'Value must be an int64.'); this.value = value; return this; }; @@ -149,12 +147,11 @@ Amount.prototype.fromValue = function fromValue(value) { * Inject properties from satoshis. * @private * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.prototype.fromSatoshis = function fromSatoshis(value, num) { - this.value = Amount.parse(value, 0, num); +Amount.prototype.fromSatoshis = function fromSatoshis(value) { + this.value = Amount.decode(value, 0); return this; }; @@ -162,12 +159,11 @@ Amount.prototype.fromSatoshis = function fromSatoshis(value, num) { * Inject properties from bits. * @private * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.prototype.fromBits = function fromBits(value, num) { - this.value = Amount.parse(value, 2, num); +Amount.prototype.fromBits = function fromBits(value) { + this.value = Amount.decode(value, 2); return this; }; @@ -175,12 +171,11 @@ Amount.prototype.fromBits = function fromBits(value, num) { * Inject properties from mbtc. * @private * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.prototype.fromMBTC = function fromMBTC(value, num) { - this.value = Amount.parse(value, 5, num); +Amount.prototype.fromMBTC = function fromMBTC(value) { + this.value = Amount.decode(value, 5); return this; }; @@ -188,12 +183,11 @@ Amount.prototype.fromMBTC = function fromMBTC(value, num) { * Inject properties from btc. * @private * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.prototype.fromBTC = function fromBTC(value, num) { - this.value = Amount.parse(value, 8, num); +Amount.prototype.fromBTC = function fromBTC(value) { + this.value = Amount.decode(value, 8); return this; }; @@ -202,21 +196,20 @@ Amount.prototype.fromBTC = function fromBTC(value, num) { * @private * @param {String} unit * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.prototype.from = function from(unit, value, num) { +Amount.prototype.from = function from(unit, value) { switch (unit) { case 'sat': - return this.fromSatoshis(value, num); + return this.fromSatoshis(value); case 'ubtc': case 'bits': - return this.fromBits(value, num); + return this.fromBits(value); case 'mbtc': - return this.fromMBTC(value, num); + return this.fromMBTC(value); case 'btc': - return this.fromBTC(value, num); + return this.fromBTC(value); } throw new Error(`Unknown unit "${unit}".`); }; @@ -225,12 +218,11 @@ Amount.prototype.from = function from(unit, value, num) { * Instantiate amount from options. * @param {(String|Number)?} value * @param {String?} unit - * @param {Boolean?} num * @returns {Amount} */ -Amount.fromOptions = function fromOptions(value, unit, num) { - return new Amount().fromOptions(value); +Amount.fromOptions = function fromOptions(value, unit) { + return new Amount().fromOptions(value, unit); }; /** @@ -247,57 +239,52 @@ Amount.fromValue = function fromValue(value) { /** * Instantiate amount from satoshis. * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.fromSatoshis = function fromSatoshis(value, num) { - return new Amount().fromSatoshis(value, num); +Amount.fromSatoshis = function fromSatoshis(value) { + return new Amount().fromSatoshis(value); }; /** * Instantiate amount from bits. * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.fromBits = function fromBits(value, num) { - return new Amount().fromBits(value, num); +Amount.fromBits = function fromBits(value) { + return new Amount().fromBits(value); }; /** * Instantiate amount from mbtc. * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.fromMBTC = function fromMBTC(value, num) { - return new Amount().fromMBTC(value, num); +Amount.fromMBTC = function fromMBTC(value) { + return new Amount().fromMBTC(value); }; /** * Instantiate amount from btc. * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.fromBTC = function fromBTC(value, num) { - return new Amount().fromBTC(value, num); +Amount.fromBTC = function fromBTC(value) { + return new Amount().fromBTC(value); }; /** * Instantiate amount from unit. * @param {String} unit * @param {Number|String} value - * @param {Bolean?} num * @returns {Amount} */ -Amount.from = function from(unit, value, num) { - return new Amount().from(unit, value, num); +Amount.from = function from(unit, value) { + return new Amount().from(unit, value); }; /** @@ -318,271 +305,54 @@ Amount.prototype.inspect = function inspect() { */ Amount.btc = function btc(value, num) { - if (util.isFloat(value)) + if (typeof value === 'string') return value; - return Amount.serialize(value, 8, num); + return Amount.encode(value, 8, num); }; /** - * Safely convert satoshis to a BTC string. - * This function explicitly avoids any - * floating point arithmetic. - * @param {Amount} value - * @param {Number} exp - Exponent. - * @param {Boolean} num - Return a number. - * @returns {String} + * Safely convert a BTC string to satoshis. + * @param {String} str - BTC + * @returns {Amount} Satoshis. + * @throws on parse error */ -Amount.serialize = function serialize(value, exp, num) { - let negative = false; - let hi, lo, result; - - assert(util.isInt(value), 'Non-satoshi value for conversion.'); - - if (value < 0) { - value = -value; - negative = true; - } - - value = value.toString(10); - - assert(value.length <= 16, 'Number exceeds 2^53-1.'); - - while (value.length < exp + 1) - value = '0' + value; - - hi = value.slice(0, -exp); - lo = value.slice(-exp); - - lo = lo.replace(/0+$/, ''); - - if (lo.length === 0) - lo += '0'; +Amount.value = function value(str) { + if (typeof str === 'number') + return str; - result = `${hi}.${lo}`; - - if (negative) - result = '-' + result; - - if (num) - return +result; - - return result; + return Amount.decode(str, 8); }; /** - * Unsafely convert satoshis to a BTC string. + * Safely convert satoshis to a BTC string. * @param {Amount} value * @param {Number} exp - Exponent. * @param {Boolean} num - Return a number. - * @returns {String} + * @returns {String|Number} */ -Amount.serializeUnsafe = function serializeUnsafe(value, exp, num) { - assert(util.isInt(value), 'Non-satoshi value for conversion.'); - - value /= pow10(exp); - value = value.toFixed(exp); - +Amount.encode = function encode(value, exp, num) { if (num) - return +value; - - if (exp !== 0) { - value = value.replace(/0+$/, ''); - if (value[value.length - 1] === '.') - value += '0'; - } - - return value; -}; - -/** - * Safely convert a BTC string to satoshis. - * @param {String} value - BTC - * @returns {Amount} Satoshis. - * @throws on parse error - */ - -Amount.value = function _value(value, num) { - if (util.isInt(value)) - return value; - - return Amount.parse(value, 8, num); + return util.toFloat(value, exp); + return util.toFixed(value, exp); }; /** * Safely convert a BTC string to satoshis. - * This function explicitly avoids any - * floating point arithmetic. It also does - * extra validation to ensure the resulting - * Number will be 53 bits or less. - * @param {String} value - BTC + * @param {String|Number} value - BTC * @param {Number} exp - Exponent. - * @param {Boolean} num - Allow numbers. * @returns {Amount} Satoshis. * @throws on parse error */ -Amount.parse = function parse(value, exp, num) { - let negative = false; - let mult = pow10(exp); - let maxLo = modSafe(mult); - let maxHi = divSafe(mult); - let parts, hi, lo, result; - - if (num && typeof value === 'number') { - assert(util.isNumber(value), 'Non-BTC value for conversion.'); - value = value.toString(10); - } - - assert(util.isFloat(value), 'Non-BTC value for conversion.'); - - if (value[0] === '-') { - negative = true; - value = value.substring(1); - } - - parts = value.split('.'); - - assert(parts.length <= 2, 'Bad decimal point.'); - - hi = parts[0] || '0'; - lo = parts[1] || '0'; - - hi = hi.replace(/^0+/, ''); - lo = lo.replace(/0+$/, ''); - - assert(hi.length <= 16 - exp, 'Number exceeds 2^53-1.'); - assert(lo.length <= exp, 'Too many decimal places.'); - - if (hi.length === 0) - hi = '0'; - - while (lo.length < exp) - lo += '0'; - - hi = parseInt(hi, 10); - lo = parseInt(lo, 10); - - assert(hi < maxHi || (hi === maxHi && lo <= maxLo), - 'Number exceeds 2^53-1.'); - - result = hi * mult + lo; - - if (negative) - result = -result; - - return result; -}; - -/** - * Unsafely convert a BTC string to satoshis. - * @param {String} value - BTC - * @param {Number} exp - Exponent. - * @param {Boolean} num - Allow numbers. - * @returns {Amount} Satoshis. - * @throws on parse error - */ - -Amount.parseUnsafe = function parseUnsafe(value, exp, num) { - if (typeof value === 'string') { - assert(util.isFloat(value), 'Non-BTC value for conversion.'); - value = parseFloat(value); - } else { - assert(util.isNumber(value), 'Non-BTC value for conversion.'); - assert(num, 'Cannot parse number.'); - } - - value *= pow10(exp); - - assert(value % 1 === 0, 'Too many decimal places.'); - - return value; +Amount.decode = function decode(value, exp) { + if (typeof value === 'number') + return util.fromFloat(value, exp); + return util.fromFixed(value, exp); }; -/* - * Helpers - */ - -function pow10(exp) { - switch (exp) { - case 0: - return 1; - case 1: - return 10; - case 2: - return 100; - case 3: - return 1000; - case 4: - return 10000; - case 5: - return 100000; - case 6: - return 1000000; - case 7: - return 10000000; - case 8: - return 100000000; - default: - assert(false, 'Exponent is too large.'); - break; - } -} - -function modSafe(mod) { - switch (mod) { - case 1: - return 0; - case 10: - return 1; - case 100: - return 91; - case 1000: - return 991; - case 10000: - return 991; - case 100000: - return 40991; - case 1000000: - return 740991; - case 10000000: - return 4740991; - case 100000000: - return 54740991; - default: - assert(false, 'Exponent is too large.'); - break; - } -} - -function divSafe(div) { - switch (div) { - case 1: - return 9007199254740991; - case 10: - return 900719925474099; - case 100: - return 90071992547409; - case 1000: - return 9007199254740; - case 10000: - return 900719925474; - case 100000: - return 90071992547; - case 1000000: - return 9007199254; - case 10000000: - return 900719925; - case 100000000: - return 90071992; - default: - assert(false, 'Exponent is too large.'); - break; - } -} - /* * Expose */ diff --git a/lib/btc/uri.js b/lib/btc/uri.js index addbdfcd6..fa44142df 100644 --- a/lib/btc/uri.js +++ b/lib/btc/uri.js @@ -52,7 +52,7 @@ URI.prototype.fromOptions = function fromOptions(options) { this.address.fromOptions(options.address); if (options.amount != null) { - assert(util.isUInt53(options.amount), 'Amount must be a uint53.'); + assert(util.isU64(options.amount), 'Amount must be a uint64.'); this.amount = options.amount; } @@ -93,32 +93,31 @@ URI.fromOptions = function fromOptions(options) { */ URI.prototype.fromString = function fromString(str, network) { - let prefix, index, query, address; - assert(typeof str === 'string'); assert(str.length > 8, 'Not a bitcoin URI.'); - prefix = str.substring(0, 8); + const prefix = str.substring(0, 8); assert(prefix === 'bitcoin:', 'Not a bitcoin URI.'); str = str.substring(8); - index = str.indexOf('?'); + const index = str.indexOf('?'); + let addr, qs; if (index === -1) { - address = str; + addr = str; } else { - address = str.substring(0, index); - query = str.substring(index + 1); + addr = str.substring(0, index); + qs = str.substring(index + 1); } - this.address.fromString(address, network); + this.address.fromString(addr, network); - if (!query) + if (!qs) return this; - query = parsePairs(query); + const query = parsePairs(qs); if (query.amount) { assert(query.amount.length > 0, 'Value is empty.'); @@ -156,10 +155,11 @@ URI.fromString = function fromString(str, network) { URI.prototype.toString = function toString() { let str = 'bitcoin:'; - let query = []; str += this.address.toString(); + const query = []; + if (this.amount !== -1) query.push(`amount=${Amount.btc(this.amount)}`); @@ -199,12 +199,12 @@ function BitcoinQuery() { } function parsePairs(str) { - let parts = str.split('&'); - let data = new BitcoinQuery(); + const parts = str.split('&'); + const data = new BitcoinQuery(); let size = 0; - for (let pair of parts) { - let index = pair.indexOf('='); + for (const pair of parts) { + const index = pair.indexOf('='); let key, value; if (index === -1) { diff --git a/lib/coins/coinentry.js b/lib/coins/coinentry.js new file mode 100644 index 000000000..757ca6a7d --- /dev/null +++ b/lib/coins/coinentry.js @@ -0,0 +1,277 @@ +/*! + * coinentry.js - coin entry object for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +'use strict'; + +const assert = require('assert'); +const Coin = require('../primitives/coin'); +const Output = require('../primitives/output'); +const BufferReader = require('../utils/reader'); +const StaticWriter = require('../utils/staticwriter'); +const encoding = require('../utils/encoding'); +const compress = require('./compress'); + +/* + * Constants + */ + +const NUM_FLAGS = 1; +const MAX_HEIGHT = ((1 << (32 - NUM_FLAGS)) >>> 0) - 1; + +/** + * Represents an unspent output. + * @alias module:coins.CoinEntry + * @constructor + * @property {Number} version - Transaction version. + * @property {Number} height - Transaction height (-1 if unconfirmed). + * @property {Boolean} coinbase - Whether the containing + * transaction is a coinbase. + * @property {Output} output + * @property {Boolean} spent + * @property {Buffer} raw + */ + +function CoinEntry() { + if (!(this instanceof CoinEntry)) + return new CoinEntry(); + + this.version = 1; + this.height = -1; + this.coinbase = false; + this.output = new Output(); + this.spent = false; + this.raw = null; +} + +/** + * Convert coin entry to an output. + * @returns {Output} + */ + +CoinEntry.prototype.toOutput = function toOutput() { + return this.output; +}; + +/** + * Convert coin entry to a coin. + * @param {Outpoint} prevout + * @returns {Coin} + */ + +CoinEntry.prototype.toCoin = function toCoin(prevout) { + const coin = new Coin(); + coin.version = this.version; + coin.height = this.height; + coin.coinbase = this.coinbase; + coin.script = this.output.script; + coin.value = this.output.value; + coin.hash = prevout.hash; + coin.index = prevout.index; + return coin; +}; + +/** + * Inject properties from TX. + * @param {TX} tx + * @param {Number} index + */ + +CoinEntry.prototype.fromOutput = function fromOutput(output) { + this.output = output; + return this; +}; + +/** + * Instantiate a coin from a TX + * @param {TX} tx + * @param {Number} index - Output index. + * @returns {CoinEntry} + */ + +CoinEntry.fromOutput = function fromOutput(output) { + return new CoinEntry().fromOutput(output); +}; + +/** + * Inject properties from TX. + * @param {TX} tx + * @param {Number} index + */ + +CoinEntry.prototype.fromCoin = function fromCoin(coin) { + this.version = coin.version; + this.height = coin.height; + this.coinbase = coin.coinbase; + this.output.script = coin.script; + this.output.value = coin.value; + return this; +}; + +/** + * Instantiate a coin from a TX + * @param {TX} tx + * @param {Number} index - Output index. + * @returns {CoinEntry} + */ + +CoinEntry.fromCoin = function fromCoin(coin) { + return new CoinEntry().fromCoin(coin); +}; + +/** + * Inject properties from TX. + * @param {TX} tx + * @param {Number} index + */ + +CoinEntry.prototype.fromTX = function fromTX(tx, index, height) { + assert(typeof index === 'number'); + assert(typeof height === 'number'); + assert(index >= 0 && index < tx.outputs.length); + this.version = tx.version; + this.height = height; + this.coinbase = tx.isCoinbase(); + this.output = tx.outputs[index]; + return this; +}; + +/** + * Instantiate a coin from a TX + * @param {TX} tx + * @param {Number} index - Output index. + * @returns {CoinEntry} + */ + +CoinEntry.fromTX = function fromTX(tx, index, height) { + return new CoinEntry().fromTX(tx, index, height); +}; + +/** + * Calculate size of coin. + * @returns {Number} + */ + +CoinEntry.prototype.getSize = function getSize() { + if (this.raw) + return this.raw.length; + + let size = 0; + size += encoding.sizeVarint(this.version); + size += 4; + size += compress.size(this.output); + + return size; +}; + +/** + * Write the coin to a buffer writer. + * @param {BufferWriter} bw + */ + +CoinEntry.prototype.toWriter = function toWriter(bw) { + if (this.raw) { + bw.writeBytes(this.raw); + return bw; + } + + let height = this.height; + let field = 0; + + if (this.coinbase) + field |= 1; + + if (height === -1) + height = MAX_HEIGHT; + + field |= height << NUM_FLAGS; + + bw.writeVarint(this.version); + bw.writeU32(field); + compress.pack(this.output, bw); + + return bw; +}; + +/** + * Serialize the coin. + * @returns {Buffer} + */ + +CoinEntry.prototype.toRaw = function toRaw() { + if (this.raw) + return this.raw; + + const size = this.getSize(); + const bw = new StaticWriter(size); + + this.toWriter(bw); + + this.raw = bw.render(); + + return this.raw; +}; + +/** + * Inject properties from serialized buffer writer. + * @private + * @param {BufferReader} br + */ + +CoinEntry.prototype.fromReader = function fromReader(br) { + const version = br.readVarint(); + const field = br.readU32(); + + let height = field >>> NUM_FLAGS; + + if (height === MAX_HEIGHT) + height = -1; + + this.version = version; + this.coinbase = (field & 1) !== 0; + this.height = height; + + compress.unpack(this.output, br); + + return this; +}; + +/** + * Instantiate a coin from a serialized Buffer. + * @param {Buffer} data + * @returns {CoinEntry} + */ + +CoinEntry.fromReader = function fromReader(data) { + return new CoinEntry().fromReader(data); +}; + +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + */ + +CoinEntry.prototype.fromRaw = function fromRaw(data) { + this.fromReader(new BufferReader(data)); + this.raw = data; + return this; +}; + +/** + * Instantiate a coin from a serialized Buffer. + * @param {Buffer} data + * @returns {CoinEntry} + */ + +CoinEntry.fromRaw = function fromRaw(data) { + return new CoinEntry().fromRaw(data); +}; + +/* + * Expose + */ + +module.exports = CoinEntry; diff --git a/lib/coins/coins.js b/lib/coins/coins.js index df706bdd0..97516f68a 100644 --- a/lib/coins/coins.js +++ b/lib/coins/coins.js @@ -6,126 +6,60 @@ 'use strict'; -const util = require('../utils/util'); const assert = require('assert'); -const Coin = require('../primitives/coin'); -const Output = require('../primitives/output'); -const BufferReader = require('../utils/reader'); -const StaticWriter = require('../utils/staticwriter'); -const encoding = require('../utils/encoding'); -const compressor = require('./compress'); -const compress = compressor.compress; -const decompress = compressor.decompress; +const CoinEntry = require('./coinentry'); /** * Represents the outputs for a single transaction. * @alias module:coins.Coins * @constructor - * @param {Object?} options - Options object. - * @property {Hash} hash - Transaction hash. - * @property {Number} version - Transaction version. - * @property {Number} height - Transaction height (-1 if unconfirmed). - * @property {Boolean} coinbase - Whether the containing - * transaction is a coinbase. - * @property {CoinEntry[]} outputs - Coins. + * @property {Map[]} outputs - Coins. */ -function Coins(options) { +function Coins() { if (!(this instanceof Coins)) - return new Coins(options); + return new Coins(); - this.version = 1; - this.hash = encoding.NULL_HASH; - this.height = -1; - this.coinbase = true; - this.outputs = []; - - if (options) - this.fromOptions(options); + this.outputs = new Map(); } -/** - * Inject properties from options object. - * @private - * @param {Object} options - */ - -Coins.prototype.fromOptions = function fromOptions(options) { - if (options.version != null) { - assert(util.isUInt32(options.version)); - this.version = options.version; - } - - if (options.hash) { - assert(typeof options.hash === 'string'); - this.hash = options.hash; - } - - if (options.height != null) { - assert(util.isNumber(options.height)); - this.height = options.height; - } - - if (options.coinbase != null) { - assert(typeof options.coinbase === 'boolean'); - this.coinbase = options.coinbase; - } - - if (options.outputs) { - assert(Array.isArray(options.outputs)); - this.outputs = options.outputs; - this.cleanup(); - } - - return this; -}; - -/** - * Instantiate coins from options object. - * @param {Object} options - * @returns {Coins} - */ - -Coins.fromOptions = function fromOptions(options) { - return new Coins().fromOptions(options); -}; - /** * Add a single entry to the collection. * @param {Number} index - * @param {CoinEntry} entry + * @param {CoinEntry} coin + * @returns {CoinEntry} */ -Coins.prototype.add = function add(index, entry) { +Coins.prototype.add = function add(index, coin) { assert(index >= 0); + assert(!this.outputs.has(index)); - while (this.outputs.length <= index) - this.outputs.push(null); - - assert(!this.outputs[index]); + this.outputs.set(index, coin); - this.outputs[index] = entry; + return coin; }; /** * Add a single output to the collection. * @param {Number} index * @param {Output} output + * @returns {CoinEntry} */ Coins.prototype.addOutput = function addOutput(index, output) { assert(!output.script.isUnspendable()); - this.add(index, CoinEntry.fromOutput(output)); + return this.add(index, CoinEntry.fromOutput(output)); }; /** * Add a single coin to the collection. * @param {Coin} coin + * @returns {CoinEntry} */ Coins.prototype.addCoin = function addCoin(coin) { assert(!coin.script.isUnspendable()); - this.add(coin.index, CoinEntry.fromCoin(coin)); + return this.add(coin.index, CoinEntry.fromCoin(coin)); }; /** @@ -135,28 +69,19 @@ Coins.prototype.addCoin = function addCoin(coin) { */ Coins.prototype.has = function has(index) { - if (index >= this.outputs.length) - return false; - - return this.outputs[index] != null; + return this.outputs.has(index); }; /** - * Test whether the collection - * has an unspent coin. + * Test whether the collection has an unspent coin. * @param {Number} index * @returns {Boolean} */ Coins.prototype.isUnspent = function isUnspent(index) { - let output; - - if (index >= this.outputs.length) - return false; + const coin = this.outputs.get(index); - output = this.outputs[index]; - - if (!output || output.spent) + if (!coin || coin.spent) return false; return true; @@ -165,106 +90,75 @@ Coins.prototype.isUnspent = function isUnspent(index) { /** * Get a coin entry. * @param {Number} index - * @returns {CoinEntry} + * @returns {CoinEntry|null} */ Coins.prototype.get = function get(index) { - if (index >= this.outputs.length) - return; - - return this.outputs[index]; + return this.outputs.get(index) || null; }; /** * Get an output. * @param {Number} index - * @returns {Output} + * @returns {Output|null} */ Coins.prototype.getOutput = function getOutput(index) { - let entry = this.get(index); + const coin = this.outputs.get(index); - if (!entry) - return; + if (!coin) + return null; - return entry.toOutput(); + return coin.output; }; /** * Get a coin. - * @param {Number} index - * @returns {Coin} + * @param {Outpoint} prevout + * @returns {Coin|null} */ -Coins.prototype.getCoin = function getCoin(index) { - let entry = this.get(index); +Coins.prototype.getCoin = function getCoin(prevout) { + const coin = this.outputs.get(prevout.index); - if (!entry) - return; + if (!coin) + return null; - return entry.toCoin(this, index); + return coin.toCoin(prevout); }; /** * Spend a coin entry and return it. * @param {Number} index - * @returns {CoinEntry} + * @returns {CoinEntry|null} */ Coins.prototype.spend = function spend(index) { - let entry = this.get(index); + const coin = this.get(index); - if (!entry || entry.spent) - return; + if (!coin || coin.spent) + return null; - entry.spent = true; + coin.spent = true; - return entry; + return coin; }; /** * Remove a coin entry and return it. * @param {Number} index - * @returns {CoinEntry} + * @returns {CoinEntry|null} */ Coins.prototype.remove = function remove(index) { - let entry = this.get(index); - - if (!entry) - return false; - - this.outputs[index] = null; - this.cleanup(); - - return entry; -}; - -/** - * Calculate unspent length of coins. - * @returns {Number} - */ + const coin = this.get(index); -Coins.prototype.length = function length() { - let len = this.outputs.length; + if (!coin) + return null; - while (len > 0 && !this.isUnspent(len - 1)) - len--; + this.outputs.delete(index); - return len; -}; - -/** - * Cleanup spent outputs (remove pruned). - */ - -Coins.prototype.cleanup = function cleanup() { - let len = this.outputs.length; - - while (len > 0 && !this.outputs[len - 1]) - len--; - - this.outputs.length = len; + return coin; }; /** @@ -273,285 +167,7 @@ Coins.prototype.cleanup = function cleanup() { */ Coins.prototype.isEmpty = function isEmpty() { - return this.length() === 0; -}; - -/* - * Coins serialization: - * version: varint - * height: uint32 - * header-code: varint - * bit 1: coinbase - * bit 2: first output unspent - * bit 3: second output unspent - * bit 4-32: spent-field size - * spent-field: bitfield (0=spent, 1=unspent) - * outputs (repeated): - * value: varint - * compressed-script: - * prefix: 0x00 = 20 byte pubkey hash - * 0x01 = 20 byte script hash - * 0x02-0x05 = 32 byte ec-key x-value - * 0x06-0x09 = reserved - * >=0x10 = varint-size + 10 | raw script - * data: script data, dictated by the prefix - * - * The compression below sacrifices some cpu in exchange - * for reduced size, but in some cases the use of varints - * actually increases speed (varint versions and values - * for example). We do as much compression as possible - * without sacrificing too much cpu. Value compression - * is intentionally excluded for now as it seems to be - * too much of a perf hit. Maybe when v8 optimizes - * non-smi arithmetic better we can enable it. - */ - -/** - * Calculate header code. - * @param {Number} len - * @param {Number} size - * @returns {Number} - */ - -Coins.prototype.header = function header(len, size) { - let first = this.isUnspent(0); - let second = this.isUnspent(1); - let offset = 0; - let code; - - // Throw if we're fully spent. - assert(len !== 0, 'Cannot serialize fully-spent coins.'); - - // First and second bits - // have a double meaning. - if (!first && !second) { - assert(size !== 0); - offset = 1; - } - - // Calculate header code. - code = 8 * (size - offset); - - if (this.coinbase) - code += 1; - - if (first) - code += 2; - - if (second) - code += 4; - - return code; -}; - -/** - * Serialize the coins object. - * @returns {Buffer} - */ - -Coins.prototype.toRaw = function toRaw() { - let len = this.length(); - let size = Math.floor((len + 5) / 8); - let code = this.header(len, size); - let total = this.getSize(len, size, code); - let bw = new StaticWriter(total); - - // Write headers. - bw.writeVarint(this.version); - bw.writeU32(this.height); - bw.writeVarint(code); - - // Write the spent field. - for (let i = 0; i < size; i++) { - let ch = 0; - for (let j = 0; j < 8 && 2 + i * 8 + j < len; j++) { - if (this.isUnspent(2 + i * 8 + j)) - ch |= 1 << j; - } - bw.writeU8(ch); - } - - // Write the compressed outputs. - for (let i = 0; i < len; i++) { - let output = this.outputs[i]; - - if (!output || output.spent) - continue; - - output.toWriter(bw); - } - - return bw.render(); -}; - -/** - * Calculate coins size. - * @param {Number} code - * @param {Number} size - * @param {Number} len - * @returns {Number} - */ - -Coins.prototype.getSize = function getSize(len, size, code) { - let total = 0; - - total += encoding.sizeVarint(this.version); - total += 4; - total += encoding.sizeVarint(code); - total += size; - - // Write the compressed outputs. - for (let i = 0; i < len; i++) { - let output = this.outputs[i]; - - if (!output || output.spent) - continue; - - total += output.getSize(); - } - - return total; -}; - -/** - * Inject data from serialized coins. - * @private - * @param {Buffer} data - * @param {Hash} hash - * @returns {Coins} - */ - -Coins.prototype.fromRaw = function fromRaw(data, hash) { - let br = new BufferReader(data); - let first = null; - let second = null; - let code, size, offset; - - // Inject hash (passed by caller). - this.hash = hash; - - // Read headers. - this.version = br.readVarint(); - this.height = br.readU32(); - code = br.readVarint(); - this.coinbase = (code & 1) !== 0; - - // Recalculate size. - size = code / 8 | 0; - - if ((code & 6) === 0) - size += 1; - - // Setup spent field. - offset = br.offset; - br.seek(size); - - // Read first two outputs. - if ((code & 2) !== 0) - first = CoinEntry.fromReader(br); - - if ((code & 4) !== 0) - second = CoinEntry.fromReader(br); - - this.outputs.push(first); - this.outputs.push(second); - - // Read outputs. - for (let i = 0; i < size; i++) { - let ch = br.data[offset++]; - for (let j = 0; j < 8; j++) { - if ((ch & (1 << j)) === 0) { - this.outputs.push(null); - continue; - } - this.outputs.push(CoinEntry.fromReader(br)); - } - } - - this.cleanup(); - - return this; -}; - -/** - * Parse a single serialized coin. - * @param {Buffer} data - * @param {Hash} hash - * @param {Number} index - * @returns {Coin} - */ - -Coins.parseCoin = function parseCoin(data, hash, index) { - let br = new BufferReader(data); - let coin = new Coin(); - let code, size, offset; - - // Inject outpoint (passed by caller). - coin.hash = hash; - coin.index = index; - - // Read headers. - coin.version = br.readVarint(); - coin.height = br.readU32(); - code = br.readVarint(); - coin.coinbase = (code & 1) !== 0; - - // Recalculate size. - size = code / 8 | 0; - - if ((code & 6) === 0) - size += 1; - - if (index >= 2 + size * 8) - return; - - // Setup spent field. - offset = br.offset; - br.seek(size); - - // Read first two outputs. - for (let i = 0; i < 2; i++) { - if ((code & (2 << i)) !== 0) { - if (index === 0) { - decompress.coin(coin, br); - return coin; - } - decompress.skip(br); - } else { - if (index === 0) - return; - } - index -= 1; - } - - // Read outputs. - for (let i = 0; i < size; i++) { - let ch = br.data[offset++]; - for (let j = 0; j < 8; j++) { - if ((ch & (1 << j)) !== 0) { - if (index === 0) { - decompress.coin(coin, br); - return coin; - } - decompress.skip(br); - } else { - if (index === 0) - return; - } - index -= 1; - } - } -}; - -/** - * Instantiate coins from a buffer. - * @param {Buffer} data - * @param {Hash} hash - Transaction hash. - * @returns {Coins} - */ - -Coins.fromRaw = function fromRaw(data, hash) { - return new Coins().fromRaw(data, hash); + return this.outputs.size === 0; }; /** @@ -559,27 +175,20 @@ Coins.fromRaw = function fromRaw(data, hash) { * @private * @param {TX} tx * @param {Number} height + * @returns {Coins} */ Coins.prototype.fromTX = function fromTX(tx, height) { - let output; - assert(typeof height === 'number'); - this.version = tx.version; - this.hash = tx.hash('hex'); - this.height = height; - this.coinbase = tx.isCoinbase(); + for (let i = 0; i < tx.outputs.length; i++) { + const output = tx.outputs[i]; - for (output of tx.outputs) { - if (output.script.isUnspendable()) { - this.outputs.push(null); + if (output.script.isUnspendable()) continue; - } - this.outputs.push(CoinEntry.fromOutput(output)); - } - this.cleanup(); + this.outputs.set(i, CoinEntry.fromTX(tx, i, height)); + } return this; }; @@ -595,169 +204,8 @@ Coins.fromTX = function fromTX(tx, height) { return new Coins().fromTX(tx, height); }; -/** - * A coin entry is an object which defers - * parsing of a coin. Say there is a transaction - * with 100 outputs. When a block comes in, - * there may only be _one_ input in that entire - * block which redeems an output from that - * transaction. When parsing the Coins, there - * is no sense to get _all_ of them into their - * abstract form. A coin entry is just a - * pointer to that coin in the Coins buffer, as - * well as a size. Parsing and decompression - * is done only if that coin is being redeemed. - * @alias module:coins.CoinEntry - * @constructor - * @property {Number} offset - * @property {Number} size - * @property {Buffer} raw - * @property {Output|null} output - * @property {Boolean} spent - */ - -function CoinEntry() { - this.offset = 0; - this.size = 0; - this.raw = null; - this.output = null; - this.spent = false; -} - -/** - * Instantiate a reader at the correct offset. - * @private - * @returns {BufferReader} - */ - -CoinEntry.prototype.reader = function reader() { - let br; - - assert(this.raw); - - br = new BufferReader(this.raw); - br.offset = this.offset; - - return br; -}; - -/** - * Parse the deferred data and return a coin. - * @param {Coins} coins - * @param {Number} index - * @returns {Coin} - */ - -CoinEntry.prototype.toCoin = function toCoin(coins, index) { - let coin = new Coin(); - let output = this.toOutput(); - - // Load in all necessary properties - // from the parent Coins object. - coin.version = coins.version; - coin.coinbase = coins.coinbase; - coin.height = coins.height; - coin.hash = coins.hash; - coin.index = index; - coin.script = output.script; - coin.value = output.value; - - return coin; -}; - -/** - * Parse the deferred data and return an output. - * @returns {Output} - */ - -CoinEntry.prototype.toOutput = function toOutput() { - if (!this.output) { - this.output = new Output(); - decompress.output(this.output, this.reader()); - } - return this.output; -}; - -/** - * Calculate coin entry size. - * @returns {Number} - */ - -CoinEntry.prototype.getSize = function getSize() { - if (!this.raw) - return compress.size(this.output); - - return this.size; -}; - -/** - * Slice off the part of the buffer - * relevant to this particular coin. - */ - -CoinEntry.prototype.toWriter = function toWriter(bw) { - if (!this.raw) { - assert(this.output); - compress.output(this.output, bw); - return bw; - } - - // If we read this coin from the db and - // didn't use it, it's still in its - // compressed form. Just write it back - // as a buffer for speed. - bw.copy(this.raw, this.offset, this.offset + this.size); - - return bw; -}; - -/** - * Instantiate coin entry from reader. - * @param {BufferReader} br - * @returns {CoinEntry} - */ - -CoinEntry.fromReader = function fromReader(br) { - let entry = new CoinEntry(); - entry.offset = br.offset; - entry.size = decompress.skip(br); - entry.raw = br.data; - return entry; -}; - -/** - * Instantiate coin entry from output. - * @param {Output} output - * @returns {CoinEntry} - */ - -CoinEntry.fromOutput = function fromOutput(output) { - let entry = new CoinEntry(); - entry.output = output; - return entry; -}; - -/** - * Instantiate coin entry from coin. - * @param {Coin} coin - * @returns {CoinEntry} - */ - -CoinEntry.fromCoin = function fromCoin(coin) { - let entry = new CoinEntry(); - let output = new Output(); - output.value = coin.value; - output.script = coin.script; - entry.output = output; - return entry; -}; - /* * Expose */ -exports = Coins; -exports.Coins = Coins; -exports.CoinEntry = CoinEntry; - -module.exports = exports; +module.exports = Coins; diff --git a/lib/coins/coinview.js b/lib/coins/coinview.js index 00e4864f7..836896255 100644 --- a/lib/coins/coinview.js +++ b/lib/coins/coinview.js @@ -6,10 +6,9 @@ 'use strict'; -const assert = require('assert'); const Coins = require('./coins'); const UndoCoins = require('./undocoins'); -const CoinEntry = Coins.CoinEntry; +const CoinEntry = require('./coinentry'); /** * Represents a coin viewpoint: @@ -50,270 +49,375 @@ CoinView.prototype.has = function has(hash) { /** * Add coins to the collection. + * @param {Hash} hash * @param {Coins} coins + * @returns {Coins} */ -CoinView.prototype.add = function add(coins) { - this.map.set(coins.hash, coins); +CoinView.prototype.add = function add(hash, coins) { + this.map.set(hash, coins); return coins; }; /** * Remove coins from the collection. * @param {Coins} coins - * @returns {Boolean} + * @returns {Coins|null} */ CoinView.prototype.remove = function remove(hash) { - if (!this.map.has(hash)) - return false; + const coins = this.map.get(hash); + + if (!coins) + return null; this.map.delete(hash); - return true; + return coins; }; /** * Add a tx to the collection. * @param {TX} tx * @param {Number} height + * @returns {Coins} */ CoinView.prototype.addTX = function addTX(tx, height) { - let coins = Coins.fromTX(tx, height); - return this.add(coins); + const hash = tx.hash('hex'); + const coins = Coins.fromTX(tx, height); + return this.add(hash, coins); }; /** * Remove a tx from the collection. * @param {TX} tx * @param {Number} height + * @returns {Coins} */ CoinView.prototype.removeTX = function removeTX(tx, height) { - let coins = Coins.fromTX(tx, height); - coins.outputs.length = 0; - return this.add(coins); + const hash = tx.hash('hex'); + const coins = Coins.fromTX(tx, height); + + for (const coin of coins.outputs.values()) + coin.spent = true; + + return this.add(hash, coins); +}; + +/** + * Add an entry to the collection. + * @param {Outpoint} prevout + * @param {CoinEntry} coin + * @returns {CoinEntry|null} + */ + +CoinView.prototype.addEntry = function addEntry(prevout, coin) { + const {hash, index} = prevout; + let coins = this.get(hash); + + if (!coins) { + coins = new Coins(); + this.add(hash, coins); + } + + if (coin.output.script.isUnspendable()) + return null; + + if (coins.has(index)) + return null; + + return coins.add(index, coin); }; /** * Add a coin to the collection. * @param {Coin} coin + * @returns {CoinEntry|null} */ CoinView.prototype.addCoin = function addCoin(coin) { - let coins = this.get(coin.hash); + const {hash, index} = coin; + let coins = this.get(hash); if (!coins) { coins = new Coins(); - coins.hash = coin.hash; - coins.height = coin.height; - coins.coinbase = coin.coinbase; - this.add(coins); + this.add(hash, coins); } if (coin.script.isUnspendable()) - return; + return null; + + if (coins.has(index)) + return null; - if (!coins.has(coin.index)) - coins.addCoin(coin); + return coins.addCoin(coin); }; /** * Add an output to the collection. - * @param {Hash} hash - * @param {Number} index + * @param {Outpoint} prevout * @param {Output} output + * @returns {CoinEntry|null} */ -CoinView.prototype.addOutput = function addOutput(hash, index, output) { +CoinView.prototype.addOutput = function addOutput(prevout, output) { + const {hash, index} = prevout; let coins = this.get(hash); if (!coins) { coins = new Coins(); - coins.hash = hash; - coins.height = -1; - coins.coinbase = false; - this.add(coins); + this.add(hash, coins); } if (output.script.isUnspendable()) - return; + return null; + + if (coins.has(index)) + return null; - if (!coins.has(index)) - coins.addOutput(index, output); + return coins.addOutput(index, output); }; /** * Spend an output. - * @param {Hash} hash - * @param {Number} index - * @returns {Boolean} + * @param {Outpoint} prevout + * @returns {CoinEntry|null} */ -CoinView.prototype.spendOutput = function spendOutput(hash, index) { - let coins = this.get(hash); +CoinView.prototype.spendEntry = function spendEntry(prevout) { + const {hash, index} = prevout; + const coins = this.get(hash); if (!coins) - return false; + return null; - return this.spendFrom(coins, index); + const coin = coins.spend(index); + + if (!coin) + return null; + + this.undo.push(coin); + + return coin; }; /** * Remove an output. - * @param {Hash} hash - * @param {Number} index - * @returns {Boolean} + * @param {Outpoint} prevout + * @returns {CoinEntry|null} */ -CoinView.prototype.removeOutput = function removeOutput(hash, index) { - let coins = this.get(hash); +CoinView.prototype.removeEntry = function removeEntry(prevout) { + const {hash, index} = prevout; + const coins = this.get(hash); if (!coins) - return false; + return null; return coins.remove(index); }; /** - * Spend a coin from coins object. - * @param {Coins} coins - * @param {Number} index + * Test whether the view has an entry by prevout. + * @param {Outpoint} prevout * @returns {Boolean} */ -CoinView.prototype.spendFrom = function spendFrom(coins, index) { - let entry = coins.spend(index); - let undo; +CoinView.prototype.hasEntry = function hasEntry(prevout) { + const {hash, index} = prevout; + const coins = this.get(hash); - if (!entry) + if (!coins) return false; - this.undo.push(entry); + return coins.has(index); +}; - if (coins.isEmpty()) { - undo = this.undo.top(); - undo.height = coins.height; - undo.coinbase = coins.coinbase; - undo.version = coins.version; - assert(undo.height !== -1); - } +/** + * Get a single entry by prevout. + * @param {Outpoint} prevout + * @returns {CoinEntry|null} + */ - return true; +CoinView.prototype.getEntry = function getEntry(prevout) { + const {hash, index} = prevout; + const coins = this.get(hash); + + if (!coins) + return null; + + return coins.get(index); }; /** - * Get a single coin by input. - * @param {Input} input - * @returns {Coin} + * Test whether an entry has been spent by prevout. + * @param {Outpoint} prevout + * @returns {Boolean} */ -CoinView.prototype.getCoin = function getCoin(input) { - let coins = this.get(input.prevout.hash); +CoinView.prototype.isUnspent = function isUnspent(prevout) { + const {hash, index} = prevout; + const coins = this.get(hash); if (!coins) - return; + return false; - return coins.getCoin(input.prevout.index); + return coins.isUnspent(index); }; /** - * Get a single output by input. - * @param {Input} input - * @returns {Output} + * Get a single coin by prevout. + * @param {Outpoint} prevout + * @returns {Coin|null} */ -CoinView.prototype.getOutput = function getOutput(input) { - let coins = this.get(input.prevout.hash); +CoinView.prototype.getCoin = function getCoin(prevout) { + const coins = this.get(prevout.hash); if (!coins) - return; + return null; - return coins.getOutput(input.prevout.index); + return coins.getCoin(prevout); }; /** - * Get a single entry by input. - * @param {Input} input - * @returns {CoinEntry} + * Get a single output by prevout. + * @param {Outpoint} prevout + * @returns {Output|null} */ -CoinView.prototype.getEntry = function getEntry(input) { - let coins = this.get(input.prevout.hash); +CoinView.prototype.getOutput = function getOutput(prevout) { + const {hash, index} = prevout; + const coins = this.get(hash); if (!coins) - return; + return null; - return coins.get(input.prevout.index); + return coins.getOutput(index); }; /** - * Test whether the view has an entry by input. - * @param {Input} input + * Get coins height by prevout. + * @param {Outpoint} prevout + * @returns {Number} + */ + +CoinView.prototype.getHeight = function getHeight(prevout) { + const coin = this.getEntry(prevout); + + if (!coin) + return -1; + + return coin.height; +}; + +/** + * Get coins coinbase flag by prevout. + * @param {Outpoint} prevout * @returns {Boolean} */ -CoinView.prototype.hasEntry = function hasEntry(input) { - let coins = this.get(input.prevout.hash); +CoinView.prototype.isCoinbase = function isCoinbase(prevout) { + const coin = this.getEntry(prevout); - if (!coins) + if (!coin) return false; - return coins.has(input.prevout.index); + return coin.coinbase; }; /** - * Get coins height by input. + * Test whether the view has an entry by input. * @param {Input} input - * @returns {Number} + * @returns {Boolean} */ -CoinView.prototype.getHeight = function getHeight(input) { - let coins = this.get(input.prevout.hash); +CoinView.prototype.hasEntryFor = function hasEntryFor(input) { + return this.hasEntry(input.prevout); +}; - if (!coins) - return -1; +/** + * Get a single entry by input. + * @param {Input} input + * @returns {CoinEntry|null} + */ - return coins.height; +CoinView.prototype.getEntryFor = function getEntryFor(input) { + return this.getEntry(input.prevout); }; /** - * Get coins coinbase flag by input. + * Test whether an entry has been spent by input. * @param {Input} input * @returns {Boolean} */ -CoinView.prototype.isCoinbase = function isCoinbase(input) { - let coins = this.get(input.prevout.hash); +CoinView.prototype.isUnspentFor = function isUnspentFor(input) { + return this.isUnspent(input.prevout); +}; - if (!coins) - return false; +/** + * Get a single coin by input. + * @param {Input} input + * @returns {Coin|null} + */ - return coins.coinbase; +CoinView.prototype.getCoinFor = function getCoinFor(input) { + return this.getCoin(input.prevout); +}; + +/** + * Get a single output by input. + * @param {Input} input + * @returns {Output|null} + */ + +CoinView.prototype.getOutputFor = function getOutputFor(input) { + return this.getOutput(input.prevout); +}; + +/** + * Get coins height by input. + * @param {Input} input + * @returns {Number} + */ + +CoinView.prototype.getHeightFor = function getHeightFor(input) { + return this.getHeight(input.prevout); +}; + +/** + * Get coins coinbase flag by input. + * @param {Input} input + * @returns {Boolean} + */ + +CoinView.prototype.isCoinbaseFor = function isCoinbaseFor(input) { + return this.isCoinbase(input.prevout); }; /** * Retrieve coins from database. * @method * @param {ChainDB} db - * @param {TX} tx - * @returns {Promise} - Returns {@link Coins}. + * @param {Outpoint} prevout + * @returns {Promise} - Returns {@link CoinEntry}. */ -CoinView.prototype.readCoins = async function readCoins(db, hash) { - let coins = this.map.get(hash); +CoinView.prototype.readCoin = async function readCoin(db, prevout) { + const cache = this.getEntry(prevout); - if (!coins) { - coins = await db.getCoins(hash); + if (cache) + return cache; - if (!coins) - return; + const coin = await db.readCoin(prevout); - this.map.set(hash, coins); - } + if (!coin) + return null; - return coins; + return this.addEntry(prevout, coin); }; /** @@ -324,11 +428,11 @@ CoinView.prototype.readCoins = async function readCoins(db, hash) { * @returns {Promise} - Returns {Boolean}. */ -CoinView.prototype.ensureInputs = async function ensureInputs(db, tx) { +CoinView.prototype.readInputs = async function readInputs(db, tx) { let found = true; - for (let input of tx.inputs) { - if (!(await this.readCoins(db, input.prevout.hash))) + for (const {prevout} of tx.inputs) { + if (!await this.readCoin(db, prevout)) found = false; } @@ -344,32 +448,36 @@ CoinView.prototype.ensureInputs = async function ensureInputs(db, tx) { */ CoinView.prototype.spendInputs = async function spendInputs(db, tx) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let coins = await this.readCoins(db, prevout.hash); + if (tx.inputs.length < 4) { + const jobs = []; - if (!coins) - return false; + for (const {prevout} of tx.inputs) + jobs.push(this.readCoin(db, prevout)); - if (!this.spendFrom(coins, prevout.index)) - return false; - } + const coins = await Promise.all(jobs); - return true; -}; + for (const coin of coins) { + if (!coin || coin.spent) + return false; -/** - * Convert collection to an array. - * @returns {Coins[]} - */ + coin.spent = true; + this.undo.push(coin); + } + + return true; + } -CoinView.prototype.toArray = function toArray() { - let out = []; + for (const {prevout} of tx.inputs) { + const coin = await this.readCoin(db, prevout); - for (let coins of this.map.values()) - out.push(coins); + if (!coin || coin.spent) + return false; + + coin.spent = true; + this.undo.push(coin); + } - return out; + return true; }; /** @@ -382,13 +490,13 @@ CoinView.prototype.getSize = function getSize(tx) { size += tx.inputs.length; - for (let input of tx.inputs) { - let entry = this.getEntry(input); + for (const {prevout} of tx.inputs) { + const coin = this.getEntry(prevout); - if (!entry) + if (!coin) continue; - size += entry.getSize(); + size += coin.getSize(); } return size; @@ -402,25 +510,16 @@ CoinView.prototype.getSize = function getSize(tx) { */ CoinView.prototype.toWriter = function toWriter(bw, tx) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let coins = this.get(prevout.hash); - let entry; + for (const {prevout} of tx.inputs) { + const coin = this.getEntry(prevout); - if (!coins) { - bw.writeU8(0); - continue; - } - - entry = coins.get(prevout.index); - - if (!entry) { + if (!coin) { bw.writeU8(0); continue; } bw.writeU8(1); - entry.toWriter(bw); + coin.toWriter(bw); } return bw; @@ -435,24 +534,13 @@ CoinView.prototype.toWriter = function toWriter(bw, tx) { */ CoinView.prototype.fromReader = function fromReader(br, tx) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let coins, entry; - + for (const {prevout} of tx.inputs) { if (br.readU8() === 0) continue; - coins = this.get(prevout.hash); - - if (!coins) { - coins = new Coins(); - coins.hash = prevout.hash; - coins.coinbase = false; - this.add(coins); - } + const coin = CoinEntry.fromReader(br); - entry = CoinEntry.fromReader(br); - coins.add(prevout.index, entry); + this.addEntry(prevout, coin); } return this; diff --git a/lib/coins/compress.js b/lib/coins/compress.js index 658fc8e35..001649420 100644 --- a/lib/coins/compress.js +++ b/lib/coins/compress.js @@ -20,7 +20,7 @@ const consensus = require('../protocol/consensus'); * Constants */ -const COMPRESS_TYPES = 10; // Space for 4 extra. +const COMPRESS_TYPES = 6; const EMPTY_BUFFER = Buffer.alloc(0); /** @@ -30,8 +30,6 @@ const EMPTY_BUFFER = Buffer.alloc(0); */ function compressScript(script, bw) { - let data; - // Attempt to compress the output scripts. // We can _only_ ever compress them if // they are serialized as minimaldata, as @@ -40,30 +38,30 @@ function compressScript(script, bw) { // P2PKH -> 0 | key-hash // Saves 5 bytes. - if (script.isPubkeyhash(true)) { - data = script.code[2].data; + const pkh = script.getPubkeyhash(true); + if (pkh) { bw.writeU8(0); - bw.writeBytes(data); + bw.writeBytes(pkh); return bw; } // P2SH -> 1 | script-hash // Saves 3 bytes. - if (script.isScripthash()) { - data = script.code[1].data; + const sh = script.getScripthash(); + if (sh) { bw.writeU8(1); - bw.writeBytes(data); + bw.writeBytes(sh); return bw; } // P2PK -> 2-5 | compressed-key // Only works if the key is valid. // Saves up to 35 bytes. - if (script.isPubkey(true)) { - data = script.code[0].data; - if (publicKeyVerify(data)) { - data = compressKey(data); - bw.writeBytes(data); + const pk = script.getPubkey(true); + if (pk) { + if (publicKeyVerify(pk)) { + const key = compressKey(pk); + bw.writeBytes(key); return bw; } } @@ -82,42 +80,44 @@ function compressScript(script, bw) { */ function decompressScript(script, br) { - let size, data; - // Decompress the script. switch (br.readU8()) { - case 0: - data = br.readBytes(20, true); - script.fromPubkeyhash(data); + case 0: { + const hash = br.readBytes(20, true); + script.fromPubkeyhash(hash); break; - case 1: - data = br.readBytes(20, true); - script.fromScripthash(data); + } + case 1: { + const hash = br.readBytes(20, true); + script.fromScripthash(hash); break; + } case 2: case 3: case 4: - case 5: + case 5: { br.offset -= 1; - data = br.readBytes(33, true); + const data = br.readBytes(33, true); // Decompress the key. If this fails, // we have database corruption! - data = decompressKey(data); - script.fromPubkey(data); + const key = decompressKey(data); + script.fromPubkey(key); break; - default: + } + default: { br.offset -= 1; - size = br.readVarint() - COMPRESS_TYPES; + const size = br.readVarint() - COMPRESS_TYPES; if (size > consensus.MAX_SCRIPT_SIZE) { // This violates consensus rules. // We don't need to read it. script.fromNulldata(EMPTY_BUFFER); br.seek(size); } else { - data = br.readBytes(size); + const data = br.readBytes(size); script.fromRaw(data); } break; + } } return script; @@ -129,21 +129,19 @@ function decompressScript(script, br) { */ function sizeScript(script) { - let size, data; - if (script.isPubkeyhash(true)) return 21; if (script.isScripthash()) return 21; - if (script.isPubkey(true)) { - data = script.code[0].data; - if (publicKeyVerify(data)) + const pk = script.getPubkey(true); + if (pk) { + if (publicKeyVerify(pk)) return 33; } - size = 0; + let size = 0; size += encoding.sizeVarint(script.raw.length + COMPRESS_TYPES); size += script.raw.length; @@ -186,63 +184,6 @@ function sizeOutput(output) { return size; } -/** - * Compress an output. - * @param {Coin} coin - * @param {BufferWriter} bw - */ - -function compressCoin(coin, bw) { - bw.writeVarint(coin.value); - compressScript(coin.script, bw); - return bw; -} - -/** - * Decompress a script from buffer reader. - * @param {Coin} coin - * @param {BufferReader} br - */ - -function decompressCoin(coin, br) { - coin.value = br.readVarint(); - decompressScript(coin.script, br); - return coin; -} - -/** - * Skip past a compressed output. - * @param {BufferWriter} bw - * @returns {Number} - */ - -function skipOutput(br) { - let start = br.offset; - - // Skip past the value. - br.skipVarint(); - - // Skip past the compressed scripts. - switch (br.readU8()) { - case 0: - case 1: - br.seek(20); - break; - case 2: - case 3: - case 4: - case 5: - br.seek(32); - break; - default: - br.offset -= 1; - br.seek(br.readVarint() - COMPRESS_TYPES); - break; - } - - return br.offset - start; -} - /** * Compress value using an exponent. Takes advantage of * the fact that many bitcoin values are divisible by 10. @@ -252,19 +193,17 @@ function skipOutput(br) { */ function compressValue(value) { - let exp, last; - if (value === 0) return 0; - exp = 0; + let exp = 0; while (value % 10 === 0 && exp < 9) { value /= 10; exp++; } if (exp < 9) { - last = value % 10; + const last = value % 10; value = (value - last) / 10; return 1 + 10 * (9 * value + last - 1) + exp; } @@ -279,18 +218,18 @@ function compressValue(value) { */ function decompressValue(value) { - let exp, n, last; - if (value === 0) return 0; value--; - exp = value % 10; + let exp = value % 10; + value = (value - exp) / 10; + let n; if (exp < 9) { - last = value % 9; + const last = value % 9; value = (value - last) / 9; n = value * 10 + last + 1; } else { @@ -367,8 +306,7 @@ function compressKey(key) { */ function decompressKey(key) { - let format = key[0]; - let out; + const format = key[0]; assert(key.length === 33); @@ -387,7 +325,7 @@ function decompressKey(key) { } // Decompress the key. - out = secp256k1.publicKeyConvert(key, false); + const out = secp256k1.publicKeyConvert(key, false); // Reset the first byte so as not to // mutate the original buffer. @@ -396,24 +334,14 @@ function decompressKey(key) { return out; } +// Make eslint happy. +compressValue; +decompressValue; + /* * Expose */ -exports.compress = { - output: compressOutput, - coin: compressCoin, - size: sizeOutput, - script: compressScript, - value: compressValue, - key: compressKey -}; - -exports.decompress = { - output: decompressOutput, - coin: decompressCoin, - skip: skipOutput, - script: decompressScript, - value: decompressValue, - key: decompressKey -}; +exports.pack = compressOutput; +exports.unpack = decompressOutput; +exports.size = sizeOutput; diff --git a/lib/coins/undocoins.js b/lib/coins/undocoins.js index a87909502..1396609bc 100644 --- a/lib/coins/undocoins.js +++ b/lib/coins/undocoins.js @@ -9,12 +9,7 @@ const assert = require('assert'); const BufferReader = require('../utils/reader'); const StaticWriter = require('../utils/staticwriter'); -const encoding = require('../utils/encoding'); -const Output = require('../primitives/output'); -const Coins = require('./coins'); -const compressor = require('./compress'); -const compress = compressor.compress; -const decompress = compressor.decompress; +const CoinEntry = require('../coins/coinentry'); /** * UndoCoins @@ -37,12 +32,11 @@ function UndoCoins() { /** * Push coin entry onto undo coin array. * @param {CoinEntry} + * @returns {Number} */ -UndoCoins.prototype.push = function push(entry) { - let undo = new UndoCoin(); - undo.entry = entry; - this.items.push(undo); +UndoCoins.prototype.push = function push(coin) { + return this.items.push(coin); }; /** @@ -55,7 +49,7 @@ UndoCoins.prototype.getSize = function getSize() { size += 4; - for (let coin of this.items) + for (const coin of this.items) size += coin.getSize(); return size; @@ -67,12 +61,12 @@ UndoCoins.prototype.getSize = function getSize() { */ UndoCoins.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); bw.writeU32(this.items.length); - for (let coin of this.items) + for (const coin of this.items) coin.toWriter(bw); return bw.render(); @@ -86,11 +80,11 @@ UndoCoins.prototype.toRaw = function toRaw() { */ UndoCoins.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let count = br.readU32(); + const br = new BufferReader(data); + const count = br.readU32(); for (let i = 0; i < count; i++) - this.items.push(UndoCoin.fromReader(br)); + this.items.push(CoinEntry.fromReader(br)); return this; }; @@ -120,217 +114,27 @@ UndoCoins.prototype.isEmpty = function isEmpty() { */ UndoCoins.prototype.commit = function commit() { - let raw = this.toRaw(); + const raw = this.toRaw(); this.items.length = 0; return raw; }; -/** - * Retrieve the last undo coin. - * @returns {UndoCoin} - */ - -UndoCoins.prototype.top = function top() { - return this.items[this.items.length - 1]; -}; - /** * Re-apply undo coins to a view, effectively unspending them. * @param {CoinView} view - * @param {Outpoint} outpoint + * @param {Outpoint} prevout */ -UndoCoins.prototype.apply = function apply(view, outpoint) { - let undo = this.items.pop(); - let hash = outpoint.hash; - let index = outpoint.index; - let coins; +UndoCoins.prototype.apply = function apply(view, prevout) { + const undo = this.items.pop(); assert(undo); - if (undo.height !== -1) { - coins = new Coins(); - - assert(!view.map.has(hash)); - view.map.set(hash, coins); - - coins.hash = hash; - coins.coinbase = undo.coinbase; - coins.height = undo.height; - coins.version = undo.version; - } else { - coins = view.map.get(hash); - assert(coins); - } - - coins.addOutput(index, undo.toOutput()); - - assert(coins.has(index)); -}; - -/** - * UndoCoin - * @alias module:coins.UndoCoin - * @constructor - * @property {CoinEntry|null} entry - * @property {Output|null} output - * @property {Number} version - * @property {Number} height - * @property {Boolean} coinbase - */ - -function UndoCoin() { - this.entry = null; - this.output = null; - this.version = -1; - this.height = -1; - this.coinbase = false; -} - -/** - * Convert undo coin to an output. - * @returns {Output} - */ - -UndoCoin.prototype.toOutput = function toOutput() { - if (!this.output) { - assert(this.entry); - return this.entry.toOutput(); - } - return this.output; -}; - -/** - * Calculate undo coin size. - * @returns {Number} - */ - -UndoCoin.prototype.getSize = function getSize() { - let height = this.height; - let size = 0; - - if (height === -1) - height = 0; - - size += encoding.sizeVarint(height * 2 + (this.coinbase ? 1 : 0)); - - if (this.height !== -1) - size += encoding.sizeVarint(this.version); - - if (this.entry) { - // Cached from spend. - size += this.entry.getSize(); - } else { - size += compress.size(this.output); - } - - return size; -}; - -/** - * Write the undo coin to a buffer writer. - * @param {BufferWriter} bw - */ - -UndoCoin.prototype.toWriter = function toWriter(bw) { - let height = this.height; - - assert(height !== 0); - - if (height === -1) - height = 0; - - bw.writeVarint(height * 2 + (this.coinbase ? 1 : 0)); - - if (this.height !== -1) { - assert(this.version !== -1); - bw.writeVarint(this.version); - } - - if (this.entry) { - // Cached from spend. - this.entry.toWriter(bw); - } else { - compress.output(this.output, bw); - } - - return bw; -}; - -/** - * Serialize the undo coin. - * @returns {Buffer} - */ - -UndoCoin.prototype.toRaw = function toRaw() { - let size = this.getSize(); - return this.toWriter(new StaticWriter(size)).render(); -}; - -/** - * Inject properties from buffer reader. - * @private - * @param {BufferReader} br - * @returns {UndoCoin} - */ - -UndoCoin.prototype.fromReader = function fromReader(br) { - let code = br.readVarint(); - - this.output = new Output(); - - this.height = code / 2 | 0; - - if (this.height === 0) - this.height = -1; - - this.coinbase = (code & 1) !== 0; - - if (this.height !== -1) - this.version = br.readVarint(); - - decompress.output(this.output, br); - - return this; -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - * @returns {UndoCoin} - */ - -UndoCoin.prototype.fromRaw = function fromRaw(data) { - return this.fromReader(new BufferReader(data)); -}; - -/** - * Instantiate undo coin from serialized data. - * @param {Buffer} data - * @returns {UndoCoin} - */ - -UndoCoin.fromReader = function fromReader(br) { - return new UndoCoin().fromReader(br); -}; - -/** - * Instantiate undo coin from serialized data. - * @param {Buffer} data - * @returns {UndoCoin} - */ - -UndoCoin.fromRaw = function fromRaw(data) { - return new UndoCoin().fromRaw(data); + view.addEntry(prevout, undo); }; /* * Expose */ -exports = UndoCoins; -exports.UndoCoins = UndoCoins; -exports.UndoCoin = UndoCoin; - -module.exports = exports; +module.exports = UndoCoins; diff --git a/lib/crypto/aead.js b/lib/crypto/aead.js index 3ebfef9bb..13a3a583d 100644 --- a/lib/crypto/aead.js +++ b/lib/crypto/aead.js @@ -36,7 +36,7 @@ function AEAD() { */ AEAD.prototype.init = function init(key, iv) { - let polyKey = Buffer.allocUnsafe(32); + const polyKey = Buffer.allocUnsafe(32); polyKey.fill(0); this.chacha20.init(key, iv); @@ -63,10 +63,10 @@ AEAD.prototype.init = function init(key, iv) { * @param {Buffer} aad */ -AEAD.prototype.aad = function _aad(aad) { +AEAD.prototype.aad = function aad(data) { assert(this.cipherLen === 0, 'Cannot update aad.'); - this.poly1305.update(aad); - this.aadLen += aad.length; + this.poly1305.update(data); + this.aadLen += data.length; }; /** @@ -122,7 +122,7 @@ AEAD.prototype.auth = function auth(data) { */ AEAD.prototype.finish = function finish() { - let len = Buffer.allocUnsafe(16); + const len = Buffer.allocUnsafe(16); let lo, hi; // The RFC says these are supposed to be @@ -154,14 +154,12 @@ AEAD.prototype.finish = function finish() { */ AEAD.prototype.pad16 = function pad16(size) { - let pad; - size %= 16; if (size === 0) return; - pad = Buffer.allocUnsafe(16 - size); + const pad = Buffer.allocUnsafe(16 - size); pad.fill(0); this.poly1305.update(pad); diff --git a/lib/crypto/aes-browser.js b/lib/crypto/aes-browser.js index 376f469dd..b0924ec66 100644 --- a/lib/crypto/aes-browser.js +++ b/lib/crypto/aes-browser.js @@ -19,66 +19,647 @@ const assert = require('assert'); const AES = exports; -/** - * An AES key object for encrypting - * and decrypting blocks. - * @constructor - * @ignore - * @param {Buffer} key - * @param {Number} bits - */ - -function AESKey(key, bits) { - if (!(this instanceof AESKey)) - return new AESKey(key, bits); - - this.rounds = null; - this.userKey = key; - this.bits = bits; - - switch (this.bits) { - case 128: - this.rounds = 10; - break; - case 192: - this.rounds = 12; - break; - case 256: - this.rounds = 14; - break; - default: - throw new Error('Bad key size.'); - } - - assert(Buffer.isBuffer(key)); - assert(key.length === this.bits / 8); - - this.decryptKey = null; - this.encryptKey = null; -} - -/** - * Destroy the object and zero the keys. +/* + * Tables */ -AESKey.prototype.destroy = function destroy() { - assert(this.userKey, 'Already destroyed.'); - - // User should zero this. - this.userKey = null; +const TE0 = [ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a +]; - if (this.decryptKey) { - for (let i = 0; i < this.decryptKey.length; i++) - this.decryptKey[i] = 0; - this.decryptKey = null; - } +const TE1 = [ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616 +]; - if (this.encryptKey) { - for (let i = 0; i < this.encryptKey.length; i++) - this.encryptKey[i] = 0; - this.encryptKey = null; - } -}; +const TE2 = [ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16 +]; + +const TE3 = [ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c +]; + +const TD0 = [ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742 +]; + +const TD1 = [ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857 +]; + +const TD2 = [ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8 +]; + +const TD3 = [ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0 +]; + +const TD4 = [ + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, + 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, + 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, + 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, + 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, + 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, + 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, + 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, + 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, + 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, + 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, + 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, + 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, + 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, + 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, + 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +]; + +const RCON = [ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000 +]; + +/** + * An AES key object for encrypting + * and decrypting blocks. + * @constructor + * @ignore + * @param {Buffer} key + * @param {Number} bits + */ + +function AESKey(key, bits) { + if (!(this instanceof AESKey)) + return new AESKey(key, bits); + + this.rounds = null; + this.userKey = key; + this.bits = bits; + + switch (this.bits) { + case 128: + this.rounds = 10; + break; + case 192: + this.rounds = 12; + break; + case 256: + this.rounds = 14; + break; + default: + throw new Error('Bad key size.'); + } + + assert(Buffer.isBuffer(key)); + assert(key.length === this.bits / 8); + + this.decryptKey = null; + this.encryptKey = null; +} + +/** + * Destroy the object and zero the keys. + */ + +AESKey.prototype.destroy = function destroy() { + assert(this.userKey, 'Already destroyed.'); + + // User should zero this. + this.userKey = null; + + if (this.decryptKey) { + for (let i = 0; i < this.decryptKey.length; i++) + this.decryptKey[i] = 0; + this.decryptKey = null; + } + + if (this.encryptKey) { + for (let i = 0; i < this.encryptKey.length; i++) + this.encryptKey[i] = 0; + this.encryptKey = null; + } +}; /** * Convert the user key into an encryption key. @@ -86,16 +667,14 @@ AESKey.prototype.destroy = function destroy() { */ AESKey.prototype.getEncryptKey = function getEncryptKey() { - let i = 0; - let key, kp; - assert(this.userKey, 'Cannot use key once it is destroyed.'); if (this.encryptKey) return this.encryptKey; - key = new Uint32Array(60); - kp = 0; + const key = new Uint32Array(60); + let kp = 0; + let i = 0; key[kp + 0] = readU32(this.userKey, 0); key[kp + 1] = readU32(this.userKey, 4); @@ -106,7 +685,7 @@ AESKey.prototype.getEncryptKey = function getEncryptKey() { if (this.bits === 128) { for (;;) { - let tmp = key[kp + 3]; + const tmp = key[kp + 3]; key[kp + 4] = key[kp + 0] ^ (TE2[(tmp >>> 16) & 0xff] & 0xff000000) @@ -130,7 +709,7 @@ AESKey.prototype.getEncryptKey = function getEncryptKey() { if (this.bits === 192) { for (;;) { - let tmp = key[kp + 5]; + const tmp = key[kp + 5]; key[kp + 6] = key[kp + 0] ^ (TE2[(tmp >>> 16) & 0xff] & 0xff000000) @@ -195,17 +774,15 @@ AESKey.prototype.getEncryptKey = function getEncryptKey() { */ AESKey.prototype.getDecryptKey = function getDecryptKey() { - let kp, enc, key; - assert(this.userKey, 'Cannot use key once it is destroyed.'); if (this.decryptKey) return this.decryptKey; // First, start with an encryption schedule. - enc = this.getEncryptKey(); - key = new Uint32Array(60); - kp = 0; + const enc = this.getEncryptKey(); + const key = new Uint32Array(60); + let kp = 0; for (let i = 0; i < enc.length; i++) key[i] = enc[i]; @@ -264,22 +841,21 @@ AESKey.prototype.getDecryptKey = function getDecryptKey() { */ AESKey.prototype.encryptBlock = function encryptBlock(input) { - let output, kp, key, r, s0, s1, s2, s3, t0, t1, t2, t3; - assert(this.userKey, 'Cannot use key once it is destroyed.'); - key = this.getEncryptKey(); - kp = 0; + const key = this.getEncryptKey(); + let kp = 0; // Map byte array block to cipher // state and add initial round key. - s0 = readU32(input, 0) ^ key[0]; - s1 = readU32(input, 4) ^ key[1]; - s2 = readU32(input, 8) ^ key[2]; - s3 = readU32(input, 12) ^ key[3]; + let s0 = readU32(input, 0) ^ key[0]; + let s1 = readU32(input, 4) ^ key[1]; + let s2 = readU32(input, 8) ^ key[2]; + let s3 = readU32(input, 12) ^ key[3]; // Nr - 1 full rounds - r = this.rounds >>> 1; + let r = this.rounds >>> 1; + let t0, t1, t2, t3; for (;;) { t0 = TE0[(s0 >>> 24) & 0xff] @@ -353,7 +929,7 @@ AESKey.prototype.encryptBlock = function encryptBlock(input) { ^ (TE1[(t2 >>> 0) & 0xff] & 0x000000ff) ^ key[kp + 3]; - output = Buffer.allocUnsafe(16); + const output = Buffer.allocUnsafe(16); writeU32(output, s0, 0); writeU32(output, s1, 4); writeU32(output, s2, 8); @@ -369,22 +945,21 @@ AESKey.prototype.encryptBlock = function encryptBlock(input) { */ AESKey.prototype.decryptBlock = function decryptBlock(input) { - let output, kp, key, r, s0, s1, s2, s3, t0, t1, t2, t3; - assert(this.userKey, 'Cannot use AESKey once it is destroyed.'); - key = this.getDecryptKey(); - kp = 0; + const key = this.getDecryptKey(); + let kp = 0; // Map byte array block to cipher // state and add initial round key. - s0 = readU32(input, 0) ^ key[kp + 0]; - s1 = readU32(input, 4) ^ key[kp + 1]; - s2 = readU32(input, 8) ^ key[kp + 2]; - s3 = readU32(input, 12) ^ key[kp + 3]; + let s0 = readU32(input, 0) ^ key[kp + 0]; + let s1 = readU32(input, 4) ^ key[kp + 1]; + let s2 = readU32(input, 8) ^ key[kp + 2]; + let s3 = readU32(input, 12) ^ key[kp + 3]; // Nr - 1 full rounds - r = this.rounds >>> 1; + let r = this.rounds >>> 1; + let t0, t1, t2, t3; for (;;) { t0 = TD0[(s0 >>> 24) & 0xff] @@ -458,7 +1033,7 @@ AESKey.prototype.decryptBlock = function decryptBlock(input) { ^ (TD4[(t0 >>> 0) & 0xff] << 0) ^ key[kp + 3]; - output = Buffer.allocUnsafe(16); + const output = Buffer.allocUnsafe(16); writeU32(output, s0, 0); writeU32(output, s1, 4); writeU32(output, s2, 8); @@ -496,16 +1071,15 @@ function AESCipher(key, iv, bits, mode) { */ AESCipher.prototype.update = function update(data) { - let blocks = []; - let trailing, len; + const blocks = []; if (this.waiting) { data = concat(this.waiting, data); this.waiting = null; } - trailing = data.length % 16; - len = data.length - trailing; + const trailing = data.length % 16; + const len = data.length - trailing; // Encrypt all blocks except for the last. for (let i = 0; i < len; i += 16) { @@ -535,8 +1109,8 @@ AESCipher.prototype.final = function final() { block = Buffer.allocUnsafe(16); block.fill(16); } else { - let left = 16 - this.waiting.length; - let pad = Buffer.allocUnsafe(left); + const left = 16 - this.waiting.length; + const pad = Buffer.allocUnsafe(left); pad.fill(left); block = concat(this.waiting, pad); } @@ -554,779 +1128,194 @@ AESCipher.prototype.final = function final() { }; /** - * AES decipher. - * @constructor - * @ignore - * @param {Buffer} key - * @param {Buffer} iv - * @param {Number} bits - * @param {String} mode - */ - -function AESDecipher(key, iv, bits, mode) { - if (!(this instanceof AESDecipher)) - return new AESDecipher(key, iv, mode); - - assert(mode === 'ecb' || mode === 'cbc', 'Unknown mode.'); - - this.key = new AESKey(key, bits); - this.mode = mode; - this.prev = iv; - this.waiting = null; - this.lastBlock = null; -} - -/** - * Decrypt blocks of data. - * @param {Buffer} data - */ - -AESDecipher.prototype.update = function update(data) { - let blocks = []; - let trailing, len; - - if (this.waiting) { - data = concat(this.waiting, data); - this.waiting = null; - } - - trailing = data.length % 16; - len = data.length - trailing; - - // Decrypt all blocks. - for (let i = 0; i < len; i += 16) { - let chunk = this.prev; - let block; - - this.prev = data.slice(i, i + 16); - - block = this.key.decryptBlock(this.prev); - - if (this.mode === 'cbc') - block = xor(block, chunk); - - blocks.push(block); - } - - if (trailing > 0) - this.waiting = data.slice(len); - - if (this.lastBlock) { - blocks.unshift(this.lastBlock); - this.lastBlock = null; - } - - // Keep a reference to the last - // block for the padding check. - this.lastBlock = blocks.pop(); - - return Buffer.concat(blocks); -}; - -/** - * Finalize the decipher. - * @returns {Buffer} - */ - -AESDecipher.prototype.final = function final() { - let b, n, block; - - this.key.destroy(); - - assert(!this.waiting, 'Bad decrypt (trailing bytes).'); - assert(this.lastBlock, 'Bad decrypt (no data).'); - - // Check padding on the last block. - block = this.lastBlock; - b = 16; - n = block[b - 1]; - - if (n === 0 || n > b) - throw new Error('Bad decrypt (padding).'); - - for (let i = 0; i < n; i++) { - if (block[--b] !== n) - throw new Error('Bad decrypt (padding).'); - } - - // Slice off the padding unless - // the entire block was padding. - if (n === 16) - return Buffer.alloc(0); - - block = block.slice(0, -n); - - return block; -}; - -/** - * Encrypt data with aes 256. - * @param {Buffer} data - * @param {Buffer} key - * @param {Buffer} iv - * @param {String} mode - * @returns {Buffer} - */ - -AES.encrypt = function encrypt(data, key, iv, bits, mode) { - let cipher = new AESCipher(key, iv, bits, mode); - return concat(cipher.update(data), cipher.final()); -}; - -/** - * Decrypt data with aes 256. - * @param {Buffer} data - * @param {Buffer} key - * @param {Buffer|null} iv - * @param {Number} bits - * @param {String} mode - * @returns {Buffer} - */ - -AES.decrypt = function decrypt(data, key, iv, bits, mode) { - let decipher = new AESDecipher(key, iv, bits, mode); - return concat(decipher.update(data), decipher.final()); -}; - -/** - * Encrypt data with aes 256 cbc. - * @param {Buffer} data - * @param {Buffer} key - * @param {Buffer} iv - * @returns {Buffer} - */ - -AES.encipher = function encipher(data, key, iv) { - assert(Buffer.isBuffer(data)); - assert(key.length === 32); - assert(iv.length === 16); - return AES.encrypt(data, key, iv, 256, 'cbc'); -}; - -/** - * Decrypt data with aes 256 cbc. - * @param {Buffer} data + * AES decipher. + * @constructor + * @ignore * @param {Buffer} key * @param {Buffer} iv - * @returns {Buffer} - */ - -AES.decipher = function decipher(data, key, iv) { - assert(Buffer.isBuffer(data)); - assert(key.length === 32); - assert(iv.length === 16); - return AES.decrypt(data, key, iv, 256, 'cbc'); -}; - -/* - * Helpers + * @param {Number} bits + * @param {String} mode */ -function xor(v1, v2) { - let out = Buffer.allocUnsafe(v1.length); - for (let i = 0; i < v1.length; i++) - out[i] = v1[i] ^ v2[i]; - return out; -} - -function readU32(data, i) { - return (data[i + 0] << 24) - ^ (data[i + 1] << 16) - ^ (data[i + 2] << 8) - ^ data[i + 3]; -} +function AESDecipher(key, iv, bits, mode) { + if (!(this instanceof AESDecipher)) + return new AESDecipher(key, iv, mode); -function writeU32(data, value, i) { - data[i + 0] = (value >>> 24) & 0xff; - data[i + 1] = (value >>> 16) & 0xff; - data[i + 2] = (value >>> 8) & 0xff; - data[i + 3] = value & 0xff; -} + assert(mode === 'ecb' || mode === 'cbc', 'Unknown mode.'); -function concat(a, b) { - let data = Buffer.allocUnsafe(a.length + b.length); - a.copy(data, 0); - b.copy(data, a.length); - return data; + this.key = new AESKey(key, bits); + this.mode = mode; + this.prev = iv; + this.waiting = null; + this.lastBlock = null; } -/* - * Tables +/** + * Decrypt blocks of data. + * @param {Buffer} data */ -const TE0 = [ - 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, - 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, - 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, - 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, - 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, - 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, - 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, - 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, - 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, - 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, - 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, - 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, - 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, - 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, - 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, - 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, - 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, - 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, - 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, - 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, - 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, - 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, - 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, - 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, - 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, - 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, - 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, - 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, - 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, - 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, - 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, - 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, - 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, - 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, - 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, - 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, - 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, - 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, - 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, - 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, - 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, - 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, - 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, - 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, - 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, - 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, - 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, - 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, - 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, - 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, - 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, - 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, - 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, - 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, - 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, - 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, - 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, - 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, - 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, - 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, - 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, - 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, - 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, - 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a -]; - -const TE1 = [ - 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, - 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, - 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, - 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, - 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, - 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, - 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, - 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, - 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, - 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, - 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, - 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, - 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, - 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, - 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, - 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, - 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, - 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, - 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, - 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, - 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, - 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, - 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, - 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, - 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, - 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, - 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, - 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, - 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, - 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, - 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, - 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, - 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, - 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, - 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, - 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, - 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, - 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, - 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, - 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, - 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, - 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, - 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, - 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, - 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, - 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, - 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, - 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, - 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, - 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, - 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, - 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, - 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, - 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, - 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, - 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, - 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, - 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, - 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, - 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, - 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, - 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, - 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, - 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616 -]; - -const TE2 = [ - 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, - 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, - 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, - 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, - 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, - 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, - 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, - 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, - 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, - 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, - 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, - 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, - 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, - 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, - 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, - 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, - 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, - 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, - 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, - 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, - 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, - 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, - 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, - 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, - 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, - 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, - 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, - 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, - 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, - 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, - 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, - 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, - 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, - 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, - 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, - 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, - 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, - 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, - 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, - 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, - 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, - 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, - 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, - 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, - 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, - 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, - 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, - 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, - 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, - 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, - 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, - 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, - 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, - 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, - 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, - 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, - 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, - 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, - 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, - 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, - 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, - 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, - 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, - 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16 -]; +AESDecipher.prototype.update = function update(data) { + const blocks = []; -const TE3 = [ - 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, - 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, - 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, - 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, - 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, - 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, - 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, - 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, - 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, - 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, - 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, - 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, - 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, - 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, - 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, - 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, - 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, - 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, - 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, - 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, - 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, - 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, - 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, - 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, - 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, - 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, - 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, - 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, - 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, - 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, - 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, - 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, - 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, - 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, - 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, - 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, - 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, - 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, - 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, - 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, - 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, - 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, - 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, - 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, - 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, - 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, - 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, - 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, - 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, - 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, - 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, - 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, - 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, - 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, - 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, - 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, - 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, - 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, - 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, - 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, - 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, - 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, - 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, - 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c -]; + if (this.waiting) { + data = concat(this.waiting, data); + this.waiting = null; + } -const TD0 = [ - 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, - 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, - 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, - 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, - 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, - 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, - 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, - 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, - 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, - 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, - 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, - 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, - 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, - 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, - 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, - 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, - 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, - 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, - 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, - 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, - 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, - 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, - 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, - 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, - 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, - 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, - 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, - 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, - 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, - 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, - 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, - 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, - 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, - 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, - 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, - 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, - 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, - 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, - 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, - 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, - 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, - 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, - 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, - 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, - 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, - 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, - 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, - 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, - 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, - 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, - 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, - 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, - 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, - 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, - 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, - 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, - 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, - 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, - 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, - 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, - 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, - 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, - 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, - 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742 -]; + const trailing = data.length % 16; + const len = data.length - trailing; -const TD1 = [ - 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, - 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, - 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, - 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, - 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, - 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, - 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, - 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, - 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, - 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, - 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, - 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, - 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, - 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, - 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, - 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, - 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, - 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, - 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, - 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, - 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, - 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, - 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, - 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, - 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, - 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, - 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, - 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, - 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, - 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, - 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, - 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, - 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, - 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, - 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, - 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, - 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, - 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, - 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, - 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, - 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, - 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, - 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, - 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, - 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, - 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, - 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, - 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, - 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, - 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, - 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, - 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, - 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, - 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, - 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, - 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, - 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, - 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, - 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, - 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, - 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, - 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, - 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, - 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857 -]; + // Decrypt all blocks. + for (let i = 0; i < len; i += 16) { + const chunk = this.prev; + + this.prev = data.slice(i, i + 16); + + let block = this.key.decryptBlock(this.prev); + + if (this.mode === 'cbc') + block = xor(block, chunk); + + blocks.push(block); + } + + if (trailing > 0) + this.waiting = data.slice(len); + + if (this.lastBlock) { + blocks.unshift(this.lastBlock); + this.lastBlock = null; + } + + // Keep a reference to the last + // block for the padding check. + this.lastBlock = blocks.pop(); + + return Buffer.concat(blocks); +}; + +/** + * Finalize the decipher. + * @returns {Buffer} + */ + +AESDecipher.prototype.final = function final() { + this.key.destroy(); + + assert(!this.waiting, 'Bad decrypt (trailing bytes).'); + assert(this.lastBlock, 'Bad decrypt (no data).'); + + // Check padding on the last block. + let block = this.lastBlock; + let b = 16; + const n = block[b - 1]; + + if (n === 0 || n > b) + throw new Error('Bad decrypt (padding).'); + + for (let i = 0; i < n; i++) { + if (block[--b] !== n) + throw new Error('Bad decrypt (padding).'); + } + + // Slice off the padding unless + // the entire block was padding. + if (n === 16) + return Buffer.alloc(0); + + block = block.slice(0, -n); -const TD2 = [ - 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, - 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, - 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, - 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, - 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, - 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, - 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, - 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, - 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, - 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, - 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, - 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, - 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, - 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, - 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, - 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, - 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, - 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, - 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, - 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, - 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, - 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, - 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, - 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, - 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, - 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, - 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, - 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, - 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, - 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, - 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, - 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, - 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, - 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, - 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, - 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, - 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, - 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, - 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, - 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, - 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, - 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, - 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, - 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, - 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, - 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, - 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, - 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, - 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, - 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, - 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, - 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, - 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, - 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, - 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, - 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, - 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, - 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, - 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, - 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, - 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, - 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, - 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, - 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8 -]; + return block; +}; -const TD3 = [ - 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, - 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, - 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, - 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, - 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, - 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, - 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, - 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, - 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, - 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, - 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, - 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, - 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, - 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, - 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, - 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, - 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, - 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, - 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, - 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, - 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, - 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, - 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, - 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, - 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, - 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, - 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, - 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, - 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, - 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, - 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, - 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, - 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, - 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, - 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, - 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, - 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, - 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, - 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, - 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, - 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, - 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, - 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, - 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, - 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, - 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, - 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, - 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, - 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, - 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, - 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, - 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, - 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, - 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, - 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, - 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, - 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, - 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, - 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, - 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, - 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, - 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, - 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, - 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0 -]; +/** + * Encrypt data with aes 256. + * @param {Buffer} data + * @param {Buffer} key + * @param {Buffer} iv + * @param {String} mode + * @returns {Buffer} + */ -const TD4 = [ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, - 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, - 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, - 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, - 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, - 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, - 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, - 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, - 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, - 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, - 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, - 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d -]; +AES.encrypt = function encrypt(data, key, iv, bits, mode) { + const cipher = new AESCipher(key, iv, bits, mode); + return concat(cipher.update(data), cipher.final()); +}; -const RCON = [ - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000 -]; +/** + * Decrypt data with aes 256. + * @param {Buffer} data + * @param {Buffer} key + * @param {Buffer|null} iv + * @param {Number} bits + * @param {String} mode + * @returns {Buffer} + */ + +AES.decrypt = function decrypt(data, key, iv, bits, mode) { + const decipher = new AESDecipher(key, iv, bits, mode); + return concat(decipher.update(data), decipher.final()); +}; + +/** + * Encrypt data with aes 256 cbc. + * @param {Buffer} data + * @param {Buffer} key + * @param {Buffer} iv + * @returns {Buffer} + */ + +AES.encipher = function encipher(data, key, iv) { + assert(Buffer.isBuffer(data)); + assert(key.length === 32); + assert(iv.length === 16); + return AES.encrypt(data, key, iv, 256, 'cbc'); +}; + +/** + * Decrypt data with aes 256 cbc. + * @param {Buffer} data + * @param {Buffer} key + * @param {Buffer} iv + * @returns {Buffer} + */ + +AES.decipher = function decipher(data, key, iv) { + assert(Buffer.isBuffer(data)); + assert(key.length === 32); + assert(iv.length === 16); + return AES.decrypt(data, key, iv, 256, 'cbc'); +}; + +/* + * Helpers + */ + +function xor(v1, v2) { + const out = Buffer.allocUnsafe(v1.length); + for (let i = 0; i < v1.length; i++) + out[i] = v1[i] ^ v2[i]; + return out; +} + +function readU32(data, i) { + return (data[i + 0] << 24) + ^ (data[i + 1] << 16) + ^ (data[i + 2] << 8) + ^ data[i + 3]; +} + +function writeU32(data, value, i) { + data[i + 0] = (value >>> 24) & 0xff; + data[i + 1] = (value >>> 16) & 0xff; + data[i + 2] = (value >>> 8) & 0xff; + data[i + 3] = value & 0xff; +} + +function concat(a, b) { + const data = Buffer.allocUnsafe(a.length + b.length); + a.copy(data, 0); + b.copy(data, a.length); + return data; +} diff --git a/lib/crypto/aes.js b/lib/crypto/aes.js index 1bec17298..15618fcd4 100644 --- a/lib/crypto/aes.js +++ b/lib/crypto/aes.js @@ -22,8 +22,8 @@ const native = require('../native').binding; */ exports.encipher = function encipher(data, key, iv) { - let cipher = crypto.createCipheriv('aes-256-cbc', key, iv); - return Buffer.concat([cipher.update(data), cipher.final()]); + const ctx = crypto.createCipheriv('aes-256-cbc', key, iv); + return Buffer.concat([ctx.update(data), ctx.final()]); }; /** @@ -34,10 +34,10 @@ exports.encipher = function encipher(data, key, iv) { * @returns {Buffer} */ -exports.decipher = function _decipher(data, key, iv) { - let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); +exports.decipher = function decipher(data, key, iv) { + const ctx = crypto.createDecipheriv('aes-256-cbc', key, iv); try { - return Buffer.concat([decipher.update(data), decipher.final()]); + return Buffer.concat([ctx.update(data), ctx.final()]); } catch (e) { throw new Error('Bad key for decryption.'); } diff --git a/lib/crypto/ccmp.js b/lib/crypto/ccmp.js index 29193fb09..dfc4ced17 100644 --- a/lib/crypto/ccmp.js +++ b/lib/crypto/ccmp.js @@ -6,6 +6,8 @@ 'use strict'; +const assert = require('assert'); + /** * memcmp in constant time (can only return true or false). * This protects us against timing attacks when @@ -19,18 +21,13 @@ */ module.exports = function ccmp(a, b) { - let res; - - if (!Buffer.isBuffer(a)) - return false; - - if (!Buffer.isBuffer(b)) - return false; + assert(Buffer.isBuffer(a)); + assert(Buffer.isBuffer(b)); if (b.length === 0) return a.length === 0; - res = a.length ^ b.length; + let res = a.length ^ b.length; for (let i = 0; i < a.length; i++) res |= a[i] ^ b[i % b.length]; diff --git a/lib/crypto/chacha20.js b/lib/crypto/chacha20.js index c9e30e516..42e8db164 100644 --- a/lib/crypto/chacha20.js +++ b/lib/crypto/chacha20.js @@ -148,13 +148,11 @@ ChaCha20.prototype.encrypt = function encrypt(data) { */ ChaCha20.prototype.setCounter = function setCounter(counter) { - let lo, hi; - if (!counter) counter = 0; - lo = counter % 0x100000000; - hi = (counter - lo) / 0x100000000; + const lo = counter % 0x100000000; + const hi = (counter - lo) / 0x100000000; this.state[12] = lo; @@ -168,8 +166,8 @@ ChaCha20.prototype.setCounter = function setCounter(counter) { */ ChaCha20.prototype.getCounter = function getCounter() { - let lo = this.state[12]; - let hi = this.state[13]; + const lo = this.state[12]; + const hi = this.state[13]; if (this.ivSize === 64) return hi * 0x100000000 + lo; return lo; diff --git a/lib/crypto/digest-browser.js b/lib/crypto/digest-browser.js index 95a94e455..4f7f45576 100644 --- a/lib/crypto/digest-browser.js +++ b/lib/crypto/digest-browser.js @@ -13,7 +13,7 @@ const assert = require('assert'); const hashjs = require('hash.js'); -const sha256 = require('./sha256'); +const SHA256 = require('./sha256'); const POOL64 = Buffer.allocUnsafe(64); /** @@ -23,17 +23,15 @@ const POOL64 = Buffer.allocUnsafe(64); * @returns {Buffer} */ -exports.hash = function _hash(alg, data) { - let hash; - +exports.hash = function hash(alg, data) { if (alg === 'sha256') - return sha256.digest(data); + return SHA256.digest(data); - hash = hashjs[alg]; + const algo = hashjs[alg]; - assert(hash != null, 'Unknown algorithm.'); + assert(algo != null, 'Unknown algorithm.'); - return Buffer.from(hash().update(data).digest()); + return Buffer.from(algo().update(data).digest()); }; /** @@ -62,8 +60,8 @@ exports.sha1 = function sha1(data) { * @returns {Buffer} */ -exports.sha256 = function _sha256(data) { - return sha256.digest(data); +exports.sha256 = function sha256(data) { + return SHA256.digest(data); }; /** @@ -73,7 +71,7 @@ exports.sha256 = function _sha256(data) { */ exports.hash160 = function hash160(data) { - return exports.hash('ripemd160', sha256.digest(data)); + return exports.hash('ripemd160', SHA256.digest(data)); }; /** @@ -83,7 +81,7 @@ exports.hash160 = function hash160(data) { */ exports.hash256 = function hash256(data) { - return sha256.hash256(data); + return SHA256.hash256(data); }; /** @@ -94,7 +92,7 @@ exports.hash256 = function hash256(data) { */ exports.root256 = function root256(left, right) { - let data = POOL64; + const data = POOL64; assert(left.length === 32); assert(right.length === 32); @@ -113,13 +111,12 @@ exports.root256 = function root256(left, right) { * @returns {Buffer} HMAC */ -exports.hmac = function _hmac(alg, data, key) { - let hash = hashjs[alg]; - let hmac; +exports.hmac = function hmac(alg, data, key) { + const algo = hashjs[alg]; - assert(hash != null, 'Unknown algorithm.'); + assert(algo != null, 'Unknown algorithm.'); - hmac = hashjs.hmac(hash, key); + const ctx = hashjs.hmac(algo, key); - return Buffer.from(hmac.update(data).digest()); + return Buffer.from(ctx.update(data).digest()); }; diff --git a/lib/crypto/digest.js b/lib/crypto/digest.js index 9a23cb6ff..d65d72a5a 100644 --- a/lib/crypto/digest.js +++ b/lib/crypto/digest.js @@ -84,7 +84,7 @@ exports.hash256 = function hash256(data) { */ exports.root256 = function root256(left, right) { - let data = POOL64; + const data = POOL64; assert(left.length === 32); assert(right.length === 32); @@ -103,9 +103,9 @@ exports.root256 = function root256(left, right) { * @returns {Buffer} HMAC */ -exports.hmac = function _hmac(alg, data, key) { - let hmac = crypto.createHmac(alg, key); - return hmac.update(data).digest(); +exports.hmac = function hmac(alg, data, key) { + const ctx = crypto.createHmac(alg, key); + return ctx.update(data).digest(); }; if (native) { diff --git a/lib/crypto/ecdsa.js b/lib/crypto/ecdsa.js index 8c5540d89..4639156b0 100644 --- a/lib/crypto/ecdsa.js +++ b/lib/crypto/ecdsa.js @@ -25,16 +25,14 @@ const digest = require('./digest'); */ exports.verify = function verify(curve, alg, msg, sig, key) { - let ec, hash; - assert(typeof curve === 'string', 'No curve selected.'); assert(typeof alg === 'string', 'No algorithm selected.'); assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(sig)); assert(Buffer.isBuffer(key)); - ec = elliptic.ec(curve); - hash = digest.hash(alg, msg); + const ec = elliptic.ec(curve); + const hash = digest.hash(alg, msg); try { return ec.verify(hash, sig, key); @@ -54,17 +52,14 @@ exports.verify = function verify(curve, alg, msg, sig, key) { */ exports.sign = function sign(curve, alg, msg, key) { - let ec, hash, sig; - assert(typeof curve === 'string', 'No curve selected.'); assert(typeof alg === 'string', 'No algorithm selected.'); assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(key)); - ec = elliptic.ec(curve); - hash = digest.hash(alg, msg); - - sig = ec.sign(hash, key, { canonical: true }); + const ec = elliptic.ec(curve); + const hash = digest.hash(alg, msg); + const sig = ec.sign(hash, key, { canonical: true }); return Buffer.from(sig.toDER()); }; diff --git a/lib/crypto/hkdf.js b/lib/crypto/hkdf.js index 02de4e1a9..64f4c9df3 100644 --- a/lib/crypto/hkdf.js +++ b/lib/crypto/hkdf.js @@ -34,24 +34,24 @@ exports.extract = function extract(ikm, key, alg) { */ exports.expand = function expand(prk, info, len, alg) { - let size = digest.hash(alg, Buffer.alloc(0)).length; - let blocks = Math.ceil(len / size); - let okm, buf, out; + const size = digest.hash(alg, Buffer.alloc(0)).length; + const blocks = Math.ceil(len / size); if (blocks > 255) throw new Error('Too many blocks.'); - okm = Buffer.allocUnsafe(len); + const okm = Buffer.allocUnsafe(len); if (blocks === 0) return okm; - buf = Buffer.allocUnsafe(size + info.length + 1); + const buf = Buffer.allocUnsafe(size + info.length + 1); // First round: info.copy(buf, size); buf[buf.length - 1] = 1; - out = digest.hmac(alg, buf.slice(size), prk); + + let out = digest.hmac(alg, buf.slice(size), prk); out.copy(okm, 0); for (let i = 1; i < blocks; i++) { diff --git a/lib/crypto/hmac-drbg.js b/lib/crypto/hmac-drbg.js index 068e9679f..559807941 100644 --- a/lib/crypto/hmac-drbg.js +++ b/lib/crypto/hmac-drbg.js @@ -47,7 +47,7 @@ HmacDRBG.prototype.init = function init(entropy, nonce, pers) { }; HmacDRBG.prototype.reseed = function reseed(entropy, nonce, pers) { - let seed = POOL112; + const seed = POOL112; assert(Buffer.isBuffer(entropy)); assert(Buffer.isBuffer(nonce)); @@ -66,7 +66,7 @@ HmacDRBG.prototype.reseed = function reseed(entropy, nonce, pers) { }; HmacDRBG.prototype.iterate = function iterate() { - let data = POOL33; + const data = POOL33; this.V.copy(data, 0); data[HASH_SIZE] = 0x00; @@ -76,7 +76,7 @@ HmacDRBG.prototype.iterate = function iterate() { }; HmacDRBG.prototype.update = function update(seed) { - let data = POOL145; + const data = POOL145; assert(Buffer.isBuffer(seed)); assert(seed.length === HASH_SIZE * 2 + 48); @@ -95,12 +95,12 @@ HmacDRBG.prototype.update = function update(seed) { }; HmacDRBG.prototype.generate = function generate(len) { - let data = Buffer.allocUnsafe(len); - let pos = 0; - if (this.rounds > RESEED_INTERVAL) throw new Error('Reseed is required.'); + const data = Buffer.allocUnsafe(len); + let pos = 0; + while (pos < len) { this.V = digest.hmac(HASH_ALG, this.V, this.K); this.V.copy(data, pos); diff --git a/lib/crypto/merkle.js b/lib/crypto/merkle.js index 36ef202ea..1adeeca1e 100644 --- a/lib/crypto/merkle.js +++ b/lib/crypto/merkle.js @@ -21,7 +21,7 @@ const digest = require('./digest'); */ exports.createTree = function createTree(leaves) { - let nodes = leaves; + const nodes = leaves; let size = leaves.length; let malleated = false; let i = 0; @@ -33,17 +33,16 @@ exports.createTree = function createTree(leaves) { while (size > 1) { for (let j = 0; j < size; j += 2) { - let k = Math.min(j + 1, size - 1); - let left = nodes[i + j]; - let right = nodes[i + k]; - let hash; + const k = Math.min(j + 1, size - 1); + const left = nodes[i + j]; + const right = nodes[i + k]; if (k === j + 1 && k + 1 === size && left.equals(right)) { malleated = true; } - hash = digest.root256(left, right); + const hash = digest.root256(left, right); nodes.push(hash); } @@ -62,8 +61,8 @@ exports.createTree = function createTree(leaves) { */ exports.createRoot = function createRoot(leaves) { - let [nodes, malleated] = exports.createTree(leaves); - let root = nodes[nodes.length - 1]; + const [nodes, malleated] = exports.createTree(leaves); + const root = nodes[nodes.length - 1]; return [root, malleated]; }; @@ -76,12 +75,12 @@ exports.createRoot = function createRoot(leaves) { exports.createBranch = function createBranch(index, leaves) { let size = leaves.length; - let [nodes] = exports.createTree(leaves); - let branch = []; + const [nodes] = exports.createTree(leaves); + const branch = []; let i = 0; while (size > 1) { - let j = Math.min(index ^ 1, size - 1); + const j = Math.min(index ^ 1, size - 1); branch.push(nodes[i + j]); index >>>= 1; i += size; @@ -103,7 +102,7 @@ exports.createBranch = function createBranch(index, leaves) { exports.deriveRoot = function deriveRoot(hash, branch, index) { let root = hash; - for (let hash of branch) { + for (const hash of branch) { if (index & 1) root = digest.root256(hash, root); else diff --git a/lib/crypto/pbkdf2-browser.js b/lib/crypto/pbkdf2-browser.js index a2407f482..92b879cfb 100644 --- a/lib/crypto/pbkdf2-browser.js +++ b/lib/crypto/pbkdf2-browser.js @@ -26,19 +26,18 @@ const subtle = crypto.subtle || {}; */ exports.derive = function derive(key, salt, iter, len, alg) { - let size = digest.hash(alg, Buffer.alloc(0)).length; - let blocks = Math.ceil(len / size); - let out = Buffer.allocUnsafe(len); - let buf = Buffer.allocUnsafe(salt.length + 4); - let block = Buffer.allocUnsafe(size); + const size = digest.hash(alg, Buffer.alloc(0)).length; + const blocks = Math.ceil(len / size); + const out = Buffer.allocUnsafe(len); + const buf = Buffer.allocUnsafe(salt.length + 4); + const block = Buffer.allocUnsafe(size); let pos = 0; salt.copy(buf, 0); for (let i = 0; i < blocks; i++) { - let mac; buf.writeUInt32BE(i + 1, salt.length, true); - mac = digest.hmac(alg, buf, key); + let mac = digest.hmac(alg, buf, key); mac.copy(block, 0); for (let j = 1; j < iter; j++) { mac = digest.hmac(alg, mac, key); @@ -63,22 +62,21 @@ exports.derive = function derive(key, salt, iter, len, alg) { */ exports.deriveAsync = async function deriveAsync(key, salt, iter, len, alg) { - let algo = { name: 'PBKDF2' }; - let use = ['deriveBits']; - let options, imported, data; + const algo = { name: 'PBKDF2' }; + const use = ['deriveBits']; if (!subtle.importKey || !subtle.deriveBits) return exports.derive(key, salt, iter, len, alg); - options = { + const options = { name: 'PBKDF2', salt: salt, iterations: iter, hash: getHash(alg) }; - imported = await subtle.importKey('raw', key, algo, false, use); - data = await subtle.deriveBits(options, imported, len * 8); + const imported = await subtle.importKey('raw', key, algo, false, use); + const data = await subtle.deriveBits(options, imported, len * 8); return Buffer.from(data); }; diff --git a/lib/crypto/poly1305.js b/lib/crypto/poly1305.js index d6a3d6329..50ecdda94 100644 --- a/lib/crypto/poly1305.js +++ b/lib/crypto/poly1305.js @@ -10,7 +10,7 @@ const native = require('../native').binding; /** * Poly1305 (used for bip151) - * @alias module:crypto.Poly1305 + * @alias module:crypto/chachapoly.Poly1305 * @constructor * @see https://github.com/floodyberry/poly1305-donna * @see https://tools.ietf.org/html/rfc7539#section-2.5 @@ -35,14 +35,14 @@ function Poly1305() { Poly1305.prototype.init = function init(key) { // r &= 0xffffffc0ffffffc0ffffffc0fffffff - let t0 = key.readUInt16LE(0, true); - let t1 = key.readUInt16LE(2, true); - let t2 = key.readUInt16LE(4, true); - let t3 = key.readUInt16LE(6, true); - let t4 = key.readUInt16LE(8, true); - let t5 = key.readUInt16LE(10, true); - let t6 = key.readUInt16LE(12, true); - let t7 = key.readUInt16LE(14, true); + const t0 = key.readUInt16LE(0, true); + const t1 = key.readUInt16LE(2, true); + const t2 = key.readUInt16LE(4, true); + const t3 = key.readUInt16LE(6, true); + const t4 = key.readUInt16LE(8, true); + const t5 = key.readUInt16LE(10, true); + const t6 = key.readUInt16LE(12, true); + const t7 = key.readUInt16LE(14, true); this.r[0] = t0 & 0x1fff; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; @@ -75,20 +75,19 @@ Poly1305.prototype.init = function init(key) { */ Poly1305.prototype.blocks = function blocks(data, bytes, m) { - let hibit = this.fin ? 0 : (1 << 11); // 1 << 128 - let d = new Uint32Array(10); + const hibit = this.fin ? 0 : (1 << 11); // 1 << 128 + const d = new Uint32Array(10); while (bytes >= 16) { // h += m[i] - let t0 = data.readUInt16LE(m + 0, true); - let t1 = data.readUInt16LE(m + 2, true); - let t2 = data.readUInt16LE(m + 4, true); - let t3 = data.readUInt16LE(m + 6, true); - let t4 = data.readUInt16LE(m + 8, true); - let t5 = data.readUInt16LE(m + 10, true); - let t6 = data.readUInt16LE(m + 12, true); - let t7 = data.readUInt16LE(m + 14, true); - let c = 0; + const t0 = data.readUInt16LE(m + 0, true); + const t1 = data.readUInt16LE(m + 2, true); + const t2 = data.readUInt16LE(m + 4, true); + const t3 = data.readUInt16LE(m + 6, true); + const t4 = data.readUInt16LE(m + 8, true); + const t5 = data.readUInt16LE(m + 10, true); + const t6 = data.readUInt16LE(m + 12, true); + const t7 = data.readUInt16LE(m + 14, true); this.h[0] += t0 & 0x1fff; this.h[1] += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; @@ -102,14 +101,19 @@ Poly1305.prototype.blocks = function blocks(data, bytes, m) { this.h[9] += ((t7 >>> 5)) | hibit; // h *= r, (partial) h %= p + let c = 0; for (let i = 0; i < 10; i++) { d[i] = c; for (let j = 0; j < 10; j++) { + let a = this.h[j]; + if (j <= i) - d[i] += this.r[i - j]; + a *= this.r[i - j]; else - d[i] += 5 * this.r[i + 10 - j]; + a *= 5 * this.r[i + 10 - j]; + + d[i] += a; // Sum(h[i] * r[i] * 5) will overflow slightly // above 6 products with an unclamped r, so @@ -172,7 +176,7 @@ Poly1305.prototype.update = function update(data) { // process full blocks if (bytes >= 16) { - let want = bytes & ~(16 - 1); + const want = bytes & ~(16 - 1); this.blocks(data, want, m); m += want; bytes -= want; @@ -192,9 +196,8 @@ Poly1305.prototype.update = function update(data) { */ Poly1305.prototype.finish = function finish() { - let mac = Buffer.allocUnsafe(16); - let g = new Uint16Array(10); - let c, mask, f; + const mac = Buffer.allocUnsafe(16); + const g = new Uint16Array(10); // process the remaining block if (this.leftover) { @@ -207,7 +210,7 @@ Poly1305.prototype.finish = function finish() { } // fully carry h - c = this.h[1] >>> 13; + let c = this.h[1] >>> 13; this.h[1] &= 0x1fff; for (let i = 2; i < 10; i++) { this.h[i] += c; @@ -233,7 +236,7 @@ Poly1305.prototype.finish = function finish() { } // select h if h < p, or h + -p if h >= p - mask = (c ^ 1) - 1; + let mask = (c ^ 1) - 1; for (let i = 0; i < 10; i++) g[i] &= mask; mask = ~mask; @@ -252,7 +255,7 @@ Poly1305.prototype.finish = function finish() { this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5)) & 0xffff; // mac = (h + pad) % (2^128) - f = this.h[0] + this.pad[0]; + let f = this.h[0] + this.pad[0]; this.h[0] = f; for (let i = 1; i < 8; i++) { f = this.h[i] + this.pad[i] + (f >>> 16); @@ -283,7 +286,7 @@ Poly1305.prototype.finish = function finish() { */ Poly1305.auth = function auth(msg, key) { - let poly = new Poly1305(); + const poly = new Poly1305(); poly.init(key); poly.update(msg); return poly.finish(); diff --git a/lib/crypto/random-browser.js b/lib/crypto/random-browser.js index fbaf0092f..0f102b055 100644 --- a/lib/crypto/random-browser.js +++ b/lib/crypto/random-browser.js @@ -20,7 +20,7 @@ const crypto = global.crypto || global.msCrypto || {}; */ exports.randomBytes = function randomBytes(size) { - let data = new Uint8Array(size); + const data = new Uint8Array(size); crypto.getRandomValues(data); return Buffer.from(data.buffer); }; @@ -28,7 +28,7 @@ exports.randomBytes = function randomBytes(size) { if (!crypto.getRandomValues) { // Out of luck here. Use bad randomness for now. exports.randomBytes = function randomBytes(size) { - let data = Buffer.allocUnsafe(size); + const data = Buffer.allocUnsafe(size); for (let i = 0; i < data.length; i++) data[i] = Math.floor(Math.random() * 256); @@ -58,6 +58,6 @@ exports.randomInt = function randomInt() { */ exports.randomRange = function randomRange(min, max) { - let num = exports.randomInt(); + const num = exports.randomInt(); return Math.floor((num / 0x100000000) * (max - min) + min); }; diff --git a/lib/crypto/random.js b/lib/crypto/random.js index f2280a9ff..e98c29198 100644 --- a/lib/crypto/random.js +++ b/lib/crypto/random.js @@ -42,6 +42,6 @@ exports.randomInt = function randomInt() { */ exports.randomRange = function randomRange(min, max) { - let num = exports.randomInt(); + const num = exports.randomInt(); return Math.floor((num / 0x100000000) * (max - min) + min); }; diff --git a/lib/crypto/rsa-browser.js b/lib/crypto/rsa-browser.js index 897ec9b5e..6029fafc8 100644 --- a/lib/crypto/rsa-browser.js +++ b/lib/crypto/rsa-browser.js @@ -44,33 +44,31 @@ rsa.prefixes = { */ rsa.verify = function verify(alg, msg, sig, key) { - let prefix = rsa.prefixes[alg]; - let hash, len, pub; - let N, e, k, m, em, ok; - assert(typeof alg === 'string', 'No algorithm selected.'); assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(sig)); assert(Buffer.isBuffer(key)); + const prefix = rsa.prefixes[alg]; + if (!prefix) throw new Error('Unknown PKCS prefix.'); - hash = digest.hash(alg, msg); - len = prefix.length + hash.length; - pub = ASN1.parseRSAPublic(key); + const hash = digest.hash(alg, msg); + const len = prefix.length + hash.length; + const pub = ASN1.parseRSAPublic(key); - N = new BN(pub.modulus); - e = new BN(pub.publicExponent); - k = Math.ceil(N.bitLength() / 8); + const N = new BN(pub.modulus); + const e = new BN(pub.publicExponent); + const k = Math.ceil(N.bitLength() / 8); if (k < len + 11) throw new Error('Message too long.'); - m = rsa.encrypt(N, e, sig); - em = leftpad(m, k); + const m = rsa.encrypt(N, e, sig); + const em = leftpad(m, k); - ok = ceq(em[0], 0x00); + let ok = ceq(em[0], 0x00); ok &= ceq(em[1], 0x01); ok &= ccmp(em.slice(k - hash.length, k), hash); ok &= ccmp(em.slice(k - len, k - hash.length), prefix); @@ -91,29 +89,27 @@ rsa.verify = function verify(alg, msg, sig, key) { */ rsa.sign = function sign(alg, msg, key) { - let prefix = rsa.prefixes[alg]; - let hash, len, priv; - let N, D, k, em; - assert(typeof alg === 'string', 'No algorithm selected.'); assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(key)); + const prefix = rsa.prefixes[alg]; + if (!prefix) throw new Error('Unknown PKCS prefix.'); - hash = digest.hash(alg, msg); - len = prefix.length + hash.length; - priv = ASN1.parseRSAPrivate(key); + const hash = digest.hash(alg, msg); + const len = prefix.length + hash.length; + const priv = ASN1.parseRSAPrivate(key); - N = new BN(priv.modulus); - D = new BN(priv.privateExponent); - k = Math.ceil(N.bitLength() / 8); + const N = new BN(priv.modulus); + const D = new BN(priv.privateExponent); + const k = Math.ceil(N.bitLength() / 8); if (k < len + 11) throw new Error('Message too long.'); - em = Buffer.allocUnsafe(k); + const em = Buffer.allocUnsafe(k); em.fill(0); em[1] = 0x01; @@ -135,7 +131,7 @@ rsa.sign = function sign(alg, msg, key) { */ rsa.decrypt = function decrypt(N, D, m) { - let c = new BN(m); + const c = new BN(m); if (c.cmp(N) > 0) throw new Error('Cannot decrypt.'); @@ -144,7 +140,7 @@ rsa.decrypt = function decrypt(N, D, m) { .toRed(BN.red(N)) .redPow(D) .fromRed() - .toBuffer('be'); + .toArrayLike(Buffer, 'be'); }; /** @@ -160,7 +156,7 @@ rsa.encrypt = function encrypt(N, e, m) { .toRed(BN.red(N)) .redPow(e) .fromRed() - .toBuffer('be'); + .toArrayLike(Buffer, 'be'); }; /* @@ -169,12 +165,11 @@ rsa.encrypt = function encrypt(N, e, m) { function leftpad(input, size) { let n = input.length; - let out; if (n > size) n = size; - out = Buffer.allocUnsafe(size); + const out = Buffer.allocUnsafe(size); out.fill(0); input.copy(out, out.length - n); diff --git a/lib/crypto/rsa.js b/lib/crypto/rsa.js index 903049bb3..c8a3b57c2 100644 --- a/lib/crypto/rsa.js +++ b/lib/crypto/rsa.js @@ -24,17 +24,14 @@ const PEM = require('../utils/pem'); */ exports.verify = function verify(alg, msg, sig, key) { - let pem, name, ctx; - assert(typeof alg === 'string', 'No algorithm selected.'); assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(sig)); assert(Buffer.isBuffer(key)); - name = normalizeAlg('rsa', alg); - pem = PEM.encode(key, 'rsa', 'public key'); - - ctx = crypto.createVerify(name); + const name = normalizeAlg('rsa', alg); + const pem = PEM.encode(key, 'rsa', 'public key'); + const ctx = crypto.createVerify(name); try { ctx.update(msg); @@ -53,16 +50,14 @@ exports.verify = function verify(alg, msg, sig, key) { */ exports.sign = function sign(alg, msg, key) { - let pem, name, ctx; - assert(typeof alg === 'string', 'No algorithm selected.'); assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(key)); - name = normalizeAlg('rsa', alg); - pem = PEM.encode(key, 'rsa', 'private key'); + const name = normalizeAlg('rsa', alg); + const pem = PEM.encode(key, 'rsa', 'private key'); + const ctx = crypto.createSign(name); - ctx = crypto.createSign(name); ctx.update(msg); return ctx.sign(pem); diff --git a/lib/crypto/schnorr.js b/lib/crypto/schnorr.js index 74878277a..6aa21b0e4 100644 --- a/lib/crypto/schnorr.js +++ b/lib/crypto/schnorr.js @@ -28,9 +28,9 @@ const schnorr = exports; * @returns {Buffer} */ -schnorr.hash = function _hash(msg, r) { - let R = r.toBuffer('be', 32); - let B = POOL64; +schnorr.hash = function hash(msg, r) { + const R = r.toArrayLike(Buffer, 'be', 32); + const B = POOL64; R.copy(B, 0); msg.copy(B, 32); @@ -49,8 +49,6 @@ schnorr.hash = function _hash(msg, r) { */ schnorr.trySign = function trySign(msg, prv, k, pn) { - let r, h, s; - if (prv.cmpn(0) === 0) throw new Error('Bad private key.'); @@ -63,7 +61,7 @@ schnorr.trySign = function trySign(msg, prv, k, pn) { if (k.cmp(curve.n) >= 0) return null; - r = curve.g.mul(k); + let r = curve.g.mul(k); if (pn) r = r.add(pn); @@ -73,7 +71,7 @@ schnorr.trySign = function trySign(msg, prv, k, pn) { k = curve.n.sub(k); } - h = schnorr.hash(msg, r.getX()); + const h = schnorr.hash(msg, r.getX()); if (h.cmpn(0) === 0) return null; @@ -81,7 +79,7 @@ schnorr.trySign = function trySign(msg, prv, k, pn) { if (h.cmp(curve.n) >= 0) return null; - s = h.imul(prv); + let s = h.imul(prv); s = k.isub(s); s = s.umod(curve.n); @@ -100,16 +98,17 @@ schnorr.trySign = function trySign(msg, prv, k, pn) { */ schnorr.sign = function sign(msg, key, pubNonce) { - let prv = new BN(key); - let drbg = schnorr.drbg(msg, key, pubNonce); - let len = curve.n.byteLength(); - let k, pn, sig; + const prv = new BN(key); + const drbg = schnorr.drbg(msg, key, pubNonce); + const len = curve.n.byteLength(); + let pn; if (pubNonce) pn = curve.decodePoint(pubNonce); + let sig; while (!sig) { - k = new BN(drbg.generate(len)); + const k = new BN(drbg.generate(len)); sig = schnorr.trySign(msg, prv, k, pn); } @@ -125,9 +124,8 @@ schnorr.sign = function sign(msg, key, pubNonce) { */ schnorr.verify = function verify(msg, signature, key) { - let sig = new Signature(signature); - let h = schnorr.hash(msg, sig.r); - let k, l, r, rl; + const sig = new Signature(signature); + const h = schnorr.hash(msg, sig.r); if (h.cmp(curve.n) >= 0) throw new Error('Invalid hash.'); @@ -141,10 +139,10 @@ schnorr.verify = function verify(msg, signature, key) { if (sig.r.cmp(curve.p) > 0) throw new Error('Invalid R value.'); - k = curve.decodePoint(key); - l = k.mul(h); - r = curve.g.mul(sig.s); - rl = l.add(r); + const k = curve.decodePoint(key); + const l = k.mul(h); + const r = curve.g.mul(sig.s); + const rl = l.add(r); if (rl.y.isOdd()) throw new Error('Odd R value.'); @@ -160,9 +158,8 @@ schnorr.verify = function verify(msg, signature, key) { */ schnorr.recover = function recover(signature, msg) { - let sig = new Signature(signature); - let h = schnorr.hash(msg, sig.r); - let hinv, s, R, l, r, k, rl; + const sig = new Signature(signature); + const h = schnorr.hash(msg, sig.r); if (h.cmp(curve.n) >= 0) throw new Error('Invalid hash.'); @@ -176,24 +173,25 @@ schnorr.recover = function recover(signature, msg) { if (sig.r.cmp(curve.p) > 0) throw new Error('Invalid R value.'); - hinv = h.invm(curve.n); + let hinv = h.invm(curve.n); hinv = hinv.umod(curve.n); - s = sig.s; + let s = sig.s; s = curve.n.sub(s); s = s.umod(curve.n); s = s.imul(hinv); s = s.umod(curve.n); - R = curve.pointFromX(sig.r, false); - l = R.mul(hinv); - r = curve.g.mul(s); - k = l.add(r); + const R = curve.pointFromX(sig.r, false); + let l = R.mul(hinv); + let r = curve.g.mul(s); + const k = l.add(r); l = k.mul(h); r = curve.g.mul(sig.s); - rl = l.add(r); + + const rl = l.add(r); if (rl.y.isOdd()) throw new Error('Odd R value.'); @@ -215,7 +213,7 @@ schnorr.combineSigs = function combineSigs(sigs) { let r, last; for (let i = 0; i < sigs.length; i++) { - let sig = new Signature(sigs[i]); + const sig = new Signature(sigs[i]); if (sig.s.cmpn(0) === 0) throw new Error('Bad S value.'); @@ -248,18 +246,16 @@ schnorr.combineSigs = function combineSigs(sigs) { */ schnorr.combineKeys = function combineKeys(keys) { - let i, key, point; - if (keys.length === 0) throw new Error(); if (keys.length === 1) return keys[0]; - point = curve.decodePoint(keys[0]); + let point = curve.decodePoint(keys[0]); - for (i = 1; i < keys.length; i++) { - key = curve.decodePoint(keys[i]); + for (let i = 1; i < keys.length; i++) { + const key = curve.decodePoint(keys[i]); point = point.add(key); } @@ -276,10 +272,10 @@ schnorr.combineKeys = function combineKeys(keys) { */ schnorr.partialSign = function partialSign(msg, priv, privNonce, pubNonce) { - let prv = new BN(priv); - let k = new BN(privNonce); - let pn = curve.decodePoint(pubNonce); - let sig = schnorr.trySign(msg, prv, k, pn); + const prv = new BN(priv); + const k = new BN(privNonce); + const pn = curve.decodePoint(pubNonce); + const sig = schnorr.trySign(msg, prv, k, pn); if (!sig) throw new Error('Bad K value.'); @@ -303,7 +299,7 @@ schnorr.alg = Buffer.from('Schnorr+SHA256 ', 'ascii'); */ schnorr.drbg = function drbg(msg, priv, data) { - let pers = Buffer.allocUnsafe(48); + const pers = Buffer.allocUnsafe(48); pers.fill(0); @@ -326,10 +322,10 @@ schnorr.drbg = function drbg(msg, priv, data) { */ schnorr.generateNoncePair = function generateNoncePair(msg, priv, data) { - let drbg = schnorr.drbg(msg, priv, data); - let len = curve.n.byteLength(); - let k; + const drbg = schnorr.drbg(msg, priv, data); + const len = curve.n.byteLength(); + let k; for (;;) { k = new BN(drbg.generate(len)); diff --git a/lib/crypto/scrypt.js b/lib/crypto/scrypt.js index 2c3170675..b07dedc60 100644 --- a/lib/crypto/scrypt.js +++ b/lib/crypto/scrypt.js @@ -31,6 +31,8 @@ * SUCH DAMAGE. */ +/* eslint camelcase: "off" */ + 'use strict'; /** @@ -56,8 +58,6 @@ const native = require('../native').binding; */ function derive(passwd, salt, N, r, p, len) { - let B, V, XY; - if (r * p >= (1 << 30)) throw new Error('EFBIG'); @@ -67,10 +67,10 @@ function derive(passwd, salt, N, r, p, len) { if (N > 0xffffffff) throw new Error('EINVAL'); - XY = Buffer.allocUnsafe(256 * r); - V = Buffer.allocUnsafe(128 * r * N); + const XY = Buffer.allocUnsafe(256 * r); + const V = Buffer.allocUnsafe(128 * r * N); - B = pbkdf2.derive(passwd, salt, 1, p * 128 * r, 'sha256'); + const B = pbkdf2.derive(passwd, salt, 1, p * 128 * r, 'sha256'); for (let i = 0; i < p; i++) smix(B, i * 128 * r, r, N, V, XY); @@ -95,8 +95,6 @@ if (native) */ async function deriveAsync(passwd, salt, N, r, p, len) { - let B, V, XY; - if (r * p >= (1 << 30)) throw new Error('EFBIG'); @@ -106,10 +104,10 @@ async function deriveAsync(passwd, salt, N, r, p, len) { if (N > 0xffffffff) throw new Error('EINVAL'); - XY = Buffer.allocUnsafe(256 * r); - V = Buffer.allocUnsafe(128 * r * N); + const XY = Buffer.allocUnsafe(256 * r); + const V = Buffer.allocUnsafe(128 * r * N); - B = await pbkdf2.deriveAsync(passwd, salt, 1, p * 128 * r, 'sha256'); + const B = await pbkdf2.deriveAsync(passwd, salt, 1, p * 128 * r, 'sha256'); for (let i = 0; i < p; i++) await smixAsync(B, i * 128 * r, r, N, V, XY); @@ -125,8 +123,8 @@ if (native) */ function salsa20_8(B) { - let B32 = new Uint32Array(16); - let x = new Uint32Array(16); + const B32 = new Uint32Array(16); + const x = new Uint32Array(16); for (let i = 0; i < 16; i++) B32[i] = B.readUInt32LE(i * 4, true); @@ -188,7 +186,7 @@ function R(a, b) { } function blockmix_salsa8(B, Y, Yo, r) { - let X = Buffer.allocUnsafe(64); + const X = Buffer.allocUnsafe(64); blkcpy(X, B, 0, (2 * r - 1) * 64, 64); @@ -210,8 +208,8 @@ function integerify(B, r) { } function smix(B, Bo, r, N, V, XY) { - let X = XY; - let Y = XY; + const X = XY; + const Y = XY; blkcpy(X, B, 0, Bo, 128 * r); @@ -221,7 +219,7 @@ function smix(B, Bo, r, N, V, XY) { } for (let i = 0; i < N; i++) { - let j = integerify(X, r) & (N - 1); + const j = integerify(X, r) & (N - 1); blkxor(X, V, 0, j * (128 * r), 128 * r); blockmix_salsa8(X, Y, 128 * r, r); } @@ -230,8 +228,8 @@ function smix(B, Bo, r, N, V, XY) { } async function smixAsync(B, Bo, r, N, V, XY) { - let X = XY; - let Y = XY; + const X = XY; + const Y = XY; blkcpy(X, B, 0, Bo, 128 * r); @@ -242,7 +240,7 @@ async function smixAsync(B, Bo, r, N, V, XY) { } for (let i = 0; i < N; i++) { - let j = integerify(X, r) & (N - 1); + const j = integerify(X, r) & (N - 1); blkxor(X, V, 0, j * (128 * r), 128 * r); blockmix_salsa8(X, Y, 128 * r, r); await co.wait(); diff --git a/lib/crypto/secp256k1-browser.js b/lib/crypto/secp256k1-browser.js index 37936502f..be0a30205 100644 --- a/lib/crypto/secp256k1-browser.js +++ b/lib/crypto/secp256k1-browser.js @@ -34,8 +34,8 @@ ec.binding = false; */ ec.generatePrivateKey = function generatePrivateKey() { - let key = secp256k1.genKeyPair(); - return key.getPrivate().toBuffer('be', 32); + const key = secp256k1.genKeyPair(); + return key.getPrivate().toArrayLike(Buffer, 'be', 32); }; /** @@ -46,14 +46,12 @@ ec.generatePrivateKey = function generatePrivateKey() { */ ec.publicKeyCreate = function publicKeyCreate(priv, compress) { - let key; - assert(Buffer.isBuffer(priv)); if (compress == null) compress = true; - key = secp256k1.keyPair({ priv: priv }); + const key = secp256k1.keyPair({ priv: priv }); return Buffer.from(key.getPublic(compress, 'array')); }; @@ -65,7 +63,7 @@ ec.publicKeyCreate = function publicKeyCreate(priv, compress) { */ ec.publicKeyConvert = function publicKeyConvert(key, compress) { - let point = curve.decodePoint(key); + const point = curve.decodePoint(key); if (compress == null) compress = true; @@ -81,10 +79,10 @@ ec.publicKeyConvert = function publicKeyConvert(key, compress) { */ ec.privateKeyTweakAdd = function privateKeyTweakAdd(privateKey, tweak) { - let key = new BN(tweak) + const key = new BN(tweak) .add(new BN(privateKey)) .mod(curve.n) - .toBuffer('be', 32); + .toArrayLike(Buffer, 'be', 32); // Only a 1 in 2^127 chance of happening. if (!ec.privateKeyVerify(key)) @@ -101,14 +99,13 @@ ec.privateKeyTweakAdd = function privateKeyTweakAdd(privateKey, tweak) { */ ec.publicKeyTweakAdd = function publicKeyTweakAdd(publicKey, tweak, compress) { - let key = curve.decodePoint(publicKey); - let point = curve.g.mul(new BN(tweak)).add(key); - let pub; + const key = curve.decodePoint(publicKey); + const point = curve.g.mul(new BN(tweak)).add(key); if (compress == null) compress = true; - pub = Buffer.from(point.encode('array', compress)); + const pub = Buffer.from(point.encode('array', compress)); if (!ec.publicKeyVerify(pub)) throw new Error('Public key is invalid.'); @@ -126,7 +123,7 @@ ec.publicKeyTweakAdd = function publicKeyTweakAdd(publicKey, tweak, compress) { ec.ecdh = function ecdh(pub, priv) { priv = secp256k1.keyPair({ priv: priv }); pub = secp256k1.keyPair({ pub: pub }); - return priv.derive(pub.getPublic()).toBuffer('be', 32); + return priv.derive(pub.getPublic()).toArrayLike(Buffer, 'be', 32); }; /** @@ -139,18 +136,17 @@ ec.ecdh = function ecdh(pub, priv) { */ ec.recover = function recover(msg, sig, j, compress) { - let point; - if (!j) j = 0; if (compress == null) compress = true; + let point; try { point = secp256k1.recoverPubKey(msg, sig, j); } catch (e) { - return; + return null; } return Buffer.from(point.encode('array', compress)); @@ -195,7 +191,8 @@ ec.verify = function verify(msg, sig, key) { ec.publicKeyVerify = function publicKeyVerify(key) { try { - return secp256k1.keyPair({ pub: key }).validate(); + const pub = secp256k1.keyPair({ pub: key }); + return pub.validate(); } catch (e) { return false; } @@ -224,13 +221,11 @@ ec.privateKeyVerify = function privateKeyVerify(key) { */ ec.sign = function sign(msg, key) { - let sig; - assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(key)); // Sign message and ensure low S value - sig = secp256k1.sign(msg, key, { canonical: true }); + const sig = secp256k1.sign(msg, key, { canonical: true }); // Convert to DER return Buffer.from(sig.toDER()); @@ -238,20 +233,18 @@ ec.sign = function sign(msg, key) { /** * Convert DER signature to R/S. - * @param {Buffer} sig + * @param {Buffer} raw * @returns {Buffer} R/S-formatted signature. */ -ec.fromDER = function fromDER(sig) { - let out; +ec.fromDER = function fromDER(raw) { + assert(Buffer.isBuffer(raw)); - assert(Buffer.isBuffer(sig)); + const sig = new Signature(raw); + const out = Buffer.allocUnsafe(64); - sig = new Signature(sig); - out = Buffer.allocUnsafe(64); - - sig.r.toBuffer('be', 32).copy(out, 0); - sig.s.toBuffer('be', 32).copy(out, 32); + sig.r.toArrayLike(Buffer, 'be', 32).copy(out, 0); + sig.s.toArrayLike(Buffer, 'be', 32).copy(out, 32); return out; }; @@ -262,17 +255,15 @@ ec.fromDER = function fromDER(sig) { * @returns {Buffer} DER-formatted signature. */ -ec.toDER = function toDER(sig) { - let out; +ec.toDER = function toDER(raw) { + assert(Buffer.isBuffer(raw)); - assert(Buffer.isBuffer(sig)); - - out = new Signature({ - r: new BN(sig.slice(0, 32), 'be'), - s: new BN(sig.slice(32, 64), 'be') + const sig = new Signature({ + r: new BN(raw.slice(0, 32), 'be'), + s: new BN(raw.slice(32, 64), 'be') }); - return Buffer.from(out.toDER()); + return Buffer.from(sig.toDER()); }; /** @@ -281,9 +272,10 @@ ec.toDER = function toDER(sig) { * @returns {Boolean} */ -ec.isLowS = function isLowS(sig) { +ec.isLowS = function isLowS(raw) { + let sig; try { - sig = new Signature(sig); + sig = new Signature(raw); } catch (e) { return false; } @@ -305,48 +297,50 @@ ec.isLowS = function isLowS(sig) { function normalizeLength(sig) { let data = sig; - let p = { place: 0 }; - let len, rlen, slen; + let pos = 0; + let len; - if (data[p.place++] !== 0x30) + if (data[pos++] !== 0x30) return sig; - len = getLength(data, p); + [len, pos] = getLength(data, pos); - if (data.length > len + p.place) - data = data.slice(0, len + p.place); + if (data.length > len + pos) + data = data.slice(0, len + pos); - if (data[p.place++] !== 0x02) + if (data[pos++] !== 0x02) return sig; - rlen = getLength(data, p); - p.place += rlen; + // R length. + [len, pos] = getLength(data, pos); - if (data[p.place++] !== 0x02) + pos += len; + + if (data[pos++] !== 0x02) return sig; - slen = getLength(data, p); - if (data.length > slen + p.place) - data = data.slice(0, slen + p.place); + // S length. + [len, pos] = getLength(data, pos); + + if (data.length > len + pos) + data = data.slice(0, len + pos); return data; } -function getLength(buf, p) { - let initial = buf[p.place++]; - let len = initial & 0xf; - let off = p.place; - let val = 0; +function getLength(buf, pos) { + const initial = buf[pos++]; if (!(initial & 0x80)) - return initial; + return [initial, pos]; + + const len = initial & 0xf; + let val = 0; - for (let i = 0; i < len; i++, off++) { + for (let i = 0; i < len; i++) { val <<= 8; - val |= buf[off]; + val |= buf[pos++]; } - p.place = off; - - return val; + return [val, pos]; } diff --git a/lib/crypto/secp256k1-native.js b/lib/crypto/secp256k1-native.js index 10738a93e..139032a5f 100644 --- a/lib/crypto/secp256k1-native.js +++ b/lib/crypto/secp256k1-native.js @@ -105,7 +105,7 @@ ec.publicKeyTweakAdd = function publicKeyTweakAdd(publicKey, tweak, compress) { */ ec.ecdh = function ecdh(pub, priv) { - let point = secp256k1.ecdhUnsafe(pub, priv, true); + const point = secp256k1.ecdhUnsafe(pub, priv, true); return point.slice(1, 33); }; @@ -127,13 +127,13 @@ ec.recover = function recover(msg, sig, j, compress) { try { sig = secp256k1.signatureImport(sig); } catch (e) { - return; + return null; } try { key = secp256k1.recover(msg, sig, j, compress); } catch (e) { - return; + return null; } return key; @@ -195,13 +195,11 @@ ec.privateKeyVerify = function privateKeyVerify(key) { */ ec.sign = function sign(msg, key) { - let sig; - assert(Buffer.isBuffer(msg)); assert(Buffer.isBuffer(key)); // Sign message - sig = secp256k1.sign(msg, key); + let sig = secp256k1.sign(msg, key); // Ensure low S value sig = secp256k1.signatureNormalize(sig.signature); @@ -239,10 +237,10 @@ ec.toDER = function toDER(sig) { */ ec.isLowS = function isLowS(sig) { - let rs, s; + let s; try { - rs = secp256k1.signatureImport(sig); + const rs = secp256k1.signatureImport(sig); s = rs.slice(32, 64); } catch (e) { return false; diff --git a/lib/crypto/secp256k1.js b/lib/crypto/secp256k1.js index 328133069..d2ee2f834 100644 --- a/lib/crypto/secp256k1.js +++ b/lib/crypto/secp256k1.js @@ -8,7 +8,7 @@ let native; -if (+process.env.BCOIN_NO_SECP256K1 !== 1) { +if (Number(process.env.BCOIN_NO_SECP256K1) !== 1) { try { native = require('secp256k1/bindings'); } catch (e) { diff --git a/lib/crypto/sha256.js b/lib/crypto/sha256.js index ae292dbd5..9a25ade1e 100644 --- a/lib/crypto/sha256.js +++ b/lib/crypto/sha256.js @@ -103,7 +103,7 @@ SHA256.prototype.finish = function finish() { * @param {Number} len */ -SHA256.prototype._update = function update(data, len) { +SHA256.prototype._update = function _update(data, len) { let size = this.bytes & 0x3f; let pos = 0; @@ -167,6 +167,7 @@ SHA256.prototype._finish = function _finish(out) { */ SHA256.prototype.transform = function transform(chunk, pos) { + const w = this.w; let a = this.s[0]; let b = this.s[1]; let c = this.s[2]; @@ -175,7 +176,6 @@ SHA256.prototype.transform = function transform(chunk, pos) { let f = this.s[5]; let g = this.s[6]; let h = this.s[7]; - let w = this.w; let i = 0; for (; i < 16; i++) @@ -185,13 +185,11 @@ SHA256.prototype.transform = function transform(chunk, pos) { w[i] = sigma1(w[i - 2]) + w[i - 7] + sigma0(w[i - 15]) + w[i - 16]; for (i = 0; i < 64; i++) { - let t1, t2; - - t1 = h + Sigma1(e); + let t1 = h + Sigma1(e); t1 += Ch(e, f, g); t1 += K[i] + w[i]; - t2 = Sigma0(a); + let t2 = Sigma0(a); t2 += Maj(a, b, c); h = g; @@ -248,7 +246,7 @@ function SHA256Hmac() { */ SHA256Hmac.prototype.init = function init(data) { - let key = BUFFER64; + const key = BUFFER64; if (data.length > 64) { this.inner.init(); @@ -363,7 +361,7 @@ function sha256(data) { */ function hash256(data) { - let out = Buffer.allocUnsafe(32); + const out = Buffer.allocUnsafe(32); ctx.init(); ctx.update(data); ctx._finish(out); diff --git a/lib/crypto/siphash.js b/lib/crypto/siphash.js index fb28b7803..08b5c4b31 100644 --- a/lib/crypto/siphash.js +++ b/lib/crypto/siphash.js @@ -24,27 +24,26 @@ const native = require('../native').binding; */ function siphash24(data, key, shift) { - let blocks = Math.floor(data.length / 8); - let c0 = U64(0x736f6d65, 0x70736575); - let c1 = U64(0x646f7261, 0x6e646f6d); - let c2 = U64(0x6c796765, 0x6e657261); - let c3 = U64(0x74656462, 0x79746573); - let f0 = U64(blocks << (shift - 32), 0); - let f1 = U64(0, 0xff); - let k0 = U64.fromRaw(key, 0); - let k1 = U64.fromRaw(key, 8); - let p = 0; - let v0, v1, v2, v3; + const blocks = Math.floor(data.length / 8); + const c0 = U64(0x736f6d65, 0x70736575); + const c1 = U64(0x646f7261, 0x6e646f6d); + const c2 = U64(0x6c796765, 0x6e657261); + const c3 = U64(0x74656462, 0x79746573); + const f0 = U64(blocks << (shift - 32), 0); + const f1 = U64(0, 0xff); + const k0 = U64.fromRaw(key, 0); + const k1 = U64.fromRaw(key, 8); // Init - v0 = c0.ixor(k0); - v1 = c1.ixor(k1); - v2 = c2.ixor(k0); - v3 = c3.ixor(k1); + const v0 = c0.ixor(k0); + const v1 = c1.ixor(k1); + const v2 = c2.ixor(k0); + const v3 = c3.ixor(k1); // Blocks + let p = 0; for (let i = 0; i < blocks; i++) { - let d = U64.fromRaw(data, p); + const d = U64.fromRaw(data, p); p += 8; v3.ixor(d); sipround(v0, v1, v2, v3); @@ -152,19 +151,18 @@ function U64(hi, lo) { } U64.prototype.iadd = function iadd(b) { - let a = this; - let hi, lo, as, bs, s, c; + const a = this; // Credit to @indutny for this method. - lo = (a.lo + b.lo) | 0; + const lo = (a.lo + b.lo) | 0; - s = lo >> 31; - as = a.lo >> 31; - bs = b.lo >> 31; + const s = lo >> 31; + const as = a.lo >> 31; + const bs = b.lo >> 31; - c = ((as & bs) | (~s & (as ^ bs))) & 1; + const c = ((as & bs) | (~s & (as ^ bs))) & 1; - hi = ((a.hi + b.hi) | 0) + c; + const hi = ((a.hi + b.hi) | 0) + c; a.hi = hi | 0; a.lo = lo; @@ -214,8 +212,8 @@ U64.prototype.irotl = function irotl(bits) { }; U64.fromRaw = function fromRaw(data, off) { - let lo = data.readUInt32LE(off, true); - let hi = data.readUInt32LE(off + 4, true); + const lo = data.readUInt32LE(off, true); + const hi = data.readUInt32LE(off + 4, true); return new U64(hi, lo); }; diff --git a/lib/db/ldb.js b/lib/db/ldb.js index 8f9f42277..fc0294e6a 100644 --- a/lib/db/ldb.js +++ b/lib/db/ldb.js @@ -19,9 +19,9 @@ const backends = require('./backends'); */ function LDB(options) { - let result = LDB.getBackend(options); - let backend = result.backend; - let location = result.location; + const result = LDB.getBackend(options); + const backend = result.backend; + const location = result.location; return new LowlevelUp(backend, location, options); } @@ -78,8 +78,8 @@ LDB.getName = function getName(db) { */ LDB.getBackend = function getBackend(options) { - let [name, ext] = LDB.getName(options.db); - let backend = backends.get(name); + const [name, ext] = LDB.getName(options.db); + const backend = backends.get(name); let location = options.location; if (typeof location !== 'string') { diff --git a/lib/db/level.js b/lib/db/level.js index 9e82b10bd..b033acd83 100644 --- a/lib/db/level.js +++ b/lib/db/level.js @@ -22,7 +22,7 @@ DB.prototype.get = function get(key, options, callback) { this.level.get(key, options, callback); }; -DB.prototype.put = function get(key, value, options, callback) { +DB.prototype.put = function put(key, value, options, callback) { if (this.bufferKeys && Buffer.isBuffer(key)) key = key.toString('hex'); this.level.put(key, value, options, callback); @@ -39,13 +39,15 @@ DB.prototype.batch = function batch(ops, options, callback) { return new Batch(this); if (this.bufferKeys) { - for (let op of ops) { + for (const op of ops) { if (Buffer.isBuffer(op.key)) op.key = op.key.toString('hex'); } } this.level.batch(ops, options, callback); + + return undefined; }; DB.prototype.iterator = function iterator(options) { @@ -142,8 +144,10 @@ Iterator.prototype.seek = function seek(key) { }; Iterator.prototype.end = function end(callback) { - if (this._end) - return callback(new Error('end() already called on iterator.')); + if (this._end) { + callback(new Error('end() already called on iterator.')); + return; + } this._end = true; this.iter.end(callback); }; diff --git a/lib/db/lowlevelup.js b/lib/db/lowlevelup.js index d1685f0ce..8e6e3cecb 100644 --- a/lib/db/lowlevelup.js +++ b/lib/db/lowlevelup.js @@ -58,8 +58,8 @@ function LowlevelUp(backend, location, options) { */ LowlevelUp.prototype.init = function init() { - let backend = this.backend; - let db = new backend(this.location); + const Backend = this.backend; + let db = new Backend(this.location); let binding = db; // Stay as close to the metal as possible. @@ -93,7 +93,7 @@ LowlevelUp.prototype.init = function init() { */ LowlevelUp.prototype.open = async function open() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._open(); } finally { @@ -108,7 +108,7 @@ LowlevelUp.prototype.open = async function open() { * @returns {Promise} */ -LowlevelUp.prototype._open = async function open() { +LowlevelUp.prototype._open = async function _open() { if (this.loaded) throw new Error('Database is already open.'); @@ -135,7 +135,7 @@ LowlevelUp.prototype._open = async function open() { */ LowlevelUp.prototype.close = async function close() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._close(); } finally { @@ -150,7 +150,7 @@ LowlevelUp.prototype.close = async function close() { * @returns {Promise} */ -LowlevelUp.prototype._close = async function close() { +LowlevelUp.prototype._close = async function _close() { if (!this.loaded) throw new Error('Database is already closed.'); @@ -271,7 +271,7 @@ LowlevelUp.prototype.get = function get(key) { this.binding.get(key, (err, result) => { if (err) { if (isNotFound(err)) { - resolve(); + resolve(null); return; } reject(err); @@ -429,7 +429,7 @@ LowlevelUp.prototype.compactRange = function compactRange(start, end) { */ LowlevelUp.prototype.has = async function has(key) { - let value = await this.get(key); + const value = await this.get(key); return value != null; }; @@ -441,10 +441,10 @@ LowlevelUp.prototype.has = async function has(key) { */ LowlevelUp.prototype.range = async function range(options) { - let items = []; - let parse = options.parse; + const items = []; + const parse = options.parse; - let iter = this.iterator({ + const iter = this.iterator({ gte: options.gte, lte: options.lte, keys: true, @@ -480,11 +480,11 @@ LowlevelUp.prototype.range = async function range(options) { * @returns {Promise} - Returns Array. */ -LowlevelUp.prototype.keys = async function _keys(options) { - let keys = []; - let parse = options.parse; +LowlevelUp.prototype.keys = async function keys(options) { + const items = []; + const parse = options.parse; - let iter = this.iterator({ + const iter = this.iterator({ gte: options.gte, lte: options.lte, keys: true, @@ -492,13 +492,12 @@ LowlevelUp.prototype.keys = async function _keys(options) { }); for (;;) { - let item = await iter.next(); - let key; + const item = await iter.next(); if (!item) break; - key = item.key; + let key = item.key; if (parse) { try { @@ -510,10 +509,10 @@ LowlevelUp.prototype.keys = async function _keys(options) { } if (key) - keys.push(key); + items.push(key); } - return keys; + return items; }; /** @@ -523,11 +522,11 @@ LowlevelUp.prototype.keys = async function _keys(options) { * @returns {Promise} - Returns Array. */ -LowlevelUp.prototype.values = async function _values(options) { - let values = []; - let parse = options.parse; +LowlevelUp.prototype.values = async function values(options) { + const items = []; + const parse = options.parse; - let iter = this.iterator({ + const iter = this.iterator({ gte: options.gte, lte: options.lte, keys: false, @@ -535,13 +534,12 @@ LowlevelUp.prototype.values = async function _values(options) { }); for (;;) { - let item = await iter.next(); - let value; + const item = await iter.next(); if (!item) break; - value = item.value; + let value = item.value; if (parse) { try { @@ -553,10 +551,10 @@ LowlevelUp.prototype.values = async function _values(options) { } if (value) - values.push(value); + items.push(value); } - return values; + return items; }; /** @@ -566,17 +564,16 @@ LowlevelUp.prototype.values = async function _values(options) { */ LowlevelUp.prototype.dump = async function dump() { - let records = {}; + const records = Object.create(null); - let items = await this.range({ + const items = await this.range({ gte: LOW, lte: HIGH }); - for (let i = 0; i < items.length; i++) { - let item = items[i]; - let key = item.key.toString('hex'); - let value = item.value.toString('hex'); + for (const item of items) { + const key = item.key.toString('hex'); + const value = item.value.toString('hex'); records[key] = value; } @@ -614,30 +611,29 @@ LowlevelUp.prototype.checkVersion = async function checkVersion(key, version) { */ LowlevelUp.prototype.clone = async function clone(path) { - let options = new LLUOptions(this.options); - let hwm = 256 << 20; - let total = 0; - let tmp, batch, iter; - if (!this.loaded) throw new Error('Database is closed.'); + const options = new LLUOptions(this.options); + const hwm = 256 << 20; + options.createIfMissing = true; options.errorIfExists = true; - tmp = new LowlevelUp(this.backend, path, options); + const tmp = new LowlevelUp(this.backend, path, options); await tmp.open(); - batch = tmp.batch(); + let batch = tmp.batch(); + let total = 0; - iter = this.iterator({ + const iter = this.iterator({ keys: true, values: true }); for (;;) { - let item = await iter.next(); + const item = await iter.next(); if (!item) break; diff --git a/lib/db/memdb.js b/lib/db/memdb.js index 73750a16e..4fc4dc53b 100644 --- a/lib/db/memdb.js +++ b/lib/db/memdb.js @@ -37,17 +37,15 @@ function MemDB(location) { */ MemDB.prototype.search = function search(key) { - let node; - if (typeof key === 'string') key = Buffer.from(key, 'utf8'); assert(Buffer.isBuffer(key), 'Key must be a Buffer.'); - node = this.tree.search(key); + const node = this.tree.search(key); if (!node) - return; + return undefined; return node.value; }; @@ -145,12 +143,10 @@ MemDB.prototype.close = function close(callback) { * Retrieve a record (leveldown method). * @param {Buffer|String} key * @param {Object?} options - * @param {Function} callback - Returns Bufer. + * @param {Function} callback - Returns Buffer. */ MemDB.prototype.get = function get(key, options, callback) { - let value; - if (!callback) { callback = options; options = null; @@ -159,10 +155,10 @@ MemDB.prototype.get = function get(key, options, callback) { if (!options) options = {}; - value = this.search(key); + let value = this.search(key); if (!value) { - let err = new Error('MEMDB_NOTFOUND: Key not found.'); + const err = new Error('MEMDB_NOTFOUND: Key not found.'); err.notFound = true; err.type = 'NotFoundError'; setImmediate(() => callback(err)); @@ -220,23 +216,21 @@ MemDB.prototype.del = function del(key, options, callback) { * @param {Function} callback */ -MemDB.prototype.batch = function _batch(ops, options, callback) { - let batch; - +MemDB.prototype.batch = function batch(ops, options, callback) { if (!callback) { callback = options; options = null; } - batch = new Batch(this, options); + const b = new Batch(this, options); if (ops) { - batch.ops = ops; - batch.write(callback); - return; + b.ops = ops; + b.write(callback); + return undefined; } - return batch; + return b; }; /** @@ -267,10 +261,10 @@ MemDB.prototype.getProperty = function getProperty(name) { */ MemDB.prototype.approximateSize = function approximateSize(start, end, callback) { - let items = this.range(start, end); + const items = this.range(start, end); let size = 0; - for (let item of items) { + for (const item of items) { size += item.key.length; size += item.value.length; } @@ -345,10 +339,10 @@ Batch.prototype.del = function del(key) { Batch.prototype.write = function write(callback) { if (this.written) { setImmediate(() => callback(new Error('Already written.'))); - return; + return this; } - for (let op of this.ops) { + for (const op of this.ops) { switch (op.type) { case 'put': this.db.insert(op.key, op.value); @@ -358,7 +352,7 @@ Batch.prototype.write = function write(callback) { break; default: setImmediate(() => callback(new Error('Bad op.'))); - return; + return this; } } @@ -419,8 +413,8 @@ function Iterator(db, options) { */ Iterator.prototype.init = function init() { - let snapshot = this.db.tree.snapshot(); - let iter = this.db.tree.iterator(snapshot); + const snapshot = this.db.tree.snapshot(); + const iter = this.db.tree.iterator(snapshot); if (this.options.reverse) { if (this.options.end) { @@ -453,15 +447,15 @@ Iterator.prototype.init = function init() { */ Iterator.prototype.next = function next(callback) { - let options = this.options; - let iter = this.iter; - let key, value, result; + const options = this.options; + const iter = this.iter; if (!this.iter) { setImmediate(() => callback(new Error('Cannot call next.'))); return; } + let result; if (options.reverse) { result = iter.prev(); @@ -505,8 +499,8 @@ Iterator.prototype.next = function next(callback) { this.total += 1; } - key = iter.key; - value = iter.value; + let key = iter.key; + let value = iter.value; if (!options.keys) key = DUMMY; diff --git a/lib/hd/common.js b/lib/hd/common.js index a8c9f180c..659a6f347 100644 --- a/lib/hd/common.js +++ b/lib/hd/common.js @@ -6,6 +6,7 @@ 'use strict'; +const assert = require('assert'); const LRU = require('../utils/lru'); const common = exports; @@ -17,14 +18,6 @@ const common = exports; common.HARDENED = 0x80000000; -/** - * Max index (u32max + 1). - * @const {Number} - * @default - */ - -common.MAX_INDEX = 0x100000000; - /** * Min entropy bits. * @const {Number} @@ -41,14 +34,6 @@ common.MIN_ENTROPY = 128; common.MAX_ENTROPY = 512; -/** - * Seed salt for key derivation ("Bitcoin seed"). - * @const {Buffer} - * @default - */ - -common.SEED_SALT = Buffer.from('Bitcoin seed', 'ascii'); - /** * LRU cache to avoid deriving keys twice. * @type {LRU} @@ -60,41 +45,54 @@ common.cache = new LRU(500); * Parse a derivation path and return an array of indexes. * @see https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki * @param {String} path - * @param {Number?} max - Max index. + * @param {Boolean} hard * @returns {Number[]} */ -common.parsePath = function parsePath(path, max) { - let parts = path.split('/'); - let root = parts.shift(); - let result = []; +common.parsePath = function parsePath(path, hard) { + assert(typeof path === 'string'); + assert(typeof hard === 'boolean'); + assert(path.length >= 1); + assert(path.length <= 3062); - if (max == null) - max = common.MAX_INDEX; + const parts = path.split('/'); + const root = parts[0]; if (root !== 'm' && root !== 'M' && root !== 'm\'' && root !== 'M\'') { - throw new Error('Bad path root.'); + throw new Error('Invalid path root.'); } - for (let index of parts) { - let hardened = index[index.length - 1] === '\''; + const result = []; + + for (let i = 1; i < parts.length; i++) { + let part = parts[i]; + + const hardened = part[part.length - 1] === '\''; if (hardened) - index = index.slice(0, -1); + part = part.slice(0, -1); - if (!/^\d+$/.test(index)) - throw new Error('Non-number path index.'); + if (part.length > 10) + throw new Error('Path index too large.'); - index = parseInt(index, 10); + if (!/^\d+$/.test(part)) + throw new Error('Path index is non-numeric.'); - if (hardened) - index += common.HARDENED; + let index = parseInt(part, 10); + + if ((index >>> 0) !== index) + throw new Error('Path index out of range.'); - if (!(index >= 0 && index < max)) - throw new Error('Index out of range.'); + if (hardened) { + index |= common.HARDENED; + index >>>= 0; + } + + if (!hard && (index & common.HARDENED)) + throw new Error('Path index cannot be hardened.'); result.push(index); } @@ -111,7 +109,7 @@ common.parsePath = function parsePath(path, max) { common.isMaster = function isMaster(key) { return key.depth === 0 && key.childIndex === 0 - && key.parentFingerPrint.readUInt32LE(0, true) === 0; + && key.parentFingerPrint === 0; }; /** @@ -121,20 +119,11 @@ common.isMaster = function isMaster(key) { * @returns {Boolean} */ -common.isBIP44 = function isBIP44(key, account) { +common.isAccount = function isAccount(key, account) { if (account != null) { - if (key.childIndex !== common.HARDENED + account) + const index = (common.HARDENED | account) >>> 0; + if (key.childIndex !== index) return false; } - return key.depth === 3 && key.childIndex >= common.HARDENED; -}; - -/** - * Test whether the key is a BIP45 purpose key. - * @param {HDPrivateKey|HDPublicKey} key - * @returns {Boolean} - */ - -common.isBIP45 = function isBIP45(key) { - return key.depth === 1 && key.childIndex === common.HARDENED + 45; + return key.depth === 3 && (key.childIndex & common.HARDENED) !== 0; }; diff --git a/lib/hd/mnemonic.js b/lib/hd/mnemonic.js index 5edd05380..4b14c9525 100644 --- a/lib/hd/mnemonic.js +++ b/lib/hd/mnemonic.js @@ -19,6 +19,12 @@ const wordlist = require('./wordlist'); const common = require('./common'); const nfkd = require('../utils/nfkd'); +/* + * Constants + */ + +const wordlistCache = Object.create(null); + /** * HD Mnemonic * @alias module:hd.Mnemonic @@ -77,7 +83,7 @@ Mnemonic.prototype.fromOptions = function fromOptions(options) { options = { phrase: options }; if (options.bits != null) { - assert(util.isNumber(options.bits)); + assert(util.isU16(options.bits)); assert(options.bits >= common.MIN_ENTROPY); assert(options.bits <= common.MAX_ENTROPY); assert(options.bits % 32 === 0); @@ -140,15 +146,13 @@ Mnemonic.prototype.destroy = function destroy() { */ Mnemonic.prototype.toSeed = function toSeed(passphrase) { - let phrase, passwd; - if (!passphrase) passphrase = this.passphrase; this.passphrase = passphrase; - phrase = nfkd(this.getPhrase()); - passwd = nfkd('mnemonic' + passphrase); + const phrase = nfkd(this.getPhrase()); + const passwd = nfkd('mnemonic' + passphrase); return pbkdf2.derive( Buffer.from(phrase, 'utf8'), @@ -176,40 +180,40 @@ Mnemonic.prototype.getEntropy = function getEntropy() { */ Mnemonic.prototype.getPhrase = function getPhrase() { - let phrase, wordlist, bits, ent, entropy; - if (this.phrase) return this.phrase; - phrase = []; - wordlist = Mnemonic.getWordlist(this.language); - - ent = this.getEntropy(); - bits = this.bits; - // Include the first `ENT / 32` bits // of the hash (the checksum). - bits += bits / 32; + const wbits = this.bits + (this.bits / 32); + + // Get entropy and checksum. + const entropy = this.getEntropy(); + const chk = digest.sha256(entropy); // Append the hash to the entropy to // make things easy when grabbing // the checksum bits. - entropy = Buffer.allocUnsafe(Math.ceil(bits / 8)); - ent.copy(entropy, 0); - digest.sha256(ent).copy(entropy, ent.length); + const size = Math.ceil(wbits / 8); + const data = Buffer.allocUnsafe(size); + entropy.copy(data, 0); + chk.copy(data, entropy.length); // Build the mnemonic by reading // 11 bit indexes from the entropy. - for (let i = 0; i < bits / 11; i++) { + const list = Mnemonic.getWordlist(this.language); + + let phrase = []; + for (let i = 0; i < wbits / 11; i++) { let index = 0; for (let j = 0; j < 11; j++) { - let pos = i * 11 + j; - let bit = pos % 8; - let oct = (pos - bit) / 8; + const pos = i * 11 + j; + const bit = pos % 8; + const oct = (pos - bit) / 8; index <<= 1; - index |= (entropy[oct] >>> (7 - bit)) & 1; + index |= (data[oct] >>> (7 - bit)) & 1; } - phrase.push(wordlist[index]); + phrase.push(list.words[index]); } // Japanese likes double-width spaces. @@ -230,52 +234,57 @@ Mnemonic.prototype.getPhrase = function getPhrase() { */ Mnemonic.prototype.fromPhrase = function fromPhrase(phrase) { - let words = phrase.split(/[ \u3000]+/); - let bits = words.length * 11; - let cbits = bits % 32; - let cbytes = Math.ceil(cbits / 8); - let lang = Mnemonic.getLanguage(words[0]); - let wordlist = Mnemonic.getWordlist(lang); - let ent, entropy, chk; + assert(typeof phrase === 'string'); + assert(phrase.length <= 1000); - bits -= cbits; + const words = phrase.trim().split(/[\s\u3000]+/); + const wbits = words.length * 11; + const cbits = wbits % 32; + + assert(cbits !== 0, 'Invalid checksum.'); + + const bits = wbits - cbits; assert(bits >= common.MIN_ENTROPY); assert(bits <= common.MAX_ENTROPY); assert(bits % 32 === 0); - assert(cbits !== 0, 'Invalid checksum.'); - ent = Buffer.allocUnsafe(Math.ceil((bits + cbits) / 8)); - ent.fill(0); + const size = Math.ceil(wbits / 8); + const data = Buffer.allocUnsafe(size); + data.fill(0); + + const lang = Mnemonic.getLanguage(words[0]); + const list = Mnemonic.getWordlist(lang); // Rebuild entropy bytes. for (let i = 0; i < words.length; i++) { - let word = words[i]; - let index = util.binarySearch(wordlist, word, util.strcmp); + const word = words[i]; + const index = list.map[word]; - if (index === -1) + if (index == null) throw new Error('Could not find word.'); for (let j = 0; j < 11; j++) { - let pos = i * 11 + j; - let bit = pos % 8; - let oct = (pos - bit) / 8; - let val = (index >>> (10 - j)) & 1; - ent[oct] |= val << (7 - bit); + const pos = i * 11 + j; + const bit = pos % 8; + const oct = (pos - bit) / 8; + const val = (index >>> (10 - j)) & 1; + data[oct] |= val << (7 - bit); } } - entropy = ent.slice(0, ent.length - cbytes); - ent = ent.slice(ent.length - cbytes); - chk = digest.sha256(entropy); + const cbytes = Math.ceil(cbits / 8); + const entropy = data.slice(0, data.length - cbytes); + const chk1 = data.slice(data.length - cbytes); + const chk2 = digest.sha256(entropy); // Verify checksum. for (let i = 0; i < cbits; i++) { - let bit = i % 8; - let oct = (i - bit) / 8; - let a = (ent[oct] >>> (7 - bit)) & 1; - let b = (chk[oct] >>> (7 - bit)) & 1; - if (a !== b) + const bit = i % 8; + const oct = (i - bit) / 8; + const b1 = (chk1[oct] >>> (7 - bit)) & 1; + const b2 = (chk2[oct] >>> (7 - bit)) & 1; + if (b1 !== b2) throw new Error('Invalid checksum.'); } @@ -342,11 +351,9 @@ Mnemonic.fromEntropy = function fromEntropy(entropy, lang) { */ Mnemonic.getLanguage = function getLanguage(word) { - let lang, wordlist; - - for (lang of Mnemonic.languages) { - wordlist = Mnemonic.getWordlist(lang); - if (util.binarySearch(wordlist, word, util.strcmp) !== -1) + for (const lang of Mnemonic.languages) { + const list = Mnemonic.getWordlist(lang); + if (list.map[word] != null) return lang; } @@ -355,12 +362,22 @@ Mnemonic.getLanguage = function getLanguage(word) { /** * Retrieve the wordlist for a language. - * @param {String} language - * @returns {String[]} + * @param {String} lang + * @returns {Object} */ -Mnemonic.getWordlist = function getWordlist(language) { - return wordlist.get(language); +Mnemonic.getWordlist = function getWordlist(lang) { + const cache = wordlistCache[lang]; + + if (cache) + return cache; + + const words = wordlist.get(lang); + const list = new WordList(words); + + wordlistCache[lang] = list; + + return list; }; /** @@ -385,7 +402,7 @@ Mnemonic.prototype.toJSON = function toJSON() { */ Mnemonic.prototype.fromJSON = function fromJSON(json) { - assert(util.isNumber(json.bits)); + assert(util.isU16(json.bits)); assert(typeof json.language === 'string'); assert(typeof json.entropy === 'string'); assert(typeof json.phrase === 'string'); @@ -434,7 +451,7 @@ Mnemonic.prototype.getSize = function getSize() { */ Mnemonic.prototype.toWriter = function toWriter(bw) { - let lang = Mnemonic.languages.indexOf(this.language); + const lang = Mnemonic.languages.indexOf(this.language); assert(lang !== -1); @@ -453,7 +470,7 @@ Mnemonic.prototype.toWriter = function toWriter(bw) { */ Mnemonic.prototype.toRaw = function toRaw(writer) { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -464,17 +481,21 @@ Mnemonic.prototype.toRaw = function toRaw(writer) { */ Mnemonic.prototype.fromReader = function fromReader(br) { - this.bits = br.readU16(); - this.language = Mnemonic.languages[br.readU8()]; - this.entropy = br.readBytes(this.bits / 8); + const bits = br.readU16(); + + assert(bits >= common.MIN_ENTROPY); + assert(bits <= common.MAX_ENTROPY); + assert(bits % 32 === 0); + + const language = Mnemonic.languages[br.readU8()]; + assert(language); + + this.bits = bits; + this.language = language; + this.entropy = br.readBytes(bits / 8); this.phrase = br.readVarString('utf8'); this.passphrase = br.readVarString('utf8'); - assert(this.language); - assert(this.bits >= common.MIN_ENTROPY); - assert(this.bits <= common.MAX_ENTROPY); - assert(this.bits % 32 === 0); - return this; }; @@ -538,6 +559,23 @@ Mnemonic.isMnemonic = function isMnemonic(obj) { && typeof obj.toSeed === 'function'; }; +/** + * Word List + * @constructor + * @ignore + * @param {Array} words + */ + +function WordList(words) { + this.words = words; + this.map = Object.create(null); + + for (let i = 0; i < words.length; i++) { + const word = words[i]; + this.map[word] = i; + } +} + /* * Expose */ diff --git a/lib/hd/private.js b/lib/hd/private.js index ccddb8848..3fce4a746 100644 --- a/lib/hd/private.js +++ b/lib/hd/private.js @@ -21,6 +21,12 @@ const common = require('./common'); const Mnemonic = require('./mnemonic'); const HDPublicKey = require('./public'); +/* + * Constants + */ + +const SEED_SALT = Buffer.from('Bitcoin seed', 'ascii'); + /** * HDPrivateKey * @alias module:hd.PrivateKey @@ -28,13 +34,13 @@ const HDPublicKey = require('./public'); * @param {Object|Base58String} options * @param {Base58String?} options.xkey - Serialized base58 key. * @param {Number?} options.depth - * @param {Buffer?} options.parentFingerPrint + * @param {Number?} options.parentFingerPrint * @param {Number?} options.childIndex * @param {Buffer?} options.chainCode * @param {Buffer?} options.privateKey * @property {Network} network * @property {Number} depth - * @property {Buffer} parentFingerPrint + * @property {Number} parentFingerPrint * @property {Number} childIndex * @property {Buffer} chainCode * @property {Buffer} privateKey @@ -46,13 +52,13 @@ function HDPrivateKey(options) { this.network = Network.primary; this.depth = 0; - this.parentFingerPrint = encoding.ZERO_U32; + this.parentFingerPrint = 0; this.childIndex = 0; this.chainCode = encoding.ZERO_HASH; this.privateKey = encoding.ZERO_HASH; this.publicKey = encoding.ZERO_KEY; - this.fingerPrint = null; + this.fingerPrint = -1; this._xprivkey = null; @@ -70,10 +76,9 @@ function HDPrivateKey(options) { HDPrivateKey.prototype.fromOptions = function fromOptions(options) { assert(options, 'No options for HD private key.'); - assert(util.isNumber(options.depth)); - assert(options.depth >= 0 && options.depth <= 0xff); - assert(Buffer.isBuffer(options.parentFingerPrint)); - assert(util.isNumber(options.childIndex)); + assert(util.isU8(options.depth)); + assert(util.isU32(options.parentFingerPrint)); + assert(util.isU32(options.childIndex)); assert(Buffer.isBuffer(options.chainCode)); assert(Buffer.isBuffer(options.privateKey)); @@ -150,16 +155,13 @@ HDPrivateKey.prototype.xpubkey = function xpubkey() { HDPrivateKey.prototype.destroy = function destroy(pub) { this.depth = 0; this.childIndex = 0; + this.parentFingerPrint = 0; - cleanse(this.parentFingerPrint); cleanse(this.chainCode); cleanse(this.privateKey); cleanse(this.publicKey); - if (this.fingerPrint) { - cleanse(this.fingerPrint); - this.fingerPrint = null; - } + this.fingerPrint = -1; if (this._hdPublicKey) { if (pub) @@ -172,34 +174,34 @@ HDPrivateKey.prototype.destroy = function destroy(pub) { /** * Derive a child key. - * @param {Number|String} - Child index or path. + * @param {Number} index - Derivation index. * @param {Boolean?} hardened - Whether the derivation should be hardened. * @returns {HDPrivateKey} */ HDPrivateKey.prototype.derive = function derive(index, hardened) { - let bw, id, data, hash, left, right, key, child; - assert(typeof index === 'number'); - if (hardened && index < common.HARDENED) - index += common.HARDENED; - - if (index < 0 || index >= common.MAX_INDEX) + if ((index >>> 0) !== index) throw new Error('Index out of range.'); if (this.depth >= 0xff) throw new Error('Depth too high.'); - id = this.getID(index); - child = common.cache.get(id); + if (hardened) { + index |= common.HARDENED; + index >>>= 0; + } - if (child) - return child; + const id = this.getID(index); + const cache = common.cache.get(id); - bw = new StaticWriter(37); + if (cache) + return cache; - if (index >= common.HARDENED) { + const bw = new StaticWriter(37); + + if (index & common.HARDENED) { bw.writeU8(0); bw.writeBytes(this.privateKey); bw.writeU32BE(index); @@ -208,22 +210,25 @@ HDPrivateKey.prototype.derive = function derive(index, hardened) { bw.writeU32BE(index); } - data = bw.render(); + const data = bw.render(); - hash = digest.hmac('sha512', data, this.chainCode); - left = hash.slice(0, 32); - right = hash.slice(32, 64); + const hash = digest.hmac('sha512', data, this.chainCode); + const left = hash.slice(0, 32); + const right = hash.slice(32, 64); + let key; try { key = secp256k1.privateKeyTweakAdd(this.privateKey, left); } catch (e) { return this.derive(index + 1); } - if (!this.fingerPrint) - this.fingerPrint = digest.hash160(this.publicKey).slice(0, 4); + if (this.fingerPrint === -1) { + const fp = digest.hash160(this.publicKey); + this.fingerPrint = fp.readUInt32BE(0, true); + } - child = new HDPrivateKey(); + const child = new HDPrivateKey(); child.network = this.network; child.depth = this.depth + 1; child.parentFingerPrint = this.fingerPrint; @@ -252,31 +257,22 @@ HDPrivateKey.prototype.getID = function getID(index) { /** * Derive a BIP44 account key. + * @param {Number} purpose * @param {Number} account - * @param {Boolean?} bip48 * @returns {HDPrivateKey} * @throws Error if key is not a master key. */ -HDPrivateKey.prototype.deriveBIP44 = function deriveBIP44(account, bip48) { - assert(util.isNumber(account), 'Account index must be a number.'); +HDPrivateKey.prototype.deriveAccount = function deriveAccount(purpose, account) { + assert(util.isU32(purpose), 'Purpose must be a number.'); + assert(util.isU32(account), 'Account index must be a number.'); assert(this.isMaster(), 'Cannot derive account index.'); return this - .derive(bip48 ? 48 : 44, true) + .derive(purpose, true) .derive(this.network.keyPrefix.coinType, true) .derive(account, true); }; -/** - * Derive a BIP45 purpose key. - * @returns {HDPrivateKey} - */ - -HDPrivateKey.prototype.deriveBIP45 = function deriveBIP45() { - assert(this.isMaster(), 'Cannot derive purpose 45.'); - return this.derive(45, true); -}; - /** * Test whether the key is a master key. * @returns {Boolean} @@ -292,17 +288,8 @@ HDPrivateKey.prototype.isMaster = function isMaster() { * @returns {Boolean} */ -HDPrivateKey.prototype.isBIP44 = function isBIP44(account) { - return common.isBIP44(this, account); -}; - -/** - * Test whether the key is a BIP45 purpose key. - * @returns {Boolean} - */ - -HDPrivateKey.prototype.isBIP45 = function isBIP45() { - return common.isBIP45(this); +HDPrivateKey.prototype.isAccount = function isAccount(account) { + return common.isAccount(this, account); }; /** @@ -313,15 +300,13 @@ HDPrivateKey.prototype.isBIP45 = function isBIP45() { */ HDPrivateKey.isBase58 = function isBase58(data, network) { - let prefix; - if (typeof data !== 'string') return false; if (data.length < 4) return false; - prefix = data.substring(0, 4); + const prefix = data.substring(0, 4); try { Network.fromPrivate58(prefix, network); @@ -339,15 +324,13 @@ HDPrivateKey.isBase58 = function isBase58(data, network) { */ HDPrivateKey.isRaw = function isRaw(data, network) { - let version; - if (!Buffer.isBuffer(data)) return false; if (data.length < 4) return false; - version = data.readUInt32BE(0, true); + const version = data.readUInt32BE(0, true); try { Network.fromPrivate(version, network); @@ -360,16 +343,12 @@ HDPrivateKey.isRaw = function isRaw(data, network) { /** * Test whether a string is a valid path. * @param {String} path - * @param {Boolean?} hardened * @returns {Boolean} */ HDPrivateKey.isValidPath = function isValidPath(path) { - if (typeof path !== 'string') - return false; - try { - common.parsePath(path, common.MAX_INDEX); + common.parsePath(path, true); return true; } catch (e) { return false; @@ -384,10 +363,11 @@ HDPrivateKey.isValidPath = function isValidPath(path) { */ HDPrivateKey.prototype.derivePath = function derivePath(path) { - let indexes = common.parsePath(path, common.MAX_INDEX); + const indexes = common.parsePath(path, true); + let key = this; - for (let index of indexes) + for (const index of indexes) key = key.derive(index); return key; @@ -399,13 +379,12 @@ HDPrivateKey.prototype.derivePath = function derivePath(path) { * @returns {Boolean} */ -HDPrivateKey.prototype.equal = function equal(obj) { - if (!HDPrivateKey.isHDPrivateKey(obj)) - return false; +HDPrivateKey.prototype.equals = function equals(obj) { + assert(HDPrivateKey.isHDPrivateKey(obj)); return this.network === obj.network && this.depth === obj.depth - && this.parentFingerPrint.equals(obj.parentFingerPrint) + && this.parentFingerPrint === obj.parentFingerPrint && this.childIndex === obj.childIndex && this.chainCode.equals(obj.chainCode) && this.privateKey.equals(obj.privateKey); @@ -418,16 +397,14 @@ HDPrivateKey.prototype.equal = function equal(obj) { */ HDPrivateKey.prototype.compare = function compare(key) { - let cmp; - assert(HDPrivateKey.isHDPrivateKey(key)); - cmp = this.depth - key.depth; + let cmp = this.depth - key.depth; if (cmp !== 0) return cmp; - cmp = this.parentFingerPrint.compare(key.parentFingerPrint); + cmp = this.parentFingerPrint - key.parentFingerPrint; if (cmp !== 0) return cmp; @@ -458,18 +435,16 @@ HDPrivateKey.prototype.compare = function compare(key) { */ HDPrivateKey.prototype.fromSeed = function fromSeed(seed, network) { - let hash, left, right; - assert(Buffer.isBuffer(seed)); - if (!(seed.length * 8 >= common.MIN_ENTROPY - && seed.length * 8 <= common.MAX_ENTROPY)) { + if (seed.length * 8 < common.MIN_ENTROPY + || seed.length * 8 > common.MAX_ENTROPY) { throw new Error('Entropy not in range.'); } - hash = digest.hmac('sha512', seed, common.SEED_SALT); - left = hash.slice(0, 32); - right = hash.slice(32, 64); + const hash = digest.hmac('sha512', seed, SEED_SALT); + const left = hash.slice(0, 32); + const right = hash.slice(32, 64); // Only a 1 in 2^127 chance of happening. if (!secp256k1.privateKeyVerify(left)) @@ -477,7 +452,7 @@ HDPrivateKey.prototype.fromSeed = function fromSeed(seed, network) { this.network = Network.get(network); this.depth = 0; - this.parentFingerPrint = Buffer.from([0, 0, 0, 0]); + this.parentFingerPrint = 0; this.childIndex = 0; this.chainCode = right; this.privateKey = left; @@ -528,7 +503,7 @@ HDPrivateKey.fromMnemonic = function fromMnemonic(mnemonic, network) { */ HDPrivateKey.prototype.fromPhrase = function fromPhrase(phrase, network) { - let mnemonic = Mnemonic.fromPhrase(phrase); + const mnemonic = Mnemonic.fromPhrase(phrase); this.fromMnemonic(mnemonic, network); return this; }; @@ -557,7 +532,7 @@ HDPrivateKey.prototype.fromKey = function fromKey(key, entropy, network) { assert(Buffer.isBuffer(entropy) && entropy.length === 32); this.network = Network.get(network); this.depth = 0; - this.parentFingerPrint = Buffer.from([0, 0, 0, 0]); + this.parentFingerPrint = 0; this.childIndex = 0; this.chainCode = entropy; this.privateKey = key; @@ -584,8 +559,8 @@ HDPrivateKey.fromKey = function fromKey(key, entropy, network) { */ HDPrivateKey.generate = function generate(network) { - let key = secp256k1.generatePrivateKey(); - let entropy = random.randomBytes(32); + const key = secp256k1.generatePrivateKey(); + const entropy = random.randomBytes(32); return HDPrivateKey.fromKey(key, entropy, network); }; @@ -610,11 +585,11 @@ HDPrivateKey.prototype.fromBase58 = function fromBase58(xkey, network) { */ HDPrivateKey.prototype.fromReader = function fromReader(br, network) { - let version = br.readU32BE(); + const version = br.readU32BE(); this.network = Network.fromPrivate(version, network); this.depth = br.readU8(); - this.parentFingerPrint = br.readBytes(4); + this.parentFingerPrint = br.readU32BE(); this.childIndex = br.readU32BE(); this.chainCode = br.readBytes(32); assert(br.readU8() === 0); @@ -670,7 +645,7 @@ HDPrivateKey.prototype.toWriter = function toWriter(bw, network) { bw.writeU32BE(network.keyPrefix.xprivkey); bw.writeU8(this.depth); - bw.writeBytes(this.parentFingerPrint); + bw.writeU32BE(this.parentFingerPrint); bw.writeU32BE(this.childIndex); bw.writeBytes(this.chainCode); bw.writeU8(0); diff --git a/lib/hd/public.js b/lib/hd/public.js index c9ea64909..b8f1fc845 100644 --- a/lib/hd/public.js +++ b/lib/hd/public.js @@ -25,13 +25,13 @@ const common = require('./common'); * @param {Object|Base58String} options * @param {Base58String?} options.xkey - Serialized base58 key. * @param {Number?} options.depth - * @param {Buffer?} options.parentFingerPrint + * @param {Number?} options.parentFingerPrint * @param {Number?} options.childIndex * @param {Buffer?} options.chainCode * @param {Buffer?} options.publicKey * @property {Network} network * @property {Number} depth - * @property {Buffer} parentFingerPrint + * @property {Number} parentFingerPrint * @property {Number} childIndex * @property {Buffer} chainCode * @property {Buffer} publicKey @@ -43,12 +43,12 @@ function HDPublicKey(options) { this.network = Network.primary; this.depth = 0; - this.parentFingerPrint = encoding.ZERO_U32; + this.parentFingerPrint = 0; this.childIndex = 0; this.chainCode = encoding.ZERO_HASH; this.publicKey = encoding.ZERO_KEY; - this.fingerPrint = null; + this.fingerPrint = -1; this._xpubkey = null; @@ -64,10 +64,9 @@ function HDPublicKey(options) { HDPublicKey.prototype.fromOptions = function fromOptions(options) { assert(options, 'No options for HDPublicKey'); - assert(util.isNumber(options.depth)); - assert(options.depth >= 0 && options.depth <= 0xff); - assert(Buffer.isBuffer(options.parentFingerPrint)); - assert(util.isNumber(options.childIndex)); + assert(util.isU8(options.depth)); + assert(util.isU32(options.parentFingerPrint)); + assert(util.isU32(options.childIndex)); assert(Buffer.isBuffer(options.chainCode)); assert(Buffer.isBuffer(options.publicKey)); @@ -129,22 +128,19 @@ HDPublicKey.prototype.xpubkey = function xpubkey() { HDPublicKey.prototype.destroy = function destroy() { this.depth = 0; this.childIndex = 0; + this.parentFingerPrint = 0; - cleanse(this.parentFingerPrint); cleanse(this.chainCode); cleanse(this.publicKey); - if (this.fingerPrint) { - cleanse(this.fingerPrint); - this.fingerPrint = null; - } + this.fingerPrint = -1; this._xpubkey = null; }; /** * Derive a child key. - * @param {Number|String} - Child index or path. + * @param {Number} index - Derivation index. * @param {Boolean?} hardened - Whether the derivation * should be hardened (throws if true). * @returns {HDPrivateKey} @@ -152,44 +148,47 @@ HDPublicKey.prototype.destroy = function destroy() { */ HDPublicKey.prototype.derive = function derive(index, hardened) { - let bw, id, data, hash, left, right, key, child; - assert(typeof index === 'number'); - if (index >= common.HARDENED || hardened) - throw new Error('Cannot derive hardened.'); - - if (index < 0) + if ((index >>> 0) !== index) throw new Error('Index out of range.'); + if ((index & common.HARDENED) || hardened) + throw new Error('Cannot derive hardened.'); + if (this.depth >= 0xff) throw new Error('Depth too high.'); - id = this.getID(index); - child = common.cache.get(id); + const id = this.getID(index); + const cache = common.cache.get(id); - if (child) - return child; + if (cache) + return cache; + + const bw = new StaticWriter(37); - bw = new StaticWriter(37); bw.writeBytes(this.publicKey); bw.writeU32BE(index); - data = bw.render(); - hash = digest.hmac('sha512', data, this.chainCode); - left = hash.slice(0, 32); - right = hash.slice(32, 64); + const data = bw.render(); + + const hash = digest.hmac('sha512', data, this.chainCode); + const left = hash.slice(0, 32); + const right = hash.slice(32, 64); + let key; try { key = secp256k1.publicKeyTweakAdd(this.publicKey, left, true); } catch (e) { return this.derive(index + 1); } - if (!this.fingerPrint) - this.fingerPrint = digest.hash160(this.publicKey).slice(0, 4); + if (this.fingerPrint === -1) { + const fp = digest.hash160(this.publicKey); + this.fingerPrint = fp.readUInt32BE(0, true); + } - child = new HDPublicKey(); + const child = new HDPublicKey(); child.network = this.network; child.depth = this.depth + 1; child.parentFingerPrint = this.fingerPrint; @@ -218,26 +217,16 @@ HDPublicKey.prototype.getID = function getID(index) { /** * Derive a BIP44 account key (does not derive, only ensures account key). * @method + * @param {Number} purpose * @param {Number} account - * @param {Boolean?} bip48 * @returns {HDPublicKey} * @throws Error if key is not already an account key. */ -HDPublicKey.prototype.deriveBIP44 = function deriveBIP44(account, bip48) { - assert(this.isBIP44(account), 'Cannot derive account index.'); - return this; -}; - -/** - * Derive a BIP45 purpose key (does not derive, only ensures account key). - * @method - * @returns {HDPublicKey} - * @throws Error if key is not already a purpose key. - */ - -HDPublicKey.prototype.deriveBIP45 = function deriveBIP45() { - assert(this.isBIP45(), 'Cannot derive purpose 45.'); +HDPublicKey.prototype.deriveAccount = function deriveAccount(purpose, account) { + assert(util.isU32(purpose)); + assert(util.isU32(account)); + assert(this.isAccount(account), 'Cannot derive account index.'); return this; }; @@ -258,18 +247,8 @@ HDPublicKey.prototype.isMaster = function isMaster() { * @returns {Boolean} */ -HDPublicKey.prototype.isBIP44 = function isBIP44(account) { - return common.isBIP44(this, account); -}; - -/** - * Test whether the key is a BIP45 purpose key. - * @method - * @returns {Boolean} - */ - -HDPublicKey.prototype.isBIP45 = function isBIP45() { - return common.isBIP45(this); +HDPublicKey.prototype.isAccount = function isAccount(account) { + return common.isAccount(this, account); }; /** @@ -280,11 +259,8 @@ HDPublicKey.prototype.isBIP45 = function isBIP45() { */ HDPublicKey.isValidPath = function isValidPath(path) { - if (typeof path !== 'string') - return false; - try { - common.parsePath(path, common.HARDENED); + common.parsePath(path, false); return true; } catch (e) { return false; @@ -300,10 +276,11 @@ HDPublicKey.isValidPath = function isValidPath(path) { */ HDPublicKey.prototype.derivePath = function derivePath(path) { - let indexes = common.parsePath(path, common.HARDENED); + const indexes = common.parsePath(path, false); + let key = this; - for (let index of indexes) + for (const index of indexes) key = key.derive(index); return key; @@ -315,13 +292,12 @@ HDPublicKey.prototype.derivePath = function derivePath(path) { * @returns {Boolean} */ -HDPublicKey.prototype.equal = function equal(obj) { - if (!HDPublicKey.isHDPublicKey(obj)) - return false; +HDPublicKey.prototype.equals = function equals(obj) { + assert(HDPublicKey.isHDPublicKey(obj)); return this.network === obj.network && this.depth === obj.depth - && this.parentFingerPrint.equals(obj.parentFingerPrint) + && this.parentFingerPrint === obj.parentFingerPrint && this.childIndex === obj.childIndex && this.chainCode.equals(obj.chainCode) && this.publicKey.equals(obj.publicKey); @@ -334,16 +310,14 @@ HDPublicKey.prototype.equal = function equal(obj) { */ HDPublicKey.prototype.compare = function compare(key) { - let cmp; - assert(HDPublicKey.isHDPublicKey(key)); - cmp = this.depth - key.depth; + let cmp = this.depth - key.depth; if (cmp !== 0) return cmp; - cmp = this.parentFingerPrint.compare(key.parentFingerPrint); + cmp = this.parentFingerPrint - key.parentFingerPrint; if (cmp !== 0) return cmp; @@ -409,15 +383,13 @@ HDPublicKey.fromJSON = function fromJSON(json, network) { */ HDPublicKey.isBase58 = function isBase58(data, network) { - let prefix; - if (typeof data !== 'string') return false; if (data.length < 4) return false; - prefix = data.substring(0, 4); + const prefix = data.substring(0, 4); try { Network.fromPublic58(prefix, network); @@ -435,15 +407,13 @@ HDPublicKey.isBase58 = function isBase58(data, network) { */ HDPublicKey.isRaw = function isRaw(data, network) { - let version; - if (!Buffer.isBuffer(data)) return false; if (data.length < 4) return false; - version = data.readUInt32BE(0, true); + const version = data.readUInt32BE(0, true); try { Network.fromPublic(version, network); @@ -474,11 +444,11 @@ HDPublicKey.prototype.fromBase58 = function fromBase58(xkey, network) { */ HDPublicKey.prototype.fromReader = function fromReader(br, network) { - let version = br.readU32BE(); + const version = br.readU32BE(); this.network = Network.fromPublic(version, network); this.depth = br.readU8(); - this.parentFingerPrint = br.readBytes(4); + this.parentFingerPrint = br.readU32BE(); this.childIndex = br.readU32BE(); this.chainCode = br.readBytes(32); this.publicKey = br.readBytes(33); @@ -523,7 +493,7 @@ HDPublicKey.prototype.toWriter = function toWriter(bw, network) { bw.writeU32BE(network.keyPrefix.xpubkey); bw.writeU8(this.depth); - bw.writeBytes(this.parentFingerPrint); + bw.writeU32BE(this.parentFingerPrint); bw.writeU32BE(this.childIndex); bw.writeBytes(this.chainCode); bw.writeBytes(this.publicKey); diff --git a/lib/http/base.js b/lib/http/base.js index 01ef851d3..107c78574 100644 --- a/lib/http/base.js +++ b/lib/http/base.js @@ -50,7 +50,7 @@ function HTTPBase(options) { this._init(); } -util.inherits(HTTPBase, AsyncObject); +Object.setPrototypeOf(HTTPBase.prototype, AsyncObject.prototype); /** * Initialize server. @@ -58,8 +58,8 @@ util.inherits(HTTPBase, AsyncObject); */ HTTPBase.prototype._init = function _init() { - let backend = this.config.getBackend(); - let options = this.config.toHTTP(); + const backend = this.config.getBackend(); + const options = this.config.toHTTP(); this.server = backend.createServer(options); @@ -97,8 +97,8 @@ HTTPBase.prototype._init = function _init() { HTTPBase.prototype._initRouter = function _initRouter() { this.server.on('request', async (hreq, hres) => { - let req = new Request(hreq, hres, hreq.url); - let res = new Response(hreq, hres); + const req = new Request(hreq, hres, hreq.url); + const res = new Response(hreq, hres); req.on('error', () => {}); @@ -121,8 +121,6 @@ HTTPBase.prototype._initRouter = function _initRouter() { */ HTTPBase.prototype.handleRequest = async function handleRequest(req, res) { - let routes; - if (await this.handleMounts(req, res)) return; @@ -131,13 +129,13 @@ HTTPBase.prototype.handleRequest = async function handleRequest(req, res) { if (await this.handleStack(req, res)) return; - routes = this.routes.getHandlers(req.method); + const routes = this.routes.getHandlers(req.method); if (!routes) throw new Error(`No routes found for method: ${req.method}.`); - for (let route of routes) { - let params = route.match(req.pathname); + for (const route of routes) { + const params = route.match(req.pathname); if (!params) continue; @@ -183,68 +181,95 @@ HTTPBase.prototype.cors = function cors() { */ HTTPBase.prototype.basicAuth = function basicAuth(options) { + assert(options, 'Basic auth requires options.'); + let user = options.username; let pass = options.password; let realm = options.realm; - if (user) { - if (typeof user === 'string') - user = Buffer.from(user, 'utf8'); - assert(Buffer.isBuffer(user)); - user = digest.hash256(user); + if (user != null) { + assert(typeof user === 'string'); + assert(user.length <= 255, 'Username too long.'); + assert(util.isAscii(user), 'Username must be ASCII.'); + user = digest.hash256(Buffer.from(user, 'ascii')); } - if (typeof pass === 'string') - pass = Buffer.from(pass, 'utf8'); - - assert(Buffer.isBuffer(pass)); - pass = digest.hash256(pass); + assert(typeof pass === 'string'); + assert(pass.length <= 255, 'Password too long.'); + assert(util.isAscii(pass), 'Password must be ASCII.'); + pass = digest.hash256(Buffer.from(pass, 'ascii')); if (!realm) realm = 'server'; assert(typeof realm === 'string'); - function fail(res) { + const fail = (res) => { res.setHeader('WWW-Authenticate', `Basic realm="${realm}"`); res.setStatus(401); res.end(); - } + }; return async (req, res) => { - let auth = req.headers['authorization']; - let parts, username, password, hash; + const hdr = req.headers['authorization']; - if (!auth) - return fail(res); + if (!hdr) { + fail(res); + return; + } - parts = auth.split(' '); + if (hdr.length > 674) { + fail(res); + return; + } - if (parts.length !== 2) - return fail(res); + const parts = hdr.split(' '); - if (parts[0] !== 'Basic') - return fail(res); + if (parts.length !== 2) { + fail(res); + return; + } + + const [type, b64] = parts; + + if (type !== 'Basic') { + fail(res); + return; + } - auth = Buffer.from(parts[1], 'base64').toString('utf8'); - parts = auth.split(':'); + const auth = Buffer.from(b64, 'base64').toString('ascii'); + const items = auth.split(':'); - username = parts.shift(); - password = parts.join(':'); + const username = items.shift(); + const password = items.join(':'); if (user) { - hash = Buffer.from(username, 'utf8'); - hash = digest.hash256(hash); + if (username.length > 255) { + fail(res); + return; + } + + const raw = Buffer.from(username, 'ascii'); + const hash = digest.hash256(raw); + + if (!ccmp(hash, user)) { + fail(res); + return; + } + } - if (!ccmp(hash, user)) - return fail(res); + if (password.length > 255) { + fail(res); + return; } - hash = Buffer.from(password, 'utf8'); - hash = digest.hash256(hash); + const raw = Buffer.from(password, 'ascii'); + const hash = digest.hash256(raw); - if (!ccmp(hash, pass)) - return fail(res); + if (!ccmp(hash, pass)) { + fail(res); + return; + } req.username = username; }; @@ -257,7 +282,7 @@ HTTPBase.prototype.basicAuth = function basicAuth(options) { */ HTTPBase.prototype.bodyParser = function bodyParser(options) { - let opt = new BodyParserOptions(options); + const opt = new BodyParserOptions(options); return async (req, res) => { if (req.hasBody) @@ -284,29 +309,32 @@ HTTPBase.prototype.bodyParser = function bodyParser(options) { HTTPBase.prototype.parseBody = async function parseBody(req, options) { let body = Object.create(null); - let type = req.contentType; - let data; if (req.method === 'GET') return body; - data = await this.readBody(req, 'utf8', options); - - if (!data) - return body; + let type = req.contentType; if (options.contentType) type = options.contentType; + if (type === 'bin') + return body; + + const data = await this.readBody(req, 'utf8', options); + + if (!data) + return body; + switch (type) { case 'json': body = JSON.parse(data); + if (!body || typeof body !== 'object' || Array.isArray(body)) + throw new Error('JSON body must be an object.'); break; case 'form': body = parsePairs(data, options.keyLimit); break; - default: - break; } return body; @@ -337,18 +365,13 @@ HTTPBase.prototype.readBody = function readBody(req, enc, options) { */ HTTPBase.prototype._readBody = function _readBody(req, enc, options, resolve, reject) { - let decode = new StringDecoder(enc); + const decode = new StringDecoder(enc); let hasData = false; let total = 0; let body = ''; - let timer = setTimeout(() => { - timer = null; - cleanup(); - reject(new Error('Request body timed out.')); - }, options.timeout); - - let cleanup = () => { + const cleanup = () => { + /* eslint-disable */ req.removeListener('data', onData); req.removeListener('error', onError); req.removeListener('end', onEnd); @@ -357,9 +380,10 @@ HTTPBase.prototype._readBody = function _readBody(req, enc, options, resolve, re timer = null; clearTimeout(timer); } + /* eslint-enable */ }; - let onData = (data) => { + const onData = (data) => { total += data.length; hasData = true; @@ -371,12 +395,12 @@ HTTPBase.prototype._readBody = function _readBody(req, enc, options, resolve, re body += decode.write(data); }; - let onError = (err) => { + const onError = (err) => { cleanup(); reject(err); }; - let onEnd = () => { + const onEnd = () => { cleanup(); if (hasData) { @@ -387,6 +411,12 @@ HTTPBase.prototype._readBody = function _readBody(req, enc, options, resolve, re resolve(null); }; + let timer = setTimeout(() => { + timer = null; + cleanup(); + reject(new Error('Request body timed out.')); + }, options.timeout); + req.on('data', onData); req.on('error', onError); req.on('end', onEnd); @@ -400,8 +430,6 @@ HTTPBase.prototype._readBody = function _readBody(req, enc, options, resolve, re HTTPBase.prototype.jsonRPC = function jsonRPC(rpc) { return async (req, res) => { - let json; - if (req.method !== 'POST') return; @@ -411,7 +439,7 @@ HTTPBase.prototype.jsonRPC = function jsonRPC(rpc) { if (typeof req.body.method !== 'string') return; - json = await rpc.call(req.body, req.query); + let json = await rpc.call(req.body, req.query); json = JSON.stringify(json); json += '\n'; @@ -433,8 +461,8 @@ HTTPBase.prototype.jsonRPC = function jsonRPC(rpc) { HTTPBase.prototype.handleMounts = async function handleMounts(req, res) { let url = req.url; - for (let route of this.mounts) { - let server = route.handler; + for (const route of this.mounts) { + const server = route.handler; if (!route.hasPrefix(req.pathname)) continue; @@ -461,7 +489,7 @@ HTTPBase.prototype.handleMounts = async function handleMounts(req, res) { */ HTTPBase.prototype.handleStack = async function handleStack(req, res) { - for (let route of this.stack) { + for (const route of this.stack) { if (!route.hasPrefix(req.pathname)) continue; @@ -481,7 +509,7 @@ HTTPBase.prototype.handleStack = async function handleStack(req, res) { */ HTTPBase.prototype.handleHooks = async function handleHooks(req, res) { - for (let route of this.hooks) { + for (const route of this.hooks) { if (!route.hasPrefix(req.pathname)) continue; @@ -498,11 +526,10 @@ HTTPBase.prototype.handleHooks = async function handleHooks(req, res) { */ HTTPBase.prototype._initSockets = function _initSockets() { - let IOServer; - if (!this.config.sockets) return; + let IOServer; try { IOServer = require('socket.io'); } catch (e) { @@ -532,7 +559,7 @@ HTTPBase.prototype._initSockets = function _initSockets() { */ HTTPBase.prototype.to = function to(name, ...args) { - let list = this.channels.get(name); + const list = this.channels.get(name); if (!list) return; @@ -540,7 +567,7 @@ HTTPBase.prototype.to = function to(name, ...args) { assert(list.size > 0); for (let item = list.head; item; item = item.next) { - let socket = item.value; + const socket = item.value; socket.emit(...args); } }; @@ -553,7 +580,7 @@ HTTPBase.prototype.to = function to(name, ...args) { */ HTTPBase.prototype.all = function all() { - let list = this.sockets; + const list = this.sockets; for (let socket = list.head; socket; socket = socket.next) socket.emit.apply(socket, arguments); @@ -566,7 +593,7 @@ HTTPBase.prototype.all = function all() { */ HTTPBase.prototype.addSocket = function addSocket(ws) { - let socket = new WebSocket(ws, this); + const socket = new WebSocket(ws, this); socket.on('error', (err) => { this.emit('error', err); @@ -586,7 +613,7 @@ HTTPBase.prototype.addSocket = function addSocket(ws) { this.sockets.push(socket); - for (let route of this.mounts) + for (const route of this.mounts) route.handler.addSocket(ws); this.emit('socket', socket); @@ -599,7 +626,7 @@ HTTPBase.prototype.addSocket = function addSocket(ws) { */ HTTPBase.prototype.removeSocket = function removeSocket(socket) { - for (let key of socket.channels.keys()) + for (const key of socket.channels.keys()) this.leaveChannel(socket, key); assert(this.sockets.remove(socket)); @@ -613,12 +640,13 @@ HTTPBase.prototype.removeSocket = function removeSocket(socket) { */ HTTPBase.prototype.joinChannel = function joinChannel(socket, name) { - let list = this.channels.get(name); let item = socket.channels.get(name); if (item) return; + let list = this.channels.get(name); + if (!list) { list = new List(); this.channels.set(name, list); @@ -638,12 +666,13 @@ HTTPBase.prototype.joinChannel = function joinChannel(socket, name) { */ HTTPBase.prototype.leaveChannel = function leaveChannel(socket, name) { - let list = this.channels.get(name); - let item = socket.channels.get(name); + const item = socket.channels.get(name); if (!item) return; + const list = this.channels.get(name); + assert(list); assert(list.remove(item)); @@ -660,10 +689,10 @@ HTTPBase.prototype.leaveChannel = function leaveChannel(socket, name) { */ HTTPBase.prototype.channel = function channel(name) { - let list = this.channels.get(name); + const list = this.channels.get(name); if (!list) - return; + return null; assert(list.size > 0); @@ -676,7 +705,7 @@ HTTPBase.prototype.channel = function channel(name) { * @returns {Promise} */ -HTTPBase.prototype._open = function open() { +HTTPBase.prototype._open = function _open() { return this.listen(this.config.port, this.config.host); }; @@ -686,7 +715,7 @@ HTTPBase.prototype._open = function open() { * @returns {Promise} */ -HTTPBase.prototype._close = function close() { +HTTPBase.prototype._close = function _close() { return new Promise((resolve, reject) => { if (this.io) { this.server.once('close', resolve); @@ -813,7 +842,7 @@ HTTPBase.prototype.listen = function listen(port, host) { return new Promise((resolve, reject) => { this.server.once('error', reject); this.server.listen(port, host, () => { - let addr = this.address(); + const addr = this.address(); this.emit('listening', addr); @@ -865,8 +894,7 @@ HTTPBaseOptions.prototype.fromOptions = function fromOptions(options) { } if (options.port != null) { - assert(typeof options.port === 'number', 'Port must be a number.'); - assert(options.port > 0 && options.port <= 0xffff); + assert(util.isU16(options.port), 'Port must be a number.'); this.port = options.port; } @@ -1062,7 +1090,7 @@ function Route(ctx, path, handler) { Route.prototype.compile = function compile() { let path = this.path; - let map = this.map; + const map = this.map; if (this.compiled) return; @@ -1085,23 +1113,21 @@ Route.prototype.compile = function compile() { this.regex = new RegExp('^' + path + '$'); }; -Route.prototype.match = function _match(pathname) { - let match, params; - +Route.prototype.match = function match(pathname) { this.compile(); assert(this.regex); - match = this.regex.exec(pathname); + const matches = this.regex.exec(pathname); - if (!match) - return; + if (!matches) + return null; - params = Object.create(null); + const params = Object.create(null); - for (let i = 1; i < match.length; i++) { - let item = match[i]; - let key = this.map[i - 1]; + for (let i = 1; i < matches.length; i++) { + const item = matches[i]; + const key = this.map[i - 1]; if (key) params[key] = item; @@ -1142,7 +1168,7 @@ function Routes() { Routes.prototype.getHandlers = function getHandlers(method) { if (!method) - return; + return null; method = method.toUpperCase(); @@ -1156,7 +1182,7 @@ Routes.prototype.getHandlers = function getHandlers(method) { case 'DELETE': return this.del; default: - return; + return null; } }; @@ -1194,7 +1220,7 @@ function Request(req, res, url) { this.init(req, res, url); } -util.inherits(Request, EventEmitter); +Object.setPrototypeOf(Request.prototype, EventEmitter.prototype); Request.prototype.init = function init(req, res, url) { assert(req); @@ -1229,11 +1255,10 @@ Request.prototype.init = function init(req, res, url) { }; Request.prototype.parse = function parse(url) { - let uri = URL.parse(url); + const uri = URL.parse(url); let pathname = uri.pathname; let query = Object.create(null); let trailing = false; - let path, parts; if (pathname) { pathname = pathname.replace(/\/{2,}/g, '/'); @@ -1260,12 +1285,12 @@ Request.prototype.parse = function parse(url) { if (pathname.length > 1) assert(pathname[pathname.length - 1] !== '/'); - path = pathname; + let path = pathname; if (path[0] === '/') path = path.substring(1); - parts = path.split('/'); + let parts = path.split('/'); if (parts.length === 1) { if (parts[0].length === 0) @@ -1295,7 +1320,7 @@ Request.prototype.parse = function parse(url) { }; Request.prototype.rewrite = function rewrite(url) { - let req = new Request(); + const req = new Request(); req.init(this.req, this.res, url); req.body = this.body; req.hasBody = this.hasBody; @@ -1346,7 +1371,7 @@ function Response(req, res) { this.init(req, res); } -util.inherits(Response, EventEmitter); +Object.setPrototypeOf(Response.prototype, EventEmitter.prototype); Response.prototype.init = function init(req, res) { assert(req); @@ -1417,13 +1442,6 @@ Response.prototype.error = function error(code, err) { code: err.code } }); - - try { - this.req.destroy(); - this.req.socket.destroy(); - } catch (e) { - ; - } }; Response.prototype.redirect = function redirect(code, url) { @@ -1468,8 +1486,8 @@ Response.prototype.send = function send(code, msg, type) { this.setType(type); if (typeof msg === 'string') { - let len = Buffer.byteLength(msg, 'utf8'); - this.setHeader('Content-Length', len + ''); + const len = Buffer.byteLength(msg, 'utf8'); + this.setHeader('Content-Length', len.toString(10)); try { this.write(msg, 'utf8'); this.end(); @@ -1480,7 +1498,7 @@ Response.prototype.send = function send(code, msg, type) { } if (Buffer.isBuffer(msg)) { - this.setHeader('Content-Length', msg.length + ''); + this.setHeader('Content-Length', msg.length.toString(10)); try { this.write(msg); this.end(); @@ -1509,7 +1527,7 @@ function WebSocket(socket, ctx) { this.context = ctx; this.socket = socket; this.remoteAddress = socket.conn.remoteAddress; - this.hooks = {}; + this.hooks = Object.create(null); this.channels = new Map(); this.auth = false; this.filter = null; @@ -1519,14 +1537,14 @@ function WebSocket(socket, ctx) { this.init(); } -util.inherits(WebSocket, EventEmitter); +Object.setPrototypeOf(WebSocket.prototype, EventEmitter.prototype); WebSocket.prototype.init = function init() { - let socket = this.socket; - let onevent = socket.onevent.bind(socket); + const socket = this.socket; + const onevent = socket.onevent.bind(socket); socket.onevent = (packet) => { - let result = onevent(packet); + const result = onevent(packet); this.onevent(packet); return result; }; @@ -1541,15 +1559,16 @@ WebSocket.prototype.init = function init() { }; WebSocket.prototype.onevent = async function onevent(packet) { - let args = (packet.data || []).slice(); - let type = args.shift() || ''; - let ack, result; + const args = (packet.data || []).slice(); + const type = args.shift() || ''; + let ack; if (typeof args[args.length - 1] === 'function') ack = args.pop(); else ack = this.socket.ack(packet.id); + let result; try { result = await this.fire(type, args); } catch (e) { @@ -1573,10 +1592,10 @@ WebSocket.prototype.hook = function hook(type, handler) { }; WebSocket.prototype.fire = async function fire(type, args) { - let handler = this.hooks[type]; + const handler = this.hooks[type]; if (!handler) - return; + return undefined; return await handler.call(this.context, args); }; @@ -1590,7 +1609,7 @@ WebSocket.prototype.leave = function leave(name) { }; WebSocket.prototype.dispatch = function dispatch() { - let emit = EventEmitter.prototype.emit; + const emit = EventEmitter.prototype.emit; return emit.apply(this, arguments); }; @@ -1599,7 +1618,7 @@ WebSocket.prototype.emit = function emit() { }; WebSocket.prototype.call = function call(...args) { - let socket = this.socket; + const socket = this.socket; return new Promise((resolve, reject) => { args.push(co.wrap(resolve, reject)); socket.emit(...args); @@ -1615,18 +1634,18 @@ WebSocket.prototype.destroy = function destroy() { */ function parsePairs(str, limit) { - let parts = str.split('&'); - let data = Object.create(null); + const parts = str.split('&'); + const data = Object.create(null); if (parts.length > limit) return data; assert(!limit || parts.length <= limit, 'Too many keys in querystring.'); - for (let pair of parts) { - let index = pair.indexOf('='); - let key, value; + for (const pair of parts) { + const index = pair.indexOf('='); + let key, value; if (index === -1) { key = pair; value = ''; diff --git a/lib/http/client.js b/lib/http/client.js index 98921be55..b9e1ac2a2 100644 --- a/lib/http/client.js +++ b/lib/http/client.js @@ -7,10 +7,10 @@ 'use strict'; +const assert = require('assert'); const Network = require('../protocol/network'); const AsyncObject = require('../utils/asyncobject'); const RPCClient = require('./rpcclient'); -const util = require('../utils/util'); const request = require('./request'); /** @@ -43,7 +43,7 @@ function HTTPClient(options) { this.rpc = new RPCClient(options); } -util.inherits(HTTPClient, AsyncObject); +Object.setPrototypeOf(HTTPClient.prototype, AsyncObject.prototype); /** * Open the client, wait for socket to connect. @@ -115,7 +115,7 @@ HTTPClient.prototype._open = async function _open() { * @returns {Promise} */ -HTTPClient.prototype._close = function close() { +HTTPClient.prototype._close = function _close() { if (!this.socket) return Promise.resolve(); @@ -195,20 +195,19 @@ HTTPClient.prototype.onDisconnect = function onDisconnect() { */ HTTPClient.prototype._request = async function _request(method, endpoint, json) { - let query, network, res; - if (this.token) { if (!json) json = {}; json.token = this.token; } + let query; if (json && method === 'get') { query = json; json = null; } - res = await request({ + const res = await request({ method: method, uri: this.uri + endpoint, pool: true, @@ -221,7 +220,7 @@ HTTPClient.prototype._request = async function _request(method, endpoint, json) }); if (res.statusCode === 404) - return; + return null; if (res.statusCode === 401) throw new Error('Unauthorized (bad API key).'); @@ -235,7 +234,7 @@ HTTPClient.prototype._request = async function _request(method, endpoint, json) if (!res.body) throw new Error('Bad response (no body).'); - network = res.headers['x-bcoin-network']; + const network = res.headers['x-bcoin-network']; if (network && network !== this.network.type) throw new Error('Bad response (wrong network).'); @@ -320,7 +319,18 @@ HTTPClient.prototype.getInfo = function getInfo() { */ HTTPClient.prototype.getCoinsByAddress = function getCoinsByAddress(address) { - return this._post('/coin/address', { address }); + return this._get(`/coin/address/${address}`); +}; + +/** + * Get coins that pertain to addresses from the mempool or chain database. + * Takes into account spent coins in the mempool. + * @param {String[]} addresses + * @returns {Promise} - Returns {@link Coin}[]. + */ + +HTTPClient.prototype.getCoinsByAddresses = function getCoinsByAddresses(addresses) { + return this._post('/coin/address', { addresses }); }; /** @@ -343,7 +353,18 @@ HTTPClient.prototype.getCoin = function getCoin(hash, index) { */ HTTPClient.prototype.getTXByAddress = function getTXByAddress(address) { - return this._post('/tx/address', { address }); + return this._get(`/tx/address/${address}`); +}; + +/** + * Retrieve transactions pertaining to + * addresses from the mempool or chain database. + * @param {String[]} addresses + * @returns {Promise} - Returns {@link TX}[]. + */ + +HTTPClient.prototype.getTXByAddresses = function getTXByAddresses(addresses) { + return this._post('/tx/address', { addresses }); }; /** @@ -457,22 +478,6 @@ HTTPClient.prototype.leave = function leave(id) { }); }; -/** - * Listen for events on all wallets. - */ - -HTTPClient.prototype.all = function all(token) { - return this.join('!all', token); -}; - -/** - * Unlisten for events on all wallets. - */ - -HTTPClient.prototype.none = function none() { - return this.leave('!all'); -}; - /** * Get list of all wallet IDs. * @returns {Promise} @@ -489,6 +494,7 @@ HTTPClient.prototype.getWallets = function getWallets() { */ HTTPClient.prototype.createWallet = function createWallet(options) { + assert(options.id, 'Must pass an id parameter'); return this._put(`/wallet/${options.id}`, options); }; @@ -565,7 +571,7 @@ HTTPClient.prototype.getLast = function getLast(id, account, limit) { */ HTTPClient.prototype.getRange = function getRange(id, account, options) { - let body = { + const body = { account: account, start: options.start, end: options.end , @@ -632,7 +638,7 @@ HTTPClient.prototype.getWalletCoin = function getWalletCoin(id, account, hash, i */ HTTPClient.prototype.send = function send(id, options) { - let body = Object.assign({}, options); + const body = Object.assign({}, options); if (!body.outputs) body.outputs = []; @@ -655,7 +661,7 @@ HTTPClient.prototype.send = function send(id, options) { */ HTTPClient.prototype.retoken = async function retoken(id, passphrase) { - let body = await this._post(`/wallet/${id}/retoken`, { passphrase }); + const body = await this._post(`/wallet/${id}/retoken`, { passphrase }); return body.token; }; @@ -667,7 +673,7 @@ HTTPClient.prototype.retoken = async function retoken(id, passphrase) { */ HTTPClient.prototype.setPassphrase = function setPassphrase(id, old, new_) { - let body = { old: old, passphrase: new_ }; + const body = { old: old, passphrase: new_ }; return this._post(`/wallet/${id}/passphrase`, body); }; @@ -679,7 +685,7 @@ HTTPClient.prototype.setPassphrase = function setPassphrase(id, old, new_) { */ HTTPClient.prototype.createTX = function createTX(id, options) { - let body = Object.assign({}, options); + const body = Object.assign({}, options); if (!body.outputs) body.outputs = []; @@ -704,7 +710,7 @@ HTTPClient.prototype.createTX = function createTX(id, options) { */ HTTPClient.prototype.sign = function sign(id, tx, options) { - let body = Object.assign({}, options); + const body = Object.assign({}, options); body.tx = toHex(tx); return this._post(`/wallet/${id}/sign`, body); }; @@ -753,7 +759,7 @@ HTTPClient.prototype.getWIF = function getWIF(id, address, passphrase) { */ HTTPClient.prototype.addSharedKey = function addSharedKey(id, account, key) { - let body = { account: account, accountKey: key }; + const body = { account: account, accountKey: key }; return this._put(`/wallet/${id}/shared-key`, body); }; @@ -767,7 +773,7 @@ HTTPClient.prototype.addSharedKey = function addSharedKey(id, account, key) { */ HTTPClient.prototype.removeSharedKey = function removeSharedKey(id, account, key) { - let body = { account: account, accountKey: key }; + const body = { account: account, accountKey: key }; return this._del(`/wallet/${id}/shared-key`, body); }; @@ -780,7 +786,7 @@ HTTPClient.prototype.removeSharedKey = function removeSharedKey(id, account, key */ HTTPClient.prototype.importPrivate = function importPrivate(id, account, key) { - let body = { account: account, privateKey: key }; + const body = { account: account, privateKey: key }; return this._post(`/wallet/${id}/import`, body); }; @@ -793,7 +799,7 @@ HTTPClient.prototype.importPrivate = function importPrivate(id, account, key) { */ HTTPClient.prototype.importPublic = function importPublic(id, account, key) { - let body = { account: account, publicKey: key }; + const body = { account: account, publicKey: key }; return this._post(`/wallet/${id}/import`, body); }; @@ -974,7 +980,7 @@ HTTPClient.prototype.createNested = function createNested(id, options) { function toHex(obj) { if (!obj) - return; + return null; if (obj.toRaw) obj = obj.toRaw(); diff --git a/lib/http/request.js b/lib/http/request.js index 8c7d9d47e..76b35509c 100644 --- a/lib/http/request.js +++ b/lib/http/request.js @@ -77,7 +77,7 @@ RequestOptions.prototype.setURI = function setURI(uri) { this.port = uri.port || (this.ssl ? 443 : 80); if (uri.auth) { - let parts = uri.auth.split(':'); + const parts = uri.auth.split(':'); this.auth = { username: parts[0] || '', password: parts[1] || '' @@ -202,16 +202,16 @@ RequestOptions.prototype.isExpected = function isExpected(type) { return this.expect === type; }; -RequestOptions.prototype.isOverflow = function isOverflow(length) { - if (!length) +RequestOptions.prototype.isOverflow = function isOverflow(hdr) { + if (!hdr) return false; if (!this.buffer) return false; - length = parseInt(length, 10); + const length = parseInt(hdr, 10); - if (length !== length) + if (!isFinite(length)) return true; return length > this.limit; @@ -223,12 +223,10 @@ RequestOptions.prototype.getBackend = function getBackend() { }; RequestOptions.prototype.getHeaders = function getHeaders() { - let headers; - if (this.headers) return this.headers; - headers = {}; + const headers = Object.create(null); headers['User-Agent'] = this.agent; @@ -236,11 +234,11 @@ RequestOptions.prototype.getHeaders = function getHeaders() { headers['Content-Type'] = getType(this.type); if (this.body) - headers['Content-Length'] = this.body.length + ''; + headers['Content-Length'] = this.body.length.toString(10); if (this.auth) { - let auth = `${this.auth.username}:${this.auth.password}`; - let data = Buffer.from(auth, 'utf8'); + const auth = `${this.auth.username}:${this.auth.password}`; + const data = Buffer.from(auth, 'utf8'); headers['Authorization'] = `Basic ${data.toString('base64')}`; } @@ -295,9 +293,10 @@ function Request(options) { this.total = 0; this.decoder = null; this.body = null; + this.buffer = null; } -Request.prototype.__proto__ = Stream.prototype; +Object.setPrototypeOf(Request.prototype, Stream.prototype); Request.prototype.startTimeout = function startTimeout() { if (!this.options.timeout) @@ -360,8 +359,8 @@ Request.prototype.destroy = function destroy() { }; Request.prototype.start = function start() { - let backend = this.options.getBackend(); - let options = this.options.toHTTP(); + const backend = this.options.getBackend(); + const options = this.options.toHTTP(); this.startTimeout(); @@ -397,27 +396,58 @@ Request.prototype.finish = function finish(err) { this.cleanup(); - if (this.options.buffer && this.body) { + if (this.options.buffer) { + assert(this.buffer != null); switch (this.type) { - case 'bin': - this.body = Buffer.concat(this.body); + case 'bin': { + this.body = Buffer.concat(this.buffer); + this.buffer = null; break; - case 'json': + } + case 'json': { + const buffer = this.buffer.trim(); + + this.buffer = null; + + if (buffer.length === 0) + break; + + let body; try { - this.body = JSON.parse(this.body); + body = JSON.parse(buffer); } catch (e) { this.emit('error', e); return; } + + if (!body || typeof body !== 'object') { + this.emit('error', new Error('JSON body is a non-object.')); + return; + } + + this.body = body; + break; - case 'form': + } + case 'form': { + const buffer = this.buffer; + + this.buffer = null; + try { - this.body = qs.parse(this.body); + this.body = qs.parse(buffer); } catch (e) { this.emit('error', e); return; } + + break; + } + default: { + this.body = this.buffer; + this.buffer = null; break; + } } } @@ -426,9 +456,7 @@ Request.prototype.finish = function finish(err) { }; Request.prototype._onResponse = function _onResponse(response) { - let type = response.headers['content-type']; - let length = response.headers['content-length']; - let location = response.headers['location']; + const location = response.headers['location']; if (location) { if (++this.redirects > this.options.maxRedirects) { @@ -442,13 +470,16 @@ Request.prototype._onResponse = function _onResponse(response) { return; } - type = parseType(type); + const contentType = response.headers['content-type']; + const type = parseType(contentType); if (!this.options.isExpected(type)) { this.finish(new Error('Wrong content-type for response.')); return; } + const length = response.headers['content-length']; + if (this.options.isOverflow(length)) { this.finish(new Error('Response exceeded limit.')); return; @@ -470,9 +501,9 @@ Request.prototype._onResponse = function _onResponse(response) { if (this.options.buffer) { if (this.type !== 'bin') { this.decoder = new StringDecoder('utf8'); - this.body = ''; + this.buffer = ''; } else { - this.body = []; + this.buffer = []; } } }; @@ -489,11 +520,13 @@ Request.prototype._onData = function _onData(data) { return; } } + if (this.decoder) { - this.body += this.decoder.write(data); + this.buffer += this.decoder.write(data); return; } - this.body.push(data); + + this.buffer.push(data); } }; @@ -531,20 +564,20 @@ function request(options) { options.buffer = true; return new Promise((resolve, reject) => { - let stream = new Request(options); + const req = new Request(options); - stream.on('error', err => reject(err)); - stream.on('end', () => resolve(stream)); + req.on('error', err => reject(err)); + req.on('end', () => resolve(req)); - stream.start(); - stream.end(); + req.start(); + req.end(); }); } -request.stream = function _stream(options) { - let stream = new Request(options); - stream.start(); - return stream; +request.stream = function stream(options) { + const req = new Request(options); + req.start(); + return req; }; /* diff --git a/lib/http/rpc.js b/lib/http/rpc.js index 3f9d582c7..d0ab49974 100644 --- a/lib/http/rpc.js +++ b/lib/http/rpc.js @@ -24,6 +24,7 @@ const KeyRing = require('../primitives/keyring'); const MerkleBlock = require('../primitives/merkleblock'); const MTX = require('../primitives/mtx'); const Network = require('../protocol/network'); +const Outpoint = require('../primitives/outpoint'); const Output = require('../primitives/output'); const TX = require('../primitives/tx'); const IP = require('../utils/ip'); @@ -74,7 +75,7 @@ function RPC(node) { this.init(); } -util.inherits(RPC, RPCBase); +Object.setPrototypeOf(RPC.prototype, RPCBase.prototype); RPC.prototype.init = function init() { this.add('stop', this.stop); @@ -184,13 +185,11 @@ RPC.prototype.getInfo = async function getInfo(args, help) { }; }; -RPC.prototype.help = async function _help(args, help) { - let json; - +RPC.prototype.help = async function help(args, _help) { if (args.length === 0) return 'Select a command.'; - json = { + const json = { method: args[0], params: [] }; @@ -202,7 +201,11 @@ RPC.prototype.stop = async function stop(args, help) { if (help || args.length !== 0) throw new RPCError(errs.MISC_ERROR, 'stop'); - this.node.close().catch(() => {}); + this.node.close().catch((err) => { + setImmediate(() => { + throw err; + }); + }); return 'Stopping.'; }; @@ -212,13 +215,13 @@ RPC.prototype.stop = async function stop(args, help) { */ RPC.prototype.getNetworkInfo = async function getNetworkInfo(args, help) { - let hosts = this.pool.hosts; - let locals = []; - if (help || args.length !== 0) throw new RPCError(errs.MISC_ERROR, 'getnetworkinfo'); - for (let local of hosts.local.values()) { + const hosts = this.pool.hosts; + const locals = []; + + for (const local of hosts.local.values()) { locals.push({ address: local.addr.host, port: local.addr.port, @@ -244,23 +247,23 @@ RPC.prototype.getNetworkInfo = async function getNetworkInfo(args, help) { }; RPC.prototype.addNode = async function addNode(args, help) { - let valid = new Validator([args]); - let node = valid.str(0, ''); - let cmd = valid.str(1, ''); - if (help || args.length !== 2) throw new RPCError(errs.MISC_ERROR, 'addnode "node" "add|remove|onetry"'); + const valid = new Validator([args]); + const node = valid.str(0, ''); + const cmd = valid.str(1, ''); + switch (cmd) { case 'add': { this.pool.hosts.addNode(node); ; // fall through } case 'onetry': { - let addr = parseNetAddress(node, this.network); + const addr = parseNetAddress(node, this.network); if (!this.pool.peers.get(addr.hostname)) { - let peer = this.pool.createOutbound(addr); + const peer = this.pool.createOutbound(addr); this.pool.peers.add(peer); } @@ -276,15 +279,14 @@ RPC.prototype.addNode = async function addNode(args, help) { }; RPC.prototype.disconnectNode = async function disconnectNode(args, help) { - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let peer; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'disconnectnode "node"'); - addr = parseIP(addr, this.network); - peer = this.pool.peers.get(addr.hostname); + const valid = new Validator([args]); + const str = valid.str(0, ''); + + const addr = parseIP(str, this.network); + const peer = this.pool.peers.get(addr.hostname); if (peer) peer.destroy(); @@ -293,21 +295,20 @@ RPC.prototype.disconnectNode = async function disconnectNode(args, help) { }; RPC.prototype.getAddedNodeInfo = async function getAddedNodeInfo(args, help) { - let hosts = this.pool.hosts; - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let result = []; - let target; - if (help || args.length > 1) throw new RPCError(errs.MISC_ERROR, 'getaddednodeinfo ( "node" )'); + const hosts = this.pool.hosts; + const valid = new Validator([args]); + const addr = valid.str(0, ''); + + let target; if (args.length === 1) target = parseIP(addr, this.network); - for (let node of hosts.nodes) { - let peer; + const result = []; + for (const node of hosts.nodes) { if (target) { if (node.host !== target.host) continue; @@ -316,7 +317,7 @@ RPC.prototype.getAddedNodeInfo = async function getAddedNodeInfo(args, help) { continue; } - peer = this.pool.peers.get(node.hostname); + const peer = this.pool.peers.get(node.hostname); if (!peer || !peer.connected) { result.push({ @@ -376,21 +377,21 @@ RPC.prototype.getNetTotals = async function getNetTotals(args, help) { }; RPC.prototype.getPeerInfo = async function getPeerInfo(args, help) { - let peers = []; - if (help || args.length !== 0) throw new RPCError(errs.MISC_ERROR, 'getpeerinfo'); + const peers = []; + for (let peer = this.pool.peers.head(); peer; peer = peer.next) { let offset = this.network.time.known.get(peer.hostname()); - let hashes = []; + const hashes = []; if (offset == null) offset = 0; - for (let hash in peer.blockMap.keys()) { - hash = util.revHex(hash); - hashes.push(hash); + for (const hash in peer.blockMap.keys()) { + const str = util.revHex(hash); + hashes.push(str); } peers.push({ @@ -405,7 +406,7 @@ RPC.prototype.getPeerInfo = async function getPeerInfo(args, help) { lastrecv: peer.lastRecv / 1000 | 0, bytessent: peer.socket.bytesWritten, bytesrecv: peer.socket.bytesRead, - conntime: peer.ts !== 0 ? (util.ms() - peer.ts) / 1000 | 0 : 0, + conntime: peer.time !== 0 ? (util.ms() - peer.time) / 1000 | 0 : 0, timeoffset: offset, pingtime: peer.lastPong !== -1 ? (peer.lastPong - peer.lastPing) / 1000 @@ -437,9 +438,9 @@ RPC.prototype.ping = async function ping(args, help) { }; RPC.prototype.setBan = async function setBan(args, help) { - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let action = valid.str(1, ''); + const valid = new Validator([args]); + const str = valid.str(0, ''); + const action = valid.str(1, ''); if (help || args.length < 2 @@ -448,7 +449,7 @@ RPC.prototype.setBan = async function setBan(args, help) { 'setban "ip(/netmask)" "add|remove" (bantime) (absolute)'); } - addr = parseNetAddress(addr, this.network); + const addr = parseNetAddress(str, this.network); switch (action) { case 'add': @@ -463,12 +464,12 @@ RPC.prototype.setBan = async function setBan(args, help) { }; RPC.prototype.listBanned = async function listBanned(args, help) { - let banned = []; - if (help || args.length !== 0) throw new RPCError(errs.MISC_ERROR, 'listbanned'); - for (let [host, time] of this.pool.hosts.banned) { + const banned = []; + + for (const [host, time] of this.pool.hosts.banned) { banned.push({ address: host, banned_until: time + this.pool.options.banTime, @@ -529,24 +530,23 @@ RPC.prototype.getBlockCount = async function getBlockCount(args, help) { }; RPC.prototype.getBlock = async function getBlock(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let verbose = valid.bool(1, true); - let details = valid.bool(2, false); - let entry, block; - if (help || args.length < 1 || args.length > 3) throw new RPCError(errs.MISC_ERROR, 'getblock "hash" ( verbose )'); + const valid = new Validator([args]); + const hash = valid.hash(0); + const verbose = valid.bool(1, true); + const details = valid.bool(2, false); + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid block hash.'); - entry = await this.chain.db.getEntry(hash); + const entry = await this.chain.db.getEntry(hash); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Block not found'); - block = await this.chain.db.getBlock(entry.hash); + const block = await this.chain.db.getBlock(entry.hash); if (!block) { if (this.chain.options.spv) @@ -565,26 +565,25 @@ RPC.prototype.getBlock = async function getBlock(args, help) { }; RPC.prototype.getBlockByHeight = async function getBlockByHeight(args, help) { - let valid = new Validator([args]); - let height = valid.u32(0, -1); - let verbose = valid.bool(1, true); - let details = valid.bool(2, false); - let entry, block; - if (help || args.length < 1 || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'getblockbyheight "height" ( verbose )'); } + const valid = new Validator([args]); + const height = valid.u32(0, -1); + const verbose = valid.bool(1, true); + const details = valid.bool(2, false); + if (height === -1) throw new RPCError(errs.TYPE_ERROR, 'Invalid block height.'); - entry = await this.chain.db.getEntry(height); + const entry = await this.chain.db.getEntry(height); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Block not found'); - block = await this.chain.db.getBlock(entry.hash); + const block = await this.chain.db.getBlock(entry.hash); if (!block) { if (this.chain.options.spv) @@ -603,17 +602,16 @@ RPC.prototype.getBlockByHeight = async function getBlockByHeight(args, help) { }; RPC.prototype.getBlockHash = async function getBlockHash(args, help) { - let valid = new Validator([args]); - let height = valid.u32(0); - let hash; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'getblockhash index'); + const valid = new Validator([args]); + const height = valid.u32(0); + if (height == null || height > this.chain.height) throw new RPCError(errs.INVALID_PARAMETER, 'Block height out of range.'); - hash = await this.chain.db.getHash(height); + const hash = await this.chain.db.getHash(height); if (!hash) throw new RPCError(errs.MISC_ERROR, 'Not found.'); @@ -622,18 +620,17 @@ RPC.prototype.getBlockHash = async function getBlockHash(args, help) { }; RPC.prototype.getBlockHeader = async function getBlockHeader(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let verbose = valid.bool(1, true); - let entry; - if (help || args.length < 1 || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'getblockheader "hash" ( verbose )'); + const valid = new Validator([args]); + const hash = valid.hash(0); + const verbose = valid.bool(1, true); + if (!hash) throw new RPCError(errs.MISC_ERROR, 'Invalid block hash.'); - entry = await this.chain.db.getEntry(hash); + const entry = await this.chain.db.getEntry(hash); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Block not found'); @@ -645,22 +642,19 @@ RPC.prototype.getBlockHeader = async function getBlockHeader(args, help) { }; RPC.prototype.getChainTips = async function getChainTips(args, help) { - let tips, result; - if (help || args.length !== 0) throw new RPCError(errs.MISC_ERROR, 'getchaintips'); - tips = await this.chain.db.getTips(); - result = []; + const tips = await this.chain.db.getTips(); + const result = []; - for (let hash of tips) { - let entry = await this.chain.db.getEntry(hash); - let fork, main; + for (const hash of tips) { + const entry = await this.chain.db.getEntry(hash); assert(entry); - fork = await this.findFork(entry); - main = await entry.isMainChain(); + const fork = await this.findFork(entry); + const main = await entry.isMainChain(); result.push({ height: entry.height, @@ -697,33 +691,32 @@ RPC.prototype.getMempoolInfo = async function getMempoolInfo(args, help) { }; RPC.prototype.getMempoolAncestors = async function getMempoolAncestors(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let verbose = valid.bool(1, false); - let out = []; - let entries, entry; - if (help || args.length < 1 || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'getmempoolancestors txid (verbose)'); + const valid = new Validator([args]); + const hash = valid.hash(0); + const verbose = valid.bool(1, false); + if (!this.mempool) throw new RPCError(errs.MISC_ERROR, 'No mempool available.'); if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid TXID.'); - entry = this.mempool.getEntry(hash); + const entry = this.mempool.getEntry(hash); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Transaction not in mempool.'); - entries = this.mempool.getAncestors(entry); + const entries = this.mempool.getAncestors(entry); + const out = []; if (verbose) { - for (let entry of entries) + for (const entry of entries) out.push(this.entryToJSON(entry)); } else { - for (let entry of entries) + for (const entry of entries) out.push(entry.txid()); } @@ -731,33 +724,32 @@ RPC.prototype.getMempoolAncestors = async function getMempoolAncestors(args, hel }; RPC.prototype.getMempoolDescendants = async function getMempoolDescendants(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let verbose = valid.bool(1, false); - let out = []; - let entries, entry; - if (help || args.length < 1 || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'getmempooldescendants txid (verbose)'); + const valid = new Validator([args]); + const hash = valid.hash(0); + const verbose = valid.bool(1, false); + if (!this.mempool) throw new RPCError(errs.MISC_ERROR, 'No mempool available.'); if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid TXID.'); - entry = this.mempool.getEntry(hash); + const entry = this.mempool.getEntry(hash); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Transaction not in mempool.'); - entries = this.mempool.getDescendants(entry); + const entries = this.mempool.getDescendants(entry); + const out = []; if (verbose) { - for (let entry of entries) + for (const entry of entries) out.push(this.entryToJSON(entry)); } else { - for (let entry of entries) + for (const entry of entries) out.push(entry.txid()); } @@ -765,20 +757,19 @@ RPC.prototype.getMempoolDescendants = async function getMempoolDescendants(args, }; RPC.prototype.getMempoolEntry = async function getMempoolEntry(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let entry; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'getmempoolentry txid'); + const valid = new Validator([args]); + const hash = valid.hash(0); + if (!this.mempool) throw new RPCError(errs.MISC_ERROR, 'No mempool available.'); if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid TXID.'); - entry = this.mempool.getEntry(hash); + const entry = this.mempool.getEntry(hash); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Transaction not in mempool.'); @@ -787,39 +778,38 @@ RPC.prototype.getMempoolEntry = async function getMempoolEntry(args, help) { }; RPC.prototype.getRawMempool = async function getRawMempool(args, help) { - let valid = new Validator([args]); - let verbose = valid.bool(0, false); - let out = {}; - let hashes; - if (help || args.length > 1) throw new RPCError(errs.MISC_ERROR, 'getrawmempool ( verbose )'); + const valid = new Validator([args]); + const verbose = valid.bool(0, false); + if (!this.mempool) throw new RPCError(errs.MISC_ERROR, 'No mempool available.'); if (verbose) { - for (let entry of this.mempool.map.values()) + const out = {}; + + for (const entry of this.mempool.map.values()) out[entry.txid()] = this.entryToJSON(entry); return out; } - hashes = this.mempool.getSnapshot(); + const hashes = this.mempool.getSnapshot(); return hashes.map(util.revHex); }; RPC.prototype.getTXOut = async function getTXOut(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let index = valid.u32(1); - let mempool = valid.bool(2, true); - let coin; - if (help || args.length < 2 || args.length > 3) throw new RPCError(errs.MISC_ERROR, 'gettxout "txid" n ( includemempool )'); + const valid = new Validator([args]); + const hash = valid.hash(0); + const index = valid.u32(1); + const mempool = valid.bool(2, true); + if (this.chain.options.spv) throw new RPCError(errs.MISC_ERROR, 'Cannot get coins in SPV mode.'); @@ -829,6 +819,7 @@ RPC.prototype.getTXOut = async function getTXOut(args, help) { if (!hash || index == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid outpoint.'); + let coin; if (mempool) { if (!this.mempool) throw new RPCError(errs.MISC_ERROR, 'No mempool available.'); @@ -852,17 +843,15 @@ RPC.prototype.getTXOut = async function getTXOut(args, help) { }; RPC.prototype.getTXOutProof = async function getTXOutProof(args, help) { - let valid = new Validator([args]); - let txids = valid.array(0); - let hash = valid.hash(1); - let uniq = {}; - let block, last; - if (help || (args.length !== 1 && args.length !== 2)) { throw new RPCError(errs.MISC_ERROR, 'gettxoutproof ["txid",...] ( blockhash )'); } + const valid = new Validator([args]); + const txids = valid.array(0); + const hash = valid.hash(1); + if (this.chain.options.spv) throw new RPCError(errs.MISC_ERROR, 'Cannot get coins in SPV mode.'); @@ -872,74 +861,80 @@ RPC.prototype.getTXOutProof = async function getTXOutProof(args, help) { if (!txids || txids.length === 0) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid TXIDs.'); - valid = new Validator([txids]); + const items = new Validator([txids]); + const set = new Set(); + const hashes = []; + + let last = null; for (let i = 0; i < txids.length; i++) { - let txid = valid.hash(i); + const hash = items.hash(i); - if (!txid) + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid TXID.'); - if (uniq[txid]) + if (set.has(hash)) throw new RPCError(errs.INVALID_PARAMETER, 'Duplicate txid.'); - uniq[txid] = true; - txids[i] = txid; - last = txid; + set.add(hash); + hashes.push(hash); + + last = hash; } + let block = null; + if (hash) { block = await this.chain.db.getBlock(hash); } else if (this.chain.options.indexTX) { - let tx = await this.chain.db.getMeta(last); - if (!tx) - return; - block = await this.chain.db.getBlock(tx.block); + const tx = await this.chain.db.getMeta(last); + if (tx) + block = await this.chain.db.getBlock(tx.block); } else { - let coins = await this.chain.db.getCoins(last); - if (!coins) - return; - block = await this.chain.db.getBlock(coins.height); + const coin = await this.chain.db.getCoin(last, 0); + if (coin) + block = await this.chain.db.getBlock(coin.height); } if (!block) throw new RPCError(errs.MISC_ERROR, 'Block not found.'); - for (let txid of txids) { - if (!block.hasTX(txid)) { + for (const hash of hashes) { + if (!block.hasTX(hash)) { throw new RPCError(errs.VERIFY_ERROR, 'Block does not contain all txids.'); } } - block = MerkleBlock.fromHashes(block, txids); + block = MerkleBlock.fromHashes(block, hashes); return block.toRaw().toString('hex'); }; RPC.prototype.verifyTXOutProof = async function verifyTXOutProof(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let out = []; - let block, entry; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'verifytxoutproof "proof"'); + const valid = new Validator([args]); + const data = valid.buf(0); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid hex string.'); - block = MerkleBlock.fromRaw(data); + const block = MerkleBlock.fromRaw(data); if (!block.verify()) - return out; + return []; - entry = await this.chain.db.getEntry(block.hash('hex')); + const entry = await this.chain.db.getEntry(block.hash('hex')); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Block not found in chain.'); - for (let hash of block.tree.matches) + const tree = block.getTree(); + const out = []; + + for (const hash of tree.matches) out.push(util.revHex(hash)); return out; @@ -984,13 +979,13 @@ RPC.prototype.pruneBlockchain = async function pruneBlockchain(args, help) { }; RPC.prototype.verifyChain = async function verifyChain(args, help) { - let valid = new Validator([args]); - let level = valid.u32(0); - let blocks = valid.u32(1); - if (help || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'verifychain ( checklevel numblocks )'); + const valid = new Validator([args]); + const level = valid.u32(0); + const blocks = valid.u32(1); + if (level == null || blocks == null) throw new RPCError(errs.TYPE_ERROR, 'Missing parameters.'); @@ -1008,7 +1003,7 @@ RPC.prototype.verifyChain = async function verifyChain(args, help) { */ RPC.prototype.submitWork = async function submitWork(data) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._submitWork(data); } finally { @@ -1017,9 +1012,7 @@ RPC.prototype.submitWork = async function submitWork(data) { }; RPC.prototype._submitWork = async function _submitWork(data) { - let attempt = this.attempt; - let header, nonce, ts, nonces; - let n1, n2, proof, block, entry; + const attempt = this.attempt; if (!attempt) return false; @@ -1027,10 +1020,10 @@ RPC.prototype._submitWork = async function _submitWork(data) { if (data.length !== 128) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid work size.'); - header = Headers.fromAbbr(data); + const raw = data.slice(0, 80); + swap32(raw); - data = data.slice(0, 80); - data = swap32(data); + const header = Headers.fromHead(raw); if (header.prevBlock !== attempt.prevBlock || header.bits !== attempt.bits) { @@ -1040,23 +1033,23 @@ RPC.prototype._submitWork = async function _submitWork(data) { if (!header.verify()) return false; - nonces = this.merkleMap.get(header.merkleRoot); + const nonces = this.merkleMap.get(header.merkleRoot); if (!nonces) return false; - n1 = nonces.nonce1; - n2 = nonces.nonce2; - nonce = header.nonce; - ts = header.ts; + const [n1, n2] = nonces; + const nonce = header.nonce; + const time = header.time; - proof = attempt.getProof(n1, n2, ts, nonce); + const proof = attempt.getProof(n1, n2, time, nonce); if (!proof.verify(attempt.target)) return false; - block = attempt.commit(proof); + const block = attempt.commit(proof); + let entry; try { entry = await this.chain.add(block); } catch (err) { @@ -1078,7 +1071,7 @@ RPC.prototype._submitWork = async function _submitWork(data) { }; RPC.prototype.createWork = async function createWork(data) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._createWork(data); } finally { @@ -1087,24 +1080,23 @@ RPC.prototype.createWork = async function createWork(data) { }; RPC.prototype._createWork = async function _createWork() { - let attempt = await this.updateWork(); - let n1 = this.nonce1; - let n2 = this.nonce2; - let ts = attempt.ts; - let data, root, head; + const attempt = await this.updateWork(); + const n1 = this.nonce1; + const n2 = this.nonce2; + const time = attempt.time; - data = Buffer.allocUnsafe(128); + const data = Buffer.allocUnsafe(128); data.fill(0); - root = attempt.getRoot(n1, n2); - head = attempt.getHeader(root, ts, 0); + const root = attempt.getRoot(n1, n2); + const head = attempt.getHeader(root, time, 0); head.copy(data, 0); data[80] = 0x80; data.writeUInt32BE(80 * 8, data.length - 4, true); - data = swap32(data); + swap32(data); return { data: data.toString('hex'), @@ -1119,13 +1111,13 @@ RPC.prototype.getWorkLongpoll = async function getWorkLongpoll(args, help) { }; RPC.prototype.getWork = async function getWork(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - if (args.length > 1) throw new RPCError(errs.MISC_ERROR, 'getwork ( "data" )'); if (args.length === 1) { + const valid = new Validator([args]); + const data = valid.buf(0); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid work data.'); @@ -1136,49 +1128,40 @@ RPC.prototype.getWork = async function getWork(args, help) { }; RPC.prototype.submitBlock = async function submitBlock(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let block; - if (help || args.length < 1 || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'submitblock "hexdata" ( "jsonparametersobject" )'); } - block = Block.fromRaw(data); + const valid = new Validator([args]); + const data = valid.buf(0); + + const block = Block.fromRaw(data); return await this.addBlock(block); }; RPC.prototype.getBlockTemplate = async function getBlockTemplate(args, help) { - let validator = new Validator([args]); - let options = validator.obj(0, {}); - let valid = new Validator([options]); - let mode = valid.str('mode', 'template'); - let lpid = valid.str('longpollid'); - let data = valid.buf('data'); - let rules = valid.array('rules'); - let capabilities = valid.array('capabilities'); - let maxVersion = valid.u32('maxversion', -1); - let coinbase = false; - let txnCap = false; - let valueCap = false; - if (help || args.length > 1) { throw new RPCError(errs.MISC_ERROR, 'getblocktemplate ( "jsonrequestobject" )'); } + const validator = new Validator([args]); + const options = validator.obj(0, {}); + const valid = new Validator([options]); + const mode = valid.str('mode', 'template'); + if (mode !== 'template' && mode !== 'proposal') throw new RPCError(errs.INVALID_PARAMETER, 'Invalid mode.'); if (mode === 'proposal') { - let block; + const data = valid.buf('data'); if (!data) throw new RPCError(errs.TYPE_ERROR, 'Missing data parameter.'); - block = Block.fromRaw(data); + const block = Block.fromRaw(data); if (block.prevBlock !== this.chain.tip.hash) return 'inconclusive-not-best-prevblk'; @@ -1194,11 +1177,20 @@ RPC.prototype.getBlockTemplate = async function getBlockTemplate(args, help) { return null; } + let maxVersion = valid.u32('maxversion', -1); + let rules = valid.array('rules'); + if (rules) maxVersion = -1; + const capabilities = valid.array('capabilities'); + let coinbase = false; + if (capabilities) { - for (let capability of capabilities) { + let txnCap = false; + let valueCap = false; + + for (const capability of capabilities) { if (typeof capability !== 'string') throw new RPCError(errs.TYPE_ERROR, 'Invalid capability.'); @@ -1244,6 +1236,8 @@ RPC.prototype.getBlockTemplate = async function getBlockTemplate(args, help) { } } + const lpid = valid.str('longpollid'); + if (lpid) await this.handleLongpoll(lpid); @@ -1254,7 +1248,7 @@ RPC.prototype.getBlockTemplate = async function getBlockTemplate(args, help) { }; RPC.prototype.createTemplate = async function createTemplate(maxVersion, coinbase, rules) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._createTemplate(maxVersion, coinbase, rules); } finally { @@ -1263,15 +1257,11 @@ RPC.prototype.createTemplate = async function createTemplate(maxVersion, coinbas }; RPC.prototype._createTemplate = async function _createTemplate(maxVersion, coinbase, rules) { - let attempt = await this.getTemplate(); - let version = attempt.version; - let scale = attempt.witness ? 1 : consensus.WITNESS_SCALE_FACTOR; - let mutable = ['time', 'transactions', 'prevblock']; - let txs = []; - let index = {}; - let vbavailable = {}; - let vbrules = []; - let json; + const attempt = await this.getTemplate(); + const scale = attempt.witness ? 1 : consensus.WITNESS_SCALE_FACTOR; + + // Default mutable fields. + const mutable = ['time', 'transactions', 'prevblock']; // The miner doesn't support // versionbits. Force them to @@ -1290,20 +1280,22 @@ RPC.prototype._createTemplate = async function _createTemplate(maxVersion, coinb } // Build an index of every transaction. + const index = new Map(); for (let i = 0; i < attempt.items.length; i++) { - let entry = attempt.items[i]; - index[entry.hash] = i + 1; + const entry = attempt.items[i]; + index.set(entry.hash, i + 1); } // Calculate dependencies for each transaction. + const txs = []; for (let i = 0; i < attempt.items.length; i++) { - let entry = attempt.items[i]; - let tx = entry.tx; - let deps = []; + const entry = attempt.items[i]; + const tx = entry.tx; + const deps = []; for (let j = 0; j < tx.inputs.length; j++) { - let input = tx.inputs[j]; - let dep = index[input.prevout.hash]; + const input = tx.inputs[j]; + const dep = index.get(input.prevout.hash); if (dep == null) continue; @@ -1334,8 +1326,12 @@ RPC.prototype._createTemplate = async function _createTemplate(maxVersion, coinb rules.push('segwit'); // Calculate version based on given rules. - for (let deploy of this.network.deploys) { - let state = await this.chain.getState(this.chain.tip, deploy); + let version = attempt.version; + const vbavailable = {}; + const vbrules = []; + + for (const deploy of this.network.deploys) { + const state = await this.chain.getState(this.chain.tip, deploy); let name = deploy.name; switch (state) { @@ -1371,7 +1367,7 @@ RPC.prototype._createTemplate = async function _createTemplate(maxVersion, coinb version >>>= 0; - json = { + const json = { capabilities: ['proposal'], mutable: mutable, version: version, @@ -1383,10 +1379,10 @@ RPC.prototype._createTemplate = async function _createTemplate(maxVersion, coinb target: util.revHex(attempt.target.toString('hex')), bits: util.hex32(attempt.bits), noncerange: '00000000ffffffff', - curtime: attempt.ts, + curtime: attempt.time, mintime: attempt.mtp + 1, - maxtime: attempt.ts + 7200, - expires: attempt.ts + 7200, + maxtime: attempt.time + 7200, + expires: attempt.time + 7200, sigoplimit: consensus.MAX_BLOCK_SIGOPS_COST / scale | 0, sizelimit: consensus.MAX_BLOCK_SIZE, weightlimit: undefined, @@ -1411,25 +1407,25 @@ RPC.prototype._createTemplate = async function _createTemplate(maxVersion, coinb // The client wants a coinbasetxn // instead of a coinbasevalue. if (coinbase) { - let tx = attempt.toCoinbase(); + const tx = attempt.toCoinbase(); + const input = tx.inputs[0]; // Pop off the nonces. - tx.inputs[0].script.code.pop(); - tx.inputs[0].script.compile(); + input.script.pop(); + input.script.compile(); if (attempt.witness) { // We don't include the commitment // output (see bip145). - let output = tx.outputs.pop(); + const output = tx.outputs.pop(); assert(output.script.isCommitment()); // Also not including the witness nonce. - tx.inputs[0].witness.length = 0; - tx.inputs[0].witness.compile(); - - tx.refresh(); + input.witness.clear(); } + tx.refresh(); + json.coinbasetxn = { data: tx.toRaw().toString('hex'), txid: tx.txid(), @@ -1450,22 +1446,22 @@ RPC.prototype._createTemplate = async function _createTemplate(maxVersion, coinb }; RPC.prototype.getMiningInfo = async function getMiningInfo(args, help) { - let attempt = this.attempt; + if (help || args.length !== 0) + throw new RPCError(errs.MISC_ERROR, 'getmininginfo'); + + const attempt = this.attempt; + let size = 0; let weight = 0; let txs = 0; let diff = 0; - let item; - - if (help || args.length !== 0) - throw new RPCError(errs.MISC_ERROR, 'getmininginfo'); if (attempt) { weight = attempt.weight; txs = attempt.items.length + 1; diff = attempt.getDifficulty(); size = 1000; - for (item of attempt.items) + for (const item of attempt.items) size += item.tx.getBaseSize(); } @@ -1488,28 +1484,27 @@ RPC.prototype.getMiningInfo = async function getMiningInfo(args, help) { }; RPC.prototype.getNetworkHashPS = async function getNetworkHashPS(args, help) { - let valid = new Validator([args]); - let lookup = valid.u32(0, 120); - let height = valid.u32(1); - if (help || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'getnetworkhashps ( blocks height )'); + const valid = new Validator([args]); + const lookup = valid.u32(0, 120); + const height = valid.u32(1); + return await this.getHashRate(lookup, height); }; RPC.prototype.prioritiseTransaction = async function prioritiseTransaction(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let pri = valid.num(1); - let fee = valid.i64(2); - let entry; - if (help || args.length !== 3) { throw new RPCError(errs.MISC_ERROR, 'prioritisetransaction '); } + const valid = new Validator([args]); + const hash = valid.hash(0); + const pri = valid.i64(1); + const fee = valid.i64(2); + if (!this.mempool) throw new RPCError(errs.MISC_ERROR, 'No mempool available.'); @@ -1519,7 +1514,7 @@ RPC.prototype.prioritiseTransaction = async function prioritiseTransaction(args, if (pri == null || fee == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid fee or priority.'); - entry = this.mempool.getEntry(hash); + const entry = this.mempool.getEntry(hash); if (!entry) throw new RPCError(errs.MISC_ERROR, 'Transaction not in mempool.'); @@ -1530,20 +1525,19 @@ RPC.prototype.prioritiseTransaction = async function prioritiseTransaction(args, }; RPC.prototype.verifyBlock = async function verifyBlock(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let block; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'verifyblock "block-hex"'); + const valid = new Validator([args]); + const data = valid.buf(0); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid block hex.'); if (this.chain.options.spv) throw new RPCError(errs.MISC_ERROR, 'Cannot verify block in SPV mode.'); - block = Block.fromRaw(data); + const block = Block.fromRaw(data); try { await this.chain.verifyBlock(block); @@ -1567,13 +1561,13 @@ RPC.prototype.getGenerate = async function getGenerate(args, help) { }; RPC.prototype.setGenerate = async function setGenerate(args, help) { - let valid = new Validator([args]); - let mine = valid.bool(0, false); - let limit = valid.u32(1, 0); - if (help || args.length < 1 || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'setgenerate mine ( proclimit )'); + const valid = new Validator([args]); + const mine = valid.bool(0, false); + const limit = valid.u32(1, 0); + if (mine && this.miner.addresses.length === 0) { throw new RPCError(errs.MISC_ERROR, 'No addresses available for coinbase.'); @@ -1593,13 +1587,13 @@ RPC.prototype.setGenerate = async function setGenerate(args, help) { }; RPC.prototype.generate = async function generate(args, help) { - let valid = new Validator([args]); - let blocks = valid.u32(0, 1); - let tries = valid.u32(1); - if (help || args.length < 1 || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'generate numblocks ( maxtries )'); + const valid = new Validator([args]); + const blocks = valid.u32(0, 1); + const tries = valid.u32(1); + if (this.miner.addresses.length === 0) { throw new RPCError(errs.MISC_ERROR, 'No addresses available for coinbase.'); @@ -1608,18 +1602,18 @@ RPC.prototype.generate = async function generate(args, help) { return await this.mineBlocks(blocks, null, tries); }; -RPC.prototype.generateToAddress = async function _generateToAddress(args, help) { - let valid = new Validator([args]); - let blocks = valid.u32(0, 1); - let addr = valid.str(1, ''); - let tries = valid.u32(2); - +RPC.prototype.generateToAddress = async function generateToAddress(args, help) { if (help || args.length < 2 || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'generatetoaddress numblocks address ( maxtries )'); } - addr = parseAddress(addr, this.network); + const valid = new Validator([args]); + const blocks = valid.u32(0, 1); + const str = valid.str(1, ''); + const tries = valid.u32(2); + + const addr = parseAddress(str, this.network); return await this.mineBlocks(blocks, addr, tries); }; @@ -1629,12 +1623,6 @@ RPC.prototype.generateToAddress = async function _generateToAddress(args, help) */ RPC.prototype.createRawTransaction = async function createRawTransaction(args, help) { - let valid = new Validator([args]); - let inputs = valid.array(0); - let sendTo = valid.obj(1); - let locktime = valid.u32(2); - let tx, keys, addrs; - if (help || args.length < 2 || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'createrawtransaction' @@ -1643,20 +1631,25 @@ RPC.prototype.createRawTransaction = async function createRawTransaction(args, h + ' ( locktime )'); } + const valid = new Validator([args]); + const inputs = valid.array(0); + const sendTo = valid.obj(1); + const locktime = valid.u32(2); + if (!inputs || !sendTo) { throw new RPCError(errs.TYPE_ERROR, 'Invalid parameters (inputs and sendTo).'); } - tx = new MTX(); + const tx = new MTX(); if (locktime != null) tx.locktime = locktime; - for (let input of tx.inputs) { - let valid = new Validator([input]); - let hash = valid.hash('txid'); - let index = valid.u32('vout'); + for (const obj of tx.inputs) { + const valid = new Validator([obj]); + const hash = valid.hash('txid'); + const index = valid.u32('vout'); let sequence = valid.u32('sequence', 0xffffffff); if (tx.locktime) @@ -1665,7 +1658,7 @@ RPC.prototype.createRawTransaction = async function createRawTransaction(args, h if (!hash || index == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid outpoint.'); - input = new Input(); + const input = new Input(); input.prevout.hash = hash; input.prevout.index = index; input.sequence = sequence; @@ -1673,21 +1666,17 @@ RPC.prototype.createRawTransaction = async function createRawTransaction(args, h tx.inputs.push(input); } - keys = Object.keys(sendTo); - valid = new Validator([sendTo]); - addrs = {}; - - for (let key of keys) { - let addr, b58, value, output; + const sends = new Validator([sendTo]); + const uniq = new Set(); + for (const key of Object.keys(sendTo)) { if (key === 'data') { - let value = valid.buf(key); - let output; + const value = sends.buf(key); if (!value) throw new RPCError(errs.TYPE_ERROR, 'Invalid nulldata..'); - output = new Output(); + const output = new Output(); output.value = 0; output.script.fromNulldata(value); tx.outputs.push(output); @@ -1695,20 +1684,20 @@ RPC.prototype.createRawTransaction = async function createRawTransaction(args, h continue; } - addr = parseAddress(key, this.network); - b58 = addr.toString(this.network); + const addr = parseAddress(key, this.network); + const b58 = addr.toString(this.network); - if (addrs[b58]) + if (uniq.has(b58)) throw new RPCError(errs.INVALID_PARAMETER, 'Duplicate address'); - addrs[b58] = true; + uniq.add(b58); - value = valid.btc(key); + const value = sends.ufixed(key, 8); if (value == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid output value.'); - output = new Output(); + const output = new Output(); output.value = value; output.script.fromAddress(addr); @@ -1719,88 +1708,85 @@ RPC.prototype.createRawTransaction = async function createRawTransaction(args, h }; RPC.prototype.decodeRawTransaction = async function decodeRawTransaction(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let tx; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'decoderawtransaction "hexstring"'); + const valid = new Validator([args]); + const data = valid.buf(0); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid hex string.'); - tx = TX.fromRaw(data); + const tx = TX.fromRaw(data); return this.txToJSON(tx); }; RPC.prototype.decodeScript = async function decodeScript(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let script, addr; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'decodescript "hex"'); - script = new Script(); + const valid = new Validator([args]); + const data = valid.buf(0); + + let script = new Script(); if (data) script = Script.fromRaw(data); - addr = Address.fromScripthash(script.hash160()); + const addr = Address.fromScripthash(script.hash160()); - script = this.scriptToJSON(script); - script.p2sh = addr.toString(this.network); + const json = this.scriptToJSON(script); + json.p2sh = addr.toString(this.network); - return script; + return json; }; RPC.prototype.getRawTransaction = async function getRawTransaction(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - let verbose = valid.bool(1, false); - let json, meta, tx, entry; - if (help || args.length < 1 || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'getrawtransaction "txid" ( verbose )'); + const valid = new Validator([args]); + const hash = valid.hash(0); + const verbose = valid.bool(1, false); + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid TXID.'); - meta = await this.node.getMeta(hash); + const meta = await this.node.getMeta(hash); if (!meta) - throw new RPCError(errs.MISC_ERROR, 'Transaction not found.'); + throw new RPCError(errs.INVALID_ADDRESS_OR_KEY, 'Transaction not found.'); - tx = meta.tx; + const tx = meta.tx; if (!verbose) return tx.toRaw().toString('hex'); + let entry; if (meta.block) entry = await this.chain.db.getEntry(meta.block); - json = this.txToJSON(tx, entry); - json.time = meta.ps; + const json = this.txToJSON(tx, entry); + json.time = meta.mtime; json.hex = tx.toRaw().toString('hex'); return json; }; RPC.prototype.sendRawTransaction = async function sendRawTransaction(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let tx; - if (help || args.length < 1 || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'sendrawtransaction "hexstring" ( allowhighfees )'); } + const valid = new Validator([args]); + const data = valid.buf(0); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid hex string.'); - tx = TX.fromRaw(data); + const tx = TX.fromRaw(data); this.node.relay(tx); @@ -1808,16 +1794,6 @@ RPC.prototype.sendRawTransaction = async function sendRawTransaction(args, help) }; RPC.prototype.signRawTransaction = async function signRawTransaction(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let prevout = valid.array(1); - let secrets = valid.array(2); - let sighash = valid.str(3); - let type = Script.hashType.ALL; - let keys = []; - let map = {}; - let tx; - if (help || args.length < 1 || args.length > 4) { throw new RPCError(errs.MISC_ERROR, 'signrawtransaction' @@ -1827,66 +1803,71 @@ RPC.prototype.signRawTransaction = async function signRawTransaction(args, help) + ' sighashtype )'); } + const valid = new Validator([args]); + const data = valid.buf(0); + const prevout = valid.array(1); + const secrets = valid.array(2); + const sighash = valid.str(3); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid hex string.'); if (!this.mempool) throw new RPCError(errs.MISC_ERROR, 'No mempool available.'); - tx = MTX.fromRaw(data); + const tx = MTX.fromRaw(data); tx.view = await this.mempool.getSpentView(tx); + const map = new Map(); + const keys = []; + if (secrets) { - let valid = new Validator([secrets]); + const valid = new Validator([secrets]); for (let i = 0; i < secrets.length; i++) { - let secret = valid.str(i, ''); - let key = parseSecret(secret, this.network); - map[key.getPublicKey('hex')] = key; + const secret = valid.str(i, ''); + const key = parseSecret(secret, this.network); + map.set(key.getPublicKey('hex'), key); keys.push(key); } } if (prevout) { - for (let prev of prevout) { - let valid = new Validator([prev]); - let hash = valid.hash('txid'); - let index = valid.u32('index'); - let script = valid.buf('scriptPubKey'); - let value = valid.btc('amount'); - let redeem = valid.buf('redeemScript'); - let coin; - - if (!hash || index == null || !script || value == null) + for (const prev of prevout) { + const valid = new Validator([prev]); + const hash = valid.hash('txid'); + const index = valid.u32('index'); + const scriptRaw = valid.buf('scriptPubKey'); + const value = valid.ufixed('amount', 8); + const redeemRaw = valid.buf('redeemScript'); + + if (!hash || index == null || !scriptRaw || value == null) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid UTXO.'); - script = Script.fromRaw(script); + const outpoint = new Outpoint(hash, index); - coin = new Output(); - coin.script = script; - coin.value = value; + const script = Script.fromRaw(scriptRaw); + const coin = Output.fromScript(script, value); - tx.view.addOutput(hash, index, coin); + tx.view.addOutput(outpoint, coin); - if (keys.length === 0 || !redeem) + if (keys.length === 0 || !redeemRaw) continue; if (!script.isScripthash() && !script.isWitnessScripthash()) continue; - if (!redeem) { + if (!redeemRaw) { throw new RPCError(errs.INVALID_PARAMETER, 'P2SH requires redeem script.'); } - redeem = Script.fromRaw(redeem); - - for (let op of redeem.code) { - let key; + const redeem = Script.fromRaw(redeemRaw); + for (const op of redeem.code) { if (!op.data) continue; - key = map[op.data.toString('hex')]; + const key = map.get(op.data.toString('hex')); if (key) { key.script = redeem; @@ -1898,14 +1879,16 @@ RPC.prototype.signRawTransaction = async function signRawTransaction(args, help) } } + let type = Script.hashType.ALL; if (sighash) { - let parts = sighash.split('|'); - let type = Script.hashType[parts[0]]; + const parts = sighash.split('|'); - if (type == null) + if (parts.length < 1 || parts.length > 2) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid sighash type.'); - if (parts.length > 2) + type = Script.hashType[parts[0]]; + + if (type == null) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid sighash type.'); if (parts.length === 2) { @@ -1928,22 +1911,21 @@ RPC.prototype.signRawTransaction = async function signRawTransaction(args, help) */ RPC.prototype.createMultisig = async function createMultisig(args, help) { - let valid = new Validator([args]); - let keys = valid.array(1, []); - let m = valid.u32(0, 0); - let n = keys.length; - let script, addr; - if (help || args.length < 2 || args.length > 2) throw new RPCError(errs.MISC_ERROR, 'createmultisig nrequired ["key",...]'); + const valid = new Validator([args]); + const keys = valid.array(1, []); + const m = valid.u32(0, 0); + const n = keys.length; + if (m < 1 || n < m || n > 16) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid m and n values.'); - valid = new Validator([keys]); + const items = new Validator([keys]); for (let i = 0; i < keys.length; i++) { - let key = valid.buf(i); + const key = items.buf(i); if (!key) throw new RPCError(errs.TYPE_ERROR, 'Invalid key.'); @@ -1954,12 +1936,12 @@ RPC.prototype.createMultisig = async function createMultisig(args, help) { keys[i] = key; } - script = Script.fromMultisig(m, n, keys); + const script = Script.fromMultisig(m, n, keys); if (script.getSize() > consensus.MAX_SCRIPT_PUSH) throw new RPCError(errs.VERIFY_ERROR, 'Redeem script exceeds size limit.'); - addr = script.getAddress(); + const addr = script.getAddress(); return { address: addr.toString(this.network), @@ -1968,19 +1950,18 @@ RPC.prototype.createMultisig = async function createMultisig(args, help) { }; RPC.prototype.createWitnessAddress = async function createWitnessAddress(args, help) { - let valid = new Validator([args]); - let raw = valid.buf(0); - let script, program, addr; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'createwitnessaddress "script"'); + const valid = new Validator([args]); + const raw = valid.buf(0); + if (!raw) throw new RPCError(errs.TYPE_ERROR, 'Invalid script hex.'); - script = Script.fromRaw(raw); - program = script.forWitness(); - addr = program.getAddress(); + const script = Script.fromRaw(raw); + const program = script.forWitness(); + const addr = program.getAddress(); return { address: addr.toString(this.network), @@ -1989,22 +1970,22 @@ RPC.prototype.createWitnessAddress = async function createWitnessAddress(args, h }; RPC.prototype.validateAddress = async function validateAddress(args, help) { - let valid = new Validator([args]); - let b58 = valid.str(0, ''); - let addr, script; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'validateaddress "bitcoinaddress"'); + const valid = new Validator([args]); + const str = valid.str(0, ''); + + let addr; try { - addr = Address.fromString(b58, this.network); + addr = Address.fromString(str, this.network); } catch (e) { return { isvalid: false }; } - script = Script.fromAddress(addr); + const script = Script.fromAddress(addr); return { isvalid: true, @@ -2016,70 +1997,60 @@ RPC.prototype.validateAddress = async function validateAddress(args, help) { }; RPC.prototype.verifyMessage = async function verifyMessage(args, help) { - let valid = new Validator([args]); - let b58 = valid.str(0, ''); - let sig = valid.buf(1, null, 'base64'); - let msg = valid.str(2); - let addr, key; - if (help || args.length !== 3) { throw new RPCError(errs.MISC_ERROR, 'verifymessage "bitcoinaddress" "signature" "message"'); } - if (!sig || !msg) - throw new RPCError(errs.TYPE_ERROR, 'Invalid parameters.'); + const valid = new Validator([args]); + const b58 = valid.str(0, ''); + const sig = valid.buf(1, null, 'base64'); + const str = valid.str(2); - addr = parseAddress(b58, this.network); + if (!sig || !str) + throw new RPCError(errs.TYPE_ERROR, 'Invalid parameters.'); - msg = Buffer.from(MAGIC_STRING + msg, 'utf8'); - msg = digest.hash256(msg); + const addr = parseAddress(b58, this.network); + const msg = Buffer.from(MAGIC_STRING + str, 'utf8'); + const hash = digest.hash256(msg); - key = secp256k1.recover(msg, sig, 0, true); + const key = secp256k1.recover(hash, sig, 0, true); if (!key) return false; - key = digest.hash160(key); - - return ccmp(key, addr.hash); + return ccmp(digest.hash160(key), addr.hash); }; RPC.prototype.signMessageWithPrivkey = async function signMessageWithPrivkey(args, help) { - let valid = new Validator([args]); - let key = valid.str(0, ''); - let msg = valid.str(1, ''); - let sig; - if (help || args.length !== 2) { throw new RPCError(errs.MISC_ERROR, 'signmessagewithprivkey "privkey" "message"'); } - key = parseSecret(key, this.network); - msg = Buffer.from(MAGIC_STRING + msg, 'utf8'); - msg = digest.hash256(msg); + const valid = new Validator([args]); + const wif = valid.str(0, ''); + const str = valid.str(1, ''); - sig = key.sign(msg); + const key = parseSecret(wif, this.network); + const msg = Buffer.from(MAGIC_STRING + str, 'utf8'); + const hash = digest.hash256(msg); + const sig = key.sign(hash); return sig.toString('base64'); }; RPC.prototype.estimateFee = async function estimateFee(args, help) { - let valid = new Validator([args]); - let blocks = valid.u32(0, 1); - let fee; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'estimatefee nblocks'); + const valid = new Validator([args]); + const blocks = valid.u32(0, 1); + if (!this.fees) throw new RPCError(errs.MISC_ERROR, 'Fee estimation not available.'); - if (blocks < 1) - blocks = 1; - - fee = this.fees.estimateFee(blocks, false); + const fee = this.fees.estimateFee(blocks, false); if (fee === 0) return -1; @@ -2088,36 +2059,29 @@ RPC.prototype.estimateFee = async function estimateFee(args, help) { }; RPC.prototype.estimatePriority = async function estimatePriority(args, help) { - let valid = new Validator([args]); - let blocks = valid.u32(0, 1); - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'estimatepriority nblocks'); + const valid = new Validator([args]); + const blocks = valid.u32(0, 1); + if (!this.fees) throw new RPCError(errs.MISC_ERROR, 'Priority estimation not available.'); - if (blocks < 1) - blocks = 1; - return this.fees.estimatePriority(blocks, false); }; RPC.prototype.estimateSmartFee = async function estimateSmartFee(args, help) { - let valid = new Validator([args]); - let blocks = valid.u32(0, 1); - let fee; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'estimatesmartfee nblocks'); + const valid = new Validator([args]); + const blocks = valid.u32(0, 1); + if (!this.fees) throw new RPCError(errs.MISC_ERROR, 'Fee estimation not available.'); - if (blocks < 1) - blocks = 1; - - fee = this.fees.estimateFee(blocks, true); + let fee = this.fees.estimateFee(blocks, true); if (fee === 0) fee = -1; @@ -2131,20 +2095,16 @@ RPC.prototype.estimateSmartFee = async function estimateSmartFee(args, help) { }; RPC.prototype.estimateSmartPriority = async function estimateSmartPriority(args, help) { - let valid = new Validator([args]); - let blocks = valid.u32(0, 1); - let pri; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'estimatesmartpriority nblocks'); + const valid = new Validator([args]); + const blocks = valid.u32(0, 1); + if (!this.fees) throw new RPCError(errs.MISC_ERROR, 'Priority estimation not available.'); - if (blocks < 1) - blocks = 1; - - pri = this.fees.estimatePriority(blocks, true); + const pri = this.fees.estimatePriority(blocks, true); return { priority: pri, @@ -2153,12 +2113,12 @@ RPC.prototype.estimateSmartPriority = async function estimateSmartPriority(args, }; RPC.prototype.invalidateBlock = async function invalidateBlock(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'invalidateblock "hash"'); + const valid = new Validator([args]); + const hash = valid.hash(0); + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid block hash.'); @@ -2168,12 +2128,12 @@ RPC.prototype.invalidateBlock = async function invalidateBlock(args, help) { }; RPC.prototype.reconsiderBlock = async function reconsiderBlock(args, help) { - let valid = new Validator([args]); - let hash = valid.hash(0); - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'reconsiderblock "hash"'); + const valid = new Validator([args]); + const hash = valid.hash(0); + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid block hash.'); @@ -2183,19 +2143,18 @@ RPC.prototype.reconsiderBlock = async function reconsiderBlock(args, help) { }; RPC.prototype.setMockTime = async function setMockTime(args, help) { - let valid = new Validator([args]); - let ts = valid.u32(0); - let delta; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'setmocktime timestamp'); - if (ts == null) + const valid = new Validator([args]); + const time = valid.u32(0); + + if (time == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid timestamp.'); this.network.time.offset = 0; - delta = this.network.now() - ts; + const delta = this.network.now() - time; this.network.time.offset = -delta; @@ -2210,12 +2169,12 @@ RPC.prototype.getMemoryInfo = async function getMemoryInfo(args, help) { }; RPC.prototype.setLogLevel = async function setLogLevel(args, help) { - let valid = new Validator([args]); - let level = valid.str(0, ''); - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'setloglevel "level"'); + const valid = new Validator([args]); + const level = valid.str(0, ''); + this.logger.setLevel(level); return null; @@ -2226,20 +2185,18 @@ RPC.prototype.setLogLevel = async function setLogLevel(args, help) { */ RPC.prototype.handleLongpoll = async function handleLongpoll(lpid) { - let watched, lastTX; - if (lpid.length !== 74) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid longpoll ID.'); - watched = lpid.slice(0, 64); - lastTX = +lpid.slice(64, 74); + const watched = lpid.slice(0, 64); + const lastTX = parseInt(lpid.slice(64, 74), 10); - if (!util.isHex(watched) || !util.isNumber(lastTX) || lastTX < 0) + if (!util.isHex(watched) || !util.isU32(lastTX)) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid longpoll ID.'); - watched = util.revHex(watched); + const hash = util.revHex(watched); - if (this.chain.tip.hash !== watched) + if (this.chain.tip.hash !== hash) return; await this.longpoll(); @@ -2252,7 +2209,7 @@ RPC.prototype.longpoll = function longpoll() { }; RPC.prototype.refreshBlock = function refreshBlock() { - let pollers = this.pollers; + const pollers = this.pollers; this.attempt = null; this.lastActivity = 0; @@ -2261,7 +2218,7 @@ RPC.prototype.refreshBlock = function refreshBlock() { this.nonce2 = 0; this.pollers = []; - for (let job of pollers) + for (const job of pollers) job.resolve(); }; @@ -2291,10 +2248,10 @@ RPC.prototype.bindChain = function bindChain() { }; RPC.prototype.getTemplate = async function getTemplate() { - let attempt = this.attempt; - this.bindChain(); + let attempt = this.attempt; + if (attempt) { this.miner.updateTime(attempt); } else { @@ -2307,11 +2264,10 @@ RPC.prototype.getTemplate = async function getTemplate() { }; RPC.prototype.updateWork = async function updateWork() { - let attempt = this.attempt; - let root, n1, n2; - this.bindChain(); + let attempt = this.attempt; + if (attempt) { if (attempt.address.isNull()) { throw new RPCError(errs.MISC_ERROR, @@ -2325,13 +2281,13 @@ RPC.prototype.updateWork = async function updateWork() { this.nonce1++; } - n1 = this.nonce1; - n2 = this.nonce2; + const n1 = this.nonce1; + const n2 = this.nonce2; - root = attempt.getRoot(n1, n2); - root = root.toString('hex'); + const root = attempt.getRoot(n1, n2); + const hash = root.toString('hex'); - this.merkleMap.set(root, new Nonces(n1, n2)); + this.merkleMap.set(hash, [n1, n2]); return attempt; } @@ -2343,22 +2299,22 @@ RPC.prototype.updateWork = async function updateWork() { attempt = await this.miner.createBlock(); - n1 = this.nonce1; - n2 = this.nonce2; + const n1 = this.nonce1; + const n2 = this.nonce2; - root = attempt.getRoot(n1, n2); - root = root.toString('hex'); + const root = attempt.getRoot(n1, n2); + const hash = root.toString('hex'); this.attempt = attempt; this.lastActivity = util.now(); - this.merkleMap.set(root, new Nonces(n1, n2)); + this.merkleMap.set(hash, [n1, n2]); return attempt; }; RPC.prototype.addBlock = async function addBlock(block) { - let unlock1 = await this.locker.lock(); - let unlock2 = await this.chain.locker.lock(); + const unlock1 = await this.locker.lock(); + const unlock2 = await this.chain.locker.lock(); try { return await this._addBlock(block); } finally { @@ -2368,25 +2324,24 @@ RPC.prototype.addBlock = async function addBlock(block) { }; RPC.prototype._addBlock = async function _addBlock(block) { - let entry, prev; - this.logger.info('Handling submitted block: %s.', block.rhash()); - prev = await this.chain.db.getEntry(block.prevBlock); + const prev = await this.chain.db.getEntry(block.prevBlock); if (prev) { - let state = await this.chain.getDeployments(block.ts, prev); + const state = await this.chain.getDeployments(block.time, prev); // Fix eloipool bug (witness nonce is not present). if (state.hasWitness() && block.getCommitmentHash()) { - let tx = block.txs[0]; + const tx = block.txs[0]; + const input = tx.inputs[0]; if (!tx.hasWitness()) { this.logger.warning('Submitted block had no witness nonce.'); this.logger.debug(tx); // Recreate witness nonce (all zeroes). - tx.inputs[0].witness.set(0, encoding.ZERO_HASH); - tx.inputs[0].witness.compile(); + input.witness.push(encoding.ZERO_HASH); + input.witness.compile(); tx.refresh(); block.refresh(); @@ -2394,6 +2349,7 @@ RPC.prototype._addBlock = async function _addBlock(block) { } } + let entry; try { entry = await this.chain._add(block); } catch (err) { @@ -2427,11 +2383,11 @@ RPC.prototype.getSoftforks = function getSoftforks() { }; RPC.prototype.getBIP9Softforks = async function getBIP9Softforks() { - let tip = this.chain.tip; - let forks = {}; + const tip = this.chain.tip; + const forks = {}; - for (let deployment of this.network.deploys) { - let state = await this.chain.getState(tip, deployment); + for (const deployment of this.network.deploys) { + const state = await this.chain.getState(tip, deployment); let status; switch (state) { @@ -2468,7 +2424,6 @@ RPC.prototype.getBIP9Softforks = async function getBIP9Softforks() { RPC.prototype.getHashRate = async function getHashRate(lookup, height) { let tip = this.chain.tip; - let minTime, maxTime, workDiff, timeDiff, ps, entry; if (height != null) tip = await this.chain.db.getEntry(height); @@ -2476,38 +2431,41 @@ RPC.prototype.getHashRate = async function getHashRate(lookup, height) { if (!tip) return 0; - if (lookup <= 0) + assert(typeof lookup === 'number'); + assert(lookup >= 0); + + if (lookup === 0) lookup = tip.height % this.network.pow.retargetInterval + 1; if (lookup > tip.height) lookup = tip.height; - minTime = tip.ts; - maxTime = minTime; - entry = tip; + let min = tip.time; + let max = min; + let entry = tip; for (let i = 0; i < lookup; i++) { - let entry = await entry.getPrevious(); + entry = await entry.getPrevious(); if (!entry) throw new RPCError(errs.DATABASE_ERROR, 'Not found.'); - minTime = Math.min(entry.ts, minTime); - maxTime = Math.max(entry.ts, maxTime); + min = Math.min(entry.time, min); + max = Math.max(entry.time, max); } - if (minTime === maxTime) + const diff = max - min; + + if (diff === 0) return 0; - workDiff = tip.chainwork.sub(entry.chainwork); - timeDiff = maxTime - minTime; - ps = +workDiff.toString(10) / timeDiff; + const work = tip.chainwork.sub(entry.chainwork); - return ps; + return Number(work.toString()) / diff; }; RPC.prototype.mineBlocks = async function mineBlocks(blocks, addr, tries) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._mineBlocks(blocks, addr, tries); } finally { @@ -2516,12 +2474,13 @@ RPC.prototype.mineBlocks = async function mineBlocks(blocks, addr, tries) { }; RPC.prototype._mineBlocks = async function _mineBlocks(blocks, addr, tries) { - let hashes = []; + const hashes = []; for (let i = 0; i < blocks; i++) { - let block = await this.miner.mineBlock(null, addr); - hashes.push(block.rhash()); - assert(await this.chain.add(block)); + const block = await this.miner.mineBlock(null, addr); + const entry = await this.chain.add(block); + assert(entry); + hashes.push(entry.rhash()); } return hashes; @@ -2538,21 +2497,21 @@ RPC.prototype.findFork = async function findFork(entry) { RPC.prototype.txToJSON = function txToJSON(tx, entry) { let height = -1; - let conf = 0; let time = 0; let hash = null; - let vin = []; - let vout = []; + let conf = 0; if (entry) { height = entry.height; - time = entry.ts; + time = entry.time; hash = entry.rhash(); conf = this.chain.height - height + 1; } - for (let input of tx.inputs) { - let json = { + const vin = []; + + for (const input of tx.inputs) { + const json = { coinbase: undefined, txid: undefined, scriptSig: undefined, @@ -2580,8 +2539,10 @@ RPC.prototype.txToJSON = function txToJSON(tx, entry) { vin.push(json); } + const vout = []; + for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; + const output = tx.outputs[i]; vout.push({ value: Amount.btc(output.value, true), n: i, @@ -2607,11 +2568,9 @@ RPC.prototype.txToJSON = function txToJSON(tx, entry) { }; RPC.prototype.scriptToJSON = function scriptToJSON(script, hex) { - let type = script.getType(); - let addr = script.getAddress(); - let out; + const type = script.getType(); - out = { + const json = { asm: script.toASM(), hex: undefined, type: Script.typesByVal[type], @@ -2621,22 +2580,26 @@ RPC.prototype.scriptToJSON = function scriptToJSON(script, hex) { }; if (hex) - out.hex = script.toJSON(); + json.hex = script.toJSON(); + + const [m] = script.getMultisig(); - if (script.isMultisig()) - out.reqSigs = script.getSmall(0); + if (m !== -1) + json.reqSigs = m; + + const addr = script.getAddress(); if (addr) { - addr = addr.toString(this.network); - out.addresses.push(addr); + const str = addr.toString(this.network); + json.addresses.push(str); } - return out; + return json; }; RPC.prototype.headerToJSON = async function headerToJSON(entry) { - let mtp = await entry.getMedianTime(); - let next = await this.chain.db.getNextHash(entry.hash); + const mtp = await entry.getMedianTime(); + const next = await this.chain.db.getNextHash(entry.hash); return { hash: entry.rhash(), @@ -2645,7 +2608,7 @@ RPC.prototype.headerToJSON = async function headerToJSON(entry) { version: entry.version, versionHex: util.hex32(entry.version), merkleroot: util.revHex(entry.merkleRoot), - time: entry.ts, + time: entry.time, mediantime: mtp, bits: entry.bits, difficulty: toDifficulty(entry.bits), @@ -2658,13 +2621,13 @@ RPC.prototype.headerToJSON = async function headerToJSON(entry) { }; RPC.prototype.blockToJSON = async function blockToJSON(entry, block, details) { - let mtp = await entry.getMedianTime(); - let next = await this.chain.db.getNextHash(entry.hash); - let txs = []; + const mtp = await entry.getMedianTime(); + const next = await this.chain.db.getNextHash(entry.hash); + const txs = []; - for (let tx of block.txs) { + for (const tx of block.txs) { if (details) { - let json = this.txToJSON(tx, entry); + const json = this.txToJSON(tx, entry); txs.push(json); continue; } @@ -2683,7 +2646,7 @@ RPC.prototype.blockToJSON = async function blockToJSON(entry, block, details) { merkleroot: util.revHex(entry.merkleRoot), coinbase: block.txs[0].inputs[0].script.toJSON(), tx: txs, - time: entry.ts, + time: entry.time, mediantime: mtp, bits: entry.bits, difficulty: toDifficulty(entry.bits), @@ -2700,7 +2663,7 @@ RPC.prototype.entryToJSON = function entryToJSON(entry) { size: entry.size, fee: Amount.btc(entry.deltaFee, true), modifiedfee: 0, - time: entry.ts, + time: entry.time, height: entry.height, startingpriority: entry.priority, currentpriority: entry.getPriority(this.chain.height), @@ -2720,7 +2683,7 @@ RPC.prototype.entryToJSON = function entryToJSON(entry) { function swap32(data) { for (let i = 0; i < data.length; i += 4) { - let field = data.readUInt32LE(i, true); + const field = data.readUInt32LE(i, true); data.writeUInt32BE(field, i, true); } return data; @@ -2736,11 +2699,6 @@ function toDeployment(id, version, status) { }; } -function Nonces(n1, n2) { - this.nonce1 = n1; - this.nonce2 = n2; -} - function parseAddress(raw, network) { try { return Address.fromString(raw, network); diff --git a/lib/http/rpcbase.js b/lib/http/rpcbase.js index ead171b91..038c15504 100644 --- a/lib/http/rpcbase.js +++ b/lib/http/rpcbase.js @@ -8,7 +8,6 @@ const assert = require('assert'); const EventEmitter = require('events'); -const util = require('../utils/util'); const Lock = require('../utils/lock'); const Logger = require('../node/logger'); @@ -25,12 +24,12 @@ function RPCBase() { EventEmitter.call(this); this.logger = Logger.global; - this.calls = {}; + this.calls = Object.create(null); this.mounts = []; this.locker = new Lock(); } -util.inherits(RPCBase, EventEmitter); +Object.setPrototypeOf(RPCBase.prototype, EventEmitter.prototype); /** * RPC errors. @@ -111,9 +110,7 @@ RPCBase.prototype.call = async function call(body, query) { array = false; } - for (let cmd of cmds) { - let result; - + for (const cmd of cmds) { if (!cmd || typeof cmd !== 'object') { out.push({ result: null, @@ -183,6 +180,7 @@ RPCBase.prototype.call = async function call(body, query) { cmd.method = 'getworklp'; } + let result; try { result = await this.execute(cmd); } catch (err) { @@ -245,10 +243,10 @@ RPCBase.prototype.call = async function call(body, query) { */ RPCBase.prototype.execute = async function execute(json, help) { - let func = this.calls[json.method]; + const func = this.calls[json.method]; if (!func) { - for (let mount of this.mounts) { + for (const mount of this.mounts) { if (mount.calls[json.method]) return await mount.execute(json, help); } @@ -313,7 +311,7 @@ function RPCError(code, msg) { Error.captureStackTrace(this, RPCError); } -util.inherits(RPCError, Error); +Object.setPrototypeOf(RPCError.prototype, Error.prototype); /* * Expose diff --git a/lib/http/rpcclient.js b/lib/http/rpcclient.js index 9abc8f742..c8a498bd9 100644 --- a/lib/http/rpcclient.js +++ b/lib/http/rpcclient.js @@ -8,7 +8,6 @@ const Network = require('../protocol/network'); const request = require('./request'); -const util = require('../utils/util'); /** * Bcoin RPC client. @@ -45,7 +44,7 @@ function RPCClient(options) { */ RPCClient.prototype.execute = async function execute(method, params) { - let res = await request({ + const res = await request({ method: 'POST', uri: this.uri, pool: true, @@ -86,14 +85,14 @@ function RPCError(msg, code) { Error.call(this); this.type = 'RPCError'; - this.message = msg + ''; + this.message = String(msg); this.code = code >>> 0; if (Error.captureStackTrace) Error.captureStackTrace(this, RPCError); } -util.inherits(RPCError, Error); +Object.setPrototypeOf(RPCError.prototype, Error.prototype); /* * Expose diff --git a/lib/http/server.js b/lib/http/server.js index a5c7d0975..7b55b3341 100644 --- a/lib/http/server.js +++ b/lib/http/server.js @@ -55,7 +55,7 @@ function HTTPServer(options) { this.init(); } -util.inherits(HTTPServer, HTTPBase); +Object.setPrototypeOf(HTTPServer.prototype, HTTPBase.prototype); /** * Initialize routes. @@ -102,8 +102,8 @@ HTTPServer.prototype.initRouter = function initRouter() { this.use(this.jsonRPC(this.rpc)); this.get('/', async (req, res) => { - let totalTX = this.mempool ? this.mempool.map.size : 0; - let size = this.mempool ? this.mempool.getSize() : 0; + const totalTX = this.mempool ? this.mempool.map.size : 0; + const size = this.mempool ? this.mempool.getSize() : 0; let addr = this.pool.hosts.getLocal(); if (!addr) @@ -141,17 +141,16 @@ HTTPServer.prototype.initRouter = function initRouter() { // UTXO by address this.get('/coin/address/:address', async (req, res) => { - let valid = req.valid(); - let address = valid.str('address'); - let result = []; - let coins; + const valid = req.valid(); + const address = valid.str('address'); enforce(address, 'Address is required.'); enforce(!this.chain.options.spv, 'Cannot get coins in SPV mode.'); - coins = await this.node.getCoinsByAddress(address); + const coins = await this.node.getCoinsByAddress(address); + const result = []; - for (let coin of coins) + for (const coin of coins) result.push(coin.getJSON(this.network)); res.send(200, result); @@ -159,16 +158,15 @@ HTTPServer.prototype.initRouter = function initRouter() { // UTXO by id this.get('/coin/:hash/:index', async (req, res) => { - let valid = req.valid(); - let hash = valid.hash('hash'); - let index = valid.u32('index'); - let coin; + const valid = req.valid(); + const hash = valid.hash('hash'); + const index = valid.u32('index'); enforce(hash, 'Hash is required.'); enforce(index != null, 'Index is required.'); enforce(!this.chain.options.spv, 'Cannot get coins in SPV mode.'); - coin = await this.node.getCoin(hash, index); + const coin = await this.node.getCoin(hash, index); if (!coin) { res.send(404); @@ -180,17 +178,16 @@ HTTPServer.prototype.initRouter = function initRouter() { // Bulk read UTXOs this.post('/coin/address', async (req, res) => { - let valid = req.valid(); - let address = valid.array('addresses'); - let result = []; - let coins; + const valid = req.valid(); + const address = valid.array('addresses'); enforce(address, 'Address is required.'); enforce(!this.chain.options.spv, 'Cannot get coins in SPV mode.'); - coins = await this.node.getCoinsByAddress(address); + const coins = await this.node.getCoinsByAddress(address); + const result = []; - for (let coin of coins) + for (const coin of coins) result.push(coin.getJSON(this.network)); res.send(200, result); @@ -198,39 +195,37 @@ HTTPServer.prototype.initRouter = function initRouter() { // TX by hash this.get('/tx/:hash', async (req, res) => { - let valid = req.valid(); - let hash = valid.hash('hash'); - let meta, view; + const valid = req.valid(); + const hash = valid.hash('hash'); enforce(hash, 'Hash is required.'); enforce(!this.chain.options.spv, 'Cannot get TX in SPV mode.'); - meta = await this.node.getMeta(hash); + const meta = await this.node.getMeta(hash); if (!meta) { res.send(404); return; } - view = await this.node.getMetaView(meta); + const view = await this.node.getMetaView(meta); res.send(200, meta.getJSON(this.network, view)); }); // TX by address this.get('/tx/address/:address', async (req, res) => { - let valid = req.valid(); - let address = valid.str('address'); - let result = []; - let metas; + const valid = req.valid(); + const address = valid.str('address'); enforce(address, 'Address is required.'); enforce(!this.chain.options.spv, 'Cannot get TX in SPV mode.'); - metas = await this.node.getMetaByAddress(address); + const metas = await this.node.getMetaByAddress(address); + const result = []; - for (let meta of metas) { - let view = await this.node.getMetaView(meta); + for (const meta of metas) { + const view = await this.node.getMetaView(meta); result.push(meta.getJSON(this.network, view)); } @@ -239,18 +234,17 @@ HTTPServer.prototype.initRouter = function initRouter() { // Bulk read TXs this.post('/tx/address', async (req, res) => { - let valid = req.valid(); - let address = valid.array('address'); - let result = []; - let metas; + const valid = req.valid(); + const address = valid.array('addresses'); enforce(address, 'Address is required.'); enforce(!this.chain.options.spv, 'Cannot get TX in SPV mode.'); - metas = await this.node.getMetaByAddress(address); + const metas = await this.node.getMetaByAddress(address); + const result = []; - for (let meta of metas) { - let view = await this.node.getMetaView(meta); + for (const meta of metas) { + const view = await this.node.getMetaView(meta); result.push(meta.getJSON(this.network, view)); } @@ -259,9 +253,8 @@ HTTPServer.prototype.initRouter = function initRouter() { // Block by hash/height this.get('/block/:block', async (req, res) => { - let valid = req.valid(); + const valid = req.valid(); let hash = valid.get('block'); - let block, view, height; enforce(typeof hash === 'string', 'Hash or height required.'); enforce(!this.chain.options.spv, 'Cannot get block in SPV mode.'); @@ -269,37 +262,35 @@ HTTPServer.prototype.initRouter = function initRouter() { if (hash.length === 64) hash = util.revHex(hash); else - hash = +hash; + hash = parseInt(hash, 10); - block = await this.chain.db.getBlock(hash); + const block = await this.chain.db.getBlock(hash); if (!block) { res.send(404); return; } - view = await this.chain.db.getBlockView(block); + const view = await this.chain.db.getBlockView(block); if (!view) { res.send(404); return; } - height = await this.chain.db.getHeight(hash); + const height = await this.chain.db.getHeight(hash); res.send(200, block.getJSON(this.network, view, height)); }); // Mempool snapshot this.get('/mempool', async (req, res) => { - let result = []; - let hashes; - enforce(this.mempool, 'No mempool available.'); - hashes = this.mempool.getSnapshot(); + const hashes = this.mempool.getSnapshot(); + const result = []; - for (let hash of hashes) + for (const hash of hashes) result.push(util.revHex(hash)); res.send(200, result); @@ -307,13 +298,12 @@ HTTPServer.prototype.initRouter = function initRouter() { // Broadcast TX this.post('/broadcast', async (req, res) => { - let valid = req.valid(); - let raw = valid.buf('tx'); - let tx; + const valid = req.valid(); + const raw = valid.buf('tx'); enforce(raw, 'TX is required.'); - tx = TX.fromRaw(raw); + const tx = TX.fromRaw(raw); await this.node.sendTX(tx); @@ -322,24 +312,23 @@ HTTPServer.prototype.initRouter = function initRouter() { // Estimate fee this.get('/fee', async (req, res) => { - let valid = req.valid(); - let blocks = valid.u32('blocks'); - let fee; + const valid = req.valid(); + const blocks = valid.u32('blocks'); if (!this.fees) { res.send(200, { rate: this.network.feeRate }); return; } - fee = this.fees.estimateFee(blocks); + const fee = this.fees.estimateFee(blocks); res.send(200, { rate: fee }); }); // Reset chain this.post('/reset', async (req, res) => { - let valid = req.valid(); - let height = valid.u32('height'); + const valid = req.valid(); + const height = valid.u32('height'); enforce(height != null, 'Height is required.'); @@ -371,16 +360,21 @@ HTTPServer.prototype.initSockets = function initSockets() { HTTPServer.prototype.handleSocket = function handleSocket(socket) { socket.hook('auth', (args) => { - let valid = new Validator([args]); - let hash = this.options.apiHash; - let key = valid.str(0); - if (socket.auth) throw new Error('Already authed.'); if (!this.options.noAuth) { - if (!ccmp(hash256(key), hash)) - throw new Error('Bad key.'); + const valid = new Validator([args]); + const key = valid.str(0, ''); + + if (key.length > 255) + throw new Error('Invalid API key.'); + + const data = Buffer.from(key, 'ascii'); + const hash = digest.hash256(data); + + if (!ccmp(hash, this.options.apiHash)) + throw new Error('Invalid API key.'); } socket.auth = true; @@ -425,8 +419,8 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { }); socket.hook('set filter', (args) => { - let valid = new Validator([args]); - let data = valid.buf(0); + const valid = new Validator([args]); + const data = valid.buf(0); if (!data) throw new Error('Invalid parameter.'); @@ -441,27 +435,26 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { }); socket.hook('get entry', async (args) => { - let valid = new Validator([args]); - let block = valid.numhash(0); - let entry; + const valid = new Validator([args]); + const block = valid.numhash(0); if (block == null) throw new Error('Invalid parameter.'); - entry = await this.chain.db.getEntry(block); - - if (!(await entry.isMainChain())) - entry = null; + const entry = await this.chain.db.getEntry(block); if (!entry) return null; + if (!await entry.isMainChain()) + return null; + return entry.toRaw(); }); socket.hook('add filter', (args) => { - let valid = new Validator([args]); - let chunks = valid.array(0); + const valid = new Validator([args]); + const chunks = valid.array(0); if (!chunks) throw new Error('Invalid parameter.'); @@ -469,10 +462,10 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { if (!socket.filter) throw new Error('No filter set.'); - valid = new Validator([chunks]); + const items = new Validator([chunks]); for (let i = 0; i < chunks.length; i++) { - let data = valid.buf(i); + const data = items.buf(i); if (!data) throw new Error('Bad data chunk.'); @@ -492,8 +485,8 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { }); socket.hook('estimate fee', (args) => { - let valid = new Validator([args]); - let blocks = valid.u32(0); + const valid = new Validator([args]); + const blocks = valid.u32(0); if (!this.fees) return this.network.feeRate; @@ -502,14 +495,13 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { }); socket.hook('send', (args) => { - let valid = new Validator([args]); - let data = valid.buf(0); - let tx; + const valid = new Validator([args]); + const data = valid.buf(0); if (!data) throw new Error('Invalid parameter.'); - tx = TX.fromRaw(data); + const tx = TX.fromRaw(data); this.node.send(tx); @@ -517,8 +509,8 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { }); socket.hook('rescan', (args) => { - let valid = new Validator([args]); - let start = valid.numhash(0); + const valid = new Validator([args]); + const start = valid.numhash(0); if (start == null) throw new Error('Invalid parameter.'); @@ -535,62 +527,58 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { */ HTTPServer.prototype.bindChain = function bindChain() { - let pool = this.mempool || this.pool; + const pool = this.mempool || this.pool; this.chain.on('connect', (entry, block, view) => { - let list = this.channel('chain'); - let raw; + const list = this.channel('chain'); if (!list) return; - raw = entry.toRaw(); + const raw = entry.toRaw(); this.to('chain', 'chain connect', raw); for (let item = list.head; item; item = item.next) { - let socket = item.value; - let txs = this.filterBlock(socket, block); + const socket = item.value; + const txs = this.filterBlock(socket, block); socket.emit('block connect', raw, txs); } }); this.chain.on('disconnect', (entry, block, view) => { - let list = this.channel('chain'); - let raw; + const list = this.channel('chain'); if (!list) return; - raw = entry.toRaw(); + const raw = entry.toRaw(); this.to('chain', 'chain disconnect', raw); this.to('chain', 'block disconnect', raw); }); this.chain.on('reset', (tip) => { - let list = this.channel('chain'); - let raw; + const list = this.channel('chain'); if (!list) return; - raw = tip.toRaw(); + const raw = tip.toRaw(); this.to('chain', 'chain reset', raw); }); pool.on('tx', (tx) => { - let list = this.channel('mempool'); - let raw; + const list = this.channel('mempool'); if (!list) return; - raw = tx.toRaw(); + const raw = tx.toRaw(); for (let item = list.head; item; item = item.next) { - let socket = item.value; + const socket = item.value; if (!this.filterTX(socket, tx)) continue; @@ -609,12 +597,12 @@ HTTPServer.prototype.bindChain = function bindChain() { */ HTTPServer.prototype.filterBlock = function filterBlock(socket, block) { - let txs = []; - if (!socket.filter) - return txs; + return []; - for (let tx of block.txs) { + const txs = []; + + for (const tx of block.txs) { if (this.filterTX(socket, tx)) txs.push(tx.toRaw()); } @@ -631,20 +619,20 @@ HTTPServer.prototype.filterBlock = function filterBlock(socket, block) { */ HTTPServer.prototype.filterTX = function filterTX(socket, tx) { - let found = false; - if (!socket.filter) return false; + let found = false; + for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let hash = output.getHash(); + const output = tx.outputs[i]; + const hash = output.getHash(); if (!hash) continue; if (socket.filter.test(hash)) { - let prevout = Outpoint.fromTX(tx, i); + const prevout = Outpoint.fromTX(tx, i); socket.filter.add(prevout.toRaw()); found = true; } @@ -654,7 +642,7 @@ HTTPServer.prototype.filterTX = function filterTX(socket, tx) { return true; if (!tx.isCoinbase()) { - for (let {prevout} of tx.inputs) { + for (const {prevout} of tx.inputs) { if (socket.filter.test(prevout.toRaw())) return true; } @@ -672,7 +660,7 @@ HTTPServer.prototype.filterTX = function filterTX(socket, tx) { */ HTTPServer.prototype.scan = async function scan(socket, start) { - let scanner = this.scanner.bind(this, socket); + const scanner = this.scanner.bind(this, socket); await this.node.scan(start, socket.filter, scanner); return null; }; @@ -687,10 +675,10 @@ HTTPServer.prototype.scan = async function scan(socket, start) { */ HTTPServer.prototype.scanner = function scanner(socket, entry, txs) { - let block = entry.toRaw(); - let raw = []; + const block = entry.toRaw(); + const raw = []; - for (let tx of txs) + for (const tx of txs) raw.push(tx.toRaw()); socket.emit('block rescan', block, raw); @@ -713,7 +701,7 @@ function HTTPOptions(options) { this.logger = null; this.node = null; this.apiKey = base58.encode(random.randomBytes(20)); - this.apiHash = hash256(this.apiKey); + this.apiHash = digest.hash256(Buffer.from(this.apiKey, 'ascii')); this.noAuth = false; this.prefix = null; @@ -752,10 +740,12 @@ HTTPOptions.prototype.fromOptions = function fromOptions(options) { if (options.apiKey != null) { assert(typeof options.apiKey === 'string', 'API key must be a string.'); - assert(options.apiKey.length <= 200, - 'API key must be under 200 bytes.'); + assert(options.apiKey.length <= 255, + 'API key must be under 256 bytes.'); + assert(util.isAscii(options.apiKey), + 'API key must be ascii.'); this.apiKey = options.apiKey; - this.apiHash = hash256(this.apiKey); + this.apiHash = digest.hash256(Buffer.from(this.apiKey, 'ascii')); } if (options.noAuth != null) { @@ -776,8 +766,7 @@ HTTPOptions.prototype.fromOptions = function fromOptions(options) { } if (options.port != null) { - assert(typeof options.port === 'number', 'Port must be a number.'); - assert(options.port > 0 && options.port <= 0xffff); + assert(util.isU16(options.port), 'Port must be a number.'); this.port = options.port; } @@ -820,19 +809,9 @@ HTTPOptions.fromOptions = function fromOptions(options) { * Helpers */ -function hash256(data) { - if (typeof data !== 'string') - return Buffer.alloc(0); - - if (data.length > 200) - return Buffer.alloc(0); - - return digest.hash256(Buffer.from(data, 'utf8')); -} - function enforce(value, msg) { if (!value) { - let err = new Error(msg); + const err = new Error(msg); err.statusCode = 400; throw err; } diff --git a/lib/http/wallet.js b/lib/http/wallet.js index fd0d910ad..8111ff999 100644 --- a/lib/http/wallet.js +++ b/lib/http/wallet.js @@ -10,7 +10,6 @@ const assert = require('assert'); const EventEmitter = require('events'); const Network = require('../protocol/network'); -const util = require('../utils/util'); const Client = require('./client'); /** @@ -53,7 +52,7 @@ function HTTPWallet(options) { this._init(); } -util.inherits(HTTPWallet, EventEmitter); +Object.setPrototypeOf(HTTPWallet.prototype, EventEmitter.prototype); /** * Initialize the wallet. @@ -123,12 +122,10 @@ HTTPWallet.prototype.open = async function open(options) { */ HTTPWallet.prototype.create = async function create(options) { - let wallet; - await this.client.open(); await this.client.sendWalletAuth(); - wallet = await this.client.createWallet(options); + const wallet = await this.client.createWallet(options); this.id = wallet.id; this.token = wallet.token; @@ -348,7 +345,7 @@ HTTPWallet.prototype.setPassphrase = function setPassphrase(old, new_) { */ HTTPWallet.prototype.retoken = async function retoken(passphrase) { - let token = await this.client.retoken(this.id, passphrase); + const token = await this.client.retoken(this.id, passphrase); this.token = token; this.client.token = token; diff --git a/lib/mempool/fees.js b/lib/mempool/fees.js index ab5769618..2519f4cef 100644 --- a/lib/mempool/fees.js +++ b/lib/mempool/fees.js @@ -133,12 +133,10 @@ ConfirmStats.prototype.clearCurrent = function clearCurrent(height) { */ ConfirmStats.prototype.record = function record(blocks, val) { - let bucketIndex; - if (blocks < 1) return; - bucketIndex = this.bucketMap.search(val); + const bucketIndex = this.bucketMap.search(val); for (let i = blocks; i <= this.curBlockConf.length; i++) this.curBlockConf[i - 1][bucketIndex]++; @@ -173,21 +171,20 @@ ConfirmStats.prototype.updateAverages = function updateAverages() { */ ConfirmStats.prototype.estimateMedian = function estimateMedian(target, needed, breakpoint, greater, height) { + const max = this.buckets.length - 1; + const start = greater ? max : 0; + const step = greater ? -1 : 1; + const bins = this.unconfTX.length; let conf = 0; let total = 0; let extra = 0; - let max = this.buckets.length - 1; - let start = greater ? max : 0; - let step = greater ? -1 : 1; let near = start; let far = start; let bestNear = start; let bestFar = start; let found = false; - let bins = this.unconfTX.length; let median = -1; let sum = 0; - let minBucket, maxBucket; for (let i = start; i >= 0 && i <= max; i += step) { far = i; @@ -200,7 +197,7 @@ ConfirmStats.prototype.estimateMedian = function estimateMedian(target, needed, extra += this.oldUnconfTX[i]; if (total >= needed / (1 - this.decay)) { - let perc = conf / (total + extra); + const perc = conf / (total + extra); if (greater && perc < breakpoint) break; @@ -218,8 +215,8 @@ ConfirmStats.prototype.estimateMedian = function estimateMedian(target, needed, } } - minBucket = bestNear < bestFar ? bestNear : bestFar; - maxBucket = bestNear > bestFar ? bestNear : bestFar; + const minBucket = bestNear < bestFar ? bestNear : bestFar; + const maxBucket = bestNear > bestFar ? bestNear : bestFar; for (let i = minBucket; i <= maxBucket; i++) sum += this.txAvg[i]; @@ -247,8 +244,8 @@ ConfirmStats.prototype.estimateMedian = function estimateMedian(target, needed, */ ConfirmStats.prototype.addTX = function addTX(height, val) { - let bucketIndex = this.bucketMap.search(val); - let blockIndex = height % this.unconfTX.length; + const bucketIndex = this.bucketMap.search(val); + const blockIndex = height % this.unconfTX.length; this.unconfTX[blockIndex][bucketIndex]++; this.logger.spam('Adding tx to %s.', this.type); return bucketIndex; @@ -280,7 +277,7 @@ ConfirmStats.prototype.removeTX = function removeTX(entryHeight, bestHeight, buc bucketIndex); } } else { - let blockIndex = entryHeight % this.unconfTX.length; + const blockIndex = entryHeight % this.unconfTX.length; if (this.unconfTX[blockIndex][bucketIndex] > 0) { this.unconfTX[blockIndex][bucketIndex]--; } else { @@ -318,8 +315,8 @@ ConfirmStats.prototype.getSize = function getSize() { */ ConfirmStats.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); bw.writeDouble(this.decay); writeArray(bw, this.buckets); @@ -341,13 +338,13 @@ ConfirmStats.prototype.toRaw = function toRaw() { */ ConfirmStats.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let decay = br.readDouble(); - let buckets = readArray(br); - let avg = readArray(br); - let txAvg = readArray(br); - let maxConfirms = br.readVarint(); - let confAvg = new Array(maxConfirms); + const br = new BufferReader(data); + const decay = br.readDouble(); + const buckets = readArray(br); + const avg = readArray(br); + const txAvg = readArray(br); + const maxConfirms = br.readVarint(); + const confAvg = new Array(maxConfirms); for (let i = 0; i < maxConfirms; i++) confAvg[i] = readArray(br); @@ -448,16 +445,18 @@ PolicyEstimator.VERSION = 0; */ PolicyEstimator.prototype.init = function init() { - let minFee = this.minTrackedFee; - let minPri = this.minTrackedPri; - let fee = []; - let priority = []; + const minFee = this.minTrackedFee; + const minPri = this.minTrackedPri; + + const fee = []; for (let b = minFee; b <= MAX_FEERATE; b *= FEE_SPACING) fee.push(b); fee.push(INF_FEERATE); + const priority = []; + for (let b = minPri; b <= MAX_PRIORITY; b *= PRI_SPACING) priority.push(b); @@ -489,7 +488,7 @@ PolicyEstimator.prototype.reset = function reset() { */ PolicyEstimator.prototype.removeTX = function removeTX(hash) { - let item = this.map.get(hash); + const item = this.map.get(hash); if (!item) { this.logger.spam('Mempool tx %s not found.', util.revHex(hash)); @@ -538,9 +537,8 @@ PolicyEstimator.prototype.isPriPoint = function isPriPoint(fee, priority) { */ PolicyEstimator.prototype.processTX = function processTX(entry, current) { - let height = entry.height; - let hash = entry.hash('hex'); - let fee, rate, priority, item; + const height = entry.height; + const hash = entry.hash('hex'); if (this.map.has(hash)) { this.logger.debug('Mempool tx %s already tracked.', entry.txid()); @@ -559,28 +557,25 @@ PolicyEstimator.prototype.processTX = function processTX(entry, current) { if (entry.dependencies) return; - fee = entry.getFee(); - rate = entry.getRate(); - priority = entry.getPriority(height); + const fee = entry.getFee(); + const rate = entry.getRate(); + const priority = entry.getPriority(height); this.logger.spam('Processing mempool tx %s.', entry.txid()); if (fee === 0 || this.isPriPoint(rate, priority)) { - item = new StatEntry(); + const item = new StatEntry(); item.blockHeight = height; item.bucketIndex = this.priStats.addTX(height, priority); + this.map.set(hash, item); } else if (this.isFeePoint(rate, priority)) { - item = new StatEntry(); + const item = new StatEntry(); item.blockHeight = height; item.bucketIndex = this.feeStats.addTX(height, rate); - } - - if (!item) { + this.map.set(hash, item); + } else { this.logger.spam('Not adding tx %s.', entry.txid()); - return; } - - this.map.set(hash, item); }; /** @@ -590,13 +585,11 @@ PolicyEstimator.prototype.processTX = function processTX(entry, current) { */ PolicyEstimator.prototype.processBlockTX = function processBlockTX(height, entry) { - let blocks, fee, rate, priority; - // Requires other mempool txs in order to be confirmed. Ignore. if (entry.dependencies) return; - blocks = height - entry.height; + const blocks = height - entry.height; if (blocks <= 0) { this.logger.debug( @@ -607,9 +600,9 @@ PolicyEstimator.prototype.processBlockTX = function processBlockTX(height, entry return; } - fee = entry.getFee(); - rate = entry.getRate(); - priority = entry.getPriority(height); + const fee = entry.getFee(); + const rate = entry.getRate(); + const priority = entry.getPriority(height); if (fee === 0 || this.isPriPoint(rate, priority)) this.priStats.record(blocks, priority); @@ -625,8 +618,6 @@ PolicyEstimator.prototype.processBlockTX = function processBlockTX(height, entry */ PolicyEstimator.prototype.processBlock = function processBlock(height, entries, current) { - let entry; - // Ignore reorgs. if (height <= this.bestHeight) return; @@ -673,7 +664,7 @@ PolicyEstimator.prototype.processBlock = function processBlock(height, entries, this.feeStats.clearCurrent(height); this.priStats.clearCurrent(height); - for (entry of entries) + for (const entry of entries) this.processBlockTX(height, entry); this.feeStats.updateAverages(); @@ -694,20 +685,18 @@ PolicyEstimator.prototype.processBlock = function processBlock(height, entries, */ PolicyEstimator.prototype.estimateFee = function estimateFee(target, smart) { - let rate; - if (!target) target = 1; if (smart == null) smart = true; - assert(util.isUInt32(target), 'Target must be a number.'); + assert(util.isU32(target), 'Target must be a number.'); assert(target <= this.feeStats.maxConfirms, 'Too many confirmations for estimate.'); if (!smart) { - rate = this.feeStats.estimateMedian( + const rate = this.feeStats.estimateMedian( target, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, true, this.bestHeight); @@ -717,7 +706,7 @@ PolicyEstimator.prototype.estimateFee = function estimateFee(target, smart) { return Math.floor(rate); } - rate = -1; + let rate = -1; while (rate < 0 && target <= this.feeStats.maxConfirms) { rate = this.feeStats.estimateMedian( target++, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, @@ -740,26 +729,24 @@ PolicyEstimator.prototype.estimateFee = function estimateFee(target, smart) { */ PolicyEstimator.prototype.estimatePriority = function estimatePriority(target, smart) { - let priority; - if (!target) target = 1; if (smart == null) smart = true; - assert(util.isUInt32(target), 'Target must be a number.'); + assert(util.isU32(target), 'Target must be a number.'); assert(target <= this.priStats.maxConfirms, 'Too many confirmations for estimate.'); if (!smart) { - priority = this.priStats.estimateMedian( + const priority = this.priStats.estimateMedian( target, SUFFICIENT_PRITXS, MIN_SUCCESS_PCT, true, this.bestHeight); return Math.floor(priority); } - priority = -1; + let priority = -1; while (priority < 0 && target <= this.priStats.maxConfirms) { priority = this.priStats.estimateMedian( target++, SUFFICIENT_PRITXS, MIN_SUCCESS_PCT, @@ -792,8 +779,8 @@ PolicyEstimator.prototype.getSize = function getSize() { */ PolicyEstimator.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); bw.writeU8(PolicyEstimator.VERSION); bw.writeU32(this.bestHeight); @@ -810,7 +797,7 @@ PolicyEstimator.prototype.toRaw = function toRaw() { */ PolicyEstimator.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); if (br.readU8() !== PolicyEstimator.VERSION) throw new Error('Bad serialization version for estimator.'); @@ -869,12 +856,12 @@ function DoubleMap() { } DoubleMap.prototype.insert = function insert(key, value) { - let i = util.binarySearch(this.buckets, key, compare, true); + const i = util.binarySearch(this.buckets, key, compare, true); this.buckets.splice(i, 0, [key, value]); }; DoubleMap.prototype.search = function search(key) { - let i = util.binarySearch(this.buckets, key, compare, true); + const i = util.binarySearch(this.buckets, key, compare, true); assert(this.buckets.length !== 0, 'Cannot search.'); return this.buckets[i][1]; }; @@ -888,7 +875,7 @@ function compare(a, b) { } function sizeArray(buckets) { - let size = encoding.sizeVarint(buckets.length); + const size = encoding.sizeVarint(buckets.length); return size + buckets.length * 8; } @@ -900,7 +887,7 @@ function writeArray(bw, buckets) { } function readArray(br) { - let buckets = new Float64Array(br.readVarint()); + const buckets = new Float64Array(br.readVarint()); for (let i = 0; i < buckets.length; i++) buckets[i] = br.readDouble(); diff --git a/lib/mempool/layout-browser.js b/lib/mempool/layout-browser.js index e4833ea57..b7da4bb4c 100644 --- a/lib/mempool/layout-browser.js +++ b/lib/mempool/layout-browser.js @@ -6,6 +6,8 @@ 'use strict'; +const assert = require('assert'); + const layout = { binary: false, R: 'R', @@ -15,6 +17,8 @@ const layout = { return 'e' + hex(hash); }, ee: function ee(key) { + assert(typeof key === 'string'); + assert(key.length === 65); return key.slice(1, 65); } }; @@ -24,8 +28,9 @@ const layout = { */ function hex(hash) { - if (typeof hash !== 'string') + if (Buffer.isBuffer(hash)) hash = hash.toString('hex'); + assert(typeof hash === 'string'); return hash; } diff --git a/lib/mempool/layout.js b/lib/mempool/layout.js index ae4c26fdf..3d009a567 100644 --- a/lib/mempool/layout.js +++ b/lib/mempool/layout.js @@ -6,6 +6,8 @@ 'use strict'; +const assert = require('assert'); + /* * Database Layout: * R -> tip hash @@ -19,12 +21,14 @@ const layout = { V: Buffer.from([0x76]), F: Buffer.from([0x46]), e: function e(hash) { - let key = Buffer.allocUnsafe(33); + const key = Buffer.allocUnsafe(33); key[0] = 0x65; write(key, hash, 1); return key; }, ee: function ee(key) { + assert(Buffer.isBuffer(key)); + assert(key.length === 33); return key.toString('hex', 1, 33); } }; @@ -36,7 +40,8 @@ const layout = { function write(data, str, off) { if (Buffer.isBuffer(str)) return str.copy(data, off); - data.write(str, off, 'hex'); + assert(typeof str === 'string'); + return data.write(str, off, 'hex'); } /* diff --git a/lib/mempool/mempool.js b/lib/mempool/mempool.js index 84e2a54b3..683f00b37 100644 --- a/lib/mempool/mempool.js +++ b/lib/mempool/mempool.js @@ -95,7 +95,7 @@ function Mempool(options) { this.txIndex = new TXIndex(); } -util.inherits(Mempool, AsyncObject); +Object.setPrototypeOf(Mempool.prototype, AsyncObject.prototype); /** * Open the chain, wait for the database to load. @@ -104,23 +104,21 @@ util.inherits(Mempool, AsyncObject); * @returns {Promise} */ -Mempool.prototype._open = async function open() { - let size = (this.options.maxSize / 1024).toFixed(2); - +Mempool.prototype._open = async function _open() { await this.chain.open(); await this.cache.open(); if (this.options.persistent) { - let entries = await this.cache.getEntries(); + const entries = await this.cache.getEntries(); - for (let entry of entries) + for (const entry of entries) this.trackEntry(entry); - for (let entry of entries) { + for (const entry of entries) { this.updateAncestors(entry, addFee); if (this.options.indexAddress) { - let view = await this.getCoinView(entry.tx); + const view = await this.getCoinView(entry.tx); this.indexEntry(entry, view); } } @@ -130,7 +128,7 @@ Mempool.prototype._open = async function open() { entries.length); if (this.fees) { - let fees = await this.cache.getFees(); + const fees = await this.cache.getFees(); if (fees) { this.fees.inject(fees); @@ -143,6 +141,8 @@ Mempool.prototype._open = async function open() { this.tip = this.chain.tip.hash; + const size = (this.options.maxSize / 1024).toFixed(2); + this.logger.info('Mempool loaded (maxsize=%dkb).', size); }; @@ -152,7 +152,7 @@ Mempool.prototype._open = async function open() { * @returns {Promise} */ -Mempool.prototype._close = async function close() { +Mempool.prototype._close = async function _close() { await this.cache.close(); }; @@ -167,7 +167,7 @@ Mempool.prototype._close = async function close() { */ Mempool.prototype.addBlock = async function addBlock(block, txs) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._addBlock(block, txs); } finally { @@ -184,20 +184,18 @@ Mempool.prototype.addBlock = async function addBlock(block, txs) { * @returns {Promise} */ -Mempool.prototype._addBlock = async function addBlock(block, txs) { - let entries; - +Mempool.prototype._addBlock = async function _addBlock(block, txs) { if (this.map.size === 0) { this.tip = block.hash; return; } - entries = []; + const entries = []; for (let i = txs.length - 1; i >= 1; i--) { - let tx = txs[i]; - let hash = tx.hash('hex'); - let entry = this.getEntry(hash); + const tx = txs[i]; + const hash = tx.hash('hex'); + const entry = this.getEntry(hash); if (!entry) { this.removeOrphan(hash); @@ -246,7 +244,7 @@ Mempool.prototype._addBlock = async function addBlock(block, txs) { */ Mempool.prototype.removeBlock = async function removeBlock(block, txs) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._removeBlock(block, txs); } finally { @@ -264,17 +262,17 @@ Mempool.prototype.removeBlock = async function removeBlock(block, txs) { * @returns {Promise} */ -Mempool.prototype._removeBlock = async function removeBlock(block, txs) { - let total = 0; - +Mempool.prototype._removeBlock = async function _removeBlock(block, txs) { if (this.map.size === 0) { this.tip = block.prevBlock; return; } + let total = 0; + for (let i = 1; i < txs.length; i++) { - let tx = txs[i]; - let hash = tx.hash('hex'); + const tx = txs[i]; + const hash = tx.hash('hex'); if (this.hasEntry(hash)) continue; @@ -313,7 +311,7 @@ Mempool.prototype._removeBlock = async function removeBlock(block, txs) { */ Mempool.prototype.reset = async function reset() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._reset(); } finally { @@ -326,7 +324,7 @@ Mempool.prototype.reset = async function reset() { * @private */ -Mempool.prototype._reset = async function reset() { +Mempool.prototype._reset = async function _reset() { this.logger.info('Mempool reset (%d txs removed).', this.map.size); this.size = 0; @@ -362,23 +360,23 @@ Mempool.prototype._reset = async function reset() { */ Mempool.prototype.limitSize = function limitSize(added) { - let maxSize = this.options.maxSize; - let threshold = maxSize - (maxSize / 10); - let expiryTime = this.options.expiryTime; - let now = util.now(); - let queue, start; + const maxSize = this.options.maxSize; if (this.size <= maxSize) return false; - start = util.hrtime(); - queue = new Heap(cmpRate); + const threshold = maxSize - (maxSize / 10); + const expiryTime = this.options.expiryTime; - for (let entry of this.map.values()) { + const now = util.now(); + let start = util.hrtime(); + const queue = new Heap(cmpRate); + + for (const entry of this.map.values()) { if (this.hasDepends(entry.tx)) continue; - if (now < entry.ts + expiryTime) { + if (now < entry.time + expiryTime) { queue.insert(entry); continue; } @@ -404,8 +402,8 @@ Mempool.prototype.limitSize = function limitSize(added) { queue.size()); while (queue.size() > 0) { - let entry = queue.shift(); - let hash = entry.hash('hex'); + const entry = queue.shift(); + const hash = entry.hash('hex'); assert(this.hasEntry(hash)); @@ -433,9 +431,11 @@ Mempool.prototype.limitSize = function limitSize(added) { */ Mempool.prototype.getTX = function getTX(hash) { - let entry = this.map.get(hash); + const entry = this.map.get(hash); + if (!entry) - return; + return null; + return entry.tx; }; @@ -457,16 +457,16 @@ Mempool.prototype.getEntry = function getEntry(hash) { */ Mempool.prototype.getCoin = function getCoin(hash, index) { - let entry = this.map.get(hash); + const entry = this.map.get(hash); if (!entry) - return; + return null; if (this.isSpent(hash, index)) - return; + return null; if (index >= entry.tx.outputs.length) - return; + return null; return Coin.fromTX(entry.tx, index, -1); }; @@ -482,7 +482,7 @@ Mempool.prototype.getCoin = function getCoin(hash, index) { */ Mempool.prototype.isSpent = function isSpent(hash, index) { - let key = Outpoint.toKey(hash, index); + const key = Outpoint.toKey(hash, index); return this.spents.has(key); }; @@ -494,7 +494,7 @@ Mempool.prototype.isSpent = function isSpent(hash, index) { */ Mempool.prototype.getSpent = function getSpent(hash, index) { - let key = Outpoint.toKey(hash, index); + const key = Outpoint.toKey(hash, index); return this.spents.get(key); }; @@ -506,11 +506,11 @@ Mempool.prototype.getSpent = function getSpent(hash, index) { */ Mempool.prototype.getSpentTX = function getSpentTX(hash, index) { - let key = Outpoint.toKey(hash, index); - let entry = this.spents.get(key); + const key = Outpoint.toKey(hash, index); + const entry = this.spents.get(key); if (!entry) - return; + return null; return entry.tx; }; @@ -522,16 +522,16 @@ Mempool.prototype.getSpentTX = function getSpentTX(hash, index) { */ Mempool.prototype.getCoinsByAddress = function getCoinsByAddress(addrs) { - let out = []; - if (!Array.isArray(addrs)) addrs = [addrs]; - for (let addr of addrs) { - let hash = Address.getHash(addr, 'hex'); - let coins = this.coinIndex.get(hash); + const out = []; - for (let coin of coins) + for (const addr of addrs) { + const hash = Address.getHash(addr, 'hex'); + const coins = this.coinIndex.get(hash); + + for (const coin of coins) out.push(coin); } @@ -545,16 +545,16 @@ Mempool.prototype.getCoinsByAddress = function getCoinsByAddress(addrs) { */ Mempool.prototype.getTXByAddress = function getTXByAddress(addrs) { - let out = []; - if (!Array.isArray(addrs)) addrs = [addrs]; - for (let addr of addrs) { - let hash = Address.getHash(addr, 'hex'); - let txs = this.txIndex.get(hash); + const out = []; - for (let tx of txs) + for (const addr of addrs) { + const hash = Address.getHash(addr, 'hex'); + const txs = this.txIndex.get(hash); + + for (const tx of txs) out.push(tx); } @@ -568,16 +568,16 @@ Mempool.prototype.getTXByAddress = function getTXByAddress(addrs) { */ Mempool.prototype.getMetaByAddress = function getMetaByAddress(addrs) { - let out = []; - if (!Array.isArray(addrs)) addrs = [addrs]; - for (let addr of addrs) { - let hash = Address.getHash(addr, 'hex'); - let txs = this.txIndex.getMeta(hash); + const out = []; + + for (const addr of addrs) { + const hash = Address.getHash(addr, 'hex'); + const txs = this.txIndex.getMeta(hash); - for (let tx of txs) + for (const tx of txs) out.push(tx); } @@ -591,14 +591,13 @@ Mempool.prototype.getMetaByAddress = function getMetaByAddress(addrs) { */ Mempool.prototype.getMeta = function getMeta(hash) { - let entry = this.getEntry(hash); - let meta; + const entry = this.getEntry(hash); if (!entry) - return; + return null; - meta = TXMeta.fromTX(entry.tx); - meta.ps = entry.ts; + const meta = TXMeta.fromTX(entry.tx); + meta.mtime = entry.time; return meta; }; @@ -670,8 +669,8 @@ Mempool.prototype.hasReject = function hasReject(hash) { */ Mempool.prototype.addTX = async function addTX(tx, id) { - let hash = tx.hash('hex'); - let unlock = await this.locker.lock(hash); + const hash = tx.hash('hex'); + const unlock = await this.locker.lock(hash); try { return await this._addTX(tx, id); } finally { @@ -689,11 +688,10 @@ Mempool.prototype.addTX = async function addTX(tx, id) { */ Mempool.prototype._addTX = async function _addTX(tx, id) { - let missing; - if (id == null) id = -1; + let missing; try { missing = await this.insertTX(tx, id); } catch (err) { @@ -722,17 +720,16 @@ Mempool.prototype._addTX = async function _addTX(tx, id) { */ Mempool.prototype.insertTX = async function insertTX(tx, id) { - let lockFlags = common.lockFlags.STANDARD_LOCKTIME_FLAGS; - let height = this.chain.height; - let hash = tx.hash('hex'); - let valid, reason, score, entry, view, missing; - assert(!tx.mutable, 'Cannot add mutable TX to mempool.'); + const lockFlags = common.lockFlags.STANDARD_LOCKTIME_FLAGS; + const height = this.chain.height; + const hash = tx.hash('hex'); + // Basic sanity checks. // This is important because it ensures // other functions will be overflow safe. - [valid, reason, score] = tx.checkSanity(); + const [valid, reason, score] = tx.checkSanity(); if (!valid) throw new VerifyError(tx, 'invalid', reason, score); @@ -769,7 +766,7 @@ Mempool.prototype.insertTX = async function insertTX(tx, id) { // Non-contextual standardness checks. if (this.options.requireStandard) { - let [valid, reason, score] = tx.checkStandard(); + const [valid, reason, score] = tx.checkStandard(); if (!valid) throw new VerifyError(tx, 'nonstandard', reason, score); @@ -785,7 +782,7 @@ Mempool.prototype.insertTX = async function insertTX(tx, id) { } // Verify transaction finality (see isFinal()). - if (!(await this.verifyFinal(tx, lockFlags))) { + if (!await this.verifyFinal(tx, lockFlags)) { throw new VerifyError(tx, 'nonstandard', 'non-final', @@ -803,7 +800,7 @@ Mempool.prototype.insertTX = async function insertTX(tx, id) { // We can test whether this is an // non-fully-spent transaction on // the chain. - if (await this.chain.db.hasCoins(hash)) { + if (await this.chain.db.hasCoins(tx)) { throw new VerifyError(tx, 'alreadyknown', 'txn-already-known', @@ -823,10 +820,10 @@ Mempool.prototype.insertTX = async function insertTX(tx, id) { // Get coin viewpoint as it // pertains to the mempool. - view = await this.getCoinView(tx); + const view = await this.getCoinView(tx); // Find missing outpoints. - missing = this.findMissing(tx, view); + const missing = this.findMissing(tx, view); // Maybe store as an orphan. if (missing) @@ -834,7 +831,7 @@ Mempool.prototype.insertTX = async function insertTX(tx, id) { // Create a new mempool entry // at current chain height. - entry = MempoolEntry.fromTX(tx, view, height); + const entry = MempoolEntry.fromTX(tx, view, height); // Contextual verification. await this.verify(entry, view); @@ -862,14 +859,12 @@ Mempool.prototype.insertTX = async function insertTX(tx, id) { */ Mempool.prototype.verify = async function verify(entry, view) { - let height = this.chain.height + 1; - let lockFlags = common.lockFlags.STANDARD_LOCKTIME_FLAGS; - let flags = Script.flags.STANDARD_VERIFY_FLAGS; - let tx = entry.tx; - let fee, reason, score, minFee; + const height = this.chain.height + 1; + const lockFlags = common.lockFlags.STANDARD_LOCKTIME_FLAGS; + const tx = entry.tx; // Verify sequence locks. - if (!(await this.verifyLocks(tx, view, lockFlags))) { + if (!await this.verifyLocks(tx, view, lockFlags)) { throw new VerifyError(tx, 'nonstandard', 'non-BIP68-final', @@ -904,7 +899,7 @@ Mempool.prototype.verify = async function verify(entry, view) { } // Make sure this guy gave a decent fee. - minFee = policy.getMinFee(entry.size, this.options.minRelay); + const minFee = policy.getMinFee(entry.size, this.options.minRelay); if (this.options.relayPriority && entry.fee < minFee) { if (!entry.isFree(height)) { @@ -918,7 +913,7 @@ Mempool.prototype.verify = async function verify(entry, view) { // Continuously rate-limit free (really, very-low-fee) // transactions. This mitigates 'penny-flooding'. if (this.options.limitFree && entry.fee < minFee) { - let now = util.now(); + const now = util.now(); // Use an exponentially decaying ~10-minute window. this.freeCount *= Math.pow(1 - 1 / 600, now - this.lastTime); @@ -949,37 +944,34 @@ Mempool.prototype.verify = async function verify(entry, view) { } // Contextual sanity checks. - [fee, reason, score] = tx.checkInputs(view, height); + const [fee, reason, score] = tx.checkInputs(view, height); if (fee === -1) throw new VerifyError(tx, 'invalid', reason, score); // Script verification. + let flags = Script.flags.STANDARD_VERIFY_FLAGS; try { await this.verifyInputs(tx, view, flags); } catch (err) { - let valid; - if (tx.hasWitness()) throw err; // Try without segwit and cleanstack. flags &= ~Script.flags.VERIFY_WITNESS; flags &= ~Script.flags.VERIFY_CLEANSTACK; - valid = await this.verifyResult(tx, view, flags); // If it failed, the first verification // was the only result we needed. - if (!valid) + if (!await this.verifyResult(tx, view, flags)) throw err; // If it succeeded, segwit may be causing the // failure. Try with segwit but without cleanstack. flags |= Script.flags.VERIFY_CLEANSTACK; - valid = await this.verifyResult(tx, view, flags); // Cleanstack was causing the failure. - if (valid) + if (await this.verifyResult(tx, view, flags)) throw err; // Do not insert into reject cache. @@ -989,10 +981,9 @@ Mempool.prototype.verify = async function verify(entry, view) { // Paranoid checks. if (this.options.paranoidChecks) { - let valid; - flags = Script.flags.MANDATORY_VERIFY_FLAGS; - valid = await this.verifyResult(tx, view, flags); - assert(valid, 'BUG: Verify failed for mandatory but not standard.'); + const flags = Script.flags.MANDATORY_VERIFY_FLAGS; + assert(await this.verifyResult(tx, view, flags), + 'BUG: Verify failed for mandatory but not standard.'); } }; @@ -1061,7 +1052,7 @@ Mempool.prototype.verifyInputs = async function verifyInputs(tx, view, flags) { */ Mempool.prototype.addEntry = async function addEntry(entry, view) { - let tx = entry.tx; + const tx = entry.tx; this.trackEntry(entry, view); @@ -1090,8 +1081,8 @@ Mempool.prototype.addEntry = async function addEntry(entry, view) { */ Mempool.prototype.removeEntry = function removeEntry(entry) { - let tx = entry.tx; - let hash = tx.hash('hex'); + const tx = entry.tx; + const hash = tx.hash('hex'); this.untrackEntry(entry); @@ -1122,11 +1113,11 @@ Mempool.prototype.evictEntry = function evictEntry(entry) { */ Mempool.prototype.removeSpenders = function removeSpenders(entry) { - let tx = entry.tx; - let hash = tx.hash('hex'); + const tx = entry.tx; + const hash = tx.hash('hex'); for (let i = 0; i < tx.outputs.length; i++) { - let spender = this.getSpent(hash, i); + const spender = this.getSpent(hash, i); if (!spender) continue; @@ -1144,7 +1135,7 @@ Mempool.prototype.removeSpenders = function removeSpenders(entry) { */ Mempool.prototype.countAncestors = function countAncestors(entry) { - return this._countAncestors(entry, 0, {}, entry, nop); + return this._countAncestors(entry, new Set(), entry, nop); }; /** @@ -1157,48 +1148,46 @@ Mempool.prototype.countAncestors = function countAncestors(entry) { */ Mempool.prototype.updateAncestors = function updateAncestors(entry, map) { - return this._countAncestors(entry, 0, {}, entry, map); + return this._countAncestors(entry, new Set(), entry, map); }; /** * Traverse ancestors and count. * @private * @param {MempoolEntry} entry - * @param {Number} count * @param {Object} set * @param {MempoolEntry} child * @param {Function} map * @returns {Number} */ -Mempool.prototype._countAncestors = function countAncestors(entry, count, set, child, map) { - let tx = entry.tx; +Mempool.prototype._countAncestors = function _countAncestors(entry, set, child, map) { + const tx = entry.tx; - for (let input of tx.inputs) { - let hash = input.prevout.hash; - let parent = this.getEntry(hash); + for (const input of tx.inputs) { + const hash = input.prevout.hash; + const parent = this.getEntry(hash); if (!parent) continue; - if (set[hash]) + if (set.has(hash)) continue; - set[hash] = true; - count += 1; + set.add(hash); map(parent, child); - if (count > this.options.maxAncestors) + if (set.size > this.options.maxAncestors) break; - count = this._countAncestors(parent, count, set, child, map); + this._countAncestors(parent, set, child, map); - if (count > this.options.maxAncestors) + if (set.size > this.options.maxAncestors) break; } - return count; + return set.size; }; /** @@ -1209,7 +1198,7 @@ Mempool.prototype._countAncestors = function countAncestors(entry, count, set, c */ Mempool.prototype.countDescendants = function countDescendants(entry) { - return this._countDescendants(entry, 0, {}); + return this._countDescendants(entry, new Set()); }; /** @@ -1217,34 +1206,31 @@ Mempool.prototype.countDescendants = function countDescendants(entry) { * descendants a transaction may have. * @private * @param {MempoolEntry} entry - * @param {Number} count * @param {Object} set * @returns {Number} */ -Mempool.prototype._countDescendants = function countDescendants(entry, count, set) { - let tx = entry.tx; - let hash = tx.hash('hex'); +Mempool.prototype._countDescendants = function _countDescendants(entry, set) { + const tx = entry.tx; + const hash = tx.hash('hex'); for (let i = 0; i < tx.outputs.length; i++) { - let child = this.getSpent(hash, i); - let next; + const child = this.getSpent(hash, i); if (!child) continue; - next = child.hash('hex'); + const next = child.hash('hex'); - if (set[next]) + if (set.has(next)) continue; - set[next] = true; - count += 1; + set.add(next); - count = this._countDescendants(child, count, set); + this._countDescendants(child, set); } - return count; + return set.size; }; /** @@ -1254,7 +1240,7 @@ Mempool.prototype._countDescendants = function countDescendants(entry, count, se */ Mempool.prototype.getAncestors = function getAncestors(entry) { - return this._getAncestors(entry, [], {}); + return this._getAncestors(entry, [], new Set()); }; /** @@ -1266,20 +1252,20 @@ Mempool.prototype.getAncestors = function getAncestors(entry) { * @returns {MempoolEntry[]} */ -Mempool.prototype._getAncestors = function getAncestors(entry, entries, set) { - let tx = entry.tx; +Mempool.prototype._getAncestors = function _getAncestors(entry, entries, set) { + const tx = entry.tx; - for (let input of tx.inputs) { - let hash = input.prevout.hash; - let parent = this.getEntry(hash); + for (const input of tx.inputs) { + const hash = input.prevout.hash; + const parent = this.getEntry(hash); if (!parent) continue; - if (set[hash]) + if (set.has(hash)) continue; - set[hash] = true; + set.add(hash); entries.push(parent); this._getAncestors(parent, entries, set); @@ -1295,7 +1281,7 @@ Mempool.prototype._getAncestors = function getAncestors(entry, entries, set) { */ Mempool.prototype.getDescendants = function getDescendants(entry) { - return this._getDescendants(entry, [], {}); + return this._getDescendants(entry, [], new Set()); }; /** @@ -1306,23 +1292,22 @@ Mempool.prototype.getDescendants = function getDescendants(entry) { * @returns {MempoolEntry[]} */ -Mempool.prototype._getDescendants = function getDescendants(entry, entries, set) { - let tx = entry.tx; - let hash = tx.hash('hex'); +Mempool.prototype._getDescendants = function _getDescendants(entry, entries, set) { + const tx = entry.tx; + const hash = tx.hash('hex'); for (let i = 0; i < tx.outputs.length; i++) { - let child = this.getSpent(hash, i); - let next; + const child = this.getSpent(hash, i); if (!child) continue; - next = child.hash('hex'); + const next = child.hash('hex'); - if (set[next]) + if (set.has(next)) continue; - set[next] = true; + set.add(next); entries.push(child); this._getDescendants(child, entries, set); @@ -1339,10 +1324,10 @@ Mempool.prototype._getDescendants = function getDescendants(entry, entries, set) */ Mempool.prototype.getDepends = function getDepends(tx) { - let prevout = tx.getPrevout(); - let depends = []; + const prevout = tx.getPrevout(); + const depends = []; - for (let hash of prevout) { + for (const hash of prevout) { if (this.hasEntry(hash)) depends.push(hash); } @@ -1357,8 +1342,8 @@ Mempool.prototype.getDepends = function getDepends(tx) { */ Mempool.prototype.hasDepends = function hasDepends(tx) { - for (let input of tx.inputs) { - let hash = input.prevout.hash; + for (const input of tx.inputs) { + const hash = input.prevout.hash; if (this.hasEntry(hash)) return true; } @@ -1374,10 +1359,10 @@ Mempool.prototype.hasDepends = function hasDepends(tx) { Mempool.prototype.getBalance = function getBalance() { let total = 0; - for (let [hash, entry] of this.map) { - let tx = entry.tx; + for (const [hash, entry] of this.map) { + const tx = entry.tx; for (let i = 0; i < tx.outputs.length; i++) { - let coin = this.getCoin(hash, i); + const coin = this.getCoin(hash, i); if (coin) total += coin.value; } @@ -1392,9 +1377,9 @@ Mempool.prototype.getBalance = function getBalance() { */ Mempool.prototype.getHistory = function getHistory() { - let txs = []; + const txs = []; - for (let entry of this.map.values()) + for (const entry of this.map.values()) txs.push(entry.tx); return txs; @@ -1427,8 +1412,6 @@ Mempool.prototype.hasOrphan = function hasOrphan(hash) { */ Mempool.prototype.storeOrphan = function storeOrphan(tx, missing, id) { - let hash = tx.hash('hex'); - if (tx.getWeight() > policy.MAX_TX_WEIGHT) { this.logger.debug('Ignoring large orphan: %s', tx.txid()); if (!tx.hasWitness()) @@ -1436,7 +1419,7 @@ Mempool.prototype.storeOrphan = function storeOrphan(tx, missing, id) { return []; } - for (let prev of missing) { + for (const prev of missing) { if (this.hasReject(prev)) { this.logger.debug('Not storing orphan %s (rejected parents).', tx.txid()); this.rejects.add(tx.hash()); @@ -1449,7 +1432,9 @@ Mempool.prototype.storeOrphan = function storeOrphan(tx, missing, id) { this.limitOrphans(); - for (let prev of missing) { + const hash = tx.hash('hex'); + + for (const prev of missing) { if (!this.waiting.has(prev)) this.waiting.set(prev, new Set()); @@ -1473,9 +1458,9 @@ Mempool.prototype.storeOrphan = function storeOrphan(tx, missing, id) { */ Mempool.prototype.handleOrphans = async function handleOrphans(parent) { - let resolved = this.resolveOrphans(parent); + const resolved = this.resolveOrphans(parent); - for (let orphan of resolved) { + for (const orphan of resolved) { let tx, missing; try { @@ -1521,17 +1506,18 @@ Mempool.prototype.handleOrphans = async function handleOrphans(parent) { */ Mempool.prototype.resolveOrphans = function resolveOrphans(parent) { - let hash = parent.hash('hex'); - let set = this.waiting.get(hash); - let resolved = []; + const hash = parent.hash('hex'); + const set = this.waiting.get(hash); if (!set) - return resolved; + return []; assert(set.size > 0); - for (let orphanHash of set.keys()) { - let orphan = this.getOrphan(orphanHash); + const resolved = []; + + for (const orphanHash of set.keys()) { + const orphan = this.getOrphan(orphanHash); assert(orphan); @@ -1553,12 +1539,12 @@ Mempool.prototype.resolveOrphans = function resolveOrphans(parent) { */ Mempool.prototype.removeOrphan = function removeOrphan(hash) { - let orphan = this.getOrphan(hash); - let tx; + const orphan = this.getOrphan(hash); if (!orphan) return false; + let tx; try { tx = orphan.toTX(); } catch (e) { @@ -1566,11 +1552,11 @@ Mempool.prototype.removeOrphan = function removeOrphan(hash) { this.logger.warning('%s %s', 'Warning: possible memory corruption.', 'Orphan failed deserialization.'); - return; + return false; } - for (let prev of tx.getPrevout()) { - let set = this.waiting.get(prev); + for (const prev of tx.getPrevout()) { + const set = this.waiting.get(prev); if (!set) continue; @@ -1596,19 +1582,20 @@ Mempool.prototype.removeOrphan = function removeOrphan(hash) { */ Mempool.prototype.limitOrphans = function limitOrphans() { - let index, hash; - if (this.orphans.size < this.options.maxOrphans) return false; - index = random.randomRange(0, this.orphans.size); + let index = random.randomRange(0, this.orphans.size); + let hash; for (hash of this.orphans.keys()) { if (index === 0) break; index--; } + assert(hash); + this.logger.debug('Removing orphan %s from mempool.', util.revHex(hash)); this.removeOrphan(hash); @@ -1627,8 +1614,8 @@ Mempool.prototype.limitOrphans = function limitOrphans() { */ Mempool.prototype.isDoubleSpend = function isDoubleSpend(tx) { - for (let input of tx.inputs) { - let prevout = input.prevout; + for (const input of tx.inputs) { + const prevout = input.prevout; if (this.isSpent(prevout.hash, prevout.index)) return true; } @@ -1644,7 +1631,7 @@ Mempool.prototype.isDoubleSpend = function isDoubleSpend(tx) { */ Mempool.prototype.getSpentView = async function getSpentView(tx) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this.getCoinView(tx); } finally { @@ -1660,28 +1647,25 @@ Mempool.prototype.getSpentView = async function getSpentView(tx) { */ Mempool.prototype.getCoinView = async function getCoinView(tx) { - let view = new CoinView(); - let prevout = tx.getPrevout(); + const view = new CoinView(); - for (let hash of prevout) { - let entry = this.getEntry(hash); - let coins; + for (const {prevout} of tx.inputs) { + const entry = this.getEntry(prevout.hash); if (entry) { view.addTX(entry.tx, -1); continue; } - coins = await this.chain.db.getCoins(hash); + const coin = await this.chain.db.readCoin(prevout); - if (!coins) { - coins = new Coins(); - coins.hash = hash; - view.add(coins); + if (!coin) { + const coins = new Coins(); + view.add(prevout.hash, coins); continue; } - view.add(coins); + view.addEntry(prevout, coin); } return view; @@ -1695,17 +1679,17 @@ Mempool.prototype.getCoinView = async function getCoinView(tx) { */ Mempool.prototype.findMissing = function findMissing(tx, view) { - let missing = []; + const missing = []; - for (let input of tx.inputs) { - if (view.hasEntry(input)) + for (const {prevout} of tx.inputs) { + if (view.hasEntry(prevout)) continue; - missing.push(input.prevout.hash); + missing.push(prevout.hash); } if (missing.length === 0) - return; + return null; return missing; }; @@ -1717,9 +1701,9 @@ Mempool.prototype.findMissing = function findMissing(tx, view) { */ Mempool.prototype.getSnapshot = function getSnapshot() { - let keys = []; + const keys = []; - for (let hash of this.map.keys()) + for (const hash of this.map.keys()) keys.push(hash); return keys; @@ -1756,16 +1740,16 @@ Mempool.prototype.verifyFinal = function verifyFinal(tx, flags) { */ Mempool.prototype.trackEntry = function trackEntry(entry, view) { - let tx = entry.tx; - let hash = tx.hash('hex'); + const tx = entry.tx; + const hash = tx.hash('hex'); assert(!this.map.has(hash)); this.map.set(hash, entry); assert(!tx.isCoinbase()); - for (let input of tx.inputs) { - let key = input.prevout.toKey(); + for (const input of tx.inputs) { + const key = input.prevout.toKey(); this.spents.set(key, entry); } @@ -1782,16 +1766,16 @@ Mempool.prototype.trackEntry = function trackEntry(entry, view) { */ Mempool.prototype.untrackEntry = function untrackEntry(entry) { - let tx = entry.tx; - let hash = tx.hash('hex'); + const tx = entry.tx; + const hash = tx.hash('hex'); assert(this.map.has(hash)); this.map.delete(hash); assert(!tx.isCoinbase()); - for (let input of tx.inputs) { - let key = input.prevout.toKey(); + for (const input of tx.inputs) { + const key = input.prevout.toKey(); this.spents.delete(key); } @@ -1809,12 +1793,12 @@ Mempool.prototype.untrackEntry = function untrackEntry(entry) { */ Mempool.prototype.indexEntry = function indexEntry(entry, view) { - let tx = entry.tx; + const tx = entry.tx; this.txIndex.insert(entry, view); - for (let input of tx.inputs) { - let prev = input.prevout; + for (const input of tx.inputs) { + const prev = input.prevout; this.coinIndex.remove(prev.hash, prev.index); } @@ -1829,14 +1813,14 @@ Mempool.prototype.indexEntry = function indexEntry(entry, view) { */ Mempool.prototype.unindexEntry = function unindexEntry(entry) { - let tx = entry.tx; - let hash = tx.hash('hex'); + const tx = entry.tx; + const hash = tx.hash('hex'); this.txIndex.remove(hash); - for (let input of tx.inputs) { - let prevout = input.prevout.hash; - let prev = this.getTX(prevout.hash); + for (const input of tx.inputs) { + const prevout = input.prevout.hash; + const prev = this.getTX(prevout.hash); if (!prev) continue; @@ -1856,9 +1840,9 @@ Mempool.prototype.unindexEntry = function unindexEntry(entry) { */ Mempool.prototype.removeDoubleSpends = function removeDoubleSpends(tx) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let spent = this.getSpent(prevout.hash, prevout.index); + for (const input of tx.inputs) { + const prevout = input.prevout; + const spent = this.getSpent(prevout.hash, prevout.index); if (!spent) continue; @@ -1890,7 +1874,7 @@ Mempool.prototype.getSize = function getSize() { * @param {Amount} fee */ -Mempool.prototype.prioritise = function _prioritise(entry, pri, fee) { +Mempool.prototype.prioritise = function prioritise(entry, pri, fee) { if (-pri > entry.priority) pri = -entry.priority; @@ -1902,12 +1886,12 @@ Mempool.prototype.prioritise = function _prioritise(entry, pri, fee) { if (fee === 0) return; - this.updateAncestors(entry, preprioritise); + this.updateAncestors(entry, prePrioritise); entry.deltaFee += fee; entry.descFee += fee; - this.updateAncestors(entry, prioritise); + this.updateAncestors(entry, postPrioritise); }; /** @@ -1996,7 +1980,7 @@ MempoolOptions.prototype.fromOptions = function fromOptions(options) { } if (options.limitFreeRelay != null) { - assert(util.isUInt32(options.limitFreeRelay)); + assert(util.isU32(options.limitFreeRelay)); this.limitFreeRelay = options.limitFreeRelay; } @@ -2031,27 +2015,27 @@ MempoolOptions.prototype.fromOptions = function fromOptions(options) { } if (options.maxSize != null) { - assert(util.isUInt53(options.maxSize)); + assert(util.isU64(options.maxSize)); this.maxSize = options.maxSize; } if (options.maxOrphans != null) { - assert(util.isUInt32(options.maxOrphans)); + assert(util.isU32(options.maxOrphans)); this.maxOrphans = options.maxOrphans; } if (options.maxAncestors != null) { - assert(util.isUInt32(options.maxAncestors)); + assert(util.isU32(options.maxAncestors)); this.maxAncestors = options.maxAncestors; } if (options.expiryTime != null) { - assert(util.isUInt32(options.expiryTime)); + assert(util.isU32(options.expiryTime)); this.expiryTime = options.expiryTime; } if (options.minRelay != null) { - assert(util.isUint53(options.minRelay)); + assert(util.isU64(options.minRelay)); this.minRelay = options.minRelay; } @@ -2072,12 +2056,12 @@ MempoolOptions.prototype.fromOptions = function fromOptions(options) { } if (options.maxFiles != null) { - assert(util.isUInt32(options.maxFiles)); + assert(util.isU32(options.maxFiles)); this.maxFiles = options.maxFiles; } if (options.cacheSize != null) { - assert(util.isUInt53(options.cacheSize)); + assert(util.isU64(options.cacheSize)); this.cacheSize = options.cacheSize; } @@ -2129,28 +2113,30 @@ TXIndex.prototype.reset = function reset() { }; TXIndex.prototype.get = function get(addr) { - let items = this.index.get(addr); - let out = []; + const items = this.index.get(addr); if (!items) - return out; + return []; + + const out = []; - for (let entry of items.values()) + for (const entry of items.values()) out.push(entry.tx); return out; }; TXIndex.prototype.getMeta = function getMeta(addr) { - let items = this.index.get(addr); - let out = []; + const items = this.index.get(addr); if (!items) - return out; + return []; - for (let entry of items.values()) { - let meta = TXMeta.fromTX(entry.tx); - meta.ps = entry.ts; + const out = []; + + for (const entry of items.values()) { + const meta = TXMeta.fromTX(entry.tx); + meta.mtime = entry.time; out.push(meta); } @@ -2158,14 +2144,14 @@ TXIndex.prototype.getMeta = function getMeta(addr) { }; TXIndex.prototype.insert = function insert(entry, view) { - let tx = entry.tx; - let hash = tx.hash('hex'); - let addrs = tx.getHashes(view, 'hex'); + const tx = entry.tx; + const hash = tx.hash('hex'); + const addrs = tx.getHashes(view, 'hex'); if (addrs.length === 0) return; - for (let addr of addrs) { + for (const addr of addrs) { let items = this.index.get(addr); if (!items) { @@ -2181,13 +2167,13 @@ TXIndex.prototype.insert = function insert(entry, view) { }; TXIndex.prototype.remove = function remove(hash) { - let addrs = this.map.get(hash); + const addrs = this.map.get(hash); if (!addrs) return; - for (let addr of addrs) { - let items = this.index.get(addr); + for (const addr of addrs) { + const items = this.index.get(addr); assert(items); assert(items.has(hash)); @@ -2221,35 +2207,35 @@ CoinIndex.prototype.reset = function reset() { }; CoinIndex.prototype.get = function get(addr) { - let items = this.index.get(addr); - let out = []; + const items = this.index.get(addr); if (!items) - return out; + return []; + + const out = []; - for (let coin of items.values()) + for (const coin of items.values()) out.push(coin.toCoin()); return out; }; CoinIndex.prototype.insert = function insert(tx, index) { - let output = tx.outputs[index]; - let hash = tx.hash('hex'); - let addr = output.getHash('hex'); - let items, key; + const output = tx.outputs[index]; + const hash = tx.hash('hex'); + const addr = output.getHash('hex'); if (!addr) return; - items = this.index.get(addr); + let items = this.index.get(addr); if (!items) { items = new Map(); this.index.set(addr, items); } - key = Outpoint.toKey(hash, index); + const key = Outpoint.toKey(hash, index); assert(!items.has(key)); items.set(key, new IndexedCoin(tx, index)); @@ -2258,14 +2244,13 @@ CoinIndex.prototype.insert = function insert(tx, index) { }; CoinIndex.prototype.remove = function remove(hash, index) { - let key = Outpoint.toKey(hash, index); - let addr = this.map.get(key); - let items; + const key = Outpoint.toKey(hash, index); + const addr = this.map.get(key); if (!addr) return; - items = this.index.get(addr); + const items = this.index.get(addr); assert(items); assert(items.has(key)); @@ -2337,7 +2322,7 @@ function MempoolCache(options) { MempoolCache.VERSION = 2; MempoolCache.prototype.getVersion = async function getVersion() { - let data = await this.db.get(layout.V); + const data = await this.db.get(layout.V); if (!data) return -1; @@ -2346,21 +2331,21 @@ MempoolCache.prototype.getVersion = async function getVersion() { }; MempoolCache.prototype.getTip = async function getTip() { - let hash = await this.db.get(layout.R); + const hash = await this.db.get(layout.R); if (!hash) - return; + return null; return hash.toString('hex'); }; MempoolCache.prototype.getFees = async function getFees() { - let data = await this.db.get(layout.F); - let fees; + const data = await this.db.get(layout.F); if (!data) - return; + return null; + let fees; try { fees = Fees.fromRaw(data); } catch (e) { @@ -2449,7 +2434,7 @@ MempoolCache.prototype.flush = async function flush() { }; MempoolCache.prototype.init = async function init(hash) { - let batch = this.db.batch(); + const batch = this.db.batch(); batch.put(layout.V, encoding.U32(MempoolCache.VERSION)); batch.put(layout.R, Buffer.from(hash, 'hex')); await batch.write(); @@ -2496,10 +2481,10 @@ MempoolCache.prototype.verify = async function verify() { }; MempoolCache.prototype.wipe = async function wipe() { - let batch = this.db.batch(); - let keys = await this.getKeys(); + const batch = this.db.batch(); + const keys = await this.getKeys(); - for (let key of keys) + for (const key of keys) batch.del(key); batch.put(layout.V, encoding.U32(MempoolCache.VERSION)); @@ -2529,11 +2514,11 @@ function removeFee(parent, child) { parent.descSize -= child.descSize; } -function preprioritise(parent, child) { +function prePrioritise(parent, child) { parent.descFee -= child.deltaFee; } -function prioritise(parent, child) { +function postPrioritise(parent, child) { parent.descFee += child.deltaFee; } @@ -2558,16 +2543,16 @@ function cmpRate(a, b) { y = xs * yf; if (x === y) { - x = a.ts; - y = b.ts; + x = a.time; + y = b.time; } return x - y; } function useDesc(a) { - let x = a.deltaFee * a.descSize; - let y = a.descFee * a.size; + const x = a.deltaFee * a.descSize; + const y = a.descFee * a.size; return y > x; } diff --git a/lib/mempool/mempoolentry.js b/lib/mempool/mempoolentry.js index 7876cc4e8..2ca6f637a 100644 --- a/lib/mempool/mempoolentry.js +++ b/lib/mempool/mempoolentry.js @@ -21,12 +21,12 @@ const TX = require('../primitives/tx'); * @param {TX} options.tx - Transaction in mempool. * @param {Number} options.height - Entry height. * @param {Number} options.priority - Entry priority. - * @param {Number} options.ts - Entry time. + * @param {Number} options.time - Entry time. * @param {Amount} options.value - Value of on-chain coins. * @property {TX} tx * @property {Number} height * @property {Number} priority - * @property {Number} ts + * @property {Number} time * @property {Amount} value */ @@ -41,7 +41,7 @@ function MempoolEntry(options) { this.priority = 0; this.fee = 0; this.deltaFee = 0; - this.ts = 0; + this.time = 0; this.value = 0; this.dependencies = false; this.descFee = 0; @@ -65,7 +65,7 @@ MempoolEntry.prototype.fromOptions = function fromOptions(options) { this.priority = options.priority; this.fee = options.fee; this.deltaFee = options.deltaFee; - this.ts = options.ts; + this.time = options.time; this.value = options.value; this.dependencies = options.dependencies; this.descFee = options.descFee; @@ -91,16 +91,16 @@ MempoolEntry.fromOptions = function fromOptions(options) { */ MempoolEntry.prototype.fromTX = function fromTX(tx, view, height) { - let flags = Script.flags.STANDARD_VERIFY_FLAGS; - let value = tx.getChainValue(view); - let sigops = tx.getSigopsCost(view, flags); - let size = tx.getSigopsSize(sigops); - let priority = tx.getPriority(view, height, size); - let fee = tx.getFee(view); - let dependencies = false; + const flags = Script.flags.STANDARD_VERIFY_FLAGS; + const value = tx.getChainValue(view); + const sigops = tx.getSigopsCost(view, flags); + const size = tx.getSigopsSize(sigops); + const priority = tx.getPriority(view, height, size); + const fee = tx.getFee(view); - for (let input of tx.inputs) { - if (view.getHeight(input) === -1) { + let dependencies = false; + for (const {prevout} of tx.inputs) { + if (view.getHeight(prevout) === -1) { dependencies = true; break; } @@ -113,7 +113,7 @@ MempoolEntry.prototype.fromTX = function fromTX(tx, view, height) { this.priority = priority; this.fee = fee; this.deltaFee = fee; - this.ts = util.now(); + this.time = util.now(); this.value = value; this.dependencies = dependencies; this.descFee = fee; @@ -161,8 +161,8 @@ MempoolEntry.prototype.txid = function txid() { */ MempoolEntry.prototype.getPriority = function getPriority(height) { - let delta = height - this.height; - let priority = (delta * this.value) / this.size; + const delta = height - this.height; + const priority = (delta * this.value) / this.size; let result = this.priority + Math.floor(priority); if (result < 0) result = 0; @@ -225,7 +225,7 @@ MempoolEntry.prototype.getDescRate = function getDescRate() { */ MempoolEntry.prototype.memUsage = function memUsage() { - let tx = this.tx; + const tx = this.tx; let total = 0; total += 176; // mempool entry @@ -240,7 +240,7 @@ MempoolEntry.prototype.memUsage = function memUsage() { total += 32; // input array - for (let input of tx.inputs) { + for (const input of tx.inputs) { total += 120; // input total += 104; // prevout total += 88; // prevout hash @@ -250,7 +250,7 @@ MempoolEntry.prototype.memUsage = function memUsage() { total += 32; // script code array total += input.script.code.length * 40; // opcodes - for (let op of input.script.code) { + for (const op of input.script.code) { if (op.data) total += 80; // op buffers } @@ -262,14 +262,14 @@ MempoolEntry.prototype.memUsage = function memUsage() { total += 32; // output array - for (let output of tx.outputs) { + for (const output of tx.outputs) { total += 104; // output total += 40; // script total += 80; // script raw buffer total += 32; // script code array total += output.script.code.length * 40; // opcodes - for (let op of output.script.code) { + for (const op of output.script.code) { if (op.data) total += 80; // op buffers } @@ -287,7 +287,7 @@ MempoolEntry.prototype.memUsage = function memUsage() { */ MempoolEntry.prototype.isFree = function isFree(height) { - let priority = this.getPriority(height); + const priority = this.getPriority(height); return priority > policy.FREE_THRESHOLD; }; @@ -306,14 +306,14 @@ MempoolEntry.prototype.getSize = function getSize() { */ MempoolEntry.prototype.toRaw = function toRaw() { - let bw = new StaticWriter(this.getSize()); + const bw = new StaticWriter(this.getSize()); bw.writeBytes(this.tx.toRaw()); bw.writeU32(this.height); bw.writeU32(this.size); bw.writeU32(this.sigops); bw.writeDouble(this.priority); bw.writeU64(this.fee); - bw.writeU32(this.ts); + bw.writeU32(this.time); bw.writeU64(this.value); bw.writeU8(this.dependencies ? 1 : 0); return bw.render(); @@ -327,7 +327,7 @@ MempoolEntry.prototype.toRaw = function toRaw() { */ MempoolEntry.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.tx = TX.fromReader(br); this.height = br.readU32(); this.size = br.readU32(); @@ -335,7 +335,7 @@ MempoolEntry.prototype.fromRaw = function fromRaw(data) { this.priority = br.readDouble(); this.fee = br.readU64(); this.deltaFee = this.fee; - this.ts = br.readU32(); + this.time = br.readU32(); this.value = br.readU64(); this.dependencies = br.readU8() === 1; this.descFee = this.fee; diff --git a/lib/mining/common.js b/lib/mining/common.js index 90a82d03b..2740ace67 100644 --- a/lib/mining/common.js +++ b/lib/mining/common.js @@ -34,7 +34,7 @@ const B0 = 0x1; common.swap32 = function swap32(data) { for (let i = 0; i < data.length; i += 4) { - let field = data.readUInt32LE(i, true); + const field = data.readUInt32LE(i, true); data.writeUInt32BE(field, i, true); } @@ -48,7 +48,7 @@ common.swap32 = function swap32(data) { */ common.swap32hex = function swap32hex(str) { - let data = Buffer.from(str, 'hex'); + const data = Buffer.from(str, 'hex'); return common.swap32(data).toString('hex'); }; @@ -111,8 +111,8 @@ common.double256 = function double256(target) { */ common.getDifficulty = function getDifficulty(target) { - let d = DIFF; - let n = common.double256(target); + const d = DIFF; + const n = common.double256(target); if (n === 0) return d; @@ -127,7 +127,7 @@ common.getDifficulty = function getDifficulty(target) { */ common.getTarget = function getTarget(bits) { - let target = consensus.fromCompact(bits); + const target = consensus.fromCompact(bits); if (target.isNeg()) throw new Error('Target is negative.'); @@ -135,7 +135,7 @@ common.getTarget = function getTarget(bits) { if (target.cmpn(0) === 0) throw new Error('Target is zero.'); - return target.toBuffer('le', 32); + return target.toArrayLike(Buffer, 'le', 32); }; /** @@ -145,7 +145,7 @@ common.getTarget = function getTarget(bits) { */ common.getBits = function getBits(data) { - let target = new BN(data, 'le'); + const target = new BN(data, 'le'); if (target.cmpn(0) === 0) throw new Error('Target is zero.'); diff --git a/lib/mining/cpuminer.js b/lib/mining/cpuminer.js index 6c30bbf6b..3e39d2b53 100644 --- a/lib/mining/cpuminer.js +++ b/lib/mining/cpuminer.js @@ -44,7 +44,7 @@ function CPUMiner(miner) { this._init(); } -util.inherits(CPUMiner, AsyncObject); +Object.setPrototypeOf(CPUMiner.prototype, AsyncObject.prototype); /** * Nonce range interval. @@ -76,7 +76,7 @@ CPUMiner.prototype._init = function _init() { * @returns {Promise} */ -CPUMiner.prototype._open = async function open() { +CPUMiner.prototype._open = async function _open() { }; /** @@ -86,7 +86,7 @@ CPUMiner.prototype._open = async function open() { * @returns {Promise} */ -CPUMiner.prototype._close = async function close() { +CPUMiner.prototype._close = async function _close() { await this.stop(); }; @@ -107,17 +107,13 @@ CPUMiner.prototype.start = function start() { * @returns {Promise} */ -CPUMiner.prototype._start = async function start() { - let job; - +CPUMiner.prototype._start = async function _start() { assert(!this.running, 'Miner is already running.'); this.running = true; this.stopping = false; for (;;) { - let block, entry; - this.job = null; try { @@ -132,6 +128,7 @@ CPUMiner.prototype._start = async function start() { if (this.stopping) break; + let block; try { block = await this.mineAsync(this.job); } catch (e) { @@ -147,6 +144,7 @@ CPUMiner.prototype._start = async function start() { if (!block) continue; + let entry; try { entry = await this.chain.add(block); } catch (e) { @@ -178,7 +176,7 @@ CPUMiner.prototype._start = async function start() { this.emit('block', block, entry); } - job = this.stopJob; + const job = this.stopJob; if (job) { this.stopJob = null; @@ -193,7 +191,7 @@ CPUMiner.prototype._start = async function start() { */ CPUMiner.prototype.stop = async function stop() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._stop(); } finally { @@ -250,7 +248,7 @@ CPUMiner.prototype.wait = function wait() { */ CPUMiner.prototype.createJob = async function createJob(tip, address) { - let attempt = await this.miner.createBlock(tip, address); + const attempt = await this.miner.createBlock(tip, address); return new CPUJob(this, attempt); }; @@ -263,7 +261,7 @@ CPUMiner.prototype.createJob = async function createJob(tip, address) { */ CPUMiner.prototype.mineBlock = async function mineBlock(tip, address) { - let job = await this.createJob(tip, address); + const job = await this.createJob(tip, address); return await this.mineAsync(job); }; @@ -292,9 +290,10 @@ CPUMiner.prototype.notifyEntry = function notifyEntry() { */ CPUMiner.prototype.findNonce = function findNonce(job) { - let data = job.getHeader(); - let target = job.attempt.target; - let interval = CPUMiner.INTERVAL; + const data = job.getHeader(); + const target = job.attempt.target; + const interval = CPUMiner.INTERVAL; + let min = 0; let max = interval; let nonce; @@ -322,16 +321,17 @@ CPUMiner.prototype.findNonce = function findNonce(job) { */ CPUMiner.prototype.findNonceAsync = async function findNonceAsync(job) { - let data = job.getHeader(); - let target = job.attempt.target; - let interval = CPUMiner.INTERVAL; + if (!this.workers) + return this.findNonce(job); + + const data = job.getHeader(); + const target = job.attempt.target; + const interval = CPUMiner.INTERVAL; + let min = 0; let max = interval; let nonce; - if (!this.workers) - return this.findNonce(job); - while (max <= 0xffffffff) { nonce = await this.workers.mine(data, target, min, max); @@ -357,10 +357,9 @@ CPUMiner.prototype.findNonceAsync = async function findNonceAsync(job) { */ CPUMiner.prototype.mine = function mine(job) { - let nonce; - job.start = util.now(); + let nonce; for (;;) { nonce = this.findNonce(job); @@ -394,7 +393,7 @@ CPUMiner.prototype.mineAsync = async function mineAsync(job) { break; if (job.destroyed) - return; + return null; job.updateNonce(); @@ -411,10 +410,10 @@ CPUMiner.prototype.mineAsync = async function mineAsync(job) { */ CPUMiner.prototype.sendStatus = function sendStatus(job, nonce) { - let attempt = job.attempt; - let tip = util.revHex(attempt.prevBlock); - let hashes = job.getHashes(nonce); - let hashrate = job.getRate(nonce); + const attempt = job.attempt; + const tip = util.revHex(attempt.prevBlock); + const hashes = job.getHashes(nonce); + const hashrate = job.getRate(nonce); this.logger.info( 'Status: hashrate=%dkhs hashes=%d target=%d height=%d tip=%s', @@ -453,12 +452,12 @@ function CPUJob(miner, attempt) { */ CPUJob.prototype.getHeader = function getHeader() { - let attempt = this.attempt; - let n1 = this.nonce1; - let n2 = this.nonce2; - let ts = attempt.ts; - let root = attempt.getRoot(n1, n2); - let data = attempt.getHeader(root, ts, 0); + const attempt = this.attempt; + const n1 = this.nonce1; + const n2 = this.nonce2; + const time = attempt.time; + const root = attempt.getRoot(n1, n2); + const data = attempt.getHeader(root, time, 0); return data; }; @@ -469,16 +468,15 @@ CPUJob.prototype.getHeader = function getHeader() { */ CPUJob.prototype.commit = function commit(nonce) { - let attempt = this.attempt; - let n1 = this.nonce1; - let n2 = this.nonce2; - let ts = attempt.ts; - let proof; + const attempt = this.attempt; + const n1 = this.nonce1; + const n2 = this.nonce2; + const time = attempt.time; assert(!this.committed, 'Job already committed.'); this.committed = true; - proof = attempt.getProof(n1, n2, ts, nonce); + const proof = attempt.getProof(n1, n2, time, nonce); return attempt.commit(proof); }; @@ -536,7 +534,7 @@ CPUJob.prototype.destroy = function destroy() { */ CPUJob.prototype.getHashes = function getHashes(nonce) { - let extra = this.nonce1 * 0x100000000 + this.nonce2; + const extra = this.nonce1 * 0x100000000 + this.nonce2; return extra * 0xffffffff + nonce; }; @@ -547,9 +545,9 @@ CPUJob.prototype.getHashes = function getHashes(nonce) { */ CPUJob.prototype.getRate = function getRate(nonce) { - let hashes = this.getHashes(nonce); - let seconds = util.now() - this.start; - return Math.floor(hashes / seconds); + const hashes = this.getHashes(nonce); + const seconds = util.now() - this.start; + return Math.floor(hashes / Math.max(1, seconds)); }; /** diff --git a/lib/mining/miner.js b/lib/mining/miner.js index fc40bd3c1..6b19a254c 100644 --- a/lib/mining/miner.js +++ b/lib/mining/miner.js @@ -36,7 +36,7 @@ function Miner(options) { this.options = new MinerOptions(options); this.network = this.options.network; this.logger = this.options.logger.context('miner'); - this.workers = null; + this.workers = this.options.workers; this.chain = this.options.chain; this.mempool = this.options.mempool; this.addresses = this.options.addresses; @@ -46,7 +46,7 @@ function Miner(options) { this.init(); } -util.inherits(Miner, AsyncObject); +Object.setPrototypeOf(Miner.prototype, AsyncObject.prototype); /** * Open the miner, wait for the chain and mempool to load. @@ -68,7 +68,7 @@ Miner.prototype.init = function init() { * @returns {Promise} */ -Miner.prototype._open = async function open() { +Miner.prototype._open = async function _open() { await this.chain.open(); if (this.mempool) @@ -90,7 +90,7 @@ Miner.prototype._open = async function open() { * @returns {Promise} */ -Miner.prototype._close = async function close() { +Miner.prototype._close = async function _close() { await this.cpu.close(); }; @@ -103,7 +103,7 @@ Miner.prototype._close = async function close() { */ Miner.prototype.createBlock = async function createBlock(tip, address) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._createBlock(tip, address); } finally { @@ -120,9 +120,8 @@ Miner.prototype.createBlock = async function createBlock(tip, address) { * @returns {Promise} - Returns {@link BlockTemplate}. */ -Miner.prototype._createBlock = async function createBlock(tip, address) { +Miner.prototype._createBlock = async function _createBlock(tip, address) { let version = this.options.version; - let ts, mtp, locktime, target, attempt, state; if (!tip) tip = this.chain.tip; @@ -133,22 +132,19 @@ Miner.prototype._createBlock = async function createBlock(tip, address) { if (version === -1) version = await this.chain.computeBlockVersion(tip); - mtp = await tip.getMedianTime(); - ts = Math.max(this.network.now(), mtp + 1); - locktime = ts; - - state = await this.chain.getDeployments(ts, tip); + const mtp = await tip.getMedianTime(); + const time = Math.max(this.network.now(), mtp + 1); - if (state.hasMTP()) - locktime = mtp; + const state = await this.chain.getDeployments(time, tip); + const target = await this.chain.getTarget(time, tip); - target = await this.chain.getTarget(ts, tip); + const locktime = state.hasMTP() ? mtp : time; - attempt = new BlockTemplate({ + const attempt = new BlockTemplate({ prevBlock: tip.hash, height: tip.height + 1, version: version, - ts: ts, + time: time, bits: target, locktime: locktime, mtp: mtp, @@ -172,7 +168,7 @@ Miner.prototype._createBlock = async function createBlock(tip, address) { attempt.getDifficulty()); if (this.options.preverify) { - let block = attempt.toBlock(); + const block = attempt.toBlock(); try { await this.chain._verifyBlock(block); @@ -199,7 +195,7 @@ Miner.prototype._createBlock = async function createBlock(tip, address) { */ Miner.prototype.updateTime = function updateTime(attempt) { - attempt.ts = Math.max(this.network.now(), attempt.mtp + 1); + attempt.time = Math.max(this.network.now(), attempt.mtp + 1); }; /** @@ -255,39 +251,39 @@ Miner.prototype.getAddress = function getAddress() { Miner.prototype.assemble = function assemble(attempt) { let priority = this.options.priorityWeight > 0; - let queue = new Heap(cmpRate); - let depMap = {}; + const queue = new Heap(cmpRate); + const depMap = new Map(); if (priority) queue.set(cmpPriority); if (!this.mempool) { attempt.refresh(); - return []; + return; } assert(this.mempool.tip === this.chain.tip.hash, 'Mempool/chain tip mismatch! Unsafe to create block.'); - for (let entry of this.mempool.map.values()) { - let item = BlockEntry.fromEntry(entry, attempt); - let tx = item.tx; + for (const entry of this.mempool.map.values()) { + const item = BlockEntry.fromEntry(entry, attempt); + const tx = item.tx; if (tx.isCoinbase()) throw new Error('Cannot add coinbase to block.'); - for (let {prevout} of tx.inputs) { - let hash = prevout.hash; + for (const {prevout} of tx.inputs) { + const hash = prevout.hash; if (!this.mempool.hasEntry(hash)) continue; item.depCount += 1; - if (!depMap[hash]) - depMap[hash] = []; + if (!depMap.has(hash)) + depMap.set(hash, []); - depMap[hash].push(item); + depMap.get(hash).push(item); } if (item.depCount > 0) @@ -297,12 +293,11 @@ Miner.prototype.assemble = function assemble(attempt) { } while (queue.size() > 0) { - let item = queue.shift(); - let tx = item.tx; - let hash = item.hash; + const item = queue.shift(); + const tx = item.tx; + const hash = item.hash; let weight = attempt.weight; let sigops = attempt.sigops; - let deps; if (!tx.isFinal(attempt.height, attempt.locktime)) continue; @@ -339,12 +334,12 @@ Miner.prototype.assemble = function assemble(attempt) { attempt.fees += item.fee; attempt.items.push(item); - deps = depMap[hash]; + const deps = depMap.get(hash); if (!deps) continue; - for (let item of deps) { + for (const item of deps) { if (--item.depCount === 0) queue.insert(item); } @@ -356,7 +351,7 @@ Miner.prototype.assemble = function assemble(attempt) { 'Block exceeds reserved weight!'); if (this.options.preverify) { - let block = attempt.toBlock(); + const block = attempt.toBlock(); assert(block.getWeight() <= attempt.weight, 'Block exceeds reserved weight!'); @@ -432,13 +427,13 @@ MinerOptions.prototype.fromOptions = function fromOptions(options) { } if (options.version != null) { - assert(util.isNumber(options.version)); + assert(util.isInt(options.version)); this.version = options.version; } if (options.address) { if (Array.isArray(options.address)) { - for (let item of options.address) + for (const item of options.address) this.addresses.push(new Address(item)); } else { this.addresses.push(new Address(options.address)); @@ -447,7 +442,7 @@ MinerOptions.prototype.fromOptions = function fromOptions(options) { if (options.addresses) { assert(Array.isArray(options.addresses)); - for (let item of options.addresses) + for (const item of options.addresses) this.addresses.push(new Address(item)); } @@ -466,41 +461,41 @@ MinerOptions.prototype.fromOptions = function fromOptions(options) { } if (options.minWeight != null) { - assert(util.isNumber(options.minWeight)); + assert(util.isU32(options.minWeight)); this.minWeight = options.minWeight; } if (options.maxWeight != null) { - assert(util.isNumber(options.maxWeight)); + assert(util.isU32(options.maxWeight)); assert(options.maxWeight <= consensus.MAX_BLOCK_WEIGHT, 'Max weight must be below MAX_BLOCK_WEIGHT'); this.maxWeight = options.maxWeight; } if (options.maxSigops != null) { - assert(util.isNumber(options.maxSigops)); + assert(util.isU32(options.maxSigops)); assert(options.maxSigops <= consensus.MAX_BLOCK_SIGOPS_COST, 'Max sigops must be below MAX_BLOCK_SIGOPS_COST'); this.maxSigops = options.maxSigops; } if (options.priorityWeight != null) { - assert(util.isNumber(options.priorityWeight)); + assert(util.isU32(options.priorityWeight)); this.priorityWeight = options.priorityWeight; } if (options.priorityThreshold != null) { - assert(util.isNumber(options.priorityThreshold)); + assert(util.isU32(options.priorityThreshold)); this.priorityThreshold = options.priorityThreshold; } if (options.reservedWeight != null) { - assert(util.isNumber(options.reservedWeight)); + assert(util.isU32(options.reservedWeight)); this.reservedWeight = options.reservedWeight; } if (options.reservedSigops != null) { - assert(util.isNumber(options.reservedSigops)); + assert(util.isU32(options.reservedSigops)); this.reservedSigops = options.reservedSigops; } diff --git a/lib/mining/template.js b/lib/mining/template.js index 6dd5e7a12..a1a3477bb 100644 --- a/lib/mining/template.js +++ b/lib/mining/template.js @@ -11,7 +11,6 @@ const assert = require('assert'); const util = require('../utils/util'); const digest = require('../crypto/digest'); const merkle = require('../crypto/merkle'); -const BN = require('../crypto/bn'); const StaticWriter = require('../utils/staticwriter'); const Address = require('../primitives/address'); const TX = require('../primitives/tx'); @@ -40,7 +39,7 @@ function BlockTemplate(options) { this.prevBlock = encoding.NULL_HASH; this.version = 1; this.height = 0; - this.ts = 0; + this.time = 0; this.bits = 0; this.target = encoding.ZERO_HASH; this.locktime = 0; @@ -88,9 +87,9 @@ BlockTemplate.prototype.fromOptions = function fromOptions(options) { this.height = options.height; } - if (options.ts != null) { - assert(typeof options.ts === 'number'); - this.ts = options.ts; + if (options.time != null) { + assert(typeof options.time === 'number'); + this.time = options.time; } if (options.bits != null) @@ -171,16 +170,15 @@ BlockTemplate.fromOptions = function fromOptions(options) { */ BlockTemplate.prototype.getWitnessHash = function getWitnessHash() { - let nonce = encoding.ZERO_HASH; - let leaves = []; - let root, malleated; + const nonce = encoding.ZERO_HASH; + const leaves = []; leaves.push(encoding.ZERO_HASH); - for (let item of this.items) + for (const item of this.items) leaves.push(item.tx.witnessHash()); - [root, malleated] = merkle.createRoot(leaves); + const [root, malleated] = merkle.createRoot(leaves); assert(!malleated); @@ -224,7 +222,7 @@ BlockTemplate.prototype.setTarget = function setTarget(target) { */ BlockTemplate.prototype.getReward = function getReward() { - let reward = consensus.getReward(this.height, this.interval); + const reward = consensus.getReward(this.height, this.interval); return reward + this.fees; }; @@ -235,39 +233,37 @@ BlockTemplate.prototype.getReward = function getReward() { */ BlockTemplate.prototype.createCoinbase = function createCoinbase(hash) { - let scale = consensus.WITNESS_SCALE_FACTOR; - let cb = new TX(); - let padding = 0; - let input, output, commit; + const scale = consensus.WITNESS_SCALE_FACTOR; + const cb = new TX(); // Coinbase input. - input = new Input(); + const input = new Input(); // Height (required in v2+ blocks) - input.script.push(new BN(this.height)); + input.script.pushInt(this.height); // Coinbase flags. - input.script.push(encoding.ZERO_HASH160); + input.script.pushData(encoding.ZERO_HASH160); // Smaller nonce for good measure. - input.script.push(util.nonce(4)); + input.script.pushData(util.nonce(4)); // Extra nonce: incremented when // the nonce overflows. - input.script.push(encoding.ZERO_U64); + input.script.pushData(encoding.ZERO_U64); input.script.compile(); // Set up the witness nonce. if (this.witness) { - input.witness.set(0, encoding.ZERO_HASH); + input.witness.push(encoding.ZERO_HASH); input.witness.compile(); } cb.inputs.push(input); // Reward output. - output = new Output(); + const output = new Output(); output.script.fromPubkeyhash(encoding.ZERO_HASH160); output.value = this.getReward(); @@ -277,13 +273,15 @@ BlockTemplate.prototype.createCoinbase = function createCoinbase(hash) { // need to set up the commitment. if (this.witness) { // Commitment output. - commit = new Output(); + const commit = new Output(); commit.script.fromCommitment(hash); cb.outputs.push(commit); } // Padding for the CB height (constant size). - padding = 5 - input.script.code[0].getSize(); + const op = input.script.get(0); + assert(op); + const padding = 5 - op.getSize(); assert(padding >= 0); // Reserved size. @@ -298,21 +296,20 @@ BlockTemplate.prototype.createCoinbase = function createCoinbase(hash) { // CB size = 208 // Sigops cost = 4 if (!this.witness) { - assert.equal(cb.getWeight() + padding * scale, 500); - assert.equal(cb.getBaseSize() + padding, 125); - assert.equal(cb.getSize() + padding, 125); + assert.strictEqual(cb.getWeight() + padding * scale, 500); + assert.strictEqual(cb.getBaseSize() + padding, 125); + assert.strictEqual(cb.getSize() + padding, 125); } else { - assert.equal(cb.getWeight() + padding * scale, 724); - assert.equal(cb.getBaseSize() + padding, 172); - assert.equal(cb.getSize() + padding, 208); + assert.strictEqual(cb.getWeight() + padding * scale, 724); + assert.strictEqual(cb.getBaseSize() + padding, 172); + assert.strictEqual(cb.getSize() + padding, 208); } // Setup coinbase flags (variable size). - input.script.set(1, this.coinbaseFlags); + input.script.setData(1, this.coinbaseFlags); input.script.compile(); // Setup output script (variable size). - output.script.clear(); output.script.fromAddress(this.address); cb.refresh(); @@ -328,11 +325,10 @@ BlockTemplate.prototype.createCoinbase = function createCoinbase(hash) { */ BlockTemplate.prototype.refresh = function refresh() { - let hash = this.getWitnessHash(); - let cb = this.createCoinbase(hash); - let raw = cb.toNormal(); + const hash = this.getWitnessHash(); + const cb = this.createCoinbase(hash); + const raw = cb.toNormal(); let size = 0; - let left, right; size += 4; // version size += 1; // varint inputs length @@ -341,11 +337,11 @@ BlockTemplate.prototype.refresh = function refresh() { // Cut off right after the nonce // push and before the sequence. - left = raw.slice(0, size); + const left = raw.slice(0, size); // Include the sequence. size += 4 + 4; // nonce1 + nonce2 - right = raw.slice(size); + const right = raw.slice(size); this.commitment = hash; this.left = left; @@ -362,13 +358,12 @@ BlockTemplate.prototype.refresh = function refresh() { BlockTemplate.prototype.getRawCoinbase = function getRawCoinbase(nonce1, nonce2) { let size = 0; - let bw; size += this.left.length; size += 4 + 4; size += this.right.length; - bw = new StaticWriter(size); + const bw = new StaticWriter(size); bw.writeBytes(this.left); bw.writeU32BE(nonce1); bw.writeU32BE(nonce2); @@ -385,26 +380,26 @@ BlockTemplate.prototype.getRawCoinbase = function getRawCoinbase(nonce1, nonce2) */ BlockTemplate.prototype.getRoot = function getRoot(nonce1, nonce2) { - let raw = this.getRawCoinbase(nonce1, nonce2); - let hash = digest.hash256(raw); + const raw = this.getRawCoinbase(nonce1, nonce2); + const hash = digest.hash256(raw); return this.tree.withFirst(hash); }; /** * Create raw block header with given parameters. * @param {Buffer} root - * @param {Number} ts + * @param {Number} time * @param {Number} nonce * @returns {Buffer} */ -BlockTemplate.prototype.getHeader = function getHeader(root, ts, nonce) { - let bw = new StaticWriter(80); +BlockTemplate.prototype.getHeader = function getHeader(root, time, nonce) { + const bw = new StaticWriter(80); bw.writeU32(this.version); bw.writeHash(this.prevBlock); bw.writeHash(root); - bw.writeU32(ts); + bw.writeU32(time); bw.writeU32(this.bits); bw.writeU32(nonce); @@ -415,16 +410,16 @@ BlockTemplate.prototype.getHeader = function getHeader(root, ts, nonce) { * Calculate proof with given parameters. * @param {Number} nonce1 * @param {Number} nonce2 - * @param {Number} ts + * @param {Number} time * @param {Number} nonce * @returns {BlockProof} */ -BlockTemplate.prototype.getProof = function getProof(nonce1, nonce2, ts, nonce) { - let root = this.getRoot(nonce1, nonce2); - let data = this.getHeader(root, ts, nonce); - let hash = digest.hash256(data); - return new BlockProof(hash, root, nonce1, nonce2, ts, nonce); +BlockTemplate.prototype.getProof = function getProof(nonce1, nonce2, time, nonce) { + const root = this.getRoot(nonce1, nonce2); + const data = this.getHeader(root, time, nonce); + const hash = digest.hash256(data); + return new BlockProof(hash, root, nonce1, nonce2, time, nonce); }; /** @@ -435,12 +430,11 @@ BlockTemplate.prototype.getProof = function getProof(nonce1, nonce2, ts, nonce) */ BlockTemplate.prototype.getCoinbase = function getCoinbase(nonce1, nonce2) { - let raw = this.getRawCoinbase(nonce1, nonce2); - let tx = TX.fromRaw(raw); - let input; + const raw = this.getRawCoinbase(nonce1, nonce2); + const tx = TX.fromRaw(raw); if (this.witness) { - input = tx.inputs[0]; + const input = tx.inputs[0]; input.witness.push(encoding.ZERO_HASH); input.witness.compile(); tx.refresh(); @@ -456,26 +450,25 @@ BlockTemplate.prototype.getCoinbase = function getCoinbase(nonce1, nonce2) { */ BlockTemplate.prototype.commit = function commit(proof) { - let root = proof.root; - let n1 = proof.nonce1; - let n2 = proof.nonce2; - let ts = proof.ts; - let nonce = proof.nonce; - let block = new Block(); - let tx; + const root = proof.root; + const n1 = proof.nonce1; + const n2 = proof.nonce2; + const time = proof.time; + const nonce = proof.nonce; + const block = new Block(); block.version = this.version; block.prevBlock = this.prevBlock; block.merkleRoot = root.toString('hex'); - block.ts = ts; + block.time = time; block.bits = this.bits; block.nonce = nonce; - tx = this.getCoinbase(n1, n2); + const tx = this.getCoinbase(n1, n2); block.txs.push(tx); - for (let item of this.items) + for (const item of this.items) block.txs.push(item.tx); return block; @@ -498,7 +491,7 @@ BlockTemplate.prototype.toCoinbase = function toCoinbase() { */ BlockTemplate.prototype.toBlock = function toBlock() { - let proof = this.getProof(0, 0, this.ts, 0); + const proof = this.getProof(0, 0, this.time, 0); return this.commit(proof); }; @@ -529,13 +522,11 @@ BlockTemplate.prototype.setAddress = function setAddress(address) { */ BlockTemplate.prototype.addTX = function addTX(tx, view) { - let item, weight, sigops; - assert(!tx.mutable, 'Cannot add mutable TX to block.'); - item = BlockEntry.fromTX(tx, view, this); - weight = item.tx.getWeight(); - sigops = item.sigops; + const item = BlockEntry.fromTX(tx, view, this); + const weight = item.tx.getWeight(); + const sigops = item.sigops; if (!tx.isFinal(this.height, this.locktime)) return false; @@ -567,16 +558,14 @@ BlockTemplate.prototype.addTX = function addTX(tx, view) { */ BlockTemplate.prototype.pushTX = function pushTX(tx, view) { - let item, weight, sigops; - assert(!tx.mutable, 'Cannot add mutable TX to block.'); if (!view) view = new CoinView(); - item = BlockEntry.fromTX(tx, view, this); - weight = item.tx.getWeight(); - sigops = item.sigops; + const item = BlockEntry.fromTX(tx, view, this); + const weight = item.tx.getWeight(); + const sigops = item.sigops; this.weight += weight; this.sigops += sigops; @@ -624,7 +613,7 @@ function BlockEntry(tx) { */ BlockEntry.fromTX = function fromTX(tx, view, attempt) { - let item = new BlockEntry(tx); + const item = new BlockEntry(tx); item.fee = tx.getFee(view); item.rate = tx.getRate(view); item.priority = tx.getPriority(view, attempt.height); @@ -642,7 +631,7 @@ BlockEntry.fromTX = function fromTX(tx, view, attempt) { */ BlockEntry.fromEntry = function fromEntry(entry, attempt) { - let item = new BlockEntry(entry.tx); + const item = new BlockEntry(entry.tx); item.fee = entry.getFee(); item.rate = entry.getDeltaRate(); item.priority = entry.getPriority(attempt.height); @@ -659,16 +648,16 @@ BlockEntry.fromEntry = function fromEntry(entry, attempt) { * @param {Hash} root * @param {Number} nonce1 * @param {Number} nonce2 - * @param {Number} ts + * @param {Number} time * @param {Number} nonce */ -function BlockProof(hash, root, nonce1, nonce2, ts, nonce) { +function BlockProof(hash, root, nonce1, nonce2, time, nonce) { this.hash = hash; this.root = root; this.nonce1 = nonce1; this.nonce2 = nonce2; - this.ts = ts; + this.time = time; this.nonce = nonce; } @@ -695,26 +684,26 @@ function MerkleTree() { } MerkleTree.prototype.withFirst = function withFirst(hash) { - for (let step of this.steps) + for (const step of this.steps) hash = digest.root256(hash, step); return hash; }; MerkleTree.prototype.toJSON = function toJSON() { - let steps = []; + const steps = []; - for (let step of this.steps) + for (const step of this.steps) steps.push(step.toString('hex')); return steps; }; MerkleTree.prototype.fromItems = function fromItems(items) { - let leaves = []; + const leaves = []; leaves.push(encoding.ZERO_HASH); - for (let item of items) + for (const item of items) leaves.push(item.tx.hash()); return this.fromLeaves(leaves); @@ -725,12 +714,12 @@ MerkleTree.fromItems = function fromItems(items) { }; MerkleTree.prototype.fromBlock = function fromBlock(txs) { - let leaves = []; + const leaves = []; leaves.push(encoding.ZERO_HASH); for (let i = 1; i < txs.length; i++) { - let tx = txs[i]; + const tx = txs[i]; leaves.push(tx.hash()); } @@ -745,7 +734,7 @@ MerkleTree.prototype.fromLeaves = function fromLeaves(leaves) { let len = leaves.length; while (len > 1) { - let hashes = [encoding.ZERO_HASH]; + const hashes = [encoding.ZERO_HASH]; this.steps.push(leaves[1]); @@ -753,7 +742,7 @@ MerkleTree.prototype.fromLeaves = function fromLeaves(leaves) { leaves.push(leaves[len - 1]); for (let i = 2; i < len; i += 2) { - let hash = digest.root256(leaves[i], leaves[i + 1]); + const hash = digest.root256(leaves[i], leaves[i + 1]); hashes.push(hash); } diff --git a/lib/native.js b/lib/native.js index 0c9df7333..cdd376393 100644 --- a/lib/native.js +++ b/lib/native.js @@ -8,7 +8,7 @@ exports.binding = null; -if (+process.env.BCOIN_NO_NATIVE !== 1) { +if (Number(process.env.BCOIN_NO_NATIVE) !== 1) { try { exports.binding = require('bcoin-native'); } catch (e) { diff --git a/lib/net/bip150.js b/lib/net/bip150.js index 36905e40f..810857bc8 100644 --- a/lib/net/bip150.js +++ b/lib/net/bip150.js @@ -11,7 +11,6 @@ const assert = require('assert'); const path = require('path'); const EventEmitter = require('events'); -const util = require('../utils/util'); const co = require('../utils/co'); const digest = require('../crypto/digest'); const random = require('../crypto/random'); @@ -87,7 +86,7 @@ function BIP150(bip151, host, outbound, db, key) { this._init(); } -util.inherits(BIP150, EventEmitter); +Object.setPrototypeOf(BIP150.prototype, EventEmitter.prototype); /** * Initialize BIP150. @@ -121,8 +120,7 @@ BIP150.prototype.isAuthed = function isAuthed() { */ BIP150.prototype.challenge = function challenge(hash) { - let type = this.outbound ? 'r' : 'i'; - let msg, sig; + const type = this.outbound ? 'r' : 'i'; assert(this.bip151.handshake, 'No BIP151 handshake before challenge.'); assert(!this.challengeReceived, 'Peer challenged twice.'); @@ -131,7 +129,7 @@ BIP150.prototype.challenge = function challenge(hash) { if (hash.equals(encoding.ZERO_HASH)) throw new Error('Auth failure.'); - msg = this.hash(this.input.sid, type, this.publicKey); + const msg = this.hash(this.input.sid, type, this.publicKey); if (!ccmp(hash, msg)) return encoding.ZERO_SIG64; @@ -141,7 +139,7 @@ BIP150.prototype.challenge = function challenge(hash) { this.emit('auth'); } - sig = secp256k1.sign(msg, this.privateKey); + const sig = secp256k1.sign(msg, this.privateKey); // authreply return secp256k1.fromDER(sig); @@ -156,8 +154,7 @@ BIP150.prototype.challenge = function challenge(hash) { */ BIP150.prototype.reply = function reply(data) { - let type = this.outbound ? 'i' : 'r'; - let sig, msg, result; + const type = this.outbound ? 'i' : 'r'; assert(this.challengeSent, 'Unsolicited reply.'); assert(!this.replyReceived, 'Peer replied twice.'); @@ -169,10 +166,10 @@ BIP150.prototype.reply = function reply(data) { if (!this.peerIdentity) return random.randomBytes(32); - sig = secp256k1.toDER(data); - msg = this.hash(this.output.sid, type, this.peerIdentity); + const sig = secp256k1.toDER(data); + const msg = this.hash(this.output.sid, type, this.peerIdentity); - result = secp256k1.verify(msg, sig, this.peerIdentity); + const result = secp256k1.verify(msg, sig, this.peerIdentity); if (!result) return random.randomBytes(32); @@ -180,7 +177,7 @@ BIP150.prototype.reply = function reply(data) { if (this.isAuthed()) { this.auth = true; this.emit('auth'); - return; + return null; } assert(this.outbound, 'No challenge received before reply on inbound.'); @@ -197,14 +194,12 @@ BIP150.prototype.reply = function reply(data) { */ BIP150.prototype.propose = function propose(hash) { - let match; - assert(!this.outbound, 'Outbound peer tried to propose.'); assert(!this.challengeSent, 'Unsolicited propose.'); assert(!this.proposeReceived, 'Peer proposed twice.'); this.proposeReceived = true; - match = this.findAuthorized(hash); + const match = this.findAuthorized(hash); if (!match) return encoding.ZERO_HASH; @@ -228,13 +223,11 @@ BIP150.prototype.propose = function propose(hash) { */ BIP150.prototype.toChallenge = function toChallenge() { - let msg; - assert(this.bip151.handshake, 'No BIP151 handshake before challenge.'); assert(this.outbound, 'Cannot challenge an inbound connection.'); assert(this.peerIdentity, 'Cannot challenge without a peer identity.'); - msg = this.hash(this.output.sid, 'i', this.peerIdentity); + const msg = this.hash(this.output.sid, 'i', this.peerIdentity); assert(!this.challengeSent, 'Cannot initiate challenge twice.'); this.challengeSent = true; @@ -254,7 +247,7 @@ BIP150.prototype.toChallenge = function toChallenge() { */ BIP150.prototype.rekey = function rekey(sid, key, req, res) { - let seed = Buffer.allocUnsafe(130); + const seed = Buffer.allocUnsafe(130); sid.copy(seed, 0); key.copy(seed, 32); req.copy(seed, 64); @@ -268,11 +261,11 @@ BIP150.prototype.rekey = function rekey(sid, key, req, res) { */ BIP150.prototype.rekeyInput = function rekeyInput() { - let stream = this.input; - let req = this.peerIdentity; - let res = this.publicKey; - let k1 = this.rekey(stream.sid, stream.k1, req, res); - let k2 = this.rekey(stream.sid, stream.k2, req, res); + const stream = this.input; + const req = this.peerIdentity; + const res = this.publicKey; + const k1 = this.rekey(stream.sid, stream.k1, req, res); + const k2 = this.rekey(stream.sid, stream.k2, req, res); stream.rekey(k1, k2); }; @@ -282,11 +275,11 @@ BIP150.prototype.rekeyInput = function rekeyInput() { */ BIP150.prototype.rekeyOutput = function rekeyOutput() { - let stream = this.output; - let req = this.publicKey; - let res = this.peerIdentity; - let k1 = this.rekey(stream.sid, stream.k1, req, res); - let k2 = this.rekey(stream.sid, stream.k2, req, res); + const stream = this.output; + const req = this.publicKey; + const res = this.peerIdentity; + const k1 = this.rekey(stream.sid, stream.k1, req, res); + const k2 = this.rekey(stream.sid, stream.k2, req, res); stream.rekey(k1, k2); }; @@ -299,7 +292,7 @@ BIP150.prototype.rekeyOutput = function rekeyOutput() { */ BIP150.prototype.hash = function hash(sid, ch, key) { - let data = Buffer.allocUnsafe(66); + const data = Buffer.allocUnsafe(66); sid.copy(data, 0); data[32] = ch.charCodeAt(0); key.copy(data, 33); @@ -318,8 +311,8 @@ BIP150.prototype.hash = function hash(sid, ch, key) { BIP150.prototype.findAuthorized = function findAuthorized(hash) { // Scary O(n) stuff. - for (let key of this.db.authorized) { - let msg = this.hash(this.output.sid, 'p', key); + for (const key of this.db.authorized) { + const msg = this.hash(this.output.sid, 'p', key); // XXX Do we really need a constant // time compare here? Do it just to @@ -327,6 +320,8 @@ BIP150.prototype.findAuthorized = function findAuthorized(hash) { if (ccmp(msg, hash)) return key; } + + return null; }; /** @@ -347,8 +342,8 @@ BIP150.prototype.destroy = function destroy() { * @returns {Job} */ -BIP150.prototype.cleanup = function cleanup(err) { - let job = this.job; +BIP150.prototype.cleanup = function cleanup() { + const job = this.job; assert(!this.completed, 'Already completed.'); assert(job, 'No completion job.'); @@ -376,7 +371,7 @@ BIP150.prototype.cleanup = function cleanup(err) { */ BIP150.prototype.resolve = function resolve(result) { - let job = this.cleanup(); + const job = this.cleanup(); job.resolve(result); }; @@ -387,7 +382,7 @@ BIP150.prototype.resolve = function resolve(result) { */ BIP150.prototype.reject = function reject(err) { - let job = this.cleanup(); + const job = this.cleanup(); job.reject(err); }; @@ -411,7 +406,7 @@ BIP150.prototype.wait = function wait(timeout) { * @param {Function} reject */ -BIP150.prototype._wait = function wait(timeout, resolve, reject) { +BIP150.prototype._wait = function _wait(timeout, resolve, reject) { assert(!this.auth, 'Cannot wait for init after handshake.'); this.job = co.job(resolve, reject); @@ -447,7 +442,7 @@ BIP150.prototype.getAddress = function getAddress() { */ BIP150.address = function address(key) { - let bw = new StaticWriter(27); + const bw = new StaticWriter(27); bw.writeU8(0x0f); bw.writeU16BE(0xff01); bw.writeBytes(digest.hash160(key)); @@ -470,7 +465,7 @@ function AuthDB(options) { this.prefix = null; this.dnsKnown = []; - this.known = {}; + this.known = new Map(); this.authorized = []; this._init(options); @@ -540,15 +535,13 @@ AuthDB.prototype.close = async function close() { */ AuthDB.prototype.addKnown = function addKnown(host, key) { - let addr; - assert(typeof host === 'string', 'Known host must be a string.'); assert(Buffer.isBuffer(key) && key.length === 33, 'Invalid public key for known peer.'); - addr = IP.fromHostname(host); + const addr = IP.fromHostname(host); if (addr.type === IP.types.DNS) { // Defer this for resolution. @@ -556,7 +549,7 @@ AuthDB.prototype.addKnown = function addKnown(host, key) { return; } - this.known[host] = key; + this.known.set(host, key); }; /** @@ -576,12 +569,10 @@ AuthDB.prototype.addAuthorized = function addAuthorized(key) { */ AuthDB.prototype.setKnown = function setKnown(map) { - let keys = Object.keys(map); + this.known.clear(); - this.known = {}; - - for (let host of keys) { - let key = map[host]; + for (const host of Object.keys(map)) { + const key = map[host]; this.addKnown(host, key); } }; @@ -594,7 +585,7 @@ AuthDB.prototype.setKnown = function setKnown(map) { AuthDB.prototype.setAuthorized = function setAuthorized(keys) { this.authorized.length = 0; - for (let key of keys) + for (const key of keys) this.addAuthorized(key); }; @@ -605,15 +596,14 @@ AuthDB.prototype.setAuthorized = function setAuthorized(keys) { */ AuthDB.prototype.getKnown = function getKnown(hostname) { - let known = this.known[hostname]; - let addr; + const known = this.known.get(hostname); if (known) return known; - addr = IP.fromHostname(hostname); + const addr = IP.fromHostname(hostname); - return this.known[addr.host]; + return this.known.get(addr.host); }; /** @@ -623,10 +613,10 @@ AuthDB.prototype.getKnown = function getKnown(hostname) { */ AuthDB.prototype.lookup = async function lookup() { - let jobs = []; + const jobs = []; - for (let addr of this.dnsKnown) - jobs.push(this.populate(addr[0], addr[1])); + for (const [addr, key] of this.dnsKnown) + jobs.push(this.populate(addr, key)); await Promise.all(jobs); }; @@ -641,12 +631,11 @@ AuthDB.prototype.lookup = async function lookup() { */ AuthDB.prototype.populate = async function populate(addr, key) { - let hosts; - assert(addr.type === IP.types.DNS, 'Resolved host passed.'); this.logger.info('Resolving authorized hosts from: %s.', addr.host); + let hosts; try { hosts = await this.resolve(addr.host); } catch (e) { @@ -658,7 +647,7 @@ AuthDB.prototype.populate = async function populate(addr, key) { if (addr.port !== 0) host = IP.toHostname(host, addr.port); - this.known[host] = key; + this.known.set(host, key); } }; @@ -669,16 +658,15 @@ AuthDB.prototype.populate = async function populate(addr, key) { */ AuthDB.prototype.readKnown = async function readKnown() { - let file, text; - if (fs.unsupported) return; if (!this.prefix) return; - file = path.join(this.prefix, 'known-peers'); + const file = path.join(this.prefix, 'known-peers'); + let text; try { text = await fs.readFile(file, 'utf8'); } catch (e) { @@ -697,47 +685,55 @@ AuthDB.prototype.readKnown = async function readKnown() { */ AuthDB.prototype.parseKnown = function parseKnown(text) { - let lines = text.split(/\n+/); + assert(typeof text === 'string'); + + if (text.charCodeAt(0) === 0xfeff) + text = text.substring(1); + + text = text.replace(/\r\n/g, '\n'); + text = text.replace(/\r/g, '\n'); - for (let line of lines) { - let parts, hostname, host, ip, key; + let num = 0; - line = line.trim(); + for (const chunk of text.split('\n')) { + const line = chunk.trim(); + + num += 1; if (line.length === 0) continue; - if (/^\s*#/.test(line)) + if (line[0] === '#') continue; - parts = line.split(/\s+/); + const parts = line.split(/\s+/); if (parts.length < 2) - continue; + throw new Error(`No key present on line ${num}: "${line}".`); - hostname = parts[0].trim().split(','); + const hosts = parts[0].split(','); - if (hostname.length >= 2) { - host = hostname[0]; - ip = hostname[1]; + let host, addr; + if (hosts.length >= 2) { + host = hosts[0]; + addr = hosts[1]; } else { host = null; - ip = hostname[0]; + addr = hosts[0]; } - key = parts[1].trim(); - key = Buffer.from(key, 'hex'); + const key = Buffer.from(parts[1], 'hex'); if (key.length !== 33) - throw new Error(`Invalid key: ${parts[1]}.`); + throw new Error(`Invalid key on line ${num}: "${parts[1]}".`); if (host && host.length > 0) this.addKnown(host, key); - if (ip.length === 0) + if (addr.length === 0) continue; - this.addKnown(ip, key); + this.addKnown(addr, key); } }; @@ -748,16 +744,15 @@ AuthDB.prototype.parseKnown = function parseKnown(text) { */ AuthDB.prototype.readAuth = async function readAuth() { - let file, text; - if (fs.unsupported) return; if (!this.prefix) return; - file = path.join(this.prefix, 'authorized-peers'); + const file = path.join(this.prefix, 'authorized-peers'); + let text; try { text = await fs.readFile(file, 'utf8'); } catch (e) { @@ -776,23 +771,31 @@ AuthDB.prototype.readAuth = async function readAuth() { */ AuthDB.prototype.parseAuth = function parseAuth(text) { - let lines = text.split(/\n+/); + assert(typeof text === 'string'); + + if (text.charCodeAt(0) === 0xfeff) + text = text.substring(1); + + text = text.replace(/\r\n/g, '\n'); + text = text.replace(/\r/g, '\n'); + + let num = 0; - for (let line of lines) { - let key; + for (const chunk of text.split('\n')) { + const line = chunk.trim(); - line = line.trim(); + num += 1; if (line.length === 0) continue; - if (/^\s*#/.test(line)) + if (line[0] === '#') continue; - key = Buffer.from(line, 'hex'); + const key = Buffer.from(line, 'hex'); if (key.length !== 33) - throw new Error(`Invalid key: ${line}.`); + throw new Error(`Invalid key on line ${num}: "${line}".`); this.addAuthorized(key); } diff --git a/lib/net/bip151.js b/lib/net/bip151.js index 43f249432..d01516b42 100644 --- a/lib/net/bip151.js +++ b/lib/net/bip151.js @@ -95,7 +95,7 @@ function BIP151Stream(cipher) { */ BIP151Stream.prototype.init = function init(publicKey) { - let bw = new StaticWriter(33); + const bw = new StaticWriter(33); this.publicKey = publicKey; this.secret = secp256k1.ecdh(this.publicKey, this.privateKey); @@ -126,7 +126,7 @@ BIP151Stream.prototype.init = function init(publicKey) { */ BIP151Stream.prototype.shouldRekey = function shouldRekey(packet) { - let now = util.now(); + const now = util.now(); this.processed += packet.length; @@ -149,7 +149,7 @@ BIP151Stream.prototype.rekey = function rekey(k1, k2) { assert(this.prk, 'Cannot rekey before initialization.'); if (!k1) { - let seed = Buffer.allocUnsafe(64); + const seed = Buffer.allocUnsafe(64); this.sid.copy(seed, 0); @@ -329,7 +329,7 @@ function BIP151(cipher) { this.bip150 = null; } -util.inherits(BIP151, EventEmitter); +Object.setPrototypeOf(BIP151.prototype, EventEmitter.prototype); /** * Cipher list. @@ -354,7 +354,7 @@ BIP151.MAX_MESSAGE = 12 * 1000 * 1000; */ BIP151.prototype.error = function error() { - let msg = util.fmt.apply(util, arguments); + const msg = util.fmt.apply(util, arguments); this.emit('error', new Error(msg)); }; @@ -466,7 +466,7 @@ BIP151.prototype.encack = function encack(publicKey) { */ BIP151.prototype.cleanup = function cleanup() { - let job = this.job; + const job = this.job; assert(!this.completed, 'Already completed.'); assert(job, 'No completion job.'); @@ -493,7 +493,7 @@ BIP151.prototype.cleanup = function cleanup() { */ BIP151.prototype.resolve = function resolve(result) { - let job = this.cleanup(); + const job = this.cleanup(); job.resolve(result); }; @@ -503,7 +503,7 @@ BIP151.prototype.resolve = function resolve(result) { */ BIP151.prototype.reject = function reject(err) { - let job = this.cleanup(); + const job = this.cleanup(); job.reject(err); }; @@ -527,7 +527,7 @@ BIP151.prototype.wait = function wait(timeout) { * @param {Function} reject */ -BIP151.prototype._wait = function wait(timeout, resolve, reject) { +BIP151.prototype._wait = function _wait(timeout, resolve, reject) { assert(!this.handshake, 'Cannot wait for init after handshake.'); this.job = co.job(resolve, reject); @@ -595,11 +595,10 @@ BIP151.prototype.packetSize = function packetSize(cmd, body) { * @returns {Buffer} Ciphertext payload */ -BIP151.prototype.packet = function _packet(cmd, body) { - let size = this.packetSize(cmd, body); - let bw = new StaticWriter(size); - let payloadSize = size - 20; - let packet, payload; +BIP151.prototype.packet = function packet(cmd, body) { + const size = this.packetSize(cmd, body); + const bw = new StaticWriter(size); + const payloadSize = size - 20; bw.writeU32(payloadSize); bw.writeVarString(cmd, 'ascii'); @@ -607,17 +606,17 @@ BIP151.prototype.packet = function _packet(cmd, body) { bw.writeBytes(body); bw.seek(16); - packet = bw.render(); - payload = packet.slice(4, 4 + payloadSize); + const msg = bw.render(); + const payload = msg.slice(4, 4 + payloadSize); - this.maybeRekey(packet); + this.maybeRekey(msg); - this.output.encryptSize(packet); + this.output.encryptSize(msg); this.output.encrypt(payload); - this.output.finish().copy(packet, 4 + payloadSize); + this.output.finish().copy(msg, 4 + payloadSize); this.output.sequence(); - return packet; + return msg; }; /** @@ -632,7 +631,7 @@ BIP151.prototype.feed = function feed(data) { this.pending.push(data); while (this.total >= this.waiting) { - let chunk = this.read(this.waiting); + const chunk = this.read(this.waiting); this.parse(chunk); } }; @@ -645,35 +644,32 @@ BIP151.prototype.feed = function feed(data) { */ BIP151.prototype.read = function read(size) { - let pending, chunk, off, len; - assert(this.total >= size, 'Reading too much.'); if (size === 0) return Buffer.alloc(0); - pending = this.pending[0]; + const pending = this.pending[0]; if (pending.length > size) { - chunk = pending.slice(0, size); + const chunk = pending.slice(0, size); this.pending[0] = pending.slice(size); this.total -= chunk.length; return chunk; } if (pending.length === size) { - chunk = this.pending.shift(); + const chunk = this.pending.shift(); this.total -= chunk.length; return chunk; } - chunk = Buffer.allocUnsafe(size); - off = 0; - len = 0; + const chunk = Buffer.allocUnsafe(size); + let off = 0; while (off < chunk.length) { - pending = this.pending[0]; - len = pending.copy(chunk, off); + const pending = this.pending[0]; + const len = pending.copy(chunk, off); if (len === pending.length) this.pending.shift(); else @@ -681,7 +677,7 @@ BIP151.prototype.read = function read(size) { off += len; } - assert.equal(off, chunk.length); + assert.strictEqual(off, chunk.length); this.total -= chunk.length; @@ -695,10 +691,8 @@ BIP151.prototype.read = function read(size) { */ BIP151.prototype.parse = function parse(data) { - let payload, tag, br; - if (!this.hasSize) { - let size = this.input.decryptSize(data); + const size = this.input.decryptSize(data); assert(this.waiting === 4); assert(data.length === 4); @@ -720,8 +714,8 @@ BIP151.prototype.parse = function parse(data) { return; } - payload = data.slice(0, this.waiting - 16); - tag = data.slice(this.waiting - 16, this.waiting); + const payload = data.slice(0, this.waiting - 16); + const tag = data.slice(this.waiting - 16, this.waiting); this.hasSize = false; this.waiting = 4; @@ -741,7 +735,7 @@ BIP151.prototype.parse = function parse(data) { this.input.decrypt(payload); this.input.sequence(); - br = new BufferReader(payload); + const br = new BufferReader(payload); while (br.left()) { let cmd, body; diff --git a/lib/net/bip152.js b/lib/net/bip152.js index 949ef7a56..1a33af0d9 100644 --- a/lib/net/bip152.js +++ b/lib/net/bip152.js @@ -13,7 +13,6 @@ const assert = require('assert'); const util = require('../utils/util'); const BufferReader = require('../utils/reader'); -const BufferWriter = require('../utils/writer'); const StaticWriter = require('../utils/staticwriter'); const encoding = require('../utils/encoding'); const consensus = require('../protocol/consensus'); @@ -60,7 +59,7 @@ function CompactBlock(options) { this.fromOptions(options); } -util.inherits(CompactBlock, AbstractBlock); +Object.setPrototypeOf(CompactBlock.prototype, AbstractBlock.prototype); /** * Inject properties from options object. @@ -91,9 +90,7 @@ CompactBlock.prototype.fromOptions = function fromOptions(options) { if (options.totalTX != null) this.totalTX = options.totalTX; - this.sipKey = options.sipKey; - - this.initKey(); + this.sipKey = this.getKey(); return this; }; @@ -124,41 +121,36 @@ CompactBlock.prototype.verifyBody = function verifyBody() { */ CompactBlock.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let count; + const br = new BufferReader(data); - this.version = br.readU32(); - this.prevBlock = br.readHash('hex'); - this.merkleRoot = br.readHash('hex'); - this.ts = br.readU32(); - this.bits = br.readU32(); - this.nonce = br.readU32(); + this.readHead(br); this.keyNonce = br.readBytes(8); + this.sipKey = this.getKey(); - this.initKey(); - - count = br.readVarint(); + const idCount = br.readVarint(); - this.totalTX += count; + this.totalTX += idCount; - for (let i = 0; i < count; i++) - this.ids.push(br.readU32() + br.readU16() * 0x100000000); + for (let i = 0; i < idCount; i++) { + const lo = br.readU32(); + const hi = br.readU16(); + this.ids.push(hi * 0x100000000 + lo); + } - count = br.readVarint(); + const txCount = br.readVarint(); - this.totalTX += count; + this.totalTX += txCount; - for (let i = 0; i < count; i++) { - let index = br.readVarint(); - let tx; + for (let i = 0; i < txCount; i++) { + const index = br.readVarint(); assert(index <= 0xffff); assert(index < this.totalTX); - tx = TX.fromReader(br); + const tx = TX.fromReader(br); - this.ptx.push(new PrefilledTX(index, tx)); + this.ptx.push([index, tx]); } return this; @@ -223,7 +215,7 @@ CompactBlock.prototype.toNormalWriter = function toNormalWriter(bw) { */ CompactBlock.prototype.frameRaw = function frameRaw(witness) { - let size = this.getSize(witness); + const size = this.getSize(witness); return this.writeRaw(new StaticWriter(size), witness).render(); }; @@ -242,12 +234,13 @@ CompactBlock.prototype.getSize = function getSize(witness) { size += this.ids.length * 6; size += encoding.sizeVarint(this.ptx.length); - for (let ptx of this.ptx) { - size += encoding.sizeVarint(ptx.index); + for (const [index, tx] of this.ptx) { + size += encoding.sizeVarint(index); + if (witness) - size += ptx.tx.getSize(); + size += tx.getSize(); else - size += ptx.tx.getBaseSize(); + size += tx.getBaseSize(); } return size; @@ -261,28 +254,29 @@ CompactBlock.prototype.getSize = function getSize(witness) { */ CompactBlock.prototype.writeRaw = function writeRaw(bw, witness) { - this.writeAbbr(bw); + this.writeHead(bw); bw.writeBytes(this.keyNonce); bw.writeVarint(this.ids.length); - for (let id of this.ids) { - let lo = id % 0x100000000; - let hi = (id - lo) / 0x100000000; - hi &= 0xffff; + for (const id of this.ids) { + const lo = id % 0x100000000; + const hi = (id - lo) / 0x100000000; + assert(hi <= 0xffff); bw.writeU32(lo); bw.writeU16(hi); } bw.writeVarint(this.ptx.length); - for (let ptx of this.ptx) { - bw.writeVarint(ptx.index); + for (const [index, tx] of this.ptx) { + bw.writeVarint(index); + if (witness) - ptx.tx.toWriter(bw); + tx.toWriter(bw); else - ptx.tx.toNormalWriter(bw); + tx.toNormalWriter(bw); } return bw; @@ -306,26 +300,24 @@ CompactBlock.prototype.toRequest = function toRequest() { */ CompactBlock.prototype.fillMempool = function fillMempool(witness, mempool) { - let have = {}; - if (this.count === this.totalTX) return true; - for (let entry of mempool.map.values()) { - let tx = entry.tx; + const set = new Set(); + + for (const {tx} of mempool.map.values()) { let hash = tx.hash(); - let id, index; if (witness) hash = tx.witnessHash(); - id = this.sid(hash); - index = this.idMap.get(id); + const id = this.sid(hash); + const index = this.idMap.get(id); if (index == null) continue; - if (have[index]) { + if (set.has(index)) { // Siphash collision, just request it. this.available[index] = null; this.count--; @@ -333,7 +325,7 @@ CompactBlock.prototype.fillMempool = function fillMempool(witness, mempool) { } this.available[index] = tx; - have[index] = true; + set.add(index); this.count++; // We actually may have a siphash collision @@ -374,12 +366,10 @@ CompactBlock.prototype.fillMissing = function fillMissing(res) { */ CompactBlock.prototype.sid = function sid(hash) { - let hi, lo; - if (typeof hash === 'string') hash = Buffer.from(hash, 'hex'); - [hi, lo] = siphash256(hash, this.sipKey); + const [hi, lo] = siphash256(hash, this.sipKey); return (hi & 0xffff) * 0x100000000 + (lo >>> 0); }; @@ -397,12 +387,13 @@ CompactBlock.prototype.hasIndex = function hasIndex(index) { /** * Initialize the siphash key. * @private + * @returns {Buffer} */ -CompactBlock.prototype.initKey = function initKey() { - let data = Buffer.concat([this.abbr(), this.keyNonce]); - let hash = digest.sha256(data); - this.sipKey = hash.slice(0, 16); +CompactBlock.prototype.getKey = function getKey() { + const data = Buffer.concat([this.toHead(), this.keyNonce]); + const hash = digest.sha256(data); + return hash.slice(0, 16); }; /** @@ -411,47 +402,46 @@ CompactBlock.prototype.initKey = function initKey() { */ CompactBlock.prototype.init = function init() { - let last = -1; - let offset = 0; - if (this.totalTX === 0) throw new Error('Empty vectors.'); if (this.totalTX > consensus.MAX_BLOCK_SIZE / 10) throw new Error('Compact block too big.'); + // Custom limit to avoid a hashdos. + // Min valid tx size: (4 + 1 + 41 + 1 + 9 + 4) = 60 + // Min block header size: 81 + // Max number of transactions: (1000000 - 81) / 60 = 16665 + if (this.totalTX > (consensus.MAX_BLOCK_SIZE - 81) / 60) + throw new Error('Compact block too big.'); + // No sparse arrays here, v8. for (let i = 0; i < this.totalTX; i++) this.available.push(null); + let last = -1; + let offset = 0; + for (let i = 0; i < this.ptx.length; i++) { - let ptx = this.ptx[i]; - assert(ptx); - last += ptx.index + 1; + const [index, tx] = this.ptx[i]; + last += index + 1; assert(last <= 0xffff); assert(last <= this.ids.length + i); - this.available[last] = ptx.tx; + this.available[last] = tx; this.count++; } for (let i = 0; i < this.ids.length; i++) { - let id; + const id = this.ids[i]; while (this.available[i + offset]) offset++; - id = this.ids[i]; - - // Fails on siphash collision + // Fails on siphash collision. if (this.idMap.has(id)) return false; this.idMap.set(id, i + offset); - - // We're supposed to fail here if there's - // more than 12 hash collisions, but we - // don't have lowlevel access to our hash - // table. Hopefully we don't get hashdos'd. } return true; @@ -464,18 +454,18 @@ CompactBlock.prototype.init = function init() { */ CompactBlock.prototype.toBlock = function toBlock() { - let block = new Block(); + const block = new Block(); block.version = this.version; block.prevBlock = this.prevBlock; block.merkleRoot = this.merkleRoot; - block.ts = this.ts; + block.time = this.time; block.bits = this.bits; block.nonce = this.nonce; block._hash = this._hash; block._hhash = this._hhash; - for (let tx of this.available) { + for (const tx of this.available) { assert(tx, 'Compact block is not full.'); block.txs.push(tx); } @@ -496,7 +486,7 @@ CompactBlock.prototype.fromBlock = function fromBlock(block, witness, nonce) { this.version = block.version; this.prevBlock = block.prevBlock; this.merkleRoot = block.merkleRoot; - this.ts = block.ts; + this.time = block.time; this.bits = block.bits; this.nonce = block.nonce; this.totalTX = block.txs.length; @@ -507,23 +497,21 @@ CompactBlock.prototype.fromBlock = function fromBlock(block, witness, nonce) { nonce = util.nonce(); this.keyNonce = nonce; - - this.initKey(); + this.sipKey = this.getKey(); for (let i = 1; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; let hash = tx.hash(); - let id; if (witness) hash = tx.witnessHash(); - id = this.sid(hash); + const id = this.sid(hash); this.ids.push(id); } - this.ptx.push(new PrefilledTX(0, block.txs[0])); + this.ptx.push([0, block.txs[0]]); return this; }; @@ -562,7 +550,7 @@ function TXRequest(options) { if (!(this instanceof TXRequest)) return new TXRequest(options); - this.hash = null; + this.hash = encoding.NULL_HASH; this.indexes = []; if (options) @@ -631,19 +619,18 @@ TXRequest.fromCompact = function fromCompact(block) { */ TXRequest.prototype.fromReader = function fromReader(br) { - let offset = 0; - let count; - this.hash = br.readHash('hex'); - count = br.readVarint(); + const count = br.readVarint(); for (let i = 0; i < count; i++) { - let index = br.readVarint(); + const index = br.readVarint(); assert(index <= 0xffff); this.indexes.push(index); } + let offset = 0; + for (let i = 0; i < count; i++) { let index = this.indexes[i]; index += offset; @@ -698,7 +685,11 @@ TXRequest.prototype.getSize = function getSize() { size += encoding.sizeVarint(this.indexes.length); for (let i = 0; i < this.indexes.length; i++) { - let index = this.indexes[i] - (i === 0 ? 0 : this.indexes[i - 1] + 1); + let index = this.indexes[i]; + + if (i > 0) + index -= this.indexes[i - 1] + 1; + size += encoding.sizeVarint(index); } @@ -716,7 +707,11 @@ TXRequest.prototype.toWriter = function toWriter(bw) { bw.writeVarint(this.indexes.length); for (let i = 0; i < this.indexes.length; i++) { - let index = this.indexes[i] - (i === 0 ? 0 : this.indexes[i - 1] + 1); + let index = this.indexes[i]; + + if (i > 0) + index -= this.indexes[i - 1] + 1; + bw.writeVarint(index); } @@ -729,7 +724,8 @@ TXRequest.prototype.toWriter = function toWriter(bw) { */ TXRequest.prototype.toRaw = function toRaw() { - return this.toWriter(new BufferWriter()).render(); + const size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); }; /** @@ -745,7 +741,7 @@ function TXResponse(options) { if (!(this instanceof TXResponse)) return new TXResponse(options); - this.hash = null; + this.hash = encoding.NULL_HASH; this.txs = []; if (options) @@ -786,11 +782,9 @@ TXResponse.fromOptions = function fromOptions(options) { */ TXResponse.prototype.fromReader = function fromReader(br) { - let count; - this.hash = br.readHash('hex'); - count = br.readVarint(); + const count = br.readVarint(); for (let i = 0; i < count; i++) this.txs.push(TX.fromReader(br)); @@ -839,7 +833,7 @@ TXResponse.fromRaw = function fromRaw(data) { TXResponse.prototype.fromBlock = function fromBlock(block, req) { this.hash = req.hash; - for (let index of req.indexes) { + for (const index of req.indexes) { if (index >= block.txs.length) break; @@ -908,7 +902,7 @@ TXResponse.prototype.getSize = function getSize(witness) { size += 32; size += encoding.sizeVarint(this.txs.length); - for (let tx of this.txs) { + for (const tx of this.txs) { if (witness) size += tx.getSize(); else @@ -930,7 +924,7 @@ TXResponse.prototype.writeRaw = function writeRaw(bw, witness) { bw.writeVarint(this.txs.length); - for (let tx of this.txs) { + for (const tx of this.txs) { if (witness) tx.toWriter(bw); else @@ -948,24 +942,10 @@ TXResponse.prototype.writeRaw = function writeRaw(bw, witness) { */ TXResponse.prototype.frameRaw = function frameRaw(witness) { - let size = this.getSize(witness); + const size = this.getSize(witness); return this.writeRaw(new StaticWriter(size), witness).render(); }; -/** - * Represents a prefilled TX. - * @constructor - * @param {Number} index - * @param {TX} tx - * @property {Number} index - * @property {TX} tx - */ - -function PrefilledTX(index, tx) { - this.index = index; - this.tx = tx; -} - /* * Expose */ diff --git a/lib/net/dns.js b/lib/net/dns.js index b6a8f64a8..e2310d42e 100644 --- a/lib/net/dns.js +++ b/lib/net/dns.js @@ -20,7 +20,7 @@ const options = { }; /** - * Resolve host (no getaddrinfo). + * Resolve host (async w/ libcares). * @param {String} host * @param {String?} proxy - Tor socks proxy. * @returns {Promise} @@ -59,8 +59,6 @@ exports.lookup = function lookup(host, proxy) { return socks.resolve(proxy, host); return new Promise((resolve, reject) => { - let addrs = []; - dns.lookup(host, options, to((err, result) => { if (err) { reject(err); @@ -72,7 +70,9 @@ exports.lookup = function lookup(host, proxy) { return; } - for (let addr of result) + const addrs = []; + + for (const addr of result) addrs.push(addr.address); resolve(addrs); @@ -85,7 +85,7 @@ exports.lookup = function lookup(host, proxy) { */ function to(callback) { - let timeout = setTimeout(() => { + const timeout = setTimeout(() => { callback(new Error('DNS request timed out.')); callback = null; }, 5000); diff --git a/lib/net/external.js b/lib/net/external.js index 82b59276a..b455e5cb1 100644 --- a/lib/net/external.js +++ b/lib/net/external.js @@ -22,32 +22,24 @@ const external = exports; */ external.getIPv4 = async function getIPv4() { - let res, ip; - try { - res = await request({ + const res = await request({ method: 'GET', uri: 'http://ipv4.icanhazip.com', expect: 'txt', timeout: 2000 }); - } catch (e) { - return await external.getIPv42(); - } - try { - ip = res.body.trim(); - ip = IP.toBuffer(ip); + const str = res.body.trim(); + const raw = IP.toBuffer(str); - if (!IP.isIPv4(ip)) + if (!IP.isIPv4(raw)) throw new Error('Could not find IPv4.'); - ip = IP.toString(ip); + return IP.toString(raw); } catch (e) { return await external.getIPv42(); } - - return ip; }; /** @@ -58,22 +50,20 @@ external.getIPv4 = async function getIPv4() { */ external.getIPv42 = async function getIPv42() { - let res, match, ip, raw; - - res = await request({ + const res = await request({ method: 'GET', uri: 'http://checkip.dyndns.org', expect: 'html', timeout: 2000 }); - match = /IP Address:\s*([0-9a-f.:]+)/i.exec(res.body); + const match = /IP Address:\s*([0-9a-f.:]+)/i.exec(res.body); if (!match) throw new Error('Could not find IPv4.'); - ip = match[1]; - raw = IP.toBuffer(ip); + const str = match[1]; + const raw = IP.toBuffer(str); if (!IP.isIPv4(raw)) throw new Error('Could not find IPv4.'); @@ -88,20 +78,18 @@ external.getIPv42 = async function getIPv42() { */ external.getIPv6 = async function getIPv6() { - let res, ip; - - res = await request({ + const res = await request({ method: 'GET', uri: 'http://ipv6.icanhazip.com', expect: 'txt', timeout: 2000 }); - ip = res.body.trim(); - ip = IP.toBuffer(ip); + const str = res.body.trim(); + const raw = IP.toBuffer(str); - if (!IP.isIPv6(ip)) + if (!IP.isIPv6(raw)) throw new Error('Could not find IPv6.'); - return IP.toString(ip); + return IP.toString(raw); }; diff --git a/lib/net/framer.js b/lib/net/framer.js index d17743322..7a568f72d 100644 --- a/lib/net/framer.js +++ b/lib/net/framer.js @@ -29,40 +29,38 @@ function Framer(network) { * Frame a payload with a header. * @param {String} cmd - Packet type. * @param {Buffer} payload + * @param {Buffer?} checksum - Precomputed checksum. * @returns {Buffer} Payload with header prepended. */ -Framer.prototype.packet = function _packet(cmd, payload, checksum) { - let packet; - +Framer.prototype.packet = function packet(cmd, payload, checksum) { assert(payload, 'No payload.'); - assert(cmd.length < 12); assert(payload.length <= 0xffffffff); - packet = Buffer.allocUnsafe(24 + payload.length); + const msg = Buffer.allocUnsafe(24 + payload.length); // Magic value - packet.writeUInt32LE(this.network.magic, 0, true); + msg.writeUInt32LE(this.network.magic, 0, true); // Command - packet.write(cmd, 4, 'ascii'); + msg.write(cmd, 4, 'ascii'); for (let i = 4 + cmd.length; i < 16; i++) - packet[i] = 0; + msg[i] = 0; // Payload length - packet.writeUInt32LE(payload.length, 16, true); + msg.writeUInt32LE(payload.length, 16, true); if (!checksum) checksum = digest.hash256(payload); // Checksum - checksum.copy(packet, 20, 0, 4); + checksum.copy(msg, 20, 0, 4); - payload.copy(packet, 24); + payload.copy(msg, 24); - return packet; + return msg; }; /* diff --git a/lib/net/hostlist.js b/lib/net/hostlist.js index 075c23a52..3f0b8d502 100644 --- a/lib/net/hostlist.js +++ b/lib/net/hostlist.js @@ -133,11 +133,11 @@ HostList.scores = { * @private */ -HostList.prototype._init = function init() { - let options = this.options; - let scores = HostList.scores; - let hosts = IP.getPublic(); - let port = this.address.port; +HostList.prototype._init = function _init() { + const options = this.options; + const scores = HostList.scores; + const hosts = IP.getPublic(); + const port = this.address.port; for (let i = 0; i < this.options.maxBuckets; i++) this.fresh.push(new Map()); @@ -151,7 +151,7 @@ HostList.prototype._init = function init() { this.pushLocal(this.address, scores.MANUAL); this.addLocal(options.host, options.port, scores.BIND); - for (let host of hosts) + for (const host of hosts) this.addLocal(host, port, scores.IF); }; @@ -227,10 +227,10 @@ HostList.prototype.stop = function stop() { */ HostList.prototype.injectSeeds = function injectSeeds() { - let nodes = seeds.get(this.network.type); + const nodes = seeds.get(this.network.type); - for (let node of nodes) { - let addr = NetAddress.fromHostname(node, this.network); + for (const node of nodes) { + const addr = NetAddress.fromHostname(node, this.network); if (!addr.isRoutable()) continue; @@ -252,8 +252,7 @@ HostList.prototype.injectSeeds = function injectSeeds() { */ HostList.prototype.loadFile = async function loadFile() { - let filename = this.options.filename; - let data, json; + const filename = this.options.filename; if (fs.unsupported) return; @@ -264,6 +263,7 @@ HostList.prototype.loadFile = async function loadFile() { if (!filename) return; + let data; try { data = await fs.readFile(filename, 'utf8'); } catch (e) { @@ -272,7 +272,7 @@ HostList.prototype.loadFile = async function loadFile() { throw e; } - json = JSON.parse(data); + const json = JSON.parse(data); this.fromJSON(json); }; @@ -284,8 +284,7 @@ HostList.prototype.loadFile = async function loadFile() { */ HostList.prototype.flush = async function flush() { - let filename = this.options.filename; - let json, data; + const filename = this.options.filename; if (fs.unsupported) return; @@ -303,8 +302,8 @@ HostList.prototype.flush = async function flush() { this.logger.debug('Writing hosts to %s.', filename); - json = this.toJSON(); - data = JSON.stringify(json); + const json = this.toJSON(); + const data = JSON.stringify(json); try { await fs.writeFile(filename, data, 'utf8'); @@ -329,7 +328,7 @@ HostList.prototype.size = function size() { */ HostList.prototype.isFull = function isFull() { - let max = this.options.maxBuckets * this.options.maxEntries; + const max = this.options.maxBuckets * this.options.maxEntries; return this.size() >= max; }; @@ -340,10 +339,10 @@ HostList.prototype.isFull = function isFull() { HostList.prototype.reset = function reset() { this.map.clear(); - for (let bucket of this.fresh) + for (const bucket of this.fresh) bucket.clear(); - for (let bucket of this.used) + for (const bucket of this.used) bucket.reset(); this.totalFresh = 0; @@ -385,7 +384,7 @@ HostList.prototype.clearBanned = function clearBanned() { */ HostList.prototype.isBanned = function isBanned(host) { - let time = this.banned.get(host); + const time = this.banned.get(host); if (time == null) return false; @@ -404,9 +403,7 @@ HostList.prototype.isBanned = function isBanned(host) { */ HostList.prototype.getHost = function getHost() { - let now = this.network.now(); let buckets = null; - let factor = 1; if (this.totalFresh > 0) buckets = this.fresh; @@ -417,18 +414,21 @@ HostList.prototype.getHost = function getHost() { } if (!buckets) - return; + return null; + + const now = this.network.now(); + let factor = 1; for (;;) { let index = util.random(0, buckets.length); - let bucket = buckets[index]; - let entry, num; + const bucket = buckets[index]; if (bucket.size === 0) continue; index = util.random(0, bucket.size); + let entry; if (buckets === this.used) { entry = bucket.head; while (index--) @@ -441,7 +441,7 @@ HostList.prototype.getHost = function getHost() { } } - num = util.random(0, 1 << 30); + const num = util.random(0, 1 << 30); if (num < factor * entry.chance(now) * (1 << 30)) return entry; @@ -458,11 +458,11 @@ HostList.prototype.getHost = function getHost() { */ HostList.prototype.freshBucket = function freshBucket(entry) { - let addr = entry.addr; - let src = entry.src; - let data = concat32(addr.raw, src.raw); - let hash = murmur3(data, 0xfba4c795); - let index = hash % this.fresh.length; + const addr = entry.addr; + const src = entry.src; + const data = concat32(addr.raw, src.raw); + const hash = murmur3(data, 0xfba4c795); + const index = hash % this.fresh.length; return this.fresh[index]; }; @@ -474,9 +474,9 @@ HostList.prototype.freshBucket = function freshBucket(entry) { */ HostList.prototype.usedBucket = function usedBucket(entry) { - let addr = entry.addr; - let hash = murmur3(addr.raw, 0xfba4c795); - let index = hash % this.used.length; + const addr = entry.addr; + const hash = murmur3(addr.raw, 0xfba4c795); + const index = hash % this.used.length; return this.used[index]; }; @@ -488,17 +488,15 @@ HostList.prototype.usedBucket = function usedBucket(entry) { */ HostList.prototype.add = function add(addr, src) { - let now = this.network.now(); - let penalty = 2 * 60 * 60; - let interval = 24 * 60 * 60; - let factor = 1; - let entry, bucket; - assert(addr.port !== 0); - entry = this.map.get(addr.hostname); + let entry = this.map.get(addr.hostname); if (entry) { + const now = this.network.now(); + let penalty = 2 * 60 * 60; + let interval = 24 * 60 * 60; + // No source means we're inserting // this ourselves. No penalty. if (!src) @@ -509,18 +507,18 @@ HostList.prototype.add = function add(addr, src) { entry.addr.services >>>= 0; // Online? - if (now - addr.ts < 24 * 60 * 60) + if (now - addr.time < 24 * 60 * 60) interval = 60 * 60; // Periodically update time. - if (entry.addr.ts < addr.ts - interval - penalty) { - entry.addr.ts = addr.ts; + if (entry.addr.time < addr.time - interval - penalty) { + entry.addr.time = addr.time; this.needsFlush = true; } // Do not update if no new // information is present. - if (entry.addr.ts && addr.ts <= entry.addr.ts) + if (entry.addr.time && addr.time <= entry.addr.time) return false; // Do not update if the entry was @@ -539,6 +537,7 @@ HostList.prototype.add = function add(addr, src) { // Stochastic test: previous refCount // N: 2^N times harder to increase it. + let factor = 1; for (let i = 0; i < entry.refCount; i++) factor *= 2; @@ -556,7 +555,7 @@ HostList.prototype.add = function add(addr, src) { this.totalFresh++; } - bucket = this.freshBucket(entry); + const bucket = this.freshBucket(entry); if (bucket.has(entry.key())) return false; @@ -579,9 +578,9 @@ HostList.prototype.add = function add(addr, src) { */ HostList.prototype.evictFresh = function evictFresh(bucket) { - let old; + let old = null; - for (let entry of bucket.values()) { + for (const entry of bucket.values()) { if (this.isStale(entry)) { bucket.delete(entry.key()); @@ -598,7 +597,7 @@ HostList.prototype.evictFresh = function evictFresh(bucket) { continue; } - if (entry.addr.ts < old.addr.ts) + if (entry.addr.time < old.addr.time) old = entry; } @@ -620,18 +619,18 @@ HostList.prototype.evictFresh = function evictFresh(bucket) { */ HostList.prototype.isStale = function isStale(entry) { - let now = this.network.now(); + const now = this.network.now(); if (entry.lastAttempt && entry.lastAttempt >= now - 60) return false; - if (entry.addr.ts > now + 10 * 60) + if (entry.addr.time > now + 10 * 60) return true; - if (entry.addr.ts === 0) + if (entry.addr.time === 0) return true; - if (now - entry.addr.ts > HostList.HORIZON_DAYS * 24 * 60 * 60) + if (now - entry.addr.time > HostList.HORIZON_DAYS * 24 * 60 * 60) return true; if (entry.lastSuccess === 0 && entry.attempts >= HostList.RETRIES) @@ -652,10 +651,10 @@ HostList.prototype.isStale = function isStale(entry) { */ HostList.prototype.remove = function remove(hostname) { - let entry = this.map.get(hostname); + const entry = this.map.get(hostname); if (!entry) - return; + return null; if (entry.used) { let head = entry; @@ -665,7 +664,7 @@ HostList.prototype.remove = function remove(hostname) { while (head.prev) head = head.prev; - for (let bucket of this.used) { + for (const bucket of this.used) { if (bucket.head === head) { bucket.remove(entry); this.totalUsed--; @@ -676,7 +675,7 @@ HostList.prototype.remove = function remove(hostname) { assert(!head); } else { - for (let bucket of this.fresh) { + for (const bucket of this.fresh) { if (bucket.delete(entry.key())) entry.refCount--; } @@ -696,8 +695,8 @@ HostList.prototype.remove = function remove(hostname) { */ HostList.prototype.markAttempt = function markAttempt(hostname) { - let entry = this.map.get(hostname); - let now = this.network.now(); + const entry = this.map.get(hostname); + const now = this.network.now(); if (!entry) return; @@ -712,14 +711,14 @@ HostList.prototype.markAttempt = function markAttempt(hostname) { */ HostList.prototype.markSuccess = function markSuccess(hostname) { - let entry = this.map.get(hostname); - let now = this.network.now(); + const entry = this.map.get(hostname); + const now = this.network.now(); if (!entry) return; - if (now - entry.addr.ts > 20 * 60) - entry.addr.ts = now; + if (now - entry.addr.time > 20 * 60) + entry.addr.time = now; }; /** @@ -729,13 +728,13 @@ HostList.prototype.markSuccess = function markSuccess(hostname) { */ HostList.prototype.markAck = function markAck(hostname, services) { - let entry = this.map.get(hostname); - let now = this.network.now(); - let bucket, evicted, old, fresh; + const entry = this.map.get(hostname); if (!entry) return; + const now = this.network.now(); + entry.addr.services |= services; entry.addr.services >>>= 0; @@ -749,7 +748,8 @@ HostList.prototype.markAck = function markAck(hostname, services) { assert(entry.refCount > 0); // Remove from fresh. - for (let bucket of this.fresh) { + let old; + for (const bucket of this.fresh) { if (bucket.delete(entry.key())) { entry.refCount--; old = bucket; @@ -761,7 +761,7 @@ HostList.prototype.markAck = function markAck(hostname, services) { this.totalFresh--; // Find room in used bucket. - bucket = this.usedBucket(entry); + const bucket = this.usedBucket(entry); if (bucket.size < this.options.maxEntries) { entry.used = true; @@ -771,8 +771,8 @@ HostList.prototype.markAck = function markAck(hostname, services) { } // No room. Evict. - evicted = this.evictUsed(bucket); - fresh = this.freshBucket(evicted); + const evicted = this.evictUsed(bucket); + let fresh = this.freshBucket(evicted); // Move to entry's old bucket if no room. if (fresh.size >= this.options.maxEntries) @@ -799,7 +799,7 @@ HostList.prototype.evictUsed = function evictUsed(bucket) { let old = bucket.head; for (let entry = bucket.head; entry; entry = entry.next) { - if (entry.addr.ts < old.addr.ts) + if (entry.addr.time < old.addr.time) old = entry; } @@ -812,12 +812,12 @@ HostList.prototype.evictUsed = function evictUsed(bucket) { */ HostList.prototype.toArray = function toArray() { - let out = []; + const out = []; - for (let entry of this.map.values()) + for (const entry of this.map.values()) out.push(entry.addr); - assert.equal(out.length, this.size()); + assert.strictEqual(out.length, this.size()); return out; }; @@ -828,15 +828,15 @@ HostList.prototype.toArray = function toArray() { */ HostList.prototype.addSeed = function addSeed(host) { - let addr = IP.fromHostname(host, this.network.port); + const ip = IP.fromHostname(host, this.network.port); - if (addr.type === IP.types.DNS) { + if (ip.type === IP.types.DNS) { // Defer for resolution. - this.dnsSeeds.push(addr); - return; + this.dnsSeeds.push(ip); + return null; } - addr = NetAddress.fromHost(addr.host, addr.port, this.network); + const addr = NetAddress.fromHost(ip.host, ip.port, this.network); this.add(addr); @@ -850,15 +850,15 @@ HostList.prototype.addSeed = function addSeed(host) { */ HostList.prototype.addNode = function addNode(host) { - let addr = IP.fromHostname(host, this.network.port); + const ip = IP.fromHostname(host, this.network.port); - if (addr.type === IP.types.DNS) { + if (ip.type === IP.types.DNS) { // Defer for resolution. - this.dnsNodes.push(addr); - return; + this.dnsNodes.push(ip); + return null; } - addr = NetAddress.fromHost(addr.host, addr.port, this.network); + const addr = NetAddress.fromHost(ip.host, ip.port, this.network); this.nodes.push(addr); this.add(addr); @@ -873,10 +873,10 @@ HostList.prototype.addNode = function addNode(host) { */ HostList.prototype.removeNode = function removeNode(host) { - let addr = IP.fromHostname(host, this.network.port); + const addr = IP.fromHostname(host, this.network.port); for (let i = 0; i < this.nodes.length; i++) { - let node = this.nodes[i]; + const node = this.nodes[i]; if (node.host !== addr.host) continue; @@ -900,7 +900,7 @@ HostList.prototype.removeNode = function removeNode(host) { HostList.prototype.setSeeds = function setSeeds(seeds) { this.dnsSeeds.length = 0; - for (let host of seeds) + for (const host of seeds) this.addSeed(host); }; @@ -913,7 +913,7 @@ HostList.prototype.setNodes = function setNodes(nodes) { this.dnsNodes.length = 0; this.nodes.length = 0; - for (let host of nodes) + for (const host of nodes) this.addNode(host); }; @@ -926,7 +926,7 @@ HostList.prototype.setNodes = function setNodes(nodes) { */ HostList.prototype.addLocal = function addLocal(host, port, score) { - let addr = NetAddress.fromHost(host, port, this.network); + const addr = NetAddress.fromHost(host, port, this.network); addr.services = this.options.services; return this.pushLocal(addr, score); }; @@ -939,15 +939,13 @@ HostList.prototype.addLocal = function addLocal(host, port, score) { */ HostList.prototype.pushLocal = function pushLocal(addr, score) { - let local; - if (!addr.isRoutable()) return false; if (this.local.has(addr.hostname)) return false; - local = new LocalAddress(addr, score); + const local = new LocalAddress(addr, score); this.local.set(addr.hostname, local); @@ -971,8 +969,8 @@ HostList.prototype.getLocal = function getLocal(src) { if (this.local.size === 0) return null; - for (let dest of this.local.values()) { - let reach = src.getReachability(dest.addr); + for (const dest of this.local.values()) { + const reach = src.getReachability(dest.addr); if (reach < bestReach) continue; @@ -984,7 +982,7 @@ HostList.prototype.getLocal = function getLocal(src) { } } - bestDest.ts = this.network.now(); + bestDest.time = this.network.now(); return bestDest; }; @@ -996,7 +994,7 @@ HostList.prototype.getLocal = function getLocal(src) { */ HostList.prototype.markLocal = function markLocal(addr) { - let local = this.local.get(addr.hostname); + const local = this.local.get(addr.hostname); if (!local) return false; @@ -1013,9 +1011,9 @@ HostList.prototype.markLocal = function markLocal(addr) { */ HostList.prototype.discoverSeeds = async function discoverSeeds() { - let jobs = []; + const jobs = []; - for (let seed of this.dnsSeeds) + for (const seed of this.dnsSeeds) jobs.push(this.populateSeed(seed)); await Promise.all(jobs); @@ -1028,9 +1026,9 @@ HostList.prototype.discoverSeeds = async function discoverSeeds() { */ HostList.prototype.discoverNodes = async function discoverNodes() { - let jobs = []; + const jobs = []; - for (let node of this.dnsNodes) + for (const node of this.dnsNodes) jobs.push(this.populateNode(node)); await Promise.all(jobs); @@ -1044,7 +1042,7 @@ HostList.prototype.discoverNodes = async function discoverNodes() { */ HostList.prototype.populateNode = async function populateNode(addr) { - let addrs = await this.populate(addr); + const addrs = await this.populate(addr); if (addrs.length === 0) return; @@ -1061,9 +1059,9 @@ HostList.prototype.populateNode = async function populateNode(addr) { */ HostList.prototype.populateSeed = async function populateSeed(seed) { - let addrs = await this.populate(seed); + const addrs = await this.populate(seed); - for (let addr of addrs) + for (const addr of addrs) this.add(addr); }; @@ -1075,13 +1073,13 @@ HostList.prototype.populateSeed = async function populateSeed(seed) { */ HostList.prototype.populate = async function populate(target) { - let addrs = []; - let hosts; + const addrs = []; assert(target.type === IP.types.DNS, 'Resolved host passed.'); this.logger.info('Resolving host: %s.', target.host); + let hosts; try { hosts = await this.resolve(target.host); } catch (e) { @@ -1089,8 +1087,8 @@ HostList.prototype.populate = async function populate(target) { return addrs; } - for (let host of hosts) { - let addr = NetAddress.fromHost(host, target.port, this.network); + for (const host of hosts) { + const addr = NetAddress.fromHost(host, target.port, this.network); addrs.push(addr); } @@ -1103,22 +1101,22 @@ HostList.prototype.populate = async function populate(target) { */ HostList.prototype.toJSON = function toJSON() { - let addrs = []; - let fresh = []; - let used = []; + const addrs = []; + const fresh = []; + const used = []; - for (let entry of this.map.values()) + for (const entry of this.map.values()) addrs.push(entry.toJSON()); - for (let bucket of this.fresh) { - let keys = []; - for (let key of bucket.keys()) + for (const bucket of this.fresh) { + const keys = []; + for (const key of bucket.keys()) keys.push(key); fresh.push(keys); } - for (let bucket of this.used) { - let keys = []; + for (const bucket of this.used) { + const keys = []; for (let entry = bucket.head; entry; entry = entry.next) keys.push(entry.key()); used.push(keys); @@ -1140,12 +1138,12 @@ HostList.prototype.toJSON = function toJSON() { */ HostList.prototype.fromJSON = function fromJSON(json) { - let sources = {}; - let map = new Map(); + const sources = new Map(); + const map = new Map(); let totalFresh = 0; let totalUsed = 0; - let fresh = []; - let used = []; + const fresh = []; + const used = []; assert(json && typeof json === 'object'); @@ -1154,14 +1152,14 @@ HostList.prototype.fromJSON = function fromJSON(json) { assert(Array.isArray(json.addrs)); - for (let addr of json.addrs) { - let entry = HostEntry.fromJSON(addr, this.network); - let src = sources[entry.src.hostname]; + for (const addr of json.addrs) { + const entry = HostEntry.fromJSON(addr, this.network); + let src = sources.get(entry.src.hostname); // Save some memory. if (!src) { src = entry.src; - sources[src.hostname] = src; + sources.set(src.hostname, src); } entry.src = src; @@ -1173,11 +1171,11 @@ HostList.prototype.fromJSON = function fromJSON(json) { assert(json.fresh.length <= this.options.maxBuckets, 'Buckets mismatch.'); - for (let keys of json.fresh) { - let bucket = new Map(); + for (const keys of json.fresh) { + const bucket = new Map(); - for (let key of keys) { - let entry = map.get(key); + for (const key of keys) { + const entry = map.get(key); assert(entry); if (entry.refCount === 0) totalFresh++; @@ -1198,11 +1196,11 @@ HostList.prototype.fromJSON = function fromJSON(json) { assert(json.used.length <= this.options.maxBuckets, 'Buckets mismatch.'); - for (let keys of json.used) { - let bucket = new List(); + for (const keys of json.used) { + const bucket = new List(); - for (let key of keys) { - let entry = map.get(key); + for (const key of keys) { + const entry = map.get(key); assert(entry); assert(entry.refCount === 0); assert(!entry.used); @@ -1220,7 +1218,7 @@ HostList.prototype.fromJSON = function fromJSON(json) { assert(used.length === this.used.length, 'Buckets mismatch.'); - for (let entry of map.values()) + for (const entry of map.values()) assert(entry.used || entry.refCount > 0); this.map = map; @@ -1311,16 +1309,15 @@ HostEntry.prototype.key = function key() { * @returns {Number} */ -HostEntry.prototype.chance = function _chance(now) { - let attempts = this.attempts; - let chance = 1; +HostEntry.prototype.chance = function chance(now) { + let c = 1; if (now - this.lastAttempt < 60 * 10) - chance *= 0.01; + c *= 0.01; - chance *= Math.pow(0.66, Math.min(attempts, 8)); + c *= Math.pow(0.66, Math.min(this.attempts, 8)); - return chance; + return c; }; /** @@ -1350,7 +1347,7 @@ HostEntry.prototype.toJSON = function toJSON() { addr: this.addr.hostname, src: this.src.hostname, services: this.addr.services.toString(2), - ts: this.addr.ts, + time: this.addr.time, attempts: this.attempts, lastSuccess: this.lastSuccess, lastAttempt: this.lastAttempt @@ -1376,14 +1373,14 @@ HostEntry.prototype.fromJSON = function fromJSON(json, network) { assert(typeof json.services === 'string'); assert(json.services.length > 0); assert(json.services.length <= 32); - this.addr.services = parseInt(json.services, 2); - assert(util.isUInt32(this.addr.services)); + const services = parseInt(json.services, 2); + assert(util.isU32(services)); + this.addr.services = services; } - if (json.ts != null) { - assert(util.isNumber(json.ts)); - assert(json.ts >= 0); - this.addr.ts = json.ts; + if (json.time != null) { + assert(util.isU64(json.time)); + this.addr.time = json.time; } if (json.src != null) { @@ -1392,20 +1389,17 @@ HostEntry.prototype.fromJSON = function fromJSON(json, network) { } if (json.attempts != null) { - assert(util.isNumber(json.attempts)); - assert(json.attempts >= 0); + assert(util.isU64(json.attempts)); this.attempts = json.attempts; } if (json.lastSuccess != null) { - assert(util.isNumber(json.lastSuccess)); - assert(json.lastSuccess >= 0); + assert(util.isU64(json.lastSuccess)); this.lastSuccess = json.lastSuccess; } if (json.lastAttempt != null) { - assert(util.isNumber(json.lastAttempt)); - assert(json.lastAttempt >= 0); + assert(util.isU64(json.lastAttempt)); this.lastAttempt = json.lastAttempt; } @@ -1458,7 +1452,7 @@ function HostListOptions(options) { this.address = new NetAddress(); this.address.services = this.services; - this.address.ts = this.network.now(); + this.address.time = this.network.now(); this.seeds = this.network.seeds; this.nodes = []; @@ -1518,7 +1512,7 @@ HostListOptions.prototype.fromOptions = function fromOptions(options) { if (options.host != null) { assert(typeof options.host === 'string'); - let raw = IP.toBuffer(options.host); + const raw = IP.toBuffer(options.host); this.host = IP.toString(raw); if (IP.isRoutable(raw)) this.address.setHost(this.host); @@ -1583,7 +1577,7 @@ HostListOptions.prototype.fromOptions = function fromOptions(options) { this.flushInterval = options.flushInterval; } - this.address.ts = this.network.now(); + this.address.time = this.network.now(); this.address.services = this.services; return this; @@ -1594,7 +1588,7 @@ HostListOptions.prototype.fromOptions = function fromOptions(options) { */ function concat32(left, right) { - let data = POOL32; + const data = POOL32; left.copy(data, 0); right.copy(data, 32); return data; diff --git a/lib/net/packets.js b/lib/net/packets.js index 2b4922440..c1702512f 100644 --- a/lib/net/packets.js +++ b/lib/net/packets.js @@ -77,7 +77,7 @@ exports.types = { * @default */ -exports.typesByVal = util.revMap(exports.types); +exports.typesByVal = util.reverse(exports.types); /** * Base Packet @@ -140,7 +140,7 @@ Packet.prototype.fromRaw = function fromRaw(data) { * @param {Object?} options * @param {Number} options.version - Protocol version. * @param {Number} options.services - Service bits. - * @param {Number} options.ts - Timestamp of discovery. + * @param {Number} options.time - Timestamp of discovery. * @param {NetAddress} options.local - Our address. * @param {NetAddress} options.remote - Their address. * @param {Buffer} options.nonce @@ -150,7 +150,7 @@ Packet.prototype.fromRaw = function fromRaw(data) { * should be relayed immediately. * @property {Number} version - Protocol version. * @property {Number} services - Service bits. - * @property {Number} ts - Timestamp of discovery. + * @property {Number} time - Timestamp of discovery. * @property {NetAddress} local - Our address. * @property {NetAddress} remote - Their address. * @property {Buffer} nonce @@ -168,7 +168,7 @@ function VersionPacket(options) { this.version = common.PROTOCOL_VERSION; this.services = common.LOCAL_SERVICES; - this.ts = util.now(); + this.time = util.now(); this.remote = new NetAddress(); this.local = new NetAddress(); this.nonce = encoding.ZERO_U64; @@ -180,7 +180,7 @@ function VersionPacket(options) { this.fromOptions(options); } -util.inherits(VersionPacket, Packet); +Object.setPrototypeOf(VersionPacket.prototype, Packet.prototype); VersionPacket.prototype.cmd = 'version'; VersionPacket.prototype.type = exports.types.VERSION; @@ -198,8 +198,8 @@ VersionPacket.prototype.fromOptions = function fromOptions(options) { if (options.services != null) this.services = options.services; - if (options.ts != null) - this.ts = options.ts; + if (options.time != null) + this.time = options.time; if (options.remote) this.remote.fromOptions(options.remote); @@ -254,15 +254,15 @@ VersionPacket.prototype.getSize = function getSize() { */ VersionPacket.prototype.toWriter = function toWriter(bw) { - bw.write32(this.version); + bw.writeI32(this.version); bw.writeU32(this.services); bw.writeU32(0); - bw.write64(this.ts); + bw.writeI64(this.time); this.remote.toWriter(bw, false); this.local.toWriter(bw, false); bw.writeBytes(this.nonce); bw.writeVarString(this.agent, 'ascii'); - bw.write32(this.height); + bw.writeI32(this.height); bw.writeU8(this.noRelay ? 0 : 1); return bw; }; @@ -273,7 +273,7 @@ VersionPacket.prototype.toWriter = function toWriter(bw) { */ VersionPacket.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -284,14 +284,14 @@ VersionPacket.prototype.toRaw = function toRaw() { */ VersionPacket.prototype.fromReader = function fromReader(br) { - this.version = br.read32(); + this.version = br.readI32(); this.services = br.readU32(); // Note: hi service bits // are currently unused. br.readU32(); - this.ts = br.read53(); + this.time = br.readI53(); this.remote.fromReader(br, false); if (br.left() > 0) { @@ -303,7 +303,7 @@ VersionPacket.prototype.fromReader = function fromReader(br) { this.agent = br.readVarString('ascii', 256); if (br.left() > 0) - this.height = br.read32(); + this.height = br.readI32(); if (br.left() > 0) this.noRelay = br.readU8() === 0; @@ -312,7 +312,7 @@ VersionPacket.prototype.fromReader = function fromReader(br) { this.version = 300; assert(this.version >= 0, 'Version is negative.'); - assert(this.ts >= 0, 'Timestamp is negative.'); + assert(this.time >= 0, 'Timestamp is negative.'); // No idea why so many peers do this. if (this.height < 0) @@ -366,7 +366,7 @@ function VerackPacket() { Packet.call(this); } -util.inherits(VerackPacket, Packet); +Object.setPrototypeOf(VerackPacket.prototype, Packet.prototype); VerackPacket.prototype.cmd = 'verack'; VerackPacket.prototype.type = exports.types.VERACK; @@ -410,7 +410,7 @@ function PingPacket(nonce) { this.nonce = nonce || null; } -util.inherits(PingPacket, Packet); +Object.setPrototypeOf(PingPacket.prototype, Packet.prototype); PingPacket.prototype.cmd = 'ping'; PingPacket.prototype.type = exports.types.PING; @@ -430,7 +430,7 @@ PingPacket.prototype.getSize = function getSize() { */ PingPacket.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -506,7 +506,7 @@ function PongPacket(nonce) { this.nonce = nonce || encoding.ZERO_U64; } -util.inherits(PongPacket, Packet); +Object.setPrototypeOf(PongPacket.prototype, Packet.prototype); PongPacket.prototype.cmd = 'pong'; PongPacket.prototype.type = exports.types.PONG; @@ -595,7 +595,7 @@ function GetAddrPacket() { Packet.call(this); } -util.inherits(GetAddrPacket, Packet); +Object.setPrototypeOf(GetAddrPacket.prototype, Packet.prototype); GetAddrPacket.prototype.cmd = 'getaddr'; GetAddrPacket.prototype.type = exports.types.GETADDR; @@ -639,7 +639,7 @@ function AddrPacket(items) { this.items = items || []; } -util.inherits(AddrPacket, Packet); +Object.setPrototypeOf(AddrPacket.prototype, Packet.prototype); AddrPacket.prototype.cmd = 'addr'; AddrPacket.prototype.type = exports.types.ADDR; @@ -664,7 +664,7 @@ AddrPacket.prototype.getSize = function getSize() { AddrPacket.prototype.toWriter = function toWriter(bw) { bw.writeVarint(this.items.length); - for (let item of this.items) + for (const item of this.items) item.toWriter(bw, true); return bw; @@ -676,7 +676,7 @@ AddrPacket.prototype.toWriter = function toWriter(bw) { */ AddrPacket.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -687,8 +687,8 @@ AddrPacket.prototype.toRaw = function toRaw() { */ AddrPacket.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let count = br.readVarint(); + const br = new BufferReader(data); + const count = br.readVarint(); for (let i = 0; i < count; i++) this.items.push(NetAddress.fromReader(br, true)); @@ -735,7 +735,7 @@ function InvPacket(items) { this.items = items || []; } -util.inherits(InvPacket, Packet); +Object.setPrototypeOf(InvPacket.prototype, Packet.prototype); InvPacket.prototype.cmd = 'inv'; InvPacket.prototype.type = exports.types.INV; @@ -762,7 +762,7 @@ InvPacket.prototype.toWriter = function toWriter(bw) { bw.writeVarint(this.items.length); - for (let item of this.items) + for (const item of this.items) item.toWriter(bw); return bw; @@ -774,7 +774,7 @@ InvPacket.prototype.toWriter = function toWriter(bw) { */ InvPacket.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -785,7 +785,7 @@ InvPacket.prototype.toRaw = function toRaw() { */ InvPacket.prototype.fromReader = function fromReader(br) { - let count = br.readVarint(); + const count = br.readVarint(); assert(count <= 50000, 'Inv item count too high.'); @@ -842,7 +842,7 @@ function GetDataPacket(items) { InvPacket.call(this, items); } -util.inherits(GetDataPacket, InvPacket); +Object.setPrototypeOf(GetDataPacket.prototype, InvPacket.prototype); GetDataPacket.prototype.cmd = 'getdata'; GetDataPacket.prototype.type = exports.types.GETDATA; @@ -884,7 +884,7 @@ function NotFoundPacket(items) { InvPacket.call(this, items); } -util.inherits(NotFoundPacket, InvPacket); +Object.setPrototypeOf(NotFoundPacket.prototype, InvPacket.prototype); NotFoundPacket.prototype.cmd = 'notfound'; NotFoundPacket.prototype.type = exports.types.NOTFOUND; @@ -932,7 +932,7 @@ function GetBlocksPacket(locator, stop) { this.stop = stop || null; } -util.inherits(GetBlocksPacket, Packet); +Object.setPrototypeOf(GetBlocksPacket.prototype, Packet.prototype); GetBlocksPacket.prototype.cmd = 'getblocks'; GetBlocksPacket.prototype.type = exports.types.GETBLOCKS; @@ -962,7 +962,7 @@ GetBlocksPacket.prototype.toWriter = function toWriter(bw) { bw.writeU32(this.version); bw.writeVarint(this.locator.length); - for (let hash of this.locator) + for (const hash of this.locator) bw.writeHash(hash); bw.writeHash(this.stop || encoding.ZERO_HASH); @@ -976,7 +976,7 @@ GetBlocksPacket.prototype.toWriter = function toWriter(bw) { */ GetBlocksPacket.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -987,11 +987,9 @@ GetBlocksPacket.prototype.toRaw = function toRaw() { */ GetBlocksPacket.prototype.fromReader = function fromReader(br) { - let count; - this.version = br.readU32(); - count = br.readVarint(); + const count = br.readVarint(); assert(count <= 50000, 'Too many block hashes.'); @@ -1044,7 +1042,7 @@ function GetHeadersPacket(locator, stop) { GetBlocksPacket.call(this, locator, stop); } -util.inherits(GetHeadersPacket, GetBlocksPacket); +Object.setPrototypeOf(GetHeadersPacket.prototype, GetBlocksPacket.prototype); GetHeadersPacket.prototype.cmd = 'getheaders'; GetHeadersPacket.prototype.type = exports.types.GETHEADERS; @@ -1088,7 +1086,7 @@ function HeadersPacket(items) { this.items = items || []; } -util.inherits(HeadersPacket, Packet); +Object.setPrototypeOf(HeadersPacket.prototype, Packet.prototype); HeadersPacket.prototype.cmd = 'headers'; HeadersPacket.prototype.type = exports.types.HEADERS; @@ -1103,7 +1101,7 @@ HeadersPacket.prototype.getSize = function getSize() { size += encoding.sizeVarint(this.items.length); - for (let item of this.items) + for (const item of this.items) size += item.getSize(); return size; @@ -1119,7 +1117,7 @@ HeadersPacket.prototype.toWriter = function toWriter(bw) { bw.writeVarint(this.items.length); - for (let item of this.items) + for (const item of this.items) item.toWriter(bw); return bw; @@ -1131,7 +1129,7 @@ HeadersPacket.prototype.toWriter = function toWriter(bw) { */ HeadersPacket.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -1142,7 +1140,7 @@ HeadersPacket.prototype.toRaw = function toRaw() { */ HeadersPacket.prototype.fromReader = function fromReader(br) { - let count = br.readVarint(); + const count = br.readVarint(); assert(count <= 2000, 'Too many headers.'); @@ -1187,7 +1185,7 @@ function SendHeadersPacket() { Packet.call(this); } -util.inherits(SendHeadersPacket, Packet); +Object.setPrototypeOf(SendHeadersPacket.prototype, Packet.prototype); SendHeadersPacket.prototype.cmd = 'sendheaders'; SendHeadersPacket.prototype.type = exports.types.SENDHEADERS; @@ -1234,7 +1232,7 @@ function BlockPacket(block, witness) { this.witness = witness || false; } -util.inherits(BlockPacket, Packet); +Object.setPrototypeOf(BlockPacket.prototype, Packet.prototype); BlockPacket.prototype.cmd = 'block'; BlockPacket.prototype.type = exports.types.BLOCK; @@ -1336,7 +1334,7 @@ function TXPacket(tx, witness) { this.witness = witness || false; } -util.inherits(TXPacket, Packet); +Object.setPrototypeOf(TXPacket.prototype, Packet.prototype); TXPacket.prototype.cmd = 'tx'; TXPacket.prototype.type = exports.types.TX; @@ -1444,7 +1442,7 @@ function RejectPacket(options) { this.fromOptions(options); } -util.inherits(RejectPacket, Packet); +Object.setPrototypeOf(RejectPacket.prototype, Packet.prototype); /** * Reject codes. Note that `internal` and higher @@ -1474,7 +1472,7 @@ RejectPacket.codes = { * @const {RevMap} */ -RejectPacket.codesByVal = util.revMap(RejectPacket.codes); +RejectPacket.codesByVal = util.reverse(RejectPacket.codes); RejectPacket.prototype.cmd = 'reject'; RejectPacket.prototype.type = exports.types.REJECT; @@ -1535,10 +1533,10 @@ RejectPacket.prototype.rhash = function rhash() { */ RejectPacket.prototype.getCode = function getCode() { - let code = RejectPacket.codesByVal[this.code]; + const code = RejectPacket.codesByVal[this.code]; if (!code) - return this.code + ''; + return this.code.toString(10); return code.toLowerCase(); }; @@ -1586,7 +1584,7 @@ RejectPacket.prototype.toWriter = function toWriter(bw) { */ RejectPacket.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -1709,8 +1707,8 @@ RejectPacket.fromError = function fromError(err, obj) { */ RejectPacket.prototype.inspect = function inspect() { - let code = RejectPacket.codesByVal[this.code] || this.code; - let hash = this.hash ? util.revHex(this.hash) : null; + const code = RejectPacket.codesByVal[this.code] || this.code; + const hash = this.hash ? util.revHex(this.hash) : null; return '= this.waiting) { - let chunk = Buffer.allocUnsafe(this.waiting); + const chunk = Buffer.allocUnsafe(this.waiting); let off = 0; - let len = 0; while (off < chunk.length) { - len = this.pending[0].copy(chunk, off); + const len = this.pending[0].copy(chunk, off); if (len === this.pending[0].length) this.pending.shift(); else @@ -74,7 +75,7 @@ Parser.prototype.feed = function feed(data) { off += len; } - assert.equal(off, chunk.length); + assert.strictEqual(off, chunk.length); this.total -= chunk.length; this.parse(chunk); @@ -87,8 +88,6 @@ Parser.prototype.feed = function feed(data) { */ Parser.prototype.parse = function parse(data) { - let payload, checksum; - assert(data.length <= common.MAX_MESSAGE); if (!this.header) { @@ -96,7 +95,7 @@ Parser.prototype.parse = function parse(data) { return; } - checksum = digest.hash256(data).readUInt32LE(0, true); + const checksum = digest.hash256(data).readUInt32LE(0, true); if (checksum !== this.header.checksum) { this.waiting = 24; @@ -105,6 +104,7 @@ Parser.prototype.parse = function parse(data) { return; } + let payload; try { payload = this.parsePayload(this.header.cmd, data); } catch (e) { @@ -127,26 +127,25 @@ Parser.prototype.parse = function parse(data) { */ Parser.prototype.parseHeader = function parseHeader(data) { - let i, magic, cmd, size, checksum; - - magic = data.readUInt32LE(0, true); + const magic = data.readUInt32LE(0, true); if (magic !== this.network.magic) { this.error('Invalid magic value: %s.', util.hex32(magic)); return null; } - // Count length of the cmd - for (i = 0; data[i + 4] !== 0 && i < 12; i++); + // Count length of the cmd. + let i = 0; + for (; data[i + 4] !== 0 && i < 12; i++); if (i === 12) { this.error('Non NULL-terminated command.'); return null; } - cmd = data.toString('ascii', 4, 4 + i); + const cmd = data.toString('ascii', 4, 4 + i); - size = data.readUInt32LE(16, true); + const size = data.readUInt32LE(16, true); if (size > common.MAX_MESSAGE) { this.waiting = 24; @@ -156,7 +155,7 @@ Parser.prototype.parseHeader = function parseHeader(data) { this.waiting = size; - checksum = data.readUInt32LE(20, true); + const checksum = data.readUInt32LE(20, true); return new Header(cmd, size, checksum); }; diff --git a/lib/net/peer.js b/lib/net/peer.js index e0beb5d16..b9f1fd27b 100644 --- a/lib/net/peer.js +++ b/lib/net/peer.js @@ -46,7 +46,7 @@ const packetTypes = packets.types; * @property {Boolean} destroyed * @property {Boolean} ack - Whether verack has been received. * @property {Boolean} connected - * @property {Number} ts + * @property {Number} time * @property {Boolean} preferHeaders - Whether the peer has * requested getheaders. * @property {Hash?} hashContinue - The block hash at which to continue @@ -89,7 +89,7 @@ function Peer(options) { this.destroyed = false; this.ack = false; this.handshake = false; - this.ts = 0; + this.time = 0; this.lastSend = 0; this.lastRecv = 0; this.drainSize = 0; @@ -146,7 +146,7 @@ function Peer(options) { this._init(); } -util.inherits(Peer, EventEmitter); +Object.setPrototypeOf(Peer.prototype, EventEmitter.prototype); /** * Max output bytes buffered before @@ -229,7 +229,7 @@ Peer.TIMEOUT_INTERVAL = 20 * 60000; */ Peer.fromInbound = function fromInbound(options, socket) { - let peer = new Peer(options); + const peer = new Peer(options); peer.accept(socket); return peer; }; @@ -242,7 +242,7 @@ Peer.fromInbound = function fromInbound(options, socket) { */ Peer.fromOutbound = function fromOutbound(options, addr) { - let peer = new Peer(options); + const peer = new Peer(options); peer.connect(addr); return peer; }; @@ -262,7 +262,7 @@ Peer.fromOptions = function fromOptions(options) { * @private */ -Peer.prototype._init = function init() { +Peer.prototype._init = function _init() { this.parser.on('packet', async (packet) => { try { await this.readPacket(packet); @@ -341,7 +341,7 @@ Peer.prototype.setCipher = function setCipher(cipher) { }); this.bip151.on('packet', (cmd, body) => { - let payload; + let payload = null; try { payload = this.parser.parsePayload(cmd, body); } catch (e) { @@ -359,9 +359,9 @@ Peer.prototype.setCipher = function setCipher(cipher) { */ Peer.prototype.setAuth = function setAuth(db, key) { - let bip151 = this.bip151; - let hostname = this.hostname(); - let outbound = this.outbound; + const bip151 = this.bip151; + const hostname = this.hostname(); + const outbound = this.outbound; assert(this.bip151, 'BIP151 not set.'); assert(!this.bip150, 'BIP150 already set.'); @@ -418,7 +418,7 @@ Peer.prototype.accept = function accept(socket) { this.address = NetAddress.fromSocket(socket, this.network); this.address.services = 0; - this.ts = util.ms(); + this.time = util.ms(); this.outbound = false; this.connected = true; @@ -435,11 +435,9 @@ Peer.prototype.accept = function accept(socket) { */ Peer.prototype.connect = function connect(addr) { - let socket; - assert(!this.socket); - socket = this.options.createSocket(addr.port, addr.host); + const socket = this.options.createSocket(addr.port, addr.host); this.address = addr; this.outbound = true; @@ -486,7 +484,7 @@ Peer.prototype.open = async function open() { * @returns {Promise} */ -Peer.prototype._open = async function open() { +Peer.prototype._open = async function _open() { this.opened = true; // Connect to peer. @@ -513,25 +511,26 @@ Peer.prototype._open = async function open() { Peer.prototype.initConnect = function initConnect() { if (this.connected) { assert(!this.outbound); - return; + return Promise.resolve(); } return new Promise((resolve, reject) => { - let cleanup = () => { + const cleanup = () => { if (this.connectTimeout != null) { clearTimeout(this.connectTimeout); this.connectTimeout = null; } + // eslint-disable-next-line no-use-before-define this.socket.removeListener('error', onError); }; - let onError = (err) => { + const onError = (err) => { cleanup(); reject(err); }; this.socket.once('connect', () => { - this.ts = util.ms(); + this.time = util.ms(); this.connected = true; this.emit('connect'); @@ -705,8 +704,6 @@ Peer.prototype.finalize = async function finalize() { */ Peer.prototype.announceBlock = function announceBlock(blocks) { - let inv = []; - if (!this.handshake) return; @@ -716,7 +713,9 @@ Peer.prototype.announceBlock = function announceBlock(blocks) { if (!Array.isArray(blocks)) blocks = [blocks]; - for (let block of blocks) { + const inv = []; + + for (const block of blocks) { assert(block instanceof Block); // Don't send if they already have it. @@ -755,8 +754,6 @@ Peer.prototype.announceBlock = function announceBlock(blocks) { */ Peer.prototype.announceTX = function announceTX(txs) { - let inv = []; - if (!this.handshake) return; @@ -771,7 +768,9 @@ Peer.prototype.announceTX = function announceTX(txs) { if (!Array.isArray(txs)) txs = [txs]; - for (let tx of txs) { + const inv = []; + + for (const tx of txs) { assert(tx instanceof TX); // Don't send if they already have it. @@ -787,8 +786,8 @@ Peer.prototype.announceTX = function announceTX(txs) { // Check the fee filter. if (this.feeRate !== -1) { - let hash = tx.hash('hex'); - let rate = this.options.getRate(hash); + const hash = tx.hash('hex'); + const rate = this.options.getRate(hash); if (rate !== -1 && rate < this.feeRate) continue; } @@ -805,8 +804,6 @@ Peer.prototype.announceTX = function announceTX(txs) { */ Peer.prototype.queueInv = function queueInv(items) { - let hasBlock = false; - if (!this.handshake) return; @@ -816,7 +813,9 @@ Peer.prototype.queueInv = function queueInv(items) { if (!Array.isArray(items)) items = [items]; - for (let item of items) { + let hasBlock = false; + + for (const item of items) { if (item.type === invTypes.BLOCK) hasBlock = true; this.invQueue.push(item); @@ -832,21 +831,22 @@ Peer.prototype.queueInv = function queueInv(items) { */ Peer.prototype.flushInv = function flushInv() { - let queue = this.invQueue.slice(); - let items = []; - if (this.destroyed) return; + const queue = this.invQueue; + if (queue.length === 0) return; - this.invQueue.length = 0; + this.invQueue = []; this.logger.spam('Serving %d inv items to %s.', queue.length, this.hostname()); - for (let item of queue) { + const items = []; + + for (const item of queue) { if (!this.invFilter.added(item.hash, 'hex')) continue; @@ -854,7 +854,7 @@ Peer.prototype.flushInv = function flushInv() { } for (let i = 0; i < items.length; i += 1000) { - let chunk = items.slice(i, i + 1000); + const chunk = items.slice(i, i + 1000); this.send(new packets.InvPacket(chunk)); } }; @@ -874,7 +874,7 @@ Peer.prototype.sendInv = function sendInv(items) { if (!Array.isArray(items)) items = [items]; - for (let item of items) + for (const item of items) this.invFilter.add(item.hash, 'hex'); if (items.length === 0) @@ -884,7 +884,7 @@ Peer.prototype.sendInv = function sendInv(items) { items.length, this.hostname()); for (let i = 0; i < items.length; i += 1000) { - let chunk = items.slice(i, i + 1000); + const chunk = items.slice(i, i + 1000); this.send(new packets.InvPacket(chunk)); } }; @@ -904,7 +904,7 @@ Peer.prototype.sendHeaders = function sendHeaders(items) { if (!Array.isArray(items)) items = [items]; - for (let item of items) + for (const item of items) this.invFilter.add(item.hash()); if (items.length === 0) @@ -914,7 +914,7 @@ Peer.prototype.sendHeaders = function sendHeaders(items) { items.length, this.hostname()); for (let i = 0; i < items.length; i += 2000) { - let chunk = items.slice(i, i + 2000); + const chunk = items.slice(i, i + 2000); this.send(new packets.HeadersPacket(chunk)); } }; @@ -927,8 +927,8 @@ Peer.prototype.sendHeaders = function sendHeaders(items) { */ Peer.prototype.sendCompactBlock = function sendCompactBlock(block) { - let witness = this.compactWitness; - let compact = BIP152.CompactBlock.fromBlock(block, witness); + const witness = this.compactWitness; + const compact = BIP152.CompactBlock.fromBlock(block, witness); this.send(new packets.CmpctBlockPacket(compact, witness)); }; @@ -937,10 +937,10 @@ Peer.prototype.sendCompactBlock = function sendCompactBlock(block) { */ Peer.prototype.sendVersion = function sendVersion() { - let packet = new packets.VersionPacket(); + const packet = new packets.VersionPacket(); packet.version = this.options.version; packet.services = this.options.services; - packet.ts = this.network.now(); + packet.time = this.network.now(); packet.remote = this.address; packet.local.setNull(); packet.local.services = this.options.services; @@ -1021,8 +1021,7 @@ Peer.prototype.sendFeeRate = function sendFeeRate(rate) { */ Peer.prototype.destroy = function destroy() { - let connected = this.connected; - let jobs; + const connected = this.connected; if (this.destroyed) return; @@ -1059,15 +1058,15 @@ Peer.prototype.destroy = function destroy() { this.connectTimeout = null; } - jobs = this.drainQueue; + const jobs = this.drainQueue; this.drainSize = 0; this.drainQueue = []; - for (let job of jobs) + for (const job of jobs) job.reject(new Error('Peer was destroyed.')); - for (let [cmd, entry] of this.responseMap) { + for (const [cmd, entry] of this.responseMap) { this.responseMap.delete(cmd); entry.reject(new Error('Peer was destroyed.')); } @@ -1098,15 +1097,14 @@ Peer.prototype.write = function write(data) { */ Peer.prototype.send = function send(packet) { - let checksum; - if (this.destroyed) throw new Error('Peer is destroyed (send).'); // Used cached hashes as the // packet checksum for speed. + let checksum = null; if (packet.type === packetTypes.TX) { - let tx = packet.tx; + const tx = packet.tx; if (packet.witness) { if (!tx.isCoinbase()) checksum = tx.witnessHash(); @@ -1126,7 +1124,7 @@ Peer.prototype.send = function send(packet) { */ Peer.prototype.sendRaw = function sendRaw(cmd, body, checksum) { - let payload = this.framePacket(cmd, body, checksum); + const payload = this.framePacket(cmd, body, checksum); this.write(payload); }; @@ -1153,7 +1151,7 @@ Peer.prototype.drain = function drain() { */ Peer.prototype.handleDrain = function handleDrain() { - let jobs = this.drainQueue; + const jobs = this.drainQueue; this.drainSize = 0; @@ -1162,7 +1160,7 @@ Peer.prototype.handleDrain = function handleDrain() { this.drainQueue = []; - for (let job of jobs) + for (const job of jobs) job.resolve(); }; @@ -1192,7 +1190,7 @@ Peer.prototype.needsDrain = function needsDrain(size) { */ Peer.prototype.addTimeout = function addTimeout(packet) { - let timeout = Peer.RESPONSE_TIMEOUT; + const timeout = Peer.RESPONSE_TIMEOUT; if (!this.outbound) return; @@ -1230,7 +1228,7 @@ Peer.prototype.fulfill = function fulfill(packet) { case packetTypes.MERKLEBLOCK: case packetTypes.TX: case packetTypes.NOTFOUND: { - let entry = this.response(packetTypes.DATA, packet); + const entry = this.response(packetTypes.DATA, packet); assert(!entry || entry.jobs.length === 0); break; } @@ -1245,11 +1243,11 @@ Peer.prototype.fulfill = function fulfill(packet) { */ Peer.prototype.maybeTimeout = function maybeTimeout() { - let now = util.ms(); + const now = util.ms(); - for (let [key, entry] of this.responseMap) { + for (const [key, entry] of this.responseMap) { if (now > entry.timeout) { - let name = packets.typesByVal[key]; + const name = packets.typesByVal[key]; this.error('Peer is stalling (%s).', name.toLowerCase()); this.destroy(); return; @@ -1274,23 +1272,23 @@ Peer.prototype.maybeTimeout = function maybeTimeout() { } if (this.options.isFull() || !this.syncing) { - for (let ts of this.blockMap.values()) { - if (now > ts + Peer.BLOCK_TIMEOUT) { + for (const time of this.blockMap.values()) { + if (now > time + Peer.BLOCK_TIMEOUT) { this.error('Peer is stalling (block).'); this.destroy(); return; } } - for (let ts of this.txMap.values()) { - if (now > ts + Peer.TX_TIMEOUT) { + for (const time of this.txMap.values()) { + if (now > time + Peer.TX_TIMEOUT) { this.error('Peer is stalling (tx).'); this.destroy(); return; } } - for (let block of this.compactBlocks.values()) { + for (const block of this.compactBlocks.values()) { if (now > block.now + Peer.RESPONSE_TIMEOUT) { this.error('Peer is stalling (blocktxn).'); this.destroy(); @@ -1299,10 +1297,8 @@ Peer.prototype.maybeTimeout = function maybeTimeout() { } } - if (now > this.ts + 60000) { - let mult; - - assert(this.ts !== 0); + if (now > this.time + 60000) { + assert(this.time !== 0); if (this.lastRecv === 0 || this.lastSend === 0) { this.error('Peer is stalling (no message).'); @@ -1316,7 +1312,7 @@ Peer.prototype.maybeTimeout = function maybeTimeout() { return; } - mult = this.version <= common.PONG_VERSION ? 4 : 1; + const mult = this.version <= common.PONG_VERSION ? 4 : 1; if (now > this.lastRecv + Peer.TIMEOUT_INTERVAL * mult) { this.error('Peer is stalling (recv).'); @@ -1341,10 +1337,10 @@ Peer.prototype.maybeTimeout = function maybeTimeout() { */ Peer.prototype.request = function request(type, timeout) { - let entry = this.responseMap.get(type); - if (this.destroyed) - return; + return null; + + let entry = this.responseMap.get(type); if (!entry) { entry = new RequestEntry(); @@ -1364,10 +1360,10 @@ Peer.prototype.request = function request(type, timeout) { */ Peer.prototype.response = function response(type, payload) { - let entry = this.responseMap.get(type); + const entry = this.responseMap.get(type); if (!entry) - return; + return null; this.responseMap.delete(type); @@ -1384,14 +1380,12 @@ Peer.prototype.response = function response(type, payload) { Peer.prototype.wait = function wait(type, timeout) { return new Promise((resolve, reject) => { - let entry; - if (this.destroyed) { reject(new Error('Peer is destroyed (request).')); return; } - entry = this.request(type); + const entry = this.request(type); entry.setTimeout(timeout); entry.addJob(resolve, reject); @@ -1405,18 +1399,16 @@ Peer.prototype.wait = function wait(type, timeout) { */ Peer.prototype.error = function error(err) { - let msg; - if (this.destroyed) return; if (typeof err === 'string') { - msg = util.fmt.apply(util, arguments); + const msg = util.fmt.apply(util, arguments); err = new Error(msg); } if (typeof err.code === 'string' && err.code[0] === 'E') { - msg = err.code; + const msg = err.code; err = new Error(msg); err.code = msg; err.message = `Socket Error: ${msg}`; @@ -1477,9 +1469,9 @@ Peer.prototype.getData = function getData(items) { */ Peer.prototype.getItems = function getItems(type, hashes) { - let items = []; + const items = []; - for (let hash of hashes) + for (const hash of hashes) items.push(new InvItem(type, hash)); if (items.length === 0) @@ -1512,10 +1504,10 @@ Peer.prototype.getTX = function getTX(hashes) { */ Peer.prototype.getFullBlock = function getFullBlock(hash) { - let type = invTypes.BLOCK; - assert(!this.options.spv); + let type = invTypes.BLOCK; + if (this.hasWitness()) type |= InvItem.WITNESS_FLAG; @@ -1555,7 +1547,7 @@ Peer.prototype.readPacket = async function readPacket(packet) { break; } default: { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { this.socket.pause(); await this.handlePacket(packet); @@ -1577,8 +1569,6 @@ Peer.prototype.readPacket = async function readPacket(packet) { */ Peer.prototype.handlePacket = async function handlePacket(packet) { - let entry; - if (this.destroyed) throw new Error('Destroyed peer sent a packet.'); @@ -1599,7 +1589,7 @@ Peer.prototype.handlePacket = async function handlePacket(packet) { this.bip150.reject(new Error('Message before BIP150 auth.')); } - entry = this.fulfill(packet); + const entry = this.fulfill(packet); switch (packet.type) { case packetTypes.VERSION: @@ -1757,8 +1747,8 @@ Peer.prototype.handlePing = async function handlePing(packet) { */ Peer.prototype.handlePong = async function handlePong(packet) { - let nonce = packet.nonce; - let now = util.ms(); + const nonce = packet.nonce; + const now = util.ms(); if (!this.challenge) { this.logger.debug('Peer sent an unsolicited pong (%s).', this.hostname()); @@ -1830,7 +1820,7 @@ Peer.prototype.handleFilterLoad = async function handleFilterLoad(packet) { */ Peer.prototype.handleFilterAdd = async function handleFilterAdd(packet) { - let data = packet.data; + const data = packet.data; if (data.length > consensus.MAX_SCRIPT_PUSH) { this.increaseBan(100); @@ -1865,9 +1855,9 @@ Peer.prototype.handleFilterClear = async function handleFilterClear(packet) { */ Peer.prototype.handleFeeFilter = async function handleFeeFilter(packet) { - let rate = packet.rate; + const rate = packet.rate; - if (!(rate >= 0 && rate <= consensus.MAX_MONEY)) { + if (rate < 0 || rate > consensus.MAX_MONEY) { this.increaseBan(100); return; } @@ -1951,12 +1941,10 @@ Peer.prototype.handleEncack = async function handleEncack(packet) { */ Peer.prototype.handleAuthChallenge = async function handleAuthChallenge(packet) { - let sig; - if (!this.bip150) return; - sig = this.bip150.challenge(packet.hash); + const sig = this.bip150.challenge(packet.hash); this.send(new packets.AuthReplyPacket(sig)); }; @@ -1969,12 +1957,10 @@ Peer.prototype.handleAuthChallenge = async function handleAuthChallenge(packet) */ Peer.prototype.handleAuthReply = async function handleAuthReply(packet) { - let hash; - if (!this.bip150) return; - hash = this.bip150.reply(packet.signature); + const hash = this.bip150.reply(packet.signature); if (hash) this.send(new packets.AuthProposePacket(hash)); @@ -1988,12 +1974,10 @@ Peer.prototype.handleAuthReply = async function handleAuthReply(packet) { */ Peer.prototype.handleAuthPropose = async function handleAuthPropose(packet) { - let hash; - if (!this.bip150) return; - hash = this.bip150.propose(packet.hash); + const hash = this.bip150.propose(packet.hash); this.send(new packets.AuthChallengePacket(hash)); }; @@ -2006,13 +1990,13 @@ Peer.prototype.handleAuthPropose = async function handleAuthPropose(packet) { */ Peer.prototype.sendGetHeaders = function sendGetHeaders(locator, stop) { - let packet = new packets.GetHeadersPacket(locator, stop); - let hash = null; - let end = null; + const packet = new packets.GetHeadersPacket(locator, stop); + let hash = null; if (packet.locator.length > 0) hash = util.revHex(packet.locator[0]); + let end = null; if (stop) end = util.revHex(stop); @@ -2033,14 +2017,14 @@ Peer.prototype.sendGetHeaders = function sendGetHeaders(locator, stop) { * @param {Hash?} stop - Hash to stop at. */ -Peer.prototype.sendGetBlocks = function getBlocks(locator, stop) { - let packet = new packets.GetBlocksPacket(locator, stop); - let hash = null; - let end = null; +Peer.prototype.sendGetBlocks = function sendGetBlocks(locator, stop) { + const packet = new packets.GetBlocksPacket(locator, stop); + let hash = null; if (packet.locator.length > 0) hash = util.revHex(packet.locator[0]); + let end = null; if (stop) end = util.revHex(stop); @@ -2086,7 +2070,7 @@ Peer.prototype.sendMempool = function sendMempool() { */ Peer.prototype.sendReject = function sendReject(code, reason, msg, hash) { - let reject = packets.RejectPacket.fromReason(code, reason, msg, hash); + const reject = packets.RejectPacket.fromReason(code, reason, msg, hash); if (msg) { this.logger.debug('Rejecting %s %s (%s): code=%s reason=%s.', @@ -2459,14 +2443,14 @@ RequestEntry.prototype.setTimeout = function setTimeout(timeout) { }; RequestEntry.prototype.reject = function reject(err) { - for (let job of this.jobs) + for (const job of this.jobs) job.reject(err); this.jobs.length = 0; }; RequestEntry.prototype.resolve = function resolve(result) { - for (let job of this.jobs) + for (const job of this.jobs) job.resolve(result); this.jobs.length = 0; diff --git a/lib/net/pool.js b/lib/net/pool.js index e03a6e129..5b8b3fd1c 100644 --- a/lib/net/pool.js +++ b/lib/net/pool.js @@ -104,7 +104,6 @@ function Pool(options) { this.headerChain = new List(); this.headerNext = null; this.headerTip = null; - this.headerFails = 0; this.peers = new PeerList(); this.authdb = new BIP150.AuthDB(this.options); @@ -120,16 +119,7 @@ function Pool(options) { this._init(); }; -util.inherits(Pool, AsyncObject); - -/** - * Max number of header chain failures - * before disabling checkpoints. - * @const {Number} - * @default - */ - -Pool.MAX_HEADER_FAILS = 1000; +Object.setPrototypeOf(Pool.prototype, AsyncObject.prototype); /** * Discovery interval for UPNP and DNS seeds. @@ -155,7 +145,7 @@ Pool.prototype._init = function _init() { }); this.server.on('listening', () => { - let data = this.server.address(); + const data = this.server.address(); this.logger.info( 'Pool server listening on %s (port=%d).', data.address, data.port); @@ -229,7 +219,7 @@ Pool.prototype._open = async function _open() { this.logger.info('Pool loaded (maxpeers=%d).', this.options.maxOutbound); if (this.options.bip150) { - let key = secp256k1.publicKeyCreate(this.options.identityKey, true); + const key = secp256k1.publicKeyCreate(this.options.identityKey, true); this.logger.info('Identity public key: %s.', key.toString('hex')); this.logger.info('Identity address: %s.', BIP150.address(key)); } @@ -242,20 +232,18 @@ Pool.prototype._open = async function _open() { */ Pool.prototype.resetChain = function resetChain() { - let tip = this.chain.tip; - if (!this.options.checkpoints) return; this.checkpoints = false; - this.chain.checkpoints = false; this.headerTip = null; this.headerChain.reset(); this.headerNext = null; + const tip = this.chain.tip; + if (tip.height < this.network.lastCheckpoint) { this.checkpoints = true; - this.chain.checkpoints = true; this.headerTip = this.getNextTip(tip.height); this.headerChain.push(new HeaderEntry(tip.hash, tip.height)); this.logger.info( @@ -271,7 +259,7 @@ Pool.prototype.resetChain = function resetChain() { * @returns {Promise} */ -Pool.prototype._close = async function close() { +Pool.prototype._close = async function _close() { await this.disconnect(); }; @@ -282,7 +270,7 @@ Pool.prototype._close = async function close() { */ Pool.prototype.connect = async function connect() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._connect(); } finally { @@ -296,7 +284,7 @@ Pool.prototype.connect = async function connect() { * @returns {Promise} */ -Pool.prototype._connect = async function connect() { +Pool.prototype._connect = async function _connect() { assert(this.loaded, 'Pool is not loaded.'); if (this.connected) @@ -325,7 +313,7 @@ Pool.prototype._connect = async function connect() { */ Pool.prototype.disconnect = async function disconnect() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._disconnect(); } finally { @@ -339,7 +327,7 @@ Pool.prototype.disconnect = async function disconnect() { * @returns {Promise} */ -Pool.prototype._disconnect = async function disconnect() { +Pool.prototype._disconnect = async function _disconnect() { assert(this.loaded, 'Pool is not loaded.'); if (!this.connected) @@ -347,7 +335,7 @@ Pool.prototype._disconnect = async function disconnect() { this.disconnecting = true; - for (let item of this.invMap.values()) + for (const item of this.invMap.values()) item.resolve(); this.peers.destroy(); @@ -366,7 +354,6 @@ Pool.prototype._disconnect = async function disconnect() { } this.checkpoints = false; - this.chain.checkpoints = false; this.headerTip = null; this.headerChain.reset(); this.headerNext = null; @@ -458,19 +445,19 @@ Pool.prototype.discover = async function discover() { */ Pool.prototype.discoverGateway = async function discoverGateway() { - let src = this.options.publicPort; - let dest = this.options.port; - let wan, host; + const src = this.options.publicPort; + const dest = this.options.port; // Pointless if we're not listening. if (!this.options.listen) - return; + return false; // UPNP is always optional, since // it's likely to not work anyway. if (!this.options.upnp) - return; + return false; + let wan; try { this.logger.debug('Discovering internet gateway (upnp).'); wan = await UPNP.discover(); @@ -480,6 +467,7 @@ Pool.prototype.discoverGateway = async function discoverGateway() { return false; } + let host; try { host = await wan.getExternalIP(); } catch (e) { @@ -513,13 +501,13 @@ Pool.prototype.discoverGateway = async function discoverGateway() { */ Pool.prototype.discoverSeeds = async function discoverSeeds(checkPeers) { - let max = Math.min(2, this.options.maxOutbound); - let size = this.hosts.size(); - let total = 0; - if (this.hosts.dnsSeeds.length === 0) return; + const max = Math.min(2, this.options.maxOutbound); + const size = this.hosts.size(); + + let total = 0; for (let peer = this.peers.head(); peer; peer = peer.next) { if (!peer.outbound) continue; @@ -550,8 +538,7 @@ Pool.prototype.discoverSeeds = async function discoverSeeds(checkPeers) { */ Pool.prototype.discoverExternal = async function discoverExternal() { - let port = this.options.publicPort; - let host4, host6; + const port = this.options.publicPort; // Pointless if we're not listening. if (!this.options.listen) @@ -566,6 +553,7 @@ Pool.prototype.discoverExternal = async function discoverExternal() { if (this.hosts.local.size > 0) return; + let host4; try { host4 = await external.getIPv4(); } catch (e) { @@ -576,6 +564,7 @@ Pool.prototype.discoverExternal = async function discoverExternal() { if (host4 && this.hosts.addLocal(host4, port, scores.HTTP)) this.logger.info('External IPv4 found (http): %s.', host4); + let host6; try { host6 = await external.getIPv6(); } catch (e) { @@ -594,29 +583,27 @@ Pool.prototype.discoverExternal = async function discoverExternal() { */ Pool.prototype.handleSocket = function handleSocket(socket) { - let host; - if (!socket.remoteAddress) { this.logger.debug('Ignoring disconnected peer.'); socket.destroy(); return; } - host = IP.normalize(socket.remoteAddress); + const ip = IP.normalize(socket.remoteAddress); if (this.peers.inbound >= this.options.maxInbound) { - this.logger.debug('Ignoring peer: too many inbound (%s).', host); + this.logger.debug('Ignoring peer: too many inbound (%s).', ip); socket.destroy(); return; } - if (this.hosts.isBanned(host)) { - this.logger.debug('Ignoring banned peer (%s).', host); + if (this.hosts.isBanned(ip)) { + this.logger.debug('Ignoring banned peer (%s).', ip); socket.destroy(); return; } - host = IP.toHostname(host, socket.remotePort); + const host = IP.toHostname(ip, socket.remotePort); assert(!this.peers.map[host], 'Port collision.'); @@ -630,8 +617,6 @@ Pool.prototype.handleSocket = function handleSocket(socket) { */ Pool.prototype.addLoader = function addLoader() { - let peer, addr; - if (!this.loaded) return; @@ -650,12 +635,12 @@ Pool.prototype.addLoader = function addLoader() { return; } - addr = this.getHost(); + const addr = this.getHost(); if (!addr) return; - peer = this.createOutbound(addr); + const peer = this.createOutbound(addr); this.logger.info('Adding loader peer (%s).', peer.hostname()); @@ -745,7 +730,7 @@ Pool.prototype.stopSync = function stopSync() { peer.merkleMatches = 0; peer.merkleMap = null; peer.blockTime = -1; - peer.blockMap.reset(); + peer.blockMap.clear(); peer.compactBlocks.clear(); } @@ -761,11 +746,10 @@ Pool.prototype.stopSync = function stopSync() { */ Pool.prototype.resync = async function resync(force) { - let locator; - if (!this.syncing) return; + let locator; try { locator = await this.chain.getLocator(); } catch (e) { @@ -822,8 +806,6 @@ Pool.prototype.isSyncable = function isSyncable(peer) { */ Pool.prototype.sendSync = async function sendSync(peer) { - let locator; - if (peer.syncing) return false; @@ -833,6 +815,7 @@ Pool.prototype.sendSync = async function sendSync(peer) { peer.syncing = true; peer.blockTime = util.ms(); + let locator; try { locator = await this.chain.getLocator(); } catch (e) { @@ -901,7 +884,7 @@ Pool.prototype.sendGetAddr = function sendGetAddr() { */ Pool.prototype.resolveHeaders = function resolveHeaders(peer) { - let items = []; + const items = []; for (let node = this.headerNext; node; node = node.next) { this.headerNext = node.next; @@ -946,7 +929,7 @@ Pool.prototype.resolveHeight = function resolveHeight(hash, height) { */ Pool.prototype.getNextTip = function getNextTip(height) { - for (let next of this.network.checkpoints) { + for (const next of this.network.checkpoints) { if (next.height > height) return new HeaderEntry(next.hash, next.height); } @@ -960,10 +943,10 @@ Pool.prototype.getNextTip = function getNextTip(height) { */ Pool.prototype.announceList = function announceList(peer) { - let blocks = []; - let txs = []; + const blocks = []; + const txs = []; - for (let item of this.invMap.values()) { + for (const item of this.invMap.values()) { switch (item.type) { case invTypes.BLOCK: blocks.push(item.msg); @@ -993,17 +976,17 @@ Pool.prototype.announceList = function announceList(peer) { */ Pool.prototype.getBroadcasted = function getBroadcasted(peer, item) { - let type = item.isTX() ? invTypes.TX : invTypes.BLOCK; - let entry = this.invMap.get(item.hash); + const type = item.isTX() ? invTypes.TX : invTypes.BLOCK; + const entry = this.invMap.get(item.hash); if (!entry) - return; + return null; if (type !== entry.type) { this.logger.debug( 'Peer requested item with the wrong type (%s).', peer.hostname()); - return; + return null; } this.logger.debug( @@ -1028,25 +1011,25 @@ Pool.prototype.getBroadcasted = function getBroadcasted(peer, item) { */ Pool.prototype.getItem = async function getItem(peer, item) { - let entry = this.getBroadcasted(peer, item); + const entry = this.getBroadcasted(peer, item); if (entry) return entry; if (this.options.selfish) - return; + return null; if (item.isTX()) { if (!this.mempool) - return; + return null; return this.mempool.getTX(item.hash); } if (this.chain.options.spv) - return; + return null; if (this.chain.options.prune) - return; + return null; return await this.chain.db.getBlock(item.hash); }; @@ -1061,11 +1044,11 @@ Pool.prototype.getItem = async function getItem(peer, item) { */ Pool.prototype.sendBlock = async function sendBlock(peer, item, witness) { - let block = this.getBroadcasted(peer, item); + const broadcasted = this.getBroadcasted(peer, item); // Check for a broadcasted item first. - if (block) { - peer.send(new packets.BlockPacket(block, witness)); + if (broadcasted) { + peer.send(new packets.BlockPacket(broadcasted, witness)); return true; } @@ -1078,7 +1061,7 @@ Pool.prototype.sendBlock = async function sendBlock(peer, item, witness) { // If we have the same serialization, we // can write the raw binary to the socket. if (witness || !this.options.hasWitness()) { - block = await this.chain.db.getRawBlock(item.hash); + const block = await this.chain.db.getRawBlock(item.hash); if (block) { peer.sendRaw('block', block); @@ -1088,7 +1071,7 @@ Pool.prototype.sendBlock = async function sendBlock(peer, item, witness) { return false; } - block = await this.chain.db.getBlock(item.hash); + const block = await this.chain.db.getBlock(item.hash); if (block) { peer.send(new packets.BlockPacket(block, witness)); @@ -1106,9 +1089,9 @@ Pool.prototype.sendBlock = async function sendBlock(peer, item, witness) { */ Pool.prototype.createOutbound = function createOutbound(addr) { - let cipher = BIP151.ciphers.CHACHAPOLY; - let identity = this.options.identityKey; - let peer = Peer.fromOutbound(this.options, addr); + const cipher = BIP151.ciphers.CHACHAPOLY; + const identity = this.options.identityKey; + const peer = Peer.fromOutbound(this.options, addr); this.hosts.markAttempt(addr.hostname); @@ -1135,9 +1118,9 @@ Pool.prototype.createOutbound = function createOutbound(addr) { */ Pool.prototype.createInbound = function createInbound(socket) { - let cipher = BIP151.ciphers.CHACHAPOLY; - let identity = this.options.identityKey; - let peer = Peer.fromInbound(this.options, socket); + const cipher = BIP151.ciphers.CHACHAPOLY; + const identity = this.options.identityKey; + const peer = Peer.fromInbound(this.options, socket); if (this.options.bip151) peer.setCipher(cipher); @@ -1158,7 +1141,7 @@ Pool.prototype.createInbound = function createInbound(socket) { */ Pool.prototype.uid = function uid() { - let MAX = Number.MAX_SAFE_INTEGER; + const MAX = Number.MAX_SAFE_INTEGER; if (this.id >= MAX - this.peers.size() - 1) this.id = 0; @@ -1350,7 +1333,7 @@ Pool.prototype.handleConnect = async function handleConnect(peer) { Pool.prototype.handleOpen = async function handleOpen(peer) { // Advertise our address. if (!this.options.selfish && this.options.listen) { - let addr = this.hosts.getLocal(peer.address); + const addr = this.hosts.getLocal(peer.address); if (addr) peer.send(new packets.AddrPacket([addr])); } @@ -1409,9 +1392,9 @@ Pool.prototype.handleOpen = async function handleOpen(peer) { */ Pool.prototype.handleClose = async function handleClose(peer, connected) { - let outbound = peer.outbound; - let loader = peer.loader; - let size = peer.blockMap.size; + const outbound = peer.outbound; + const loader = peer.loader; + const size = peer.blockMap.size; this.removePeer(peer); @@ -1472,7 +1455,7 @@ Pool.prototype.handleVersion = async function handleVersion(peer, packet) { packet.services.toString(2), packet.agent); - this.network.time.add(peer.hostname(), packet.ts); + this.network.time.add(peer.hostname(), packet.time); this.nonces.remove(peer.hostname()); if (!peer.outbound && packet.remote.isRoutable()) @@ -1524,9 +1507,6 @@ Pool.prototype.handlePong = async function handlePong(peer, packet) { */ Pool.prototype.handleGetAddr = async function handleGetAddr(peer, packet) { - let items = []; - let addrs; - if (this.options.selfish) return; @@ -1539,9 +1519,10 @@ Pool.prototype.handleGetAddr = async function handleGetAddr(peer, packet) { peer.sentAddr = true; - addrs = this.hosts.toArray(); + const addrs = this.hosts.toArray(); + const items = []; - for (let addr of addrs) { + for (const addr of addrs) { if (!peer.addrFilter.added(addr.hostname, 'ascii')) continue; @@ -1571,11 +1552,11 @@ Pool.prototype.handleGetAddr = async function handleGetAddr(peer, packet) { */ Pool.prototype.handleAddr = async function handleAddr(peer, packet) { - let addrs = packet.items; - let now = this.network.now(); - let services = this.options.getRequiredServices(); + const addrs = packet.items; + const now = this.network.now(); + const services = this.options.getRequiredServices(); - for (let addr of addrs) { + for (const addr of addrs) { peer.addrFilter.add(addr.hostname, 'ascii'); if (!addr.isRoutable()) @@ -1584,8 +1565,8 @@ Pool.prototype.handleAddr = async function handleAddr(peer, packet) { if (!addr.hasServices(services)) continue; - if (addr.ts <= 100000000 || addr.ts > now + 10 * 60) - addr.ts = now - 5 * 24 * 60 * 60; + if (addr.time <= 100000000 || addr.time > now + 10 * 60) + addr.time = now - 5 * 24 * 60 * 60; if (addr.port === 0) continue; @@ -1612,7 +1593,7 @@ Pool.prototype.handleAddr = async function handleAddr(peer, packet) { */ Pool.prototype.handleInv = async function handleInv(peer, packet) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._handleInv(peer, packet); } finally { @@ -1628,18 +1609,19 @@ Pool.prototype.handleInv = async function handleInv(peer, packet) { * @param {InvPacket} packet */ -Pool.prototype._handleInv = async function handleInv(peer, packet) { - let items = packet.items; - let blocks = []; - let txs = []; - let unknown = -1; +Pool.prototype._handleInv = async function _handleInv(peer, packet) { + const items = packet.items; if (items.length > 50000) { peer.increaseBan(100); return; } - for (let item of items) { + const blocks = []; + const txs = []; + let unknown = -1; + + for (const item of items) { switch (item.type) { case invTypes.BLOCK: blocks.push(item.hash); @@ -1681,9 +1663,6 @@ Pool.prototype._handleInv = async function handleInv(peer, packet) { */ Pool.prototype.handleBlockInv = async function handleBlockInv(peer, hashes) { - let items = []; - let hash, exists; - assert(hashes.length > 0); if (!this.syncing) @@ -1691,7 +1670,7 @@ Pool.prototype.handleBlockInv = async function handleBlockInv(peer, hashes) { // Always keep track of the peer's best hash. if (!peer.loader || this.chain.synced) { - hash = hashes[hashes.length - 1]; + const hash = hashes[hashes.length - 1]; peer.bestHash = hash; } @@ -1711,8 +1690,11 @@ Pool.prototype.handleBlockInv = async function handleBlockInv(peer, hashes) { hashes.length, peer.hostname()); + const items = []; + let exists; + for (let i = 0; i < hashes.length; i++) { - let hash = hashes[i]; + const hash = hashes[i]; // Resolve orphan chain. if (this.chain.hasOrphan(hash)) { @@ -1722,7 +1704,7 @@ Pool.prototype.handleBlockInv = async function handleBlockInv(peer, hashes) { } // Request the block if we don't have it. - if (!(await this.hasBlock(hash))) { + if (!await this.hasBlock(hash)) { items.push(hash); continue; } @@ -1745,7 +1727,7 @@ Pool.prototype.handleBlockInv = async function handleBlockInv(peer, hashes) { // Attempt to update the peer's best height // with the last existing hash we know of. if (exists && this.chain.synced) { - let height = await this.chain.db.getHeight(exists); + const height = await this.chain.db.getHeight(exists); if (height !== -1) peer.bestHeight = height; } @@ -1779,12 +1761,7 @@ Pool.prototype.handleTXInv = async function handleTXInv(peer, hashes) { */ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { - let items = packet.items; - let notFound = []; - let txs = 0; - let blocks = 0; - let compact = 0; - let unknown = -1; + const items = packet.items; if (items.length > 50000) { this.logger.warning('Peer sent inv with >50k items (%s).', peer.hostname()); @@ -1793,9 +1770,15 @@ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { return; } - for (let item of items) { + const notFound = []; + let txs = 0; + let blocks = 0; + let compact = 0; + let unknown = -1; + + for (const item of items) { if (item.isTX()) { - let tx = await this.getItem(peer, item); + const tx = await this.getItem(peer, item); if (!tx) { notFound.push(item); @@ -1822,7 +1805,7 @@ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { switch (item.type) { case invTypes.BLOCK: case invTypes.WITNESS_BLOCK: { - let result = await this.sendBlock(peer, item, item.hasWitness()); + const result = await this.sendBlock(peer, item, item.hasWitness()); if (!result) { notFound.push(item); continue; @@ -1832,8 +1815,6 @@ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { } case invTypes.FILTERED_BLOCK: case invTypes.WITNESS_FILTERED_BLOCK: { - let block; - if (!this.options.bip37) { this.logger.debug( 'Peer requested a merkleblock without bip37 enabled (%s).', @@ -1847,18 +1828,18 @@ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { continue; } - block = await this.getItem(peer, item); + const block = await this.getItem(peer, item); if (!block) { notFound.push(item); continue; } - block = block.toMerkle(peer.spvFilter); + const merkle = block.toMerkle(peer.spvFilter); - peer.send(new packets.MerkleBlockPacket(block)); + peer.send(new packets.MerkleBlockPacket(merkle)); - for (let tx of block.txs) { + for (const tx of merkle.txs) { peer.send(new packets.TXPacket(tx, item.hasWitness())); txs++; } @@ -1868,12 +1849,11 @@ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { break; } case invTypes.CMPCT_BLOCK: { - let height = await this.chain.db.getHeight(item.hash); - let block; + const height = await this.chain.db.getHeight(item.hash); // Fallback to full block. if (height < this.chain.tip.height - 10) { - let result = await this.sendBlock(peer, item, peer.compactWitness); + const result = await this.sendBlock(peer, item, peer.compactWitness); if (!result) { notFound.push(item); continue; @@ -1882,7 +1862,7 @@ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { break; } - block = await this.getItem(peer, item); + const block = await this.getItem(peer, item); if (!block) { notFound.push(item); @@ -1945,9 +1925,9 @@ Pool.prototype.handleGetData = async function handleGetData(peer, packet) { */ Pool.prototype.handleNotFound = async function handleNotFound(peer, packet) { - let items = packet.items; + const items = packet.items; - for (let item of items) { + for (const item of items) { if (!this.resolveItem(peer, item)) { this.logger.warning( 'Peer sent notfound for unrequested item: %s (%s).', @@ -1967,9 +1947,6 @@ Pool.prototype.handleNotFound = async function handleNotFound(peer, packet) { */ Pool.prototype.handleGetBlocks = async function handleGetBlocks(peer, packet) { - let blocks = []; - let hash; - if (!this.chain.synced) return; @@ -1982,11 +1959,13 @@ Pool.prototype.handleGetBlocks = async function handleGetBlocks(peer, packet) { if (this.chain.options.prune) return; - hash = await this.chain.findLocator(packet.locator); + let hash = await this.chain.findLocator(packet.locator); if (hash) hash = await this.chain.db.getNextHash(hash); + const blocks = []; + while (hash) { blocks.push(new InvItem(invTypes.BLOCK, hash)); @@ -2013,9 +1992,6 @@ Pool.prototype.handleGetBlocks = async function handleGetBlocks(peer, packet) { */ Pool.prototype.handleGetHeaders = async function handleGetHeaders(peer, packet) { - let headers = []; - let hash, entry; - if (!this.chain.synced) return; @@ -2028,6 +2004,7 @@ Pool.prototype.handleGetHeaders = async function handleGetHeaders(peer, packet) if (this.chain.options.prune) return; + let hash; if (packet.locator.length > 0) { hash = await this.chain.findLocator(packet.locator); if (hash) @@ -2036,9 +2013,12 @@ Pool.prototype.handleGetHeaders = async function handleGetHeaders(peer, packet) hash = packet.stop; } + let entry; if (hash) entry = await this.chain.db.getEntry(hash); + const headers = []; + while (entry) { headers.push(entry.toHeaders()); @@ -2064,7 +2044,7 @@ Pool.prototype.handleGetHeaders = async function handleGetHeaders(peer, packet) */ Pool.prototype.handleHeaders = async function handleHeaders(peer, packet) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._handleHeaders(peer, packet); } finally { @@ -2082,10 +2062,8 @@ Pool.prototype.handleHeaders = async function handleHeaders(peer, packet) { * @returns {Promise} */ -Pool.prototype._handleHeaders = async function handleHeaders(peer, packet) { - let headers = packet.items; - let checkpoint = false; - let node; +Pool.prototype._handleHeaders = async function _handleHeaders(peer, packet) { + const headers = packet.items; if (!this.checkpoints) return; @@ -2106,10 +2084,13 @@ Pool.prototype._handleHeaders = async function handleHeaders(peer, packet) { assert(this.headerChain.size > 0); - for (let header of headers) { - let last = this.headerChain.tail; - let hash = header.hash('hex'); - let height = last.height + 1; + let checkpoint = false; + let node = null; + + for (const header of headers) { + const last = this.headerChain.tail; + const hash = header.hash('hex'); + const height = last.height + 1; if (!header.verify()) { this.logger.warning( @@ -2124,17 +2105,7 @@ Pool.prototype._handleHeaders = async function handleHeaders(peer, packet) { this.logger.warning( 'Peer sent a bad header chain (%s).', peer.hostname()); - - if (++this.headerFails < Pool.MAX_HEADER_FAILS) { - peer.destroy(); - return; - } - - this.logger.warning( - 'Switching to getblocks (%s).', - peer.hostname()); - - await this.switchSync(peer); + peer.destroy(); return; } @@ -2145,17 +2116,7 @@ Pool.prototype._handleHeaders = async function handleHeaders(peer, packet) { this.logger.warning( 'Peer sent an invalid checkpoint (%s).', peer.hostname()); - - if (++this.headerFails < Pool.MAX_HEADER_FAILS) { - peer.destroy(); - return; - } - - this.logger.warning( - 'Switching to getblocks (%s).', - peer.hostname()); - - await this.switchSync(peer); + peer.destroy(); return; } checkpoint = true; @@ -2210,7 +2171,7 @@ Pool.prototype.handleSendHeaders = async function handleSendHeaders(peer, packet */ Pool.prototype.handleBlock = async function handleBlock(peer, packet) { - let flags = chainCommon.flags.DEFAULT_FLAGS; + const flags = chainCommon.flags.DEFAULT_FLAGS; if (this.options.spv) { this.logger.warning( @@ -2219,7 +2180,7 @@ Pool.prototype.handleBlock = async function handleBlock(peer, packet) { return; } - return await this.addBlock(peer, packet.block, flags); + await this.addBlock(peer, packet.block, flags); }; /** @@ -2232,8 +2193,8 @@ Pool.prototype.handleBlock = async function handleBlock(peer, packet) { */ Pool.prototype.addBlock = async function addBlock(peer, block, flags) { - let hash = block.hash('hex'); - let unlock = await this.locker.lock(hash); + const hash = block.hash('hex'); + const unlock = await this.locker.lock(hash); try { return await this._addBlock(peer, block, flags); } finally { @@ -2250,13 +2211,12 @@ Pool.prototype.addBlock = async function addBlock(peer, block, flags) { * @returns {Promise} */ -Pool.prototype._addBlock = async function addBlock(peer, block, flags) { - let hash = block.hash('hex'); - let entry; - +Pool.prototype._addBlock = async function _addBlock(peer, block, flags) { if (!this.syncing) return; + const hash = block.hash('hex'); + if (!this.resolveBlock(peer, hash)) { this.logger.warning( 'Received unrequested block: %s (%s).', @@ -2267,6 +2227,7 @@ Pool.prototype._addBlock = async function addBlock(peer, block, flags) { peer.blockTime = util.ms(); + let entry; try { entry = await this.chain.add(block, flags, peer.id); } catch (err) { @@ -2280,8 +2241,6 @@ Pool.prototype._addBlock = async function addBlock(peer, block, flags) { // Block was orphaned. if (!entry) { - let height; - if (this.checkpoints) { this.logger.warning( 'Peer sent orphan block with getheaders (%s).', @@ -2292,7 +2251,7 @@ Pool.prototype._addBlock = async function addBlock(peer, block, flags) { // During a getblocks sync, peers send // their best tip frequently. We can grab // the height commitment from the coinbase. - height = block.getCoinbaseHeight(); + const height = block.getCoinbaseHeight(); if (height !== -1) { peer.bestHash = hash; @@ -2328,8 +2287,6 @@ Pool.prototype._addBlock = async function addBlock(peer, block, flags) { */ Pool.prototype.resolveChain = async function resolveChain(peer, hash) { - let node = this.headerChain.head; - if (!this.checkpoints) return; @@ -2339,6 +2296,8 @@ Pool.prototype.resolveChain = async function resolveChain(peer, hash) { if (peer.destroyed) throw new Error('Peer was destroyed (header chain resolution).'); + const node = this.headerChain.head; + assert(node); if (hash !== node.hash) { @@ -2392,7 +2351,6 @@ Pool.prototype.switchSync = async function switchSync(peer, hash) { assert(this.checkpoints); this.checkpoints = false; - this.chain.checkpoints = false; this.headerTip = null; this.headerChain.reset(); this.headerNext = null; @@ -2410,7 +2368,7 @@ Pool.prototype.switchSync = async function switchSync(peer, hash) { */ Pool.prototype.handleBadOrphan = function handleBadOrphan(msg, err, id) { - let peer = this.peers.find(id); + const peer = this.peers.find(id); if (!peer) { this.logger.warning( @@ -2436,10 +2394,10 @@ Pool.prototype.handleBadOrphan = function handleBadOrphan(msg, err, id) { Pool.prototype.logStatus = function logStatus(block) { if (this.chain.height % 20 === 0) { this.logger.debug('Status:' - + ' ts=%s height=%d progress=%s' + + ' time=%s height=%d progress=%s' + ' orphans=%d active=%d' + ' target=%s peers=%d', - util.date(block.ts), + util.date(block.time), this.chain.height, (this.chain.getProgress() * 100).toFixed(2) + '%', this.chain.orphanMap.size, @@ -2466,8 +2424,8 @@ Pool.prototype.logStatus = function logStatus(block) { */ Pool.prototype.handleTX = async function handleTX(peer, packet) { - let hash = packet.tx.hash('hex'); - let unlock = await this.locker.lock(hash); + const hash = packet.tx.hash('hex'); + const unlock = await this.locker.lock(hash); try { return await this._handleTX(peer, packet); } finally { @@ -2484,12 +2442,11 @@ Pool.prototype.handleTX = async function handleTX(peer, packet) { * @returns {Promise} */ -Pool.prototype._handleTX = async function handleTX(peer, packet) { - let tx = packet.tx; - let hash = tx.hash('hex'); - let flags = chainCommon.flags.VERIFY_NONE; - let block = peer.merkleBlock; - let missing; +Pool.prototype._handleTX = async function _handleTX(peer, packet) { + const tx = packet.tx; + const hash = tx.hash('hex'); + const flags = chainCommon.flags.VERIFY_NONE; + const block = peer.merkleBlock; if (block) { assert(peer.merkleMatches > 0); @@ -2506,7 +2463,7 @@ Pool.prototype._handleTX = async function handleTX(peer, packet) { peer.merkleMap.add(hash); - block.addTX(tx); + block.txs.push(tx); if (--peer.merkleMatches === 0) { peer.merkleBlock = null; @@ -2533,6 +2490,7 @@ Pool.prototype._handleTX = async function handleTX(peer, packet) { return; } + let missing; try { missing = await this.mempool.addTX(tx, peer.id); } catch (err) { @@ -2562,8 +2520,6 @@ Pool.prototype._handleTX = async function handleTX(peer, packet) { */ Pool.prototype.handleReject = async function handleReject(peer, packet) { - let entry; - this.logger.warning( 'Received reject (%s): msg=%s code=%s reason=%s hash=%s.', peer.hostname(), @@ -2575,7 +2531,7 @@ Pool.prototype.handleReject = async function handleReject(peer, packet) { if (!packet.hash) return; - entry = this.invMap.get(packet.hash); + const entry = this.invMap.get(packet.hash); if (!entry) return; @@ -2592,8 +2548,6 @@ Pool.prototype.handleReject = async function handleReject(peer, packet) { */ Pool.prototype.handleMempool = async function handleMempool(peer, packet) { - let items = []; - if (!this.mempool) return; @@ -2611,7 +2565,9 @@ Pool.prototype.handleMempool = async function handleMempool(peer, packet) { return; } - for (let hash of this.mempool.map.keys()) + const items = []; + + for (const hash of this.mempool.map.keys()) items.push(new InvItem(invTypes.TX, hash)); this.logger.debug( @@ -2666,8 +2622,8 @@ Pool.prototype.handleFilterClear = async function handleFilterClear(peer, packet */ Pool.prototype.handleMerkleBlock = async function handleMerkleBlock(peer, packet) { - let hash = packet.block.hash('hex'); - let unlock = await this.locker.lock(hash); + const hash = packet.block.hash('hex'); + const unlock = await this.locker.lock(hash); try { return await this._handleMerkleBlock(peer, packet); } finally { @@ -2683,11 +2639,7 @@ Pool.prototype.handleMerkleBlock = async function handleMerkleBlock(peer, packet * @param {MerkleBlockPacket} block */ -Pool.prototype._handleMerkleBlock = async function handleMerkleBlock(peer, packet) { - let block = packet.block; - let hash = block.hash('hex'); - let flags = chainCommon.flags.VERIFY_NONE; - +Pool.prototype._handleMerkleBlock = async function _handleMerkleBlock(peer, packet) { if (!this.syncing) return; @@ -2700,6 +2652,9 @@ Pool.prototype._handleMerkleBlock = async function handleMerkleBlock(peer, packe return; } + const block = packet.block; + const hash = block.hash('hex'); + if (!peer.blockMap.has(hash)) { this.logger.warning( 'Peer sent an unrequested merkleblock (%s).', @@ -2724,14 +2679,17 @@ Pool.prototype._handleMerkleBlock = async function handleMerkleBlock(peer, packe return; } - if (block.tree.matches.length === 0) { + const tree = block.getTree(); + + if (tree.matches.length === 0) { + const flags = chainCommon.flags.VERIFY_NONE; await this._addBlock(peer, block, flags); return; } peer.merkleBlock = block; peer.merkleTime = util.ms(); - peer.merkleMatches = block.tree.matches.length; + peer.merkleMatches = tree.matches.length; peer.merkleMap = new Set(); }; @@ -2768,11 +2726,9 @@ Pool.prototype.handleSendCmpct = async function handleSendCmpct(peer, packet) { */ Pool.prototype.handleCmpctBlock = async function handleCmpctBlock(peer, packet) { - let block = packet.block; - let hash = block.hash('hex'); - let witness = peer.compactWitness; - let flags = chainCommon.flags.VERIFY_BODY; - let result; + const block = packet.block; + const hash = block.hash('hex'); + const witness = peer.compactWitness; if (!this.syncing) return; @@ -2833,6 +2789,7 @@ Pool.prototype.handleCmpctBlock = async function handleCmpctBlock(peer, packet) return; } + let result; try { result = block.init(); } catch (e) { @@ -2852,12 +2809,13 @@ Pool.prototype.handleCmpctBlock = async function handleCmpctBlock(peer, packet) return; } - result = block.fillMempool(witness, this.mempool); + const full = block.fillMempool(witness, this.mempool); - if (result) { + if (full) { this.logger.debug( 'Received full compact block %s (%s).', block.rhash(), peer.hostname()); + const flags = chainCommon.flags.VERIFY_BODY; await this.addBlock(peer, block.toBlock(), flags); return; } @@ -2893,8 +2851,7 @@ Pool.prototype.handleCmpctBlock = async function handleCmpctBlock(peer, packet) */ Pool.prototype.handleGetBlockTxn = async function handleGetBlockTxn(peer, packet) { - let req = packet.request; - let res, item, block, height; + const req = packet.request; if (this.chain.options.spv) return; @@ -2905,9 +2862,9 @@ Pool.prototype.handleGetBlockTxn = async function handleGetBlockTxn(peer, packet if (this.options.selfish) return; - item = new InvItem(invTypes.BLOCK, req.hash); + const item = new InvItem(invTypes.BLOCK, req.hash); - block = await this.getItem(peer, item); + const block = await this.getItem(peer, item); if (!block) { this.logger.debug( @@ -2917,7 +2874,7 @@ Pool.prototype.handleGetBlockTxn = async function handleGetBlockTxn(peer, packet return; } - height = await this.chain.db.getHeight(req.hash); + const height = await this.chain.db.getHeight(req.hash); if (height < this.chain.tip.height - 15) { this.logger.debug( @@ -2931,7 +2888,7 @@ Pool.prototype.handleGetBlockTxn = async function handleGetBlockTxn(peer, packet block.rhash(), peer.hostname()); - res = BIP152.TXResponse.fromBlock(block, req); + const res = BIP152.TXResponse.fromBlock(block, req); peer.send(new packets.BlockTxnPacket(res, peer.compactWitness)); }; @@ -2945,9 +2902,9 @@ Pool.prototype.handleGetBlockTxn = async function handleGetBlockTxn(peer, packet */ Pool.prototype.handleBlockTxn = async function handleBlockTxn(peer, packet) { - let res = packet.response; - let block = peer.compactBlocks.get(res.hash); - let flags = chainCommon.flags.VERIFY_BODY; + const res = packet.response; + const block = peer.compactBlocks.get(res.hash); + const flags = chainCommon.flags.VERIFY_BODY; if (!block) { this.logger.debug( @@ -3059,14 +3016,12 @@ Pool.prototype.handleUnknown = async function handleUnknown(peer, packet) { */ Pool.prototype.addInbound = function addInbound(socket) { - let peer; - if (!this.loaded) { socket.destroy(); return; } - peer = this.createInbound(socket); + const peer = this.createInbound(socket); this.logger.info('Added inbound peer (%s).', peer.hostname()); @@ -3079,24 +3034,23 @@ Pool.prototype.addInbound = function addInbound(socket) { */ Pool.prototype.getHost = function getHost() { - let services = this.options.getRequiredServices(); - let now = this.network.now(); - - for (let addr of this.hosts.nodes) { + for (const addr of this.hosts.nodes) { if (this.peers.has(addr.hostname)) continue; return addr; } + const services = this.options.getRequiredServices(); + const now = this.network.now(); + for (let i = 0; i < 100; i++) { - let entry = this.hosts.getHost(); - let addr; + const entry = this.hosts.getHost(); if (!entry) break; - addr = entry.addr; + const addr = entry.addr; if (this.peers.has(addr.hostname)) continue; @@ -3121,6 +3075,8 @@ Pool.prototype.getHost = function getHost() { return entry.addr; } + + return null; }; /** @@ -3130,8 +3086,6 @@ Pool.prototype.getHost = function getHost() { */ Pool.prototype.addOutbound = function addOutbound() { - let peer, addr; - if (!this.loaded) return; @@ -3143,12 +3097,12 @@ Pool.prototype.addOutbound = function addOutbound() { if (!this.peers.load) return; - addr = this.getHost(); + const addr = this.getHost(); if (!addr) return; - peer = this.createOutbound(addr); + const peer = this.createOutbound(addr); this.peers.add(peer); @@ -3161,7 +3115,7 @@ Pool.prototype.addOutbound = function addOutbound() { */ Pool.prototype.fillOutbound = function fillOutbound() { - let need = this.options.maxOutbound - this.peers.outbound; + const need = this.options.maxOutbound - this.peers.outbound; if (!this.peers.load) this.addLoader(); @@ -3201,13 +3155,13 @@ Pool.prototype.refill = function refill() { Pool.prototype.removePeer = function removePeer(peer) { this.peers.remove(peer); - for (let hash of peer.blockMap.keys()) + for (const hash of peer.blockMap.keys()) this.resolveBlock(peer, hash); - for (let hash of peer.txMap.keys()) + for (const hash of peer.txMap.keys()) this.resolveTX(peer, hash); - for (let hash of peer.compactBlocks.keys()) { + for (const hash of peer.compactBlocks.keys()) { assert(this.compactBlocks.has(hash)); this.compactBlocks.delete(hash); } @@ -3221,7 +3175,7 @@ Pool.prototype.removePeer = function removePeer(peer) { */ Pool.prototype.ban = function ban(addr) { - let peer = this.peers.get(addr.hostname); + const peer = this.peers.get(addr.hostname); this.logger.debug('Banning peer (%s).', addr.hostname); @@ -3318,7 +3272,7 @@ Pool.prototype.sendFilterLoad = function sendFilterLoad() { */ Pool.prototype.watchAddress = function watchAddress(address) { - let hash = Address.getHash(address); + const hash = Address.getHash(address); this.watch(hash); }; @@ -3341,8 +3295,8 @@ Pool.prototype.watchOutpoint = function watchOutpoint(outpoint) { */ Pool.prototype.resolveOrphan = async function resolveOrphan(peer, orphan) { - let locator = await this.chain.getLocator(); - let root = this.chain.getOrphanRoot(orphan); + const locator = await this.chain.getLocator(); + const root = this.chain.getOrphanRoot(orphan); assert(root); @@ -3359,7 +3313,7 @@ Pool.prototype.resolveOrphan = async function resolveOrphan(peer, orphan) { */ Pool.prototype.getHeaders = async function getHeaders(peer, tip, stop) { - let locator = await this.chain.getLocator(tip); + const locator = await this.chain.getLocator(tip); peer.sendGetHeaders(locator, stop); }; @@ -3373,7 +3327,7 @@ Pool.prototype.getHeaders = async function getHeaders(peer, tip, stop) { */ Pool.prototype.getBlocks = async function getBlocks(peer, tip, stop) { - let locator = await this.chain.getLocator(tip); + const locator = await this.chain.getLocator(tip); peer.sendGetBlocks(locator, stop); }; @@ -3384,9 +3338,6 @@ Pool.prototype.getBlocks = async function getBlocks(peer, tip, stop) { */ Pool.prototype.getBlock = function getBlock(peer, hashes) { - let now = util.ms(); - let items = []; - if (!this.loaded) return; @@ -3396,7 +3347,10 @@ Pool.prototype.getBlock = function getBlock(peer, hashes) { if (peer.destroyed) throw new Error('Peer is destroyed (getdata).'); - for (let hash of hashes) { + let now = util.ms(); + const items = []; + + for (const hash of hashes) { if (this.blockMap.has(hash)) continue; @@ -3428,9 +3382,6 @@ Pool.prototype.getBlock = function getBlock(peer, hashes) { */ Pool.prototype.getTX = function getTX(peer, hashes) { - let now = util.ms(); - let items = []; - if (!this.loaded) return; @@ -3440,7 +3391,10 @@ Pool.prototype.getTX = function getTX(peer, hashes) { if (peer.destroyed) throw new Error('Peer is destroyed (getdata).'); - for (let hash of hashes) { + let now = util.ms(); + const items = []; + + for (const hash of hashes) { if (this.txMap.has(hash)) continue; @@ -3522,9 +3476,9 @@ Pool.prototype.hasTX = function hasTX(hash) { */ Pool.prototype.ensureTX = function ensureTX(peer, hashes) { - let items = []; + const items = []; - for (let hash of hashes) { + for (const hash of hashes) { if (this.hasTX(hash)) continue; @@ -3596,7 +3550,7 @@ Pool.prototype.resolveItem = function resolveItem(peer, item) { */ Pool.prototype.broadcast = function broadcast(msg) { - let hash = msg.hash('hex'); + const hash = msg.hash('hex'); let item = this.invMap.get(hash); if (item) { @@ -3765,15 +3719,14 @@ PoolOptions.prototype.fromOptions = function fromOptions(options) { if (options.host != null) { assert(typeof options.host === 'string'); - let raw = IP.toBuffer(options.host); + const raw = IP.toBuffer(options.host); this.host = IP.toString(raw); if (IP.isRoutable(raw)) this.publicHost = this.host; } if (options.port != null) { - assert(typeof options.port === 'number'); - assert(options.port > 0 && options.port <= 0xffff); + assert(util.isU16(options.port)); this.port = options.port; this.publicPort = options.port; } @@ -3784,8 +3737,7 @@ PoolOptions.prototype.fromOptions = function fromOptions(options) { } if (options.publicPort != null) { - assert(typeof options.publicPort === 'number'); - assert(options.publicPort > 0 && options.publicPort <= 0xffff); + assert(util.isU16(options.publicPort)); this.publicPort = options.publicPort; } @@ -3946,12 +3898,12 @@ PoolOptions.prototype.fromOptions = function fromOptions(options) { this.listen = false; if (options.services != null) { - assert(util.isUInt32(options.services)); + assert(util.isU32(options.services)); this.services = options.services; } if (options.requiredServices != null) { - assert(util.isUInt32(options.requiredServices)); + assert(util.isU32(options.requiredServices)); this.requiredServices = options.requiredServices; } @@ -4041,12 +3993,10 @@ PoolOptions.prototype.hasNonce = function hasNonce(nonce) { */ PoolOptions.prototype.getRate = function getRate(hash) { - let entry; - if (!this.mempool) return -1; - entry = this.mempool.getEntry(hash); + const entry = this.mempool.getEntry(hash); if (!entry) return -1; @@ -4062,7 +4012,7 @@ PoolOptions.prototype.getRate = function getRate(hash) { * @returns {net.Socket} */ -PoolOptions.prototype._createSocket = function createSocket(port, host) { +PoolOptions.prototype._createSocket = function _createSocket(port, host) { return tcp.createSocket(port, host, this.proxy); }; @@ -4073,7 +4023,7 @@ PoolOptions.prototype._createSocket = function createSocket(port, host) { * @returns {String[]} */ -PoolOptions.prototype._resolve = function resolve(name) { +PoolOptions.prototype._resolve = function _resolve(name) { if (this.onion) return dns.lookup(name, this.proxy); @@ -4225,14 +4175,12 @@ PeerList.prototype.destroy = function destroy() { */ function BroadcastItem(pool, msg) { - let item; - if (!(this instanceof BroadcastItem)) return new BroadcastItem(pool, msg); assert(!msg.mutable, 'Cannot broadcast mutable item.'); - item = msg.toInv(); + const item = msg.toInv(); this.pool = pool; this.hash = item.hash; @@ -4241,7 +4189,7 @@ function BroadcastItem(pool, msg) { this.jobs = []; } -util.inherits(BroadcastItem, EventEmitter); +Object.setPrototypeOf(BroadcastItem.prototype, EventEmitter.prototype); /** * Add a job to be executed on ack, timeout, or reject. @@ -4323,7 +4271,7 @@ BroadcastItem.prototype.cleanup = function cleanup() { BroadcastItem.prototype.reject = function reject(err) { this.cleanup(); - for (let job of this.jobs) + for (const job of this.jobs) job.reject(err); this.jobs.length = 0; @@ -4336,7 +4284,7 @@ BroadcastItem.prototype.reject = function reject(err) { BroadcastItem.prototype.resolve = function resolve() { this.cleanup(); - for (let job of this.jobs) + for (const job of this.jobs) job.resolve(false); this.jobs.length = 0; @@ -4351,7 +4299,7 @@ BroadcastItem.prototype.handleAck = function handleAck(peer) { setTimeout(() => { this.emit('ack', peer); - for (let job of this.jobs) + for (const job of this.jobs) job.resolve(true); this.jobs.length = 0; @@ -4366,7 +4314,7 @@ BroadcastItem.prototype.handleAck = function handleAck(peer) { BroadcastItem.prototype.handleReject = function handleReject(peer) { this.emit('reject', peer); - for (let job of this.jobs) + for (const job of this.jobs) job.resolve(false); this.jobs.length = 0; @@ -4378,8 +4326,8 @@ BroadcastItem.prototype.handleReject = function handleReject(peer) { */ BroadcastItem.prototype.inspect = function inspect() { - let type = this.type === invTypes.TX ? 'tx' : 'block'; - let hash = util.revHex(this.hash); + const type = this.type === invTypes.TX ? 'tx' : 'block'; + const hash = util.revHex(this.hash); return ``; }; @@ -4395,29 +4343,29 @@ function NonceList() { } NonceList.prototype.alloc = function alloc(hostname) { - let nonce, key; - for (;;) { - nonce = util.nonce(); - key = nonce.toString('hex'); - if (!this.map.has(key)) { - this.map.set(key, hostname); - assert(!this.hosts.has(hostname)); - this.hosts.set(hostname, key); - break; - } - } + const nonce = util.nonce(); + const key = nonce.toString('hex'); + + if (this.map.has(key)) + continue; - return nonce; + this.map.set(key, hostname); + + assert(!this.hosts.has(hostname)); + this.hosts.set(hostname, key); + + return nonce; + } }; NonceList.prototype.has = function has(nonce) { - let key = nonce.toString('hex'); + const key = nonce.toString('hex'); return this.map.has(key); }; NonceList.prototype.remove = function remove(hostname) { - let key = this.hosts.get(hostname); + const key = this.hosts.get(hostname); if (!key) return false; diff --git a/lib/net/proxysocket.js b/lib/net/proxysocket.js index db4d6249b..80f91641f 100644 --- a/lib/net/proxysocket.js +++ b/lib/net/proxysocket.js @@ -36,7 +36,7 @@ function ProxySocket(uri) { this._init(); } -util.inherits(ProxySocket, EventEmitter); +Object.setPrototypeOf(ProxySocket.prototype, EventEmitter.prototype); ProxySocket.prototype._init = function _init() { this.socket.on('info', (info) => { @@ -83,7 +83,7 @@ ProxySocket.prototype._init = function _init() { }); this.socket.on('tcp error', (e) => { - let err = new Error(e.message); + const err = new Error(e.message); err.code = e.code; this.emit('error', err); }); @@ -101,8 +101,6 @@ ProxySocket.prototype._init = function _init() { }; ProxySocket.prototype.connect = function connect(port, host) { - let nonce = 0; - this.remoteAddress = host; this.remotePort = port; @@ -116,14 +114,17 @@ ProxySocket.prototype.connect = function connect(port, host) { return; } + let nonce = 0; + if (this.info.pow) { - let pow = new BufferWriter(); + const bw = new BufferWriter(); + + bw.writeU32(nonce); + bw.writeBytes(this.snonce); + bw.writeU32(port); + bw.writeString(host, 'ascii'); - pow.writeU32(nonce); - pow.writeBytes(this.snonce); - pow.writeU32(port); - pow.writeString(host, 'ascii'); - pow = pow.render(); + const pow = bw.render(); util.log( 'Solving proof of work to create socket (%d, %s) -- please wait.', @@ -140,7 +141,7 @@ ProxySocket.prototype.connect = function connect(port, host) { this.socket.emit('tcp connect', port, host, nonce); - for (let chunk of this.sendBuffer) + for (const chunk of this.sendBuffer) this.write(chunk); this.sendBuffer.length = 0; @@ -185,12 +186,12 @@ ProxySocket.prototype.pause = function pause() { }; ProxySocket.prototype.resume = function resume() { - let recv = this.recvBuffer; + const recv = this.recvBuffer; this.paused = false; this.recvBuffer = []; - for (let data of recv) { + for (const data of recv) { this.bytesRead += data.length; this.emit('data', data); } @@ -204,7 +205,7 @@ ProxySocket.prototype.destroy = function destroy() { }; ProxySocket.connect = function connect(uri, port, host) { - let socket = new ProxySocket(uri); + const socket = new ProxySocket(uri); socket.connect(port, host); return socket; }; diff --git a/lib/net/socks.js b/lib/net/socks.js index 86852dbe0..e0282fa5e 100644 --- a/lib/net/socks.js +++ b/lib/net/socks.js @@ -42,7 +42,7 @@ function SOCKS() { this.proxied = false; } -util.inherits(SOCKS, EventEmitter); +Object.setPrototypeOf(SOCKS.prototype, EventEmitter.prototype); SOCKS.states = { INIT: 0, @@ -55,7 +55,7 @@ SOCKS.states = { RESOLVE_DONE: 7 }; -SOCKS.statesByVal = util.revMap(SOCKS.states); +SOCKS.statesByVal = util.reverse(SOCKS.states); SOCKS.errors = [ '', @@ -71,8 +71,6 @@ SOCKS.errors = [ ]; SOCKS.prototype.error = function error(err) { - let msg; - if (this.destroyed) return; @@ -82,7 +80,7 @@ SOCKS.prototype.error = function error(err) { return; } - msg = util.fmt.apply(util, arguments); + const msg = util.fmt.apply(util, arguments); this.emit('error', new Error(msg)); this.destroy(); }; @@ -111,7 +109,7 @@ SOCKS.prototype.destroy = function destroy() { SOCKS.prototype.startTimeout = function startTimeout() { this.timeout = setTimeout(() => { - let state = SOCKS.statesByVal[this.state]; + const state = SOCKS.statesByVal[this.state]; this.timeout = null; this.error('SOCKS request timed out (state=%s).', state); }, 8000); @@ -210,7 +208,7 @@ SOCKS.prototype.handleError = function handleError(err) { SOCKS.prototype.handleClose = function handleClose() { if (this.state !== this.target) { - let state = SOCKS.statesByVal[this.state]; + const state = SOCKS.statesByVal[this.state]; this.error('SOCKS request destroyed (state=%s).', state); return; } @@ -298,9 +296,8 @@ SOCKS.prototype.handleHandshake = function handleHandshake(data) { }; SOCKS.prototype.sendAuth = function sendAuth() { - let user = this.username; - let pass = this.password; - let ulen, plen, size, packet; + const user = this.username; + const pass = this.password; if (!user) { this.error('No username passed for SOCKS auth.'); @@ -312,17 +309,19 @@ SOCKS.prototype.sendAuth = function sendAuth() { return; } - ulen = Buffer.byteLength(user, 'ascii'); - plen = Buffer.byteLength(pass, 'ascii'); - size = 3 + ulen + plen; + const ulen = Buffer.byteLength(user, 'ascii'); + const plen = Buffer.byteLength(pass, 'ascii'); + const size = 3 + ulen + plen; + + const bw = new StaticWriter(size); + + bw.writeU8(0x01); + bw.writeU8(ulen); + bw.writeString(user, 'ascii'); + bw.writeU8(plen); + bw.writeString(pass, 'ascii'); - packet = new StaticWriter(size); - packet.writeU8(0x01); - packet.writeU8(ulen); - packet.writeString(user, 'ascii'); - packet.writeU8(plen); - packet.writeString(pass, 'ascii'); - packet = packet.render(); + const packet = bw.render(); this.state = SOCKS.states.AUTH; this.socket.write(packet); @@ -364,9 +363,9 @@ SOCKS.prototype.auth = function auth() { }; SOCKS.prototype.sendProxy = function sendProxy() { - let host = this.destHost; - let port = this.destPort; - let ip, len, type, name, packet; + const host = this.destHost; + const port = this.destPort; + let ip, len, type, name; switch (IP.getStringType(host)) { case IP.types.IPV4: @@ -388,28 +387,26 @@ SOCKS.prototype.sendProxy = function sendProxy() { break; } - packet = new StaticWriter(6 + len); + const bw = new StaticWriter(6 + len); - packet.writeU8(0x05); - packet.writeU8(0x01); - packet.writeU8(0x00); - packet.writeU8(type); + bw.writeU8(0x05); + bw.writeU8(0x01); + bw.writeU8(0x00); + bw.writeU8(type); if (type === 0x03) - packet.writeU8(name.length); + bw.writeU8(name.length); - packet.writeBytes(name); - packet.writeU16BE(port); + bw.writeBytes(name); + bw.writeU16BE(port); - packet = packet.render(); + const packet = bw.render(); this.state = SOCKS.states.PROXY; this.socket.write(packet); }; SOCKS.prototype.handleProxy = function handleProxy(data) { - let addr; - if (data.length < 6) { this.error('Bad packet size for SOCKS connect.'); return; @@ -421,7 +418,7 @@ SOCKS.prototype.handleProxy = function handleProxy(data) { } if (data[1] !== 0x00) { - let msg = this.getError(data[1]); + const msg = this.getError(data[1]); this.error('SOCKS connect error: %s.', msg); return; } @@ -431,6 +428,7 @@ SOCKS.prototype.handleProxy = function handleProxy(data) { return; } + let addr; try { addr = parseAddr(data, 3); } catch (e) { @@ -447,26 +445,26 @@ SOCKS.prototype.handleProxy = function handleProxy(data) { }; SOCKS.prototype.sendResolve = function sendResolve() { - let name = this.name; - let len = Buffer.byteLength(name, 'utf8'); - let packet = new StaticWriter(7 + len); - - packet.writeU8(0x05); - packet.writeU8(0xf0); - packet.writeU8(0x00); - packet.writeU8(0x03); - packet.writeU8(len); - packet.writeString(name, 'utf8'); - packet.writeU16BE(0); - packet = packet.render(); + const name = this.name; + const len = Buffer.byteLength(name, 'utf8'); + + const bw = new StaticWriter(7 + len); + + bw.writeU8(0x05); + bw.writeU8(0xf0); + bw.writeU8(0x00); + bw.writeU8(0x03); + bw.writeU8(len); + bw.writeString(name, 'utf8'); + bw.writeU16BE(0); + + const packet = bw.render(); this.state = SOCKS.states.RESOLVE; this.socket.write(packet); }; SOCKS.prototype.handleResolve = function handleResolve(data) { - let addr; - if (data.length < 6) { this.error('Bad packet size for tor resolve.'); return; @@ -478,7 +476,7 @@ SOCKS.prototype.handleResolve = function handleResolve(data) { } if (data[1] !== 0x00) { - let msg = this.getError(data[1]); + const msg = this.getError(data[1]); this.error('Tor resolve error: %s (%s).', msg, this.name); return; } @@ -488,6 +486,7 @@ SOCKS.prototype.handleResolve = function handleResolve(data) { return; } + let addr; try { addr = parseAddr(data, 3); } catch (e) { @@ -507,7 +506,7 @@ SOCKS.prototype.handleResolve = function handleResolve(data) { }; SOCKS.resolve = function resolve(options) { - let socks = new SOCKS(); + const socks = new SOCKS(); return new Promise((resolve, reject) => { socks.resolve(options); socks.on('resolve', resolve); @@ -516,7 +515,7 @@ SOCKS.resolve = function resolve(options) { }; SOCKS.proxy = function proxy(options) { - let socks = new SOCKS(); + const socks = new SOCKS(); return new Promise((resolve, reject) => { socks.proxy(options); socks.on('proxy', resolve); @@ -554,14 +553,12 @@ function Proxy(host, port, user, pass) { this.ops = []; } -util.inherits(Proxy, EventEmitter); +Object.setPrototypeOf(Proxy.prototype, EventEmitter.prototype); Proxy.prototype.connect = async function connect(port, host) { - let options, socket; - assert(!this.socket, 'Already connected.'); - options = { + const options = { host: this.host, port: this.port, username: this.username, @@ -570,6 +567,7 @@ Proxy.prototype.connect = async function connect(port, host) { destPort: port }; + let socket; try { socket = await SOCKS.proxy(options); } catch (e) { @@ -602,7 +600,7 @@ Proxy.prototype.connect = async function connect(port, host) { this.emit('timeout'); }); - for (let op of this.ops) + for (const op of this.ops) op.call(this); this.ops.length = 0; @@ -664,7 +662,7 @@ Proxy.prototype.resume = function resume() { Proxy.prototype.destroy = function destroy() { if (!this.socket) return; - return this.socket.destroy(); + this.socket.destroy(); }; /* @@ -672,24 +670,23 @@ Proxy.prototype.destroy = function destroy() { */ function parseProxy(host) { - let index = host.indexOf('@'); - let addr, left, right, parts; + const index = host.indexOf('@'); if (index === -1) { - let addr = IP.fromHostname(host, 1080); + const addr = IP.fromHostname(host, 1080); return { host: addr.host, port: addr.port }; } - left = host.substring(0, index); - right = host.substring(index + 1); + const left = host.substring(0, index); + const right = host.substring(index + 1); - parts = left.split(':'); + const parts = left.split(':'); assert(parts.length > 1, 'Bad username and password.'); - addr = IP.fromHostname(right, 1080); + const addr = IP.fromHostname(right, 1080); return { host: addr.host, @@ -700,26 +697,27 @@ function parseProxy(host) { } function parseAddr(data, offset) { - let br = new BufferReader(data); - let type, len, host, port; + const br = new BufferReader(data); if (br.left() < offset + 2) throw new Error('Bad SOCKS address length.'); br.seek(offset); - type = br.readU8(); + const type = br.readU8(); + let host, port; switch (type) { - case 0x01: + case 0x01: { if (br.left() < 6) throw new Error('Bad SOCKS ipv4 length.'); host = IP.toString(br.readBytes(4)); port = br.readU16BE(); break; - case 0x03: - len = br.readU8(); + } + case 0x03: { + const len = br.readU8(); if (br.left() < len + 2) throw new Error('Bad SOCKS domain length.'); @@ -727,15 +725,18 @@ function parseAddr(data, offset) { host = br.readString(len, 'utf8'); port = br.readU16BE(); break; - case 0x04: + } + case 0x04: { if (br.left() < 18) throw new Error('Bad SOCKS ipv6 length.'); host = IP.toString(br.readBytes(16)); port = br.readU16BE(); break; - default: + } + default: { throw new Error(`Unknown SOCKS address type: ${type}.`); + } } return { @@ -750,21 +751,20 @@ function parseAddr(data, offset) { */ exports.connect = function connect(proxy, destPort, destHost) { - let addr = parseProxy(proxy); - let host = addr.host; - let port = addr.port; - let user = addr.username; - let pass = addr.password; - let socket; + const addr = parseProxy(proxy); + const host = addr.host; + const port = addr.port; + const user = addr.username; + const pass = addr.password; - socket = new Proxy(host, port, user, pass); + const socket = new Proxy(host, port, user, pass); socket.connect(destPort, destHost); return socket; }; exports.resolve = function resolve(proxy, name) { - let addr = parseProxy(proxy); + const addr = parseProxy(proxy); return SOCKS.resolve({ host: addr.host, port: addr.port, diff --git a/lib/net/tcp-browser.js b/lib/net/tcp-browser.js index 1bff94263..4bdd7644d 100644 --- a/lib/net/tcp-browser.js +++ b/lib/net/tcp-browser.js @@ -15,7 +15,7 @@ tcp.createSocket = function createSocket(port, host, proxy) { }; tcp.createServer = function createServer() { - let server = new EventEmitter(); + const server = new EventEmitter(); server.listen = async function listen(port, host) { server.emit('listening'); diff --git a/lib/net/tcp.js b/lib/net/tcp.js index f2c1b558e..2866e5539 100644 --- a/lib/net/tcp.js +++ b/lib/net/tcp.js @@ -4,6 +4,8 @@ * https://github.com/bcoin-org/bcoin */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; const EventEmitter = require('events'); @@ -36,8 +38,8 @@ tcp.createSocket = function createSocket(port, host, proxy) { */ tcp.createServer = function createServer() { - let server = new net.Server(); - let ee = new EventEmitter(); + const server = new net.Server(); + const ee = new EventEmitter(); ee.listen = function listen(port, host) { return new Promise((resolve, reject) => { @@ -59,13 +61,14 @@ tcp.createServer = function createServer() { return server.address(); }; - ee.__defineGetter__('maxConnections', function() { - return server.maxConnections; - }); - - ee.__defineSetter__('maxConnections', function(value) { - server.maxConnections = value; - return server.maxConnections; + Object.defineProperty(ee, 'maxConnections', { + get() { + return server.maxConnections; + }, + set(value) { + server.maxConnections = value; + return server.maxConnections; + } }); server.on('listening', () => { diff --git a/lib/net/upnp.js b/lib/net/upnp.js index f435385d1..7a8293ca1 100644 --- a/lib/net/upnp.js +++ b/lib/net/upnp.js @@ -69,7 +69,7 @@ UPNP.RESPONSE_TIMEOUT = 1000; */ UPNP.prototype.cleanupJob = function cleanupJob() { - let job = this.job; + const job = this.job; assert(this.socket); assert(this.job); @@ -91,7 +91,7 @@ UPNP.prototype.cleanupJob = function cleanupJob() { */ UPNP.prototype.rejectJob = function rejectJob(err) { - let job = this.cleanupJob(); + const job = this.cleanupJob(); job.reject(err); }; @@ -102,7 +102,7 @@ UPNP.prototype.rejectJob = function rejectJob(err) { */ UPNP.prototype.resolveJob = function resolveJob(result) { - let job = this.cleanupJob(); + const job = this.cleanupJob(); job.resolve(result); }; @@ -137,7 +137,7 @@ UPNP.prototype.stopTimeout = function stopTimeout() { */ UPNP.prototype.discover = async function discover() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._discover(); } finally { @@ -151,23 +151,22 @@ UPNP.prototype.discover = async function discover() { * @returns {Promise} Location string. */ -UPNP.prototype._discover = async function discover() { - let socket = dgram.createSocket('udp4'); - let msg; +UPNP.prototype._discover = async function _discover() { + const socket = dgram.createSocket('udp4'); socket.on('error', (err) => { this.rejectJob(err); }); socket.on('message', (data, rinfo) => { - let msg = data.toString('utf8'); + const msg = data.toString('utf8'); this.handleMsg(msg); }); this.socket = socket; this.startTimeout(); - msg = '' + const msg = '' + 'M-SEARCH * HTTP/1.1\r\n' + `HOST: ${this.host}:${this.port}\r\n` + 'MAN: ssdp:discover\r\n' @@ -189,11 +188,10 @@ UPNP.prototype._discover = async function discover() { */ UPNP.prototype.handleMsg = async function handleMsg(msg) { - let headers; - if (!this.socket) return; + let headers; try { headers = UPNP.parseHeader(msg); } catch (e) { @@ -217,25 +215,24 @@ UPNP.prototype.handleMsg = async function handleMsg(msg) { */ UPNP.prototype.resolve = async function resolve(location, targets) { - let host = parseHost(location); - let res, xml, services, service; + const host = parseHost(location); if (!targets) targets = UPNP.WAN_SERVICES; - res = await request({ + const res = await request({ method: 'GET', uri: location, timeout: UPNP.RESPONSE_TIMEOUT, expect: 'xml' }); - xml = XMLElement.fromRaw(res.body); + const xml = XMLElement.fromRaw(res.body); - services = parseServices(xml); + const services = parseServices(xml); assert(services.length > 0, 'No services found.'); - service = extractServices(services, targets); + const service = extractServices(services, targets); assert(service, 'No service found.'); assert(service.serviceId, 'No service ID found.'); assert(service.serviceId.length > 0, 'No service ID found.'); @@ -261,27 +258,25 @@ UPNP.prototype.resolve = async function resolve(location, targets) { */ UPNP.parseHeader = function parseHeader(str) { - let lines = str.split(/\r?\n/); - let headers = {}; + const lines = str.split(/\r?\n/); + const headers = Object.create(null); for (let line of lines) { - let index, left, right; - line = line.trim(); if (line.length === 0) continue; - index = line.indexOf(':'); + const index = line.indexOf(':'); if (index === -1) { - left = line.toLowerCase(); + const left = line.toLowerCase(); headers[left] = ''; continue; } - left = line.substring(0, index); - right = line.substring(index + 1); + let left = line.substring(0, index); + let right = line.substring(index + 1); left = left.trim(); right = right.trim(); @@ -304,9 +299,9 @@ UPNP.parseHeader = function parseHeader(str) { */ UPNP.discover = async function discover(host, port, gateway, targets) { - let upnp = new UPNP(host, port, gateway); - let location = await upnp.discover(); - let service = await upnp.resolve(location, targets); + const upnp = new UPNP(host, port, gateway); + const location = await upnp.discover(); + const service = await upnp.resolve(location, targets); return new UPNPService(service); }; @@ -337,10 +332,10 @@ function UPNPService(options) { */ UPNPService.prototype.createRequest = function createRequest(action, args) { - let type = JSON.stringify(this.serviceType); + const type = JSON.stringify(this.serviceType); let params = ''; - for (let [key, value] of args) { + for (const [key, value] of args) { params += `<${key}>`; if (value != null) params += value; @@ -369,26 +364,25 @@ UPNPService.prototype.createRequest = function createRequest(action, args) { */ UPNPService.prototype.soapRequest = async function soapRequest(action, args) { - let type = this.serviceType; - let req = this.createRequest(action, args); - let res, xml, err; + const type = this.serviceType; + const req = this.createRequest(action, args); - res = await request({ + const res = await request({ method: 'POST', uri: this.controlURL, timeout: UPNP.RESPONSE_TIMEOUT, expect: 'xml', headers: { 'Content-Type': 'text/xml; charset="utf-8"', - 'Content-Length': Buffer.byteLength(req, 'utf8') + '', + 'Content-Length': Buffer.byteLength(req, 'utf8').toString(10), 'Connection': 'close', 'SOAPAction': JSON.stringify(`${type}#${action}`) }, body: req }); - xml = XMLElement.fromRaw(res.body); - err = findError(xml); + const xml = XMLElement.fromRaw(res.body); + const err = findError(xml); if (err) throw err; @@ -402,9 +396,9 @@ UPNPService.prototype.soapRequest = async function soapRequest(action, args) { */ UPNPService.prototype.getExternalIP = async function getExternalIP() { - let action = 'GetExternalIPAddress'; - let xml = await this.soapRequest(action, []); - let ip = findIP(xml); + const action = 'GetExternalIPAddress'; + const xml = await this.soapRequest(action, []); + const ip = findIP(xml); if (!ip) throw new Error('Could not find external IP.'); @@ -421,14 +415,13 @@ UPNPService.prototype.getExternalIP = async function getExternalIP() { */ UPNPService.prototype.addPortMapping = async function addPortMapping(remote, src, dest) { - let action = 'AddPortMapping'; - let local = IP.getPrivate(); - let xml, child; + const action = 'AddPortMapping'; + const local = IP.getPrivate(); if (local.length === 0) throw new Error('Cannot determine local IP.'); - xml = await this.soapRequest(action, [ + const xml = await this.soapRequest(action, [ ['NewRemoteHost', remote], ['NewExternalPort', src], ['NewProtocol', 'TCP'], @@ -439,7 +432,7 @@ UPNPService.prototype.addPortMapping = async function addPortMapping(remote, src ['NewLeaseDuration', 0] ]); - child = xml.find('AddPortMappingResponse'); + const child = xml.find('AddPortMappingResponse'); if (!child) throw new Error('Port mapping failed.'); @@ -455,16 +448,15 @@ UPNPService.prototype.addPortMapping = async function addPortMapping(remote, src */ UPNPService.prototype.removePortMapping = async function removePortMapping(remote, port) { - let action = 'DeletePortMapping'; - let xml, child; + const action = 'DeletePortMapping'; - xml = await this.soapRequest(action, [ + const xml = await this.soapRequest(action, [ ['NewRemoteHost', remote], ['NewExternalPort', port], ['NewProtocol', 'TCP'] ]); - child = xml.find('DeletePortMappingResponse'); + const child = xml.find('DeletePortMappingResponse'); if (!child) throw new Error('Port unmapping failed.'); @@ -492,16 +484,17 @@ function XMLElement(name) { */ XMLElement.fromRaw = function fromRaw(xml) { - let sentinel = new XMLElement(''); + const sentinel = new XMLElement(''); + const stack = [sentinel]; + let current = sentinel; - let stack = []; let decl = false; - let m; - stack.push(sentinel); + while (xml.length > 0) { + let m; - while (xml.length) { - if (m = /^<\?xml[^<>]*\?>/i.exec(xml)) { + m = /^<\?xml[^<>]*\?>/i.exec(xml); + if (m) { xml = xml.substring(m[0].length); assert(current === sentinel, 'XML declaration inside element.'); assert(!decl, 'XML declaration seen twice.'); @@ -509,13 +502,14 @@ XMLElement.fromRaw = function fromRaw(xml) { continue; } - if (m = /^<([\w:]+)[^<>]*?(\/?)>/i.exec(xml)) { - let name = m[1]; - let trailing = m[2] === '/'; - let element = new XMLElement(name); - + m = /^<([\w:]+)[^<>]*?(\/?)>/i.exec(xml); + if (m) { xml = xml.substring(m[0].length); + const name = m[1]; + const trailing = m[2] === '/'; + const element = new XMLElement(name); + if (trailing) { current.add(element); continue; @@ -528,14 +522,15 @@ XMLElement.fromRaw = function fromRaw(xml) { continue; } - if (m = /^<\/([\w:]+)[^<>]*>/i.exec(xml)) { - let name = m[1]; - let element; - + m = /^<\/([\w:]+)[^<>]*>/i.exec(xml); + if (m) { xml = xml.substring(m[0].length); + const name = m[1]; + assert(stack.length !== 1, 'No start tag.'); - element = stack.pop(); + + const element = stack.pop(); assert(element.name === name, 'Tag mismatch.'); current = stack[stack.length - 1]; @@ -546,9 +541,10 @@ XMLElement.fromRaw = function fromRaw(xml) { continue; } - if (m = /^([^<]+)/i.exec(xml)) { - let text = m[1]; + m = /^([^<]+)/i.exec(xml); + if (m) { xml = xml.substring(m[0].length); + const text = m[1]; current.text = text.trim(); continue; } @@ -590,7 +586,7 @@ XMLElement.prototype.collect = function collect(name) { */ XMLElement.prototype._collect = function _collect(name, result) { - for (let child of this.children) { + for (const child of this.children) { if (child.type === name) { result.push(child); continue; @@ -618,6 +614,8 @@ XMLElement.prototype.find = function find(name) { if (child) return child; } + + return null; }; /* @@ -625,19 +623,19 @@ XMLElement.prototype.find = function find(name) { */ function parseServices(el) { - let children = el.collect('service'); - let services = []; + const children = el.collect('service'); + const services = []; - for (let child of children) + for (const child of children) services.push(parseService(child)); return services; } function parseService(el) { - let service = {}; + const service = Object.create(null); - for (let child of el.children) { + for (const child of el.children) { if (child.children.length > 0) continue; @@ -648,43 +646,47 @@ function parseService(el) { } function findService(services, name) { - for (let service of services) { + for (const service of services) { if (service.serviceType === name) return service; } + + return null; } function extractServices(services, targets) { - for (let name of targets) { - let service = findService(services, name); + for (const name of targets) { + const service = findService(services, name); if (service) return service; } + + return null; } function findIP(el) { - let child = el.find('NewExternalIPAddress'); + const child = el.find('NewExternalIPAddress'); if (!child) - return; + return null; return IP.normalize(child.text); } function findError(el) { - let child = el.find('UPnPError'); - let code = -1; - let desc = 'Unknown'; - let ccode, cdesc; + const child = el.find('UPnPError'); if (!child) - return; + return null; - ccode = child.find('errorCode'); - cdesc = child.find('errorDescription'); + let code = -1; + const ccode = child.find('errorCode'); if (ccode && /^\d+$/.test(ccode.text)) - code = +ccode.text; + code = parseInt(ccode.text, 10); + + let desc = 'Unknown'; + const cdesc = child.find('errorDescription'); if (cdesc) desc = cdesc.text; @@ -697,7 +699,7 @@ function findError(el) { */ function parseHost(uri) { - let {protocol, host} = url.parse(uri); + const {protocol, host} = url.parse(uri); assert(protocol === 'http:' || protocol === 'https:', 'Bad URL for location.'); diff --git a/lib/node/config.js b/lib/node/config.js index af227a22b..549fffb9c 100644 --- a/lib/node/config.js +++ b/lib/node/config.js @@ -7,9 +7,10 @@ 'use strict'; const assert = require('assert'); -const path = require('path'); +const Path = require('path'); const os = require('os'); const fs = require('../utils/fs'); +const util = require('../utils/util'); const HOME = os.homedir ? os.homedir() : '/'; /** @@ -28,13 +29,14 @@ function Config(module) { this.module = module; this.network = 'main'; - this.prefix = path.join(HOME, `.${module}`); + this.prefix = Path.join(HOME, `.${module}`); this.options = Object.create(null); this.data = Object.create(null); this.env = Object.create(null); this.args = Object.create(null); this.argv = []; + this.pass = []; this.query = Object.create(null); this.hash = Object.create(null); } @@ -45,16 +47,9 @@ function Config(module) { */ Config.alias = { - conf: {}, - env: { - 'seed': 'seeds', - 'node': 'nodes' - }, - arg: { - 'seed': 'seeds', - 'node': 'nodes', - 'n': 'network' - } + 'seed': 'seeds', + 'node': 'nodes', + 'n': 'network' }; /** @@ -63,10 +58,8 @@ Config.alias = { */ Config.prototype.inject = function inject(options) { - let keys = Object.keys(options); - - for (let key of keys) { - let value = options[key]; + for (const key of Object.keys(options)) { + const value = options[key]; switch (key) { case 'hash': @@ -110,13 +103,12 @@ Config.prototype.load = function load(options) { */ Config.prototype.open = function open(file) { - let path, text; - if (fs.unsupported) return; - path = this.getFile(file); + const path = this.getFile(file); + let text; try { text = fs.readFileSync(path, 'utf8'); } catch (e) { @@ -143,7 +135,8 @@ Config.prototype.set = function set(key, value) { if (value == null) return; - key = key.toLowerCase().replace(/-/g, ''); + key = key.replace(/-/g, ''); + key = key.toLowerCase(); this.options[key] = value; }; @@ -164,7 +157,8 @@ Config.prototype.has = function has(key) { assert(typeof key === 'string', 'Key must be a string.'); - key = key.toLowerCase().replace(/-/g, ''); + key = key.replace(/-/g, ''); + key = key.toLowerCase(); if (this.hash[key] != null) return true; @@ -195,15 +189,13 @@ Config.prototype.has = function has(key) { */ Config.prototype.get = function get(key, fallback) { - let keys, value; - if (fallback === undefined) fallback = null; if (Array.isArray(key)) { - keys = key; - for (let key of keys) { - value = this.get(key); + const keys = key; + for (const key of keys) { + const value = this.get(key); if (value !== null) return value; } @@ -212,14 +204,20 @@ Config.prototype.get = function get(key, fallback) { if (typeof key === 'number') { assert(key >= 0, 'Index must be positive.'); + if (key >= this.argv.length) return fallback; - return this.argv[key]; + + if (this.argv[key] != null) + return this.argv[key]; + + return fallback; } assert(typeof key === 'string', 'Key must be a string.'); - key = key.toLowerCase().replace(/-/g, ''); + key = key.replace(/-/g, ''); + key = key.toLowerCase(); if (this.hash[key] != null) return this.hash[key]; @@ -242,6 +240,21 @@ Config.prototype.get = function get(key, fallback) { return fallback; }; +/** + * Get a value's type. + * @param {String} key + * @returns {String} + */ + +Config.prototype.typeOf = function typeOf(key) { + const value = this.get(key); + + if (value === null) + return 'null'; + + return typeof value; +}; + /** * Get a config option (as a string). * @param {String} key @@ -250,7 +263,7 @@ Config.prototype.get = function get(key, fallback) { */ Config.prototype.str = function str(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -259,19 +272,19 @@ Config.prototype.str = function str(key, fallback) { return fallback; if (typeof value !== 'string') - throw new Error(`${key} must be a string.`); + throw new Error(`${fmt(key)} must be a string.`); return value; }; /** - * Get a config option (as a number). + * Get a config option (as an integer). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Config.prototype.num = function num(key, fallback) { +Config.prototype.int = function int(key, fallback) { let value = this.get(key); if (fallback === undefined) @@ -282,17 +295,43 @@ Config.prototype.num = function num(key, fallback) { if (typeof value !== 'string') { if (typeof value !== 'number') - throw new Error(`${key} must be a positive integer.`); + throw new Error(`${fmt(key)} must be an int.`); + + if (!Number.isSafeInteger(value)) + throw new Error(`${fmt(key)} must be an int.`); + return value; } - if (!/^\d+$/.test(value)) - throw new Error(`${key} must be a positive integer.`); + if (!/^\-?\d+$/.test(value)) + throw new Error(`${fmt(key)} must be an int.`); value = parseInt(value, 10); - if (!isFinite(value)) - throw new Error(`${key} must be a positive integer.`); + if (!Number.isSafeInteger(value)) + throw new Error(`${fmt(key)} must be an int.`); + + return value; +}; + +/** + * Get a config option (as a unsigned integer). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Config.prototype.uint = function uint(key, fallback) { + const value = this.int(key); + + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; + + if (value < 0) + throw new Error(`${fmt(key)} must be a uint.`); return value; }; @@ -304,7 +343,7 @@ Config.prototype.num = function num(key, fallback) { * @returns {Number|null} */ -Config.prototype.flt = function flt(key, fallback) { +Config.prototype.float = function float(key, fallback) { let value = this.get(key); if (fallback === undefined) @@ -315,30 +354,37 @@ Config.prototype.flt = function flt(key, fallback) { if (typeof value !== 'string') { if (typeof value !== 'number') - throw new Error(`${key} must be a float.`); + throw new Error(`${fmt(key)} must be a float.`); + + if (!isFinite(value)) + throw new Error(`${fmt(key)} must be a float.`); + return value; } - if (!/^\d*(?:\.\d*)?$/.test(value)) - throw new Error(`${key} must be a float.`); + if (!/^\-?\d*(?:\.\d*)?$/.test(value)) + throw new Error(`${fmt(key)} must be a float.`); + + if (!/\d/.test(value)) + throw new Error(`${fmt(key)} must be a float.`); value = parseFloat(value); if (!isFinite(value)) - throw new Error(`${key} must be a float.`); + throw new Error(`${fmt(key)} must be a float.`); return value; }; /** - * Get a value (as a satoshi number or btc string). + * Get a config option (as a positive float). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Config.prototype.amt = function amt(key, fallback) { - let value = this.get(key); +Config.prototype.ufloat = function ufloat(key, fallback) { + const value = this.float(key); if (fallback === undefined) fallback = null; @@ -346,24 +392,55 @@ Config.prototype.amt = function amt(key, fallback) { if (value === null) return fallback; - if (typeof value !== 'string') { - if (typeof value !== 'number') - throw new Error(`${key} must be an amount.`); - return value; + if (value < 0) + throw new Error(`${fmt(key)} must be a positive float.`); + + return value; +}; + +/** + * Get a value (as a fixed number). + * @param {String} key + * @param {Number?} exp + * @param {Object?} fallback + * @returns {Number|null} + */ + +Config.prototype.fixed = function fixed(key, exp, fallback) { + const value = this.float(key); + + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; + + try { + return util.fromFloat(value, exp || 0); + } catch (e) { + throw new Error(`${fmt(key)} must be a fixed number.`); } +}; - if (!/^\d+(\.\d{0,8})?$/.test(value)) - throw new Error(`${key} must be an amount.`); +/** + * Get a value (as a positive fixed number). + * @param {String} key + * @param {Number?} exp + * @param {Object?} fallback + * @returns {Number|null} + */ - value = parseFloat(value); +Config.prototype.ufixed = function ufixed(key, exp, fallback) { + const value = this.fixed(key, exp); - if (!isFinite(value)) - throw new Error(`${key} must be an amount.`); + if (fallback === undefined) + fallback = null; - value *= 1e8; + if (value === null) + return fallback; - if (value % 1 !== 0 || value < 0 || value > 0x1fffffffffffff) - throw new Error(`${key} must be an amount (uint64).`); + if (value < 0) + throw new Error(`${fmt(key)} must be a positive fixed number.`); return value; }; @@ -376,7 +453,7 @@ Config.prototype.amt = function amt(key, fallback) { */ Config.prototype.bool = function bool(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -384,9 +461,18 @@ Config.prototype.bool = function bool(key, fallback) { if (value === null) return fallback; + // Bitcoin Core compat. + if (typeof value === 'number') { + if (value === 1) + return true; + + if (value === 0) + return false; + } + if (typeof value !== 'string') { if (typeof value !== 'boolean') - throw new Error(`${key} must be a boolean.`); + throw new Error(`${fmt(key)} must be a boolean.`); return value; } @@ -396,7 +482,7 @@ Config.prototype.bool = function bool(key, fallback) { if (value === 'false' || value === '0') return false; - throw new Error(`${key} must be a boolean.`); + throw new Error(`${fmt(key)} must be a boolean.`); }; /** @@ -406,9 +492,11 @@ Config.prototype.bool = function bool(key, fallback) { * @returns {Buffer|null} */ -Config.prototype.buf = function buf(key, fallback) { - let value = this.get(key); - let data; +Config.prototype.buf = function buf(key, fallback, enc) { + const value = this.get(key); + + if (!enc) + enc = 'hex'; if (fallback === undefined) fallback = null; @@ -418,14 +506,14 @@ Config.prototype.buf = function buf(key, fallback) { if (typeof value !== 'string') { if (!Buffer.isBuffer(value)) - throw new Error(`${key} must be a buffer.`); + throw new Error(`${fmt(key)} must be a buffer.`); return value; } - data = Buffer.from(value, 'hex'); + const data = Buffer.from(value, enc); - if (data.length !== value.length / 2) - throw new Error(`${key} must be a hex string.`); + if (data.length !== Buffer.byteLength(value, enc)) + throw new Error(`${fmt(key)} must be a ${enc} string.`); return data; }; @@ -438,8 +526,7 @@ Config.prototype.buf = function buf(key, fallback) { */ Config.prototype.array = function array(key, fallback) { - let value = this.get(key); - let result, parts; + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -449,14 +536,14 @@ Config.prototype.array = function array(key, fallback) { if (typeof value !== 'string') { if (!Array.isArray(value)) - throw new Error(`${key} must be an array.`); + throw new Error(`${fmt(key)} must be an array.`); return value; } - parts = value.trim().split(/\s*,\s*/); - result = []; + const parts = value.trim().split(/\s*,\s*/); + const result = []; - for (let part of parts) { + for (const part of parts) { if (part.length === 0) continue; @@ -474,7 +561,7 @@ Config.prototype.array = function array(key, fallback) { */ Config.prototype.obj = function obj(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -482,8 +569,8 @@ Config.prototype.obj = function obj(key, fallback) { if (value === null) return fallback; - if (!value || typeof value !== 'object') - throw new Error(`${key} must be an object.`); + if (typeof value !== 'object') + throw new Error(`${fmt(key)} must be an object.`); return value; }; @@ -496,7 +583,7 @@ Config.prototype.obj = function obj(key, fallback) { */ Config.prototype.func = function func(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -504,8 +591,8 @@ Config.prototype.func = function func(key, fallback) { if (value === null) return fallback; - if (!value || typeof value !== 'function') - throw new Error(`${key} must be a function.`); + if (typeof value !== 'function') + throw new Error(`${fmt(key)} must be a function.`); return value; }; @@ -517,7 +604,7 @@ Config.prototype.func = function func(key, fallback) { * @returns {String|null} */ -Config.prototype.path = function _path(key, fallback) { +Config.prototype.path = function path(key, fallback) { let value = this.str(key); if (fallback === undefined) @@ -528,16 +615,16 @@ Config.prototype.path = function _path(key, fallback) { switch (value[0]) { case '~': // home dir - value = path.join(HOME, value.substring(1)); + value = Path.join(HOME, value.substring(1)); break; case '@': // prefix - value = path.join(this.prefix, value.substring(1)); + value = Path.join(this.prefix, value.substring(1)); break; default: // cwd break; } - return path.normalize(value); + return Path.normalize(value); }; /** @@ -548,7 +635,7 @@ Config.prototype.path = function _path(key, fallback) { */ Config.prototype.mb = function mb(key, fallback) { - let value = this.num(key); + const value = this.uint(key); if (fallback === undefined) fallback = null; @@ -584,24 +671,24 @@ Config.prototype.getNetwork = function getNetwork() { Config.prototype.getPrefix = function getPrefix() { let prefix = this.str('prefix'); - let network; if (prefix) { if (prefix[0] === '~') - prefix = path.join(HOME, prefix.substring(1)); + prefix = Path.join(HOME, prefix.substring(1)); return prefix; } - prefix = path.join(HOME, `.${this.module}`); - network = this.str('network'); + prefix = Path.join(HOME, `.${this.module}`); + + const network = this.str('network'); if (network) { assert(isAlpha(network), 'Bad network.'); if (network !== 'main') - prefix = path.join(prefix, network); + prefix = Path.join(prefix, network); } - return path.normalize(prefix); + return Path.normalize(prefix); }; /** @@ -612,12 +699,12 @@ Config.prototype.getPrefix = function getPrefix() { */ Config.prototype.getFile = function getFile(file) { - let name = this.str('config'); + const name = this.str('config'); if (name) return name; - return path.join(this.prefix, file); + return Path.join(this.prefix, file); }; /** @@ -639,7 +726,7 @@ Config.prototype.ensure = function ensure() { */ Config.prototype.location = function location(file) { - return path.join(this.prefix, file); + return Path.join(this.prefix, file); }; /** @@ -649,50 +736,71 @@ Config.prototype.location = function location(file) { */ Config.prototype.parseConfig = function parseConfig(text) { - let parts; - assert(typeof text === 'string', 'Config must be text.'); - text = text.trim(); - parts = text.split(/\n+/); + if (text.charCodeAt(0) === 0xfeff) + text = text.substring(1); + + text = text.replace(/\r\n/g, '\n'); + text = text.replace(/\r/g, '\n'); + text = text.replace(/\\\n/g, ''); + + let colons = true; + let seen = false; + let num = 0; - for (let line of parts) { - let key, value, eq, col, alias; + for (const chunk of text.split('\n')) { + const line = chunk.trim(); - line = line.trim(); + num += 1; if (line.length === 0) continue; - if (/^\s*#/.test(line)) + if (line[0] === '#') continue; - eq = line.indexOf('='); - col = line.indexOf(':'); + const equal = line.indexOf('='); + const colon = line.indexOf(':'); + + let index = -1; + + if (colon !== -1 && (colon < equal || equal === -1)) { + if (seen && !colons) + throw new Error(`Expected '=' on line ${num}: "${line}".`); - if (col !== -1 && (col < eq || eq === -1)) - eq = col; + index = colon; + seen = true; + colons = true; + } else if (equal !== -1) { + if (seen && colons) + throw new Error(`Expected ':' on line ${num}: "${line}".`); - if (eq === -1) { - key = line.trim(); - value = ''; + index = equal; + seen = true; + colons = false; } else { - key = line.substring(0, eq).trim(); - value = line.substring(eq + 1).trim(); + const symbol = colons ? ':' : '='; + throw new Error(`Expected '${symbol}' on line ${num}: "${line}".`); } - key = key.replace(/\-/g, '').toLowerCase(); + let key = line.substring(0, index).trim(); - alias = Config.alias.conf[key]; - if (alias) - key = alias; + key = key.replace(/\-/g, ''); - if (key.length === 0) - continue; + if (!isLowerKey(key)) + throw new Error(`Invalid option on line ${num}: ${key}.`); + + const value = line.substring(index + 1).trim(); if (value.length === 0) continue; + const alias = Config.alias[key]; + + if (alias) + key = alias; + this.data[key] = value; } }; @@ -704,74 +812,116 @@ Config.prototype.parseConfig = function parseConfig(text) { */ Config.prototype.parseArg = function parseArg(argv) { - let key; - if (!argv || typeof argv !== 'object') argv = process.argv; assert(Array.isArray(argv)); + let last = null; + let pass = false; + for (let i = 2; i < argv.length; i++) { - let arg = argv[i]; - let value, alias, equals; + const arg = argv[i]; assert(typeof arg === 'string'); + if (arg === '--') { + pass = true; + continue; + } + + if (pass) { + this.pass.push(arg); + continue; + } + + if (arg.length === 0) { + last = null; + continue; + } + if (arg.indexOf('--') === 0) { - // e.g. --opt - arg = arg.split('='); - key = arg[0]; + const index = arg.indexOf('='); + + let key = null; + let value = null; + let empty = false; - if (arg.length > 1) { + if (index !== -1) { // e.g. --opt=val - value = arg.slice(1).join('=').trim(); - equals = true; + key = arg.substring(2, index); + value = arg.substring(index + 1); + last = null; + empty = false; } else { + // e.g. --opt + key = arg.substring(2); value = 'true'; - equals = false; + last = null; + empty = true; } key = key.replace(/\-/g, ''); - if (key.length === 0) - continue; + if (!isLowerKey(key)) + throw new Error(`Invalid argument: --${key}.`); if (value.length === 0) continue; - alias = Config.alias.arg[key]; - if (alias) - key = alias; + // Do not allow one-letter aliases. + if (key.length > 1) { + const alias = Config.alias[key]; + if (alias) + key = alias; + } this.args[key] = value; + if (empty) + last = key; + continue; } if (arg[0] === '-') { // e.g. -abc - arg = arg.substring(1); + last = null; + + for (let j = 1; j < arg.length; j++) { + let key = arg[j]; + + if ((key < 'a' || key > 'z') + && (key < 'A' || key > 'Z') + && (key < '0' || key > '9') + && key !== '?') { + throw new Error(`Invalid argument: -${key}.`); + } + + const alias = Config.alias[key]; - for (key of arg) { - alias = Config.alias.arg[key]; if (alias) key = alias; + this.args[key] = 'true'; - equals = false; + + last = key; } continue; } // e.g. foo - value = arg.trim(); + const value = arg; - if (value.length === 0) + if (value.length === 0) { + last = null; continue; + } - if (key && !equals) { - this.args[key] = value; - key = null; + if (last) { + this.args[last] = value; + last = null; } else { this.argv.push(value); } @@ -787,7 +937,6 @@ Config.prototype.parseArg = function parseArg(argv) { Config.prototype.parseEnv = function parseEnv(env) { let prefix = this.module; - let keys; prefix = prefix.toUpperCase(); prefix = prefix.replace(/-/g, '_'); @@ -798,30 +947,31 @@ Config.prototype.parseEnv = function parseEnv(env) { assert(env && typeof env === 'object'); - keys = Object.keys(env); + for (let key of Object.keys(env)) { + const value = env[key]; - for (let key of keys) { - let value, alias; + assert(typeof value === 'string'); - if (key.indexOf(prefix) !== 0) + if (!util.startsWith(key, prefix)) continue; - assert(typeof env[key] === 'string'); - - value = env[key].trim(); - key = key.substring(prefix.length); - key = key.replace(/_/g, '').toLowerCase(); + key = key.replace(/_/g, ''); - if (key.length === 0) + if (!isUpperKey(key)) continue; if (value.length === 0) continue; - alias = Config.alias.env[key]; - if (alias) - key = alias; + key = key.toLowerCase(); + + // Do not allow one-letter aliases. + if (key.length > 1) { + const alias = Config.alias[key]; + if (alias) + key = alias; + } this.env[key] = value; } @@ -874,34 +1024,35 @@ Config.prototype.parseHash = function parseHash(hash) { */ Config.prototype.parseForm = function parseForm(query, map) { - let parts; - assert(typeof query === 'string'); if (query.length === 0) return; - if (query[0] === '?' || query[0] === '#') - query = query.substring(1); + let ch = '?'; - parts = query.split('&'); + if (map === this.hash) + ch = '#'; - for (let pair of parts) { - let index = pair.indexOf('='); - let key, value, alias; + if (query[0] === ch) + query = query.substring(1); - if (index === -1) { - key = pair; - value = ''; - } else { + for (const pair of query.split('&')) { + const index = pair.indexOf('='); + + let key, value; + if (index !== -1) { key = pair.substring(0, index); value = pair.substring(index + 1); + } else { + key = pair; + value = 'true'; } key = unescape(key); - key = key.replace(/\-/g, '').toLowerCase(); + key = key.replace(/\-/g, ''); - if (key.length === 0) + if (!isLowerKey(key)) continue; value = unescape(value); @@ -909,7 +1060,8 @@ Config.prototype.parseForm = function parseForm(query, map) { if (value.length === 0) continue; - alias = Config.alias.env[key]; + const alias = Config.alias[key]; + if (alias) key = alias; @@ -921,6 +1073,16 @@ Config.prototype.parseForm = function parseForm(query, map) { * Helpers */ +function fmt(key) { + if (Array.isArray(key)) + key = key[0]; + + if (typeof key === 'number') + return `Argument #${key}`; + + return key; +} + function unescape(str) { try { str = decodeURIComponent(str); @@ -933,13 +1095,25 @@ function unescape(str) { } function isAlpha(str) { - if (typeof str !== 'string') + return /^[a-z0-9]+$/.test(str); +} + +function isKey(key) { + return /^[a-zA-Z0-9]+$/.test(key); +} + +function isLowerKey(key) { + if (!isKey(key)) return false; - if (!/^[a-z0-9]+$/.test(str)) + return !/[A-Z]/.test(key); +} + +function isUpperKey(key) { + if (!isKey(key)) return false; - return true; + return !/[a-z]/.test(key); } /* diff --git a/lib/node/fullnode.js b/lib/node/fullnode.js index d66cd5bb7..7be094159 100644 --- a/lib/node/fullnode.js +++ b/lib/node/fullnode.js @@ -7,8 +7,6 @@ 'use strict'; -const util = require('../utils/util'); -const Node = require('./node'); const Chain = require('../blockchain/chain'); const Fees = require('../mempool/fees'); const Mempool = require('../mempool/mempool'); @@ -16,6 +14,7 @@ const Pool = require('../net/pool'); const Miner = require('../mining/miner'); const HTTPServer = require('../http/server'); const RPC = require('../http/rpc'); +const Node = require('./node'); /** * Respresents a fullnode complete with a @@ -54,7 +53,7 @@ function FullNode(options) { workers: this.workers, db: this.config.str('db'), prefix: this.config.prefix, - maxFiles: this.config.num('max-files'), + maxFiles: this.config.uint('max-files'), cacheSize: this.config.mb('cache-size'), forceFlags: this.config.bool('force-flags'), bip91: this.config.bool('bip91'), @@ -62,7 +61,7 @@ function FullNode(options) { prune: this.config.bool('prune'), checkpoints: this.config.bool('checkpoints'), coinCache: this.config.mb('coin-cache'), - entryCache: this.config.num('entry-cache'), + entryCache: this.config.uint('entry-cache'), indexTX: this.config.bool('index-tx'), indexAddress: this.config.bool('index-address') }); @@ -83,7 +82,7 @@ function FullNode(options) { persistent: this.config.bool('persistent-mempool'), maxSize: this.config.mb('mempool-size'), limitFree: this.config.bool('limit-free'), - limitFreeRelay: this.config.num('limit-free-relay'), + limitFreeRelay: this.config.uint('limit-free-relay'), requireStandard: this.config.bool('require-standard'), rejectAbsurdFees: this.config.bool('reject-absurd-fees'), replaceByFee: this.config.bool('replace-by-fee'), @@ -103,8 +102,8 @@ function FullNode(options) { bip151: this.config.bool('bip151'), bip150: this.config.bool('bip150'), identityKey: this.config.buf('identity-key'), - maxOutbound: this.config.num('max-outbound'), - maxInbound: this.config.num('max-inbound'), + maxOutbound: this.config.uint('max-outbound'), + maxInbound: this.config.uint('max-inbound'), proxy: this.config.str('proxy'), onion: this.config.bool('onion'), upnp: this.config.bool('upnp'), @@ -112,9 +111,9 @@ function FullNode(options) { nodes: this.config.array('nodes'), only: this.config.array('only'), publicHost: this.config.str('public-host'), - publicPort: this.config.num('public-port'), + publicPort: this.config.uint('public-port'), host: this.config.str('host'), - port: this.config.num('port'), + port: this.config.uint('port'), listen: this.config.bool('listen'), persistent: this.config.bool('persistent') }); @@ -129,9 +128,9 @@ function FullNode(options) { address: this.config.array('coinbase-address'), coinbaseFlags: this.config.str('coinbase-flags'), preverify: this.config.bool('preverify'), - maxWeight: this.config.num('max-weight'), - reservedWeight: this.config.num('reserved-weight'), - reservedSigops: this.config.num('reserved-sigops') + maxWeight: this.config.uint('max-weight'), + reservedWeight: this.config.uint('reserved-weight'), + reservedSigops: this.config.uint('reserved-sigops') }); // RPC needs access to the node. @@ -148,7 +147,7 @@ function FullNode(options) { keyFile: this.config.path('ssl-key'), certFile: this.config.path('ssl-cert'), host: this.config.str('http-host'), - port: this.config.num('http-port'), + port: this.config.uint('http-port'), apiKey: this.config.str('api-key'), noAuth: this.config.bool('no-auth') }); @@ -157,7 +156,7 @@ function FullNode(options) { this._init(); } -util.inherits(FullNode, Node); +Object.setPrototypeOf(FullNode.prototype, Node.prototype); /** * Initialize the node. @@ -217,7 +216,7 @@ FullNode.prototype._init = function _init() { * @returns {Promise} */ -FullNode.prototype._open = async function open() { +FullNode.prototype._open = async function _open() { await this.chain.open(); await this.mempool.open(); await this.miner.open(); @@ -237,7 +236,7 @@ FullNode.prototype._open = async function open() { * @returns {Promise} */ -FullNode.prototype._close = async function close() { +FullNode.prototype._close = async function _close() { if (this.http) await this.http.close(); @@ -379,16 +378,16 @@ FullNode.prototype.getBlock = function getBlock(hash) { * @returns {Promise} - Returns {@link Coin}. */ -FullNode.prototype.getCoin = function getCoin(hash, index) { - let coin = this.mempool.getCoin(hash, index); +FullNode.prototype.getCoin = async function getCoin(hash, index) { + const coin = this.mempool.getCoin(hash, index); if (coin) - return Promise.resolve(coin); + return coin; if (this.mempool.isSpent(hash, index)) - return Promise.resolve(); + return null; - return this.chain.db.getCoin(hash, index); + return await this.chain.db.getCoin(hash, index); }; /** @@ -399,13 +398,12 @@ FullNode.prototype.getCoin = function getCoin(hash, index) { */ FullNode.prototype.getCoinsByAddress = async function getCoinsByAddress(addrs) { - let mempool = this.mempool.getCoinsByAddress(addrs); - let chain = await this.chain.db.getCoinsByAddress(addrs); - let out = []; - let coin; + const mempool = this.mempool.getCoinsByAddress(addrs); + const chain = await this.chain.db.getCoinsByAddress(addrs); + const out = []; - for (coin of chain) { - let spent = this.mempool.isSpent(coin.hash, coin.index); + for (const coin of chain) { + const spent = this.mempool.isSpent(coin.hash, coin.index); if (spent) continue; @@ -413,7 +411,7 @@ FullNode.prototype.getCoinsByAddress = async function getCoinsByAddress(addrs) { out.push(coin); } - for (coin of mempool) + for (const coin of mempool) out.push(coin); return out; @@ -426,9 +424,9 @@ FullNode.prototype.getCoinsByAddress = async function getCoinsByAddress(addrs) { * @returns {Promise} - Returns {@link TXMeta}[]. */ -FullNode.prototype.getMetaByAddress = async function getTXByAddress(addrs) { - let mempool = this.mempool.getMetaByAddress(addrs); - let chain = await this.chain.db.getMetaByAddress(addrs); +FullNode.prototype.getMetaByAddress = async function getMetaByAddress(addrs) { + const mempool = this.mempool.getMetaByAddress(addrs); + const chain = await this.chain.db.getMetaByAddress(addrs); return chain.concat(mempool); }; @@ -439,7 +437,7 @@ FullNode.prototype.getMetaByAddress = async function getTXByAddress(addrs) { */ FullNode.prototype.getMeta = async function getMeta(hash) { - let meta = this.mempool.getMeta(hash); + const meta = this.mempool.getMeta(hash); if (meta) return meta; @@ -467,10 +465,10 @@ FullNode.prototype.getMetaView = async function getMetaView(meta) { */ FullNode.prototype.getTXByAddress = async function getTXByAddress(addrs) { - let mtxs = await this.getMetaByAddress(addrs); - let out = []; + const mtxs = await this.getMetaByAddress(addrs); + const out = []; - for (let mtx of mtxs) + for (const mtx of mtxs) out.push(mtx.tx); return out; @@ -483,9 +481,11 @@ FullNode.prototype.getTXByAddress = async function getTXByAddress(addrs) { */ FullNode.prototype.getTX = async function getTX(hash) { - let mtx = await this.getMeta(hash); + const mtx = await this.getMeta(hash); + if (!mtx) - return; + return null; + return mtx.tx; }; diff --git a/lib/node/logger.js b/lib/node/logger.js index 2cf5dab0e..189d5fffb 100644 --- a/lib/node/logger.js +++ b/lib/node/logger.js @@ -33,7 +33,7 @@ function Logger(options) { this.closing = false; this.filename = null; this.stream = null; - this.contexts = {}; + this.contexts = Object.create(null); this.locker = new Lock(); if (options) @@ -45,7 +45,7 @@ function Logger(options) { * @const {Boolean} */ -Logger.HAS_TTY = !!(process.stdout && process.stdout.isTTY); +Logger.HAS_TTY = Boolean(process.stdout && process.stdout.isTTY); /** * Maximum file size. @@ -161,7 +161,7 @@ Logger.prototype.set = function set(options) { */ Logger.prototype.open = async function open() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._open(); } finally { @@ -175,7 +175,7 @@ Logger.prototype.open = async function open() { * @returns {Promise} */ -Logger.prototype._open = async function open() { +Logger.prototype._open = async function _open() { if (!this.filename) { this.closed = false; return; @@ -206,7 +206,7 @@ Logger.prototype._open = async function open() { */ Logger.prototype.close = async function close() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._close(); } finally { @@ -220,7 +220,7 @@ Logger.prototype.close = async function close() { * @returns {Promise} */ -Logger.prototype._close = async function close() { +Logger.prototype._close = async function _close() { if (this.timer != null) { co.clearTimeout(this.timer); this.timer = null; @@ -253,9 +253,6 @@ Logger.prototype._close = async function close() { */ Logger.prototype.truncate = async function truncate() { - let maxSize = Logger.MAX_FILE_SIZE; - let stat, data, fd; - if (!this.filename) return; @@ -264,6 +261,7 @@ Logger.prototype.truncate = async function truncate() { assert(!this.stream); + let stat; try { stat = await fs.stat(this.filename); } catch (e) { @@ -272,14 +270,16 @@ Logger.prototype.truncate = async function truncate() { throw e; } + const maxSize = Logger.MAX_FILE_SIZE; + if (stat.size <= maxSize + (maxSize / 10)) return; this.debug('Truncating log file to %d bytes.', maxSize); - fd = await fs.open(this.filename, 'r+'); + const fd = await fs.open(this.filename, 'r+'); + const data = Buffer.allocUnsafe(maxSize); - data = Buffer.allocUnsafe(maxSize); await fs.read(fd, data, 0, maxSize, stat.size - maxSize); await fs.ftruncate(fd, maxSize); await fs.write(fd, data, 0, maxSize, 0); @@ -310,7 +310,7 @@ Logger.prototype.handleError = function handleError(err) { */ Logger.prototype.reopen = async function reopen() { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._reopen(); } finally { @@ -325,7 +325,7 @@ Logger.prototype.reopen = async function reopen() { * @returns {Promise} */ -Logger.prototype._reopen = async function reopen() { +Logger.prototype._reopen = async function _reopen() { if (this.stream) return; @@ -377,7 +377,7 @@ Logger.prototype.setFile = function setFile(filename) { */ Logger.prototype.setLevel = function setLevel(name) { - let level = Logger.levels[name.toUpperCase()]; + const level = Logger.levels[name.toUpperCase()]; assert(level != null, 'Invalid log level.'); this.level = level; }; @@ -389,13 +389,15 @@ Logger.prototype.setLevel = function setLevel(name) { */ Logger.prototype.error = function error(...args) { - let err = args[0]; - if (this.level < Logger.levels.ERROR) return; - if (err instanceof Error) - return this.logError(Logger.levels.ERROR, null, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.ERROR, null, err); + return; + } this.log(Logger.levels.ERROR, null, args); }; @@ -407,13 +409,15 @@ Logger.prototype.error = function error(...args) { */ Logger.prototype.warning = function warning(...args) { - let err = args[0]; - if (this.level < Logger.levels.WARNING) return; - if (err instanceof Error) - return this.logError(Logger.levels.WARNING, null, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.WARNING, null, err); + return; + } this.log(Logger.levels.WARNING, null, args); }; @@ -425,13 +429,15 @@ Logger.prototype.warning = function warning(...args) { */ Logger.prototype.info = function info(...args) { - let err = args[0]; - if (this.level < Logger.levels.INFO) return; - if (err instanceof Error) - return this.logError(Logger.levels.INFO, null, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.INFO, null, err); + return; + } this.log(Logger.levels.INFO, null, args); }; @@ -443,13 +449,15 @@ Logger.prototype.info = function info(...args) { */ Logger.prototype.debug = function debug(...args) { - let err = args[0]; - if (this.level < Logger.levels.DEBUG) return; - if (err instanceof Error) - return this.logError(Logger.levels.DEBUG, null, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.DEBUG, null, err); + return; + } this.log(Logger.levels.DEBUG, null, args); }; @@ -461,13 +469,15 @@ Logger.prototype.debug = function debug(...args) { */ Logger.prototype.spam = function spam(...args) { - let err = args[0]; - if (this.level < Logger.levels.SPAM) return; - if (err instanceof Error) - return this.logError(Logger.levels.SPAM, null, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.SPAM, null, err); + return; + } this.log(Logger.levels.SPAM, null, args); }; @@ -497,15 +507,15 @@ Logger.prototype.log = function log(level, module, args) { * @returns {LoggerContext} */ -Logger.prototype.context = function _context(module) { - let context = this.contexts[module]; +Logger.prototype.context = function context(module) { + let ctx = this.contexts[module]; - if (!context) { - context = new LoggerContext(this, module); - this.contexts[module] = context; + if (!ctx) { + ctx = new LoggerContext(this, module); + this.contexts[module] = ctx; } - return context; + return ctx; }; /** @@ -516,17 +526,15 @@ Logger.prototype.context = function _context(module) { */ Logger.prototype.writeConsole = function writeConsole(level, module, args) { - let name = Logger.levelsByVal[level]; - let msg = ''; - let color; + const name = Logger.levelsByVal[level]; assert(name, 'Invalid log level.'); if (!this.console) - return; + return false; if (!process.stdout) { - msg += `[${name}] `; + let msg = `[${name}] `; if (module) msg += `(${module}) `; @@ -539,18 +547,24 @@ Logger.prototype.writeConsole = function writeConsole(level, module, args) { msg += util.format(args, false); - return level === Logger.levels.ERROR - ? console.error(msg) - : console.log(msg); + if (level === Logger.levels.ERROR) { + console.error(msg); + return true; + } + + console.log(msg); + + return true; } + let msg; if (this.colors) { - color = Logger.styles[level]; + const color = Logger.styles[level]; assert(color); - msg += `\x1b[${color}m[${name}]\x1b[m `; + msg = `\x1b[${color}m[${name}]\x1b[m `; } else { - msg += `[${name}] `; + msg = `[${name}] `; } if (module) @@ -572,8 +586,7 @@ Logger.prototype.writeConsole = function writeConsole(level, module, args) { */ Logger.prototype.writeStream = function writeStream(level, module, args) { - let name = Logger.prefixByVal[level]; - let msg = ''; + const name = Logger.prefixByVal[level]; assert(name, 'Invalid log level.'); @@ -583,7 +596,7 @@ Logger.prototype.writeStream = function writeStream(level, module, args) { if (this.closing) return; - msg += `[${name}:${util.date()}] `; + let msg = `[${name}:${util.date()}] `; if (module) msg += `(${module}) `; @@ -604,8 +617,6 @@ Logger.prototype.writeStream = function writeStream(level, module, args) { */ Logger.prototype.logError = function logError(level, module, err) { - let msg; - if (this.closed) return; @@ -614,7 +625,7 @@ Logger.prototype.logError = function logError(level, module, err) { console.error(err); } - msg = (err.message + '').replace(/^ *Error: */, ''); + let msg = String(err.message).replace(/^ *Error: */, ''); if (level !== Logger.levels.ERROR) msg = `Error: ${msg}`; @@ -633,7 +644,7 @@ Logger.prototype.logError = function logError(level, module, err) { */ Logger.prototype.memory = function memory(module) { - let mem = util.memoryUsage(); + const mem = util.memoryUsage(); this.log(Logger.levels.DEBUG, module, [ 'Memory: rss=%dmb, js-heap=%d/%dmb native-heap=%dmb', @@ -705,13 +716,15 @@ LoggerContext.prototype.setLevel = function setLevel(name) { */ LoggerContext.prototype.error = function error(...args) { - let err = args[0]; - if (this.logger.level < Logger.levels.ERROR) return; - if (err instanceof Error) - return this.logError(Logger.levels.ERROR, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.ERROR, err); + return; + } this.log(Logger.levels.ERROR, args); }; @@ -723,13 +736,15 @@ LoggerContext.prototype.error = function error(...args) { */ LoggerContext.prototype.warning = function warning(...args) { - let err = args[0]; - if (this.logger.level < Logger.levels.WARNING) return; - if (err instanceof Error) - return this.logError(Logger.levels.WARNING, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.WARNING, err); + return; + } this.log(Logger.levels.WARNING, args); }; @@ -741,13 +756,15 @@ LoggerContext.prototype.warning = function warning(...args) { */ LoggerContext.prototype.info = function info(...args) { - let err = args[0]; - if (this.logger.level < Logger.levels.INFO) return; - if (err instanceof Error) - return this.logError(Logger.levels.INFO, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.INFO, err); + return; + } this.log(Logger.levels.INFO, args); }; @@ -759,13 +776,15 @@ LoggerContext.prototype.info = function info(...args) { */ LoggerContext.prototype.debug = function debug(...args) { - let err = args[0]; - if (this.logger.level < Logger.levels.DEBUG) return; - if (err instanceof Error) - return this.logError(Logger.levels.DEBUG, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.DEBUG, err); + return; + } this.log(Logger.levels.DEBUG, args); }; @@ -777,13 +796,15 @@ LoggerContext.prototype.debug = function debug(...args) { */ LoggerContext.prototype.spam = function spam(...args) { - let err = args[0]; - if (this.logger.level < Logger.levels.SPAM) return; - if (err instanceof Error) - return this.logError(Logger.levels.SPAM, err); + const err = args[0]; + + if (err instanceof Error) { + this.logError(Logger.levels.SPAM, err); + return; + } this.log(Logger.levels.SPAM, args); }; @@ -841,9 +862,16 @@ Logger.global = new Logger(); function openStream(filename) { return new Promise((resolve, reject) => { - let stream = fs.createWriteStream(filename, { flags: 'a' }); + const stream = fs.createWriteStream(filename, { flags: 'a' }); - let onError = (err) => { + const cleanup = () => { + /* eslint-disable */ + stream.removeListener('error', onError); + stream.removeListener('open', onOpen); + /* eslint-enable */ + }; + + const onError = (err) => { try { stream.close(); } catch (e) { @@ -853,16 +881,11 @@ function openStream(filename) { reject(err); }; - let onOpen = () => { + const onOpen = () => { cleanup(); resolve(stream); }; - let cleanup = () => { - stream.removeListener('error', onError); - stream.removeListener('open', onOpen); - }; - stream.once('error', onError); stream.once('open', onOpen); }); @@ -870,21 +893,23 @@ function openStream(filename) { function closeStream(stream) { return new Promise((resolve, reject) => { - let onError = (err) => { + const cleanup = () => { + /* eslint-disable */ + stream.removeListener('error', onError); + stream.removeListener('close', onClose); + /* eslint-enable */ + }; + + const onError = (err) => { cleanup(); reject(err); }; - let onClose = () => { + const onClose = () => { cleanup(); resolve(stream); }; - let cleanup = () => { - stream.removeListener('error', onError); - stream.removeListener('close', onClose); - }; - stream.removeAllListeners('error'); stream.removeAllListeners('close'); stream.once('error', onError); diff --git a/lib/node/node.js b/lib/node/node.js index 6221653e2..4615be3e3 100644 --- a/lib/node/node.js +++ b/lib/node/node.js @@ -42,7 +42,7 @@ function Node(options) { this.network = Network.get(this.config.network); this.startTime = -1; this.bound = []; - this.plugins = {}; + this.plugins = Object.create(null); this.stack = []; this.logger = null; @@ -59,7 +59,7 @@ function Node(options) { this.init(); } -util.inherits(Node, AsyncObject); +Object.setPrototypeOf(Node.prototype, AsyncObject.prototype); /** * Initialize options. @@ -69,7 +69,7 @@ util.inherits(Node, AsyncObject); Node.prototype.initOptions = function initOptions() { let logger = new Logger(); - let config = this.config; + const config = this.config; if (config.has('logger')) logger = config.obj('logger'); @@ -87,8 +87,8 @@ Node.prototype.initOptions = function initOptions() { this.workers = new WorkerPool({ enabled: config.bool('workers'), - size: config.num('workers-size'), - timeout: config.num('workers-timeout'), + size: config.uint('workers-size'), + timeout: config.uint('workers-timeout'), file: config.str('worker-file') }); }; @@ -214,7 +214,7 @@ Node.prototype.handlePreclose = async function handlePreclose() { */ Node.prototype.handleClose = async function handleClose() { - for (let [obj, event, listener] of this.bound) + for (const [obj, event, listener] of this.bound) obj.removeListener(event, listener); this.bound.length = 0; @@ -267,14 +267,12 @@ Node.prototype.uptime = function uptime() { */ Node.prototype.use = function use(plugin) { - let instance; - assert(plugin, 'Plugin must be an object.'); assert(typeof plugin.init === 'function', '`init` must be a function.'); assert(!this.loaded, 'Cannot add plugin after node is loaded.'); - instance = plugin.init(this); + const instance = plugin.init(this); assert(!instance.open || typeof instance.open === 'function', '`open` must be a function.'); @@ -354,7 +352,7 @@ Node.prototype.get = function get(name) { return this.http; } - return this.plugins[name]; + return this.plugins[name] || null; }; /** @@ -365,7 +363,7 @@ Node.prototype.get = function get(name) { */ Node.prototype.require = function require(name) { - let plugin = this.get(name); + const plugin = this.get(name); assert(plugin, `${name} is not loaded.`); return plugin; }; @@ -376,8 +374,8 @@ Node.prototype.require = function require(name) { */ Node.prototype.loadPlugins = function loadPlugins() { - let plugins = this.config.array('plugins', []); - let loader = this.config.func('loader'); + const plugins = this.config.array('plugins', []); + const loader = this.config.func('loader'); for (let plugin of plugins) { if (typeof plugin === 'string') { @@ -394,7 +392,7 @@ Node.prototype.loadPlugins = function loadPlugins() { */ Node.prototype.openPlugins = async function openPlugins() { - for (let plugin of this.stack) { + for (const plugin of this.stack) { if (plugin.open) await plugin.open(); } @@ -406,7 +404,7 @@ Node.prototype.openPlugins = async function openPlugins() { */ Node.prototype.closePlugins = async function closePlugins() { - for (let plugin of this.stack) { + for (const plugin of this.stack) { if (plugin.close) await plugin.close(); } diff --git a/lib/node/spvnode.js b/lib/node/spvnode.js index 8401fec88..eb96fc9d4 100644 --- a/lib/node/spvnode.js +++ b/lib/node/spvnode.js @@ -7,13 +7,12 @@ 'use strict'; -const util = require('../utils/util'); const Lock = require('../utils/lock'); -const Node = require('./node'); const Chain = require('../blockchain/chain'); const Pool = require('../net/pool'); const HTTPServer = require('../http/server'); const RPC = require('../http/rpc'); +const Node = require('./node'); /** * Create an spv node which only maintains @@ -49,9 +48,9 @@ function SPVNode(options) { logger: this.logger, db: this.config.str('db'), prefix: this.config.prefix, - maxFiles: this.config.num('max-files'), + maxFiles: this.config.uint('max-files'), cacheSize: this.config.mb('cache-size'), - entryCache: this.config.num('entry-cache'), + entryCache: this.config.uint('entry-cache'), forceFlags: this.config.bool('force-flags'), checkpoints: this.config.bool('checkpoints'), bip91: this.config.bool('bip91'), @@ -73,7 +72,7 @@ function SPVNode(options) { bip151: this.config.bool('bip151'), bip150: this.config.bool('bip150'), identityKey: this.config.buf('identity-key'), - maxOutbound: this.config.num('max-outbound'), + maxOutbound: this.config.uint('max-outbound'), persistent: this.config.bool('persistent'), selfish: true, listen: false @@ -91,7 +90,7 @@ function SPVNode(options) { keyFile: this.config.path('ssl-key'), certFile: this.config.path('ssl-cert'), host: this.config.str('http-host'), - port: this.config.num('http-port'), + port: this.config.uint('http-port'), apiKey: this.config.str('api-key'), noAuth: this.config.bool('no-auth') }); @@ -104,7 +103,7 @@ function SPVNode(options) { this._init(); } -util.inherits(SPVNode, Node); +Object.setPrototypeOf(SPVNode.prototype, Node.prototype); /** * Initialize the node. @@ -161,7 +160,7 @@ SPVNode.prototype._init = function _init() { * @returns {Promise} */ -SPVNode.prototype._open = async function open(callback) { +SPVNode.prototype._open = async function _open(callback) { await this.chain.open(); await this.pool.open(); @@ -179,7 +178,7 @@ SPVNode.prototype._open = async function open(callback) { * @returns {Promise} */ -SPVNode.prototype._close = async function close() { +SPVNode.prototype._close = async function _close() { if (this.http) await this.http.close(); @@ -199,8 +198,8 @@ SPVNode.prototype._close = async function close() { */ SPVNode.prototype.scan = async function scan(start, filter, iter) { - let unlock = await this.scanLock.lock(); - let height = this.chain.height; + const unlock = await this.scanLock.lock(); + const height = this.chain.height; try { await this.chain.replay(start); @@ -237,7 +236,7 @@ SPVNode.prototype.watchUntil = function watchUntil(height, iter) { */ SPVNode.prototype.watchBlock = async function watchBlock(entry, block) { - let unlock = await this.watchLock.lock(); + const unlock = await this.watchLock.lock(); try { if (entry.height < this.rescanJob.height) { await this.rescanJob.iter(entry, block.txs); diff --git a/lib/primitives/abstractblock.js b/lib/primitives/abstractblock.js index c7a0c1ebb..298c90be8 100644 --- a/lib/primitives/abstractblock.js +++ b/lib/primitives/abstractblock.js @@ -10,6 +10,7 @@ const assert = require('assert'); const util = require('../utils/util'); const digest = require('../crypto/digest'); +const BufferReader = require('../utils/reader'); const StaticWriter = require('../utils/staticwriter'); const InvItem = require('./invitem'); const encoding = require('../utils/encoding'); @@ -26,11 +27,9 @@ const consensus = require('../protocol/consensus'); * number will never be negative. * @property {Hash} prevBlock - Previous block hash. * @property {Hash} merkleRoot - Merkle root hash. - * @property {Number} ts - Timestamp. + * @property {Number} time - Timestamp. * @property {Number} bits * @property {Number} nonce - * @property {TX[]} txs - Transaction vector. - * @property {ReversedHash} rhash - Reversed block hash (uint256le). */ function AbstractBlock() { @@ -40,28 +39,16 @@ function AbstractBlock() { this.version = 1; this.prevBlock = encoding.NULL_HASH; this.merkleRoot = encoding.NULL_HASH; - this.ts = 0; + this.time = 0; this.bits = 0; this.nonce = 0; - this.txs = null; this.mutable = false; this._hash = null; this._hhash = null; - this._size = -1; - this._witness = -1; } -/** - * Memory flag. - * @const {Boolean} - * @default - * @memberof AbstractBlock# - */ - -AbstractBlock.prototype.memory = false; - /** * Inject properties from options object. * @private @@ -70,22 +57,22 @@ AbstractBlock.prototype.memory = false; AbstractBlock.prototype.parseOptions = function parseOptions(options) { assert(options, 'Block data is required.'); - assert(util.isNumber(options.version)); + assert(util.isU32(options.version)); assert(typeof options.prevBlock === 'string'); assert(typeof options.merkleRoot === 'string'); - assert(util.isNumber(options.ts)); - assert(util.isNumber(options.bits)); - assert(util.isNumber(options.nonce)); + assert(util.isU32(options.time)); + assert(util.isU32(options.bits)); + assert(util.isU32(options.nonce)); this.version = options.version; this.prevBlock = options.prevBlock; this.merkleRoot = options.merkleRoot; - this.ts = options.ts; + this.time = options.time; this.bits = options.bits; this.nonce = options.nonce; if (options.mutable != null) - this.mutable = !!options.mutable; + this.mutable = Boolean(options.mutable); return this; }; @@ -98,51 +85,47 @@ AbstractBlock.prototype.parseOptions = function parseOptions(options) { AbstractBlock.prototype.parseJSON = function parseJSON(json) { assert(json, 'Block data is required.'); - assert(util.isNumber(json.version)); + assert(util.isU32(json.version)); assert(typeof json.prevBlock === 'string'); assert(typeof json.merkleRoot === 'string'); - assert(util.isNumber(json.ts)); - assert(util.isNumber(json.bits)); - assert(util.isNumber(json.nonce)); + assert(util.isU32(json.time)); + assert(util.isU32(json.bits)); + assert(util.isU32(json.nonce)); this.version = json.version; this.prevBlock = util.revHex(json.prevBlock); this.merkleRoot = util.revHex(json.merkleRoot); - this.ts = json.ts; + this.time = json.time; this.bits = json.bits; this.nonce = json.nonce; return this; }; +/** + * Test whether the block is a memblock. + * @returns {Boolean} + */ + +AbstractBlock.prototype.isMemory = function isMemory() { + return false; +}; + /** * Clear any cached values (abstract). - * @param {Boolean?} all - Clear transactions. */ -AbstractBlock.prototype._refresh = function refresh(all) { +AbstractBlock.prototype._refresh = function _refresh() { this._hash = null; this._hhash = null; - this._size = -1; - this._witness = -1; - - if (!all) - return; - - if (!this.txs) - return; - - for (let tx of this.txs) - tx.refresh(); }; /** * Clear any cached values. - * @param {Boolean?} all - Clear transactions. */ -AbstractBlock.prototype.refresh = function refresh(all) { - return this._refresh(all); +AbstractBlock.prototype.refresh = function refresh() { + return this._refresh(); }; /** @@ -151,26 +134,26 @@ AbstractBlock.prototype.refresh = function refresh(all) { * @returns {Hash|Buffer} hash */ -AbstractBlock.prototype.hash = function _hash(enc) { - let hash = this._hash; +AbstractBlock.prototype.hash = function hash(enc) { + let h = this._hash; - if (!hash) { - hash = digest.hash256(this.abbr()); + if (!h) { + h = digest.hash256(this.toHead()); if (!this.mutable) - this._hash = hash; + this._hash = h; } if (enc === 'hex') { let hex = this._hhash; if (!hex) { - hex = hash.toString('hex'); + hex = h.toString('hex'); if (!this.mutable) this._hhash = hex; } - hash = hex; + h = hex; } - return hash; + return h; }; /** @@ -178,8 +161,18 @@ AbstractBlock.prototype.hash = function _hash(enc) { * @returns {Buffer} */ -AbstractBlock.prototype.abbr = function abbr() { - return this.writeAbbr(new StaticWriter(80)).render(); +AbstractBlock.prototype.toHead = function toHead() { + return this.writeHead(new StaticWriter(80)).render(); +}; + +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + */ + +AbstractBlock.prototype.fromHead = function fromHead(data) { + return this.readHead(new BufferReader(data)); }; /** @@ -187,11 +180,11 @@ AbstractBlock.prototype.abbr = function abbr() { * @param {BufferWriter} bw */ -AbstractBlock.prototype.writeAbbr = function writeAbbr(bw) { +AbstractBlock.prototype.writeHead = function writeHead(bw) { bw.writeU32(this.version); bw.writeHash(this.prevBlock); bw.writeHash(this.merkleRoot); - bw.writeU32(this.ts); + bw.writeU32(this.time); bw.writeU32(this.bits); bw.writeU32(this.nonce); return bw; @@ -202,11 +195,11 @@ AbstractBlock.prototype.writeAbbr = function writeAbbr(bw) { * @param {BufferReader} br */ -AbstractBlock.prototype.parseAbbr = function parseAbbr(br) { +AbstractBlock.prototype.readHead = function readHead(br) { this.version = br.readU32(); this.prevBlock = br.readHash('hex'); this.merkleRoot = br.readHash('hex'); - this.ts = br.readU32(); + this.time = br.readU32(); this.bits = br.readU32(); this.nonce = br.readU32(); return this; diff --git a/lib/primitives/address.js b/lib/primitives/address.js index b24b39cdf..8d0ea10c0 100644 --- a/lib/primitives/address.js +++ b/lib/primitives/address.js @@ -57,7 +57,7 @@ Address.types = { * @const {RevMap} */ -Address.typesByVal = util.revMap(Address.types); +Address.typesByVal = util.reverse(Address.types); /** * Inject properties from options object. @@ -119,6 +119,21 @@ Address.prototype.isNull = function isNull() { return true; }; +/** + * Test equality against another address. + * @param {Address} addr + * @returns {Boolean} + */ + +Address.prototype.equals = function equals(addr) { + assert(addr instanceof Address); + + return this.network === addr.network + && this.type === addr.type + && this.version === addr.version + && this.hash.equals(addr.hash); +}; + /** * Get the address type as a string. * @returns {String} @@ -135,13 +150,12 @@ Address.prototype.getType = function getType() { */ Address.prototype.getPrefix = function getPrefix(network) { - let prefixes; - if (!network) network = this.network; network = Network.get(network); - prefixes = network.addressPrefix; + + const prefixes = network.addressPrefix; switch (this.type) { case Address.types.PUBKEYHASH: @@ -183,9 +197,9 @@ Address.prototype.getSize = function getSize() { */ Address.prototype.toRaw = function toRaw(network) { - let size = this.getSize(); - let bw = new StaticWriter(size); - let prefix = this.getPrefix(network); + const size = this.getSize(); + const bw = new StaticWriter(size); + const prefix = this.getPrefix(network); assert(prefix !== -1, 'Not a valid address prefix.'); @@ -221,9 +235,8 @@ Address.prototype.toBase58 = function toBase58(network) { */ Address.prototype.toBech32 = function toBech32(network) { - let version = this.version; - let hash = this.hash; - let hrp; + const version = this.version; + const hash = this.hash; assert(version !== -1, 'Cannot convert non-program address to bech32.'); @@ -232,7 +245,8 @@ Address.prototype.toBech32 = function toBech32(network) { network = this.network; network = Network.get(network); - hrp = network.addressPrefix.bech32; + + const hrp = network.addressPrefix.bech32; return bech32.encode(hrp, version, hash); }; @@ -246,18 +260,21 @@ Address.prototype.toBech32 = function toBech32(network) { */ Address.prototype.fromString = function fromString(addr, network) { - let hrp; - assert(typeof addr === 'string'); + assert(addr.length > 0); + assert(addr.length <= 100); + // If the address is mixed case, + // it can only ever be base58. + if (isMixedCase(addr)) + return this.fromBase58(addr, network); + + // Otherwise, it's most likely bech32. try { - hrp = addr.substring(0, 2).toLowerCase(); - network = Network.fromBech32(hrp, network); + return this.fromBech32(addr, network); } catch (e) { return this.fromBase58(addr, network); } - - return this.fromBech32(addr, network); }; /** @@ -304,17 +321,18 @@ Address.prototype.inspect = function inspect() { */ Address.prototype.fromRaw = function fromRaw(data, network) { - let br = new BufferReader(data, true); - let version = -1; - let prefix, type, hash; + const br = new BufferReader(data, true); if (data.length > 40) throw new Error('Address is too long.'); - prefix = br.readU8(); + const prefix = br.readU8(); + network = Network.fromAddress(prefix, network); - type = Address.getType(prefix, network); + const type = Address.getType(prefix, network); + + let version = -1; if (data.length > 25) { version = br.readU8(); @@ -322,7 +340,7 @@ Address.prototype.fromRaw = function fromRaw(data, network) { throw new Error('Address version padding is non-zero.'); } - hash = br.readBytes(br.left() - 4); + const hash = br.readBytes(br.left() - 4); br.verifyChecksum(); @@ -378,12 +396,12 @@ Address.fromBase58 = function fromBase58(data, network) { */ Address.prototype.fromBech32 = function fromBech32(data, network) { - let type = Address.types.WITNESS; - let addr; + const type = Address.types.WITNESS; assert(typeof data === 'string'); - addr = bech32.decode(data); + const addr = bech32.decode(data); + network = Network.fromBech32(addr.hrp, network); return this.fromHash(addr.hash, type, addr.version, network); @@ -408,45 +426,39 @@ Address.fromBech32 = function fromBech32(data, network) { */ Address.prototype.fromScript = function fromScript(script) { - if (script.isPubkey()) { - this.hash = digest.hash160(script.get(0)); + const pk = script.getPubkey(); + + if (pk) { + this.hash = digest.hash160(pk); this.type = Address.types.PUBKEYHASH; this.version = -1; return this; } - if (script.isPubkeyhash()) { - this.hash = script.get(2); + const pkh = script.getPubkeyhash(); + + if (pkh) { + this.hash = pkh; this.type = Address.types.PUBKEYHASH; this.version = -1; return this; } - if (script.isScripthash()) { - this.hash = script.get(1); + const sh = script.getScripthash(); + + if (sh) { + this.hash = sh; this.type = Address.types.SCRIPTHASH; this.version = -1; return this; } - if (script.isWitnessPubkeyhash()) { - this.hash = script.get(1); - this.type = Address.types.WITNESS; - this.version = 0; - return this; - } - - if (script.isWitnessScripthash()) { - this.hash = script.get(1); - this.type = Address.types.WITNESS; - this.version = 0; - return this; - } + const program = script.getProgram(); - if (script.isWitnessMasthash()) { - this.hash = script.get(1); + if (program && !program.isMalformed()) { + this.hash = program.data; this.type = Address.types.WITNESS; - this.version = 1; + this.version = program.version; return this; } @@ -457,6 +469,8 @@ Address.prototype.fromScript = function fromScript(script) { this.version = -1; return this; } + + return null; }; /** @@ -466,21 +480,27 @@ Address.prototype.fromScript = function fromScript(script) { */ Address.prototype.fromWitness = function fromWitness(witness) { + const [, pk] = witness.getPubkeyhashInput(); + // We're pretty much screwed here // since we can't get the version. - if (witness.isPubkeyhashInput()) { - this.hash = digest.hash160(witness.get(1)); + if (pk) { + this.hash = digest.hash160(pk); this.type = Address.types.WITNESS; this.version = 0; return this; } - if (witness.isScripthashInput()) { - this.hash = digest.sha256(witness.get(witness.length - 1)); + const redeem = witness.getScripthashInput(); + + if (redeem) { + this.hash = digest.sha256(redeem); this.type = Address.types.WITNESS; this.version = 0; return this; } + + return null; }; /** @@ -490,19 +510,25 @@ Address.prototype.fromWitness = function fromWitness(witness) { */ Address.prototype.fromInputScript = function fromInputScript(script) { - if (script.isPubkeyhashInput()) { - this.hash = digest.hash160(script.get(1)); + const [, pk] = script.getPubkeyhashInput(); + + if (pk) { + this.hash = digest.hash160(pk); this.type = Address.types.PUBKEYHASH; this.version = -1; return this; } - if (script.isScripthashInput()) { - this.hash = digest.hash160(script.get(script.length - 1)); + const redeem = script.getScripthashInput(); + + if (redeem) { + this.hash = digest.hash160(redeem); this.type = Address.types.SCRIPTHASH; this.version = -1; return this; } + + return null; }; /** @@ -570,8 +596,8 @@ Address.prototype.fromHash = function fromHash(hash, type, version, network) { network = Network.get(network); assert(Buffer.isBuffer(hash)); - assert(util.isNumber(type)); - assert(util.isNumber(version)); + assert(util.isU8(type)); + assert(util.isI8(version)); assert(type >= Address.types.PUBKEYHASH && type <= Address.types.WITNESS, 'Not a valid address type.'); @@ -620,7 +646,7 @@ Address.fromHash = function fromHash(hash, type, version, network) { */ Address.prototype.fromPubkeyhash = function fromPubkeyhash(hash, network) { - let type = Address.types.PUBKEYHASH; + const type = Address.types.PUBKEYHASH; assert(hash.length === 20, 'P2PKH must be 20 bytes.'); return this.fromHash(hash, type, -1, network); }; @@ -645,7 +671,7 @@ Address.fromPubkeyhash = function fromPubkeyhash(hash, network) { */ Address.prototype.fromScripthash = function fromScripthash(hash, network) { - let type = Address.types.SCRIPTHASH; + const type = Address.types.SCRIPTHASH; assert(hash && hash.length === 20, 'P2SH must be 20 bytes.'); return this.fromHash(hash, type, -1, network); }; @@ -670,7 +696,7 @@ Address.fromScripthash = function fromScripthash(hash, network) { */ Address.prototype.fromWitnessPubkeyhash = function fromWitnessPubkeyhash(hash, network) { - let type = Address.types.WITNESS; + const type = Address.types.WITNESS; assert(hash && hash.length === 20, 'P2WPKH must be 20 bytes.'); return this.fromHash(hash, type, 0, network); }; @@ -695,7 +721,7 @@ Address.fromWitnessPubkeyhash = function fromWitnessPubkeyhash(hash, network) { */ Address.prototype.fromWitnessScripthash = function fromWitnessScripthash(hash, network) { - let type = Address.types.WITNESS; + const type = Address.types.WITNESS; assert(hash && hash.length === 32, 'P2WPKH must be 32 bytes.'); return this.fromHash(hash, type, 0, network); }; @@ -721,7 +747,7 @@ Address.fromWitnessScripthash = function fromWitnessScripthash(hash, network) { */ Address.prototype.fromProgram = function fromProgram(version, hash, network) { - let type = Address.types.WITNESS; + const type = Address.types.WITNESS; assert(version >= 0, 'Bad version for witness program.'); @@ -821,11 +847,11 @@ Address.prototype.isUnknown = function isUnknown() { */ Address.getHash = function getHash(data, enc, network) { - let hash; - if (!data) throw new Error('Object is not an address.'); + let hash; + if (typeof data === 'string') { if (data.length === 40 || data.length === 64) return enc === 'hex' ? data : Buffer.from(data, 'hex'); @@ -859,7 +885,7 @@ Address.getHash = function getHash(data, enc, network) { */ Address.getType = function getType(prefix, network) { - let prefixes = network.addressPrefix; + const prefixes = network.addressPrefix; switch (prefix) { case prefixes.pubkeyhash: return Address.types.PUBKEYHASH; @@ -873,6 +899,35 @@ Address.getType = function getType(prefix, network) { } }; +/* + * Helpers + */ + +function isMixedCase(str) { + let lower = false; + let upper = false; + + for (let i = 0; i < str.length; i++) { + const ch = str.charCodeAt(i); + + if (ch >= 0x30 && ch <= 0x39) + continue; + + if (ch & 32) { + assert(ch >= 0x61 && ch <= 0x7a); + lower = true; + } else { + assert(ch >= 0x41 && ch <= 0x5a); + upper = true; + } + + if (lower && upper) + return true; + } + + return false; +} + /* * Expose */ diff --git a/lib/primitives/block.js b/lib/primitives/block.js index 5eb721531..7e20bcb46 100644 --- a/lib/primitives/block.js +++ b/lib/primitives/block.js @@ -45,7 +45,7 @@ function Block(options) { this.fromOptions(options); } -util.inherits(Block, AbstractBlock); +Object.setPrototypeOf(Block.prototype, AbstractBlock.prototype); /** * Inject properties from options object. @@ -58,8 +58,10 @@ Block.prototype.fromOptions = function fromOptions(options) { if (options.txs) { assert(Array.isArray(options.txs)); - for (let tx of options.txs) - this.addTX(tx); + for (const tx of options.txs) { + assert(tx instanceof TX); + this.txs.push(tx); + } } }; @@ -79,8 +81,17 @@ Block.fromOptions = function fromOptions(options) { */ Block.prototype.refresh = function refresh(all) { + this._refresh(); + this._raw = null; - this._refresh(all); + this._size = -1; + this._witness = -1; + + if (!all) + return; + + for (const tx of this.txs) + tx.refresh(); }; /** @@ -109,12 +120,10 @@ Block.prototype.toNormal = function toNormal() { */ Block.prototype.toWriter = function toWriter(bw) { - let raw; - if (this.mutable) return this.writeWitness(bw); - raw = this.frame(); + const raw = this.frame(); bw.writeBytes(raw.data); return bw; @@ -141,25 +150,23 @@ Block.prototype.toNormalWriter = function toNormalWriter(bw) { */ Block.prototype.frame = function frame() { - let raw; - if (this.mutable) { assert(!this._raw); return this.frameWitness(); } if (this._raw) { - assert(this._size > 0); + assert(this._size >= 0); assert(this._witness >= 0); - raw = new RawBlock(this._size, this._witness); + const raw = new RawBlock(this._size, this._witness); raw.data = this._raw; return raw; } - raw = this.frameWitness(); + const raw = this.frameWitness(); this._raw = raw.data; - this._size = raw.total; + this._size = raw.size; this._witness = raw.witness; return raw; @@ -167,7 +174,7 @@ Block.prototype.frame = function frame() { /** * Calculate real size and size of the witness bytes. - * @returns {Object} Contains `total` and `witness`. + * @returns {Object} Contains `size` and `witness`. */ Block.prototype.getSizes = function getSizes() { @@ -182,7 +189,7 @@ Block.prototype.getSizes = function getSizes() { */ Block.prototype.getVirtualSize = function getVirtualSize() { - let scale = consensus.WITNESS_SCALE_FACTOR; + const scale = consensus.WITNESS_SCALE_FACTOR; return (this.getWeight() + scale - 1) / scale | 0; }; @@ -192,9 +199,9 @@ Block.prototype.getVirtualSize = function getVirtualSize() { */ Block.prototype.getWeight = function getWeight() { - let sizes = this.getSizes(); - let base = sizes.total - sizes.witness; - return base * (consensus.WITNESS_SCALE_FACTOR - 1) + sizes.total; + const raw = this.getSizes(); + const base = raw.size - raw.witness; + return base * (consensus.WITNESS_SCALE_FACTOR - 1) + raw.size; }; /** @@ -203,7 +210,7 @@ Block.prototype.getWeight = function getWeight() { */ Block.prototype.getSize = function getSize() { - return this.getSizes().total; + return this.getSizes().size; }; /** @@ -212,8 +219,8 @@ Block.prototype.getSize = function getSize() { */ Block.prototype.getBaseSize = function getBaseSize() { - let sizes = this.getSizes(); - return sizes.total - sizes.witness; + const raw = this.getSizes(); + return raw.size - raw.witness; }; /** @@ -226,7 +233,7 @@ Block.prototype.hasWitness = function hasWitness() { if (this._witness !== -1) return this._witness !== 0; - for (let tx of this.txs) { + for (const tx of this.txs) { if (tx.hasWitness()) return true; } @@ -234,16 +241,6 @@ Block.prototype.hasWitness = function hasWitness() { return false; }; -/** - * Add a transaction to the block's tx vector. - * @param {TX} tx - * @returns {Number} - */ - -Block.prototype.addTX = function addTX(tx) { - return this.txs.push(tx) - 1; -}; - /** * Test the block's transaction vector against a hash. * @param {Hash} hash @@ -262,7 +259,7 @@ Block.prototype.hasTX = function hasTX(hash) { Block.prototype.indexOf = function indexOf(hash) { for (let i = 0; i < this.txs.length; i++) { - let tx = this.txs[i]; + const tx = this.txs[i]; if (tx.hash('hex') === hash) return i; } @@ -278,13 +275,12 @@ Block.prototype.indexOf = function indexOf(hash) { */ Block.prototype.createMerkleRoot = function createMerkleRoot(enc) { - let leaves = []; - let root, malleated; + const leaves = []; - for (let tx of this.txs) + for (const tx of this.txs) leaves.push(tx.hash()); - [root, malleated] = merkle.createRoot(leaves); + const [root, malleated] = merkle.createRoot(leaves); if (malleated) return null; @@ -309,25 +305,24 @@ Block.prototype.createWitnessNonce = function createWitnessNonce() { */ Block.prototype.createCommitmentHash = function createCommitmentHash(enc) { - let nonce = this.getWitnessNonce(); - let leaves = []; - let root, hash; + const nonce = this.getWitnessNonce(); + const leaves = []; assert(nonce, 'No witness nonce present.'); leaves.push(encoding.ZERO_HASH); for (let i = 1; i < this.txs.length; i++) { - let tx = this.txs[i]; + const tx = this.txs[i]; leaves.push(tx.witnessHash()); } - [root] = merkle.createRoot(leaves); + const [root] = merkle.createRoot(leaves); // Note: malleation check ignored here. // assert(!malleated); - hash = digest.root256(root, nonce); + const hash = digest.root256(root, nonce); return enc === 'hex' ? hash.toString('hex') @@ -353,17 +348,15 @@ Block.prototype.getMerkleRoot = function getMerkleRoot(enc) { */ Block.prototype.getWitnessNonce = function getWitnessNonce() { - let coinbase, input; - if (this.txs.length === 0) return null; - coinbase = this.txs[0]; + const coinbase = this.txs[0]; if (coinbase.inputs.length !== 1) return null; - input = coinbase.inputs[0]; + const input = coinbase.inputs[0]; if (input.witness.items.length !== 1) return null; @@ -382,17 +375,16 @@ Block.prototype.getWitnessNonce = function getWitnessNonce() { */ Block.prototype.getCommitmentHash = function getCommitmentHash(enc) { - let coinbase, hash; - if (this.txs.length === 0) return null; - coinbase = this.txs[0]; + const coinbase = this.txs[0]; + let hash; for (let i = coinbase.outputs.length - 1; i >= 0; i--) { - let output = coinbase.outputs[i]; + const output = coinbase.outputs[i]; if (output.script.isCommitment()) { - hash = output.script.getCommitmentHash(); + hash = output.script.getCommitment(); break; } } @@ -412,7 +404,7 @@ Block.prototype.getCommitmentHash = function getCommitmentHash(enc) { */ Block.prototype.verifyBody = function verifyBody() { - let [valid] = this.checkBody(); + const [valid] = this.checkBody(); return valid; }; @@ -423,12 +415,8 @@ Block.prototype.verifyBody = function verifyBody() { */ Block.prototype.checkBody = function checkBody() { - let sigops = 0; - let scale = consensus.WITNESS_SCALE_FACTOR; - let root; - // Check merkle root. - root = this.createMerkleRoot('hex'); + const root = this.createMerkleRoot('hex'); // If the merkle is mutated, // we have duplicate txs. @@ -450,16 +438,18 @@ Block.prototype.checkBody = function checkBody() { return [false, 'bad-cb-missing', 100]; // Test all transactions. + const scale = consensus.WITNESS_SCALE_FACTOR; + let sigops = 0; + for (let i = 0; i < this.txs.length; i++) { - let tx = this.txs[i]; - let valid, reason, score; + const tx = this.txs[i]; // The rest of the txs must not be coinbases. if (i > 0 && tx.isCoinbase()) return [false, 'bad-cb-multiple', 100]; // Sanity checks. - [valid, reason, score] = tx.checkSanity(); + const [valid, reason, score] = tx.checkSanity(); if (!valid) return [valid, reason, score]; @@ -479,15 +469,13 @@ Block.prototype.checkBody = function checkBody() { */ Block.prototype.getCoinbaseHeight = function getCoinbaseHeight() { - let coinbase; - if (this.version < 2) return -1; if (this.txs.length === 0) return -1; - coinbase = this.txs[0]; + const coinbase = this.txs[0]; if (coinbase.inputs.length === 0) return -1; @@ -513,12 +501,12 @@ Block.prototype.getClaimed = function getClaimed() { */ Block.prototype.getPrevout = function getPrevout() { - let prevout = {}; + const prevout = Object.create(null); for (let i = 1; i < this.txs.length; i++) { - let tx = this.txs[i]; + const tx = this.txs[i]; - for (let input of tx.inputs) + for (const input of tx.inputs) prevout[input.prevout.hash] = true; } @@ -544,20 +532,20 @@ Block.prototype.inspect = function inspect() { */ Block.prototype.format = function format(view, height) { - let commitmentHash = this.getCommitmentHash('hex'); + const commitmentHash = this.getCommitmentHash('hex'); return { hash: this.rhash(), height: height != null ? height : -1, size: this.getSize(), virtualSize: this.getVirtualSize(), - date: util.date(this.ts), + date: util.date(this.time), version: util.hex32(this.version), prevBlock: util.revHex(this.prevBlock), merkleRoot: util.revHex(this.merkleRoot), commitmentHash: commitmentHash ? util.revHex(commitmentHash) : null, - ts: this.ts, + time: this.time, bits: this.bits, nonce: this.nonce, txs: this.txs.map((tx, i) => { @@ -595,7 +583,7 @@ Block.prototype.getJSON = function getJSON(network, view, height) { version: this.version, prevBlock: util.revHex(this.prevBlock), merkleRoot: util.revHex(this.merkleRoot), - ts: this.ts, + time: this.time, bits: this.bits, nonce: this.nonce, txs: this.txs.map((tx, i) => { @@ -616,7 +604,7 @@ Block.prototype.fromJSON = function fromJSON(json) { this.parseJSON(json); - for (let tx of json.txs) + for (const tx of json.txs) this.txs.push(TX.fromJSON(tx)); return this; @@ -639,19 +627,17 @@ Block.fromJSON = function fromJSON(json) { */ Block.prototype.fromReader = function fromReader(br) { - let witness = 0; - let count; - br.start(); - this.parseAbbr(br); + this.readHead(br); - count = br.readVarint(); + const count = br.readVarint(); + let witness = 0; for (let i = 0; i < count; i++) { - let tx = TX.fromReader(br); + const tx = TX.fromReader(br); witness += tx._witness; - this.addTX(tx); + this.txs.push(tx); } if (!this.mutable) { @@ -718,14 +704,12 @@ Block.prototype.toMerkle = function toMerkle(filter) { */ Block.prototype.writeNormal = function writeNormal(bw) { - this.writeAbbr(bw); + this.writeHead(bw); bw.writeVarint(this.txs.length); - for (let i = 0; i < this.txs.length; i++) { - let tx = this.txs[i]; + for (const tx of this.txs) tx.toNormalWriter(bw); - } return bw; }; @@ -739,14 +723,12 @@ Block.prototype.writeNormal = function writeNormal(bw) { */ Block.prototype.writeWitness = function writeWitness(bw) { - this.writeAbbr(bw); + this.writeHead(bw); bw.writeVarint(this.txs.length); - for (let i = 0; i < this.txs.length; i++) { - let tx = this.txs[i]; + for (const tx of this.txs) tx.toWriter(bw); - } return bw; }; @@ -760,11 +742,11 @@ Block.prototype.writeWitness = function writeWitness(bw) { */ Block.prototype.frameNormal = function frameNormal() { - let sizes = this.getNormalSizes(); - let bw = new StaticWriter(sizes.total); + const raw = this.getNormalSizes(); + const bw = new StaticWriter(raw.size); this.writeNormal(bw); - sizes.data = bw.render(); - return sizes; + raw.data = bw.render(); + return raw; }; /** @@ -775,11 +757,11 @@ Block.prototype.frameNormal = function frameNormal() { */ Block.prototype.frameWitness = function frameWitness() { - let sizes = this.getWitnessSizes(); - let bw = new StaticWriter(sizes.total); + const raw = this.getWitnessSizes(); + const bw = new StaticWriter(raw.size); this.writeWitness(bw); - sizes.data = bw.render(); - return sizes; + raw.data = bw.render(); + return raw; }; /** @@ -802,10 +784,8 @@ Block.prototype.getNormalSizes = function getNormalSizes() { size += 80; size += encoding.sizeVarint(this.txs.length); - for (let i = 0; i < this.txs.length; i++) { - let tx = this.txs[i]; + for (const tx of this.txs) size += tx.getBaseSize(); - } return new RawBlock(size, 0); }; @@ -822,11 +802,10 @@ Block.prototype.getWitnessSizes = function getWitnessSizes() { size += 80; size += encoding.sizeVarint(this.txs.length); - for (let i = 0; i < this.txs.length; i++) { - let tx = this.txs[i]; - let sizes = tx.getSizes(); - size += sizes.total; - witness += sizes.witness; + for (const tx of this.txs) { + const raw = tx.getSizes(); + size += raw.size; + witness += raw.witness; } return new RawBlock(size, witness); @@ -848,9 +827,9 @@ Block.isBlock = function isBlock(obj) { * Helpers */ -function RawBlock(total, witness) { +function RawBlock(size, witness) { this.data = null; - this.total = total; + this.size = size; this.witness = witness; } diff --git a/lib/primitives/coin.js b/lib/primitives/coin.js index 230a82382..f4c5101ad 100644 --- a/lib/primitives/coin.js +++ b/lib/primitives/coin.js @@ -49,7 +49,7 @@ function Coin(options) { this.fromOptions(options); } -util.inherits(Coin, Output); +Object.setPrototypeOf(Coin.prototype, Output.prototype); /** * Inject options into coin. @@ -61,13 +61,13 @@ Coin.prototype.fromOptions = function fromOptions(options) { assert(options, 'Coin data is required.'); if (options.version != null) { - assert(util.isUInt32(options.version), 'Version must be a uint32.'); + assert(util.isU32(options.version), 'Version must be a uint32.'); this.version = options.version; } if (options.height != null) { if (options.height !== -1) { - assert(util.isUInt32(options.height), 'Height must be a uint32.'); + assert(util.isU32(options.height), 'Height must be a uint32.'); this.height = options.height; } else { this.height = -1; @@ -75,7 +75,7 @@ Coin.prototype.fromOptions = function fromOptions(options) { } if (options.value != null) { - assert(util.isUInt53(options.value), 'Value must be a uint53.'); + assert(util.isU64(options.value), 'Value must be a uint64.'); this.value = options.value; } @@ -94,7 +94,7 @@ Coin.prototype.fromOptions = function fromOptions(options) { } if (options.index != null) { - assert(util.isUInt32(options.index), 'Index must be a uint32.'); + assert(util.isU32(options.index), 'Index must be a uint32.'); this.index = options.index; } @@ -163,7 +163,7 @@ Coin.prototype.toKey = function toKey() { Coin.prototype.fromKey = function fromKey(key) { assert(key.length > 64); this.hash = key.slice(0, 64); - this.index = +key.slice(64); + this.index = parseInt(key.slice(64), 10); return this; }; @@ -262,10 +262,10 @@ Coin.prototype.getJSON = function getJSON(network, minimal) { Coin.prototype.fromJSON = function fromJSON(json) { assert(json, 'Coin data required.'); - assert(util.isUInt32(json.version), 'Version must be a uint32.'); - assert(json.height === -1 || util.isUInt32(json.height), + assert(util.isU32(json.version), 'Version must be a uint32.'); + assert(json.height === -1 || util.isU32(json.height), 'Height must be a uint32.'); - assert(util.isUInt53(json.value), 'Value must be a uint53.'); + assert(util.isU64(json.value), 'Value must be a uint64.'); assert(typeof json.coinbase === 'boolean', 'Coinbase must be a boolean.'); this.version = json.version; @@ -277,7 +277,7 @@ Coin.prototype.fromJSON = function fromJSON(json) { if (json.hash != null) { assert(typeof json.hash === 'string', 'Hash must be a string.'); assert(json.hash.length === 64, 'Hash must be a string.'); - assert(util.isUInt32(json.index), 'Index must be a uint32.'); + assert(util.isU32(json.index), 'Index must be a uint32.'); this.hash = util.revHex(json.hash); this.index = json.index; } @@ -317,7 +317,7 @@ Coin.prototype.toWriter = function toWriter(bw) { bw.writeU32(this.version); bw.writeU32(height); - bw.write64(this.value); + bw.writeI64(this.value); bw.writeVarBytes(this.script.toRaw()); bw.writeU8(this.coinbase ? 1 : 0); @@ -330,7 +330,7 @@ Coin.prototype.toWriter = function toWriter(bw) { */ Coin.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -343,7 +343,7 @@ Coin.prototype.toRaw = function toRaw() { Coin.prototype.fromReader = function fromReader(br) { this.version = br.readU32(); this.height = br.readU32(); - this.value = br.read64(); + this.value = br.readI64(); this.script.fromRaw(br.readVarBytes()); this.coinbase = br.readU8() === 1; diff --git a/lib/primitives/headers.js b/lib/primitives/headers.js index 7599ad911..ecbda8898 100644 --- a/lib/primitives/headers.js +++ b/lib/primitives/headers.js @@ -30,7 +30,7 @@ function Headers(options) { this.parseOptions(options); } -util.inherits(Headers, AbstractBlock); +Object.setPrototypeOf(Headers.prototype, AbstractBlock.prototype); /** * Do non-contextual verification on the headers. @@ -58,7 +58,7 @@ Headers.prototype.getSize = function getSize() { */ Headers.prototype.toWriter = function toWriter(bw) { - this.writeAbbr(bw); + this.writeHead(bw); bw.writeVarint(0); return bw; }; @@ -69,7 +69,7 @@ Headers.prototype.toWriter = function toWriter(bw) { */ Headers.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -80,7 +80,7 @@ Headers.prototype.toRaw = function toRaw() { */ Headers.prototype.fromReader = function fromReader(br) { - this.parseAbbr(br); + this.readHead(br); br.readVarint(); return this; }; @@ -118,36 +118,6 @@ Headers.fromRaw = function fromRaw(data, enc) { return new Headers().fromRaw(data); }; -/** - * Inject properties from buffer reader. - * @private - * @param {BufferReader} br - */ - -Headers.prototype.fromAbbrReader = function fromAbbrReader(br) { - return this.parseAbbr(br); -}; - -/** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - */ - -Headers.prototype.fromAbbr = function fromAbbr(data) { - return this.fromAbbrReader(new BufferReader(data)); -}; - -/** - * Instantiate headers from buffer reader. - * @param {BufferReader} br - * @returns {Headers} - */ - -Headers.fromAbbrReader = function fromAbbrReader(br) { - return new Headers().fromAbbrReader(br); -}; - /** * Instantiate headers from serialized data. * @param {Buffer} data @@ -155,10 +125,10 @@ Headers.fromAbbrReader = function fromAbbrReader(br) { * @returns {Headers} */ -Headers.fromAbbr = function fromAbbr(data, enc) { +Headers.fromHead = function fromHead(data, enc) { if (typeof data === 'string') data = Buffer.from(data, enc); - return new Headers().fromAbbr(data); + return new Headers().fromHead(data); }; /** @@ -168,8 +138,15 @@ Headers.fromAbbr = function fromAbbr(data, enc) { */ Headers.fromEntry = function fromEntry(entry) { - let headers = new Headers(entry); + const headers = new Headers(); + headers.version = entry.version; + headers.prevBlock = entry.prevBlock; + headers.merkleRoot = entry.merkleRoot; + headers.time = entry.time; + headers.bits = entry.bits; + headers.nonce = entry.nonce; headers._hash = Buffer.from(entry.hash, 'hex'); + headers._hhash = entry.hash; return headers; }; @@ -189,7 +166,7 @@ Headers.prototype.toHeaders = function toHeaders() { */ Headers.fromBlock = function fromBlock(block) { - let headers = new Headers(block); + const headers = new Headers(block); headers._hash = block._hash; headers._hhash = block._hhash; return headers; @@ -223,7 +200,7 @@ Headers.prototype.getJSON = function getJSON(network, view, height) { version: this.version, prevBlock: util.revHex(this.prevBlock), merkleRoot: util.revHex(this.merkleRoot), - ts: this.ts, + time: this.time, bits: this.bits, nonce: this.nonce }; @@ -272,11 +249,11 @@ Headers.prototype.format = function format(view, height) { return { hash: this.rhash(), height: height != null ? height : -1, - date: util.date(this.ts), + date: util.date(this.time), version: util.hex32(this.version), prevBlock: util.revHex(this.prevBlock), merkleRoot: util.revHex(this.merkleRoot), - ts: this.ts, + time: this.time, bits: this.bits, nonce: this.nonce }; @@ -291,7 +268,7 @@ Headers.prototype.format = function format(view, height) { Headers.isHeaders = function isHeaders(obj) { return obj && !obj.txs - && typeof obj.abbr === 'function' + && typeof obj.toHead === 'function' && typeof obj.toBlock !== 'function'; }; diff --git a/lib/primitives/input.js b/lib/primitives/input.js index 95ddb04eb..1a272533c 100644 --- a/lib/primitives/input.js +++ b/lib/primitives/input.js @@ -55,7 +55,7 @@ Input.prototype.fromOptions = function fromOptions(options) { this.script.fromOptions(options.script); if (options.sequence != null) { - assert(util.isUInt32(options.sequence), 'Sequence must be a uint32.'); + assert(util.isU32(options.sequence), 'Sequence must be a uint32.'); this.sequence = options.sequence; } @@ -81,7 +81,7 @@ Input.fromOptions = function fromOptions(options) { */ Input.prototype.clone = function clone() { - let input = new Input(); + const input = new Input(); input.prevout = this.prevout; input.script.inject(this.script); input.sequence = this.sequence; @@ -89,6 +89,28 @@ Input.prototype.clone = function clone() { return input; }; +/** + * Test equality against another input. + * @param {Input} input + * @returns {Boolean} + */ + +Input.prototype.equals = function equals(input) { + assert(Input.isInput(input)); + return this.prevout.equals(input.prevout); +}; + +/** + * Compare against another input (BIP69). + * @param {Input} input + * @returns {Number} + */ + +Input.prototype.compare = function compare(input) { + assert(Input.isInput(input)); + return this.prevout.compare(input.prevout); +}; + /** * Get the previous output script type as a string. * Will "guess" based on the input script and/or @@ -98,14 +120,14 @@ Input.prototype.clone = function clone() { */ Input.prototype.getType = function getType(coin) { - let type; - if (this.isCoinbase()) return 'coinbase'; if (coin) return coin.getType(); + let type; + if (this.witness.items.length > 0) type = this.witness.getInputType(); else @@ -122,10 +144,8 @@ Input.prototype.getType = function getType(coin) { */ Input.prototype.getRedeem = function getRedeem(coin) { - let redeem, prev; - if (this.isCoinbase()) - return; + return null; if (!coin) { if (this.witness.isScripthashInput()) @@ -134,10 +154,11 @@ Input.prototype.getRedeem = function getRedeem(coin) { if (this.script.isScripthashInput()) return this.script.getRedeem(); - return; + return null; } - prev = coin.script; + let prev = coin.script; + let redeem = null; if (prev.isScripthash()) { prev = this.script.getRedeem(); @@ -159,17 +180,15 @@ Input.prototype.getRedeem = function getRedeem(coin) { */ Input.prototype.getSubtype = function getSubtype(coin) { - let redeem, type; - if (this.isCoinbase()) - return; + return null; - redeem = this.getRedeem(coin); + const redeem = this.getRedeem(coin); if (!redeem) - return; + return null; - type = redeem.getType(); + const type = redeem.getType(); return Script.typesByVal[type].toLowerCase(); }; @@ -184,7 +203,7 @@ Input.prototype.getSubtype = function getSubtype(coin) { Input.prototype.getAddress = function getAddress(coin) { if (this.isCoinbase()) - return; + return null; if (coin) return coin.getAddress(); @@ -202,9 +221,11 @@ Input.prototype.getAddress = function getAddress(coin) { */ Input.prototype.getHash = function getHash(enc) { - let addr = this.getAddress(); + const addr = this.getAddress(); + if (!addr) - return; + return null; + return addr.getHash(enc); }; @@ -285,10 +306,9 @@ Input.prototype.toJSON = function toJSON(network, coin) { */ Input.prototype.getJSON = function getJSON(network, coin) { - let addr; - network = Network.get(network); + let addr; if (!coin) { addr = this.getAddress(); if (addr) @@ -313,7 +333,7 @@ Input.prototype.getJSON = function getJSON(network, coin) { Input.prototype.fromJSON = function fromJSON(json) { assert(json, 'Input data is required.'); - assert(util.isUInt32(json.sequence), 'Sequence must be a uint32.'); + assert(util.isU32(json.sequence), 'Sequence must be a uint32.'); this.prevout.fromJSON(json.prevout); this.script.fromJSON(json.script); this.witness.fromJSON(json.witness); @@ -347,7 +367,7 @@ Input.prototype.getSize = function getSize() { */ Input.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -490,11 +510,7 @@ Input.fromTX = function fromTX(tx, index) { */ Input.isInput = function isInput(obj) { - return obj - && typeof obj.prevout === 'object' - && typeof obj.script === 'object' - && typeof obj.witness === 'object' - && typeof obj.getAddress === 'function'; + return obj instanceof Input; }; /* diff --git a/lib/primitives/invitem.js b/lib/primitives/invitem.js index 397ccb7e6..74d9a0663 100644 --- a/lib/primitives/invitem.js +++ b/lib/primitives/invitem.js @@ -51,7 +51,7 @@ InvItem.types = { * @const {RevMap} */ -InvItem.typesByVal = util.revMap(InvItem.types); +InvItem.typesByVal = util.reverse(InvItem.types); /** * Witness bit for inv types. diff --git a/lib/primitives/keyring.js b/lib/primitives/keyring.js index 604a6eb7f..b7d9830b1 100644 --- a/lib/primitives/keyring.js +++ b/lib/primitives/keyring.js @@ -58,13 +58,11 @@ function KeyRing(options, network) { */ KeyRing.prototype.fromOptions = function fromOptions(options, network) { - let key = toKey(options); - let script = options.script; - let compressed = options.compressed; - if (!network) network = options.network; + let key = toKey(options); + if (Buffer.isBuffer(key)) return this.fromKey(key, network); @@ -86,10 +84,13 @@ KeyRing.prototype.fromOptions = function fromOptions(options, network) { this.nested = options.nested; } + const script = options.script; + const compress = options.compressed; + if (script) - return this.fromScript(key, script, compressed, network); + return this.fromScript(key, script, compress, network); - this.fromKey(key, compressed, network); + return this.fromKey(key, compress, network); }; /** @@ -121,22 +122,22 @@ KeyRing.prototype.refresh = function refresh() { * Inject data from private key. * @private * @param {Buffer} key - * @param {Boolean?} compressed + * @param {Boolean?} compress * @param {(NetworkType|Network)?} network */ -KeyRing.prototype.fromPrivate = function fromPrivate(key, compressed, network) { +KeyRing.prototype.fromPrivate = function fromPrivate(key, compress, network) { assert(Buffer.isBuffer(key), 'Private key must be a buffer.'); assert(secp256k1.privateKeyVerify(key), 'Not a valid private key.'); - if (typeof compressed !== 'boolean') { - network = compressed; - compressed = null; + if (typeof compress !== 'boolean') { + network = compress; + compress = null; } this.network = Network.get(network); this.privateKey = key; - this.publicKey = secp256k1.publicKeyCreate(key, compressed !== false); + this.publicKey = secp256k1.publicKeyCreate(key, compress !== false); return this; }; @@ -144,13 +145,13 @@ KeyRing.prototype.fromPrivate = function fromPrivate(key, compressed, network) { /** * Instantiate keyring from a private key. * @param {Buffer} key - * @param {Boolean?} compressed + * @param {Boolean?} compress * @param {(NetworkType|Network)?} network * @returns {KeyRing} */ -KeyRing.fromPrivate = function fromPrivate(key, compressed, network) { - return new KeyRing().fromPrivate(key, compressed, network); +KeyRing.fromPrivate = function fromPrivate(key, compress, network) { + return new KeyRing().fromPrivate(key, compress, network); }; /** @@ -171,31 +172,31 @@ KeyRing.prototype.fromPublic = function fromPublic(key, network) { /** * Generate a keyring. * @private + * @param {Boolean?} compress * @param {(Network|NetworkType)?} network * @returns {KeyRing} */ -KeyRing.prototype.generate = function generate(compressed, network) { - let key; - - if (typeof compressed !== 'boolean') { - network = compressed; - compressed = null; +KeyRing.prototype.generate = function generate(compress, network) { + if (typeof compress !== 'boolean') { + network = compress; + compress = null; } - key = secp256k1.generatePrivateKey(); + const key = secp256k1.generatePrivateKey(); - return this.fromKey(key, compressed, network); + return this.fromKey(key, compress, network); }; /** * Generate a keyring. + * @param {Boolean?} compress * @param {(Network|NetworkType)?} network * @returns {KeyRing} */ -KeyRing.generate = function generate(compressed, network) { - return new KeyRing().generate(compressed, network); +KeyRing.generate = function generate(compress, network) { + return new KeyRing().generate(compress, network); }; /** @@ -213,19 +214,20 @@ KeyRing.fromPublic = function fromPublic(key, network) { * Inject data from public key. * @private * @param {Buffer} privateKey + * @param {Boolean?} compress * @param {(NetworkType|Network)?} network */ -KeyRing.prototype.fromKey = function fromKey(key, compressed, network) { +KeyRing.prototype.fromKey = function fromKey(key, compress, network) { assert(Buffer.isBuffer(key), 'Key must be a buffer.'); - if (typeof compressed !== 'boolean') { - network = compressed; - compressed = null; + if (typeof compress !== 'boolean') { + network = compress; + compress = null; } if (key.length === 32) - return this.fromPrivate(key, compressed !== false, network); + return this.fromPrivate(key, compress !== false, network); return this.fromPublic(key, network); }; @@ -233,12 +235,13 @@ KeyRing.prototype.fromKey = function fromKey(key, compressed, network) { /** * Instantiate keyring from a public key. * @param {Buffer} publicKey + * @param {Boolean?} compress * @param {(NetworkType|Network)?} network * @returns {KeyRing} */ -KeyRing.fromKey = function fromKey(key, compressed, network) { - return new KeyRing().fromKey(key, compressed, network); +KeyRing.fromKey = function fromKey(key, compress, network) { + return new KeyRing().fromKey(key, compress, network); }; /** @@ -246,18 +249,19 @@ KeyRing.fromKey = function fromKey(key, compressed, network) { * @private * @param {Buffer} key * @param {Script} script + * @param {Boolean?} compress * @param {(NetworkType|Network)?} network */ -KeyRing.prototype.fromScript = function fromScript(key, script, compressed, network) { +KeyRing.prototype.fromScript = function fromScript(key, script, compress, network) { assert(script instanceof Script, 'Non-script passed into KeyRing.'); - if (typeof compressed !== 'boolean') { - network = compressed; - compressed = null; + if (typeof compress !== 'boolean') { + network = compress; + compress = null; } - this.fromKey(key, compressed, network); + this.fromKey(key, compress, network); this.script = script; return this; @@ -267,12 +271,13 @@ KeyRing.prototype.fromScript = function fromScript(key, script, compressed, netw * Instantiate keyring from script. * @param {Buffer} key * @param {Script} script + * @param {Boolean?} compress * @param {(NetworkType|Network)?} network * @returns {KeyRing} */ -KeyRing.fromScript = function fromScript(key, script, compressed, network) { - return new KeyRing().fromScript(key, script, compressed, network); +KeyRing.fromScript = function fromScript(key, script, compress, network) { + return new KeyRing().fromScript(key, script, compress, network); }; /** @@ -301,8 +306,8 @@ KeyRing.prototype.getSecretSize = function getSecretSize() { */ KeyRing.prototype.toSecret = function toSecret(network) { - let size = this.getSecretSize(); - let bw = new StaticWriter(size); + const size = this.getSecretSize(); + const bw = new StaticWriter(size); assert(this.privateKey, 'Cannot serialize without private key.'); @@ -330,24 +335,24 @@ KeyRing.prototype.toSecret = function toSecret(network) { */ KeyRing.prototype.fromSecret = function fromSecret(data, network) { - let br = new BufferReader(base58.decode(data), true); - let version, key, compressed; + const br = new BufferReader(base58.decode(data), true); + + const version = br.readU8(); - version = br.readU8(); network = Network.fromWIF(version, network); - key = br.readBytes(32); + const key = br.readBytes(32); + + let compress = false; if (br.left() > 4) { assert(br.readU8() === 1, 'Bad compression flag.'); - compressed = true; - } else { - compressed = false; + compress = true; } br.verifyChecksum(); - return this.fromPrivate(key, compressed, network); + return this.fromPrivate(key, compress, network); }; /** @@ -369,7 +374,7 @@ KeyRing.fromSecret = function fromSecret(data, network) { KeyRing.prototype.getPrivateKey = function getPrivateKey(enc) { if (!this.privateKey) - return; + return null; if (enc === 'base58') return this.toSecret(); @@ -411,17 +416,16 @@ KeyRing.prototype.getScript = function getScript() { */ KeyRing.prototype.getProgram = function getProgram() { - let hash, program; - if (!this.witness) - return; + return null; if (!this._program) { + let program; if (!this.script) { - hash = digest.hash160(this.publicKey); + const hash = digest.hash160(this.publicKey); program = Script.fromProgram(0, hash); } else { - hash = this.script.sha256(); + const hash = this.script.sha256(); program = Script.fromProgram(0, hash); } this._program = program; @@ -439,7 +443,7 @@ KeyRing.prototype.getProgram = function getProgram() { KeyRing.prototype.getNestedHash = function getNestedHash(enc) { if (!this.witness) - return; + return null; if (!this._nestedHash) this._nestedHash = this.getProgram().hash160(); @@ -456,15 +460,13 @@ KeyRing.prototype.getNestedHash = function getNestedHash(enc) { */ KeyRing.prototype.getNestedAddress = function getNestedAddress(enc) { - let hash, address; - if (!this.witness) - return; + return null; if (!this._nestedAddress) { - hash = this.getNestedHash(); - address = Address.fromScripthash(hash, this.network); - this._nestedAddress = address; + const hash = this.getNestedHash(); + const addr = Address.fromScripthash(hash, this.network); + this._nestedAddress = addr; } if (enc === 'base58') @@ -494,9 +496,9 @@ KeyRing.prototype.getScriptHash = function getScriptHash(enc) { * @returns {Buffer} */ -KeyRing.prototype.getScriptHash160 = function getScriptHash256(enc) { +KeyRing.prototype.getScriptHash160 = function getScriptHash160(enc) { if (!this.script) - return; + return null; if (!this._scriptHash160) this._scriptHash160 = this.script.hash160(); @@ -514,7 +516,7 @@ KeyRing.prototype.getScriptHash160 = function getScriptHash256(enc) { KeyRing.prototype.getScriptHash256 = function getScriptHash256(enc) { if (!this.script) - return; + return null; if (!this._scriptHash256) this._scriptHash256 = this.script.sha256(); @@ -531,20 +533,19 @@ KeyRing.prototype.getScriptHash256 = function getScriptHash256(enc) { */ KeyRing.prototype.getScriptAddress = function getScriptAddress(enc) { - let hash, address; - if (!this.script) - return; + return null; if (!this._scriptAddress) { + let addr; if (this.witness) { - hash = this.getScriptHash256(); - address = Address.fromWitnessScripthash(hash, this.network); + const hash = this.getScriptHash256(); + addr = Address.fromWitnessScripthash(hash, this.network); } else { - hash = this.getScriptHash160(); - address = Address.fromScripthash(hash, this.network); + const hash = this.getScriptHash160(); + addr = Address.fromScripthash(hash, this.network); } - this._scriptAddress = address; + this._scriptAddress = addr; } if (enc === 'base58') @@ -578,15 +579,16 @@ KeyRing.prototype.getKeyHash = function getKeyHash(enc) { */ KeyRing.prototype.getKeyAddress = function getKeyAddress(enc) { - let hash, address; - if (!this._keyAddress) { - hash = this.getKeyHash(); + const hash = this.getKeyHash(); + + let addr; if (this.witness) - address = Address.fromWitnessPubkeyhash(hash, this.network); + addr = Address.fromWitnessPubkeyhash(hash, this.network); else - address = Address.fromPubkeyhash(hash, this.network); - this._keyAddress = address; + addr = Address.fromPubkeyhash(hash, this.network); + + this._keyAddress = addr; } if (enc === 'base58') @@ -607,8 +609,10 @@ KeyRing.prototype.getKeyAddress = function getKeyAddress(enc) { KeyRing.prototype.getHash = function getHash(enc) { if (this.nested) return this.getNestedHash(enc); + if (this.script) return this.getScriptHash(enc); + return this.getKeyHash(enc); }; @@ -621,8 +625,10 @@ KeyRing.prototype.getHash = function getHash(enc) { KeyRing.prototype.getAddress = function getAddress(enc) { if (this.nested) return this.getNestedAddress(enc); + if (this.script) return this.getScriptAddress(enc); + return this.getKeyAddress(enc); }; @@ -868,7 +874,7 @@ KeyRing.prototype.toWriter = function toWriter(bw) { */ KeyRing.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -880,27 +886,25 @@ KeyRing.prototype.toRaw = function toRaw() { */ KeyRing.prototype.fromReader = function fromReader(br, network) { - let field, key, script; - this.network = Network.get(network); - field = br.readU8(); + const field = br.readU8(); this.witness = (field & 1) !== 0; this.nested = (field & 2) !== 0; - key = br.readVarBytes(); + const key = br.readVarBytes(); if (key.length === 32) { - let compressed = br.readU8() === 1; + const compress = br.readU8() === 1; this.privateKey = key; - this.publicKey = secp256k1.publicKeyCreate(key, compressed); + this.publicKey = secp256k1.publicKeyCreate(key, compress); } else { this.publicKey = key; assert(secp256k1.publicKeyVerify(key), 'Invalid public key.'); } - script = br.readVarBytes(); + const script = br.readVarBytes(); if (script.length > 0) this.script = Script.fromRaw(script); diff --git a/lib/primitives/memblock.js b/lib/primitives/memblock.js index 5209b30b1..fb91ec68f 100644 --- a/lib/primitives/memblock.js +++ b/lib/primitives/memblock.js @@ -7,11 +7,10 @@ 'use strict'; -const util = require('../utils/util'); const AbstractBlock = require('./abstractblock'); const Block = require('./block'); -const Script = require('../script/script'); const Headers = require('./headers'); +const Script = require('../script/script'); const BufferReader = require('../utils/reader'); const DUMMY = Buffer.alloc(0); @@ -40,26 +39,28 @@ function MemBlock() { if (!(this instanceof MemBlock)) return new MemBlock(); + AbstractBlock.call(this); + this._raw = DUMMY; } -util.inherits(MemBlock, AbstractBlock); +Object.setPrototypeOf(MemBlock.prototype, AbstractBlock.prototype); /** - * Memory flag. - * @const {Boolean} - * @default - * @memberof MemBlock# + * Test whether the block is a memblock. + * @returns {Boolean} */ -MemBlock.prototype.memory = true; +MemBlock.prototype.isMemory = function isMemory() { + return true; +}; /** * Serialize the block headers. * @returns {Buffer} */ -MemBlock.prototype.abbr = function abbr() { +MemBlock.prototype.toHead = function toHead() { return this._raw.slice(0, 80); }; @@ -106,31 +107,30 @@ MemBlock.prototype.getCoinbaseHeight = function getCoinbaseHeight() { */ MemBlock.prototype.parseCoinbaseHeight = function parseCoinbaseHeight() { - let br = new BufferReader(this._raw, true); - let count, script; + const br = new BufferReader(this._raw, true); br.seek(80); - count = br.readVarint(); + const txCount = br.readVarint(); - if (count === 0) + if (txCount === 0) return -1; br.seek(4); - count = br.readVarint(); + let inCount = br.readVarint(); - if (count === 0) { + if (inCount === 0) { if (br.readU8() !== 0) - count = br.readVarint(); + inCount = br.readVarint(); } - if (count === 0) + if (inCount === 0) return -1; br.seek(36); - script = br.readVarBytes(); + const script = br.readVarBytes(); return Script.getCoinbaseHeight(script); }; @@ -142,9 +142,9 @@ MemBlock.prototype.parseCoinbaseHeight = function parseCoinbaseHeight() { */ MemBlock.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); + const br = new BufferReader(data, true); - this.parseAbbr(br); + this.readHead(br); this._raw = br.data; @@ -187,7 +187,7 @@ MemBlock.prototype.toNormal = function toNormal() { */ MemBlock.prototype.toBlock = function toBlock() { - let block = Block.fromRaw(this._raw); + const block = Block.fromRaw(this._raw); block._hash = this._hash; block._hhash = this._hhash; @@ -211,7 +211,10 @@ MemBlock.prototype.toHeaders = function toHeaders() { */ MemBlock.isMemBlock = function isMemBlock(obj) { - return obj && obj.memory && typeof obj.toBlock === 'function'; + return obj + && typeof obj.toBlock === 'function' + && typeof obj.isMemory === 'function' + && obj.isMemory(); }; /* diff --git a/lib/primitives/merkleblock.js b/lib/primitives/merkleblock.js index 5ac28db6d..5ff6b7d9c 100644 --- a/lib/primitives/merkleblock.js +++ b/lib/primitives/merkleblock.js @@ -32,18 +32,18 @@ function MerkleBlock(options) { AbstractBlock.call(this); + this.txs = []; this.hashes = []; this.flags = DUMMY; this.totalTX = 0; - this.tree = null; - this.txs = []; + this._tree = null; if (options) this.fromOptions(options); } -util.inherits(MerkleBlock, AbstractBlock); +Object.setPrototypeOf(MerkleBlock.prototype, AbstractBlock.prototype); /** * Inject properties from options object. @@ -57,21 +57,26 @@ MerkleBlock.prototype.fromOptions = function fromOptions(options) { assert(options, 'MerkleBlock data is required.'); assert(Array.isArray(options.hashes)); assert(Buffer.isBuffer(options.flags)); - assert(util.isUInt32(options.totalTX)); + assert(util.isU32(options.totalTX)); if (options.hashes) { for (let hash of options.hashes) { if (typeof hash === 'string') hash = Buffer.from(hash, 'hex'); + assert(Buffer.isBuffer(hash)); this.hashes.push(hash); } } - if (options.flags) + if (options.flags) { + assert(Buffer.isBuffer(options.flags)); this.flags = options.flags; + } - if (options.totalTX != null) + if (options.totalTX != null) { + assert(util.isU32(options.totalTX)); this.totalTX = options.totalTX; + } return this; }; @@ -92,24 +97,14 @@ MerkleBlock.fromOptions = function fromOptions(data) { */ MerkleBlock.prototype.refresh = function refresh(all) { - this.tree = null; - this._refresh(all); -}; + this._refresh(); + this._tree = null; -/** - * Add a transaction to the block's tx vector. - * @param {TX} tx - * @returns {Number} - */ + if (!all) + return; -MerkleBlock.prototype.addTX = function addTX(tx) { - let tree = this.getTree(); - let hash = tx.hash('hex'); - let index = tree.map.get(hash); - - this.txs.push(tx); - - return index != null ? index : -1; + for (const tx of this.txs) + tx.refresh(); }; /** @@ -129,8 +124,8 @@ MerkleBlock.prototype.hasTX = function hasTX(hash) { */ MerkleBlock.prototype.indexOf = function indexOf(hash) { - let tree = this.getTree(); - let index = tree.map.get(hash); + const tree = this.getTree(); + const index = tree.map.get(hash); if (index == null) return -1; @@ -145,7 +140,7 @@ MerkleBlock.prototype.indexOf = function indexOf(hash) { */ MerkleBlock.prototype.verifyBody = function verifyBody() { - let [valid] = this.checkBody(); + const [valid] = this.checkBody(); return valid; }; @@ -156,12 +151,12 @@ MerkleBlock.prototype.verifyBody = function verifyBody() { */ MerkleBlock.prototype.checkBody = function checkBody() { - let tree = this.getTree(); + const tree = this.getTree(); if (tree.root !== this.merkleRoot) return [false, 'bad-txnmrklroot', 100]; - return [true, 'valid', 100]; + return [true, 'valid', 0]; }; /** @@ -171,14 +166,14 @@ MerkleBlock.prototype.checkBody = function checkBody() { */ MerkleBlock.prototype.getTree = function getTree() { - if (!this.tree) { + if (!this._tree) { try { - this.tree = this.extractTree(); + this._tree = this.extractTree(); } catch (e) { - this.tree = new PartialTree(); + this._tree = new PartialTree(); } } - return this.tree; + return this._tree; }; /** @@ -189,31 +184,29 @@ MerkleBlock.prototype.getTree = function getTree() { */ MerkleBlock.prototype.extractTree = function extractTree() { + const matches = []; + const indexes = []; + const map = new Map(); + const hashes = this.hashes; + const flags = this.flags; + const totalTX = this.totalTX; let bitsUsed = 0; let hashUsed = 0; - let matches = []; - let indexes = []; - let map = new Map(); let failed = false; - let hashes = this.hashes; - let flags = this.flags; - let totalTX = this.totalTX; let height = 0; - let root; - let width = (height) => { + const width = (height) => { return (totalTX + (1 << height) - 1) >>> height; }; - let traverse = (height, pos) => { - let parent, hash, left, right; - + const traverse = (height, pos) => { if (bitsUsed >= flags.length * 8) { failed = true; return encoding.ZERO_HASH; } - parent = (flags[bitsUsed / 8 | 0] >>> (bitsUsed % 8)) & 1; + const parent = (flags[bitsUsed / 8 | 0] >>> (bitsUsed % 8)) & 1; + bitsUsed++; if (height === 0 || !parent) { @@ -222,10 +215,10 @@ MerkleBlock.prototype.extractTree = function extractTree() { return encoding.ZERO_HASH; } - hash = hashes[hashUsed++]; + const hash = hashes[hashUsed++]; if (height === 0 && parent) { - let txid = hash.toString('hex'); + const txid = hash.toString('hex'); matches.push(hash); indexes.push(pos); map.set(txid, pos); @@ -234,7 +227,8 @@ MerkleBlock.prototype.extractTree = function extractTree() { return hash; } - left = traverse(height - 1, pos * 2); + const left = traverse(height - 1, pos * 2); + let right; if (pos * 2 + 1 < width(height - 1)) { right = traverse(height - 1, pos * 2 + 1); @@ -262,7 +256,7 @@ MerkleBlock.prototype.extractTree = function extractTree() { while (width(height) > 1) height++; - root = traverse(height, 0); + const root = traverse(height, 0); if (failed) throw new Error('Mutated merkle tree.'); @@ -307,11 +301,11 @@ MerkleBlock.prototype.format = function format(view, height) { return { hash: this.rhash(), height: height != null ? height : -1, - date: util.date(this.ts), + date: util.date(this.time), version: util.hex32(this.version), prevBlock: util.revHex(this.prevBlock), merkleRoot: util.revHex(this.merkleRoot), - ts: this.ts, + time: this.time, bits: this.bits, nonce: this.nonce, totalTX: this.totalTX, @@ -346,13 +340,13 @@ MerkleBlock.prototype.getSize = function getSize() { */ MerkleBlock.prototype.toWriter = function toWriter(bw) { - this.writeAbbr(bw); + this.writeHead(bw); bw.writeU32(this.totalTX); bw.writeVarint(this.hashes.length); - for (let hash of this.hashes) + for (const hash of this.hashes) bw.writeHash(hash); bw.writeVarBytes(this.flags); @@ -367,7 +361,7 @@ MerkleBlock.prototype.toWriter = function toWriter(bw) { */ MerkleBlock.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -378,13 +372,11 @@ MerkleBlock.prototype.toRaw = function toRaw() { */ MerkleBlock.prototype.fromReader = function fromReader(br) { - let count; - - this.parseAbbr(br); + this.readHead(br); this.totalTX = br.readU32(); - count = br.readVarint(); + const count = br.readVarint(); for (let i = 0; i < count; i++) this.hashes.push(br.readHash()); @@ -455,7 +447,7 @@ MerkleBlock.prototype.getJSON = function getJSON(network, view, height) { version: this.version, prevBlock: util.revHex(this.prevBlock), merkleRoot: util.revHex(this.merkleRoot), - ts: this.ts, + time: this.time, bits: this.bits, nonce: this.nonce, totalTX: this.totalTX, @@ -476,7 +468,7 @@ MerkleBlock.prototype.fromJSON = function fromJSON(json) { assert(json, 'MerkleBlock data is required.'); assert(Array.isArray(json.hashes)); assert(typeof json.flags === 'string'); - assert(util.isUInt32(json.totalTX)); + assert(util.isU32(json.totalTX)); this.parseJSON(json); @@ -512,9 +504,9 @@ MerkleBlock.fromJSON = function fromJSON(json) { */ MerkleBlock.fromBlock = function fromBlock(block, filter) { - let matches = []; + const matches = []; - for (let tx of block.txs) + for (const tx of block.txs) matches.push(tx.isWatched(filter) ? 1 : 0); return MerkleBlock.fromMatches(block, matches); @@ -529,18 +521,19 @@ MerkleBlock.fromBlock = function fromBlock(block, filter) { */ MerkleBlock.fromHashes = function fromHashes(block, hashes) { - let filter = {}; - let matches = []; + const filter = new Set(); for (let hash of hashes) { if (Buffer.isBuffer(hash)) hash = hash.toString('hex'); - filter[hash] = true; + filter.add(hash); } - for (let tx of block.txs) { - let hash = tx.hash('hex'); - matches.push(filter[hash] ? 1 : 0); + const matches = []; + + for (const tx of block.txs) { + const hash = tx.hash('hex'); + matches.push(filter.has(hash) ? 1 : 0); } return MerkleBlock.fromMatches(block, matches); @@ -555,25 +548,23 @@ MerkleBlock.fromHashes = function fromHashes(block, hashes) { */ MerkleBlock.fromMatches = function fromMatches(block, matches) { - let txs = []; - let leaves = []; - let bits = []; - let hashes = []; - let totalTX = block.txs.length; + const txs = []; + const leaves = []; + const bits = []; + const hashes = []; + const totalTX = block.txs.length; let height = 0; - let flags, merkle; - let width = (height) => { + const width = (height) => { return (totalTX + (1 << height) - 1) >>> height; }; - let hash = (height, pos, leaves) => { - let left, right; - + const hash = (height, pos, leaves) => { if (height === 0) return leaves[pos]; - left = hash(height - 1, pos * 2, leaves); + const left = hash(height - 1, pos * 2, leaves); + let right; if (pos * 2 + 1 < width(height - 1)) right = hash(height - 1, pos * 2 + 1, leaves); @@ -583,7 +574,7 @@ MerkleBlock.fromMatches = function fromMatches(block, matches) { return digest.root256(left, right); }; - let traverse = (height, pos, leaves, matches) => { + const traverse = (height, pos, leaves, matches) => { let parent = 0; for (let p = (pos << height); p < ((pos + 1) << height) && p < totalTX; p++) @@ -603,7 +594,7 @@ MerkleBlock.fromMatches = function fromMatches(block, matches) { }; for (let i = 0; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; if (matches[i]) txs.push(tx); @@ -616,19 +607,19 @@ MerkleBlock.fromMatches = function fromMatches(block, matches) { traverse(height, 0, leaves, matches); - flags = Buffer.allocUnsafe((bits.length + 7) / 8 | 0); + const flags = Buffer.allocUnsafe((bits.length + 7) / 8 | 0); flags.fill(0); for (let p = 0; p < bits.length; p++) flags[p / 8 | 0] |= bits[p] << (p % 8); - merkle = new MerkleBlock(); + const merkle = new MerkleBlock(); merkle._hash = block._hash; merkle._hhash = block._hhash; merkle.version = block.version; merkle.prevBlock = block.prevBlock; merkle.merkleRoot = block.merkleRoot; - merkle.ts = block.ts; + merkle.time = block.time; merkle.bits = block.bits; merkle.nonce = block.nonce; merkle.totalTX = totalTX; diff --git a/lib/primitives/mtx.js b/lib/primitives/mtx.js index 2351f246f..6ae12cf44 100644 --- a/lib/primitives/mtx.js +++ b/lib/primitives/mtx.js @@ -21,7 +21,7 @@ const encoding = require('../utils/encoding'); const consensus = require('../protocol/consensus'); const policy = require('../protocol/policy'); const Amount = require('../btc/amount'); -const opcodes = Script.opcodes; +const Stack = require('../script/stack'); /** * A mutable transaction object. @@ -56,7 +56,7 @@ function MTX(options) { this.fromOptions(options); } -util.inherits(MTX, TX); +Object.setPrototypeOf(MTX.prototype, TX.prototype); /** * Inject properties from options object. @@ -66,35 +66,30 @@ util.inherits(MTX, TX); MTX.prototype.fromOptions = function fromOptions(options) { if (options.version != null) { - assert(util.isUInt32(options.version), 'Version must a be uint32.'); + assert(util.isU32(options.version), 'Version must a be uint32.'); this.version = options.version; } - if (options.flag != null) { - assert(util.isUInt8(options.flag), 'Flag must be a uint8.'); - this.flag = options.flag; - } - if (options.inputs) { assert(Array.isArray(options.inputs), 'Inputs must be an array.'); - for (let input of options.inputs) + for (const input of options.inputs) this.addInput(input); } if (options.outputs) { assert(Array.isArray(options.outputs), 'Outputs must be an array.'); - for (let output of options.outputs) + for (const output of options.outputs) this.addOutput(output); } if (options.locktime != null) { - assert(util.isUInt32(options.locktime), 'Locktime must be a uint32.'); + assert(util.isU32(options.locktime), 'Locktime must be a uint32.'); this.locktime = options.locktime; } if (options.changeIndex != null) { if (options.changeIndex !== -1) { - assert(util.isUInt32(options.changeIndex), + assert(util.isU32(options.changeIndex), 'Change index must be a uint32.'); this.changeIndex = options.changeIndex; } else { @@ -122,7 +117,7 @@ MTX.fromOptions = function fromOptions(options) { */ MTX.prototype.clone = function clone() { - let mtx = new MTX(); + const mtx = new MTX(); mtx.inject(this); mtx.changeIndex = this.changeIndex; return mtx; @@ -139,7 +134,7 @@ MTX.prototype.clone = function clone() { */ MTX.prototype.addInput = function addInput(options) { - let input = Input.fromOptions(options); + const input = Input.fromOptions(options); this.inputs.push(input); return input; }; @@ -155,8 +150,8 @@ MTX.prototype.addInput = function addInput(options) { */ MTX.prototype.addOutpoint = function addOutpoint(outpoint) { - let prevout = Outpoint.fromOptions(outpoint); - let input = Input.fromOutpoint(prevout); + const prevout = Outpoint.fromOptions(outpoint); + const input = Input.fromOutpoint(prevout); this.inputs.push(input); return input; }; @@ -172,11 +167,9 @@ MTX.prototype.addOutpoint = function addOutpoint(outpoint) { */ MTX.prototype.addCoin = function addCoin(coin) { - let input; - assert(coin instanceof Coin, 'Cannot add non-coin.'); - input = Input.fromCoin(coin); + const input = Input.fromCoin(coin); this.inputs.push(input); this.view.addCoin(coin); @@ -198,15 +191,13 @@ MTX.prototype.addCoin = function addCoin(coin) { */ MTX.prototype.addTX = function addTX(tx, index, height) { - let input, coin; - assert(tx instanceof TX, 'Cannot add non-transaction.'); if (height == null) height = -1; - input = Input.fromTX(tx, index); - coin = Coin.fromTX(tx, index, height); + const input = Input.fromTX(tx, index); + const coin = Coin.fromTX(tx, index, height); this.inputs.push(input); this.view.addCoin(coin); @@ -231,7 +222,7 @@ MTX.prototype.addOutput = function addOutput(script, value) { let output; if (value != null) { - assert(util.isUInt53(value), 'Value must be a uint53.'); + assert(util.isU64(value), 'Value must be a uint64.'); output = Output.fromScript(script, value); } else { output = Output.fromOptions(script); @@ -408,7 +399,7 @@ MTX.prototype.getSigopsSize = function getSigopsSize() { */ MTX.prototype.verifyInputs = function verifyInputs(height) { - let [fee] = this.checkInputs(height); + const [fee] = this.checkInputs(height); return fee !== -1; }; @@ -438,28 +429,29 @@ MTX.prototype.checkInputs = function checkInputs(height) { */ MTX.prototype.scriptInput = function scriptInput(index, coin, ring) { - let input = this.inputs[index]; - let prev; + const input = this.inputs[index]; assert(input, 'Input does not exist.'); assert(coin, 'No coin passed.'); // Don't bother with any below calculation // if the output is already templated. - if (input.script.length !== 0 - || input.witness.length !== 0) { + if (input.script.raw.length !== 0 + || input.witness.items.length !== 0) { return true; } // Get the previous output's script - prev = coin.script; + const prev = coin.script; // This is easily the hardest part about // building a transaction with segwit: // figuring out where the redeem script // and witness redeem scripts go. - if (prev.isScripthash()) { - let redeem = ring.getRedeem(prev.get(1)); + const sh = prev.getScripthash(); + + if (sh) { + const redeem = ring.getRedeem(sh); if (!redeem) return false; @@ -467,33 +459,37 @@ MTX.prototype.scriptInput = function scriptInput(index, coin, ring) { // Witness program nested in regular P2SH. if (redeem.isProgram()) { // P2WSH nested within pay-to-scripthash. - if (redeem.isWitnessScripthash()) { - prev = ring.getRedeem(redeem.get(1)); + const wsh = redeem.getWitnessScripthash(); + if (wsh) { + const wredeem = ring.getRedeem(wsh); - if (!prev) + if (!wredeem) return false; - if (!this.scriptVector(prev, input.witness, ring)) + const witness = this.scriptVector(wredeem, ring); + + if (!witness) return false; - input.witness.push(prev.toRaw()); - input.witness.compile(); + witness.push(wredeem.toRaw()); - input.script.push(redeem.toRaw()); - input.script.compile(); + input.witness.fromStack(witness); + input.script.fromItems([redeem.toRaw()]); return true; } // P2WPKH nested within pay-to-scripthash. - if (redeem.isWitnessPubkeyhash()) { - prev = Script.fromPubkeyhash(ring.getKeyHash()); + const wpkh = redeem.getWitnessPubkeyhash(); + if (wpkh) { + const pkh = Script.fromPubkeyhash(wpkh); + const witness = this.scriptVector(pkh, ring); - if (!this.scriptVector(prev, input.witness, ring)) + if (!witness) return false; - input.script.push(redeem.toRaw()); - input.script.compile(); + input.witness.fromStack(witness); + input.script.fromItems([redeem.toRaw()]); return true; } @@ -503,11 +499,14 @@ MTX.prototype.scriptInput = function scriptInput(index, coin, ring) { } // Regular P2SH. - if (!this.scriptVector(redeem, input.script, ring)) + const vector = this.scriptVector(redeem, ring); + + if (!vector) return false; - input.script.push(redeem.toRaw()); - input.script.compile(); + vector.push(redeem.toRaw()); + + input.script.fromStack(vector); return true; } @@ -515,29 +514,35 @@ MTX.prototype.scriptInput = function scriptInput(index, coin, ring) { // Witness program. if (prev.isProgram()) { // Bare P2WSH. - if (prev.isWitnessScripthash()) { - let redeem = ring.getRedeem(prev.get(1)); + const wsh = prev.getWitnessScripthash(); + if (wsh) { + const wredeem = ring.getRedeem(wsh); - if (!redeem) + if (!wredeem) return false; - if (!this.scriptVector(redeem, input.witness, ring)) + const vector = this.scriptVector(wredeem, ring); + + if (!vector) return false; - input.witness.push(redeem.toRaw()); - input.witness.compile(); + vector.push(wredeem.toRaw()); + + input.witness.fromStack(vector); return true; } // Bare P2WPKH. - if (prev.isWitnessPubkeyhash()) { - prev = Script.fromPubkeyhash(prev.get(1)); + const wpkh = prev.getWitnessPubkeyhash(); + if (wpkh) { + const pkh = Script.fromPubkeyhash(wpkh); + const vector = this.scriptVector(pkh, ring); - if (!this.scriptVector(prev, input.witness, ring)) + if (!vector) return false; - input.witness.compile(); + input.witness.fromStack(vector); return true; } @@ -547,63 +552,73 @@ MTX.prototype.scriptInput = function scriptInput(index, coin, ring) { } // Wow, a normal output! Praise be to Jengus and Gord. - return this.scriptVector(prev, input.script, ring); + const vector = this.scriptVector(prev, ring); + + if (!vector) + return false; + + input.script.fromStack(vector); + + return true; }; /** * Build script for a single vector * based on a previous script. * @param {Script} prev - * @param {Witness|Script} vector * @param {Buffer} ring * @return {Boolean} */ -MTX.prototype.scriptVector = function scriptVector(prev, vector, ring) { +MTX.prototype.scriptVector = function scriptVector(prev, ring) { // P2PK - if (prev.isPubkey()) { - if (!prev.get(0).equals(ring.publicKey)) - return false; + const pk = prev.getPubkey(); + if (pk) { + if (!pk.equals(ring.publicKey)) + return null; - vector.set(0, opcodes.OP_0); + const stack = new Stack(); - return true; + stack.pushInt(0); + + return stack; } // P2PKH - if (prev.isPubkeyhash()) { - if (!prev.get(2).equals(ring.getKeyHash())) - return false; + const pkh = prev.getPubkeyhash(); + if (pkh) { + if (!pkh.equals(ring.getKeyHash())) + return null; - vector.set(0, opcodes.OP_0); - vector.set(1, ring.publicKey); + const stack = new Stack(); - return true; + stack.pushInt(0); + stack.pushData(ring.publicKey); + + return stack; } // Multisig - if (prev.isMultisig()) { - let n; - + const [, n] = prev.getMultisig(); + if (n !== -1) { if (prev.indexOf(ring.publicKey) === -1) - return false; + return null; // Technically we should create m signature slots, // but we create n signature slots so we can order // the signatures properly. - vector.set(0, opcodes.OP_0); + const stack = new Stack(); - // Grab `n` value (number of keys). - n = prev.getSmall(prev.length - 2); + stack.pushInt(0); // Fill script with `n` signature slots. for (let i = 0; i < n; i++) - vector.set(i + 1, opcodes.OP_0); + stack.pushInt(0); - return true; + return stack; } - return false; + return null; }; /** @@ -617,11 +632,11 @@ MTX.prototype.scriptVector = function scriptVector(prev, vector, ring) { * @returns {Promise} */ -MTX.prototype.signInputAsync = function signInputAsync(index, coin, ring, type, pool) { +MTX.prototype.signInputAsync = async function signInputAsync(index, coin, ring, type, pool) { if (!pool) return this.signInput(index, coin, ring, type); - return pool.signInput(this, index, coin, ring, type, pool); + return await pool.signInput(this, index, coin, ring, type, pool); }; /** @@ -634,19 +649,18 @@ MTX.prototype.signInputAsync = function signInputAsync(index, coin, ring, type, */ MTX.prototype.signInput = function signInput(index, coin, ring, type) { - let input = this.inputs[index]; - let version = 0; - let redeem = false; - let key = ring.privateKey; - let prev, value, vector, sig, result; + const input = this.inputs[index]; + const key = ring.privateKey; assert(input, 'Input does not exist.'); assert(coin, 'No coin passed.'); // Get the previous output's script - prev = coin.script; - value = coin.value; - vector = input.script; + const value = coin.value; + let prev = coin.script; + let vector = input.script; + let version = 0; + let redeem = false; // Grab regular p2sh redeem script. if (prev.isScripthash()) { @@ -669,32 +683,51 @@ MTX.prototype.signInput = function signInput(index, coin, ring, type) { vector = input.witness; redeem = true; version = 1; - } else if (prev.isWitnessPubkeyhash()) { - prev = Script.fromPubkeyhash(prev.get(1)); - vector = input.witness; - redeem = false; - version = 1; + } else { + const wpkh = prev.getWitnessPubkeyhash(); + if (wpkh) { + prev = Script.fromPubkeyhash(wpkh); + vector = input.witness; + redeem = false; + version = 1; + } } // Create our signature. - sig = this.signature(index, prev, value, key, type, version); + const sig = this.signature(index, prev, value, key, type, version); if (redeem) { - redeem = vector.pop(); - result = this.signVector(prev, vector, sig, ring); - vector.push(redeem); - vector.compile(); - return result; + const stack = vector.toStack(); + const redeem = stack.pop(); + + const result = this.signVector(prev, stack, sig, ring); + + if (!result) + return false; + + result.push(redeem); + + vector.fromStack(result); + + return true; } - return this.signVector(prev, vector, sig, ring); + const stack = vector.toStack(); + const result = this.signVector(prev, stack, sig, ring); + + if (!result) + return false; + + vector.fromStack(result); + + return true; }; /** * Add a signature to a vector * based on a previous script. * @param {Script} prev - * @param {Witness|Script} vector + * @param {Stack} vector * @param {Buffer} sig * @param {KeyRing} ring * @return {Boolean} @@ -702,91 +735,93 @@ MTX.prototype.signInput = function signInput(index, coin, ring, type) { MTX.prototype.signVector = function signVector(prev, vector, sig, ring) { // P2PK - if (prev.isPubkey()) { + const pk = prev.getPubkey(); + if (pk) { // Make sure the pubkey is ours. - if (!ring.publicKey.equals(prev.get(0))) - return false; - - // Already signed. - if (Script.isSignature(vector.get(0))) - return true; + if (!ring.publicKey.equals(pk)) + return null; - if (vector.getSmall(0) !== 0) + if (vector.length === 0) throw new Error('Input has not been templated.'); + // Already signed. + if (vector.get(0).length > 0) + return vector; + vector.set(0, sig); - vector.compile(); - return true; + return vector; } // P2PKH - if (prev.isPubkeyhash()) { + const pkh = prev.getPubkeyhash(); + if (pkh) { // Make sure the pubkey hash is ours. - if (!ring.getKeyHash().equals(prev.get(2))) - return false; + if (!ring.getKeyHash().equals(pkh)) + return null; - // Already signed. - if (Script.isSignature(vector.get(0))) - return true; + if (vector.length !== 2) + throw new Error('Input has not been templated.'); - if (!Script.isKey(vector.get(1))) + if (vector.get(1).length === 0) throw new Error('Input has not been templated.'); + // Already signed. + if (vector.get(0).length > 0) + return vector; + vector.set(0, sig); - vector.compile(); - return true; + return vector; } // Multisig - if (prev.isMultisig()) { - let total = 0; - let keys = []; - let keyIndex; - - // Grab `m` value (number of sigs required). - let m = prev.getSmall(0); - - // Grab `n` value (number of keys). - let n = prev.getSmall(prev.length - 2); - - // Grab the redeem script's keys to figure - // out where our key should go. - for (let i = 1; i < prev.length - 2; i++) - keys.push(prev.get(i)); + const [m, n] = prev.getMultisig(); + if (m !== -1) { + if (vector.length < 2) + throw new Error('Input has not been templated.'); - if (vector.getSmall(0) !== 0) + if (vector.get(0).length !== 0) throw new Error('Input has not been templated.'); // Too many signature slots. Abort. if (vector.length - 1 > n) - return false; + throw new Error('Input has not been templated.'); // Count the number of current signatures. + let total = 0; for (let i = 1; i < vector.length; i++) { - if (Script.isSignature(vector.get(i))) + const item = vector.get(i); + if (item.length > 0) total++; } // Signatures are already finalized. if (total === m && vector.length - 1 === m) - return true; + return vector; // Add some signature slots for us to use if // there was for some reason not enough. while (vector.length - 1 < n) - vector.push(opcodes.OP_0); + vector.pushInt(0); + + // Grab the redeem script's keys to figure + // out where our key should go. + const keys = []; + for (const op of prev.code) { + if (op.data) + keys.push(op.data); + } // Find the key index so we can place // the signature in the same index. - keyIndex = util.indexOf(keys, ring.publicKey); + let keyIndex = util.indexOf(keys, ring.publicKey); // Our public key is not in the prev_out // script. We tried to sign a transaction // that is not redeemable by us. if (keyIndex === -1) - return false; + return null; // Offset key index by one to turn it into // "sig index". Accounts for OP_0 byte at @@ -797,7 +832,7 @@ MTX.prototype.signVector = function signVector(prev, vector, sig, ring) { // and increment the total number of // signatures. if (keyIndex < vector.length && total < m) { - if (vector.getSmall(keyIndex) === 0) { + if (vector.get(keyIndex).length === 0) { vector.set(keyIndex, sig); total++; } @@ -807,7 +842,8 @@ MTX.prototype.signVector = function signVector(prev, vector, sig, ring) { if (total >= m) { // Remove empty slots left over. for (let i = vector.length - 1; i >= 1; i--) { - if (vector.getSmall(i) === 0) + const item = vector.get(i); + if (item.length === 0) vector.remove(i); } @@ -823,15 +859,10 @@ MTX.prototype.signVector = function signVector(prev, vector, sig, ring) { assert(vector.length - 1 === m); } - vector.compile(); - - if (total !== m) - return false; - - return true; + return vector; } - return false; + return null; }; /** @@ -841,8 +872,8 @@ MTX.prototype.signVector = function signVector(prev, vector, sig, ring) { MTX.prototype.isSigned = function isSigned() { for (let i = 0; i < this.inputs.length; i++) { - let input = this.inputs[i]; - let coin = this.view.getOutput(input); + const {prevout} = this.inputs[i]; + const coin = this.view.getOutput(prevout); if (!coin) return false; @@ -862,15 +893,14 @@ MTX.prototype.isSigned = function isSigned() { */ MTX.prototype.isInputSigned = function isInputSigned(index, coin) { - let input = this.inputs[index]; - let prev, vector, redeem, result; + const input = this.inputs[index]; assert(input, 'Input does not exist.'); assert(coin, 'No coin passed.'); - prev = coin.script; - vector = input.script; - redeem = false; + let prev = coin.script; + let vector = input.script; + let redeem = false; // Grab redeem script if possible. if (prev.isScripthash()) { @@ -889,57 +919,69 @@ MTX.prototype.isInputSigned = function isInputSigned(index, coin) { return false; vector = input.witness; redeem = true; - } else if (prev.isWitnessPubkeyhash()) { - prev = Script.fromPubkeyhash(prev.get(1)); - vector = input.witness; - redeem = false; + } else { + const wpkh = prev.getWitnessPubkeyhash(); + if (wpkh) { + prev = Script.fromPubkeyhash(wpkh); + vector = input.witness; + redeem = false; + } } - if (redeem) { - redeem = vector.pop(); - result = this.isVectorSigned(prev, vector); - vector.push(redeem); - return result; - } + const stack = vector.toStack(); - return this.isVectorSigned(prev, vector); + if (redeem) + stack.pop(); + + return this.isVectorSigned(prev, stack); }; /** * Test whether a vector is fully-signed. * @param {Script} prev - * @param {Script|Witness} vector + * @param {Stack} vector * @returns {Boolean} */ MTX.prototype.isVectorSigned = function isVectorSigned(prev, vector) { if (prev.isPubkey()) { - if (!Script.isSignature(vector.get(0))) + if (vector.length !== 1) + return false; + + if (vector.get(0).length === 0) return false; + return true; } if (prev.isPubkeyhash()) { - if (!Script.isSignature(vector.get(0))) + if (vector.length !== 2) + return false; + + if (vector.get(0).length === 0) + return false; + + if (vector.get(1).length === 0) return false; + return true; } - if (prev.isMultisig()) { - // Grab `m` value (number of required sigs). - let m = prev.getSmall(0); - - // Ensure all members are signatures. - for (let i = 1; i < vector.length; i++) { - if (!Script.isSignature(vector.get(i))) - return false; - } + const [m] = prev.getMultisig(); + if (m !== -1) { // Ensure we have the correct number // of required signatures. if (vector.length - 1 !== m) return false; + // Ensure all members are signatures. + for (let i = 1; i < vector.length; i++) { + const item = vector.get(i); + if (item.length === 0) + return false; + } + return true; } @@ -954,17 +996,18 @@ MTX.prototype.isVectorSigned = function isVectorSigned(prev, vector) { */ MTX.prototype.template = function template(ring) { - let total = 0; - if (Array.isArray(ring)) { - for (let key of ring) + let total = 0; + for (const key of ring) total += this.template(key); return total; } + let total = 0; + for (let i = 0; i < this.inputs.length; i++) { - let input = this.inputs[i]; - let coin = this.view.getOutput(input); + const {prevout} = this.inputs[i]; + const coin = this.view.getOutput(prevout); if (!coin) continue; @@ -991,19 +1034,20 @@ MTX.prototype.template = function template(ring) { */ MTX.prototype.sign = function sign(ring, type) { - let total = 0; - if (Array.isArray(ring)) { - for (let key of ring) + let total = 0; + for (const key of ring) total += this.sign(key, type); return total; } assert(ring.privateKey, 'No private key available.'); + let total = 0; + for (let i = 0; i < this.inputs.length; i++) { - let input = this.inputs[i]; - let coin = this.view.getOutput(input); + const {prevout} = this.inputs[i]; + const coin = this.view.getOutput(prevout); if (!coin) continue; @@ -1034,11 +1078,11 @@ MTX.prototype.sign = function sign(ring, type) { * @returns {Promise} */ -MTX.prototype.signAsync = function signAsync(ring, type, pool) { +MTX.prototype.signAsync = async function signAsync(ring, type, pool) { if (!pool) return this.sign(ring, type); - return pool.sign(this, ring, type); + return await pool.sign(this, ring, type); }; /** @@ -1048,7 +1092,8 @@ MTX.prototype.signAsync = function signAsync(ring, type, pool) { */ MTX.prototype.estimateSize = async function estimateSize(estimate) { - let scale = consensus.WITNESS_SCALE_FACTOR; + const scale = consensus.WITNESS_SCALE_FACTOR; + let total = 0; // Calculate the size, minus the input scripts. @@ -1058,16 +1103,14 @@ MTX.prototype.estimateSize = async function estimateSize(estimate) { total += encoding.sizeVarint(this.outputs.length); - for (let output of this.outputs) + for (const output of this.outputs) total += output.getSize(); total += 4; // Add size for signatures and public keys - for (let input of this.inputs) { - let coin = this.view.getOutput(input); - let size = 0; - let prev; + for (const {prevout} of this.inputs) { + const coin = this.view.getOutput(prevout); // We're out of luck here. // Just assume it's a p2pkh. @@ -1077,36 +1120,36 @@ MTX.prototype.estimateSize = async function estimateSize(estimate) { } // Previous output script. - prev = coin.script; + const prev = coin.script; // P2PK if (prev.isPubkey()) { // varint script size - size += 1; + total += 1; // OP_PUSHDATA0 [signature] - size += 1 + 73; - total += size; + total += 1 + 73; continue; } // P2PKH if (prev.isPubkeyhash()) { // varint script size - size += 1; + total += 1; // OP_PUSHDATA0 [signature] - size += 1 + 73; + total += 1 + 73; // OP_PUSHDATA0 [key] - size += 1 + 33; - total += size; + total += 1 + 33; continue; } - if (prev.isMultisig()) { + const [m] = prev.getMultisig(); + if (m !== -1) { + let size = 0; // Bare Multisig // OP_0 size += 1; // OP_PUSHDATA0 [signature] ... - size += (1 + 73) * prev.getSmall(0); + size += (1 + 73) * m; // varint len size += encoding.sizeVarint(size); total += size; @@ -1115,6 +1158,7 @@ MTX.prototype.estimateSize = async function estimateSize(estimate) { // P2WPKH if (prev.isWitnessPubkeyhash()) { + let size = 0; // varint-items-len size += 1; // varint-len [signature] @@ -1129,7 +1173,7 @@ MTX.prototype.estimateSize = async function estimateSize(estimate) { // Call out to the custom estimator. if (estimate) { - size = await estimate(prev); + const size = await estimate(prev); if (size !== -1) { total += size; continue; @@ -1147,6 +1191,7 @@ MTX.prototype.estimateSize = async function estimateSize(estimate) { // P2WSH if (prev.isWitnessScripthash()) { + let size = 0; // varint-items-len size += 1; // 2-of-3 multisig input @@ -1173,39 +1218,74 @@ MTX.prototype.estimateSize = async function estimateSize(estimate) { */ MTX.prototype.selectCoins = function selectCoins(coins, options) { - let selector = new CoinSelector(this, options); + const selector = new CoinSelector(this, options); return selector.select(coins); }; /** - * Attempt to subtract a fee from outputs. + * Attempt to subtract a fee from a single output. + * @param {Number} index * @param {Amount} fee - * @param {Number?} index */ -MTX.prototype.subtractFee = function subtractFee(fee, index) { - if (typeof index === 'number') { - let output = this.outputs[index]; - let min; +MTX.prototype.subtractIndex = function subtractIndex(index, fee) { + assert(typeof index === 'number'); + assert(typeof fee === 'number'); - if (!output) - throw new Error('Subtraction index does not exist.'); + const output = this.outputs[index]; - min = fee + output.getDustThreshold(); + if (!output) + throw new Error('Subtraction index does not exist.'); - if (output.value < min) - throw new Error('Could not subtract fee.'); + if (output.value < fee + output.getDustThreshold()) + throw new Error('Could not subtract fee.'); + + output.value -= fee; +}; + +/** + * Attempt to subtract a fee from all outputs evenly. + * @param {Amount} fee + */ + +MTX.prototype.subtractFee = function subtractFee(fee) { + assert(typeof fee === 'number'); - output.value -= fee; + let outputs = 0; - return; + for (const output of this.outputs) { + // Ignore nulldatas and + // other OP_RETURN scripts. + if (output.script.isUnspendable()) + continue; + outputs += 1; } - for (let output of this.outputs) { - let min = fee + output.getDustThreshold(); + if (outputs === 0) + throw new Error('Could not subtract fee.'); + + const left = fee % outputs; + const share = (fee - left) / outputs; + + // First pass, remove even shares. + for (const output of this.outputs) { + if (output.script.isUnspendable()) + continue; + + if (output.value < share + output.getDustThreshold()) + throw new Error('Could not subtract fee.'); - if (output.value >= min) { - output.value -= fee; + output.value -= share; + } + + // Second pass, remove the remainder + // for the one unlucky output. + for (const output of this.outputs) { + if (output.script.isUnspendable()) + continue; + + if (output.value >= left + output.getDustThreshold()) { + output.value -= left; return; } } @@ -1221,36 +1301,39 @@ MTX.prototype.subtractFee = function subtractFee(fee, index) { */ MTX.prototype.fund = async function fund(coins, options) { - let select, change; - assert(options, 'Options are required.'); assert(options.changeAddress, 'Change address is required.'); assert(this.inputs.length === 0, 'TX is already funded.'); // Select necessary coins. - select = await this.selectCoins(coins, options); + const select = await this.selectCoins(coins, options); // Add coins to transaction. - for (let coin of select.chosen) + for (const coin of select.chosen) this.addCoin(coin); // Attempt to subtract fee. - if (select.shouldSubtract) - this.subtractFee(select.fee, select.subtractFee); + if (select.subtractFee) { + const index = select.subtractIndex; + if (index !== -1) + this.subtractIndex(index, select.fee); + else + this.subtractFee(select.fee); + } // Add a change output. - change = new Output(); - change.value = select.change; - change.script.fromAddress(select.changeAddress); + const output = new Output(); + output.value = select.change; + output.script.fromAddress(select.changeAddress); - if (change.isDust(policy.MIN_RELAY)) { + if (output.isDust(policy.MIN_RELAY)) { // Do nothing. Change is added to fee. this.changeIndex = -1; - assert.equal(this.getFee(), select.fee + select.change); + assert.strictEqual(this.getFee(), select.fee + select.change); } else { - this.outputs.push(change); + this.outputs.push(output); this.changeIndex = this.outputs.length - 1; - assert.equal(this.getFee(), select.fee); + assert.strictEqual(this.getFee(), select.fee); } return select; @@ -1262,7 +1345,7 @@ MTX.prototype.fund = async function fund(coins, options) { */ MTX.prototype.sortMembers = function sortMembers() { - let changeOutput; + let changeOutput = null; if (this.changeIndex !== -1) { changeOutput = this.outputs[this.changeIndex]; @@ -1303,10 +1386,10 @@ MTX.prototype.avoidFeeSniping = function avoidFeeSniping(height) { */ MTX.prototype.setLocktime = function setLocktime(locktime) { - assert(util.isUInt32(locktime), 'Locktime must be a uint32.'); + assert(util.isU32(locktime), 'Locktime must be a uint32.'); assert(this.inputs.length > 0, 'Cannot set sequence with no inputs.'); - for (let input of this.inputs) { + for (const input of this.inputs) { if (input.sequence === 0xffffffff) input.sequence = 0xfffffffe; } @@ -1322,18 +1405,19 @@ MTX.prototype.setLocktime = function setLocktime(locktime) { */ MTX.prototype.setSequence = function setSequence(index, locktime, seconds) { - let input = this.inputs[index]; + const input = this.inputs[index]; assert(input, 'Input does not exist.'); - assert(util.isUInt32(locktime), 'Locktime must be a uint32.'); + assert(util.isU32(locktime), 'Locktime must be a uint32.'); this.version = 2; if (seconds) { locktime >>>= consensus.SEQUENCE_GRANULARITY; - locktime = consensus.SEQUENCE_TYPE_FLAG | locktime; + locktime &= consensus.SEQUENCE_MASK; + locktime |= consensus.SEQUENCE_TYPE_FLAG; } else { - locktime = consensus.SEQUENCE_MASK & locktime; + locktime &= consensus.SEQUENCE_MASK; } input.sequence = locktime; @@ -1419,6 +1503,15 @@ MTX.prototype.toTX = function toTX() { return new TX().inject(this); }; +/** + * Convert the MTX to a TX. + * @returns {Array} [tx, view] + */ + +MTX.prototype.commit = function commit() { + return [this.toTX(), this.view]; +}; + /** * Instantiate MTX from TX. * @param {TX} tx @@ -1436,10 +1529,7 @@ MTX.fromTX = function fromTX(tx) { */ MTX.isMTX = function isMTX(obj) { - return obj - && Array.isArray(obj.inputs) - && typeof obj.locktime === 'number' - && typeof obj.scriptInput === 'function'; + return obj instanceof MTX; }; /** @@ -1463,8 +1553,8 @@ function CoinSelector(tx, options) { this.fee = CoinSelector.MIN_FEE; this.selection = 'value'; - this.shouldSubtract = false; - this.subtractFee = null; + this.subtractFee = false; + this.subtractIndex = -1; this.height = -1; this.depth = -1; this.hardFee = -1; @@ -1521,48 +1611,54 @@ CoinSelector.prototype.fromOptions = function fromOptions(options) { if (options.subtractFee != null) { if (typeof options.subtractFee === 'number') { - assert(util.isUInt32(options.subtractFee)); - this.subtractFee = options.subtractFee; - this.shouldSubtract = true; + assert(util.isInt(options.subtractFee)); + assert(options.subtractFee >= -1); + this.subtractIndex = options.subtractFee; + this.subtractFee = this.subtractIndex !== -1; } else { assert(typeof options.subtractFee === 'boolean'); this.subtractFee = options.subtractFee; - this.shouldSubtract = options.subtractFee; } } + if (options.subtractIndex != null) { + assert(util.isInt(options.subtractIndex)); + assert(options.subtractIndex >= -1); + this.subtractIndex = options.subtractIndex; + this.subtractFee = this.subtractIndex !== -1; + } + if (options.height != null) { - assert(util.isNumber(options.height)); + assert(util.isInt(options.height)); assert(options.height >= -1); this.height = options.height; } if (options.confirmations != null) { - assert(util.isNumber(options.confirmations)); + assert(util.isInt(options.confirmations)); assert(options.confirmations >= -1); this.depth = options.confirmations; } if (options.depth != null) { - assert(util.isNumber(options.depth)); + assert(util.isInt(options.depth)); assert(options.depth >= -1); this.depth = options.depth; } if (options.hardFee != null) { - assert(util.isNumber(options.hardFee)); + assert(util.isInt(options.hardFee)); assert(options.hardFee >= -1); this.hardFee = options.hardFee; } if (options.rate != null) { - assert(util.isNumber(options.rate)); - assert(options.rate >= 0); + assert(util.isU64(options.rate)); this.rate = options.rate; } if (options.maxFee != null) { - assert(util.isNumber(options.maxFee)); + assert(util.isInt(options.maxFee)); assert(options.maxFee >= -1); this.maxFee = options.maxFee; } @@ -1573,7 +1669,7 @@ CoinSelector.prototype.fromOptions = function fromOptions(options) { } if (options.changeAddress) { - let addr = options.changeAddress; + const addr = options.changeAddress; if (typeof addr === 'string') { this.changeAddress = Address.fromString(addr); } else { @@ -1626,7 +1722,7 @@ CoinSelector.prototype.init = function init(coins) { */ CoinSelector.prototype.total = function total() { - if (this.shouldSubtract) + if (this.subtractFee) return this.outputValue; return this.outputValue + this.fee; }; @@ -1649,8 +1745,6 @@ CoinSelector.prototype.isFull = function isFull() { */ CoinSelector.prototype.isSpendable = function isSpendable(coin) { - let depth; - if (this.height === -1) return true; @@ -1667,7 +1761,7 @@ CoinSelector.prototype.isSpendable = function isSpendable(coin) { if (this.depth === -1) return true; - depth = coin.getDepth(this.height); + const depth = coin.getDepth(this.height); if (depth < this.depth) return false; @@ -1682,17 +1776,15 @@ CoinSelector.prototype.isSpendable = function isSpendable(coin) { */ CoinSelector.prototype.getFee = function getFee(size) { - let fee; - + // This is mostly here for testing. + // i.e. A fee rounded to the nearest + // kb is easier to predict ahead of time. if (this.round) { - // This is mostly here for testing. - // i.e. A fee rounded to the nearest - // kb is easier to predict ahead of time. - fee = policy.getRoundFee(size, this.rate); - } else { - fee = policy.getMinFee(size, this.rate); + const fee = policy.getRoundFee(size, this.rate); + return Math.min(fee, CoinSelector.MAX_FEE); } + const fee = policy.getMinFee(size, this.rate); return Math.min(fee, CoinSelector.MAX_FEE); }; @@ -1703,10 +1795,8 @@ CoinSelector.prototype.getFee = function getFee(size) { */ CoinSelector.prototype.fund = function fund() { - let coin; - while (this.index < this.coins.length) { - coin = this.coins[this.index++]; + const coin = this.coins[this.index++]; if (!this.isSpendable(coin)) continue; @@ -1761,15 +1851,13 @@ CoinSelector.prototype.select = async function select(coins) { */ CoinSelector.prototype.selectEstimate = async function selectEstimate() { - let change; - // Set minimum fee and do // an initial round of funding. this.fee = CoinSelector.MIN_FEE; this.fund(); // Add dummy output for change. - change = new Output(); + const change = new Output(); if (this.changeAddress) { change.script.fromAddress(this.changeAddress); @@ -1784,7 +1872,7 @@ CoinSelector.prototype.selectEstimate = async function selectEstimate() { // Keep recalculating the fee and funding // until we reach some sort of equilibrium. do { - let size = await this.tx.estimateSize(this.estimate); + const size = await this.tx.estimateSize(this.estimate); this.fee = this.getFee(size); @@ -1838,7 +1926,7 @@ function FundingError(msg, available, required) { Error.captureStackTrace(this, FundingError); } -util.inherits(FundingError, Error); +Object.setPrototypeOf(FundingError.prototype, Error.prototype); /* * Helpers @@ -1857,29 +1945,19 @@ function sortRandom(a, b) { function sortValue(a, b) { if (a.height === -1 && b.height !== -1) return 1; + if (a.height !== -1 && b.height === -1) return -1; + return b.value - a.value; } function sortInputs(a, b) { - let ahash = a.prevout.txid(); - let bhash = b.prevout.txid(); - let cmp = util.strcmp(ahash, bhash); - - if (cmp !== 0) - return cmp; - - return a.prevout.index - b.prevout.index; + return a.compare(b); } function sortOutputs(a, b) { - let cmp = a.value - b.value; - - if (cmp !== 0) - return cmp; - - return a.script.raw.compare(b.script.raw); + return a.compare(b); } /* diff --git a/lib/primitives/netaddress.js b/lib/primitives/netaddress.js index d053107da..497b3c6d3 100644 --- a/lib/primitives/netaddress.js +++ b/lib/primitives/netaddress.js @@ -19,14 +19,14 @@ const BufferReader = require('../utils/reader'); * @alias module:primitives.NetAddress * @constructor * @param {Object} options - * @param {Number?} options.ts - Timestamp. + * @param {Number?} options.time - Timestamp. * @param {Number?} options.services - Service bits. * @param {String?} options.host - IP address (IPv6 or IPv4). * @param {Number?} options.port - Port. * @property {Host} host * @property {Number} port * @property {Number} services - * @property {Number} ts + * @property {Number} time */ function NetAddress(options) { @@ -36,7 +36,7 @@ function NetAddress(options) { this.host = '0.0.0.0'; this.port = 0; this.services = 0; - this.ts = 0; + this.time = 0; this.hostname = '0.0.0.0:0'; this.raw = IP.ZERO_IP; @@ -75,9 +75,9 @@ NetAddress.prototype.fromOptions = function fromOptions(options) { this.services = options.services; } - if (options.ts) { - assert(typeof options.ts === 'number'); - this.ts = options.ts; + if (options.time) { + assert(typeof options.time === 'number'); + this.time = options.time; } this.hostname = IP.toHostname(this.host, this.port); @@ -183,7 +183,7 @@ NetAddress.prototype.equal = function equal(addr) { */ NetAddress.prototype.compare = function compare(addr) { - let cmp = this.raw.compare(addr.raw); + const cmp = this.raw.compare(addr.raw); if (cmp !== 0) return cmp; @@ -250,7 +250,7 @@ NetAddress.prototype.fromHost = function fromHost(host, port, network) { this.host = IP.toString(this.raw); this.port = port; this.services = NetAddress.DEFAULT_SERVICES; - this.ts = network.now(); + this.time = network.now(); this.hostname = IP.toHostname(this.host, this.port); @@ -278,11 +278,9 @@ NetAddress.fromHost = function fromHost(host, port, network) { */ NetAddress.prototype.fromHostname = function fromHostname(hostname, network) { - let addr; - network = Network.get(network); - addr = IP.fromHostname(hostname, network.port); + const addr = IP.fromHostname(hostname, network.port); return this.fromHost(addr.host, addr.port, network); }; @@ -306,8 +304,8 @@ NetAddress.fromHostname = function fromHostname(hostname, network) { */ NetAddress.prototype.fromSocket = function fromSocket(socket, network) { - let host = socket.remoteAddress; - let port = socket.remotePort; + const host = socket.remoteAddress; + const port = socket.remotePort; assert(typeof host === 'string'); assert(typeof port === 'number'); return this.fromHost(IP.normalize(host), port, network); @@ -332,7 +330,7 @@ NetAddress.fromSocket = function fromSocket(hostname, network) { */ NetAddress.prototype.fromReader = function fromReader(br, full) { - this.ts = full ? br.readU32() : 0; + this.time = full ? br.readU32() : 0; this.services = br.readU32(); // Note: hi service bits @@ -389,7 +387,7 @@ NetAddress.fromRaw = function fromRaw(data, full) { NetAddress.prototype.toWriter = function toWriter(bw, full) { if (full) - bw.writeU32(this.ts); + bw.writeU32(this.time); bw.writeU32(this.services); bw.writeU32(0); @@ -415,7 +413,7 @@ NetAddress.prototype.getSize = function getSize(full) { */ NetAddress.prototype.toRaw = function toRaw(full) { - let size = this.getSize(full); + const size = this.getSize(full); return this.toWriter(new StaticWriter(size), full).render(); }; @@ -429,7 +427,7 @@ NetAddress.prototype.toJSON = function toJSON() { host: this.host, port: this.port, services: this.services, - ts: this.ts + time: this.time }; }; @@ -441,15 +439,14 @@ NetAddress.prototype.toJSON = function toJSON() { */ NetAddress.prototype.fromJSON = function fromJSON(json) { - assert(util.isNumber(json.port)); - assert(json.port >= 0 && json.port <= 0xffff); - assert(util.isNumber(json.services)); - assert(util.isNumber(json.ts)); + assert(util.isU16(json.port)); + assert(util.isU32(json.services)); + assert(util.isU32(json.time)); this.raw = IP.toBuffer(json.host); this.host = json.host; this.port = json.port; this.services = json.services; - this.ts = json.ts; + this.time = json.time; this.hostname = IP.toHostname(this.host, this.port); return this; }; @@ -473,7 +470,7 @@ NetAddress.prototype.inspect = function inspect() { return ''; }; diff --git a/lib/primitives/outpoint.js b/lib/primitives/outpoint.js index 9195c61cd..d8cfd2a4e 100644 --- a/lib/primitives/outpoint.js +++ b/lib/primitives/outpoint.js @@ -6,8 +6,8 @@ 'use strict'; -const util = require('../utils/util'); const assert = require('assert'); +const util = require('../utils/util'); const StaticWriter = require('../utils/writer'); const BufferReader = require('../utils/reader'); const encoding = require('../utils/encoding'); @@ -31,7 +31,7 @@ function Outpoint(hash, index) { if (hash != null) { assert(typeof hash === 'string', 'Hash must be a string.'); - assert(util.isUInt32(index), 'Index must be a uint32.'); + assert(util.isU32(index), 'Index must be a uint32.'); this.hash = hash; this.index = index; } @@ -46,7 +46,7 @@ function Outpoint(hash, index) { Outpoint.prototype.fromOptions = function fromOptions(options) { assert(options, 'Outpoint data is required.'); assert(typeof options.hash === 'string', 'Hash must be a string.'); - assert(util.isUInt32(options.index), 'Index must be a uint32.'); + assert(util.isU32(options.index), 'Index must be a uint32.'); this.hash = options.hash; this.index = options.index; return this; @@ -62,6 +62,47 @@ Outpoint.fromOptions = function fromOptions(options) { return new Outpoint().fromOptions(options); }; +/** + * Clone the outpoint. + * @returns {Outpoint} + */ + +Outpoint.prototype.clone = function clone() { + const outpoint = new Outpoint(); + outpoint.hash = this.value; + outpoint.index = this.index; + return outpoint; +}; + +/** + * Test equality against another outpoint. + * @param {Outpoint} prevout + * @returns {Boolean} + */ + +Outpoint.prototype.equals = function equals(prevout) { + assert(Outpoint.isOutpoint(prevout)); + return this.hash === prevout.hash + && this.index === prevout.index; +}; + +/** + * Compare against another outpoint (BIP69). + * @param {Outpoint} prevout + * @returns {Number} + */ + +Outpoint.prototype.compare = function compare(prevout) { + assert(Outpoint.isOutpoint(prevout)); + + const cmp = util.strcmp(this.txid(), prevout.txid()); + + if (cmp !== 0) + return cmp; + + return this.index - prevout.index; +}; + /** * Test whether the outpoint is null (hash of zeroes * with max-u32 index). Used to detect coinbases. @@ -110,7 +151,7 @@ Outpoint.prototype.toKey = function toKey() { Outpoint.prototype.fromKey = function fromKey(key) { assert(key.length > 64); this.hash = key.slice(0, 64); - this.index = +key.slice(64); + this.index = parseInt(key.slice(64), 10); return this; }; @@ -204,7 +245,7 @@ Outpoint.fromRaw = function fromRaw(data) { Outpoint.prototype.fromJSON = function fromJSON(json) { assert(json, 'Outpoint data is required.'); assert(typeof json.hash === 'string', 'Hash must be a string.'); - assert(util.isUInt32(json.index), 'Index must be a uint32.'); + assert(util.isU32(json.index), 'Index must be a uint32.'); this.hash = util.revHex(json.hash); this.index = json.index; return this; @@ -293,10 +334,7 @@ Outpoint.prototype.inspect = function inspect() { */ Outpoint.isOutpoint = function isOutpoint(obj) { - return obj - && typeof obj.hash === 'string' - && typeof obj.index === 'number' - && typeof obj.toKey === 'function'; + return obj instanceof Outpoint; }; /* diff --git a/lib/primitives/output.js b/lib/primitives/output.js index 040c116e7..4d21f035a 100644 --- a/lib/primitives/output.js +++ b/lib/primitives/output.js @@ -48,7 +48,7 @@ Output.prototype.fromOptions = function fromOptions(options) { assert(options, 'Output data is required.'); if (options.value) { - assert(util.isUInt53(options.value), 'Value must be a uint53.'); + assert(util.isU64(options.value), 'Value must be a uint64.'); this.value = options.value; } @@ -87,7 +87,7 @@ Output.prototype.fromScript = function fromScript(script, value) { script = Script.fromAddress(script); assert(script instanceof Script, 'Script must be a Script.'); - assert(util.isUInt53(value), 'Value must be a uint53.'); + assert(util.isU64(value), 'Value must be a uint64.'); this.script = script; this.value = value; @@ -112,12 +112,41 @@ Output.fromScript = function fromScript(script, value) { */ Output.prototype.clone = function clone() { - let output = new Output(); + const output = new Output(); output.value = this.value; output.script.inject(this.script); return output; }; +/** + * Test equality against another output. + * @param {Output} output + * @returns {Boolean} + */ + +Output.prototype.equals = function equals(output) { + assert(Output.isOutput(output)); + return this.value === output.value + && this.script.equals(output.script); +}; + +/** + * Compare against another output (BIP69). + * @param {Output} output + * @returns {Number} + */ + +Output.prototype.compare = function compare(output) { + assert(Output.isOutput(output)); + + const cmp = this.value - output.value; + + if (cmp !== 0) + return cmp; + + return this.script.compare(output.script); +}; + /** * Get the script type as a string. * @returns {ScriptType} type @@ -143,9 +172,11 @@ Output.prototype.getAddress = function getAddress() { */ Output.prototype.getHash = function getHash(enc) { - let addr = this.getAddress(); + const addr = this.getAddress(); + if (!addr) - return; + return null; + return addr.getHash(enc); }; @@ -203,13 +234,12 @@ Output.prototype.getJSON = function getJSON(network) { */ Output.prototype.getDustThreshold = function getDustThreshold(rate) { - let scale = consensus.WITNESS_SCALE_FACTOR; - let size; + const scale = consensus.WITNESS_SCALE_FACTOR; if (this.script.isUnspendable()) return 0; - size = this.getSize(); + let size = this.getSize(); if (this.script.isProgram()) { // 75% segwit discount applied to script size. @@ -248,7 +278,7 @@ Output.prototype.isDust = function isDust(rate) { Output.prototype.fromJSON = function fromJSON(json) { assert(json, 'Output data is required.'); - assert(util.isUInt53(json.value), 'Value must be a uint53.'); + assert(util.isU64(json.value), 'Value must be a uint64.'); this.value = json.value; this.script.fromJSON(json.script); return this; @@ -270,7 +300,7 @@ Output.fromJSON = function fromJSON(json) { */ Output.prototype.toWriter = function toWriter(bw) { - bw.write64(this.value); + bw.writeI64(this.value); bw.writeVarBytes(this.script.toRaw()); return bw; }; @@ -282,7 +312,7 @@ Output.prototype.toWriter = function toWriter(bw) { */ Output.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -293,7 +323,7 @@ Output.prototype.toRaw = function toRaw() { */ Output.prototype.fromReader = function fromReader(br) { - this.value = br.read64(); + this.value = br.readI64(); this.script.fromRaw(br.readVarBytes()); return this; }; @@ -338,10 +368,7 @@ Output.fromRaw = function fromRaw(data, enc) { */ Output.isOutput = function isOutput(obj) { - return obj - && typeof obj.value === 'number' - && typeof obj.script === 'object' - && typeof obj.getAddress === 'function'; + return obj instanceof Output; }; /* diff --git a/lib/primitives/tx.js b/lib/primitives/tx.js index ae9de01be..2849e039b 100644 --- a/lib/primitives/tx.js +++ b/lib/primitives/tx.js @@ -24,7 +24,7 @@ const InvItem = require('./invitem'); const Bloom = require('../utils/bloom'); const consensus = require('../protocol/consensus'); const policy = require('../protocol/policy'); -const {ScriptError} = require('../script/common'); +const ScriptError = require('../script/scripterror'); const hashType = Script.hashType; /** @@ -47,7 +47,6 @@ function TX(options) { return new TX(options); this.version = 1; - this.flag = 1; this.inputs = []; this.outputs = []; this.locktime = 0; @@ -61,6 +60,7 @@ function TX(options) { this._raw = null; this._size = -1; this._witness = -1; + this._sigops = -1; this._hashPrevouts = null; this._hashSequence = null; @@ -80,29 +80,24 @@ TX.prototype.fromOptions = function fromOptions(options) { assert(options, 'TX data is required.'); if (options.version != null) { - assert(util.isUInt32(options.version), 'Version must be a uint32.'); + assert(util.isU32(options.version), 'Version must be a uint32.'); this.version = options.version; } - if (options.flag != null) { - assert(util.isUInt8(options.flag), 'Flag must be a uint8.'); - this.flag = options.flag; - } - if (options.inputs) { assert(Array.isArray(options.inputs), 'Inputs must be an array.'); - for (let input of options.inputs) + for (const input of options.inputs) this.inputs.push(new Input(input)); } if (options.outputs) { assert(Array.isArray(options.outputs), 'Outputs must be an array.'); - for (let output of options.outputs) + for (const output of options.outputs) this.outputs.push(new Output(output)); } if (options.locktime != null) { - assert(util.isUInt32(options.locktime), 'Locktime must be a uint32.'); + assert(util.isU32(options.locktime), 'Locktime must be a uint32.'); this.locktime = options.locktime; } @@ -138,12 +133,11 @@ TX.prototype.clone = function clone() { TX.prototype.inject = function inject(tx) { this.version = tx.version; - this.flag = tx.flag; - for (let input of tx.inputs) + for (const input of tx.inputs) this.inputs.push(input.clone()); - for (let output of tx.outputs) + for (const output of tx.outputs) this.outputs.push(output.clone()); this.locktime = tx.locktime; @@ -163,6 +157,7 @@ TX.prototype.refresh = function refresh() { this._raw = null; this._size = -1; this._witness = -1; + this._sigops = -1; this._hashPrevouts = null; this._hashSequence = null; @@ -175,26 +170,26 @@ TX.prototype.refresh = function refresh() { * @returns {Hash|Buffer} hash */ -TX.prototype.hash = function _hash(enc) { - let hash = this._hash; +TX.prototype.hash = function hash(enc) { + let h = this._hash; - if (!hash) { - hash = digest.hash256(this.toNormal()); + if (!h) { + h = digest.hash256(this.toNormal()); if (!this.mutable) - this._hash = hash; + this._hash = h; } if (enc === 'hex') { let hex = this._hhash; if (!hex) { - hex = hash.toString('hex'); + hex = h.toString('hex'); if (!this.mutable) this._hhash = hex; } - hash = hex; + h = hex; } - return hash; + return h; }; /** @@ -207,11 +202,11 @@ TX.prototype.hash = function _hash(enc) { */ TX.prototype.witnessHash = function witnessHash(enc) { - let hash = this._whash; - if (!this.hasWitness()) return this.hash(enc); + let hash = this._whash; + if (!hash) { hash = digest.hash256(this.toRaw()); if (!this.mutable) @@ -287,8 +282,6 @@ TX.prototype.toNormalWriter = function toNormalWriter(bw) { */ TX.prototype.frame = function frame() { - let raw; - if (this.mutable) { assert(!this._raw); if (this.hasWitness()) @@ -297,20 +290,21 @@ TX.prototype.frame = function frame() { } if (this._raw) { - assert(this._size > 0); + assert(this._size >= 0); assert(this._witness >= 0); - raw = new RawTX(this._size, this._witness); + const raw = new RawTX(this._size, this._witness); raw.data = this._raw; return raw; } + let raw; if (this.hasWitness()) raw = this.frameWitness(); else raw = this.frameNormal(); this._raw = raw.data; - this._size = raw.total; + this._size = raw.size; this._witness = raw.witness; return raw; @@ -318,7 +312,7 @@ TX.prototype.frame = function frame() { /** * Calculate total size and size of the witness bytes. - * @returns {Object} Contains `total` and `witness`. + * @returns {Object} Contains `size` and `witness`. */ TX.prototype.getSizes = function getSizes() { @@ -337,7 +331,7 @@ TX.prototype.getSizes = function getSizes() { */ TX.prototype.getVirtualSize = function getVirtualSize() { - let scale = consensus.WITNESS_SCALE_FACTOR; + const scale = consensus.WITNESS_SCALE_FACTOR; return (this.getWeight() + scale - 1) / scale | 0; }; @@ -349,9 +343,9 @@ TX.prototype.getVirtualSize = function getVirtualSize() { */ TX.prototype.getSigopsSize = function getSigopsSize(sigops) { - let scale = consensus.WITNESS_SCALE_FACTOR; - let bytes = policy.BYTES_PER_SIGOP; - let weight = Math.max(this.getWeight(), sigops * bytes); + const scale = consensus.WITNESS_SCALE_FACTOR; + const bytes = policy.BYTES_PER_SIGOP; + const weight = Math.max(this.getWeight(), sigops * bytes); return (weight + scale - 1) / scale | 0; }; @@ -362,9 +356,9 @@ TX.prototype.getSigopsSize = function getSigopsSize(sigops) { */ TX.prototype.getWeight = function getWeight() { - let raw = this.getSizes(); - let base = raw.total - raw.witness; - return base * (consensus.WITNESS_SCALE_FACTOR - 1) + raw.total; + const raw = this.getSizes(); + const base = raw.size - raw.witness; + return base * (consensus.WITNESS_SCALE_FACTOR - 1) + raw.size; }; /** @@ -374,7 +368,7 @@ TX.prototype.getWeight = function getWeight() { */ TX.prototype.getSize = function getSize() { - return this.getSizes().total; + return this.getSizes().size; }; /** @@ -385,8 +379,8 @@ TX.prototype.getSize = function getSize() { */ TX.prototype.getBaseSize = function getBaseSize() { - let raw = this.getSizes(); - return raw.total - raw.witness; + const raw = this.getSizes(); + return raw.size - raw.witness; }; /** @@ -398,7 +392,7 @@ TX.prototype.hasWitness = function hasWitness() { if (this._witness !== -1) return this._witness !== 0; - for (let input of this.inputs) { + for (const input of this.inputs) { if (input.witness.items.length > 0) return true; } @@ -432,7 +426,7 @@ TX.prototype.signatureHash = function signatureHash(index, prev, value, type, ve if (version === 1) return this.signatureHashV1(index, prev, value, type); - assert(false, 'Unknown sighash version.'); + throw new Error('Unknown sighash version.'); }; /** @@ -445,8 +439,6 @@ TX.prototype.signatureHash = function signatureHash(index, prev, value, type, ve */ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { - let size, bw; - if ((type & 0x1f) === hashType.SINGLE) { // Bitcoind used to return 1 as an error code: // it ended up being treated like a hash. @@ -458,9 +450,8 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { prev = prev.removeSeparators(); // Calculate buffer size. - size = this.hashSize(index, prev, type); - - bw = new StaticWriter(size); + const size = this.hashSize(index, prev, type); + const bw = new StaticWriter(size); bw.writeU32(this.version); @@ -468,7 +459,7 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { if (type & hashType.ANYONECANPAY) { // Serialize only the current // input if ANYONECANPAY. - let input = this.inputs[index]; + const input = this.inputs[index]; // Count. bw.writeVarint(1); @@ -483,7 +474,7 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { } else { bw.writeVarint(this.inputs.length); for (let i = 0; i < this.inputs.length; i++) { - let input = this.inputs[i]; + const input = this.inputs[i]; // Outpoint. input.prevout.toWriter(bw); @@ -520,7 +511,7 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { break; } case hashType.SINGLE: { - let output = this.outputs[index]; + const output = this.outputs[index]; // Drop all outputs after the // current input index if SINGLE. @@ -529,7 +520,7 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { for (let i = 0; i < index; i++) { // Null all outputs not at // current input index. - bw.write64(-1); + bw.writeI64(-1); bw.writeVarint(0); } @@ -542,7 +533,7 @@ TX.prototype.signatureHashV0 = function signatureHashV0(index, prev, type) { default: { // Regular output serialization if ALL. bw.writeVarint(this.outputs.length); - for (let output of this.outputs) + for (const output of this.outputs) output.toWriter(bw); break; } @@ -594,7 +585,7 @@ TX.prototype.hashSize = function hashSize(index, prev, type) { break; default: size += encoding.sizeVarint(this.outputs.length); - for (let output of this.outputs) + for (const output of this.outputs) size += output.getSize(); break; } @@ -615,19 +606,18 @@ TX.prototype.hashSize = function hashSize(index, prev, type) { */ TX.prototype.signatureHashV1 = function signatureHashV1(index, prev, value, type) { + const input = this.inputs[index]; let prevouts = encoding.ZERO_HASH; let sequences = encoding.ZERO_HASH; let outputs = encoding.ZERO_HASH; - let input = this.inputs[index]; - let bw, size; if (!(type & hashType.ANYONECANPAY)) { if (this._hashPrevouts) { prevouts = this._hashPrevouts; } else { - let bw = new StaticWriter(this.inputs.length * 36); + const bw = new StaticWriter(this.inputs.length * 36); - for (let input of this.inputs) + for (const input of this.inputs) input.prevout.toWriter(bw); prevouts = digest.hash256(bw.render()); @@ -643,9 +633,9 @@ TX.prototype.signatureHashV1 = function signatureHashV1(index, prev, value, type if (this._hashSequence) { sequences = this._hashSequence; } else { - let bw = new StaticWriter(this.inputs.length * 4); + const bw = new StaticWriter(this.inputs.length * 4); - for (let input of this.inputs) + for (const input of this.inputs) bw.writeU32(input.sequence); sequences = digest.hash256(bw.render()); @@ -661,14 +651,13 @@ TX.prototype.signatureHashV1 = function signatureHashV1(index, prev, value, type outputs = this._hashOutputs; } else { let size = 0; - let bw; - for (let output of this.outputs) + for (const output of this.outputs) size += output.getSize(); - bw = new StaticWriter(size); + const bw = new StaticWriter(size); - for (let output of this.outputs) + for (const output of this.outputs) output.toWriter(bw); outputs = digest.hash256(bw.render()); @@ -677,12 +666,12 @@ TX.prototype.signatureHashV1 = function signatureHashV1(index, prev, value, type this._hashOutputs = outputs; } } else if ((type & 0x1f) === hashType.SINGLE && index < this.outputs.length) { - let output = this.outputs[index]; + const output = this.outputs[index]; outputs = digest.hash256(output.toRaw()); } - size = 156 + prev.getVarSize(); - bw = new StaticWriter(size); + const size = 156 + prev.getVarSize(); + const bw = new StaticWriter(size); bw.writeU32(this.version); bw.writeBytes(prevouts); @@ -690,7 +679,7 @@ TX.prototype.signatureHashV1 = function signatureHashV1(index, prev, value, type bw.writeHash(input.prevout.hash); bw.writeU32(input.prevout.index); bw.writeVarBytes(prev.toRaw()); - bw.write64(value); + bw.writeI64(value); bw.writeU32(input.sequence); bw.writeBytes(outputs); bw.writeU32(this.locktime); @@ -711,13 +700,11 @@ TX.prototype.signatureHashV1 = function signatureHashV1(index, prev, value, type */ TX.prototype.checksig = function checksig(index, prev, value, sig, key, version) { - let type, hash; - if (sig.length === 0) return false; - type = sig[sig.length - 1]; - hash = this.signatureHash(index, prev, value, type, version); + const type = sig[sig.length - 1]; + const hash = this.signatureHash(index, prev, value, type, version); return secp256k1.verify(hash, sig.slice(0, -1), key); }; @@ -736,18 +723,15 @@ TX.prototype.checksig = function checksig(index, prev, value, sig, key, version) */ TX.prototype.signature = function signature(index, prev, value, key, type, version) { - let hash, sig, bw; - if (type == null) type = hashType.ALL; if (version == null) version = 0; - hash = this.signatureHash(index, prev, value, type, version); - - sig = secp256k1.sign(hash, key); - bw = new StaticWriter(sig.length + 1); + const hash = this.signatureHash(index, prev, value, type, version); + const sig = secp256k1.sign(hash, key); + const bw = new StaticWriter(sig.length + 1); bw.writeBytes(sig); bw.writeU8(type); @@ -770,8 +754,8 @@ TX.prototype.check = function check(view, flags) { return; for (let i = 0; i < this.inputs.length; i++) { - let input = this.inputs[i]; - let coin = view.getOutput(input); + const {prevout} = this.inputs[i]; + const coin = view.getOutput(prevout); if (!coin) throw new ScriptError('UNKNOWN_ERROR', 'No coin available.'); @@ -790,7 +774,7 @@ TX.prototype.check = function check(view, flags) { */ TX.prototype.checkInput = function checkInput(index, coin, flags) { - let input = this.inputs[index]; + const input = this.inputs[index]; assert(input, 'Input does not exist.'); assert(coin, 'No coin passed.'); @@ -822,10 +806,12 @@ TX.prototype.checkAsync = async function checkAsync(view, flags, pool) { if (this.isCoinbase()) return; - if (!pool) - return this.check(view, flags); + if (!pool) { + this.check(view, flags); + return; + } - return await pool.check(this, view, flags); + await pool.check(this, view, flags); }; /** @@ -839,15 +825,17 @@ TX.prototype.checkAsync = async function checkAsync(view, flags, pool) { */ TX.prototype.checkInputAsync = async function checkInputAsync(index, coin, flags, pool) { - let input = this.inputs[index]; + const input = this.inputs[index]; assert(input, 'Input does not exist.'); assert(coin, 'No coin passed.'); - if (!pool) - return this.checkInput(index, coin, flags); + if (!pool) { + this.checkInput(index, coin, flags); + return; + } - return await pool.checkInput(this, index, coin, flags); + await pool.checkInput(this, index, coin, flags); }; /** @@ -949,7 +937,7 @@ TX.prototype.isRBF = function isRBF() { if (this.version === 2) return false; - for (let input of this.inputs) { + for (const input of this.inputs) { if (input.isRBF()) return true; } @@ -979,8 +967,8 @@ TX.prototype.getFee = function getFee(view) { TX.prototype.getInputValue = function getInputValue(view) { let total = 0; - for (let input of this.inputs) { - let coin = view.getOutput(input); + for (const {prevout} of this.inputs) { + const coin = view.getOutput(prevout); if (!coin) return 0; @@ -999,7 +987,7 @@ TX.prototype.getInputValue = function getInputValue(view) { TX.prototype.getOutputValue = function getOutputValue() { let total = 0; - for (let output of this.outputs) + for (const output of this.outputs) total += output.value; return total; @@ -1012,22 +1000,21 @@ TX.prototype.getOutputValue = function getOutputValue() { * @returns {Array} [addrs, table] */ -TX.prototype._getInputAddresses = function getInputAddresses(view) { - let table = {}; - let addrs = []; +TX.prototype._getInputAddresses = function _getInputAddresses(view) { + const table = Object.create(null); + const addrs = []; if (this.isCoinbase()) return [addrs, table]; - for (let input of this.inputs) { - let coin = view ? view.getOutput(input) : null; - let addr = input.getAddress(coin); - let hash; + for (const input of this.inputs) { + const coin = view ? view.getOutputFor(input) : null; + const addr = input.getAddress(coin); if (!addr) continue; - hash = addr.getHash('hex'); + const hash = addr.getHash('hex'); if (!table[hash]) { table[hash] = true; @@ -1044,18 +1031,17 @@ TX.prototype._getInputAddresses = function getInputAddresses(view) { * @returns {Array} [addrs, table] */ -TX.prototype._getOutputAddresses = function getOutputAddresses() { - let table = {}; - let addrs = []; +TX.prototype._getOutputAddresses = function _getOutputAddresses() { + const table = Object.create(null); + const addrs = []; - for (let output of this.outputs) { - let addr = output.getAddress(); - let hash; + for (const output of this.outputs) { + const addr = output.getAddress(); if (!addr) continue; - hash = addr.getHash('hex'); + const hash = addr.getHash('hex'); if (!table[hash]) { table[hash] = true; @@ -1073,12 +1059,12 @@ TX.prototype._getOutputAddresses = function getOutputAddresses() { * @returns {Array} [addrs, table] */ -TX.prototype._getAddresses = function getAddresses(view) { - let [addrs, table] = this._getInputAddresses(view); - let output = this.getOutputAddresses(); +TX.prototype._getAddresses = function _getAddresses(view) { + const [addrs, table] = this._getInputAddresses(view); + const output = this.getOutputAddresses(); - for (let addr of output) { - let hash = addr.getHash('hex'); + for (const addr of output) { + const hash = addr.getHash('hex'); if (!table[hash]) { table[hash] = true; @@ -1096,7 +1082,7 @@ TX.prototype._getAddresses = function getAddresses(view) { */ TX.prototype.getInputAddresses = function getInputAddresses(view) { - let [addrs] = this._getInputAddresses(view); + const [addrs] = this._getInputAddresses(view); return addrs; }; @@ -1106,7 +1092,7 @@ TX.prototype.getInputAddresses = function getInputAddresses(view) { */ TX.prototype.getOutputAddresses = function getOutputAddresses() { - let [addrs] = this._getOutputAddresses(); + const [addrs] = this._getOutputAddresses(); return addrs; }; @@ -1117,7 +1103,7 @@ TX.prototype.getOutputAddresses = function getOutputAddresses() { */ TX.prototype.getAddresses = function getAddresses(view) { - let [addrs] = this._getAddresses(view); + const [addrs] = this._getAddresses(view); return addrs; }; @@ -1128,17 +1114,15 @@ TX.prototype.getAddresses = function getAddresses(view) { */ TX.prototype.getInputHashes = function getInputHashes(view, enc) { - let hashes = []; - let addrs; - if (enc === 'hex') { - let [, table] = this._getInputAddresses(view); + const [, table] = this._getInputAddresses(view); return Object.keys(table); } - addrs = this.getInputAddresses(view); + const addrs = this.getInputAddresses(view); + const hashes = []; - for (let addr of addrs) + for (const addr of addrs) hashes.push(addr.getHash()); return hashes; @@ -1150,17 +1134,15 @@ TX.prototype.getInputHashes = function getInputHashes(view, enc) { */ TX.prototype.getOutputHashes = function getOutputHashes(enc) { - let hashes = []; - let addrs; - if (enc === 'hex') { - let [, table] = this._getOutputAddresses(); + const [, table] = this._getOutputAddresses(); return Object.keys(table); } - addrs = this.getOutputAddresses(); + const addrs = this.getOutputAddresses(); + const hashes = []; - for (let addr of addrs) + for (const addr of addrs) hashes.push(addr.getHash()); return hashes; @@ -1173,17 +1155,15 @@ TX.prototype.getOutputHashes = function getOutputHashes(enc) { */ TX.prototype.getHashes = function getHashes(view, enc) { - let hashes = []; - let addrs; - if (enc === 'hex') { - let [, table] = this._getAddresses(view); + const [, table] = this._getAddresses(view); return Object.keys(table); } - addrs = this.getAddresses(view); + const addrs = this.getAddresses(view); + const hashes = []; - for (let addr of addrs) + for (const addr of addrs) hashes.push(addr.getHash()); return hashes; @@ -1200,8 +1180,8 @@ TX.prototype.hasCoins = function hasCoins(view) { if (this.inputs.length === 0) return false; - for (let input of this.inputs) { - if (!view.hasEntry(input)) + for (const {prevout} of this.inputs) { + if (!view.hasEntry(prevout)) return false; } @@ -1216,7 +1196,7 @@ TX.prototype.hasCoins = function hasCoins(view) { * @param {Number} height - Height at which to test. This * is usually the chain height, or the chain height + 1 * when the transaction entered the mempool. - * @param {Number} ts - Time at which to test. This is + * @param {Number} time - Time at which to test. This is * usually the chain tip's parent's median time, or the * time at which the transaction entered the mempool. If * MEDIAN_TIME_PAST is enabled this will be the median @@ -1224,16 +1204,16 @@ TX.prototype.hasCoins = function hasCoins(view) { * @returns {Boolean} */ -TX.prototype.isFinal = function isFinal(height, ts) { - let THRESHOLD = consensus.LOCKTIME_THRESHOLD; +TX.prototype.isFinal = function isFinal(height, time) { + const THRESHOLD = consensus.LOCKTIME_THRESHOLD; if (this.locktime === 0) return true; - if (this.locktime < (this.locktime < THRESHOLD ? height : ts)) + if (this.locktime < (this.locktime < THRESHOLD ? height : time)) return true; - for (let input of this.inputs) { + for (const input of this.inputs) { if (input.sequence !== 0xffffffff) return false; } @@ -1245,23 +1225,22 @@ TX.prototype.isFinal = function isFinal(height, ts) { * Verify the absolute locktime of a transaction. * Called by OP_CHECKLOCKTIMEVERIFY. * @param {Number} index - Index of input being verified. - * @param {Number} locktime - Locktime to verify against. + * @param {Number} predicate - Locktime to verify against. * @returns {Boolean} */ -TX.prototype.verifyLocktime = function verifyLocktime(index, locktime) { - let THRESHOLD = consensus.LOCKTIME_THRESHOLD; - let input = this.inputs[index]; +TX.prototype.verifyLocktime = function verifyLocktime(index, predicate) { + const THRESHOLD = consensus.LOCKTIME_THRESHOLD; + const input = this.inputs[index]; assert(input, 'Input does not exist.'); - assert(locktime >= 0, 'Locktime must be non-negative.'); + assert(predicate >= 0, 'Locktime must be non-negative.'); - if (!((this.locktime < THRESHOLD && locktime < THRESHOLD) - || (this.locktime >= THRESHOLD && locktime >= THRESHOLD))) { + // Locktimes must be of the same type (blocks or seconds). + if ((this.locktime < THRESHOLD) !== (predicate < THRESHOLD)) return false; - } - if (locktime > this.locktime) + if (predicate > this.locktime) return false; if (input.sequence === 0xffffffff) @@ -1274,39 +1253,38 @@ TX.prototype.verifyLocktime = function verifyLocktime(index, locktime) { * Verify the relative locktime of an input. * Called by OP_CHECKSEQUENCEVERIFY. * @param {Number} index - Index of input being verified. - * @param {Number} locktime - Sequence locktime to verify against. + * @param {Number} predicate - Relative locktime to verify against. * @returns {Boolean} */ -TX.prototype.verifySequence = function verifySequence(index, locktime) { - let DISABLE_FLAG = consensus.SEQUENCE_DISABLE_FLAG; - let TYPE_FLAG = consensus.SEQUENCE_TYPE_FLAG; - let SEQUENCE_MASK = consensus.SEQUENCE_MASK; - let input = this.inputs[index]; - let mask, sequence, predicate; +TX.prototype.verifySequence = function verifySequence(index, predicate) { + const DISABLE_FLAG = consensus.SEQUENCE_DISABLE_FLAG; + const TYPE_FLAG = consensus.SEQUENCE_TYPE_FLAG; + const MASK = consensus.SEQUENCE_MASK; + const input = this.inputs[index]; assert(input, 'Input does not exist.'); - assert(locktime >= 0, 'Locktime must be non-negative.'); + assert(predicate >= 0, 'Locktime must be non-negative.'); - if ((locktime & DISABLE_FLAG) !== 0) + // For future softfork capability. + if (predicate & DISABLE_FLAG) return true; + // Version must be >=2. if (this.version < 2) return false; - if ((input.sequence & DISABLE_FLAG) !== 0) + // Cannot use the disable flag without + // the predicate also having the disable + // flag (for future softfork capability). + if (input.sequence & DISABLE_FLAG) return false; - mask = TYPE_FLAG | SEQUENCE_MASK; - sequence = input.sequence & mask; - predicate = locktime & mask; - - if (!((sequence < TYPE_FLAG && predicate < TYPE_FLAG) - || (sequence >= TYPE_FLAG && predicate >= TYPE_FLAG))) { + // Locktimes must be of the same type (blocks or seconds). + if ((input.sequence & TYPE_FLAG) !== (predicate & TYPE_FLAG)) return false; - } - if (predicate > sequence) + if ((predicate & MASK) > (input.sequence & MASK)) return false; return true; @@ -1318,14 +1296,20 @@ TX.prototype.verifySequence = function verifySequence(index, locktime) { */ TX.prototype.getLegacySigops = function getLegacySigops() { + if (this._sigops !== -1) + return this._sigops; + let total = 0; - for (let input of this.inputs) + for (const input of this.inputs) total += input.script.getSigops(false); - for (let output of this.outputs) + for (const output of this.outputs) total += output.script.getSigops(false); + if (!this.mutable) + this._sigops = total; + return total; }; @@ -1336,13 +1320,13 @@ TX.prototype.getLegacySigops = function getLegacySigops() { */ TX.prototype.getScripthashSigops = function getScripthashSigops(view) { - let total = 0; - if (this.isCoinbase()) return 0; - for (let input of this.inputs) { - let coin = view.getOutput(input); + let total = 0; + + for (const input of this.inputs) { + const coin = view.getOutputFor(input); if (!coin) continue; @@ -1356,6 +1340,30 @@ TX.prototype.getScripthashSigops = function getScripthashSigops(view) { return total; }; +/** + * Calculate accurate sigop count, taking into account redeem scripts. + * @param {CoinView} view + * @returns {Number} sigop count + */ + +TX.prototype.getWitnessSigops = function getWitnessSigops(view) { + if (this.isCoinbase()) + return 0; + + let total = 0; + + for (const input of this.inputs) { + const coin = view.getOutputFor(input); + + if (!coin) + continue; + + total += coin.script.getWitnessSigops(input.script, input.witness); + } + + return total; +}; + /** * Calculate sigops cost, taking into account witness programs. * @param {CoinView} view @@ -1364,29 +1372,18 @@ TX.prototype.getScripthashSigops = function getScripthashSigops(view) { */ TX.prototype.getSigopsCost = function getSigopsCost(view, flags) { - let scale = consensus.WITNESS_SCALE_FACTOR; - let cost = this.getLegacySigops() * scale; - if (flags == null) flags = Script.flags.STANDARD_VERIFY_FLAGS; - if (this.isCoinbase()) - return cost; + const scale = consensus.WITNESS_SCALE_FACTOR; + + let cost = this.getLegacySigops() * scale; if (flags & Script.flags.VERIFY_P2SH) cost += this.getScripthashSigops(view) * scale; - if (!(flags & Script.flags.VERIFY_WITNESS)) - return cost; - - for (let input of this.inputs) { - let coin = view.getOutput(input); - - if (!coin) - continue; - - cost += coin.script.getWitnessSigops(input.script, input.witness); - } + if (flags & Script.flags.VERIFY_WITNESS) + cost += this.getWitnessSigops(view); return cost; }; @@ -1399,7 +1396,7 @@ TX.prototype.getSigopsCost = function getSigopsCost(view, flags) { */ TX.prototype.getSigops = function getSigops(view, flags) { - let scale = consensus.WITNESS_SCALE_FACTOR; + const scale = consensus.WITNESS_SCALE_FACTOR; return (this.getSigopsCost(view, flags) + scale - 1) / scale | 0; }; @@ -1411,7 +1408,7 @@ TX.prototype.getSigops = function getSigops(view, flags) { */ TX.prototype.isSane = function isSane() { - let [valid] = this.checkSanity(); + const [valid] = this.checkSanity(); return valid; }; @@ -1423,9 +1420,6 @@ TX.prototype.isSane = function isSane() { */ TX.prototype.checkSanity = function checkSanity() { - let prevout = {}; - let total = 0; - if (this.inputs.length === 0) return [false, 'bad-txns-vin-empty', 100]; @@ -1435,7 +1429,9 @@ TX.prototype.checkSanity = function checkSanity() { if (this.getBaseSize() > consensus.MAX_BLOCK_SIZE) return [false, 'bad-txns-oversize', 100]; - for (let output of this.outputs) { + let total = 0; + + for (const output of this.outputs) { if (output.value < 0) return [false, 'bad-txns-vout-negative', 100]; @@ -1448,19 +1444,23 @@ TX.prototype.checkSanity = function checkSanity() { return [false, 'bad-txns-txouttotal-toolarge', 100]; } - for (let input of this.inputs) { - let key = input.prevout.toKey(); - if (prevout[key]) + const prevout = new Set(); + + for (const input of this.inputs) { + const key = input.prevout.toKey(); + + if (prevout.has(key)) return [false, 'bad-txns-inputs-duplicate', 100]; - prevout[key] = true; + + prevout.add(key); } if (this.isCoinbase()) { - let size = this.inputs[0].script.getSize(); + const size = this.inputs[0].script.getSize(); if (size < 2 || size > 100) return [false, 'bad-cb-length', 100]; } else { - for (let input of this.inputs) { + for (const input of this.inputs) { if (input.prevout.isNull()) return [false, 'bad-txns-prevout-null', 10]; } @@ -1480,7 +1480,7 @@ TX.prototype.checkSanity = function checkSanity() { */ TX.prototype.isStandard = function isStandard() { - let [valid] = this.checkStandard(); + const [valid] = this.checkStandard(); return valid; }; @@ -1495,15 +1495,13 @@ TX.prototype.isStandard = function isStandard() { */ TX.prototype.checkStandard = function checkStandard() { - let nulldata = 0; - if (this.version < 1 || this.version > policy.MAX_TX_VERSION) return [false, 'version', 0]; if (this.getWeight() >= policy.MAX_TX_WEIGHT) return [false, 'tx-size', 0]; - for (let input of this.inputs) { + for (const input of this.inputs) { if (input.script.getSize() > 1650) return [false, 'scriptsig-size', 0]; @@ -1511,7 +1509,9 @@ TX.prototype.checkStandard = function checkStandard() { return [false, 'scriptsig-not-pushonly', 0]; } - for (let output of this.outputs) { + let nulldata = 0; + + for (const output of this.outputs) { if (!output.script.isStandard()) return [false, 'scriptpubkey', 0]; @@ -1546,8 +1546,8 @@ TX.prototype.hasStandardInputs = function hasStandardInputs(view) { if (this.isCoinbase()) return true; - for (let input of this.inputs) { - let coin = view.getOutput(input); + for (const input of this.inputs) { + const coin = view.getOutputFor(input); if (!coin) return false; @@ -1556,7 +1556,7 @@ TX.prototype.hasStandardInputs = function hasStandardInputs(view) { continue; if (coin.script.isScripthash()) { - let redeem = input.script.getRedeem(); + const redeem = input.script.getRedeem(); if (!redeem) return false; @@ -1585,10 +1585,9 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { if (this.isCoinbase()) return true; - for (let input of this.inputs) { - let witness = input.witness; - let coin = view.getOutput(input); - let prev; + for (const input of this.inputs) { + const witness = input.witness; + const coin = view.getOutputFor(input); if (!coin) continue; @@ -1596,7 +1595,7 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { if (witness.items.length === 0) continue; - prev = coin.script; + let prev = coin.script; if (prev.isScripthash()) { prev = input.script.getRedeem(); @@ -1621,25 +1620,23 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { } if (prev.isWitnessScripthash()) { - let redeem; - if (witness.items.length - 1 > policy.MAX_P2WSH_STACK) return false; for (let i = 0; i < witness.items.length - 1; i++) { - let item = witness.items[i]; + const item = witness.items[i]; if (item.length > policy.MAX_P2WSH_PUSH) return false; } - redeem = witness.items[witness.items.length - 1]; + const raw = witness.items[witness.items.length - 1]; - if (redeem.length > policy.MAX_P2WSH_SIZE) + if (raw.length > policy.MAX_P2WSH_SIZE) return false; - prev = new Script(redeem); + const redeem = Script.fromRaw(raw); - if (prev.isPubkey()) { + if (redeem.isPubkey()) { if (witness.items.length - 1 !== 1) return false; @@ -1649,8 +1646,8 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { continue; } - if (prev.isPubkeyhash()) { - if (input.witness.length - 1 !== 2) + if (redeem.isPubkeyhash()) { + if (input.witness.items.length - 1 !== 2) return false; if (witness.items[0].length > 73) @@ -1662,9 +1659,9 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { continue; } - if (prev.isMultisig()) { - let m = prev.getSmall(0); + const [m] = redeem.getMultisig(); + if (m !== -1) { if (witness.items.length - 1 !== m + 1) return false; @@ -1672,7 +1669,7 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { return false; for (let i = 1; i < witness.items.length - 1; i++) { - let item = witness.items[i]; + const item = witness.items[i]; if (item.length > 73) return false; } @@ -1684,7 +1681,7 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { if (witness.items.length > policy.MAX_P2WSH_STACK) return false; - for (let item of witness.items) { + for (const item of witness.items) { if (item.length > policy.MAX_P2WSH_PUSH) return false; } @@ -1707,7 +1704,7 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { */ TX.prototype.verifyInputs = function verifyInputs(view, height) { - let [fee] = this.checkInputs(view, height); + const [fee] = this.checkInputs(view, height); return fee !== -1; }; @@ -1725,27 +1722,23 @@ TX.prototype.verifyInputs = function verifyInputs(view, height) { */ TX.prototype.checkInputs = function checkInputs(view, height) { - let total = 0; - let fee, value; - assert(typeof height === 'number'); - for (let input of this.inputs) { - let coins = view.get(input.prevout.hash); - let coin; + let total = 0; + + for (const {prevout} of this.inputs) { + const entry = view.getEntry(prevout); - if (!coins) + if (!entry) return [-1, 'bad-txns-inputs-missingorspent', 0]; - if (coins.coinbase) { - if (height - coins.height < consensus.COINBASE_MATURITY) + if (entry.coinbase) { + if (height - entry.height < consensus.COINBASE_MATURITY) return [-1, 'bad-txns-premature-spend-of-coinbase', 0]; } - coin = coins.getOutput(input.prevout.index); - - if (!coin) - return [-1, 'bad-txns-inputs-missingorspent', 0]; + const coin = view.getOutput(prevout); + assert(coin); if (coin.value < 0 || coin.value > consensus.MAX_MONEY) return [-1, 'bad-txns-inputvalues-outofrange', 100]; @@ -1757,12 +1750,12 @@ TX.prototype.checkInputs = function checkInputs(view, height) { } // Overflows already checked in `isSane()`. - value = this.getOutputValue(); + const value = this.getOutputValue(); if (total < value) return [-1, 'bad-txns-in-belowout', 100]; - fee = total - value; + const fee = total - value; if (fee < 0) return [-1, 'bad-txns-fee-negative', 100]; @@ -1782,13 +1775,11 @@ TX.prototype.checkInputs = function checkInputs(view, height) { */ TX.prototype.getModifiedSize = function getModifiedSize(size) { - let offset; - if (size == null) size = this.getVirtualSize(); - for (let input of this.inputs) { - offset = 41 + Math.min(110, input.script.getSize()); + for (const input of this.inputs) { + const offset = 41 + Math.min(110, input.script.getSize()); if (size > offset) size -= offset; } @@ -1806,30 +1797,29 @@ TX.prototype.getModifiedSize = function getModifiedSize(size) { */ TX.prototype.getPriority = function getPriority(view, height, size) { - let sum = 0; - assert(typeof height === 'number', 'Must pass in height.'); if (this.isCoinbase()) - return sum; + return 0; if (size == null) size = this.getVirtualSize(); - for (let input of this.inputs) { - let coin = view.getOutput(input); - let coinHeight; + let sum = 0; + + for (const {prevout} of this.inputs) { + const coin = view.getOutput(prevout); if (!coin) continue; - coinHeight = view.getHeight(input); + const coinHeight = view.getHeight(prevout); if (coinHeight === -1) continue; if (coinHeight <= height) { - let age = height - coinHeight; + const age = height - coinHeight; sum += coin.value * age; } } @@ -1844,21 +1834,20 @@ TX.prototype.getPriority = function getPriority(view, height, size) { */ TX.prototype.getChainValue = function getChainValue(view) { - let value = 0; - if (this.isCoinbase()) - return value; + return 0; - for (let input of this.inputs) { - let coin = view.getOutput(input); - let coinHeight; + let value = 0; + + for (const {prevout} of this.inputs) { + const coin = view.getOutput(prevout); if (!coin) continue; - coinHeight = view.getHeight(input); + const height = view.getHeight(prevout); - if (coinHeight === -1) + if (height === -1) continue; value += coin.value; @@ -1881,7 +1870,7 @@ TX.prototype.getChainValue = function getChainValue(view) { */ TX.prototype.isFree = function isFree(view, height, size) { - let priority = this.getPriority(view, height, size); + const priority = this.getPriority(view, height, size); return priority > policy.FREE_THRESHOLD; }; @@ -1927,7 +1916,7 @@ TX.prototype.getRoundFee = function getRoundFee(size, rate) { */ TX.prototype.getRate = function getRate(view, size) { - let fee = this.getFee(view); + const fee = this.getFee(view); if (fee < 0) return 0; @@ -1944,12 +1933,12 @@ TX.prototype.getRate = function getRate(view, size) { */ TX.prototype.getPrevout = function getPrevout() { - let prevout = {}; - if (this.isCoinbase()) return []; - for (let input of this.inputs) + const prevout = Object.create(null); + + for (const input of this.inputs) prevout[input.prevout.hash] = true; return Object.keys(prevout); @@ -1976,15 +1965,15 @@ TX.prototype.isWatched = function isWatched(filter) { // 2. Test data elements in output scripts // (may need to update filter on match) for (let i = 0; i < this.outputs.length; i++) { - let output = this.outputs[i]; + const output = this.outputs[i]; // Test the output script if (output.script.test(filter)) { if (filter.update === Bloom.flags.ALL) { - let prevout = Outpoint.fromTX(this, i); + const prevout = Outpoint.fromTX(this, i); filter.add(prevout.toRaw()); } else if (filter.update === Bloom.flags.PUBKEY_ONLY) { if (output.script.isPubkey() || output.script.isMultisig()) { - let prevout = Outpoint.fromTX(this, i); + const prevout = Outpoint.fromTX(this, i); filter.add(prevout.toRaw()); } } @@ -1997,8 +1986,8 @@ TX.prototype.isWatched = function isWatched(filter) { // 3. Test prev_out structure // 4. Test data elements in input scripts - for (let input of this.inputs) { - let prevout = input.prevout; + for (const input of this.inputs) { + const prevout = input.prevout; // Test the COutPoint structure if (filter.test(prevout.toRaw())) @@ -2082,7 +2071,7 @@ TX.prototype.format = function format(view, entry, index) { let fee = 0; let height = -1; let block = null; - let ts = 0; + let time = 0; let date = null; if (view) { @@ -2090,15 +2079,15 @@ TX.prototype.format = function format(view, entry, index) { rate = this.getRate(view); // Rate can exceed 53 bits in testing. - if (!util.isSafeInteger(rate)) + if (!Number.isSafeInteger(rate)) rate = 0; } if (entry) { height = entry.height; block = util.revHex(entry.hash); - ts = entry.ts; - date = util.date(ts); + time = entry.time; + date = util.date(time); } if (index == null) @@ -2115,13 +2104,12 @@ TX.prototype.format = function format(view, entry, index) { minFee: Amount.btc(this.getMinFee()), height: height, block: block, - ts: ts, + time: time, date: date, index: index, version: this.version, - flag: this.flag, inputs: this.inputs.map((input) => { - let coin = view ? view.getOutput(input) : null; + const coin = view ? view.getOutputFor(input) : null; return input.format(coin); }), outputs: this.outputs, @@ -2152,22 +2140,22 @@ TX.prototype.toJSON = function toJSON() { */ TX.prototype.getJSON = function getJSON(network, view, entry, index) { - let rate, fee, height, block, ts, date; + let rate, fee, height, block, time, date; if (view) { fee = this.getFee(view); rate = this.getRate(view); // Rate can exceed 53 bits in testing. - if (!util.isSafeInteger(rate)) + if (!Number.isSafeInteger(rate)) rate = 0; } if (entry) { height = entry.height; block = util.revHex(entry.hash); - ts = entry.ts; - date = util.date(ts); + time = entry.time; + date = util.date(time); } network = Network.get(network); @@ -2177,22 +2165,22 @@ TX.prototype.getJSON = function getJSON(network, view, entry, index) { witnessHash: this.wtxid(), fee: fee, rate: rate, - ps: util.now(), + mtime: util.now(), height: height, block: block, - ts: ts, + time: time, date: date, index: index, version: this.version, - flag: this.flag, inputs: this.inputs.map((input) => { - let coin = view ? view.getCoin(input) : null; + const coin = view ? view.getCoinFor(input) : null; return input.getJSON(network, coin); }), outputs: this.outputs.map((output) => { return output.getJSON(network); }), - locktime: this.locktime + locktime: this.locktime, + hex: this.toRaw().toString('hex') }; }; @@ -2204,19 +2192,17 @@ TX.prototype.getJSON = function getJSON(network, view, entry, index) { TX.prototype.fromJSON = function fromJSON(json) { assert(json, 'TX data is required.'); - assert(util.isUInt32(json.version), 'Version must be a uint32.'); - assert(util.isUInt8(json.flag), 'Flag must be a uint8.'); + assert(util.isU32(json.version), 'Version must be a uint32.'); assert(Array.isArray(json.inputs), 'Inputs must be an array.'); assert(Array.isArray(json.outputs), 'Outputs must be an array.'); - assert(util.isUInt32(json.locktime), 'Locktime must be a uint32.'); + assert(util.isU32(json.locktime), 'Locktime must be a uint32.'); this.version = json.version; - this.flag = json.flag; - for (let input of json.inputs) + for (const input of json.inputs) this.inputs.push(Input.fromJSON(input)); - for (let output of json.outputs) + for (const output of json.outputs) this.outputs.push(Output.fromJSON(output)); this.locktime = json.locktime; @@ -2275,23 +2261,21 @@ TX.prototype.fromRaw = function fromRaw(data) { */ TX.prototype.fromReader = function fromReader(br) { - let count; - - if (TX.isWitness(br)) + if (hasWitnessBytes(br)) return this.fromWitnessReader(br); br.start(); this.version = br.readU32(); - count = br.readVarint(); + const inCount = br.readVarint(); - for (let i = 0; i < count; i++) + for (let i = 0; i < inCount; i++) this.inputs.push(Input.fromReader(br)); - count = br.readVarint(); + const outCount = br.readVarint(); - for (let i = 0; i < count; i++) + for (let i = 0; i < outCount; i++) this.outputs.push(Output.fromReader(br)); this.locktime = br.readU32(); @@ -2315,39 +2299,35 @@ TX.prototype.fromReader = function fromReader(br) { */ TX.prototype.fromWitnessReader = function fromWitnessReader(br) { - let flag = 0; - let witness = 0; - let hasWitness = false; - let count; - br.start(); this.version = br.readU32(); assert(br.readU8() === 0, 'Non-zero marker.'); - flag = br.readU8(); + let flags = br.readU8(); - assert(flag !== 0, 'Flag byte is zero.'); + assert(flags !== 0, 'Flags byte is zero.'); - this.flag = flag; + const inCount = br.readVarint(); - count = br.readVarint(); - - for (let i = 0; i < count; i++) + for (let i = 0; i < inCount; i++) this.inputs.push(Input.fromReader(br)); - count = br.readVarint(); + const outCount = br.readVarint(); - for (let i = 0; i < count; i++) + for (let i = 0; i < outCount; i++) this.outputs.push(Output.fromReader(br)); - if (flag & 1) { - flag ^= 1; + let witness = 0; + let hasWitness = false; + + if (flags & 1) { + flags ^= 1; witness = br.offset; - for (let input of this.inputs) { + for (const input of this.inputs) { input.witness.fromReader(br); if (input.witness.items.length > 0) hasWitness = true; @@ -2356,7 +2336,7 @@ TX.prototype.fromWitnessReader = function fromWitnessReader(br) { witness = (br.offset - witness) + 2; } - if (flag !== 0) + if (flags !== 0) throw new Error('Unknown witness flag.'); // We'll never be able to reserialize @@ -2385,11 +2365,11 @@ TX.prototype.fromWitnessReader = function fromWitnessReader(br) { */ TX.prototype.frameNormal = function frameNormal() { - let sizes = this.getNormalSizes(); - let bw = new StaticWriter(sizes.total); + const raw = this.getNormalSizes(); + const bw = new StaticWriter(raw.size); this.writeNormal(bw); - sizes.data = bw.render(); - return sizes; + raw.data = bw.render(); + return raw; }; /** @@ -2400,11 +2380,11 @@ TX.prototype.frameNormal = function frameNormal() { */ TX.prototype.frameWitness = function frameWitness() { - let sizes = this.getWitnessSizes(); - let bw = new StaticWriter(sizes.total); + const raw = this.getWitnessSizes(); + const bw = new StaticWriter(raw.size); this.writeWitness(bw); - sizes.data = bw.render(); - return sizes; + raw.data = bw.render(); + return raw; }; /** @@ -2422,12 +2402,12 @@ TX.prototype.writeNormal = function writeNormal(bw) { bw.writeVarint(this.inputs.length); - for (let input of this.inputs) + for (const input of this.inputs) input.toWriter(bw); bw.writeVarint(this.outputs.length); - for (let output of this.outputs) + for (const output of this.outputs) output.toWriter(bw); bw.writeU32(this.locktime); @@ -2444,31 +2424,29 @@ TX.prototype.writeNormal = function writeNormal(bw) { */ TX.prototype.writeWitness = function writeWitness(bw) { - let witness; - if (this.inputs.length === 0 && this.outputs.length !== 0) throw new Error('Cannot serialize zero-input tx.'); bw.writeU32(this.version); bw.writeU8(0); - bw.writeU8(this.flag); + bw.writeU8(1); bw.writeVarint(this.inputs.length); - for (let input of this.inputs) + for (const input of this.inputs) input.toWriter(bw); bw.writeVarint(this.outputs.length); - for (let output of this.outputs) + for (const output of this.outputs) output.toWriter(bw); - witness = bw.written; + const start = bw.offset; - for (let input of this.inputs) + for (const input of this.inputs) input.witness.toWriter(bw); - witness = bw.written - witness; + const witness = bw.offset - start; bw.writeU32(this.locktime); @@ -2491,12 +2469,12 @@ TX.prototype.getNormalSizes = function getNormalSizes() { base += encoding.sizeVarint(this.inputs.length); - for (let input of this.inputs) + for (const input of this.inputs) base += input.getSize(); base += encoding.sizeVarint(this.outputs.length); - for (let output of this.outputs) + for (const output of this.outputs) base += output.getSize(); base += 4; @@ -2519,14 +2497,14 @@ TX.prototype.getWitnessSizes = function getWitnessSizes() { base += encoding.sizeVarint(this.inputs.length); - for (let input of this.inputs) { + for (const input of this.inputs) { base += input.getSize(); witness += input.witness.getVarSize(); } base += encoding.sizeVarint(this.outputs.length); - for (let output of this.outputs) + for (const output of this.outputs) base += output.getSize(); base += 4; @@ -2534,20 +2512,6 @@ TX.prototype.getWitnessSizes = function getWitnessSizes() { return new RawTX(base + witness, witness); }; -/** - * Test whether data is a witness transaction. - * @param {Buffer|BufferReader} data - * @returns {Boolean} - */ - -TX.isWitness = function isWitness(br) { - if (br.left() < 6) - return false; - - return br.data[br.offset + 4] === 0 - && br.data[br.offset + 5] !== 0; -}; - /** * Test whether an object is a TX. * @param {Object} obj @@ -2555,19 +2519,24 @@ TX.isWitness = function isWitness(br) { */ TX.isTX = function isTX(obj) { - return obj - && Array.isArray(obj.inputs) - && typeof obj.locktime === 'number' - && typeof obj.witnessHash === 'function'; + return obj instanceof TX; }; /* * Helpers */ -function RawTX(total, witness) { +function hasWitnessBytes(br) { + if (br.left() < 6) + return false; + + return br.data[br.offset + 4] === 0 + && br.data[br.offset + 5] !== 0; +} + +function RawTX(size, witness) { this.data = null; - this.total = total; + this.size = size; this.witness = witness; } diff --git a/lib/primitives/txmeta.js b/lib/primitives/txmeta.js index 0e39ebe97..aed439bbf 100644 --- a/lib/primitives/txmeta.js +++ b/lib/primitives/txmeta.js @@ -24,11 +24,11 @@ function TXMeta(options) { return new TXMeta(options); this.tx = new TX(); - this.ps = util.now(); + this.mtime = util.now(); this.height = -1; this.block = null; - this.ts = 0; - this.index = 0; + this.time = 0; + this.index = -1; if (options) this.fromOptions(options); @@ -46,13 +46,13 @@ TXMeta.prototype.fromOptions = function fromOptions(options) { this.tx = options.tx; } - if (options.ps != null) { - assert(util.isNumber(options.ps)); - this.ps = options.ps; + if (options.mtime != null) { + assert(util.isU32(options.mtime)); + this.mtime = options.mtime; } if (options.height != null) { - assert(util.isNumber(options.height)); + assert(util.isInt(options.height)); this.height = options.height; } @@ -61,13 +61,13 @@ TXMeta.prototype.fromOptions = function fromOptions(options) { this.block = options.block; } - if (options.ts != null) { - assert(util.isNumber(options.ts)); - this.ts = options.ts; + if (options.time != null) { + assert(util.isU32(options.time)); + this.time = options.time; } if (options.index != null) { - assert(util.isNumber(options.index)); + assert(util.isInt(options.index)); this.index = options.index; } @@ -95,7 +95,7 @@ TXMeta.prototype.fromTX = function fromTX(tx, entry, index) { if (entry) { this.height = entry.height; this.block = entry.hash; - this.ts = entry.ts; + this.time = entry.time; this.index = index; } return this; @@ -126,11 +126,11 @@ TXMeta.prototype.inspect = function inspect() { */ TXMeta.prototype.format = function format(view) { - let data = this.tx.format(view, null, this.index); - data.ps = this.ps; + const data = this.tx.format(view, null, this.index); + data.mtime = this.mtime; data.height = this.height; data.block = this.block ? util.revHex(this.block) : null; - data.ts = this.ts; + data.time = this.time; return data; }; @@ -152,11 +152,11 @@ TXMeta.prototype.toJSON = function toJSON() { */ TXMeta.prototype.getJSON = function getJSON(network, view) { - let json = this.tx.getJSON(network, view, null, this.index); - json.ps = this.ps; + const json = this.tx.getJSON(network, view, null, this.index); + json.mtime = this.mtime; json.height = this.height; json.block = this.block ? util.revHex(this.block) : null; - json.ts = this.ts; + json.time = this.time; return json; }; @@ -169,13 +169,13 @@ TXMeta.prototype.getJSON = function getJSON(network, view) { TXMeta.prototype.fromJSON = function fromJSON(json) { this.tx.fromJSON(json); - assert(util.isNumber(json.ps)); - assert(util.isNumber(json.height)); + assert(util.isU32(json.mtime)); + assert(util.isInt(json.height)); assert(!json.block || typeof json.block === 'string'); - assert(util.isNumber(json.ts)); - assert(util.isNumber(json.index)); + assert(util.isU32(json.time)); + assert(util.isInt(json.index)); - this.ps = json.ps; + this.mtime = json.mtime; this.height = json.height; this.block = util.revHex(json.block); this.index = json.index; @@ -226,18 +226,18 @@ TXMeta.prototype.getSize = function getSize() { */ TXMeta.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); this.tx.toWriter(bw); - bw.writeU32(this.ps); + bw.writeU32(this.mtime); if (this.block) { bw.writeU8(1); bw.writeHash(this.block); bw.writeU32(this.height); - bw.writeU32(this.ts); + bw.writeU32(this.time); bw.writeU32(this.index); } else { bw.writeU8(0); @@ -253,16 +253,16 @@ TXMeta.prototype.toRaw = function toRaw() { */ TXMeta.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.tx.fromReader(br); - this.ps = br.readU32(); + this.mtime = br.readU32(); if (br.readU8() === 1) { this.block = br.readHash('hex'); this.height = br.readU32(); - this.ts = br.readU32(); + this.time = br.readU32(); this.index = br.readU32(); if (this.index === 0x7fffffff) this.index = -1; @@ -295,7 +295,7 @@ TXMeta.isTXMeta = function isTXMeta(obj) { return obj && Array.isArray(obj.inputs) && typeof obj.locktime === 'number' - && typeof obj.ps === 'number'; + && typeof obj.mtime === 'number'; }; /* diff --git a/lib/protocol/consensus.js b/lib/protocol/consensus.js index ea671eeb4..1cf8bc346 100644 --- a/lib/protocol/consensus.js +++ b/lib/protocol/consensus.js @@ -226,8 +226,8 @@ exports.BIP16_TIME = 1333238400; */ exports.fromCompact = function fromCompact(compact) { - let exponent = compact >>> 24; - let negative = (compact >>> 23) & 1; + const exponent = compact >>> 24; + const negative = (compact >>> 23) & 1; let mantissa = compact & 0x7fffff; let num; @@ -293,7 +293,7 @@ exports.toCompact = function toCompact(num) { */ exports.verifyPOW = function verifyPOW(hash, bits) { - let target = exports.fromCompact(bits); + const target = exports.fromCompact(bits); if (target.isNeg() || target.cmpn(0) === 0) return false; @@ -313,7 +313,7 @@ exports.verifyPOW = function verifyPOW(hash, bits) { */ exports.getReward = function getReward(height, interval) { - let halvings = Math.floor(height / interval); + const halvings = Math.floor(height / interval); assert(height >= 0, 'Bad height for reward.'); @@ -341,8 +341,8 @@ exports.getReward = function getReward(height, interval) { */ exports.hasBit = function hasBit(version, bit) { - let bits = version & exports.VERSION_TOP_MASK; - let topBits = exports.VERSION_TOP_BITS; - let mask = 1 << bit; + const bits = version & exports.VERSION_TOP_MASK; + const topBits = exports.VERSION_TOP_BITS; + const mask = 1 << bit; return (bits >>> 0) === topBits && (version & mask) !== 0; }; diff --git a/lib/protocol/errors.js b/lib/protocol/errors.js index bafdc6ec8..765e43563 100644 --- a/lib/protocol/errors.js +++ b/lib/protocol/errors.js @@ -12,7 +12,6 @@ */ const assert = require('assert'); -const util = require('../utils/util'); /** * An error thrown during verification. Can be either @@ -57,7 +56,7 @@ function VerifyError(msg, code, reason, score, malleated) { Error.captureStackTrace(this, VerifyError); } -util.inherits(VerifyError, Error); +Object.setPrototypeOf(VerifyError.prototype, Error.prototype); /* * Expose diff --git a/lib/protocol/network.js b/lib/protocol/network.js index a0abc092d..a01030c43 100644 --- a/lib/protocol/network.js +++ b/lib/protocol/network.js @@ -92,20 +92,17 @@ Network.bitcoincash = null; Network.prototype._init = function _init() { let bits = 0; - let keys; - for (let deployment of this.deploys) + for (const deployment of this.deploys) bits |= 1 << deployment.bit; bits |= consensus.VERSION_TOP_MASK; this.unknownBits = ~bits; - keys = Object.keys(this.checkpointMap); - - for (let key of keys) { - let hash = this.checkpointMap[key]; - let height = +key; + for (const key of Object.keys(this.checkpointMap)) { + const hash = this.checkpointMap[key]; + const height = Number(key); this.checkpoints.push({ hash: hash, height: height }); } @@ -120,9 +117,11 @@ Network.prototype._init = function _init() { */ Network.prototype.byBit = function byBit(bit) { - let index = util.binarySearch(this.deploys, bit, cmpBit); + const index = util.binarySearch(this.deploys, bit, cmpBit); + if (index === -1) return null; + return this.deploys[index]; }; @@ -151,8 +150,6 @@ Network.prototype.ms = function ms() { */ Network.create = function create(options) { - let network; - if (typeof options === 'string') options = networks[options]; @@ -161,7 +158,7 @@ Network.create = function create(options) { if (Network[options.type]) return Network[options.type]; - network = new Network(options); + const network = new Network(options); Network[network.type] = network; @@ -204,7 +201,7 @@ Network.get = function get(type) { if (typeof type === 'string') return Network.create(type); - assert(false, 'Unknown network.'); + throw new Error('Unknown network.'); }; /** @@ -250,7 +247,7 @@ Network.by = function by(value, compare, network, name) { throw new Error(`Network mismatch for ${name}.`); } - for (let type of networks.types) { + for (const type of networks.types) { network = networks[type]; if (compare(network, value)) return Network.get(type); @@ -420,7 +417,7 @@ function cmpPriv58(network, prefix) { } function cmpAddress(network, prefix) { - let prefixes = network.addressPrefix; + const prefixes = network.addressPrefix; switch (prefix) { case prefixes.pubkeyhash: diff --git a/lib/protocol/networks.js b/lib/protocol/networks.js index 8687a2925..a08c4a108 100644 --- a/lib/protocol/networks.js +++ b/lib/protocol/networks.js @@ -14,7 +14,6 @@ const BN = require('../crypto/bn'); const network = exports; -let main, testnet, regtest, segnet4, simnet, bitcoincash; /** * Network type list. @@ -32,7 +31,7 @@ network.types = ['main', 'testnet', 'regtest', 'segnet4', 'simnet', 'bitcoincash * @type {Object} */ -main = network.main = {}; +const main = {}; /** * Symbolic network type. @@ -101,7 +100,8 @@ main.checkpointMap = { 420000: 'a1ff746b2d42b834cb7d6b8981b09c265c2cabc016e8cc020000000000000000', 440000: '9bf296b8de5f834f7635d5e258a434ad51b4dbbcf7c08c030000000000000000', 450000: '0ba2070c62cd9da1f8cef88a0648c661a411d33e728340010000000000000000', - 460000: '8c25fc7e414d3e868d6ce0ec473c30ad44e7e8bc1b75ef000000000000000000' + 460000: '8c25fc7e414d3e868d6ce0ec473c30ad44e7e8bc1b75ef000000000000000000', + 470000: '89756d1ed75901437300af10d5ab69070a282e729c536c000000000000000000' }; /** @@ -110,7 +110,7 @@ main.checkpointMap = { * @default */ -main.lastCheckpoint = 460000; +main.lastCheckpoint = 470000; /** * @const {Number} @@ -128,8 +128,9 @@ main.genesis = { version: 1, hash: '6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000', prevBlock: '0000000000000000000000000000000000000000000000000000000000000000', - merkleRoot: '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', - ts: 1231006505, + merkleRoot: + '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', + time: 1231006505, bits: 486604799, nonce: 2083236893, height: 0 @@ -182,7 +183,7 @@ main.pow = { */ chainwork: new BN( - '00000000000000000000000000000000000000000055c9a5edbc0c72c659b0b2', + '00000000000000000000000000000000000000000074093f7ecede98cadd3a32', 'hex' ), @@ -478,7 +479,7 @@ main.requestMempool = false; * https://en.bitcoin.it/wiki/Testnet */ -testnet = network.testnet = {}; +const testnet = {}; testnet.type = 'testnet'; @@ -495,7 +496,6 @@ testnet.port = 18333; testnet.checkpointMap = { 546: '70cb6af7ebbcb1315d3414029c556c55f3e2fc353c4c9063a76c932a00000000', - // Custom checkpoints 10000: '02a1b43f52591e53b660069173ac83b675798e12599dbb0442b7580000000000', 100000: '1e0a16bbadccde1d80c66597b1939e45f91b570d29f95fc158299e0000000000', 170000: '508125560d202b89757889bb0e49c712477be20440058f05db4f0e0000000000', @@ -512,7 +512,7 @@ testnet.checkpointMap = { 1050000: 'd8190cf0af7f08e179cab51d67db0b44b87951a78f7fdc31b4a01a0000000000' }; -testnet.lastCheckpoint = 900000; +testnet.lastCheckpoint = 1050000; testnet.halvingInterval = 210000; @@ -520,8 +520,9 @@ testnet.genesis = { version: 1, hash: '43497fd7f826957108f4a30fd9cec3aeba79972084e90ead01ea330900000000', prevBlock: '0000000000000000000000000000000000000000000000000000000000000000', - merkleRoot: '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', - ts: 1296688602, + merkleRoot: + '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', + time: 1296688602, bits: 486604799, nonce: 414098458, height: 0 @@ -545,7 +546,7 @@ testnet.pow = { ), bits: 486604799, chainwork: new BN( - '000000000000000000000000000000000000000000000023301a0019bca9e74c', + '0000000000000000000000000000000000000000000000286d17360c5492b2c4', 'hex' ), targetTimespan: 14 * 24 * 60 * 60, @@ -659,7 +660,7 @@ testnet.requestMempool = false; * Regtest */ -regtest = network.regtest = {}; +const regtest = {}; regtest.type = 'regtest'; @@ -680,8 +681,9 @@ regtest.genesis = { version: 1, hash: '06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f', prevBlock: '0000000000000000000000000000000000000000000000000000000000000000', - merkleRoot: '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', - ts: 1296688602, + merkleRoot: + '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', + time: 1296688602, bits: 545259519, nonce: 2, height: 0 @@ -732,7 +734,7 @@ regtest.bip30 = {}; regtest.activationThreshold = 108; // 75% for testchains -regtest.minerWindow = 144; // Faster than normal for regtest (144 instead of 2016) +regtest.minerWindow = 144; // Faster than normal for regtest regtest.deployments = { csv: { @@ -815,173 +817,11 @@ regtest.selfConnect = true; regtest.requestMempool = true; -/* - * segnet4 - */ - -segnet4 = network.segnet4 = {}; - -segnet4.type = 'segnet4'; - -segnet4.seeds = [ - '104.243.38.34', - '37.34.48.17' -]; - -segnet4.magic = 0xc4a1abdc; - -segnet4.port = 28901; - -segnet4.checkpointMap = {}; -segnet4.lastCheckpoint = 0; - -segnet4.halvingInterval = 210000; - -segnet4.genesis = { - version: 1, - hash: 'b291211d4bb2b7e1b7a4758225e69e50104091a637213d033295c010f55ffb18', - prevBlock: '0000000000000000000000000000000000000000000000000000000000000000', - merkleRoot: '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', - ts: 1452831101, - bits: 503447551, - nonce: 0, - height: 0 -}; - -segnet4.genesisBlock = - '0100000000000000000000000000000000000000000000000000000000000000000000' - + '003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a7d71' - + '9856ffff011e0000000001010000000100000000000000000000000000000000000000' - + '00000000000000000000000000ffffffff4d04ffff001d0104455468652054696d6573' - + '2030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66' - + '207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01' - + '000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f' - + '61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f' - + 'ac00000000'; - -segnet4.pow = { - // 512x lower min difficulty than mainnet - limit: new BN( - '000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', - 'hex' - ), - bits: 503447551, - chainwork: new BN( - '0000000000000000000000000000000000000000000000000000000000800040', - 'hex' - ), - targetTimespan: 14 * 24 * 60 * 60, - targetSpacing: 10 * 60, - retargetInterval: 2016, - targetReset: true, - noRetargeting: false -}; - -segnet4.block = { - bip34height: 8, - bip34hash: '6c48386dc7c460defabb5640e28b6510a5f238cdbe6756c2976a7e0913000000', - bip65height: 8, - bip65hash: '6c48386dc7c460defabb5640e28b6510a5f238cdbe6756c2976a7e0913000000', - bip66height: 8, - bip66hash: '6c48386dc7c460defabb5640e28b6510a5f238cdbe6756c2976a7e0913000000', - pruneAfterHeight: 1000, - keepBlocks: 10000, - maxTipAge: 7 * 24 * 60 * 60, - slowHeight: 50000 -}; - -segnet4.bip30 = {}; - -segnet4.activationThreshold = 108; - -segnet4.minerWindow = 144; - -segnet4.deployments = { - csv: { - name: 'csv', - bit: 0, - startTime: 1456790400, // March 1st, 2016 - timeout: 1493596800, // May 1st, 2017 - threshold: -1, - window: -1, - required: false, - force: true - }, - segwit: { - name: 'segwit', - bit: 1, - startTime: 0, - timeout: 0xffffffff, - threshold: -1, - window: -1, - required: true, - force: false - }, - segsignal: { - name: 'segsignal', - bit: 4, - startTime: 0xffffffff, - timeout: 0xffffffff, - threshold: 269, - window: 336, - required: false, - force: false - }, - testdummy: { - name: 'testdummy', - bit: 28, - startTime: 1199145601, // January 1, 2008 - timeout: 1230767999, // December 31, 2008 - threshold: -1, - window: -1, - required: false, - force: true - } -}; - -segnet4.deploys = [ - segnet4.deployments.csv, - segnet4.deployments.segwit, - segnet4.deployments.segsignal, - segnet4.deployments.testdummy -]; - -segnet4.keyPrefix = { - privkey: 0x9e, - xpubkey: 0x053587cf, - xprivkey: 0x05358394, - xpubkey58: '2793', - xprivkey58: '2791', - coinType: 1 -}; - -segnet4.addressPrefix = { - pubkeyhash: 0x1e, - scripthash: 0x32, - witnesspubkeyhash: 0x04, - witnessscripthash: 0x29, - bech32: 'sg' -}; - -segnet4.requireStandard = false; - -segnet4.rpcPort = 28902; - -segnet4.minRelay = 1000; - -segnet4.feeRate = 20000; - -segnet4.maxFeeRate = 60000; - -segnet4.selfConnect = false; - -segnet4.requestMempool = true; - /* * Simnet (btcd) */ -simnet = network.simnet = {}; +const simnet = {}; simnet.type = 'simnet'; @@ -1003,8 +843,9 @@ simnet.genesis = { version: 1, hash: 'f67ad7695d9b662a72ff3d8edbbb2de0bfa67b13974bb9910d116d5cbd863e68', prevBlock: '0000000000000000000000000000000000000000000000000000000000000000', - merkleRoot: '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', - ts: 1401292357, + merkleRoot: + '3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a', + time: 1401292357, bits: 545259519, nonce: 2, height: 0 @@ -1143,6 +984,8 @@ simnet.requestMempool = false; * bitcoincash (Bitcoin Cash) */ +let bitcoincash = {}; + bitcoincash = network.bitcoincash = {}; bitcoincash.type = 'bitcoincash'; @@ -1291,3 +1134,13 @@ bitcoincash.maxFeeRate = 400000; bitcoincash.selfConnect = false; bitcoincash.requestMempool = false; + +/* + * Expose + */ + +network.main = main; +network.testnet = testnet; +network.regtest = regtest; +network.simnet = simnet; +network.bitcoincash = bitcoincash; diff --git a/lib/protocol/policy.js b/lib/protocol/policy.js index 8d9ffecc6..8a3652c3a 100644 --- a/lib/protocol/policy.js +++ b/lib/protocol/policy.js @@ -217,8 +217,6 @@ exports.BLOCK_PRIORITY_THRESHOLD = exports.FREE_THRESHOLD; */ exports.getMinFee = function getMinFee(size, rate) { - let fee; - if (rate == null) rate = exports.MIN_RELAY; @@ -228,7 +226,7 @@ exports.getMinFee = function getMinFee(size, rate) { if (size === 0) return 0; - fee = Math.floor(rate * size / 1000); + let fee = Math.floor(rate * size / 1000); if (fee === 0 && rate > 0) fee = rate; @@ -246,8 +244,6 @@ exports.getMinFee = function getMinFee(size, rate) { */ exports.getRoundFee = function getRoundFee(size, rate) { - let fee; - if (rate == null) rate = exports.MIN_RELAY; @@ -257,7 +253,7 @@ exports.getRoundFee = function getRoundFee(size, rate) { if (size === 0) return 0; - fee = rate * Math.ceil(size / 1000); + let fee = rate * Math.ceil(size / 1000); if (fee === 0 && rate > 0) fee = rate; diff --git a/lib/protocol/timedata.js b/lib/protocol/timedata.js index f09396201..310c090a3 100644 --- a/lib/protocol/timedata.js +++ b/lib/protocol/timedata.js @@ -40,7 +40,7 @@ function TimeData(limit) { this.checked = false; } -util.inherits(TimeData, EventEmitter); +Object.setPrototypeOf(TimeData.prototype, EventEmitter.prototype); /** * Add time data. @@ -49,14 +49,14 @@ util.inherits(TimeData, EventEmitter); */ TimeData.prototype.add = function add(id, time) { - let sample = time - util.now(); - if (this.samples.length >= this.limit) return; if (this.known.has(id)) return; + const sample = time - util.now(); + this.known.set(id, sample); util.binaryInsert(this.samples, sample, compare); @@ -69,17 +69,20 @@ TimeData.prototype.add = function add(id, time) { if (Math.abs(median) >= 70 * 60) { if (!this.checked) { let match = false; - for (let offset of this.samples) { + + for (const offset of this.samples) { if (offset !== 0 && Math.abs(offset) < 5 * 60) { match = true; break; } } + if (!match) { this.checked = true; this.emit('mismatch'); } } + median = 0; } diff --git a/lib/script/common.js b/lib/script/common.js index e728e6196..4313a329c 100644 --- a/lib/script/common.js +++ b/lib/script/common.js @@ -12,9 +12,9 @@ */ const assert = require('assert'); -const BN = require('../crypto/bn'); const util = require('../utils/util'); const secp256k1 = require('../crypto/secp256k1'); +const ScriptNum = require('./scriptnum'); /** * Script opcodes. @@ -23,7 +23,7 @@ const secp256k1 = require('../crypto/secp256k1'); */ exports.opcodes = { - OP_FALSE: 0x00, + // Push OP_0: 0x00, OP_PUSHDATA1: 0x4c, @@ -34,7 +34,6 @@ exports.opcodes = { OP_RESERVED: 0x50, - OP_TRUE: 0x51, OP_1: 0x51, OP_2: 0x52, OP_3: 0x53, @@ -52,6 +51,7 @@ exports.opcodes = { OP_15: 0x5f, OP_16: 0x60, + // Control OP_NOP: 0x61, OP_VER: 0x62, OP_IF: 0x63, @@ -63,6 +63,7 @@ exports.opcodes = { OP_VERIFY: 0x69, OP_RETURN: 0x6a, + // Stack OP_TOALTSTACK: 0x6b, OP_FROMALTSTACK: 0x6c, OP_2DROP: 0x6d, @@ -83,22 +84,24 @@ exports.opcodes = { OP_SWAP: 0x7c, OP_TUCK: 0x7d, + // Splice OP_CAT: 0x7e, OP_SUBSTR: 0x7f, OP_LEFT: 0x80, OP_RIGHT: 0x81, OP_SIZE: 0x82, + // Bit OP_INVERT: 0x83, OP_AND: 0x84, OP_OR: 0x85, OP_XOR: 0x86, OP_EQUAL: 0x87, OP_EQUALVERIFY: 0x88, - OP_RESERVED1: 0x89, OP_RESERVED2: 0x8a, + // Numeric OP_1ADD: 0x8b, OP_1SUB: 0x8c, OP_2MUL: 0x8d, @@ -127,6 +130,7 @@ exports.opcodes = { OP_MAX: 0xa4, OP_WITHIN: 0xa5, + // Crypto OP_RIPEMD160: 0xa6, OP_SHA1: 0xa7, OP_SHA256: 0xa8, @@ -138,11 +142,9 @@ exports.opcodes = { OP_CHECKMULTISIG: 0xae, OP_CHECKMULTISIGVERIFY: 0xaf, - OP_EVAL: 0xb0, + // Expansion OP_NOP1: 0xb0, - OP_NOP2: 0xb1, OP_CHECKLOCKTIMEVERIFY: 0xb1, - OP_NOP3: 0xb2, OP_CHECKSEQUENCEVERIFY: 0xb2, OP_NOP4: 0xb3, OP_NOP5: 0xb4, @@ -152,8 +154,7 @@ exports.opcodes = { OP_NOP9: 0xb8, OP_NOP10: 0xb9, - OP_PUBKEYHASH: 0xfd, - OP_PUBKEY: 0xfe, + // Custom OP_INVALIDOPCODE: 0xff }; @@ -162,7 +163,33 @@ exports.opcodes = { * @const {RevMap} */ -exports.opcodesByVal = util.revMap(exports.opcodes); +exports.opcodesByVal = util.reverse(exports.opcodes); + +/** + * Small ints (1 indexed, 1==0). + * @const {Buffer[]} + */ + +exports.small = [ + Buffer.from([0x81]), + Buffer.from([]), + Buffer.from([0x01]), + Buffer.from([0x02]), + Buffer.from([0x03]), + Buffer.from([0x04]), + Buffer.from([0x05]), + Buffer.from([0x06]), + Buffer.from([0x07]), + Buffer.from([0x08]), + Buffer.from([0x09]), + Buffer.from([0x0a]), + Buffer.from([0x0b]), + Buffer.from([0x0c]), + Buffer.from([0x0d]), + Buffer.from([0x0e]), + Buffer.from([0x0f]), + Buffer.from([0x10]) +]; /** * Script and locktime flags. See {@link VerifyFlags}. @@ -267,7 +294,7 @@ exports.hashType = { * @const {RevMap} */ -exports.hashTypeByVal = util.revMap(exports.hashType); +exports.hashTypeByVal = util.reverse(exports.hashType); /** * Output script types. @@ -292,28 +319,7 @@ exports.types = { * @const {RevMap} */ -exports.typesByVal = util.revMap(exports.types); - -/** - * False stack return value. - * @const {Buffer} - */ - -exports.STACK_FALSE = Buffer.from([]); - -/** - * True stack return value. - * @const {Buffer} - */ - -exports.STACK_TRUE = Buffer.from([0x01]); - -/** - * -1 stack return value. - * @const {Buffer} - */ - -exports.STACK_NEGATE = Buffer.from([0x81]); +exports.typesByVal = util.reverse(exports.types); /** * Test a signature to see whether it contains a valid sighash type. @@ -322,14 +328,12 @@ exports.STACK_NEGATE = Buffer.from([0x81]); */ exports.isHashType = function isHashType(sig) { - let type; - assert(Buffer.isBuffer(sig)); if (sig.length === 0) return false; - type = sig[sig.length - 1] & ~exports.hashType.ANYONECANPAY; + const type = sig[sig.length - 1] & ~exports.hashType.ANYONECANPAY; if (!(type >= exports.hashType.ALL && type <= exports.hashType.SINGLE)) return false; @@ -350,56 +354,6 @@ exports.isLowDER = function isLowDER(sig) { return secp256k1.isLowS(sig.slice(0, -1)); }; -/** - * Get a small integer from an opcode (OP_0-OP_16). - * @param {Number} index - * @returns {Number} - */ - -exports.getSmall = function getSmall(op) { - assert(typeof op === 'number'); - - if (op === exports.opcodes.OP_0) - return 0; - - if (op >= exports.opcodes.OP_1 && op <= exports.opcodes.OP_16) - return op - 0x50; - - return -1; -}; - -/** - * Test whether the data element is a ripemd160 hash. - * @param {Buffer?} hash - * @returns {Boolean} - */ - -exports.isHash = function isHash(hash) { - return Buffer.isBuffer(hash) && hash.length === 20; -}; - -/** - * Test whether the data element is a public key. Note that - * this does not verify the format of the key, only the length. - * @param {Buffer?} key - * @returns {Boolean} - */ - -exports.isKey = function isKey(key) { - return Buffer.isBuffer(key) && key.length >= 33 && key.length <= 65; -}; - -/** - * Test whether the data element is a signature. Note that - * this does not verify the format of the signature, only the length. - * @param {Buffer?} sig - * @returns {Boolean} - */ - -exports.isSignature = function isSignature(sig) { - return Buffer.isBuffer(sig) && sig.length >= 9 && sig.length <= 73; -}; - /** * Test whether the data element is a valid key. * @param {Buffer} key @@ -451,17 +405,17 @@ exports.isCompressedEncoding = function isCompressedEncoding(key) { */ exports.isSignatureEncoding = function isSignatureEncoding(sig) { - let lenR, lenS; - assert(Buffer.isBuffer(sig)); - // Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] [sighash] + // Format: + // 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] [sighash] // * total-length: 1-byte length descriptor of everything that follows, // excluding the sighash byte. // * R-length: 1-byte length descriptor of the R value that follows. // * R: arbitrary-length big-endian encoded R value. It must use the shortest // possible encoding for a positive integers (which means no null bytes at - // the start, except a single one when the next byte has its highest bit set). + // the start, except a single one when the next byte has its highest bit + // set). // * S-length: 1-byte length descriptor of the S value that follows. // * S: arbitrary-length big-endian encoded S value. The same rules apply. // * sighash: 1-byte value indicating what data is hashed (not part of the DER @@ -483,14 +437,14 @@ exports.isSignatureEncoding = function isSignatureEncoding(sig) { return false; // Extract the length of the R element. - lenR = sig[3]; + const lenR = sig[3]; // Make sure the length of the S element is still inside the signature. if (5 + lenR >= sig.length) return false; // Extract the length of the S element. - lenS = sig[5 + lenR]; + const lenS = sig[5 + lenR]; // Verify that the length of the signature matches the sum of the length // of the elements. @@ -535,309 +489,31 @@ exports.isSignatureEncoding = function isSignatureEncoding(sig) { }; /** - * Format script code into a human readable-string. - * @param {Array} code - * @returns {String} Human-readable string. - */ - -exports.formatStack = function formatStack(items) { - let out = []; - - for (let item of items) - out.push(item.toString('hex')); - - return out.join(' '); -}; - -/** - * Format script code into a human readable-string. - * @param {Array} code - * @returns {String} Human-readable string. - */ - -exports.formatCode = function formatCode(code) { - let out = []; - - for (let op of code) { - let data = op.data; - let value = op.value; - - if (data) { - let size = data.length.toString(16); - - while (size.length % 2 !== 0) - size = '0' + size; - - if (!exports.opcodesByVal[value]) { - value = value.toString(16); - if (value.length < 2) - value = '0' + value; - value = `0x${value} 0x${data.toString('hex')}`; - out.push(value); - continue; - } - - value = exports.opcodesByVal[value]; - value = `${value} 0x${size} 0x${data.toString('hex')}`; - out.push(value); - continue; - } - - assert(typeof value === 'number'); - - if (exports.opcodesByVal[value]) { - value = exports.opcodesByVal[value]; - out.push(value); - continue; - } - - if (value === -1) { - out.push('OP_INVALIDOPCODE'); - break; - } - - value = value.toString(16); - - if (value.length < 2) - value = '0' + value; - - value = `0x${value}`; - out.push(value); - } - - return out.join(' '); -}; - -/** - * Format script code into bitcoind asm format. - * @param {Array} code - * @param {Boolean?} decode - Attempt to decode hash types. - * @returns {String} Human-readable string. - */ - -exports.formatItem = function formatItem(data, decode) { - if (data.length <= 4) { - data = exports.num(data, exports.flags.VERIFY_NONE); - return data.toString(10); - } - - if (decode) { - let symbol = ''; - if (exports.isSignatureEncoding(data)) { - let type = data[data.length - 1]; - - symbol = exports.hashTypeByVal[type & 0x1f] || ''; - - if (symbol) { - if (type & exports.hashType.ANYONECANPAY) - symbol += '|ANYONECANPAY'; - symbol = `[${symbol}]`; - } - - data = data.slice(0, -1); - } - return data.toString('hex') + symbol; - } - - return data.toString('hex'); -}; - -/** - * Format script code into bitcoind asm format. - * @param {Array} code - * @param {Boolean?} decode - Attempt to decode hash types. - * @returns {String} Human-readable string. - */ - -exports.formatASM = function formatASM(code, decode) { - let out = []; - - if (code.length > 0 && code[0].value === exports.opcodes.OP_RETURN) - decode = false; - - for (let op of code) { - let data = op.data; - let value = op.value; - - if (value === -1) { - out.push('[error]'); - break; - } - - if (data) { - data = exports.formatItem(data, decode); - out.push(data); - continue; - } - - value = exports.opcodesByVal[value] || 'OP_UNKNOWN'; - - out.push(value); - } - - return out.join(' '); -}; - -/** - * Format script code into bitcoind asm format. - * @param {Array} code + * Format stack item into bitcoind asm format. + * @param {Buffer} item * @param {Boolean?} decode - Attempt to decode hash types. * @returns {String} Human-readable string. */ -exports.formatStackASM = function formatStackASM(items, decode) { - let out = []; - - for (let item of items) { - let data = exports.formatItem(item, decode); - out.push(data); +exports.toASM = function toASM(item, decode) { + if (item.length <= 4) { + const num = ScriptNum.decode(item); + return num.toString(10); } - return out.join(' '); -}; + if (decode && exports.isSignatureEncoding(item)) { + const type = item[item.length - 1]; -/** - * Create a CScriptNum. - * @param {Buffer} value - * @param {Boolean?} minimal - * @param {Number?} size - Max size in bytes. - * @returns {BN} - * @throws {ScriptError} - */ + let symbol = exports.hashTypeByVal[type & 0x1f] || ''; -exports.num = function num(value, minimal, size) { - let result; - - assert(Buffer.isBuffer(value)); - - if (size == null) - size = 4; - - if (value.length > size) - throw new exports.ScriptError('UNKNOWN_ERROR', 'Script number overflow.'); - - if (minimal && value.length > 0) { - // If the low bits on the last byte are unset, - // fail if the value's second to last byte does - // not have the high bit set. A number can't - // justify having the last byte's low bits unset - // unless they ran out of space for the sign bit - // in the second to last bit. We also fail on [0] - // to avoid negative zero (also avoids positive - // zero). - if (!(value[value.length - 1] & 0x7f)) { - if (value.length === 1 || !(value[value.length - 2] & 0x80)) { - throw new exports.ScriptError( - 'UNKNOWN_ERROR', - 'Non-minimally encoded Script number.'); - } + if (symbol) { + if (type & exports.hashType.ANYONECANPAY) + symbol += '|ANYONECANPAY'; + symbol = `[${symbol}]`; } - } - - if (value.length === 0) - return new BN(0); - - result = new BN(value, 'le'); - - // If the input vector's most significant byte is - // 0x80, remove it from the result's msb and return - // a negative. - // Equivalent to: - // -(result & ~(0x80 << (8 * (value.length - 1)))) - if (value[value.length - 1] & 0x80) - result.setn((value.length * 8) - 1, 0).ineg(); - - return result; -}; - -/** - * Create a script array. Will convert Numbers and big - * numbers to a little-endian buffer while taking into - * account negative zero, minimaldata, etc. - * @example - * assert.deepEqual(Script.array(0), Buffer.alloc(0)); - * assert.deepEqual(Script.array(0xffee), Buffer.from('eeff00', 'hex')); - * assert.deepEqual(Script.array(new BN(0xffee)), Buffer.from('eeff00', 'hex')); - * assert.deepEqual(Script.array(new BN(0x1e).ineg()), Buffer.from('9e', 'hex')); - * @param {Number|BN} value - * @returns {Buffer} - */ - -exports.array = function array(value) { - let neg, result; - if (util.isNumber(value)) - value = new BN(value); - - assert(BN.isBN(value)); - - if (value.cmpn(0) === 0) - return exports.STACK_FALSE; - - // If the most significant byte is >= 0x80 - // and the value is positive, push a new - // zero-byte to make the significant - // byte < 0x80 again. - - // If the most significant byte is >= 0x80 - // and the value is negative, push a new - // 0x80 byte that will be popped off when - // converting to an integral. - - // If the most significant byte is < 0x80 - // and the value is negative, add 0x80 to - // it, since it will be subtracted and - // interpreted as a negative when - // converting to an integral. - - neg = value.cmpn(0) < 0; - result = value.toArray('le'); - - if (result[result.length - 1] & 0x80) - result.push(neg ? 0x80 : 0); - else if (neg) - result[result.length - 1] |= 0x80; - - return Buffer.from(result); -}; - -/** - * An error thrown from the scripting system, - * potentially pertaining to Script execution. - * @alias module:script.ScriptError - * @constructor - * @extends Error - * @param {String} code - Error code. - * @param {Opcode} op - Opcode. - * @param {Number?} ip - Instruction pointer. - * @property {String} message - Error message. - * @property {String} code - Original code passed in. - * @property {Number} op - Opcode. - * @property {Number} ip - Instruction pointer. - */ - -exports.ScriptError = function ScriptError(code, op, ip) { - if (!(this instanceof ScriptError)) - return new ScriptError(code, op, ip); - - Error.call(this); - - this.type = 'ScriptError'; - this.code = code; - this.message = code; - this.op = -1; - this.ip = -1; - - if (typeof op === 'string') { - this.message = op; - } else if (op) { - this.message = `${code} (op=${op.toSymbol()}, ip=${ip})`; - this.op = op.value; - this.ip = ip; + return item.slice(0, -1).toString('hex') + symbol; } - if (Error.captureStackTrace) - Error.captureStackTrace(this, ScriptError); + return item.toString('hex'); }; - -util.inherits(exports.ScriptError, Error); diff --git a/lib/script/index.js b/lib/script/index.js index 4d83dc6e8..c3d9386b5 100644 --- a/lib/script/index.js +++ b/lib/script/index.js @@ -14,7 +14,8 @@ exports.common = require('./common'); exports.Opcode = require('./opcode'); exports.Program = require('./program'); exports.Script = require('./script'); -// exports.ScriptNum = require('./scriptnum'); +exports.ScriptError = require('./scripterror'); +exports.ScriptNum = require('./scriptnum'); exports.sigcache = require('./sigcache'); exports.Stack = require('./stack'); exports.Witness = require('./witness'); diff --git a/lib/script/opcode.js b/lib/script/opcode.js index 57b98e9b9..a46366e1b 100644 --- a/lib/script/opcode.js +++ b/lib/script/opcode.js @@ -8,16 +8,21 @@ 'use strict'; const assert = require('assert'); -const BN = require('../crypto/bn'); +const ScriptNum = require('./scriptnum'); const util = require('../utils/util'); const common = require('./common'); const BufferReader = require('../utils/reader'); const StaticWriter = require('../utils/staticwriter'); const opcodes = common.opcodes; +const opCache = []; + +let PARSE_ERROR = null; + /** * A simple struct which contains * an opcode and pushdata buffer. + * Note: this should not be called directly. * @alias module:script.Opcode * @constructor * @param {Number} value - Opcode. @@ -43,24 +48,25 @@ Opcode.prototype.isMinimal = function isMinimal() { if (!this.data) return true; - if (this.data.length === 0) - return this.value === opcodes.OP_0; + if (this.data.length === 1) { + if (this.data[0] === 0x81) + return false; - if (this.data.length === 1 && this.data[0] >= 1 && this.data[0] <= 16) - return false; - - if (this.data.length === 1 && this.data[0] === 0x81) - return false; + if (this.data[0] >= 1 && this.data[0] <= 16) + return false; + } - if (this.data.length <= 75) + if (this.data.length <= 0x4b) return this.value === this.data.length; - if (this.data.length <= 255) + if (this.data.length <= 0xff) return this.value === opcodes.OP_PUSHDATA1; - if (this.data.length <= 65535) + if (this.data.length <= 0xffff) return this.value === opcodes.OP_PUSHDATA2; + assert(this.value === opcodes.OP_PUSHDATA4); + return true; }; @@ -101,57 +107,170 @@ Opcode.prototype.isBranch = function isBranch() { }; /** - * Encode the opcode to a buffer writer. - * @param {BufferWriter} bw + * Test opcode equality. + * @param {Opcode} op + * @returns {Boolean} */ -Opcode.prototype.toWriter = function toWriter(bw) { - if (this.value === -1) - throw new Error('Cannot reserialize a parse error.'); +Opcode.prototype.equals = function equals(op) { + assert(Opcode.isOpcode(op)); + + if (this.value !== op.value) + return false; if (!this.data) { - bw.writeU8(this.value); - return bw; + assert(!op.data); + return true; } - if (this.value <= 0x4b) { - assert(this.value === this.data.length); - bw.writeU8(this.value); - bw.writeBytes(this.data); - return bw; - } + assert(op.data); - switch (this.value) { - case opcodes.OP_PUSHDATA1: - bw.writeU8(this.value); - bw.writeU8(this.data.length); - bw.writeBytes(this.data); - break; - case opcodes.OP_PUSHDATA2: - bw.writeU8(this.value); - bw.writeU16(this.data.length); - bw.writeBytes(this.data); - break; - case opcodes.OP_PUSHDATA4: - bw.writeU8(this.value); - bw.writeU32(this.data.length); - bw.writeBytes(this.data); - break; - default: - throw new Error('Unknown pushdata opcode.'); - } + return this.data.equals(op.data); +}; - return bw; +/** + * Convert Opcode to opcode value. + * @returns {Number} + */ + +Opcode.prototype.toOp = function toOp() { + return this.value; }; /** - * Encode the opcode. - * @returns {Buffer} + * Covert opcode to data push. + * @returns {Buffer|null} */ -Opcode.prototype.toRaw = function toRaw() { - let size = this.getSize(); - return this.toWriter(new StaticWriter(size)).render(); +Opcode.prototype.toData = function toData() { + return this.data; +}; + +/** + * Covert opcode to data length. + * @returns {Number} + */ + +Opcode.prototype.toLength = function toLength() { + return this.data ? this.data.length : -1; +}; + +/** + * Covert and _cast_ opcode to data push. + * @returns {Buffer|null} + */ + +Opcode.prototype.toPush = function toPush() { + if (this.value === opcodes.OP_0) + return common.small[0 + 1]; + + if (this.value === opcodes.OP_1NEGATE) + return common.small[-1 + 1]; + + if (this.value >= opcodes.OP_1 && this.value <= opcodes.OP_16) + return common.small[this.value - 0x50 + 1]; + + return this.toData(); +}; + +/** + * Get string for opcode. + * @param {String?} enc + * @returns {Buffer|null} + */ + +Opcode.prototype.toString = function toString(enc) { + const data = this.toPush(); + + if (!data) + return null; + + return data.toString(enc || 'utf8'); +}; + +/** + * Convert opcode to small integer. + * @returns {Number} + */ + +Opcode.prototype.toSmall = function toSmall() { + if (this.value === opcodes.OP_0) + return 0; + + if (this.value >= opcodes.OP_1 && this.value <= opcodes.OP_16) + return this.value - 0x50; + + return -1; +}; + +/** + * Convert opcode to script number. + * @param {Boolean?} minimal + * @param {Number?} limit + * @returns {ScriptNum|null} + */ + +Opcode.prototype.toNum = function toNum(minimal, limit) { + if (this.value === opcodes.OP_0) + return ScriptNum.fromInt(0); + + if (this.value === opcodes.OP_1NEGATE) + return ScriptNum.fromInt(-1); + + if (this.value >= opcodes.OP_1 && this.value <= opcodes.OP_16) + return ScriptNum.fromInt(this.value - 0x50); + + if (!this.data) + return null; + + return ScriptNum.decode(this.data, minimal, limit); +}; + +/** + * Convert opcode to integer. + * @param {Boolean?} minimal + * @param {Number?} limit + * @returns {Number} + */ + +Opcode.prototype.toInt = function toInt(minimal, limit) { + const num = this.toNum(minimal, limit); + + if (!num) + return -1; + + return num.getInt(); +}; + +/** + * Convert opcode to boolean. + * @returns {Boolean} + */ + +Opcode.prototype.toBool = function toBool() { + const smi = this.toSmall(); + + if (smi === -1) + return false; + + return smi === 1; +}; + +/** + * Convert opcode to its symbolic representation. + * @returns {String} + */ + +Opcode.prototype.toSymbol = function toSymbol() { + if (this.value === -1) + return 'OP_INVALIDOPCODE'; + + const symbol = common.opcodesByVal[this.value]; + + if (!symbol) + return `0x${util.hex8(this.value)}`; + + return symbol; }; /** @@ -163,9 +282,6 @@ Opcode.prototype.getSize = function getSize() { if (!this.data) return 1; - if (this.value <= 0x4b) - return 1 + this.data.length; - switch (this.value) { case opcodes.OP_PUSHDATA1: return 2 + this.data.length; @@ -174,113 +290,120 @@ Opcode.prototype.getSize = function getSize() { case opcodes.OP_PUSHDATA4: return 5 + this.data.length; default: - throw new Error('Unknown pushdata opcode.'); + return 1 + this.data.length; } }; /** - * Inject properties from buffer reader. - * @param {BufferReader} br - * @private + * Encode the opcode to a buffer writer. + * @param {BufferWriter} bw */ -Opcode.prototype.fromReader = function fromReader(br) { - let op = br.readU8(); - let size; +Opcode.prototype.toWriter = function toWriter(bw) { + if (this.value === -1) + throw new Error('Cannot reserialize a parse error.'); - if (op >= 0x01 && op <= 0x4b) { - if (br.left() < op) { - this.value = -1; - br.seek(br.left()); - return this; - } - this.value = op; - this.data = br.readBytes(op); - return this; + if (!this.data) { + bw.writeU8(this.value); + return bw; } - switch (op) { + switch (this.value) { case opcodes.OP_PUSHDATA1: - if (br.left() < 1) { - this.value = -1; - break; - } - size = br.readU8(); - if (br.left() < size) { - this.value = -1; - br.seek(br.left()); - break; - } - this.value = op; - this.data = br.readBytes(size); + bw.writeU8(this.value); + bw.writeU8(this.data.length); + bw.writeBytes(this.data); break; case opcodes.OP_PUSHDATA2: - if (br.left() < 2) { - this.value = -1; - br.seek(br.left()); - break; - } - size = br.readU16(); - if (br.left() < size) { - this.value = -1; - br.seek(br.left()); - break; - } - this.value = op; - this.data = br.readBytes(size); + bw.writeU8(this.value); + bw.writeU16(this.data.length); + bw.writeBytes(this.data); break; case opcodes.OP_PUSHDATA4: - if (br.left() < 4) { - this.value = -1; - br.seek(br.left()); - break; - } - size = br.readU32(); - if (br.left() < size) { - this.value = -1; - br.seek(br.left()); - break; - } - this.value = op; - this.data = br.readBytes(size); + bw.writeU8(this.value); + bw.writeU32(this.data.length); + bw.writeBytes(this.data); break; default: - this.value = op; + assert(this.value === this.data.length); + bw.writeU8(this.value); + bw.writeBytes(this.data); break; } - return this; + return bw; }; /** - * Inject properties from serialized data. - * @private - * @param {Buffer} data - * @returns {Opcode} + * Encode the opcode. + * @returns {Buffer} */ -Opcode.prototype.fromRaw = function fromRaw(data) { - return this.fromReader(new BufferReader(data)); +Opcode.prototype.toRaw = function toRaw() { + const size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); }; /** - * Instantiate opcode from buffer reader. - * @param {BufferReader} br - * @returns {Opcode} + * Convert the opcode to a bitcoind test string. + * @returns {String} Human-readable script code. */ -Opcode.fromReader = function fromReader(br) { - return new Opcode(0, null).fromReader(br); +Opcode.prototype.toFormat = function toFormat() { + if (this.value === -1) + return '0x01'; + + if (this.data) { + // Numbers + if (this.data.length <= 4) { + const num = this.toNum(); + if (this.equals(Opcode.fromNum(num))) + return num.toString(10); + } + + const symbol = common.opcodesByVal[this.value]; + const data = this.data.toString('hex'); + + // Direct push + if (!symbol) { + const size = util.hex8(this.value); + return `0x${size} 0x${data}`; + } + + // Pushdatas + let size = this.data.length.toString(16); + + while (size.length % 2 !== 0) + size = '0' + size; + + return `${symbol} 0x${size} 0x${data}`; + } + + // Opcodes + const symbol = common.opcodesByVal[this.value]; + if (symbol) + return symbol; + + // Unknown opcodes + const value = util.hex8(this.value); + + return `0x${value}`; }; /** - * Instantiate opcode from serialized data. - * @param {Buffer} data - * @returns {Opcode} + * Format the opcode as bitcoind asm. + * @param {Boolean?} decode - Attempt to decode hash types. + * @returns {String} Human-readable script. */ -Opcode.fromRaw = function fromRaw(data) { - return new Opcode(0, null).fromRaw(data); +Opcode.prototype.toASM = function toASM(decode) { + if (this.value === -1) + return '[error]'; + + if (this.data) + return common.toASM(this.data, decode); + + return common.opcodesByVal[this.value] || 'OP_UNKNOWN'; }; /** @@ -290,7 +413,13 @@ Opcode.fromRaw = function fromRaw(data) { */ Opcode.fromOp = function fromOp(op) { - return new Opcode(op, null); + assert(typeof op === 'number'); + + const cached = opCache[op]; + + assert(cached, 'Bad opcode.'); + + return cached; }; /** @@ -301,15 +430,14 @@ Opcode.fromOp = function fromOp(op) { */ Opcode.fromData = function fromData(data) { - if (data.length === 0) - return Opcode.fromOp(opcodes.OP_0); + assert(Buffer.isBuffer(data)); if (data.length === 1) { - if (data[0] >= 1 && data[0] <= 16) - return Opcode.fromOp(data[0] + 0x50); - if (data[0] === 0x81) return Opcode.fromOp(opcodes.OP_1NEGATE); + + if (data[0] >= 1 && data[0] <= 16) + return Opcode.fromOp(data[0] + 0x50); } return Opcode.fromPush(data); @@ -324,6 +452,11 @@ Opcode.fromData = function fromData(data) { */ Opcode.fromPush = function fromPush(data) { + assert(Buffer.isBuffer(data)); + + if (data.length === 0) + return Opcode.fromOp(opcodes.OP_0); + if (data.length <= 0x4b) return new Opcode(data.length, data); @@ -340,13 +473,16 @@ Opcode.fromPush = function fromPush(data) { }; /** - * Instantiate an opcode from a Number. - * @param {Number|BN} num + * Instantiate a pushdata opcode from a string. + * @param {String} str + * @param {String} [enc=utf8] * @returns {Opcode} */ -Opcode.fromNumber = function fromNumber(num) { - return Opcode.fromData(common.array(num)); +Opcode.fromString = function fromString(str, enc) { + assert(typeof str === 'string'); + const data = Buffer.from(str, enc || 'utf8'); + return Opcode.fromData(data); }; /** @@ -356,46 +492,51 @@ Opcode.fromNumber = function fromNumber(num) { */ Opcode.fromSmall = function fromSmall(num) { - assert(util.isNumber(num) && num >= 0 && num <= 16); + assert(util.isU8(num) && num >= 0 && num <= 16); return Opcode.fromOp(num === 0 ? 0 : num + 0x50); }; /** - * Instantiate a pushdata opcode from a string. - * @param {String} data + * Instantiate an opcode from a ScriptNum. + * @param {ScriptNumber} num * @returns {Opcode} */ -Opcode.fromString = function fromString(data, enc) { - if (typeof data === 'string') - data = Buffer.from(data, enc); - - return Opcode.fromData(data); +Opcode.fromNum = function fromNum(num) { + assert(ScriptNum.isScriptNum(num)); + return Opcode.fromData(num.encode()); }; /** - * Instantiate a pushdata opcode from anything. - * @param {String|Buffer|Number|BN|Opcode} data + * Instantiate an opcode from a Number. + * @param {Number} num * @returns {Opcode} */ -Opcode.from = function from(data) { - if (data instanceof Opcode) - return data; +Opcode.fromInt = function fromInt(num) { + assert(util.isInt(num)); - if (typeof data === 'number') - return Opcode.fromOp(data); + if (num === 0) + return Opcode.fromOp(opcodes.OP_0); - if (Buffer.isBuffer(data)) - return Opcode.fromData(data); + if (num === -1) + return Opcode.fromOp(opcodes.OP_1NEGATE); - if (typeof data === 'string') - return Opcode.fromString(data, 'utf8'); + if (num >= 1 && num <= 16) + return Opcode.fromOp(num + 0x50); - if (BN.isBN(data)) - return Opcode.fromNumber(data); + return Opcode.fromNum(ScriptNum.fromNumber(num)); +}; - assert(false, 'Bad data for opcode.'); +/** + * Instantiate an opcode from a Number. + * @param {Boolean} value + * @returns {Opcode} + */ + +Opcode.fromBool = function fromBool(value) { + assert(typeof value === 'boolean'); + return Opcode.fromSmall(value ? 1 : 0); }; /** @@ -407,8 +548,6 @@ Opcode.from = function from(data) { */ Opcode.fromSymbol = function fromSymbol(name) { - let op; - assert(typeof name === 'string'); assert(name.length > 0); @@ -418,30 +557,105 @@ Opcode.fromSymbol = function fromSymbol(name) { if (!util.startsWith(name, 'OP_')) name = `OP_${name}`; - op = common.opcodes[name]; - assert(op != null, 'Unknown opcode.'); + const op = common.opcodes[name]; + + if (op != null) + return Opcode.fromOp(op); - return Opcode.fromOp(op); + assert(util.startsWith(name, 'OP_0X'), 'Unknown opcode.'); + assert(name.length === 7, 'Unknown opcode.'); + + const value = parseInt(name.substring(5), 16); + + assert(util.isU8(value), 'Unknown opcode.'); + + return Opcode.fromOp(value); }; /** - * Convert opcode to its symbolic representation. - * @returns {String} + * Instantiate opcode from buffer reader. + * @param {BufferReader} br + * @returns {Opcode} */ -Opcode.prototype.toSymbol = function toSymbol() { - let op = this.value; - let symbol; +Opcode.fromReader = function fromReader(br) { + const value = br.readU8(); + const op = opCache[value]; - if (op === -1) - op = 0xff; + if (op) + return op; - symbol = common.opcodesByVal[op]; + switch (value) { + case opcodes.OP_PUSHDATA1: { + if (br.left() < 1) + return PARSE_ERROR; - if (symbol == null) - symbol = util.hex8(op); + const size = br.readU8(); - return symbol; + if (br.left() < size) { + br.seek(br.left()); + return PARSE_ERROR; + } + + const data = br.readBytes(size); + + return new Opcode(value, data); + } + case opcodes.OP_PUSHDATA2: { + if (br.left() < 2) { + br.seek(br.left()); + return PARSE_ERROR; + } + + const size = br.readU16(); + + if (br.left() < size) { + br.seek(br.left()); + return PARSE_ERROR; + } + + const data = br.readBytes(size); + + return new Opcode(value, data); + } + case opcodes.OP_PUSHDATA4: { + if (br.left() < 4) { + br.seek(br.left()); + return PARSE_ERROR; + } + + const size = br.readU32(); + + if (br.left() < size) { + br.seek(br.left()); + return PARSE_ERROR; + } + + const data = br.readBytes(size); + + return new Opcode(value, data); + } + default: { + if (br.left() < value) { + br.seek(br.left()); + return PARSE_ERROR; + } + + const data = br.readBytes(value); + + return new Opcode(value, data); + } + } +}; + +/** + * Instantiate opcode from serialized data. + * @param {Buffer} data + * @returns {Opcode} + */ + +Opcode.fromRaw = function fromRaw(data) { + return Opcode.fromReader(new BufferReader(data)); }; /** @@ -451,11 +665,24 @@ Opcode.prototype.toSymbol = function toSymbol() { */ Opcode.isOpcode = function isOpcode(obj) { - return obj - && typeof obj.value === 'number' - && (Buffer.isBuffer(obj.data) || obj.data === null); + return obj instanceof Opcode; }; +/* + * Fill Cache + */ + +PARSE_ERROR = Object.freeze(new Opcode(-1)); + +for (let value = 0x00; value <= 0xff; value++) { + if (value >= 0x01 && value <= 0x4e) { + opCache.push(null); + continue; + } + const op = new Opcode(value); + opCache.push(Object.freeze(op)); +} + /* * Expose */ diff --git a/lib/script/program.js b/lib/script/program.js index 8c7e63212..fedee361a 100644 --- a/lib/script/program.js +++ b/lib/script/program.js @@ -29,9 +29,9 @@ function Program(version, data) { if (!(this instanceof Program)) return new Program(version, data); - assert(util.isNumber(version)); - assert(Buffer.isBuffer(data)); + assert(util.isU8(version)); assert(version >= 0 && version <= 16); + assert(Buffer.isBuffer(data)); assert(data.length >= 2 && data.length <= 40); this.version = version; @@ -74,7 +74,7 @@ Program.prototype.getType = function getType() { */ Program.prototype.isUnknown = function isUnknown() { - let type = this.getType(); + const type = this.getType(); return type === scriptTypes.WITNESSMALFORMED || type === scriptTypes.NONSTANDARD; }; @@ -94,8 +94,8 @@ Program.prototype.isMalformed = function isMalformed() { */ Program.prototype.inspect = function inspect() { - let data = this.data.toString('hex'); - let type = common.typesByVal[this.getType()].toLowerCase(); + const data = this.data.toString('hex'); + const type = common.typesByVal[this.getType()].toLowerCase(); return ``; }; diff --git a/lib/script/script.js b/lib/script/script.js index 6cf5853ba..751ea81ea 100644 --- a/lib/script/script.js +++ b/lib/script/script.js @@ -8,7 +8,6 @@ 'use strict'; const assert = require('assert'); -const BN = require('../crypto/bn'); const consensus = require('../protocol/consensus'); const policy = require('../protocol/policy'); const util = require('../utils/util'); @@ -20,16 +19,15 @@ const StaticWriter = require('../utils/staticwriter'); const Program = require('./program'); const Opcode = require('./opcode'); const Stack = require('./stack'); +const ScriptError = require('./scripterror'); +const ScriptNum = require('./scriptnum'); const common = require('./common'); const encoding = require('../utils/encoding'); const secp256k1 = require('../crypto/secp256k1'); const Address = require('../primitives/address'); const opcodes = common.opcodes; const scriptTypes = common.types; -const ScriptError = common.ScriptError; -const STACK_TRUE = common.STACK_TRUE; -const STACK_FALSE = common.STACK_FALSE; -const STACK_NEGATE = common.STACK_NEGATE; +const EMPTY_BUFFER = Buffer.alloc(0); /** * Represents a input or output script. @@ -46,7 +44,7 @@ function Script(options) { if (!(this instanceof Script)) return new Script(options); - this.raw = STACK_FALSE; + this.raw = EMPTY_BUFFER; this.code = []; if (options) @@ -104,29 +102,18 @@ Script.types = common.types; Script.typesByVal = common.typesByVal; -/** - * Getter to retrieve code length. - * @name module:script.Script#length_getter - * @method - * @private - * @returns {Number} - */ - -Script.prototype.__defineGetter__('length', function() { - return this.code.length; -}); - -/** - * Setter to set code length. - * @name module:script.Script#length_setter - * @method - * @private - * @param {Number} value - * @returns {Number} +/* + * Expose length setter and getter. */ -Script.prototype.__defineSetter__('length', function(length) { - return this.code.length = length; +Object.defineProperty(Script.prototype, 'length', { + get() { + return this.code.length; + }, + set(length) { + this.code.length = length; + return this.code.length; + } }); /** @@ -153,7 +140,7 @@ Script.prototype.fromOptions = function fromOptions(options) { if (options.code) { if (!options.raw) - return this.fromCode(options.code); + return this.fromArray(options.code); assert(Array.isArray(options.code), 'Code must be an array.'); this.code = options.code; } @@ -171,6 +158,33 @@ Script.fromOptions = function fromOptions(options) { return new Script().fromOptions(options); }; +/** + * Instantiate a value-only iterator. + * @returns {ScriptIterator} + */ + +Script.prototype.values = function values() { + return this.code.values(); +}; + +/** + * Instantiate a key and value iterator. + * @returns {ScriptIterator} + */ + +Script.prototype.entries = function entries() { + return this.code.entries(); +}; + +/** + * Instantiate a value-only iterator. + * @returns {ScriptIterator} + */ + +Script.prototype[Symbol.iterator] = function() { + return this.code[Symbol.iterator](); +}; + /** * Convert the script to an array of * Buffers (pushdatas) and Numbers @@ -179,12 +193,7 @@ Script.fromOptions = function fromOptions(options) { */ Script.prototype.toArray = function toArray() { - let code = []; - - for (let op of this.code) - code.push(op.data || op.value); - - return code; + return this.code.slice(); }; /** @@ -198,28 +207,12 @@ Script.prototype.toArray = function toArray() { Script.prototype.fromArray = function fromArray(code) { assert(Array.isArray(code)); - if (code.length === 0) - return this; - - if (code[0] instanceof Opcode) - return this.fromCode(code); - - for (let op of code) { - if (Buffer.isBuffer(op)) { - this.code.push(Opcode.fromData(op)); - continue; - } - if (typeof op === 'string') { - this.code.push(Opcode.fromSymbol(op)); - continue; - } - assert(typeof op === 'number'); - this.code.push(Opcode.fromOp(op)); - } + this.clear(); - this.compile(); + for (const op of code) + this.push(op); - return this; + return this.compile(); }; /** @@ -234,42 +227,81 @@ Script.fromArray = function fromArray(code) { }; /** - * Return an array of opcodes. - * @returns {Opcode[]} + * Convert script to stack items. + * @returns {Buffer[]} */ -Script.prototype.toCode = function toCode() { - return this.code.slice(); +Script.prototype.toItems = function toItems() { + const items = []; + + for (const op of this.code) { + const data = op.toPush(); + + if (!data) + throw new Error('Non-push opcode in script.'); + + items.push(data); + } + + return items; }; /** - * Inject properties from an array of opcodes. - * @param {Opcode[]} code + * Inject data from stack items. * @private + * @param {Buffer[]} items + * @returns {Script} */ -Script.prototype.fromCode = function fromCode(code) { - assert(Array.isArray(code)); +Script.prototype.fromItems = function fromItems(items) { + assert(Array.isArray(items)); - if (code.length === 0) - return this; + this.clear(); - assert(code[0] instanceof Opcode); + for (const item of items) + this.pushData(item); - this.code = code; - this.compile(); + return this.compile(); +}; - return this; +/** + * Instantiate script from stack items. + * @param {Buffer[]} items + * @returns {Script} + */ + +Script.fromItems = function fromItems(items) { + return new Script().fromItems(items); +}; + +/** + * Convert script to stack. + * @returns {Stack} + */ + +Script.prototype.toStack = function toStack() { + return new Stack(this.toItems()); }; /** - * Instantiate script from an array of opcodes. - * @param {Opcode[]} code + * Inject data from stack. + * @private + * @param {Stack} stack + * @returns {Script} + */ + +Script.prototype.fromStack = function fromStack(stack) { + return this.fromItems(stack.items); +}; + +/** + * Instantiate script from stack. + * @param {Stack} stack * @returns {Script} */ -Script.fromCode = function fromCode(code) { - return new Script().fromCode(code); +Script.fromStack = function fromStack(stack) { + return new Script().fromStack(stack); }; /** @@ -290,8 +322,41 @@ Script.prototype.clone = function clone() { */ Script.prototype.inject = function inject(script) { - this.code = script.code.slice(); this.raw = script.raw; + this.code = script.code.slice(); + return this; +}; + +/** + * Test equality against script. + * @param {Script} script + * @returns {Boolean} + */ + +Script.prototype.equals = function equals(script) { + assert(Script.isScript(script)); + return this.raw.equals(script.raw); +}; + +/** + * Compare against another script. + * @param {Script} script + * @returns {Number} + */ + +Script.prototype.compare = function compare(script) { + assert(Script.isScript(script)); + return this.raw.compare(script.raw); +}; + +/** + * Clear the script. + * @returns {Script} + */ + +Script.prototype.clear = function clear() { + this.raw = EMPTY_BUFFER; + this.code.length = 0; return this; }; @@ -310,7 +375,12 @@ Script.prototype.inspect = function inspect() { */ Script.prototype.toString = function toString() { - return common.formatCode(this.code); + const out = []; + + for (const op of this.code) + out.push(op.toFormat()); + + return out.join(' '); }; /** @@ -320,33 +390,35 @@ Script.prototype.toString = function toString() { */ Script.prototype.toASM = function toASM(decode) { - return common.formatASM(this.code, decode); -}; - -/** - * Calculate size of code to be compiled. - * @returns {Number} - */ + if (this.isNulldata()) + decode = false; -Script.prototype.getCodeSize = function getCodeSize() { - let size = 0; + const out = []; - for (let op of this.code) - size += op.getSize(); + for (const op of this.code) + out.push(op.toASM(decode)); - return size; + return out.join(' '); }; /** * Re-encode the script internally. Useful if you * changed something manually in the `code` array. + * @returns {Script} */ Script.prototype.compile = function compile() { - let size = this.getCodeSize(); - let bw = new StaticWriter(size); + if (this.code.length === 0) + return this.clear(); + + let size = 0; - for (let op of this.code) + for (const op of this.code) + size += op.getSize(); + + const bw = new StaticWriter(size); + + for (const op of this.code) op.toWriter(bw); this.raw = bw.render(); @@ -406,26 +478,26 @@ Script.fromJSON = function fromJSON(json) { /** * Get the script's "subscript" starting at a separator. - * @param {Number?} lastSep - The last separator to sign/verify beyond. + * @param {Number} index - The last separator to sign/verify beyond. * @returns {Script} Subscript. */ -Script.prototype.getSubscript = function getSubscript(lastSep) { - let code = []; - - if (lastSep === 0) +Script.prototype.getSubscript = function getSubscript(index) { + if (index === 0) return this.clone(); - for (let i = lastSep; i < this.code.length; i++) { - let op = this.code[i]; + const script = new Script(); + + for (let i = index; i < this.code.length; i++) { + const op = this.code[i]; if (op.value === -1) break; - code.push(op); + script.code.push(op); } - return Script.fromCode(code); + return script.compile(); }; /** @@ -438,11 +510,10 @@ Script.prototype.getSubscript = function getSubscript(lastSep) { Script.prototype.removeSeparators = function removeSeparators() { let found = false; - let code; // Optimizing for the common case: // Check for any separators first. - for (let op of this.code) { + for (const op of this.code) { if (op.value === -1) break; @@ -458,17 +529,17 @@ Script.prototype.removeSeparators = function removeSeparators() { // Uncommon case: someone actually // has a code separator. Go through // and remove them all. - code = []; + const script = new Script(); - for (let op of this.code) { + for (const op of this.code) { if (op.value === -1) break; if (op.value !== opcodes.OP_CODESEPARATOR) - code.push(op); + script.code.push(op); } - return Script.fromCode(code); + return script.compile(); }; /** @@ -480,47 +551,37 @@ Script.prototype.removeSeparators = function removeSeparators() { * @param {Amount?} value - Previous output value. * @param {Number?} version - Signature hash version (0=legacy, 1=segwit). * @throws {ScriptError} Will be thrown on VERIFY failures, among other things. - * @returns {Boolean} Whether the execution was successful. */ Script.prototype.execute = function execute(stack, flags, tx, index, value, version) { - let lastSep = 0; - let opCount = 0; - let negate = 0; - let minimal = false; - let state = []; - let alt = []; - if (flags == null) flags = Script.flags.STANDARD_VERIFY_FLAGS; if (version == null) version = 0; + if (this.raw.length > consensus.MAX_SCRIPT_SIZE) + throw new ScriptError('SCRIPT_SIZE'); + + const state = []; + const alt = []; + + let lastSep = 0; + let opCount = 0; + let negate = 0; + let minimal = false; + if (flags & Script.flags.VERIFY_MINIMALDATA) minimal = true; - if (this.getSize() > consensus.MAX_SCRIPT_SIZE) - throw new ScriptError('SCRIPT_SIZE'); - for (let ip = 0; ip < this.code.length; ip++) { - let op = this.code[ip]; + const op = this.code[ip]; if (op.value === -1) throw new ScriptError('BAD_OPCODE', op, ip); - if (op.data) { - if (op.data.length > consensus.MAX_SCRIPT_PUSH) - throw new ScriptError('PUSH_SIZE', op, ip); - - if (negate === 0) { - if (minimal && !op.isMinimal()) - throw new ScriptError('MINIMALDATA', op, ip); - stack.push(op.data); - } - - continue; - } + if (op.data && op.data.length > consensus.MAX_SCRIPT_PUSH) + throw new ScriptError('PUSH_SIZE', op, ip); if (op.value > opcodes.OP_16 && ++opCount > consensus.MAX_SCRIPT_OPS) throw new ScriptError('OP_COUNT', op, ip); @@ -528,22 +589,34 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (op.isDisabled()) throw new ScriptError('DISABLED_OPCODE', op, ip); - if (negate !== 0 && !op.isBranch()) + if (negate && !op.isBranch()) { + if (stack.length + alt.length > consensus.MAX_SCRIPT_STACK) + throw new ScriptError('STACK_SIZE', op, ip); + continue; + } + + if (op.data) { + if (minimal && !op.isMinimal()) + throw new ScriptError('MINIMALDATA', op, ip); + + stack.push(op.data); + + if (stack.length + alt.length > consensus.MAX_SCRIPT_STACK) + throw new ScriptError('STACK_SIZE', op, ip); + continue; + } switch (op.value) { case opcodes.OP_0: { - stack.push(STACK_FALSE); + stack.pushInt(0); break; } case opcodes.OP_1NEGATE: { - stack.push(STACK_NEGATE); - break; - } - case opcodes.OP_1: { - stack.push(STACK_TRUE); + stack.pushInt(-1); break; } + case opcodes.OP_1: case opcodes.OP_2: case opcodes.OP_3: case opcodes.OP_4: @@ -559,15 +632,13 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers case opcodes.OP_14: case opcodes.OP_15: case opcodes.OP_16: { - stack.push(Buffer.from([op.value - 0x50])); + stack.pushInt(op.value - 0x50); break; } case opcodes.OP_NOP: { break; } case opcodes.OP_CHECKLOCKTIMEVERIFY: { - let locktime; - // OP_CHECKLOCKTIMEVERIFY = OP_NOP2 if (!(flags & Script.flags.VERIFY_CHECKLOCKTIMEVERIFY)) { if (flags & Script.flags.VERIFY_DISCOURAGE_UPGRADABLE_NOPS) @@ -581,12 +652,12 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (stack.length === 0) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - locktime = Script.num(stack.top(-1), minimal, 5); + const num = stack.getNum(-1, minimal, 5); - if (locktime.cmpn(0) < 0) + if (num.isNeg()) throw new ScriptError('NEGATIVE_LOCKTIME', op, ip); - locktime = locktime.toNumber(); + const locktime = num.toDouble(); if (!tx.verifyLocktime(index, locktime)) throw new ScriptError('UNSATISFIED_LOCKTIME', op, ip); @@ -594,8 +665,6 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers break; } case opcodes.OP_CHECKSEQUENCEVERIFY: { - let locktime; - // OP_CHECKSEQUENCEVERIFY = OP_NOP3 if (!(flags & Script.flags.VERIFY_CHECKSEQUENCEVERIFY)) { if (flags & Script.flags.VERIFY_DISCOURAGE_UPGRADABLE_NOPS) @@ -609,12 +678,12 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (stack.length === 0) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - locktime = Script.num(stack.top(-1), minimal, 5); + const num = stack.getNum(-1, minimal, 5); - if (locktime.cmpn(0) < 0) + if (num.isNeg()) throw new ScriptError('NEGATIVE_LOCKTIME', op, ip); - locktime = locktime.toNumber(); + const locktime = num.toDouble(); if (!tx.verifySequence(index, locktime)) throw new ScriptError('UNSATISFIED_LOCKTIME', op, ip); @@ -637,21 +706,21 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers case opcodes.OP_NOTIF: { let val = false; - if (negate === 0) { + if (!negate) { if (stack.length < 1) throw new ScriptError('UNBALANCED_CONDITIONAL', op, ip); - val = stack.top(-1); - if (version === 1 && (flags & Script.flags.VERIFY_MINIMALIF)) { - if (val.length > 1) + const item = stack.get(-1); + + if (item.length > 1) throw new ScriptError('MINIMALIF'); - if (val.length === 1 && val[0] !== 1) + if (item.length === 1 && item[0] !== 1) throw new ScriptError('MINIMALIF'); } - val = Script.bool(val); + val = stack.getBool(-1); if (op.value === opcodes.OP_NOTIF) val = !val; @@ -662,7 +731,7 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers state.push(val); if (!val) - negate++; + negate += 1; break; } @@ -673,9 +742,9 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers state[state.length - 1] = !state[state.length - 1]; if (!state[state.length - 1]) - negate++; + negate += 1; else - negate--; + negate -= 1; break; } @@ -684,7 +753,7 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers throw new ScriptError('UNBALANCED_CONDITIONAL', op, ip); if (!state.pop()) - negate--; + negate -= 1; break; } @@ -692,7 +761,7 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (stack.length === 0) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - if (!Script.bool(stack.top(-1))) + if (!stack.getBool(-1)) throw new ScriptError('VERIFY', op, ip); stack.pop(); @@ -725,27 +794,23 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers break; } case opcodes.OP_2DUP: { - let v1, v2; - if (stack.length < 2) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - v1 = stack.top(-2); - v2 = stack.top(-1); + const v1 = stack.get(-2); + const v2 = stack.get(-1); stack.push(v1); stack.push(v2); break; } case opcodes.OP_3DUP: { - let v1, v2, v3; - if (stack.length < 3) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - v1 = stack.top(-3); - v2 = stack.top(-2); - v3 = stack.top(-1); + const v1 = stack.get(-3); + const v2 = stack.get(-2); + const v3 = stack.get(-1); stack.push(v1); stack.push(v2); @@ -753,26 +818,22 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers break; } case opcodes.OP_2OVER: { - let v1, v2; - if (stack.length < 4) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - v1 = stack.top(-4); - v2 = stack.top(-3); + const v1 = stack.get(-4); + const v2 = stack.get(-3); stack.push(v1); stack.push(v2); break; } case opcodes.OP_2ROT: { - let v1, v2; - if (stack.length < 6) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - v1 = stack.top(-6); - v2 = stack.top(-5); + const v1 = stack.get(-6); + const v2 = stack.get(-5); stack.erase(-6, -4); stack.push(v1); @@ -788,19 +849,18 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers break; } case opcodes.OP_IFDUP: { - let val; - if (stack.length === 0) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - val = stack.top(-1); - - if (Script.bool(val)) + if (stack.getBool(-1)) { + const val = stack.get(-1); stack.push(val); + } + break; } case opcodes.OP_DEPTH: { - stack.push(Script.array(stack.length)); + stack.pushInt(stack.length); break; } case opcodes.OP_DROP: { @@ -814,7 +874,7 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (stack.length === 0) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - stack.push(stack.top(-1)); + stack.push(stack.get(-1)); break; } case opcodes.OP_NIP: { @@ -828,23 +888,21 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (stack.length < 2) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - stack.push(stack.top(-2)); + stack.push(stack.get(-2)); break; } case opcodes.OP_PICK: case opcodes.OP_ROLL: { - let num, val; - if (stack.length < 2) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - num = Script.num(stack.top(-1), minimal).toNumber(); + const num = stack.getInt(-1, minimal, 4); stack.pop(); if (num < 0 || num >= stack.length) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - val = stack.top(-num - 1); + const val = stack.get(-num - 1); if (op.value === opcodes.OP_ROLL) stack.remove(-num - 1); @@ -871,32 +929,30 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (stack.length < 2) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - stack.insert(-2, stack.top(-1)); + stack.insert(-2, stack.get(-1)); break; } case opcodes.OP_SIZE: { if (stack.length < 1) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - stack.push(Script.array(stack.top(-1).length)); + stack.pushInt(stack.get(-1).length); break; } case opcodes.OP_EQUAL: case opcodes.OP_EQUALVERIFY: { - let v1, v2, res; - if (stack.length < 2) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - v1 = stack.top(-2); - v2 = stack.top(-1); + const v1 = stack.get(-2); + const v2 = stack.get(-1); - res = v1.equals(v2); + const res = v1.equals(v2); stack.pop(); stack.pop(); - stack.push(res ? STACK_TRUE : STACK_FALSE); + stack.pushBool(res); if (op.value === opcodes.OP_EQUALVERIFY) { if (!res) @@ -912,12 +968,11 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers case opcodes.OP_ABS: case opcodes.OP_NOT: case opcodes.OP_0NOTEQUAL: { - let num; - if (stack.length < 1) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - num = Script.num(stack.top(-1), minimal); + let num = stack.getNum(-1, minimal, 4); + let cmp; switch (op.value) { case opcodes.OP_1ADD: @@ -933,12 +988,12 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers num.iabs(); break; case opcodes.OP_NOT: - num = num.cmpn(0) === 0; - num = new BN(num ? 1 : 0); + cmp = num.isZero(); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_0NOTEQUAL: - num = num.cmpn(0) !== 0; - num = new BN(num ? 1 : 0); + cmp = !num.isZero(); + num = ScriptNum.fromBool(cmp); break; default: assert(false, 'Fatal script error.'); @@ -946,7 +1001,7 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers } stack.pop(); - stack.push(Script.array(num)); + stack.pushNum(num); break; } @@ -963,13 +1018,12 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers case opcodes.OP_GREATERTHANOREQUAL: case opcodes.OP_MIN: case opcodes.OP_MAX: { - let n1, n2, num; - if (stack.length < 2) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - n1 = Script.num(stack.top(-2), minimal); - n2 = Script.num(stack.top(-1), minimal); + const n1 = stack.getNum(-2, minimal, 4); + const n2 = stack.getNum(-1, minimal, 4); + let num, cmp; switch (op.value) { case opcodes.OP_ADD: @@ -979,46 +1033,46 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers num = n1.isub(n2); break; case opcodes.OP_BOOLAND: - num = n1.cmpn(0) !== 0 && n2.cmpn(0) !== 0; - num = new BN(num ? 1 : 0); + cmp = n1.toBool() && n2.toBool(); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_BOOLOR: - num = n1.cmpn(0) !== 0 || n2.cmpn(0) !== 0; - num = new BN(num ? 1 : 0); + cmp = n1.toBool() || n2.toBool(); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_NUMEQUAL: - num = n1.cmp(n2) === 0; - num = new BN(num ? 1 : 0); + cmp = n1.eq(n2); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_NUMEQUALVERIFY: - num = n1.cmp(n2) === 0; - num = new BN(num ? 1 : 0); + cmp = n1.eq(n2); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_NUMNOTEQUAL: - num = n1.cmp(n2) !== 0; - num = new BN(num ? 1 : 0); + cmp = !n1.eq(n2); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_LESSTHAN: - num = n1.cmp(n2) < 0; - num = new BN(num ? 1 : 0); + cmp = n1.lt(n2); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_GREATERTHAN: - num = n1.cmp(n2) > 0; - num = new BN(num ? 1 : 0); + cmp = n1.gt(n2); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_LESSTHANOREQUAL: - num = n1.cmp(n2) <= 0; - num = new BN(num ? 1 : 0); + cmp = n1.lte(n2); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_GREATERTHANOREQUAL: - num = n1.cmp(n2) >= 0; - num = new BN(num ? 1 : 0); + cmp = n1.gte(n2); + num = ScriptNum.fromBool(cmp); break; case opcodes.OP_MIN: - num = n1.cmp(n2) < 0 ? n1 : n2; + num = ScriptNum.min(n1, n2); break; case opcodes.OP_MAX: - num = n1.cmp(n2) > 0 ? n1 : n2; + num = ScriptNum.max(n1, n2); break; default: assert(false, 'Fatal script error.'); @@ -1027,10 +1081,10 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers stack.pop(); stack.pop(); - stack.push(Script.array(num)); + stack.pushNum(num); if (op.value === opcodes.OP_NUMEQUALVERIFY) { - if (!Script.bool(stack.top(-1))) + if (!stack.getBool(-1)) throw new ScriptError('NUMEQUALVERIFY', op, ip); stack.pop(); } @@ -1038,22 +1092,20 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers break; } case opcodes.OP_WITHIN: { - let val, n1, n2, n3; - if (stack.length < 3) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - n1 = Script.num(stack.top(-3), minimal); - n2 = Script.num(stack.top(-2), minimal); - n3 = Script.num(stack.top(-1), minimal); + const n1 = stack.getNum(-3, minimal, 4); + const n2 = stack.getNum(-2, minimal, 4); + const n3 = stack.getNum(-1, minimal, 4); - val = n2.cmp(n1) <= 0 && n1.cmp(n3) < 0; + const val = n2.lte(n1) && n1.lt(n3); stack.pop(); stack.pop(); stack.pop(); - stack.push(val ? STACK_TRUE : STACK_FALSE); + stack.pushBool(val); break; } case opcodes.OP_RIPEMD160: { @@ -1097,29 +1149,28 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers } case opcodes.OP_CHECKSIG: case opcodes.OP_CHECKSIGVERIFY: { - let sig, key, res, subscript; - if (!tx) throw new ScriptError('UNKNOWN_ERROR', 'No TX passed in.'); if (stack.length < 2) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - sig = stack.top(-2); - key = stack.top(-1); - res = false; + const sig = stack.get(-2); + const key = stack.get(-1); - subscript = this.getSubscript(lastSep); + const subscript = this.getSubscript(lastSep); if (version === 0) - subscript.removeData(sig); + subscript.findAndDelete(sig); validateSignature(sig, flags); validateKey(key, flags, version); + let res = false; + if (sig.length > 0) { - let type = sig[sig.length - 1]; - let hash = tx.signatureHash(index, subscript, value, type, version); + const type = sig[sig.length - 1]; + const hash = tx.signatureHash(index, subscript, value, type, version); res = checksig(hash, sig, key); } @@ -1131,7 +1182,7 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers stack.pop(); stack.pop(); - stack.push(res ? STACK_TRUE : STACK_FALSE); + stack.pushBool(res); if (op.value === opcodes.OP_CHECKSIGVERIFY) { if (!res) @@ -1143,19 +1194,18 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers } case opcodes.OP_CHECKMULTISIG: case opcodes.OP_CHECKMULTISIGVERIFY: { - let i, m, n, isig, ikey, ikey2, subscript, res; - if (!tx) throw new ScriptError('UNKNOWN_ERROR', 'No TX passed in.'); - i = 1; + let i = 1; if (stack.length < i) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - n = Script.num(stack.top(-i), minimal).toNumber(); - ikey2 = n + 2; + let n = stack.getInt(-i, minimal, 4); + let okey = n + 2; + let ikey, isig; - if (!(n >= 0 && n <= consensus.MAX_MULTISIG_PUBKEYS)) + if (n < 0 || n > consensus.MAX_MULTISIG_PUBKEYS) throw new ScriptError('PUBKEY_COUNT', op, ip); opCount += n; @@ -1163,79 +1213,89 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers if (opCount > consensus.MAX_SCRIPT_OPS) throw new ScriptError('OP_COUNT', op, ip); - i++; + i += 1; ikey = i; i += n; if (stack.length < i) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - m = Script.num(stack.top(-i), minimal).toNumber(); + let m = stack.getInt(-i, minimal, 4); - if (!(m >= 0 && m <= n)) + if (m < 0 || m > n) throw new ScriptError('SIG_COUNT', op, ip); - i++; + i += 1; isig = i; i += m; if (stack.length < i) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); - subscript = this.getSubscript(lastSep); + const subscript = this.getSubscript(lastSep); for (let j = 0; j < m; j++) { - let sig = stack.top(-isig - j); + const sig = stack.get(-isig - j); if (version === 0) - subscript.removeData(sig); + subscript.findAndDelete(sig); } - res = true; + let res = true; while (res && m > 0) { - let sig = stack.top(-isig); - let key = stack.top(-ikey); + const sig = stack.get(-isig); + const key = stack.get(-ikey); validateSignature(sig, flags); validateKey(key, flags, version); if (sig.length > 0) { - let type = sig[sig.length - 1]; - let hash = tx.signatureHash(index, subscript, value, type, version); + const type = sig[sig.length - 1]; + const hash = tx.signatureHash( + index, + subscript, + value, + type, + version + ); if (checksig(hash, sig, key)) { - isig++; - m--; + isig += 1; + m -= 1; } } - ikey++; - n--; + ikey += 1; + n -= 1; if (m > n) res = false; } - while (i-- > 1) { + while (i > 1) { if (!res && (flags & Script.flags.VERIFY_NULLFAIL)) { - if (ikey2 === 0 && stack.top(-1).length !== 0) + if (okey === 0 && stack.get(-1).length !== 0) throw new ScriptError('NULLFAIL', op, ip); } - if (ikey2 > 0) - ikey2--; + + if (okey > 0) + okey -= 1; + stack.pop(); + + i -= 1; } if (stack.length < 1) throw new ScriptError('INVALID_STACK_OPERATION', op, ip); if (flags & Script.flags.VERIFY_NULLDUMMY) { - if (stack.top(-1).length !== 0) + if (stack.get(-1).length !== 0) throw new ScriptError('SIG_NULLDUMMY', op, ip); } stack.pop(); - stack.push(res ? STACK_TRUE : STACK_FALSE); + stack.pushBool(res); if (op.value === opcodes.OP_CHECKMULTISIGVERIFY) { if (!res) @@ -1249,67 +1309,13 @@ Script.prototype.execute = function execute(stack, flags, tx, index, value, vers throw new ScriptError('BAD_OPCODE', op, ip); } } - } - if (stack.length + alt.length > consensus.MAX_SCRIPT_STACK) - throw new ScriptError('STACK_SIZE'); + if (stack.length + alt.length > consensus.MAX_SCRIPT_STACK) + throw new ScriptError('STACK_SIZE', op, ip); + } if (state.length !== 0) throw new ScriptError('UNBALANCED_CONDITIONAL'); - - return true; -}; - -/** - * Cast a big number or Buffer to a bool. - * @see CastToBool - * @param {BN|Buffer} value - * @returns {Boolean} - */ - -Script.bool = function bool(value) { - assert(Buffer.isBuffer(value)); - - for (let i = 0; i < value.length; i++) { - if (value[i] !== 0) { - // Cannot be negative zero - if (i === value.length - 1 && value[i] === 0x80) - return false; - return true; - } - } - - return false; -}; - -/** - * Create a CScriptNum. - * @param {Buffer} value - * @param {Boolean?} minimal - * @param {Number?} size - Max size in bytes. - * @returns {BN} - * @throws {ScriptError} - */ - -Script.num = function num(value, minimal, size) { - return common.num(value, minimal, size); -}; - -/** - * Create a script array. Will convert Numbers and big - * numbers to a little-endian buffer while taking into - * account negative zero, minimaldata, etc. - * @example - * assert.deepEqual(Script.array(0), Buffer.alloc(0)); - * assert.deepEqual(Script.array(0xffee), Buffer.from('eeff00', 'hex')); - * assert.deepEqual(Script.array(new BN(0xffee)), Buffer.from('eeff00', 'hex')); - * assert.deepEqual(Script.array(new BN(0x1e).ineg()), Buffer.from('9e', 'hex')); - * @param {Number|BN} value - * @returns {Buffer} - */ - -Script.array = function array(value) { - return common.array(value); }; /** @@ -1327,43 +1333,47 @@ Script.array = function array(value) { * @returns {Number} Total. */ -Script.prototype.removeData = function removeData(data) { - let index = []; +Script.prototype.findAndDelete = function findAndDelete(data) { + const target = Opcode.fromPush(data); - // We need to go forward first. We can't go - // backwards (this is consensus code and we - // need to be aware of bad pushes). - for (let i = 0; i < this.code.length; i++) { - let op = this.code[i]; + if (this.raw.length < target.getSize()) + return 0; + + let found = false; + + for (const op of this.code) { + if (op.value === -1) + break; - if (op.value === -1) { - // Can't reserialize - // a parse error. - if (index.length > 0) - index.push(i); + if (op.equals(target)) { + found = true; break; } + } - if (!op.data) - continue; + if (!found) + return 0; - if (!op.isMinimal()) - continue; + const code = []; - if (op.data.equals(data)) - index.push(i); - } + let total = 0; - if (index.length === 0) - return 0; + for (const op of this.code) { + if (op.value === -1) + break; + + if (op.equals(target)) { + total += 1; + continue; + } - // Go backwards and splice out the data. - for (let i = index.length - 1; i >= 0; i--) - this.code.splice(index[i], 1); + code.push(op); + } + this.code = code; this.compile(); - return index.length; + return total; }; /** @@ -1374,7 +1384,7 @@ Script.prototype.removeData = function removeData(data) { Script.prototype.indexOf = function indexOf(data) { for (let i = 0; i < this.code.length; i++) { - let op = this.code[i]; + const op = this.code[i]; if (op.value === -1) break; @@ -1390,20 +1400,32 @@ Script.prototype.indexOf = function indexOf(data) { }; /** - * Test a script to see if it is valid - * script code (no non-existent opcodes). + * Test a script to see if it is likely + * to be script code (no weird opcodes). * @returns {Boolean} */ Script.prototype.isCode = function isCode() { - for (let op of this.code) { - if (op.data) - continue; - + for (const op of this.code) { if (op.value === -1) return false; - if (op.value > opcodes.OP_NOP10) + if (op.isDisabled()) + return false; + + switch (op.value) { + case opcodes.OP_RESERVED: + case opcodes.OP_NOP: + case opcodes.OP_VER: + case opcodes.OP_VERIF: + case opcodes.OP_VERNOTIF: + case opcodes.OP_RESERVED1: + case opcodes.OP_RESERVED2: + case opcodes.OP_NOP1: + return false; + } + + if (op.value > opcodes.OP_CHECKSEQUENCEVERIFY) return false; } @@ -1417,7 +1439,7 @@ Script.prototype.isCode = function isCode() { */ Script.prototype.fromPubkey = function fromPubkey(key) { - assert(Buffer.isBuffer(key) && key.length >= 33 && key.length <= 65); + assert(Buffer.isBuffer(key) && (key.length === 33 || key.length === 65)); this.raw = Buffer.allocUnsafe(1 + key.length + 1); this.raw[0] = key.length; @@ -1426,8 +1448,9 @@ Script.prototype.fromPubkey = function fromPubkey(key) { key = this.raw.slice(1, 1 + key.length); - this.code.push(new Opcode(key.length, key)); - this.code.push(new Opcode(opcodes.OP_CHECKSIG)); + this.code.length = 0; + this.code.push(Opcode.fromPush(key)); + this.code.push(Opcode.fromOp(opcodes.OP_CHECKSIG)); return this; }; @@ -1461,11 +1484,12 @@ Script.prototype.fromPubkeyhash = function fromPubkeyhash(hash) { hash = this.raw.slice(3, 23); - this.code.push(new Opcode(opcodes.OP_DUP)); - this.code.push(new Opcode(opcodes.OP_HASH160)); - this.code.push(new Opcode(0x14, hash)); - this.code.push(new Opcode(opcodes.OP_EQUALVERIFY)); - this.code.push(new Opcode(opcodes.OP_CHECKSIG)); + this.code.length = 0; + this.code.push(Opcode.fromOp(opcodes.OP_DUP)); + this.code.push(Opcode.fromOp(opcodes.OP_HASH160)); + this.code.push(Opcode.fromPush(hash)); + this.code.push(Opcode.fromOp(opcodes.OP_EQUALVERIFY)); + this.code.push(Opcode.fromOp(opcodes.OP_CHECKSIG)); return this; }; @@ -1489,25 +1513,23 @@ Script.fromPubkeyhash = function fromPubkeyhash(hash) { */ Script.prototype.fromMultisig = function fromMultisig(m, n, keys) { - assert(util.isNumber(m) && util.isNumber(n)); + assert(util.isU8(m) && util.isU8(n)); assert(Array.isArray(keys)); assert(keys.length === n, '`n` keys are required for multisig.'); assert(m >= 1 && m <= n); assert(n >= 1 && n <= 15); - keys = sortKeys(keys); + this.clear(); - this.push(Opcode.fromSmall(m)); + this.pushSmall(m); - for (let key of keys) - this.push(key); + for (const key of sortKeys(keys)) + this.pushData(key); - this.push(Opcode.fromSmall(n)); - this.push(opcodes.OP_CHECKMULTISIG); + this.pushSmall(n); + this.pushOp(opcodes.OP_CHECKMULTISIG); - this.compile(); - - return this; + return this.compile(); }; /** @@ -1539,9 +1561,10 @@ Script.prototype.fromScripthash = function fromScripthash(hash) { hash = this.raw.slice(2, 22); - this.code.push(new Opcode(opcodes.OP_HASH160)); - this.code.push(new Opcode(0x14, hash)); - this.code.push(new Opcode(opcodes.OP_EQUAL)); + this.code.length = 0; + this.code.push(Opcode.fromOp(opcodes.OP_HASH160)); + this.code.push(Opcode.fromPush(hash)); + this.code.push(Opcode.fromOp(opcodes.OP_EQUAL)); return this; }; @@ -1565,10 +1588,12 @@ Script.fromScripthash = function fromScripthash(hash) { Script.prototype.fromNulldata = function fromNulldata(flags) { assert(Buffer.isBuffer(flags)); assert(flags.length <= policy.MAX_OP_RETURN, 'Nulldata too large.'); - this.push(opcodes.OP_RETURN); - this.push(flags); - this.compile(); - return this; + + this.clear(); + this.pushOp(opcodes.OP_RETURN); + this.pushData(flags); + + return this.compile(); }; /** @@ -1589,22 +1614,19 @@ Script.fromNulldata = function fromNulldata(flags) { */ Script.prototype.fromProgram = function fromProgram(version, data) { - let op; - - assert(util.isNumber(version) && version >= 0 && version <= 16); + assert(util.isU8(version) && version >= 0 && version <= 16); assert(Buffer.isBuffer(data) && data.length >= 2 && data.length <= 40); - op = Opcode.fromSmall(version); - this.raw = Buffer.allocUnsafe(2 + data.length); - this.raw[0] = op.value; + this.raw[0] = version === 0 ? 0 : version + 0x50; this.raw[1] = data.length; data.copy(this.raw, 2); data = this.raw.slice(2, 2 + data.length); - this.code.push(op); - this.code.push(new Opcode(data.length, data)); + this.code.length = 0; + this.code.push(Opcode.fromSmall(version)); + this.code.push(Opcode.fromPush(data)); return this; }; @@ -1662,20 +1684,19 @@ Script.fromAddress = function fromAddress(address) { */ Script.prototype.fromCommitment = function fromCommitment(hash, flags) { - let bw = new StaticWriter(36); + const bw = new StaticWriter(36); bw.writeU32BE(0xaa21a9ed); bw.writeHash(hash); - this.push(opcodes.OP_RETURN); - this.push(bw.render()); + this.clear(); + this.pushOp(opcodes.OP_RETURN); + this.pushData(bw.render()); if (flags) - this.push(flags); + this.pushData(flags); - this.compile(); - - return this; + return this.compile(); }; /** @@ -1695,20 +1716,22 @@ Script.fromCommitment = function fromCommitment(hash, flags) { */ Script.prototype.getRedeem = function getRedeem() { - let redeem; + let data = null; - if (this.code.length === 0) - return; + for (const op of this.code) { + if (op.value === -1) + return null; - if (!this.isPushOnly()) - return; + if (op.value > opcodes.OP_16) + return null; - redeem = this.code[this.code.length - 1]; + data = op.data; + } - if (!redeem.data) - return; + if (!data) + return null; - return Script.fromRaw(redeem.data); + return Script.fromRaw(data); }; /** @@ -1759,30 +1782,22 @@ Script.prototype.isUnknown = function isUnknown() { */ Script.prototype.isStandard = function isStandard() { - let type = this.getType(); - - switch (type) { - case scriptTypes.MULTISIG: { - let m = this.getSmall(0); - let n = this.getSmall(this.code.length - 2); + const [m, n] = this.getMultisig(); - if (n < 1 || n > 3) - return false; + if (m !== -1) { + if (n < 1 || n > 3) + return false; - if (m < 1 || m > n) - return false; + if (m < 1 || m > n) + return false; - return true; - } - case scriptTypes.NULLDATA: { - if (this.raw.length > policy.MAX_OP_RETURN_BYTES) - return false; - return true; - } - default: { - return type !== scriptTypes.NONSTANDARD; - } + return true; } + + if (this.isNulldata()) + return this.raw.length <= policy.MAX_OP_RETURN_BYTES; + + return this.getType() !== scriptTypes.NONSTANDARD; }; /** @@ -1861,15 +1876,34 @@ Script.prototype.sha256 = function sha256(enc) { Script.prototype.isPubkey = function isPubkey(minimal) { if (minimal) { return this.raw.length >= 35 - && this.raw[0] >= 33 && this.raw[0] <= 65 + && (this.raw[0] === 33 || this.raw[0] === 65) && this.raw[0] + 2 === this.raw.length && this.raw[this.raw.length - 1] === opcodes.OP_CHECKSIG; } - return this.code.length === 2 - && this.code[0].data - && common.isKey(this.code[0].data) - && this.code[1].value === opcodes.OP_CHECKSIG; + if (this.code.length !== 2) + return false; + + const size = this.getLength(0); + + return (size === 33 || size === 65) + && this.getOp(1) === opcodes.OP_CHECKSIG; +}; + +/** + * Get P2PK key if present. + * @param {Boolean} [minimal=false] - Minimaldata only. + * @returns {Buffer|null} + */ + +Script.prototype.getPubkey = function getPubkey(minimal) { + if (!this.isPubkey(minimal)) + return null; + + if (minimal) + return this.raw.slice(1, 1 + this.raw[0]); + + return this.getData(0); }; /** @@ -1879,7 +1913,7 @@ Script.prototype.isPubkey = function isPubkey(minimal) { */ Script.prototype.isPubkeyhash = function isPubkeyhash(minimal) { - if (minimal) { + if (minimal || this.raw.length === 25) { return this.raw.length === 25 && this.raw[0] === opcodes.OP_DUP && this.raw[1] === opcodes.OP_HASH160 @@ -1888,12 +1922,30 @@ Script.prototype.isPubkeyhash = function isPubkeyhash(minimal) { && this.raw[24] === opcodes.OP_CHECKSIG; } - return this.code.length === 5 - && this.code[0].value === opcodes.OP_DUP - && this.code[1].value === opcodes.OP_HASH160 - && common.isHash(this.code[2].data) - && this.code[3].value === opcodes.OP_EQUALVERIFY - && this.code[4].value === opcodes.OP_CHECKSIG; + if (this.code.length !== 5) + return false; + + return this.getOp(0) === opcodes.OP_DUP + && this.getOp(1) === opcodes.OP_HASH160 + && this.getLength(2) === 20 + && this.getOp(3) === opcodes.OP_EQUALVERIFY + && this.getOp(4) === opcodes.OP_CHECKSIG; +}; + +/** + * Get P2PKH hash if present. + * @param {Boolean} [minimal=false] - Minimaldata only. + * @returns {Buffer|null} + */ + +Script.prototype.getPubkeyhash = function getPubkeyhash(minimal) { + if (!this.isPubkeyhash(minimal)) + return null; + + if (minimal) + return this.raw.slice(3, 23); + + return this.getData(2); }; /** @@ -1903,31 +1955,30 @@ Script.prototype.isPubkeyhash = function isPubkeyhash(minimal) { */ Script.prototype.isMultisig = function isMultisig(minimal) { - let m, n; - - if (this.raw.length < 41) + if (this.code.length < 4 || this.code.length > 19) return false; - if (this.raw[this.raw.length - 1] !== opcodes.OP_CHECKMULTISIG) + if (this.getOp(-1) !== opcodes.OP_CHECKMULTISIG) return false; - n = common.getSmall(this.raw[this.raw.length - 2]); + const m = this.getSmall(0); - if (n < 1) + if (m < 1) return false; - m = common.getSmall(this.raw[0]); + const n = this.getSmall(-2); - if (!(m >= 1 && m <= n)) + if (n < 1 || m > n) return false; - if (n + 3 !== this.code.length) + if (this.code.length !== n + 3) return false; for (let i = 1; i < n + 1; i++) { - let op = this.code[i]; + const op = this.code[i]; + const size = op.toLength(); - if (!common.isKey(op.data)) + if (size !== 33 && size !== 65) return false; if (minimal && !op.isMinimal()) @@ -1937,6 +1988,19 @@ Script.prototype.isMultisig = function isMultisig(minimal) { return true; }; +/** + * Get multisig m and n values if present. + * @param {Boolean} [minimal=false] - Minimaldata only. + * @returns {Array} [m, n] + */ + +Script.prototype.getMultisig = function getMultisig(minimal) { + if (!this.isMultisig(minimal)) + return [-1, -1]; + + return [this.getSmall(0), this.getSmall(-2)]; +}; + /** * Test whether the output script is pay-to-scripthash. Note that * bitcoin itself requires scripthashes to be in strict minimaldata @@ -1952,6 +2016,18 @@ Script.prototype.isScripthash = function isScripthash() { && this.raw[22] === opcodes.OP_EQUAL; }; +/** + * Get P2SH hash if present. + * @returns {Buffer|null} + */ + +Script.prototype.getScripthash = function getScripthash() { + if (!this.isScripthash()) + return null; + + return this.getData(1); +}; + /** * Test whether the output script is nulldata/opreturn. * @param {Boolean} [minimal=false] - Minimaldata only. @@ -1959,47 +2035,56 @@ Script.prototype.isScripthash = function isScripthash() { */ Script.prototype.isNulldata = function isNulldata(minimal) { - if (this.raw.length === 0) + if (this.code.length === 0) return false; - if (this.raw[0] !== opcodes.OP_RETURN) + if (this.getOp(0) !== opcodes.OP_RETURN) return false; - if (this.raw.length === 1) + if (this.code.length === 1) return true; if (minimal) { if (this.raw.length > policy.MAX_OP_RETURN_BYTES) return false; - - if (this.raw.length === 2) - return common.getSmall(this.raw[1]) !== -1; - - if (this.raw[1] >= 0x01 && this.raw[1] <= 0x4b) - return this.raw[1] + 2 === this.raw.length; - - if (this.raw[1] === opcodes.OP_PUSHDATA1) - return this.raw[2] > 75 && this.raw[2] + 3 === this.raw.length; - - return false; } for (let i = 1; i < this.code.length; i++) { - let op = this.code[i]; - - if (op.data) - continue; + const op = this.code[i]; if (op.value === -1) return false; if (op.value > opcodes.OP_16) return false; + + if (minimal && !op.isMinimal()) + return false; } return true; }; +/** + * Get OP_RETURN data if present. + * @param {Boolean} [minimal=false] - Minimaldata only. + * @returns {Buffer|null} + */ + +Script.prototype.getNulldata = function getNulldata(minimal) { + if (!this.isNulldata(minimal)) + return null; + + for (let i = 1; i < this.code.length; i++) { + const op = this.code[i]; + const data = op.toPush(); + if (data) + return data; + } + + return EMPTY_BUFFER; +}; + /** * Test whether the output script is a segregated witness * commitment. @@ -2018,9 +2103,9 @@ Script.prototype.isCommitment = function isCommitment() { * @returns {Buffer|null} */ -Script.prototype.getCommitmentHash = function getCommitmentHash() { +Script.prototype.getCommitment = function getCommitment() { if (!this.isCommitment()) - return; + return null; return this.raw.slice(6, 38); }; @@ -2033,11 +2118,11 @@ Script.prototype.getCommitmentHash = function getCommitmentHash() { */ Script.prototype.isProgram = function isProgram() { - if (!(this.raw.length >= 4 && this.raw.length <= 42)) + if (this.raw.length < 4 || this.raw.length > 42) return false; if (this.raw[0] !== opcodes.OP_0 - && !(this.raw[0] >= opcodes.OP_1 && this.raw[0] <= opcodes.OP_16)) { + && (this.raw[0] < opcodes.OP_1 || this.raw[0] > opcodes.OP_16)) { return false; } @@ -2052,14 +2137,12 @@ Script.prototype.isProgram = function isProgram() { * @returns {Program|null} */ -Script.prototype.toProgram = function toProgram() { - let version, data; - +Script.prototype.getProgram = function getProgram() { if (!this.isProgram()) - return; + return null; - version = common.getSmall(this.raw[0]); - data = this.raw.slice(2); + const version = this.getSmall(0); + const data = this.getData(1); return new Program(version, data); }; @@ -2067,20 +2150,22 @@ Script.prototype.toProgram = function toProgram() { /** * Get the script to the equivalent witness * program (mimics bitcoind's scriptForWitness). - * @returns {Program|null} + * @returns {Script|null} */ Script.prototype.forWitness = function forWitness() { if (this.isProgram()) - return this; + return this.clone(); - if (this.isPubkey()) { - let hash = digest.hash160(this.get(0)); + const pk = this.getPubkey(); + if (pk) { + const hash = digest.hash160(pk); return Script.fromProgram(0, hash); } - if (this.isPubkeyhash()) - return Script.fromProgram(0, this.get(2)); + const pkh = this.getPubkeyhash(); + if (pkh) + return Script.fromProgram(0, pkh); return Script.fromProgram(0, this.sha256()); }; @@ -2097,6 +2182,18 @@ Script.prototype.isWitnessPubkeyhash = function isWitnessPubkeyhash() { && this.raw[1] === 0x14; }; +/** + * Get P2WPKH hash if present. + * @returns {Buffer|null} + */ + +Script.prototype.getWitnessPubkeyhash = function getWitnessPubkeyhash() { + if (!this.isWitnessPubkeyhash()) + return null; + + return this.getData(1); +}; + /** * Test whether the output script is * a pay-to-witness-scripthash program. @@ -2109,6 +2206,18 @@ Script.prototype.isWitnessScripthash = function isWitnessScripthash() { && this.raw[1] === 0x20; }; +/** + * Get P2WSH hash if present. + * @returns {Buffer|null} + */ + +Script.prototype.getWitnessScripthash = function getWitnessScripthash() { + if (!this.isWitnessScripthash()) + return null; + + return this.getData(1); +}; + /** * Test whether the output script * is a pay-to-mast program. @@ -2121,6 +2230,18 @@ Script.prototype.isWitnessMasthash = function isWitnessMasthash() { && this.raw[1] === 0x20; }; +/** + * Get P2WMH hash if present. + * @returns {Buffer|null} + */ + +Script.prototype.getWitnessMasthash = function getWitnessMasthash() { + if (!this.isWitnessMasthash()) + return null; + + return this.getData(1); +}; + /** * Test whether the output script is unspendable. * @returns {Boolean} @@ -2172,18 +2293,24 @@ Script.prototype.isUnknownInput = function isUnknownInput() { */ Script.prototype.isPubkeyInput = function isPubkeyInput() { - if (this.raw.length < 10) + if (this.code.length !== 1) return false; - if (this.raw.length > 78) - return false; + const size = this.getLength(0); - if (this.raw[0] > opcodes.OP_PUSHDATA4) - return false; + return size >= 9 && size <= 73; +}; + +/** + * Get P2PK signature if present. + * @returns {Buffer|null} + */ + +Script.prototype.getPubkeyInput = function getPubkeyInput() { + if (!this.isPubkeyInput()) + return null; - return this.code.length === 1 - && this.code[1].data - && common.isSignature(this.code[0].data); + return this.getData(0); }; /** @@ -2193,20 +2320,26 @@ Script.prototype.isPubkeyInput = function isPubkeyInput() { */ Script.prototype.isPubkeyhashInput = function isPubkeyhashInput() { - if (this.raw.length < 44) + if (this.code.length !== 2) return false; - if (this.raw.length > 148) - return false; + const sig = this.getLength(0); + const key = this.getLength(1); - if (this.raw[0] > opcodes.OP_PUSHDATA4) - return false; + return sig >= 9 && sig <= 73 + && (key === 33 || key === 65); +}; + +/** + * Get P2PKH signature and key if present. + * @returns {Array} [sig, key] + */ - return this.code.length === 2 - && this.code[0].data - && common.isSignature(this.code[0].data) - && this.code[1].data - && common.isKey(this.code[1].data); +Script.prototype.getPubkeyhashInput = function getPubkeyhashInput() { + if (!this.isPubkeyhashInput()) + return [null, null]; + + return [this.getData(0), this.getData(1)]; }; /** @@ -2216,13 +2349,13 @@ Script.prototype.isPubkeyhashInput = function isPubkeyhashInput() { */ Script.prototype.isMultisigInput = function isMultisigInput() { - if (this.raw.length < 20) + if (this.code.length < 2) return false; - if (this.raw[0] !== opcodes.OP_0) + if (this.getOp(0) !== opcodes.OP_0) return false; - if (this.raw[1] > opcodes.OP_PUSHDATA4) + if (this.getOp(1) > opcodes.OP_PUSHDATA4) return false; // We need to rule out scripthash @@ -2230,22 +2363,32 @@ Script.prototype.isMultisigInput = function isMultisigInput() { if (this.isScripthashInput()) return false; - if (this.code.length < 3) - return false; - for (let i = 1; i < this.code.length; i++) { - let op = this.code[i]; - - if (!op.data) - return false; - - if (!common.isSignature(op.data)) + const size = this.getLength(i); + if (size < 9 || size > 73) return false; } return true; }; +/** + * Get multisig signatures if present. + * @returns {Buffer[]|null} + */ + +Script.prototype.getMultisigInput = function getMultisigInput() { + if (!this.isMultisigInput()) + return null; + + const sigs = []; + + for (let i = 1; i < this.code.length; i++) + sigs.push(this.getData(i)); + + return sigs; +}; + /** * "Guess" whether the input script is pay-to-scripthash. * This method is not 100% reliable. @@ -2253,17 +2396,15 @@ Script.prototype.isMultisigInput = function isMultisigInput() { */ Script.prototype.isScripthashInput = function isScripthashInput() { - let op, redeem; - - if (this.raw.length < 2) + if (this.code.length < 2) return false; // Grab the raw redeem script. - op = this.code[this.code.length - 1]; + const raw = this.getData(-1); // Last data element should be an array // for the redeem script. - if (!op.data) + if (!raw) return false; // Testing for scripthash inputs requires @@ -2275,23 +2416,41 @@ Script.prototype.isScripthashInput = function isScripthashInput() { // key, and we ensure that it is at least // a script that does not use undefined // opcodes. - if (op.data.length === 0) + if (raw.length === 0) return false; - if (common.isSignatureEncoding(op.data)) + if (common.isSignatureEncoding(raw)) return false; - if (common.isKeyEncoding(op.data)) + if (common.isKeyEncoding(raw)) return false; - redeem = Script.fromRaw(op.data); + const redeem = Script.fromRaw(raw); if (!redeem.isCode()) return false; + if (redeem.isUnspendable()) + return false; + + if (!this.isPushOnly()) + return false; + return true; }; +/** + * Get P2SH redeem script if present. + * @returns {Buffer|null} + */ + +Script.prototype.getScripthashInput = function getScripthashInput() { + if (!this.isScripthashInput()) + return null; + + return this.getData(-1); +}; + /** * Get coinbase height. * @returns {Number} `-1` if not present. @@ -2308,49 +2467,28 @@ Script.prototype.getCoinbaseHeight = function getCoinbaseHeight() { */ Script.getCoinbaseHeight = function getCoinbaseHeight(raw) { - let data, height, op; - if (raw.length === 0) return -1; - // Small ints are allowed. - height = common.getSmall(raw[0]); + if (raw[0] >= opcodes.OP_1 && raw[0] <= opcodes.OP_16) + return raw[0] - 0x50; - if (height !== -1) - return height; - - // No more than 6 bytes (we can't - // handle 7 byte JS numbers and - // height 281 trillion is far away). if (raw[0] > 0x06) return -1; - // No bad pushes allowed. - if (raw.length < 1 + raw[0]) - return -1; - - data = raw.slice(1, 1 + raw[0]); - - // Deserialize the height. - try { - height = Script.num(data, true, 6); - } catch (e) { - return -1; - } + const op = Opcode.fromRaw(raw); + const num = op.toNum(); - // Reserialize the height. - op = Opcode.fromNumber(height); + if (!num) + return 1; - // Should have been OP_0-OP_16. - if (!op.data) + if (num.isNeg()) return -1; - // Ensure the miner serialized the - // number in the most minimal fashion. - if (!data.equals(op.data)) + if (!op.equals(Opcode.fromNum(num))) return -1; - return height.toNumber(); + return num.toDouble(); }; /** @@ -2360,7 +2498,7 @@ Script.getCoinbaseHeight = function getCoinbaseHeight(raw) { */ Script.prototype.test = function test(filter) { - for (let op of this.code) { + for (const op of this.code) { if (op.value === -1) break; @@ -2375,323 +2513,552 @@ Script.prototype.test = function test(filter) { }; /** - * Unshift an item onto the `code` array. - * @param {Number|String|BN|Buffer} data - * @returns {Number} Length. + * Test the script to see if it contains only push ops. + * Push ops are: OP_1NEGATE, OP_0-OP_16 and all PUSHDATAs. + * @returns {Boolean} */ -Script.prototype.unshift = function unshift(data) { - return this.code.unshift(Opcode.from(data)); -}; +Script.prototype.isPushOnly = function isPushOnly() { + for (const op of this.code) { + if (op.value === -1) + return false; -/** - * Push an item onto the `code` array. - * @param {Number|String|BN|Buffer} data - * @returns {Number} Length. - */ + if (op.value > opcodes.OP_16) + return false; + } -Script.prototype.push = function push(data) { - return this.code.push(Opcode.from(data)); + return true; }; /** - * Shift an item off of the `code` array. - * @returns {Buffer} + * Count the sigops in the script. + * @param {Boolean} accurate - Whether to enable accurate counting. This will + * take into account the `n` value for OP_CHECKMULTISIG(VERIFY). + * @returns {Number} sigop count */ -Script.prototype.shift = function shift() { - let op = this.code.shift(); +Script.prototype.getSigops = function getSigops(accurate) { + let total = 0; + let lastOp = -1; - if (!op) - return null; + for (const op of this.code) { + if (op.value === -1) + break; + + switch (op.value) { + case opcodes.OP_CHECKSIG: + case opcodes.OP_CHECKSIGVERIFY: + total += 1; + break; + case opcodes.OP_CHECKMULTISIG: + case opcodes.OP_CHECKMULTISIGVERIFY: + if (accurate && lastOp >= opcodes.OP_1 && lastOp <= opcodes.OP_16) + total += lastOp - 0x50; + else + total += consensus.MAX_MULTISIG_PUBKEYS; + break; + } + + lastOp = op.value; + } - return op.data || op.value; + return total; }; /** - * Pop an item off of the `code` array. - * @returns {Buffer} + * Count the sigops in the script, taking into account redeem scripts. + * @param {Script} input - Input script, needed for access to redeem script. + * @returns {Number} sigop count */ -Script.prototype.pop = function push(data) { - let op = this.code.pop(); +Script.prototype.getScripthashSigops = function getScripthashSigops(input) { + if (!this.isScripthash()) + return this.getSigops(true); - if (!op) - return null; + const redeem = input.getRedeem(); - return op.data || op.value; + if (!redeem) + return 0; + + return redeem.getSigops(true); }; /** - * Remove an item from the `code` array. - * @param {Number} index - * @returns {Buffer|Number} + * Count the sigops in a script, taking into account witness programs. + * @param {Script} input + * @param {Witness} witness + * @returns {Number} sigop count */ -Script.prototype.remove = function remove(i) { - let op = this.code.splice(i, 1)[0]; +Script.prototype.getWitnessSigops = function getWitnessSigops(input, witness) { + let program = this.getProgram(); - if (!op) - return null; + if (!program) { + if (this.isScripthash()) { + const redeem = input.getRedeem(); + if (redeem) + program = redeem.getProgram(); + } + } - return op.data || op.value; -}; + if (!program) + return 0; -/** - * Insert an item into the `code` array. - * @param {Number} index - * @param {Number|String|BN|Buffer} data - */ + if (program.version === 0) { + if (program.data.length === 20) + return 1; + + if (program.data.length === 32 && witness.items.length > 0) { + const redeem = witness.getRedeem(); + return redeem.getSigops(true); + } + } -Script.prototype.insert = function insert(i, data) { - assert(i <= this.code.length, 'Index out of bounds.'); - this.code.splice(i, 0, Opcode.from(data)); + return 0; }; -/** - * Get an item from the `code` array. - * @param {Number} index - * @returns {Buffer} +/* + * Mutation */ -Script.prototype.get = function get(i) { - let op = this.code[i]; +Script.prototype.get = function get(index) { + if (index < 0) + index += this.code.length; - if (!op) + if (index < 0 || index >= this.code.length) return null; - return op.data || op.value; + return this.code[index]; }; -/** - * Get a small integer from an opcode (OP_0-OP_16). - * @param {Number} index - * @returns {Number} - */ +Script.prototype.pop = function pop() { + const op = this.code.pop(); + return op || null; +}; -Script.prototype.getSmall = function getSmall(i) { - let op = this.code[i]; +Script.prototype.shift = function shift() { + const op = this.code.shift(); + return op || null; +}; - if (!op) - return -1; +Script.prototype.remove = function remove(index) { + if (index < 0) + index += this.code.length; - return common.getSmall(op.value); + if (index < 0 || index >= this.code.length) + return null; + + const items = this.code.splice(index, 1); + + if (items.length === 0) + return null; + + return items[0]; }; -/** - * Get a number from the `code` array (5-byte limit). - * @params {Number} index - * @returns {BN} - */ +Script.prototype.set = function set(index, op) { + if (index < 0) + index += this.code.length; -Script.prototype.getNumber = function getNumber(i) { - let small = this.getSmall(i); - let op = this.code[i]; + assert(Opcode.isOpcode(op)); + assert(index >= 0 && index <= this.code.length); - if (small !== -1) - return new BN(small); + this.code[index] = op; - if (!op || !op.data || op.data.length > 5) - return null; + return this; +}; + +Script.prototype.push = function push(op) { + assert(Opcode.isOpcode(op)); + this.code.push(op); + return this; +}; - return Script.num(op.data, false, 5); +Script.prototype.unshift = function unshift(op) { + assert(Opcode.isOpcode(op)); + this.code.unshift(op); + return this; }; -/** - * Get a string from the `code` array (utf8). - * @params {Number} index - * @returns {String} - */ +Script.prototype.insert = function insert(index, op) { + if (index < 0) + index += this.code.length; -Script.prototype.getString = function getString(i) { - let op = this.code[i]; + assert(Opcode.isOpcode(op)); + assert(index >= 0 && index <= this.code.length); - if (!op || !op.data) - return null; + this.code.splice(index, 0, op); - return op.data.toString('utf8'); + return this; }; -/** - * Clear the script code. +/* + * Op */ -Script.prototype.clear = function clear() { - this.code.length = 0; +Script.prototype.getOp = function getOp(index) { + const op = this.get(index); + return op ? op.value : -1; }; -/** - * Set an item in the `code` array. - * @param {Number} index - * @param {Buffer|Number|String|BN} data +Script.prototype.popOp = function popOp() { + const op = this.pop(); + return op ? op.value : -1; +}; + +Script.prototype.shiftOp = function shiftOp() { + const op = this.shift(); + return op ? op.value : -1; +}; + +Script.prototype.removeOp = function removeOp(index) { + const op = this.remove(index); + return op ? op.value : -1; +}; + +Script.prototype.setOp = function setOp(index, value) { + return this.set(index, Opcode.fromOp(value)); +}; + +Script.prototype.pushOp = function pushOp(value) { + return this.push(Opcode.fromOp(value)); +}; + +Script.prototype.unshiftOp = function unshiftOp(value) { + return this.unshift(Opcode.fromOp(value)); +}; + +Script.prototype.insertOp = function insertOp(index, value) { + return this.insert(index, Opcode.fromOp(value)); +}; + +/* + * Data */ -Script.prototype.set = function set(i, data) { - assert(i <= this.code.length, 'Index out of bounds.'); - this.code[i] = Opcode.from(data); +Script.prototype.getData = function getData(index) { + const op = this.get(index); + return op ? op.data : null; }; -/** - * Test whether the data element is a public key. Note that - * this does not verify the format of the key, only the length. - * @param {Buffer?} key - * @returns {Boolean} +Script.prototype.popData = function popData() { + const op = this.pop(); + return op ? op.data : null; +}; + +Script.prototype.shiftData = function shiftData() { + const op = this.shift(); + return op ? op.data : null; +}; + +Script.prototype.removeData = function removeData(index) { + const op = this.remove(index); + return op ? op.data : null; +}; + +Script.prototype.setData = function setData(index, data) { + return this.set(index, Opcode.fromData(data)); +}; + +Script.prototype.pushData = function pushData(data) { + return this.push(Opcode.fromData(data)); +}; + +Script.prototype.unshiftData = function unshiftData(data) { + return this.unshift(Opcode.fromData(data)); +}; + +Script.prototype.insertData = function insertData(index, data) { + return this.insert(index, Opcode.fromData(data)); +}; + +/* + * Length */ -Script.isKey = function isKey(key) { - return common.isKey(key); +Script.prototype.getLength = function getLength(index) { + const op = this.get(index); + return op ? op.toLength() : -1; }; -/** - * Test whether the data element is a signature. Note that - * this does not verify the format of the signature, only the length. - * @param {Buffer?} sig - * @returns {Boolean} +/* + * Push */ -Script.isSignature = function isSignature(sig) { - return common.isSignature(sig); +Script.prototype.getPush = function getPush(index) { + const op = this.get(index); + return op ? op.toPush() : null; }; -/** - * Test the script to see if it contains only push ops. - * Push ops are: OP_1NEGATE, OP_0-OP_16 and all PUSHDATAs. - * @returns {Boolean} +Script.prototype.popPush = function popPush() { + const op = this.pop(); + return op ? op.toPush() : null; +}; + +Script.prototype.shiftPush = function shiftPush() { + const op = this.shift(); + return op ? op.toPush() : null; +}; + +Script.prototype.removePush = function removePush(index) { + const op = this.remove(index); + return op ? op.toPush() : null; +}; + +Script.prototype.setPush = function setPush(index, data) { + return this.set(index, Opcode.fromPush(data)); +}; + +Script.prototype.pushPush = function pushPush(data) { + return this.push(Opcode.fromPush(data)); +}; + +Script.prototype.unshiftPush = function unshiftPush(data) { + return this.unshift(Opcode.fromPush(data)); +}; + +Script.prototype.insertPush = function insertPush(index, data) { + return this.insert(index, Opcode.fromPush(data)); +}; + +/* + * String */ -Script.prototype.isPushOnly = function isPushOnly() { - for (let op of this.code) { - if (op.data) - continue; +Script.prototype.getString = function getString(index, enc) { + const op = this.get(index); + return op ? op.toString(enc) : null; +}; - if (op.value === -1) - return false; +Script.prototype.popString = function popString(enc) { + const op = this.pop(); + return op ? op.toString(enc) : null; +}; - if (op.value > opcodes.OP_16) - return false; - } +Script.prototype.shiftString = function shiftString(enc) { + const op = this.shift(); + return op ? op.toString(enc) : null; +}; - return true; +Script.prototype.removeString = function removeString(index, enc) { + const op = this.remove(index); + return op ? op.toString(enc) : null; }; -/** - * Count the sigops in the script. - * @param {Boolean} accurate - Whether to enable accurate counting. This will - * take into account the `n` value for OP_CHECKMULTISIG(VERIFY). - * @returns {Number} sigop count +Script.prototype.setString = function setString(index, str, enc) { + return this.set(index, Opcode.fromString(str, enc)); +}; + +Script.prototype.pushString = function pushString(str, enc) { + return this.push(Opcode.fromString(str, enc)); +}; + +Script.prototype.unshiftString = function unshiftString(str, enc) { + return this.unshift(Opcode.fromString(str, enc)); +}; + +Script.prototype.insertString = function insertString(index, str, enc) { + return this.insert(index, Opcode.fromString(str, enc)); +}; + +/* + * Small */ -Script.prototype.getSigops = function getSigops(accurate) { - let total = 0; - let lastOp = -1; +Script.prototype.getSmall = function getSmall(index) { + const op = this.get(index); + return op ? op.toSmall() : -1; +}; - for (let op of this.code) { - if (op.data) - continue; +Script.prototype.popSmall = function popSmall() { + const op = this.pop(); + return op ? op.toSmall() : -1; +}; - if (op.value === -1) - break; +Script.prototype.shiftSmall = function shiftSmall() { + const op = this.shift(); + return op ? op.toSmall() : -1; +}; - switch (op.value) { - case opcodes.OP_CHECKSIG: - case opcodes.OP_CHECKSIGVERIFY: - total++; - break; - case opcodes.OP_CHECKMULTISIG: - case opcodes.OP_CHECKMULTISIGVERIFY: - if (accurate && lastOp >= opcodes.OP_1 && lastOp <= opcodes.OP_16) - total += lastOp - 0x50; - else - total += consensus.MAX_MULTISIG_PUBKEYS; - break; - } +Script.prototype.removeSmall = function removeSmall(index) { + const op = this.remove(index); + return op ? op.toSmall() : -1; +}; - lastOp = op.value; - } +Script.prototype.setSmall = function setSmall(index, num) { + return this.set(index, Opcode.fromSmall(num)); +}; - return total; +Script.prototype.pushSmall = function pushSmall(num) { + return this.push(Opcode.fromSmall(num)); }; -/** - * Count the sigops in the script, taking into account redeem scripts. - * @param {Script} input - Input script, needed for access to redeem script. - * @returns {Number} sigop count +Script.prototype.unshiftSmall = function unshiftSmall(num) { + return this.unshift(Opcode.fromSmall(num)); +}; + +Script.prototype.insertSmall = function insertSmall(index, num) { + return this.insert(index, Opcode.fromSmall(num)); +}; + +/* + * Num */ -Script.prototype.getScripthashSigops = function getScripthashSigops(input) { - let op, redeem; +Script.prototype.getNum = function getNum(index, minimal, limit) { + const op = this.get(index); + return op ? op.toNum(minimal, limit) : null; +}; - if (!this.isScripthash()) - return this.getSigops(true); +Script.prototype.popNum = function popNum(minimal, limit) { + const op = this.pop(); + return op ? op.toNum(minimal, limit) : null; +}; - if (input.code.length === 0) - return 0; +Script.prototype.shiftNum = function shiftNum(minimal, limit) { + const op = this.shift(); + return op ? op.toNum(minimal, limit) : null; +}; - for (op of input.code) { - if (op.data) - continue; +Script.prototype.removeNum = function removeNum(index, minimal, limit) { + const op = this.remove(index); + return op ? op.toNum(minimal, limit) : null; +}; - if (op.value === -1) - return 0; +Script.prototype.setNum = function setNum(index, num) { + return this.set(index, Opcode.fromNum(num)); +}; - if (op.value > opcodes.OP_16) - return 0; - } +Script.prototype.pushNum = function pushNum(num) { + return this.push(Opcode.fromNum(num)); +}; - if (!op.data) - return 0; +Script.prototype.unshiftNum = function unshiftNum(num) { + return this.unshift(Opcode.fromNum(num)); +}; + +Script.prototype.insertNum = function insertNum(index, num) { + return this.insert(index, Opcode.fromNum(num)); +}; - redeem = new Script(op.data); +/* + * Int + */ - return redeem.getSigops(true); +Script.prototype.getInt = function getInt(index, minimal, limit) { + const op = this.get(index); + return op ? op.toInt(minimal, limit) : -1; }; -/** - * Count the sigops for a program. - * @param {Program} program - * @param {Witness} witness - * @returns {Number} sigop count +Script.prototype.popInt = function popInt(minimal, limit) { + const op = this.pop(); + return op ? op.toInt(minimal, limit) : -1; +}; + +Script.prototype.shiftInt = function shiftInt(minimal, limit) { + const op = this.shift(); + return op ? op.toInt(minimal, limit) : -1; +}; + +Script.prototype.removeInt = function removeInt(index, minimal, limit) { + const op = this.remove(index); + return op ? op.toInt(minimal, limit) : -1; +}; + +Script.prototype.setInt = function setInt(index, num) { + return this.set(index, Opcode.fromInt(num)); +}; + +Script.prototype.pushInt = function pushInt(num) { + return this.push(Opcode.fromInt(num)); +}; + +Script.prototype.unshiftInt = function unshiftInt(num) { + return this.unshift(Opcode.fromInt(num)); +}; + +Script.prototype.insertInt = function insertInt(index, num) { + return this.insert(index, Opcode.fromInt(num)); +}; + +/* + * Bool */ -Script.witnessSigops = function witnessSigops(program, witness) { - if (program.version === 0) { - if (program.data.length === 20) - return 1; +Script.prototype.getBool = function getBool(index) { + const op = this.get(index); + return op ? op.toBool() : false; +}; - if (program.data.length === 32 && witness.items.length > 0) { - let redeem = witness.getRedeem(); - return redeem.getSigops(true); - } - } +Script.prototype.popBool = function popBool() { + const op = this.pop(); + return op ? op.toBool() : false; +}; - return 0; +Script.prototype.shiftBool = function shiftBool() { + const op = this.shift(); + return op ? op.toBool() : false; }; -/** - * Count the sigops in a script, taking into account witness programs. - * @param {Script} input - * @param {Witness} witness - * @returns {Number} sigop count +Script.prototype.removeBool = function removeBool(index) { + const op = this.remove(index); + return op ? op.toBool() : false; +}; + +Script.prototype.setBool = function setBool(index, value) { + return this.set(index, Opcode.fromBool(value)); +}; + +Script.prototype.pushBool = function pushBool(value) { + return this.push(Opcode.fromBool(value)); +}; + +Script.prototype.unshiftBool = function unshiftBool(value) { + return this.unshift(Opcode.fromBool(value)); +}; + +Script.prototype.insertBool = function insertBool(index, value) { + return this.insert(index, Opcode.fromBool(value)); +}; + +/* + * Symbol */ -Script.prototype.getWitnessSigops = function getWitnessSigops(input, witness) { - if (this.isProgram()) - return Script.witnessSigops(this.toProgram(), witness); - - // This is a unique situation in terms of consensus - // rules. We can just grab the redeem script without - // "parsing" (i.e. checking for pushdata parse errors) - // the script. This is because isPushOnly is called - // which checks for parse errors and will return - // false if one is found. Even the bitcoind code - // does not check the return value of GetOp. - if (this.isScripthash() && input.isPushOnly()) { - let redeem = input.getRedeem(); - if (redeem && redeem.isProgram()) - return Script.witnessSigops(redeem.toProgram(), witness); - } +Script.prototype.getSym = function getSym(index) { + const op = this.get(index); + return op ? op.toSymbol() : null; +}; - return 0; +Script.prototype.popSym = function popSym() { + const op = this.pop(); + return op ? op.toSymbol() : null; +}; + +Script.prototype.shiftSym = function shiftSym() { + const op = this.shift(); + return op ? op.toSymbol() : null; +}; + +Script.prototype.removeSym = function removeSym(index) { + const op = this.remove(index); + return op ? op.toSymbol() : null; +}; + +Script.prototype.setSym = function setSym(index, symbol) { + return this.set(index, Opcode.fromSymbol(symbol)); +}; + +Script.prototype.pushSym = function pushSym(symbol) { + return this.push(Opcode.fromSymbol(symbol)); +}; + +Script.prototype.unshiftSym = function unshiftSym(symbol) { + return this.unshift(Opcode.fromSymbol(symbol)); +}; + +Script.prototype.insertSym = function insertSym(index, symbol) { + return this.insert(index, Opcode.fromSymbol(symbol)); }; /** @@ -2702,8 +3069,6 @@ Script.prototype.getWitnessSigops = function getWitnessSigops(input, witness) { */ Script.prototype.fromString = function fromString(code) { - let bw; - assert(typeof code === 'string'); code = code.trim(); @@ -2711,11 +3076,11 @@ Script.prototype.fromString = function fromString(code) { if (code.length === 0) return this; - code = code.split(/\s+/); - bw = new BufferWriter(); + const items = code.split(/\s+/); + const bw = new BufferWriter(); - for (let op of code) { - let symbol = op; + for (const item of items) { + let symbol = item; if (!util.isUpperCase(symbol)) symbol = symbol.toUpperCase(); @@ -2723,29 +3088,37 @@ Script.prototype.fromString = function fromString(code) { if (!util.startsWith(symbol, 'OP_')) symbol = `OP_${symbol}`; - if (opcodes[symbol] == null) { - if (op[0] === '\'') { - assert(op[op.length - 1] === '\'', 'Unknown opcode.'); - op = op.slice(1, -1); - op = Opcode.fromString(op); + const value = opcodes[symbol]; + + if (value == null) { + if (item[0] === '\'') { + assert(item[item.length - 1] === '\'', 'Invalid string.'); + const str = item.slice(1, -1); + const op = Opcode.fromString(str); bw.writeBytes(op.toRaw()); continue; } - if (/^-?\d+$/.test(op)) { - op = new BN(op, 10); - op = Opcode.fromNumber(op); + + if (/^-?\d+$/.test(item)) { + const num = ScriptNum.fromString(item, 10); + const op = Opcode.fromNum(num); bw.writeBytes(op.toRaw()); continue; } - assert(op.indexOf('0x') === 0, 'Unknown opcode.'); - op = op.substring(2); - assert(util.isHex(op), 'Unknown opcode.'); - op = Buffer.from(op, 'hex'); - bw.writeBytes(op); + + assert(item.indexOf('0x') === 0, 'Unknown opcode.'); + + const hex = item.substring(2); + const data = Buffer.from(hex, 'hex'); + + assert(data.length === hex.length / 2, 'Invalid hex string.'); + + bw.writeBytes(data); + continue; } - bw.writeU8(opcodes[symbol]); + bw.writeU8(value); } return this.fromRaw(bw.render()); @@ -2769,16 +3142,13 @@ Script.fromString = function fromString(code) { * @param {Witness} witness * @param {Script} output * @param {TX} tx - * @param {Number} i + * @param {Number} index * @param {Amount} value * @param {VerifyFlags} flags - * @returns {Boolean} * @throws {ScriptError} */ -Script.verify = function verify(input, witness, output, tx, i, value, flags) { - let stack, copy, raw, redeem, hadWitness; - +Script.verify = function verify(input, witness, output, tx, index, value, flags) { if (flags == null) flags = Script.flags.STANDARD_VERIFY_FLAGS; @@ -2788,22 +3158,25 @@ Script.verify = function verify(input, witness, output, tx, i, value, flags) { } // Setup a stack. - stack = new Stack(); + let stack = new Stack(); // Execute the input script - input.execute(stack, flags, tx, i, value, 0); + input.execute(stack, flags, tx, index, value, 0); // Copy the stack for P2SH + let copy; if (flags & Script.flags.VERIFY_P2SH) copy = stack.clone(); // Execute the previous output script. - output.execute(stack, flags, tx, i, value, 0); + output.execute(stack, flags, tx, index, value, 0); // Verify the stack values. - if (stack.length === 0 || !Script.bool(stack.top(-1))) + if (stack.length === 0 || !stack.getBool(-1)) throw new ScriptError('EVAL_FALSE'); + let hadWitness = false; + if ((flags & Script.flags.VERIFY_WITNESS) && output.isProgram()) { hadWitness = true; @@ -2812,7 +3185,7 @@ Script.verify = function verify(input, witness, output, tx, i, value, flags) { throw new ScriptError('WITNESS_MALLEATED'); // Verify the program in the output script. - Script.verifyProgram(witness, output, flags, tx, i, value); + Script.verifyProgram(witness, output, flags, tx, index, value); // Force a cleanstack stack.length = 1; @@ -2832,14 +3205,14 @@ Script.verify = function verify(input, witness, output, tx, i, value, flags) { throw new ScriptError('EVAL_FALSE'); // Grab the real redeem script - raw = stack.pop(); - redeem = new Script(raw); + const raw = stack.pop(); + const redeem = Script.fromRaw(raw); // Execute the redeem script. - redeem.execute(stack, flags, tx, i, value, 0); + redeem.execute(stack, flags, tx, index, value, 0); // Verify the the stack values. - if (stack.length === 0 || !Script.bool(stack.top(-1))) + if (stack.length === 0 || !stack.getBool(-1)) throw new ScriptError('EVAL_FALSE'); if ((flags & Script.flags.VERIFY_WITNESS) && redeem.isProgram()) { @@ -2850,7 +3223,7 @@ Script.verify = function verify(input, witness, output, tx, i, value, flags) { throw new ScriptError('WITNESS_MALLEATED_P2SH'); // Verify the program in the redeem script. - Script.verifyProgram(witness, redeem, flags, tx, i, value); + Script.verifyProgram(witness, redeem, flags, tx, index, value); // Force a cleanstack. stack.length = 1; @@ -2870,8 +3243,6 @@ Script.verify = function verify(input, witness, output, tx, i, value, flags) { if (!hadWitness && witness.items.length > 0) throw new ScriptError('WITNESS_UNEXPECTED'); } - - return true; }; /** @@ -2882,31 +3253,31 @@ Script.verify = function verify(input, witness, output, tx, i, value, flags) { * @param {Script} output * @param {VerifyFlags} flags * @param {TX} tx - * @param {Number} i + * @param {Number} index * @param {Amount} value - * @returns {Boolean} * @throws {ScriptError} */ -Script.verifyProgram = function verifyProgram(witness, output, flags, tx, i, value) { - let program = output.toProgram(); - let stack = witness.toStack(); - let j, witnessScript, redeem; +Script.verifyProgram = function verifyProgram(witness, output, flags, tx, index, value) { + const program = output.getProgram(); assert(program, 'verifyProgram called on non-witness-program.'); assert((flags & Script.flags.VERIFY_WITNESS) !== 0); + const stack = witness.toStack(); + let redeem; + if (program.version === 0) { if (program.data.length === 32) { if (stack.length === 0) throw new ScriptError('WITNESS_PROGRAM_WITNESS_EMPTY'); - witnessScript = stack.pop(); + const witnessScript = stack.pop(); if (!digest.sha256(witnessScript).equals(program.data)) throw new ScriptError('WITNESS_PROGRAM_MISMATCH'); - redeem = new Script(witnessScript); + redeem = Script.fromRaw(witnessScript); } else if (program.data.length === 20) { if (stack.length !== 2) throw new ScriptError('WITNESS_PROGRAM_MISMATCH'); @@ -2917,7 +3288,8 @@ Script.verifyProgram = function verifyProgram(witness, output, flags, tx, i, val throw new ScriptError('WITNESS_PROGRAM_WRONG_LENGTH'); } } else if ((flags & Script.flags.VERIFY_MAST) && program.version === 1) { - return Script.verifyMast(program, stack, output, flags, tx, i); + Script.verifyMast(program, stack, output, flags, tx, index); + return; } else { // Anyone can spend (we can return true here // if we want to always relay these transactions). @@ -2928,23 +3300,21 @@ Script.verifyProgram = function verifyProgram(witness, output, flags, tx, i, val // due to VERIFY_CLEANSTACK. if (flags & Script.flags.VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM) throw new ScriptError('DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM'); - return true; + return; } // Witnesses still have push limits. - for (j = 0; j < stack.length; j++) { + for (let j = 0; j < stack.length; j++) { if (stack.get(j).length > consensus.MAX_SCRIPT_PUSH) throw new ScriptError('PUSH_SIZE'); } // Verify the redeem script. - redeem.execute(stack, flags, tx, i, value, 1); + redeem.execute(stack, flags, tx, index, value, 1); // Verify the stack values. - if (stack.length !== 1 || !Script.bool(stack.top(-1))) + if (stack.length !== 1 || !stack.getBool(-1)) throw new ScriptError('EVAL_FALSE'); - - return true; }; /** @@ -2954,43 +3324,37 @@ Script.verifyProgram = function verifyProgram(witness, output, flags, tx, i, val * @param {Script} output * @param {VerifyFlags} flags * @param {TX} tx - * @param {Number} i + * @param {Number} index * @param {Amount} value - * @returns {Boolean} * @throws {ScriptError} */ -Script.verifyMast = function verifyMast(program, stack, output, flags, tx, i, value) { - let mastRoot = new BufferWriter(); - let scriptRoot = new BufferWriter(); - let scripts = new BufferWriter(); - let version = 0; - let pathdata, depth, path, posdata, pos; - let metadata, subscripts, ops, script; - let j; - +Script.verifyMast = function verifyMast(program, stack, output, flags, tx, index, value) { assert(program.version === 1); assert((flags & Script.flags.VERIFY_MAST) !== 0); if (stack.length < 4) throw new ScriptError('INVALID_MAST_STACK'); - metadata = stack.top(-1); + const metadata = stack.get(-1); if (metadata.length < 1 || metadata.length > 5) throw new ScriptError('INVALID_MAST_STACK'); - subscripts = metadata[0]; + const subscripts = metadata[0]; if (subscripts === 0 || stack.length < subscripts + 3) throw new ScriptError('INVALID_MAST_STACK'); - ops = subscripts; + let ops = subscripts; + let scriptRoot = new BufferWriter(); scriptRoot.writeU8(subscripts); if (metadata[metadata.length - 1] === 0x00) throw new ScriptError('INVALID_MAST_STACK'); - for (j = 1; j < metadata.length; j++) - version |= metadata[i] << 8 * (j - 1); + let version = 0; + + for (let j = 1; j < metadata.length; j++) + version |= metadata[j] << 8 * (j - 1); if (version < 0) version += 0x100000000; @@ -3000,14 +3364,15 @@ Script.verifyMast = function verifyMast(program, stack, output, flags, tx, i, va throw new ScriptError('DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM'); } + let mastRoot = new BufferWriter(); mastRoot.writeU32(version); - pathdata = stack.top(-2); + const pathdata = stack.get(-2); if (pathdata.length & 0x1f) throw new ScriptError('INVALID_MAST_STACK'); - depth = pathdata.length >>> 5; + const depth = pathdata.length >>> 5; if (depth > 32) throw new ScriptError('INVALID_MAST_STACK'); @@ -3018,23 +3383,23 @@ Script.verifyMast = function verifyMast(program, stack, output, flags, tx, i, va throw new ScriptError('OP_COUNT'); } - path = []; + const path = []; - for (j = 0; j < depth; j++) + for (let j = 0; j < depth; j++) path.push(pathdata.slice(j * 32, j * 32 + 32)); - posdata = stack.top(-3); + const posdata = stack.get(-3); if (posdata.length > 4) throw new ScriptError('INVALID_MAST_STACK'); - pos = 0; + let pos = 0; if (posdata.length > 0) { if (posdata[posdata.length - 1] === 0x00) throw new ScriptError('INVALID_MAST_STACK'); - for (j = 0; j < posdata.length; j++) - pos |= posdata[i] << 8 * j; + for (let j = 0; j < posdata.length; j++) + pos |= posdata[j] << 8 * j; if (pos < 0) pos += 0x100000000; @@ -3045,12 +3410,13 @@ Script.verifyMast = function verifyMast(program, stack, output, flags, tx, i, va throw new ScriptError('INVALID_MAST_STACK'); } + let scripts = new BufferWriter(); scripts.writeBytes(output.raw); - for (j = 0; j < subscripts; j++) { - script = stack.top(-(4 + j)); + for (let j = 0; j < subscripts; j++) { + const script = stack.get(-(4 + j)); if (version === 0) { - if ((scripts.written + script.length) > consensus.MAX_SCRIPT_SIZE) + if ((scripts.offset + script.length) > consensus.MAX_SCRIPT_SIZE) throw new ScriptError('SCRIPT_SIZE'); } scriptRoot.writeBytes(digest.hash256(script)); @@ -3069,19 +3435,18 @@ Script.verifyMast = function verifyMast(program, stack, output, flags, tx, i, va if (version === 0) { stack.length -= 3 + subscripts; - for (j = 0; j < stack.length; j++) { + for (let j = 0; j < stack.length; j++) { if (stack.get(j).length > consensus.MAX_SCRIPT_PUSH) throw new ScriptError('PUSH_SIZE'); } - output = new Script(scripts.render()); - output.execute(stack, flags, tx, i, value, 1); + scripts = scripts.render(); + output = Script.fromRaw(scripts); + output.execute(stack, flags, tx, index, value, 1); if (stack.length !== 0) throw new ScriptError('EVAL_FALSE'); } - - return true; }; /** @@ -3101,7 +3466,7 @@ Script.prototype.fromReader = function fromReader(br) { */ Script.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); + const br = new BufferReader(data, true); this.raw = data; @@ -3142,9 +3507,7 @@ Script.fromRaw = function fromRaw(data, enc) { */ Script.isScript = function isScript(obj) { - return obj - && Buffer.isBuffer(obj.raw) - && typeof obj.getSubscript === 'function'; + return obj instanceof Script; }; /* diff --git a/lib/script/scripterror.js b/lib/script/scripterror.js new file mode 100644 index 000000000..d910c5241 --- /dev/null +++ b/lib/script/scripterror.js @@ -0,0 +1,50 @@ +/*! + * scripterror.js - script error for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +'use strict'; + +/** + * An error thrown from the scripting system, + * potentially pertaining to Script execution. + * @alias module:script.ScriptError + * @constructor + * @extends Error + * @param {String} code - Error code. + * @param {Opcode} op - Opcode. + * @param {Number?} ip - Instruction pointer. + * @property {String} message - Error message. + * @property {String} code - Original code passed in. + * @property {Number} op - Opcode. + * @property {Number} ip - Instruction pointer. + */ + +function ScriptError(code, op, ip) { + if (!(this instanceof ScriptError)) + return new ScriptError(code, op, ip); + + Error.call(this); + + this.type = 'ScriptError'; + this.code = code; + this.message = code; + this.op = -1; + this.ip = -1; + + if (typeof op === 'string') { + this.message = op; + } else if (op) { + this.message = `${code} (op=${op.toSymbol()}, ip=${ip})`; + this.op = op.value; + this.ip = ip; + } + + if (Error.captureStackTrace) + Error.captureStackTrace(this, ScriptError); +}; + +Object.setPrototypeOf(ScriptError.prototype, Error.prototype); + +module.exports = ScriptError; diff --git a/lib/script/scriptnum.js b/lib/script/scriptnum.js index f4c8278e9..bd2cd0d7b 100644 --- a/lib/script/scriptnum.js +++ b/lib/script/scriptnum.js @@ -1,386 +1,255 @@ /*! - * scriptnum.js - script number for bcoin - * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * scriptnum.js - script number object for bcoin. + * Copyright (c) 2017, Christopher Jeffrey (MIT License). * https://github.com/bcoin-org/bcoin */ 'use strict'; const assert = require('assert'); -const ScriptError = require('./common').ScriptError; +const {I64} = require('../utils/int64'); +const ScriptError = require('./scripterror'); + +/* + * Constants + */ + const EMPTY_ARRAY = Buffer.alloc(0); /** - * ScriptNum + * Script Number + * @see https://github.com/chjj/n64 * @alias module:script.ScriptNum * @constructor - * @ignore - * @param {Number} value + * @param {(Number|String|Buffer|Object)?} num + * @param {(String|Number)?} base + * @property {Number} hi + * @property {Number} lo + * @property {Number} sign */ -function ScriptNum(value) { +function ScriptNum(num, base) { if (!(this instanceof ScriptNum)) - return new ScriptNum(value); - - assert(!value || value <= 0xffffffffffff, 'Number exceeds 2^48-1.'); + return new ScriptNum(num, base); - this.value = value || 0; + I64.call(this, num, base); } -ScriptNum.prototype.clone = function clone() { - return new ScriptNum(this.value); -}; - -ScriptNum.prototype.add = function add(num) { - return this.clone().iadd(num); -}; - -ScriptNum.prototype.sub = function sub(num) { - return this.clone().isub(num); -}; - -ScriptNum.prototype.mul = function mul(num) { - return this.clone().imul(num); -}; - -ScriptNum.prototype.div = function div(num) { - return this.clone().idiv(num); -}; - -ScriptNum.prototype.iadd = function iadd(num) { - return this.iaddn(num.value); -}; - -ScriptNum.prototype.isub = function isub(num) { - return this.isubn(num.value); -}; - -ScriptNum.prototype.imul = function imul(num) { - return this.imuln(num.value); -}; - -ScriptNum.prototype.idiv = function idiv(num) { - return this.idivn(num.value); -}; - -ScriptNum.prototype.addn = function addn(value) { - return this.clone().iaddn(value); -}; - -ScriptNum.prototype.subn = function subn(value) { - return this.clone().isubn(value); -}; - -ScriptNum.prototype.muln = function muln(value) { - return this.clone().imuln(value); -}; - -ScriptNum.prototype.divn = function divn(value) { - return this.clone().idivn(value); -}; - -ScriptNum.prototype.ushln = function ushln(value) { - return this.clone().iushln(value); -}; - -ScriptNum.prototype.ushrn = function ushrn(value) { - return this.clone().iushrn(value); -}; - -ScriptNum.prototype.iaddn = function addn(value) { - this.value += value; - return this; -}; - -ScriptNum.prototype.isubn = function subn(value) { - this.value -= value; - return this; -}; - -ScriptNum.prototype.imuln = function muln(value) { - this.value *= value; - return this; -}; - -ScriptNum.prototype.idivn = function divn(value) { - this.value = Math.floor(this.value / value); - return this; -}; - -ScriptNum.prototype.iushln = function iushln(value) { - this.value *= Math.pow(2, value); - return this; -}; - -ScriptNum.prototype.iushrn = function iushrn(value) { - this.value = Math.floor(this.value / Math.pow(2, value)); - return this; -}; - -ScriptNum.prototype.cmp = function cmp(num) { - return this.cmpn(num.value); -}; - -ScriptNum.prototype.cmpn = function cmpn(value) { - if (this.value === value) - return 0; - return this.value < value ? -1 : 1; -}; +Object.setPrototypeOf(ScriptNum, I64); +Object.setPrototypeOf(ScriptNum.prototype, I64.prototype); -ScriptNum.prototype.neg = function neg() { - return this.clone().ineg(); -}; - -ScriptNum.prototype.ineg = function ineg() { - this.value = -this.value; - return this; -}; - -ScriptNum.prototype.toNumber = function toNumber() { - return this.value; -}; - -ScriptNum.prototype.toString = function toString(base) { - if (!base) - base = 10; +/** + * Cast to int32. + * @returns {Number} + */ - if (base === 10 || base === 'dec') - return this.value.toString(10); +ScriptNum.prototype.getInt = function getInt() { + if (this.lt(I64.INT32_MIN)) + return I64.LONG_MIN; - if (base === 16 || base === 'hex') { - let str = this.value.toString(16); - if (str.length % 2 !== 0) - str = '0' + str; - return str; - } + if (this.gt(I64.INT32_MAX)) + return I64.LONG_MAX; - assert(false, `Base ${base} not supported.`); + return this.toInt(); }; -ScriptNum.prototype.toJSON = function toJSON() { - return this.toString(16); -}; +/** + * Serialize script number. + * @returns {Buffer} + */ -ScriptNum.prototype.fromString = function fromString(str, base) { - let nonzero = 0; - let negative = false; +ScriptNum.prototype.toRaw = function toRaw() { + let num = this; - if (!base) - base = 10; + // Zeroes are always empty arrays. + if (num.isZero()) + return EMPTY_ARRAY; - if (str[0] === '-') { - assert(str.length > 1, 'Non-numeric string passed.'); - str = str.substring(1); - negative = true; - } else { - assert(str.length > 0, 'Non-numeric string passed.'); + // Need to append sign bit. + let neg = false; + if (num.isNeg()) { + num = num.neg(); + neg = true; } - this.value = 0; - - if (base === 10 || base === 'dec') { - for (let i = 0; i < str.length; i++) { - let ch = str[i]; - - if (nonzero === 0 && ch === '0') - continue; - - if (!(ch >= '0' && ch <= '9')) - throw new Error('Parse error.'); - - ch = ch.charCodeAt(0) - 48; + // Calculate size. + const size = num.byteLength(); - nonzero++; - assert(nonzero <= 15, 'Number exceeds 2^48-1.'); + let offset = 0; - this.value *= 10; - this.value += ch; - } + if (num.testn((size * 8) - 1)) + offset = 1; - if (negative) - this.value = -this.value; + // Write number. + const data = Buffer.allocUnsafe(size + offset); - return this; + switch (size) { + case 8: + data[7] = (num.hi >>> 24) & 0xff; + case 7: + data[6] = (num.hi >> 16) & 0xff; + case 6: + data[5] = (num.hi >> 8) & 0xff; + case 5: + data[4] = num.hi & 0xff; + case 4: + data[3] = (num.lo >>> 24) & 0xff; + case 3: + data[2] = (num.lo >> 16) & 0xff; + case 2: + data[1] = (num.lo >> 8) & 0xff; + case 1: + data[0] = num.lo & 0xff; } - if (base === 16 || base === 'hex') { - for (let i = 0; i < str.length; i++) { - let ch = str[i]; - - if (nonzero === 0 && ch === '0') - continue; - - if (ch >= '0' && ch <= '9') { - ch = ch.charCodeAt(0); - ch -= 48; - } else if (ch >= 'a' && ch <= 'f') { - ch = ch.charCodeAt(0); - ch -= 87; - } else if (ch >= 'A' && ch <= 'F') { - ch = ch.charCodeAt(0); - ch -= 55; - } else { - throw new Error('Parse error.'); - } - - nonzero++; - assert(nonzero <= 12, 'Number exceeds 2^48-1.'); - - this.value *= 16; - this.value += ch; - } - - if (negative) - this.value = -this.value; - - return this; + // Append sign bit. + if (data[size - 1] & 0x80) { + assert(offset === 1); + assert(data.length === size + offset); + data[size] = neg ? 0x80 : 0; + } else if (neg) { + assert(offset === 0); + assert(data.length === size); + data[size - 1] |= 0x80; + } else { + assert(offset === 0); + assert(data.length === size); } - assert(false, `Base ${base} not supported.`); -}; - -ScriptNum.fromString = function fromString(str, base) { - return new ScriptNum(0).fromString(str, base); + return data; }; -ScriptNum.prototype.fromRaw = function fromRaw(data, minimal, limit) { - if (minimal == null) - minimal = true; - - if (limit == null) - limit = 4; - - // We can't handle more than 6 bytes. - assert(limit <= 6, 'Number exceeds 48 bits.'); +/** + * Instantiate script number from serialized data. + * @private + * @param {Buffer} data + * @returns {ScriptNum} + */ - // Max size is 4 bytes by default, 6 bytes max. - if (data.length > limit) - throw new ScriptError('UNKNOWN_ERROR', 'Script number overflow.'); +ScriptNum.prototype.fromRaw = function fromRaw(data) { + assert(Buffer.isBuffer(data)); // Empty arrays are always zero. - if (data.length === 0) { - this.value = 0; + if (data.length === 0) return this; - } - - // Ensure minimal serialization. - if (minimal) { - if ((data[data.length - 1] & 0x7f) === 0) { - if (data.length === 1 || !(data[data.length - 2] & 0x80)) { - throw new ScriptError( - 'UNKNOWN_ERROR', - 'Non-minimally encoded Script number.'); - } - } - } - this.value = 0; - - // Read number (6 bytes max). + // Read number (9 bytes max). switch (data.length) { + case 8: + this.hi |= data[7] << 24; + case 7: + this.hi |= data[6] << 16; case 6: - this.value += data[5] * 0x10000000000; + this.hi |= data[5] << 8; case 5: - this.value += data[4] * 0x100000000; + this.hi |= data[4]; case 4: - this.value += data[3] * 0x1000000; + this.lo |= data[3] << 24; case 3: - this.value += data[2] * 0x10000; + this.lo |= data[2] << 16; case 2: - this.value += data[1] * 0x100; + this.lo |= data[1] << 8; case 1: - this.value += data[0]; + this.lo |= data[0]; + break; + default: + for (let i = 0; i < data.length; i++) + this.orb(i, data[i]); + break; } // Remove high bit and flip sign. if (data[data.length - 1] & 0x80) { - switch (data.length) { - case 1: - case 2: - case 3: - case 4: - this.value &= ~(0x80 << (8 * (data.length - 1))); - break; - case 5: - this.value -= 0x8000000000; - break; - case 6: - this.value -= 0x800000000000; - break; - } - this.value = -this.value; + this.setn((data.length * 8) - 1, 0); + this.ineg(); } return this; }; -ScriptNum.fromRaw = function fromRaw(data, minimal, limit) { - return new ScriptNum(0).fromRaw(data, minimal, limit); -}; +/** + * Serialize script number. + * @returns {Buffer} + */ -ScriptNum.prototype.toRaw = function toRaw() { - let value = this.value; - let negative = false; - let data, offset, size; +ScriptNum.prototype.encode = function encode() { + return this.toRaw(); +}; - // Zeroes are always empty arrays. - if (value === 0) - return EMPTY_ARRAY; +/** + * Decode and verify script number. + * @private + * @param {Buffer} data + * @param {Boolean?} minimal - Require minimal encoding. + * @param {Number?} limit - Size limit. + * @returns {ScriptNum} + */ - // Need to append sign bit. - if (value < 0) { - negative = true; - value = -value; - } +ScriptNum.prototype.decode = function decode(data, minimal, limit) { + assert(Buffer.isBuffer(data)); - // Gauge buffer size. - if (value <= 0xff) { - offset = (value & 0x80) ? 1 : 0; - size = 1; - } else if (value <= 0xffff) { - offset = (value & 0x8000) ? 1 : 0; - size = 2; - } else if (value <= 0xffffff) { - offset = (value & 0x800000) ? 1 : 0; - size = 3; - } else if (value <= 0xffffffff) { - offset = (value & 0x80000000) ? 1 : 0; - size = 4; - } else if (value <= 0xffffffffff) { - offset = value >= 0x8000000000 ? 1 : 0; - size = 5; - } else if (value <= 0xffffffffffff) { - offset = value >= 0x800000000000 ? 1 : 0; - size = 6; - } else { + if (limit != null && data.length > limit) throw new ScriptError('UNKNOWN_ERROR', 'Script number overflow.'); - } - // Write number. - data = Buffer.allocUnsafe(size + offset); + if (minimal && !ScriptNum.isMinimal(data)) + throw new ScriptError('UNKNOWN_ERROR', 'Non-minimal script number.'); - switch (size) { - case 6: - data[5] = (value / 0x10000000000 | 0) & 0xff; - case 5: - data[4] = (value / 0x100000000 | 0) & 0xff; - case 4: - data[3] = (value >>> 24) & 0xff; - case 3: - data[2] = (value >> 16) & 0xff; - case 2: - data[1] = (value >> 8) & 0xff; - case 1: - data[0] = value & 0xff; + return this.fromRaw(data); +}; + +/** + * Inspect script number. + * @returns {String} + */ + +ScriptNum.prototype.inspect = function inspect() { + return ``; +}; + +/** + * Test wether a serialized script + * number is in its most minimal form. + * @param {Buffer} data + * @returns {Boolean} + */ + +ScriptNum.isMinimal = function isMinimal(data) { + assert(Buffer.isBuffer(data)); + + if (data.length === 0) + return true; + + if ((data[data.length - 1] & 0x7f) === 0) { + if (data.length === 1) + return false; + + if ((data[data.length - 2] & 0x80) === 0) + return false; } - // Append sign bit. - if (data[size - 1] & 0x80) - data[size] = negative ? 0x80 : 0; - else if (negative) - data[size - 1] |= 0x80; + return true; +}; - return data; +/** + * Decode and verify script number. + * @param {Buffer} data + * @param {Boolean?} minimal - Require minimal encoding. + * @param {Number?} limit - Size limit. + * @returns {ScriptNum} + */ + +ScriptNum.decode = function decode(data, minimal, limit) { + return new ScriptNum().decode(data, minimal, limit); +}; + +/** + * Test whether object is a script number. + * @param {Object} obj + * @returns {Boolean} + */ + +ScriptNum.isScriptNum = function isScriptNum(obj) { + return obj instanceof ScriptNum; }; /* diff --git a/lib/script/sigcache.js b/lib/script/sigcache.js index c9940f821..378613bd9 100644 --- a/lib/script/sigcache.js +++ b/lib/script/sigcache.js @@ -27,8 +27,7 @@ function SigCache(size) { if (size == null) size = 10000; - assert(util.isNumber(size)); - assert(size >= 0); + assert(util.isU32(size)); this.size = size; this.keys = []; @@ -41,8 +40,7 @@ function SigCache(size) { */ SigCache.prototype.resize = function resize(size) { - assert(util.isNumber(size)); - assert(size >= 0); + assert(util.isU32(size)); this.size = size; this.keys.length = 0; @@ -64,8 +62,8 @@ SigCache.prototype.add = function add(hash, sig, key) { this.valid.set(hash, new SigCacheEntry(sig, key)); if (this.keys.length >= this.size) { - let i = Math.floor(Math.random() * this.keys.length); - let k = this.keys[i]; + const i = Math.floor(Math.random() * this.keys.length); + const k = this.keys[i]; this.valid.delete(k); this.keys[i] = hash; } else { @@ -82,12 +80,12 @@ SigCache.prototype.add = function add(hash, sig, key) { */ SigCache.prototype.has = function has(hash, sig, key) { - let entry = this.valid.get(hash); + const entry = this.valid.get(hash); if (!entry) return false; - return entry.equal(sig, key); + return entry.equals(sig, key); }; /** @@ -100,17 +98,15 @@ SigCache.prototype.has = function has(hash, sig, key) { */ SigCache.prototype.verify = function verify(msg, sig, key) { - let hash, result; - if (this.size === 0) return secp256k1.verify(msg, sig, key); - hash = msg.toString('hex'); + const hash = msg.toString('hex'); if (this.has(hash, sig, key)) return true; - result = secp256k1.verify(msg, sig, key); + const result = secp256k1.verify(msg, sig, key); if (!result) return false; @@ -142,7 +138,7 @@ function SigCacheEntry(sig, key) { * @returns {Boolean} */ -SigCacheEntry.prototype.equal = function equal(sig, key) { +SigCacheEntry.prototype.equals = function equals(sig, key) { return this.sig.equals(sig) && this.key.equals(key); }; diff --git a/lib/script/stack.js b/lib/script/stack.js index 5a5b9c727..49e708902 100644 --- a/lib/script/stack.js +++ b/lib/script/stack.js @@ -7,7 +7,9 @@ 'use strict'; +const assert = require('assert'); const common = require('./common'); +const ScriptNum = require('./scriptnum'); /** * Represents the stack of a Script during execution. @@ -25,30 +27,46 @@ function Stack(items) { this.items = items || []; } -/** - * Getter to retrieve stack items length. - * @name module:script.Stack#length_getter - * @method - * @private - * @returns {Number} +/* + * Expose length setter and getter. */ -Stack.prototype.__defineGetter__('length', function() { - return this.items.length; +Object.defineProperty(Stack.prototype, 'length', { + get() { + return this.items.length; + }, + set(length) { + this.items.length = length; + return this.items.length; + } }); /** - * Setter to set stack items length. - * @name module:script.Stack#length_setter - * @method - * @private - * @param {Number} value - * @returns {Number} + * Instantiate a key and value iterator. + * @returns {StackIterator} */ -Stack.prototype.__defineSetter__('length', function(length) { - return this.items.length = length; -}); +Stack.prototype[Symbol.iterator] = function iterator() { + return this.items[Symbol.iterator](); +}; + +/** + * Instantiate a value-only iterator. + * @returns {StackIterator} + */ + +Stack.prototype.values = function values() { + return this.items.values(); +}; + +/** + * Instantiate a key and value iterator. + * @returns {StackIterator} + */ + +Stack.prototype.entries = function entries() { + return this.items.entries(); +}; /** * Inspect the stack. @@ -65,7 +83,12 @@ Stack.prototype.inspect = function inspect() { */ Stack.prototype.toString = function toString() { - return common.formatStack(this.items); + const out = []; + + for (const item of this.items) + out.push(item.toString('hex')); + + return out.join(' '); }; /** @@ -75,7 +98,12 @@ Stack.prototype.toString = function toString() { */ Stack.prototype.toASM = function toASM(decode) { - return common.formatStackASM(this.items, decode); + const out = []; + + for (const item of this.items) + out.push(common.toASM(item, decode)); + + return out.join(' '); }; /** @@ -87,6 +115,94 @@ Stack.prototype.clone = function clone() { return new Stack(this.items.slice()); }; +/** + * Clear the stack. + * @returns {Stack} + */ + +Stack.prototype.clear = function clear() { + this.items.length = 0; + return this; +}; + +/** + * Get a stack item by index. + * @param {Number} index + * @returns {Buffer|null} + */ + +Stack.prototype.get = function get(index) { + if (index < 0) + index += this.items.length; + + if (index < 0 || index >= this.items.length) + return null; + + return this.items[index]; +}; + +/** + * Pop a stack item. + * @see Array#pop + * @returns {Buffer|null} + */ + +Stack.prototype.pop = function pop() { + const item = this.items.pop(); + return item || null; +}; + +/** + * Shift a stack item. + * @see Array#shift + * @returns {Buffer|null} + */ + +Stack.prototype.shift = function shift() { + const item = this.items.shift(); + return item || null; +}; + +/** + * Remove an item. + * @param {Number} index + * @returns {Buffer} + */ + +Stack.prototype.remove = function remove(index) { + if (index < 0) + index += this.items.length; + + if (index < 0 || index >= this.items.length) + return null; + + const items = this.items.splice(index, 1); + + if (items.length === 0) + return null; + + return items[0]; +}; + +/** + * Set stack item at index. + * @param {Number} index + * @param {Buffer} value + * @returns {Buffer} + */ + +Stack.prototype.set = function set(index, item) { + if (index < 0) + index += this.items.length; + + assert(Buffer.isBuffer(item)); + assert(index >= 0 && index <= this.items.length); + + this.items[index] = item; + + return this; +}; + /** * Push item onto stack. * @see Array#push @@ -95,7 +211,9 @@ Stack.prototype.clone = function clone() { */ Stack.prototype.push = function push(item) { - return this.items.push(item); + assert(Buffer.isBuffer(item)); + this.items.push(item); + return this; }; /** @@ -106,39 +224,28 @@ Stack.prototype.push = function push(item) { */ Stack.prototype.unshift = function unshift(item) { - return this.items.unshift(item); -}; - -/** - * Slice out part of the stack items. - * @param {Number} start - * @param {Number} end - * @see Array#slice - * @returns {Stack} - */ - -Stack.prototype.slice = function slice(start, end) { - this.items = this.items.slice(start, end); + assert(Buffer.isBuffer(item)); + this.items.unshift(item); return this; }; /** - * Splice stack items. - * @see Array#splice + * Insert an item. * @param {Number} index - * @param {Number} remove - * @param {Buffer?} insert - * @returns {Buffer[]} + * @param {Buffer} item + * @returns {Buffer} */ -Stack.prototype.splice = function splice(i, remove, insert) { - if (i < 0) - i = this.items.length + i; +Stack.prototype.insert = function insert(index, item) { + if (index < 0) + index += this.items.length; + + assert(Buffer.isBuffer(item)); + assert(index >= 0 && index <= this.items.length); - if (insert === undefined) - return this.items.splice(i, remove); + this.items.splice(index, 0, item); - return this.items.splice(i, remove, insert); + return this; }; /** @@ -159,120 +266,228 @@ Stack.prototype.erase = function erase(start, end) { }; /** - * Insert an item. - * @param {Number} index - * @param {Buffer} item - * @returns {Buffer} + * Swap stack values. + * @param {Number} i1 - Index 1. + * @param {Number} i2 - Index 2. */ -Stack.prototype.insert = function insert(i, item) { - if (i < 0) - i = this.items.length + i; +Stack.prototype.swap = function swap(i1, i2) { + if (i1 < 0) + i1 = this.items.length + i1; - this.items.splice(i, 0, item); + if (i2 < 0) + i2 = this.items.length + i2; + + const v1 = this.items[i1]; + const v2 = this.items[i2]; + + this.items[i1] = v2; + this.items[i2] = v1; }; -/** - * Remove an item. - * @param {Number} index - * @returns {Buffer} +/* + * Data */ -Stack.prototype.remove = function remove(i) { - if (i < 0) - i = this.items.length + i; +Stack.prototype.getData = function getData(index) { + return this.get(index); +}; - if (i >= this.items.length) - return; +Stack.prototype.popData = function popData() { + return this.pop(); +}; - return this.items.splice(i, 1)[0]; +Stack.prototype.shiftData = function shiftData() { + return this.shift(); }; -/** - * Pop a stack item. - * @see Array#pop - * @returns {Buffer|null} - */ +Stack.prototype.removeData = function removeData(index) { + return this.remove(index); +}; -Stack.prototype.pop = function pop() { - return this.items.pop(); +Stack.prototype.setData = function setData(index, data) { + return this.set(index, data); }; -/** - * Shift a stack item. - * @see Array#shift - * @returns {Buffer|null} - */ +Stack.prototype.pushData = function pushData(data) { + return this.push(data); +}; -Stack.prototype.shift = function shift() { - return this.items.shift(); +Stack.prototype.unshiftData = function unshiftData(data) { + return this.unshift(data); }; -/** - * Get a stack item by index. - * @param {Number} index - * @returns {Buffer|null} +Stack.prototype.insertData = function insertData(index, data) { + return this.insert(index, data); +}; + +/* + * Length */ -Stack.prototype.get = function get(i) { - return this.items[i]; +Stack.prototype.getLength = function getLength(index) { + const item = this.get(index); + return item ? item.length : -1; }; -/** - * Get a stack item relative to - * the top of the stack. - * @example - * stack.top(-1); - * @param {Number} index - * @returns {Buffer|null} +/* + * String */ -Stack.prototype.top = function top(i) { - return this.items[this.items.length + i]; +Stack.prototype.getString = function getString(index, enc) { + const item = this.get(index); + return item ? Stack.toString(item, enc) : null; }; -/** - * Clear the stack. +Stack.prototype.popString = function popString(enc) { + const item = this.pop(); + return item ? Stack.toString(item, enc) : null; +}; + +Stack.prototype.shiftString = function shiftString(enc) { + const item = this.shift(); + return item ? Stack.toString(item, enc) : null; +}; + +Stack.prototype.removeString = function removeString(index, enc) { + const item = this.remove(index); + return item ? Stack.toString(item, enc) : null; +}; + +Stack.prototype.setString = function setString(index, str, enc) { + return this.set(index, Stack.fromString(str, enc)); +}; + +Stack.prototype.pushString = function pushString(str, enc) { + return this.push(Stack.fromString(str, enc)); +}; + +Stack.prototype.unshiftString = function unshiftString(str, enc) { + return this.unshift(Stack.fromString(str, enc)); +}; + +Stack.prototype.insertString = function insertString(index, str, enc) { + return this.insert(index, Stack.fromString(str, enc)); +}; + +/* + * Num */ -Stack.prototype.clear = function clear() { - this.items.length = 0; +Stack.prototype.getNum = function getNum(index, minimal, limit) { + const item = this.get(index); + return item ? Stack.toNum(item, minimal, limit) : null; }; -/** - * Set stack item at index. - * @param {Number} index - * @param {Buffer} value - * @returns {Buffer} +Stack.prototype.popNum = function popNum(minimal, limit) { + const item = this.pop(); + return item ? Stack.toNum(item, minimal, limit) : null; +}; + +Stack.prototype.shiftNum = function shiftNum(minimal, limit) { + const item = this.shift(); + return item ? Stack.toNum(item, minimal, limit) : null; +}; + +Stack.prototype.removeNum = function removeNum(index, minimal, limit) { + const item = this.remove(index); + return item ? Stack.toNum(item, minimal, limit) : null; +}; + +Stack.prototype.setNum = function setNum(index, num) { + return this.set(index, Stack.fromNum(num)); +}; + +Stack.prototype.pushNum = function pushNum(num) { + return this.push(Stack.fromNum(num)); +}; + +Stack.prototype.unshiftNum = function unshiftNum(num) { + return this.unshift(Stack.fromNum(num)); +}; + +Stack.prototype.insertNum = function insertNum(index, num) { + return this.insert(index, Stack.fromNum(num)); +}; + +/* + * Int */ -Stack.prototype.set = function set(i, value) { - if (i < 0) - i = this.items.length + i; +Stack.prototype.getInt = function getInt(index, minimal, limit) { + const item = this.get(index); + return item ? Stack.toInt(item, minimal, limit) : -1; +}; - return this.items[i] = value; +Stack.prototype.popInt = function popInt(minimal, limit) { + const item = this.pop(); + return item ? Stack.toInt(item, minimal, limit) : -1; }; -/** - * Swap stack values. - * @param {Number} i1 - Index 1. - * @param {Number} i2 - Index 2. +Stack.prototype.shiftInt = function shiftInt(minimal, limit) { + const item = this.shift(); + return item ? Stack.toInt(item, minimal, limit) : -1; +}; + +Stack.prototype.removeInt = function removeInt(index, minimal, limit) { + const item = this.remove(index); + return item ? Stack.toInt(item, minimal, limit) : -1; +}; + +Stack.prototype.setInt = function setInt(index, num) { + return this.set(index, Stack.fromInt(num)); +}; + +Stack.prototype.pushInt = function pushInt(num) { + return this.push(Stack.fromInt(num)); +}; + +Stack.prototype.unshiftInt = function unshiftInt(num) { + return this.unshift(Stack.fromInt(num)); +}; + +Stack.prototype.insertInt = function insertInt(index, num) { + return this.insert(index, Stack.fromInt(num)); +}; + +/* + * Bool */ -Stack.prototype.swap = function swap(i1, i2) { - let v1, v2; +Stack.prototype.getBool = function getBool(index) { + const item = this.get(index); + return item ? Stack.toBool(item) : false; +}; - if (i1 < 0) - i1 = this.items.length + i1; +Stack.prototype.popBool = function popBool() { + const item = this.pop(); + return item ? Stack.toBool(item) : false; +}; - if (i2 < 0) - i2 = this.items.length + i2; +Stack.prototype.shiftBool = function shiftBool() { + const item = this.shift(); + return item ? Stack.toBool(item) : false; +}; - v1 = this.items[i1]; - v2 = this.items[i2]; +Stack.prototype.removeBool = function removeBool(index) { + const item = this.remove(index); + return item ? Stack.toBool(item) : false; +}; - this.items[i1] = v2; - this.items[i2] = v1; +Stack.prototype.setBool = function setBool(index, value) { + return this.set(index, Stack.fromBool(value)); +}; + +Stack.prototype.pushBool = function pushBool(value) { + return this.push(Stack.fromBool(value)); +}; + +Stack.prototype.unshiftBool = function unshiftBool(value) { + return this.unshift(Stack.fromBool(value)); +}; + +Stack.prototype.insertBool = function insertBool(index, value) { + return this.insert(index, Stack.fromBool(value)); }; /** @@ -282,7 +497,73 @@ Stack.prototype.swap = function swap(i1, i2) { */ Stack.isStack = function isStack(obj) { - return obj && Array.isArray(obj.items) && typeof obj.swap === 'function'; + return obj instanceof Stack; +}; + +/* + * Encoding + */ + +Stack.toString = function toString(item, enc) { + assert(Buffer.isBuffer(item)); + return item.toString(enc || 'utf8'); +}; + +Stack.fromString = function fromString(str, enc) { + assert(typeof str === 'string'); + return Buffer.from(str, enc || 'utf8'); +}; + +Stack.toNum = function toNum(item, minimal, limit) { + assert(Buffer.isBuffer(item)); + return ScriptNum.decode(item, minimal, limit); +}; + +Stack.fromNum = function fromNum(num) { + assert(ScriptNum.isScriptNum(num)); + return num.encode(); +}; + +Stack.toInt = function toInt(item, minimal, limit) { + assert(Buffer.isBuffer(item)); + + const num = Stack.toNum(item, minimal, limit); + + if (!num) + return -1; + + return num.getInt(); +}; + +Stack.fromInt = function fromInt(int) { + assert(typeof int === 'number'); + + if (int >= -1 && int <= 16) + return common.small[int + 1]; + + const num = ScriptNum.fromNumber(int); + + return Stack.fromNum(num); +}; + +Stack.toBool = function toBool(item) { + assert(Buffer.isBuffer(item)); + + for (let i = 0; i < item.length; i++) { + if (item[i] !== 0) { + // Cannot be negative zero + if (i === item.length - 1 && item[i] === 0x80) + return false; + return true; + } + } + + return false; +}; + +Stack.fromBool = function fromBool(value) { + assert(typeof value === 'boolean'); + return Stack.fromInt(value ? 1 : 0); }; /* diff --git a/lib/script/witness.js b/lib/script/witness.js index aaa45643e..001f9ef34 100644 --- a/lib/script/witness.js +++ b/lib/script/witness.js @@ -8,20 +8,15 @@ 'use strict'; const assert = require('assert'); -const BN = require('../crypto/bn'); const util = require('../utils/util'); const Script = require('./script'); const common = require('./common'); const encoding = require('../utils/encoding'); -const Opcode = require('./opcode'); const BufferReader = require('../utils/reader'); const StaticWriter = require('../utils/staticwriter'); const Address = require('../primitives/address'); const Stack = require('./stack'); -const opcodes = common.opcodes; const scriptTypes = common.types; -const STACK_FALSE = common.STACK_FALSE; -const STACK_NEGATE = common.STACK_NEGATE; /** * Refers to the witness field of segregated witness transactions. @@ -38,36 +33,13 @@ function Witness(options) { if (!(this instanceof Witness)) return new Witness(options); - this.items = []; + Stack.call(this, []); if (options) this.fromOptions(options); } -/** - * Getter to retrieve witness vector length. - * @name module:script.Witness#length_getter - * @method - * @private - * @returns {Number} - */ - -Witness.prototype.__defineGetter__('length', function() { - return this.items.length; -}); - -/** - * Setter to set witness vector length. - * @name module:script.Witness#length_setter - * @method - * @private - * @param {Number} value - * @returns {Number} - */ - -Witness.prototype.__defineSetter__('length', function(length) { - return this.items.length = length; -}); +Object.setPrototypeOf(Witness.prototype, Stack.prototype); /** * Inject properties from options object. @@ -76,17 +48,13 @@ Witness.prototype.__defineSetter__('length', function(length) { */ Witness.prototype.fromOptions = function fromOptions(options) { - let items; - assert(options, 'Witness data is required.'); - items = options.items; - - if (!items) - items = options; + if (Array.isArray(options)) + return this.fromArray(options); - if (items) - this.fromArray(items); + if (options.items) + return this.fromArray(options.items); return this; }; @@ -133,31 +101,72 @@ Witness.fromArray = function fromArray(items) { }; /** - * Inspect a Witness object. - * @returns {String} Human-readable script. + * Convert witness to an array of buffers. + * @returns {Buffer[]} */ -Witness.prototype.inspect = function inspect() { - return ``; +Witness.prototype.toItems = function toItems() { + return this.items.slice(); }; /** - * Convert a Witness object to a String. - * @returns {String} Human-readable script. + * Inject properties from an array of buffers. + * @private + * @param {Buffer[]} items + */ + +Witness.prototype.fromItems = function fromItems(items) { + assert(Array.isArray(items)); + this.items = items; + return this; +}; + +/** + * Insantiate witness from an array of buffers. + * @param {Buffer[]} items + * @returns {Witness} + */ + +Witness.fromItems = function fromItems(items) { + return new Witness().fromItems(items); +}; + +/** + * Convert witness to a stack. + * @returns {Stack} + */ + +Witness.prototype.toStack = function toStack() { + return new Stack(this.toArray()); +}; + +/** + * Inject properties from a stack. + * @private + * @param {Stack} stack */ -Witness.prototype.toString = function toString() { - return common.formatStack(this.items); +Witness.prototype.fromStack = function fromStack(stack) { + return this.fromArray(stack.items); }; /** - * Format the witness object as bitcoind asm. - * @param {Boolean?} decode - Attempt to decode hash types. + * Insantiate witness from a stack. + * @param {Stack} stack + * @returns {Witness} + */ + +Witness.fromStack = function fromStack(stack) { + return new Witness().fromStack(stack); +}; + +/** + * Inspect a Witness object. * @returns {String} Human-readable script. */ -Witness.prototype.toASM = function toASM(decode) { - return common.formatStackASM(this.items, decode); +Witness.prototype.inspect = function inspect() { + return ``; }; /** @@ -183,14 +192,12 @@ Witness.prototype.inject = function inject(witness) { }; /** - * Convert the Witness to a Stack object. - * This is usually done before executing - * a witness program. - * @returns {Stack} + * Compile witness (NOP). + * @returns {Witness} */ -Witness.prototype.toStack = function toStack() { - return new Stack(this.items.slice()); +Witness.prototype.compile = function compile() { + return this; }; /** @@ -229,6 +236,16 @@ Witness.prototype.isPubkeyInput = function isPubkeyInput() { return false; }; +/** + * Get P2PK signature if present. + * Always returns null. + * @returns {Buffer|null} + */ + +Witness.prototype.getPubkeyInput = function getPubkeyInput() { + return null; +}; + /** * "Guess" whether the witness is a pubkeyhash input. * This method is not 100% reliable. @@ -241,6 +258,17 @@ Witness.prototype.isPubkeyhashInput = function isPubkeyhashInput() { && common.isKeyEncoding(this.items[1]); }; +/** + * Get P2PKH signature and key if present. + * @returns {Array} [sig, key] + */ + +Witness.prototype.getPubkeyhashInput = function getPubkeyhashInput() { + if (!this.isPubkeyhashInput()) + return [null, null]; + return [this.items[0], this.items[1]]; +}; + /** * "Test" whether the witness is a multisig input. * Always returns false. @@ -251,6 +279,16 @@ Witness.prototype.isMultisigInput = function isMultisigInput() { return false; }; +/** + * Get multisig signatures key if present. + * Always returns null. + * @returns {Buffer[]|null} + */ + +Witness.prototype.getMultisigInput = function getMultisigInput() { + return null; +}; + /** * "Guess" whether the witness is a scripthash input. * This method is not 100% reliable. @@ -261,6 +299,17 @@ Witness.prototype.isScripthashInput = function isScripthashInput() { return this.items.length > 0 && !this.isPubkeyhashInput(); }; +/** + * Get P2SH redeem script if present. + * @returns {Buffer|null} + */ + +Witness.prototype.getScripthashInput = function getScripthashInput() { + if (!this.isScripthashInput()) + return null; + return this.items[this.items.length - 1]; +}; + /** * "Guess" whether the witness is an unknown/non-standard type. * This method is not 100% reliable. @@ -278,7 +327,7 @@ Witness.prototype.isUnknownInput = function isUnknownInput() { */ Witness.prototype.test = function test(filter) { - for (let item of this.items) { + for (const item of this.items) { if (item.length === 0) continue; @@ -295,27 +344,17 @@ Witness.prototype.test = function test(filter) { */ Witness.prototype.getRedeem = function getRedeem() { - let redeem; - if (this.items.length === 0) - return; + return null; - redeem = this.items[this.items.length - 1]; + const redeem = this.items[this.items.length - 1]; if (!redeem) - return; + return null; return Script.fromRaw(redeem); }; -/** - * Does nothing currently. - */ - -Witness.prototype.compile = function compile() { - // NOP -}; - /** * Find a data element in a witness. * @param {Buffer} data - Data element to match against. @@ -335,7 +374,7 @@ Witness.prototype.indexOf = function indexOf(data) { Witness.prototype.getSize = function getSize() { let size = 0; - for (let item of this.items) + for (const item of this.items) size += encoding.sizeVarBytes(item); return size; @@ -357,11 +396,9 @@ Witness.prototype.getVarSize = function getVarSize() { */ Witness.prototype.toWriter = function toWriter(bw) { - let item; - bw.writeVarint(this.items.length); - for (item of this.items) + for (const item of this.items) bw.writeVarBytes(item); return bw; @@ -374,7 +411,7 @@ Witness.prototype.toWriter = function toWriter(bw) { */ Witness.prototype.toRaw = function toRaw() { - let size = this.getVarSize(); + const size = this.getVarSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -408,169 +445,6 @@ Witness.fromJSON = function fromJSON(json) { return new Witness().fromJSON(json); }; -/** - * Unshift an item onto the witness vector. - * @param {Number|String|Buffer|BN} data - * @returns {Number} - */ - -Witness.prototype.unshift = function unshift(data) { - return this.items.unshift(Witness.encodeItem(data)); -}; - -/** - * Push an item onto the witness vector. - * @param {Number|String|Buffer|BN} data - * @returns {Number} - */ - -Witness.prototype.push = function push(data) { - return this.items.push(Witness.encodeItem(data)); -}; - -/** - * Shift an item off the witness vector. - * @returns {Buffer} - */ - -Witness.prototype.shift = function shift() { - return this.items.shift(); -}; - -/** - * Shift an item off the witness vector. - * @returns {Buffer} - */ - -Witness.prototype.pop = function push(data) { - return this.items.pop(); -}; - -/** - * Remove an item from the witness vector. - * @param {Number} index - * @returns {Buffer} - */ - -Witness.prototype.remove = function remove(i) { - return this.items.splice(i, 1)[0]; -}; - -/** - * Insert an item into the witness vector. - * @param {Number} index - * @param {Number|String|Buffer|BN} data - */ - -Witness.prototype.insert = function insert(i, data) { - assert(i <= this.items.length, 'Index out of bounds.'); - this.items.splice(i, 0, Witness.encodeItem(data))[0]; -}; - -/** - * Get an item from the witness vector. - * @param {Number} index - * @returns {Buffer} - */ - -Witness.prototype.get = function get(i) { - return this.items[i]; -}; - -/** - * Get a small int (0-16) from the witness vector. - * @param {Number} index - * @returns {Number} `-1` on non-existent. - */ - -Witness.prototype.getSmall = function getSmall(i) { - let item = this.items[i]; - if (!item || item.length > 1) - return -1; - if (item.length === 0) - return 0; - if (!(item[0] >= 1 && item[1] <= 16)) - return -1; - return item[0]; -}; - -/** - * Get a number from the witness vector. - * @param {Number} index - * @returns {BN} - */ - -Witness.prototype.getNumber = function getNumber(i) { - let item = this.items[i]; - if (!item || item.length > 5) - return; - return common.num(item, false, 5); -}; - -/** - * Get a string from the witness vector. - * @param {Number} index - * @returns {String} - */ - -Witness.prototype.getString = function getString(i) { - let item = this.items[i]; - if (!item) - return; - return item.toString('utf8'); -}; - -/** - * Clear the witness items. - */ - -Witness.prototype.clear = function clear() { - this.items.length = 0; -}; - -/** - * Set an item in the witness vector. - * @param {Number} index - * @param {Number|String|Buffer|BN} data - */ - -Witness.prototype.set = function set(i, data) { - assert(i <= this.items.length, 'Index out of bounds.'); - this.items[i] = Witness.encodeItem(data); -}; - -/** - * Encode a witness item. - * @param {Number|String|Buffer|BN} data - * @returns {Buffer} - */ - -Witness.encodeItem = function encodeItem(data) { - if (data instanceof Opcode) - data = data.data || data.value; - - if (typeof data === 'number') { - if (data === opcodes.OP_1NEGATE) - return STACK_NEGATE; - - if (data === opcodes.OP_0) - return STACK_FALSE; - - if (data >= opcodes.OP_1 && data <= opcodes.OP_16) - return Buffer.from([data - 0x50]); - - throw new Error('Non-push opcode in witness.'); - } - - if (BN.isBN(data)) - return common.array(data); - - if (typeof data === 'string') - return Buffer.from(data, 'utf8'); - - return data; -}; - /** * Inject properties from buffer reader. * @private @@ -578,7 +452,7 @@ Witness.encodeItem = function encodeItem(data) { */ Witness.prototype.fromReader = function fromReader(br) { - let count = br.readVarint(); + const count = br.readVarint(); for (let i = 0; i < count; i++) this.items.push(br.readVarBytes()); @@ -636,7 +510,7 @@ Witness.prototype.fromString = function fromString(items) { items = items.split(/\s+/); } - for (let item of items) + for (const item of items) this.items.push(Buffer.from(item, 'hex')); return this; @@ -663,9 +537,7 @@ Witness.fromString = function fromString(items) { */ Witness.isWitness = function isWitness(obj) { - return obj - && Array.isArray(obj.items) - && typeof obj.toStack === 'function'; + return obj instanceof Witness; }; /* diff --git a/lib/types.js b/lib/types.js index f26b5c7d6..fac6ea310 100644 --- a/lib/types.js +++ b/lib/types.js @@ -133,7 +133,7 @@ * This value will never be negative. * @property {Hash} prevBlock * @property {Hash} merkleRoot - * @property {Number} ts + * @property {Number} time * @property {Number} bits * @property {Number} nonce * @property {Number} height diff --git a/lib/utils/asn1.js b/lib/utils/asn1.js index cde6e0ced..8dae485b0 100644 --- a/lib/utils/asn1.js +++ b/lib/utils/asn1.js @@ -45,11 +45,10 @@ const ASN1 = exports; ASN1.readTag = function readTag(br) { let type = br.readU8(); - let primitive = (type & 0x20) === 0; - let oct; + const primitive = (type & 0x20) === 0; if ((type & 0x1f) === 0x1f) { - oct = type; + let oct = type; type = 0; while ((oct & 0x80) === 0x80) { oct = br.readU8(); @@ -77,7 +76,6 @@ ASN1.readTag = function readTag(br) { ASN1.readSize = function readSize(br, primitive) { let size = br.readU8(); - let bytes, i, j; // Indefinite form if (!primitive && size === 0x80) @@ -90,16 +88,15 @@ ASN1.readSize = function readSize(br, primitive) { } // Long form - bytes = size & 0x7f; + const bytes = size & 0x7f; if (bytes > 3) throw new Error('Length octet is too long.'); size = 0; - for (i = 0; i < bytes; i++) { + for (let i = 0; i < bytes; i++) { size <<= 8; - j = br.readU8(); - size |= j; + size |= br.readU8(); } return size; @@ -112,7 +109,7 @@ ASN1.readSize = function readSize(br, primitive) { */ ASN1.readSeq = function readSeq(br) { - let tag = ASN1.implicit(br, 0x10); + const tag = ASN1.implicit(br, 0x10); return br.readBytes(tag.size); }; @@ -125,9 +122,11 @@ ASN1.readSeq = function readSeq(br) { */ ASN1.implicit = function implicit(br, type) { - let tag = ASN1.readTag(br); + const tag = ASN1.readTag(br); + if (tag.type !== type) throw new Error(`Unexpected tag: ${tag.type}.`); + return tag; }; @@ -139,12 +138,14 @@ ASN1.implicit = function implicit(br, type) { */ ASN1.explicit = function explicit(br, type) { - let offset = br.offset; - let tag = ASN1.readTag(br); + const offset = br.offset; + const tag = ASN1.readTag(br); + if (tag.type !== type) { br.offset = offset; return false; } + return true; }; @@ -161,15 +162,15 @@ ASN1.seq = function seq(br) { /** * Read implicit int. * @param {BufferReader} br - * @param {Boolean?} readNum + * @param {Boolean?} cast * @returns {Buffer|Number} */ -ASN1.readInt = function readInt(br, readNum) { - let tag = ASN1.implicit(br, 0x02); - let num = br.readBytes(tag.size); +ASN1.readInt = function readInt(br, cast) { + const tag = ASN1.implicit(br, 0x02); + const num = br.readBytes(tag.size); - if (readNum) + if (cast) return num.readUIntBE(0, num.length); return num; @@ -186,6 +187,7 @@ ASN1.readInt = function readInt(br, readNum) { ASN1.readExplicitInt = function readExplicitInt(br, type, readNum) { if (!ASN1.explicit(br, type)) return -1; + return ASN1.readInt(br, readNum); }; @@ -196,8 +198,8 @@ ASN1.readExplicitInt = function readExplicitInt(br, type, readNum) { */ ASN1.readBitstr = function readBitstr(br) { - let tag = ASN1.implicit(br, 0x03); - let str = br.readBytes(tag.size); + const tag = ASN1.implicit(br, 0x03); + const str = br.readBytes(tag.size); return ASN1.alignBitstr(str); }; @@ -208,13 +210,13 @@ ASN1.readBitstr = function readBitstr(br) { */ ASN1.readString = function readString(br) { - let tag = ASN1.readTag(br); - let str; + const tag = ASN1.readTag(br); switch (tag.type) { - case 0x03: // bitstr - str = br.readBytes(tag.size); - return ASN1.alignBitstr(str); + case 0x03: { // bitstr + const str = br.readBytes(tag.size); + return ASN1.alignBitstr(str).toString('utf8'); + } // Note: // Fuck all these. case 0x04: // octstr @@ -229,10 +231,12 @@ ASN1.readString = function readString(br) { case 0x1b: // genstr case 0x1c: // unistr case 0x1d: // charstr - case 0x1e: // bmpstr + case 0x1e: { // bmpstr return br.readString('utf8', tag.size); - default: + } + default: { throw new Error(`Unexpected tag: ${tag.type}.`); + } } }; @@ -243,19 +247,18 @@ ASN1.readString = function readString(br) { */ ASN1.alignBitstr = function alignBitstr(data) { - let padding = data[0]; - let bits = (data.length - 1) * 8 - padding; - let buf = data.slice(1); - let shift = 8 - (bits % 8); - let i, out; + const padding = data[0]; + const bits = (data.length - 1) * 8 - padding; + const buf = data.slice(1); + const shift = 8 - (bits % 8); if (shift === 8 || buf.length === 0) return buf; - out = Buffer.allocUnsafe(buf.length); + const out = Buffer.allocUnsafe(buf.length); out[0] = buf[0] >>> shift; - for (i = 1; i < buf.length; i++) { + for (let i = 1; i < buf.length; i++) { out[i] = buf[i - 1] << (8 - shift); out[i] |= buf[i] >>> shift; } @@ -270,7 +273,7 @@ ASN1.alignBitstr = function alignBitstr(data) { */ ASN1.readCert = function readCert(br) { - let buf = br; + const buf = br; buf.start(); @@ -291,7 +294,7 @@ ASN1.readCert = function readCert(br) { */ ASN1.readTBS = function readTBS(br) { - let buf = br; + const buf = br; buf.start(); @@ -330,7 +333,7 @@ ASN1.readPubkey = function readPubkey(br) { */ ASN1.readName = function readName(br) { - let values = []; + const values = []; br = ASN1.seq(br); @@ -367,8 +370,8 @@ ASN1.readValidity = function readValidity(br) { */ ASN1.readTime = function readTime(br) { - let tag = ASN1.readTag(br); - let str = br.readString('ascii', tag.size); + const tag = ASN1.readTag(br); + const str = br.readString('ascii', tag.size); let year, mon, day, hour, min, sec; switch (tag.type) { @@ -406,8 +409,8 @@ ASN1.readTime = function readTime(br) { */ ASN1.readOID = function readOID(br) { - let tag = ASN1.implicit(br, 0x06); - let data = br.readBytes(tag.size); + const tag = ASN1.implicit(br, 0x06); + const data = br.readBytes(tag.size); return ASN1.formatOID(data); }; @@ -418,11 +421,10 @@ ASN1.readOID = function readOID(br) { */ ASN1.formatOID = function formatOID(data) { - let br = new BufferReader(data); - let ids = []; + const br = new BufferReader(data); + const ids = []; let ident = 0; let subident = 0; - let result, first, second; while (br.left()) { subident = br.readU8(); @@ -437,9 +439,9 @@ ASN1.formatOID = function formatOID(data) { if (subident & 0x80) ids.push(ident); - first = (ids[0] / 40) | 0; - second = ids[0] % 40; - result = [first, second].concat(ids.slice(1)); + const first = (ids[0] / 40) | 0; + const second = ids[0] % 40; + const result = [first, second].concat(ids.slice(1)); return result.join('.'); }; @@ -452,14 +454,13 @@ ASN1.formatOID = function formatOID(data) { ASN1.readAlgIdent = function readAlgIdent(br) { let params = null; - let alg, tag; br = ASN1.seq(br); - alg = ASN1.readOID(br); + const alg = ASN1.readOID(br); if (br.left() > 0) { - tag = ASN1.readTag(br); + const tag = ASN1.readTag(br); params = br.readBytes(tag.size); if (params.length === 0) params = null; diff --git a/lib/utils/asyncemitter.js b/lib/utils/asyncemitter.js index 3e6c18f3f..3f1c32780 100644 --- a/lib/utils/asyncemitter.js +++ b/lib/utils/asyncemitter.js @@ -116,18 +116,17 @@ AsyncEmitter.prototype._unshift = function _unshift(type, handler, once) { */ AsyncEmitter.prototype.removeListener = function removeListener(type, handler) { - let i, listeners, listener; - let index = -1; - assert(typeof type === 'string', '`type` must be a string.'); - listeners = this._events[type]; + const listeners = this._events[type]; if (!listeners) return; - for (i = 0; i < listeners.length; i++) { - listener = listeners[i]; + let index = -1; + + for (let i = 0; i < listeners.length; i++) { + const listener = listeners[i]; if (listener.handler === handler) { index = i; break; @@ -153,7 +152,7 @@ AsyncEmitter.prototype.removeListener = function removeListener(type, handler) { AsyncEmitter.prototype.setMaxListeners = function setMaxListeners(max) { assert(typeof max === 'number', '`max` must be a number.'); assert(max >= 0, '`max` must be non-negative.'); - assert(max % 1 === 0, '`max` must be an integer.'); + assert(Number.isSafeInteger(max), '`max` must be an integer.'); }; /** @@ -179,17 +178,16 @@ AsyncEmitter.prototype.removeAllListeners = function removeAllListeners(type) { */ AsyncEmitter.prototype.listeners = function listeners(type) { - let listeners, listener; - let result = []; - assert(typeof type === 'string', '`type` must be a string.'); - listeners = this._events[type]; + const listeners = this._events[type]; if (!listeners) - return result; + return []; + + const result = []; - for (listener of listeners) + for (const listener of listeners) result.push(listener.handler); return result; @@ -201,11 +199,9 @@ AsyncEmitter.prototype.listeners = function listeners(type) { */ AsyncEmitter.prototype.listenerCount = function listenerCount(type) { - let listeners; - assert(typeof type === 'string', '`type` must be a string.'); - listeners = this._events[type]; + const listeners = this._events[type]; if (!listeners) return 0; @@ -222,29 +218,29 @@ AsyncEmitter.prototype.listenerCount = function listenerCount(type) { */ AsyncEmitter.prototype.emit = function emit(type) { - let i, j, listeners, error, err, args, listener, handler; - assert(typeof type === 'string', '`type` must be a string.'); - listeners = this._events[type]; + const listeners = this._events[type]; if (!listeners || listeners.length === 0) { if (type === 'error') { - error = arguments[1]; + const error = arguments[1]; if (error instanceof Error) throw error; - err = new Error(`Uncaught, unspecified "error" event. (${error})`); + const err = new Error(`Uncaught, unspecified "error" event. (${error})`); err.context = error; throw err; } return; } - for (i = 0; i < listeners.length; i++) { - listener = listeners[i]; - handler = listener.handler; + let args; + + for (let i = 0; i < listeners.length; i++) { + const listener = listeners[i]; + const handler = listener.handler; if (listener.once) { listeners.splice(i, 1); @@ -267,7 +263,7 @@ AsyncEmitter.prototype.emit = function emit(type) { default: if (!args) { args = new Array(arguments.length - 1); - for (j = 1; j < arguments.length; j++) + for (let j = 1; j < arguments.length; j++) args[j - 1] = arguments[j]; } handler.apply(null, args); @@ -285,29 +281,29 @@ AsyncEmitter.prototype.emit = function emit(type) { */ AsyncEmitter.prototype.fire = async function fire(type) { - let i, j, listeners, error, err, args, listener, handler; - assert(typeof type === 'string', '`type` must be a string.'); - listeners = this._events[type]; + const listeners = this._events[type]; if (!listeners || listeners.length === 0) { if (type === 'error') { - error = arguments[1]; + const error = arguments[1]; if (error instanceof Error) throw error; - err = new Error(`Uncaught, unspecified "error" event. (${error})`); + const err = new Error(`Uncaught, unspecified "error" event. (${error})`); err.context = error; throw err; } return; } - for (i = 0; i < listeners.length; i++) { - listener = listeners[i]; - handler = listener.handler; + let args; + + for (let i = 0; i < listeners.length; i++) { + const listener = listeners[i]; + const handler = listener.handler; if (listener.once) { listeners.splice(i, 1); @@ -330,7 +326,7 @@ AsyncEmitter.prototype.fire = async function fire(type) { default: if (!args) { args = new Array(arguments.length - 1); - for (j = 1; j < arguments.length; j++) + for (let j = 1; j < arguments.length; j++) args[j - 1] = arguments[j]; } await handler.apply(null, args); diff --git a/lib/utils/asyncobject.js b/lib/utils/asyncobject.js index e7546180b..3e306f421 100644 --- a/lib/utils/asyncobject.js +++ b/lib/utils/asyncobject.js @@ -8,7 +8,6 @@ const assert = require('assert'); const EventEmitter = require('events'); -const util = require('./util'); const Lock = require('./lock'); /** @@ -34,7 +33,7 @@ function AsyncObject() { this.loaded = false; } -util.inherits(AsyncObject, EventEmitter); +Object.setPrototypeOf(AsyncObject.prototype, EventEmitter.prototype); /** * Open the object (recallable). @@ -43,7 +42,7 @@ util.inherits(AsyncObject, EventEmitter); */ AsyncObject.prototype.open = async function open() { - let unlock = await this._asyncLock.lock(); + const unlock = await this._asyncLock.lock(); try { return await this.__open(); } finally { @@ -58,7 +57,7 @@ AsyncObject.prototype.open = async function open() { * @returns {Promise} */ -AsyncObject.prototype.__open = async function open() { +AsyncObject.prototype.__open = async function __open() { if (this.loaded) return; @@ -87,7 +86,7 @@ AsyncObject.prototype.__open = async function open() { */ AsyncObject.prototype.close = async function close() { - let unlock = await this._asyncLock.lock(); + const unlock = await this._asyncLock.lock(); try { return await this.__close(); } finally { @@ -102,7 +101,7 @@ AsyncObject.prototype.close = async function close() { * @returns {Promise} */ -AsyncObject.prototype.__close = async function close() { +AsyncObject.prototype.__close = async function __close() { if (!this.loaded) return; @@ -190,16 +189,16 @@ AsyncObject.prototype.fire = async function fire() { */ AsyncObject.prototype.fireHook = async function fireHook(type) { - let listeners, args; - assert(typeof type === 'string', '`type` must be a string.'); - listeners = this._hooks[type]; + const listeners = this._hooks[type]; if (!listeners || listeners.length === 0) return; - for (let handler of listeners) { + let args; + + for (const handler of listeners) { switch (arguments.length) { case 1: await handler(); diff --git a/lib/utils/base32.js b/lib/utils/base32.js index b6c41f357..a70f4f92a 100644 --- a/lib/utils/base32.js +++ b/lib/utils/base32.js @@ -27,10 +27,9 @@ exports.encode = function encode(data) { let str = ''; let mode = 0; let left = 0; - let i, ch; - for (i = 0; i < data.length; i++) { - ch = data[i]; + for (let i = 0; i < data.length; i++) { + const ch = data[i]; switch (mode) { case 0: str += base32[ch >>> 3]; @@ -64,7 +63,7 @@ exports.encode = function encode(data) { if (mode > 0) { str += base32[left]; - for (i = 0; i < padding[mode]; i++) + for (let i = 0; i < padding[mode]; i++) str += '='; } @@ -78,14 +77,14 @@ exports.encode = function encode(data) { */ exports.decode = function decode(str) { - let data = Buffer.allocUnsafe(str.length * 5 / 8 | 0); + const data = Buffer.allocUnsafe(str.length * 5 / 8 | 0); let mode = 0; let left = 0; let j = 0; - let i, ch; + let i; for (i = 0; i < str.length; i++) { - ch = unbase32[str[i]]; + const ch = unbase32[str[i]]; if (ch == null) break; diff --git a/lib/utils/base58.js b/lib/utils/base58.js index 235d3690a..5ef9baf2a 100644 --- a/lib/utils/base58.js +++ b/lib/utils/base58.js @@ -37,24 +37,24 @@ for (let i = 0; i < base58.length; i++) exports.encode = function encode(data) { let zeroes = 0; - let length = 0; - let str = ''; - let i, b58, carry, j, k; + let i = 0; - for (i = 0; i < data.length; i++) { + for (; i < data.length; i++) { if (data[i] !== 0) break; zeroes++; } - b58 = Buffer.allocUnsafe(((data.length * 138 / 100) | 0) + 1); + const b58 = Buffer.allocUnsafe(((data.length * 138 / 100) | 0) + 1); b58.fill(0); + let length = 0; + for (; i < data.length; i++) { - carry = data[i]; - j = 0; + let carry = data[i]; + let j = 0; - for (k = b58.length - 1; k >= 0; k--, j++) { + for (let k = b58.length - 1; k >= 0; k--, j++) { if (carry === 0 && j >= length) break; carry += 256 * b58[k]; @@ -70,7 +70,9 @@ exports.encode = function encode(data) { while (i < b58.length && b58[i] === 0) i++; - for (j = 0; j < zeroes; j++) + let str = ''; + + for (let j = 0; j < zeroes; j++) str += '1'; for (; i < b58.length; i++) @@ -92,28 +94,29 @@ if (native) exports.decode = function decode(str) { let zeroes = 0; - let length = 0; let i = 0; - let b256, ch, carry, j, k, out; - for (i = 0; i < str.length; i++) { + for (; i < str.length; i++) { if (str[i] !== '1') break; zeroes++; } - b256 = Buffer.allocUnsafe(((str.length * 733) / 1000 | 0) + 1); + const b256 = Buffer.allocUnsafe(((str.length * 733) / 1000 | 0) + 1); b256.fill(0); + let length = 0; + for (; i < str.length; i++) { - ch = unbase58[str[i]]; + const ch = unbase58[str[i]]; + if (ch == null) throw new Error('Non-base58 character.'); - carry = ch; - j = 0; + let carry = ch; + let j = 0; - for (k = b256.length - 1; k >= 0; k--, j++) { + for (let k = b256.length - 1; k >= 0; k--, j++) { if (carry === 0 && j >= length) break; carry += 58 * b256[k]; @@ -129,8 +132,9 @@ exports.decode = function decode(str) { while (i < b256.length && b256[i] === 0) i++; - out = Buffer.allocUnsafe(zeroes + (b256.length - i)); + const out = Buffer.allocUnsafe(zeroes + (b256.length - i)); + let j; for (j = 0; j < zeroes; j++) out[j] = 0; diff --git a/lib/utils/bech32.js b/lib/utils/bech32.js index f827de096..b4d08df69 100644 --- a/lib/utils/bech32.js +++ b/lib/utils/bech32.js @@ -56,7 +56,7 @@ const TABLE = [ */ function polymod(pre) { - let b = pre >>> 25; + const b = pre >>> 25; return ((pre & 0x1ffffff) << 5) ^ (-((b >> 0) & 1) & 0x3b6a57b2) ^ (-((b >> 1) & 1) & 0x26508e6d) @@ -74,12 +74,11 @@ function polymod(pre) { */ function serialize(hrp, data) { - let str = ''; let chk = 1; - let i, ch; + let i; for (i = 0; i < hrp.length; i++) { - ch = hrp.charCodeAt(i); + const ch = hrp.charCodeAt(i); if ((ch >> 5) === 0) throw new Error('Invalid bech32 character.'); @@ -92,16 +91,18 @@ function serialize(hrp, data) { chk = polymod(chk); - for (i = 0; i < hrp.length; i++) { - ch = hrp.charCodeAt(i); + let str = ''; + + for (let i = 0; i < hrp.length; i++) { + const ch = hrp.charCodeAt(i); chk = polymod(chk) ^ (ch & 0x1f); str += hrp[i]; } str += '1'; - for (i = 0; i < data.length; i++) { - ch = data[i]; + for (let i = 0; i < data.length; i++) { + const ch = data[i]; if ((ch >> 5) !== 0) throw new Error('Invalid bech32 value.'); @@ -110,12 +111,12 @@ function serialize(hrp, data) { str += CHARSET[ch]; } - for (i = 0; i < 6; i++) + for (let i = 0; i < 6; i++) chk = polymod(chk); chk ^= 1; - for (i = 0; i < 6; i++) + for (let i = 0; i < 6; i++) str += CHARSET[(chk >>> ((5 - i) * 5)) & 0x1f]; return str; @@ -128,12 +129,7 @@ function serialize(hrp, data) { */ function deserialize(str) { - let chk = 1; - let lower = false; - let upper = false; - let hrp = ''; let dlen = 0; - let i, hlen, ch, v, data; if (str.length < 8 || str.length > 90) throw new Error('Invalid bech32 string length.'); @@ -141,16 +137,22 @@ function deserialize(str) { while (dlen < str.length && str[(str.length - 1) - dlen] !== '1') dlen++; - hlen = str.length - (1 + dlen); + const hlen = str.length - (1 + dlen); if (hlen < 1 || dlen < 6) throw new Error('Invalid bech32 data length.'); dlen -= 6; - data = Buffer.allocUnsafe(dlen); - for (i = 0; i < hlen; i++) { - ch = str.charCodeAt(i); + const data = Buffer.allocUnsafe(dlen); + + let chk = 1; + let lower = false; + let upper = false; + let hrp = ''; + + for (let i = 0; i < hlen; i++) { + let ch = str.charCodeAt(i); if (ch < 0x21 || ch > 0x7e) throw new Error('Invalid bech32 character.'); @@ -168,14 +170,15 @@ function deserialize(str) { chk = polymod(chk); + let i; for (i = 0; i < hlen; i++) chk = polymod(chk) ^ (str.charCodeAt(i) & 0x1f); i++; while (i < str.length) { - ch = str.charCodeAt(i); - v = (ch & 0x80) ? -1 : TABLE[ch]; + const ch = str.charCodeAt(i); + const v = (ch & 0x80) ? -1 : TABLE[ch]; if (ch >= 0x61 && ch <= 0x7a) lower = true; @@ -215,17 +218,16 @@ function deserialize(str) { */ function convert(data, output, frombits, tobits, pad, off) { + const maxv = (1 << tobits) - 1; let acc = 0; let bits = 0; - let maxv = (1 << tobits) - 1; let j = 0; - let i, value; if (pad !== -1) output[j++] = pad; - for (i = off; i < data.length; i++) { - value = data[i]; + for (let i = off; i < data.length; i++) { + const value = data[i]; if ((value >> frombits) !== 0) throw new Error('Invalid bech32 bits.'); @@ -259,8 +261,7 @@ function convert(data, output, frombits, tobits, pad, off) { */ function encode(hrp, version, hash) { - let output = POOL65; - let data; + const output = POOL65; if (version < 0 || version > 16) throw new Error('Invalid bech32 version.'); @@ -268,7 +269,7 @@ function encode(hrp, version, hash) { if (hash.length < 2 || hash.length > 40) throw new Error('Invalid bech32 data length.'); - data = convert(hash, output, 8, 5, version, 0); + const data = convert(hash, output, 8, 5, version, 0); return serialize(hrp, data); } @@ -283,8 +284,7 @@ if (native) */ function decode(str) { - let [hrp, data] = deserialize(str); - let version, hash, output; + const [hrp, data] = deserialize(str); if (data.length === 0 || data.length > 65) throw new Error('Invalid bech32 data length.'); @@ -292,9 +292,9 @@ function decode(str) { if (data[0] > 16) throw new Error('Invalid bech32 version.'); - version = data[0]; - output = data; - hash = convert(data, output, 5, 8, -1, 1); + const version = data[0]; + const output = data; + const hash = convert(data, output, 5, 8, -1, 1); if (hash.length < 2 || hash.length > 40) throw new Error('Invalid bech32 data length.'); diff --git a/lib/utils/bloom.js b/lib/utils/bloom.js index fe7a6181b..1452bc596 100644 --- a/lib/utils/bloom.js +++ b/lib/utils/bloom.js @@ -117,15 +117,13 @@ Bloom.flagsByVal = { */ Bloom.prototype.fromOptions = function fromOptions(size, n, tweak, update) { - let filter; - assert(typeof size === 'number', '`size` must be a number.'); assert(size > 0, '`size` must be greater than zero.'); - assert(size % 1 === 0, '`size` must be an integer.'); + assert(Number.isSafeInteger(size), '`size` must be an integer.'); size -= size % 8; - filter = Buffer.allocUnsafe(size / 8); + const filter = Buffer.allocUnsafe(size / 8); filter.fill(0); if (tweak == null || tweak === -1) @@ -141,9 +139,9 @@ Bloom.prototype.fromOptions = function fromOptions(size, n, tweak, update) { assert(size > 0, '`size` must be greater than zero.'); assert(n > 0, '`n` must be greater than zero.'); - assert(n % 1 === 0, '`n` must be an integer.'); + assert(Number.isSafeInteger(n), '`n` must be an integer.'); assert(typeof tweak === 'number', '`tweak` must be a number.'); - assert(tweak % 1 === 0, '`tweak` must be an integer.'); + assert(Number.isSafeInteger(tweak), '`tweak` must be an integer.'); assert(Bloom.flagsByVal[update], 'Unknown update flag.'); this.filter = filter; @@ -198,7 +196,7 @@ Bloom.prototype.add = function add(val, enc) { val = Buffer.from(val, enc); for (let i = 0; i < this.n; i++) { - let index = this.hash(val, i); + const index = this.hash(val, i); this.filter[index >>> 3] |= 1 << (7 & index); } }; @@ -215,7 +213,7 @@ Bloom.prototype.test = function test(val, enc) { val = Buffer.from(val, enc); for (let i = 0; i < this.n; i++) { - let index = this.hash(val, i); + const index = this.hash(val, i); if ((this.filter[index >>> 3] & (1 << (7 & index))) === 0) return false; } @@ -238,7 +236,7 @@ Bloom.prototype.added = function added(val, enc) { val = Buffer.from(val, enc); for (let i = 0; i < this.n; i++) { - let index = this.hash(val, i); + const index = this.hash(val, i); if (!ret && (this.filter[index >>> 3] & (1 << (7 & index))) === 0) ret = true; this.filter[index >>> 3] |= 1 << (7 & index); @@ -258,23 +256,21 @@ Bloom.prototype.added = function added(val, enc) { */ Bloom.fromRate = function fromRate(items, rate, update) { - let size, n; - assert(typeof items === 'number', '`items` must be a number.'); assert(items > 0, '`items` must be greater than zero.'); - assert(items % 1 === 0, '`items` must be an integer.'); + assert(Number.isSafeInteger(items), '`items` must be an integer.'); assert(typeof rate === 'number', '`rate` must be a number.'); assert(rate >= 0 && rate <= 1, '`rate` must be between 0.0 and 1.0.'); - size = (-1 / LN2SQUARED * items * Math.log(rate)) | 0; - size = Math.max(8, size); + const bits = (-1 / LN2SQUARED * items * Math.log(rate)) | 0; + const size = Math.max(8, bits); if (update !== -1) { assert(size <= Bloom.MAX_BLOOM_FILTER_SIZE * 8, 'Bloom filter size violates policy limits!'); } - n = Math.max(1, (size / items * LN2) | 0); + const n = Math.max(1, (size / items * LN2) | 0); if (update !== -1) { assert(n <= Bloom.MAX_HASH_FUNCS, @@ -327,7 +323,7 @@ Bloom.prototype.toWriter = function toWriter(bw) { */ Bloom.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; diff --git a/lib/utils/co.js b/lib/utils/co.js index a3ef99cc6..20b24e1d8 100644 --- a/lib/utils/co.js +++ b/lib/utils/co.js @@ -21,7 +21,7 @@ const assert = require('assert'); function exec(gen) { return new Promise((resolve, reject) => { - let step = (value, rejection) => { + const step = (value, rejection) => { let next; try { @@ -44,14 +44,15 @@ function exec(gen) { return; } + // eslint-disable-next-line no-use-before-define next.value.then(succeed, fail); }; - let succeed = (value) => { + const succeed = (value) => { step(value, false); }; - let fail = (value) => { + const fail = (value) => { step(value, true); }; @@ -68,7 +69,7 @@ function exec(gen) { */ function spawn(generator, self) { - let gen = generator.call(self); + const gen = generator.call(self); return exec(gen); } @@ -82,7 +83,7 @@ function spawn(generator, self) { function co(generator) { return function() { - let gen = generator.apply(this, arguments); + const gen = generator.apply(this, arguments); return exec(gen); }; } @@ -103,7 +104,7 @@ function isPromise(obj) { */ function wait() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise(resolve => setImmediate(resolve)); }; /** @@ -113,7 +114,7 @@ function wait() { */ function timeout(time) { - return new Promise((resolve) => setTimeout(resolve, time)); + return new Promise(resolve => setTimeout(resolve, time)); } /** @@ -161,14 +162,12 @@ function promisify(func) { function callbackify(func) { return function(...args) { - let callback; - if (args.length === 0 || typeof args[args.length - 1] !== 'function') { throw new Error(`${func.name || 'Function'} requires a callback.`); } - callback = args.pop(); + const callback = args.pop(); func.call(this, ...args).then((value) => { setImmediate(() => callback(null, value)); @@ -187,9 +186,9 @@ function callbackify(func) { */ async function every(jobs) { - let result = await Promise.all(jobs); + const result = await Promise.all(jobs); - for (let item of result) { + for (const item of result) { if (!item) return false; } @@ -207,12 +206,12 @@ async function every(jobs) { */ function startInterval(func, time, self) { - let ctx = { + const ctx = { timer: null, stopped: false }; - let cb = async () => { + const cb = async () => { assert(ctx.timer != null); ctx.timer = null; diff --git a/lib/utils/encoding.js b/lib/utils/encoding.js index 2176f8081..87253d2c0 100644 --- a/lib/utils/encoding.js +++ b/lib/utils/encoding.js @@ -11,7 +11,8 @@ * @module utils/encoding */ -const BN = require('bn.js'); +const {U64, I64} = require('./int64'); +const UINT128_MAX = U64.UINT64_MAX.shrn(7); const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER; const encoding = exports; @@ -254,7 +255,7 @@ encoding.readU53BE = function readU53BE(data, off) { * @throws on num > MAX_SAFE_INTEGER */ -encoding._read64 = function _read64(data, off, force53, be) { +encoding._readI64 = function _readI64(data, off, force53, be) { let hi, lo; if (be) { @@ -293,8 +294,8 @@ encoding._read64 = function _read64(data, off, force53, be) { * @throws on num > MAX_SAFE_INTEGER */ -encoding.read64 = function read64(data, off) { - return encoding._read64(data, off, false, false); +encoding.readI64 = function readI64(data, off) { + return encoding._readI64(data, off, false, false); }; /** @@ -305,8 +306,8 @@ encoding.read64 = function read64(data, off) { * @throws on num > MAX_SAFE_INTEGER */ -encoding.read64BE = function read64BE(data, off) { - return encoding._read64(data, off, false, true); +encoding.readI64BE = function readI64BE(data, off) { + return encoding._readI64(data, off, false, true); }; /** @@ -317,8 +318,8 @@ encoding.read64BE = function read64BE(data, off) { * @throws on num > MAX_SAFE_INTEGER */ -encoding.read53 = function read53(data, off) { - return encoding._read64(data, off, true, false); +encoding.readI53 = function readI53(data, off) { + return encoding._readI64(data, off, true, false); }; /** @@ -329,8 +330,8 @@ encoding.read53 = function read53(data, off) { * @throws on num > MAX_SAFE_INTEGER */ -encoding.read53BE = function read53BE(data, off) { - return encoding._read64(data, off, true, true); +encoding.readI53BE = function readI53BE(data, off) { + return encoding._readI64(data, off, true, true); }; /** @@ -344,21 +345,20 @@ encoding.read53BE = function read53BE(data, off) { * @throws on num > MAX_SAFE_INTEGER */ -encoding._write64 = function _write64(dst, num, off, be) { - let negative = num < 0; - let hi, lo; +encoding._writeI64 = function _writeI64(dst, num, off, be) { + const neg = num < 0; - if (negative) { + if (neg) { num = -num; num -= 1; } enforce(num <= MAX_SAFE_INTEGER, off, 'Number exceeds 2^53-1'); - hi = (num * (1 / 0x100000000)) | 0; - lo = num | 0; + let hi = (num * (1 / 0x100000000)) | 0; + let lo = num | 0; - if (negative) { + if (neg) { hi = ~hi; lo = ~lo; } @@ -398,7 +398,7 @@ encoding._write64 = function _write64(dst, num, off, be) { */ encoding.writeU64 = function writeU64(dst, num, off) { - return encoding._write64(dst, num, off, false); + return encoding._writeI64(dst, num, off, false); }; /** @@ -411,7 +411,7 @@ encoding.writeU64 = function writeU64(dst, num, off) { */ encoding.writeU64BE = function writeU64BE(dst, num, off) { - return encoding._write64(dst, num, off, true); + return encoding._writeI64(dst, num, off, true); }; /** @@ -423,8 +423,8 @@ encoding.writeU64BE = function writeU64BE(dst, num, off) { * @throws on num > MAX_SAFE_INTEGER */ -encoding.write64 = function write64(dst, num, off) { - return encoding._write64(dst, num, off, false); +encoding.writeI64 = function writeI64(dst, num, off) { + return encoding._writeI64(dst, num, off, false); }; /** @@ -436,141 +436,103 @@ encoding.write64 = function write64(dst, num, off) { * @throws on num > MAX_SAFE_INTEGER */ -encoding.write64BE = function write64BE(dst, num, off) { - return encoding._write64(dst, num, off, true); +encoding.writeI64BE = function writeI64BE(dst, num, off) { + return encoding._writeI64(dst, num, off, true); }; /** * Read uint64le. * @param {Buffer} data * @param {Number} off - * @returns {BN} + * @returns {U64} */ -encoding.readU64BN = function readU64BN(data, off) { - let num = data.slice(off, off + 8); - return new BN(num, 'le'); +encoding.readU64N = function readU64N(data, off) { + return U64.readLE(data, off); }; /** * Read uint64be. * @param {Buffer} data * @param {Number} off - * @returns {BN} + * @returns {U64} */ -encoding.readU64BEBN = function readU64BEBN(data, off) { - let num = data.slice(off, off + 8); - return new BN(num, 'be'); +encoding.readU64BEN = function readU64BEN(data, off) { + return U64.readBE(data, off); }; /** * Read int64le. * @param {Buffer} data * @param {Number} off - * @returns {BN} + * @returns {I64} */ -encoding.read64BN = function read64BN(data, off) { - let num = data.slice(off, off + 8); - - if (num[num.length - 1] & 0x80) - return new BN(num, 'le').notn(64).addn(1).neg(); - - return new BN(num, 'le'); +encoding.readI64N = function readI64N(data, off) { + return I64.readLE(data, off); }; /** * Read int64be. * @param {Buffer} data * @param {Number} off - * @returns {BN} - */ - -encoding.read64BEBN = function read64BEBN(data, off) { - let num = data.slice(off, off + 8); - - if (num[0] & 0x80) - return new BN(num, 'be').notn(64).addn(1).neg(); - - return new BN(num, 'be'); -}; - -/** - * Write int64le. - * @private - * @param {Buffer} dst - * @param {BN} num - * @param {Number} off - * @param {Boolean} be - * @returns {Number} Buffer offset. + * @returns {I64} */ -encoding._write64BN = function _write64BN(dst, num, off, be) { - let bits = num.bitLength(); - - if (bits <= 53) - return encoding._write64(dst, num.toNumber(), off, be); - - if (bits > 64) - num = num.maskn(64); - - if (num.isNeg()) - num = num.neg().inotn(64).iaddn(1); - - num = num.toArray(be ? 'be' : 'le', 8); - - for (let i = 0; i < num.length; i++) - dst[off++] = num[i]; - - return off; +encoding.readI64BEN = function readI64BEN(data, off) { + return I64.readBE(data, off); }; /** * Write uint64le. * @param {Buffer} dst - * @param {BN} num + * @param {U64} num * @param {Number} off * @returns {Number} Buffer offset. */ -encoding.writeU64BN = function writeU64BN(dst, num, off) { - return encoding._write64BN(dst, num, off, false); +encoding.writeU64N = function writeU64N(dst, num, off) { + enforce(!num.sign, off, 'Signed'); + return num.writeLE(dst, off); }; /** * Write uint64be. * @param {Buffer} dst - * @param {BN} num + * @param {U64} num * @param {Number} off * @returns {Number} Buffer offset. */ -encoding.writeU64BEBN = function writeU64BEBN(dst, num, off) { - return encoding._write64BN(dst, num, off, true); +encoding.writeU64BEN = function writeU64BEN(dst, num, off) { + enforce(!num.sign, off, 'Signed'); + return num.writeBE(dst, off); }; /** * Write int64le. * @param {Buffer} dst - * @param {BN} num + * @param {U64} num * @param {Number} off * @returns {Number} Buffer offset. */ -encoding.write64BN = function write64BN(dst, num, off) { - return encoding._write64BN(dst, num, off, false); +encoding.writeI64N = function writeI64N(dst, num, off) { + enforce(num.sign, off, 'Not signed'); + return num.writeLE(dst, off); }; /** * Write int64be. * @param {Buffer} dst - * @param {BN} num + * @param {I64} num * @param {Number} off * @returns {Number} Buffer offset. */ -encoding.write64BEBN = function write64BEBN(dst, num, off) { - return encoding._write64BN(dst, num, off, true); +encoding.writeI64BEN = function writeI64BEN(dst, num, off) { + enforce(num.sign, off, 'Not signed'); + return num.writeBE(dst, off); }; /** @@ -696,54 +658,54 @@ encoding.sizeVarint = function sizeVarint(num) { * @returns {Object} */ -encoding.readVarintBN = function readVarintBN(data, off) { - let result, value, size; - +encoding.readVarintN = function readVarintN(data, off) { assert(off < data.length, off); - switch (data[off]) { - case 0xff: - size = 9; - assert(off + size <= data.length, off); - value = encoding.readU64BN(data, off + 1); - enforce(value.bitLength() > 32, off, 'Non-canonical varint'); - return new Varint(size, value); - default: - result = encoding.readVarint(data, off); - result.value = new BN(result.value); - return result; + if (data[off] === 0xff) { + const size = 9; + assert(off + size <= data.length, off); + const value = encoding.readU64N(data, off + 1); + enforce(value.gtn(0xffffffff), off, 'Non-canonical varint'); + return new Varint(size, value); } + + const result = encoding.readVarint(data, off); + result.value = U64.fromInt(result.value); + return result; }; /** * Write a varint. * @param {Buffer} dst - * @param {BN} num + * @param {U64} num * @param {Number} off * @returns {Number} Buffer offset. */ -encoding.writeVarintBN = function writeVarintBN(dst, num, off) { - if (num.bitLength() > 32) { +encoding.writeVarintN = function writeVarintN(dst, num, off) { + enforce(!num.sign, off, 'Signed'); + + if (num.hi !== 0) { dst[off++] = 0xff; - off = encoding.writeU64BN(dst, num, off); - return off; + return encoding.writeU64N(dst, num, off); } - return encoding.writeVarint(dst, num.toNumber(), off); + return encoding.writeVarint(dst, num.toInt(), off); }; /** * Calculate size of varint. - * @param {BN} num + * @param {U64} num * @returns {Number} size */ -encoding.sizeVarintBN = function sizeVarintBN(num) { - if (num.bitLength() > 32) +encoding.sizeVarintN = function sizeVarintN(num) { + enforce(!num.sign, 0, 'Signed'); + + if (num.hi !== 0) return 9; - return encoding.sizeVarint(num.toNumber()); + return encoding.sizeVarint(num.toInt()); }; /** @@ -756,21 +718,23 @@ encoding.sizeVarintBN = function sizeVarintBN(num) { encoding.readVarint2 = function readVarint2(data, off) { let num = 0; let size = 0; - let ch; for (;;) { assert(off < data.length, off); - ch = data[off++]; + const ch = data[off++]; size++; - enforce(num < 0x3fffffffffff, off, 'Number exceeds 2^53-1'); + // Number.MAX_SAFE_INTEGER >>> 7 + enforce(num <= 0x3fffffffffff - (ch & 0x7f), off, 'Number exceeds 2^53-1'); + // num = (num << 7) | (ch & 0x7f); num = (num * 0x80) + (ch & 0x7f); if ((ch & 0x80) === 0) break; + enforce(num !== MAX_SAFE_INTEGER, off, 'Number exceeds 2^53-1'); num++; } @@ -786,18 +750,20 @@ encoding.readVarint2 = function readVarint2(data, off) { */ encoding.writeVarint2 = function writeVarint2(dst, num, off) { - let tmp = []; + const tmp = []; + let len = 0; for (;;) { tmp[len] = (num & 0x7f) | (len ? 0x80 : 0x00); if (num <= 0x7f) break; + // num = (num >>> 7) - 1; num = ((num - (num % 0x80)) / 0x80) - 1; len++; } - assert(off + len <= dst.length, off); + assert(off + len + 1 <= dst.length, off); do { dst[off++] = tmp[len]; @@ -815,11 +781,10 @@ encoding.writeVarint2 = function writeVarint2(dst, num, off) { encoding.skipVarint2 = function skipVarint2(data, off) { let size = 0; - let ch; for (;;) { assert(off < data.length, off); - ch = data[off++]; + const ch = data[off++]; size++; if ((ch & 0x80) === 0) break; @@ -841,6 +806,7 @@ encoding.sizeVarint2 = function sizeVarint2(num) { size++; if (num <= 0x7f) break; + // num = (num >>> 7) - 1; num = ((num - (num % 0x80)) / 0x80) - 1; } @@ -854,40 +820,25 @@ encoding.sizeVarint2 = function sizeVarint2(num) { * @returns {Object} */ -encoding.readVarint2BN = function readVarint2BN(data, off) { - let num = 0; - let size = 0; - let ch; - - while (num < 0x3fffffffffff) { - assert(off < data.length, off); - - ch = data[off++]; - size++; - - num = (num * 0x80) + (ch & 0x7f); - - if ((ch & 0x80) === 0) - return new Varint(size, new BN(num)); - - num++; - } +encoding.readVarint2N = function readVarint2N(data, off) { + const num = new U64(); - num = new BN(num); + let size = 0; for (;;) { assert(off < data.length, off); - ch = data[off++]; + const ch = data[off++]; size++; - enforce(num.bitLength() <= 64, off, 'Number exceeds 64 bits'); + enforce(num.lte(UINT128_MAX), off, 'Number exceeds 2^64-1'); - num.iushln(7).iaddn(ch & 0x7f); + num.ishln(7).iorn(ch & 0x7f); if ((ch & 0x80) === 0) break; + enforce(!num.eq(U64.UINT64_MAX), off, 'Number exceeds 2^64-1'); num.iaddn(1); } @@ -897,27 +848,32 @@ encoding.readVarint2BN = function readVarint2BN(data, off) { /** * Write a varint (type 2). * @param {Buffer} dst - * @param {BN} num + * @param {U64} num * @param {Number} off * @returns {Number} Buffer offset. */ -encoding.writeVarint2BN = function writeVarint2BN(dst, num, off) { - let tmp = []; - let len = 0; +encoding.writeVarint2N = function writeVarint2N(dst, num, off) { + enforce(!num.sign, off, 'Signed'); - if (num.bitLength() <= 53) - return encoding.writeVarint2(dst, num.toNumber()); + if (num.hi === 0) + return encoding.writeVarint2(dst, num.toInt(), off); + + num = num.clone(); + + const tmp = []; + + let len = 0; for (;;) { - tmp[len] = (num.words[0] & 0x7f) | (len ? 0x80 : 0x00); - if (num.cmpn(0x7f) <= 0) + tmp[len] = num.andln(0x7f) | (len ? 0x80 : 0x00); + if (num.lten(0x7f)) break; - num.iushrn(7).isubn(1); + num.ishrn(7).isubn(1); len++; } - enforce(off + len <= dst.length, off, 'Out of bounds write'); + enforce(off + len + 1 <= dst.length, off, 'Out of bounds write'); do { dst[off++] = tmp[len]; @@ -928,23 +884,25 @@ encoding.writeVarint2BN = function writeVarint2BN(dst, num, off) { /** * Calculate size of varint (type 2). - * @param {BN} num + * @param {U64} num * @returns {Number} size */ -encoding.sizeVarint2BN = function sizeVarint2BN(num) { - let size = 0; +encoding.sizeVarint2N = function sizeVarint2N(num) { + enforce(!num.sign, 0, 'Signed'); - if (num.bitLength() <= 53) - return encoding.sizeVarint(num.toNumber()); + if (num.hi === 0) + return encoding.sizeVarint2(num.toInt()); num = num.clone(); + let size = 0; + for (;;) { size++; - if (num.cmpn(0x7f) <= 0) + if (num.lten(0x7f)) break; - num.iushrn(7).isubn(1); + num.ishrn(7).isubn(1); } return size; @@ -957,7 +915,7 @@ encoding.sizeVarint2BN = function sizeVarint2BN(num) { */ encoding.U8 = function U8(num) { - let data = Buffer.allocUnsafe(1); + const data = Buffer.allocUnsafe(1); data[0] = num >>> 0; return data; }; @@ -969,7 +927,7 @@ encoding.U8 = function U8(num) { */ encoding.U32 = function U32(num) { - let data = Buffer.allocUnsafe(4); + const data = Buffer.allocUnsafe(4); data.writeUInt32LE(num, 0, true); return data; }; @@ -981,7 +939,7 @@ encoding.U32 = function U32(num) { */ encoding.U32BE = function U32BE(num) { - let data = Buffer.allocUnsafe(4); + const data = Buffer.allocUnsafe(4); data.writeUInt32BE(num, 0, true); return data; }; @@ -1013,12 +971,10 @@ encoding.sizeVarlen = function sizeVarlen(len) { */ encoding.sizeVarString = function sizeVarString(str, enc) { - let len; - if (typeof str !== 'string') return encoding.sizeVarBytes(str); - len = Buffer.byteLength(str, enc); + const len = Buffer.byteLength(str, enc); return encoding.sizeVarint(len) + len; }; @@ -1043,7 +999,7 @@ encoding.EncodingError = function EncodingError(offset, reason) { Error.captureStackTrace(this, EncodingError); }; -inherits(encoding.EncodingError, Error); +Object.setPrototypeOf(encoding.EncodingError.prototype, Error.prototype); /* * Helpers @@ -1054,15 +1010,6 @@ function Varint(size, value) { this.value = value; } -function inherits(child, parent) { - child.super_ = parent; - Object.setPrototypeOf(child.prototype, parent.prototype); - Object.defineProperty(child.prototype, 'constructor', { - value: child, - enumerable: false - }); -} - function enforce(value, offset, reason) { if (!value) throw new encoding.EncodingError(offset, reason); diff --git a/lib/utils/enforce.js b/lib/utils/enforce.js new file mode 100644 index 000000000..34b363bce --- /dev/null +++ b/lib/utils/enforce.js @@ -0,0 +1,165 @@ +/*! + * enforce.js - type enforcement for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +'use strict'; + +const util = require('./util'); + +function enforce(value, name, type, func) { + if (!value) { + if (!func) + func = enforce; + + if (name && !type) + throwError(name, func); + + if (!name) + name = 'value'; + + throwError(`'${name}' must be a(n) ${type}.`, func); + } +} + +function throwError(msg, func) { + const error = new TypeError(msg); + if (Error.captureStackTrace && func) + Error.captureStackTrace(error, func); + throw error; +} + +enforce.none = function none(value, name) { + enforce(value == null, name, 'object', none); +}; + +enforce.nul = function nul(value, name) { + enforce(value === null, name, 'object', nul); +}; + +enforce.undef = function undef(value, name) { + enforce(value === undefined, name, 'object', undef); +}; + +enforce.str = function str(value, name) { + enforce(typeof value === 'string', name, 'string', str); +}; + +enforce.bool = function bool(value, name) { + enforce(typeof value === 'boolean', name, 'boolean', bool); +}; + +enforce.num = function num(value, name) { + enforce(util.isNumber(value), name, 'number', num); +}; + +enforce.obj = function obj(v, name) { + enforce(v && typeof v === 'object' && !Array.isArray(v), name, 'object', obj); +}; + +enforce.array = function array(value, name) { + enforce(Array.isArray(value), name, 'object', array); +}; + +enforce.func = function func(value, name) { + enforce(typeof value === 'function', name, 'function', func); +}; + +enforce.error = function error(value, name) { + enforce(value instanceof Error, name, 'object', error); +}; + +enforce.regexp = function regexp(value, name) { + enforce(value && typeof value.exec === 'function' , name, 'object', regexp); +}; + +enforce.buf = function buf(value, name) { + enforce(Buffer.isBuffer(value), name, 'buffer', buf); +}; + +enforce.len = function len(value, length, name) { + if ((typeof value !== 'string' && !value) || value.length !== length) { + if (!name) + name = 'value'; + throwError(`'${name}' must have a length of ${length}.`, len); + } +}; + +enforce.instance = function instance(obj, parent, name) { + if (!(obj instanceof parent)) { + if (!name) + name = 'value'; + throwError(`'${name}' must be an instance of ${parent.name}.`, instance); + } +}; + +enforce.uint = function uint(value, name) { + enforce(util.isUInt(value), name, 'uint', uint); +}; + +enforce.int = function int(value, name) { + enforce(util.isInt(value), name, 'int', int); +}; + +enforce.u8 = function u8(value, name) { + enforce(util.isU8(value), name, 'uint8', u8); +}; + +enforce.u16 = function u16(value, name) { + enforce(util.isU16(value), name, 'uint16', u16); +}; + +enforce.u32 = function u32(value, name) { + enforce(util.isU32(value), name, 'uint32', u32); +}; + +enforce.u64 = function u64(value, name) { + enforce(util.isU64(value), name, 'uint64', u64); +}; + +enforce.i8 = function i8(value, name) { + enforce(util.isI8(value), name, 'int8', i8); +}; + +enforce.i16 = function i16(value, name) { + enforce(util.isI16(value), name, 'int16', i16); +}; + +enforce.i32 = function i32(value, name) { + enforce(util.isI32(value), name, 'int32', i32); +}; + +enforce.i64 = function i64(value, name) { + enforce(util.isI64(value), name, 'int64', i64); +}; + +enforce.ufloat = function ufloat(value, name) { + enforce(util.isUfloat(value), name, 'positive float', ufloat); +}; + +enforce.float = function float(value, name) { + enforce(util.isFloat(value), name, 'float', float); +}; + +enforce.ascii = function ascii(value, name) { + enforce(util.isAscii(value), name, 'ascii string', ascii); +}; + +enforce.hex = function hex(value, name) { + enforce(util.isHex(value), name, 'hex string', hex); +}; + +enforce.hex160 = function hex160(value, name) { + enforce(util.isHex160(value), name, '160 bit hex string', hex160); +}; + +enforce.hex256 = function hex256(value, name) { + enforce(util.isHex256(value), name, '256 bit hex string', hex256); +}; + +enforce.base58 = function base58(value, name) { + enforce(util.isBase58(value), name, 'base58 string', base58); +}; + +module.exports = enforce; diff --git a/lib/utils/fs.js b/lib/utils/fs.js index 0e35f3ecf..28f710675 100644 --- a/lib/utils/fs.js +++ b/lib/utils/fs.js @@ -85,16 +85,16 @@ exports.writeFile = co.promisify(fs.writeFile); exports.writeFileSync = fs.writeFileSync; exports.mkdirpSync = function mkdirpSync(dir, mode) { - let [path, parts] = getParts(dir); - if (mode == null) mode = 0o750; - for (let part of parts) { + let [path, parts] = getParts(dir); + + for (const part of parts) { path += part; try { - let stat = exports.statSync(path); + const stat = exports.statSync(path); if (!stat.isDirectory()) throw new Error('Could not create directory.'); } catch (e) { @@ -109,16 +109,16 @@ exports.mkdirpSync = function mkdirpSync(dir, mode) { }; exports.mkdirp = async function mkdirp(dir, mode) { - let [path, parts] = getParts(dir); - if (mode == null) mode = 0o750; - for (let part of parts) { + let [path, parts] = getParts(dir); + + for (const part of parts) { path += part; try { - let stat = await exports.stat(path); + const stat = await exports.stat(path); if (!stat.isDirectory()) throw new Error('Could not create directory.'); } catch (e) { @@ -133,13 +133,13 @@ exports.mkdirp = async function mkdirp(dir, mode) { }; function getParts(path) { - let root = ''; - let parts; - path = path.replace(/\\/g, '/'); path = path.replace(/(^|\/)\.\//, '$1'); path = path.replace(/\/+\.?$/, ''); - parts = path.split(/\/+/); + + const parts = path.split(/\/+/); + + let root = ''; if (process.platform === 'win32') { if (parts[0].indexOf(':') !== -1) diff --git a/lib/utils/gcs.js b/lib/utils/gcs.js index b11335472..a0881190b 100644 --- a/lib/utils/gcs.js +++ b/lib/utils/gcs.js @@ -7,12 +7,11 @@ 'use strict'; const assert = require('assert'); -const Int64 = require('./int64'); +const {U64} = require('./int64'); const digest = require('../crypto/digest'); -const siphash24 = require('../crypto/siphash'); -const SCRATCH = Buffer.allocUnsafe(64); -const DUMMY = Buffer.allocUnsafe(0); -const EOF = new Int64(-1); +const siphash = require('../crypto/siphash'); +const DUMMY = Buffer.alloc(0); +const EOF = new U64(-1); /** * GCSFilter @@ -23,30 +22,26 @@ const EOF = new Int64(-1); function GCSFilter() { this.n = 0; this.p = 0; - this.m = new Int64(0); + this.m = new U64(0); this.data = DUMMY; } -GCSFilter.prototype.hash = function _hash(enc) { - let hash = digest.hash256(this.data); - return enc === 'hex' ? hash.toString('hex') : hash; +GCSFilter.prototype.hash = function hash(enc) { + const h = digest.hash256(this.data); + return enc === 'hex' ? h.toString('hex') : h; }; GCSFilter.prototype.header = function header(prev) { - let data = SCRATCH; - let hash = this.hash(); - hash.copy(data, 0); - prev.copy(data, 32); - return digest.hash256(data); + return digest.root256(this.hash(), prev); }; GCSFilter.prototype.match = function match(key, data) { - let br = new BitReader(this.data); - let term = siphash(data, key).imod(this.m); - let last = new Int64(0); + const br = new BitReader(this.data); + const term = siphash24(data, key).imod(this.m); + let last = new U64(0); while (last.lt(term)) { - let value = this.readU64(br); + const value = this.readU64(br); if (value === EOF) return false; @@ -63,26 +58,24 @@ GCSFilter.prototype.match = function match(key, data) { }; GCSFilter.prototype.matchAny = function matchAny(key, items) { - let br = new BitReader(this.data); - let last1 = new Int64(0); - let values = []; - let i, last2; - assert(items.length > 0); - for (let item of items) { - let hash = siphash(item, key).imod(this.m); + const br = new BitReader(this.data); + const last1 = new U64(0); + const values = []; + + for (const item of items) { + const hash = siphash24(item, key).imod(this.m); values.push(hash); } values.sort(compare); - last2 = values[0]; - i = 1; + let last2 = values[0]; + let i = 1; for (;;) { - let cmp = last1.cmp(last2); - let value; + const cmp = last1.cmp(last2); if (cmp === 0) break; @@ -96,7 +89,7 @@ GCSFilter.prototype.matchAny = function matchAny(key, items) { return false; } - value = this.readU64(br); + const value = this.readU64(br); if (value === EOF) return false; @@ -118,14 +111,13 @@ GCSFilter.prototype.readU64 = function readU64(br) { }; GCSFilter.prototype._readU64 = function _readU64(br) { - let num = new Int64(0); - let rem; + const num = new U64(0); // Unary while (br.readBit()) num.iaddn(1); - rem = br.readBits64(this.p); + const rem = br.readBits64(this.p); return num.ishln(this.p).ior(rem); }; @@ -135,21 +127,21 @@ GCSFilter.prototype.toBytes = function toBytes() { }; GCSFilter.prototype.toNBytes = function toNBytes() { - let data = Buffer.allocUnsafe(4 + this.data.length); + const data = Buffer.allocUnsafe(4 + this.data.length); data.writeUInt32BE(this.n, 0, true); this.data.copy(data, 4); return data; }; GCSFilter.prototype.toPBytes = function toPBytes() { - let data = Buffer.allocUnsafe(1 + this.data.length); + const data = Buffer.allocUnsafe(1 + this.data.length); data.writeUInt8(this.p, 0, true); this.data.copy(data, 1); return data; }; GCSFilter.prototype.toNPBytes = function toNPBytes() { - let data = Buffer.allocUnsafe(5 + this.data.length); + const data = Buffer.allocUnsafe(5 + this.data.length); data.writeUInt32BE(this.n, 0, true); data.writeUInt8(this.p, 4, true); this.data.copy(data, 5); @@ -162,10 +154,6 @@ GCSFilter.prototype.toRaw = function toRaw() { }; GCSFilter.prototype.fromItems = function fromItems(P, key, items) { - let bw = new BitWriter(); - let last = new Int64(0); - let values = []; - assert(typeof P === 'number' && isFinite(P)); assert(P >= 0 && P <= 32); @@ -178,19 +166,24 @@ GCSFilter.prototype.fromItems = function fromItems(P, key, items) { this.n = items.length; this.p = P; - this.m = Int64(this.n).ishln(this.p); + this.m = U64(this.n).ishln(this.p); - for (let item of items) { + const values = []; + + for (const item of items) { assert(Buffer.isBuffer(item)); - let hash = siphash(item, key).imod(this.m); + const hash = siphash24(item, key).imod(this.m); values.push(hash); } values.sort(compare); - for (let hash of values) { - let rem = hash.sub(last).imaskn(this.p); - let value = hash.sub(last).isub(rem).ishrn(this.p); + const bw = new BitWriter(); + let last = new U64(0); + + for (const hash of values) { + const rem = hash.sub(last).imaskn(this.p); + const value = hash.sub(last).isub(rem).ishrn(this.p); last = hash; @@ -217,44 +210,38 @@ GCSFilter.prototype.fromBytes = function fromBytes(N, P, data) { this.n = N; this.p = P; - this.m = Int64(this.n).ishln(this.p); + this.m = U64(this.n).ishln(this.p); this.data = data; return this; }; GCSFilter.prototype.fromNBytes = function fromNBytes(P, data) { - let N; - assert(typeof P === 'number' && isFinite(P)); assert(Buffer.isBuffer(data)); assert(data.length >= 4); - N = data.readUInt32BE(0, true); + const N = data.readUInt32BE(0, true); return this.fromBytes(N, P, data.slice(4)); }; GCSFilter.prototype.fromPBytes = function fromPBytes(N, data) { - let P; - assert(typeof N === 'number' && isFinite(N)); assert(Buffer.isBuffer(data)); assert(data.length >= 1); - P = data.readUInt8(0, true); + const P = data.readUInt8(0, true); return this.fromBytes(N, P, data.slice(1)); }; GCSFilter.prototype.fromNPBytes = function fromNPBytes(data) { - let N, P; - assert(Buffer.isBuffer(data)); assert(data.length >= 5); - N = data.readUInt32BE(0, true); - P = data.readUInt8(4, true); + const N = data.readUInt32BE(0, true); + const P = data.readUInt8(4, true); return this.fromBytes(N, P, data.slice(5)); }; @@ -264,19 +251,19 @@ GCSFilter.prototype.fromRaw = function fromRaw(data) { }; GCSFilter.prototype.fromBlock = function fromBlock(block) { - let hash = block.hash(); - let key = hash.slice(0, 16); - let items = []; + const hash = block.hash(); + const key = hash.slice(0, 16); + const items = []; for (let i = 0; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; if (i > 0) { - for (let input of tx.inputs) + for (const input of tx.inputs) items.push(input.prevout.toRaw()); } - for (let output of tx.outputs) + for (const output of tx.outputs) getPushes(items, output.script); } @@ -284,17 +271,17 @@ GCSFilter.prototype.fromBlock = function fromBlock(block) { }; GCSFilter.prototype.fromExtended = function fromExtended(block) { - let hash = block.hash(); - let key = hash.slice(0, 16); - let items = []; + const hash = block.hash(); + const key = hash.slice(0, 16); + const items = []; for (let i = 0; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; items.push(tx.hash()); if (i > 0) { - for (let input of tx.inputs) { + for (const input of tx.inputs) { getWitness(items, input.witness); getPushes(items, input.script); } @@ -348,15 +335,13 @@ function BitWriter() { } BitWriter.prototype.writeBit = function writeBit(bit) { - let index; - if (this.remain === 0) { this.stream.push(0); this.remain = 8; } if (bit) { - index = this.stream.length - 1; + const index = this.stream.length - 1; this.stream[index] |= 1 << (this.remain - 1); } @@ -364,14 +349,12 @@ BitWriter.prototype.writeBit = function writeBit(bit) { }; BitWriter.prototype.writeByte = function writeByte(ch) { - let index; - if (this.remain === 0) { this.stream.push(0); this.remain = 8; } - index = this.stream.length - 1; + const index = this.stream.length - 1; this.stream[index] |= (ch >> (8 - this.remain)) & 0xff; this.stream.push(0); @@ -385,14 +368,14 @@ BitWriter.prototype.writeBits = function writeBits(num, count) { num <<= 32 - count; while (count >= 8) { - let ch = num >>> 24; + const ch = num >>> 24; this.writeByte(ch); num <<= 8; count -= 8; } while (count > 0) { - let bit = num >>> 31; + const bit = num >>> 31; this.writeBit(bit); num <<= 1; count -= 1; @@ -412,7 +395,7 @@ BitWriter.prototype.writeBits64 = function writeBits64(num, count) { }; BitWriter.prototype.render = function render() { - let data = Buffer.allocUnsafe(this.stream.length); + const data = Buffer.allocUnsafe(this.stream.length); for (let i = 0; i < this.stream.length; i++) data[i] = this.stream[i]; @@ -451,8 +434,6 @@ BitReader.prototype.readBit = function readBit() { }; BitReader.prototype.readByte = function readByte() { - let ch; - if (this.pos >= this.stream.length) throw new Error('EOF'); @@ -466,12 +447,12 @@ BitReader.prototype.readByte = function readByte() { } if (this.remain === 8) { - ch = this.stream[this.pos]; + const ch = this.stream[this.pos]; this.pos += 1; return ch; } - ch = this.stream[this.pos] & ((1 << this.remain) - 1); + let ch = this.stream[this.pos] & ((1 << this.remain) - 1); ch <<= 8 - this.remain; this.pos += 1; @@ -485,11 +466,11 @@ BitReader.prototype.readByte = function readByte() { }; BitReader.prototype.readBits = function readBits(count) { - let num = 0; - assert(count >= 0); assert(count <= 32); + let num = 0; + while (count >= 8) { num <<= 8; num |= this.readByte(); @@ -505,12 +486,12 @@ BitReader.prototype.readBits = function readBits(count) { return num; }; -BitReader.prototype.readBits64 = function readBits(count) { - let num = new Int64(); - +BitReader.prototype.readBits64 = function readBits64(count) { assert(count >= 0); assert(count <= 64); + const num = new U64(); + if (count > 32) { num.hi = this.readBits(count - 32); num.lo = this.readBits(32); @@ -529,13 +510,13 @@ function compare(a, b) { return a.cmp(b) < 0 ? -1 : 1; } -function siphash(data, key) { - let [hi, lo] = siphash24(data, key); - return new Int64().join(hi, lo); +function siphash24(data, key) { + const [hi, lo] = siphash(data, key); + return U64.fromBits(hi, lo); } function getPushes(items, script) { - for (let op of script.code) { + for (const op of script.code) { if (!op.data || op.data.length === 0) continue; @@ -544,7 +525,7 @@ function getPushes(items, script) { } function getWitness(items, witness) { - for (let item of witness.items) { + for (const item of witness.items) { if (item.length === 0) continue; diff --git a/lib/utils/heap.js b/lib/utils/heap.js index 5a6ef996c..17eef4cd3 100644 --- a/lib/utils/heap.js +++ b/lib/utils/heap.js @@ -31,13 +31,12 @@ function Heap(compare) { */ Heap.prototype.init = function init() { - let n = this.items.length; - let i; + const n = this.items.length; if (n <= 1) return; - for (i = (n / 2 | 0) - 1; i >= 0; i--) + for (let i = (n / 2 | 0) - 1; i >= 0; i--) this.down(i, n); }; @@ -80,12 +79,10 @@ Heap.prototype.insert = function insert(item) { */ Heap.prototype.shift = function shift() { - let n; - if (this.items.length === 0) - return; + return null; - n = this.items.length - 1; + const n = this.items.length - 1; this.swap(0, n); this.down(0, n); @@ -100,15 +97,13 @@ Heap.prototype.shift = function shift() { */ Heap.prototype.remove = function remove(i) { - let n; - if (this.items.length === 0) - return; + return null; - n = this.items.length - 1; + const n = this.items.length - 1; if (i < 0 || i > n) - return; + return null; if (n !== i) { this.swap(i, n); @@ -127,8 +122,8 @@ Heap.prototype.remove = function remove(i) { */ Heap.prototype.swap = function swap(a, b) { - let x = this.items[a]; - let y = this.items[b]; + const x = this.items[a]; + const y = this.items[b]; this.items[a] = y; this.items[b] = x; }; @@ -153,18 +148,16 @@ Heap.prototype.less = function less(i, j) { */ Heap.prototype.down = function down(i, n) { - let j, l, r; - for (;;) { - l = 2 * i + 1; + const l = 2 * i + 1; assert(l >= 0); if (l < 0 || l >= n) break; - j = l; - r = l + 1; + let j = l; + const r = l + 1; if (r < n && !this.less(l, r)) j = r; @@ -184,10 +177,8 @@ Heap.prototype.down = function down(i, n) { */ Heap.prototype.up = function up(i) { - let j; - for (;;) { - j = (i - 1) / 2 | 0; + const j = (i - 1) / 2 | 0; assert(j >= 0); @@ -208,8 +199,8 @@ Heap.prototype.up = function up(i) { */ Heap.prototype.toArray = function toArray() { - let heap = new Heap(); - let result = []; + const heap = new Heap(); + const result = []; heap.compare = this.compare; heap.items = this.items.slice(); @@ -228,7 +219,7 @@ Heap.prototype.toArray = function toArray() { */ Heap.fromArray = function fromArray(compare, items) { - let heap = new Heap(); + const heap = new Heap(); heap.set(compare); heap.items = items; heap.init(); diff --git a/lib/utils/index.js b/lib/utils/index.js index e36f5a181..bac0d298c 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -19,6 +19,7 @@ exports.bech32 = require('./bech32'); exports.Bloom = require('./bloom'); exports.co = require('./co'); exports.encoding = require('./encoding'); +exports.enforce = require('./enforce'); exports.fs = require('./fs'); exports.GCSFilter = require('./gcs'); exports.Heap = require('./heap'); diff --git a/lib/utils/ip.js b/lib/utils/ip.js index 1969f5e19..dc84b9154 100644 --- a/lib/utils/ip.js +++ b/lib/utils/ip.js @@ -9,6 +9,8 @@ * Copyright (c) 2012, Fedor Indutny (MIT License). */ +/* eslint no-unreachable: "off" */ + 'use strict'; const assert = require('assert'); @@ -65,12 +67,10 @@ IP.types = { */ IP.fromHostname = function fromHostname(addr, fallback) { - let parts, host, port, type, hostname, raw; - assert(typeof addr === 'string'); - assert(addr.length > 0, 'Bad address.'); + let host, port; if (addr[0] === '[') { if (addr[addr.length - 1] === ']') { // Case: @@ -81,13 +81,13 @@ IP.fromHostname = function fromHostname(addr, fallback) { // Case: // [::1]:80 addr = addr.slice(1); - parts = addr.split(']:'); + const parts = addr.split(']:'); assert(parts.length === 2, 'Bad IPv6 address.'); host = parts[0]; port = parts[1]; } } else { - parts = addr.split(':'); + const parts = addr.split(':'); switch (parts.length) { case 2: // Cases: @@ -124,13 +124,15 @@ IP.fromHostname = function fromHostname(addr, fallback) { port = fallback || 0; } - type = IP.getStringType(host); + const type = IP.getStringType(host); + let raw; if (type !== IP.types.DNS) { raw = IP.toBuffer(host); host = IP.toString(raw); } + let hostname; if (type === IP.types.IPV6) hostname = `[${host}]:${port}`; else @@ -147,8 +149,6 @@ IP.fromHostname = function fromHostname(addr, fallback) { */ IP.toHostname = function toHostname(host, port) { - let type; - assert(typeof host === 'string'); assert(host.length > 0); assert(typeof port === 'number'); @@ -156,7 +156,7 @@ IP.toHostname = function toHostname(host, port) { assert(!/[\[\]]/.test(host), 'Bad host.'); - type = IP.getStringType(host); + const type = IP.getStringType(host); if (host.indexOf(':') !== -1) assert(type === IP.types.IPV6, 'Bad host.'); @@ -271,10 +271,10 @@ IP.isMapped = function isMapped(raw) { */ IP.toBuffer = function toBuffer(str) { - let raw = Buffer.allocUnsafe(16); - assert(typeof str === 'string'); + const raw = Buffer.allocUnsafe(16); + if (IP.isV4String(str)) { raw.fill(0); raw[10] = 0xff; @@ -283,9 +283,9 @@ IP.toBuffer = function toBuffer(str) { } if (IP.isOnionString(str)) { - let data = TOR_ONION; - data.copy(raw, 0); - data = base32.decode(str.slice(0, -6)); + const prefix = TOR_ONION; + prefix.copy(raw, 0); + const data = base32.decode(str.slice(0, -6)); assert(data.length === 10, 'Invalid onion address.'); data.copy(raw, 6); return raw; @@ -304,7 +304,7 @@ IP.toBuffer = function toBuffer(str) { */ IP.parseV4 = function parseV4(str, raw, offset) { - let parts = str.split('.'); + const parts = str.split('.'); assert(parts.length === 4); @@ -329,18 +329,19 @@ IP.parseV4 = function parseV4(str, raw, offset) { */ IP.parseV6 = function parseV6(str, raw, offset) { - let parts = str.split(':'); + const parts = str.split(':'); let missing = 8 - parts.length; - let start = offset; - let colon = false; assert(parts.length >= 2, 'Not an IPv6 address.'); - for (let word of parts) { + for (const word of parts) { if (IP.isV4String(word)) missing--; } + const start = offset; + let colon = false; + for (let i = 0; i < parts.length; i++) { let word = parts[i]; @@ -386,7 +387,7 @@ IP.parseV6 = function parseV6(str, raw, offset) { } assert(missing === 0, 'IPv6 address has missing sections.'); - assert.equal(offset, start + 16); + assert.strictEqual(offset, start + 16); return raw; }; @@ -410,9 +411,8 @@ IP.toString = function toString(raw) { } if (raw.length === 16) { - let host = ''; - if (IP.isMapped(raw)) { + let host = ''; host += raw[12]; host += '.' + raw[13]; host += '.' + raw[14]; @@ -421,10 +421,12 @@ IP.toString = function toString(raw) { } if (IP.isOnion(raw)) { - host = base32.encode(raw.slice(6)); + const host = base32.encode(raw.slice(6)); return `${host}.onion`; } + let host = ''; + host += raw.readUInt16BE(0, true).toString(16); for (let i = 2; i < 16; i += 2) { @@ -485,7 +487,7 @@ IP.getType = function getType(raw) { if (IP.isOnion(raw)) return IP.types.ONION; - assert(false, 'Unknown type.'); + throw new Error('Unknown type.'); }; /** @@ -857,13 +859,13 @@ IP.getReachability = function getReachability(src, dest) { const IPV6_STRONG = 5; const PRIVATE = 6; - let srcNet = IP.getNetwork(src); - let destNet = IP.getNetwork(dest); - let types = IP.types; - if (!IP.isRoutable(src)) return UNREACHABLE; + const srcNet = IP.getNetwork(src); + const destNet = IP.getNetwork(dest); + const types = IP.types; + switch (destNet) { case types.IPV4: switch (srcNet) { @@ -960,16 +962,7 @@ IP.hasPrefix = function hasPrefix(raw, prefix) { IP.isEqual = function isEqual(a, b) { assert(a.length === 16); assert(b.length === 16); - - if (a.compare) - return a.compare(b) === 0; - - for (let i = 0; i < a.length; i++) { - if (a[i] !== b[i]) - return false; - } - - return true; + return a.equals(b); }; /** @@ -979,17 +972,15 @@ IP.isEqual = function isEqual(a, b) { * @returns {String} */ -IP.getInterfaces = function _getInterfaces(name, family) { - let interfaces = os.networkInterfaces(); - let keys = Object.keys(interfaces); - let result = []; +IP.getInterfaces = function getInterfaces(name, family) { + const interfaces = os.networkInterfaces(); + const result = []; - for (let key of keys) { - let items = interfaces[key]; + for (const key of Object.keys(interfaces)) { + const items = interfaces[key]; - for (let details of items) { - let type = details.family.toLowerCase(); - let raw; + for (const details of items) { + const type = details.family.toLowerCase(); if (family && type !== family) continue; @@ -997,6 +988,7 @@ IP.getInterfaces = function _getInterfaces(name, family) { if (details.internal) continue; + let raw; try { raw = IP.toBuffer(details.address); } catch (e) { diff --git a/lib/utils/list.js b/lib/utils/list.js index b66abf38a..75844e170 100644 --- a/lib/utils/list.js +++ b/lib/utils/list.js @@ -52,10 +52,10 @@ List.prototype.reset = function reset() { */ List.prototype.shift = function shift() { - let item = this.head; + const item = this.head; if (!item) - return; + return null; this.remove(item); @@ -88,10 +88,10 @@ List.prototype.push = function push(item) { */ List.prototype.pop = function pop() { - let item = this.tail; + const item = this.tail; if (!item) - return; + return null; this.remove(item); @@ -209,7 +209,7 @@ List.prototype.replace = function replace(ref, item) { */ List.prototype.slice = function slice(total) { - let items = []; + const items = []; let item, next; if (total == null) @@ -245,7 +245,7 @@ List.prototype.slice = function slice(total) { */ List.prototype.toArray = function toArray() { - let items = []; + const items = []; for (let item = this.head; item; item = item.next) items.push(item); diff --git a/lib/utils/lock.js b/lib/utils/lock.js index 4ecd72f03..8b0e7fa74 100644 --- a/lib/utils/lock.js +++ b/lib/utils/lock.js @@ -27,7 +27,7 @@ function Lock(named) { this.busy = false; this.destroyed = false; - this.map = Object.create(null); + this.map = new Map(); this.current = null; this.unlocker = this.unlock.bind(this); @@ -40,7 +40,7 @@ function Lock(named) { */ Lock.create = function create(named) { - let lock = new Lock(named); + const lock = new Lock(named); return function _lock(arg1, arg2) { return lock.lock(arg1, arg2); }; @@ -59,7 +59,12 @@ Lock.prototype.has = function has(name) { if (this.current === name) return true; - return this.map[name] > 0; + const count = this.map.get(name); + + if (count == null) + return false; + + return count > 0; }; /** @@ -71,7 +76,13 @@ Lock.prototype.has = function has(name) { Lock.prototype.hasPending = function hasPending(name) { assert(this.named, 'Must use named jobs.'); - return this.map[name] > 0; + + const count = this.map.get(name); + + if (count == null) + return false; + + return count > 0; }; /** @@ -105,9 +116,10 @@ Lock.prototype.lock = function lock(arg1, arg2) { if (this.busy) { if (name) { - if (!this.map[name]) - this.map[name] = 0; - this.map[name]++; + let count = this.map.get(name); + if (!count) + count = 0; + this.map.set(name, count + 1); } return new Promise((resolve, reject) => { this.jobs.push(new Job(resolve, reject, name)); @@ -126,8 +138,6 @@ Lock.prototype.lock = function lock(arg1, arg2) { */ Lock.prototype.unlock = function unlock() { - let job; - assert(this.destroyed || this.busy); this.busy = false; @@ -138,12 +148,15 @@ Lock.prototype.unlock = function unlock() { assert(!this.destroyed); - job = this.jobs.shift(); + const job = this.jobs.shift(); if (job.name) { - assert(this.map[job.name] > 0); - if (--this.map[job.name] === 0) - delete this.map[job.name]; + let count = this.map.get(job.name); + assert(count > 0); + if (--count === 0) + this.map.delete(job.name); + else + this.map.set(job.name, count); } this.busy = true; @@ -157,20 +170,18 @@ Lock.prototype.unlock = function unlock() { */ Lock.prototype.destroy = function destroy() { - let jobs; - assert(!this.destroyed, 'Lock is already destroyed.'); this.destroyed = true; - jobs = this.jobs.slice(); + const jobs = this.jobs; this.busy = false; - this.jobs.length = 0; - this.map = Object.create(null); + this.jobs = []; + this.map.clear(); this.current = null; - for (let job of jobs) + for (const job of jobs) job.reject(new Error('Lock was destroyed.')); }; diff --git a/lib/utils/lru.js b/lib/utils/lru.js index 49ef33e19..3f4ec104b 100644 --- a/lib/utils/lru.js +++ b/lib/utils/lru.js @@ -44,10 +44,8 @@ function LRU(capacity, getSize) { */ LRU.prototype._getSize = function _getSize(item) { - let keySize; - if (this.getSize) { - keySize = Math.floor(item.key.length * 1.375); + const keySize = Math.floor(item.key.length * 1.375); return 120 + keySize + this.getSize(item.value); } @@ -60,11 +58,10 @@ LRU.prototype._getSize = function _getSize(item) { */ LRU.prototype._compact = function _compact() { - let item, next; - if (this.size <= this.capacity) return; + let item, next; for (item = this.head; item; item = next) { if (this.size <= this.capacity) break; @@ -115,14 +112,12 @@ LRU.prototype.reset = function reset() { */ LRU.prototype.set = function set(key, value) { - let item; - if (this.capacity === 0) return; - key = key + ''; + key = String(key); - item = this.map.get(key); + let item = this.map.get(key); if (item) { this.size -= this._getSize(item); @@ -153,17 +148,15 @@ LRU.prototype.set = function set(key, value) { */ LRU.prototype.get = function get(key) { - let item; - if (this.capacity === 0) - return; + return null; - key = key + ''; + key = String(key); - item = this.map.get(key); + const item = this.map.get(key); if (!item) - return; + return null; this._removeList(item); this._appendList(item); @@ -177,10 +170,10 @@ LRU.prototype.get = function get(key) { * @returns {Boolean} */ -LRU.prototype.has = function get(key) { +LRU.prototype.has = function has(key) { if (this.capacity === 0) return false; - return this.map.has(key + ''); + return this.map.has(String(key)); }; /** @@ -190,14 +183,12 @@ LRU.prototype.has = function get(key) { */ LRU.prototype.remove = function remove(key) { - let item; - if (this.capacity === 0) - return; + return false; - key = key + ''; + key = String(key); - item = this.map.get(key); + const item = this.map.get(key); if (!item) return false; @@ -218,7 +209,7 @@ LRU.prototype.remove = function remove(key) { * @param {LRUItem} */ -LRU.prototype._prependList = function prependList(item) { +LRU.prototype._prependList = function _prependList(item) { this._insertList(null, item); }; @@ -228,7 +219,7 @@ LRU.prototype._prependList = function prependList(item) { * @param {LRUItem} */ -LRU.prototype._appendList = function appendList(item) { +LRU.prototype._appendList = function _appendList(item) { this._insertList(this.tail, item); }; @@ -239,7 +230,7 @@ LRU.prototype._appendList = function appendList(item) { * @param {LRUItem} item */ -LRU.prototype._insertList = function insertList(ref, item) { +LRU.prototype._insertList = function _insertList(ref, item) { assert(!item.next); assert(!item.prev); @@ -269,7 +260,7 @@ LRU.prototype._insertList = function insertList(ref, item) { * @param {LRUItem} */ -LRU.prototype._removeList = function removeList(item) { +LRU.prototype._removeList = function _removeList(item) { if (item.prev) item.prev.next = item.next; @@ -297,8 +288,8 @@ LRU.prototype._removeList = function removeList(item) { * @returns {String[]} */ -LRU.prototype.keys = function _keys() { - let keys = []; +LRU.prototype.keys = function keys() { + const items = []; for (let item = this.head; item; item = item.next) { if (item === this.head) @@ -307,10 +298,10 @@ LRU.prototype.keys = function _keys() { assert(item === this.head); if (!item.next) assert(item === this.tail); - keys.push(item.key); + items.push(item.key); } - return keys; + return items; }; /** @@ -318,13 +309,13 @@ LRU.prototype.keys = function _keys() { * @returns {String[]} */ -LRU.prototype.values = function _values() { - let values = []; +LRU.prototype.values = function values() { + const items = []; for (let item = this.head; item; item = item.next) - values.push(item.value); + items.push(item.value); - return values; + return items; }; /** @@ -333,7 +324,7 @@ LRU.prototype.values = function _values() { */ LRU.prototype.toArray = function toArray() { - let items = []; + const items = []; for (let item = this.head; item; item = item.next) items.push(item); @@ -477,7 +468,7 @@ LRUBatch.prototype.clear = function clear() { */ LRUBatch.prototype.commit = function commit() { - for (let op of this.ops) { + for (const op of this.ops) { if (op.remove) { this.lru.remove(op.key); continue; diff --git a/lib/utils/mappedlock.js b/lib/utils/mappedlock.js index 05081d14c..a9d7fe975 100644 --- a/lib/utils/mappedlock.js +++ b/lib/utils/mappedlock.js @@ -31,7 +31,7 @@ function MappedLock() { */ MappedLock.create = function create() { - let lock = new MappedLock(); + const lock = new MappedLock(); return function _lock(key, force) { return lock.lock(key, force); }; @@ -103,10 +103,9 @@ MappedLock.prototype.lock = function lock(key, force) { */ MappedLock.prototype.unlock = function unlock(key) { - let self = this; + const self = this; return function unlocker() { - let jobs = self.jobs.get(key); - let job; + const jobs = self.jobs.get(key); assert(self.destroyed || self.busy.has(key)); self.busy.delete(key); @@ -116,7 +115,7 @@ MappedLock.prototype.unlock = function unlock(key) { assert(!self.destroyed); - job = jobs.shift(); + const job = jobs.shift(); assert(job); if (jobs.length === 0) @@ -133,17 +132,17 @@ MappedLock.prototype.unlock = function unlock(key) { */ MappedLock.prototype.destroy = function destroy() { - let map = this.jobs; - assert(!this.destroyed, 'Lock is already destroyed.'); + const map = this.jobs; + this.destroyed = true; this.jobs = new Map(); this.busy = new Map(); - for (let jobs of map.values()) { - for (let job of jobs) + for (const jobs of map.values()) { + for (const job of jobs) job.reject(new Error('Lock was destroyed.')); } }; diff --git a/lib/utils/murmur3.js b/lib/utils/murmur3.js index f9bed6b55..57bda5db9 100644 --- a/lib/utils/murmur3.js +++ b/lib/utils/murmur3.js @@ -18,9 +18,9 @@ const native = require('../native').binding; */ function murmur3(data, seed) { - let tail = data.length - (data.length % 4); - let c1 = 0xcc9e2d51; - let c2 = 0x1b873593; + const tail = data.length - (data.length % 4); + const c1 = 0xcc9e2d51; + const c2 = 0x1b873593; let h1 = seed; let k1; @@ -68,18 +68,18 @@ if (native) murmur3 = native.murmur3; function mul32(a, b) { - let alo = a & 0xffff; - let blo = b & 0xffff; - let ahi = a >>> 16; - let bhi = b >>> 16; - let r, lo, hi; + const alo = a & 0xffff; + const blo = b & 0xffff; + const ahi = a >>> 16; + const bhi = b >>> 16; - lo = alo * blo; - hi = (ahi * blo + bhi * alo) & 0xffff; + let lo = alo * blo; + let hi = (ahi * blo + bhi * alo) & 0xffff; hi += lo >>> 16; lo &= 0xffff; - r = (hi << 16) | lo; + + let r = (hi << 16) | lo; if (r < 0) r += 0x100000000; diff --git a/lib/utils/pem.js b/lib/utils/pem.js index 0878e7e6c..2d68372e2 100644 --- a/lib/utils/pem.js +++ b/lib/utils/pem.js @@ -22,41 +22,60 @@ const PEM = exports; */ PEM.parse = function parse(pem) { - let buf = ''; - let chunks = []; - let s, tag, type; + const chunks = []; + let chunk = ''; + let tag; while (pem.length) { - if (s = /^-----BEGIN ([^\-]+)-----/.exec(pem)) { - pem = pem.substring(s[0].length); - tag = s[1]; + let m; + + m = /^-----BEGIN ([^\-]+)-----/.exec(pem); + if (m) { + pem = pem.substring(m[0].length); + tag = m[1]; continue; } - if (s = /^-----END ([^\-]+)-----/.exec(pem)) { - pem = pem.substring(s[0].length); - assert(tag === s[1], 'Tag mismatch.'); - buf = Buffer.from(buf, 'base64'); - type = tag.split(' ')[0].toLowerCase(); - chunks.push({ tag: tag, type: type, data: buf }); - buf = ''; + + m = /^-----END ([^\-]+)-----/.exec(pem); + if (m) { + pem = pem.substring(m[0].length); + + assert(tag === m[1], 'Tag mismatch.'); + + const type = tag.split(' ')[0].toLowerCase(); + const data = Buffer.from(chunk, 'base64'); + + chunks.push({ + tag: tag, + type: type, + data: data + }); + + chunk = ''; tag = null; + continue; } - if (s = /^[a-zA-Z0-9\+=\/]+/.exec(pem)) { - pem = pem.substring(s[0].length); - buf += s[0]; + + m = /^[a-zA-Z0-9\+=\/]+/.exec(pem); + if (m) { + pem = pem.substring(m[0].length); + chunk += m[0]; continue; } - if (s = /^\s+/.exec(pem)) { - pem = pem.substring(s[0].length); + + m = /^\s+/.exec(pem); + if (m) { + pem = pem.substring(m[0].length); continue; } + throw new Error('PEM parse error.'); } assert(chunks.length !== 0, 'PEM parse error.'); assert(!tag, 'Un-ended tag.'); - assert(buf.length === 0, 'Trailing data.'); + assert(chunk.length === 0, 'Trailing data.'); return chunks; }; @@ -69,16 +88,19 @@ PEM.parse = function parse(pem) { */ PEM.decode = function decode(pem) { - let chunks = PEM.parse(pem); - let body = chunks[0]; - let extra = chunks[1]; - let params, alg; + const chunks = PEM.parse(pem); + const body = chunks[0]; + const extra = chunks[1]; + + let params = null; if (extra) { if (extra.tag.indexOf('PARAMETERS') !== -1) params = extra.data; } + let alg = null; + switch (body.type) { case 'dsa': alg = 'dsa'; @@ -121,6 +143,6 @@ PEM.encode = function encode(der, type, suffix) { return '' + `-----BEGIN ${type}-----\n` - + `${pem}` + + pem + `-----END ${type}-----\n`; }; diff --git a/lib/utils/protoreader.js b/lib/utils/protoreader.js index a037c6e36..7a6452ec6 100644 --- a/lib/utils/protoreader.js +++ b/lib/utils/protoreader.js @@ -7,7 +7,6 @@ 'use strict'; const assert = require('assert'); -const util = require('../utils/util'); const BufferReader = require('../utils/reader'); /* @@ -36,61 +35,74 @@ function ProtoReader(data, zeroCopy) { BufferReader.call(this, data, zeroCopy); } -util.inherits(ProtoReader, BufferReader); +Object.setPrototypeOf(ProtoReader.prototype, BufferReader.prototype); -ProtoReader.prototype.readVarint = function _readVarint() { - let {size, value} = readVarint(this.data, this.offset); +ProtoReader.prototype.readVarint = function readVarint() { + const {size, value} = _readVarint(this.data, this.offset); this.offset += size; return value; }; ProtoReader.prototype.readFieldValue = function readFieldValue(tag, opt) { - let field = this.readField(tag, opt); + const field = this.readField(tag, opt); + if (!field) return -1; + assert(field.value != null); + return field.value; }; ProtoReader.prototype.readFieldU64 = function readFieldU64(tag, opt) { - let field = this.readField(tag, opt); + const field = this.readField(tag, opt); + if (!field) return -1; + assert(field.type === wireType.VARINT || field.type === wireType.FIXED64); + return field.value; }; ProtoReader.prototype.readFieldU32 = function readFieldU32(tag, opt) { - let field = this.readField(tag, opt); + const field = this.readField(tag, opt); + if (!field) return -1; + assert(field.type === wireType.VARINT || field.type === wireType.FIXED32); + return field.value; }; ProtoReader.prototype.readFieldBytes = function readFieldBytes(tag, opt) { - let field = this.readField(tag, opt); + const field = this.readField(tag, opt); + if (!field) return null; + assert(field.data); + return field.data; }; ProtoReader.prototype.readFieldString = function readFieldString(tag, opt, enc) { - let field = this.readField(tag, opt); + const field = this.readField(tag, opt); + if (!field) return null; + assert(field.data); + return field.data.toString(enc || 'utf8'); }; ProtoReader.prototype.nextTag = function nextTag() { - let field; - if (this.left() === 0) return -1; - field = this.readField(); + const field = this.readField(); this.seek(-field.size); @@ -98,10 +110,9 @@ ProtoReader.prototype.nextTag = function nextTag() { }; ProtoReader.prototype.readField = function readField(tag, opt) { - let offset = this.offset; - let header = this.readVarint(); - let field = new Field(header); - let inner; + const offset = this.offset; + const header = this.readVarint(); + const field = new Field(header); if (tag != null && field.tag !== tag) { assert(opt, 'Non-optional field not present.'); @@ -122,7 +133,7 @@ ProtoReader.prototype.readField = function readField(tag, opt) { case wireType.START_GROUP: field.group = []; for (;;) { - inner = this.readField(); + const inner = this.readField(); if (inner.type === wireType.END_GROUP) break; field.group.push(inner); @@ -148,7 +159,7 @@ ProtoReader.prototype.readField = function readField(tag, opt) { * Encoding */ -function readVarint(data, off) { +function _readVarint(data, off) { let num = 0; let ch = 0x80; let size = 0; diff --git a/lib/utils/protowriter.js b/lib/utils/protowriter.js index 58de3ec84..5f1a7abdb 100644 --- a/lib/utils/protowriter.js +++ b/lib/utils/protowriter.js @@ -11,7 +11,6 @@ */ const assert = require('assert'); -const util = require('../utils/util'); const BufferWriter = require('../utils/writer'); /* @@ -40,59 +39,65 @@ function ProtoWriter() { BufferWriter.call(this); } -util.inherits(ProtoWriter, BufferWriter); +Object.setPrototypeOf(ProtoWriter.prototype, BufferWriter.prototype); -ProtoWriter.prototype.writeVarint = function _writeVarint(num) { - let size = sizeVarint(num); - let value; +ProtoWriter.prototype.writeVarint = function writeVarint(num) { + const size = sizeVarint(num); // Avoid an extra allocation until // we make bufferwriter more hackable. // More insanity here... switch (size) { - case 6: - value = slipVarint(num); + case 6: { + const value = slipVarint(num); this.writeU32BE(value / 0x10000 | 0); this.writeU16BE(value & 0xffff); break; - case 5: - value = slipVarint(num); + } + case 5: { + const value = slipVarint(num); this.writeU32BE(value / 0x100 | 0); this.writeU8(value & 0xff); break; - case 4: - value = slipVarint(num); + } + case 4: { + const value = slipVarint(num); this.writeU32BE(value); break; - case 3: - value = slipVarint(num); + } + case 3: { + const value = slipVarint(num); this.writeU16BE(value >> 8); this.writeU8(value & 0xff); break; - case 2: - value = slipVarint(num); + } + case 2: { + const value = slipVarint(num); this.writeU16BE(value); break; - case 1: - value = slipVarint(num); + } + case 1: { + const value = slipVarint(num); this.writeU8(value); break; - default: - value = Buffer.allocUnsafe(size); - writeVarint(value, num, 0); + } + default: { + const value = Buffer.allocUnsafe(size); + _writeVarint(value, num, 0); this.writeBytes(value); break; + } } }; ProtoWriter.prototype.writeFieldVarint = function writeFieldVarint(tag, value) { - let header = (tag << 3) | wireType.VARINT; + const header = (tag << 3) | wireType.VARINT; this.writeVarint(header); this.writeVarint(value); }; ProtoWriter.prototype.writeFieldU64 = function writeFieldU64(tag, value) { - assert(util.isSafeInteger(value)); + assert(Number.isSafeInteger(value)); this.writeFieldVarint(tag, value); }; @@ -102,7 +107,7 @@ ProtoWriter.prototype.writeFieldU32 = function writeFieldU32(tag, value) { }; ProtoWriter.prototype.writeFieldBytes = function writeFieldBytes(tag, data) { - let header = (tag << 3) | wireType.DELIMITED; + const header = (tag << 3) | wireType.DELIMITED; this.writeVarint(header); this.writeVarint(data.length); this.writeBytes(data); @@ -118,14 +123,12 @@ ProtoWriter.prototype.writeFieldString = function writeFieldString(tag, data, en * Encoding */ -function writeVarint(data, num, off) { - let ch; - - assert(util.isSafeInteger(num), 'Number exceeds 2^53-1.'); +function _writeVarint(data, num, off) { + assert(Number.isSafeInteger(num), 'Number exceeds 2^53-1.'); do { assert(off < data.length); - ch = num & 0x7f; + let ch = num & 0x7f; num -= num % 0x80; num /= 0x80; if (num !== 0) @@ -138,15 +141,14 @@ function writeVarint(data, num, off) { }; function slipVarint(num) { + assert(Number.isSafeInteger(num), 'Number exceeds 2^53-1.'); + let data = 0; let size = 0; - let ch; - - assert(util.isSafeInteger(num), 'Number exceeds 2^53-1.'); do { assert(size < 7); - ch = num & 0x7f; + let ch = num & 0x7f; num -= num % 0x80; num /= 0x80; if (num !== 0) @@ -160,9 +162,9 @@ function slipVarint(num) { } function sizeVarint(num) { - let size = 0; + assert(Number.isSafeInteger(num), 'Number exceeds 2^53-1.'); - assert(util.isSafeInteger(num), 'Number exceeds 2^53-1.'); + let size = 0; do { num -= num % 0x80; diff --git a/lib/utils/rbt.js b/lib/utils/rbt.js index 9b8c7de66..17454395f 100644 --- a/lib/utils/rbt.js +++ b/lib/utils/rbt.js @@ -48,7 +48,7 @@ RBT.prototype.search = function search(key) { let current = this.root; while (!current.isNull()) { - let cmp = this.compare(key, current.key); + const cmp = this.compare(key, current.key); if (cmp === 0) return current; @@ -58,6 +58,8 @@ RBT.prototype.search = function search(key) { else current = current.right; } + + return null; }; /** @@ -69,10 +71,10 @@ RBT.prototype.search = function search(key) { RBT.prototype.insert = function insert(key, value) { let current = this.root; let left = false; - let parent, node; + let parent; while (!current.isNull()) { - let cmp = this.compare(key, current.key); + const cmp = this.compare(key, current.key); if (this.unique && cmp === 0) { current.key = key; @@ -91,7 +93,7 @@ RBT.prototype.insert = function insert(key, value) { } } - node = new RBTNode(key, value); + const node = new RBTNode(key, value); if (!parent) { this.root = node; @@ -118,13 +120,11 @@ RBT.prototype.insert = function insert(key, value) { */ RBT.prototype.insertFixup = function insertFixup(x) { - let y; - x.color = RED; while (x !== this.root && x.parent.color === RED) { if (x.parent === x.parent.parent.left) { - y = x.parent.parent.right; + const y = x.parent.parent.right; if (!y.isNull() && y.color === RED) { x.parent.color = BLACK; y.color = BLACK; @@ -140,7 +140,7 @@ RBT.prototype.insertFixup = function insertFixup(x) { this.rotr(x.parent.parent); } } else { - y = x.parent.parent.left; + const y = x.parent.parent.left; if (!y.isNull() && y.color === RED) { x.parent.color = BLACK; y.color = BLACK; @@ -171,7 +171,7 @@ RBT.prototype.remove = function remove(key) { let current = this.root; while (!current.isNull()) { - let cmp = this.compare(key, current.key); + const cmp = this.compare(key, current.key); if (cmp === 0) { this.removeNode(current); @@ -183,6 +183,8 @@ RBT.prototype.remove = function remove(key) { else current = current.right; } + + return null; }; /** @@ -193,12 +195,11 @@ RBT.prototype.remove = function remove(key) { RBT.prototype.removeNode = function removeNode(z) { let y = z; - let x; if (!z.left.isNull() && !z.right.isNull()) y = this.successor(z); - x = y.left.isNull() ? y.right : y.left; + const x = y.left.isNull() ? y.right : y.left; x.parent = y.parent; if (y.parent.isNull()) { @@ -226,11 +227,9 @@ RBT.prototype.removeNode = function removeNode(z) { */ RBT.prototype.removeFixup = function removeFixup(x) { - let w; - while (x !== this.root && x.color === BLACK) { if (x === x.parent.left) { - w = x.parent.right; + let w = x.parent.right; if (w.color === RED) { w.color = BLACK; @@ -256,7 +255,7 @@ RBT.prototype.removeFixup = function removeFixup(x) { x = this.root; } } else { - w = x.parent.left; + let w = x.parent.left; if (w.color === RED) { w.color = BLACK; @@ -294,7 +293,8 @@ RBT.prototype.removeFixup = function removeFixup(x) { */ RBT.prototype.rotl = function rotl(x) { - let y = x.right; + const y = x.right; + x.right = y.left; if (!y.left.isNull()) @@ -322,7 +322,8 @@ RBT.prototype.rotl = function rotl(x) { */ RBT.prototype.rotr = function rotr(x) { - let y = x.left; + const y = x.left; + x.left = y.right; if (!y.right.isNull()) @@ -353,8 +354,10 @@ RBT.prototype.rotr = function rotr(x) { RBT.prototype.min = function min(z) { if (z.isNull()) return z; + while (!z.left.isNull()) z = z.left; + return z; }; @@ -368,8 +371,10 @@ RBT.prototype.min = function min(z) { RBT.prototype.max = function max(z) { if (z.isNull()) return z; + while (!z.right.isNull()) z = z.right; + return z; }; @@ -381,18 +386,21 @@ RBT.prototype.max = function max(z) { */ RBT.prototype.successor = function successor(x) { - let y; if (!x.right.isNull()) { x = x.right; + while (!x.left.isNull()) x = x.left; + return x; } - y = x.parent; + + let y = x.parent; while (!y.isNull() && x === y.right) { x = y; y = y.parent; } + return y; }; @@ -404,18 +412,21 @@ RBT.prototype.successor = function successor(x) { */ RBT.prototype.predecessor = function predecessor(x) { - let y; if (!x.left.isNull()) { x = x.left; + while (!x.right.isNull()) x = x.right; + return x; } - y = x.parent; + + let y = x.parent; while (!y.isNull() && x === y.left) { x = y; y = y.parent; } + return y; }; @@ -426,14 +437,18 @@ RBT.prototype.predecessor = function predecessor(x) { */ RBT.prototype.clone = function clone() { + if (this.root.isNull()) + return SENTINEL; + + const stack = []; + let current = this.root; - let stack = []; let left = true; - let parent, copy, snapshot; + let parent, snapshot; for (;;) { if (!current.isNull()) { - copy = current.clone(); + const copy = current.clone(); if (parent) copy.parent = parent; @@ -466,6 +481,8 @@ RBT.prototype.clone = function clone() { current = current.right; } + assert(snapshot); + return snapshot; }; @@ -476,12 +493,10 @@ RBT.prototype.clone = function clone() { */ RBT.prototype.snapshot = function snapshot() { - let node = SENTINEL; - if (this.root.isNull()) - return node; + return SENTINEL; - node = this.root.clone(); + const node = this.root.clone(); copyLeft(node, node.left); copyRight(node, node.right); @@ -507,8 +522,8 @@ RBT.prototype.iterator = function iterator(snapshot) { */ RBT.prototype.range = function range(min, max) { - let iter = this.iterator(); - let items = []; + const iter = this.iterator(); + const items = []; if (min) iter.seekMin(min); @@ -608,13 +623,13 @@ Iterator.prototype.seek = function seek(key) { */ Iterator.prototype.seekMin = function seekMin(key) { + assert(key != null, 'No key passed to seek.'); + let root = this.current; let current = SENTINEL; - assert(key != null, 'No key passed to seek.'); - while (!root.isNull()) { - let cmp = this.tree.compare(root.key, key); + const cmp = this.tree.compare(root.key, key); if (cmp === 0) { current = root; @@ -640,13 +655,13 @@ Iterator.prototype.seekMin = function seekMin(key) { */ Iterator.prototype.seekMax = function seekMax(key) { + assert(key != null, 'No key passed to seek.'); + let root = this.current; let current = SENTINEL; - assert(key != null, 'No key passed to seek.'); - while (!root.isNull()) { - let cmp = this.tree.compare(root.key, key); + const cmp = this.tree.compare(root.key, key); if (cmp === 0) { current = root; @@ -744,7 +759,7 @@ function RBTNode(key, value) { */ RBTNode.prototype.clone = function clone() { - let node = new RBTNode(this.key, this.value); + const node = new RBTNode(this.key, this.value); node.color = this.color; node.parent = this.parent; node.left = this.left; diff --git a/lib/utils/reader.js b/lib/utils/reader.js index 513ff13b7..4323c17b7 100644 --- a/lib/utils/reader.js +++ b/lib/utils/reader.js @@ -10,6 +10,7 @@ const assert = require('assert'); const encoding = require('./encoding'); const digest = require('../crypto/digest'); +const EMPTY_BUFFER = Buffer.alloc(0); /** * An object that allows reading of buffers in a sane manner. @@ -101,15 +102,12 @@ BufferReader.prototype.start = function start() { * @throws on empty stack. */ -BufferReader.prototype.end = function _end() { - let start, end; - +BufferReader.prototype.end = function end() { assert(this.stack.length > 0); - start = this.stack.pop(); - end = this.offset; + const start = this.stack.pop(); - return end - start; + return this.offset - start; }; /** @@ -123,14 +121,12 @@ BufferReader.prototype.end = function _end() { */ BufferReader.prototype.endData = function endData(zeroCopy) { - let ret, start, end, size, data; - assert(this.stack.length > 0); - start = this.stack.pop(); - end = this.offset; - size = end - start; - data = this.data; + const start = this.stack.pop(); + const end = this.offset; + const size = end - start; + const data = this.data; if (size === data.length) return data; @@ -138,7 +134,7 @@ BufferReader.prototype.endData = function endData(zeroCopy) { if (this.zeroCopy || zeroCopy) return data.slice(start, end); - ret = Buffer.allocUnsafe(size); + const ret = Buffer.allocUnsafe(size); data.copy(ret, 0, start, end); return ret; @@ -149,9 +145,9 @@ BufferReader.prototype.endData = function endData(zeroCopy) { */ BufferReader.prototype.destroy = function destroy() { - this.offset = null; - this.stack = null; - this.data = null; + this.data = EMPTY_BUFFER; + this.offset = 0; + this.stack.length = 0; }; /** @@ -160,9 +156,8 @@ BufferReader.prototype.destroy = function destroy() { */ BufferReader.prototype.readU8 = function readU8() { - let ret; this.assert(this.offset + 1 <= this.data.length); - ret = this.data[this.offset]; + const ret = this.data[this.offset]; this.offset += 1; return ret; }; @@ -173,9 +168,8 @@ BufferReader.prototype.readU8 = function readU8() { */ BufferReader.prototype.readU16 = function readU16() { - let ret; this.assert(this.offset + 2 <= this.data.length); - ret = this.data.readUInt16LE(this.offset, true); + const ret = this.data.readUInt16LE(this.offset, true); this.offset += 2; return ret; }; @@ -186,9 +180,8 @@ BufferReader.prototype.readU16 = function readU16() { */ BufferReader.prototype.readU16BE = function readU16BE() { - let ret; this.assert(this.offset + 2 <= this.data.length); - ret = this.data.readUInt16BE(this.offset, true); + const ret = this.data.readUInt16BE(this.offset, true); this.offset += 2; return ret; }; @@ -199,9 +192,8 @@ BufferReader.prototype.readU16BE = function readU16BE() { */ BufferReader.prototype.readU32 = function readU32() { - let ret; this.assert(this.offset + 4 <= this.data.length); - ret = this.data.readUInt32LE(this.offset, true); + const ret = this.data.readUInt32LE(this.offset, true); this.offset += 4; return ret; }; @@ -212,9 +204,8 @@ BufferReader.prototype.readU32 = function readU32() { */ BufferReader.prototype.readU32BE = function readU32BE() { - let ret; this.assert(this.offset + 4 <= this.data.length); - ret = this.data.readUInt32BE(this.offset, true); + const ret = this.data.readUInt32BE(this.offset, true); this.offset += 4; return ret; }; @@ -226,9 +217,8 @@ BufferReader.prototype.readU32BE = function readU32BE() { */ BufferReader.prototype.readU64 = function readU64() { - let ret; this.assert(this.offset + 8 <= this.data.length); - ret = encoding.readU64(this.data, this.offset); + const ret = encoding.readU64(this.data, this.offset); this.offset += 8; return ret; }; @@ -240,9 +230,8 @@ BufferReader.prototype.readU64 = function readU64() { */ BufferReader.prototype.readU64BE = function readU64BE() { - let ret; this.assert(this.offset + 8 <= this.data.length); - ret = encoding.readU64BE(this.data, this.offset); + const ret = encoding.readU64BE(this.data, this.offset); this.offset += 8; return ret; }; @@ -254,9 +243,8 @@ BufferReader.prototype.readU64BE = function readU64BE() { */ BufferReader.prototype.readU53 = function readU53() { - let ret; this.assert(this.offset + 8 <= this.data.length); - ret = encoding.readU53(this.data, this.offset); + const ret = encoding.readU53(this.data, this.offset); this.offset += 8; return ret; }; @@ -268,9 +256,8 @@ BufferReader.prototype.readU53 = function readU53() { */ BufferReader.prototype.readU53BE = function readU53BE() { - let ret; this.assert(this.offset + 8 <= this.data.length); - ret = encoding.readU53BE(this.data, this.offset); + const ret = encoding.readU53BE(this.data, this.offset); this.offset += 8; return ret; }; @@ -280,10 +267,9 @@ BufferReader.prototype.readU53BE = function readU53BE() { * @returns {Number} */ -BufferReader.prototype.read8 = function read8() { - let ret; +BufferReader.prototype.readI8 = function readI8() { this.assert(this.offset + 1 <= this.data.length); - ret = this.data.readInt8(this.offset, true); + const ret = this.data.readInt8(this.offset, true); this.offset += 1; return ret; }; @@ -293,10 +279,9 @@ BufferReader.prototype.read8 = function read8() { * @returns {Number} */ -BufferReader.prototype.read16 = function read16() { - let ret; +BufferReader.prototype.readI16 = function readI16() { this.assert(this.offset + 2 <= this.data.length); - ret = this.data.readInt16LE(this.offset, true); + const ret = this.data.readInt16LE(this.offset, true); this.offset += 2; return ret; }; @@ -306,10 +291,9 @@ BufferReader.prototype.read16 = function read16() { * @returns {Number} */ -BufferReader.prototype.read16BE = function read16BE() { - let ret; +BufferReader.prototype.readI16BE = function readI16BE() { this.assert(this.offset + 2 <= this.data.length); - ret = this.data.readInt16BE(this.offset, true); + const ret = this.data.readInt16BE(this.offset, true); this.offset += 2; return ret; }; @@ -319,10 +303,9 @@ BufferReader.prototype.read16BE = function read16BE() { * @returns {Number} */ -BufferReader.prototype.read32 = function read32() { - let ret; +BufferReader.prototype.readI32 = function readI32() { this.assert(this.offset + 4 <= this.data.length); - ret = this.data.readInt32LE(this.offset, true); + const ret = this.data.readInt32LE(this.offset, true); this.offset += 4; return ret; }; @@ -332,10 +315,9 @@ BufferReader.prototype.read32 = function read32() { * @returns {Number} */ -BufferReader.prototype.read32BE = function read32BE() { - let ret; +BufferReader.prototype.readI32BE = function readI32BE() { this.assert(this.offset + 4 <= this.data.length); - ret = this.data.readInt32BE(this.offset, true); + const ret = this.data.readInt32BE(this.offset, true); this.offset += 4; return ret; }; @@ -346,10 +328,9 @@ BufferReader.prototype.read32BE = function read32BE() { * @throws on num > MAX_SAFE_INTEGER */ -BufferReader.prototype.read64 = function read64() { - let ret; +BufferReader.prototype.readI64 = function readI64() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.read64(this.data, this.offset); + const ret = encoding.readI64(this.data, this.offset); this.offset += 8; return ret; }; @@ -360,10 +341,9 @@ BufferReader.prototype.read64 = function read64() { * @throws on num > MAX_SAFE_INTEGER */ -BufferReader.prototype.read64BE = function read64BE() { - let ret; +BufferReader.prototype.readI64BE = function readI64BE() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.read64BE(this.data, this.offset); + const ret = encoding.readI64BE(this.data, this.offset); this.offset += 8; return ret; }; @@ -374,10 +354,9 @@ BufferReader.prototype.read64BE = function read64BE() { * @returns {Number} */ -BufferReader.prototype.read53 = function read53() { - let ret; +BufferReader.prototype.readI53 = function readI53() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.read53(this.data, this.offset); + const ret = encoding.readI53(this.data, this.offset); this.offset += 8; return ret; }; @@ -388,62 +367,57 @@ BufferReader.prototype.read53 = function read53() { * @returns {Number} */ -BufferReader.prototype.read53BE = function read53BE() { - let ret; +BufferReader.prototype.readI53BE = function readI53BE() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.read53BE(this.data, this.offset); + const ret = encoding.readI53BE(this.data, this.offset); this.offset += 8; return ret; }; /** * Read uint64le. - * @returns {BN} + * @returns {U64} */ -BufferReader.prototype.readU64BN = function readU64BN() { - let ret; +BufferReader.prototype.readU64N = function readU64N() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.readU64BN(this.data, this.offset); + const ret = encoding.readU64N(this.data, this.offset); this.offset += 8; return ret; }; /** * Read uint64be. - * @returns {BN} + * @returns {U64} */ -BufferReader.prototype.readU64BEBN = function readU64BEBN() { - let ret; +BufferReader.prototype.readU64BEN = function readU64BEN() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.readU64BEBN(this.data, this.offset); + const ret = encoding.readU64BEN(this.data, this.offset); this.offset += 8; return ret; }; /** * Read int64le. - * @returns {BN} + * @returns {I64} */ -BufferReader.prototype.read64BN = function read64BN() { - let ret; +BufferReader.prototype.readI64N = function readI64N() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.read64BN(this.data, this.offset); + const ret = encoding.readI64N(this.data, this.offset); this.offset += 8; return ret; }; /** * Read int64be. - * @returns {BN} + * @returns {I64} */ -BufferReader.prototype.read64BEBN = function read64BEBN() { - let ret; +BufferReader.prototype.readI64BEN = function readI64BEN() { this.assert(this.offset + 8 <= this.data.length); - ret = encoding.read64BEBN(this.data, this.offset); + const ret = encoding.readI64BEN(this.data, this.offset); this.offset += 8; return ret; }; @@ -454,9 +428,8 @@ BufferReader.prototype.read64BEBN = function read64BEBN() { */ BufferReader.prototype.readFloat = function readFloat() { - let ret; this.assert(this.offset + 4 <= this.data.length); - ret = this.data.readFloatLE(this.offset, true); + const ret = this.data.readFloatLE(this.offset, true); this.offset += 4; return ret; }; @@ -467,9 +440,8 @@ BufferReader.prototype.readFloat = function readFloat() { */ BufferReader.prototype.readFloatBE = function readFloatBE() { - let ret; this.assert(this.offset + 4 <= this.data.length); - ret = this.data.readFloatBE(this.offset, true); + const ret = this.data.readFloatBE(this.offset, true); this.offset += 4; return ret; }; @@ -480,9 +452,8 @@ BufferReader.prototype.readFloatBE = function readFloatBE() { */ BufferReader.prototype.readDouble = function readDouble() { - let ret; this.assert(this.offset + 8 <= this.data.length); - ret = this.data.readDoubleLE(this.offset, true); + const ret = this.data.readDoubleLE(this.offset, true); this.offset += 8; return ret; }; @@ -493,9 +464,8 @@ BufferReader.prototype.readDouble = function readDouble() { */ BufferReader.prototype.readDoubleBE = function readDoubleBE() { - let ret; this.assert(this.offset + 8 <= this.data.length); - ret = this.data.readDoubleBE(this.offset, true); + const ret = this.data.readDoubleBE(this.offset, true); this.offset += 8; return ret; }; @@ -506,7 +476,7 @@ BufferReader.prototype.readDoubleBE = function readDoubleBE() { */ BufferReader.prototype.readVarint = function readVarint() { - let {size, value} = encoding.readVarint(this.data, this.offset); + const {size, value} = encoding.readVarint(this.data, this.offset); this.offset += size; return value; }; @@ -517,18 +487,19 @@ BufferReader.prototype.readVarint = function readVarint() { */ BufferReader.prototype.skipVarint = function skipVarint() { - let size = encoding.skipVarint(this.data, this.offset); + const size = encoding.skipVarint(this.data, this.offset); this.assert(this.offset + size <= this.data.length); this.offset += size; + return size; }; /** * Read a varint. - * @returns {BN} + * @returns {U64} */ -BufferReader.prototype.readVarintBN = function readVarintBN() { - let {size, value} = encoding.readVarintBN(this.data, this.offset); +BufferReader.prototype.readVarintN = function readVarintN() { + const {size, value} = encoding.readVarintN(this.data, this.offset); this.offset += size; return value; }; @@ -539,7 +510,7 @@ BufferReader.prototype.readVarintBN = function readVarintBN() { */ BufferReader.prototype.readVarint2 = function readVarint2() { - let {size, value} = encoding.readVarint2(this.data, this.offset); + const {size, value} = encoding.readVarint2(this.data, this.offset); this.offset += size; return value; }; @@ -550,18 +521,18 @@ BufferReader.prototype.readVarint2 = function readVarint2() { */ BufferReader.prototype.skipVarint2 = function skipVarint2() { - let size = encoding.skipVarint2(this.data, this.offset); + const size = encoding.skipVarint2(this.data, this.offset); this.assert(this.offset + size <= this.data.length); this.offset += size; }; /** * Read a varint (type 2). - * @returns {BN} + * @returns {U64} */ -BufferReader.prototype.readVarint2BN = function readVarint2BN() { - let {size, value} = encoding.readVarint2BN(this.data, this.offset); +BufferReader.prototype.readVarint2N = function readVarint2N() { + const {size, value} = encoding.readVarint2N(this.data, this.offset); this.offset += size; return value; }; @@ -576,11 +547,10 @@ BufferReader.prototype.readVarint2BN = function readVarint2BN() { */ BufferReader.prototype.readBytes = function readBytes(size, zeroCopy) { - let ret; - assert(size >= 0); this.assert(this.offset + size <= this.data.length); + let ret; if (this.zeroCopy || zeroCopy) { ret = this.data.slice(this.offset, this.offset + size); } else { @@ -613,10 +583,9 @@ BufferReader.prototype.readVarBytes = function readVarBytes(zeroCopy) { */ BufferReader.prototype.readString = function readString(enc, size) { - let ret; assert(size >= 0); this.assert(this.offset + size <= this.data.length); - ret = this.data.toString(enc, this.offset, this.offset + size); + const ret = this.data.toString(enc, this.offset, this.offset + size); this.offset += size; return ret; }; @@ -641,7 +610,7 @@ BufferReader.prototype.readHash = function readHash(enc) { */ BufferReader.prototype.readVarString = function readVarString(enc, limit) { - let size = this.readVarint(); + const size = this.readVarint(); this.enforce(!limit || size <= limit, 'String exceeds limit.'); return this.readString(enc, size); }; @@ -653,15 +622,20 @@ BufferReader.prototype.readVarString = function readVarString(enc, limit) { */ BufferReader.prototype.readNullString = function readNullString(enc) { - let i, ret; this.assert(this.offset + 1 <= this.data.length); - for (i = this.offset; i < this.data.length; i++) { + + let i = this.offset; + for (; i < this.data.length; i++) { if (this.data[i] === 0) break; } + this.assert(i !== this.data.length); - ret = this.readString(enc, i - this.offset); + + const ret = this.readString(enc, i - this.offset); + this.offset = i + 1; + return ret; }; @@ -672,12 +646,11 @@ BufferReader.prototype.readNullString = function readNullString(enc) { BufferReader.prototype.createChecksum = function createChecksum() { let start = 0; - let data; if (this.stack.length > 0) start = this.stack[this.stack.length - 1]; - data = this.data.slice(start, this.offset); + const data = this.data.slice(start, this.offset); return digest.hash256(data).readUInt32LE(0, true); }; @@ -689,8 +662,8 @@ BufferReader.prototype.createChecksum = function createChecksum() { */ BufferReader.prototype.verifyChecksum = function verifyChecksum() { - let chk = this.createChecksum(); - let checksum = this.readU32(); + const chk = this.createChecksum(); + const checksum = this.readU32(); this.enforce(chk === checksum, 'Checksum mismatch.'); return checksum; }; diff --git a/lib/utils/rollingfilter.js b/lib/utils/rollingfilter.js index 77a03376c..df6d8e250 100644 --- a/lib/utils/rollingfilter.js +++ b/lib/utils/rollingfilter.js @@ -48,30 +48,29 @@ function RollingFilter(items, rate) { */ RollingFilter.prototype.fromRate = function fromRate(items, rate) { - let logRate, max, n, limit, size, tweak, filter; - assert(typeof items === 'number', '`items` must be a number.'); assert(items > 0, '`items` must be greater than zero.'); - assert(items % 1 === 0, '`items` must be an integer.'); + assert(Number.isSafeInteger(items), '`items` must be an integer.'); assert(typeof rate === 'number', '`rate` must be a number.'); assert(rate >= 0 && rate <= 1, '`rate` must be between 0.0 and 1.0.'); - logRate = Math.log(rate); + const logRate = Math.log(rate); + + const n = Math.max(1, Math.min(Math.round(logRate / Math.log(0.5)), 50)); + const limit = (items + 1) / 2 | 0; - n = Math.max(1, Math.min(Math.round(logRate / Math.log(0.5)), 50)); - limit = (items + 1) / 2 | 0; + const max = limit * 3; - max = limit * 3; - size = -1 * n * max / Math.log(1.0 - Math.exp(logRate / n)); + let size = -1 * n * max / Math.log(1.0 - Math.exp(logRate / n)); size = Math.ceil(size); items = ((size + 63) / 64 | 0) << 1; items >>>= 0; items = Math.max(1, items); - tweak = (Math.random() * 0x100000000) >>> 0; + const tweak = (Math.random() * 0x100000000) >>> 0; - filter = Buffer.allocUnsafe(items * 8); + const filter = Buffer.allocUnsafe(items * 8); filter.fill(0); this.n = n; @@ -130,24 +129,22 @@ RollingFilter.prototype.add = function add(val, enc) { val = Buffer.from(val, enc); if (this.entries === this.limit) { - let m1, m2; - this.entries = 0; this.generation += 1; if (this.generation === 4) this.generation = 1; - m1 = (this.generation & 1) * 0xffffffff; - m2 = (this.generation >>> 1) * 0xffffffff; + const m1 = (this.generation & 1) * 0xffffffff; + const m2 = (this.generation >>> 1) * 0xffffffff; for (let i = 0; i < this.items; i += 2) { - let pos1 = i * 8; - let pos2 = (i + 1) * 8; - let v1 = read(this.filter, pos1); - let v2 = read(this.filter, pos2); - let mhi = (v1.hi ^ m1) | (v2.hi ^ m2); - let mlo = (v1.lo ^ m1) | (v2.lo ^ m2); + const pos1 = i * 8; + const pos2 = (i + 1) * 8; + const v1 = read(this.filter, pos1); + const v2 = read(this.filter, pos2); + const mhi = (v1.hi ^ m1) | (v2.hi ^ m2); + const mlo = (v1.lo ^ m1) | (v2.lo ^ m2); v1.hi &= mhi; v1.lo &= mlo; @@ -162,22 +159,19 @@ RollingFilter.prototype.add = function add(val, enc) { this.entries += 1; for (let i = 0; i < this.n; i++) { - let hash = this.hash(val, i); - let bits = hash & 0x3f; - let pos = (hash >>> 6) % this.items; - let pos1 = (pos & ~1) * 8; - let pos2 = (pos | 1) * 8; - let bit = bits % 8; - let oct = (bits - bit) / 8; - - pos1 += oct; - pos2 += oct; - - this.filter[pos1] &= ~(1 << bit); - this.filter[pos1] |= (this.generation & 1) << bit; - - this.filter[pos2] &= ~(1 << bit); - this.filter[pos2] |= (this.generation >>> 1) << bit; + const hash = this.hash(val, i); + const bits = hash & 0x3f; + const pos = (hash >>> 6) % this.items; + const pos1 = (pos & ~1) * 8; + const pos2 = (pos | 1) * 8; + const bit = bits % 8; + const oct = (bits - bit) / 8; + + this.filter[pos1 + oct] &= ~(1 << bit); + this.filter[pos1 + oct] |= (this.generation & 1) << bit; + + this.filter[pos2 + oct] &= ~(1 << bit); + this.filter[pos2 + oct] |= (this.generation >>> 1) << bit; } }; @@ -196,21 +190,18 @@ RollingFilter.prototype.test = function test(val, enc) { val = Buffer.from(val, enc); for (let i = 0; i < this.n; i++) { - let hash = this.hash(val, i); - let bits = hash & 0x3f; - let pos = (hash >>> 6) % this.items; - let pos1 = (pos & ~1) * 8; - let pos2 = (pos | 1) * 8; - let bit = bits % 8; - let oct = (bits - bit) / 8; - - pos1 += oct; - pos2 += oct; - - bits = (this.filter[pos1] >>> bit) & 1; - bits |= (this.filter[pos2] >>> bit) & 1; - - if (bits === 0) + const hash = this.hash(val, i); + const bits = hash & 0x3f; + const pos = (hash >>> 6) % this.items; + const pos1 = (pos & ~1) * 8; + const pos2 = (pos | 1) * 8; + const bit = bits % 8; + const oct = (bits - bit) / 8; + + const bit1 = (this.filter[pos1 + oct] >>> bit) & 1; + const bit2 = (this.filter[pos2 + oct] >>> bit) & 1; + + if ((bit1 | bit2) === 0) return false; } @@ -247,8 +238,8 @@ function U64(hi, lo) { } function read(data, off) { - let hi = data.readUInt32LE(off + 4, true); - let lo = data.readUInt32LE(off, true); + const hi = data.readUInt32LE(off + 4, true); + const lo = data.readUInt32LE(off, true); return new U64(hi, lo); } diff --git a/lib/utils/staticwriter.js b/lib/utils/staticwriter.js index 83b414d73..c90ad799d 100644 --- a/lib/utils/staticwriter.js +++ b/lib/utils/staticwriter.js @@ -9,6 +9,7 @@ const assert = require('assert'); const encoding = require('./encoding'); const digest = require('../crypto/digest'); +const EMPTY_BUFFER = Buffer.alloc(0); /** * Statically allocated buffer writer. @@ -22,7 +23,7 @@ function StaticWriter(size) { return new StaticWriter(size); this.data = Buffer.allocUnsafe(size); - this.written = 0; + this.offset = 0; } /** @@ -32,9 +33,9 @@ function StaticWriter(size) { */ StaticWriter.prototype.render = function render(keep) { - let data = this.data; + const data = this.data; - assert(this.written === data.length); + assert(this.offset === data.length); if (!keep) this.destroy(); @@ -48,7 +49,7 @@ StaticWriter.prototype.render = function render(keep) { */ StaticWriter.prototype.getSize = function getSize() { - return this.written; + return this.offset; }; /** @@ -57,7 +58,7 @@ StaticWriter.prototype.getSize = function getSize() { */ StaticWriter.prototype.seek = function seek(offset) { - this.written += offset; + this.offset += offset; }; /** @@ -65,8 +66,8 @@ StaticWriter.prototype.seek = function seek(offset) { */ StaticWriter.prototype.destroy = function destroy() { - this.data = null; - this.written = null; + this.data = EMPTY_BUFFER; + this.offset = 0; }; /** @@ -75,7 +76,7 @@ StaticWriter.prototype.destroy = function destroy() { */ StaticWriter.prototype.writeU8 = function writeU8(value) { - this.written = this.data.writeUInt8(value, this.written, true); + this.offset = this.data.writeUInt8(value, this.offset, true); }; /** @@ -84,7 +85,7 @@ StaticWriter.prototype.writeU8 = function writeU8(value) { */ StaticWriter.prototype.writeU16 = function writeU16(value) { - this.written = this.data.writeUInt16LE(value, this.written, true); + this.offset = this.data.writeUInt16LE(value, this.offset, true); }; /** @@ -93,7 +94,7 @@ StaticWriter.prototype.writeU16 = function writeU16(value) { */ StaticWriter.prototype.writeU16BE = function writeU16BE(value) { - this.written = this.data.writeUInt16BE(value, this.written, true); + this.offset = this.data.writeUInt16BE(value, this.offset, true); }; /** @@ -102,7 +103,7 @@ StaticWriter.prototype.writeU16BE = function writeU16BE(value) { */ StaticWriter.prototype.writeU32 = function writeU32(value) { - this.written = this.data.writeUInt32LE(value, this.written, true); + this.offset = this.data.writeUInt32LE(value, this.offset, true); }; /** @@ -111,7 +112,7 @@ StaticWriter.prototype.writeU32 = function writeU32(value) { */ StaticWriter.prototype.writeU32BE = function writeU32BE(value) { - this.written = this.data.writeUInt32BE(value, this.written, true); + this.offset = this.data.writeUInt32BE(value, this.offset, true); }; /** @@ -120,7 +121,7 @@ StaticWriter.prototype.writeU32BE = function writeU32BE(value) { */ StaticWriter.prototype.writeU64 = function writeU64(value) { - this.written = encoding.writeU64(this.data, value, this.written); + this.offset = encoding.writeU64(this.data, value, this.offset); }; /** @@ -129,25 +130,25 @@ StaticWriter.prototype.writeU64 = function writeU64(value) { */ StaticWriter.prototype.writeU64BE = function writeU64BE(value) { - this.written = encoding.writeU64BE(this.data, value, this.written); + this.offset = encoding.writeU64BE(this.data, value, this.offset); }; /** * Write uint64le. - * @param {BN} value + * @param {U64} value */ -StaticWriter.prototype.writeU64BN = function writeU64BN(value) { - assert(false, 'Not implemented.'); +StaticWriter.prototype.writeU64N = function writeU64N(value) { + this.offset = encoding.writeU64N(this.data, value, this.offset); }; /** * Write uint64be. - * @param {BN} value + * @param {U64} value */ -StaticWriter.prototype.writeU64BEBN = function writeU64BEBN(value) { - assert(false, 'Not implemented.'); +StaticWriter.prototype.writeU64BEN = function writeU64BEN(value) { + this.offset = encoding.writeU64BEN(this.data, value, this.offset); }; /** @@ -155,8 +156,8 @@ StaticWriter.prototype.writeU64BEBN = function writeU64BEBN(value) { * @param {Number} value */ -StaticWriter.prototype.write8 = function write8(value) { - this.written = this.data.writeInt8(value, this.written, true); +StaticWriter.prototype.writeI8 = function writeI8(value) { + this.offset = this.data.writeInt8(value, this.offset, true); }; /** @@ -164,8 +165,8 @@ StaticWriter.prototype.write8 = function write8(value) { * @param {Number} value */ -StaticWriter.prototype.write16 = function write16(value) { - this.written = this.data.writeInt16LE(value, this.written, true); +StaticWriter.prototype.writeI16 = function writeI16(value) { + this.offset = this.data.writeInt16LE(value, this.offset, true); }; /** @@ -173,8 +174,8 @@ StaticWriter.prototype.write16 = function write16(value) { * @param {Number} value */ -StaticWriter.prototype.write16BE = function write16BE(value) { - this.written = this.data.writeInt16BE(value, this.written, true); +StaticWriter.prototype.writeI16BE = function writeI16BE(value) { + this.offset = this.data.writeInt16BE(value, this.offset, true); }; /** @@ -182,8 +183,8 @@ StaticWriter.prototype.write16BE = function write16BE(value) { * @param {Number} value */ -StaticWriter.prototype.write32 = function write32(value) { - this.written = this.data.writeInt32LE(value, this.written, true); +StaticWriter.prototype.writeI32 = function writeI32(value) { + this.offset = this.data.writeInt32LE(value, this.offset, true); }; /** @@ -191,8 +192,8 @@ StaticWriter.prototype.write32 = function write32(value) { * @param {Number} value */ -StaticWriter.prototype.write32BE = function write32BE(value) { - this.written = this.data.writeInt32BE(value, this.written, true); +StaticWriter.prototype.writeI32BE = function writeI32BE(value) { + this.offset = this.data.writeInt32BE(value, this.offset, true); }; /** @@ -200,8 +201,8 @@ StaticWriter.prototype.write32BE = function write32BE(value) { * @param {Number} value */ -StaticWriter.prototype.write64 = function write64(value) { - this.written = encoding.write64(this.data, value, this.written); +StaticWriter.prototype.writeI64 = function writeI64(value) { + this.offset = encoding.writeI64(this.data, value, this.offset); }; /** @@ -209,26 +210,26 @@ StaticWriter.prototype.write64 = function write64(value) { * @param {Number} value */ -StaticWriter.prototype.write64BE = function write64BE(value) { - this.written = encoding.write64BE(this.data, value, this.written); +StaticWriter.prototype.writeI64BE = function writeI64BE(value) { + this.offset = encoding.writeI64BE(this.data, value, this.offset); }; /** * Write int64le. - * @param {BN} value + * @param {I64} value */ -StaticWriter.prototype.write64BN = function write64BN(value) { - assert(false, 'Not implemented.'); +StaticWriter.prototype.writeI64N = function writeI64N(value) { + this.offset = encoding.writeI64N(this.data, value, this.offset); }; /** * Write int64be. - * @param {BN} value + * @param {I64} value */ -StaticWriter.prototype.write64BEBN = function write64BEBN(value) { - assert(false, 'Not implemented.'); +StaticWriter.prototype.writeI64BEN = function writeI64BEN(value) { + this.offset = encoding.writeI64BEN(this.data, value, this.offset); }; /** @@ -237,7 +238,7 @@ StaticWriter.prototype.write64BEBN = function write64BEBN(value) { */ StaticWriter.prototype.writeFloat = function writeFloat(value) { - this.written = this.data.writeFloatLE(value, this.written, true); + this.offset = this.data.writeFloatLE(value, this.offset, true); }; /** @@ -246,7 +247,7 @@ StaticWriter.prototype.writeFloat = function writeFloat(value) { */ StaticWriter.prototype.writeFloatBE = function writeFloatBE(value) { - this.written = this.data.writeFloatBE(value, this.written, true); + this.offset = this.data.writeFloatBE(value, this.offset, true); }; /** @@ -255,7 +256,7 @@ StaticWriter.prototype.writeFloatBE = function writeFloatBE(value) { */ StaticWriter.prototype.writeDouble = function writeDouble(value) { - this.written = this.data.writeDoubleLE(value, this.written, true); + this.offset = this.data.writeDoubleLE(value, this.offset, true); }; /** @@ -264,7 +265,7 @@ StaticWriter.prototype.writeDouble = function writeDouble(value) { */ StaticWriter.prototype.writeDoubleBE = function writeDoubleBE(value) { - this.written = this.data.writeDoubleBE(value, this.written, true); + this.offset = this.data.writeDoubleBE(value, this.offset, true); }; /** @@ -273,16 +274,16 @@ StaticWriter.prototype.writeDoubleBE = function writeDoubleBE(value) { */ StaticWriter.prototype.writeVarint = function writeVarint(value) { - this.written = encoding.writeVarint(this.data, value, this.written); + this.offset = encoding.writeVarint(this.data, value, this.offset); }; /** * Write a varint. - * @param {BN} value + * @param {U64} value */ -StaticWriter.prototype.writeVarintBN = function writeVarintBN(value) { - assert(false, 'Not implemented.'); +StaticWriter.prototype.writeVarintN = function writeVarintN(value) { + this.offset = encoding.writeVarintN(this.data, value, this.offset); }; /** @@ -291,16 +292,16 @@ StaticWriter.prototype.writeVarintBN = function writeVarintBN(value) { */ StaticWriter.prototype.writeVarint2 = function writeVarint2(value) { - this.written = encoding.writeVarint2(this.data, value, this.written); + this.offset = encoding.writeVarint2(this.data, value, this.offset); }; /** * Write a varint (type 2). - * @param {BN} value + * @param {U64} value */ -StaticWriter.prototype.writeVarint2BN = function writeVarint2BN(value) { - assert(false, 'Not implemented.'); +StaticWriter.prototype.writeVarint2N = function writeVarint2N(value) { + this.offset = encoding.writeVarint2N(this.data, value, this.offset); }; /** @@ -312,9 +313,9 @@ StaticWriter.prototype.writeBytes = function writeBytes(value) { if (value.length === 0) return; - value.copy(this.data, this.written); + value.copy(this.data, this.offset); - this.written += value.length; + this.offset += value.length; }; /** @@ -335,13 +336,13 @@ StaticWriter.prototype.writeVarBytes = function writeVarBytes(value) { */ StaticWriter.prototype.copy = function copy(value, start, end) { - let len = end - start; + const len = end - start; if (len === 0) return; - value.copy(this.data, this.written, start, end); - this.written += len; + value.copy(this.data, this.offset, start, end); + this.offset += len; }; /** @@ -351,16 +352,14 @@ StaticWriter.prototype.copy = function copy(value, start, end) { */ StaticWriter.prototype.writeString = function writeString(value, enc) { - let size; - if (value.length === 0) return; - size = Buffer.byteLength(value, enc); + const size = Buffer.byteLength(value, enc); - this.data.write(value, this.written, enc); + this.data.write(value, this.offset, enc); - this.written += size; + this.offset += size; }; /** @@ -371,11 +370,12 @@ StaticWriter.prototype.writeString = function writeString(value, enc) { StaticWriter.prototype.writeHash = function writeHash(value) { if (typeof value !== 'string') { assert(value.length === 32); - return this.writeBytes(value); + this.writeBytes(value); + return; } assert(value.length === 64); - this.data.write(value, this.written, 'hex'); - this.written += 32; + this.data.write(value, this.offset, 'hex'); + this.offset += 32; }; /** @@ -385,19 +385,17 @@ StaticWriter.prototype.writeHash = function writeHash(value) { */ StaticWriter.prototype.writeVarString = function writeVarString(value, enc) { - let size; - if (value.length === 0) { this.writeVarint(0); return; } - size = Buffer.byteLength(value, enc); + const size = Buffer.byteLength(value, enc); this.writeVarint(size); - this.data.write(value, this.written, enc); + this.data.write(value, this.offset, enc); - this.written += size; + this.offset += size; }; /** @@ -416,10 +414,10 @@ StaticWriter.prototype.writeNullString = function writeNullString(value, enc) { */ StaticWriter.prototype.writeChecksum = function writeChecksum() { - let data = this.data.slice(0, this.written); - let hash = digest.hash256(data); - hash.copy(this.data, this.written, 0, 4); - this.written += 4; + const data = this.data.slice(0, this.offset); + const hash = digest.hash256(data); + hash.copy(this.data, this.offset, 0, 4); + this.offset += 4; }; /** @@ -434,8 +432,8 @@ StaticWriter.prototype.fill = function fill(value, size) { if (size === 0) return; - this.data.fill(value, this.written, this.written + size); - this.written += size; + this.data.fill(value, this.offset, this.offset + size); + this.offset += size; }; /* diff --git a/lib/utils/util.js b/lib/utils/util.js index 447c2194e..ffe898ef1 100644 --- a/lib/utils/util.js +++ b/lib/utils/util.js @@ -16,170 +16,112 @@ const nodeUtil = require('util'); const util = exports; -/** - * Return hrtime (shim for browser). - * @param {Array} time - * @returns {Array} +/* + * Constants */ -util.hrtime = function hrtime(time) { - if (!process.hrtime) { - let now = util.ms(); - let ms, sec; - - if (time) { - time = time[0] * 1000 + time[1] / 1e6; - now -= time; - return now; - } - - ms = now % 1000; - sec = (now - ms) / 1000; - return [sec, ms * 1e6]; - } - - if (time) { - let elapsed = process.hrtime(time); - return elapsed[0] * 1000 + elapsed[1] / 1e6; - } - - return process.hrtime(); +const inspectOptions = { + showHidden: false, + depth: 20, + colors: false, + customInspect: true, + showProxy: false, + maxArrayLength: Infinity, + breakLength: 60 }; /** - * Test whether a string is base58 (note that you - * may get a false positive on a hex string). - * @param {String?} obj + * Test whether a number is Number, + * finite, and below MAX_SAFE_INTEGER. + * @param {Number?} value * @returns {Boolean} */ -util.isBase58 = function isBase58(obj) { - return typeof obj === 'string' && /^[1-9a-zA-Z]+$/.test(obj); +util.isNumber = function isNumber(value) { + return typeof value === 'number' + && isFinite(value) + && value >= -Number.MAX_SAFE_INTEGER + && value <= Number.MAX_SAFE_INTEGER; }; /** - * Test whether a string is hex (length must be even). - * Note that this _could_ await a false positive on - * base58 strings. - * @param {String?} obj + * Test whether an object is an int. + * @param {Number?} value * @returns {Boolean} */ -util.isHex = function isHex(obj) { - return typeof obj === 'string' - && /^[0-9a-f]+$/i.test(obj) - && obj.length % 2 === 0; +util.isInt = function isInt(value) { + return Number.isSafeInteger(value); }; /** - * Reverse a hex-string (used because of - * bitcoind's affinity for uint256le). - * @param {String} data - Hex string. - * @returns {String} Reversed hex string. + * Test whether an object is a uint. + * @param {Number?} value + * @returns {Boolean} */ -util.revHex = function revHex(data) { - let out = ''; - - assert(typeof data === 'string'); - assert(data.length > 0); - assert(data.length % 2 === 0); - - for (let i = 0; i < data.length; i += 2) - out = data.slice(i, i + 2) + out; - - return out; +util.isUint = function isUint(value) { + return util.isInt(value) && value >= 0; }; /** - * Test whether a number is below MAX_SAFE_INTEGER. - * @param {Number} value + * Test whether a number is a float. + * @param {Number?} value * @returns {Boolean} */ -util.isSafeInteger = function isSafeInteger(value) { - return Number.isSafeInteger(value); +util.isFloat = function isFloat(value) { + return typeof value === 'number' && isFinite(value); }; /** - * Test whether the result of a positive - * addition would be below MAX_SAFE_INTEGER. - * @param {Number} value + * Test whether a number is a positive float. + * @param {Number?} value * @returns {Boolean} */ -util.isSafeAddition = function isSafeAddition(a, b) { - let hi, lo, ahi, alo, bhi, blo; - let as, bs, s, c; - - // We only work on positive numbers. - assert(a >= 0); - assert(b >= 0); - - // Fast case. - if (a <= 0xfffffffffffff && b <= 0xfffffffffffff) - return true; - - // Do a 64 bit addition and check the top 11 bits. - ahi = (a * (1 / 0x100000000)) | 0; - alo = a | 0; - - bhi = (b * (1 / 0x100000000)) | 0; - blo = b | 0; - - // Credit to @indutny for this method. - lo = (alo + blo) | 0; - - s = lo >> 31; - as = alo >> 31; - bs = blo >> 31; - - c = ((as & bs) | (~s & (as ^ bs))) & 1; - - hi = (((ahi + bhi) | 0) + c) | 0; - - hi >>>= 0; - ahi >>>= 0; - bhi >>>= 0; +util.isUfloat = function isUfloat(value) { + return util.isFloat(value) && value >= 0; +}; - // Overflow? - if (hi < ahi || hi < bhi) - return false; +/** + * Test whether an object is an int8. + * @param {Number?} value + * @returns {Boolean} + */ - return (hi & 0xffe00000) === 0; +util.isI8 = function isI8(value) { + return (value | 0) === value && value >= -0x80 && value <= 0x7f; }; /** - * Test whether a number is Number, - * finite, and below MAX_SAFE_INTEGER. + * Test whether an object is an int16. * @param {Number?} value * @returns {Boolean} */ -util.isNumber = function isNumber(value) { - return typeof value === 'number' - && isFinite(value) - && util.isSafeInteger(value); +util.isI16 = function isI16(value) { + return (value | 0) === value && value >= -0x8000 && value <= 0x7fff; }; /** - * Test whether an object is an int. + * Test whether an object is an int32. * @param {Number?} value * @returns {Boolean} */ -util.isInt = function isInt(value) { - return util.isNumber(value) && value % 1 === 0; +util.isI32 = function isI32(value) { + return (value | 0) === value; }; /** - * Test whether an object is an int8. + * Test whether an object is a int53. * @param {Number?} value * @returns {Boolean} */ -util.isInt8 = function isInt8(value) { - return (value | 0) === value && value >= -0x80 && value <= 0x7f; +util.isI64 = function isI64(value) { + return util.isInt(value); }; /** @@ -188,18 +130,18 @@ util.isInt8 = function isInt8(value) { * @returns {Boolean} */ -util.isUInt8 = function isUInt8(value) { - return (value >>> 0) === value && value >= 0 && value <= 0xff; +util.isU8 = function isU8(value) { + return (value & 0xff) === value; }; /** - * Test whether an object is an int32. + * Test whether an object is a uint16. * @param {Number?} value * @returns {Boolean} */ -util.isInt32 = function isInt32(value) { - return (value | 0) === value; +util.isU16 = function isU16(value) { + return (value & 0xffff) === value; }; /** @@ -208,66 +150,123 @@ util.isInt32 = function isInt32(value) { * @returns {Boolean} */ -util.isUInt32 = function isUInt32(value) { +util.isU32 = function isU32(value) { return (value >>> 0) === value; }; /** - * Test whether an object is a int53. + * Test whether an object is a uint53. * @param {Number?} value * @returns {Boolean} */ -util.isInt53 = function isInt53(value) { - return util.isInt(value); +util.isU64 = function isU64(value) { + return util.isUint(value); }; /** - * Test whether an object is a uint53. - * @param {Number?} value + * Test whether a string is a plain + * ascii string (no control characters). + * @param {String} str * @returns {Boolean} */ -util.isUInt53 = function isUInt53(value) { - return util.isInt(value) && value >= 0; +util.isAscii = function isAscii(str) { + return typeof str === 'string' && /^[\t\n\r -~]*$/.test(str); +}; + +/** + * Test whether a string is base58 (note that you + * may get a false positive on a hex string). + * @param {String?} str + * @returns {Boolean} + */ + +util.isBase58 = function isBase58(str) { + return typeof str === 'string' && /^[1-9A-Za-z]+$/.test(str); +}; + +/** + * Test whether a string is hex (length must be even). + * Note that this _could_ await a false positive on + * base58 strings. + * @param {String?} str + * @returns {Boolean} + */ + +util.isHex = function isHex(str) { + if (typeof str !== 'string') + return false; + return str.length % 2 === 0 && /^[0-9A-Fa-f]+$/.test(str); }; /** * Test whether an object is a 160 bit hash (hex string). - * @param {String?} value + * @param {String?} hash * @returns {Boolean} */ util.isHex160 = function isHex160(hash) { - return util.isHex(hash) && hash.length === 40; + if (typeof hash !== 'string') + return false; + return hash.length === 40 && util.isHex(hash); }; /** * Test whether an object is a 256 bit hash (hex string). - * @param {String?} value + * @param {String?} hash * @returns {Boolean} */ util.isHex256 = function isHex256(hash) { - return util.isHex(hash) && hash.length === 64; + if (typeof hash !== 'string') + return false; + return hash.length === 64 && util.isHex(hash); }; /** - * Test whether a string qualifies as a float. - * - * This is stricter than checking if the result of parseFloat() is NaN - * as, e.g. parseFloat successfully parses the string '1.2.3' as 1.2, and - * we also check that the value is a string. - * - * @param {String?} value + * Test whether the result of a positive + * addition would be below MAX_SAFE_INTEGER. + * @param {Number} value * @returns {Boolean} */ -util.isFloat = function isFloat(value) { - return typeof value === 'string' - && /^-?(\d+)?(?:\.\d*)?$/.test(value) - && value.length !== 0 - && value !== '-'; +util.isSafeAddition = function isSafeAddition(a, b) { + // We only work on positive numbers. + assert(a >= 0); + assert(b >= 0); + + // Fast case. + if (a <= 0xfffffffffffff && b <= 0xfffffffffffff) + return true; + + // Do a 64 bit addition and check the top 11 bits. + let ahi = (a * (1 / 0x100000000)) | 0; + const alo = a | 0; + + let bhi = (b * (1 / 0x100000000)) | 0; + const blo = b | 0; + + // Credit to @indutny for this method. + const lo = (alo + blo) | 0; + + const s = lo >> 31; + const as = alo >> 31; + const bs = blo >> 31; + + const c = ((as & bs) | (~s & (as ^ bs))) & 1; + + let hi = (((ahi + bhi) | 0) + c) | 0; + + hi >>>= 0; + ahi >>>= 0; + bhi >>>= 0; + + // Overflow? + if (hi < ahi || hi < bhi) + return false; + + return (hi & 0xffe00000) === 0; }; /** @@ -278,9 +277,12 @@ util.isFloat = function isFloat(value) { */ util.inspectify = function inspectify(obj, color) { - return typeof obj !== 'string' - ? nodeUtil.inspect(obj, null, 20, color !== false) - : obj; + if (typeof obj === 'string') + return obj; + + inspectOptions.colors = color !== false; + + return nodeUtil.inspect(obj, inspectOptions); }; /** @@ -300,12 +302,12 @@ util.fmt = nodeUtil.format; */ util.format = function format(args, color) { - if (color == null) - color = process.stdout ? process.stdout.isTTY : false; - - return typeof args[0] === 'object' - ? util.inspectify(args[0], color) - : util.fmt.apply(util, args); + if (args.length > 0 && args[0] && typeof args[0] === 'object') { + if (color == null) + color = Boolean(process.stdout && process.stdout.isTTY); + return util.inspectify(args[0], color); + } + return util.fmt(...args); }; /** @@ -315,17 +317,19 @@ util.format = function format(args, color) { */ util.log = function log(...args) { - let msg; - if (!process.stdout) { - msg = typeof args[0] !== 'object' - ? util.format(args, false) - : args[0]; + let msg; + if (args.length > 0) { + msg = typeof args[0] !== 'object' + ? util.fmt(...args) + : args[0]; + } console.log(msg); return; } - msg = util.format(args); + const msg = util.format(args); + process.stdout.write(msg + '\n'); }; @@ -336,20 +340,57 @@ util.log = function log(...args) { */ util.error = function error(...args) { - let msg; - if (!process.stderr) { - msg = typeof args[0] !== 'object' - ? util.format(args, false) - : args[0]; + let msg; + if (args.length > 0) { + msg = typeof args[0] !== 'object' + ? util.fmt(...args) + : args[0]; + } console.error(msg); return; } - msg = util.format(args); + const msg = util.format(args); + process.stderr.write(msg + '\n'); }; +/** + * Return hrtime (shim for browser). + * @param {Array} time + * @returns {Array} [seconds, nanoseconds] + */ + +util.hrtime = function hrtime(time) { + if (!process.hrtime) { + const now = util.ms(); + + if (time) { + const [hi, lo] = time; + const start = hi * 1000 + lo / 1e6; + return now - start; + } + + const ms = now % 1000; + + // Seconds + const hi = (now - ms) / 1000; + + // Nanoseconds + const lo = ms * 1e6; + + return [hi, lo]; + } + + if (time) { + const [hi, lo] = process.hrtime(time); + return hi * 1000 + lo / 1e6; + } + + return process.hrtime(); +}; + /** * Get current time in unix time (seconds). * @returns {Number} @@ -365,27 +406,25 @@ util.now = function now() { */ util.ms = function ms() { - if (Date.now) - return Date.now(); - return +new Date(); + return Date.now(); }; /** * Create a Date ISO string from time in unix time (seconds). - * @param {Number?} ts - Seconds in unix time. + * @param {Number?} time - Seconds in unix time. * @returns {String} */ -util.date = function date(ts) { - if (ts == null) - ts = util.now(); +util.date = function date(time) { + if (time == null) + time = util.now(); - return new Date(ts * 1000).toISOString().slice(0, -5) + 'Z'; + return new Date(time * 1000).toISOString().slice(0, -5) + 'Z'; }; /** * Get unix seconds from a Date string. - * @param {String} date - Date ISO String. + * @param {String?} date - Date ISO String. * @returns {Number} */ @@ -413,31 +452,31 @@ util.random = function random(min, max) { * @returns {Buffer} */ -util.nonce = function _nonce(size) { - let n, nonce; +util.nonce = function nonce(size) { + let n, data; if (!size) size = 8; switch (size) { case 8: - nonce = Buffer.allocUnsafe(8); + data = Buffer.allocUnsafe(8); n = util.random(0, 0x100000000); - nonce.writeUInt32LE(n, 0, true); + data.writeUInt32LE(n, 0, true); n = util.random(0, 0x100000000); - nonce.writeUInt32LE(n, 4, true); + data.writeUInt32LE(n, 4, true); break; case 4: - nonce = Buffer.allocUnsafe(4); + data = Buffer.allocUnsafe(4); n = util.random(0, 0x100000000); - nonce.writeUInt32LE(n, 0, true); + data.writeUInt32LE(n, 0, true); break; default: assert(false, 'Bad nonce size.'); break; } - return nonce; + return data; }; /** @@ -448,7 +487,7 @@ util.nonce = function _nonce(size) { */ util.strcmp = function strcmp(a, b) { - let len = Math.min(a.length, b.length); + const len = Math.min(a.length, b.length); for (let i = 0; i < len; i++) { if (a[i] < b[i]) @@ -476,21 +515,6 @@ util.mb = function mb(size) { return Math.floor(size / 1024 / 1024); }; -/** - * Inheritance. - * @param {Function} child - Constructor to inherit. - * @param {Function} parent - Parent constructor. - */ - -util.inherits = function inherits(child, parent) { - child.super_ = parent; - Object.setPrototypeOf(child.prototype, parent.prototype); - Object.defineProperty(child.prototype, 'constructor', { - value: child, - enumerable: false - }); -}; - /** * Find index of a buffer in an array of buffers. * @param {Buffer[]} items @@ -503,8 +527,10 @@ util.indexOf = function indexOf(items, data) { assert(Buffer.isBuffer(data)); for (let i = 0; i < items.length; i++) { - let item = items[i]; + const item = items[i]; + assert(Buffer.isBuffer(item)); + if (item.equals(data)) return i; } @@ -520,8 +546,11 @@ util.indexOf = function indexOf(items, data) { */ util.pad8 = function pad8(num) { + assert(typeof num === 'number'); assert(num >= 0); - num = num + ''; + + num = num.toString(10); + switch (num.length) { case 1: return '00' + num; @@ -530,7 +559,8 @@ util.pad8 = function pad8(num) { case 3: return num; } - assert(false); + + throw new Error('Number too big.'); }; /** @@ -541,8 +571,11 @@ util.pad8 = function pad8(num) { */ util.pad32 = function pad32(num) { + assert(typeof num === 'number'); assert(num >= 0); - num = num + ''; + + num = num.toString(10); + switch (num.length) { case 1: return '000000000' + num; @@ -564,9 +597,9 @@ util.pad32 = function pad32(num) { return '0' + num; case 10: return num; - default: - assert(false); } + + throw new Error('Number too big.'); }; /** @@ -577,16 +610,19 @@ util.pad32 = function pad32(num) { */ util.hex8 = function hex8(num) { + assert(typeof num === 'number'); assert(num >= 0); + num = num.toString(16); + switch (num.length) { case 1: return '0' + num; case 2: return num; - default: - assert(false); } + + throw new Error('Number too big.'); }; /** @@ -597,8 +633,11 @@ util.hex8 = function hex8(num) { */ util.hex32 = function hex32(num) { + assert(typeof num === 'number'); assert(num >= 0); + num = num.toString(16); + switch (num.length) { case 1: return '0000000' + num; @@ -616,56 +655,44 @@ util.hex32 = function hex32(num) { return '0' + num; case 8: return num; - default: - assert(false); } -}; - -/** - * Convert an array to a map. - * @param {String[]} items - * @returns {Object} Map. - */ - -util.toMap = function toMap(items) { - let map = {}; - for (let value of items) - map[value] = true; - - return map; + throw new Error('Number too big.'); }; /** - * Reverse a map. - * @param {Object} map - * @returns {Object} Reversed map. + * Reverse a hex-string (used because of + * bitcoind's affinity for uint256le). + * @param {String} data - Hex string. + * @returns {String} Reversed hex string. */ -util.revMap = function revMap(map) { - let reversed = {}; - let keys = Object.keys(map); +util.revHex = function revHex(data) { + assert(typeof data === 'string'); + assert(data.length > 0); + assert(data.length % 2 === 0); + + let out = ''; - for (let key of keys) - reversed[map[key]] = key; + for (let i = 0; i < data.length; i += 2) + out = data.slice(i, i + 2) + out; - return reversed; + return out; }; /** - * Get object values. - * @param {Object} map - * @returns {Array} Values. + * Reverse an object's keys and values. + * @param {Object} obj + * @returns {Object} Reversed object. */ -util.values = function values(map) { - let keys = Object.keys(map); - let out = []; +util.reverse = function reverse(obj) { + const reversed = {}; - for (let key of keys) - out.push(map[key]); + for (const key of Object.keys(obj)) + reversed[obj[key]] = key; - return out; + return reversed; }; /** @@ -682,8 +709,8 @@ util.binarySearch = function binarySearch(items, key, compare, insert) { let end = items.length - 1; while (start <= end) { - let pos = (start + end) >>> 1; - let cmp = compare(items[pos], key); + const pos = (start + end) >>> 1; + const cmp = compare(items[pos], key); if (cmp === 0) return pos; @@ -709,7 +736,7 @@ util.binarySearch = function binarySearch(items, key, compare, insert) { */ util.binaryInsert = function binaryInsert(items, item, compare, uniq) { - let i = util.binarySearch(items, item, compare, true); + const i = util.binarySearch(items, item, compare, true); if (uniq && i < items.length) { if (compare(items[i], item) === 0) @@ -735,7 +762,7 @@ util.binaryInsert = function binaryInsert(items, item, compare, uniq) { */ util.binaryRemove = function binaryRemove(items, item, compare) { - let i = util.binarySearch(items, item, compare, false); + const i = util.binarySearch(items, item, compare, false); if (i === -1) return false; @@ -752,8 +779,11 @@ util.binaryRemove = function binaryRemove(items, item, compare) { */ util.isUpperCase = function isUpperCase(str) { + assert(typeof str === 'string'); + if (str.length === 0) return false; + return (str.charCodeAt(0) & 32) === 0; }; @@ -764,15 +794,14 @@ util.isUpperCase = function isUpperCase(str) { * @returns {Boolean} */ -util.startsWith = function startsWiths(str, prefix) { - return str.startsWith(prefix); -}; +util.startsWith = function startsWith(str, prefix) { + assert(typeof str === 'string'); -if (!''.startsWith) { - util.startsWith = function startsWith(str, prefix) { + if (!str.startsWith) return str.indexOf(prefix) === 0; - }; -} + + return str.startsWith(prefix); +}; /** * Get memory usage info. @@ -780,8 +809,6 @@ if (!''.startsWith) { */ util.memoryUsage = function memoryUsage() { - let mem; - if (!process.memoryUsage) { return { total: 0, @@ -792,7 +819,7 @@ util.memoryUsage = function memoryUsage() { }; } - mem = process.memoryUsage(); + const mem = process.memoryUsage(); return { total: util.mb(mem.rss), @@ -802,3 +829,209 @@ util.memoryUsage = function memoryUsage() { external: util.mb(mem.external) }; }; + +/** + * Convert int to fixed number string and reduce by a + * power of ten (uses no floating point arithmetic). + * @param {Number} num + * @param {Number} exp - Number of decimal places. + * @returns {String} Fixed number string. + */ + +util.toFixed = function toFixed(num, exp) { + assert(typeof num === 'number'); + assert(Number.isSafeInteger(num), 'Invalid integer value.'); + + let sign = ''; + + if (num < 0) { + num = -num; + sign = '-'; + } + + const mult = pow10(exp); + let lo = num % mult; + const hi = (num - lo) / mult; + + lo = lo.toString(10); + + while (lo.length < exp) + lo = '0' + lo; + + lo = lo.replace(/0+$/, ''); + + assert(lo.length <= exp, 'Invalid integer value.'); + + if (lo.length === 0) + lo = '0'; + + if (exp === 0) + return `${sign}${hi}`; + + return `${sign}${hi}.${lo}`; +}; + +/** + * Parse a fixed number string and multiply by a + * power of ten (uses no floating point arithmetic). + * @param {String} str + * @param {Number} exp - Number of decimal places. + * @returns {Number} Integer. + */ + +util.fromFixed = function fromFixed(str, exp) { + assert(typeof str === 'string'); + assert(str.length <= 32, 'Fixed number string too large.'); + + let sign = 1; + + if (str.length > 0 && str[0] === '-') { + str = str.substring(1); + sign = -1; + } + + let hi = str; + let lo = '0'; + + const index = str.indexOf('.'); + + if (index !== -1) { + hi = str.substring(0, index); + lo = str.substring(index + 1); + } + + hi = hi.replace(/^0+/, ''); + lo = lo.replace(/0+$/, ''); + + assert(hi.length <= 16 - exp, + 'Fixed number string exceeds 2^53-1.'); + + assert(lo.length <= exp, + 'Too many decimal places in fixed number string.'); + + if (hi.length === 0) + hi = '0'; + + while (lo.length < exp) + lo += '0'; + + if (lo.length === 0) + lo = '0'; + + assert(/^\d+$/.test(hi) && /^\d+$/.test(lo), + 'Non-numeric characters in fixed number string.'); + + hi = parseInt(hi, 10); + lo = parseInt(lo, 10); + + const mult = pow10(exp); + const maxLo = modSafe(mult); + const maxHi = divSafe(mult); + + assert(hi < maxHi || (hi === maxHi && lo <= maxLo), + 'Fixed number string exceeds 2^53-1.'); + + return sign * (hi * mult + lo); +}; + +/** + * Convert int to float and reduce by a power + * of ten (uses no floating point arithmetic). + * @param {Number} num + * @param {Number} exp - Number of decimal places. + * @returns {Number} Double float. + */ + +util.toFloat = function toFloat(num, exp) { + return Number(util.toFixed(num, exp)); +}; + +/** + * Parse a double float number and multiply by a + * power of ten (uses no floating point arithmetic). + * @param {Number} num + * @param {Number} exp - Number of decimal places. + * @returns {Number} Integer. + */ + +util.fromFloat = function fromFloat(num, exp) { + assert(typeof num === 'number' && isFinite(num)); + assert(Number.isSafeInteger(exp)); + return util.fromFixed(num.toFixed(exp), exp); +}; + +/* + * Helpers + */ + +function pow10(exp) { + switch (exp) { + case 0: + return 1; + case 1: + return 10; + case 2: + return 100; + case 3: + return 1000; + case 4: + return 10000; + case 5: + return 100000; + case 6: + return 1000000; + case 7: + return 10000000; + case 8: + return 100000000; + } + throw new Error('Exponent is too large.'); +} + +function modSafe(mod) { + switch (mod) { + case 1: + return 0; + case 10: + return 1; + case 100: + return 91; + case 1000: + return 991; + case 10000: + return 991; + case 100000: + return 40991; + case 1000000: + return 740991; + case 10000000: + return 4740991; + case 100000000: + return 54740991; + } + throw new Error('Exponent is too large.'); +} + +function divSafe(div) { + switch (div) { + case 1: + return 9007199254740991; + case 10: + return 900719925474099; + case 100: + return 90071992547409; + case 1000: + return 9007199254740; + case 10000: + return 900719925474; + case 100000: + return 90071992547; + case 1000000: + return 9007199254; + case 10000000: + return 900719925; + case 100000000: + return 90071992; + } + throw new Error('Exponent is too large.'); +} diff --git a/lib/utils/validator.js b/lib/utils/validator.js index 922284362..159851433 100644 --- a/lib/utils/validator.js +++ b/lib/utils/validator.js @@ -7,6 +7,7 @@ 'use strict'; const assert = require('assert'); +const util = require('../utils/util'); /** * Validator @@ -48,10 +49,10 @@ Validator.prototype.init = function init(data) { Validator.prototype.has = function has(key) { assert(typeof key === 'string' || typeof key === 'number', - 'Key must be a string.'); + 'Key must be a string or number.'); - for (let map of this.data) { - let value = map[key]; + for (const map of this.data) { + const value = map[key]; if (value != null) return true; } @@ -71,9 +72,9 @@ Validator.prototype.get = function get(key, fallback) { fallback = null; if (Array.isArray(key)) { - let keys = key; - for (let key of keys) { - let value = this.get(key); + const keys = key; + for (const key of keys) { + const value = this.get(key); if (value !== null) return value; } @@ -81,15 +82,13 @@ Validator.prototype.get = function get(key, fallback) { } assert(typeof key === 'string' || typeof key === 'number', - 'Key must be a string.'); - - for (let map of this.data) { - let value; + 'Key must be a string or number.'); + for (const map of this.data) { if (!map || typeof map !== 'object') throw new ValidationError('data', 'object'); - value = map[key]; + const value = map[key]; if (value != null) return value; @@ -98,6 +97,21 @@ Validator.prototype.get = function get(key, fallback) { return fallback; }; +/** + * Get a value's type. + * @param {String} key + * @returns {String} + */ + +Validator.prototype.typeOf = function typeOf(key) { + const value = this.get(key); + + if (value == null) + return 'null'; + + return typeof value; +}; + /** * Get a value (as a string). * @param {String} key @@ -106,7 +120,7 @@ Validator.prototype.get = function get(key, fallback) { */ Validator.prototype.str = function str(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -121,13 +135,13 @@ Validator.prototype.str = function str(key, fallback) { }; /** - * Get a value (as a number). + * Get a value (as an integer). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Validator.prototype.num = function num(key, fallback) { +Validator.prototype.int = function int(key, fallback) { let value = this.get(key); if (fallback === undefined) @@ -138,29 +152,55 @@ Validator.prototype.num = function num(key, fallback) { if (typeof value !== 'string') { if (typeof value !== 'number') - throw new ValidationError(key, 'number'); + throw new ValidationError(key, 'int'); + + if (!Number.isSafeInteger(value)) + throw new ValidationError(key, 'int'); + return value; } - if (!/^\d+$/.test(value)) - throw new ValidationError(key, 'number'); + if (!/^\-?\d+$/.test(value)) + throw new ValidationError(key, 'int'); value = parseInt(value, 10); - if (!isFinite(value)) - throw new ValidationError(key, 'number'); + if (!Number.isSafeInteger(value)) + throw new ValidationError(key, 'int'); + + return value; +}; + +/** + * Get a value (as a signed integer). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Validator.prototype.uint = function uint(key, fallback) { + const value = this.int(key); + + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; + + if (value < 0) + throw new ValidationError(key, 'uint'); return value; }; /** - * Get a value (as a number). + * Get a value (as a float). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Validator.prototype.flt = function flt(key, fallback) { +Validator.prototype.float = function float(key, fallback) { let value = this.get(key); if (fallback === undefined) @@ -172,10 +212,17 @@ Validator.prototype.flt = function flt(key, fallback) { if (typeof value !== 'string') { if (typeof value !== 'number') throw new ValidationError(key, 'float'); + + if (!isFinite(value)) + throw new ValidationError(key, 'float'); + return value; } - if (!/^\d*(?:\.\d*)?$/.test(value)) + if (!/^\-?\d*(?:\.\d*)?$/.test(value)) + throw new ValidationError(key, 'float'); + + if (!/\d/.test(value)) throw new ValidationError(key, 'float'); value = parseFloat(value); @@ -187,14 +234,14 @@ Validator.prototype.flt = function flt(key, fallback) { }; /** - * Get a value (as a uint32). + * Get a value (as a positive float). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Validator.prototype.u32 = function u32(key, fallback) { - let value = this.num(key); +Validator.prototype.ufloat = function ufloat(key, fallback) { + const value = this.float(key); if (fallback === undefined) fallback = null; @@ -202,21 +249,46 @@ Validator.prototype.u32 = function u32(key, fallback) { if (value === null) return fallback; - if ((value >>> 0) !== value) - throw new ValidationError(key, 'uint32'); + if (value < 0) + throw new ValidationError(key, 'positive float'); return value; }; /** - * Get a value (as a uint64). + * Get a value (as a fixed number). * @param {String} key + * @param {Number?} exp * @param {Object?} fallback * @returns {Number|null} */ -Validator.prototype.u64 = function u64(key, fallback) { - let value = this.num(key); +Validator.prototype.fixed = function fixed(key, exp, fallback) { + const value = this.float(key); + + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; + + try { + return util.fromFloat(value, exp || 0); + } catch (e) { + throw new ValidationError(key, 'fixed number'); + } +}; + +/** + * Get a value (as a positive fixed number). + * @param {String} key + * @param {Number?} exp + * @param {Object?} fallback + * @returns {Number|null} + */ + +Validator.prototype.ufixed = function ufixed(key, exp, fallback) { + const value = this.fixed(key, exp); if (fallback === undefined) fallback = null; @@ -224,8 +296,8 @@ Validator.prototype.u64 = function u64(key, fallback) { if (value === null) return fallback; - if (value % 1 !== 0 || value < 0 || value > 0x1fffffffffffff) - throw new ValidationError(key, 'uint64'); + if (value < 0) + throw new ValidationError(key, 'positive fixed number'); return value; }; @@ -237,8 +309,8 @@ Validator.prototype.u64 = function u64(key, fallback) { * @returns {Number|null} */ -Validator.prototype.i32 = function i32(key, fallback) { - let value = this.num(key); +Validator.prototype.i8 = function i8(key, fallback) { + const value = this.int(key); if (fallback === undefined) fallback = null; @@ -246,21 +318,21 @@ Validator.prototype.i32 = function i32(key, fallback) { if (value === null) return fallback; - if ((value | 0) !== value) - throw new ValidationError(key, 'int32'); + if (value < -0x80 || value > 0x7f) + throw new ValidationError(key, 'i8'); return value; }; /** - * Get a value (as an int64). + * Get a value (as an int32). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Validator.prototype.i64 = function i64(key, fallback) { - let value = this.num(key); +Validator.prototype.i16 = function i16(key, fallback) { + const value = this.int(key); if (fallback === undefined) fallback = null; @@ -268,21 +340,21 @@ Validator.prototype.i64 = function i64(key, fallback) { if (value === null) return fallback; - if (value % 1 !== 0 || Math.abs(value) > 0x1fffffffffffff) - throw new ValidationError(key, 'int64'); + if (value < -0x8000 || value > 0x7fff) + throw new ValidationError(key, 'i16'); return value; }; /** - * Get a value (as a satoshi number or btc string). + * Get a value (as an int32). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Validator.prototype.amt = function amt(key, fallback) { - let value = this.get(key); +Validator.prototype.i32 = function i32(key, fallback) { + const value = this.int(key); if (fallback === undefined) fallback = null; @@ -290,37 +362,54 @@ Validator.prototype.amt = function amt(key, fallback) { if (value === null) return fallback; - if (typeof value !== 'string') { - if (typeof value !== 'number') - throw new ValidationError(key, 'amount'); - return value; - } + if ((value | 0) !== value) + throw new ValidationError(key, 'int32'); - if (!/^\d+(\.\d{0,8})?$/.test(value)) - throw new ValidationError(key, 'amount'); + return value; +}; - value = parseFloat(value); +/** + * Get a value (as an int64). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ - if (!isFinite(value)) - throw new ValidationError(key, 'amount'); +Validator.prototype.i64 = function i64(key, fallback) { + return this.int(key, fallback); +}; + +/** + * Get a value (as a uint32). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Validator.prototype.u8 = function u8(key, fallback) { + const value = this.uint(key); - value *= 1e8; + if (fallback === undefined) + fallback = null; + + if (value === null) + return fallback; - if (value % 1 !== 0 || value < 0 || value > 0x1fffffffffffff) - throw new ValidationError(key, 'amount (uint64)'); + if ((value & 0xff) !== value) + throw new ValidationError(key, 'uint8'); return value; }; /** - * Get a value (as a btc float). + * Get a value (as a uint16). * @param {String} key * @param {Object?} fallback * @returns {Number|null} */ -Validator.prototype.btc = function btc(key, fallback) { - let value = this.num(key); +Validator.prototype.u16 = function u16(key, fallback) { + const value = this.uint(key); if (fallback === undefined) fallback = null; @@ -328,14 +417,45 @@ Validator.prototype.btc = function btc(key, fallback) { if (value === null) return fallback; - value *= 1e8; + if ((value & 0xffff) !== value) + throw new ValidationError(key, 'uint16'); + + return value; +}; + +/** + * Get a value (as a uint32). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Validator.prototype.u32 = function u32(key, fallback) { + const value = this.uint(key); + + if (fallback === undefined) + fallback = null; - if (value % 1 !== 0 || value < 0 || value > 0x1fffffffffffff) - throw new ValidationError(key, 'btc float (uint64)'); + if (value === null) + return fallback; + + if ((value >>> 0) !== value) + throw new ValidationError(key, 'uint32'); return value; }; +/** + * Get a value (as a uint64). + * @param {String} key + * @param {Object?} fallback + * @returns {Number|null} + */ + +Validator.prototype.u64 = function u64(key, fallback) { + return this.uint(key, fallback); +}; + /** * Get a value (as a reverse hash). * @param {String} key @@ -344,8 +464,7 @@ Validator.prototype.btc = function btc(key, fallback) { */ Validator.prototype.hash = function hash(key, fallback) { - let value = this.get(key); - let out = ''; + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -369,6 +488,8 @@ Validator.prototype.hash = function hash(key, fallback) { if (!/^[0-9a-f]+$/i.test(value)) throw new ValidationError(key, 'hex string'); + let out = ''; + for (let i = 0; i < value.length; i += 2) out = value.slice(i, i + 2) + out; @@ -383,46 +504,9 @@ Validator.prototype.hash = function hash(key, fallback) { */ Validator.prototype.numhash = function numhash(key, fallback) { - let value = this.get(key); - - if (value === null) - return fallback; - - if (typeof value === 'string') - return this.hash(key); - - return this.num(key); -}; - -/** - * Get a value (as a number or string). - * @param {String} key - * @param {Object?} fallback - * @returns {Number|String|null} - */ - -Validator.prototype.numstr = function numstr(key, fallback) { - let value = this.get(key); - let num; - - if (fallback === undefined) - fallback = null; - - if (value === null) - return fallback; - - if (typeof value !== 'string') { - if (typeof value !== 'number') - throw new ValidationError(key, 'number or string'); - return value; - } - - num = parseInt(value, 10); - - if (!isFinite(num)) - return value; - - return num; + if (this.typeOf(key) === 'string') + return this.hash(key, fallback); + return this.uint(key, fallback); }; /** @@ -433,7 +517,7 @@ Validator.prototype.numstr = function numstr(key, fallback) { */ Validator.prototype.bool = function bool(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -441,13 +525,14 @@ Validator.prototype.bool = function bool(key, fallback) { if (value === null) return fallback; - // bitcoin core mixes semantics of truthiness amoung rpc methods - // most "verbose" parameters are bools, but getrawtransaction is 1/0 - if (value === 1) - return true; + // Bitcoin Core compat. + if (typeof value === 'number') { + if (value === 1) + return true; - if (value === 0) - return false; + if (value === 0) + return false; + } if (typeof value !== 'string') { if (typeof value !== 'boolean') @@ -473,8 +558,7 @@ Validator.prototype.bool = function bool(key, fallback) { */ Validator.prototype.buf = function buf(key, fallback, enc) { - let value = this.get(key); - let data; + const value = this.get(key); if (!enc) enc = 'hex'; @@ -491,7 +575,7 @@ Validator.prototype.buf = function buf(key, fallback, enc) { return value; } - data = Buffer.from(value, enc); + const data = Buffer.from(value, enc); if (data.length !== Buffer.byteLength(value, enc)) throw new ValidationError(key, `${enc} string`); @@ -507,8 +591,7 @@ Validator.prototype.buf = function buf(key, fallback, enc) { */ Validator.prototype.array = function array(key, fallback) { - let value = this.get(key); - let result, parts; + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -522,10 +605,10 @@ Validator.prototype.array = function array(key, fallback) { return value; } - parts = value.trim().split(/\s*,\s*/); - result = []; + const parts = value.trim().split(/\s*,\s*/); + const result = []; - for (let part of parts) { + for (const part of parts) { if (part.length === 0) continue; @@ -543,7 +626,7 @@ Validator.prototype.array = function array(key, fallback) { */ Validator.prototype.obj = function obj(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -551,7 +634,7 @@ Validator.prototype.obj = function obj(key, fallback) { if (value === null) return fallback; - if (!value || typeof value !== 'object') + if (typeof value !== 'object') throw new ValidationError(key, 'object'); return value; @@ -565,7 +648,7 @@ Validator.prototype.obj = function obj(key, fallback) { */ Validator.prototype.func = function func(key, fallback) { - let value = this.get(key); + const value = this.get(key); if (fallback === undefined) fallback = null; @@ -584,18 +667,13 @@ Validator.prototype.func = function func(key, fallback) { */ function fmt(key) { + if (Array.isArray(key)) + key = key[0]; + if (typeof key === 'number') return `Param #${key}`; - return key; -} -function inherits(child, parent) { - child.super_ = parent; - Object.setPrototypeOf(child.prototype, parent.prototype); - Object.defineProperty(child.prototype, 'constructor', { - value: child, - enumerable: false - }); + return key; } function ValidationError(key, type) { @@ -611,14 +689,10 @@ function ValidationError(key, type) { Error.captureStackTrace(this, ValidationError); } -inherits(ValidationError, Error); +Object.setPrototypeOf(ValidationError.prototype, Error.prototype); /* * Expose */ -exports = Validator; -exports.Validator = Validator; -exports.Error = ValidationError; - -module.exports = exports; +module.exports = Validator; diff --git a/lib/utils/writer.js b/lib/utils/writer.js index 6bb7cf1a8..96da456eb 100644 --- a/lib/utils/writer.js +++ b/lib/utils/writer.js @@ -23,23 +23,29 @@ const UI32 = 4; const UI32BE = 5; const UI64 = 6; const UI64BE = 7; -const I8 = 8; -const I16 = 9; -const I16BE = 10; -const I32 = 11; -const I32BE = 12; -const I64 = 13; -const I64BE = 14; -const FL = 15; -const FLBE = 16; -const DBL = 17; -const DBLBE = 18; -const VARINT = 19; -const VARINT2 = 20; -const BYTES = 21; -const STR = 22; -const CHECKSUM = 23; -const FILL = 24; +const UI64N = 8; +const UI64BEN = 9; +const I8 = 10; +const I16 = 11; +const I16BE = 12; +const I32 = 13; +const I32BE = 14; +const I64 = 15; +const I64BE = 16; +const I64N = 17; +const I64BEN = 18; +const FL = 19; +const FLBE = 20; +const DBL = 21; +const DBLBE = 22; +const VARINT = 23; +const VARINTN = 24; +const VARINT2 = 25; +const VARINT2N = 26; +const BYTES = 27; +const STR = 28; +const CHECKSUM = 29; +const FILL = 30; /** * An object that allows writing of buffers in a @@ -60,7 +66,7 @@ function BufferWriter() { return new BufferWriter(); this.ops = []; - this.written = 0; + this.offset = 0; } /** @@ -70,34 +76,98 @@ function BufferWriter() { */ BufferWriter.prototype.render = function render(keep) { - let data = Buffer.allocUnsafe(this.written); + const data = Buffer.allocUnsafe(this.offset); let off = 0; - for (let op of this.ops) { + for (const op of this.ops) { switch (op.type) { - case SEEK: off += op.value; break; - case UI8: off = data.writeUInt8(op.value, off, true); break; - case UI16: off = data.writeUInt16LE(op.value, off, true); break; - case UI16BE: off = data.writeUInt16BE(op.value, off, true); break; - case UI32: off = data.writeUInt32LE(op.value, off, true); break; - case UI32BE: off = data.writeUInt32BE(op.value, off, true); break; - case UI64: off = encoding.writeU64(data, op.value, off); break; - case UI64BE: off = encoding.writeU64BE(data, op.value, off); break; - case I8: off = data.writeInt8(op.value, off, true); break; - case I16: off = data.writeInt16LE(op.value, off, true); break; - case I16BE: off = data.writeInt16BE(op.value, off, true); break; - case I32: off = data.writeInt32LE(op.value, off, true); break; - case I32BE: off = data.writeInt32BE(op.value, off, true); break; - case I64: off = encoding.write64(data, op.value, off); break; - case I64BE: off = encoding.write64BE(data, op.value, off); break; - case FL: off = data.writeFloatLE(op.value, off, true); break; - case FLBE: off = data.writeFloatBE(op.value, off, true); break; - case DBL: off = data.writeDoubleLE(op.value, off, true); break; - case DBLBE: off = data.writeDoubleBE(op.value, off, true); break; - case VARINT: off = encoding.writeVarint(data, op.value, off); break; - case VARINT2: off = encoding.writeVarint2(data, op.value, off); break; - case BYTES: off += op.value.copy(data, off); break; - case STR: off += data.write(op.value, off, op.enc); break; + case SEEK: + off += op.value; + break; + case UI8: + off = data.writeUInt8(op.value, off, true); + break; + case UI16: + off = data.writeUInt16LE(op.value, off, true); + break; + case UI16BE: + off = data.writeUInt16BE(op.value, off, true); + break; + case UI32: + off = data.writeUInt32LE(op.value, off, true); + break; + case UI32BE: + off = data.writeUInt32BE(op.value, off, true); + break; + case UI64: + off = encoding.writeU64(data, op.value, off); + break; + case UI64BE: + off = encoding.writeU64BE(data, op.value, off); + break; + case UI64N: + off = encoding.writeU64N(data, op.value, off); + break; + case UI64BEN: + off = encoding.writeU64BEN(data, op.value, off); + break; + case I8: + off = data.writeInt8(op.value, off, true); + break; + case I16: + off = data.writeInt16LE(op.value, off, true); + break; + case I16BE: + off = data.writeInt16BE(op.value, off, true); + break; + case I32: + off = data.writeInt32LE(op.value, off, true); + break; + case I32BE: + off = data.writeInt32BE(op.value, off, true); + break; + case I64: + off = encoding.writeI64(data, op.value, off); + break; + case I64BE: + off = encoding.writeI64BE(data, op.value, off); + break; + case I64N: + off = encoding.writeI64N(data, op.value, off); + break; + case I64BEN: + off = encoding.writeI64BEN(data, op.value, off); + break; + case FL: + off = data.writeFloatLE(op.value, off, true); + break; + case FLBE: + off = data.writeFloatBE(op.value, off, true); + break; + case DBL: + off = data.writeDoubleLE(op.value, off, true); + break; + case DBLBE: + off = data.writeDoubleBE(op.value, off, true); + break; + case VARINT: + off = encoding.writeVarint(data, op.value, off); + break; + case VARINTN: + off = encoding.writeVarintN(data, op.value, off); + break; + case VARINT2: + off = encoding.writeVarint2(data, op.value, off); + break; + case VARINT2N: + off = encoding.writeVarint2N(data, op.value, off); + break; + case BYTES: + off += op.value.copy(data, off); + break; + case STR: + off += data.write(op.value, off, op.enc); + break; case CHECKSUM: off += digest.hash256(data.slice(0, off)).copy(data, off, 0, 4); break; @@ -125,7 +195,7 @@ BufferWriter.prototype.render = function render(keep) { */ BufferWriter.prototype.getSize = function getSize() { - return this.written; + return this.offset; }; /** @@ -134,7 +204,7 @@ BufferWriter.prototype.getSize = function getSize() { */ BufferWriter.prototype.seek = function seek(offset) { - this.written += offset; + this.offset += offset; this.ops.push(new WriteOp(SEEK, offset)); }; @@ -144,8 +214,7 @@ BufferWriter.prototype.seek = function seek(offset) { BufferWriter.prototype.destroy = function destroy() { this.ops.length = 0; - this.ops = null; - this.written = null; + this.offset = 0; }; /** @@ -154,7 +223,7 @@ BufferWriter.prototype.destroy = function destroy() { */ BufferWriter.prototype.writeU8 = function writeU8(value) { - this.written += 1; + this.offset += 1; this.ops.push(new WriteOp(UI8, value)); }; @@ -164,7 +233,7 @@ BufferWriter.prototype.writeU8 = function writeU8(value) { */ BufferWriter.prototype.writeU16 = function writeU16(value) { - this.written += 2; + this.offset += 2; this.ops.push(new WriteOp(UI16, value)); }; @@ -174,7 +243,7 @@ BufferWriter.prototype.writeU16 = function writeU16(value) { */ BufferWriter.prototype.writeU16BE = function writeU16BE(value) { - this.written += 2; + this.offset += 2; this.ops.push(new WriteOp(UI16BE, value)); }; @@ -184,7 +253,7 @@ BufferWriter.prototype.writeU16BE = function writeU16BE(value) { */ BufferWriter.prototype.writeU32 = function writeU32(value) { - this.written += 4; + this.offset += 4; this.ops.push(new WriteOp(UI32, value)); }; @@ -194,7 +263,7 @@ BufferWriter.prototype.writeU32 = function writeU32(value) { */ BufferWriter.prototype.writeU32BE = function writeU32BE(value) { - this.written += 4; + this.offset += 4; this.ops.push(new WriteOp(UI32BE, value)); }; @@ -204,7 +273,7 @@ BufferWriter.prototype.writeU32BE = function writeU32BE(value) { */ BufferWriter.prototype.writeU64 = function writeU64(value) { - this.written += 8; + this.offset += 8; this.ops.push(new WriteOp(UI64, value)); }; @@ -214,26 +283,28 @@ BufferWriter.prototype.writeU64 = function writeU64(value) { */ BufferWriter.prototype.writeU64BE = function writeU64BE(value) { - this.written += 8; + this.offset += 8; this.ops.push(new WriteOp(UI64BE, value)); }; /** * Write uint64le. - * @param {BN} value + * @param {U64} value */ -BufferWriter.prototype.writeU64BN = function writeU64BN(value) { - assert(false, 'Not implemented.'); +BufferWriter.prototype.writeU64N = function writeU64N(value) { + this.offset += 8; + this.ops.push(new WriteOp(UI64N, value)); }; /** * Write uint64be. - * @param {BN} value + * @param {U64} value */ -BufferWriter.prototype.writeU64BEBN = function writeU64BEBN(value) { - assert(false, 'Not implemented.'); +BufferWriter.prototype.writeU64BEN = function writeU64BEN(value) { + this.offset += 8; + this.ops.push(new WriteOp(UI64BEN, value)); }; /** @@ -241,8 +312,8 @@ BufferWriter.prototype.writeU64BEBN = function writeU64BEBN(value) { * @param {Number} value */ -BufferWriter.prototype.write8 = function write8(value) { - this.written += 1; +BufferWriter.prototype.writeI8 = function writeI8(value) { + this.offset += 1; this.ops.push(new WriteOp(I8, value)); }; @@ -251,8 +322,8 @@ BufferWriter.prototype.write8 = function write8(value) { * @param {Number} value */ -BufferWriter.prototype.write16 = function write16(value) { - this.written += 2; +BufferWriter.prototype.writeI16 = function writeI16(value) { + this.offset += 2; this.ops.push(new WriteOp(I16, value)); }; @@ -261,8 +332,8 @@ BufferWriter.prototype.write16 = function write16(value) { * @param {Number} value */ -BufferWriter.prototype.write16BE = function write16BE(value) { - this.written += 2; +BufferWriter.prototype.writeI16BE = function writeI16BE(value) { + this.offset += 2; this.ops.push(new WriteOp(I16BE, value)); }; @@ -271,8 +342,8 @@ BufferWriter.prototype.write16BE = function write16BE(value) { * @param {Number} value */ -BufferWriter.prototype.write32 = function write32(value) { - this.written += 4; +BufferWriter.prototype.writeI32 = function writeI32(value) { + this.offset += 4; this.ops.push(new WriteOp(I32, value)); }; @@ -281,8 +352,8 @@ BufferWriter.prototype.write32 = function write32(value) { * @param {Number} value */ -BufferWriter.prototype.write32BE = function write32BE(value) { - this.written += 4; +BufferWriter.prototype.writeI32BE = function writeI32BE(value) { + this.offset += 4; this.ops.push(new WriteOp(I32BE, value)); }; @@ -291,8 +362,8 @@ BufferWriter.prototype.write32BE = function write32BE(value) { * @param {Number} value */ -BufferWriter.prototype.write64 = function write64(value) { - this.written += 8; +BufferWriter.prototype.writeI64 = function writeI64(value) { + this.offset += 8; this.ops.push(new WriteOp(I64, value)); }; @@ -301,27 +372,29 @@ BufferWriter.prototype.write64 = function write64(value) { * @param {Number} value */ -BufferWriter.prototype.write64BE = function write64BE(value) { - this.written += 8; +BufferWriter.prototype.writeI64BE = function writeI64BE(value) { + this.offset += 8; this.ops.push(new WriteOp(I64BE, value)); }; /** * Write int64le. - * @param {BN} value + * @param {I64} value */ -BufferWriter.prototype.write64BN = function write64BN(value) { - assert(false, 'Not implemented.'); +BufferWriter.prototype.writeI64N = function writeI64N(value) { + this.offset += 8; + this.ops.push(new WriteOp(I64N, value)); }; /** * Write int64be. - * @param {BN} value + * @param {I64} value */ -BufferWriter.prototype.write64BEBN = function write64BEBN(value) { - assert(false, 'Not implemented.'); +BufferWriter.prototype.writeI64BEN = function writeI64BEN(value) { + this.offset += 8; + this.ops.push(new WriteOp(I64BEN, value)); }; /** @@ -330,7 +403,7 @@ BufferWriter.prototype.write64BEBN = function write64BEBN(value) { */ BufferWriter.prototype.writeFloat = function writeFloat(value) { - this.written += 4; + this.offset += 4; this.ops.push(new WriteOp(FL, value)); }; @@ -340,7 +413,7 @@ BufferWriter.prototype.writeFloat = function writeFloat(value) { */ BufferWriter.prototype.writeFloatBE = function writeFloatBE(value) { - this.written += 4; + this.offset += 4; this.ops.push(new WriteOp(FLBE, value)); }; @@ -350,7 +423,7 @@ BufferWriter.prototype.writeFloatBE = function writeFloatBE(value) { */ BufferWriter.prototype.writeDouble = function writeDouble(value) { - this.written += 8; + this.offset += 8; this.ops.push(new WriteOp(DBL, value)); }; @@ -360,7 +433,7 @@ BufferWriter.prototype.writeDouble = function writeDouble(value) { */ BufferWriter.prototype.writeDoubleBE = function writeDoubleBE(value) { - this.written += 8; + this.offset += 8; this.ops.push(new WriteOp(DBLBE, value)); }; @@ -370,17 +443,18 @@ BufferWriter.prototype.writeDoubleBE = function writeDoubleBE(value) { */ BufferWriter.prototype.writeVarint = function writeVarint(value) { - this.written += encoding.sizeVarint(value); + this.offset += encoding.sizeVarint(value); this.ops.push(new WriteOp(VARINT, value)); }; /** * Write a varint. - * @param {BN} value + * @param {U64} value */ -BufferWriter.prototype.writeVarintBN = function writeVarintBN(value) { - assert(false, 'Not implemented.'); +BufferWriter.prototype.writeVarintN = function writeVarintN(value) { + this.offset += encoding.sizeVarintN(value); + this.ops.push(new WriteOp(VARINTN, value)); }; /** @@ -389,17 +463,18 @@ BufferWriter.prototype.writeVarintBN = function writeVarintBN(value) { */ BufferWriter.prototype.writeVarint2 = function writeVarint2(value) { - this.written += encoding.sizeVarint2(value); + this.offset += encoding.sizeVarint2(value); this.ops.push(new WriteOp(VARINT2, value)); }; /** * Write a varint (type 2). - * @param {BN} value + * @param {U64} value */ -BufferWriter.prototype.writeVarint2BN = function writeVarint2BN(value) { - assert(false, 'Not implemented.'); +BufferWriter.prototype.writeVarint2N = function writeVarint2N(value) { + this.offset += encoding.sizeVarint2N(value); + this.ops.push(new WriteOp(VARINT2N, value)); }; /** @@ -411,7 +486,7 @@ BufferWriter.prototype.writeBytes = function writeBytes(value) { if (value.length === 0) return; - this.written += value.length; + this.offset += value.length; this.ops.push(new WriteOp(BYTES, value)); }; @@ -421,13 +496,13 @@ BufferWriter.prototype.writeBytes = function writeBytes(value) { */ BufferWriter.prototype.writeVarBytes = function writeVarBytes(value) { - this.written += encoding.sizeVarint(value.length); + this.offset += encoding.sizeVarint(value.length); this.ops.push(new WriteOp(VARINT, value.length)); if (value.length === 0) return; - this.written += value.length; + this.offset += value.length; this.ops.push(new WriteOp(BYTES, value)); }; @@ -454,7 +529,7 @@ BufferWriter.prototype.writeString = function writeString(value, enc) { if (value.length === 0) return; - this.written += Buffer.byteLength(value, enc); + this.offset += Buffer.byteLength(value, enc); this.ops.push(new WriteOp(STR, value, enc)); }; @@ -466,7 +541,8 @@ BufferWriter.prototype.writeString = function writeString(value, enc) { BufferWriter.prototype.writeHash = function writeHash(value) { if (typeof value !== 'string') { assert(value.length === 32); - return this.writeBytes(value); + this.writeBytes(value); + return; } assert(value.length === 64); this.writeString(value, 'hex'); @@ -479,17 +555,15 @@ BufferWriter.prototype.writeHash = function writeHash(value) { */ BufferWriter.prototype.writeVarString = function writeVarString(value, enc) { - let size; - if (value.length === 0) { this.ops.push(new WriteOp(VARINT, 0)); return; } - size = Buffer.byteLength(value, enc); + const size = Buffer.byteLength(value, enc); - this.written += encoding.sizeVarint(size); - this.written += size; + this.offset += encoding.sizeVarint(size); + this.offset += size; this.ops.push(new WriteOp(VARINT, size)); @@ -512,7 +586,7 @@ BufferWriter.prototype.writeNullString = function writeNullString(value, enc) { */ BufferWriter.prototype.writeChecksum = function writeChecksum() { - this.written += 4; + this.offset += 4; this.ops.push(new WriteOp(CHECKSUM)); }; @@ -528,7 +602,7 @@ BufferWriter.prototype.fill = function fill(value, size) { if (size === 0) return; - this.written += size; + this.offset += size; this.ops.push(new WriteOp(FILL, value, null, size)); }; diff --git a/lib/wallet/account.js b/lib/wallet/account.js index 013aad348..024d14f93 100644 --- a/lib/wallet/account.js +++ b/lib/wallet/account.js @@ -105,10 +105,10 @@ Account.typesByVal = { Account.prototype.fromOptions = function fromOptions(options) { assert(options, 'Options are required.'); - assert(util.isNumber(options.wid)); + assert(util.isU32(options.wid)); assert(common.isName(options.id), 'Bad Wallet ID.'); assert(HD.isHD(options.accountKey), 'Account key is required.'); - assert(util.isNumber(options.accountIndex), 'Account index is required.'); + assert(util.isU32(options.accountIndex), 'Account index is required.'); this.wid = options.wid; this.id = options.id; @@ -145,37 +145,37 @@ Account.prototype.fromOptions = function fromOptions(options) { } if (options.m != null) { - assert(util.isNumber(options.m)); + assert(util.isU8(options.m)); this.m = options.m; } if (options.n != null) { - assert(util.isNumber(options.n)); + assert(util.isU8(options.n)); this.n = options.n; } if (options.accountIndex != null) { - assert(util.isNumber(options.accountIndex)); + assert(util.isU32(options.accountIndex)); this.accountIndex = options.accountIndex; } if (options.receiveDepth != null) { - assert(util.isNumber(options.receiveDepth)); + assert(util.isU32(options.receiveDepth)); this.receiveDepth = options.receiveDepth; } if (options.changeDepth != null) { - assert(util.isNumber(options.changeDepth)); + assert(util.isU32(options.changeDepth)); this.changeDepth = options.changeDepth; } if (options.nestedDepth != null) { - assert(util.isNumber(options.nestedDepth)); + assert(util.isU32(options.nestedDepth)); this.nestedDepth = options.nestedDepth; } if (options.lookahead != null) { - assert(util.isNumber(options.lookahead)); + assert(util.isU32(options.lookahead)); assert(options.lookahead >= 0); assert(options.lookahead <= Account.MAX_LOOKAHEAD); this.lookahead = options.lookahead; @@ -187,14 +187,14 @@ Account.prototype.fromOptions = function fromOptions(options) { this.type = Account.types.MULTISIG; if (!this.name) - this.name = this.accountIndex + ''; + this.name = this.accountIndex.toString(10); if (this.m < 1 || this.m > this.n) throw new Error('m ranges between 1 and n'); if (options.keys) { assert(Array.isArray(options.keys)); - for (let key of options.keys) + for (const key of options.keys) this.pushKey(key); } @@ -274,8 +274,6 @@ Account.prototype.open = function open() { */ Account.prototype.pushKey = function pushKey(key) { - let index; - if (typeof key === 'string') key = HD.PublicKey.fromBase58(key, this.network); @@ -285,16 +283,16 @@ Account.prototype.pushKey = function pushKey(key) { if (!HD.isPublic(key)) throw new Error('Must add HD keys to wallet.'); - if (!key.isBIP44()) + if (!key.isAccount()) throw new Error('Must add HD account keys to BIP44 wallet.'); if (this.type !== Account.types.MULTISIG) throw new Error('Cannot add keys to non-multisig wallet.'); - if (key.equal(this.accountKey)) + if (key.equals(this.accountKey)) throw new Error('Cannot add own key.'); - index = util.binaryInsert(this.keys, key, cmp, true); + const index = util.binaryInsert(this.keys, key, cmp, true); if (index === -1) return false; @@ -325,7 +323,7 @@ Account.prototype.spliceKey = function spliceKey(key) { if (!HD.isPublic(key)) throw new Error('Must add HD keys to wallet.'); - if (!key.isBIP44()) + if (!key.isAccount()) throw new Error('Must add HD account keys to BIP44 wallet.'); if (this.type !== Account.types.MULTISIG) @@ -345,10 +343,9 @@ Account.prototype.spliceKey = function spliceKey(key) { */ Account.prototype.addSharedKey = async function addSharedKey(key) { - let result = this.pushKey(key); - let exists = await this._hasDuplicate(); + const result = this.pushKey(key); - if (exists) { + if (await this.hasDuplicate()) { this.spliceKey(key); throw new Error('Cannot add a key from another account.'); } @@ -365,14 +362,12 @@ Account.prototype.addSharedKey = async function addSharedKey(key) { * @returns {Promise} */ -Account.prototype._hasDuplicate = function _hasDuplicate() { - let ring, hash; - +Account.prototype.hasDuplicate = function hasDuplicate() { if (this.keys.length !== this.n - 1) return false; - ring = this.deriveReceive(0); - hash = ring.getScriptHash('hex'); + const ring = this.deriveReceive(0); + const hash = ring.getScriptHash('hex'); return this.wallet.hasAddress(hash); }; @@ -385,7 +380,7 @@ Account.prototype._hasDuplicate = function _hasDuplicate() { */ Account.prototype.removeSharedKey = function removeSharedKey(key) { - let result = this.spliceKey(key); + const result = this.spliceKey(key); if (!result) return false; @@ -503,28 +498,29 @@ Account.prototype.deriveNested = function deriveNested(index, master) { */ Account.prototype.derivePath = function derivePath(path, master) { - let data = path.data; - let ring; - switch (path.keyType) { - case Path.types.HD: + case Path.types.HD: { return this.deriveKey(path.branch, path.index, master); - case Path.types.KEY: + } + case Path.types.KEY: { assert(this.type === Account.types.PUBKEYHASH); + let data = path.data; + if (path.encrypted) { data = master.decipher(data, path.hash); if (!data) - return; + return null; } - ring = WalletKey.fromImport(this, data); - - return ring; - case Path.types.ADDRESS: - return; - default: - assert(false, 'Bad key type.'); + return WalletKey.fromImport(this, data); + } + case Path.types.ADDRESS: { + return null; + } + default: { + throw new Error('Bad key type.'); + } } }; @@ -536,19 +532,19 @@ Account.prototype.derivePath = function derivePath(path, master) { */ Account.prototype.deriveKey = function deriveKey(branch, index, master) { - let keys = []; - let key, shared, ring; - assert(typeof branch === 'number'); + const keys = []; + + let key; if (master && master.key && !this.watchOnly) { - key = master.key.deriveBIP44(this.accountIndex); + key = master.key.deriveAccount(44, this.accountIndex); key = key.derive(branch).derive(index); } else { key = this.accountKey.derive(branch).derive(index); } - ring = WalletKey.fromHD(this, key, branch, index); + const ring = WalletKey.fromHD(this, key, branch, index); switch (this.type) { case Account.types.PUBKEYHASH: @@ -556,9 +552,9 @@ Account.prototype.deriveKey = function deriveKey(branch, index, master) { case Account.types.MULTISIG: keys.push(key.publicKey); - for (shared of this.keys) { - shared = shared.derive(branch).derive(index); - keys.push(shared.publicKey); + for (const shared of this.keys) { + const key = shared.derive(branch).derive(index); + keys.push(key.publicKey); } ring.script = Script.fromMultisig(this.m, this.n, keys); @@ -613,7 +609,7 @@ Account.prototype.initDepth = async function initDepth() { // Lookahead for (let i = 0; i < this.lookahead; i++) { - let key = this.deriveReceive(i + 1); + const key = this.deriveReceive(i + 1); await this.saveKey(key); } @@ -625,7 +621,7 @@ Account.prototype.initDepth = async function initDepth() { // Lookahead for (let i = 0; i < this.lookahead; i++) { - let key = this.deriveChange(i + 1); + const key = this.deriveChange(i + 1); await this.saveKey(key); } @@ -638,7 +634,7 @@ Account.prototype.initDepth = async function initDepth() { // Lookahead for (let i = 0; i < this.lookahead; i++) { - let key = this.deriveNested(i + 1); + const key = this.deriveNested(i + 1); await this.saveKey(key); } } @@ -659,12 +655,12 @@ Account.prototype.syncDepth = async function syncDepth(receive, change, nested) let result = null; if (receive > this.receiveDepth) { - let depth = this.receiveDepth + this.lookahead; + const depth = this.receiveDepth + this.lookahead; assert(receive <= depth + 1); for (let i = depth; i < receive + this.lookahead; i++) { - let key = this.deriveReceive(i); + const key = this.deriveReceive(i); await this.saveKey(key); } @@ -676,12 +672,12 @@ Account.prototype.syncDepth = async function syncDepth(receive, change, nested) } if (change > this.changeDepth) { - let depth = this.changeDepth + this.lookahead; + const depth = this.changeDepth + this.lookahead; assert(change <= depth + 1); for (let i = depth; i < change + this.lookahead; i++) { - let key = this.deriveChange(i); + const key = this.deriveChange(i); await this.saveKey(key); } @@ -692,12 +688,12 @@ Account.prototype.syncDepth = async function syncDepth(receive, change, nested) } if (this.witness && nested > this.nestedDepth) { - let depth = this.nestedDepth + this.lookahead; + const depth = this.nestedDepth + this.lookahead; assert(nested <= depth + 1); for (let i = depth; i < nested + this.lookahead; i++) { - let key = this.deriveNested(i); + const key = this.deriveNested(i); await this.saveKey(key); } @@ -721,8 +717,6 @@ Account.prototype.syncDepth = async function syncDepth(receive, change, nested) */ Account.prototype.setLookahead = async function setLookahead(lookahead) { - let depth, target; - if (lookahead === this.lookahead) { this.db.logger.warning( 'Lookahead is not changing for: %s/%s.', @@ -731,7 +725,7 @@ Account.prototype.setLookahead = async function setLookahead(lookahead) { } if (lookahead < this.lookahead) { - let diff = this.lookahead - lookahead; + const diff = this.lookahead - lookahead; this.receiveDepth += diff; this.receive = this.deriveReceive(this.receiveDepth - 1); @@ -751,28 +745,32 @@ Account.prototype.setLookahead = async function setLookahead(lookahead) { return; } - depth = this.receiveDepth + this.lookahead; - target = this.receiveDepth + lookahead; + { + const depth = this.receiveDepth + this.lookahead; + const target = this.receiveDepth + lookahead; - for (let i = depth; i < target; i++) { - let key = this.deriveReceive(i); - await this.saveKey(key); + for (let i = depth; i < target; i++) { + const key = this.deriveReceive(i); + await this.saveKey(key); + } } - depth = this.changeDepth + this.lookahead; - target = this.changeDepth + lookahead; + { + const depth = this.changeDepth + this.lookahead; + const target = this.changeDepth + lookahead; - for (let i = depth; i < target; i++) { - let key = this.deriveChange(i); - await this.saveKey(key); + for (let i = depth; i < target; i++) { + const key = this.deriveChange(i); + await this.saveKey(key); + } } if (this.witness) { - let depth = this.nestedDepth + this.lookahead; - let target = this.nestedDepth + lookahead; + const depth = this.nestedDepth + this.lookahead; + const target = this.nestedDepth + lookahead; for (let i = depth; i < target; i++) { - let key = this.deriveNested(i); + const key = this.deriveNested(i); await this.saveKey(key); } } @@ -799,7 +797,7 @@ Account.prototype.getAddress = function getAddress(enc) { Account.prototype.getReceive = function getReceive(enc) { if (!this.receive) - return; + return null; return this.receive.getAddress(enc); }; @@ -811,7 +809,8 @@ Account.prototype.getReceive = function getReceive(enc) { Account.prototype.getChange = function getChange(enc) { if (!this.change) - return; + return null; + return this.change.getAddress(enc); }; @@ -823,7 +822,8 @@ Account.prototype.getChange = function getChange(enc) { Account.prototype.getNested = function getNested(enc) { if (!this.nested) - return; + return null; + return this.nested.getAddress(enc); }; @@ -918,8 +918,8 @@ Account.prototype.getSize = function getSize() { */ Account.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); bw.writeVarString(this.name, 'ascii'); bw.writeU8(this.initialized ? 1 : 0); @@ -935,7 +935,7 @@ Account.prototype.toRaw = function toRaw() { bw.writeBytes(this.accountKey.toRaw()); bw.writeU8(this.keys.length); - for (let key of this.keys) + for (const key of this.keys) bw.writeBytes(key.toRaw()); return bw.render(); @@ -949,8 +949,7 @@ Account.prototype.toRaw = function toRaw() { */ Account.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let count; + const br = new BufferReader(data); this.name = br.readVarString('ascii'); this.initialized = br.readU8() === 1; @@ -967,10 +966,10 @@ Account.prototype.fromRaw = function fromRaw(data) { assert(Account.typesByVal[this.type]); - count = br.readU8(); + const count = br.readU8(); for (let i = 0; i < count; i++) { - let key = HD.PublicKey.fromRaw(br.readBytes(82)); + const key = HD.PublicKey.fromRaw(br.readBytes(82)); this.pushKey(key); } @@ -1004,8 +1003,8 @@ Account.isAccount = function isAccount(obj) { * Helpers */ -function cmp(key1, key2) { - return key1.compare(key2); +function cmp(a, b) { + return a.compare(b); } /* diff --git a/lib/wallet/client.js b/lib/wallet/client.js index f3f0ef543..e5281f923 100644 --- a/lib/wallet/client.js +++ b/lib/wallet/client.js @@ -44,7 +44,7 @@ function WalletClient(options) { this.socket = null; } -util.inherits(WalletClient, AsyncObject); +Object.setPrototypeOf(WalletClient.prototype, AsyncObject.prototype); /** * Open the client, wait for socket to connect. @@ -100,7 +100,8 @@ WalletClient.prototype._open = async function _open() { block = parseBlock(entry, txs); } catch (e) { this.emit('error', e); - return cb(); + cb(); + return; } this.fire('block rescan', block.entry, block.txs).then(cb, cb); @@ -141,7 +142,7 @@ WalletClient.prototype._open = async function _open() { * @returns {Promise} */ -WalletClient.prototype._close = function close() { +WalletClient.prototype._close = function _close() { if (!this.socket) return Promise.resolve(); @@ -309,27 +310,26 @@ WalletClient.prototype.rescan = function rescan(start) { */ function parseEntry(data, enc) { - let br, block, hash, height; - if (typeof data === 'string') data = Buffer.from(data, 'hex'); - block = Headers.fromAbbr(data); + const block = Headers.fromHead(data); - br = new BufferReader(data); + const br = new BufferReader(data); br.seek(80); - height = br.readU32(); - hash = block.hash('hex'); - return new BlockMeta(hash, height, block.ts); + const height = br.readU32(); + const hash = block.hash('hex'); + + return new BlockMeta(hash, height, block.time); } function parseBlock(entry, txs) { - let block = parseEntry(entry); - let out = []; + const block = parseEntry(entry); + const out = []; - for (let tx of txs) { - tx = parseTX(tx); + for (const raw of txs) { + const tx = parseTX(raw); out.push(tx); } diff --git a/lib/wallet/common.js b/lib/wallet/common.js index 71ee62dba..5f45ed659 100644 --- a/lib/wallet/common.js +++ b/lib/wallet/common.js @@ -56,7 +56,7 @@ common.isName = function isName(key) { common.sortTX = function sortTX(txs) { return txs.sort((a, b) => { - return a.ps - b.ps; + return a.mtime - b.mtime; }); }; @@ -81,36 +81,36 @@ common.sortCoins = function sortCoins(coins) { */ common.sortDeps = function sortDeps(txs) { - let depMap = {}; - let count = {}; - let result = []; - let top = []; - let map = {}; - - for (let tx of txs) { - let hash = tx.hash('hex'); - map[hash] = tx; + const map = new Map(); + + for (const tx of txs) { + const hash = tx.hash('hex'); + map.set(hash, tx); } - for (let tx of txs) { - let hash = tx.hash('hex'); - let hasDeps = false; + const depMap = new Map(); + const depCount = new Map(); + const top = []; + + for (const [hash, tx] of map) { + depCount.set(hash, 0); - count[hash] = 0; + let hasDeps = false; - for (let input of tx.inputs) { - let prev = input.prevout.hash; + for (const input of tx.inputs) { + const prev = input.prevout.hash; - if (!map[prev]) + if (!map.has(prev)) continue; - count[hash] += 1; + const count = depCount.get(hash); + depCount.set(hash, count + 1); hasDeps = true; - if (!depMap[prev]) - depMap[prev] = []; + if (!depMap.has(prev)) + depMap.set(prev, []); - depMap[prev].push(tx); + depMap.get(prev).push(tx); } if (hasDeps) @@ -119,20 +119,25 @@ common.sortDeps = function sortDeps(txs) { top.push(tx); } - for (let tx of top) { - let hash = tx.hash('hex'); - let deps = depMap[hash]; + const result = []; + + for (const tx of top) { + const hash = tx.hash('hex'); + const deps = depMap.get(hash); result.push(tx); if (!deps) continue; - for (let tx of deps) { - let hash = tx.hash('hex'); + for (const tx of deps) { + const hash = tx.hash('hex'); + let count = depCount.get(hash); - if (--count[hash] === 0) + if (--count === 0) top.push(tx); + + depCount.set(hash, count); } } diff --git a/lib/wallet/http.js b/lib/wallet/http.js index 271bd2098..1fc55bd2e 100644 --- a/lib/wallet/http.js +++ b/lib/wallet/http.js @@ -20,6 +20,8 @@ const random = require('../crypto/random'); const ccmp = require('../crypto/ccmp'); const Network = require('../protocol/network'); const Validator = require('../utils/validator'); +const Address = require('../primitives/address'); +const KeyRing = require('../primitives/keyring'); const common = require('./common'); /** @@ -50,7 +52,7 @@ function HTTPServer(options) { this.init(); } -util.inherits(HTTPServer, HTTPBase); +Object.setPrototypeOf(HTTPServer.prototype, HTTPBase.prototype); /** * Attach to server. @@ -107,8 +109,7 @@ HTTPServer.prototype.initRouter = function initRouter() { this.use(this.jsonRPC(this.rpc)); this.hook(async (req, res) => { - let valid = req.valid(); - let id, token, wallet; + const valid = req.valid(); if (req.path.length === 0) return; @@ -119,11 +120,11 @@ HTTPServer.prototype.initRouter = function initRouter() { if (req.method === 'PUT' && req.path.length === 1) return; - id = valid.str('id'); - token = valid.buf('token'); + const id = valid.str('id'); + const token = valid.buf('token'); if (!this.options.walletAuth) { - wallet = await this.walletdb.get(id); + const wallet = await this.walletdb.get(id); if (!wallet) { res.send(404); @@ -135,6 +136,7 @@ HTTPServer.prototype.initRouter = function initRouter() { return; } + let wallet; try { wallet = await this.walletdb.auth(id, token); } catch (err) { @@ -155,8 +157,8 @@ HTTPServer.prototype.initRouter = function initRouter() { // Rescan this.post('/_admin/rescan', async (req, res) => { - let valid = req.valid(); - let height = valid.u32('height'); + const valid = req.valid(); + const height = valid.u32('height'); res.send(200, { success: true }); @@ -171,8 +173,8 @@ HTTPServer.prototype.initRouter = function initRouter() { // Backup WalletDB this.post('/_admin/backup', async (req, res) => { - let valid = req.valid(); - let path = valid.str('path'); + const valid = req.valid(); + const path = valid.str('path'); enforce(path, 'Path is required.'); @@ -183,7 +185,7 @@ HTTPServer.prototype.initRouter = function initRouter() { // List wallets this.get('/_admin/wallets', async (req, res) => { - let wallets = await this.walletdb.getWallets(); + const wallets = await this.walletdb.getWallets(); res.send(200, wallets); }); @@ -199,10 +201,9 @@ HTTPServer.prototype.initRouter = function initRouter() { // Create wallet (compat) this.post('/', async (req, res) => { - let valid = req.valid(); - let wallet; + const valid = req.valid(); - wallet = await this.walletdb.create({ + const wallet = await this.walletdb.create({ id: valid.str('id'), type: valid.str('type'), m: valid.u32('m'), @@ -220,10 +221,9 @@ HTTPServer.prototype.initRouter = function initRouter() { // Create wallet this.put('/:id', async (req, res) => { - let valid = req.valid(); - let wallet; + const valid = req.valid(); - wallet = await this.walletdb.create({ + const wallet = await this.walletdb.create({ id: valid.str('id'), type: valid.str('type'), m: valid.u32('m'), @@ -241,15 +241,15 @@ HTTPServer.prototype.initRouter = function initRouter() { // List accounts this.get('/:id/account', async (req, res) => { - let accounts = await req.wallet.getAccounts(); + const accounts = await req.wallet.getAccounts(); res.send(200, accounts); }); // Get account this.get('/:id/account/:account', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let account = await req.wallet.getAccount(acct); + const valid = req.valid(); + const acct = valid.str('account'); + const account = await req.wallet.getAccount(acct); if (!account) { res.send(404); @@ -261,11 +261,10 @@ HTTPServer.prototype.initRouter = function initRouter() { // Create account (compat) this.post('/:id/account', async (req, res) => { - let valid = req.valid(); - let passphrase = valid.str('passphrase'); - let options, account; + const valid = req.valid(); + const passphrase = valid.str('passphrase'); - options = { + const options = { name: valid.str(['account', 'name']), witness: valid.bool('witness'), watchOnly: valid.bool('watchOnly'), @@ -276,23 +275,17 @@ HTTPServer.prototype.initRouter = function initRouter() { lookahead: valid.u32('lookahead') }; - account = await req.wallet.createAccount(options, passphrase); - - if (!account) { - res.send(404); - return; - } + const account = await req.wallet.createAccount(options, passphrase); res.send(200, account.toJSON()); }); // Create account this.put('/:id/account/:account', async (req, res) => { - let valid = req.valid(); - let passphrase = valid.str('passphrase'); - let options, account; + const valid = req.valid(); + const passphrase = valid.str('passphrase'); - options = { + const options = { name: valid.str('account'), witness: valid.bool('witness'), watchOnly: valid.bool('watchOnly'), @@ -303,33 +296,34 @@ HTTPServer.prototype.initRouter = function initRouter() { lookahead: valid.u32('lookahead') }; - account = await req.wallet.createAccount(options, passphrase); - - if (!account) { - res.send(404); - return; - } + const account = await req.wallet.createAccount(options, passphrase); res.send(200, account.toJSON()); }); // Change passphrase this.post('/:id/passphrase', async (req, res) => { - let valid = req.valid(); - let old = valid.str('old'); - let new_ = valid.str('new'); + const valid = req.valid(); + const old = valid.str('old'); + const new_ = valid.str('new'); + enforce(old || new_, 'Passphrase is required.'); + await req.wallet.setPassphrase(old, new_); + res.send(200, { success: true }); }); // Unlock wallet this.post('/:id/unlock', async (req, res) => { - let valid = req.valid(); - let passphrase = valid.str('passphrase'); - let timeout = valid.u32('timeout'); + const valid = req.valid(); + const passphrase = valid.str('passphrase'); + const timeout = valid.u32('timeout'); + enforce(passphrase, 'Passphrase is required.'); + await req.wallet.unlock(passphrase, timeout); + res.send(200, { success: true }); }); @@ -341,26 +335,29 @@ HTTPServer.prototype.initRouter = function initRouter() { // Import key this.post('/:id/import', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let pub = valid.str('publicKey'); - let priv = valid.str('privateKey'); - let address = valid.str('address'); + const valid = req.valid(); + const acct = valid.str('account'); + const pub = valid.buf('publicKey'); + const priv = valid.str('privateKey'); + const b58 = valid.str('address'); if (pub) { - await req.wallet.importKey(acct, pub); + const key = KeyRing.fromPublic(pub, this.network); + await req.wallet.importKey(acct, key); res.send(200, { success: true }); return; } if (priv) { - await req.wallet.importKey(acct, priv); + const key = KeyRing.fromSecret(priv, this.network); + await req.wallet.importKey(acct, key); res.send(200, { success: true }); return; } - if (address) { - await req.wallet.importAddress(acct, address); + if (b58) { + const addr = Address.fromString(b58, this.network); + await req.wallet.importAddress(acct, addr); res.send(200, { success: true }); return; } @@ -370,38 +367,40 @@ HTTPServer.prototype.initRouter = function initRouter() { // Generate new token this.post('/:id/retoken', async (req, res) => { - let valid = req.valid(); - let passphrase = valid.str('passphrase'); - let token = await req.wallet.retoken(passphrase); - res.send(200, { token: token.toString('hex') }); + const valid = req.valid(); + const passphrase = valid.str('passphrase'); + const token = await req.wallet.retoken(passphrase); + + res.send(200, { + token: token.toString('hex') + }); }); // Send TX this.post('/:id/send', async (req, res) => { - let valid = req.valid(); - let passphrase = valid.str('passphrase'); - let outputs = valid.array('outputs'); - let options, tx, details; + const valid = req.valid(); + const passphrase = valid.str('passphrase'); + const outputs = valid.array('outputs'); - options = { + const options = { rate: valid.u64('rate'), blocks: valid.u32('blocks'), maxFee: valid.u64('maxFee'), selection: valid.str('selection'), smart: valid.bool('smart'), subtractFee: valid.bool('subtractFee'), + subtractIndex: valid.i32('subtractIndex'), depth: valid.u32(['confirmations', 'depth']), outputs: [] }; - for (let output of outputs) { - let valid = new Validator([output]); + for (const output of outputs) { + const valid = new Validator([output]); + const raw = valid.buf('script'); let script = null; - if (valid.has('script')) { - script = valid.buf('script'); - script = Script.fromRaw(script); - } + if (raw) + script = Script.fromRaw(raw); options.outputs.push({ script: script, @@ -410,38 +409,37 @@ HTTPServer.prototype.initRouter = function initRouter() { }); } - tx = await req.wallet.send(options, passphrase); + const tx = await req.wallet.send(options, passphrase); - details = await req.wallet.getDetails(tx.hash('hex')); + const details = await req.wallet.getDetails(tx.hash('hex')); res.send(200, details.toJSON()); }); // Create TX this.post('/:id/create', async (req, res) => { - let valid = req.valid(); - let passphrase = valid.str('passphrase'); - let outputs = valid.array('outputs'); - let options, tx; + const valid = req.valid(); + const passphrase = valid.str('passphrase'); + const outputs = valid.array('outputs'); - options = { + const options = { rate: valid.u64('rate'), maxFee: valid.u64('maxFee'), selection: valid.str('selection'), smart: valid.bool('smart'), subtractFee: valid.bool('subtractFee'), + subtractIndex: valid.i32('subtractIndex'), depth: valid.u32(['confirmations', 'depth']), outputs: [] }; - for (let output of outputs) { - let valid = new Validator([output]); + for (const output of outputs) { + const valid = new Validator([output]); + const raw = valid.buf('script'); let script = null; - if (valid.has('script')) { - script = valid.buf('script'); - script = Script.fromRaw(script); - } + if (raw) + script = Script.fromRaw(raw); options.outputs.push({ script: script, @@ -450,21 +448,23 @@ HTTPServer.prototype.initRouter = function initRouter() { }); } - tx = await req.wallet.createTX(options); + const tx = await req.wallet.createTX(options); + await req.wallet.sign(tx, passphrase); + res.send(200, tx.getJSON(this.network)); }); // Sign TX this.post('/:id/sign', async (req, res) => { - let valid = req.valid(); - let passphrase = valid.str('passphrase'); - let raw = valid.buf('tx'); - let tx; + const valid = req.valid(); + const passphrase = valid.str('passphrase'); + const raw = valid.buf('tx'); enforce(raw, 'TX is required.'); - tx = MTX.fromRaw(raw); + const tx = MTX.fromRaw(raw); + tx.view = await req.wallet.getCoinView(tx); await req.wallet.sign(tx, passphrase); @@ -473,38 +473,43 @@ HTTPServer.prototype.initRouter = function initRouter() { // Zap Wallet TXs this.post('/:id/zap', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let age = valid.u32('age'); + const valid = req.valid(); + const acct = valid.str('account'); + const age = valid.u32('age'); + enforce(age, 'Age is required.'); + await req.wallet.zap(acct, age); + res.send(200, { success: true }); }); // Abandon Wallet TX this.del('/:id/tx/:hash', async (req, res) => { - let valid = req.valid(); - let hash = valid.hash('hash'); + const valid = req.valid(); + const hash = valid.hash('hash'); + enforce(hash, 'Hash is required.'); + await req.wallet.abandon(hash); + res.send(200, { success: true }); }); // List blocks this.get('/:id/block', async (req, res) => { - let heights = await req.wallet.getBlocks(); + const heights = await req.wallet.getBlocks(); res.send(200, heights); }); // Get Block Record this.get('/:id/block/:height', async (req, res) => { - let valid = req.valid(); - let height = valid.u32('height'); - let block; + const valid = req.valid(); + const height = valid.u32('height'); enforce(height != null, 'Height is required.'); - block = await req.wallet.getBlock(height); + const block = await req.wallet.getBlock(height); if (!block) { res.send(404); @@ -516,33 +521,38 @@ HTTPServer.prototype.initRouter = function initRouter() { // Add key this.put('/:id/shared-key', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let key = valid.str('accountKey'); + const valid = req.valid(); + const acct = valid.str('account'); + const key = valid.str('accountKey'); + enforce(key, 'Key is required.'); + await req.wallet.addSharedKey(acct, key); + res.send(200, { success: true }); }); // Remove key this.del('/:id/shared-key', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let key = valid.str('accountKey'); + const valid = req.valid(); + const acct = valid.str('account'); + const key = valid.str('accountKey'); + enforce(key, 'Key is required.'); + await req.wallet.removeSharedKey(acct, key); + res.send(200, { success: true }); }); // Get key by address this.get('/:id/key/:address', async (req, res) => { - let valid = req.valid(); - let address = valid.str('address'); - let key; + const valid = req.valid(); + const address = valid.str('address'); enforce(address, 'Address is required.'); - key = await req.wallet.getKey(address); + const key = await req.wallet.getKey(address); if (!key) { res.send(404); @@ -554,14 +564,13 @@ HTTPServer.prototype.initRouter = function initRouter() { // Get private key this.get('/:id/wif/:address', async (req, res) => { - let valid = req.valid(); - let address = valid.str('address'); - let passphrase = valid.str('passphrase'); - let key; + const valid = req.valid(); + const address = valid.str('address'); + const passphrase = valid.str('passphrase'); enforce(address, 'Address is required.'); - key = await req.wallet.getPrivateKey(address, passphrase); + const key = await req.wallet.getPrivateKey(address, passphrase); if (!key) { res.send(404); @@ -573,33 +582,36 @@ HTTPServer.prototype.initRouter = function initRouter() { // Create address this.post('/:id/address', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let address = await req.wallet.createReceive(acct); + const valid = req.valid(); + const acct = valid.str('account'); + const address = await req.wallet.createReceive(acct); + res.send(200, address.toJSON()); }); // Create change address this.post('/:id/change', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let address = await req.wallet.createChange(acct); + const valid = req.valid(); + const acct = valid.str('account'); + const address = await req.wallet.createChange(acct); + res.send(200, address.toJSON()); }); // Create nested address this.post('/:id/nested', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let address = await req.wallet.createNested(acct); + const valid = req.valid(); + const acct = valid.str('account'); + const address = await req.wallet.createNested(acct); + res.send(200, address.toJSON()); }); // Wallet Balance this.get('/:id/balance', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let balance = await req.wallet.getBalance(acct); + const valid = req.valid(); + const acct = valid.str('account'); + const balance = await req.wallet.getBalance(acct); if (!balance) { res.send(404); @@ -611,15 +623,14 @@ HTTPServer.prototype.initRouter = function initRouter() { // Wallet UTXOs this.get('/:id/coin', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let coins = await req.wallet.getCoins(acct); - let result = []; - let coin; + const valid = req.valid(); + const acct = valid.str('account'); + const coins = await req.wallet.getCoins(acct); + const result = []; common.sortCoins(coins); - for (coin of coins) + for (const coin of coins) result.push(coin.getJSON(this.network)); res.send(200, result); @@ -627,11 +638,10 @@ HTTPServer.prototype.initRouter = function initRouter() { // Locked coins this.get('/:id/locked', async (req, res) => { - let locked = this.wallet.getLocked(); - let result = []; - let outpoint; + const locked = this.wallet.getLocked(); + const result = []; - for (outpoint of locked) + for (const outpoint of locked) result.push(outpoint.toJSON()); res.send(200, result); @@ -639,45 +649,42 @@ HTTPServer.prototype.initRouter = function initRouter() { // Lock coin this.put('/:id/locked/:hash/:index', async (req, res) => { - let valid = req.valid(); - let hash = valid.hash('hash'); - let index = valid.u32('index'); - let outpoint; + const valid = req.valid(); + const hash = valid.hash('hash'); + const index = valid.u32('index'); enforce(hash, 'Hash is required.'); enforce(index != null, 'Index is required.'); - outpoint = new Outpoint(hash, index); + const outpoint = new Outpoint(hash, index); this.wallet.lockCoin(outpoint); }); // Unlock coin this.del('/:id/locked/:hash/:index', async (req, res) => { - let valid = req.valid(); - let hash = valid.hash('hash'); - let index = valid.u32('index'); - let outpoint; + const valid = req.valid(); + const hash = valid.hash('hash'); + const index = valid.u32('index'); enforce(hash, 'Hash is required.'); enforce(index != null, 'Index is required.'); - outpoint = new Outpoint(hash, index); + const outpoint = new Outpoint(hash, index); this.wallet.unlockCoin(outpoint); }); // Wallet Coin this.get('/:id/coin/:hash/:index', async (req, res) => { - let valid = req.valid(); - let hash = valid.hash('hash'); - let index = valid.u32('index'); - let coin; + const valid = req.valid(); + const hash = valid.hash('hash'); + const index = valid.u32('index'); enforce(hash, 'Hash is required.'); enforce(index != null, 'Index is required.'); - coin = await req.wallet.getCoin(hash, index); + const coin = await req.wallet.getCoin(hash, index); if (!coin) { res.send(404); @@ -689,17 +696,17 @@ HTTPServer.prototype.initRouter = function initRouter() { // Wallet TXs this.get('/:id/tx/history', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let txs = await req.wallet.getHistory(acct); - let result = []; - let details; + const valid = req.valid(); + const acct = valid.str('account'); + const txs = await req.wallet.getHistory(acct); common.sortTX(txs); - details = await req.wallet.toDetails(txs); + const details = await req.wallet.toDetails(txs); - for (let item of details) + const result = []; + + for (const item of details) result.push(item.toJSON()); res.send(200, result); @@ -707,17 +714,17 @@ HTTPServer.prototype.initRouter = function initRouter() { // Wallet Pending TXs this.get('/:id/tx/unconfirmed', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let txs = await req.wallet.getPending(acct); - let result = []; - let details; + const valid = req.valid(); + const acct = valid.str('account'); + const txs = await req.wallet.getPending(acct); common.sortTX(txs); - details = await req.wallet.toDetails(txs); + const details = await req.wallet.toDetails(txs); + + const result = []; - for (let item of details) + for (const item of details) result.push(item.toJSON()); res.send(200, result); @@ -725,23 +732,23 @@ HTTPServer.prototype.initRouter = function initRouter() { // Wallet TXs within time range this.get('/:id/tx/range', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let result = []; - let options, txs, details; + const valid = req.valid(); + const acct = valid.str('account'); - options = { + const options = { start: valid.u32('start'), end: valid.u32('end'), limit: valid.u32('limit'), reverse: valid.bool('reverse') }; - txs = await req.wallet.getRange(acct, options); + const txs = await req.wallet.getRange(acct, options); - details = await req.wallet.toDetails(txs); + const details = await req.wallet.toDetails(txs); - for (let item of details) + const result = []; + + for (const item of details) result.push(item.toJSON()); res.send(200, result); @@ -749,14 +756,14 @@ HTTPServer.prototype.initRouter = function initRouter() { // Last Wallet TXs this.get('/:id/tx/last', async (req, res) => { - let valid = req.valid(); - let acct = valid.str('account'); - let limit = valid.u32('limit'); - let txs = await req.wallet.getLast(acct, limit); - let details = await req.wallet.toDetails(txs); - let result = []; - - for (let item of details) + const valid = req.valid(); + const acct = valid.str('account'); + const limit = valid.u32('limit'); + const txs = await req.wallet.getLast(acct, limit); + const details = await req.wallet.toDetails(txs); + const result = []; + + for (const item of details) result.push(item.toJSON()); res.send(200, result); @@ -764,20 +771,19 @@ HTTPServer.prototype.initRouter = function initRouter() { // Wallet TX this.get('/:id/tx/:hash', async (req, res) => { - let valid = req.valid(); - let hash = valid.hash('hash'); - let tx, details; + const valid = req.valid(); + const hash = valid.hash('hash'); enforce(hash, 'Hash is required.'); - tx = await req.wallet.getTX(hash); + const tx = await req.wallet.getTX(hash); if (!tx) { res.send(404); return; } - details = await req.wallet.toDetails(tx); + const details = await req.wallet.toDetails(tx); res.send(200, details.toJSON()); }); @@ -803,50 +809,37 @@ HTTPServer.prototype.initSockets = function initSockets() { }); this.walletdb.on('tx', (id, tx, details) => { - let json = details.toJSON(); - let channel = 'w:' + id; - this.to(channel, 'wallet tx', json); - this.to('!all', 'wallet tx', id, json); + const json = details.toJSON(); + this.to(`w:${id}`, 'wallet tx', json); }); this.walletdb.on('confirmed', (id, tx, details) => { - let json = details.toJSON(); - let channel = 'w:' + id; - this.to(channel, 'wallet confirmed', json); - this.to('!all', 'wallet confirmed', id, json); + const json = details.toJSON(); + this.to(`w:${id}`, 'wallet confirmed', json); }); this.walletdb.on('unconfirmed', (id, tx, details) => { - let json = details.toJSON(); - let channel = 'w:' + id; - this.to(channel, 'wallet unconfirmed', json); - this.to('!all', 'wallet unconfirmed', id, json); + const json = details.toJSON(); + this.to(`w:${id}`, 'wallet unconfirmed', json); }); this.walletdb.on('conflict', (id, tx, details) => { - let json = details.toJSON(); - let channel = 'w:' + id; - this.to(channel, 'wallet conflict', json); - this.to('!all', 'wallet conflict', id, json); + const json = details.toJSON(); + this.to(`w:${id}`, 'wallet conflict', json); }); this.walletdb.on('balance', (id, balance) => { - let json = balance.toJSON(); - let channel = 'w:' + id; - this.to(channel, 'wallet balance', json); - this.to('!all', 'wallet balance', id, json); + const json = balance.toJSON(); + this.to(`w:${id}`, 'wallet balance', json); }); this.walletdb.on('address', (id, receive) => { - let channel = 'w:' + id; - let json = []; - let addr; + const json = []; - for (addr of receive) + for (const addr of receive) json.push(addr.toJSON()); - this.to(channel, 'wallet address', json); - this.to('!all', 'wallet address', id, json); + this.to(`w:${id}`, 'wallet address', json); }); }; @@ -858,17 +851,21 @@ HTTPServer.prototype.initSockets = function initSockets() { HTTPServer.prototype.handleSocket = function handleSocket(socket) { socket.hook('wallet auth', (args) => { - let valid = new Validator([args]); - let key = valid.str(0); - let hash; - if (socket.auth) throw new Error('Already authed.'); if (!this.options.noAuth) { - hash = hash256(key); + const valid = new Validator([args]); + const key = valid.str(0, ''); + + if (key.length > 255) + throw new Error('Invalid API key.'); + + const data = Buffer.from(key, 'utf8'); + const hash = digest.hash256(data); + if (!ccmp(hash, this.options.apiHash)) - throw new Error('Bad key.'); + throw new Error('Invalid API key.'); } socket.auth = true; @@ -889,23 +886,22 @@ HTTPServer.prototype.handleSocket = function handleSocket(socket) { HTTPServer.prototype.handleAuth = function handleAuth(socket) { socket.hook('wallet join', async (args) => { - let valid = new Validator([args]); - let id = valid.str(0, ''); - let token = valid.buf(1); - let channel = 'w:' + id; - let wallet; + const valid = new Validator([args]); + const id = valid.str(0, ''); + const token = valid.buf(1); if (!id) throw new Error('Invalid parameter.'); if (!this.options.walletAuth) { - socket.join(channel); + socket.join(`w:${id}`); return null; } if (!token) throw new Error('Invalid parameter.'); + let wallet; try { wallet = await this.walletdb.auth(id, token); } catch (e) { @@ -918,20 +914,19 @@ HTTPServer.prototype.handleAuth = function handleAuth(socket) { this.logger.info('Successful wallet auth for %s.', id); - socket.join(channel); + socket.join(`w:${id}`); return null; }); socket.hook('wallet leave', (args) => { - let valid = new Validator([args]); - let id = valid.str(0, ''); - let channel = 'w:' + id; + const valid = new Validator([args]); + const id = valid.str(0, ''); if (!id) throw new Error('Invalid parameter.'); - socket.leave(channel); + socket.leave(`w:${id}`); return null; }); @@ -952,7 +947,7 @@ function HTTPOptions(options) { this.logger = null; this.walletdb = null; this.apiKey = base58.encode(random.randomBytes(20)); - this.apiHash = hash256(this.apiKey); + this.apiHash = digest.hash256(Buffer.from(this.apiKey, 'ascii')); this.serviceHash = this.apiHash; this.noAuth = false; this.walletAuth = false; @@ -992,10 +987,12 @@ HTTPOptions.prototype.fromOptions = function fromOptions(options) { if (options.apiKey != null) { assert(typeof options.apiKey === 'string', 'API key must be a string.'); - assert(options.apiKey.length <= 200, - 'API key must be under 200 bytes.'); + assert(options.apiKey.length <= 255, + 'API key must be under 255 bytes.'); + assert(util.isAscii(options.apiKey), + 'API key must be ASCII.'); this.apiKey = options.apiKey; - this.apiHash = hash256(this.apiKey); + this.apiHash = digest.hash256(Buffer.from(this.apiKey, 'ascii')); } if (options.noAuth != null) { @@ -1021,8 +1018,7 @@ HTTPOptions.prototype.fromOptions = function fromOptions(options) { } if (options.port != null) { - assert(typeof options.port === 'number', 'Port must be a number.'); - assert(options.port > 0 && options.port <= 0xffff); + assert(util.isU16(options.port), 'Port must be a number.'); this.port = options.port; } @@ -1065,19 +1061,9 @@ HTTPOptions.fromOptions = function fromOptions(options) { * Helpers */ -function hash256(data) { - if (typeof data !== 'string') - return Buffer.alloc(0); - - if (data.length > 200) - return Buffer.alloc(0); - - return digest.hash256(Buffer.from(data, 'utf8')); -} - function enforce(value, msg) { if (!value) { - let err = new Error(msg); + const err = new Error(msg); err.statusCode = 400; throw err; } diff --git a/lib/wallet/layout-browser.js b/lib/wallet/layout-browser.js index 9b0e14acf..cbaa13ff7 100644 --- a/lib/wallet/layout-browser.js +++ b/lib/wallet/layout-browser.js @@ -6,6 +6,7 @@ 'use strict'; +const assert = require('assert'); const util = require('../utils/util'); const pad32 = util.pad32; const layouts = exports; @@ -13,106 +14,139 @@ const layouts = exports; layouts.walletdb = { binary: false, p: function p(hash) { + assert(typeof hash === 'string'); return 'p' + hash; }, pp: function pp(key) { + assert(typeof key === 'string'); return key.slice(1); }, P: function P(wid, hash) { + assert(typeof hash === 'string'); return 'p' + pad32(wid) + hash; }, Pp: function Pp(key) { + assert(typeof key === 'string'); return key.slice(11); }, r: function r(wid, index, hash) { + assert(typeof hash === 'string'); return 'r' + pad32(wid) + pad32(index) + hash; }, rr: function rr(key) { + assert(typeof key === 'string'); return key.slice(21); }, w: function w(wid) { return 'w' + pad32(wid); }, ww: function ww(key) { - return +key.slice(1); + assert(typeof key === 'string'); + return parseInt(key.slice(1), 10); }, l: function l(id) { + assert(typeof id === 'string'); return 'l' + id; }, ll: function ll(key) { + assert(typeof key === 'string'); return key.slice(1); }, a: function a(wid, index) { return 'a' + pad32(wid) + pad32(index); }, i: function i(wid, name) { + assert(typeof name === 'string'); return 'i' + pad32(wid) + name; }, ii: function ii(key) { - return [+key.slice(1, 11), key.slice(11)]; + assert(typeof key === 'string'); + return [parseInt(key.slice(1, 11), 10), key.slice(11)]; }, n: function n(wid, index) { return 'n' + pad32(wid) + pad32(index); }, R: 'R', - h: function c(height) { + h: function h(height) { return 'h' + pad32(height); }, b: function b(height) { return 'b' + pad32(height); }, bb: function bb(key) { - return +key.slice(1); + assert(typeof key === 'string'); + return parseInt(key.slice(1), 10); }, o: function o(hash, index) { + assert(typeof hash === 'string'); return 'o' + hash + pad32(index); }, oo: function oo(key) { - return [key.slice(1, 65), +key.slice(65)]; + return [key.slice(1, 65), parseInt(key.slice(65), 10)]; } }; layouts.txdb = { binary: false, prefix: function prefix(wid, key) { + assert(typeof key === 'string'); return 't' + pad32(wid) + key; }, - pre: function prefix(key) { - return +key.slice(1, 11); + pre: function pre(key) { + assert(typeof key === 'string'); + return parseInt(key.slice(1, 11), 10); }, R: 'R', hi: function hi(ch, hash, index) { + assert(typeof hash === 'string'); return ch + hash + pad32(index); }, hii: function hii(key) { + assert(typeof key === 'string'); key = key.slice(12); - return [key.slice(0, 64), +key.slice(64)]; + return [key.slice(0, 64), parseInt(key.slice(64), 10)]; }, ih: function ih(ch, index, hash) { + assert(typeof hash === 'string'); return ch + pad32(index) + hash; }, ihh: function ihh(key) { + assert(typeof key === 'string'); key = key.slice(12); - return [+key.slice(0, 10), key.slice(10)]; + return [parseInt(key.slice(0, 10), 10), key.slice(10)]; }, iih: function iih(ch, index, num, hash) { + assert(typeof hash === 'string'); return ch + pad32(index) + pad32(num) + hash; }, iihh: function iihh(key) { + assert(typeof key === 'string'); key = key.slice(12); - return [+key.slice(0, 10), +key.slice(10, 20), key.slice(20)]; + return [ + parseInt(key.slice(0, 10), 10), + parseInt(key.slice(10, 20), 10), + key.slice(20) + ]; }, ihi: function ihi(ch, index, hash, num) { + assert(typeof hash === 'string'); return ch + pad32(index) + hash + pad32(num); }, ihii: function ihii(key) { + assert(typeof key === 'string'); key = key.slice(12); - return [+key.slice(0, 10), key.slice(10, 74), +key.slice(74)]; + return [ + parseInt(key.slice(0, 10), 10), + key.slice(10, 74), + parseInt(key.slice(74), 10) + ]; }, ha: function ha(ch, hash) { + assert(typeof hash === 'string'); return ch + hash; }, haa: function haa(key) { + assert(typeof key === 'string'); key = key.slice(12); return key; }, @@ -201,7 +235,8 @@ layouts.txdb = { return 'b' + pad32(height); }, bb: function bb(key) { + assert(typeof key === 'string'); key = key.slice(12); - return +key.slice(0); + return parseInt(key.slice(0), 10); } }; diff --git a/lib/wallet/layout.js b/lib/wallet/layout.js index fb07f95bb..3f888752f 100644 --- a/lib/wallet/layout.js +++ b/lib/wallet/layout.js @@ -6,6 +6,7 @@ 'use strict'; +const assert = require('assert'); const layouts = exports; /* @@ -28,26 +29,36 @@ const layouts = exports; layouts.walletdb = { binary: true, p: function p(hash) { - let key = Buffer.allocUnsafe(1 + (hash.length / 2)); + assert(typeof hash === 'string'); + const key = Buffer.allocUnsafe(1 + (hash.length / 2)); key[0] = 0x70; key.write(hash, 1, 'hex'); return key; }, pp: function pp(key) { + assert(Buffer.isBuffer(key)); + assert(key.length >= 21); return key.toString('hex', 1); }, P: function P(wid, hash) { - let key = Buffer.allocUnsafe(1 + 4 + (hash.length / 2)); + assert(typeof wid === 'number'); + assert(typeof hash === 'string'); + const key = Buffer.allocUnsafe(1 + 4 + (hash.length / 2)); key[0] = 0x50; key.writeUInt32BE(wid, 1, true); key.write(hash, 5, 'hex'); return key; }, Pp: function Pp(key) { + assert(Buffer.isBuffer(key)); + assert(key.length >= 25); return key.toString('hex', 5); }, r: function r(wid, index, hash) { - let key = Buffer.allocUnsafe(1 + 4 + 4 + (hash.length / 2)); + assert(typeof wid === 'number'); + assert(typeof index === 'number'); + assert(typeof hash === 'string'); + const key = Buffer.allocUnsafe(1 + 4 + 4 + (hash.length / 2)); key[0] = 0x72; key.writeUInt32BE(wid, 1, true); key.writeUInt32BE(index, 5, true); @@ -55,38 +66,50 @@ layouts.walletdb = { return key; }, rr: function rr(key) { + assert(Buffer.isBuffer(key)); + assert(key.length >= 29); return key.toString('hex', 9); }, w: function w(wid) { - let key = Buffer.allocUnsafe(5); + assert(typeof wid === 'number'); + const key = Buffer.allocUnsafe(5); key[0] = 0x77; key.writeUInt32BE(wid, 1, true); return key; }, ww: function ww(key) { + assert(Buffer.isBuffer(key)); + assert(key.length === 5); return key.readUInt32BE(1, true); }, l: function l(id) { - let len = Buffer.byteLength(id, 'ascii'); - let key = Buffer.allocUnsafe(1 + len); + assert(typeof id === 'string'); + const len = Buffer.byteLength(id, 'ascii'); + const key = Buffer.allocUnsafe(1 + len); key[0] = 0x6c; if (len > 0) key.write(id, 1, 'ascii'); return key; }, ll: function ll(key) { + assert(Buffer.isBuffer(key)); + assert(key.length >= 1); return key.toString('ascii', 1); }, a: function a(wid, index) { - let key = Buffer.allocUnsafe(9); + assert(typeof wid === 'number'); + assert(typeof index === 'number'); + const key = Buffer.allocUnsafe(9); key[0] = 0x61; key.writeUInt32BE(wid, 1, true); key.writeUInt32BE(index, 5, true); return key; }, i: function i(wid, name) { - let len = Buffer.byteLength(name, 'ascii'); - let key = Buffer.allocUnsafe(5 + len); + assert(typeof wid === 'number'); + assert(typeof name === 'string'); + const len = Buffer.byteLength(name, 'ascii'); + const key = Buffer.allocUnsafe(5 + len); key[0] = 0x69; key.writeUInt32BE(wid, 1, true); if (len > 0) @@ -94,10 +117,14 @@ layouts.walletdb = { return key; }, ii: function ii(key) { + assert(Buffer.isBuffer(key)); + assert(key.length >= 5); return [key.readUInt32BE(1, true), key.toString('ascii', 5)]; }, n: function n(wid, index) { - let key = Buffer.allocUnsafe(9); + assert(typeof wid === 'number'); + assert(typeof index === 'number'); + const key = Buffer.allocUnsafe(9); key[0] = 0x6e; key.writeUInt32BE(wid, 1, true); key.writeUInt32BE(index, 5, true); @@ -105,28 +132,36 @@ layouts.walletdb = { }, R: Buffer.from([0x52]), h: function h(height) { - let key = Buffer.allocUnsafe(5); + assert(typeof height === 'number'); + const key = Buffer.allocUnsafe(5); key[0] = 0x68; key.writeUInt32BE(height, 1, true); return key; }, b: function b(height) { - let key = Buffer.allocUnsafe(5); + assert(typeof height === 'number'); + const key = Buffer.allocUnsafe(5); key[0] = 0x62; key.writeUInt32BE(height, 1, true); return key; }, bb: function bb(key) { + assert(Buffer.isBuffer(key)); + assert(key.length === 5); return key.readUInt32BE(1, true); }, o: function o(hash, index) { - let key = Buffer.allocUnsafe(37); + assert(typeof hash === 'string'); + assert(typeof index === 'number'); + const key = Buffer.allocUnsafe(37); key[0] = 0x6f; key.write(hash, 1, 'hex'); key.writeUInt32BE(index, 33, true); return key; }, oo: function oo(key) { + assert(Buffer.isBuffer(key)); + assert(key.length === 37); return [key.toString('hex', 1, 33), key.readUInt32BE(33, true)]; } }; @@ -152,40 +187,55 @@ layouts.walletdb = { layouts.txdb = { binary: true, prefix: function prefix(wid, key) { - let out = Buffer.allocUnsafe(5 + key.length); + assert(typeof wid === 'number'); + assert(Buffer.isBuffer(key)); + const out = Buffer.allocUnsafe(5 + key.length); out[0] = 0x74; out.writeUInt32BE(wid, 1); key.copy(out, 5); return out; }, - pre: function prefix(key) { + pre: function pre(key) { + assert(Buffer.isBuffer(key)); + assert(key.length >= 5); return key.readUInt32BE(1, true); }, R: Buffer.from([0x52]), hi: function hi(ch, hash, index) { - let key = Buffer.allocUnsafe(37); + assert(typeof hash === 'string'); + assert(typeof index === 'number'); + const key = Buffer.allocUnsafe(37); key[0] = ch; key.write(hash, 1, 'hex'); key.writeUInt32BE(index, 33, true); return key; }, hii: function hii(key) { + assert(Buffer.isBuffer(key)); + assert(key.length - 5 === 37); key = key.slice(6); return [key.toString('hex', 0, 32), key.readUInt32BE(32, true)]; }, ih: function ih(ch, index, hash) { - let key = Buffer.allocUnsafe(37); + assert(typeof index === 'number'); + assert(typeof hash === 'string'); + const key = Buffer.allocUnsafe(37); key[0] = ch; key.writeUInt32BE(index, 1, true); key.write(hash, 5, 'hex'); return key; }, ihh: function ihh(key) { + assert(Buffer.isBuffer(key)); + assert(key.length - 5 === 37); key = key.slice(6); return [key.readUInt32BE(0, true), key.toString('hex', 4, 36)]; }, iih: function iih(ch, index, num, hash) { - let key = Buffer.allocUnsafe(41); + assert(typeof index === 'number'); + assert(typeof num === 'number'); + assert(typeof hash === 'string'); + const key = Buffer.allocUnsafe(41); key[0] = ch; key.writeUInt32BE(index, 1, true); key.writeUInt32BE(num, 5, true); @@ -193,6 +243,8 @@ layouts.txdb = { return key; }, iihh: function iihh(key) { + assert(Buffer.isBuffer(key)); + assert(key.length - 5 === 41); key = key.slice(6); return [ key.readUInt32BE(0, true), @@ -201,7 +253,10 @@ layouts.txdb = { ]; }, ihi: function ihi(ch, index, hash, num) { - let key = Buffer.allocUnsafe(41); + assert(typeof index === 'number'); + assert(typeof hash === 'string'); + assert(typeof num === 'number'); + const key = Buffer.allocUnsafe(41); key[0] = ch; key.writeUInt32BE(index, 1, true); key.write(hash, 5, 'hex'); @@ -209,6 +264,8 @@ layouts.txdb = { return key; }, ihii: function ihii(key) { + assert(Buffer.isBuffer(key)); + assert(key.length - 5 === 41); key = key.slice(6); return [ key.readUInt32BE(0, true), @@ -217,12 +274,15 @@ layouts.txdb = { ]; }, ha: function ha(ch, hash) { - let key = Buffer.allocUnsafe(33); + assert(typeof hash === 'string'); + const key = Buffer.allocUnsafe(33); key[0] = ch; key.write(hash, 1, 'hex'); return key; }, haa: function haa(key) { + assert(Buffer.isBuffer(key)); + assert(key.length - 5 === 33); key = key.slice(6); return key.toString('hex', 0); }, @@ -302,12 +362,15 @@ layouts.txdb = { return this.ha(0x72, hash); }, b: function b(height) { - let key = Buffer.allocUnsafe(5); + assert(typeof height === 'number'); + const key = Buffer.allocUnsafe(5); key[0] = 0x62; key.writeUInt32BE(height, 1, true); return key; }, bb: function bb(key) { + assert(Buffer.isBuffer(key)); + assert(key.length - 5 === 5); key = key.slice(6); return key.readUInt32BE(0, true); } diff --git a/lib/wallet/masterkey.js b/lib/wallet/masterkey.js index 6cc158da1..ed780e482 100644 --- a/lib/wallet/masterkey.js +++ b/lib/wallet/masterkey.js @@ -129,22 +129,22 @@ MasterKey.prototype.fromOptions = function fromOptions(options) { } if (options.rounds != null) { - assert(util.isNumber(options.rounds)); + assert(util.isU32(options.rounds)); this.N = options.rounds; } if (options.N != null) { - assert(util.isNumber(options.N)); + assert(util.isU32(options.N)); this.N = options.N; } if (options.r != null) { - assert(util.isNumber(options.r)); + assert(util.isU32(options.r)); this.r = options.r; } if (options.p != null) { - assert(util.isNumber(options.p)); + assert(util.isU32(options.p)); this.p = options.p; } @@ -169,12 +169,12 @@ MasterKey.fromOptions = function fromOptions(options) { * @returns {Promise} - Returns {@link HDPrivateKey}. */ -MasterKey.prototype.unlock = async function _unlock(passphrase, timeout) { - let unlock = await this.locker.lock(); +MasterKey.prototype.unlock = async function unlock(passphrase, timeout) { + const _unlock = await this.locker.lock(); try { return await this._unlock(passphrase, timeout); } finally { - unlock(); + _unlock(); } }; @@ -187,8 +187,6 @@ MasterKey.prototype.unlock = async function _unlock(passphrase, timeout) { */ MasterKey.prototype._unlock = async function _unlock(passphrase, timeout) { - let data, key; - if (this.key) { if (this.encrypted) { assert(this.timer != null); @@ -202,8 +200,8 @@ MasterKey.prototype._unlock = async function _unlock(passphrase, timeout) { assert(this.encrypted); - key = await this.derive(passphrase); - data = aes.decipher(this.ciphertext, key, this.iv); + const key = await this.derive(passphrase); + const data = aes.decipher(this.ciphertext, key, this.iv); this.fromKeyRaw(data); @@ -253,10 +251,10 @@ MasterKey.prototype.stop = function stop() { */ MasterKey.prototype.derive = async function derive(passwd) { - let salt = MasterKey.SALT; - let N = this.N; - let r = this.r; - let p = this.p; + const salt = MasterKey.SALT; + const N = this.N; + const r = this.r; + const p = this.p; if (typeof passwd === 'string') passwd = Buffer.from(passwd, 'utf8'); @@ -280,7 +278,7 @@ MasterKey.prototype.derive = async function derive(passwd) { MasterKey.prototype.encipher = function encipher(data, iv) { if (!this.aesKey) - return; + return null; if (typeof iv === 'string') iv = Buffer.from(iv, 'hex'); @@ -297,7 +295,7 @@ MasterKey.prototype.encipher = function encipher(data, iv) { MasterKey.prototype.decipher = function decipher(data, iv) { if (!this.aesKey) - return; + return null; if (typeof iv === 'string') iv = Buffer.from(iv, 'hex'); @@ -312,8 +310,8 @@ MasterKey.prototype.decipher = function decipher(data, iv) { * @returns {Promise} */ -MasterKey.prototype.lock = async function _lock() { - let unlock = await this.locker.lock(); +MasterKey.prototype.lock = async function lock() { + const unlock = await this.locker.lock(); try { return await this._lock(); } finally { @@ -327,7 +325,7 @@ MasterKey.prototype.lock = async function _lock() { * the timer if there is one. */ -MasterKey.prototype._lock = function lock() { +MasterKey.prototype._lock = function _lock() { if (!this.encrypted) { assert(this.timer == null); assert(this.key); @@ -363,7 +361,7 @@ MasterKey.prototype.destroy = async function destroy() { */ MasterKey.prototype.decrypt = async function decrypt(passphrase, clean) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._decrypt(passphrase, clean); } finally { @@ -378,9 +376,7 @@ MasterKey.prototype.decrypt = async function decrypt(passphrase, clean) { * @returns {Promise} */ -MasterKey.prototype._decrypt = async function decrypt(passphrase, clean) { - let key, data; - +MasterKey.prototype._decrypt = async function _decrypt(passphrase, clean) { if (!this.encrypted) throw new Error('Master key is not encrypted.'); @@ -389,8 +385,8 @@ MasterKey.prototype._decrypt = async function decrypt(passphrase, clean) { this._lock(); - key = await this.derive(passphrase); - data = aes.decipher(this.ciphertext, key, this.iv); + const key = await this.derive(passphrase); + const data = aes.decipher(this.ciphertext, key, this.iv); this.fromKeyRaw(data); this.encrypted = false; @@ -399,7 +395,7 @@ MasterKey.prototype._decrypt = async function decrypt(passphrase, clean) { if (!clean) { cleanse(key); - return; + return null; } return key; @@ -412,7 +408,7 @@ MasterKey.prototype._decrypt = async function decrypt(passphrase, clean) { */ MasterKey.prototype.encrypt = async function encrypt(passphrase, clean) { - let unlock = await this.locker.lock(); + const unlock = await this.locker.lock(); try { return await this._encrypt(passphrase, clean); } finally { @@ -427,22 +423,20 @@ MasterKey.prototype.encrypt = async function encrypt(passphrase, clean) { * @returns {Promise} */ -MasterKey.prototype._encrypt = async function encrypt(passphrase, clean) { - let key, data, iv; - +MasterKey.prototype._encrypt = async function _encrypt(passphrase, clean) { if (this.encrypted) throw new Error('Master key is already encrypted.'); if (!passphrase) throw new Error('No passphrase provided.'); - data = this.toKeyRaw(); - iv = random.randomBytes(16); + const raw = this.toKeyRaw(); + const iv = random.randomBytes(16); this.stop(); - key = await this.derive(passphrase); - data = aes.encipher(data, key, iv); + const key = await this.derive(passphrase); + const data = aes.encipher(raw, key, iv); this.key = null; this.mnemonic = null; @@ -452,7 +446,7 @@ MasterKey.prototype._encrypt = async function encrypt(passphrase, clean) { if (!clean) { cleanse(key); - return; + return null; } return key; @@ -481,7 +475,7 @@ MasterKey.prototype.getKeySize = function getKeySize() { */ MasterKey.prototype.toKeyRaw = function toKeyRaw() { - let bw = new StaticWriter(this.getKeySize()); + const bw = new StaticWriter(this.getKeySize()); this.key.toWriter(bw); @@ -501,7 +495,7 @@ MasterKey.prototype.toKeyRaw = function toKeyRaw() { */ MasterKey.prototype.fromKeyRaw = function fromKeyRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.key = HD.PrivateKey.fromReader(br); @@ -540,8 +534,7 @@ MasterKey.prototype.getSize = function getSize() { */ MasterKey.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const bw = new StaticWriter(this.getSize()); if (this.encrypted) { bw.writeU8(1); @@ -559,7 +552,7 @@ MasterKey.prototype.toRaw = function toRaw() { bw.writeU8(0); // NOTE: useless varint - size = this.getKeySize(); + const size = this.getKeySize(); bw.writeVarint(size); bw.writeBytes(this.key.toRaw()); @@ -581,7 +574,7 @@ MasterKey.prototype.toRaw = function toRaw() { */ MasterKey.prototype.fromRaw = function fromRaw(raw) { - let br = new BufferReader(raw); + const br = new BufferReader(raw); this.encrypted = br.readU8() === 1; @@ -681,7 +674,7 @@ MasterKey.prototype.toJSON = function toJSON(unsafe) { */ MasterKey.prototype.inspect = function inspect() { - let json = this.toJSON(true); + const json = this.toJSON(true); if (this.key) json.key = this.key.toJSON(); diff --git a/lib/wallet/nodeclient.js b/lib/wallet/nodeclient.js index 9c94ffe8a..d28cca2e8 100644 --- a/lib/wallet/nodeclient.js +++ b/lib/wallet/nodeclient.js @@ -6,7 +6,6 @@ 'use strict'; -const util = require('../utils/util'); const AsyncObject = require('../utils/asyncobject'); /** @@ -30,14 +29,14 @@ function NodeClient(node) { this._init(); } -util.inherits(NodeClient, AsyncObject); +Object.setPrototypeOf(NodeClient.prototype, AsyncObject.prototype); /** * Initialize the client. * @returns {Promise} */ -NodeClient.prototype._init = function init() { +NodeClient.prototype._init = function _init() { this.node.on('connect', (entry, block) => { if (!this.listen) return; @@ -72,7 +71,7 @@ NodeClient.prototype._init = function init() { * @returns {Promise} */ -NodeClient.prototype._open = function open(options) { +NodeClient.prototype._open = function _open(options) { this.listen = true; return Promise.resolve(); }; @@ -82,7 +81,7 @@ NodeClient.prototype._open = function open(options) { * @returns {Promise} */ -NodeClient.prototype._close = function close() { +NodeClient.prototype._close = function _close() { this.listen = false; return Promise.resolve(); }; @@ -103,13 +102,13 @@ NodeClient.prototype.getTip = function getTip() { */ NodeClient.prototype.getEntry = async function getEntry(hash) { - let entry = await this.node.chain.db.getEntry(hash); + const entry = await this.node.chain.db.getEntry(hash); if (!entry) - return; + return null; - if (!(await entry.isMainChain())) - return; + if (!await entry.isMainChain()) + return null; return entry; }; @@ -164,10 +163,11 @@ NodeClient.prototype.resetFilter = function resetFilter() { * @returns {Promise} */ -NodeClient.prototype.estimateFee = function estimateFee(blocks) { +NodeClient.prototype.estimateFee = async function estimateFee(blocks) { if (!this.node.fees) - return Promise.resolve(this.network.feeRate); - return Promise.resolve(this.node.fees.estimateFee(blocks)); + return this.network.feeRate; + + return this.node.fees.estimateFee(blocks); }; /** diff --git a/lib/wallet/path.js b/lib/wallet/path.js index 88db8b55a..ca2bc3a69 100644 --- a/lib/wallet/path.js +++ b/lib/wallet/path.js @@ -104,7 +104,7 @@ Path.fromOptions = function fromOptions(options) { */ Path.prototype.clone = function clone() { - let path = new Path(); + const path = new Path(); path.keyType = this.keyType; @@ -132,7 +132,7 @@ Path.prototype.clone = function clone() { */ Path.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.account = br.readU32(); this.keyType = br.readU8(); @@ -154,7 +154,7 @@ Path.prototype.fromRaw = function fromRaw(data) { break; } - this.version = br.read8(); + this.version = br.readI8(); this.type = br.readU8(); if (this.type === 129 || this.type === 130) @@ -204,8 +204,8 @@ Path.prototype.getSize = function getSize() { */ Path.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); bw.writeU32(this.account); bw.writeU8(this.keyType); @@ -232,7 +232,7 @@ Path.prototype.toRaw = function toRaw() { break; } - bw.write8(this.version); + bw.writeI8(this.version); bw.writeU8(this.type); return bw.render(); diff --git a/lib/wallet/plugin.js b/lib/wallet/plugin.js index d0b35b547..4334e6e3c 100644 --- a/lib/wallet/plugin.js +++ b/lib/wallet/plugin.js @@ -29,29 +29,28 @@ plugin.id = 'walletdb'; */ plugin.init = function init(node) { - let config = node.config; - let client = new NodeClient(node); - let wdb; + const config = node.config; + const client = new NodeClient(node); - wdb = new WalletDB({ + const wdb = new WalletDB({ network: node.network, logger: node.logger, workers: node.workers, client: client, prefix: config.prefix, db: config.str(['wallet-db', 'db']), - maxFiles: config.num('wallet-max-files'), + maxFiles: config.uint('wallet-max-files'), cacheSize: config.mb('wallet-cache-size'), witness: config.bool('wallet-witness'), checkpoints: config.bool('wallet-checkpoints'), - startHeight: config.num('wallet-start-height'), + startHeight: config.uint('wallet-start-height'), wipeNoReally: config.bool('wallet-wipe-no-really'), apiKey: config.str(['wallet-api-key', 'api-key']), walletAuth: config.bool('wallet-auth'), noAuth: config.bool(['wallet-no-auth', 'no-auth']), ssl: config.str('wallet-ssl'), host: config.str('wallet-host'), - port: config.num('wallet-port'), + port: config.uint('wallet-port'), spv: node.spv, verify: node.spv, listen: false diff --git a/lib/wallet/records.js b/lib/wallet/records.js index a72707655..2b78c808b 100644 --- a/lib/wallet/records.js +++ b/lib/wallet/records.js @@ -38,7 +38,7 @@ function ChainState() { */ ChainState.prototype.clone = function clone() { - let state = new ChainState(); + const state = new ChainState(); state.startHeight = this.startHeight; state.startHash = this.startHash; state.height = this.height; @@ -53,7 +53,7 @@ ChainState.prototype.clone = function clone() { */ ChainState.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.startHeight = br.readU32(); this.startHash = br.readHash('hex'); @@ -83,7 +83,7 @@ ChainState.fromRaw = function fromRaw(data) { */ ChainState.prototype.toRaw = function toRaw() { - let bw = new StaticWriter(41); + const bw = new StaticWriter(41); bw.writeU32(this.startHeight); bw.writeHash(this.startHash); @@ -98,16 +98,16 @@ ChainState.prototype.toRaw = function toRaw() { * @constructor * @param {Hash} hash * @param {Number} height - * @param {Number} ts + * @param {Number} time */ -function BlockMeta(hash, height, ts) { +function BlockMeta(hash, height, time) { if (!(this instanceof BlockMeta)) - return new BlockMeta(hash, height, ts); + return new BlockMeta(hash, height, time); this.hash = hash || encoding.NULL_HASH; this.height = height != null ? height : -1; - this.ts = ts || 0; + this.time = time || 0; } /** @@ -116,7 +116,7 @@ function BlockMeta(hash, height, ts) { */ BlockMeta.prototype.clone = function clone() { - return new BlockMeta(this.hash, this.height, this.ts); + return new BlockMeta(this.hash, this.height, this.time); }; /** @@ -137,7 +137,7 @@ BlockMeta.prototype.toHash = function toHash() { BlockMeta.prototype.fromEntry = function fromEntry(entry) { this.hash = entry.hash; this.height = entry.height; - this.ts = entry.ts; + this.time = entry.time; return this; }; @@ -150,7 +150,7 @@ BlockMeta.prototype.fromEntry = function fromEntry(entry) { BlockMeta.prototype.fromJSON = function fromJSON(json) { this.hash = util.revHex(json.hash); this.height = json.height; - this.ts = json.ts; + this.time = json.time; return this; }; @@ -161,10 +161,10 @@ BlockMeta.prototype.fromJSON = function fromJSON(json) { */ BlockMeta.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.hash = br.readHash('hex'); this.height = br.readU32(); - this.ts = br.readU32(); + this.time = br.readU32(); return this; }; @@ -205,10 +205,10 @@ BlockMeta.fromRaw = function fromRaw(data) { */ BlockMeta.prototype.toRaw = function toRaw() { - let bw = new StaticWriter(42); + const bw = new StaticWriter(42); bw.writeHash(this.hash); bw.writeU32(this.height); - bw.writeU32(this.ts); + bw.writeU32(this.time); return bw.render(); }; @@ -221,7 +221,7 @@ BlockMeta.prototype.toJSON = function toJSON() { return { hash: util.revHex(this.hash), height: this.height, - ts: this.ts + time: this.time }; }; @@ -237,8 +237,7 @@ function BlockMapRecord(height) { return new BlockMapRecord(height); this.height = height != null ? height : -1; - this.txs = []; - this.index = {}; + this.txs = new Map(); } /** @@ -249,14 +248,13 @@ function BlockMapRecord(height) { */ BlockMapRecord.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let count = br.readU32(); + const br = new BufferReader(data); + const count = br.readU32(); for (let i = 0; i < count; i++) { - let hash = br.readHash('hex'); - let tx = TXMapRecord.fromReader(hash, br); - this.txs.push(tx); - this.index[tx.hash] = tx; + const hash = br.readHash('hex'); + const tx = TXMapRecord.fromReader(hash, br); + this.txs.set(tx.hash, tx); } return this; @@ -283,7 +281,7 @@ BlockMapRecord.prototype.getSize = function getSize() { size += 4; - for (let tx of this.txs) { + for (const tx of this.txs.values()) { size += 32; size += tx.getSize(); } @@ -298,13 +296,13 @@ BlockMapRecord.prototype.getSize = function getSize() { */ BlockMapRecord.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); - bw.writeU32(this.txs.length); + bw.writeU32(this.txs.size); - for (let tx of this.txs) { - bw.writeHash(tx.hash); + for (const [hash, tx] of this.txs) { + bw.writeHash(hash); tx.toWriter(bw); } @@ -319,14 +317,11 @@ BlockMapRecord.prototype.toRaw = function toRaw() { */ BlockMapRecord.prototype.add = function add(hash, wid) { - let tx = this.index[hash]; + let tx = this.txs.get(hash); if (!tx) { tx = new TXMapRecord(hash); - tx.wids.push(wid); - this.txs.push(tx); - this.index[tx.hash] = tx; - return true; + this.txs.set(hash, tx); } return tx.add(wid); @@ -340,7 +335,7 @@ BlockMapRecord.prototype.add = function add(hash, wid) { */ BlockMapRecord.prototype.remove = function remove(hash, wid) { - let tx = this.index[hash]; + const tx = this.txs.get(hash); if (!tx) return false; @@ -348,15 +343,26 @@ BlockMapRecord.prototype.remove = function remove(hash, wid) { if (!tx.remove(wid)) return false; - if (tx.wids.length === 0) { - let result = util.binaryRemove(this.txs, tx, cmpid); - assert(result); - delete this.index[tx.hash]; - } + if (tx.wids.size === 0) + this.txs.delete(tx.hash); return true; }; +/** + * Convert tx map to an array. + * @returns {Array} + */ + +BlockMapRecord.prototype.toArray = function toArray() { + const txs = []; + + for (const tx of this.txs.values()) + txs.push(tx); + + return txs; +}; + /** * TX Hash * @constructor @@ -364,18 +370,19 @@ BlockMapRecord.prototype.remove = function remove(hash, wid) { function TXMapRecord(hash, wids) { this.hash = hash || encoding.NULL_HASH; - this.wids = wids || []; - this.id = TXMapRecord.id++; + this.wids = wids || new Set(); } -TXMapRecord.id = 0; - TXMapRecord.prototype.add = function add(wid) { - return util.binaryInsert(this.wids, wid, cmp, true) !== -1; + if (this.wids.has(wid)) + return false; + + this.wids.add(wid); + return true; }; TXMapRecord.prototype.remove = function remove(wid) { - return util.binaryRemove(this.wids, wid, cmp); + return this.wids.delete(wid); }; TXMapRecord.prototype.toWriter = function toWriter(bw) { @@ -387,7 +394,7 @@ TXMapRecord.prototype.getSize = function getSize() { }; TXMapRecord.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -416,15 +423,19 @@ TXMapRecord.fromRaw = function fromRaw(hash, data) { function OutpointMapRecord(hash, index, wids) { this.hash = hash || encoding.NULL_HASH; this.index = index != null ? index : -1; - this.wids = wids || []; + this.wids = wids || new Set(); } OutpointMapRecord.prototype.add = function add(wid) { - return util.binaryInsert(this.wids, wid, cmp, true) !== -1; + if (this.wids.has(wid)) + return false; + + this.wids.add(wid); + return true; }; OutpointMapRecord.prototype.remove = function remove(wid) { - return util.binaryRemove(this.wids, wid, cmp); + return this.wids.delete(wid); }; OutpointMapRecord.prototype.toWriter = function toWriter(bw) { @@ -436,7 +447,7 @@ OutpointMapRecord.prototype.getSize = function getSize() { }; OutpointMapRecord.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -464,15 +475,19 @@ OutpointMapRecord.fromRaw = function fromRaw(hash, index, data) { function PathMapRecord(hash, wids) { this.hash = hash || encoding.NULL_HASH; - this.wids = wids || []; + this.wids = wids || new Set(); } PathMapRecord.prototype.add = function add(wid) { - return util.binaryInsert(this.wids, wid, cmp, true) !== -1; + if (this.wids.has(wid)) + return false; + + this.wids.add(wid); + return true; }; PathMapRecord.prototype.remove = function remove(wid) { - return util.binaryRemove(this.wids, wid, cmp); + return this.wids.delete(wid); }; PathMapRecord.prototype.toWriter = function toWriter(bw) { @@ -484,7 +499,7 @@ PathMapRecord.prototype.getSize = function getSize() { }; PathMapRecord.prototype.toRaw = function toRaw() { - let size = this.getSize(); + const size = this.getSize(); return this.toWriter(new StaticWriter(size)).render(); }; @@ -518,11 +533,11 @@ function TXRecord(tx, block) { this.tx = null; this.hash = null; - this.ps = util.now(); + this.mtime = util.now(); this.height = -1; this.block = null; this.index = -1; - this.ts = 0; + this.time = 0; if (tx) this.fromTX(tx, block); @@ -565,7 +580,7 @@ TXRecord.fromTX = function fromTX(tx, block) { TXRecord.prototype.setBlock = function setBlock(block) { this.height = block.height; this.block = block.hash; - this.ts = block.ts; + this.time = block.time; }; /** @@ -575,7 +590,7 @@ TXRecord.prototype.setBlock = function setBlock(block) { TXRecord.prototype.unsetBlock = function unsetBlock() { this.height = -1; this.block = null; - this.ts = 0; + this.time = 0; }; /** @@ -585,8 +600,9 @@ TXRecord.prototype.unsetBlock = function unsetBlock() { TXRecord.prototype.getBlock = function getBlock() { if (this.height === -1) - return; - return new BlockMeta(this.block, this.height, this.ts); + return null; + + return new BlockMeta(this.block, this.height, this.time); }; /** @@ -635,13 +651,13 @@ TXRecord.prototype.getSize = function getSize() { */ TXRecord.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); let index = this.index; this.tx.toWriter(bw); - bw.writeU32(this.ps); + bw.writeU32(this.mtime); if (this.block) { if (index === -1) @@ -650,7 +666,7 @@ TXRecord.prototype.toRaw = function toRaw() { bw.writeU8(1); bw.writeHash(this.block); bw.writeU32(this.height); - bw.writeU32(this.ts); + bw.writeU32(this.time); bw.writeU32(index); } else { bw.writeU8(0); @@ -666,18 +682,18 @@ TXRecord.prototype.toRaw = function toRaw() { */ TXRecord.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.tx = new TX(); this.tx.fromReader(br); this.hash = this.tx.hash('hex'); - this.ps = br.readU32(); + this.mtime = br.readU32(); if (br.readU8() === 1) { this.block = br.readHash('hex'); this.height = br.readU32(); - this.ts = br.readU32(); + this.time = br.readU32(); this.index = br.readU32(); if (this.index === 0x7fffffff) this.index = -1; @@ -701,32 +717,24 @@ TXRecord.fromRaw = function fromRaw(data) { * Helpers */ -function cmp(a, b) { - return a - b; -} - -function cmpid(a, b) { - return a.id - b.id; -} - function parseWallets(br) { - let count = br.readU32(); - let wids = []; + const count = br.readU32(); + const wids = new Set(); for (let i = 0; i < count; i++) - wids.push(br.readU32()); + wids.add(br.readU32()); return wids; } function sizeWallets(wids) { - return 4 + wids.length * 4; + return 4 + wids.size * 4; } function serializeWallets(bw, wids) { - bw.writeU32(wids.length); + bw.writeU32(wids.size); - for (let wid of wids) + for (const wid of wids) bw.writeU32(wid); return bw; diff --git a/lib/wallet/rpc.js b/lib/wallet/rpc.js index 31ee1a4b6..44d16e0c5 100644 --- a/lib/wallet/rpc.js +++ b/lib/wallet/rpc.js @@ -49,12 +49,11 @@ function RPC(wdb) { this.client = wdb.client; this.wallet = null; - this.feeRate = null; this.init(); } -util.inherits(RPC, RPCBase); +Object.setPrototypeOf(RPC.prototype, RPCBase.prototype); RPC.prototype.init = function init() { this.add('help', this.help); @@ -110,13 +109,11 @@ RPC.prototype.init = function init() { this.add('setloglevel', this.setLogLevel); }; -RPC.prototype.help = async function _help(args, help) { - let json; - +RPC.prototype.help = async function help(args, _help) { if (args.length === 0) return 'Select a command.'; - json = { + const json = { method: args[0], params: [] }; @@ -134,43 +131,43 @@ RPC.prototype.stop = async function stop(args, help) { }; RPC.prototype.fundRawTransaction = async function fundRawTransaction(args, help) { - let valid = new Validator([args]); - let data = valid.buf(0); - let options = valid.obj(1); - let wallet = this.wallet; - let rate = this.feeRate; - let change, tx; - if (help || args.length < 1 || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'fundrawtransaction "hexstring" ( options )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + const data = valid.buf(0); + const options = valid.obj(1); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid hex string.'); - tx = MTX.fromRaw(data); + const tx = MTX.fromRaw(data); if (tx.outputs.length === 0) { throw new RPCError(errs.INVALID_PARAMETER, 'TX must have at least one output.'); } + let rate = null; + let change = null; + if (options) { - valid = new Validator([options]); + const valid = new Validator([options]); + + rate = valid.ufixed('feeRate', 8); change = valid.str('changeAddress'); - rate = valid.btc('feeRate'); if (change) change = parseAddress(change, this.network); } - options = { + await wallet.fund(tx, { rate: rate, changeAddress: change - }; - - await wallet.fund(tx, options); + }); return { hex: tx.toRaw().toString('hex'), @@ -184,16 +181,14 @@ RPC.prototype.fundRawTransaction = async function fundRawTransaction(args, help) */ RPC.prototype.resendWalletTransactions = async function resendWalletTransactions(args, help) { - let wallet = this.wallet; - let hashes = []; - let txs; - if (help || args.length !== 0) throw new RPCError(errs.MISC_ERROR, 'resendwallettransactions'); - txs = await wallet.resend(); + const wallet = this.wallet; + const txs = await wallet.resend(); + const hashes = []; - for (let tx of txs) + for (const tx of txs) hashes.push(tx.txid()); return hashes; @@ -218,8 +213,8 @@ RPC.prototype.addWitnessAddress = async function addWitnessAddress(args, help) { }; RPC.prototype.backupWallet = async function backupWallet(args, help) { - let valid = new Validator([args]); - let dest = valid.str(0); + const valid = new Validator([args]); + const dest = valid.str(0); if (help || args.length !== 1 || !dest) throw new RPCError(errs.MISC_ERROR, 'backupwallet "destination"'); @@ -230,16 +225,15 @@ RPC.prototype.backupWallet = async function backupWallet(args, help) { }; RPC.prototype.dumpPrivKey = async function dumpPrivKey(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let hash, ring; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'dumpprivkey "bitcoinaddress"'); - hash = parseHash(addr, this.network); - ring = await wallet.getPrivateKey(hash); + const wallet = this.wallet; + const valid = new Validator([args]); + const addr = valid.str(0, ''); + + const hash = parseHash(addr, this.network); + const ring = await wallet.getPrivateKey(hash); if (!ring) throw new RPCError(errs.MISC_ERROR, 'Key not found.'); @@ -248,21 +242,20 @@ RPC.prototype.dumpPrivKey = async function dumpPrivKey(args, help) { }; RPC.prototype.dumpWallet = async function dumpWallet(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let file = valid.str(0); - let time = util.date(); - let tip, out, hashes; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'dumpwallet "filename"'); + const wallet = this.wallet; + const valid = new Validator([args]); + const file = valid.str(0); + if (!file) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - tip = await this.wdb.getTip(); + const tip = await this.wdb.getTip(); + const time = util.date(); - out = [ + const out = [ util.fmt('# Wallet Dump created by Bcoin %s', pkg.version), util.fmt('# * Created on %s', time), util.fmt('# * Best block at time of backup was %d (%s).', @@ -271,22 +264,22 @@ RPC.prototype.dumpWallet = async function dumpWallet(args, help) { '' ]; - hashes = await wallet.getAddressHashes(); + const hashes = await wallet.getAddressHashes(); - for (let hash of hashes) { - let ring = await wallet.getPrivateKey(hash); - let addr, fmt, str; + for (const hash of hashes) { + const ring = await wallet.getPrivateKey(hash); if (!ring) continue; - addr = ring.getAddress('string'); - fmt = '%s %s label= addr=%s'; + const addr = ring.getAddress('string'); + + let fmt = '%s %s label= addr=%s'; if (ring.branch === 1) fmt = '%s %s change=1 addr=%s'; - str = util.fmt(fmt, ring.toSecret(), time, addr); + const str = util.fmt(fmt, ring.toSecret(), time, addr); out.push(str); } @@ -295,24 +288,25 @@ RPC.prototype.dumpWallet = async function dumpWallet(args, help) { out.push('# End of dump'); out.push(''); - out = out.join('\n'); + const dump = out.join('\n'); if (fs.unsupported) - return out; + return dump; - await fs.writeFile(file, out, 'utf8'); + await fs.writeFile(file, dump, 'utf8'); return null; }; RPC.prototype.encryptWallet = async function encryptWallet(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let passphrase = valid.str(0, ''); + const wallet = this.wallet; if (!wallet.master.encrypted && (help || args.length !== 1)) throw new RPCError(errs.MISC_ERROR, 'encryptwallet "passphrase"'); + const valid = new Validator([args]); + const passphrase = valid.str(0, ''); + if (wallet.master.encrypted) { throw new RPCError(errs.WALLET_WRONG_ENC_STATE, 'Already running with an encrypted wallet.'); @@ -331,18 +325,17 @@ RPC.prototype.encryptWallet = async function encryptWallet(args, help) { }; RPC.prototype.getAccountAddress = async function getAccountAddress(args, help) { - let valid = new Validator([args]); - let wallet = this.wallet; - let name = valid.str(0, ''); - let account; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'getaccountaddress "account"'); + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0, ''); + if (!name) name = 'default'; - account = await wallet.getAccount(name); + const account = await wallet.getAccount(name); if (!account) return ''; @@ -351,16 +344,15 @@ RPC.prototype.getAccountAddress = async function getAccountAddress(args, help) { }; RPC.prototype.getAccount = async function getAccount(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let hash, path; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'getaccount "bitcoinaddress"'); - hash = parseHash(addr, this.network); - path = await wallet.getPath(hash); + const wallet = this.wallet; + const valid = new Validator([args]); + const addr = valid.str(0, ''); + + const hash = parseHash(addr, this.network); + const path = await wallet.getPath(hash); if (!path) return ''; @@ -369,22 +361,21 @@ RPC.prototype.getAccount = async function getAccount(args, help) { }; RPC.prototype.getAddressesByAccount = async function getAddressesByAccount(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let name = valid.str(0, ''); - let addrs = []; - let paths; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'getaddressesbyaccount "account"'); + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0, ''); + const addrs = []; + if (name === '') name = 'default'; - paths = await wallet.getPaths(name); + const paths = await wallet.getPaths(name); - for (let path of paths) { - let addr = path.toAddress(); + for (const path of paths) { + const addr = path.toAddress(); addrs.push(addr.toString(this.network)); } @@ -392,18 +383,17 @@ RPC.prototype.getAddressesByAccount = async function getAddressesByAccount(args, }; RPC.prototype.getBalance = async function getBalance(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let name = valid.str(0); - let minconf = valid.u32(1, 0); - let watchOnly = valid.bool(2, false); - let value, balance; - if (help || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'getbalance ( "account" minconf includeWatchonly )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0); + const minconf = valid.u32(1, 0); + const watchOnly = valid.bool(2, false); + if (name === '') name = 'default'; @@ -413,8 +403,9 @@ RPC.prototype.getBalance = async function getBalance(args, help) { if (wallet.watchOnly !== watchOnly) return 0; - balance = await wallet.getBalance(name); + const balance = await wallet.getBalance(name); + let value; if (minconf > 0) value = balance.confirmed; else @@ -424,62 +415,59 @@ RPC.prototype.getBalance = async function getBalance(args, help) { }; RPC.prototype.getNewAddress = async function getNewAddress(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let name = valid.str(0); - let addr; - if (help || args.length > 1) throw new RPCError(errs.MISC_ERROR, 'getnewaddress ( "account" )'); + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0); + if (name === '') name = 'default'; - addr = await wallet.createReceive(name); + const addr = await wallet.createReceive(name); return addr.getAddress('string'); }; RPC.prototype.getRawChangeAddress = async function getRawChangeAddress(args, help) { - let wallet = this.wallet; - let addr; - if (help || args.length > 1) throw new RPCError(errs.MISC_ERROR, 'getrawchangeaddress'); - addr = await wallet.createChange(); + const wallet = this.wallet; + const addr = await wallet.createChange(); return addr.getAddress('string'); }; RPC.prototype.getReceivedByAccount = async function getReceivedByAccount(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let name = valid.str(0); - let minconf = valid.u32(0, 0); - let height = this.wdb.state.height; - let total = 0; - let filter = {}; - let lastConf = -1; - let paths, txs; - if (help || args.length < 1 || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'getreceivedbyaccount "account" ( minconf )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0); + const minconf = valid.u32(1, 0); + const height = this.wdb.state.height; + if (name === '') name = 'default'; - paths = await wallet.getPaths(name); + const paths = await wallet.getPaths(name); + const filter = new Set(); + + for (const path of paths) + filter.add(path.hash); - for (let path of paths) - filter[path.hash] = true; + const txs = await wallet.getHistory(name); - txs = await wallet.getHistory(name); + let total = 0; + let lastConf = -1; - for (let wtx of txs) { - let conf = wtx.getDepth(height); + for (const wtx of txs) { + const conf = wtx.getDepth(height); if (conf < minconf) continue; @@ -487,9 +475,9 @@ RPC.prototype.getReceivedByAccount = async function getReceivedByAccount(args, h if (lastConf === -1 || conf < lastConf) lastConf = conf; - for (let output of wtx.tx.outputs) { - let hash = output.getHash('hex'); - if (hash && filter[hash]) + for (const output of wtx.tx.outputs) { + const hash = output.getHash('hex'); + if (hash && filter.has(hash)) total += output.value; } } @@ -498,27 +486,27 @@ RPC.prototype.getReceivedByAccount = async function getReceivedByAccount(args, h }; RPC.prototype.getReceivedByAddress = async function getReceivedByAddress(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let minconf = valid.u32(1, 0); - let height = this.wdb.state.height; - let total = 0; - let hash, txs; - if (help || args.length < 1 || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'getreceivedbyaddress "bitcoinaddress" ( minconf )'); } - hash = parseHash(addr, this.network); - txs = await wallet.getHistory(); + const wallet = this.wallet; + const valid = new Validator([args]); + const addr = valid.str(0, ''); + const minconf = valid.u32(1, 0); + const height = this.wdb.state.height; - for (let wtx of txs) { + const hash = parseHash(addr, this.network); + const txs = await wallet.getHistory(); + + let total = 0; + + for (const wtx of txs) { if (wtx.getDepth(height) < minconf) continue; - for (let output of wtx.tx.outputs) { + for (const output of wtx.tx.outputs) { if (output.getHash('hex') === hash) total += output.value; } @@ -528,25 +516,26 @@ RPC.prototype.getReceivedByAddress = async function getReceivedByAddress(args, h }; RPC.prototype._toWalletTX = async function _toWalletTX(wtx) { - let wallet = this.wallet; - let details = await wallet.toDetails(wtx); - let det = []; - let sent = 0; - let received = 0; - let receive = true; + const wallet = this.wallet; + const details = await wallet.toDetails(wtx); if (!details) throw new RPCError(errs.WALLET_ERROR, 'TX not found.'); - for (let member of details.inputs) { + let receive = true; + for (const member of details.inputs) { if (member.path) { receive = false; break; } } + const det = []; + let sent = 0; + let received = 0; + for (let i = 0; i < details.outputs.length; i++) { - let member = details.outputs[i]; + const member = details.outputs[i]; if (member.path) { if (member.path.branch === 1) @@ -588,11 +577,11 @@ RPC.prototype._toWalletTX = async function _toWalletTX(wtx) { confirmations: details.confirmations, blockhash: details.block ? util.revHex(details.block) : null, blockindex: details.index, - blocktime: details.ts, + blocktime: details.time, txid: util.revHex(details.hash), walletconflicts: [], - time: details.ps, - timereceived: details.ps, + time: details.mtime, + timereceived: details.mtime, 'bip125-replaceable': 'no', details: det, hex: details.tx.toRaw().toString('hex') @@ -600,41 +589,39 @@ RPC.prototype._toWalletTX = async function _toWalletTX(wtx) { }; RPC.prototype.getTransaction = async function getTransaction(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let hash = valid.hash(0); - let watchOnly = valid.bool(1, false); - let wtx; - if (help || args.length < 1 || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'gettransaction "txid" ( includeWatchonly )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + const hash = valid.hash(0); + const watchOnly = valid.bool(1, false); + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter'); - wtx = await wallet.getTX(hash); + const wtx = await wallet.getTX(hash); if (!wtx) - throw new RPCError(errs.WALLET_ERROR, 'TX not found.'); + throw new RPCError(errs.INVALID_ADDRESS_OR_KEY, 'TX not found.'); return await this._toWalletTX(wtx, watchOnly); }; RPC.prototype.abandonTransaction = async function abandonTransaction(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let hash = valid.hash(0); - let result; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'abandontransaction "txid"'); + const wallet = this.wallet; + const valid = new Validator([args]); + const hash = valid.hash(0); + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - result = await wallet.abandon(hash); + const result = await wallet.abandon(hash); if (!result) throw new RPCError(errs.WALLET_ERROR, 'Transaction not in wallet.'); @@ -643,25 +630,21 @@ RPC.prototype.abandonTransaction = async function abandonTransaction(args, help) }; RPC.prototype.getUnconfirmedBalance = async function getUnconfirmedBalance(args, help) { - let wallet = this.wallet; - let balance; - if (help || args.length > 0) throw new RPCError(errs.MISC_ERROR, 'getunconfirmedbalance'); - balance = await wallet.getBalance(); + const wallet = this.wallet; + const balance = await wallet.getBalance(); return Amount.btc(balance.unconfirmed, true); }; RPC.prototype.getWalletInfo = async function getWalletInfo(args, help) { - let wallet = this.wallet; - let balance; - if (help || args.length !== 0) throw new RPCError(errs.MISC_ERROR, 'getwalletinfo'); - balance = await wallet.getBalance(); + const wallet = this.wallet; + const balance = await wallet.getBalance(); return { walletid: wallet.id, @@ -672,25 +655,22 @@ RPC.prototype.getWalletInfo = async function getWalletInfo(args, help) { keypoololdest: 0, keypoolsize: 0, unlocked_until: wallet.master.until, - paytxfee: this.feeRate != null - ? Amount.btc(this.feeRate, true) - : 0 + paytxfee: Amount.btc(this.wdb.feeRate, true) }; }; RPC.prototype.importPrivKey = async function importPrivKey(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let secret = valid.str(0); - let rescan = valid.bool(2, false); - let key; - if (help || args.length < 1 || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'importprivkey "bitcoinprivkey" ( "label" rescan )'); } - key = parseSecret(secret, this.network); + const wallet = this.wallet; + const valid = new Validator([args]); + const secret = valid.str(0); + const rescan = valid.bool(2, false); + + const key = parseSecret(secret, this.network); await wallet.importKey(0, key); @@ -701,26 +681,22 @@ RPC.prototype.importPrivKey = async function importPrivKey(args, help) { }; RPC.prototype.importWallet = async function importWallet(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let file = valid.str(0); - let rescan = valid.bool(1, false); - let keys = []; - let data, lines; - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'importwallet "filename" ( rescan )'); + const wallet = this.wallet; + const valid = new Validator([args]); + const file = valid.str(0); + const rescan = valid.bool(1, false); + if (fs.unsupported) throw new RPCError(errs.INTERNAL_ERROR, 'FS not available.'); - data = await fs.readFile(file, 'utf8'); - - lines = data.split(/\n+/); + const data = await fs.readFile(file, 'utf8'); + const lines = data.split(/\n+/); + const keys = []; for (let line of lines) { - let parts, secret; - line = line.trim(); if (line.length === 0) @@ -729,17 +705,17 @@ RPC.prototype.importWallet = async function importWallet(args, help) { if (/^\s*#/.test(line)) continue; - parts = line.split(/\s+/); + const parts = line.split(/\s+/); if (parts.length < 4) throw new RPCError(errs.DESERIALIZATION_ERROR, 'Malformed wallet.'); - secret = parseSecret(parts[0], this.network); + const secret = parseSecret(parts[0], this.network); keys.push(secret); } - for (let key of keys) + for (const key of keys) await wallet.importKey(0, key); if (rescan) @@ -749,20 +725,19 @@ RPC.prototype.importWallet = async function importWallet(args, help) { }; RPC.prototype.importAddress = async function importAddress(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let rescan = valid.bool(2, false); - let p2sh = valid.bool(3, false); - let script; - if (help || args.length < 1 || args.length > 4) { throw new RPCError(errs.MISC_ERROR, 'importaddress "address" ( "label" rescan p2sh )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + let addr = valid.str(0, ''); + const rescan = valid.bool(2, false); + const p2sh = valid.bool(3, false); + if (p2sh) { - script = valid.buf(0); + let script = valid.buf(0); if (!script) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameters.'); @@ -784,21 +759,20 @@ RPC.prototype.importAddress = async function importAddress(args, help) { }; RPC.prototype.importPubkey = async function importPubkey(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let data = valid.buf(0); - let rescan = valid.bool(2, false); - let key; - if (help || args.length < 1 || args.length > 4) { throw new RPCError(errs.MISC_ERROR, 'importpubkey "pubkey" ( "label" rescan )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + const data = valid.buf(0); + const rescan = valid.bool(2, false); + if (!data) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - key = KeyRing.fromPublic(data, this.network); + const key = KeyRing.fromPublic(data, this.network); await wallet.importKey(0, key); @@ -815,22 +789,21 @@ RPC.prototype.keyPoolRefill = async function keyPoolRefill(args, help) { }; RPC.prototype.listAccounts = async function listAccounts(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let minconf = valid.u32(0, 0); - let watchOnly = valid.bool(1, false); - let map = {}; - let accounts; - if (help || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'listaccounts ( minconf includeWatchonly)'); } - accounts = await wallet.getAccounts(); + const wallet = this.wallet; + const valid = new Validator([args]); + const minconf = valid.u32(0, 0); + const watchOnly = valid.bool(1, false); - for (let account of accounts) { - let balance = await wallet.getBalance(account); + const accounts = await wallet.getAccounts(); + const map = {}; + + for (const account of accounts) { + const balance = await wallet.getBalance(account); let value = balance.unconfirmed; if (minconf > 0) @@ -852,16 +825,14 @@ RPC.prototype.listAddressGroupings = async function listAddressGroupings(args, h }; RPC.prototype.listLockUnspent = async function listLockUnspent(args, help) { - let wallet = this.wallet; - let out = []; - let outpoints; - if (help || args.length > 0) throw new RPCError(errs.MISC_ERROR, 'listlockunspent'); - outpoints = wallet.getLocked(); + const wallet = this.wallet; + const outpoints = wallet.getLocked(); + const out = []; - for (let outpoint of outpoints) { + for (const outpoint of outpoints) { out.push({ txid: outpoint.txid(), vout: outpoint.index @@ -872,71 +843,67 @@ RPC.prototype.listLockUnspent = async function listLockUnspent(args, help) { }; RPC.prototype.listReceivedByAccount = async function listReceivedByAccount(args, help) { - let valid = new Validator([args]); - let minconf = valid.u32(0, 0); - let includeEmpty = valid.bool(1, false); - let watchOnly = valid.bool(2, false); - if (help || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'listreceivedbyaccount ( minconf includeempty includeWatchonly )'); } + const valid = new Validator([args]); + const minconf = valid.u32(0, 0); + const includeEmpty = valid.bool(1, false); + const watchOnly = valid.bool(2, false); + return await this._listReceived(minconf, includeEmpty, watchOnly, true); }; RPC.prototype.listReceivedByAddress = async function listReceivedByAddress(args, help) { - let valid = new Validator([args]); - let minconf = valid.u32(0, 0); - let includeEmpty = valid.bool(1, false); - let watchOnly = valid.bool(2, false); - if (help || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'listreceivedbyaddress ( minconf includeempty includeWatchonly )'); } + const valid = new Validator([args]); + const minconf = valid.u32(0, 0); + const includeEmpty = valid.bool(1, false); + const watchOnly = valid.bool(2, false); + return await this._listReceived(minconf, includeEmpty, watchOnly, false); }; RPC.prototype._listReceived = async function _listReceived(minconf, empty, watchOnly, account) { - let wallet = this.wallet; - let paths = await wallet.getPaths(); - let height = this.wdb.state.height; - let out = []; - let result = []; - let map = {}; - let txs, keys; - - for (let path of paths) { - let addr = path.toAddress(); - map[path.hash] = { + const wallet = this.wallet; + const paths = await wallet.getPaths(); + const height = this.wdb.state.height; + + const map = new Map(); + for (const path of paths) { + const addr = path.toAddress(); + map.set(path.hash, { involvesWatchonly: wallet.watchOnly, address: addr.toString(this.network), account: path.name, amount: 0, confirmations: -1, - label: '', - }; + label: '' + }); } - txs = await wallet.getHistory(); + const txs = await wallet.getHistory(); - for (let wtx of txs) { - let conf = wtx.getDepth(height); + for (const wtx of txs) { + const conf = wtx.getDepth(height); if (conf < minconf) continue; - for (let output of wtx.tx.outputs) { - let addr = output.getAddress(); - let hash, entry; + for (const output of wtx.tx.outputs) { + const addr = output.getAddress(); if (!addr) continue; - hash = addr.getHash('hex'); - entry = map[hash]; + const hash = addr.getHash('hex'); + const entry = map.get(hash); if (entry) { if (entry.confirmations === -1 || conf < entry.confirmations) @@ -947,20 +914,17 @@ RPC.prototype._listReceived = async function _listReceived(minconf, empty, watch } } - keys = Object.keys(map); - - for (let key of keys) { - let entry = map[key]; + let out = []; + for (const entry of map.values()) out.push(entry); - } if (account) { - let map = {}; + const map = new Map(); - for (let entry of out) { - let item = map[entry.account]; + for (const entry of out) { + const item = map.get(entry.account); if (!item) { - map[entry.account] = entry; + map.set(entry.account, entry); entry.address = undefined; continue; } @@ -969,13 +933,12 @@ RPC.prototype._listReceived = async function _listReceived(minconf, empty, watch out = []; - for (let key of Object.keys(map)) { - let entry = map[key]; + for (const entry of map.values()) out.push(entry); - } } - for (let entry of out) { + const result = []; + for (const entry of out) { if (!empty && entry.amount === 0) continue; @@ -990,15 +953,12 @@ RPC.prototype._listReceived = async function _listReceived(minconf, empty, watch }; RPC.prototype.listSinceBlock = async function listSinceBlock(args, help) { - let wallet = this.wallet; - let chainHeight = this.wdb.state.height; - let valid = new Validator([args]); - let block = valid.hash(0); - let minconf = valid.u32(1, 0); - let watchOnly = valid.bool(2, false); - let height = -1; - let out = []; - let txs, highest; + const wallet = this.wallet; + const chainHeight = this.wdb.state.height; + const valid = new Validator([args]); + const block = valid.hash(0); + const minconf = valid.u32(1, 0); + const watchOnly = valid.bool(2, false); if (help) { throw new RPCError(errs.MISC_ERROR, @@ -1006,10 +966,11 @@ RPC.prototype.listSinceBlock = async function listSinceBlock(args, help) { } if (wallet.watchOnly !== watchOnly) - return out; + return []; + let height = -1; if (block) { - let entry = await this.client.getEntry(block); + const entry = await this.client.getEntry(block); if (entry) height = entry.height; } @@ -1017,11 +978,11 @@ RPC.prototype.listSinceBlock = async function listSinceBlock(args, help) { if (height === -1) height = this.chain.height; - txs = await wallet.getHistory(); - - for (let wtx of txs) { - let json; + const txs = await wallet.getHistory(); + const out = []; + let highest; + for (const wtx of txs) { if (wtx.height < height) continue; @@ -1031,7 +992,7 @@ RPC.prototype.listSinceBlock = async function listSinceBlock(args, help) { if (!highest || wtx.height > highest) highest = wtx; - json = await this._toListTX(wtx); + const json = await this._toListTX(wtx); out.push(json); } @@ -1045,26 +1006,25 @@ RPC.prototype.listSinceBlock = async function listSinceBlock(args, help) { }; RPC.prototype._toListTX = async function _toListTX(wtx) { - let wallet = this.wallet; - let details = await wallet.toDetails(wtx); - let sent = 0; - let received = 0; - let receive = true; - let sendMember, recMember, sendIndex, recIndex; - let member, index; + const wallet = this.wallet; + const details = await wallet.toDetails(wtx); if (!details) throw new RPCError(errs.WALLET_ERROR, 'TX not found.'); - for (let member of details.inputs) { + let receive = true; + for (const member of details.inputs) { if (member.path) { receive = false; break; } } + let sent = 0; + let received = 0; + let sendMember, recMember, sendIndex, recIndex; for (let i = 0; i < details.outputs.length; i++) { - let member = details.outputs[i]; + const member = details.outputs[i]; if (member.path) { if (member.path.branch === 1) @@ -1080,6 +1040,7 @@ RPC.prototype._toListTX = async function _toListTX(wtx) { sendIndex = i; } + let member, index; if (receive) { member = recMember; index = recIndex; @@ -1107,46 +1068,45 @@ RPC.prototype._toListTX = async function _toListTX(wtx) { confirmations: details.getDepth(), blockhash: details.block ? util.revHex(details.block) : null, blockindex: details.index, - blocktime: details.ts, + blocktime: details.time, txid: util.revHex(details.hash), walletconflicts: [], - time: details.ps, - timereceived: details.ps, + time: details.mtime, + timereceived: details.mtime, 'bip125-replaceable': 'no' }; }; RPC.prototype.listTransactions = async function listTransactions(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let name = valid.str(0); - let count = valid.u32(1, 10); - let from = valid.u32(2, 0); - let watchOnly = valid.bool(3, false); - let end = from + count; - let out = []; - let txs; - if (help || args.length > 4) { throw new RPCError(errs.MISC_ERROR, 'listtransactions ( "account" count from includeWatchonly)'); } + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0); + const count = valid.u32(1, 10); + const from = valid.u32(2, 0); + const watchOnly = valid.bool(3, false); + if (wallet.watchOnly !== watchOnly) - return out; + return []; if (name === '') name = 'default'; - txs = await wallet.getHistory(); + const txs = await wallet.getHistory(); common.sortTX(txs); - end = Math.min(end, txs.length); + const end = from + count; + const to = Math.min(end, txs.length); + const out = []; - for (let i = from; i < end; i++) { - let wtx = txs[i]; - let json = await this._toListTX(wtx); + for (let i = from; i < to; i++) { + const wtx = txs[i]; + const json = await this._toListTX(wtx); out.push(json); } @@ -1154,58 +1114,58 @@ RPC.prototype.listTransactions = async function listTransactions(args, help) { }; RPC.prototype.listUnspent = async function listUnspent(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let minDepth = valid.u32(0, 1); - let maxDepth = valid.u32(1, 9999999); - let addrs = valid.array(2); - let height = this.wdb.state.height; - let out = []; - let map = {}; - let coins; - if (help || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'listunspent ( minconf maxconf ["address",...] )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + const minDepth = valid.u32(0, 1); + const maxDepth = valid.u32(1, 9999999); + const addrs = valid.array(2); + const height = this.wdb.state.height; + + const map = new Set(); + if (addrs) { - let valid = new Validator([addrs]); + const valid = new Validator([addrs]); for (let i = 0; i < addrs.length; i++) { - let addr = valid.str(i, ''); - let hash = parseHash(addr, this.network); + const addr = valid.str(i, ''); + const hash = parseHash(addr, this.network); - if (map[hash]) + if (map.has(hash)) throw new RPCError(errs.INVALID_PARAMETER, 'Duplicate address.'); - map[hash] = true; + map.add(hash); } } - coins = await wallet.getCoins(); + const coins = await wallet.getCoins(); common.sortCoins(coins); - for (let coin of coins) { - let depth = coin.getDepth(height); - let addr, hash, ring; + const out = []; - if (!(depth >= minDepth && depth <= maxDepth)) + for (const coin of coins) { + const depth = coin.getDepth(height); + + if (depth < minDepth || depth > maxDepth) continue; - addr = coin.getAddress(); + const addr = coin.getAddress(); if (!addr) continue; - hash = coin.getHash('hex'); + const hash = coin.getHash('hex'); if (addrs) { - if (!hash || !map[hash]) + if (!hash || !map.has(hash)) continue; } - ring = await wallet.getKey(hash); + const ring = await wallet.getKey(hash); out.push({ txid: coin.txid(), @@ -1227,16 +1187,16 @@ RPC.prototype.listUnspent = async function listUnspent(args, help) { }; RPC.prototype.lockUnspent = async function lockUnspent(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let unlock = valid.bool(0, false); - let outputs = valid.array(1); - if (help || args.length < 1 || args.length > 2) { throw new RPCError(errs.MISC_ERROR, 'lockunspent unlock ([{"txid":"txid","vout":n},...])'); } + const wallet = this.wallet; + const valid = new Validator([args]); + const unlock = valid.bool(0, false); + const outputs = valid.array(1); + if (args.length === 1) { if (unlock) wallet.unlockCoins(); @@ -1246,18 +1206,15 @@ RPC.prototype.lockUnspent = async function lockUnspent(args, help) { if (!outputs) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - for (let output of outputs) { - let valid = new Validator([output]); - let hash = valid.hash('txid'); - let index = valid.u32('vout'); - let outpoint; + for (const output of outputs) { + const valid = new Validator([output]); + const hash = valid.hash('txid'); + const index = valid.u32('vout'); if (hash == null || index == null) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid parameter.'); - outpoint = new Outpoint(); - outpoint.hash = hash; - outpoint.index = index; + const outpoint = new Outpoint(hash, index); if (unlock) { wallet.unlockCoin(outpoint); @@ -1276,32 +1233,29 @@ RPC.prototype.move = async function move(args, help) { }; RPC.prototype.sendFrom = async function sendFrom(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let name = valid.str(0); - let addr = valid.str(1); - let value = valid.btc(2); - let minconf = valid.u32(3, 0); - let options, tx; - if (help || args.length < 3 || args.length > 6) { throw new RPCError(errs.MISC_ERROR, 'sendfrom "fromaccount" "tobitcoinaddress"' + ' amount ( minconf "comment" "comment-to" )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0); + const str = valid.str(1); + const value = valid.ufixed(2, 8); + const minconf = valid.u32(3, 0); + + const addr = parseAddress(str, this.network); + if (!addr || value == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - addr = parseAddress(addr, this.network); - if (name === '') name = 'default'; - options = { + const options = { account: name, - subtractFee: false, - rate: this.feeRate, depth: minconf, outputs: [{ address: addr, @@ -1309,98 +1263,93 @@ RPC.prototype.sendFrom = async function sendFrom(args, help) { }] }; - tx = await wallet.send(options); + const tx = await wallet.send(options); return tx.txid(); }; RPC.prototype.sendMany = async function sendMany(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let name = valid.str(0); - let sendTo = valid.obj(1); - let minconf = valid.u32(2, 1); - let subtractFee = valid.bool(4, false); - let outputs = []; - let uniq = {}; - let keys, options, tx; - if (help || args.length < 2 || args.length > 5) { throw new RPCError(errs.MISC_ERROR, 'sendmany "fromaccount" {"address":amount,...}' + ' ( minconf "comment" ["address",...] )'); } + const wallet = this.wallet; + const valid = new Validator([args]); + let name = valid.str(0); + const sendTo = valid.obj(1); + const minconf = valid.u32(2, 1); + const subtract = valid.bool(4, false); + if (name === '') name = 'default'; if (!sendTo) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - keys = Object.keys(sendTo); - valid = new Validator([sendTo]); + const to = new Validator([sendTo]); + const uniq = new Set(); + const outputs = []; - for (let key of keys) { - let value = valid.btc(key); - let addr = parseAddress(key, this.network); - let hash = addr.getHash('hex'); - let output; + for (const key of Object.keys(sendTo)) { + const value = to.ufixed(key, 8); + const addr = parseAddress(key, this.network); + const hash = addr.getHash('hex'); if (value == null) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid parameter.'); - if (uniq[hash]) + if (uniq.has(hash)) throw new RPCError(errs.INVALID_PARAMETER, 'Invalid parameter.'); - uniq[hash] = true; + uniq.add(hash); - output = new Output(); + const output = new Output(); output.value = value; output.script.fromAddress(addr); outputs.push(output); } - options = { + const options = { outputs: outputs, - subtractFee: subtractFee, + subtractFee: subtract, account: name, depth: minconf }; - tx = await wallet.send(options); + const tx = await wallet.send(options); return tx.txid(); }; RPC.prototype.sendToAddress = async function sendToAddress(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let addr = valid.str(0); - let value = valid.btc(1); - let subtractFee = valid.bool(4, false); - let options, tx; - if (help || args.length < 2 || args.length > 5) { throw new RPCError(errs.MISC_ERROR, 'sendtoaddress "bitcoinaddress" amount' + ' ( "comment" "comment-to" subtractfeefromamount )'); } - addr = parseAddress(addr, this.network); + const wallet = this.wallet; + const valid = new Validator([args]); + const str = valid.str(0); + const value = valid.ufixed(1, 8); + const subtract = valid.bool(4, false); + + const addr = parseAddress(str, this.network); if (!addr || value == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - options = { - subtractFee: subtractFee, - rate: this.feeRate, + const options = { + subtractFee: subtract, outputs: [{ address: addr, value: value }] }; - tx = await wallet.send(options); + const tx = await wallet.send(options); return tx.txid(); }; @@ -1416,8 +1365,8 @@ RPC.prototype.setAccount = async function setAccount(args, help) { }; RPC.prototype.setTXFee = async function setTXFee(args, help) { - let valid = new Validator([args]); - let rate = valid.btc(0); + const valid = new Validator([args]); + const rate = valid.ufixed(0, 8); if (help || args.length < 1 || args.length > 1) throw new RPCError(errs.MISC_ERROR, 'settxfee amount'); @@ -1425,26 +1374,25 @@ RPC.prototype.setTXFee = async function setTXFee(args, help) { if (rate == null) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - this.feeRate = rate; + this.wdb.feeRate = rate; return true; }; RPC.prototype.signMessage = async function signMessage(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let addr = valid.str(0, ''); - let msg = valid.str(1, ''); - let sig, ring; - if (help || args.length !== 2) { throw new RPCError(errs.MISC_ERROR, 'signmessage "bitcoinaddress" "message"'); } - addr = parseHash(addr, this.network); + const wallet = this.wallet; + const valid = new Validator([args]); + const b58 = valid.str(0, ''); + const str = valid.str(1, ''); - ring = await wallet.getKey(addr); + const addr = parseHash(b58, this.network); + + const ring = await wallet.getKey(addr); if (!ring) throw new RPCError(errs.WALLET_ERROR, 'Address not found.'); @@ -1452,16 +1400,16 @@ RPC.prototype.signMessage = async function signMessage(args, help) { if (!wallet.master.key) throw new RPCError(errs.WALLET_UNLOCK_NEEDED, 'Wallet is locked.'); - msg = Buffer.from(MAGIC_STRING + msg, 'utf8'); - msg = digest.hash256(msg); + const msg = Buffer.from(MAGIC_STRING + str, 'utf8'); + const hash = digest.hash256(msg); - sig = ring.sign(msg); + const sig = ring.sign(hash); return sig.toString('base64'); }; RPC.prototype.walletLock = async function walletLock(args, help) { - let wallet = this.wallet; + const wallet = this.wallet; if (help || (wallet.master.encrypted && args.length !== 0)) throw new RPCError(errs.MISC_ERROR, 'walletlock'); @@ -1475,16 +1423,17 @@ RPC.prototype.walletLock = async function walletLock(args, help) { }; RPC.prototype.walletPassphraseChange = async function walletPassphraseChange(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let old = valid.str(0, ''); - let new_ = valid.str(1, ''); + const wallet = this.wallet; if (help || (wallet.master.encrypted && args.length !== 2)) { throw new RPCError(errs.MISC_ERROR, 'walletpassphrasechange' + ' "oldpassphrase" "newpassphrase"'); } + const valid = new Validator([args]); + const old = valid.str(0, ''); + const new_ = valid.str(1, ''); + if (!wallet.master.encrypted) throw new RPCError(errs.WALLET_WRONG_ENC_STATE, 'Wallet is not encrypted.'); @@ -1497,10 +1446,10 @@ RPC.prototype.walletPassphraseChange = async function walletPassphraseChange(arg }; RPC.prototype.walletPassphrase = async function walletPassphrase(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let passphrase = valid.str(0, ''); - let timeout = valid.u32(1); + const wallet = this.wallet; + const valid = new Validator([args]); + const passphrase = valid.str(0, ''); + const timeout = valid.u32(1); if (help || (wallet.master.encrypted && args.length !== 2)) { throw new RPCError(errs.MISC_ERROR, @@ -1522,22 +1471,21 @@ RPC.prototype.walletPassphrase = async function walletPassphrase(args, help) { }; RPC.prototype.importPrunedFunds = async function importPrunedFunds(args, help) { - let valid = new Validator([args]); - let tx = valid.buf(0); - let block = valid.buf(1); - let hash, height; - if (help || args.length < 2 || args.length > 3) { throw new RPCError(errs.MISC_ERROR, 'importprunedfunds "rawtransaction" "txoutproof" ( "label" )'); } - if (!tx || !block) + const valid = new Validator([args]); + const txRaw = valid.buf(0); + const blockRaw = valid.buf(1); + + if (!txRaw || !blockRaw) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - tx = TX.fromRaw(tx); - block = MerkleBlock.fromRaw(block); - hash = block.hash('hex'); + const tx = TX.fromRaw(txRaw); + const block = MerkleBlock.fromRaw(blockRaw); + const hash = block.hash('hex'); if (!block.verify()) throw new RPCError(errs.VERIFY_ERROR, 'Invalid proof.'); @@ -1545,49 +1493,48 @@ RPC.prototype.importPrunedFunds = async function importPrunedFunds(args, help) { if (!block.hasTX(tx.hash('hex'))) throw new RPCError(errs.VERIFY_ERROR, 'Invalid proof.'); - height = await this.client.getEntry(hash); + const height = await this.client.getEntry(hash); if (height === -1) throw new RPCError(errs.VERIFY_ERROR, 'Invalid proof.'); - block = { + const entry = { hash: hash, - ts: block.ts, + time: block.time, height: height }; - if (!(await this.wdb.addTX(tx, block))) + if (!await this.wdb.addTX(tx, entry)) throw new RPCError(errs.WALLET_ERROR, 'No tracked address for TX.'); return null; }; RPC.prototype.removePrunedFunds = async function removePrunedFunds(args, help) { - let wallet = this.wallet; - let valid = new Validator([args]); - let hash = valid.hash(0); - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'removeprunedfunds "txid"'); + const wallet = this.wallet; + const valid = new Validator([args]); + const hash = valid.hash(0); + if (!hash) throw new RPCError(errs.TYPE_ERROR, 'Invalid parameter.'); - if (!(await wallet.remove(hash))) + if (!await wallet.remove(hash)) throw new RPCError(errs.WALLET_ERROR, 'Transaction not in wallet.'); return null; }; RPC.prototype.selectWallet = async function selectWallet(args, help) { - let valid = new Validator([args]); - let id = valid.str(0); - let wallet; + const valid = new Validator([args]); + const id = valid.str(0); if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'selectwallet "id"'); - wallet = await this.wdb.get(id); + const wallet = await this.wdb.get(id); if (!wallet) throw new RPCError(errs.WALLET_ERROR, 'Wallet not found.'); @@ -1605,12 +1552,12 @@ RPC.prototype.getMemoryInfo = async function getMemoryInfo(args, help) { }; RPC.prototype.setLogLevel = async function setLogLevel(args, help) { - let valid = new Validator([args]); - let level = valid.str(0, ''); - if (help || args.length !== 1) throw new RPCError(errs.MISC_ERROR, 'setloglevel "level"'); + const valid = new Validator([args]); + const level = valid.str(0, ''); + this.logger.setLevel(level); return null; @@ -1621,7 +1568,7 @@ RPC.prototype.setLogLevel = async function setLogLevel(args, help) { */ function parseHash(raw, network) { - let addr = parseAddress(raw, network); + const addr = parseAddress(raw, network); return addr.getHash('hex'); } diff --git a/lib/wallet/server.js b/lib/wallet/server.js index b9cac845d..e1610db1b 100644 --- a/lib/wallet/server.js +++ b/lib/wallet/server.js @@ -25,9 +25,8 @@ const server = exports; */ server.create = function create(options) { - let config = new Config('bcoin'); + const config = new Config('bcoin'); let logger = new Logger('debug'); - let client, wdb, workers; config.inject(options); config.load(options); @@ -38,7 +37,7 @@ server.create = function create(options) { if (config.has('logger')) logger = config.obj('logger'); - client = new Client({ + const client = new Client({ network: config.network, uri: config.str('node-uri'), apiKey: config.str('node-api-key') @@ -53,52 +52,31 @@ server.create = function create(options) { shrink: config.bool('log-shrink') }); - workers = new WorkerPool({ + const workers = new WorkerPool({ enabled: config.str('workers-enabled'), - size: config.num('workers-size'), - timeout: config.num('workers-timeout') + size: config.uint('workers-size'), + timeout: config.uint('workers-timeout') }); - workers.on('spawn', (child) => { - logger.info('Spawning worker process: %d.', child.id); - }); - - workers.on('exit', (code, child) => { - logger.warning('Worker %d exited: %s.', child.id, code); - }); - - workers.on('log', (text, child) => { - logger.debug('Worker %d says:', child.id); - logger.debug(text); - }); - - workers.on('error', (err, child) => { - if (child) { - logger.error('Worker %d error: %s', child.id, err.message); - return; - } - wdb.emit('error', err); - }); - - wdb = new WalletDB({ + const wdb = new WalletDB({ network: config.network, logger: logger, workers: workers, client: client, prefix: config.prefix, db: config.str('db'), - maxFiles: config.num('max-files'), + maxFiles: config.uint('max-files'), cacheSize: config.mb('cache-size'), witness: config.bool('witness'), checkpoints: config.bool('checkpoints'), - startHeight: config.num('start-height'), + startHeight: config.uint('start-height'), wipeNoReally: config.bool('wipe-no-really'), apiKey: config.str('api-key'), walletAuth: config.bool('auth'), noAuth: config.bool('no-auth'), ssl: config.str('ssl'), host: config.str('host'), - port: config.num('port'), + port: config.uint('port'), spv: config.bool('spv'), verify: config.bool('spv'), listen: true @@ -106,5 +84,26 @@ server.create = function create(options) { wdb.on('error', () => {}); + workers.on('spawn', (child) => { + logger.info('Spawning worker process: %d.', child.id); + }); + + workers.on('exit', (code, child) => { + logger.warning('Worker %d exited: %s.', child.id, code); + }); + + workers.on('log', (text, child) => { + logger.debug('Worker %d says:', child.id); + logger.debug(text); + }); + + workers.on('error', (err, child) => { + if (child) { + logger.error('Worker %d error: %s', child.id, err.message); + return; + } + wdb.emit('error', err); + }); + return wdb; }; diff --git a/lib/wallet/txdb.js b/lib/wallet/txdb.js index 8b15fbde8..b7367af53 100644 --- a/lib/wallet/txdb.js +++ b/lib/wallet/txdb.js @@ -63,7 +63,7 @@ TXDB.layout = layout; */ TXDB.prototype.open = async function open() { - let state = await this.getState(); + const state = await this.getState(); if (state) { this.state = state; @@ -139,7 +139,7 @@ TXDB.prototype.commit = async function commit() { // Emit buffered events now that // we know everything is written. - for (let [event, data, details] of this.events) { + for (const [event, data, details] of this.events) { this.walletdb.emit(event, this.wallet.id, data, details); this.wallet.emit(event, data, details); } @@ -221,8 +221,10 @@ TXDB.prototype.has = function has(key) { TXDB.prototype.range = function range(options) { if (options.gte) options.gte = this.prefix(options.gte); + if (options.lte) options.lte = this.prefix(options.lte); + return this.db.range(options); }; @@ -235,8 +237,10 @@ TXDB.prototype.range = function range(options) { TXDB.prototype.keys = function keys(options) { if (options.gte) options.gte = this.prefix(options.gte); + if (options.lte) options.lte = this.prefix(options.lte); + return this.db.keys(options); }; @@ -249,8 +253,10 @@ TXDB.prototype.keys = function keys(options) { TXDB.prototype.values = function values(options) { if (options.gte) options.gte = this.prefix(options.gte); + if (options.lte) options.lte = this.prefix(options.lte); + return this.db.values(options); }; @@ -260,13 +266,13 @@ TXDB.prototype.values = function values(options) { * @returns {Promise} - Returns {@link Path}. */ -TXDB.prototype.getPath = function getPath(output) { - let addr = output.getAddress(); +TXDB.prototype.getPath = async function getPath(output) { + const addr = output.getAddress(); if (!addr) - return Promise.resolve(); + return null; - return this.wallet.getPath(addr); + return await this.wallet.getPath(addr); }; /** @@ -275,13 +281,13 @@ TXDB.prototype.getPath = function getPath(output) { * @returns {Promise} - Returns Boolean. */ -TXDB.prototype.hasPath = function hasPath(output) { - let addr = output.getAddress(); +TXDB.prototype.hasPath = async function hasPath(output) { + const addr = output.getAddress(); if (!addr) - return Promise.resolve(false); + return false; - return this.wallet.hasPath(addr); + return await this.wallet.hasPath(addr); }; /** @@ -291,9 +297,9 @@ TXDB.prototype.hasPath = function hasPath(output) { */ TXDB.prototype.saveCredit = async function saveCredit(credit, path) { - let coin = credit.coin; - let key = coin.toKey(); - let raw = credit.toRaw(); + const coin = credit.coin; + const key = coin.toKey(); + const raw = credit.toRaw(); await this.addOutpointMap(coin.hash, coin.index); @@ -310,8 +316,8 @@ TXDB.prototype.saveCredit = async function saveCredit(credit, path) { */ TXDB.prototype.removeCredit = async function removeCredit(credit, path) { - let coin = credit.coin; - let key = coin.toKey(); + const coin = credit.coin; + const key = coin.toKey(); await this.removeOutpointMap(coin.hash, coin.index); @@ -329,8 +335,8 @@ TXDB.prototype.removeCredit = async function removeCredit(credit, path) { */ TXDB.prototype.spendCredit = function spendCredit(credit, tx, index) { - let prevout = tx.inputs[index].prevout; - let spender = Outpoint.fromTX(tx, index); + const prevout = tx.inputs[index].prevout; + const spender = Outpoint.fromTX(tx, index); this.put(layout.s(prevout.hash, prevout.index), spender.toRaw()); this.put(layout.d(spender.hash, spender.index), credit.coin.toRaw()); }; @@ -342,8 +348,8 @@ TXDB.prototype.spendCredit = function spendCredit(credit, tx, index) { */ TXDB.prototype.unspendCredit = function unspendCredit(tx, index) { - let prevout = tx.inputs[index].prevout; - let spender = Outpoint.fromTX(tx, index); + const prevout = tx.inputs[index].prevout; + const spender = Outpoint.fromTX(tx, index); this.del(layout.s(prevout.hash, prevout.index)); this.del(layout.d(spender.hash, spender.index)); }; @@ -355,8 +361,8 @@ TXDB.prototype.unspendCredit = function unspendCredit(tx, index) { */ TXDB.prototype.writeInput = function writeInput(tx, index) { - let prevout = tx.inputs[index].prevout; - let spender = Outpoint.fromTX(tx, index); + const prevout = tx.inputs[index].prevout; + const spender = Outpoint.fromTX(tx, index); this.put(layout.s(prevout.hash, prevout.index), spender.toRaw()); }; @@ -367,7 +373,7 @@ TXDB.prototype.writeInput = function writeInput(tx, index) { */ TXDB.prototype.removeInput = function removeInput(tx, index) { - let prevout = tx.inputs[index].prevout; + const prevout = tx.inputs[index].prevout; this.del(layout.s(prevout.hash, prevout.index)); }; @@ -381,9 +387,8 @@ TXDB.prototype.removeInput = function removeInput(tx, index) { */ TXDB.prototype.resolveInput = async function resolveInput(tx, index, height, path, own) { - let hash = tx.hash('hex'); - let spent = await this.getSpent(hash, index); - let stx, credit; + const hash = tx.hash('hex'); + const spent = await this.getSpent(hash, index); if (!spent) return false; @@ -395,11 +400,11 @@ TXDB.prototype.resolveInput = async function resolveInput(tx, index, height, pat // Get the spending transaction so // we can properly add the undo coin. - stx = await this.getTX(spent.hash); + const stx = await this.getTX(spent.hash); assert(stx); // Crete the credit and add the undo coin. - credit = Credit.fromTX(tx, index, height); + const credit = Credit.fromTX(tx, index, height); credit.own = own; this.spendCredit(credit, stx.tx, spent.index); @@ -428,9 +433,8 @@ TXDB.prototype.resolveInput = async function resolveInput(tx, index, height, pat */ TXDB.prototype.isDoubleSpend = async function isDoubleSpend(tx) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let spent = await this.isSpent(prevout.hash, prevout.index); + for (const {prevout} of tx.inputs) { + const spent = await this.isSpent(prevout.hash, prevout.index); if (spent) return true; } @@ -449,9 +453,9 @@ TXDB.prototype.isRBF = async function isRBF(tx) { if (tx.isRBF()) return true; - for (let input of tx.inputs) { - let prevout = input.prevout; - if (await this.has(layout.r(prevout.hash))) + for (const {prevout} of tx.inputs) { + const key = layout.r(prevout.hash); + if (await this.has(key)) return true; } @@ -466,10 +470,10 @@ TXDB.prototype.isRBF = async function isRBF(tx) { */ TXDB.prototype.getSpent = async function getSpent(hash, index) { - let data = await this.get(layout.s(hash, index)); + const data = await this.get(layout.s(hash, index)); if (!data) - return; + return null; return Outpoint.fromRaw(data); }; @@ -512,7 +516,7 @@ TXDB.prototype.addOutpointMap = async function addOutpointMap(hash, i) { */ TXDB.prototype.removeOutpointMap = async function removeOutpointMap(hash, i) { - let map = await this.walletdb.getOutpointMap(hash, i); + const map = await this.walletdb.getOutpointMap(hash, i); if (!map) return; @@ -520,7 +524,7 @@ TXDB.prototype.removeOutpointMap = async function removeOutpointMap(hash, i) { if (!map.remove(this.wallet.wid)) return; - if (map.wids.length === 0) { + if (map.wids.size === 0) { this.walletdb.unwriteOutpointMap(this.wallet, hash, i); return; } @@ -555,7 +559,7 @@ TXDB.prototype.addBlockMap = async function addBlockMap(hash, height) { */ TXDB.prototype.removeBlockMap = async function removeBlockMap(hash, height) { - let block = await this.walletdb.getBlockMap(height); + const block = await this.walletdb.getBlockMap(height); if (!block) return; @@ -563,7 +567,7 @@ TXDB.prototype.removeBlockMap = async function removeBlockMap(hash, height) { if (!block.remove(hash, this.wallet.wid)) return; - if (block.txs.length === 0) { + if (block.txs.size === 0) { this.walletdb.unwriteBlockMap(this.wallet, height); return; } @@ -591,10 +595,10 @@ TXDB.prototype.getBlocks = function getBlocks() { */ TXDB.prototype.getBlock = async function getBlock(height) { - let data = await this.get(layout.b(height)); + const data = await this.get(layout.b(height)); if (!data) - return; + return null; return BlockRecord.fromRaw(data); }; @@ -607,9 +611,9 @@ TXDB.prototype.getBlock = async function getBlock(height) { */ TXDB.prototype.addBlock = async function addBlock(hash, meta) { - let key = layout.b(meta.height); + const key = layout.b(meta.height); let data = await this.get(key); - let block, size; + let block; if (!data) { block = BlockRecord.fromMeta(meta); @@ -619,7 +623,7 @@ TXDB.prototype.addBlock = async function addBlock(hash, meta) { block = Buffer.allocUnsafe(data.length + 32); data.copy(block, 0); - size = block.readUInt32LE(40, true); + const size = block.readUInt32LE(40, true); block.writeUInt32LE(size + 1, 40, true); hash.copy(block, data.length); @@ -634,14 +638,13 @@ TXDB.prototype.addBlock = async function addBlock(hash, meta) { */ TXDB.prototype.removeBlock = async function removeBlock(hash, height) { - let key = layout.b(height); - let data = await this.get(key); - let block, size; + const key = layout.b(height); + const data = await this.get(key); if (!data) return; - size = data.readUInt32LE(40, true); + const size = data.readUInt32LE(40, true); assert(size > 0); assert(data.slice(-32).equals(hash)); @@ -651,7 +654,7 @@ TXDB.prototype.removeBlock = async function removeBlock(hash, height) { return; } - block = data.slice(0, -32); + const block = data.slice(0, -32); block.writeUInt32LE(size - 1, 40, true); this.put(key, block); @@ -684,7 +687,7 @@ TXDB.prototype.addBlockSlow = async function addBlockSlow(hash, meta) { */ TXDB.prototype.removeBlockSlow = async function removeBlockSlow(hash, height) { - let block = await this.getBlock(height); + const block = await this.getBlock(height); if (!block) return; @@ -709,10 +712,9 @@ TXDB.prototype.removeBlockSlow = async function removeBlockSlow(hash, height) { */ TXDB.prototype.add = async function add(tx, block) { - let result; - this.start(); + let result; try { result = await this._add(tx, block); } catch (e) { @@ -732,28 +734,27 @@ TXDB.prototype.add = async function add(tx, block) { * @returns {Promise} */ -TXDB.prototype._add = async function add(tx, block) { - let hash = tx.hash('hex'); - let existing = await this.getTX(hash); - let wtx; +TXDB.prototype._add = async function _add(tx, block) { + const hash = tx.hash('hex'); + const existing = await this.getTX(hash); assert(!tx.mutable, 'Cannot add mutable TX to wallet.'); if (existing) { // Existing tx is already confirmed. Ignore. if (existing.height !== -1) - return; + return null; // The incoming tx won't confirm the // existing one anyway. Ignore. if (!block) - return; + return null; // Confirm transaction. return await this._confirm(existing, block); } - wtx = TXRecord.fromTX(tx, block); + const wtx = TXRecord.fromTX(tx, block); if (!block) { // We ignore any unconfirmed txs @@ -763,13 +764,13 @@ TXDB.prototype._add = async function add(tx, block) { // hash to detect "passive" // replace-by-fee. this.put(layout.r(hash), null); - return; + return null; } // Potentially remove double-spenders. // Only remove if they're not confirmed. - if (!(await this.removeConflicts(tx, true))) - return; + if (!await this.removeConflicts(tx, true)) + return null; } else { // Potentially remove double-spenders. await this.removeConflicts(tx, false); @@ -791,20 +792,20 @@ TXDB.prototype._add = async function add(tx, block) { */ TXDB.prototype.insert = async function insert(wtx, block) { - let tx = wtx.tx; - let hash = wtx.hash; - let height = block ? block.height : -1; - let details = new Details(this, wtx, block); + const tx = wtx.tx; + const hash = wtx.hash; + const height = block ? block.height : -1; + const details = new Details(this, wtx, block); + const accounts = new Set(); let own = false; let updated = false; if (!tx.isCoinbase()) { // We need to potentially spend some coins here. for (let i = 0; i < tx.inputs.length; i++) { - let input = tx.inputs[i]; - let prevout = input.prevout; - let credit = await this.getCredit(prevout.hash, prevout.index); - let coin, path; + const input = tx.inputs[i]; + const prevout = input.prevout; + const credit = await this.getCredit(prevout.hash, prevout.index); if (!credit) { // Maintain an stxo list for every @@ -822,22 +823,23 @@ TXDB.prototype.insert = async function insert(wtx, block) { continue; } - coin = credit.coin; + const coin = credit.coin; // Do some verification. if (!block) { - if (!(await this.verifyInput(tx, i, coin))) { + if (!await this.verifyInput(tx, i, coin)) { this.clear(); - return; + return null; } } - path = await this.getPath(coin); + const path = await this.getPath(coin); assert(path); // Build the tx details object // as we go, for speed. details.setInput(i, path, coin); + accounts.add(path.account); // Write an undo coin for the credit // and add it to the stxo set. @@ -878,14 +880,14 @@ TXDB.prototype.insert = async function insert(wtx, block) { // Potentially add coins to the utxo set. for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let path = await this.getPath(output); - let credit; + const output = tx.outputs[i]; + const path = await this.getPath(output); if (!path) continue; details.setOutput(i, path); + accounts.add(path.account); // Attempt to resolve an input we // did not know was ours at the time. @@ -894,7 +896,7 @@ TXDB.prototype.insert = async function insert(wtx, block) { continue; } - credit = Credit.fromTX(tx, i, height); + const credit = Credit.fromTX(tx, i, height); credit.own = own; this.pending.coin++; @@ -913,12 +915,12 @@ TXDB.prototype.insert = async function insert(wtx, block) { if (!updated) { // Clear the spent list inserts. this.clear(); - return; + return null; } // Save and index the transaction record. this.put(layout.t(hash), wtx.toRaw()); - this.put(layout.m(wtx.ps, hash), null); + this.put(layout.m(wtx.mtime, hash), null); if (!block) this.put(layout.p(hash), null); @@ -928,9 +930,9 @@ TXDB.prototype.insert = async function insert(wtx, block) { // Do some secondary indexing for account-based // queries. This saves us a lot of time for // queries later. - for (let account of details.accounts) { + for (const account of accounts) { this.put(layout.T(account, hash), null); - this.put(layout.M(account, wtx.ps, hash), null); + this.put(layout.M(account, wtx.mtime, hash), null); if (!block) this.put(layout.P(account, hash), null); @@ -975,11 +977,10 @@ TXDB.prototype.insert = async function insert(wtx, block) { */ TXDB.prototype.confirm = async function confirm(hash, block) { - let wtx = await this.getTX(hash); - let details; + const wtx = await this.getTX(hash); if (!wtx) - return; + return null; if (wtx.height !== -1) throw new Error('TX is already confirmed.'); @@ -988,6 +989,8 @@ TXDB.prototype.confirm = async function confirm(hash, block) { this.start(); + let details; + try { details = await this._confirm(wtx, block); } catch (e) { @@ -1008,25 +1011,25 @@ TXDB.prototype.confirm = async function confirm(hash, block) { * @returns {Promise} */ -TXDB.prototype._confirm = async function confirm(wtx, block) { - let tx = wtx.tx; - let hash = wtx.hash; - let height = block.height; - let details = new Details(this, wtx, block); +TXDB.prototype._confirm = async function _confirm(wtx, block) { + const tx = wtx.tx; + const hash = wtx.hash; + const height = block.height; + const details = new Details(this, wtx, block); + const accounts = new Set(); wtx.setBlock(block); if (!tx.isCoinbase()) { - let credits = await this.getSpentCredits(tx); + const credits = await this.getSpentCredits(tx); // Potentially spend coins. Now that the tx // is mined, we can actually _remove_ coins // from the utxo state. for (let i = 0; i < tx.inputs.length; i++) { - let input = tx.inputs[i]; - let prevout = input.prevout; + const input = tx.inputs[i]; + const prevout = input.prevout; let credit = credits[i]; - let coin, path; // There may be new credits available // that we haven't seen yet. @@ -1047,14 +1050,15 @@ TXDB.prototype._confirm = async function confirm(wtx, block) { this.pending.unconfirmed -= credit.coin.value; } - coin = credit.coin; + const coin = credit.coin; assert(coin.height !== -1); - path = await this.getPath(coin); + const path = await this.getPath(coin); assert(path); details.setInput(i, path, coin); + accounts.add(path.account); // We can now safely remove the credit // entirely, now that we know it's also @@ -1067,16 +1071,16 @@ TXDB.prototype._confirm = async function confirm(wtx, block) { // Update credit heights, including undo coins. for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let path = await this.getPath(output); - let credit, coin; + const output = tx.outputs[i]; + const path = await this.getPath(output); if (!path) continue; details.setOutput(i, path); + accounts.add(path.account); - credit = await this.getCredit(hash, i); + const credit = await this.getCredit(hash, i); assert(credit); // Credits spent in the mempool add an @@ -1088,7 +1092,7 @@ TXDB.prototype._confirm = async function confirm(wtx, block) { // Update coin height and confirmed // balance. Save once again. - coin = credit.coin; + const coin = credit.coin; coin.height = height; this.pending.confirmed += output.value; @@ -1107,7 +1111,7 @@ TXDB.prototype._confirm = async function confirm(wtx, block) { this.put(layout.h(height, hash), null); // Secondary indexing also needs to change. - for (let account of details.accounts) { + for (const account of accounts) { this.del(layout.P(account, hash)); this.put(layout.H(account, height, hash), null); } @@ -1136,10 +1140,10 @@ TXDB.prototype._confirm = async function confirm(wtx, block) { */ TXDB.prototype.remove = async function remove(hash) { - let wtx = await this.getTX(hash); + const wtx = await this.getTX(hash); if (!wtx) - return; + return null; return await this.removeRecursive(wtx); }; @@ -1153,20 +1157,20 @@ TXDB.prototype.remove = async function remove(hash) { */ TXDB.prototype.erase = async function erase(wtx, block) { - let tx = wtx.tx; - let hash = wtx.hash; - let height = block ? block.height : -1; - let details = new Details(this, wtx, block); + const tx = wtx.tx; + const hash = wtx.hash; + const height = block ? block.height : -1; + const details = new Details(this, wtx, block); + const accounts = new Set(); if (!tx.isCoinbase()) { // We need to undo every part of the // state this transaction ever touched. // Start by getting the undo coins. - let credits = await this.getSpentCredits(tx); + const credits = await this.getSpentCredits(tx); for (let i = 0; i < tx.inputs.length; i++) { - let credit = credits[i]; - let coin, path; + const credit = credits[i]; if (!credit) { // This input never had an undo @@ -1176,11 +1180,12 @@ TXDB.prototype.erase = async function erase(wtx, block) { continue; } - coin = credit.coin; - path = await this.getPath(coin); + const coin = credit.coin; + const path = await this.getPath(coin); assert(path); details.setInput(i, path, coin); + accounts.add(path.account); // Recalculate the balance, remove // from stxo set, remove the undo @@ -1199,16 +1204,16 @@ TXDB.prototype.erase = async function erase(wtx, block) { // We need to remove all credits // this transaction created. for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let path = await this.getPath(output); - let credit; + const output = tx.outputs[i]; + const path = await this.getPath(output); if (!path) continue; details.setOutput(i, path); + accounts.add(path.account); - credit = Credit.fromTX(tx, i, height); + const credit = Credit.fromTX(tx, i, height); this.pending.coin--; this.pending.unconfirmed -= output.value; @@ -1225,7 +1230,7 @@ TXDB.prototype.erase = async function erase(wtx, block) { // Remove the transaction data // itself as well as unindex. this.del(layout.t(hash)); - this.del(layout.m(wtx.ps, hash)); + this.del(layout.m(wtx.mtime, hash)); if (!block) this.del(layout.p(hash)); @@ -1233,9 +1238,9 @@ TXDB.prototype.erase = async function erase(wtx, block) { this.del(layout.h(height, hash)); // Remove all secondary indexing. - for (let account of details.accounts) { + for (const account of accounts) { this.del(layout.T(account, hash)); - this.del(layout.M(account, wtx.ps, hash)); + this.del(layout.M(account, wtx.mtime, hash)); if (!block) this.del(layout.P(account, hash)); @@ -1270,19 +1275,17 @@ TXDB.prototype.erase = async function erase(wtx, block) { */ TXDB.prototype.removeRecursive = async function removeRecursive(wtx) { - let tx = wtx.tx; - let hash = wtx.hash; - let details; + const tx = wtx.tx; + const hash = wtx.hash; for (let i = 0; i < tx.outputs.length; i++) { - let spent = await this.getSpent(hash, i); - let stx; + const spent = await this.getSpent(hash, i); if (!spent) continue; // Remove all of the spender's spenders first. - stx = await this.getTX(spent.hash); + const stx = await this.getTX(spent.hash); assert(stx); @@ -1292,7 +1295,7 @@ TXDB.prototype.removeRecursive = async function removeRecursive(wtx) { this.start(); // Remove the spender. - details = await this.erase(wtx, wtx.getBlock()); + const details = await this.erase(wtx, wtx.getBlock()); assert(details); @@ -1308,10 +1311,9 @@ TXDB.prototype.removeRecursive = async function removeRecursive(wtx) { */ TXDB.prototype.unconfirm = async function unconfirm(hash) { - let details; - this.start(); + let details; try { details = await this._unconfirm(hash); } catch (e) { @@ -1331,14 +1333,14 @@ TXDB.prototype.unconfirm = async function unconfirm(hash) { * @returns {Promise} */ -TXDB.prototype._unconfirm = async function unconfirm(hash) { - let wtx = await this.getTX(hash); +TXDB.prototype._unconfirm = async function _unconfirm(hash) { + const wtx = await this.getTX(hash); if (!wtx) - return; + return null; if (wtx.height === -1) - return; + return null; return await this.disconnect(wtx, wtx.getBlock()); }; @@ -1350,10 +1352,11 @@ TXDB.prototype._unconfirm = async function unconfirm(hash) { */ TXDB.prototype.disconnect = async function disconnect(wtx, block) { - let tx = wtx.tx; - let hash = wtx.hash; - let height = block.height; - let details = new Details(this, wtx, block); + const tx = wtx.tx; + const hash = wtx.hash; + const height = block.height; + const details = new Details(this, wtx, block); + const accounts = new Set(); assert(block); @@ -1363,23 +1366,23 @@ TXDB.prototype.disconnect = async function disconnect(wtx, block) { // We need to reconnect the coins. Start // by getting all of the undo coins we know // about. - let credits = await this.getSpentCredits(tx); + const credits = await this.getSpentCredits(tx); for (let i = 0; i < tx.inputs.length; i++) { - let credit = credits[i]; - let path, coin; + const credit = credits[i]; if (!credit) continue; - coin = credit.coin; + const coin = credit.coin; assert(coin.height !== -1); - path = await this.getPath(coin); + const path = await this.getPath(coin); assert(path); details.setInput(i, path, coin); + accounts.add(path.account); this.pending.confirmed += coin.value; @@ -1393,14 +1396,13 @@ TXDB.prototype.disconnect = async function disconnect(wtx, block) { // We need to remove heights on // the credits and undo coins. for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let path = await this.getPath(output); - let credit, coin; + const output = tx.outputs[i]; + const path = await this.getPath(output); if (!path) continue; - credit = await this.getCredit(hash, i); + const credit = await this.getCredit(hash, i); // Potentially update undo coin height. if (!credit) { @@ -1412,10 +1414,11 @@ TXDB.prototype.disconnect = async function disconnect(wtx, block) { await this.updateSpentCoin(tx, i, height); details.setOutput(i, path); + accounts.add(path.account); // Update coin height and confirmed // balance. Save once again. - coin = credit.coin; + const coin = credit.coin; coin.height = -1; this.pending.confirmed -= output.value; @@ -1434,7 +1437,7 @@ TXDB.prototype.disconnect = async function disconnect(wtx, block) { this.del(layout.h(height, hash)); // Secondary indexing also needs to change. - for (let account of details.accounts) { + for (const account of accounts) { this.put(layout.P(account, hash), null); this.del(layout.H(account, height, hash)); } @@ -1462,14 +1465,13 @@ TXDB.prototype.disconnect = async function disconnect(wtx, block) { */ TXDB.prototype.removeConflict = async function removeConflict(wtx) { - let tx = wtx.tx; - let details; + const tx = wtx.tx; this.logger.warning('Handling conflicting tx: %s.', tx.txid()); this.drop(); - details = await this.removeRecursive(wtx); + const details = await this.removeRecursive(wtx); this.start(); @@ -1490,20 +1492,19 @@ TXDB.prototype.removeConflict = async function removeConflict(wtx) { */ TXDB.prototype.removeConflicts = async function removeConflicts(tx, conf) { - let hash = tx.hash('hex'); - let spends = []; + const hash = tx.hash('hex'); + const spends = []; if (tx.isCoinbase()) return true; // Gather all spent records first. for (let i = 0; i < tx.inputs.length; i++) { - let input = tx.inputs[i]; - let prevout = input.prevout; - let spent, spender, block; + const input = tx.inputs[i]; + const prevout = input.prevout; // Is it already spent? - spent = await this.getSpent(prevout.hash, prevout.index); + const spent = await this.getSpent(prevout.hash, prevout.index); if (!spent) continue; @@ -1512,9 +1513,10 @@ TXDB.prototype.removeConflicts = async function removeConflicts(tx, conf) { if (spent.hash === hash) continue; - spender = await this.getTX(spent.hash); + const spender = await this.getTX(spent.hash); assert(spender); - block = spender.getBlock(); + + const block = spender.getBlock(); if (conf && block) return false; @@ -1525,7 +1527,7 @@ TXDB.prototype.removeConflicts = async function removeConflicts(tx, conf) { // Once we know we're not going to // screw things up, remove the double // spenders. - for (let spender of spends) { + for (const spender of spends) { if (!spender) continue; @@ -1546,9 +1548,11 @@ TXDB.prototype.removeConflicts = async function removeConflicts(tx, conf) { */ TXDB.prototype.verifyInput = async function verifyInput(tx, index, coin) { - let flags = Script.flags.MANDATORY_VERIFY_FLAGS; + const flags = Script.flags.MANDATORY_VERIFY_FLAGS; + if (!this.options.verify) return true; + return await tx.verifyInputAsync(index, coin, flags); }; @@ -1561,7 +1565,7 @@ TXDB.prototype.lockTX = function lockTX(tx) { if (tx.isCoinbase()) return; - for (let input of tx.inputs) + for (const input of tx.inputs) this.lockCoin(input.prevout); }; @@ -1574,7 +1578,7 @@ TXDB.prototype.unlockTX = function unlockTX(tx) { if (tx.isCoinbase()) return; - for (let input of tx.inputs) + for (const input of tx.inputs) this.unlockCoin(input.prevout); }; @@ -1584,7 +1588,7 @@ TXDB.prototype.unlockTX = function unlockTX(tx) { */ TXDB.prototype.lockCoin = function lockCoin(coin) { - let key = coin.toKey(); + const key = coin.toKey(); this.locked.add(key); }; @@ -1594,7 +1598,7 @@ TXDB.prototype.lockCoin = function lockCoin(coin) { */ TXDB.prototype.unlockCoin = function unlockCoin(coin) { - let key = coin.toKey(); + const key = coin.toKey(); return this.locked.delete(key); }; @@ -1604,7 +1608,7 @@ TXDB.prototype.unlockCoin = function unlockCoin(coin) { */ TXDB.prototype.isLocked = function isLocked(coin) { - let key = coin.toKey(); + const key = coin.toKey(); return this.locked.has(key); }; @@ -1616,9 +1620,9 @@ TXDB.prototype.isLocked = function isLocked(coin) { */ TXDB.prototype.filterLocked = function filterLocked(coins) { - let out = []; + const out = []; - for (let coin of coins) { + for (const coin of coins) { if (!this.isLocked(coin)) out.push(coin); } @@ -1632,9 +1636,9 @@ TXDB.prototype.filterLocked = function filterLocked(coins) { */ TXDB.prototype.getLocked = function getLocked() { - let outpoints = []; + const outpoints = []; - for (let key of this.locked.keys()) + for (const key of this.locked.keys()) outpoints.push(Outpoint.fromKey(key)); return outpoints; @@ -1646,12 +1650,12 @@ TXDB.prototype.getLocked = function getLocked() { * @returns {Promise} - Returns {@link Hash}[]. */ -TXDB.prototype.getAccountHistoryHashes = function getHistoryHashes(account) { +TXDB.prototype.getAccountHistoryHashes = function getAccountHistoryHashes(account) { return this.keys({ gte: layout.T(account, encoding.NULL_HASH), lte: layout.T(account, encoding.HIGH_HASH), parse: (key) => { - let [, hash] = layout.Tt(key); + const [, hash] = layout.Tt(key); return hash; } }); @@ -1685,7 +1689,7 @@ TXDB.prototype.getAccountPendingHashes = function getAccountPendingHashes(accoun gte: layout.P(account, encoding.NULL_HASH), lte: layout.P(account, encoding.HIGH_HASH), parse: (key) => { - let [, hash] = layout.Pp(key); + const [, hash] = layout.Pp(key); return hash; } }); @@ -1719,7 +1723,7 @@ TXDB.prototype.getAccountOutpoints = function getAccountOutpoints(account) { gte: layout.C(account, encoding.NULL_HASH, 0), lte: layout.C(account, encoding.HIGH_HASH, 0xffffffff), parse: (key) => { - let [, hash, index] = layout.Cc(key); + const [, hash, index] = layout.Cc(key); return new Outpoint(hash, index); } }); @@ -1739,7 +1743,7 @@ TXDB.prototype.getOutpoints = function getOutpoints(account) { gte: layout.c(encoding.NULL_HASH, 0), lte: layout.c(encoding.HIGH_HASH, 0xffffffff), parse: (key) => { - let [hash, index] = layout.cc(key); + const [hash, index] = layout.cc(key); return new Outpoint(hash, index); } }); @@ -1757,8 +1761,8 @@ TXDB.prototype.getOutpoints = function getOutpoints(account) { */ TXDB.prototype.getAccountHeightRangeHashes = function getAccountHeightRangeHashes(account, options) { - let start = options.start || 0; - let end = options.end || 0xffffffff; + const start = options.start || 0; + const end = options.end || 0xffffffff; return this.keys({ gte: layout.H(account, start, encoding.NULL_HASH), @@ -1766,7 +1770,7 @@ TXDB.prototype.getAccountHeightRangeHashes = function getAccountHeightRangeHashe limit: options.limit, reverse: options.reverse, parse: (key) => { - let [,, hash] = layout.Hh(key); + const [,, hash] = layout.Hh(key); return hash; } }); @@ -1784,8 +1788,6 @@ TXDB.prototype.getAccountHeightRangeHashes = function getAccountHeightRangeHashe */ TXDB.prototype.getHeightRangeHashes = function getHeightRangeHashes(account, options) { - let start, end; - if (account && typeof account === 'object') { options = account; account = null; @@ -1794,8 +1796,8 @@ TXDB.prototype.getHeightRangeHashes = function getHeightRangeHashes(account, opt if (account != null) return this.getAccountHeightRangeHashes(account, options); - start = options.start || 0; - end = options.end || 0xffffffff; + const start = options.start || 0; + const end = options.end || 0xffffffff; return this.keys({ gte: layout.h(start, encoding.NULL_HASH), @@ -1803,7 +1805,7 @@ TXDB.prototype.getHeightRangeHashes = function getHeightRangeHashes(account, opt limit: options.limit, reverse: options.reverse, parse: (key) => { - let [, hash] = layout.hh(key); + const [, hash] = layout.hh(key); return hash; } }); @@ -1831,8 +1833,8 @@ TXDB.prototype.getHeightHashes = function getHeightHashes(height) { */ TXDB.prototype.getAccountRangeHashes = function getAccountRangeHashes(account, options) { - let start = options.start || 0; - let end = options.end || 0xffffffff; + const start = options.start || 0; + const end = options.end || 0xffffffff; return this.keys({ gte: layout.M(account, start, encoding.NULL_HASH), @@ -1840,7 +1842,7 @@ TXDB.prototype.getAccountRangeHashes = function getAccountRangeHashes(account, o limit: options.limit, reverse: options.reverse, parse: (key) => { - let [,, hash] = layout.Mm(key); + const [,, hash] = layout.Mm(key); return hash; } }); @@ -1858,8 +1860,6 @@ TXDB.prototype.getAccountRangeHashes = function getAccountRangeHashes(account, o */ TXDB.prototype.getRangeHashes = function getRangeHashes(account, options) { - let start, end; - if (account && typeof account === 'object') { options = account; account = null; @@ -1868,8 +1868,8 @@ TXDB.prototype.getRangeHashes = function getRangeHashes(account, options) { if (account != null) return this.getAccountRangeHashes(account, options); - start = options.start || 0; - end = options.end || 0xffffffff; + const start = options.start || 0; + const end = options.end || 0xffffffff; return this.keys({ gte: layout.m(start, encoding.NULL_HASH), @@ -1877,7 +1877,7 @@ TXDB.prototype.getRangeHashes = function getRangeHashes(account, options) { limit: options.limit, reverse: options.reverse, parse: (key) => { - let [, hash] = layout.mm(key); + const [, hash] = layout.mm(key); return hash; } }); @@ -1895,18 +1895,17 @@ TXDB.prototype.getRangeHashes = function getRangeHashes(account, options) { */ TXDB.prototype.getRange = async function getRange(account, options) { - let txs = []; - let hashes; + const txs = []; if (account && typeof account === 'object') { options = account; account = null; } - hashes = await this.getRangeHashes(account, options); + const hashes = await this.getRangeHashes(account, options); - for (let hash of hashes) { - let tx = await this.getTX(hash); + for (const hash of hashes) { + const tx = await this.getTX(hash); assert(tx); txs.push(tx); } @@ -1956,11 +1955,11 @@ TXDB.prototype.getHistory = function getHistory(account) { */ TXDB.prototype.getAccountHistory = async function getAccountHistory(account) { - let hashes = await this.getHistoryHashes(account); - let txs = []; + const hashes = await this.getHistoryHashes(account); + const txs = []; - for (let hash of hashes) { - let tx = await this.getTX(hash); + for (const hash of hashes) { + const tx = await this.getTX(hash); assert(tx); txs.push(tx); } @@ -1975,11 +1974,11 @@ TXDB.prototype.getAccountHistory = async function getAccountHistory(account) { */ TXDB.prototype.getPending = async function getPending(account) { - let hashes = await this.getPendingHashes(account); - let txs = []; + const hashes = await this.getPendingHashes(account); + const txs = []; - for (let hash of hashes) { - let tx = await this.getTX(hash); + for (const hash of hashes) { + const tx = await this.getTX(hash); assert(tx); txs.push(tx); } @@ -2003,9 +2002,9 @@ TXDB.prototype.getCredits = function getCredits(account) { gte: layout.c(encoding.NULL_HASH, 0x00000000), lte: layout.c(encoding.HIGH_HASH, 0xffffffff), parse: (key, value) => { - let [hash, index] = layout.cc(key); - let credit = Credit.fromRaw(value); - let ckey = Outpoint.toKey(hash, index); + const [hash, index] = layout.cc(key); + const credit = Credit.fromRaw(value); + const ckey = Outpoint.toKey(hash, index); credit.coin.hash = hash; credit.coin.index = index; this.coinCache.set(ckey, value); @@ -2021,11 +2020,11 @@ TXDB.prototype.getCredits = function getCredits(account) { */ TXDB.prototype.getAccountCredits = async function getAccountCredits(account) { - let outpoints = await this.getOutpoints(account); - let credits = []; + const outpoints = await this.getOutpoints(account); + const credits = []; - for (let prevout of outpoints) { - let credit = await this.getCredit(prevout.hash, prevout.index); + for (const prevout of outpoints) { + const credit = await this.getCredit(prevout.hash, prevout.index); assert(credit); credits.push(credit); } @@ -2040,24 +2039,22 @@ TXDB.prototype.getAccountCredits = async function getAccountCredits(account) { */ TXDB.prototype.getSpentCredits = async function getSpentCredits(tx) { - let credits = []; - let hash; + if (tx.isCoinbase()) + return []; + + const hash = tx.hash('hex'); + const credits = []; for (let i = 0; i < tx.inputs.length; i++) credits.push(null); - if (tx.isCoinbase()) - return credits; - - hash = tx.hash('hex'); - await this.range({ gte: layout.d(hash, 0x00000000), lte: layout.d(hash, 0xffffffff), parse: (key, value) => { - let [, index] = layout.dd(key); - let coin = Coin.fromRaw(value); - let input = tx.inputs[index]; + const [, index] = layout.dd(key); + const coin = Coin.fromRaw(value); + const input = tx.inputs[index]; assert(input); coin.hash = input.prevout.hash; coin.index = input.prevout.index; @@ -2075,10 +2072,10 @@ TXDB.prototype.getSpentCredits = async function getSpentCredits(tx) { */ TXDB.prototype.getCoins = async function getCoins(account) { - let credits = await this.getCredits(account); - let coins = []; + const credits = await this.getCredits(account); + const coins = []; - for (let credit of credits) { + for (const credit of credits) { if (credit.spent) continue; @@ -2095,10 +2092,10 @@ TXDB.prototype.getCoins = async function getCoins(account) { */ TXDB.prototype.getAccountCoins = async function getAccountCoins(account) { - let credits = await this.getAccountCredits(account); - let coins = []; + const credits = await this.getAccountCredits(account); + const coins = []; - for (let credit of credits) { + for (const credit of credits) { if (credit.spent) continue; @@ -2115,15 +2112,13 @@ TXDB.prototype.getAccountCoins = async function getAccountCoins(account) { */ TXDB.prototype.getSpentCoins = async function getSpentCoins(tx) { - let coins = []; - let credits; - if (tx.isCoinbase()) - return coins; + return []; - credits = await this.getSpentCredits(tx); + const credits = await this.getSpentCredits(tx); + const coins = []; - for (let credit of credits) { + for (const credit of credits) { if (!credit) { coins.push(null); continue; @@ -2142,14 +2137,14 @@ TXDB.prototype.getSpentCoins = async function getSpentCoins(tx) { */ TXDB.prototype.getCoinView = async function getCoinView(tx) { - let view = new CoinView(); + const view = new CoinView(); if (tx.isCoinbase()) return view; - for (let input of tx.inputs) { - let prevout = input.prevout; - let coin = await this.getCoin(prevout.hash, prevout.index); + for (const input of tx.inputs) { + const prevout = input.prevout; + const coin = await this.getCoin(prevout.hash, prevout.index); if (!coin) continue; @@ -2167,15 +2162,14 @@ TXDB.prototype.getCoinView = async function getCoinView(tx) { */ TXDB.prototype.getSpentView = async function getSpentView(tx) { - let view = new CoinView(); - let coins; + const view = new CoinView(); if (tx.isCoinbase()) return view; - coins = await this.getSpentCoins(tx); + const coins = await this.getSpentCoins(tx); - for (let coin of coins) { + for (const coin of coins) { if (!coin) continue; @@ -2191,10 +2185,10 @@ TXDB.prototype.getSpentView = async function getSpentView(tx) { */ TXDB.prototype.getState = async function getState() { - let data = await this.get(layout.R); + const data = await this.get(layout.R); if (!data) - return; + return null; return TXDBState.fromRaw(this.wallet.wid, this.wallet.id, data); }; @@ -2206,10 +2200,10 @@ TXDB.prototype.getState = async function getState() { */ TXDB.prototype.getTX = async function getTX(hash) { - let raw = await this.get(layout.t(hash)); + const raw = await this.get(layout.t(hash)); if (!raw) - return; + return null; return TXRecord.fromRaw(raw); }; @@ -2221,10 +2215,10 @@ TXDB.prototype.getTX = async function getTX(hash) { */ TXDB.prototype.getDetails = async function getDetails(hash) { - let wtx = await this.getTX(hash); + const wtx = await this.getTX(hash); if (!wtx) - return; + return null; return await this.toDetails(wtx); }; @@ -2236,13 +2230,13 @@ TXDB.prototype.getDetails = async function getDetails(hash) { */ TXDB.prototype.toDetails = async function toDetails(wtxs) { - let out = []; + const out = []; if (!Array.isArray(wtxs)) return await this._toDetails(wtxs); - for (let wtx of wtxs) { - let details = await this._toDetails(wtx); + for (const wtx of wtxs) { + const details = await this._toDetails(wtx); if (!details) continue; @@ -2261,13 +2255,13 @@ TXDB.prototype.toDetails = async function toDetails(wtxs) { */ TXDB.prototype._toDetails = async function _toDetails(wtx) { - let tx = wtx.tx; - let block = wtx.getBlock(); - let details = new Details(this, wtx, block); - let coins = await this.getSpentCoins(tx); + const tx = wtx.tx; + const block = wtx.getBlock(); + const details = new Details(this, wtx, block); + const coins = await this.getSpentCoins(tx); for (let i = 0; i < tx.inputs.length; i++) { - let coin = coins[i]; + const coin = coins[i]; let path = null; if (coin) @@ -2277,8 +2271,8 @@ TXDB.prototype._toDetails = async function _toDetails(wtx) { } for (let i = 0; i < tx.outputs.length; i++) { - let output = tx.outputs[i]; - let path = await this.getPath(output); + const output = tx.outputs[i]; + const path = await this.getPath(output); details.setOutput(i, path); } @@ -2303,10 +2297,10 @@ TXDB.prototype.hasTX = function hasTX(hash) { */ TXDB.prototype.getCoin = async function getCoin(hash, index) { - let credit = await this.getCredit(hash, index); + const credit = await this.getCredit(hash, index); if (!credit) - return; + return null; return credit.coin; }; @@ -2319,24 +2313,23 @@ TXDB.prototype.getCoin = async function getCoin(hash, index) { */ TXDB.prototype.getCredit = async function getCredit(hash, index) { - let state = this.state; - let key = Outpoint.toKey(hash, index); - let data = this.coinCache.get(key); - let credit; + const state = this.state; + const key = Outpoint.toKey(hash, index); + const cache = this.coinCache.get(key); - if (data) { - credit = Credit.fromRaw(data); + if (cache) { + const credit = Credit.fromRaw(cache); credit.coin.hash = hash; credit.coin.index = index; return credit; } - data = await this.get(layout.c(hash, index)); + const data = await this.get(layout.c(hash, index)); if (!data) - return; + return null; - credit = Credit.fromRaw(data); + const credit = Credit.fromRaw(data); credit.coin.hash = hash; credit.coin.index = index; @@ -2354,13 +2347,12 @@ TXDB.prototype.getCredit = async function getCredit(hash, index) { */ TXDB.prototype.getSpentCoin = async function getSpentCoin(spent, prevout) { - let data = await this.get(layout.d(spent.hash, spent.index)); - let coin; + const data = await this.get(layout.d(spent.hash, spent.index)); if (!data) - return; + return null; - coin = Coin.fromRaw(data); + const coin = Coin.fromRaw(data); coin.hash = prevout.hash; coin.index = prevout.index; @@ -2386,14 +2378,13 @@ TXDB.prototype.hasSpentCoin = function hasSpentCoin(spent) { */ TXDB.prototype.updateSpentCoin = async function updateSpentCoin(tx, index, height) { - let prevout = Outpoint.fromTX(tx, index); - let spent = await this.getSpent(prevout.hash, prevout.index); - let coin; + const prevout = Outpoint.fromTX(tx, index); + const spent = await this.getSpent(prevout.hash, prevout.index); if (!spent) return; - coin = await this.getSpentCoin(spent, prevout); + const coin = await this.getSpentCoin(spent, prevout); if (!coin) return; @@ -2409,13 +2400,13 @@ TXDB.prototype.updateSpentCoin = async function updateSpentCoin(tx, index, heigh * @returns {Promise} - Returns Boolean. */ -TXDB.prototype.hasCoin = function hasCoin(hash, index) { - let key = Outpoint.toKey(hash, index); +TXDB.prototype.hasCoin = async function hasCoin(hash, index) { + const key = Outpoint.toKey(hash, index); if (this.coinCache.has(key)) - return Promise.resolve(true); + return true; - return this.has(layout.c(hash, index)); + return await this.has(layout.c(hash, index)); }; /** @@ -2440,11 +2431,11 @@ TXDB.prototype.getBalance = async function getBalance(account) { */ TXDB.prototype.getWalletBalance = async function getWalletBalance() { - let credits = await this.getCredits(); - let balance = new Balance(this.wallet.wid, this.wallet.id, -1); + const credits = await this.getCredits(); + const balance = new Balance(this.wallet.wid, this.wallet.id, -1); - for (let credit of credits) { - let coin = credit.coin; + for (const credit of credits) { + const coin = credit.coin; if (coin.height !== -1) balance.confirmed += coin.value; @@ -2463,11 +2454,11 @@ TXDB.prototype.getWalletBalance = async function getWalletBalance() { */ TXDB.prototype.getAccountBalance = async function getAccountBalance(account) { - let credits = await this.getAccountCredits(account); - let balance = new Balance(this.wallet.wid, this.wallet.id, account); + const credits = await this.getAccountCredits(account); + const balance = new Balance(this.wallet.wid, this.wallet.id, account); - for (let credit of credits) { - let coin = credit.coin; + for (const credit of credits) { + const coin = credit.coin; if (coin.height !== -1) balance.confirmed += coin.value; @@ -2487,22 +2478,22 @@ TXDB.prototype.getAccountBalance = async function getAccountBalance(account) { */ TXDB.prototype.zap = async function zap(account, age) { - let hashes = []; - let now = util.now(); - let txs; + assert(util.isU32(age)); - assert(util.isUInt32(age)); + const now = util.now(); - txs = await this.getRange(account, { + const txs = await this.getRange(account, { start: 0, end: now - age }); - for (let wtx of txs) { + const hashes = []; + + for (const wtx of txs) { if (wtx.height !== -1) continue; - assert(now - wtx.ps >= age); + assert(now - wtx.mtime >= age); this.logger.debug('Zapping TX: %s (%s)', wtx.tx.txid(), this.wallet.id); @@ -2522,7 +2513,7 @@ TXDB.prototype.zap = async function zap(account, age) { */ TXDB.prototype.abandon = async function abandon(hash) { - let result = await this.has(layout.p(hash)); + const result = await this.has(layout.p(hash)); if (!result) throw new Error('TX not eligible.'); @@ -2623,7 +2614,7 @@ function TXDBState(wid, id) { */ TXDBState.prototype.clone = function clone() { - let state = new TXDBState(this.wid, this.id); + const state = new TXDBState(this.wid, this.id); state.tx = this.tx; state.coin = this.coin; state.unconfirmed = this.unconfirmed; @@ -2647,7 +2638,7 @@ TXDBState.prototype.commit = function commit() { */ TXDBState.prototype.toBalance = function toBalance() { - let balance = new Balance(this.wid, this.id, -1); + const balance = new Balance(this.wid, this.id, -1); balance.unconfirmed = this.unconfirmed; balance.confirmed = this.confirmed; return balance; @@ -2659,7 +2650,7 @@ TXDBState.prototype.toBalance = function toBalance() { */ TXDBState.prototype.toRaw = function toRaw() { - let bw = new StaticWriter(32); + const bw = new StaticWriter(32); bw.writeU64(this.tx); bw.writeU64(this.coin); @@ -2677,7 +2668,7 @@ TXDBState.prototype.toRaw = function toRaw() { */ TXDBState.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.tx = br.readU53(); this.coin = br.readU53(); this.unconfirmed = br.readU53(); @@ -2747,7 +2738,7 @@ function Credit(coin, spent) { */ Credit.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); + const br = new BufferReader(data); this.coin.fromReader(br); this.spent = br.readU8() === 1; this.own = true; @@ -2784,8 +2775,8 @@ Credit.prototype.getSize = function getSize() { */ Credit.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); this.coin.toWriter(bw); bw.writeU8(this.spent ? 1 : 0); bw.writeU8(this.own ? 1 : 0); @@ -2839,24 +2830,22 @@ function Details(txdb, wtx, block) { this.hash = wtx.hash; this.tx = wtx.tx; - this.ps = wtx.ps; + this.mtime = wtx.mtime; this.size = this.tx.getSize(); this.vsize = this.tx.getVirtualSize(); this.block = null; this.height = -1; - this.ts = 0; - this.index = -1; + this.time = 0; if (block) { this.block = block.hash; this.height = block.height; - this.ts = block.ts; + this.time = block.time; } this.inputs = []; this.outputs = []; - this.accounts = []; this.init(); } @@ -2867,14 +2856,14 @@ function Details(txdb, wtx, block) { */ Details.prototype.init = function init() { - for (let input of this.tx.inputs) { - let member = new DetailsMember(); + for (const input of this.tx.inputs) { + const member = new DetailsMember(); member.address = input.getAddress(); this.inputs.push(member); } - for (let output of this.tx.outputs) { - let member = new DetailsMember(); + for (const output of this.tx.outputs) { + const member = new DetailsMember(); member.value = output.value; member.address = output.getAddress(); this.outputs.push(member); @@ -2889,17 +2878,15 @@ Details.prototype.init = function init() { */ Details.prototype.setInput = function setInput(i, path, coin) { - let member = this.inputs[i]; + const member = this.inputs[i]; if (coin) { member.value = coin.value; member.address = coin.getAddress(); } - if (path) { + if (path) member.path = path; - util.binaryInsert(this.accounts, path.account, cmp, true); - } }; /** @@ -2909,12 +2896,10 @@ Details.prototype.setInput = function setInput(i, path, coin) { */ Details.prototype.setOutput = function setOutput(i, path) { - let member = this.outputs[i]; + const member = this.outputs[i]; - if (path) { + if (path) member.path = path; - util.binaryInsert(this.accounts, path.account, cmp, true); - } }; /** @@ -2923,12 +2908,10 @@ Details.prototype.setOutput = function setOutput(i, path) { */ Details.prototype.getDepth = function getDepth() { - let depth; - if (this.height === -1) return 0; - depth = this.chainHeight - this.height; + const depth = this.chainHeight - this.height; if (depth < 0) return 0; @@ -2946,14 +2929,14 @@ Details.prototype.getFee = function getFee() { let inputValue = 0; let outputValue = 0; - for (let input of this.inputs) { + for (const input of this.inputs) { if (!input.path) return 0; inputValue += input.value; } - for (let output of this.outputs) + for (const output of this.outputs) outputValue += output.value; return inputValue - outputValue; @@ -2976,11 +2959,11 @@ Details.prototype.getRate = function getRate(fee) { */ Details.prototype.toJSON = function toJSON() { - let fee = this.getFee(); + const fee = this.getFee(); let rate = this.getRate(fee); // Rate can exceed 53 bits in testing. - if (!util.isSafeInteger(rate)) + if (!Number.isSafeInteger(rate)) rate = 0; return { @@ -2989,10 +2972,9 @@ Details.prototype.toJSON = function toJSON() { hash: util.revHex(this.hash), height: this.height, block: this.block ? util.revHex(this.block) : null, - ts: this.ts, - ps: this.ps, - date: util.date(this.ts || this.ps), - index: this.index, + time: this.time, + mtime: this.mtime, + date: util.date(this.time || this.mtime), size: this.size, virtualSize: this.vsize, fee: fee, @@ -3059,18 +3041,18 @@ DetailsMember.prototype.getJSON = function getJSON(network) { * @constructor * @param {Hash} hash * @param {Number} height - * @param {Number} ts + * @param {Number} time */ -function BlockRecord(hash, height, ts) { +function BlockRecord(hash, height, time) { if (!(this instanceof BlockRecord)) - return new BlockRecord(hash, height, ts); + return new BlockRecord(hash, height, time); this.hash = hash || encoding.NULL_HASH; this.height = height != null ? height : -1; - this.ts = ts || 0; + this.time = time || 0; this.hashes = []; - this.index = {}; + this.index = new Set(); } /** @@ -3080,10 +3062,10 @@ function BlockRecord(hash, height, ts) { */ BlockRecord.prototype.add = function add(hash) { - if (this.index[hash]) + if (this.index.has(hash)) return false; - this.index[hash] = true; + this.index.add(hash); this.hashes.push(hash); return true; @@ -3096,12 +3078,10 @@ BlockRecord.prototype.add = function add(hash) { */ BlockRecord.prototype.remove = function remove(hash) { - let index; - - if (!this.index[hash]) + if (!this.index.has(hash)) return false; - delete this.index[hash]; + this.index.delete(hash); // Fast case if (this.hashes[this.hashes.length - 1] === hash) { @@ -3109,7 +3089,7 @@ BlockRecord.prototype.remove = function remove(hash) { return true; } - index = this.hashes.indexOf(hash); + const index = this.hashes.indexOf(hash); assert(index !== -1); @@ -3125,18 +3105,17 @@ BlockRecord.prototype.remove = function remove(hash) { */ BlockRecord.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let count; + const br = new BufferReader(data); this.hash = br.readHash('hex'); this.height = br.readU32(); - this.ts = br.readU32(); + this.time = br.readU32(); - count = br.readU32(); + const count = br.readU32(); for (let i = 0; i < count; i++) { - let hash = br.readHash('hex'); - this.index[hash] = true; + const hash = br.readHash('hex'); + this.index.add(hash); this.hashes.push(hash); } @@ -3168,16 +3147,16 @@ BlockRecord.prototype.getSize = function getSize() { */ BlockRecord.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); bw.writeHash(this.hash); bw.writeU32(this.height); - bw.writeU32(this.ts); + bw.writeU32(this.time); bw.writeU32(this.hashes.length); - for (let hash of this.hashes) + for (const hash of this.hashes) bw.writeHash(hash); return bw.render(); @@ -3192,7 +3171,7 @@ BlockRecord.prototype.toJSON = function toJSON() { return { hash: util.revHex(this.hash), height: this.height, - ts: this.ts, + time: this.time, hashes: this.hashes.map(util.revHex) }; }; @@ -3206,7 +3185,7 @@ BlockRecord.prototype.toJSON = function toJSON() { BlockRecord.prototype.fromMeta = function fromMeta(block) { this.hash = block.hash; this.height = block.height; - this.ts = block.ts; + this.time = block.time; return this; }; @@ -3220,14 +3199,6 @@ BlockRecord.fromMeta = function fromMeta(block) { return new BlockRecord().fromMeta(block); }; -/* - * Helpers - */ - -function cmp(a, b) { - return a - b; -} - /* * Expose */ diff --git a/lib/wallet/wallet.js b/lib/wallet/wallet.js index 6282d2d7f..9f39edd33 100644 --- a/lib/wallet/wallet.js +++ b/lib/wallet/wallet.js @@ -57,6 +57,8 @@ const Mnemonic = HD.Mnemonic; * @param {Number?} options.m - `m` value for multisig. * @param {Number?} options.n - `n` value for multisig. * @param {String?} options.id - Wallet ID (used for storage) + * @param {String?} options.mnemonic - mnemonic phrase to use to instantiate an + * hd private key for wallet * (default=account key "address"). */ @@ -95,7 +97,7 @@ function Wallet(db, options) { this.fromOptions(options); } -util.inherits(Wallet, EventEmitter); +Object.setPrototypeOf(Wallet.prototype, EventEmitter.prototype); /** * Inject properties from options object. @@ -124,7 +126,7 @@ Wallet.prototype.fromOptions = function fromOptions(options) { this.master.fromKey(key, mnemonic); if (options.wid != null) { - assert(util.isNumber(options.wid)); + assert(util.isU32(options.wid)); this.wid = options.wid; } @@ -144,7 +146,7 @@ Wallet.prototype.fromOptions = function fromOptions(options) { } if (options.accountDepth != null) { - assert(util.isNumber(options.accountDepth)); + assert(util.isU32(options.accountDepth)); this.accountDepth = options.accountDepth; } @@ -155,7 +157,7 @@ Wallet.prototype.fromOptions = function fromOptions(options) { } if (options.tokenDepth != null) { - assert(util.isNumber(options.tokenDepth)); + assert(util.isU32(options.tokenDepth)); this.tokenDepth = options.tokenDepth; } @@ -191,8 +193,7 @@ Wallet.fromOptions = function fromOptions(db, options) { */ Wallet.prototype.init = async function init(options) { - let passphrase = options.passphrase; - let account; + const passphrase = options.passphrase; assert(!this.initialized); this.initialized = true; @@ -200,7 +201,7 @@ Wallet.prototype.init = async function init(options) { if (passphrase) await this.master.encrypt(passphrase); - account = await this._createAccount(options, passphrase); + const account = await this._createAccount(options, passphrase); assert(account); this.account = account; @@ -216,11 +217,9 @@ Wallet.prototype.init = async function init(options) { */ Wallet.prototype.open = async function open() { - let account; - assert(this.initialized); - account = await this.getAccount(0); + const account = await this.getAccount(0); if (!account) throw new Error('Default account not found.'); @@ -238,8 +237,8 @@ Wallet.prototype.open = async function open() { */ Wallet.prototype.destroy = async function destroy() { - let unlock1 = await this.writeLock.lock(); - let unlock2 = await this.fundLock.lock(); + const unlock1 = await this.writeLock.lock(); + const unlock2 = await this.fundLock.lock(); try { this.db.unregister(this); await this.master.destroy(); @@ -261,7 +260,7 @@ Wallet.prototype.destroy = async function destroy() { */ Wallet.prototype.addSharedKey = async function addSharedKey(acct, key) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._addSharedKey(acct, key); } finally { @@ -277,9 +276,7 @@ Wallet.prototype.addSharedKey = async function addSharedKey(acct, key) { * @returns {Promise} */ -Wallet.prototype._addSharedKey = async function addSharedKey(acct, key) { - let account, result; - +Wallet.prototype._addSharedKey = async function _addSharedKey(acct, key) { if (!key) { key = acct; acct = null; @@ -288,13 +285,14 @@ Wallet.prototype._addSharedKey = async function addSharedKey(acct, key) { if (acct == null) acct = 0; - account = await this.getAccount(acct); + const account = await this.getAccount(acct); if (!account) throw new Error('Account not found.'); this.start(); + let result; try { result = await account.addSharedKey(key); } catch (e) { @@ -315,7 +313,7 @@ Wallet.prototype._addSharedKey = async function addSharedKey(acct, key) { */ Wallet.prototype.removeSharedKey = async function removeSharedKey(acct, key) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._removeSharedKey(acct, key); } finally { @@ -331,9 +329,7 @@ Wallet.prototype.removeSharedKey = async function removeSharedKey(acct, key) { * @returns {Promise} */ -Wallet.prototype._removeSharedKey = async function removeSharedKey(acct, key) { - let account, result; - +Wallet.prototype._removeSharedKey = async function _removeSharedKey(acct, key) { if (!key) { key = acct; acct = null; @@ -342,13 +338,14 @@ Wallet.prototype._removeSharedKey = async function removeSharedKey(acct, key) { if (acct == null) acct = 0; - account = await this.getAccount(acct); + const account = await this.getAccount(acct); if (!account) throw new Error('Account not found.'); this.start(); + let result; try { result = await account.removeSharedKey(key); } catch (e) { @@ -388,7 +385,7 @@ Wallet.prototype.setPassphrase = async function setPassphrase(old, new_) { */ Wallet.prototype.encrypt = async function encrypt(passphrase) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._encrypt(passphrase); } finally { @@ -403,8 +400,8 @@ Wallet.prototype.encrypt = async function encrypt(passphrase) { * @returns {Promise} */ -Wallet.prototype._encrypt = async function encrypt(passphrase) { - let key = await this.master.encrypt(passphrase, true); +Wallet.prototype._encrypt = async function _encrypt(passphrase) { + const key = await this.master.encrypt(passphrase, true); this.start(); @@ -430,7 +427,7 @@ Wallet.prototype._encrypt = async function encrypt(passphrase) { */ Wallet.prototype.decrypt = async function decrypt(passphrase) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._decrypt(passphrase); } finally { @@ -445,8 +442,8 @@ Wallet.prototype.decrypt = async function decrypt(passphrase) { * @returns {Promise} */ -Wallet.prototype._decrypt = async function decrypt(passphrase) { - let key = await this.master.decrypt(passphrase, true); +Wallet.prototype._decrypt = async function _decrypt(passphrase) { + const key = await this.master.decrypt(passphrase, true); this.start(); @@ -472,7 +469,7 @@ Wallet.prototype._decrypt = async function decrypt(passphrase) { */ Wallet.prototype.retoken = async function retoken(passphrase) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._retoken(passphrase); } finally { @@ -487,7 +484,7 @@ Wallet.prototype.retoken = async function retoken(passphrase) { * @returns {Promise} */ -Wallet.prototype._retoken = async function retoken(passphrase) { +Wallet.prototype._retoken = async function _retoken(passphrase) { await this.unlock(passphrase); this.tokenDepth++; @@ -508,7 +505,7 @@ Wallet.prototype._retoken = async function retoken(passphrase) { */ Wallet.prototype.rename = async function rename(id) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this.db.rename(this, id); } finally { @@ -524,7 +521,7 @@ Wallet.prototype.rename = async function rename(id) { */ Wallet.prototype.renameAccount = async function renameAccount(acct, name) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._renameAccount(acct, name); } finally { @@ -541,12 +538,10 @@ Wallet.prototype.renameAccount = async function renameAccount(acct, name) { */ Wallet.prototype._renameAccount = async function _renameAccount(acct, name) { - let account, old, paths; - if (!common.isName(name)) throw new Error('Bad account name.'); - account = await this.getAccount(acct); + const account = await this.getAccount(acct); if (!account) throw new Error('Account not found.'); @@ -557,7 +552,7 @@ Wallet.prototype._renameAccount = async function _renameAccount(acct, name) { if (await this.hasAccount(name)) throw new Error('Account name not available.'); - old = account.name; + const old = account.name; this.start(); @@ -567,9 +562,9 @@ Wallet.prototype._renameAccount = async function _renameAccount(acct, name) { this.indexCache.remove(old); - paths = this.pathCache.values(); + const paths = this.pathCache.values(); - for (let path of paths) { + for (const path of paths) { if (path.account !== account.accountIndex) continue; @@ -582,8 +577,8 @@ Wallet.prototype._renameAccount = async function _renameAccount(acct, name) { */ Wallet.prototype.lock = async function lock() { - let unlock1 = await this.writeLock.lock(); - let unlock2 = await this.fundLock.lock(); + const unlock1 = await this.writeLock.lock(); + const unlock2 = await this.fundLock.lock(); try { await this.master.lock(); } finally { @@ -612,26 +607,24 @@ Wallet.prototype.unlock = function unlock(passphrase, timeout) { */ Wallet.prototype.getID = function getID() { - let bw, key, hash; - assert(this.master.key, 'Cannot derive id.'); - key = this.master.key.derive(44); + const key = this.master.key.derive(44); - bw = new StaticWriter(37); + const bw = new StaticWriter(37); bw.writeBytes(key.publicKey); bw.writeU32(this.network.magic); - hash = digest.hash160(bw.render()); + const hash = digest.hash160(bw.render()); - bw = new StaticWriter(27); - bw.writeU8(0x03); - bw.writeU8(0xbe); - bw.writeU8(0x04); - bw.writeBytes(hash); - bw.writeChecksum(); + const b58 = new StaticWriter(27); + b58.writeU8(0x03); + b58.writeU8(0xbe); + b58.writeU8(0x04); + b58.writeBytes(hash); + b58.writeChecksum(); - return base58.encode(bw.render()); + return base58.encode(b58.render()); }; /** @@ -644,13 +637,11 @@ Wallet.prototype.getID = function getID() { */ Wallet.prototype.getToken = function getToken(nonce) { - let bw, key; - assert(this.master.key, 'Cannot derive token.'); - key = this.master.key.derive(44, true); + const key = this.master.key.derive(44, true); - bw = new StaticWriter(36); + const bw = new StaticWriter(36); bw.writeBytes(key.privateKey); bw.writeU32(nonce); @@ -664,7 +655,7 @@ Wallet.prototype.getToken = function getToken(nonce) { */ Wallet.prototype.createAccount = async function createAccount(options, passphrase) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._createAccount(options, passphrase); } finally { @@ -678,20 +669,18 @@ Wallet.prototype.createAccount = async function createAccount(options, passphras * @returns {Promise} - Returns {@link Account}. */ -Wallet.prototype._createAccount = async function createAccount(options, passphrase) { +Wallet.prototype._createAccount = async function _createAccount(options, passphrase) { let name = options.name; - let key, account, exists; if (!name) - name = this.accountDepth + ''; + name = this.accountDepth.toString(10); - exists = await this.hasAccount(name); - - if (exists) + if (await this.hasAccount(name)) throw new Error('Account already exists.'); await this.unlock(passphrase); + let key; if (this.watchOnly && options.accountKey) { key = options.accountKey; @@ -705,11 +694,11 @@ Wallet.prototype._createAccount = async function createAccount(options, passphra 'Network mismatch for watch only key.'); } else { assert(this.master.key); - key = this.master.key.deriveBIP44(this.accountDepth); + key = this.master.key.deriveAccount(44, this.accountDepth); key = key.toPublic(); } - options = { + const opt = { wid: this.wid, id: this.id, name: this.accountDepth === 0 ? 'default' : name, @@ -725,8 +714,9 @@ Wallet.prototype._createAccount = async function createAccount(options, passphra this.start(); + let account; try { - account = Account.fromOptions(this.db, options); + account = Account.fromOptions(this.db, opt); account.wallet = this; await account.init(); } catch (e) { @@ -754,8 +744,8 @@ Wallet.prototype._createAccount = async function createAccount(options, passphra */ Wallet.prototype.ensureAccount = async function ensureAccount(options, passphrase) { - let name = options.name; - let account = await this.getAccount(name); + const name = options.name; + const account = await this.getAccount(name); if (account) return account; @@ -791,7 +781,7 @@ Wallet.prototype.getAddressHashes = function getAddressHashes(acct) { */ Wallet.prototype.getAccountHashes = async function getAccountHashes(acct) { - let index = await this.ensureIndex(acct, true); + const index = await this.ensureIndex(acct, true); return await this.db.getAccountHashes(this.wid, index); }; @@ -802,19 +792,17 @@ Wallet.prototype.getAccountHashes = async function getAccountHashes(acct) { */ Wallet.prototype.getAccount = async function getAccount(acct) { - let index, unlock; - if (this.account) { if (acct === 0 || acct === 'default') return this.account; } - index = await this.getAccountIndex(acct); + const index = await this.getAccountIndex(acct); if (index === -1) - return; + return null; - unlock = await this.readLock.lock(index); + const unlock = await this.readLock.lock(index); try { return await this._getAccount(index); @@ -829,16 +817,16 @@ Wallet.prototype.getAccount = async function getAccount(acct) { * @returns {Promise} - Returns {@link Account}. */ -Wallet.prototype._getAccount = async function getAccount(index) { - let account = this.accountCache.get(index); +Wallet.prototype._getAccount = async function _getAccount(index) { + const cache = this.accountCache.get(index); - if (account) - return account; + if (cache) + return cache; - account = await this.db.getAccount(this.wid, index); + const account = await this.db.getAccount(this.wid, index); if (!account) - return; + return null; account.wallet = this; account.wid = this.wid; @@ -860,20 +848,18 @@ Wallet.prototype._getAccount = async function getAccount(index) { */ Wallet.prototype.getAccountIndex = async function getAccountIndex(name) { - let index; - if (name == null) return -1; if (typeof name === 'number') return name; - index = this.indexCache.get(name); + const cache = this.indexCache.get(name); - if (index != null) - return index; + if (cache != null) + return cache; - index = await this.db.getAccountIndex(this.wid, name); + const index = await this.db.getAccountIndex(this.wid, name); if (index === -1) return -1; @@ -891,12 +877,10 @@ Wallet.prototype.getAccountIndex = async function getAccountIndex(name) { */ Wallet.prototype.getAccountName = async function getAccountName(index) { - let account; - if (typeof index === 'string') return index; - account = this.accountCache.get(index); + const account = this.accountCache.get(index); if (account) return account.name; @@ -911,7 +895,7 @@ Wallet.prototype.getAccountName = async function getAccountName(index) { */ Wallet.prototype.hasAccount = async function hasAccount(acct) { - let index = await this.getAccountIndex(acct); + const index = await this.getAccountIndex(acct); if (index === -1) return false; @@ -960,7 +944,7 @@ Wallet.prototype.createNested = function createNested(acct) { */ Wallet.prototype.createKey = async function createKey(acct, branch) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._createKey(acct, branch); } finally { @@ -976,9 +960,7 @@ Wallet.prototype.createKey = async function createKey(acct, branch) { * @returns {Promise} - Returns {@link WalletKey}. */ -Wallet.prototype._createKey = async function createKey(acct, branch) { - let account, result; - +Wallet.prototype._createKey = async function _createKey(acct, branch) { if (branch == null) { branch = acct; acct = null; @@ -987,13 +969,14 @@ Wallet.prototype._createKey = async function createKey(acct, branch) { if (acct == null) acct = 0; - account = await this.getAccount(acct); + const account = await this.getAccount(acct); if (!account) throw new Error('Account not found.'); this.start(); + let result; try { result = await account.createKey(branch); } catch (e) { @@ -1059,8 +1042,8 @@ Wallet.prototype.commit = function commit() { */ Wallet.prototype.hasAddress = async function hasAddress(address) { - let hash = Address.getHash(address, 'hex'); - let path = await this.getPath(hash); + const hash = Address.getHash(address, 'hex'); + const path = await this.getPath(hash); return path != null; }; @@ -1071,10 +1054,10 @@ Wallet.prototype.hasAddress = async function hasAddress(address) { */ Wallet.prototype.getPath = async function getPath(address) { - let path = await this.readPath(address); + const path = await this.readPath(address); if (!path) - return; + return null; path.name = await this.getAccountName(path.account); @@ -1093,16 +1076,16 @@ Wallet.prototype.getPath = async function getPath(address) { */ Wallet.prototype.readPath = async function readPath(address) { - let hash = Address.getHash(address, 'hex'); - let path = this.pathCache.get(hash); + const hash = Address.getHash(address, 'hex'); + const cache = this.pathCache.get(hash); - if (path) - return path; + if (cache) + return cache; - path = await this.db.getPath(this.wid, hash); + const path = await this.db.getPath(this.wid, hash); if (!path) - return; + return null; path.id = this.id; @@ -1116,7 +1099,7 @@ Wallet.prototype.readPath = async function readPath(address) { */ Wallet.prototype.hasPath = async function hasPath(address) { - let hash = Address.getHash(address, 'hex'); + const hash = Address.getHash(address, 'hex'); if (this.pathCache.has(hash)) return true; @@ -1131,15 +1114,13 @@ Wallet.prototype.hasPath = async function hasPath(address) { */ Wallet.prototype.getPaths = async function getPaths(acct) { - let paths, result; - if (acct != null) return await this.getAccountPaths(acct); - paths = await this.db.getWalletPaths(this.wid); - result = []; + const paths = await this.db.getWalletPaths(this.wid); + const result = []; - for (let path of paths) { + for (const path of paths) { path.id = this.id; path.name = await this.getAccountName(path.account); @@ -1160,15 +1141,16 @@ Wallet.prototype.getPaths = async function getPaths(acct) { */ Wallet.prototype.getAccountPaths = async function getAccountPaths(acct) { - let index = await this.ensureIndex(acct, true); - let hashes = await this.getAccountHashes(index); - let name = await this.getAccountName(acct); - let result = []; + const index = await this.ensureIndex(acct, true); + const hashes = await this.getAccountHashes(index); + const name = await this.getAccountName(acct); assert(name); - for (let hash of hashes) { - let path = await this.readPath(hash); + const result = []; + + for (const hash of hashes) { + const path = await this.readPath(hash); assert(path); assert(path.account === index); @@ -1193,7 +1175,7 @@ Wallet.prototype.getAccountPaths = async function getAccountPaths(acct) { */ Wallet.prototype.importKey = async function importKey(acct, ring, passphrase) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._importKey(acct, ring, passphrase); } finally { @@ -1210,9 +1192,7 @@ Wallet.prototype.importKey = async function importKey(acct, ring, passphrase) { * @returns {Promise} */ -Wallet.prototype._importKey = async function importKey(acct, ring, passphrase) { - let account, exists, path; - +Wallet.prototype._importKey = async function _importKey(acct, ring, passphrase) { if (acct && typeof acct === 'object') { passphrase = ring; ring = acct; @@ -1233,12 +1213,12 @@ Wallet.prototype._importKey = async function importKey(acct, ring, passphrase) { throw new Error('Cannot import privkey into watch-only wallet.'); } - exists = await this.getPath(ring.getHash('hex')); + const hash = ring.getHash('hex'); - if (exists) + if (await this.getPath(hash)) throw new Error('Key already exists.'); - account = await this.getAccount(acct); + const account = await this.getAccount(acct); if (!account) throw new Error('Account not found.'); @@ -1248,8 +1228,8 @@ Wallet.prototype._importKey = async function importKey(acct, ring, passphrase) { await this.unlock(passphrase); - ring = WalletKey.fromRing(account, ring); - path = ring.toPath(); + const key = WalletKey.fromRing(account, ring); + const path = key.toPath(); if (this.master.encrypted) { path.data = this.master.encipher(path.data, path.hash); @@ -1279,7 +1259,7 @@ Wallet.prototype._importKey = async function importKey(acct, ring, passphrase) { */ Wallet.prototype.importAddress = async function importAddress(acct, address) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._importAddress(acct, address); } finally { @@ -1296,9 +1276,7 @@ Wallet.prototype.importAddress = async function importAddress(acct, address) { * @returns {Promise} */ -Wallet.prototype._importAddress = async function importAddress(acct, address) { - let account, exists, path; - +Wallet.prototype._importAddress = async function _importAddress(acct, address) { if (!address) { address = acct; acct = null; @@ -1313,12 +1291,10 @@ Wallet.prototype._importAddress = async function importAddress(acct, address) { if (!this.watchOnly) throw new Error('Cannot import address into non watch-only wallet.'); - exists = await this.getPath(address); - - if (exists) + if (await this.getPath(address)) throw new Error('Address already exists.'); - account = await this.getAccount(acct); + const account = await this.getAccount(acct); if (!account) throw new Error('Account not found.'); @@ -1326,7 +1302,7 @@ Wallet.prototype._importAddress = async function importAddress(acct, address) { if (account.type !== Account.types.PUBKEYHASH) throw new Error('Cannot import into non-pkh account.'); - path = Path.fromAddress(account, address); + const path = Path.fromAddress(account, address); this.start(); @@ -1365,7 +1341,7 @@ Wallet.prototype._importAddress = async function importAddress(acct, address) { */ Wallet.prototype.fund = async function fund(mtx, options, force) { - let unlock = await this.fundLock.lock(force); + const unlock = await this.fundLock.lock(force); try { return await this._fund(mtx, options); } finally { @@ -1380,9 +1356,7 @@ Wallet.prototype.fund = async function fund(mtx, options, force) { * @see MTX#fill */ -Wallet.prototype._fund = async function fund(mtx, options) { - let rate, account, coins; - +Wallet.prototype._fund = async function _fund(mtx, options) { if (!options) options = {}; @@ -1392,6 +1366,7 @@ Wallet.prototype._fund = async function fund(mtx, options) { if (this.watchOnly) throw new Error('Cannot fund from watch-only wallet.'); + let account; if (options.account != null) { account = await this.getAccount(options.account); if (!account) @@ -1403,11 +1378,11 @@ Wallet.prototype._fund = async function fund(mtx, options) { if (!account.initialized) throw new Error('Account is not initialized.'); - rate = options.rate; - + let rate = options.rate; if (rate == null) rate = await this.db.estimateFee(options.blocks); + let coins; if (options.smart) { coins = await this.getSmartCoins(options.account); } else { @@ -1421,11 +1396,12 @@ Wallet.prototype._fund = async function fund(mtx, options) { depth: options.depth, hardFee: options.hardFee, subtractFee: options.subtractFee, + subtractIndex: options.subtractIndex, changeAddress: account.change.getAddress(), height: this.db.state.height, rate: rate, maxFee: options.maxFee, - estimate: this.estimateSize.bind(this) + estimate: prev => this.estimateSize(prev) }); assert(mtx.getFee() <= MTX.Selector.MAX_FEE, 'TX exceeds MAX_FEE.'); @@ -1438,11 +1414,11 @@ Wallet.prototype._fund = async function fund(mtx, options) { */ Wallet.prototype.getAccountByAddress = async function getAccountByAddress(address) { - let hash = Address.getHash(address, 'hex'); - let path = await this.getPath(hash); + const hash = Address.getHash(address, 'hex'); + const path = await this.getPath(hash); if (!path) - return; + return null; return await this.getAccount(path.account); }; @@ -1454,19 +1430,19 @@ Wallet.prototype.getAccountByAddress = async function getAccountByAddress(addres */ Wallet.prototype.estimateSize = async function estimateSize(prev) { - let scale = consensus.WITNESS_SCALE_FACTOR; - let address = prev.getAddress(); - let size = 0; - let account; + const scale = consensus.WITNESS_SCALE_FACTOR; + const address = prev.getAddress(); if (!address) return -1; - account = await this.getAccountByAddress(address); + const account = await this.getAccountByAddress(address); if (!account) return -1; + let size = 0; + if (prev.isScripthash()) { // Nested bullshit. if (account.witness) { @@ -1535,17 +1511,16 @@ Wallet.prototype.estimateSize = async function estimateSize(prev) { */ Wallet.prototype.createTX = async function createTX(options, force) { - let outputs = options.outputs; - let mtx = new MTX(); - let output, addr, total; + const outputs = options.outputs; + const mtx = new MTX(); assert(Array.isArray(outputs), 'Outputs must be an array.'); assert(outputs.length > 0, 'No outputs available.'); // Add the outputs - for (output of outputs) { - output = new Output(output); - addr = output.getAddress(); + for (const obj of outputs) { + const output = new Output(obj); + const addr = output.getAddress(); if (output.isDust()) throw new Error('Output is dust.'); @@ -1574,9 +1549,10 @@ Wallet.prototype.createTX = async function createTX(options, force) { // Consensus sanity checks. assert(mtx.isSane(), 'TX failed sanity check.'); - assert(mtx.verifyInputs(this.db.state.height + 1), 'TX failed context check.'); + assert(mtx.verifyInputs(this.db.state.height + 1), + 'TX failed context check.'); - total = await this.template(mtx); + const total = await this.template(mtx); if (total === 0) throw new Error('Templating failed.'); @@ -1595,7 +1571,7 @@ Wallet.prototype.createTX = async function createTX(options, force) { */ Wallet.prototype.send = async function send(options, passphrase) { - let unlock = await this.fundLock.lock(); + const unlock = await this.fundLock.lock(); try { return await this._send(options, passphrase); } finally { @@ -1611,16 +1587,15 @@ Wallet.prototype.send = async function send(options, passphrase) { * @returns {Promise} - Returns {@link TX}. */ -Wallet.prototype._send = async function send(options, passphrase) { - let mtx = await this.createTX(options, true); - let tx; +Wallet.prototype._send = async function _send(options, passphrase) { + const mtx = await this.createTX(options, true); await this.sign(mtx, passphrase); if (!mtx.isSigned()) throw new Error('TX could not be fully signed.'); - tx = mtx.toTX(); + const tx = mtx.toTX(); // Policy sanity checks. if (tx.getSigopsCost(mtx.view) > policy.MAX_TX_SIGOPS_COST) @@ -1648,10 +1623,9 @@ Wallet.prototype._send = async function send(options, passphrase) { */ Wallet.prototype.increaseFee = async function increaseFee(hash, rate, passphrase) { - let wtx = await this.getTX(hash); - let tx, mtx, view, oldFee, fee, change; + assert(util.isU32(rate), 'Rate must be a number.'); - assert(util.isUInt32(rate), 'Rate must be a number.'); + const wtx = await this.getTX(hash); if (!wtx) throw new Error('Transaction not found.'); @@ -1659,18 +1633,19 @@ Wallet.prototype.increaseFee = async function increaseFee(hash, rate, passphrase if (wtx.height !== -1) throw new Error('Transaction is confirmed.'); - tx = wtx.tx; + const tx = wtx.tx; if (tx.isCoinbase()) throw new Error('Transaction is a coinbase.'); - view = await this.getSpentView(tx); + const view = await this.getSpentView(tx); if (!tx.hasCoins(view)) throw new Error('Not all coins available.'); - oldFee = tx.getFee(view); - fee = tx.getMinFee(null, rate); + const oldFee = tx.getFee(view); + + let fee = tx.getMinFee(null, rate); if (fee > MTX.Selector.MAX_FEE) fee = MTX.Selector.MAX_FEE; @@ -1678,25 +1653,23 @@ Wallet.prototype.increaseFee = async function increaseFee(hash, rate, passphrase if (oldFee >= fee) throw new Error('Fee is not increasing.'); - mtx = MTX.fromTX(tx); + const mtx = MTX.fromTX(tx); mtx.view = view; - for (let input of mtx.inputs) { - input.script.length = 0; - input.script.compile(); - input.witness.length = 0; - input.witness.compile(); + for (const input of mtx.inputs) { + input.script.clear(); + input.witness.clear(); } + let change; for (let i = 0; i < mtx.outputs.length; i++) { - let output = mtx.outputs[i]; - let addr = output.getAddress(); - let path; + const output = mtx.outputs[i]; + const addr = output.getAddress(); if (!addr) continue; - path = await this.getPath(addr); + const path = await this.getPath(addr); if (!path) continue; @@ -1731,16 +1704,16 @@ Wallet.prototype.increaseFee = async function increaseFee(hash, rate, passphrase if (!mtx.isSigned()) throw new Error('TX could not be fully signed.'); - tx = mtx.toTX(); + const ntx = mtx.toTX(); this.logger.debug( 'Increasing fee for wallet tx (%s): %s', - this.id, tx.txid()); + this.id, ntx.txid()); - await this.db.addTX(tx); - await this.db.send(tx); + await this.db.addTX(ntx); + await this.db.send(ntx); - return tx; + return ntx; }; /** @@ -1749,18 +1722,19 @@ Wallet.prototype.increaseFee = async function increaseFee(hash, rate, passphrase */ Wallet.prototype.resend = async function resend() { - let wtxs = await this.getPending(); - let txs = []; + const wtxs = await this.getPending(); if (wtxs.length > 0) this.logger.info('Rebroadcasting %d transactions.', wtxs.length); - for (let wtx of wtxs) + const txs = []; + + for (const wtx of wtxs) txs.push(wtx.tx); - txs = common.sortDeps(txs); + const sorted = common.sortDeps(txs); - for (let tx of txs) + for (const tx of sorted) await this.db.send(tx); return txs; @@ -1774,21 +1748,18 @@ Wallet.prototype.resend = async function resend() { */ Wallet.prototype.deriveInputs = async function deriveInputs(mtx) { - let rings = []; - let paths; - assert(mtx.mutable); - paths = await this.getInputPaths(mtx); + const paths = await this.getInputPaths(mtx); + const rings = []; - for (let path of paths) { - let account = await this.getAccount(path.account); - let ring; + for (const path of paths) { + const account = await this.getAccount(path.account); if (!account) continue; - ring = account.derivePath(path, this.master); + const ring = account.derivePath(path, this.master); if (ring) rings.push(ring); @@ -1804,17 +1775,16 @@ Wallet.prototype.deriveInputs = async function deriveInputs(mtx) { */ Wallet.prototype.getKey = async function getKey(address) { - let hash = Address.getHash(address, 'hex'); - let path = await this.getPath(hash); - let account; + const hash = Address.getHash(address, 'hex'); + const path = await this.getPath(hash); if (!path) - return; + return null; - account = await this.getAccount(path.account); + const account = await this.getAccount(path.account); if (!account) - return; + return null; return account.derivePath(path, this.master); }; @@ -1828,24 +1798,23 @@ Wallet.prototype.getKey = async function getKey(address) { */ Wallet.prototype.getPrivateKey = async function getPrivateKey(address, passphrase) { - let hash = Address.getHash(address, 'hex'); - let path = await this.getPath(hash); - let account, key; + const hash = Address.getHash(address, 'hex'); + const path = await this.getPath(hash); if (!path) - return; + return null; - account = await this.getAccount(path.account); + const account = await this.getAccount(path.account); if (!account) - return; + return null; await this.unlock(passphrase); - key = account.derivePath(path, this.master); + const key = account.derivePath(path, this.master); if (!key.privateKey) - return; + return null; return key; }; @@ -1857,18 +1826,16 @@ Wallet.prototype.getPrivateKey = async function getPrivateKey(address, passphras */ Wallet.prototype.getInputPaths = async function getInputPaths(mtx) { - let paths = []; - let hashes; - assert(mtx.mutable); if (!mtx.hasCoins()) throw new Error('Not all coins available.'); - hashes = mtx.getInputHashes('hex'); + const hashes = mtx.getInputHashes('hex'); + const paths = []; - for (let hash of hashes) { - let path = await this.getPath(hash); + for (const hash of hashes) { + const path = await this.getPath(hash); if (path) paths.push(path); } @@ -1883,11 +1850,11 @@ Wallet.prototype.getInputPaths = async function getInputPaths(mtx) { */ Wallet.prototype.getOutputPaths = async function getOutputPaths(tx) { - let paths = []; - let hashes = tx.getOutputHashes('hex'); + const paths = []; + const hashes = tx.getOutputHashes('hex'); - for (let hash of hashes) { - let path = await this.getPath(hash); + for (const hash of hashes) { + const path = await this.getPath(hash); if (path) paths.push(path); } @@ -1903,7 +1870,7 @@ Wallet.prototype.getOutputPaths = async function getOutputPaths(tx) { */ Wallet.prototype.setLookahead = async function setLookahead(acct, lookahead) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return this._setLookahead(acct, lookahead); } finally { @@ -1919,9 +1886,7 @@ Wallet.prototype.setLookahead = async function setLookahead(acct, lookahead) { * @returns {Promise} */ -Wallet.prototype._setLookahead = async function setLookahead(acct, lookahead) { - let account; - +Wallet.prototype._setLookahead = async function _setLookahead(acct, lookahead) { if (lookahead == null) { lookahead = acct; acct = null; @@ -1930,7 +1895,7 @@ Wallet.prototype._setLookahead = async function setLookahead(acct, lookahead) { if (acct == null) acct = 0; - account = await this.getAccount(acct); + const account = await this.getAccount(acct); if (!account) throw new Error('Account not found.'); @@ -1956,14 +1921,10 @@ Wallet.prototype._setLookahead = async function setLookahead(acct, lookahead) { */ Wallet.prototype.syncOutputDepth = async function syncOutputDepth(details) { - let derived = []; - let accounts = {}; + const map = new Map(); - if (!details) - return derived; - - for (let output of details.outputs) { - let path = output.path; + for (const output of details.outputs) { + const path = output.path; if (!path) continue; @@ -1971,22 +1932,20 @@ Wallet.prototype.syncOutputDepth = async function syncOutputDepth(details) { if (path.index === -1) continue; - if (!accounts[path.account]) - accounts[path.account] = []; + if (!map.has(path.account)) + map.set(path.account, []); - accounts[path.account].push(path); + map.get(path.account).push(path); } - accounts = util.values(accounts); + const derived = []; - for (let paths of accounts) { - let acct = paths[0].account; + for (const [acct, paths] of map) { let receive = -1; let change = -1; let nested = -1; - let account, ring; - for (let path of paths) { + for (const path of paths) { switch (path.branch) { case 0: if (path.index > receive) @@ -2007,10 +1966,10 @@ Wallet.prototype.syncOutputDepth = async function syncOutputDepth(details) { change += 2; nested += 2; - account = await this.getAccount(acct); + const account = await this.getAccount(acct); assert(account); - ring = await account.syncDepth(receive, change, nested); + const ring = await account.syncDepth(receive, change, nested); if (ring) derived.push(ring); @@ -2026,15 +1985,13 @@ Wallet.prototype.syncOutputDepth = async function syncOutputDepth(details) { */ Wallet.prototype.getRedeem = async function getRedeem(hash) { - let ring; - if (typeof hash === 'string') hash = Buffer.from(hash, 'hex'); - ring = await this.getKey(hash.toString('hex')); + const ring = await this.getKey(hash.toString('hex')); if (!ring) - return; + return null; return ring.getRedeem(hash); }; @@ -2049,7 +2006,7 @@ Wallet.prototype.getRedeem = async function getRedeem(hash) { */ Wallet.prototype.template = async function template(mtx) { - let rings = await this.deriveInputs(mtx); + const rings = await this.deriveInputs(mtx); return mtx.template(rings); }; @@ -2063,14 +2020,12 @@ Wallet.prototype.template = async function template(mtx) { */ Wallet.prototype.sign = async function sign(mtx, passphrase) { - let rings; - if (this.watchOnly) throw new Error('Cannot sign from a watch-only wallet.'); await this.unlock(passphrase); - rings = await this.deriveInputs(mtx); + const rings = await this.deriveInputs(mtx); return await mtx.signAsync(rings, Script.hashType.ALL, this.db.workers); }; @@ -2162,7 +2117,7 @@ Wallet.prototype.getBlock = function getBlock(height) { */ Wallet.prototype.add = async function add(tx, block) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._add(tx, block); } finally { @@ -2178,14 +2133,14 @@ Wallet.prototype.add = async function add(tx, block) { * @returns {Promise} */ -Wallet.prototype._add = async function add(tx, block) { - let details, derived; - +Wallet.prototype._add = async function _add(tx, block) { this.txdb.start(); + let details, derived; try { details = await this.txdb._add(tx, block); - derived = await this.syncOutputDepth(details); + if (details) + derived = await this.syncOutputDepth(details); } catch (e) { this.txdb.drop(); throw e; @@ -2193,7 +2148,7 @@ Wallet.prototype._add = async function add(tx, block) { await this.txdb.commit(); - if (derived.length > 0) { + if (derived && derived.length > 0) { this.db.emit('address', this.id, derived); this.emit('address', derived); } @@ -2208,7 +2163,7 @@ Wallet.prototype._add = async function add(tx, block) { */ Wallet.prototype.unconfirm = async function unconfirm(hash) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this.txdb.unconfirm(hash); } finally { @@ -2223,7 +2178,7 @@ Wallet.prototype.unconfirm = async function unconfirm(hash) { */ Wallet.prototype.remove = async function remove(hash) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this.txdb.remove(hash); } finally { @@ -2239,7 +2194,7 @@ Wallet.prototype.remove = async function remove(hash) { */ Wallet.prototype.zap = async function zap(acct, age) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._zap(acct, age); } finally { @@ -2255,8 +2210,8 @@ Wallet.prototype.zap = async function zap(acct, age) { * @returns {Promise} */ -Wallet.prototype._zap = async function zap(acct, age) { - let account = await this.ensureIndex(acct); +Wallet.prototype._zap = async function _zap(acct, age) { + const account = await this.ensureIndex(acct); return await this.txdb.zap(account, age); }; @@ -2267,7 +2222,7 @@ Wallet.prototype._zap = async function zap(acct, age) { */ Wallet.prototype.abandon = async function abandon(hash) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._abandon(hash); } finally { @@ -2282,7 +2237,7 @@ Wallet.prototype.abandon = async function abandon(hash) { * @returns {Promise} */ -Wallet.prototype._abandon = function abandon(hash) { +Wallet.prototype._abandon = function _abandon(hash) { return this.txdb.abandon(hash); }; @@ -2329,7 +2284,7 @@ Wallet.prototype.getLocked = function getLocked() { */ Wallet.prototype.getHistory = async function getHistory(acct) { - let account = await this.ensureIndex(acct); + const account = await this.ensureIndex(acct); return this.txdb.getHistory(account); }; @@ -2340,7 +2295,7 @@ Wallet.prototype.getHistory = async function getHistory(acct) { */ Wallet.prototype.getCoins = async function getCoins(acct) { - let account = await this.ensureIndex(acct); + const account = await this.ensureIndex(acct); return await this.txdb.getCoins(account); }; @@ -2351,7 +2306,7 @@ Wallet.prototype.getCoins = async function getCoins(acct) { */ Wallet.prototype.getCredits = async function getCredits(acct) { - let account = await this.ensureIndex(acct); + const account = await this.ensureIndex(acct); return await this.txdb.getCredits(account); }; @@ -2362,11 +2317,11 @@ Wallet.prototype.getCredits = async function getCredits(acct) { */ Wallet.prototype.getSmartCoins = async function getSmartCoins(acct) { - let credits = await this.getCredits(acct); - let coins = []; + const credits = await this.getCredits(acct); + const coins = []; - for (let credit of credits) { - let coin = credit.coin; + for (const credit of credits) { + const coin = credit.coin; if (credit.spent) continue; @@ -2401,7 +2356,7 @@ Wallet.prototype.getSmartCoins = async function getSmartCoins(acct) { */ Wallet.prototype.getPending = async function getPending(acct) { - let account = await this.ensureIndex(acct); + const account = await this.ensureIndex(acct); return await this.txdb.getPending(account); }; @@ -2412,7 +2367,7 @@ Wallet.prototype.getPending = async function getPending(acct) { */ Wallet.prototype.getBalance = async function getBalance(acct) { - let account = await this.ensureIndex(acct); + const account = await this.ensureIndex(acct); return await this.txdb.getBalance(account); }; @@ -2426,12 +2381,11 @@ Wallet.prototype.getBalance = async function getBalance(acct) { */ Wallet.prototype.getRange = async function getRange(acct, options) { - let account; if (acct && typeof acct === 'object') { options = acct; acct = null; } - account = await this.ensureIndex(acct); + const account = await this.ensureIndex(acct); return await this.txdb.getRange(account, options); }; @@ -2443,7 +2397,7 @@ Wallet.prototype.getRange = async function getRange(acct, options) { */ Wallet.prototype.getLast = async function getLast(acct, limit) { - let account = await this.ensureIndex(acct); + const account = await this.ensureIndex(acct); return await this.txdb.getLast(account, limit); }; @@ -2456,15 +2410,13 @@ Wallet.prototype.getLast = async function getLast(acct, limit) { */ Wallet.prototype.ensureIndex = async function ensureIndex(acct, enforce) { - let index; - if (acct == null) { if (enforce) throw new Error('No account provided.'); return null; } - index = await this.getAccountIndex(acct); + const index = await this.getAccountIndex(acct); if (index === -1) throw new Error('Account not found.'); @@ -2575,8 +2527,8 @@ Wallet.prototype.getSize = function getSize() { */ Wallet.prototype.toRaw = function toRaw() { - let size = this.getSize(); - let bw = new StaticWriter(size); + const size = this.getSize(); + const bw = new StaticWriter(size); bw.writeU32(this.network.magic); bw.writeU32(this.wid); @@ -2598,8 +2550,8 @@ Wallet.prototype.toRaw = function toRaw() { */ Wallet.prototype.fromRaw = function fromRaw(data) { - let br = new BufferReader(data); - let network = Network.fromMagic(br.readU32()); + const br = new BufferReader(data); + const network = Network.fromMagic(br.readU32()); this.wid = br.readU32(); this.id = br.readVarString('ascii'); diff --git a/lib/wallet/walletdb.js b/lib/wallet/walletdb.js index 7e6376257..f2f2c4ff0 100644 --- a/lib/wallet/walletdb.js +++ b/lib/wallet/walletdb.js @@ -62,7 +62,11 @@ function WalletDB(options) { this.network = this.options.network; this.logger = this.options.logger.context('wallet'); + this.workers = this.options.workers; + this.client = this.options.client; + this.feeRate = this.options.feeRate; + this.db = LDB(this.options); this.rpc = new RPC(this); this.primary = null; @@ -101,7 +105,7 @@ function WalletDB(options) { this._init(); } -util.inherits(WalletDB, AsyncObject); +Object.setPrototypeOf(WalletDB.prototype, AsyncObject.prototype); /** * Database layout. @@ -138,9 +142,7 @@ WalletDB.prototype._init = function _init() { * @returns {Promise} */ -WalletDB.prototype._open = async function open() { - let wallet; - +WalletDB.prototype._open = async function _open() { if (this.options.listen) await this.logger.open(); @@ -160,7 +162,7 @@ WalletDB.prototype._open = async function open() { this.state.height, this.state.startHeight); - wallet = await this.ensure({ + const wallet = await this.ensure({ id: 'primary' }); @@ -181,15 +183,13 @@ WalletDB.prototype._open = async function open() { * @returns {Promise} */ -WalletDB.prototype._close = async function close() { - let wallet; - +WalletDB.prototype._close = async function _close() { await this.disconnect(); if (this.http && this.options.listen) await this.http.close(); - for (wallet of this.wallets.values()) + for (const wallet of this.wallets.values()) await wallet.destroy(); await this.db.close(); @@ -204,7 +204,7 @@ WalletDB.prototype._close = async function close() { */ WalletDB.prototype.load = async function load() { - let unlock = await this.txLock.lock(); + const unlock = await this.txLock.lock(); try { await this.connect(); await this.init(); @@ -308,15 +308,15 @@ WalletDB.prototype.disconnect = async function disconnect() { */ WalletDB.prototype.init = async function init() { - let state = await this.getState(); - let startHeight = this.options.startHeight; - let tip; + const state = await this.getState(); + const startHeight = this.options.startHeight; if (state) { this.state = state; return; } + let tip; if (this.client) { if (startHeight != null) { tip = await this.client.getEntry(startHeight); @@ -344,23 +344,22 @@ WalletDB.prototype.init = async function init() { */ WalletDB.prototype.watch = async function watch() { - let hashes = 0; - let outpoints = 0; - let iter; - - iter = this.db.iterator({ + let iter = this.db.iterator({ gte: layout.p(encoding.NULL_HASH), lte: layout.p(encoding.HIGH_HASH) }); + let hashes = 0; + let outpoints = 0; + for (;;) { - let item = await iter.next(); + const item = await iter.next(); if (!item) break; try { - let data = layout.pp(item.key); + const data = layout.pp(item.key); this.filter.add(data, 'hex'); } catch (e) { await iter.end(); @@ -376,15 +375,15 @@ WalletDB.prototype.watch = async function watch() { }); for (;;) { - let item = await iter.next(); + const item = await iter.next(); if (!item) break; try { - let [hash, index] = layout.oo(item.key); - let outpoint = new Outpoint(hash, index); - let data = outpoint.toRaw(); + const [hash, index] = layout.oo(item.key); + const outpoint = new Outpoint(hash, index); + const data = outpoint.toRaw(); this.filter.add(data); } catch (e) { await iter.end(); @@ -407,14 +406,14 @@ WalletDB.prototype.watch = async function watch() { */ WalletDB.prototype.sync = async function sync() { - let height = this.state.height; - let entry; - if (!this.client) return; + let height = this.state.height; + let entry; + while (height >= 0) { - let tip = await this.getBlock(height); + const tip = await this.getBlock(height); if (!tip) break; @@ -446,15 +445,13 @@ WalletDB.prototype.sync = async function sync() { */ WalletDB.prototype.scan = async function scan(height) { - let tip; - if (!this.client) return; if (height == null) height = this.state.startHeight; - assert(util.isUInt32(height), 'WDB: Must pass in a height.'); + assert(util.isU32(height), 'WDB: Must pass in a height.'); await this.rollback(height); @@ -462,7 +459,7 @@ WalletDB.prototype.scan = async function scan(height) { 'WalletDB is scanning %d blocks.', this.state.height - height + 1); - tip = await this.getTip(); + const tip = await this.getTip(); try { this.rescanning = true; @@ -479,7 +476,7 @@ WalletDB.prototype.scan = async function scan(height) { */ WalletDB.prototype.rescan = async function rescan(height) { - let unlock = await this.txLock.lock(); + const unlock = await this.txLock.lock(); try { return await this._rescan(height); } finally { @@ -494,7 +491,7 @@ WalletDB.prototype.rescan = async function rescan(height) { * @returns {Promise} */ -WalletDB.prototype._rescan = async function rescan(height) { +WalletDB.prototype._rescan = async function _rescan(height) { return await this.scan(height); }; @@ -520,12 +517,13 @@ WalletDB.prototype.send = async function send(tx) { */ WalletDB.prototype.estimateFee = async function estimateFee(blocks) { - let rate; + if (this.feeRate > 0) + return this.feeRate; if (!this.client) return this.network.feeRate; - rate = await this.client.estimateFee(blocks); + const rate = await this.client.estimateFee(blocks); if (rate < this.network.feeRate) return this.network.feeRate; @@ -598,20 +596,19 @@ WalletDB.prototype.backup = function backup(path) { */ WalletDB.prototype.wipe = async function wipe() { - let batch = this.db.batch(); - let total = 0; - let iter; - this.logger.warning('Wiping WalletDB TXDB...'); this.logger.warning('I hope you know what you\'re doing.'); - iter = this.db.iterator({ + const iter = this.db.iterator({ gte: Buffer.from([0x00]), lte: Buffer.from([0xff]) }); + const batch = this.db.batch(); + let total = 0; + for (;;) { - let item = await iter.next(); + const item = await iter.next(); if (!item) break; @@ -647,8 +644,6 @@ WalletDB.prototype.wipe = async function wipe() { */ WalletDB.prototype.getDepth = async function getDepth() { - let iter, item, depth; - // This may seem like a strange way to do // this, but updating a global state when // creating a new wallet is actually pretty @@ -658,21 +653,21 @@ WalletDB.prototype.getDepth = async function getDepth() { // nonsense of adding a global lock to // walletdb.create by simply seeking to the // highest wallet wid. - iter = this.db.iterator({ + const iter = this.db.iterator({ gte: layout.w(0x00000000), lte: layout.w(0xffffffff), reverse: true, limit: 1 }); - item = await iter.next(); + const item = await iter.next(); if (!item) return 1; await iter.end(); - depth = layout.ww(item.key); + const depth = layout.ww(item.key); return depth + 1; }; @@ -698,7 +693,7 @@ WalletDB.prototype.start = function start(wallet) { */ WalletDB.prototype.drop = function drop(wallet) { - let batch = this.batch(wallet); + const batch = this.batch(wallet); wallet.current = null; wallet.accountCache.drop(); wallet.pathCache.drop(); @@ -712,7 +707,7 @@ WalletDB.prototype.drop = function drop(wallet) { */ WalletDB.prototype.clear = function clear(wallet) { - let batch = this.batch(wallet); + const batch = this.batch(wallet); wallet.accountCache.clear(); wallet.pathCache.clear(); batch.clear(); @@ -738,7 +733,7 @@ WalletDB.prototype.batch = function batch(wallet) { */ WalletDB.prototype.commit = async function commit(wallet) { - let batch = this.batch(wallet); + const batch = this.batch(wallet); try { await batch.write(); @@ -784,7 +779,7 @@ WalletDB.prototype.addHash = function addHash(hash) { */ WalletDB.prototype.addOutpoint = function addOutpoint(hash, index) { - let outpoint = new Outpoint(hash, index); + const outpoint = new Outpoint(hash, index); this.filter.add(outpoint.toRaw()); }; @@ -825,25 +820,23 @@ WalletDB.prototype.unregister = function unregister(wallet) { */ WalletDB.prototype.getWalletID = async function getWalletID(id) { - let wid, data; - if (!id) - return; + return null; if (typeof id === 'number') return id; - wid = this.widCache.get(id); + const cache = this.widCache.get(id); - if (wid) - return wid; + if (cache) + return cache; - data = await this.db.get(layout.l(id)); + const data = await this.db.get(layout.l(id)); if (!data) - return; + return null; - wid = data.readUInt32LE(0, true); + const wid = data.readUInt32LE(0, true); this.widCache.set(id, wid); @@ -857,13 +850,12 @@ WalletDB.prototype.getWalletID = async function getWalletID(id) { */ WalletDB.prototype.get = async function get(id) { - let wid = await this.getWalletID(id); - let unlock; + const wid = await this.getWalletID(id); if (!wid) - return; + return null; - unlock = await this.readLock.lock(wid); + const unlock = await this.readLock.lock(wid); try { return await this._get(wid); @@ -879,19 +871,18 @@ WalletDB.prototype.get = async function get(id) { * @returns {Promise} - Returns {@link Wallet}. */ -WalletDB.prototype._get = async function get(wid) { - let wallet = this.wallets.get(wid); - let data; +WalletDB.prototype._get = async function _get(wid) { + const cache = this.wallets.get(wid); - if (wallet) - return wallet; + if (cache) + return cache; - data = await this.db.get(layout.w(wid)); + const data = await this.db.get(layout.w(wid)); if (!data) - return; + return null; - wallet = Wallet.fromRaw(this, data); + const wallet = Wallet.fromRaw(this, data); await wallet.open(); @@ -906,9 +897,9 @@ WalletDB.prototype._get = async function get(wid) { */ WalletDB.prototype.save = function save(wallet) { - let wid = wallet.wid; - let id = wallet.id; - let batch = this.batch(wallet); + const wid = wallet.wid; + const id = wallet.id; + const batch = this.batch(wallet); this.widCache.set(id, wid); @@ -924,7 +915,7 @@ WalletDB.prototype.save = function save(wallet) { */ WalletDB.prototype.rename = async function rename(wallet, id) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); try { return await this._rename(wallet, id); } finally { @@ -941,8 +932,7 @@ WalletDB.prototype.rename = async function rename(wallet, id) { */ WalletDB.prototype._rename = async function _rename(wallet, id) { - let old = wallet.id; - let paths, batch; + const old = wallet.id; if (!common.isName(id)) throw new Error('WDB: Bad wallet ID.'); @@ -950,7 +940,7 @@ WalletDB.prototype._rename = async function _rename(wallet, id) { if (await this.has(id)) throw new Error('WDB: ID not available.'); - batch = this.start(wallet); + const batch = this.start(wallet); batch.del(layout.l(old)); wallet.id = id; @@ -961,9 +951,9 @@ WalletDB.prototype._rename = async function _rename(wallet, id) { this.widCache.remove(old); - paths = wallet.pathCache.values(); + const paths = wallet.pathCache.values(); - for (let path of paths) + for (const path of paths) path.id = id; }; @@ -974,8 +964,8 @@ WalletDB.prototype._rename = async function _rename(wallet, id) { */ WalletDB.prototype.renameAccount = function renameAccount(account, name) { - let wallet = account.wallet; - let batch = this.batch(wallet); + const wallet = account.wallet; + const batch = this.batch(wallet); // Remove old wid/name->account index. batch.del(layout.i(account.wid, account.name)); @@ -993,10 +983,10 @@ WalletDB.prototype.renameAccount = function renameAccount(account, name) { */ WalletDB.prototype.auth = async function auth(wid, token) { - let wallet = await this.get(wid); + const wallet = await this.get(wid); if (!wallet) - return; + return null; if (typeof token === 'string') { if (!util.isHex256(token)) @@ -1018,7 +1008,7 @@ WalletDB.prototype.auth = async function auth(wid, token) { */ WalletDB.prototype.create = async function create(options) { - let unlock = await this.writeLock.lock(); + const unlock = await this.writeLock.lock(); if (!options) options = {}; @@ -1037,14 +1027,13 @@ WalletDB.prototype.create = async function create(options) { * @returns {Promise} - Returns {@link Wallet}. */ -WalletDB.prototype._create = async function create(options) { - let exists = await this.has(options.id); - let wallet; +WalletDB.prototype._create = async function _create(options) { + const exists = await this.has(options.id); if (exists) throw new Error('WDB: Wallet already exists.'); - wallet = Wallet.fromOptions(this, options); + const wallet = Wallet.fromOptions(this, options); wallet.wid = this.depth++; await wallet.init(options); @@ -1063,7 +1052,7 @@ WalletDB.prototype._create = async function create(options) { */ WalletDB.prototype.has = async function has(id) { - let wid = await this.getWalletID(id); + const wid = await this.getWalletID(id); return wid != null; }; @@ -1074,9 +1063,11 @@ WalletDB.prototype.has = async function has(id) { */ WalletDB.prototype.ensure = async function ensure(options) { - let wallet = await this.get(options.id); + const wallet = await this.get(options.id); + if (wallet) return wallet; + return await this.create(options); }; @@ -1089,10 +1080,10 @@ WalletDB.prototype.ensure = async function ensure(options) { */ WalletDB.prototype.getAccount = async function getAccount(wid, index) { - let data = await this.db.get(layout.a(wid, index)); + const data = await this.db.get(layout.a(wid, index)); if (!data) - return; + return null; return Account.fromRaw(this, data); }; @@ -1119,7 +1110,7 @@ WalletDB.prototype.getAccounts = function getAccounts(wid) { */ WalletDB.prototype.getAccountIndex = async function getAccountIndex(wid, name) { - let index = await this.db.get(layout.i(wid, name)); + const index = await this.db.get(layout.i(wid, name)); if (!index) return -1; @@ -1135,10 +1126,10 @@ WalletDB.prototype.getAccountIndex = async function getAccountIndex(wid, name) { */ WalletDB.prototype.getAccountName = async function getAccountName(wid, index) { - let name = await this.db.get(layout.n(wid, index)); + const name = await this.db.get(layout.n(wid, index)); if (!name) - return; + return null; return name.toString('ascii'); }; @@ -1150,11 +1141,11 @@ WalletDB.prototype.getAccountName = async function getAccountName(wid, index) { */ WalletDB.prototype.saveAccount = function saveAccount(account) { - let wid = account.wid; - let wallet = account.wallet; - let index = account.accountIndex; - let name = account.name; - let batch = this.batch(wallet); + const wid = account.wid; + const wallet = account.wallet; + const index = account.accountIndex; + const name = account.name; + const batch = this.batch(wallet); // Account data batch.put(layout.a(wid, index), account.toRaw()); @@ -1187,18 +1178,17 @@ WalletDB.prototype.hasAccount = function hasAccount(wid, index) { */ WalletDB.prototype.getPathMap = async function getPathMap(hash) { - let map = this.pathMapCache.get(hash); - let data; + const cache = this.pathMapCache.get(hash); - if (map) - return map; + if (cache) + return cache; - data = await this.db.get(layout.p(hash)); + const data = await this.db.get(layout.p(hash)); if (!data) - return; + return null; - map = PathMapRecord.fromRaw(hash, data); + const map = PathMapRecord.fromRaw(hash, data); this.pathMapCache.set(hash, map); @@ -1230,14 +1220,13 @@ WalletDB.prototype.saveKey = function saveKey(wallet, ring) { */ WalletDB.prototype.savePath = async function savePath(wallet, path) { - let wid = wallet.wid; - let hash = path.hash; - let batch = this.batch(wallet); - let map; + const wid = wallet.wid; + const hash = path.hash; + const batch = this.batch(wallet); await this.addHash(hash); - map = await this.getPathMap(hash); + let map = await this.getPathMap(hash); if (!map) map = new PathMapRecord(hash); @@ -1266,13 +1255,12 @@ WalletDB.prototype.savePath = async function savePath(wallet, path) { */ WalletDB.prototype.getPath = async function getPath(wid, hash) { - let data = await this.db.get(layout.P(wid, hash)); - let path; + const data = await this.db.get(layout.P(wid, hash)); if (!data) - return; + return null; - path = Path.fromRaw(data); + const path = Path.fromRaw(data); path.wid = wid; path.hash = hash; @@ -1313,7 +1301,7 @@ WalletDB.prototype.getOutpoints = function getOutpoints() { gte: layout.o(encoding.NULL_HASH, 0), lte: layout.o(encoding.HIGH_HASH, 0xffffffff), parse: (key) => { - let [hash, index] = layout.oo(key); + const [hash, index] = layout.oo(key); return new Outpoint(hash, index); } }); @@ -1355,16 +1343,16 @@ WalletDB.prototype.getAccountHashes = function getAccountHashes(wid, account) { */ WalletDB.prototype.getWalletPaths = async function getWalletPaths(wid) { - let paths = []; - - let items = await this.db.range({ + const items = await this.db.range({ gte: layout.P(wid, encoding.NULL_HASH), lte: layout.P(wid, encoding.HIGH_HASH) }); - for (let item of items) { - let hash = layout.Pp(item.key); - let path = Path.fromRaw(item.value); + const paths = []; + + for (const item of items) { + const hash = layout.Pp(item.key); + const path = Path.fromRaw(item.value); path.hash = hash; path.wid = wid; @@ -1396,20 +1384,18 @@ WalletDB.prototype.getWallets = function getWallets() { */ WalletDB.prototype.encryptKeys = async function encryptKeys(wallet, key) { - let wid = wallet.wid; - let paths = await wallet.getPaths(); - let batch = this.batch(wallet); + const wid = wallet.wid; + const paths = await wallet.getPaths(); + const batch = this.batch(wallet); for (let path of paths) { - let iv; - if (!path.data) continue; assert(!path.encrypted); - iv = Buffer.from(path.hash, 'hex'); - iv = iv.slice(0, 16); + const hash = Buffer.from(path.hash, 'hex'); + const iv = hash.slice(0, 16); path = path.clone(); path.data = aes.encipher(path.data, key, iv); @@ -1429,20 +1415,18 @@ WalletDB.prototype.encryptKeys = async function encryptKeys(wallet, key) { */ WalletDB.prototype.decryptKeys = async function decryptKeys(wallet, key) { - let wid = wallet.wid; - let paths = await wallet.getPaths(); - let batch = this.batch(wallet); + const wid = wallet.wid; + const paths = await wallet.getPaths(); + const batch = this.batch(wallet); for (let path of paths) { - let iv; - if (!path.data) continue; assert(path.encrypted); - iv = Buffer.from(path.hash, 'hex'); - iv = iv.slice(0, 16); + const hash = Buffer.from(path.hash, 'hex'); + const iv = hash.slice(0, 16); path = path.clone(); path.data = aes.decipher(path.data, key, iv); @@ -1460,15 +1444,13 @@ WalletDB.prototype.decryptKeys = async function decryptKeys(wallet, key) { */ WalletDB.prototype.resend = async function resend() { - let keys, key, wid; - - keys = await this.db.keys({ + const keys = await this.db.keys({ gte: layout.w(0x00000000), lte: layout.w(0xffffffff) }); - for (key of keys) { - wid = layout.ww(key); + for (const key of keys) { + const wid = layout.ww(key); await this.resendPending(wid); } }; @@ -1481,11 +1463,9 @@ WalletDB.prototype.resend = async function resend() { */ WalletDB.prototype.resendPending = async function resendPending(wid) { - let layout = layouts.txdb; - let txs = []; - let keys; + const layout = layouts.txdb; - keys = await this.db.keys({ + const keys = await this.db.keys({ gte: layout.prefix(wid, layout.p(encoding.NULL_HASH)), lte: layout.prefix(wid, layout.p(encoding.HIGH_HASH)) }); @@ -1498,16 +1478,17 @@ WalletDB.prototype.resendPending = async function resendPending(wid) { keys.length, wid); - for (let key of keys) { - let hash = layout.pp(key); - let tkey = layout.prefix(wid, layout.t(hash)); - let data = await this.db.get(tkey); - let wtx; + const txs = []; + + for (const key of keys) { + const hash = layout.pp(key); + const tkey = layout.prefix(wid, layout.t(hash)); + const data = await this.db.get(tkey); if (!data) continue; - wtx = TXRecord.fromRaw(data); + const wtx = TXRecord.fromRaw(data); if (wtx.tx.isCoinbase()) continue; @@ -1515,9 +1496,9 @@ WalletDB.prototype.resendPending = async function resendPending(wid) { txs.push(wtx.tx); } - txs = common.sortDeps(txs); + const sorted = common.sortDeps(txs); - for (let tx of txs) + for (const tx of sorted) await this.send(tx); }; @@ -1528,44 +1509,41 @@ WalletDB.prototype.resendPending = async function resendPending(wid) { */ WalletDB.prototype.getWalletsByTX = async function getWalletsByTX(tx) { - let hashes = tx.getOutputHashes('hex'); - let result = []; + const hashes = tx.getOutputHashes('hex'); + const result = new Set(); if (!tx.isCoinbase()) { - for (let input of tx.inputs) { - let prevout = input.prevout; - let map; + for (const input of tx.inputs) { + const prevout = input.prevout; if (!this.testFilter(prevout.toRaw())) continue; - map = await this.getOutpointMap(prevout.hash, prevout.index); + const map = await this.getOutpointMap(prevout.hash, prevout.index); if (!map) continue; - for (let wid of map.wids) - util.binaryInsert(result, wid, cmp, true); + for (const wid of map.wids) + result.add(wid); } } - for (let hash of hashes) { - let map; - + for (const hash of hashes) { if (!this.testFilter(hash)) continue; - map = await this.getPathMap(hash); + const map = await this.getPathMap(hash); if (!map) continue; - for (let wid of map.wids) - util.binaryInsert(result, wid, cmp, true); + for (const wid of map.wids) + result.add(wid); } - if (result.length === 0) - return; + if (result.size === 0) + return null; return result; }; @@ -1576,10 +1554,10 @@ WalletDB.prototype.getWalletsByTX = async function getWalletsByTX(tx) { */ WalletDB.prototype.getState = async function getState() { - let data = await this.db.get(layout.R); + const data = await this.db.get(layout.R); if (!data) - return; + return null; return ChainState.fromRaw(data); }; @@ -1591,18 +1569,17 @@ WalletDB.prototype.getState = async function getState() { */ WalletDB.prototype.resetState = async function resetState(tip, marked) { - let batch = this.db.batch(); - let state = this.state.clone(); - let iter; + const batch = this.db.batch(); + const state = this.state.clone(); - iter = this.db.iterator({ + const iter = this.db.iterator({ gte: layout.h(0), lte: layout.h(0xffffffff), values: false }); for (;;) { - let item = await iter.next(); + const item = await iter.next(); if (!item) break; @@ -1635,8 +1612,8 @@ WalletDB.prototype.resetState = async function resetState(tip, marked) { */ WalletDB.prototype.syncState = async function syncState(tip) { - let batch = this.db.batch(); - let state = this.state.clone(); + const batch = this.db.batch(); + const state = this.state.clone(); if (tip.height < state.height) { // Hashes ahead of our new tip @@ -1653,7 +1630,7 @@ WalletDB.prototype.syncState = async function syncState(tip) { } } else if (tip.height > state.height) { // Prune old hashes. - let height = tip.height - this.options.keepBlocks; + const height = tip.height - this.options.keepBlocks; assert(tip.height === state.height + 1, 'Bad chain sync.'); @@ -1695,10 +1672,10 @@ WalletDB.prototype.maybeMark = async function maybeMark(tip) { */ WalletDB.prototype.getBlockMap = async function getBlockMap(height) { - let data = await this.db.get(layout.b(height)); + const data = await this.db.get(layout.b(height)); if (!data) - return; + return null; return BlockMapRecord.fromRaw(height, data); }; @@ -1711,7 +1688,7 @@ WalletDB.prototype.getBlockMap = async function getBlockMap(height) { */ WalletDB.prototype.writeBlockMap = function writeBlockMap(wallet, height, block) { - let batch = this.batch(wallet); + const batch = this.batch(wallet); batch.put(layout.b(height), block.toRaw()); }; @@ -1722,7 +1699,7 @@ WalletDB.prototype.writeBlockMap = function writeBlockMap(wallet, height, block) */ WalletDB.prototype.unwriteBlockMap = function unwriteBlockMap(wallet, height) { - let batch = this.batch(wallet); + const batch = this.batch(wallet); batch.del(layout.b(height)); }; @@ -1734,10 +1711,10 @@ WalletDB.prototype.unwriteBlockMap = function unwriteBlockMap(wallet, height) { */ WalletDB.prototype.getOutpointMap = async function getOutpointMap(hash, index) { - let data = await this.db.get(layout.o(hash, index)); + const data = await this.db.get(layout.o(hash, index)); if (!data) - return; + return null; return OutpointMapRecord.fromRaw(hash, index, data); }; @@ -1751,7 +1728,7 @@ WalletDB.prototype.getOutpointMap = async function getOutpointMap(hash, index) { */ WalletDB.prototype.writeOutpointMap = function writeOutpointMap(wallet, hash, index, map) { - let batch = this.batch(wallet); + const batch = this.batch(wallet); this.addOutpoint(hash, index); @@ -1766,7 +1743,7 @@ WalletDB.prototype.writeOutpointMap = function writeOutpointMap(wallet, hash, in */ WalletDB.prototype.unwriteOutpointMap = function unwriteOutpointMap(wallet, hash, index) { - let batch = this.batch(wallet); + const batch = this.batch(wallet); batch.del(layout.o(hash, index)); }; @@ -1777,13 +1754,12 @@ WalletDB.prototype.unwriteOutpointMap = function unwriteOutpointMap(wallet, hash */ WalletDB.prototype.getBlock = async function getBlock(height) { - let data = await this.db.get(layout.h(height)); - let block; + const data = await this.db.get(layout.h(height)); if (!data) - return; + return null; - block = new BlockMeta(); + const block = new BlockMeta(); block.hash = data.toString('hex'); block.height = height; @@ -1797,7 +1773,7 @@ WalletDB.prototype.getBlock = async function getBlock(height) { */ WalletDB.prototype.getTip = async function getTip() { - let tip = await this.getBlock(this.state.height); + const tip = await this.getBlock(this.state.height); if (!tip) throw new Error('WDB: Tip not found!'); @@ -1812,8 +1788,6 @@ WalletDB.prototype.getTip = async function getTip() { */ WalletDB.prototype.rollback = async function rollback(height) { - let tip, marked; - if (height > this.state.height) throw new Error('WDB: Cannot rollback to the future.'); @@ -1826,7 +1800,8 @@ WalletDB.prototype.rollback = async function rollback(height) { 'Rolling back %d WalletDB blocks to height %d.', this.state.height - height, height); - tip = await this.getBlock(height); + let tip = await this.getBlock(height); + let marked = false; if (tip) { await this.revert(tip.height); @@ -1865,30 +1840,30 @@ WalletDB.prototype.rollback = async function rollback(height) { */ WalletDB.prototype.revert = async function revert(target) { - let total = 0; - let iter; - - iter = this.db.iterator({ + const iter = this.db.iterator({ gte: layout.b(target + 1), lte: layout.b(0xffffffff), reverse: true, values: true }); + let total = 0; + for (;;) { - let item = await iter.next(); + const item = await iter.next(); if (!item) break; try { - let height = layout.bb(item.key); - let block = BlockMapRecord.fromRaw(height, item.value); + const height = layout.bb(item.key); + const block = BlockMapRecord.fromRaw(height, item.value); + const txs = block.toArray(); - total += block.txs.length; + total += txs.length; - for (let i = block.txs.length - 1; i >= 0; i--) { - let tx = block.txs[i]; + for (let i = txs.length - 1; i >= 0; i--) { + const tx = txs[i]; await this._unconfirm(tx); } } catch (e) { @@ -1907,7 +1882,7 @@ WalletDB.prototype.revert = async function revert(target) { */ WalletDB.prototype.addBlock = async function addBlock(entry, txs) { - let unlock = await this.txLock.lock(); + const unlock = await this.txLock.lock(); try { return await this._addBlock(entry, txs); } finally { @@ -1923,10 +1898,9 @@ WalletDB.prototype.addBlock = async function addBlock(entry, txs) { * @returns {Promise} */ -WalletDB.prototype._addBlock = async function addBlock(entry, txs) { - let tip = BlockMeta.fromEntry(entry); +WalletDB.prototype._addBlock = async function _addBlock(entry, txs) { + const tip = BlockMeta.fromEntry(entry); let total = 0; - let tx; if (tip.height < this.state.height) { this.logger.warning( @@ -1955,7 +1929,7 @@ WalletDB.prototype._addBlock = async function addBlock(entry, txs) { return total; } - for (tx of txs) { + for (const tx of txs) { if (await this._insert(tx, tip)) total++; } @@ -1976,7 +1950,7 @@ WalletDB.prototype._addBlock = async function addBlock(entry, txs) { */ WalletDB.prototype.removeBlock = async function removeBlock(entry) { - let unlock = await this.txLock.lock(); + const unlock = await this.txLock.lock(); try { return await this._removeBlock(entry); } finally { @@ -1991,9 +1965,8 @@ WalletDB.prototype.removeBlock = async function removeBlock(entry) { * @returns {Promise} */ -WalletDB.prototype._removeBlock = async function removeBlock(entry) { - let tip = BlockMeta.fromEntry(entry); - let prev, block; +WalletDB.prototype._removeBlock = async function _removeBlock(entry) { + const tip = BlockMeta.fromEntry(entry); if (tip.height > this.state.height) { this.logger.warning( @@ -2005,21 +1978,23 @@ WalletDB.prototype._removeBlock = async function removeBlock(entry) { if (tip.height !== this.state.height) throw new Error('WDB: Bad disconnection (height mismatch).'); - prev = await this.getBlock(tip.height - 1); + const prev = await this.getBlock(tip.height - 1); if (!prev) throw new Error('WDB: Bad disconnection (no previous block).'); // Get the map of txids->wids. - block = await this.getBlockMap(tip.height); + const block = await this.getBlockMap(tip.height); if (!block) { await this.syncState(prev); return 0; } - for (let i = block.txs.length - 1; i >= 0; i--) { - let tx = block.txs[i]; + const txs = block.toArray(); + + for (let i = txs.length - 1; i >= 0; i--) { + const tx = txs[i]; await this._unconfirm(tx); } @@ -2027,9 +2002,9 @@ WalletDB.prototype._removeBlock = async function removeBlock(entry) { await this.syncState(prev); this.logger.warning('Disconnected wallet block %s (tx=%d).', - util.revHex(tip.hash), block.txs.length); + util.revHex(tip.hash), block.txs.size); - return block.txs.length; + return block.txs.size; }; /** @@ -2063,7 +2038,7 @@ WalletDB.prototype.rescanBlock = async function rescanBlock(entry, txs) { */ WalletDB.prototype.addTX = async function addTX(tx) { - let unlock = await this.txLock.lock(); + const unlock = await this.txLock.lock(); try { return await this._insert(tx); @@ -2080,18 +2055,18 @@ WalletDB.prototype.addTX = async function addTX(tx) { * @returns {Promise} */ -WalletDB.prototype._insert = async function insert(tx, block) { - let wids = await this.getWalletsByTX(tx); +WalletDB.prototype._insert = async function _insert(tx, block) { + const wids = await this.getWalletsByTX(tx); let result = false; assert(!tx.mutable, 'WDB: Cannot add mutable TX.'); if (!wids) - return; + return null; this.logger.info( 'Incoming transaction for %d wallets in WalletDB (%s).', - wids.length, tx.txid()); + wids.size, tx.txid()); // If this is our first transaction // in a block, set the start block here. @@ -2100,8 +2075,8 @@ WalletDB.prototype._insert = async function insert(tx, block) { // Insert the transaction // into every matching wallet. - for (let wid of wids) { - let wallet = await this.get(wid); + for (const wid of wids) { + const wallet = await this.get(wid); assert(wallet); @@ -2114,7 +2089,7 @@ WalletDB.prototype._insert = async function insert(tx, block) { } if (!result) - return; + return null; return wids; }; @@ -2127,9 +2102,9 @@ WalletDB.prototype._insert = async function insert(tx, block) { * @returns {Promise} */ -WalletDB.prototype._unconfirm = async function unconfirm(tx) { - for (let wid of tx.wids) { - let wallet = await this.get(wid); +WalletDB.prototype._unconfirm = async function _unconfirm(tx) { + for (const wid of tx.wids) { + const wallet = await this.get(wid); assert(wallet); await wallet.unconfirm(tx.hash); } @@ -2142,7 +2117,7 @@ WalletDB.prototype._unconfirm = async function unconfirm(tx) { */ WalletDB.prototype.resetChain = async function resetChain(entry) { - let unlock = await this.txLock.lock(); + const unlock = await this.txLock.lock(); try { return await this._resetChain(entry); } finally { @@ -2157,7 +2132,7 @@ WalletDB.prototype.resetChain = async function resetChain(entry) { * @returns {Promise} */ -WalletDB.prototype._resetChain = async function resetChain(entry) { +WalletDB.prototype._resetChain = async function _resetChain(entry) { if (entry.height > this.state.height) throw new Error('WDB: Bad reset height.'); @@ -2183,7 +2158,9 @@ function WalletOptions(options) { this.network = Network.primary; this.logger = Logger.global; + this.workers = null; this.client = null; + this.feeRate = 0; this.prefix = null; this.location = null; @@ -2230,11 +2207,21 @@ WalletOptions.prototype.fromOptions = function fromOptions(options) { this.logger = options.logger; } + if (options.workers != null) { + assert(typeof options.workers === 'object'); + this.workers = options.workers; + } + if (options.client != null) { assert(typeof options.client === 'object'); this.client = options.client; } + if (options.feeRate != null) { + assert(util.isU64(options.feeRate)); + this.feeRate = options.feeRate; + } + if (options.prefix != null) { assert(typeof options.prefix === 'string'); this.prefix = options.prefix; @@ -2252,12 +2239,12 @@ WalletOptions.prototype.fromOptions = function fromOptions(options) { } if (options.maxFiles != null) { - assert(util.isNumber(options.maxFiles)); + assert(util.isU32(options.maxFiles)); this.maxFiles = options.maxFiles; } if (options.cacheSize != null) { - assert(util.isNumber(options.cacheSize)); + assert(util.isU64(options.cacheSize)); this.cacheSize = options.cacheSize; } @@ -2340,14 +2327,6 @@ WalletOptions.fromOptions = function fromOptions(options) { return new WalletOptions().fromOptions(options); }; -/* - * Helpers - */ - -function cmp(a, b) { - return a - b; -} - /* * Expose */ diff --git a/lib/wallet/walletkey.js b/lib/wallet/walletkey.js index 215692c64..921523393 100644 --- a/lib/wallet/walletkey.js +++ b/lib/wallet/walletkey.js @@ -7,7 +7,6 @@ 'use strict'; -const util = require('../utils/util'); const Address = require('../primitives/address'); const KeyRing = require('../primitives/keyring'); const Path = require('./path'); @@ -35,7 +34,7 @@ function WalletKey(options, network) { this.index = -1; } -util.inherits(WalletKey, KeyRing); +Object.setPrototypeOf(WalletKey.prototype, KeyRing.prototype); /** * Instantiate key ring from options. @@ -262,7 +261,7 @@ WalletKey.fromRing = function fromRing(account, ring) { */ WalletKey.prototype.toPath = function toPath() { - let path = new Path(); + const path = new Path(); path.id = this.id; path.wid = this.wid; diff --git a/lib/workers/child-browser.js b/lib/workers/child-browser.js index aac029c12..8e10f85d2 100644 --- a/lib/workers/child-browser.js +++ b/lib/workers/child-browser.js @@ -8,7 +8,6 @@ const assert = require('assert'); const EventEmitter = require('events'); -const util = require('../utils/util'); /** * Represents a child process. @@ -27,7 +26,7 @@ function Child(file) { this.init(file); } -util.inherits(Child, EventEmitter); +Object.setPrototypeOf(Child.prototype, EventEmitter.prototype); /** * Test whether child process support is available. diff --git a/lib/workers/child.js b/lib/workers/child.js index 67dcf9ba8..f6df990d2 100644 --- a/lib/workers/child.js +++ b/lib/workers/child.js @@ -9,7 +9,6 @@ const EventEmitter = require('events'); const path = require('path'); const cp = require('child_process'); -const util = require('../utils/util'); const children = new Set(); let exitBound = false; @@ -33,7 +32,7 @@ function Child(file) { this.init(file); } -util.inherits(Child, EventEmitter); +Object.setPrototypeOf(Child.prototype, EventEmitter.prototype); /** * Test whether child process support is available. @@ -51,9 +50,9 @@ Child.hasSupport = function hasSupport() { */ Child.prototype.init = function init(file) { - let bin = process.argv[0]; - let filename = path.resolve(__dirname, file); - let options = { stdio: 'pipe', env: process.env }; + const bin = process.argv[0]; + const filename = path.resolve(__dirname, file); + const options = { stdio: 'pipe', env: process.env }; this.child = cp.spawn(bin, [filename], options); @@ -66,16 +65,11 @@ Child.prototype.init = function init(file) { this.emit('error', err); }); - this.child.on('exit', (code, signal) => { + this.child.once('exit', (code, signal) => { children.delete(this); this.emit('exit', code == null ? -1 : code, signal); }); - this.child.on('close', () => { - children.delete(this); - this.emit('exit', -1, null); - }); - this.child.stdin.on('error', (err) => { this.emit('error', err); }); @@ -123,7 +117,7 @@ function bindExit() { exitBound = true; listenExit(() => { - for (let child of children) + for (const child of children) child.destroy(); }); } @@ -135,23 +129,23 @@ function bindExit() { */ function listenExit(handler) { - let onSighup = () => { + const onSighup = () => { process.exit(1 | 0x80); }; - let onSigint = () => { + const onSigint = () => { process.exit(2 | 0x80); }; - let onSigterm = () => { + const onSigterm = () => { process.exit(15 | 0x80); }; - let onError = (err) => { + const onError = (err) => { if (err && err.stack) - console.error(err.stack + ''); + console.error(String(err.stack)); else - console.error(err + ''); + console.error(String(err)); process.exit(1); }; diff --git a/lib/workers/framer.js b/lib/workers/framer.js index d4b7303e5..720375b22 100644 --- a/lib/workers/framer.js +++ b/lib/workers/framer.js @@ -20,23 +20,22 @@ function Framer() { return new Framer(); } -Framer.prototype.packet = function _packet(packet) { - let size = 10 + packet.getSize(); - let bw = new StaticWriter(size); - let data; +Framer.prototype.packet = function packet(payload) { + const size = 10 + payload.getSize(); + const bw = new StaticWriter(size); - bw.writeU32(packet.id); - bw.writeU8(packet.cmd); + bw.writeU32(payload.id); + bw.writeU8(payload.cmd); bw.seek(4); - packet.toWriter(bw); + payload.toWriter(bw); bw.writeU8(0x0a); - data = bw.render(); - data.writeUInt32LE(data.length - 10, 5, true); + const msg = bw.render(); + msg.writeUInt32LE(msg.length - 10, 5, true); - return data; + return msg; }; /* diff --git a/lib/workers/jobs.js b/lib/workers/jobs.js index ff39037ce..5da2aec48 100644 --- a/lib/workers/jobs.js +++ b/lib/workers/jobs.js @@ -7,8 +7,8 @@ 'use strict'; const secp256k1 = require('../crypto/secp256k1'); -const scrypt = require('../crypto/scrypt'); -const mine = require('../mining/mine'); +const {derive} = require('../crypto/scrypt'); +const hashcash = require('../mining/mine'); const packets = require('./packets'); /** @@ -114,7 +114,7 @@ jobs.checkInput = function checkInput(tx, index, coin, flags) { */ jobs.sign = function sign(tx, ring, type) { - let total = tx.sign(ring, type); + const total = tx.sign(ring, type); return packets.SignResultPacket.fromTX(tx, total); }; @@ -129,7 +129,7 @@ jobs.sign = function sign(tx, ring, type) { */ jobs.signInput = function signInput(tx, index, coin, ring, type) { - let result = tx.signInput(tx, index, coin, ring, type); + const result = tx.signInput(tx, index, coin, ring, type); return packets.SignInputResultPacket.fromTX(tx, index, result); }; @@ -142,7 +142,7 @@ jobs.signInput = function signInput(tx, index, coin, ring, type) { */ jobs.ecVerify = function ecVerify(msg, sig, key) { - let result = secp256k1.verify(msg, sig, key); + const result = secp256k1.verify(msg, sig, key); return new packets.ECVerifyResultPacket(result); }; @@ -156,7 +156,7 @@ jobs.ecVerify = function ecVerify(msg, sig, key) { */ jobs.ecSign = function ecSign(msg, key) { - let sig = secp256k1.sign(msg, key); + const sig = secp256k1.sign(msg, key); return new packets.ECSignResultPacket(sig); }; @@ -169,8 +169,8 @@ jobs.ecSign = function ecSign(msg, key) { * @returns {Number} */ -jobs.mine = function _mine(data, target, min, max) { - let nonce = mine(data, target, min, max); +jobs.mine = function mine(data, target, min, max) { + const nonce = hashcash(data, target, min, max); return new packets.MineResultPacket(nonce); }; @@ -186,7 +186,7 @@ jobs.mine = function _mine(data, target, min, max) { * @returns {Buffer} */ -jobs.scrypt = function _scrypt(passwd, salt, N, r, p, len) { - let key = scrypt.derive(passwd, salt, N, r, p, len); +jobs.scrypt = function scrypt(passwd, salt, N, r, p, len) { + const key = derive(passwd, salt, N, r, p, len); return new packets.ScryptResultPacket(key); }; diff --git a/lib/workers/master.js b/lib/workers/master.js index b48c5174a..9cc109f60 100644 --- a/lib/workers/master.js +++ b/lib/workers/master.js @@ -38,7 +38,7 @@ function Master() { this.init(); } -util.inherits(Master, EventEmitter); +Object.setPrototypeOf(Master.prototype, EventEmitter.prototype); /** * Initialize master. Bind events. @@ -133,7 +133,7 @@ Master.prototype.destroy = function destroy() { */ Master.prototype.log = function log(...items) { - let text = util.format(items, this.color); + const text = util.format(items, this.color); this.send(new packets.LogPacket(text)); }; diff --git a/lib/workers/packets.js b/lib/workers/packets.js index 6721667c8..814663e50 100644 --- a/lib/workers/packets.js +++ b/lib/workers/packets.js @@ -11,7 +11,6 @@ */ const assert = require('assert'); -const util = require('../utils/util'); const BufferReader = require('../utils/reader'); const encoding = require('../utils/encoding'); const Script = require('../script/script'); @@ -21,7 +20,7 @@ const MTX = require('../primitives/mtx'); const TX = require('../primitives/tx'); const KeyRing = require('../primitives/keyring'); const CoinView = require('../coins/coinview'); -const {ScriptError} = require('../script/common'); +const ScriptError = require('../script/scripterror'); /* * Constants @@ -79,7 +78,7 @@ function EnvPacket(env) { this.json = JSON.stringify(this.env); } -util.inherits(EnvPacket, Packet); +Object.setPrototypeOf(EnvPacket.prototype, Packet.prototype); EnvPacket.prototype.cmd = packetTypes.ENV; @@ -92,8 +91,8 @@ EnvPacket.prototype.toWriter = function toWriter(bw) { }; EnvPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new EnvPacket(); + const br = new BufferReader(data, true); + const packet = new EnvPacket(); packet.json = br.readVarString('utf8'); packet.env = JSON.parse(packet.json); return packet; @@ -110,7 +109,7 @@ function EventPacket(items) { this.json = JSON.stringify(this.items); } -util.inherits(EventPacket, Packet); +Object.setPrototypeOf(EventPacket.prototype, Packet.prototype); EventPacket.prototype.cmd = packetTypes.EVENT; @@ -123,8 +122,8 @@ EventPacket.prototype.toWriter = function toWriter(bw) { }; EventPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new EventPacket(); + const br = new BufferReader(data, true); + const packet = new EventPacket(); packet.json = br.readVarString('utf8'); packet.items = JSON.parse(packet.json); return packet; @@ -140,7 +139,7 @@ function LogPacket(text) { this.text = text || ''; } -util.inherits(LogPacket, Packet); +Object.setPrototypeOf(LogPacket.prototype, Packet.prototype); LogPacket.prototype.cmd = packetTypes.LOG; @@ -153,8 +152,8 @@ LogPacket.prototype.toWriter = function toWriter(bw) { }; LogPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new LogPacket(); + const br = new BufferReader(data, true); + const packet = new LogPacket(); packet.text = br.readVarString('utf8'); return packet; }; @@ -169,15 +168,15 @@ function ErrorPacket(error) { this.error = error || new Error(); } -util.inherits(ErrorPacket, Packet); +Object.setPrototypeOf(ErrorPacket.prototype, Packet.prototype); ErrorPacket.prototype.cmd = packetTypes.ERROR; ErrorPacket.prototype.getSize = function getSize() { let size = 0; - size += encoding.sizeVarString(this.error.message + '', 'utf8'); - size += encoding.sizeVarString(this.error.stack + '', 'utf8'); + size += encoding.sizeVarString(String(this.error.message), 'utf8'); + size += encoding.sizeVarString(String(this.error.stack), 'utf8'); size += encoding.sizeVarString(this.error.type || '', 'utf8'); switch (typeof this.error.code) { @@ -198,14 +197,14 @@ ErrorPacket.prototype.getSize = function getSize() { }; ErrorPacket.prototype.toWriter = function toWriter(bw) { - bw.writeVarString(this.error.message + '', 'utf8'); - bw.writeVarString(this.error.stack + '', 'utf8'); + bw.writeVarString(String(this.error.message), 'utf8'); + bw.writeVarString(String(this.error.stack), 'utf8'); bw.writeVarString(this.error.type || '', 'utf8'); switch (typeof this.error.code) { case 'number': bw.writeU8(2); - bw.write32(this.error.code); + bw.writeI32(this.error.code); break; case 'string': bw.writeU8(1); @@ -218,8 +217,8 @@ ErrorPacket.prototype.toWriter = function toWriter(bw) { }; ErrorPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new ErrorPacket(); + const br = new BufferReader(data, true); + const packet = new ErrorPacket(); packet.error.message = br.readVarString('utf8'); packet.error.stack = br.readVarString('utf8'); @@ -227,7 +226,7 @@ ErrorPacket.fromRaw = function fromRaw(data) { switch (br.readU8()) { case 2: - packet.error.code = br.read32(); + packet.error.code = br.readI32(); break; case 1: packet.error.code = br.readVarString('utf8'); @@ -249,10 +248,17 @@ function ErrorResultPacket(error) { ErrorPacket.call(this, error); } -util.inherits(ErrorResultPacket, ErrorPacket); +Object.setPrototypeOf(ErrorResultPacket.prototype, ErrorPacket.prototype); ErrorResultPacket.prototype.cmd = packetTypes.ERRORRESULT; +ErrorResultPacket.fromRaw = function fromRaw(data) { + const packet = new ErrorResultPacket(); + const p = ErrorPacket.fromRaw(data); + packet.error = p.error; + return packet; +}; + /** * CheckPacket * @constructor @@ -265,7 +271,7 @@ function CheckPacket(tx, view, flags) { this.flags = flags != null ? flags : null; } -util.inherits(CheckPacket, Packet); +Object.setPrototypeOf(CheckPacket.prototype, Packet.prototype); CheckPacket.prototype.cmd = packetTypes.CHECK; @@ -276,16 +282,16 @@ CheckPacket.prototype.getSize = function getSize() { CheckPacket.prototype.toWriter = function toWriter(bw) { this.tx.toWriter(bw); this.view.toWriter(bw, this.tx); - bw.write32(this.flags != null ? this.flags : -1); + bw.writeI32(this.flags != null ? this.flags : -1); }; CheckPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new CheckPacket(); + const br = new BufferReader(data, true); + const packet = new CheckPacket(); packet.tx = TX.fromReader(br); packet.view = CoinView.fromReader(br, packet.tx); - packet.flags = br.read32(); + packet.flags = br.readI32(); if (packet.flags === -1) packet.flags = null; @@ -303,12 +309,12 @@ function CheckResultPacket(error) { this.error = error || null; } -util.inherits(CheckResultPacket, Packet); +Object.setPrototypeOf(CheckResultPacket.prototype, Packet.prototype); CheckResultPacket.prototype.cmd = packetTypes.CHECKRESULT; CheckResultPacket.prototype.getSize = function getSize() { - let err = this.error; + const err = this.error; let size = 0; if (!err) { @@ -319,7 +325,7 @@ CheckResultPacket.prototype.getSize = function getSize() { size += 1; size += encoding.sizeVarString(err.code, 'utf8'); size += encoding.sizeVarString(err.message, 'utf8'); - size += encoding.sizeVarString(err.stack + '', 'utf8'); + size += encoding.sizeVarString(String(err.stack), 'utf8'); size += 1; size += 4; @@ -327,7 +333,7 @@ CheckResultPacket.prototype.getSize = function getSize() { }; CheckResultPacket.prototype.toWriter = function toWriter(bw) { - let err = this.error; + const err = this.error; if (!err) { bw.writeU8(0); @@ -337,20 +343,19 @@ CheckResultPacket.prototype.toWriter = function toWriter(bw) { bw.writeU8(1); bw.writeVarString(err.code, 'utf8'); bw.writeVarString(err.message, 'utf8'); - bw.writeVarString(err.stack + '', 'utf8'); + bw.writeVarString(String(err.stack), 'utf8'); bw.writeU8(err.op === -1 ? 0xff : err.op); bw.writeU32(err.ip === -1 ? 0xffffffff : err.ip); }; CheckResultPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new CheckResultPacket(); - let err; + const br = new BufferReader(data, true); + const packet = new CheckResultPacket(); if (br.readU8() === 0) return packet; - err = new ScriptError(''); + const err = new ScriptError(''); err.code = br.readVarString('utf8'); err.message = br.readVarString('utf8'); err.stack = br.readVarString('utf8'); @@ -380,7 +385,7 @@ function SignPacket(tx, rings, type) { this.type = type != null ? type : 1; } -util.inherits(SignPacket, Packet); +Object.setPrototypeOf(SignPacket.prototype, Packet.prototype); SignPacket.prototype.cmd = packetTypes.SIGN; @@ -391,7 +396,7 @@ SignPacket.prototype.getSize = function getSize() { size += this.tx.view.getSize(this.tx); size += encoding.sizeVarint(this.rings.length); - for (let ring of this.rings) + for (const ring of this.rings) size += ring.getSize(); size += 1; @@ -405,24 +410,23 @@ SignPacket.prototype.toWriter = function toWriter(bw) { bw.writeVarint(this.rings.length); - for (let ring of this.rings) + for (const ring of this.rings) ring.toWriter(bw); bw.writeU8(this.type); }; SignPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new SignPacket(); - let count; + const br = new BufferReader(data, true); + const packet = new SignPacket(); packet.tx = MTX.fromReader(br); packet.tx.view.fromReader(br, packet.tx); - count = br.readVarint(); + const count = br.readVarint(); for (let i = 0; i < count; i++) { - let ring = KeyRing.fromReader(br); + const ring = KeyRing.fromReader(br); packet.rings.push(ring); } @@ -443,14 +447,14 @@ function SignResultPacket(total, witness, script) { this.witness = witness || []; } -util.inherits(SignResultPacket, Packet); +Object.setPrototypeOf(SignResultPacket.prototype, Packet.prototype); SignResultPacket.prototype.cmd = packetTypes.SIGNRESULT; SignResultPacket.fromTX = function fromTX(tx, total) { - let packet = new SignResultPacket(total); + const packet = new SignResultPacket(total); - for (let input of tx.inputs) { + for (const input of tx.inputs) { packet.script.push(input.script); packet.witness.push(input.witness); } @@ -465,8 +469,8 @@ SignResultPacket.prototype.getSize = function getSize() { size += encoding.sizeVarint(this.script.length); for (let i = 0; i < this.script.length; i++) { - let script = this.script[i]; - let witness = this.witness[i]; + const script = this.script[i]; + const witness = this.witness[i]; size += script.getVarSize(); size += witness.getVarSize(); } @@ -491,20 +495,19 @@ SignResultPacket.prototype.inject = function inject(tx) { assert(this.witness.length === tx.inputs.length); for (let i = 0; i < tx.inputs.length; i++) { - let input = tx.inputs[i]; + const input = tx.inputs[i]; input.script = this.script[i]; input.witness = this.witness[i]; } }; SignResultPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new SignResultPacket(); - let count; + const br = new BufferReader(data, true); + const packet = new SignResultPacket(); packet.total = br.readVarint(); - count = br.readVarint(); + const count = br.readVarint(); for (let i = 0; i < count; i++) { packet.script.push(Script.fromReader(br)); @@ -527,7 +530,7 @@ function CheckInputPacket(tx, index, coin, flags) { this.flags = flags != null ? flags : null; } -util.inherits(CheckInputPacket, Packet); +Object.setPrototypeOf(CheckInputPacket.prototype, Packet.prototype); CheckInputPacket.prototype.cmd = packetTypes.CHECKINPUT; @@ -546,12 +549,12 @@ CheckInputPacket.prototype.toWriter = function toWriter(bw) { bw.writeVarint(this.index); bw.writeVarint(this.coin.value); this.coin.script.toWriter(bw); - bw.write32(this.flags != null ? this.flags : -1); + bw.writeI32(this.flags != null ? this.flags : -1); }; CheckInputPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new CheckInputPacket(); + const br = new BufferReader(data, true); + const packet = new CheckInputPacket(); packet.tx = TX.fromReader(br); packet.index = br.readVarint(); @@ -560,7 +563,7 @@ CheckInputPacket.fromRaw = function fromRaw(data) { packet.coin.value = br.readVarint(); packet.coin.script.fromReader(br); - packet.flags = br.read32(); + packet.flags = br.readI32(); if (packet.flags === -1) packet.flags = null; @@ -577,13 +580,15 @@ function CheckInputResultPacket(error) { CheckResultPacket.call(this, error); } -util.inherits(CheckInputResultPacket, CheckResultPacket); +Object.setPrototypeOf( + CheckInputResultPacket.prototype, + CheckResultPacket.prototype); CheckInputResultPacket.prototype.cmd = packetTypes.CHECKINPUTRESULT; CheckInputResultPacket.fromRaw = function fromRaw(data) { - let p = CheckResultPacket.fromRaw(data); - let packet = new CheckInputResultPacket(); + const p = CheckResultPacket.fromRaw(data); + const packet = new CheckInputResultPacket(); packet.error = p.error; return packet; }; @@ -602,7 +607,7 @@ function SignInputPacket(tx, index, coin, ring, type) { this.type = type != null ? type : 1; } -util.inherits(SignInputPacket, Packet); +Object.setPrototypeOf(SignInputPacket.prototype, Packet.prototype); SignInputPacket.prototype.cmd = packetTypes.SIGNINPUT; @@ -627,8 +632,8 @@ SignInputPacket.prototype.toWriter = function toWriter(bw) { }; SignInputPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new SignInputPacket(); + const br = new BufferReader(data, true); + const packet = new SignInputPacket(); packet.tx = MTX.fromReader(br); packet.index = br.readVarint(); @@ -655,13 +660,13 @@ function SignInputResultPacket(value, witness, script) { this.witness = witness || null; } -util.inherits(SignInputResultPacket, Packet); +Object.setPrototypeOf(SignInputResultPacket.prototype, Packet.prototype); SignInputResultPacket.prototype.cmd = packetTypes.SIGNINPUTRESULT; SignInputResultPacket.fromTX = function fromTX(tx, i, value) { - let packet = new SignInputResultPacket(value); - let input = tx.inputs[i]; + const packet = new SignInputResultPacket(value); + const input = tx.inputs[i]; assert(input); @@ -682,22 +687,21 @@ SignInputResultPacket.prototype.toWriter = function toWriter(bw) { }; SignInputResultPacket.prototype.inject = function inject(tx, i) { - let input = tx.inputs[i]; + const input = tx.inputs[i]; assert(input); input.script = this.script; input.witness = this.witness; }; SignInputResultPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new SignInputResultPacket(); + const br = new BufferReader(data, true); + const packet = new SignInputResultPacket(); packet.value = br.readU8() === 1; packet.script = Script.fromReader(br); packet.witness = Witness.fromReader(br); return packet; }; - /** * ECVerifyPacket * @constructor @@ -710,7 +714,7 @@ function ECVerifyPacket(msg, sig, key) { this.key = key || null; } -util.inherits(ECVerifyPacket, Packet); +Object.setPrototypeOf(ECVerifyPacket.prototype, Packet.prototype); ECVerifyPacket.prototype.cmd = packetTypes.ECVERIFY; @@ -729,8 +733,8 @@ ECVerifyPacket.prototype.toWriter = function toWriter(bw) { }; ECVerifyPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new ECVerifyPacket(); + const br = new BufferReader(data, true); + const packet = new ECVerifyPacket(); packet.msg = br.readVarBytes(); packet.sig = br.readVarBytes(); packet.key = br.readVarBytes(); @@ -747,7 +751,7 @@ function ECVerifyResultPacket(value) { this.value = value; } -util.inherits(ECVerifyResultPacket, Packet); +Object.setPrototypeOf(ECVerifyResultPacket.prototype, Packet.prototype); ECVerifyResultPacket.prototype.cmd = packetTypes.ECVERIFYRESULT; @@ -760,8 +764,8 @@ ECVerifyResultPacket.prototype.toWriter = function toWriter(bw) { }; ECVerifyResultPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new ECVerifyResultPacket(); + const br = new BufferReader(data, true); + const packet = new ECVerifyResultPacket(); packet.value = br.readU8() === 1; return packet; }; @@ -777,7 +781,7 @@ function ECSignPacket(msg, key) { this.key = key || null; } -util.inherits(ECSignPacket, Packet); +Object.setPrototypeOf(ECSignPacket.prototype, Packet.prototype); ECSignPacket.prototype.cmd = packetTypes.ECSIGN; @@ -794,8 +798,8 @@ ECSignPacket.prototype.toWriter = function toWriter(bw) { }; ECSignPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new ECSignPacket(); + const br = new BufferReader(data, true); + const packet = new ECSignPacket(); packet.msg = br.readVarBytes(); packet.key = br.readVarBytes(); return packet; @@ -811,7 +815,7 @@ function ECSignResultPacket(sig) { this.sig = sig; } -util.inherits(ECSignResultPacket, Packet); +Object.setPrototypeOf(ECSignResultPacket.prototype, Packet.prototype); ECSignResultPacket.prototype.cmd = packetTypes.ECSIGNRESULT; @@ -824,8 +828,8 @@ ECSignResultPacket.prototype.toWriter = function toWriter(bw) { }; ECSignResultPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new ECSignResultPacket(); + const br = new BufferReader(data, true); + const packet = new ECSignResultPacket(); packet.sig = br.readVarBytes(); return packet; }; @@ -843,7 +847,7 @@ function MinePacket(data, target, min, max) { this.max = max != null ? max : -1; } -util.inherits(MinePacket, Packet); +Object.setPrototypeOf(MinePacket.prototype, Packet.prototype); MinePacket.prototype.cmd = packetTypes.MINE; @@ -859,8 +863,8 @@ MinePacket.prototype.toWriter = function toWriter(bw) { }; MinePacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new MinePacket(); + const br = new BufferReader(data, true); + const packet = new MinePacket(); packet.data = br.readBytes(80); packet.target = br.readBytes(32); packet.min = br.readU32(); @@ -878,7 +882,7 @@ function MineResultPacket(nonce) { this.nonce = nonce != null ? nonce : -1; } -util.inherits(MineResultPacket, Packet); +Object.setPrototypeOf(MineResultPacket.prototype, Packet.prototype); MineResultPacket.prototype.cmd = packetTypes.MINERESULT; @@ -891,8 +895,8 @@ MineResultPacket.prototype.toWriter = function toWriter(bw) { }; MineResultPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new MineResultPacket(); + const br = new BufferReader(data, true); + const packet = new MineResultPacket(); packet.nonce = br.readU32(); if ((packet.nonce >> 0) === -1) packet.nonce = -1; @@ -914,7 +918,7 @@ function ScryptPacket(passwd, salt, N, r, p, len) { this.len = len != null ? len : -1; } -util.inherits(ScryptPacket, Packet); +Object.setPrototypeOf(ScryptPacket.prototype, Packet.prototype); ScryptPacket.prototype.cmd = packetTypes.SCRYPT; @@ -936,8 +940,8 @@ ScryptPacket.prototype.toWriter = function toWriter(bw) { }; ScryptPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new ScryptPacket(); + const br = new BufferReader(data, true); + const packet = new ScryptPacket(); packet.passwd = br.readVarBytes(); packet.salt = br.readVarBytes(); packet.N = br.readU32(); @@ -957,7 +961,7 @@ function ScryptResultPacket(key) { this.key = key || null; } -util.inherits(ScryptResultPacket, Packet); +Object.setPrototypeOf(ScryptResultPacket.prototype, Packet.prototype); ScryptResultPacket.prototype.cmd = packetTypes.SCRYPTRESULT; @@ -970,8 +974,8 @@ ScryptResultPacket.prototype.toWriter = function toWriter(bw) { }; ScryptResultPacket.fromRaw = function fromRaw(data) { - let br = new BufferReader(data, true); - let packet = new ScryptResultPacket(); + const br = new BufferReader(data, true); + const packet = new ScryptResultPacket(); packet.key = br.readVarBytes(); return packet; }; diff --git a/lib/workers/parent-browser.js b/lib/workers/parent-browser.js index 5c811135d..2eb865e72 100644 --- a/lib/workers/parent-browser.js +++ b/lib/workers/parent-browser.js @@ -8,7 +8,6 @@ const assert = require('assert'); const EventEmitter = require('events'); -const util = require('../utils/util'); /** * Represents the parent process. @@ -26,7 +25,7 @@ function Parent() { this.init(); } -util.inherits(Parent, EventEmitter); +Object.setPrototypeOf(Parent.prototype, EventEmitter.prototype); /** * Initialize master (web workers). diff --git a/lib/workers/parent.js b/lib/workers/parent.js index 77dc6ed83..c08686809 100644 --- a/lib/workers/parent.js +++ b/lib/workers/parent.js @@ -7,7 +7,6 @@ 'use strict'; const EventEmitter = require('events'); -const util = require('../utils/util'); /** * Represents the parent process. @@ -24,7 +23,7 @@ function Parent() { this.init(); } -util.inherits(Parent, EventEmitter); +Object.setPrototypeOf(Parent.prototype, EventEmitter.prototype); /** * Initialize master (node.js). diff --git a/lib/workers/parser.js b/lib/workers/parser.js index 13cbb0129..26c21788c 100644 --- a/lib/workers/parser.js +++ b/lib/workers/parser.js @@ -9,7 +9,6 @@ const assert = require('assert'); const EventEmitter = require('events'); -const util = require('../utils/util'); const packets = require('./packets'); /** @@ -30,48 +29,45 @@ function Parser() { this.total = 0; } -util.inherits(Parser, EventEmitter); +Object.setPrototypeOf(Parser.prototype, EventEmitter.prototype); Parser.prototype.feed = function feed(data) { this.total += data.length; this.pending.push(data); while (this.total >= this.waiting) { - let chunk = this.read(this.waiting); + const chunk = this.read(this.waiting); this.parse(chunk); } }; Parser.prototype.read = function read(size) { - let pending, chunk, off, len; - assert(this.total >= size, 'Reading too much.'); if (size === 0) return Buffer.alloc(0); - pending = this.pending[0]; + const pending = this.pending[0]; if (pending.length > size) { - chunk = pending.slice(0, size); + const chunk = pending.slice(0, size); this.pending[0] = pending.slice(size); this.total -= chunk.length; return chunk; } if (pending.length === size) { - chunk = this.pending.shift(); + const chunk = this.pending.shift(); this.total -= chunk.length; return chunk; } - chunk = Buffer.allocUnsafe(size); - off = 0; - len = 0; + const chunk = Buffer.allocUnsafe(size); + let off = 0; while (off < chunk.length) { - pending = this.pending[0]; - len = pending.copy(chunk, off); + const pending = this.pending[0]; + const len = pending.copy(chunk, off); if (len === pending.length) this.pending.shift(); else @@ -79,7 +75,7 @@ Parser.prototype.read = function read(size) { off += len; } - assert.equal(off, chunk.length); + assert.strictEqual(off, chunk.length); this.total -= chunk.length; @@ -88,7 +84,6 @@ Parser.prototype.read = function read(size) { Parser.prototype.parse = function parse(data) { let header = this.header; - let packet; if (!header) { try { @@ -107,6 +102,7 @@ Parser.prototype.parse = function parse(data) { this.waiting = 9; this.header = null; + let packet; try { packet = this.parsePacket(header, data); } catch (e) { @@ -125,9 +121,9 @@ Parser.prototype.parse = function parse(data) { }; Parser.prototype.parseHeader = function parseHeader(data) { - let id = data.readUInt32LE(0, true); - let cmd = data.readUInt8(4, true); - let size = data.readUInt32LE(5, true); + const id = data.readUInt32LE(0, true); + const cmd = data.readUInt8(4, true); + const size = data.readUInt32LE(5, true); return new Header(id, cmd, size); }; diff --git a/lib/workers/workerpool.js b/lib/workers/workerpool.js index b289aa797..05ce36d8c 100644 --- a/lib/workers/workerpool.js +++ b/lib/workers/workerpool.js @@ -5,6 +5,8 @@ * https://github.com/bcoin-org/bcoin */ +/* eslint no-nested-ternary: "off" */ + 'use strict'; const assert = require('assert'); @@ -49,7 +51,7 @@ function WorkerPool(options) { this.set(options); } -util.inherits(WorkerPool, EventEmitter); +Object.setPrototypeOf(WorkerPool.prototype, EventEmitter.prototype); /** * Set worker pool options. @@ -66,14 +68,14 @@ WorkerPool.prototype.set = function set(options) { } if (options.size != null) { - assert(util.isNumber(options.size)); + assert(util.isU32(options.size)); assert(options.size > 0); this.size = options.size; } if (options.timeout != null) { - assert(util.isNumber(options.timeout)); - assert(options.timeout > 0); + assert(util.isInt(options.timeout)); + assert(options.timeout >= -1); this.timeout = options.timeout; } @@ -108,7 +110,7 @@ WorkerPool.prototype.close = async function close() { */ WorkerPool.prototype.spawn = function spawn(id) { - let child = new Worker(this.file); + const child = new Worker(this.file); child.id = id; @@ -144,7 +146,7 @@ WorkerPool.prototype.spawn = function spawn(id) { */ WorkerPool.prototype.alloc = function alloc() { - let id = this.uid++ % this.size; + const id = this.uid++ % this.size; if (!this.children.has(id)) this.children.set(id, this.spawn(id)); @@ -162,7 +164,7 @@ WorkerPool.prototype.alloc = function alloc() { WorkerPool.prototype.sendEvent = function sendEvent() { let result = true; - for (let child of this.children.values()) { + for (const child of this.children.values()) { if (!child.sendEvent.apply(child, arguments)) result = false; } @@ -175,7 +177,7 @@ WorkerPool.prototype.sendEvent = function sendEvent() { */ WorkerPool.prototype.destroy = function destroy() { - for (let child of this.children.values()) + for (const child of this.children.values()) child.destroy(); }; @@ -187,8 +189,6 @@ WorkerPool.prototype.destroy = function destroy() { */ WorkerPool.prototype.execute = function execute(packet, timeout) { - let child; - if (!this.enabled || !Child.hasSupport()) { return new Promise((resolve, reject) => { setImmediate(() => { @@ -207,7 +207,7 @@ WorkerPool.prototype.execute = function execute(packet, timeout) { if (!timeout) timeout = this.timeout; - child = this.alloc(); + const child = this.alloc(); return child.execute(packet, timeout); }; @@ -222,8 +222,8 @@ WorkerPool.prototype.execute = function execute(packet, timeout) { */ WorkerPool.prototype.check = async function check(tx, view, flags) { - let packet = new packets.CheckPacket(tx, view, flags); - let result = await this.execute(packet, -1); + const packet = new packets.CheckPacket(tx, view, flags); + const result = await this.execute(packet, -1); if (result.error) throw result.error; @@ -242,13 +242,12 @@ WorkerPool.prototype.check = async function check(tx, view, flags) { WorkerPool.prototype.sign = async function sign(tx, ring, type) { let rings = ring; - let packet, result; if (!Array.isArray(rings)) rings = [rings]; - packet = new packets.SignPacket(tx, rings, type); - result = await this.execute(packet, -1); + const packet = new packets.SignPacket(tx, rings, type); + const result = await this.execute(packet, -1); result.inject(tx); @@ -266,8 +265,8 @@ WorkerPool.prototype.sign = async function sign(tx, ring, type) { */ WorkerPool.prototype.checkInput = async function checkInput(tx, index, coin, flags) { - let packet = new packets.CheckInputPacket(tx, index, coin, flags); - let result = await this.execute(packet, -1); + const packet = new packets.CheckInputPacket(tx, index, coin, flags); + const result = await this.execute(packet, -1); if (result.error) throw result.error; @@ -287,8 +286,8 @@ WorkerPool.prototype.checkInput = async function checkInput(tx, index, coin, fla */ WorkerPool.prototype.signInput = async function signInput(tx, index, coin, ring, type) { - let packet = new packets.SignInputPacket(tx, index, coin, ring, type); - let result = await this.execute(packet, -1); + const packet = new packets.SignInputPacket(tx, index, coin, ring, type); + const result = await this.execute(packet, -1); result.inject(tx); return result.value; }; @@ -303,8 +302,8 @@ WorkerPool.prototype.signInput = async function signInput(tx, index, coin, ring, */ WorkerPool.prototype.ecVerify = async function ecVerify(msg, sig, key) { - let packet = new packets.ECVerifyPacket(msg, sig, key); - let result = await this.execute(packet, -1); + const packet = new packets.ECVerifyPacket(msg, sig, key); + const result = await this.execute(packet, -1); return result.value; }; @@ -317,8 +316,8 @@ WorkerPool.prototype.ecVerify = async function ecVerify(msg, sig, key) { */ WorkerPool.prototype.ecSign = async function ecSign(msg, key) { - let packet = new packets.ECSignPacket(msg, key); - let result = await this.execute(packet, -1); + const packet = new packets.ECSignPacket(msg, key); + const result = await this.execute(packet, -1); return result.sig; }; @@ -333,8 +332,8 @@ WorkerPool.prototype.ecSign = async function ecSign(msg, key) { */ WorkerPool.prototype.mine = async function mine(data, target, min, max) { - let packet = new packets.MinePacket(data, target, min, max); - let result = await this.execute(packet, -1); + const packet = new packets.MinePacket(data, target, min, max); + const result = await this.execute(packet, -1); return result.nonce; }; @@ -351,8 +350,8 @@ WorkerPool.prototype.mine = async function mine(data, target, min, max) { */ WorkerPool.prototype.scrypt = async function scrypt(passwd, salt, N, r, p, len) { - let packet = new packets.ScryptPacket(passwd, salt, N, r, p, len); - let result = await this.execute(packet, -1); + const packet = new packets.ScryptPacket(passwd, salt, N, r, p, len); + const result = await this.execute(packet, -1); return result.key; }; @@ -379,7 +378,7 @@ function Worker(file) { this.init(); } -util.inherits(Worker, EventEmitter); +Object.setPrototypeOf(Worker.prototype, EventEmitter.prototype); /** * Initialize worker. Bind to events. @@ -540,7 +539,7 @@ Worker.prototype.execute = function execute(packet, timeout) { */ Worker.prototype._execute = function _execute(packet, timeout, resolve, reject) { - let job = new PendingJob(this, packet.id, resolve, reject); + const job = new PendingJob(this, packet.id, resolve, reject); assert(!this.pending.has(packet.id), 'ID overflow.'); @@ -558,7 +557,7 @@ Worker.prototype._execute = function _execute(packet, timeout, resolve, reject) */ Worker.prototype.resolveJob = function resolveJob(id, result) { - let job = this.pending.get(id); + const job = this.pending.get(id); if (!job) throw new Error(`Job ${id} is not in progress.`); @@ -573,7 +572,7 @@ Worker.prototype.resolveJob = function resolveJob(id, result) { */ Worker.prototype.rejectJob = function rejectJob(id, err) { - let job = this.pending.get(id); + const job = this.pending.get(id); if (!job) throw new Error(`Job ${id} is not in progress.`); @@ -586,7 +585,7 @@ Worker.prototype.rejectJob = function rejectJob(id, err) { */ Worker.prototype.killJobs = function killJobs() { - for (let job of this.pending.values()) + for (const job of this.pending.values()) job.destroy(); }; @@ -635,7 +634,7 @@ PendingJob.prototype.destroy = function destroy() { */ PendingJob.prototype.cleanup = function cleanup() { - let job = this.job; + const job = this.job; assert(job, 'Already finished.'); @@ -658,7 +657,7 @@ PendingJob.prototype.cleanup = function cleanup() { */ PendingJob.prototype.resolve = function resolve(result) { - let job = this.cleanup(); + const job = this.cleanup(); job.resolve(result); }; @@ -668,7 +667,7 @@ PendingJob.prototype.resolve = function resolve(result) { */ PendingJob.prototype.reject = function reject(err) { - let job = this.cleanup(); + const job = this.cleanup(); job.reject(err); }; diff --git a/migrate/chaindb0to1.js b/migrate/chaindb0to1.js index 86db9e011..375363c69 100644 --- a/migrate/chaindb0to1.js +++ b/migrate/chaindb0to1.js @@ -19,53 +19,49 @@ const db = bcoin.ldb({ }); function makeKey(data) { - let height = data.readUInt32LE(1, true); - let key = Buffer.allocUnsafe(5); + const height = data.readUInt32LE(1, true); + const key = Buffer.allocUnsafe(5); key[0] = 0x48; key.writeUInt32BE(height, 1, true); return key; } async function checkVersion() { - let data, ver; - console.log('Checking version.'); - data = await db.get('V'); + const data = await db.get('V'); if (!data) return; - ver = data.readUInt32LE(0, true); + const ver = data.readUInt32LE(0, true); if (ver !== 0) throw Error(`DB is version ${ver}.`); } async function updateState() { - let data, hash, batch, ver, p; - console.log('Updating chain state.'); - data = await db.get('R'); + const data = await db.get('R'); if (!data || data.length < 32) throw new Error('No chain state.'); - hash = data.slice(0, 32); + const hash = data.slice(0, 32); - p = new BufferWriter(); + let p = new BufferWriter(); p.writeHash(hash); p.writeU64(0); p.writeU64(0); p.writeU64(0); p = p.render(); - batch = db.batch(); + const batch = db.batch(); batch.put('R', p); - ver = Buffer.allocUnsafe(4); + const ver = Buffer.allocUnsafe(4); ver.writeUInt32LE(1, 0, true); batch.put('V', ver); @@ -75,21 +71,20 @@ async function updateState() { } async function updateEndian() { - let batch = db.batch(); + const batch = db.batch(); let total = 0; - let iter, item; console.log('Updating endianness.'); console.log('Iterating...'); - iter = db.iterator({ + const iter = db.iterator({ gte: Buffer.from('4800000000', 'hex'), lte: Buffer.from('48ffffffff', 'hex'), values: true }); for (;;) { - item = await iter.next(); + const item = await iter.next(); if (!item) break; diff --git a/migrate/chaindb1to2.js b/migrate/chaindb1to2.js index 3792837e2..57babdd71 100644 --- a/migrate/chaindb1to2.js +++ b/migrate/chaindb1to2.js @@ -13,14 +13,13 @@ const Coin = require('../lib/primitives/coin'); const Output = require('../lib/primitives/output'); const LDB = require('../lib/db/ldb'); let file = process.argv[2]; -let options = {}; -let db, batch, index; +let batch; assert(typeof file === 'string', 'Please pass in a database path.'); file = file.replace(/\.ldb\/?$/, ''); -db = LDB({ +const db = LDB({ location: file, db: 'leveldb', compression: true, @@ -29,14 +28,14 @@ db = LDB({ bufferKeys: true }); -options = {}; +const options = {}; options.spv = process.argv.indexOf('--spv') !== -1; options.prune = process.argv.indexOf('--prune') !== -1; options.indexTX = process.argv.indexOf('--index-tx') !== -1; options.indexAddress = process.argv.indexOf('--index-address') !== -1; options.network = networks.main; -index = process.argv.indexOf('--network'); +const index = process.argv.indexOf('--network'); if (index !== -1) { options.network = networks[process.argv[index + 1]]; @@ -44,16 +43,14 @@ if (index !== -1) { } async function updateVersion() { - let data, ver; - console.log('Checking version.'); - data = await db.get('V'); + const data = await db.get('V'); if (!data) throw new Error('No DB version found!'); - ver = data.readUInt32LE(0, true); + let ver = data.readUInt32LE(0, true); if (ver !== 1) throw Error(`DB is version ${ver}.`); @@ -64,7 +61,7 @@ async function updateVersion() { } async function checkTipIndex() { - let keys = await db.keys({ + const keys = await db.keys({ gte: pair('p', encoding.ZERO_HASH), lte: pair('p', encoding.MAX_HASH) }); @@ -116,38 +113,37 @@ async function updateDeployments() { async function reserializeCoins() { let total = 0; - let i, iter, item, hash, old, coins, coin, output; - iter = db.iterator({ + const iter = db.iterator({ gte: pair('c', encoding.ZERO_HASH), lte: pair('c', encoding.MAX_HASH), values: true }); for (;;) { - item = await iter.next(); + const item = await iter.next(); if (!item) break; - hash = item.key.toString('hex', 1, 33); - old = OldCoins.fromRaw(item.value, hash); + const hash = item.key.toString('hex', 1, 33); + const old = OldCoins.fromRaw(item.value, hash); - coins = new Coins(); + const coins = new Coins(); coins.version = old.version; coins.hash = old.hash; coins.height = old.height; coins.coinbase = old.coinbase; - for (i = 0; i < old.outputs.length; i++) { - coin = old.get(i); + for (let i = 0; i < old.outputs.length; i++) { + const coin = old.get(i); if (!coin) { coins.outputs.push(null); continue; } - output = new Output(); + const output = new Output(); output.script = coin.script; output.value = coin.value; @@ -168,22 +164,21 @@ async function reserializeCoins() { async function reserializeUndo() { let total = 0; - let iter, item, br, undo; - iter = db.iterator({ + const iter = db.iterator({ gte: pair('u', encoding.ZERO_HASH), lte: pair('u', encoding.MAX_HASH), values: true }); for (;;) { - item = await iter.next(); + const item = await iter.next(); if (!item) break; - br = new BufferReader(item.value); - undo = new UndoCoins(); + const br = new BufferReader(item.value); + const undo = new UndoCoins(); while (br.left()) { undo.push(null); @@ -202,11 +197,11 @@ async function reserializeUndo() { function write(data, str, off) { if (Buffer.isBuffer(str)) return str.copy(data, off); - data.write(str, off, 'hex'); + return data.write(str, off, 'hex'); } function pair(prefix, hash) { - let key = Buffer.allocUnsafe(33); + const key = Buffer.allocUnsafe(33); if (typeof prefix === 'string') prefix = prefix.charCodeAt(0); key[0] = prefix; @@ -215,7 +210,7 @@ function pair(prefix, hash) { } function injectCoin(undo, coin) { - let output = new Output(); + const output = new Output(); output.value = coin.value; output.script = coin.script; @@ -227,7 +222,7 @@ function injectCoin(undo, coin) { } function defaultOptions() { - let bw = new BufferWriter(); + const bw = new BufferWriter(); let flags = 0; if (options.spv) @@ -252,13 +247,12 @@ function defaultOptions() { } function defaultDeployments() { - let bw = new BufferWriter(); - let i, deployment; + const bw = new BufferWriter(); bw.writeU8(options.network.deploys.length); - for (i = 0; i < options.network.deploys.length; i++) { - deployment = options.network.deploys[i]; + for (let i = 0; i < options.network.deploys.length; i++) { + const deployment = options.network.deploys[i]; bw.writeU8(deployment.bit); bw.writeU32(deployment.startTime); bw.writeU32(deployment.timeout); diff --git a/migrate/chaindb2to3.js b/migrate/chaindb2to3.js new file mode 100644 index 000000000..0600cdc89 --- /dev/null +++ b/migrate/chaindb2to3.js @@ -0,0 +1,706 @@ +'use strict'; + +if (process.argv.indexOf('-h') !== -1 + || process.argv.indexOf('--help') !== -1 + || process.argv.length < 3) { + console.error('Bcoin database migration (chaindb v2->v3).'); + console.error(''); + console.error('Usage:'); + console.error(' $ node migrate/chaindb2to3.js [database-path] [--prune]'); + console.error(''); + console.error('Note: use --prune to convert your database to a pruned DB'); + console.error('in the process. This results in a faster migration, but'); + console.error('a pruning of the chain.'); + process.exit(1); + throw new Error('Exit failed.'); +} + +const assert = require('assert'); +const encoding = require('../lib/utils/encoding'); +const co = require('../lib/utils/co'); +const util = require('../lib/utils/util'); +const digest = require('../lib/crypto/digest'); +const BN = require('../lib/crypto/bn'); +const StaticWriter = require('../lib/utils/staticwriter'); +const BufferReader = require('../lib/utils/reader'); +const OldCoins = require('./coins/coins'); +const OldUndoCoins = require('./coins/undocoins'); +const CoinEntry = require('../lib/coins/coinentry'); +const UndoCoins = require('../lib/coins/undocoins'); +const Block = require('../lib/primitives/block'); +const LDB = require('../lib/db/ldb'); +const LRU = require('../lib/utils/lru'); + +const file = process.argv[2].replace(/\.ldb\/?$/, ''); +const shouldPrune = process.argv.indexOf('--prune') !== -1; +let hasIndex = false; +let hasPruned = false; +let hasSPV = false; + +const db = LDB({ + location: file, + db: 'leveldb', + compression: true, + cacheSize: 32 << 20, + createIfMissing: false, + bufferKeys: true +}); + +// \0\0migrate +const JOURNAL_KEY = Buffer.from('00006d696772617465', 'hex'); +const MIGRATION_ID = 0; +const STATE_VERSION = -1; +const STATE_UNDO = 0; +const STATE_CLEANUP = 1; +const STATE_COINS = 2; +const STATE_ENTRY = 3; +const STATE_FINAL = 4; +const STATE_DONE = 5; + +const metaCache = new Map(); +const lruCache = new LRU(200000); + +function writeJournal(batch, state, hash) { + const data = Buffer.allocUnsafe(34); + + if (!hash) + hash = encoding.NULL_HASH; + + data[0] = MIGRATION_ID; + data[1] = state; + data.write(hash, 2, 'hex'); + + batch.put(JOURNAL_KEY, data); +} + +async function readJournal() { + const data = await db.get(JOURNAL_KEY); + + if (!data) + return [STATE_VERSION, encoding.NULL_HASH]; + + if (data[0] !== MIGRATION_ID) + throw new Error('Bad migration id.'); + + if (data.length !== 34) + throw new Error('Bad migration length.'); + + const state = data.readUInt8(1, true); + const hash = data.toString('hex', 2, 34); + + console.log('Reading journal.'); + console.log('Recovering from state %d.', state); + + return [state, hash]; +} + +async function updateVersion() { + const batch = db.batch(); + + console.log('Checking version.'); + + const verRaw = await db.get('V'); + + if (!verRaw) + throw new Error('No DB version found!'); + + const version = verRaw.readUInt32LE(0, true); + + if (version !== 2) + throw Error(`DB is version ${version}.`); + + // Set to uint32_max temporarily. + // This is to prevent bcoin from + // trying to access this chain. + const data = Buffer.allocUnsafe(4); + data.writeUInt32LE(-1 >>> 0, 0, true); + batch.put('V', data); + + writeJournal(batch, STATE_UNDO); + + console.log('Updating version.'); + + await batch.write(); + + return [STATE_UNDO, encoding.NULL_HASH]; +} + +async function reserializeUndo(hash) { + let tip = await getTip(); + const height = tip.height; + + if (hash !== encoding.NULL_HASH) + tip = await getEntry(hash); + + console.log('Reserializing undo coins from tip %s.', util.revHex(tip.hash)); + + let batch = db.batch(); + let pruning = false; + let total = 0; + let totalCoins = 0; + + while (tip.height !== 0 && !hasSPV) { + if (shouldPrune) { + if (tip.height < height - 288) { + console.log('Pruning block %s (%d).', + util.revHex(tip.hash), tip.height); + + batch.del(pair('u', tip.hash)); + batch.del(pair('b', tip.hash)); + + if (!pruning) { + console.log( + 'Reserialized %d undo records (%d coins).', + total, totalCoins); + writeJournal(batch, STATE_UNDO, tip.prevBlock); + await batch.write(); + metaCache.clear(); + batch = db.batch(); + pruning = true; + } + + tip = await getEntry(tip.prevBlock); + assert(tip); + continue; + } + } + + const undoData = await db.get(pair('u', tip.hash)); + const blockData = await db.get(pair('b', tip.hash)); + + if (!undoData) { + tip = await getEntry(tip.prevBlock); + assert(tip); + continue; + } + + if (!blockData) { + if (!hasPruned) + throw new Error(`Block not found: ${tip.hash}.`); + break; + } + + const block = Block.fromRaw(blockData); + const old = OldUndoCoins.fromRaw(undoData); + const undo = new UndoCoins(); + + console.log( + 'Reserializing coins for block %s (%d).', + util.revHex(tip.hash), tip.height); + + for (let i = block.txs.length - 1; i >= 1; i--) { + const tx = block.txs[i]; + for (let j = tx.inputs.length - 1; j >= 0; j--) { + const {prevout} = tx.inputs[j]; + const coin = old.items.pop(); + const output = coin.toOutput(); + + assert(coin); + + const [version, height, write] = await getMeta(coin, prevout); + + const item = new CoinEntry(); + item.version = version; + item.height = height; + item.coinbase = coin.coinbase; + item.output.script = output.script; + item.output.value = output.value; + item.spent = true; + item.raw = null; + + // Store an index of heights and versions for later. + const meta = [version, height]; + + if (write) { + const data = Buffer.allocUnsafe(8); + data.writeUInt32LE(version, 0, true); + data.writeUInt32LE(height, 4, true); + batch.put(pair(0x01, prevout.hash), data); + metaCache.set(prevout.hash, meta); + } + + if (!lruCache.has(prevout.hash)) + lruCache.set(prevout.hash, meta); + + undo.items.push(item); + } + } + + // We need to reverse everything. + undo.items.reverse(); + + totalCoins += undo.items.length; + + batch.put(pair('u', tip.hash), undo.toRaw()); + + if (++total % 100 === 0) { + console.log( + 'Reserialized %d undo records (%d coins).', + total, totalCoins); + writeJournal(batch, STATE_UNDO, tip.prevBlock); + await batch.write(); + metaCache.clear(); + batch = db.batch(); + } + + tip = await getEntry(tip.prevBlock); + } + + writeJournal(batch, STATE_CLEANUP); + await batch.write(); + + metaCache.clear(); + lruCache.reset(); + + console.log( + 'Reserialized %d undo records (%d coins).', + total, totalCoins); + + return [STATE_CLEANUP, encoding.NULL_HASH]; +} + +async function cleanupIndex() { + if (hasSPV) + return [STATE_COINS, encoding.NULL_HASH]; + + const iter = db.iterator({ + gte: pair(0x01, encoding.ZERO_HASH), + lte: pair(0x01, encoding.MAX_HASH), + keys: true + }); + + console.log('Removing txid->height undo index.'); + + let batch = db.batch(); + let total = 0; + + for (;;) { + const item = await iter.next(); + + if (!item) + break; + + batch.del(item.key); + + if (++total % 10000 === 0) { + console.log('Cleaned up %d undo records.', total); + writeJournal(batch, STATE_CLEANUP); + await batch.write(); + batch = db.batch(); + } + } + + writeJournal(batch, STATE_COINS); + await batch.write(); + + console.log('Cleaned up %d undo records.', total); + + return [STATE_COINS, encoding.NULL_HASH]; +} + +async function reserializeCoins(hash) { + if (hasSPV) + return [STATE_ENTRY, encoding.NULL_HASH]; + + const iter = db.iterator({ + gte: pair('c', hash), + lte: pair('c', encoding.MAX_HASH), + keys: true, + values: true + }); + + let start = true; + + if (hash !== encoding.NULL_HASH) { + const item = await iter.next(); + if (!item) + start = false; + } + + console.log('Reserializing coins from %s.', util.revHex(hash)); + + let batch = db.batch(); + let total = 0; + + while (start) { + const item = await iter.next(); + + if (!item) + break; + + if (item.key.length !== 33) + continue; + + const hash = item.key.toString('hex', 1, 33); + const old = OldCoins.fromRaw(item.value, hash); + + let update = false; + + for (let i = 0; i < old.outputs.length; i++) { + const coin = old.getCoin(i); + + if (!coin) + continue; + + const item = new CoinEntry(); + item.version = coin.version; + item.height = coin.height; + item.coinbase = coin.coinbase; + item.output.script = coin.script; + item.output.value = coin.value; + item.spent = false; + item.raw = null; + + batch.put(bpair('c', hash, i), item.toRaw()); + + if (++total % 10000 === 0) + update = true; + } + + batch.del(item.key); + + if (update) { + console.log('Reserialized %d coins.', total); + writeJournal(batch, STATE_COINS, hash); + await batch.write(); + batch = db.batch(); + } + } + + writeJournal(batch, STATE_ENTRY); + await batch.write(); + + console.log('Reserialized %d coins.', total); + + return [STATE_ENTRY, encoding.NULL_HASH]; +} + +async function reserializeEntries(hash) { + const iter = db.iterator({ + gte: pair('e', hash), + lte: pair('e', encoding.MAX_HASH), + values: true + }); + + let start = true; + + if (hash !== encoding.NULL_HASH) { + const item = await iter.next(); + if (!item) + start = false; + else + assert(item.key.equals(pair('e', hash))); + } + + console.log('Reserializing entries from %s.', util.revHex(hash)); + + const tip = await getTipHash(); + + let total = 0; + let batch = db.batch(); + + while (start) { + const item = await iter.next(); + + if (!item) + break; + + const entry = entryFromRaw(item.value); + const main = await isMainChain(entry, tip); + + batch.put(item.key, entryToRaw(entry, main)); + + if (++total % 100000 === 0) { + console.log('Reserialized %d entries.', total); + writeJournal(batch, STATE_ENTRY, entry.hash); + await batch.write(); + batch = db.batch(); + } + } + + writeJournal(batch, STATE_FINAL); + await batch.write(); + + console.log('Reserialized %d entries.', total); + + return [STATE_FINAL, encoding.NULL_HASH]; +} + +async function finalize() { + const batch = db.batch(); + const data = Buffer.allocUnsafe(4); + + data.writeUInt32LE(3, 0, true); + + batch.del(JOURNAL_KEY); + batch.put('V', data); + + // This has bugged me for a while. + batch.del(pair('n', encoding.ZERO_HASH)); + + if (shouldPrune) { + const data = await db.get('O'); + + assert(data); + + let flags = data.readUInt32LE(4, true); + flags |= 1 << 2; + + data.writeUInt32LE(flags, 4, true); + + batch.put('O', data); + } + + console.log('Finalizing database.'); + + await batch.write(); + + console.log('Compacting database...'); + + await db.compactRange(); + + return [STATE_DONE, encoding.NULL_HASH]; +} + +async function getMeta(coin, prevout) { + // Case 1: Undo coin is the last spend. + if (coin.height !== -1) { + assert(coin.version !== -1, 'Database corruption.'); + return [coin.version, coin.height, hasIndex ? false : true]; + } + + // Case 2: The item is still in the LRU cache. + const lruItem = lruCache.get(prevout.hash); + + if (lruItem) { + const [version, height] = lruItem; + return [version, height, false]; + } + + // Case 3: The database has a tx-index. We + // can just hit that instead of reindexing. + if (hasIndex) { + const txRaw = await db.get(pair('t', prevout.hash)); + assert(txRaw, 'Database corruption.'); + assert(txRaw[txRaw.length - 45] === 1); + const version = txRaw.readUInt32LE(0, true); + const height = txRaw.readUInt32LE(txRaw.length - 12, true); + return [version, height, false]; + } + + // Case 4: We have previously cached + // this coin's metadata, but it's not + // written yet. + const metaItem = metaCache.get(prevout.hash); + + if (metaItem) { + const [version, height] = metaItem; + return [version, height, false]; + } + + // Case 5: We have previously cached + // this coin's metadata, and it is + // written. + const metaRaw = await db.get(pair(0x01, prevout.hash)); + + if (metaRaw) { + const version = metaRaw.readUInt32LE(0, true); + const height = metaRaw.readUInt32LE(4, true); + return [version, height, false]; + } + + // Case 6: The coin's metadata is + // still in the top-level UTXO set. + const coinsRaw = await db.get(pair('c', prevout.hash)); + + // Case 7: We're pruned and are + // under the keepBlocks threshold. + // We don't have access to this + // data. Luckily, it appears that + // all historical transactions + // under height 182 are version 1, + // which means height is not + // necessary to determine CSV + // anyway. Just store the height + // as `1`. + if (!coinsRaw) { + assert(hasPruned, 'Database corruption.'); + return [1, 1, false]; + } + + const br = new BufferReader(coinsRaw); + const version = br.readVarint(); + const height = br.readU32(); + + return [version, height, true]; +} + +async function getTip() { + const tip = await getTipHash(); + return await getEntry(tip); +} + +async function getTipHash() { + const state = await db.get('R'); + assert(state); + return state.toString('hex', 0, 32); +} + +async function getEntry(hash) { + const data = await db.get(pair('e', hash)); + assert(data); + return entryFromRaw(data); +} + +async function isPruned() { + const data = await db.get('O'); + assert(data); + return (data.readUInt32LE(4) & 4) !== 0; +} + +async function isSPV() { + const data = await db.get('O'); + assert(data); + return (data.readUInt32LE(4) & 1) !== 0; +} + +async function isIndexed() { + const data = await db.get('O'); + assert(data); + return (data.readUInt32LE(4) & 8) !== 0; +} + +async function isMainChain(entry, tip) { + if (entry.hash === tip) + return true; + + if (await db.get(pair('n', entry.hash))) + return true; + + return false; +} + +function entryFromRaw(data) { + const br = new BufferReader(data, true); + const hash = digest.hash256(br.readBytes(80)); + + br.seek(-80); + + const entry = {}; + entry.hash = hash.toString('hex'); + entry.version = br.readU32(); + entry.prevBlock = br.readHash('hex'); + entry.merkleRoot = br.readHash('hex'); + entry.ts = br.readU32(); + entry.bits = br.readU32(); + entry.nonce = br.readU32(); + entry.height = br.readU32(); + entry.chainwork = new BN(br.readBytes(32), 'le'); + + return entry; +} + +function entryToRaw(entry, main) { + const bw = new StaticWriter(116 + 1); + + bw.writeU32(entry.version); + bw.writeHash(entry.prevBlock); + bw.writeHash(entry.merkleRoot); + bw.writeU32(entry.ts); + bw.writeU32(entry.bits); + bw.writeU32(entry.nonce); + bw.writeU32(entry.height); + bw.writeBytes(entry.chainwork.toArrayLike(Buffer, 'le', 32)); + bw.writeU8(main ? 1 : 0); + + return bw.render(); +} + +function write(data, str, off) { + if (Buffer.isBuffer(str)) + return str.copy(data, off); + return data.write(str, off, 'hex'); +} + +function pair(prefix, hash) { + const key = Buffer.allocUnsafe(33); + if (typeof prefix === 'string') + prefix = prefix.charCodeAt(0); + key[0] = prefix; + write(key, hash, 1); + return key; +} + +function bpair(prefix, hash, index) { + const key = Buffer.allocUnsafe(37); + if (typeof prefix === 'string') + prefix = prefix.charCodeAt(0); + key[0] = prefix; + write(key, hash, 1); + key.writeUInt32BE(index, 33, true); + return key; +} + +// Make eslint happy. +reserializeEntries; + +(async () => { + await db.open(); + + console.log('Opened %s.', file); + + if (await isSPV()) + hasSPV = true; + + if (await isPruned()) + hasPruned = true; + + if (await isIndexed()) + hasIndex = true; + + if (shouldPrune && hasPruned) + throw new Error('Database is already pruned.'); + + if (shouldPrune && hasSPV) + throw new Error('Database cannot be pruned due to SPV.'); + + console.log('Starting migration in 3 seconds...'); + console.log('If you crash you can start over.'); + + await co.timeout(3000); + + let [state, hash] = await readJournal(); + + if (state === STATE_VERSION) + [state, hash] = await updateVersion(); + + if (state === STATE_UNDO) + [state, hash] = await reserializeUndo(hash); + + if (state === STATE_CLEANUP) + [state, hash] = await cleanupIndex(); + + if (state === STATE_COINS) + [state, hash] = await reserializeCoins(hash); + + // if (state === STATE_ENTRY) + // [state, hash] = await reserializeEntries(hash); + + if (state === STATE_ENTRY) + [state, hash] = [STATE_FINAL, encoding.NULL_HASH]; + + if (state === STATE_FINAL) + [state, hash] = await finalize(); + + assert(state === STATE_DONE); + + console.log('Closing %s.', file); + + await db.close(); + + console.log('Migration complete.'); + process.exit(0); +})().catch((err) => { + console.error(err.stack); + process.exit(1); +}); diff --git a/migrate/coins-old.js b/migrate/coins-old.js index 45582b48b..6eda01198 100644 --- a/migrate/coins-old.js +++ b/migrate/coins-old.js @@ -4,6 +4,8 @@ * https://github.com/bcoin-org/bcoin */ +/* eslint-disable */ + 'use strict'; const assert = require('assert'); @@ -50,7 +52,7 @@ function Coins(options) { Coins.prototype.fromOptions = function fromOptions(options) { if (options.version != null) { - assert(util.isNumber(options.version)); + assert(util.isU32(options.version)); this.version = options.version; } @@ -60,7 +62,7 @@ Coins.prototype.fromOptions = function fromOptions(options) { } if (options.height != null) { - assert(util.isNumber(options.height)); + assert(util.isInt(options.height)); this.height = options.height; } @@ -131,12 +133,10 @@ Coins.prototype.has = function has(index) { */ Coins.prototype.get = function get(index) { - let coin; - if (index >= this.outputs.length) return; - coin = this.outputs[index]; + const coin = this.outputs[index]; if (!coin) return; @@ -151,7 +151,7 @@ Coins.prototype.get = function get(index) { */ Coins.prototype.spend = function spend(index) { - let coin = this.get(index); + const coin = this.get(index); if (!coin) return; @@ -168,10 +168,9 @@ Coins.prototype.spend = function spend(index) { Coins.prototype.size = function size() { let index = -1; - let i, output; - for (i = this.outputs.length - 1; i >= 0; i--) { - output = this.outputs[i]; + for (let i = this.outputs.length - 1; i >= 0; i--) { + const output = this.outputs[i]; if (output) { index = i; break; @@ -221,10 +220,9 @@ Coins.prototype.isEmpty = function isEmpty() { */ Coins.prototype.toRaw = function toRaw() { - let bw = new BufferWriter(); - let length = this.size(); - let len = Math.ceil(length / 8); - let i, output, bits, start, bit, oct, data; + const bw = new BufferWriter(); + const length = this.size(); + const len = Math.ceil(length / 8); // Return nothing if we're fully spent. if (length === 0) @@ -236,7 +234,7 @@ Coins.prototype.toRaw = function toRaw() { // Create the `bits` value: // (height | coinbase-flag). - bits = this.height << 1; + let bits = this.height << 1; // Append the coinbase bit. if (this.coinbase) @@ -259,12 +257,12 @@ Coins.prototype.toRaw = function toRaw() { // allocating a buffer. We mark the spents // after rendering the final buffer. bw.writeVarint(len); - start = bw.written; + const start = bw.offset; bw.fill(0, len); // Write the compressed outputs. - for (i = 0; i < length; i++) { - output = this.outputs[i]; + for (let i = 0; i < length; i++) { + const output = this.outputs[i]; if (!output) continue; @@ -274,18 +272,18 @@ Coins.prototype.toRaw = function toRaw() { // Render the buffer with all // zeroes in the spent field. - data = bw.render(); + const data = bw.render(); // Mark the spents in the spent field. // This is essentially a NOP for new coins. - for (i = 0; i < length; i++) { - output = this.outputs[i]; + for (let i = 0; i < length; i++) { + const output = this.outputs[i]; if (output) continue; - bit = i % 8; - oct = (i - bit) / 8; + const bit = i % 8; + let oct = (i - bit) / 8; oct += start; data[oct] |= 1 << (7 - bit); @@ -302,13 +300,12 @@ Coins.prototype.toRaw = function toRaw() { */ Coins.prototype.fromRaw = function fromRaw(data, hash, index) { - let br = new BufferReader(data); + const br = new BufferReader(data); let pos = 0; - let bits, len, start, bit, oct, spent, coin; this.version = br.readVarint(); - bits = br.readU32(); + const bits = br.readU32(); this.height = bits >>> 1; this.hash = hash; @@ -316,17 +313,17 @@ Coins.prototype.fromRaw = function fromRaw(data, hash, index) { // Mark the start of the spent field and // seek past it to avoid reading a buffer. - len = br.readVarint(); - start = br.offset; + const len = br.readVarint(); + const start = br.offset; br.seek(len); while (br.left()) { - bit = pos % 8; - oct = (pos - bit) / 8; + const bit = pos % 8; + let oct = (pos - bit) / 8; oct += start; // Read a single bit out of the spent field. - spent = data[oct] >>> (7 - bit); + let spent = data[oct] >>> (7 - bit); spent &= 1; // Already spent. @@ -338,7 +335,7 @@ Coins.prototype.fromRaw = function fromRaw(data, hash, index) { // Store the offset and size // in the compressed coin object. - coin = CoinEntry.fromReader(br); + const coin = CoinEntry.fromReader(br); this.outputs.push(coin); pos++; @@ -356,14 +353,13 @@ Coins.prototype.fromRaw = function fromRaw(data, hash, index) { */ Coins.parseCoin = function parseCoin(data, hash, index) { - let br = new BufferReader(data); - let coin = new Coin(); + const br = new BufferReader(data); + const coin = new Coin(); let pos = 0; - let bits, len, start, bit, oct, spent; coin.version = br.readVarint(); - bits = br.readU32(); + const bits = br.readU32(); coin.hash = hash; coin.index = index; @@ -373,17 +369,17 @@ Coins.parseCoin = function parseCoin(data, hash, index) { // Mark the start of the spent field and // seek past it to avoid reading a buffer. - len = br.readVarint(); - start = br.offset; + const len = br.readVarint(); + const start = br.offset; br.seek(len); while (br.left()) { - bit = pos % 8; - oct = (pos - bit) / 8; + const bit = pos % 8; + let oct = (pos - bit) / 8; oct += start; // Read a single bit out of the spent field. - spent = data[oct] >>> (7 - bit); + let spent = data[oct] >>> (7 - bit); spent &= 1; // We found our coin. @@ -425,15 +421,13 @@ Coins.fromRaw = function fromRaw(data, hash) { */ Coins.prototype.fromTX = function fromTX(tx) { - let i, output; - this.version = tx.version; this.hash = tx.hash('hex'); this.height = tx.height; this.coinbase = tx.isCoinbase(); - for (i = 0; i < tx.outputs.length; i++) { - output = tx.outputs[i]; + for (let i = 0; i < tx.outputs.length; i++) { + const output = tx.outputs[i]; if (output.script.isUnspendable()) { this.outputs.push(null); @@ -490,8 +484,7 @@ function CoinEntry() { */ CoinEntry.prototype.toCoin = function toCoin(coins, index) { - let coin = new Coin(); - let br; + const coin = new Coin(); // Load in all necessary properties // from the parent Coins object. @@ -507,7 +500,7 @@ CoinEntry.prototype.toCoin = function toCoin(coins, index) { return coin; } - br = new BufferReader(this.raw); + const br = new BufferReader(this.raw); // Seek to the coin's offset. br.seek(this.offset); @@ -525,8 +518,6 @@ CoinEntry.prototype.toCoin = function toCoin(coins, index) { */ CoinEntry.prototype.toWriter = function toWriter(bw) { - let raw; - if (this.output) { compress.script(this.output.script, bw); bw.writeVarint(this.output.value); @@ -539,7 +530,7 @@ CoinEntry.prototype.toWriter = function toWriter(bw) { // didn't use it, it's still in its // compressed form. Just write it back // as a buffer for speed. - raw = this.raw.slice(this.offset, this.offset + this.size); + const raw = this.raw.slice(this.offset, this.offset + this.size); bw.writeBytes(raw); }; @@ -551,7 +542,7 @@ CoinEntry.prototype.toWriter = function toWriter(bw) { */ CoinEntry.fromReader = function fromReader(br) { - let entry = new CoinEntry(); + const entry = new CoinEntry(); entry.offset = br.offset; entry.size = skipCoin(br); entry.raw = br.data; @@ -566,7 +557,7 @@ CoinEntry.fromReader = function fromReader(br) { */ CoinEntry.fromTX = function fromTX(tx, index) { - let entry = new CoinEntry(); + const entry = new CoinEntry(); entry.output = tx.outputs[index]; return entry; }; @@ -578,7 +569,7 @@ CoinEntry.fromTX = function fromTX(tx, index) { */ CoinEntry.fromCoin = function fromCoin(coin) { - let entry = new CoinEntry(); + const entry = new CoinEntry(); entry.output = new Output(); entry.output.script = coin.script; entry.output.value = coin.value; @@ -590,7 +581,7 @@ CoinEntry.fromCoin = function fromCoin(coin) { */ function skipCoin(br) { - let start = br.offset; + const start = br.offset; // Skip past the compressed scripts. switch (br.readU8()) { diff --git a/migrate/coins/coins.js b/migrate/coins/coins.js new file mode 100644 index 000000000..9aaf1c9b8 --- /dev/null +++ b/migrate/coins/coins.js @@ -0,0 +1,756 @@ +/*! + * coins.js - coins object for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +/* eslint-disable */ + +'use strict'; + +const assert = require('assert'); +const util = require('../../lib/utils/util'); +const Coin = require('../../lib/primitives/coin'); +const Output = require('../../lib/primitives/output'); +const BufferReader = require('../../lib/utils/reader'); +const StaticWriter = require('../../lib/utils/staticwriter'); +const encoding = require('../../lib/utils/encoding'); +const compressor = require('./compress'); +const compress = compressor.compress; +const decompress = compressor.decompress; + +/** + * Represents the outputs for a single transaction. + * @alias module:coins.Coins + * @constructor + * @param {Object?} options - Options object. + * @property {Hash} hash - Transaction hash. + * @property {Number} version - Transaction version. + * @property {Number} height - Transaction height (-1 if unconfirmed). + * @property {Boolean} coinbase - Whether the containing + * transaction is a coinbase. + * @property {CoinEntry[]} outputs - Coins. + */ + +function Coins(options) { + if (!(this instanceof Coins)) + return new Coins(options); + + this.version = 1; + this.hash = encoding.NULL_HASH; + this.height = -1; + this.coinbase = true; + this.outputs = []; + + if (options) + this.fromOptions(options); +} + +/** + * Inject properties from options object. + * @private + * @param {Object} options + */ + +Coins.prototype.fromOptions = function fromOptions(options) { + if (options.version != null) { + assert(util.isU32(options.version)); + this.version = options.version; + } + + if (options.hash) { + assert(typeof options.hash === 'string'); + this.hash = options.hash; + } + + if (options.height != null) { + assert(util.isInt(options.height)); + this.height = options.height; + } + + if (options.coinbase != null) { + assert(typeof options.coinbase === 'boolean'); + this.coinbase = options.coinbase; + } + + if (options.outputs) { + assert(Array.isArray(options.outputs)); + this.outputs = options.outputs; + this.cleanup(); + } + + return this; +}; + +/** + * Instantiate coins from options object. + * @param {Object} options + * @returns {Coins} + */ + +Coins.fromOptions = function fromOptions(options) { + return new Coins().fromOptions(options); +}; + +/** + * Add a single entry to the collection. + * @param {Number} index + * @param {CoinEntry} entry + */ + +Coins.prototype.add = function add(index, entry) { + assert(index >= 0); + + while (this.outputs.length <= index) + this.outputs.push(null); + + assert(!this.outputs[index]); + + this.outputs[index] = entry; +}; + +/** + * Add a single output to the collection. + * @param {Number} index + * @param {Output} output + */ + +Coins.prototype.addOutput = function addOutput(index, output) { + assert(!output.script.isUnspendable()); + this.add(index, CoinEntry.fromOutput(output)); +}; + +/** + * Add a single coin to the collection. + * @param {Coin} coin + */ + +Coins.prototype.addCoin = function addCoin(coin) { + assert(!coin.script.isUnspendable()); + this.add(coin.index, CoinEntry.fromCoin(coin)); +}; + +/** + * Test whether the collection has a coin. + * @param {Number} index + * @returns {Boolean} + */ + +Coins.prototype.has = function has(index) { + if (index >= this.outputs.length) + return false; + + return this.outputs[index] != null; +}; + +/** + * Test whether the collection + * has an unspent coin. + * @param {Number} index + * @returns {Boolean} + */ + +Coins.prototype.isUnspent = function isUnspent(index) { + if (index >= this.outputs.length) + return false; + + const output = this.outputs[index]; + + if (!output || output.spent) + return false; + + return true; +}; + +/** + * Get a coin entry. + * @param {Number} index + * @returns {CoinEntry} + */ + +Coins.prototype.get = function get(index) { + if (index >= this.outputs.length) + return; + + return this.outputs[index]; +}; + +/** + * Get an output. + * @param {Number} index + * @returns {Output} + */ + +Coins.prototype.getOutput = function getOutput(index) { + const entry = this.get(index); + + if (!entry) + return; + + return entry.toOutput(); +}; + +/** + * Get a coin. + * @param {Number} index + * @returns {Coin} + */ + +Coins.prototype.getCoin = function getCoin(index) { + const entry = this.get(index); + + if (!entry) + return; + + return entry.toCoin(this, index); +}; + +/** + * Spend a coin entry and return it. + * @param {Number} index + * @returns {CoinEntry} + */ + +Coins.prototype.spend = function spend(index) { + const entry = this.get(index); + + if (!entry || entry.spent) + return; + + entry.spent = true; + + return entry; +}; + +/** + * Remove a coin entry and return it. + * @param {Number} index + * @returns {CoinEntry} + */ + +Coins.prototype.remove = function remove(index) { + const entry = this.get(index); + + if (!entry) + return false; + + this.outputs[index] = null; + this.cleanup(); + + return entry; +}; + +/** + * Calculate unspent length of coins. + * @returns {Number} + */ + +Coins.prototype.length = function length() { + let len = this.outputs.length; + + while (len > 0 && !this.isUnspent(len - 1)) + len--; + + return len; +}; + +/** + * Cleanup spent outputs (remove pruned). + */ + +Coins.prototype.cleanup = function cleanup() { + let len = this.outputs.length; + + while (len > 0 && !this.outputs[len - 1]) + len--; + + this.outputs.length = len; +}; + +/** + * Test whether the coins are fully spent. + * @returns {Boolean} + */ + +Coins.prototype.isEmpty = function isEmpty() { + return this.length() === 0; +}; + +/* + * Coins serialization: + * version: varint + * height: uint32 + * header-code: varint + * bit 1: coinbase + * bit 2: first output unspent + * bit 3: second output unspent + * bit 4-32: spent-field size + * spent-field: bitfield (0=spent, 1=unspent) + * outputs (repeated): + * value: varint + * compressed-script: + * prefix: 0x00 = 20 byte pubkey hash + * 0x01 = 20 byte script hash + * 0x02-0x05 = 32 byte ec-key x-value + * 0x06-0x09 = reserved + * >=0x10 = varint-size + 10 | raw script + * data: script data, dictated by the prefix + * + * The compression below sacrifices some cpu in exchange + * for reduced size, but in some cases the use of varints + * actually increases speed (varint versions and values + * for example). We do as much compression as possible + * without sacrificing too much cpu. Value compression + * is intentionally excluded for now as it seems to be + * too much of a perf hit. Maybe when v8 optimizes + * non-smi arithmetic better we can enable it. + */ + +/** + * Calculate header code. + * @param {Number} len + * @param {Number} size + * @returns {Number} + */ + +Coins.prototype.header = function header(len, size) { + const first = this.isUnspent(0); + const second = this.isUnspent(1); + let offset = 0; + + // Throw if we're fully spent. + assert(len !== 0, 'Cannot serialize fully-spent coins.'); + + // First and second bits + // have a double meaning. + if (!first && !second) { + assert(size !== 0); + offset = 1; + } + + // Calculate header code. + let code = 8 * (size - offset); + + if (this.coinbase) + code += 1; + + if (first) + code += 2; + + if (second) + code += 4; + + return code; +}; + +/** + * Serialize the coins object. + * @returns {Buffer} + */ + +Coins.prototype.toRaw = function toRaw() { + const len = this.length(); + const size = Math.floor((len + 5) / 8); + const code = this.header(len, size); + const total = this.getSize(len, size, code); + const bw = new StaticWriter(total); + + // Write headers. + bw.writeVarint(this.version); + bw.writeU32(this.height); + bw.writeVarint(code); + + // Write the spent field. + for (let i = 0; i < size; i++) { + let ch = 0; + for (let j = 0; j < 8 && 2 + i * 8 + j < len; j++) { + if (this.isUnspent(2 + i * 8 + j)) + ch |= 1 << j; + } + bw.writeU8(ch); + } + + // Write the compressed outputs. + for (let i = 0; i < len; i++) { + const output = this.outputs[i]; + + if (!output || output.spent) + continue; + + output.toWriter(bw); + } + + return bw.render(); +}; + +/** + * Calculate coins size. + * @param {Number} code + * @param {Number} size + * @param {Number} len + * @returns {Number} + */ + +Coins.prototype.getSize = function getSize(len, size, code) { + let total = 0; + + total += encoding.sizeVarint(this.version); + total += 4; + total += encoding.sizeVarint(code); + total += size; + + // Write the compressed outputs. + for (let i = 0; i < len; i++) { + const output = this.outputs[i]; + + if (!output || output.spent) + continue; + + total += output.getSize(); + } + + return total; +}; + +/** + * Inject data from serialized coins. + * @private + * @param {Buffer} data + * @param {Hash} hash + * @returns {Coins} + */ + +Coins.prototype.fromRaw = function fromRaw(data, hash) { + const br = new BufferReader(data); + let first = null; + let second = null; + + // Inject hash (passed by caller). + this.hash = hash; + + // Read headers. + this.version = br.readVarint(); + this.height = br.readU32(); + const code = br.readVarint(); + this.coinbase = (code & 1) !== 0; + + // Recalculate size. + let size = code / 8 | 0; + + if ((code & 6) === 0) + size += 1; + + // Setup spent field. + let offset = br.offset; + br.seek(size); + + // Read first two outputs. + if ((code & 2) !== 0) + first = CoinEntry.fromReader(br); + + if ((code & 4) !== 0) + second = CoinEntry.fromReader(br); + + this.outputs.push(first); + this.outputs.push(second); + + // Read outputs. + for (let i = 0; i < size; i++) { + const ch = br.data[offset++]; + for (let j = 0; j < 8; j++) { + if ((ch & (1 << j)) === 0) { + this.outputs.push(null); + continue; + } + this.outputs.push(CoinEntry.fromReader(br)); + } + } + + this.cleanup(); + + return this; +}; + +/** + * Parse a single serialized coin. + * @param {Buffer} data + * @param {Hash} hash + * @param {Number} index + * @returns {Coin} + */ + +Coins.parseCoin = function parseCoin(data, hash, index) { + const br = new BufferReader(data); + const coin = new Coin(); + + // Inject outpoint (passed by caller). + coin.hash = hash; + coin.index = index; + + // Read headers. + coin.version = br.readVarint(); + coin.height = br.readU32(); + const code = br.readVarint(); + coin.coinbase = (code & 1) !== 0; + + // Recalculate size. + let size = code / 8 | 0; + + if ((code & 6) === 0) + size += 1; + + if (index >= 2 + size * 8) + return; + + // Setup spent field. + let offset = br.offset; + br.seek(size); + + // Read first two outputs. + for (let i = 0; i < 2; i++) { + if ((code & (2 << i)) !== 0) { + if (index === 0) { + decompress.coin(coin, br); + return coin; + } + decompress.skip(br); + } else { + if (index === 0) + return; + } + index -= 1; + } + + // Read outputs. + for (let i = 0; i < size; i++) { + const ch = br.data[offset++]; + for (let j = 0; j < 8; j++) { + if ((ch & (1 << j)) !== 0) { + if (index === 0) { + decompress.coin(coin, br); + return coin; + } + decompress.skip(br); + } else { + if (index === 0) + return; + } + index -= 1; + } + } +}; + +/** + * Instantiate coins from a buffer. + * @param {Buffer} data + * @param {Hash} hash - Transaction hash. + * @returns {Coins} + */ + +Coins.fromRaw = function fromRaw(data, hash) { + return new Coins().fromRaw(data, hash); +}; + +/** + * Inject properties from tx. + * @private + * @param {TX} tx + * @param {Number} height + */ + +Coins.prototype.fromTX = function fromTX(tx, height) { + assert(typeof height === 'number'); + + this.version = tx.version; + this.hash = tx.hash('hex'); + this.height = height; + this.coinbase = tx.isCoinbase(); + + for (const output of tx.outputs) { + if (output.script.isUnspendable()) { + this.outputs.push(null); + continue; + } + this.outputs.push(CoinEntry.fromOutput(output)); + } + + this.cleanup(); + + return this; +}; + +/** + * Instantiate a coins object from a transaction. + * @param {TX} tx + * @param {Number} height + * @returns {Coins} + */ + +Coins.fromTX = function fromTX(tx, height) { + return new Coins().fromTX(tx, height); +}; + +/** + * A coin entry is an object which defers + * parsing of a coin. Say there is a transaction + * with 100 outputs. When a block comes in, + * there may only be _one_ input in that entire + * block which redeems an output from that + * transaction. When parsing the Coins, there + * is no sense to get _all_ of them into their + * abstract form. A coin entry is just a + * pointer to that coin in the Coins buffer, as + * well as a size. Parsing and decompression + * is done only if that coin is being redeemed. + * @alias module:coins.CoinEntry + * @constructor + * @property {Number} offset + * @property {Number} size + * @property {Buffer} raw + * @property {Output|null} output + * @property {Boolean} spent + */ + +function CoinEntry() { + this.offset = 0; + this.size = 0; + this.raw = null; + this.output = null; + this.spent = false; +} + +/** + * Instantiate a reader at the correct offset. + * @private + * @returns {BufferReader} + */ + +CoinEntry.prototype.reader = function reader() { + assert(this.raw); + + const br = new BufferReader(this.raw); + br.offset = this.offset; + + return br; +}; + +/** + * Parse the deferred data and return a coin. + * @param {Coins} coins + * @param {Number} index + * @returns {Coin} + */ + +CoinEntry.prototype.toCoin = function toCoin(coins, index) { + const coin = new Coin(); + const output = this.toOutput(); + + // Load in all necessary properties + // from the parent Coins object. + coin.version = coins.version; + coin.coinbase = coins.coinbase; + coin.height = coins.height; + coin.hash = coins.hash; + coin.index = index; + coin.script = output.script; + coin.value = output.value; + + return coin; +}; + +/** + * Parse the deferred data and return an output. + * @returns {Output} + */ + +CoinEntry.prototype.toOutput = function toOutput() { + if (!this.output) { + this.output = new Output(); + decompress.output(this.output, this.reader()); + } + return this.output; +}; + +/** + * Calculate coin entry size. + * @returns {Number} + */ + +CoinEntry.prototype.getSize = function getSize() { + if (!this.raw) + return compress.size(this.output); + + return this.size; +}; + +/** + * Slice off the part of the buffer + * relevant to this particular coin. + */ + +CoinEntry.prototype.toWriter = function toWriter(bw) { + if (!this.raw) { + assert(this.output); + compress.output(this.output, bw); + return bw; + } + + // If we read this coin from the db and + // didn't use it, it's still in its + // compressed form. Just write it back + // as a buffer for speed. + bw.copy(this.raw, this.offset, this.offset + this.size); + + return bw; +}; + +/** + * Instantiate coin entry from reader. + * @param {BufferReader} br + * @returns {CoinEntry} + */ + +CoinEntry.fromReader = function fromReader(br) { + const entry = new CoinEntry(); + entry.offset = br.offset; + entry.size = decompress.skip(br); + entry.raw = br.data; + return entry; +}; + +/** + * Instantiate coin entry from output. + * @param {Output} output + * @returns {CoinEntry} + */ + +CoinEntry.fromOutput = function fromOutput(output) { + const entry = new CoinEntry(); + entry.output = output; + return entry; +}; + +/** + * Instantiate coin entry from coin. + * @param {Coin} coin + * @returns {CoinEntry} + */ + +CoinEntry.fromCoin = function fromCoin(coin) { + const entry = new CoinEntry(); + const output = new Output(); + output.value = coin.value; + output.script = coin.script; + entry.output = output; + return entry; +}; + +/* + * Expose + */ + +exports = Coins; +exports.Coins = Coins; +exports.CoinEntry = CoinEntry; + +module.exports = exports; diff --git a/migrate/coins/coinview.js b/migrate/coins/coinview.js new file mode 100644 index 000000000..91b9e4257 --- /dev/null +++ b/migrate/coins/coinview.js @@ -0,0 +1,476 @@ +/*! + * coinview.js - coin viewpoint object for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +/* eslint-disable */ + +'use strict'; + +const assert = require('assert'); +const Coins = require('./coins'); +const UndoCoins = require('./undocoins'); +const CoinEntry = Coins.CoinEntry; + +/** + * Represents a coin viewpoint: + * a snapshot of {@link Coins} objects. + * @alias module:coins.CoinView + * @constructor + * @property {Object} map + * @property {UndoCoins} undo + */ + +function CoinView() { + if (!(this instanceof CoinView)) + return new CoinView(); + + this.map = new Map(); + this.undo = new UndoCoins(); +} + +/** + * Get coins. + * @param {Hash} hash + * @returns {Coins} coins + */ + +CoinView.prototype.get = function get(hash) { + return this.map.get(hash); +}; + +/** + * Test whether the view has an entry. + * @param {Hash} hash + * @returns {Boolean} + */ + +CoinView.prototype.has = function has(hash) { + return this.map.has(hash); +}; + +/** + * Add coins to the collection. + * @param {Coins} coins + */ + +CoinView.prototype.add = function add(coins) { + this.map.set(coins.hash, coins); + return coins; +}; + +/** + * Remove coins from the collection. + * @param {Coins} coins + * @returns {Boolean} + */ + +CoinView.prototype.remove = function remove(hash) { + if (!this.map.has(hash)) + return false; + + this.map.delete(hash); + + return true; +}; + +/** + * Add a tx to the collection. + * @param {TX} tx + * @param {Number} height + */ + +CoinView.prototype.addTX = function addTX(tx, height) { + const coins = Coins.fromTX(tx, height); + return this.add(coins); +}; + +/** + * Remove a tx from the collection. + * @param {TX} tx + * @param {Number} height + */ + +CoinView.prototype.removeTX = function removeTX(tx, height) { + const coins = Coins.fromTX(tx, height); + coins.outputs.length = 0; + return this.add(coins); +}; + +/** + * Add a coin to the collection. + * @param {Coin} coin + */ + +CoinView.prototype.addCoin = function addCoin(coin) { + let coins = this.get(coin.hash); + + if (!coins) { + coins = new Coins(); + coins.hash = coin.hash; + coins.height = coin.height; + coins.coinbase = coin.coinbase; + this.add(coins); + } + + if (coin.script.isUnspendable()) + return; + + if (!coins.has(coin.index)) + coins.addCoin(coin); +}; + +/** + * Add an output to the collection. + * @param {Hash} hash + * @param {Number} index + * @param {Output} output + */ + +CoinView.prototype.addOutput = function addOutput(hash, index, output) { + let coins = this.get(hash); + + if (!coins) { + coins = new Coins(); + coins.hash = hash; + coins.height = -1; + coins.coinbase = false; + this.add(coins); + } + + if (output.script.isUnspendable()) + return; + + if (!coins.has(index)) + coins.addOutput(index, output); +}; + +/** + * Spend an output. + * @param {Hash} hash + * @param {Number} index + * @returns {Boolean} + */ + +CoinView.prototype.spendOutput = function spendOutput(hash, index) { + const coins = this.get(hash); + + if (!coins) + return false; + + return this.spendFrom(coins, index); +}; + +/** + * Remove an output. + * @param {Hash} hash + * @param {Number} index + * @returns {Boolean} + */ + +CoinView.prototype.removeOutput = function removeOutput(hash, index) { + const coins = this.get(hash); + + if (!coins) + return false; + + return coins.remove(index); +}; + +/** + * Spend a coin from coins object. + * @param {Coins} coins + * @param {Number} index + * @returns {Boolean} + */ + +CoinView.prototype.spendFrom = function spendFrom(coins, index) { + const entry = coins.spend(index); + + if (!entry) + return false; + + this.undo.push(entry); + + if (coins.isEmpty()) { + const undo = this.undo.top(); + undo.height = coins.height; + undo.coinbase = coins.coinbase; + undo.version = coins.version; + assert(undo.height !== -1); + } + + return true; +}; + +/** + * Get a single coin by input. + * @param {Input} input + * @returns {Coin} + */ + +CoinView.prototype.getCoin = function getCoin(input) { + const coins = this.get(input.prevout.hash); + + if (!coins) + return; + + return coins.getCoin(input.prevout.index); +}; + +/** + * Get a single output by input. + * @param {Input} input + * @returns {Output} + */ + +CoinView.prototype.getOutput = function getOutput(input) { + const coins = this.get(input.prevout.hash); + + if (!coins) + return; + + return coins.getOutput(input.prevout.index); +}; + +/** + * Get a single entry by input. + * @param {Input} input + * @returns {CoinEntry} + */ + +CoinView.prototype.getEntry = function getEntry(input) { + const coins = this.get(input.prevout.hash); + + if (!coins) + return; + + return coins.get(input.prevout.index); +}; + +/** + * Test whether the view has an entry by input. + * @param {Input} input + * @returns {Boolean} + */ + +CoinView.prototype.hasEntry = function hasEntry(input) { + const coins = this.get(input.prevout.hash); + + if (!coins) + return false; + + return coins.has(input.prevout.index); +}; + +/** + * Get coins height by input. + * @param {Input} input + * @returns {Number} + */ + +CoinView.prototype.getHeight = function getHeight(input) { + const coins = this.get(input.prevout.hash); + + if (!coins) + return -1; + + return coins.height; +}; + +/** + * Get coins coinbase flag by input. + * @param {Input} input + * @returns {Boolean} + */ + +CoinView.prototype.isCoinbase = function isCoinbase(input) { + const coins = this.get(input.prevout.hash); + + if (!coins) + return false; + + return coins.coinbase; +}; + +/** + * Retrieve coins from database. + * @method + * @param {ChainDB} db + * @param {TX} tx + * @returns {Promise} - Returns {@link Coins}. + */ + +CoinView.prototype.readCoins = async function readCoins(db, hash) { + let coins = this.map.get(hash); + + if (!coins) { + coins = await db.getCoins(hash); + + if (!coins) + return; + + this.map.set(hash, coins); + } + + return coins; +}; + +/** + * Read all input coins into unspent map. + * @method + * @param {ChainDB} db + * @param {TX} tx + * @returns {Promise} - Returns {Boolean}. + */ + +CoinView.prototype.ensureInputs = async function ensureInputs(db, tx) { + let found = true; + + for (const input of tx.inputs) { + if (!await this.readCoins(db, input.prevout.hash)) + found = false; + } + + return found; +}; + +/** + * Spend coins for transaction. + * @method + * @param {ChainDB} db + * @param {TX} tx + * @returns {Promise} - Returns {Boolean}. + */ + +CoinView.prototype.spendInputs = async function spendInputs(db, tx) { + for (const input of tx.inputs) { + const prevout = input.prevout; + const coins = await this.readCoins(db, prevout.hash); + + if (!coins) + return false; + + if (!this.spendFrom(coins, prevout.index)) + return false; + } + + return true; +}; + +/** + * Convert collection to an array. + * @returns {Coins[]} + */ + +CoinView.prototype.toArray = function toArray() { + const out = []; + + for (const coins of this.map.values()) + out.push(coins); + + return out; +}; + +/** + * Calculate serialization size. + * @returns {Number} + */ + +CoinView.prototype.getSize = function getSize(tx) { + let size = 0; + + size += tx.inputs.length; + + for (const input of tx.inputs) { + const entry = this.getEntry(input); + + if (!entry) + continue; + + size += entry.getSize(); + } + + return size; +}; + +/** + * Write coin data to buffer writer + * as it pertains to a transaction. + * @param {BufferWriter} bw + * @param {TX} tx + */ + +CoinView.prototype.toWriter = function toWriter(bw, tx) { + for (const input of tx.inputs) { + const prevout = input.prevout; + const coins = this.get(prevout.hash); + + if (!coins) { + bw.writeU8(0); + continue; + } + + const entry = coins.get(prevout.index); + + if (!entry) { + bw.writeU8(0); + continue; + } + + bw.writeU8(1); + entry.toWriter(bw); + } + + return bw; +}; + +/** + * Read serialized view data from a buffer + * reader as it pertains to a transaction. + * @private + * @param {BufferReader} br + * @param {TX} tx + */ + +CoinView.prototype.fromReader = function fromReader(br, tx) { + for (const input of tx.inputs) { + const prevout = input.prevout; + + if (br.readU8() === 0) + continue; + + let coins = this.get(prevout.hash); + + if (!coins) { + coins = new Coins(); + coins.hash = prevout.hash; + coins.coinbase = false; + this.add(coins); + } + + const entry = CoinEntry.fromReader(br); + coins.add(prevout.index, entry); + } + + return this; +}; + +/** + * Read serialized view data from a buffer + * reader as it pertains to a transaction. + * @param {BufferReader} br + * @param {TX} tx + * @returns {CoinView} + */ + +CoinView.fromReader = function fromReader(br, tx) { + return new CoinView().fromReader(br, tx); +}; + +/* + * Expose + */ + +module.exports = CoinView; diff --git a/migrate/coins/compress.js b/migrate/coins/compress.js new file mode 100644 index 000000000..455780c1e --- /dev/null +++ b/migrate/coins/compress.js @@ -0,0 +1,413 @@ +/*! + * compress.js - coin compressor for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +/* eslint-disable */ + +'use strict'; + +/** + * @module coins/compress + * @ignore + */ + +const assert = require('assert'); +const secp256k1 = require('../../lib/crypto/secp256k1'); +const encoding = require('../../lib/utils/encoding'); +const consensus = require('../../lib/protocol/consensus'); + +/* + * Constants + */ + +const COMPRESS_TYPES = 10; // Space for 4 extra. +const EMPTY_BUFFER = Buffer.alloc(0); + +/** + * Compress a script, write directly to the buffer. + * @param {Script} script + * @param {BufferWriter} bw + */ + +function compressScript(script, bw) { + // Attempt to compress the output scripts. + // We can _only_ ever compress them if + // they are serialized as minimaldata, as + // we need to recreate them when we read + // them. + + // P2PKH -> 0 | key-hash + // Saves 5 bytes. + if (script.isPubkeyhash(true)) { + const data = script.code[2].data; + bw.writeU8(0); + bw.writeBytes(data); + return bw; + } + + // P2SH -> 1 | script-hash + // Saves 3 bytes. + if (script.isScripthash()) { + const data = script.code[1].data; + bw.writeU8(1); + bw.writeBytes(data); + return bw; + } + + // P2PK -> 2-5 | compressed-key + // Only works if the key is valid. + // Saves up to 35 bytes. + if (script.isPubkey(true)) { + let data = script.code[0].data; + if (publicKeyVerify(data)) { + data = compressKey(data); + bw.writeBytes(data); + return bw; + } + } + + // Raw -> varlen + 10 | script + bw.writeVarint(script.raw.length + COMPRESS_TYPES); + bw.writeBytes(script.raw); + + return bw; +} + +/** + * Decompress a script from buffer reader. + * @param {Script} script + * @param {BufferReader} br + */ + +function decompressScript(script, br) { + let size, data; + + // Decompress the script. + switch (br.readU8()) { + case 0: + data = br.readBytes(20, true); + script.fromPubkeyhash(data); + break; + case 1: + data = br.readBytes(20, true); + script.fromScripthash(data); + break; + case 2: + case 3: + case 4: + case 5: + br.offset -= 1; + data = br.readBytes(33, true); + // Decompress the key. If this fails, + // we have database corruption! + data = decompressKey(data); + script.fromPubkey(data); + break; + default: + br.offset -= 1; + size = br.readVarint() - COMPRESS_TYPES; + if (size > consensus.MAX_SCRIPT_SIZE) { + // This violates consensus rules. + // We don't need to read it. + script.fromNulldata(EMPTY_BUFFER); + br.seek(size); + } else { + data = br.readBytes(size); + script.fromRaw(data); + } + break; + } + + return script; +} + +/** + * Calculate script size. + * @returns {Number} + */ + +function sizeScript(script) { + if (script.isPubkeyhash(true)) + return 21; + + if (script.isScripthash()) + return 21; + + if (script.isPubkey(true)) { + const data = script.code[0].data; + if (publicKeyVerify(data)) + return 33; + } + + let size = 0; + size += encoding.sizeVarint(script.raw.length + COMPRESS_TYPES); + size += script.raw.length; + + return size; +} + +/** + * Compress an output. + * @param {Output} output + * @param {BufferWriter} bw + */ + +function compressOutput(output, bw) { + bw.writeVarint(output.value); + compressScript(output.script, bw); + return bw; +} + +/** + * Decompress a script from buffer reader. + * @param {Output} output + * @param {BufferReader} br + */ + +function decompressOutput(output, br) { + output.value = br.readVarint(); + decompressScript(output.script, br); + return output; +} + +/** + * Calculate output size. + * @returns {Number} + */ + +function sizeOutput(output) { + let size = 0; + size += encoding.sizeVarint(output.value); + size += sizeScript(output.script); + return size; +} + +/** + * Compress an output. + * @param {Coin} coin + * @param {BufferWriter} bw + */ + +function compressCoin(coin, bw) { + bw.writeVarint(coin.value); + compressScript(coin.script, bw); + return bw; +} + +/** + * Decompress a script from buffer reader. + * @param {Coin} coin + * @param {BufferReader} br + */ + +function decompressCoin(coin, br) { + coin.value = br.readVarint(); + decompressScript(coin.script, br); + return coin; +} + +/** + * Skip past a compressed output. + * @param {BufferWriter} bw + * @returns {Number} + */ + +function skipOutput(br) { + const start = br.offset; + + // Skip past the value. + br.skipVarint(); + + // Skip past the compressed scripts. + switch (br.readU8()) { + case 0: + case 1: + br.seek(20); + break; + case 2: + case 3: + case 4: + case 5: + br.seek(32); + break; + default: + br.offset -= 1; + br.seek(br.readVarint() - COMPRESS_TYPES); + break; + } + + return br.offset - start; +} + +/** + * Compress value using an exponent. Takes advantage of + * the fact that many bitcoin values are divisible by 10. + * @see https://github.com/btcsuite/btcd/blob/master/blockchain/compress.go + * @param {Amount} value + * @returns {Number} + */ + +function compressValue(value) { + if (value === 0) + return 0; + + let exp = 0; + while (value % 10 === 0 && exp < 9) { + value /= 10; + exp++; + } + + if (exp < 9) { + const last = value % 10; + value = (value - last) / 10; + return 1 + 10 * (9 * value + last - 1) + exp; + } + + return 10 + 10 * (value - 1); +} + +/** + * Decompress value. + * @param {Number} value - Compressed value. + * @returns {Amount} value + */ + +function decompressValue(value) { + if (value === 0) + return 0; + + value--; + + let exp = value % 10; + value = (value - exp) / 10; + + let n; + if (exp < 9) { + const last = value % 9; + value = (value - last) / 9; + n = value * 10 + last + 1; + } else { + n = value + 1; + } + + while (exp > 0) { + n *= 10; + exp--; + } + + return n; +} + +/** + * Verify a public key (no hybrid keys allowed). + * @param {Buffer} key + * @returns {Boolean} + */ + +function publicKeyVerify(key) { + if (key.length === 0) + return false; + + switch (key[0]) { + case 0x02: + case 0x03: + return key.length === 33; + case 0x04: + if (key.length !== 65) + return false; + + return secp256k1.publicKeyVerify(key); + default: + return false; + } +} + +/** + * Compress a public key to coins compression format. + * @param {Buffer} key + * @returns {Buffer} + */ + +function compressKey(key) { + let out; + + switch (key[0]) { + case 0x02: + case 0x03: + // Key is already compressed. + out = key; + break; + case 0x04: + // Compress the key normally. + out = secp256k1.publicKeyConvert(key, true); + // Store the oddness. + // Pseudo-hybrid format. + out[0] = 0x04 | (key[64] & 0x01); + break; + default: + throw new Error('Bad point format.'); + } + + assert(out.length === 33); + + return out; +} + +/** + * Decompress a public key from the coins compression format. + * @param {Buffer} key + * @returns {Buffer} + */ + +function decompressKey(key) { + const format = key[0]; + + assert(key.length === 33); + + switch (format) { + case 0x02: + case 0x03: + return key; + case 0x04: + key[0] = 0x02; + break; + case 0x05: + key[0] = 0x03; + break; + default: + throw new Error('Bad point format.'); + } + + // Decompress the key. + const out = secp256k1.publicKeyConvert(key, false); + + // Reset the first byte so as not to + // mutate the original buffer. + key[0] = format; + + return out; +} + +/* + * Expose + */ + +exports.compress = { + output: compressOutput, + coin: compressCoin, + size: sizeOutput, + script: compressScript, + value: compressValue, + key: compressKey +}; + +exports.decompress = { + output: decompressOutput, + coin: decompressCoin, + skip: skipOutput, + script: decompressScript, + value: decompressValue, + key: decompressKey +}; diff --git a/migrate/coins/index.js b/migrate/coins/index.js new file mode 100644 index 000000000..514c09db5 --- /dev/null +++ b/migrate/coins/index.js @@ -0,0 +1,16 @@ +/*! + * coins/index.js - utxo management for bcoin + * Copyright (c) 2016-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +'use strict'; + +/** + * @module coins + */ + +exports.Coins = require('../../lib/coins/coins'); +exports.CoinView = require('../../lib/coins/coinview'); +exports.compress = require('../../lib/coins/compress'); +exports.UndoCoins = require('../../lib/coins/undocoins'); diff --git a/migrate/coins/undocoins.js b/migrate/coins/undocoins.js new file mode 100644 index 000000000..0e9acedde --- /dev/null +++ b/migrate/coins/undocoins.js @@ -0,0 +1,338 @@ +/*! + * undocoins.js - undocoins object for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +/* eslint-disable */ + +'use strict'; + +const assert = require('assert'); +const BufferReader = require('../../lib/utils/reader'); +const StaticWriter = require('../../lib/utils/staticwriter'); +const encoding = require('../../lib/utils/encoding'); +const Output = require('../../lib/primitives/output'); +const Coins = require('./coins'); +const compressor = require('./compress'); +const compress = compressor.compress; +const decompress = compressor.decompress; + +/** + * UndoCoins + * Coins need to be resurrected from somewhere + * during a reorg. The undo coins store all + * spent coins in a single record per block + * (in a compressed format). + * @alias module:coins.UndoCoins + * @constructor + * @property {UndoCoin[]} items + */ + +function UndoCoins() { + if (!(this instanceof UndoCoins)) + return new UndoCoins(); + + this.items = []; +} + +/** + * Push coin entry onto undo coin array. + * @param {CoinEntry} + */ + +UndoCoins.prototype.push = function push(entry) { + const undo = new UndoCoin(); + undo.entry = entry; + this.items.push(undo); +}; + +/** + * Calculate undo coins size. + * @returns {Number} + */ + +UndoCoins.prototype.getSize = function getSize() { + let size = 0; + + size += 4; + + for (const coin of this.items) + size += coin.getSize(); + + return size; +}; + +/** + * Serialize all undo coins. + * @returns {Buffer} + */ + +UndoCoins.prototype.toRaw = function toRaw() { + const size = this.getSize(); + const bw = new StaticWriter(size); + + bw.writeU32(this.items.length); + + for (const coin of this.items) + coin.toWriter(bw); + + return bw.render(); +}; + +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + * @returns {UndoCoins} + */ + +UndoCoins.prototype.fromRaw = function fromRaw(data) { + const br = new BufferReader(data); + const count = br.readU32(); + + for (let i = 0; i < count; i++) + this.items.push(UndoCoin.fromReader(br)); + + return this; +}; + +/** + * Instantiate undo coins from serialized data. + * @param {Buffer} data + * @returns {UndoCoins} + */ + +UndoCoins.fromRaw = function fromRaw(data) { + return new UndoCoins().fromRaw(data); +}; + +/** + * Test whether the undo coins have any members. + * @returns {Boolean} + */ + +UndoCoins.prototype.isEmpty = function isEmpty() { + return this.items.length === 0; +}; + +/** + * Render the undo coins. + * @returns {Buffer} + */ + +UndoCoins.prototype.commit = function commit() { + const raw = this.toRaw(); + this.items.length = 0; + return raw; +}; + +/** + * Retrieve the last undo coin. + * @returns {UndoCoin} + */ + +UndoCoins.prototype.top = function top() { + return this.items[this.items.length - 1]; +}; + +/** + * Re-apply undo coins to a view, effectively unspending them. + * @param {CoinView} view + * @param {Outpoint} outpoint + */ + +UndoCoins.prototype.apply = function apply(view, outpoint) { + const undo = this.items.pop(); + const hash = outpoint.hash; + const index = outpoint.index; + let coins; + + assert(undo); + + if (undo.height !== -1) { + coins = new Coins(); + + assert(!view.map.has(hash)); + view.map.set(hash, coins); + + coins.hash = hash; + coins.coinbase = undo.coinbase; + coins.height = undo.height; + coins.version = undo.version; + } else { + coins = view.map.get(hash); + assert(coins); + } + + coins.addOutput(index, undo.toOutput()); + + assert(coins.has(index)); +}; + +/** + * UndoCoin + * @alias module:coins.UndoCoin + * @constructor + * @property {CoinEntry|null} entry + * @property {Output|null} output + * @property {Number} version + * @property {Number} height + * @property {Boolean} coinbase + */ + +function UndoCoin() { + this.entry = null; + this.output = null; + this.version = -1; + this.height = -1; + this.coinbase = false; +} + +/** + * Convert undo coin to an output. + * @returns {Output} + */ + +UndoCoin.prototype.toOutput = function toOutput() { + if (!this.output) { + assert(this.entry); + return this.entry.toOutput(); + } + return this.output; +}; + +/** + * Calculate undo coin size. + * @returns {Number} + */ + +UndoCoin.prototype.getSize = function getSize() { + let height = this.height; + let size = 0; + + if (height === -1) + height = 0; + + size += encoding.sizeVarint(height * 2 + (this.coinbase ? 1 : 0)); + + if (this.height !== -1) + size += encoding.sizeVarint(this.version); + + if (this.entry) { + // Cached from spend. + size += this.entry.getSize(); + } else { + size += compress.size(this.output); + } + + return size; +}; + +/** + * Write the undo coin to a buffer writer. + * @param {BufferWriter} bw + */ + +UndoCoin.prototype.toWriter = function toWriter(bw) { + let height = this.height; + + assert(height !== 0); + + if (height === -1) + height = 0; + + bw.writeVarint(height * 2 + (this.coinbase ? 1 : 0)); + + if (this.height !== -1) { + assert(this.version !== -1); + bw.writeVarint(this.version); + } + + if (this.entry) { + // Cached from spend. + this.entry.toWriter(bw); + } else { + compress.output(this.output, bw); + } + + return bw; +}; + +/** + * Serialize the undo coin. + * @returns {Buffer} + */ + +UndoCoin.prototype.toRaw = function toRaw() { + const size = this.getSize(); + return this.toWriter(new StaticWriter(size)).render(); +}; + +/** + * Inject properties from buffer reader. + * @private + * @param {BufferReader} br + * @returns {UndoCoin} + */ + +UndoCoin.prototype.fromReader = function fromReader(br) { + const code = br.readVarint(); + + this.output = new Output(); + + this.height = code / 2 | 0; + + if (this.height === 0) + this.height = -1; + + this.coinbase = (code & 1) !== 0; + + if (this.height !== -1) + this.version = br.readVarint(); + + decompress.output(this.output, br); + + return this; +}; + +/** + * Inject properties from serialized data. + * @private + * @param {Buffer} data + * @returns {UndoCoin} + */ + +UndoCoin.prototype.fromRaw = function fromRaw(data) { + return this.fromReader(new BufferReader(data)); +}; + +/** + * Instantiate undo coin from serialized data. + * @param {Buffer} data + * @returns {UndoCoin} + */ + +UndoCoin.fromReader = function fromReader(br) { + return new UndoCoin().fromReader(br); +}; + +/** + * Instantiate undo coin from serialized data. + * @param {Buffer} data + * @returns {UndoCoin} + */ + +UndoCoin.fromRaw = function fromRaw(data) { + return new UndoCoin().fromRaw(data); +}; + +/* + * Expose + */ + +exports = UndoCoins; +exports.UndoCoins = UndoCoins; +exports.UndoCoin = UndoCoin; + +module.exports = exports; diff --git a/migrate/coinview-old.js b/migrate/coinview-old.js index 87624a540..4d3639217 100644 --- a/migrate/coinview-old.js +++ b/migrate/coinview-old.js @@ -4,6 +4,8 @@ * https://github.com/bcoin-org/bcoin */ +/* eslint-disable */ + 'use strict'; const assert = require('assert'); @@ -62,7 +64,7 @@ CoinView.prototype.addTX = function addTX(tx) { */ CoinView.prototype.get = function get(hash, index) { - let coins = this.coins[hash]; + const coins = this.coins[hash]; if (!coins) return; @@ -78,7 +80,7 @@ CoinView.prototype.get = function get(hash, index) { */ CoinView.prototype.has = function has(hash, index) { - let coins = this.coins[hash]; + const coins = this.coins[hash]; if (!coins) return false; @@ -94,7 +96,7 @@ CoinView.prototype.has = function has(hash, index) { */ CoinView.prototype.spend = function spend(hash, index) { - let coins = this.coins[hash]; + const coins = this.coins[hash]; if (!coins) return; @@ -128,8 +130,8 @@ CoinView.prototype.fillCoins = function fillCoins(tx) { */ CoinView.prototype.toArray = function toArray() { - let keys = Object.keys(this.coins); - let out = []; + const keys = Object.keys(this.coins); + const out = []; let i, hash; for (i = 0; i < keys.length; i++) { diff --git a/migrate/compress-old.js b/migrate/compress-old.js index d32023f4b..bceac2f1d 100644 --- a/migrate/compress-old.js +++ b/migrate/compress-old.js @@ -20,8 +20,6 @@ const secp256k1 = require('../lib/crypto/secp256k1'); */ function compressScript(script, bw) { - let data; - // Attempt to compress the output scripts. // We can _only_ ever compress them if // they are serialized as minimaldata, as @@ -31,7 +29,7 @@ function compressScript(script, bw) { // P2PKH -> 1 | key-hash // Saves 5 bytes. if (script.isPubkeyhash(true)) { - data = script.code[2].data; + const data = script.code[2].data; bw.writeU8(1); bw.writeBytes(data); return bw; @@ -40,7 +38,7 @@ function compressScript(script, bw) { // P2SH -> 2 | script-hash // Saves 3 bytes. if (script.isScripthash()) { - data = script.code[1].data; + const data = script.code[1].data; bw.writeU8(2); bw.writeBytes(data); return bw; @@ -50,7 +48,7 @@ function compressScript(script, bw) { // Only works if the key is valid. // Saves up to 34 bytes. if (script.isPubkey(true)) { - data = script.code[0].data; + let data = script.code[0].data; if (secp256k1.publicKeyVerify(data)) { data = compressKey(data); bw.writeU8(3); @@ -112,19 +110,17 @@ function decompressScript(script, br) { */ function compressValue(value) { - let exp, last; - if (value === 0) return 0; - exp = 0; + let exp = 0; while (value % 10 === 0 && exp < 9) { value /= 10; exp++; } if (exp < 9) { - last = value % 10; + const last = value % 10; value = (value - last) / 10; return 1 + 10 * (9 * value + last - 1) + exp; } @@ -139,18 +135,17 @@ function compressValue(value) { */ function decompressValue(value) { - let exp, n, last; - if (value === 0) return 0; value--; - exp = value % 10; + let exp = value % 10; value = (value - exp) / 10; + let n; if (exp < 9) { - last = value % 9; + const last = value % 9; value = (value - last) / 9; n = value * 10 + last + 1; } else { @@ -209,8 +204,7 @@ function compressKey(key) { */ function decompressKey(key) { - let format = key[0] >>> 2; - let out; + const format = key[0] >>> 2; assert(key.length === 33); @@ -223,7 +217,7 @@ function decompressKey(key) { // low bits so publicKeyConvert // actually understands it. key[0] &= 0x03; - out = secp256k1.publicKeyConvert(key, false); + const out = secp256k1.publicKeyConvert(key, false); // Reset the hi bits so as not to // mutate the original buffer. diff --git a/migrate/ensure-tip-index.js b/migrate/ensure-tip-index.js index 084637c87..200322dc1 100644 --- a/migrate/ensure-tip-index.js +++ b/migrate/ensure-tip-index.js @@ -9,13 +9,13 @@ const LDB = require('../lib/db/ldb'); const BN = require('../lib/crypto/bn'); const DUMMY = Buffer.from([0]); let file = process.argv[2]; -let db, batch; +let batch; assert(typeof file === 'string', 'Please pass in a database path.'); file = file.replace(/\.ldb\/?$/, ''); -db = LDB({ +const db = LDB({ location: file, db: 'leveldb', compression: true, @@ -25,25 +25,23 @@ db = LDB({ }); async function checkVersion() { - let data, ver; - console.log('Checking version.'); - data = await db.get('V'); + const data = await db.get('V'); if (!data) return; - ver = data.readUInt32LE(0, true); + const ver = data.readUInt32LE(0, true); if (ver !== 1) throw Error(`DB is version ${ver}.`); } function entryFromRaw(data) { - let p = new BufferReader(data, true); - let hash = digest.hash256(p.readBytes(80)); - let entry = {}; + const p = new BufferReader(data, true); + const hash = digest.hash256(p.readBytes(80)); + const entry = {}; p.seek(-80); @@ -51,7 +49,7 @@ function entryFromRaw(data) { entry.version = p.readU32(); // Technically signed entry.prevBlock = p.readHash('hex'); entry.merkleRoot = p.readHash('hex'); - entry.ts = p.readU32(); + entry.time = p.readU32(); entry.bits = p.readU32(); entry.nonce = p.readU32(); entry.height = p.readU32(); @@ -69,10 +67,10 @@ function getEntries() { } async function getTip(entry) { - let state = await db.get('R'); + const state = await db.get('R'); assert(state); - let tip = state.toString('hex', 0, 32); - let data = await db.get(pair('e', tip)); + const tip = state.toString('hex', 0, 32); + const data = await db.get(pair('e', tip)); assert(data); return entryFromRaw(data); } @@ -90,32 +88,31 @@ async function isMainChain(entry, tip) { // And this insane function is why we should // be indexing tips in the first place! async function indexTips() { - let entries = await getEntries(); - let tip = await getTip(); - let tips = []; - let orphans = []; - let prevs = {}; - let i, orphan, entry, main; - - for (i = 0; i < entries.length; i++) { - entry = entries[i]; - main = await isMainChain(entry, tip.hash); + const entries = await getEntries(); + const tip = await getTip(); + const tips = []; + const orphans = []; + const prevs = {}; + + for (let i = 0; i < entries.length; i++) { + const entry = entries[i]; + const main = await isMainChain(entry, tip.hash); if (!main) { orphans.push(entry); prevs[entry.prevBlock] = true; } } - for (i = 0; i < orphans.length; i++) { - orphan = orphans[i]; + for (let i = 0; i < orphans.length; i++) { + const orphan = orphans[i]; if (!prevs[orphan.hash]) tips.push(orphan.hash); } tips.push(tip.hash); - for (i = 0; i < tips.length; i++) { - tip = tips[i]; + for (let i = 0; i < tips.length; i++) { + const tip = tips[i]; console.log('Indexing chain tip: %s.', util.revHex(tip)); batch.put(pair('p', tip), DUMMY); } @@ -124,11 +121,11 @@ async function indexTips() { function write(data, str, off) { if (Buffer.isBuffer(str)) return str.copy(data, off); - data.write(str, off, 'hex'); + return data.write(str, off, 'hex'); } function pair(prefix, hash) { - let key = Buffer.allocUnsafe(33); + const key = Buffer.allocUnsafe(33); if (typeof prefix === 'string') prefix = prefix.charCodeAt(0); key[0] = prefix; diff --git a/migrate/walletdb2to3.js b/migrate/walletdb2to3.js index b7c22a63e..988685ac7 100644 --- a/migrate/walletdb2to3.js +++ b/migrate/walletdb2to3.js @@ -8,17 +8,18 @@ const Path = require('../lib/wallet/path'); const MasterKey = require('../lib/wallet/masterkey'); const Account = require('../lib/wallet/account'); const Wallet = require('../lib/wallet/wallet'); +const KeyRing = require('../lib/primitives/keyring'); const BufferReader = require('../lib/utils/reader'); const BufferWriter = require('../lib/utils/writer'); -let layout = walletdb.layout; +const layout = walletdb.layout; let file = process.argv[2]; -let db, batch; +let batch; assert(typeof file === 'string', 'Please pass in a database path.'); file = file.replace(/\.ldb\/?$/, ''); -db = bcoin.ldb({ +const db = bcoin.ldb({ location: file, db: 'leveldb', compression: true, @@ -28,15 +29,14 @@ db = bcoin.ldb({ }); async function updateVersion() { - let bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; - let data, ver; + const bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; console.log('Checking version.'); - data = await db.get('V'); + const data = await db.get('V'); assert(data, 'No version.'); - ver = data.readUInt32LE(0, true); + let ver = data.readUInt32LE(0, true); if (ver !== 2) throw Error(`DB is version ${ver}.`); @@ -52,10 +52,8 @@ async function updateVersion() { async function updatePathMap() { let total = 0; - let i, iter, item, oldPaths, oldPath; - let hash, path, keys, key, ring; - iter = db.iterator({ + const iter = db.iterator({ gte: layout.p(encoding.NULL_HASH), lte: layout.p(encoding.HIGH_HASH), values: true @@ -64,21 +62,21 @@ async function updatePathMap() { console.log('Migrating path map.'); for (;;) { - item = await iter.next(); + const item = await iter.next(); if (!item) break; total++; - hash = layout.pp(item.key); - oldPaths = parsePaths(item.value, hash); - keys = Object.keys(oldPaths); - - for (i = 0; i < keys.length; i++) { - keys[i] = +keys[i]; - key = keys[i]; - oldPath = oldPaths[key]; - path = new Path(oldPath); + const hash = layout.pp(item.key); + const oldPaths = parsePaths(item.value, hash); + const keys = Object.keys(oldPaths); + + for (let i = 0; i < keys.length; i++) { + keys[i] = Number(keys[i]); + const key = keys[i]; + const oldPath = oldPaths[key]; + const path = new Path(oldPath); if (path.data) { if (path.encrypted) { console.log( @@ -87,8 +85,8 @@ async function updatePathMap() { path.toAddress().toBase58()); continue; } - ring = keyFromRaw(path.data); - path.data = new bcoin.keyring(ring).toRaw(); + const ring = keyFromRaw(path.data); + path.data = new KeyRing(ring).toRaw(); } batch.put(layout.P(key, hash), path.toRaw()); } @@ -101,9 +99,8 @@ async function updatePathMap() { async function updateAccounts() { let total = 0; - let iter, item, account, buf; - iter = db.iterator({ + const iter = db.iterator({ gte: layout.a(0, 0), lte: layout.a(0xffffffff, 0xffffffff), values: true @@ -112,19 +109,19 @@ async function updateAccounts() { console.log('Migrating accounts.'); for (;;) { - item = await iter.next(); + const item = await iter.next(); if (!item) break; total++; - account = accountFromRaw(item.value, item.key); + let account = accountFromRaw(item.value, item.key); account = new Account({ network: account.network, options: {} }, account); batch.put(item.key, account.toRaw()); if (account._old) { batch.del(layout.i(account.wid, account._old)); - buf = Buffer.allocUnsafe(4); + const buf = Buffer.allocUnsafe(4); buf.writeUInt32LE(account.accountIndex, 0, true); batch.put(layout.i(account.wid, account.name), buf); } @@ -135,9 +132,8 @@ async function updateAccounts() { async function updateWallets() { let total = 0; - let iter, item, wallet, buf; - iter = db.iterator({ + const iter = db.iterator({ gte: layout.w(0), lte: layout.w(0xffffffff), values: true @@ -146,19 +142,19 @@ async function updateWallets() { console.log('Migrating wallets.'); for (;;) { - item = await iter.next(); + const item = await iter.next(); if (!item) break; total++; - wallet = walletFromRaw(item.value); + let wallet = walletFromRaw(item.value); wallet = new Wallet({ network: wallet.network }, wallet); batch.put(item.key, wallet.toRaw()); if (wallet._old) { batch.del(layout.l(wallet._old)); - buf = Buffer.allocUnsafe(4); + const buf = Buffer.allocUnsafe(4); buf.writeUInt32LE(wallet.wid, 0, true); batch.put(layout.l(wallet.id), buf); } @@ -169,9 +165,8 @@ async function updateWallets() { async function updateTXMap() { let total = 0; - let iter, item, wallets; - iter = db.iterator({ + const iter = db.iterator({ gte: layout.e(encoding.NULL_HASH), lte: layout.e(encoding.HIGH_HASH), values: true @@ -180,13 +175,13 @@ async function updateTXMap() { console.log('Migrating tx map.'); for (;;) { - item = await iter.next(); + const item = await iter.next(); if (!item) break; total++; - wallets = parseWallets(item.value); + const wallets = parseWallets(item.value); batch.put(item.key, serializeWallets(wallets.sort())); } @@ -194,8 +189,8 @@ async function updateTXMap() { } function pathFromRaw(data) { - let path = {}; - let p = new BufferReader(data); + const path = {}; + const p = new BufferReader(data); path.wid = p.readU32(); path.name = p.readVarString('utf8'); @@ -221,19 +216,18 @@ function pathFromRaw(data) { break; } - path.version = p.read8(); + path.version = p.readI8(); path.type = p.readU8(); return path; } function parsePaths(data, hash) { - let p = new BufferReader(data); - let out = {}; - let path; + const p = new BufferReader(data); + const out = {}; while (p.left()) { - path = pathFromRaw(p); + const path = pathFromRaw(p); out[path.wid] = path; if (hash) path.hash = hash; @@ -243,19 +237,18 @@ function parsePaths(data, hash) { } function parseWallets(data) { - let p = new BufferReader(data); - let wallets = []; + const p = new BufferReader(data); + const wallets = []; while (p.left()) wallets.push(p.readU32()); return wallets; } function serializeWallets(wallets) { - let p = new BufferWriter(); - let i, wid; + const p = new BufferWriter(); - for (i = 0; i < wallets.length; i++) { - wid = wallets[i]; + for (let i = 0; i < wallets.length; i++) { + const wid = wallets[i]; p.writeU32(wid); } @@ -270,9 +263,8 @@ function readAccountKey(key) { } function accountFromRaw(data, dbkey) { - let account = {}; - let p = new BufferReader(data); - let i, count, key, name; + const account = {}; + const p = new BufferReader(data); dbkey = readAccountKey(dbkey); account.wid = dbkey.wid; @@ -292,7 +284,7 @@ function accountFromRaw(data, dbkey) { account.watchOnly = false; account.nestedDepth = 0; - name = account.name.replace(/[^\-\._0-9A-Za-z]+/g, ''); + const name = account.name.replace(/[^\-\._0-9A-Za-z]+/g, ''); if (name !== account.name) { console.log('Account name changed: %s -> %s.', account.name, name); @@ -300,10 +292,10 @@ function accountFromRaw(data, dbkey) { account.name = name; } - count = p.readU8(); + const count = p.readU8(); - for (i = 0; i < count; i++) { - key = bcoin.hd.fromRaw(p.readBytes(82)); + for (let i = 0; i < count; i++) { + const key = bcoin.hd.fromRaw(p.readBytes(82)); account.keys.push(key); } @@ -311,9 +303,8 @@ function accountFromRaw(data, dbkey) { } function walletFromRaw(data) { - let wallet = {}; - let p = new BufferReader(data); - let id; + const wallet = {}; + const p = new BufferReader(data); wallet.network = bcoin.network.fromMagic(p.readU32()); wallet.wid = p.readU32(); @@ -325,7 +316,7 @@ function walletFromRaw(data) { wallet.master = MasterKey.fromRaw(p.readVarBytes()); wallet.watchOnly = false; - id = wallet.id.replace(/[^\-\._0-9A-Za-z]+/g, ''); + const id = wallet.id.replace(/[^\-\._0-9A-Za-z]+/g, ''); if (id !== wallet.id) { console.log('Wallet ID changed: %s -> %s.', wallet.id, id); @@ -337,14 +328,13 @@ function walletFromRaw(data) { } function keyFromRaw(data, network) { - let ring = {}; - let p = new BufferReader(data); - let key, script; + const ring = {}; + const p = new BufferReader(data); ring.network = bcoin.network.get(network); ring.witness = p.readU8() === 1; - key = p.readVarBytes(); + const key = p.readVarBytes(); if (key.length === 32) { ring.privateKey = key; @@ -353,7 +343,7 @@ function keyFromRaw(data, network) { ring.publicKey = key; } - script = p.readVarBytes(); + const script = p.readVarBytes(); if (script.length > 0) ring.script = bcoin.script.fromRaw(script); diff --git a/migrate/walletdb3to4.js b/migrate/walletdb3to4.js index 005db2c06..b00d84ada 100644 --- a/migrate/walletdb3to4.js +++ b/migrate/walletdb3to4.js @@ -7,15 +7,14 @@ const WalletDB = require('../lib/wallet/walletdb'); const BufferReader = require('../lib/utils/reader'); const TX = require('../lib/primitives/tx'); const Coin = require('../lib/primitives/coin'); -const util = require('../lib/utils/util'); let file = process.argv[2]; -let db, batch; +let batch; assert(typeof file === 'string', 'Please pass in a database path.'); file = file.replace(/\.ldb\/?$/, ''); -db = bcoin.ldb({ +const db = bcoin.ldb({ location: file, db: 'leveldb', compression: true, @@ -25,15 +24,14 @@ db = bcoin.ldb({ }); async function updateVersion() { - let bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; - let data, ver; + const bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; console.log('Checking version.'); - data = await db.get('V'); + const data = await db.get('V'); assert(data, 'No version.'); - ver = data.readUInt32LE(0, true); + let ver = data.readUInt32LE(0, true); if (ver !== 3) throw Error(`DB is version ${ver}.`); @@ -49,31 +47,30 @@ async function updateVersion() { async function updateTXDB() { let txs = {}; - let i, keys, key, hash, tx, walletdb; - keys = await db.keys({ + const keys = await db.keys({ gte: Buffer.from([0x00]), lte: Buffer.from([0xff]) }); - for (i = 0; i < keys.length; i++) { - key = keys[i]; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; if (key[0] === 0x74 && key[5] === 0x74) { - tx = await db.get(key); + let tx = await db.get(key); tx = fromExtended(tx); - hash = tx.hash('hex'); + const hash = tx.hash('hex'); txs[hash] = tx; } if (key[0] === 0x74) batch.del(key); } - txs = util.values(txs); + txs = getValues(txs); await batch.write(); await db.close(); - walletdb = new WalletDB({ + const walletdb = new WalletDB({ location: file, db: 'leveldb', resolution: true, @@ -83,8 +80,8 @@ async function updateTXDB() { await walletdb.open(); - for (i = 0; i < txs.length; i++) { - tx = txs[i]; + for (let i = 0; i < txs.length; i++) { + const tx = txs[i]; await walletdb.addTX(tx); } @@ -92,17 +89,16 @@ async function updateTXDB() { } function fromExtended(data, saveCoins) { - let tx = new TX(); - let p = BufferReader(data); - let i, coinCount, coin; + const tx = new TX(); + const p = BufferReader(data); tx.fromRaw(p); tx.height = p.readU32(); tx.block = p.readHash('hex'); tx.index = p.readU32(); - tx.ts = p.readU32(); - tx.ps = p.readU32(); + tx.time = p.readU32(); + tx.mtime = p.readU32(); if (tx.block === encoding.NULL_HASH) tx.block = null; @@ -114,9 +110,9 @@ function fromExtended(data, saveCoins) { tx.index = -1; if (saveCoins) { - coinCount = p.readVarint(); - for (i = 0; i < coinCount; i++) { - coin = p.readVarBytes(); + const coinCount = p.readVarint(); + for (let i = 0; i < coinCount; i++) { + let coin = p.readVarBytes(); if (coin.length === 0) continue; coin = Coin.fromRaw(coin); @@ -129,6 +125,15 @@ function fromExtended(data, saveCoins) { return tx; } +function getValues(map) { + const items = []; + + for (const key of Object.keys(map)) + items.push(map[key]); + + return items; +} + (async () => { await db.open(); batch = db.batch(); diff --git a/migrate/walletdb4to5.js b/migrate/walletdb4to5.js index 760ba34e7..9a767607b 100644 --- a/migrate/walletdb4to5.js +++ b/migrate/walletdb4to5.js @@ -3,13 +3,13 @@ const assert = require('assert'); const bcoin = require('../'); let file = process.argv[2]; -let db, batch; +let batch; assert(typeof file === 'string', 'Please pass in a database path.'); file = file.replace(/\.ldb\/?$/, ''); -db = bcoin.ldb({ +const db = bcoin.ldb({ location: file, db: 'leveldb', compression: true, @@ -19,15 +19,14 @@ db = bcoin.ldb({ }); async function updateVersion() { - let bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; - let data, ver; + const bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; console.log('Checking version.'); - data = await db.get('V'); + const data = await db.get('V'); assert(data, 'No version.'); - ver = data.readUInt32LE(0, true); + let ver = data.readUInt32LE(0, true); if (ver !== 4) throw Error(`DB is version ${ver}.`); @@ -42,15 +41,13 @@ async function updateVersion() { } async function updateTXDB() { - let i, keys, key; - - keys = await db.keys({ + const keys = await db.keys({ gte: Buffer.from([0x00]), lte: Buffer.from([0xff]) }); - for (i = 0; i < keys.length; i++) { - key = keys[i]; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; switch (key[0]) { case 0x62: // b case 0x63: // c diff --git a/migrate/walletdb5to6.js b/migrate/walletdb5to6.js index 371897ba9..353cf4a11 100644 --- a/migrate/walletdb5to6.js +++ b/migrate/walletdb5to6.js @@ -6,13 +6,13 @@ const encoding = require('../lib/utils/encoding'); const BufferWriter = require('../lib/utils/writer'); const BufferReader = require('../lib/utils/reader'); let file = process.argv[2]; -let db, batch; +let batch; assert(typeof file === 'string', 'Please pass in a database path.'); file = file.replace(/\.ldb\/?$/, ''); -db = bcoin.ldb({ +const db = bcoin.ldb({ location: file, db: 'leveldb', compression: true, @@ -22,15 +22,14 @@ db = bcoin.ldb({ }); async function updateVersion() { - let bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; - let data, ver; + const bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`; console.log('Checking version.'); - data = await db.get('V'); + const data = await db.get('V'); assert(data, 'No version.'); - ver = data.readUInt32LE(0, true); + let ver = data.readUInt32LE(0, true); if (ver !== 5) throw Error(`DB is version ${ver}.`); @@ -46,15 +45,14 @@ async function updateVersion() { async function wipeTXDB() { let total = 0; - let i, keys, key; - keys = await db.keys({ + const keys = await db.keys({ gte: Buffer.from([0x00]), lte: Buffer.from([0xff]) }); - for (i = 0; i < keys.length; i++) { - key = keys[i]; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; switch (key[0]) { case 0x62: // b case 0x63: // c @@ -74,18 +72,16 @@ async function wipeTXDB() { } async function patchAccounts() { - let i, items, item, wid, index, account; - - items = await db.range({ + const items = await db.range({ gte: Buffer.from('610000000000000000', 'hex'), // a lte: Buffer.from('61ffffffffffffffff', 'hex') // a }); - for (i = 0; i < items.length; i++) { - item = items[i]; - wid = item.key.readUInt32BE(1, true); - index = item.key.readUInt32BE(5, true); - account = accountFromRaw(item.value); + for (let i = 0; i < items.length; i++) { + const item = items[i]; + const wid = item.key.readUInt32BE(1, true); + const index = item.key.readUInt32BE(5, true); + const account = accountFromRaw(item.value); console.log('a[%d][%d] -> lookahead=%d', wid, index, account.lookahead); batch.put(item.key, accountToRaw(account)); console.log('n[%d][%d] -> %s', wid, index, account.name); @@ -94,43 +90,39 @@ async function patchAccounts() { } async function indexPaths() { - let i, items, item, wid, index, hash; - - items = await db.range({ + const items = await db.range({ gte: Buffer.from('5000000000' + encoding.NULL_HASH, 'hex'), // P lte: Buffer.from('50ffffffff' + encoding.HIGH_HASH, 'hex') // P }); - for (i = 0; i < items.length; i++) { - item = items[i]; - wid = item.key.readUInt32BE(1, true); - hash = item.key.toString('hex', 5); - index = item.value.readUInt32LE(0, true); + for (let i = 0; i < items.length; i++) { + const item = items[i]; + const wid = item.key.readUInt32BE(1, true); + const hash = item.key.toString('hex', 5); + const index = item.value.readUInt32LE(0, true); console.log('r[%d][%d][%s] -> NUL', wid, index, hash); batch.put(r(wid, index, hash), Buffer.from([0])); } } async function patchPathMaps() { - let i, items, item, hash, wids; - - items = await db.range({ + const items = await db.range({ gte: Buffer.from('70' + encoding.NULL_HASH, 'hex'), // p lte: Buffer.from('70' + encoding.HIGH_HASH, 'hex') // p }); - for (i = 0; i < items.length; i++) { - item = items[i]; - hash = item.key.toString('hex', 1); - wids = parseWallets(item.value); + for (let i = 0; i < items.length; i++) { + const item = items[i]; + const hash = item.key.toString('hex', 1); + const wids = parseWallets(item.value); console.log('p[%s] -> u32(%d)', hash, wids.length); batch.put(item.key, serializeWallets(wids)); } } function parseWallets(data) { - let p = new BufferReader(data); - let wids = []; + const p = new BufferReader(data); + const wids = []; while (p.left()) wids.push(p.readU32()); @@ -139,13 +131,12 @@ function parseWallets(data) { } function serializeWallets(wids) { - let p = new BufferWriter(); - let i, wid; + const p = new BufferWriter(); p.writeU32(wids.length); - for (i = 0; i < wids.length; i++) { - wid = wids[i]; + for (let i = 0; i < wids.length; i++) { + const wid = wids[i]; p.writeU32(wid); } @@ -153,8 +144,7 @@ function serializeWallets(wids) { } function accountToRaw(account) { - let p = new BufferWriter(); - let i, key; + const p = new BufferWriter(); p.writeVarString(account.name, 'ascii'); p.writeU8(account.initialized ? 1 : 0); @@ -170,8 +160,8 @@ function accountToRaw(account) { p.writeBytes(account.accountKey); p.writeU8(account.keys.length); - for (i = 0; i < account.keys.length; i++) { - key = account.keys[i]; + for (let i = 0; i < account.keys.length; i++) { + const key = account.keys[i]; p.writeBytes(key); } @@ -179,9 +169,8 @@ function accountToRaw(account) { }; function accountFromRaw(data) { - let account = {}; - let p = new BufferReader(data); - let i, count, key; + const account = {}; + const p = new BufferReader(data); account.name = p.readVarString('ascii'); account.initialized = p.readU8() === 1; @@ -197,10 +186,10 @@ function accountFromRaw(data) { account.accountKey = p.readBytes(82); account.keys = []; - count = p.readU8(); + const count = p.readU8(); - for (i = 0; i < count; i++) { - key = p.readBytes(82); + for (let i = 0; i < count; i++) { + const key = p.readBytes(82); account.keys.push(key); } @@ -208,7 +197,7 @@ function accountFromRaw(data) { } function n(wid, index) { - let key = Buffer.allocUnsafe(9); + const key = Buffer.allocUnsafe(9); key[0] = 0x6e; key.writeUInt32BE(wid, 1, true); key.writeUInt32BE(index, 5, true); @@ -216,7 +205,7 @@ function n(wid, index) { } function r(wid, index, hash) { - let key = Buffer.allocUnsafe(1 + 4 + 4 + (hash.length / 2)); + const key = Buffer.allocUnsafe(1 + 4 + 4 + (hash.length / 2)); key[0] = 0x72; key.writeUInt32BE(wid, 1, true); key.writeUInt32BE(index, 5, true); @@ -225,10 +214,9 @@ function r(wid, index, hash) { } async function updateLookahead() { - let WalletDB = require('../lib/wallet/walletdb'); - let i, j, db, wallet; + const WalletDB = require('../lib/wallet/walletdb'); - db = new WalletDB({ + const db = new WalletDB({ network: process.argv[3], db: 'leveldb', location: file, @@ -241,11 +229,11 @@ async function updateLookahead() { await db.open(); - for (i = 1; i < db.depth; i++) { - wallet = await db.get(i); + for (let i = 1; i < db.depth; i++) { + const wallet = await db.get(i); assert(wallet); console.log('Updating wallet lookahead: %s', wallet.id); - for (j = 0; j < wallet.accountDepth; j++) + for (let j = 0; j < wallet.accountDepth; j++) await wallet.setLookahead(j, 20); } diff --git a/package.json b/package.json index f134187fe..5b588d835 100644 --- a/package.json +++ b/package.json @@ -23,49 +23,52 @@ "node": ">=7.6.0" }, "dependencies": { - "bn.js": "4.11.7", + "bn.js": "4.11.8", "elliptic": "6.4.0", - "n64": "0.0.12" + "n64": "0.0.18" }, "optionalDependencies": { "bcoin-native": "0.0.23", "leveldown": "1.7.2", - "secp256k1": "3.2.5", - "socket.io": "2.0.1", - "socket.io-client": "2.0.1" + "secp256k1": "3.3.0", + "socket.io": "2.0.3", + "socket.io-client": "2.0.3" }, "devDependencies": { "babel-core": "^6.25.0", - "babel-loader": "^7.1.0", + "babel-loader": "^7.1.1", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-es2015": "^6.24.1", "babel-preset-es2016": "^6.24.1", "babel-preset-es2017": "^6.24.1", - "eslint": "^4.1.0", - "hash.js": "^1.0.3", - "jsdoc": "^3.4.3", + "babel-preset-env": "^1.6.0", + "eslint": "^4.4.1", + "hash.js": "^1.1.3", + "jsdoc": "^3.5.4", "level-js": "^2.2.4", - "mocha": "^3.4.1", + "mocha": "^3.5.0", "node-loader": "^0.6.0", - "uglifyjs-webpack-plugin": "^1.0.0-beta.1", - "webpack": "^3.0.0" + "uglifyjs-webpack-plugin": "^1.0.0-beta.2", + "webpack": "^3.5.4" }, "main": "./lib/bcoin.js", "bin": { - "bcoin-node": "./bin/node", - "bcoin-spvnode": "./bin/spvnode", + "bcoin": "./bin/bcoin", "bcoin-cli": "./bin/cli", - "bcoin": "./bin/bcoin" + "bcoin-node": "./bin/node", + "bcoin-spvnode": "./bin/spvnode" }, "scripts": { "clean": "rm -f {browser/,}{bcoin.js,bcoin-worker.js}", "docs": "jsdoc -c jsdoc.json", - "lint": "eslint lib/ test/ migrate/ examples/ bench/ scripts/*.js bin/cli bin/node bin/spvnode || exit 0", + "lint": "eslint $(cat .eslintfiles) || exit 0", "lint-file": "eslint", - "test": "mocha --reporter spec test/*-test.js", - "test-browser": "BCOIN_NO_NATIVE=1 BCOIN_NO_SECP256K1=1 mocha --reporter spec test/*-test.js", + "test": "mocha --reporter spec test/*.js", + "test-browser": + "BCOIN_NO_NATIVE=1 BCOIN_NO_SECP256K1=1 mocha --reporter spec test/*.js", "test-file": "mocha --reporter spec", - "test-file-browser": "BCOIN_NO_NATIVE=1 BCOIN_NO_SECP256K1=1 mocha --reporter spec", + "test-file-browser": + "BCOIN_NO_NATIVE=1 BCOIN_NO_SECP256K1=1 mocha --reporter spec", "webpack": "webpack --config webpack.browser.js", "webpack-browser": "webpack --config webpack.browser.js", "webpack-compat": "webpack --config webpack.compat.js", diff --git a/scripts/dump.js b/scripts/dump.js index 1af07baf8..3fecf52c0 100644 --- a/scripts/dump.js +++ b/scripts/dump.js @@ -1,45 +1,22 @@ 'use strict'; -const fs = require('fs'); const heapdump = require('heapdump'); const MempoolEntry = require('../lib/mempool/mempoolentry'); const Coins = require('../lib/coins/coins'); -const TX = require('../lib/primitives/tx'); -const CoinView = require('../lib/coins/coinview'); +const common = require('../test/util/common'); -let SNAPSHOT = `${__dirname}/../dump.heapsnapshot`; -let tx = parseTX('../test/data/tx4.hex'); -let raw, coins, entry; - -function parseTX(file) { - let data = fs.readFileSync(`${__dirname}/${file}`, 'utf8'); - let parts = data.trim().split(/\n+/); - let raw = parts[0]; - let tx = TX.fromRaw(raw.trim(), 'hex'); - let view = new CoinView(); - let i, prev; - - for (i = 1; i < parts.length; i++) { - raw = parts[i]; - prev = TX.fromRaw(raw.trim(), 'hex'); - view.addTX(prev, -1); - } - - return { tx: tx, view: view }; -} - -raw = Coins.fromTX(tx.tx, 0).toRaw(); -coins = Coins.fromRaw(raw, tx.tx.hash('hex')); -entry = MempoolEntry.fromTX(tx.tx, tx.view, 1000000); +const [tx, view] = common.readTX('tx4').getTX(); +const coins = Coins.fromTX(tx, 0); +const entry = MempoolEntry.fromTX(tx, view, 1000000); setInterval(() => { console.log(tx.hash('hex')); - console.log(coins.hash); + console.log(coins.outputs.length); console.log(entry.tx); }, 60 * 1000); setImmediate(() => { - heapdump.writeSnapshot(SNAPSHOT, (err) => { + heapdump.writeSnapshot(`${__dirname}/../dump.heapsnapshot`, (err) => { if (err) throw err; }); diff --git a/scripts/fuzz.js b/scripts/fuzz.js index 88fc35086..87835e2cb 100644 --- a/scripts/fuzz.js +++ b/scripts/fuzz.js @@ -1,6 +1,5 @@ 'use strict'; -const assert = require('assert'); const util = require('../lib/utils/util'); const Script = require('../lib/script/script'); const Stack = require('../lib/script/stack'); @@ -10,17 +9,72 @@ const Output = require('../lib/primitives/output'); const Outpoint = require('../lib/primitives/outpoint'); const TX = require('../lib/primitives/tx'); const random = require('../lib/crypto/random'); +const secp256k1 = require('../lib/crypto/secp256k1'); +const flags = Script.flags; -const MANDATORY = Script.flags.MANDATORY_VERIFY_FLAGS | Script.flags.VERIFY_WITNESS; -const STANDARD = Script.flags.STANDARD_VERIFY_FLAGS; +let consensus = null; + +try { + consensus = require('nodeconsensus'); +} catch (e) { + ; +} + +if (consensus) + util.log('Running against bitcoinconsensus...'); + +const MANDATORY = flags.MANDATORY_VERIFY_FLAGS | flags.VERIFY_WITNESS; +const STANDARD = flags.STANDARD_VERIFY_FLAGS; + +function verifyConsensus(tx, index, output, value, flags) { + if (!consensus) + return 'OK'; + return consensus.verify(tx.toRaw(), index, output.toRaw(), value, flags); +} + +function assertConsensus(tx, output, flags, code) { + if (!consensus) + return; + + const err = verifyConsensus(tx, 0, output, 0, flags); + + if (err !== code) { + util.log('bitcoinconsensus mismatch!'); + util.log(`${err} (bitcoin core) !== ${code} (bcoin)`); + util.log(tx); + util.log(output); + util.log(flags); + util.log('TX: %s', tx.toRaw().toString('hex')); + util.log('Output Script: %s', output.toRaw().toString('hex')); + } +} + +function randomSignature() { + const r = secp256k1.generatePrivateKey(); + const s = secp256k1.generatePrivateKey(); + return secp256k1.toDER(Buffer.concat([r, s])); +} + +function randomKey() { + const x = secp256k1.generatePrivateKey(); + const y = secp256k1.generatePrivateKey(); + + if (util.random(0, 2) === 0) { + const p = Buffer.from([2 | (y[y.length - 1] & 1)]); + return Buffer.concat([p, x]); + } + + const p = Buffer.from([4]); + return Buffer.concat([p, x, y]); +} function randomOutpoint() { - let hash = random.randomBytes(32).toString('hex'); + const hash = random.randomBytes(32).toString('hex'); return new Outpoint(hash, util.random(0, 0xffffffff)); } function randomInput() { - let input = Input.fromOutpoint(randomOutpoint()); + const input = Input.fromOutpoint(randomOutpoint()); if (util.random(0, 5) === 0) input.sequence = util.random(0, 0xffffffff); @@ -33,18 +87,17 @@ function randomOutput() { } function randomTX() { - let tx = new TX(); - let inputs = util.random(1, 5); - let outputs = util.random(0, 5); - let i; + const tx = new TX(); + const inputs = util.random(1, 5); + const outputs = util.random(0, 5); tx.version = util.random(0, 0xffffffff); - for (i = 0; i < inputs; i++) + for (let i = 0; i < inputs; i++) tx.inputs.push(randomInput()); - for (i = 0; i < outputs; i++) - tx.inputs.push(randomOutput()); + for (let i = 0; i < outputs; i++) + tx.outputs.push(randomOutput()); if (util.random(0, 5) === 0) tx.locktime = util.random(0, 0xffffffff); @@ -55,12 +108,11 @@ function randomTX() { } function randomWitness(redeem) { - let size = util.random(1, 100); - let witness = new Witness(); - let i, len; + const size = util.random(1, 100); + const witness = new Witness(); - for (i = 0; i < size; i++) { - len = util.random(0, 100); + for (let i = 0; i < size; i++) { + const len = util.random(0, 100); witness.push(random.randomBytes(len)); } @@ -73,37 +125,30 @@ function randomWitness(redeem) { } function randomInputScript(redeem) { - let size = util.random(1, 100); - let script = new Script(); - let i, len; + const size = util.random(1, 100); + const script = new Script(); - for (i = 0; i < size; i++) { - len = util.random(0, 100); - script.push(random.randomBytes(len)); + for (let i = 0; i < size; i++) { + const len = util.random(0, 100); + script.pushData(random.randomBytes(len)); } if (redeem) - script.push(redeem); - - script.compile(); + script.pushData(redeem); - return script; + return script.compile(); } function randomOutputScript() { - let size = util.random(1, 10000); + const size = util.random(1, 10000); return Script.fromRaw(random.randomBytes(size)); } function isPushOnly(script) { - let i, op; - if (script.isPushOnly()) return true; - for (i = 0; i < script.code.length; i++) { - op = script.code[i]; - + for (const op of script.code) { if (op.value === Script.opcodes.NOP) continue; @@ -120,7 +165,7 @@ function isPushOnly(script) { } function randomPubkey() { - let len = util.random(0, 2) === 0 ? 33 : 65; + const len = util.random(0, 2) === 0 ? 33 : 65; return Script.fromPubkey(random.randomBytes(len)); } @@ -129,13 +174,12 @@ function randomPubkeyhash() { } function randomMultisig() { - let n = util.random(1, 16); - let m = util.random(1, n); - let keys = []; - let i, len; + const n = util.random(1, 16); + const m = util.random(1, n); + const keys = []; - for (i = 0; i < n; i++) { - len = util.random(0, 2) === 0 ? 33 : 65; + for (let i = 0; i < n; i++) { + const len = util.random(0, 2) === 0 ? 33 : 65; keys.push(random.randomBytes(len)); } @@ -155,8 +199,8 @@ function randomWitnessScripthash() { } function randomProgram() { - let version = util.random(0, 16); - let size = util.random(2, 41); + const version = util.random(0, 16); + const size = util.random(2, 41); return Script.fromProgram(version, random.randomBytes(size)); } @@ -173,7 +217,7 @@ function randomRedeem() { case 4: return randomProgram(); } - assert(false); + throw new Error(); } function randomScript() { @@ -193,7 +237,7 @@ function randomScript() { case 6: return randomProgram(); } - assert(false); + throw new Error(); } function randomPubkeyContext() { @@ -215,7 +259,7 @@ function randomPubkeyhashContext() { } function randomScripthashContext() { - let redeem = randomRedeem(); + const redeem = randomRedeem(); return { input: randomInputScript(redeem.toRaw()), witness: new Witness(), @@ -234,7 +278,7 @@ function randomWitnessPubkeyhashContext() { } function randomWitnessScripthashContext() { - let redeem = randomRedeem(); + const redeem = randomRedeem(); return { input: new Script(), witness: randomWitness(redeem.toRaw()), @@ -244,10 +288,10 @@ function randomWitnessScripthashContext() { } function randomWitnessNestedContext() { - let redeem = randomRedeem(); - let program = Script.fromProgram(0, redeem.sha256()); + const redeem = randomRedeem(); + const program = Script.fromProgram(0, redeem.sha256()); return { - input: new Script([program.toRaw()]), + input: Script.fromItems([program.toRaw()]), witness: randomWitness(redeem.toRaw()), output: Script.fromScripthash(program.hash160()), redeem: redeem @@ -269,13 +313,12 @@ function randomContext() { case 5: return randomWitnessNestedContext(); } - assert(false); + throw new Error(); } function fuzzSimple(flags) { let tx = randomTX(); let total = -1; - let stack, input, output; for (;;) { if (++total % 1000 === 0) @@ -284,8 +327,8 @@ function fuzzSimple(flags) { if (total % 500 === 0) tx = randomTX(); - stack = new Stack(); - input = randomInputScript(); + const stack = new Stack(); + const input = randomInputScript(); try { input.execute(stack, flags, tx, 0, 0, 0); @@ -295,7 +338,7 @@ function fuzzSimple(flags) { throw e; } - output = randomOutputScript(); + const output = randomOutputScript(); try { output.execute(stack, flags, tx, 0, 0, 0); @@ -308,7 +351,7 @@ function fuzzSimple(flags) { if (stack.length === 0) continue; - if (!Script.bool(stack.top(-1))) + if (!stack.getBool(-1)) continue; if (isPushOnly(output)) @@ -332,7 +375,6 @@ function fuzzSimple(flags) { function fuzzVerify(flags) { let tx = randomTX(); let total = -1; - let input, output, witness; for (;;) { if (++total % 1000 === 0) @@ -341,9 +383,14 @@ function fuzzVerify(flags) { if (total % 500 === 0) tx = randomTX(); - input = randomInputScript(); - witness = randomWitness(); - output = randomOutputScript(); + const input = randomInputScript(); + const witness = randomWitness(); + const output = randomOutputScript(); + + tx.inputs[0].script = input; + tx.inputs[0].witness = witness; + + tx.refresh(); try { Script.verify( @@ -356,11 +403,15 @@ function fuzzVerify(flags) { flags ); } catch (e) { - if (e.type === 'ScriptError') + if (e.type === 'ScriptError') { + assertConsensus(tx, output, flags, e.code); continue; + } throw e; } + assertConsensus(tx, output, flags, 'OK'); + if (isPushOnly(output)) continue; @@ -382,7 +433,6 @@ function fuzzVerify(flags) { function fuzzLess(flags) { let tx = randomTX(); let total = -1; - let ctx; for (;;) { if (++total % 1000 === 0) @@ -391,7 +441,13 @@ function fuzzLess(flags) { if (total % 500 === 0) tx = randomTX(); - ctx = randomContext(); + const ctx = randomContext(); + const input = tx.inputs[0]; + + input.script = ctx.input; + input.witness = ctx.witness; + + tx.refresh(); try { Script.verify( @@ -404,11 +460,15 @@ function fuzzLess(flags) { flags ); } catch (e) { - if (e.type === 'ScriptError') + if (e.type === 'ScriptError') { + assertConsensus(tx, ctx.output, flags, e.code); continue; + } throw e; } + assertConsensus(tx, ctx.output, flags, 'OK'); + util.log('Produced valid scripts:'); util.log('Input:'); @@ -430,15 +490,20 @@ function fuzzLess(flags) { } function main() { - let flags = process.argv.indexOf('--standard') !== -1 ? STANDARD : MANDATORY; + const flags = process.argv.indexOf('--standard') !== -1 + ? STANDARD + : MANDATORY; switch (process.argv[2]) { case 'simple': - return fuzzSimple(flags); + fuzzSimple(flags); + break; case 'verify': - return fuzzVerify(flags); + fuzzVerify(flags); + break; case 'less': - return fuzzLess(flags); + fuzzLess(flags); + break; default: util.log('Please select a mode:'); util.log('simple, verify, less'); @@ -447,4 +512,7 @@ function main() { } } +randomKey; +randomSignature; + main(); diff --git a/scripts/gen.js b/scripts/gen.js index e4782e99b..e3fe3d3d4 100644 --- a/scripts/gen.js +++ b/scripts/gen.js @@ -1,22 +1,16 @@ 'use strict'; -const BN = require('../lib/crypto/bn'); const util = require('../lib/utils/util'); const consensus = require('../lib/protocol/consensus'); const encoding = require('../lib/utils/encoding'); const TX = require('../lib/primitives/tx'); const Block = require('../lib/primitives/block'); const Script = require('../lib/script/script'); -const Opcode = require('../lib/script/opcode'); -const opcodes = Script.opcodes; - -let main, testnet, regtest, segnet3, segnet4, btcd; function createGenesisBlock(options) { let flags = options.flags; - let script = options.script; + let key = options.key; let reward = options.reward; - let tx, block; if (!flags) { flags = Buffer.from( @@ -24,93 +18,90 @@ function createGenesisBlock(options) { 'ascii'); } - if (!script) { - script = Script.fromArray([ - Buffer.from('04678afdb0fe5548271967f1a67130b7105cd6a828e039' - + '09a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c3' - + '84df7ba0b8d578a4c702b6bf11d5f', 'hex'), - opcodes.OP_CHECKSIG - ]); + if (!key) { + key = Buffer.from('' + + '04678afdb0fe5548271967f1a67130b7105cd6a828e039' + + '09a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c3' + + '84df7ba0b8d578a4c702b6bf11d5f', 'hex'); } if (!reward) reward = 50 * consensus.COIN; - tx = new TX({ + const tx = new TX({ version: 1, - flag: 1, inputs: [{ prevout: { hash: encoding.NULL_HASH, index: 0xffffffff }, - script: [ - Opcode.fromNumber(new BN(486604799)), - Opcode.fromPush(Buffer.from([4])), - Opcode.fromData(flags) - ], + script: Script() + .pushInt(486604799) + .pushPush(Buffer.from([4])) + .pushData(flags) + .compile(), sequence: 0xffffffff }], outputs: [{ value: reward, - script: script + script: Script.fromPubkey(key) }], locktime: 0 }); - block = new Block({ + const block = new Block({ version: options.version, prevBlock: encoding.NULL_HASH, merkleRoot: tx.hash('hex'), - ts: options.ts, + time: options.time, bits: options.bits, nonce: options.nonce, height: 0 }); - block.addTX(tx); + block.txs.push(tx); return block; } -main = createGenesisBlock({ +const main = createGenesisBlock({ version: 1, - ts: 1231006505, + time: 1231006505, bits: 486604799, nonce: 2083236893 }); -testnet = createGenesisBlock({ +const testnet = createGenesisBlock({ version: 1, - ts: 1296688602, + time: 1296688602, bits: 486604799, nonce: 414098458 }); -regtest = createGenesisBlock({ +const regtest = createGenesisBlock({ version: 1, - ts: 1296688602, + time: 1296688602, bits: 545259519, nonce: 2 }); -segnet3 = createGenesisBlock({ +const segnet3 = createGenesisBlock({ version: 1, - ts: 1452831101, + time: 1452831101, bits: 486604799, nonce: 0 }); -segnet4 = createGenesisBlock({ +const segnet4 = createGenesisBlock({ version: 1, - ts: 1452831101, + time: 1452831101, bits: 503447551, nonce: 0 }); -btcd = createGenesisBlock({ +const btcd = createGenesisBlock({ version: 1, - ts: 1401292357, + time: 1401292357, bits: 545259519, nonce: 2 }); diff --git a/test/aes-test.js b/test/aes-test.js index 5817d9c80..32c547efa 100644 --- a/test/aes-test.js +++ b/test/aes-test.js @@ -1,158 +1,49 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); -const digest = require('../lib/crypto/digest'); +const assert = require('./util/assert'); const aes = require('../lib/crypto/aes'); -const pbkdf2 = require('../lib/crypto/pbkdf2'); -const nativeCrypto = require('crypto'); - -describe('AES', function() { - function pbkdf2key(passphrase, iterations, dkLen, ivLen, alg) { - let key = pbkdf2.derive(passphrase, '', iterations, dkLen + ivLen, 'sha512'); - return { - key: key.slice(0, dkLen), - iv: key.slice(dkLen, dkLen + ivLen) - }; - } - - function nencrypt(data, passphrase) { - let key, cipher; - - assert(nativeCrypto, 'No crypto module available.'); - assert(passphrase, 'No passphrase.'); - - if (typeof data === 'string') - data = Buffer.from(data, 'utf8'); - - if (typeof passphrase === 'string') - passphrase = Buffer.from(passphrase, 'utf8'); - - key = pbkdf2key(passphrase, 2048, 32, 16); - cipher = nativeCrypto.createCipheriv('aes-256-cbc', key.key, key.iv); - - return Buffer.concat([ - cipher.update(data), - cipher.final() - ]); - } - - function ndecrypt(data, passphrase) { - let key, decipher; - - assert(nativeCrypto, 'No crypto module available.'); - assert(passphrase, 'No passphrase.'); - - if (typeof data === 'string') - data = Buffer.from(data, 'hex'); - - if (typeof passphrase === 'string') - passphrase = Buffer.from(passphrase, 'utf8'); - - key = pbkdf2key(passphrase, 2048, 32, 16); - decipher = nativeCrypto.createDecipheriv('aes-256-cbc', key.key, key.iv); - - return Buffer.concat([ - decipher.update(data), - decipher.final() - ]); - } - - function bencrypt(data, passphrase) { - let key; - - assert(nativeCrypto, 'No crypto module available.'); - assert(passphrase, 'No passphrase.'); - - if (typeof data === 'string') - data = Buffer.from(data, 'utf8'); - - if (typeof passphrase === 'string') - passphrase = Buffer.from(passphrase, 'utf8'); - key = pbkdf2key(passphrase, 2048, 32, 16); - return aes.encipher(data, key.key, key.iv); - } +const key = Buffer.from( + '3a0c0bf669694ac7685e6806eeadee8e56c9b9bd22c3caa81c718ed4bbf809a1', + 'hex'); - function bdecrypt(data, passphrase) { - let key; +const iv = Buffer.from('6dd26d9045b73c377a9ed2ffeca72ffd', 'hex'); - assert(nativeCrypto, 'No crypto module available.'); - assert(passphrase, 'No passphrase.'); - - if (typeof data === 'string') - data = Buffer.from(data, 'hex'); - - if (typeof passphrase === 'string') - passphrase = Buffer.from(passphrase, 'utf8'); - - key = pbkdf2key(passphrase, 2048, 32, 16); - return aes.decipher(data, key.key, key.iv); - } - - function encrypt(data, passphrase) { - let key; - - assert(nativeCrypto, 'No crypto module available.'); - assert(passphrase, 'No passphrase.'); - - if (typeof data === 'string') - data = Buffer.from(data, 'utf8'); - - if (typeof passphrase === 'string') - passphrase = Buffer.from(passphrase, 'utf8'); - - key = pbkdf2key(passphrase, 2048, 32, 16); - - return aes.encipher(data, key.key, key.iv); - } - - function decrypt(data, passphrase) { - let key; - - assert(nativeCrypto, 'No crypto module available.'); - assert(passphrase, 'No passphrase.'); - - if (typeof data === 'string') - data = Buffer.from(data, 'hex'); - - if (typeof passphrase === 'string') - passphrase = Buffer.from(passphrase, 'utf8'); - - key = pbkdf2key(passphrase, 2048, 32, 16); - - return aes.decipher(data, key.key, key.iv); - } - - it('should encrypt and decrypt a hash with 2 blocks', () => { - let hash = digest.sha256(Buffer.alloc(0)); - let enchash = encrypt(hash, 'foo'); - let dechash = decrypt(enchash, 'foo'); +describe('AES', function() { + it('should encrypt and decrypt with 2 blocks', () => { + const data = Buffer.from( + 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', + 'hex'); - let hash2 = digest.sha256(Buffer.alloc(0)); - let enchash2 = nencrypt(hash2, 'foo'); - let dechash2 = ndecrypt(enchash2, 'foo'); + const expected = Buffer.from('' + + '83de502a9c83112ca6383f2214a892a0cdad5ab2b3e192e' + + '9921ddb126b25262c41f1dcff4d67ccfb40e4116e5a4569c1', + 'hex'); - let hash3 = digest.sha256(Buffer.alloc(0)); - let enchash3 = bencrypt(hash3, 'foo'); - let dechash3 = bdecrypt(enchash3, 'foo'); + const ciphertext = aes.encipher(data, key, iv); + assert.bufferEqual(ciphertext, expected); - assert.deepEqual(hash, hash2); - assert.deepEqual(enchash, enchash2); - assert.deepEqual(dechash, dechash2); - assert.deepEqual(dechash, dechash3); + const plaintext = aes.decipher(ciphertext, key, iv); + assert.bufferEqual(plaintext, data); }); - it('should encrypt and decrypt a hash with uneven blocks', () => { - let hash = Buffer.concat([digest.sha256(Buffer.alloc(0)), Buffer.from([1,2,3])]); - let enchash = encrypt(hash, 'foo'); - let dechash = decrypt(enchash, 'foo'); + it('should encrypt and decrypt with uneven blocks', () => { + const data = Buffer.from( + 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855010203', + 'hex'); + + const expected = Buffer.from('' + + '83de502a9c83112ca6383f2214a892a0cdad5ab2b3e192e9' + + '921ddb126b25262c5211801019a30c0c6f795296923e0af8', + 'hex'); - let hash2 = Buffer.concat([digest.sha256(Buffer.alloc(0)), Buffer.from([1,2,3])]); - let enchash2 = nencrypt(hash2, 'foo'); - let dechash2 = ndecrypt(enchash2, 'foo'); + const ciphertext = aes.encipher(data, key, iv); + assert.bufferEqual(ciphertext, expected); - assert.deepEqual(hash, hash2); - assert.deepEqual(enchash, enchash2); - assert.deepEqual(dechash, dechash2); + const plaintext = aes.decipher(ciphertext, key, iv); + assert.bufferEqual(plaintext, data); }); }); diff --git a/test/bech32-test.js b/test/bech32-test.js index a50a28551..e78f78fc9 100644 --- a/test/bech32-test.js +++ b/test/bech32-test.js @@ -21,127 +21,134 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); +const assert = require('./util/assert'); const bech32 = require('../lib/utils/bech32'); const Address = require('../lib/primitives/address'); -describe('Bech32', function() { - const VALID_CHECKSUM = [ - 'A12UEL5L', - 'an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs', - 'abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw', - '11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j', - 'split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w' - ]; - - const VALID_ADDRESS = [ - [ - 'BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4', - Buffer.from([ - 0x00, 0x14, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, - 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6 - ]) - ], - [ - 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7', - Buffer.from([ - 0x00, 0x20, 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, 0x04, - 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, 0x6c, 0x98, 0x56, 0x78, - 0xcd, 0x4d, 0x27, 0xa1, 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, - 0x62 - ]) - ], - [ - 'bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx', - Buffer.from([ - 0x81, 0x28, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, - 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6, - 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, - 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6 - ]) - ], - [ - 'BC1SW50QA3JX3S', - Buffer.from([ - 0x90, 0x02, 0x75, 0x1e - ]) - ], - [ - 'bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj', - Buffer.from([ - 0x82, 0x10, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, - 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23 - ]) - ], - [ - 'tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy', - Buffer.from([ - 0x00, 0x20, 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, 0x21, - 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, 0x36, 0x2b, 0x99, 0xd5, - 0xe9, 0x1c, 0x6c, 0xe2, 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, - 0x33 - ]) - ] - ]; - - const INVALID_ADDRESS = [ - 'tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty', - 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5', - 'BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2', - 'bc1rw5uspcuh', - 'bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90', - 'BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P', - 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7', - 'tb1pw508d6qejxtdg4y5r3zarqfsj6c3', - 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv', - ]; - - function fromAddress(hrp, addr) { - let dec = bech32.decode(addr); - - if (dec.hrp !== hrp) - throw new Error('Invalid bech32 prefix or data length.'); - - if (dec.version === 0 && dec.hash.length !== 20 && dec.hash.length !== 32) - throw new Error('Malformed witness program.'); - - return { - version: dec.version, - program: dec.hash - }; - } - - function toAddress(hrp, version, program) { - let ret = bech32.encode(hrp, version, program); - - fromAddress(hrp, ret); - - return ret; - } - - function createProgram(version, program) { - let ver = Buffer.from([version ? version + 0x80 : 0, program.length]); - return Buffer.concat([ver, program]); - } +const validChecksums = [ + 'A12UEL5L', + 'an83characterlonghumanreadablepartthatcontains' + + 'thenumber1andtheexcludedcharactersbio1tt5tgs', + 'abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw', + '11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + + 'qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j', + 'split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w' +]; + +const validAddresses = [ + [ + 'BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4', + Buffer.from([ + 0x00, 0x14, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, + 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6 + ]) + ], + [ + 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7', + Buffer.from([ + 0x00, 0x20, 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, 0x04, + 0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, 0x6c, 0x98, 0x56, 0x78, + 0xcd, 0x4d, 0x27, 0xa1, 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, + 0x62 + ]) + ], + [ + 'bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw50' + + '8d6qejxtdg4y5r3zarvary0c5xw7k7grplx', + Buffer.from([ + 0x81, 0x28, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, + 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6, + 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c, + 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6 + ]) + ], + [ + 'BC1SW50QA3JX3S', + Buffer.from([ + 0x90, 0x02, 0x75, 0x1e + ]) + ], + [ + 'bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj', + Buffer.from([ + 0x82, 0x10, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, + 0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23 + ]) + ], + [ + 'tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy', + Buffer.from([ + 0x00, 0x20, 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, 0x21, + 0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, 0x36, 0x2b, 0x99, 0xd5, + 0xe9, 0x1c, 0x6c, 0xe2, 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, + 0x33 + ]) + ] +]; + +const invalidAddresses = [ + 'tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty', + 'bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5', + 'BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2', + 'bc1rw5uspcuh', + 'bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d' + + '6qejxtdg4y5r3zarvary0c5xw7kw5rljs90', + 'BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P', + 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7', + 'tb1pw508d6qejxtdg4y5r3zarqfsj6c3', + 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv' +]; + +function fromAddress(hrp, addr) { + const dec = bech32.decode(addr); + + if (dec.hrp !== hrp) + throw new Error('Invalid bech32 prefix or data length.'); + + if (dec.version === 0 && dec.hash.length !== 20 && dec.hash.length !== 32) + throw new Error('Malformed witness program.'); + + return { + version: dec.version, + program: dec.hash + }; +} + +function toAddress(hrp, version, program) { + const ret = bech32.encode(hrp, version, program); + + fromAddress(hrp, ret); + + return ret; +} + +function createProgram(version, program) { + const data = Buffer.allocUnsafe(2 + program.length); + data[0] = version ? version + 0x80 : 0; + data[1] = program.length; + program.copy(data, 2); + return data; +} - VALID_CHECKSUM.forEach((test) => { - it(`should have valid checksum for ${test}`, () => { - let ret = bech32.deserialize(test); - assert(ret); +describe('Bech32', function() { + for (const addr of validChecksums) { + it(`should have valid checksum for ${addr}`, () => { + assert(bech32.deserialize(addr)); }); - }); + } - VALID_ADDRESS.forEach((test) => { - let address = test[0]; - let scriptpubkey = test[1]; - it(`should have valid address for ${address}`, () => { + for (const [addr, script] of validAddresses) { + it(`should have valid address for ${addr}`, () => { let hrp = 'bc'; - let ret, ok, output, recreate; + let ret = null; try { - ret = fromAddress(hrp, address); + ret = fromAddress(hrp, addr); } catch (e) { ret = null; } @@ -149,108 +156,61 @@ describe('Bech32', function() { if (ret === null) { hrp = 'tb'; try { - ret = fromAddress(hrp, address); + ret = fromAddress(hrp, addr); } catch (e) { ret = null; } } - ok = ret !== null; - - if (ok) { - output = createProgram(ret.version, ret.program); - ok = output.compare(scriptpubkey) === 0; - } + assert(ret !== null); - if (ok) { - recreate = toAddress(hrp, ret.version, ret.program); - ok = (recreate === address.toLowerCase()); - } + const output = createProgram(ret.version, ret.program); + assert.bufferEqual(output, script); - assert(ok); + const recreate = toAddress(hrp, ret.version, ret.program); + assert.strictEqual(recreate, addr.toLowerCase()); }); - }); - - INVALID_ADDRESS.forEach((test) => { - it(`should have invalid address for ${test}`, () => { - let ok1, ok2, ok; - - try { - ok1 = fromAddress('bc', test); - } catch (e) { - ok1 = null; - } - - try { - ok2 = fromAddress('tb', test); - } catch (e) { - ok2 = null; - } + } - ok = ok1 === null && ok2 === null; - assert(ok); + for (const addr of invalidAddresses) { + it(`should have invalid address for ${addr}`, () => { + assert.throws(() => fromAddress('bc', addr)); + assert.throws(() => fromAddress('tb', addr)); }); - }); - - VALID_ADDRESS.forEach((test, i) => { - let address = test[0]; - let scriptpubkey = test[1]; - - // TODO: Fix. (wrong length for program) - // Need to drop old segwit addrs. - if (i >= 2 && i <= 4) - return; + } - it(`should have valid address for ${address}`, () => { - let ret, ok, output, recreate; + for (const [addr, script] of validAddresses) { + it(`should have valid address for ${addr}`, () => { + let ret = null; try { - ret = Address.fromBech32(address, 'main'); + ret = Address.fromBech32(addr, 'main'); } catch (e) { ret = null; } if (ret === null) { try { - ret = Address.fromBech32(address, 'testnet'); + ret = Address.fromBech32(addr, 'testnet'); } catch (e) { ret = null; } } - ok = ret !== null; + assert(ret !== null); - if (ok) { - output = createProgram(ret.version, ret.hash); - ok = output.compare(scriptpubkey) === 0; - } - - if (ok) { - recreate = ret.toBech32(); - ok = (recreate === address.toLowerCase()); - } + const output = createProgram(ret.version, ret.hash); + assert.bufferEqual(output, script); - assert(ok); + const recreate = ret.toBech32(); + assert.strictEqual(recreate, addr.toLowerCase()); }); - }); - - INVALID_ADDRESS.forEach((test) => { - it(`should have invalid address for ${test}`, () => { - let ok1, ok2; - - try { - ok1 = Address.fromBech32(test, 'main'); - } catch (e) { - ok1 = null; - } - - try { - ok2 = Address.fromBech32(test, 'testnet'); - } catch (e) { - ok2 = null; - } + } - assert(!ok1 && !ok2); + for (const addr of invalidAddresses) { + it(`should have invalid address for ${addr}`, () => { + assert.throws(() => Address.fromBech32(addr, 'main')); + assert.throws(() => Address.fromBech32(addr, 'testnet')); }); - }); + } }); diff --git a/test/bip150-test.js b/test/bip150-test.js index d816f5677..b78c1587e 100644 --- a/test/bip150-test.js +++ b/test/bip150-test.js @@ -1,34 +1,37 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); +const assert = require('./util/assert'); const secp256k1 = require('../lib/crypto/secp256k1'); const BIP150 = require('../lib/net/bip150'); const BIP151 = require('../lib/net/bip151'); -describe('BIP150', function() { - let db = new BIP150.AuthDB(); - let ck = secp256k1.generatePrivateKey(); - let sk = secp256k1.generatePrivateKey(); +const db = new BIP150.AuthDB(); +const ck = secp256k1.generatePrivateKey(); +const sk = secp256k1.generatePrivateKey(); - db.addAuthorized(secp256k1.publicKeyCreate(ck, true)); - db.addKnown('127.0.0.2', secp256k1.publicKeyCreate(sk, true)); +db.addAuthorized(secp256k1.publicKeyCreate(ck, true)); +db.addKnown('127.0.0.2', secp256k1.publicKeyCreate(sk, true)); - let client = new BIP151(); - let server = new BIP151(); +const client = new BIP151(); +const server = new BIP151(); - client.bip150 = new BIP150(client, '127.0.0.2', true, db, ck); - server.bip150 = new BIP150(server, '127.0.0.1', false, db, sk); +client.bip150 = new BIP150(client, '127.0.0.2', true, db, ck); +server.bip150 = new BIP150(server, '127.0.0.1', false, db, sk); - function payload() { - return Buffer.from('deadbeef', 'hex'); - } +function payload() { + return Buffer.from('deadbeef', 'hex'); +} +describe('BIP150', function() { it('should do encinit', () => { - let init = server.toEncinit(); + const init = server.toEncinit(); client.encinit(init.publicKey, init.cipher); - init = client.toEncinit(); - server.encinit(init.publicKey, init.cipher); + const init2 = client.toEncinit(); + server.encinit(init2.publicKey, init2.cipher); assert(!client.handshake); assert(!server.handshake); @@ -49,14 +52,12 @@ describe('BIP150', function() { }); it('should do BIP150 handshake', () => { - let challenge, reply, propose, result; - - challenge = client.bip150.toChallenge(); - reply = server.bip150.challenge(challenge.hash); - propose = client.bip150.reply(reply); - challenge = server.bip150.propose(propose); - reply = client.bip150.challenge(challenge); - result = server.bip150.reply(reply); + const challenge = client.bip150.toChallenge(); + const reply = server.bip150.challenge(challenge.hash); + const propose = client.bip150.reply(reply); + const challenge2 = server.bip150.propose(propose); + const reply2 = client.bip150.challenge(challenge2); + const result = server.bip150.reply(reply2); assert(!result); assert(client.bip150.auth); @@ -64,64 +65,76 @@ describe('BIP150', function() { }); it('should encrypt payload from client to server', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('should encrypt payload from client to server (2)', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client (2)', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('client should rekey', () => { + const bytes = client.output.processed; let rekeyed = false; - let bytes = client.output.processed; client.once('rekey', () => { rekeyed = true; - let packet = client.packet('encack', client.toRekey().toRaw()); + const packet = client.packet('encack', client.toRekey().toRaw()); let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'encack'); + assert.strictEqual(cmd, 'encack'); server.encack(body); }); server.feed(packet); @@ -139,70 +152,86 @@ describe('BIP150', function() { }); it('should encrypt payload from client to server after rekey', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client after rekey', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('should encrypt payload from client to server after rekey (2)', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client after rekey (2)', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('should encrypt payloads both ways asynchronously', () => { - let spacket = server.packet('fake', payload()); - let cpacket = client.packet('fake', payload()); + const spacket = server.packet('fake', payload()); + const cpacket = client.packet('fake', payload()); + let cemitted = false; - let semitted = false; client.once('packet', (cmd, body) => { cemitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + + let semitted = false; server.once('packet', (cmd, body) => { semitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(spacket); server.feed(cpacket); + assert(cemitted); assert(semitted); }); diff --git a/test/bip151-test.js b/test/bip151-test.js index 637717088..42e7e86e1 100644 --- a/test/bip151-test.js +++ b/test/bip151-test.js @@ -1,16 +1,19 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); +const assert = require('./util/assert'); const BIP151 = require('../lib/net/bip151'); -describe('BIP151', function() { - let client = new BIP151(); - let server = new BIP151(); +const client = new BIP151(); +const server = new BIP151(); - function payload() { - return Buffer.from('deadbeef', 'hex'); - } +function payload() { + return Buffer.from('deadbeef', 'hex'); +} +describe('BIP151', function() { it('should do encinit', () => { let init = server.toEncinit(); client.encinit(init.publicKey, init.cipher); @@ -37,64 +40,76 @@ describe('BIP151', function() { }); it('should encrypt payload from client to server', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('should encrypt payload from client to server (2)', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client (2)', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('client should rekey', () => { + const bytes = client.output.processed; let rekeyed = false; - let bytes = client.output.processed; client.once('rekey', () => { rekeyed = true; - let packet = client.packet('encack', client.toRekey().toRaw()); + const packet = client.packet('encack', client.toRekey().toRaw()); let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'encack'); + assert.strictEqual(cmd, 'encack'); server.encack(body); }); server.feed(packet); @@ -112,70 +127,86 @@ describe('BIP151', function() { }); it('should encrypt payload from client to server after rekey', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client after rekey', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('should encrypt payload from client to server after rekey (2)', () => { - let packet = client.packet('fake', payload()); + const packet = client.packet('fake', payload()); + let emitted = false; server.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + server.feed(packet); + assert(emitted); }); it('should encrypt payload from server to client after rekey (2)', () => { - let packet = server.packet('fake', payload()); + const packet = server.packet('fake', payload()); + let emitted = false; client.once('packet', (cmd, body) => { emitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(packet); + assert(emitted); }); it('should encrypt payloads both ways asynchronously', () => { - let spacket = server.packet('fake', payload()); - let cpacket = client.packet('fake', payload()); + const spacket = server.packet('fake', payload()); + const cpacket = client.packet('fake', payload()); + let cemitted = false; - let semitted = false; client.once('packet', (cmd, body) => { cemitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + + let semitted = false; server.once('packet', (cmd, body) => { semitted = true; - assert.equal(cmd, 'fake'); - assert.equal(body.toString('hex'), 'deadbeef'); + assert.strictEqual(cmd, 'fake'); + assert.bufferEqual(body, payload()); }); + client.feed(spacket); server.feed(cpacket); + assert(cemitted); assert(semitted); }); diff --git a/test/bip70-test.js b/test/bip70-test.js index f5fa11662..1e63ce2e5 100644 --- a/test/bip70-test.js +++ b/test/bip70-test.js @@ -1,6 +1,9 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); +const assert = require('./util/assert'); const util = require('../lib/utils/util'); const bip70 = require('../lib/bip70'); const Address = require('../lib/primitives/address'); @@ -19,27 +22,27 @@ tests.ca = { }; x509.allowUntrusted = true; -x509.trusted = {}; +x509.trusted.clear(); -describe('BIP70', function() { - function testRequest(data) { - let request = bip70.PaymentRequest.fromRaw(data); - let ser; +x509.verifyTime = function() { + return true; +}; - assert.equal(request.pkiType, 'x509+sha256'); - assert(request.pkiData); - assert(request.getChain()); - assert(request.paymentDetails); - assert(request.paymentDetails.memo.length !== 0); - assert(request.paymentDetails.paymentUrl.length !== 0); +function testRequest(data) { + const req = bip70.PaymentRequest.fromRaw(data); - ser = request.toRaw(); - assert.equal(ser.toString('hex'), data.toString('hex')); - assert(request.verify()); - } + assert.strictEqual(req.pkiType, 'x509+sha256'); + assert(req.pkiData); + assert(req.getChain()); + assert(req.paymentDetails); + assert(req.paymentDetails.memo.length !== 0); + assert(req.paymentDetails.paymentUrl.length !== 0); - x509.verifyTime = function() { return true; }; + assert.bufferEqual(req.toRaw(), data); + assert(req.verify()); +} +describe('BIP70', function() { it('should parse and verify a payment request', () => { testRequest(tests.valid); testRequest(tests.invalid); @@ -47,120 +50,118 @@ describe('BIP70', function() { }); it('should verify cert chain', () => { - let request = bip70.PaymentRequest.fromRaw(tests.valid); + const req1 = bip70.PaymentRequest.fromRaw(tests.valid); - assert.equal(request.version, 1); - assert.equal(request.getChain().length, 4); - assert.equal(request.paymentDetails.paymentUrl, + assert.strictEqual(req1.version, 1); + assert.strictEqual(req1.getChain().length, 4); + assert.strictEqual(req1.paymentDetails.paymentUrl, 'https://test.bitpay.com/i/CMWpuFsjgmQ2ZLiyGfcF1W'); - assert.equal(request.paymentDetails.network, 'test'); - assert.equal(request.paymentDetails.time, 1408645830); - assert.equal(request.paymentDetails.expires, 1408646730); - assert.equal(request.paymentDetails.outputs.length, 1); - assert(!request.paymentDetails.merchantData); - assert(request.paymentDetails.isExpired()); + assert.strictEqual(req1.paymentDetails.network, 'test'); + assert.strictEqual(req1.paymentDetails.time, 1408645830); + assert.strictEqual(req1.paymentDetails.expires, 1408646730); + assert.strictEqual(req1.paymentDetails.outputs.length, 1); + assert(!req1.paymentDetails.merchantData); + assert(req1.paymentDetails.isExpired()); - assert(request.verifyChain()); + assert(req1.verifyChain()); - request = bip70.PaymentRequest.fromRaw(tests.invalid); + const req2 = bip70.PaymentRequest.fromRaw(tests.invalid); - assert.equal(request.version, 1); - assert.equal(request.getChain().length, 3); - assert.equal(request.paymentDetails.paymentUrl, + assert.strictEqual(req2.version, 1); + assert.strictEqual(req2.getChain().length, 3); + assert.strictEqual(req2.paymentDetails.paymentUrl, 'https://bitpay.com/i/PAQtNxX7KL8BtJBnfXyTaH'); - assert.equal(request.paymentDetails.network, 'main'); - assert.equal(request.paymentDetails.time, 1442409238); - assert.equal(request.paymentDetails.expires, 1442410138); - assert.equal(request.paymentDetails.outputs.length, 1); - assert.equal(request.paymentDetails.merchantData.length, 76); - assert(request.paymentDetails.getData('json')); - assert(request.paymentDetails.isExpired()); - - assert(request.verifyChain()); - - request.paymentDetails.setData({foo:1}, 'json'); - assert.equal(request.paymentDetails.merchantData.length, 9); - assert.deepStrictEqual(request.paymentDetails.getData('json'), {foo:1}); - assert(!request.verify()); - - request = bip70.PaymentRequest.fromRaw(tests.untrusted); - - assert.equal(request.version, -1); - assert.equal(request.getChain().length, 2); - assert.equal(request.paymentDetails.paymentUrl, + assert.strictEqual(req2.paymentDetails.network, 'main'); + assert.strictEqual(req2.paymentDetails.time, 1442409238); + assert.strictEqual(req2.paymentDetails.expires, 1442410138); + assert.strictEqual(req2.paymentDetails.outputs.length, 1); + assert.strictEqual(req2.paymentDetails.merchantData.length, 76); + assert(req2.paymentDetails.getData('json')); + assert(req2.paymentDetails.isExpired()); + + assert(req2.verifyChain()); + + req2.paymentDetails.setData({foo:1}, 'json'); + assert.strictEqual(req2.paymentDetails.merchantData.length, 9); + assert.deepStrictEqual(req2.paymentDetails.getData('json'), {foo:1}); + assert(!req2.verify()); + + const req3 = bip70.PaymentRequest.fromRaw(tests.untrusted); + + assert.strictEqual(req3.version, -1); + assert.strictEqual(req3.getChain().length, 2); + assert.strictEqual(req3.paymentDetails.paymentUrl, 'https://www.coinbase.com/rp/55f9ca703d5d80008c0001f4'); - assert.equal(request.paymentDetails.network, null); - assert.equal(request.paymentDetails.time, 1442433682); - assert.equal(request.paymentDetails.expires, 1442434548); - assert.equal(request.paymentDetails.outputs.length, 1); - assert.equal(request.paymentDetails.merchantData.length, 32); - assert.equal(request.paymentDetails.getData('utf8'), + assert.strictEqual(req3.paymentDetails.network, null); + assert.strictEqual(req3.paymentDetails.time, 1442433682); + assert.strictEqual(req3.paymentDetails.expires, 1442434548); + assert.strictEqual(req3.paymentDetails.outputs.length, 1); + assert.strictEqual(req3.paymentDetails.merchantData.length, 32); + assert.strictEqual(req3.paymentDetails.getData('utf8'), 'bb79b6f2310e321bd3b1d929edbeb358'); - assert(request.paymentDetails.isExpired()); + assert(req3.paymentDetails.isExpired()); - assert(request.verifyChain()); + assert(req3.verifyChain()); }); it('should fail to verify cert signatures when enforcing trust', () => { - let request; - x509.allowUntrusted = false; - request = bip70.PaymentRequest.fromRaw(tests.valid); - assert(!request.verifyChain()); + const req1 = bip70.PaymentRequest.fromRaw(tests.valid); + assert(!req1.verifyChain()); - request = bip70.PaymentRequest.fromRaw(tests.invalid); - assert(!request.verifyChain()); + const req2 = bip70.PaymentRequest.fromRaw(tests.invalid); + assert(!req2.verifyChain()); - request = bip70.PaymentRequest.fromRaw(tests.untrusted); - assert(!request.verifyChain()); + const req3 = bip70.PaymentRequest.fromRaw(tests.untrusted); + assert(!req3.verifyChain()); }); it('should verify cert signatures once root cert is added', () => { - let request = bip70.PaymentRequest.fromRaw(tests.valid); - x509.setTrust([request.getChain().pop()]); - assert(request.verifyChain()); + const req1 = bip70.PaymentRequest.fromRaw(tests.valid); + x509.setTrust([req1.getChain().pop()]); + assert(req1.verifyChain()); - request = bip70.PaymentRequest.fromRaw(tests.untrusted); - assert(!request.verifyChain()); + const req2 = bip70.PaymentRequest.fromRaw(tests.untrusted); + assert(!req2.verifyChain()); }); it('should still fail to verify cert signatures for invalid', () => { - let request = bip70.PaymentRequest.fromRaw(tests.invalid); - assert(!request.verifyChain()); + const req = bip70.PaymentRequest.fromRaw(tests.invalid); + assert(!req.verifyChain()); }); it('should get chain and ca for request', () => { - let request = bip70.PaymentRequest.fromRaw(tests.valid); - assert.equal(request.getChain().length, 4); - assert.equal(request.getCA().name, + const req = bip70.PaymentRequest.fromRaw(tests.valid); + assert.strictEqual(req.getChain().length, 4); + assert.strictEqual(req.getCA().name, 'Go Daddy Class 2 Certification Authority'); }); it('should validate untrusted once again', () => { - let request = bip70.PaymentRequest.fromRaw(tests.untrusted); - x509.setTrust([request.getChain().pop()]); + const req1 = bip70.PaymentRequest.fromRaw(tests.untrusted); + x509.setTrust([req1.getChain().pop()]); - request = bip70.PaymentRequest.fromRaw(tests.untrusted); - assert(request.verifyChain()); - assert.equal(request.getCA().name, + const req2 = bip70.PaymentRequest.fromRaw(tests.untrusted); + assert(req2.verifyChain()); + assert.strictEqual(req2.getCA().name, 'DigiCert SHA2 Extended Validation Server CA'); }); it('should parse a payment ack', () => { - let ack = bip70.PaymentACK.fromRaw(tests.ack); - assert.equal(ack.memo.length, 95); - assert.equal(ack.memo, 'Transaction received by BitPay.' + const ack = bip70.PaymentACK.fromRaw(tests.ack); + assert.strictEqual(ack.memo.length, 95); + assert.strictEqual(ack.memo, 'Transaction received by BitPay.' + ' Invoice will be marked as paid if the transaction is confirmed.'); - assert.equal(ack.toRaw().toString('hex'), tests.ack.toString('hex')); + assert.bufferEqual(ack.toRaw(), tests.ack); }); it('should create a payment request, sign, and verify', () => { - let request = new bip70.PaymentRequest({ + const req = new bip70.PaymentRequest({ version: 25, paymentDetails: { network: 'testnet', - paymentUrl: 'http://bcoin.io/payme', + paymentUrl: 'http://bcoin.io/payment', memo: 'foobar', time: util.now(), expires: util.now() + 3600, @@ -172,41 +173,43 @@ describe('BIP70', function() { } }); - assert.equal(request.pkiType, null); - assert(!request.pkiData); - assert.equal(request.getChain().length, 0); - assert(request.paymentDetails); - assert(request.paymentDetails.memo.length !== 0); - assert(request.paymentDetails.paymentUrl.length !== 0); - assert.deepStrictEqual(request.paymentDetails.getData('json'), {foo:'bar'}); - - assert.equal(request.version, 25); - assert.equal(request.paymentDetails.paymentUrl, 'http://bcoin.io/payme'); - assert.equal(request.paymentDetails.network, 'testnet'); - assert(request.paymentDetails.time <= util.now()); - assert.equal(request.paymentDetails.expires, - request.paymentDetails.time + 3600); - assert.equal(request.paymentDetails.outputs.length, 2); - assert(request.paymentDetails.merchantData); - assert(!request.paymentDetails.isExpired()); - - assert(!request.pkiData); - request.sign(tests.ca.priv, [tests.ca.crt]); - - assert(request.pkiData); - assert.equal(request.pkiType, 'x509+sha256'); - assert.equal(request.getChain().length, 1); - - assert(request.verify()); - assert(!request.verifyChain()); - - testRequest(request.toRaw()); + assert.strictEqual(req.pkiType, null); + assert(!req.pkiData); + assert.strictEqual(req.getChain().length, 0); + assert(req.paymentDetails); + assert(req.paymentDetails.memo.length !== 0); + assert(req.paymentDetails.paymentUrl.length !== 0); + assert.deepStrictEqual(req.paymentDetails.getData('json'), {foo:'bar'}); + + assert.strictEqual(req.version, 25); + assert.strictEqual(req.paymentDetails.paymentUrl, + 'http://bcoin.io/payment'); + assert.strictEqual(req.paymentDetails.network, 'testnet'); + assert(req.paymentDetails.time <= util.now()); + assert.strictEqual(req.paymentDetails.expires, + req.paymentDetails.time + 3600); + assert.strictEqual(req.paymentDetails.outputs.length, 2); + assert(req.paymentDetails.merchantData); + assert(!req.paymentDetails.isExpired()); + + assert(!req.pkiData); + req.setChain([tests.ca.crt]); + req.sign(tests.ca.priv); + + assert(req.pkiData); + assert.strictEqual(req.pkiType, 'x509+sha256'); + assert.strictEqual(req.getChain().length, 1); + + assert(req.verify()); + assert(!req.verifyChain()); + + testRequest(req.toRaw()); x509.setTrust([tests.ca.crt]); - assert(request.verifyChain()); - assert.equal(request.getCA().name, 'JJs CA'); + assert(req.verifyChain()); + assert.strictEqual(req.getCA().name, 'JJs CA'); - request.version = 24; - assert(!request.verify()); + req.version = 24; + assert(!req.verify()); }); }); diff --git a/test/block-test.js b/test/block-test.js index 5b7f32139..349514bed 100644 --- a/test/block-test.js +++ b/test/block-test.js @@ -1,506 +1,363 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const fs = require('fs'); -const assert = require('assert'); +const assert = require('./util/assert'); +const common = require('./util/common'); const Bloom = require('../lib/utils/bloom'); const Block = require('../lib/primitives/block'); -const Headers = require('../lib/primitives/headers'); const MerkleBlock = require('../lib/primitives/merkleblock'); -const CoinView = require('../lib/coins/coinview'); -const Coin = require('../lib/primitives/coin'); -const Coins = require('../lib/coins/coins'); -const UndoCoins = require('../lib/coins/undocoins'); const consensus = require('../lib/protocol/consensus'); const Script = require('../lib/script/script'); const encoding = require('../lib/utils/encoding'); const bip152 = require('../lib/net/bip152'); - -const block300025 = require('./data/block300025.json'); -const cmpct2block = fs.readFileSync(`${__dirname}/data/cmpct2.bin`); - -let cmpct1 = fs.readFileSync(`${__dirname}/data/compactblock.hex`, 'utf8'); -let cmpct2 = fs.readFileSync(`${__dirname}/data/cmpct2`, 'utf8'); - -cmpct1 = cmpct1.trim().split('\n'); -cmpct2 = cmpct2.trim(); - -function applyUndo(block, undo) { - let view = new CoinView(); - - for (let i = block.txs.length - 1; i > 0; i--) { - let tx = block.txs[i]; - - for (let j = tx.inputs.length - 1; j >= 0; j--) { - let input = tx.inputs[j]; - let prev = input.prevout.hash; - - if (!view.has(prev)) { - assert(!undo.isEmpty()); - - if (undo.top().height === -1) { - let coins = new Coins(); - coins.hash = prev; - coins.coinbase = false; - view.add(coins); - } - } - - undo.apply(view, input.prevout); - } - } - - assert(undo.isEmpty(), 'Undo coins data inconsistency.'); - - return view; -} +const CompactBlock = bip152.CompactBlock; +const TXRequest = bip152.TXRequest; +const TXResponse = bip152.TXResponse; + +// Block test vectors +const block300025 = common.readBlock('block300025'); + +// Merkle block test vectors +const merkle300025 = common.readMerkle('merkle300025'); + +// Compact block test vectors +const block426884 = common.readBlock('block426884'); +const compact426884 = common.readCompact('compact426884'); +const block898352 = common.readBlock('block898352'); +const compact898352 = common.readCompact('compact898352'); + +// Sigops counting test vectors +// Format: [name, sigops, weight] +const sigopsVectors = [ + ['block928816', 9109, 3568200], + ['block928828', 23236, 2481560], + ['block928831', 10035, 3992382], + ['block928848', 11319, 3992537], + ['block928849', 9137, 3682105], + ['block928927', 10015, 3992391], + ['block1087400', 1298, 193331] +]; describe('Block', function() { - let mblock, raw, block, raw2; - - mblock = new MerkleBlock({ - version: 2, - prevBlock: 'd1831d4411bdfda89d9d8c842b541beafd1437fc560dbe5c0000000000000000', - merkleRoot: '28bec1d35af480ba3884553d72694f6ba6c163a5c081d7e6edaec15f373f19af', - ts: 1399713634, - bits: 419465580, - nonce: 1186968784, - totalTX: 461, - hashes: [ - '7d22e53bce1bbb3294d1a396c5acc45bdcc8f192cb492f0d9f55421fd4c62de1', - '9d6d585fdaf3737b9a54aaee1dd003f498328d699b7dfb42dd2b44b6ebde2333', - '8b61da3053d6f382f2145bdd856bc5dcf052c3a11c1784d3d51b2cbe0f6d0923', - 'd7bbaae4716cb0d329d755b707cee588cddc68601f99bc05fef1fabeb8dfe4a0', - '7393f84cd04ca8931975c66282ebf1847c78d8de6c2578d4f9bae23bc6f30857', - 'ec8c51de3170301430ec56f6703533d9ea5b05c6fa7068954bcb90eed8c2ee5c', - 'c7c152869db09a5ae2291fa03142912d9d7aba75be7d491a8ac4230ee9a920cb', - '5adbf04583354515a225f2c418de7c5cdac4cef211820c79717cd2c50412153f', - '1f5e46b9da3a8b1241f4a1501741d3453bafddf6135b600b926e3f4056c6d564', - '33825657ba32afe269819f01993bd77baba86379043168c94845d32370e53562' - ], - flags: Buffer.from([245, 122, 0]) - }); - raw = mblock.toRaw().toString('hex'); - - raw2 = '02000000d1831d4411bdfda89d9d8c842b541beafd1437fc560dbe5c0' - + '00000000000000028bec1d35af480ba3884553d72694f6ba6c163a5c081d7e6edaec' - + '15f373f19af62ef6d536c890019d0b4bf46cd0100000a7d22e53bce1bbb3294d1a39' - + '6c5acc45bdcc8f192cb492f0d9f55421fd4c62de19d6d585fdaf3737b9a54aaee1dd' - + '003f498328d699b7dfb42dd2b44b6ebde23338b61da3053d6f382f2145bdd856bc5d' - + 'cf052c3a11c1784d3d51b2cbe0f6d0923d7bbaae4716cb0d329d755b707cee588cdd' - + 'c68601f99bc05fef1fabeb8dfe4a07393f84cd04ca8931975c66282ebf1847c78d8d' - + 'e6c2578d4f9bae23bc6f30857ec8c51de3170301430ec56f6703533d9ea5b05c6fa7' - + '068954bcb90eed8c2ee5cc7c152869db09a5ae2291fa03142912d9d7aba75be7d491' - + 'a8ac4230ee9a920cb5adbf04583354515a225f2c418de7c5cdac4cef211820c79717' - + 'cd2c50412153f1f5e46b9da3a8b1241f4a1501741d3453bafddf6135b600b926e3f4' - + '056c6d56433825657ba32afe269819f01993bd77baba86379043168c94845d32370e' - + '5356203f57a00'; - - mblock = MerkleBlock.fromRaw(raw2, 'hex'); - this.timeout(10000); it('should parse partial merkle tree', () => { - let tree; + const [block] = merkle300025.getBlock(); - assert(mblock.verifyPOW()); - assert(mblock.verifyBody()); - assert(mblock.verify()); + assert(block.verifyPOW()); + assert(block.verifyBody()); + assert(block.verify()); - tree = mblock.getTree(); + const tree = block.getTree(); - assert.equal(tree.matches.length, 2); - assert.equal(mblock.hash('hex'), + assert.strictEqual(tree.matches.length, 2); + assert.strictEqual(block.hash('hex'), '8cc72c02a958de5a8b35a23bb7e3bced8bf840cc0a4e1c820000000000000000'); - assert.equal(mblock.rhash(), + assert.strictEqual(block.rhash(), '0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c'); - assert.equal( + assert.strictEqual( tree.matches[0].toString('hex'), '7393f84cd04ca8931975c66282ebf1847c78d8de6c2578d4f9bae23bc6f30857'); - assert.equal( + assert.strictEqual( tree.matches[1].toString('hex'), 'ec8c51de3170301430ec56f6703533d9ea5b05c6fa7068954bcb90eed8c2ee5c'); }); - it('should decode/encode with parser/framer', () => { - let b = MerkleBlock.fromRaw(raw, 'hex'); - assert.equal(b.toRaw().toString('hex'), raw); - assert.equal(raw, raw2); - }); - - it('should be verifiable', () => { - let b = MerkleBlock.fromRaw(raw, 'hex'); - assert(b.verify()); + it('should decode/encode merkle block', () => { + const [block] = merkle300025.getBlock(); + block.refresh(); + assert.bufferEqual(block.toRaw(), merkle300025.getRaw()); }); - it('should be serialized and deserialized and still verify', () => { - let raw = mblock.toRaw(); - let b = MerkleBlock.fromRaw(raw); - assert.deepEqual(b.toRaw(), raw); - assert(b.verify()); + it('should verify merkle block', () => { + const [block] = merkle300025.getBlock(); + assert(block.verify()); }); - it('should be jsonified and unjsonified and still verify', () => { - let raw = mblock.toJSON(); - let b = MerkleBlock.fromJSON(raw); - assert.deepEqual(b.toJSON(), raw); - assert(b.verify()); + it('should be encoded/decoded and still verify', () => { + const [block1] = merkle300025.getBlock(); + const raw = block1.toRaw(); + const block2 = MerkleBlock.fromRaw(raw); + assert.bufferEqual(block2.toRaw(), raw); + assert(block2.verify()); }); - it('should calculate reward properly', () => { - let height = 0; - let total = 0; - - for (;;) { - let reward = consensus.getReward(height, 210000); - assert(reward <= consensus.COIN * 50); - total += reward; - if (reward === 0) - break; - height++; - } - - assert.equal(height, 6930000); - assert.equal(total, 2099999997690000); + it('should be jsonified/unjsonified and still verify', () => { + const [block1] = merkle300025.getBlock(); + const json = block1.toJSON(); + const block2 = MerkleBlock.fromJSON(json); + assert.deepStrictEqual(block2.toJSON(), json); + assert(block2.verify()); }); it('should parse JSON', () => { - block = Block.fromJSON(block300025); - assert.equal(block.hash('hex'), + const [block1] = block300025.getBlock(); + const block2 = Block.fromJSON(block1.toJSON()); + assert.strictEqual(block2.hash('hex'), '8cc72c02a958de5a8b35a23bb7e3bced8bf840cc0a4e1c820000000000000000'); - assert.equal(block.rhash(), + assert.strictEqual(block2.rhash(), '0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c'); - assert.equal(block.merkleRoot, block.createMerkleRoot('hex')); + assert.strictEqual(block2.merkleRoot, block2.createMerkleRoot('hex')); }); it('should create a merkle block', () => { - let filter, item1, item2, mblock2; + const filter = Bloom.fromRate(1000, 0.01, Bloom.flags.NONE); - filter = Bloom.fromRate(1000, 0.01, Bloom.flags.NONE); - - item1 = '8e7445bbb8abd4b3174d80fa4c409fea6b94d96b'; - item2 = '047b00000078da0dca3b0ec2300c00d0ab4466ed10' + const item1 = '8e7445bbb8abd4b3174d80fa4c409fea6b94d96b'; + const item2 = '047b00000078da0dca3b0ec2300c00d0ab4466ed10' + 'e763272c6c9ca052972c69e3884a9022084215e2eef' + '0e6f781656b5d5a87231cd4349e534b6dea55ad4ff55e'; filter.add(item1, 'hex'); filter.add(item2, 'hex'); - mblock2 = MerkleBlock.fromBlock(block, filter); + const [block1] = block300025.getBlock(); + const block2 = MerkleBlock.fromBlock(block1, filter); - assert(mblock2.verifyBody()); - assert.deepEqual(mblock2.toRaw(), mblock.toRaw()); + assert(block2.verifyBody()); + assert.bufferEqual(block2.toRaw(), merkle300025.getRaw()); }); it('should verify a historical block', () => { - let view = new CoinView(); - let height = block300025.height; - let sigops = 0; - let reward = 0; - let flags; - - for (let i = 1; i < block300025.txs.length; i++) { - let tx = block300025.txs[i]; - for (let j = 0; j < tx.inputs.length; j++) { - let input = tx.inputs[j]; - let coin = Coin.fromJSON(input.coin); - view.addCoin(coin); - } - } + const [block, view] = block300025.getBlock(); + const flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_DERSIG; + const height = 300025; assert(block.verify()); assert(block.txs[0].isCoinbase()); assert(block.txs[0].isSane()); assert(!block.hasWitness()); - assert.equal(block.getWeight(), 1136924); + assert.strictEqual(block.getWeight(), 1136924); - flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_DERSIG; + let sigops = 0; + let reward = 0; for (let i = 1; i < block.txs.length; i++) { - let tx = block.txs[i]; + const tx = block.txs[i]; + assert(tx.isSane()); assert(tx.verifyInputs(view, height)); assert(tx.verify(view, flags)); assert(!tx.hasWitness()); + sigops += tx.getSigopsCost(view, flags); - view.addTX(tx, height); reward += tx.getFee(view); + + view.addTX(tx, height); } reward += consensus.getReward(height, 210000); - assert.equal(sigops, 5280); - assert.equal(reward, 2507773345); - assert.equal(reward, block.txs[0].outputs[0].value); + assert.strictEqual(sigops, 5280); + assert.strictEqual(reward, 2507773345); + assert.strictEqual(reward, block.txs[0].outputs[0].value); }); it('should fail with a bad merkle root', () => { - let block2 = new Block(block); - let reason; - block2.merkleRoot = encoding.NULL_HASH; - block2.refresh(); - assert(!block2.verifyPOW()); - [, reason] = block2.checkBody(); - assert.equal(reason, 'bad-txnmrklroot'); - assert(!block2.verify()); - block2.merkleRoot = block.merkleRoot; - block2.refresh(); - assert(block2.verify()); + const [block] = block300025.getBlock(); + const merkleRoot = block.merkleRoot; + block.merkleRoot = encoding.NULL_HASH; + block.refresh(); + assert(!block.verifyPOW()); + const [, reason] = block.checkBody(); + assert.strictEqual(reason, 'bad-txnmrklroot'); + assert(!block.verify()); + block.merkleRoot = merkleRoot; + block.refresh(); + assert(block.verify()); }); it('should fail on merkle block with a bad merkle root', () => { - let mblock2 = new MerkleBlock(mblock); - let reason; - mblock2.merkleRoot = encoding.NULL_HASH; - mblock2.refresh(); - assert(!mblock2.verifyPOW()); - [, reason] = mblock2.checkBody(); - assert.equal(reason, 'bad-txnmrklroot'); - assert(!mblock2.verify()); - mblock2.merkleRoot = mblock.merkleRoot; - mblock2.refresh(); - assert(mblock2.verify()); + const [block] = merkle300025.getBlock(); + const merkleRoot = block.merkleRoot; + block.merkleRoot = encoding.NULL_HASH; + block.refresh(); + assert(!block.verifyPOW()); + const [, reason] = block.checkBody(); + assert.strictEqual(reason, 'bad-txnmrklroot'); + assert(!block.verify()); + block.merkleRoot = merkleRoot; + block.refresh(); + assert(block.verify()); }); it('should fail with a low target', () => { - let block2 = new Block(block); - block2.bits = 403014710; - block2.refresh(); - assert(!block2.verifyPOW()); - assert(block2.verifyBody()); - assert(!block2.verify()); - block2.bits = block.bits; - block2.refresh(); - assert(block2.verify()); + const [block] = block300025.getBlock(); + const bits = block.bits; + block.bits = 403014710; + block.refresh(); + assert(!block.verifyPOW()); + assert(block.verifyBody()); + assert(!block.verify()); + block.bits = bits; + block.refresh(); + assert(block.verify()); }); it('should fail on duplicate txs', () => { - let block2 = new Block(block); - let reason; - block2.txs.push(block2.txs[block2.txs.length - 1]); - block2.refresh(); - [, reason] = block2.checkBody(); - assert.equal(reason, 'bad-txns-duplicate'); + const [block] = block300025.getBlock(); + block.txs.push(block.txs[block.txs.length - 1]); + block.refresh(); + const [, reason] = block.checkBody(); + assert.strictEqual(reason, 'bad-txns-duplicate'); }); it('should verify with headers', () => { - let headers = new Headers(block); + const headers = block300025.getHeaders(); assert(headers.verifyPOW()); assert(headers.verifyBody()); assert(headers.verify()); }); it('should handle compact block', () => { - let block = Block.fromRaw(cmpct1[1], 'hex'); - let cblock1 = bip152.CompactBlock.fromRaw(cmpct1[0], 'hex'); - let cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce); - let map = new Map(); - let i, tx, mempool, result; + const [block] = block426884.getBlock(); + const [cblock1] = compact426884.getBlock(); + const cblock2 = CompactBlock.fromBlock(block, false, cblock1.keyNonce); assert(cblock1.init()); - assert.equal(cblock1.toRaw().toString('hex'), cmpct1[0]); - assert.equal(cblock2.toRaw().toString('hex'), cmpct1[0]); + assert.bufferEqual(cblock1.toRaw(), compact426884.getRaw()); + assert.bufferEqual(cblock2.toRaw(), compact426884.getRaw()); - for (i = 0; i < block.txs.length; i++) { - tx = block.txs[i]; - map.set(tx.hash('hex'), { tx: tx }); - } - - mempool = { - map: map - }; + const map = new Map(); - assert.equal(cblock1.sid(block.txs[1].hash()), 125673511480291); + for (let i = 1; i < block.txs.length; i++) { + const tx = block.txs[i]; + map.set(tx.hash('hex'), { tx }); + } - result = cblock1.fillMempool(false, mempool); - assert(result); + const full = cblock1.fillMempool(false, { map }); + assert(full); - for (i = 0; i < cblock1.available.length; i++) - assert(cblock1.available[i]); + for (const tx of cblock1.available) + assert(tx); - assert.equal( - cblock1.toBlock().toRaw().toString('hex'), - block.toRaw().toString('hex')); + assert.bufferEqual(cblock1.toBlock().toRaw(), block.toRaw()); }); it('should handle half-full compact block', () => { - let block = Block.fromRaw(cmpct1[1], 'hex'); - let cblock1 = bip152.CompactBlock.fromRaw(cmpct1[0], 'hex'); - let cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce); - let map = new Map(); - let i, tx, mempool, result, req, res; + const [block] = block426884.getBlock(); + const [cblock1] = compact426884.getBlock(); + const cblock2 = CompactBlock.fromBlock(block, false, cblock1.keyNonce); assert(cblock1.init()); - assert.equal(cblock1.toRaw().toString('hex'), cmpct1[0]); - assert.equal(cblock2.toRaw().toString('hex'), cmpct1[0]); + assert.bufferEqual(cblock1.toRaw(), compact426884.getRaw()); + assert.bufferEqual(cblock2.toRaw(), compact426884.getRaw()); - for (i = 0; i < block.txs.length >>> 1; i++) { - tx = block.txs[i]; - map.set(tx.hash('hex'), { tx: tx }); - } - - mempool = { - map: map - }; - - assert.equal(cblock1.sid(block.txs[1].hash()), 125673511480291); + const map = new Map(); - result = cblock1.fillMempool(false, mempool); - assert(!result); + for (let i = 1; i < ((block.txs.length + 1) >>> 1); i++) { + const tx = block.txs[i]; + map.set(tx.hash('hex'), { tx }); + } - req = cblock1.toRequest(); - assert.equal(req.hash, cblock1.hash('hex')); - assert.deepEqual(req.indexes, [5, 6, 7, 8, 9]); + const full = cblock1.fillMempool(false, { map }); + assert(!full); - req = bip152.TXRequest.fromRaw(req.toRaw()); - assert.equal(req.hash, cblock1.hash('hex')); - assert.deepEqual(req.indexes, [5, 6, 7, 8, 9]); + const rawReq = cblock1.toRequest().toRaw(); + const req = TXRequest.fromRaw(rawReq); + assert.strictEqual(req.hash, cblock1.hash('hex')); - res = bip152.TXResponse.fromBlock(block, req); - res = bip152.TXResponse.fromRaw(res.toRaw()); + const rawRes = TXResponse.fromBlock(block, req).toRaw(); + const res = TXResponse.fromRaw(rawRes); - result = cblock1.fillMissing(res); - assert(result); + const filled = cblock1.fillMissing(res); + assert(filled); - for (i = 0; i < cblock1.available.length; i++) - assert(cblock1.available[i]); + for (const tx of cblock1.available) + assert(tx); - assert.equal( - cblock1.toBlock().toRaw().toString('hex'), - block.toRaw().toString('hex')); + assert.bufferEqual(cblock1.toBlock().toRaw(), block.toRaw()); }); it('should handle compact block', () => { - let block = Block.fromRaw(cmpct2block); - let cblock1 = bip152.CompactBlock.fromRaw(cmpct2, 'hex'); - let cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce); - let map = new Map(); - let i, tx, result, mempool; + const [block] = block898352.getBlock(); + const [cblock1] = compact898352.getBlock(); + const cblock2 = CompactBlock.fromBlock(block, false, cblock1.keyNonce); assert(cblock1.init()); - assert.equal(cblock1.toRaw().toString('hex'), cmpct2); - assert.equal(cblock2.toRaw().toString('hex'), cmpct2); + assert.bufferEqual(cblock1.toRaw(), compact898352.getRaw()); + assert.bufferEqual(cblock2.toRaw(), compact898352.getRaw()); - for (i = 0; i < block.txs.length; i++) { - tx = block.txs[i]; - map.set(tx.hash('hex'), { tx: tx }); - } + assert.strictEqual(cblock1.sid(block.txs[1].hash()), 125673511480291); - mempool = { - map: map - }; + const map = new Map(); - result = cblock1.fillMempool(false, mempool); - assert(result); + for (let i = 1; i < block.txs.length; i++) { + const tx = block.txs[i]; + map.set(tx.hash('hex'), { tx }); + } - for (i = 0; i < cblock1.available.length; i++) - assert(cblock1.available[i]); + const full = cblock1.fillMempool(false, { map }); + assert(full); - assert.equal( - cblock1.toBlock().toRaw().toString('hex'), - block.toRaw().toString('hex')); + for (const tx of cblock1.available) + assert(tx); + + assert.bufferEqual(cblock1.toBlock().toRaw(), block.toRaw()); }); it('should handle half-full compact block', () => { - let block = Block.fromRaw(cmpct2block); - let cblock1 = bip152.CompactBlock.fromRaw(cmpct2, 'hex'); - let cblock2 = bip152.CompactBlock.fromBlock(block, false, cblock1.keyNonce); - let map = new Map(); - let i, tx, mempool, result, req, res; + const [block] = block898352.getBlock(); + const [cblock1] = compact898352.getBlock(); + const cblock2 = CompactBlock.fromBlock(block, false, cblock1.keyNonce); assert(cblock1.init()); - assert.equal(cblock1.toRaw().toString('hex'), cmpct2); - assert.equal(cblock2.toRaw().toString('hex'), cmpct2); - - for (i = 0; i < block.txs.length >>> 1; i++) { - tx = block.txs[i]; - map.set(tx.hash('hex'), { tx: tx }); - } + assert.bufferEqual(cblock1.toRaw(), compact898352.getRaw()); + assert.bufferEqual(cblock2.toRaw(), compact898352.getRaw()); - mempool = { - map: map - }; + assert.strictEqual(cblock1.sid(block.txs[1].hash()), 125673511480291); - result = cblock1.fillMempool(false, mempool); - assert(!result); + const map = new Map(); - req = cblock1.toRequest(); - assert.equal(req.hash, cblock1.hash('hex')); + for (let i = 1; i < ((block.txs.length + 1) >>> 1); i++) { + const tx = block.txs[i]; + map.set(tx.hash('hex'), { tx }); + } - req = bip152.TXRequest.fromRaw(req.toRaw()); - assert.equal(req.hash, cblock1.hash('hex')); + const full = cblock1.fillMempool(false, { map }); + assert(!full); - res = bip152.TXResponse.fromBlock(block, req); - res = bip152.TXResponse.fromRaw(res.toRaw()); + const rawReq = cblock1.toRequest().toRaw(); + const req = TXRequest.fromRaw(rawReq); + assert.strictEqual(req.hash, cblock1.hash('hex')); + assert.deepStrictEqual(req.indexes, [5, 6, 7, 8, 9]); - result = cblock1.fillMissing(res); - assert(result); + const rawRes = TXResponse.fromBlock(block, req).toRaw(); + const res = TXResponse.fromRaw(rawRes); - for (i = 0; i < cblock1.available.length; i++) - assert(cblock1.available[i]); + const filled = cblock1.fillMissing(res); + assert(filled); - assert.equal( - cblock1.toBlock().toRaw().toString('hex'), - block.toRaw().toString('hex')); - }); - - it('should count sigops for block 928828 (testnet)', () => { - let blockRaw = fs.readFileSync(`${__dirname}/data/block928828.raw`); - let undoRaw = fs.readFileSync(`${__dirname}/data/undo928828.raw`); - let block = Block.fromRaw(blockRaw); - let undo = UndoCoins.fromRaw(undoRaw); - let view = applyUndo(block, undo); - let sigops = 0; - let flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_WITNESS; - let i, tx; + for (const tx of cblock1.available) + assert(tx); - for (i = 0; i < block.txs.length; i++) { - tx = block.txs[i]; - sigops += tx.getSigopsCost(view, flags); - } - - assert.equal(sigops, 23236); - assert.equal(block.getWeight(), 2481560); + assert.bufferEqual(cblock1.toBlock().toRaw(), block.toRaw()); }); - it('should count sigops for block 928927 (testnet)', () => { - let blockRaw = fs.readFileSync(`${__dirname}/data/block928927.raw`); - let undoRaw = fs.readFileSync(`${__dirname}/data/undo928927.raw`); - let block = Block.fromRaw(blockRaw); - let undo = UndoCoins.fromRaw(undoRaw); - let view = applyUndo(block, undo); - let sigops = 0; - let flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_WITNESS; - let i, tx; - - for (i = 0; i < block.txs.length; i++) { - tx = block.txs[i]; - sigops += tx.getSigopsCost(view, flags); - } + for (const cache of [false, true]) { + const word = cache ? 'with' : 'without'; + for (const [name, sigops, weight] of sigopsVectors) { + const ctx = common.readBlock(name); + it(`should count sigops for ${name} (${word} cache)`, () => { + const [block, view] = ctx.getBlock(); + const flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_WITNESS; - assert.equal(sigops, 10015); - assert.equal(block.getWeight(), 3992391); - }); + if (!cache) + block.refresh(true); - it('should count sigops for block 1087400 (testnet)', () => { - let blockRaw = fs.readFileSync(`${__dirname}/data/block1087400.raw`); - let undoRaw = fs.readFileSync(`${__dirname}/data/undo1087400.raw`); - let block = Block.fromRaw(blockRaw); - let undo = UndoCoins.fromRaw(undoRaw); - let view = applyUndo(block, undo); - let sigops = 0; - let flags = Script.flags.VERIFY_P2SH | Script.flags.VERIFY_WITNESS; - let i, tx; + let count = 0; + for (const tx of block.txs) + count += tx.getSigopsCost(view, flags); - for (i = 0; i < block.txs.length; i++) { - tx = block.txs[i]; - sigops += tx.getSigopsCost(view, flags); + assert.strictEqual(count, sigops); + assert.strictEqual(block.getWeight(), weight); + }); } - - assert.equal(sigops, 1298); - assert.equal(block.getWeight(), 193331); - }); + } }); diff --git a/test/bloom-test.js b/test/bloom-test.js index 08efc5dc2..34b8934d0 100644 --- a/test/bloom-test.js +++ b/test/bloom-test.js @@ -1,174 +1,183 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); +const assert = require('./util/assert'); const Bloom = require('../lib/utils/bloom'); const RollingFilter = require('../lib/utils/rollingfilter'); const murmur3 = require('../lib/utils/murmur3'); -describe('Bloom', function() { - const filterHex = '' - + '000000000000000000000000000000000000000000000000088004000000000000000' - + '000000000200000000000000000000000000000000800000000000000000002000000' - + '000000000000002000000000000000000000000000000000000000000040000200000' - + '0000000001000000800000080000000'; +function testMurmur(str, seed, expect, enc) { + if (!enc) + enc = 'ascii'; - function mm(str, seed, expect, enc) { - assert.equal(murmur3(Buffer.from(str, enc || 'ascii'), seed), expect); - } + const data = Buffer.from(str, enc); + const hash = murmur3(data, seed); + assert.strictEqual(hash, expect); +} + +describe('Bloom', function() { this.timeout(20000); it('should do proper murmur3', () => { - mm('', 0, 0); - mm('', 0xfba4c795, 0x6a396f08); - mm('00', 0xfba4c795, 0x2a101837); - mm('hello world', 0, 0x5e928f0f); - - mm('', 0x00000000, 0x00000000, 'hex'); - mm('', 0xfba4c795, 0x6a396f08, 'hex'); - mm('', 0xffffffff, 0x81f16f39, 'hex'); - - mm('00', 0x00000000, 0x514e28b7, 'hex'); - mm('00', 0xfba4c795, 0xea3f0b17, 'hex'); - mm('ff', 0x00000000, 0xfd6cf10d, 'hex'); - - mm('0011', 0x00000000, 0x16c6b7ab, 'hex'); - mm('001122', 0x00000000, 0x8eb51c3d, 'hex'); - mm('00112233', 0x00000000, 0xb4471bf8, 'hex'); - mm('0011223344', 0x00000000, 0xe2301fa8, 'hex'); - mm('001122334455', 0x00000000, 0xfc2e4a15, 'hex'); - mm('00112233445566', 0x00000000, 0xb074502c, 'hex'); - mm('0011223344556677', 0x00000000, 0x8034d2a0, 'hex'); - mm('001122334455667788', 0x00000000, 0xb4698def, 'hex'); + testMurmur('', 0, 0); + testMurmur('', 0xfba4c795, 0x6a396f08); + testMurmur('00', 0xfba4c795, 0x2a101837); + testMurmur('hello world', 0, 0x5e928f0f); + + testMurmur('', 0x00000000, 0x00000000, 'hex'); + testMurmur('', 0xfba4c795, 0x6a396f08, 'hex'); + testMurmur('', 0xffffffff, 0x81f16f39, 'hex'); + + testMurmur('00', 0x00000000, 0x514e28b7, 'hex'); + testMurmur('00', 0xfba4c795, 0xea3f0b17, 'hex'); + testMurmur('ff', 0x00000000, 0xfd6cf10d, 'hex'); + + testMurmur('0011', 0x00000000, 0x16c6b7ab, 'hex'); + testMurmur('001122', 0x00000000, 0x8eb51c3d, 'hex'); + testMurmur('00112233', 0x00000000, 0xb4471bf8, 'hex'); + testMurmur('0011223344', 0x00000000, 0xe2301fa8, 'hex'); + testMurmur('001122334455', 0x00000000, 0xfc2e4a15, 'hex'); + testMurmur('00112233445566', 0x00000000, 0xb074502c, 'hex'); + testMurmur('0011223344556677', 0x00000000, 0x8034d2a0, 'hex'); + testMurmur('001122334455667788', 0x00000000, 0xb4698def, 'hex'); }); it('should test and add stuff', () => { - let b = new Bloom(512, 10, 156); + const filter = new Bloom(512, 10, 156); - b.add('hello', 'ascii'); - assert(b.test('hello', 'ascii')); - assert(!b.test('hello!', 'ascii')); - assert(!b.test('ping', 'ascii')); + filter.add('hello', 'ascii'); + assert(filter.test('hello', 'ascii')); + assert(!filter.test('hello!', 'ascii')); + assert(!filter.test('ping', 'ascii')); - b.add('hello!', 'ascii'); - assert(b.test('hello!', 'ascii')); - assert(!b.test('ping', 'ascii')); + filter.add('hello!', 'ascii'); + assert(filter.test('hello!', 'ascii')); + assert(!filter.test('ping', 'ascii')); - b.add('ping', 'ascii'); - assert(b.test('ping', 'ascii')); + filter.add('ping', 'ascii'); + assert(filter.test('ping', 'ascii')); }); it('should serialize to the correct format', () => { - let filter = new Bloom(952, 6, 3624314491, Bloom.flags.NONE); - let item1 = '8e7445bbb8abd4b3174d80fa4c409fea6b94d96b'; - let item2 = '047b00000078da0dca3b0ec2300c00d0ab4466ed10' + const filter = new Bloom(952, 6, 3624314491, Bloom.flags.NONE); + const item1 = '8e7445bbb8abd4b3174d80fa4c409fea6b94d96b'; + const item2 = '047b00000078da0dca3b0ec2300c00d0ab4466ed10' + 'e763272c6c9ca052972c69e3884a9022084215e2eef' + '0e6f781656b5d5a87231cd4349e534b6dea55ad4ff55e'; + + const expected = Buffer.from('' + + '000000000000000000000000000000000000000000000000088004000000000000000' + + '000000000200000000000000000000000000000000800000000000000000002000000' + + '000000000000002000000000000000000000000000000000000000000040000200000' + + '0000000001000000800000080000000', + 'hex'); + filter.add(item1, 'hex'); filter.add(item2, 'hex'); - assert.equal(filter.filter.toString('hex'), filterHex); + + assert.bufferEqual(filter.filter, expected); }); it('should handle 1m ops with regular filter', () => { - let filter = Bloom.fromRate(210000, 0.00001, -1); - let i, j, str; + const filter = Bloom.fromRate(210000, 0.00001, -1); filter.tweak = 0xdeadbeef; // ~1m operations - for (i = 0; i < 1000; i++) { - str = 'foobar' + i; + for (let i = 0; i < 1000; i++) { + const str = 'foobar' + i; + let j = i; filter.add(str, 'ascii'); - j = i; do { - str = 'foobar' + j; - assert(filter.test(str, 'ascii') === true); - assert(filter.test(str + '-', 'ascii') === false); + const str = 'foobar' + j; + assert(filter.test(str, 'ascii')); + assert(!filter.test(str + '-', 'ascii')); } while (j--); } }); it('should handle 1m ops with rolling filter', () => { - let filter = new RollingFilter(210000, 0.00001); - let i, j, str; + const filter = new RollingFilter(210000, 0.00001); filter.tweak = 0xdeadbeef; // ~1m operations - for (i = 0; i < 1000; i++) { - str = 'foobar' + i; + for (let i = 0; i < 1000; i++) { + const str = 'foobar' + i; + let j = i; filter.add(str, 'ascii'); - j = i; do { - str = 'foobar' + j; - assert(filter.test(str, 'ascii') === true); - assert(filter.test(str + '-', 'ascii') === false); + const str = 'foobar' + j; + assert(filter.test(str, 'ascii')); + assert(!filter.test(str + '-', 'ascii')); } while (j--); } }); it('should handle rolling generations', () => { - let filter = new RollingFilter(50, 0.00001); - let i, j, str; + const filter = new RollingFilter(50, 0.00001); filter.tweak = 0xdeadbeee; - for (i = 0; i < 25; i++) { - str = 'foobar' + i; + for (let i = 0; i < 25; i++) { + const str = 'foobar' + i; + let j = i; filter.add(str, 'ascii'); - j = i; do { - str = 'foobar' + j; - assert(filter.test(str, 'ascii') === true); - assert(filter.test(str + '-', 'ascii') === false); + const str = 'foobar' + j; + assert(filter.test(str, 'ascii')); + assert(!filter.test(str + '-', 'ascii')); } while (j--); } - for (i = 25; i < 50; i++) { - str = 'foobar' + i; + for (let i = 25; i < 50; i++) { + const str = 'foobar' + i; + let j = i; filter.add(str, 'ascii'); - j = i; do { - str = 'foobar' + j; - assert(filter.test(str, 'ascii') === true, str); - assert(filter.test(str + '-', 'ascii') === false, str); + const str = 'foobar' + j; + assert(filter.test(str, 'ascii')); + assert(!filter.test(str + '-', 'ascii')); } while (j--); } - for (i = 50; i < 75; i++) { - str = 'foobar' + i; + for (let i = 50; i < 75; i++) { + const str = 'foobar' + i; + let j = i; filter.add(str, 'ascii'); - j = i; do { - str = 'foobar' + j; - assert(filter.test(str, 'ascii') === true, str); - assert(filter.test(str + '-', 'ascii') === false, str); + const str = 'foobar' + j; + assert(filter.test(str, 'ascii')); + assert(!filter.test(str + '-', 'ascii')); } while (j--); } - for (i = 75; i < 100; i++) { - str = 'foobar' + i; + for (let i = 75; i < 100; i++) { + const str = 'foobar' + i; + let j = i; filter.add(str, 'ascii'); - j = i; do { - str = 'foobar' + j; - assert(filter.test(str, 'ascii') === true, str); - assert(filter.test(str + '-', 'ascii') === false, str); + const str = 'foobar' + j; + assert(filter.test(str, 'ascii')); + assert(!filter.test(str + '-', 'ascii')); } while (j-- > 25); - assert(filter.test('foobar 24', 'ascii') === false); + assert(!filter.test('foobar 24', 'ascii')); } - for (i = 100; i < 125; i++) { - str = 'foobar' + i; + for (let i = 100; i < 125; i++) { + const str = 'foobar' + i; + let j = i; filter.add(str, 'ascii'); - j = i; do { - str = 'foobar' + j; - assert(filter.test(str, 'ascii') === true, str); - assert(filter.test(str + '-', 'ascii') === false, str); + const str = 'foobar' + j; + assert(filter.test(str, 'ascii')); + assert(!filter.test(str + '-', 'ascii')); } while (j-- > 50); } - assert(filter.test('foobar 49', 'ascii') === false); + assert(!filter.test('foobar 49', 'ascii')); }); }); diff --git a/test/chachapoly-test.js b/test/chachapoly-test.js index 5399e3474..27beb23c1 100644 --- a/test/chachapoly-test.js +++ b/test/chachapoly-test.js @@ -1,74 +1,62 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); +const assert = require('./util/assert'); const ChaCha20 = require('../lib/crypto/chacha20'); const Poly1305 = require('../lib/crypto/poly1305'); const AEAD = require('../lib/crypto/aead'); -describe('ChaCha20 / Poly1305 / AEAD', function() { - function testChaCha(options) { - let key = options.key; - let nonce = options.nonce; - let plain = options.plain; - let ciphertext = options.ciphertext; - let counter = options.counter; - let chacha, plainenc; - - key = Buffer.from(key, 'hex'); - nonce = Buffer.from(nonce, 'hex'); - plain = Buffer.from(plain, 'hex'); - ciphertext = Buffer.from(ciphertext, 'hex'); - - chacha = new ChaCha20(); - chacha.init(key, nonce, counter); - plainenc = Buffer.from(plain); - chacha.encrypt(plainenc); - assert.deepEqual(plainenc, ciphertext); - - chacha = new ChaCha20(); - chacha.init(key, nonce, counter); - chacha.encrypt(ciphertext); - assert.deepEqual(plain, ciphertext); - } - - function testAEAD(options) { - let plain = options.plain; - let aad = options.aad; - let key = options.key; - let nonce = options.nonce; - let pk = options.pk; - let ciphertext = options.ciphertext; - let tag = options.tag; - let aead, plainenc; - - plain = Buffer.from(plain, 'hex'); - aad = Buffer.from(aad, 'hex'); - key = Buffer.from(key, 'hex'); - nonce = Buffer.from(nonce, 'hex'); - pk = Buffer.from(pk, 'hex'); - ciphertext = Buffer.from(ciphertext, 'hex'); - tag = Buffer.from(tag, 'hex'); - - aead = new AEAD(); - aead.init(key, nonce); - assert.equal(aead.chacha20.getCounter(), 1); - assert.deepEqual(aead.polyKey, pk); - aead.aad(aad); - plainenc = Buffer.from(plain); - aead.encrypt(plainenc); - assert.deepEqual(plainenc, ciphertext); - assert.deepEqual(aead.finish(), tag); - - aead = new AEAD(); - aead.init(key, nonce); - assert.equal(aead.chacha20.getCounter(), 1); - assert.deepEqual(aead.polyKey, pk); - aead.aad(aad); - aead.decrypt(ciphertext); - assert.deepEqual(ciphertext, plain); - assert.deepEqual(aead.finish(), tag); - } +function testChaCha(options) { + const key = Buffer.from(options.key, 'hex'); + const nonce = Buffer.from(options.nonce, 'hex'); + const plain = Buffer.from(options.plain, 'hex'); + const ciphertext = Buffer.from(options.ciphertext, 'hex'); + const counter = options.counter; + + const ctx1 = new ChaCha20(); + ctx1.init(key, nonce, counter); + const plainenc = Buffer.from(plain); + ctx1.encrypt(plainenc); + assert.bufferEqual(plainenc, ciphertext); + + const ctx2 = new ChaCha20(); + ctx2.init(key, nonce, counter); + ctx2.encrypt(ciphertext); + assert.bufferEqual(plain, ciphertext); +} + +function testAEAD(options) { + const plain = Buffer.from(options.plain, 'hex'); + const aad = Buffer.from(options.aad, 'hex'); + const key = Buffer.from(options.key, 'hex'); + const nonce = Buffer.from(options.nonce, 'hex'); + const pk = Buffer.from(options.pk, 'hex'); + const ciphertext = Buffer.from(options.ciphertext, 'hex'); + const tag = Buffer.from(options.tag, 'hex'); + + const ctx1 = new AEAD(); + ctx1.init(key, nonce); + assert.strictEqual(ctx1.chacha20.getCounter(), 1); + assert.bufferEqual(ctx1.polyKey, pk); + ctx1.aad(aad); + const plainenc = Buffer.from(plain); + ctx1.encrypt(plainenc); + assert.bufferEqual(plainenc, ciphertext); + assert.bufferEqual(ctx1.finish(), tag); + + const ctx2 = new AEAD(); + ctx2.init(key, nonce); + assert.strictEqual(ctx2.chacha20.getCounter(), 1); + assert.bufferEqual(ctx2.polyKey, pk); + ctx2.aad(aad); + ctx2.decrypt(ciphertext); + assert.bufferEqual(ciphertext, plain); + assert.bufferEqual(ctx2.finish(), tag); +} +describe('ChaCha20 / Poly1305 / AEAD', function() { it('should perform chacha20', () => { testChaCha({ key: '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', @@ -96,7 +84,8 @@ describe('ChaCha20 / Poly1305 / AEAD', function() { + '0000000000000000000000000000000000000000000000000000000000000000', ciphertext: '' + '76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b77' - + '0dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586', + + '0dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669' + + 'b2ee6586', counter: 0 }); }); @@ -159,35 +148,37 @@ describe('ChaCha20 / Poly1305 / AEAD', function() { }); it('should perform poly1305', () => { - let expected = Buffer.from('ddb9da7ddd5e52792730ed5cda5f90a4', 'hex'); - let key = Buffer.allocUnsafe(32); - let msg = Buffer.allocUnsafe(73); - let mac; - let i; + const expected = Buffer.from('ddb9da7ddd5e52792730ed5cda5f90a4', 'hex'); + const key = Buffer.allocUnsafe(32); + const msg = Buffer.allocUnsafe(73); - for (i = 0; i < key.length; i++) + for (let i = 0; i < key.length; i++) key[i] = i + 221; - for (i = 0; i < msg.length; i++) + for (let i = 0; i < msg.length; i++) msg[i] = i + 121; - mac = Poly1305.auth(msg, key); + const mac = Poly1305.auth(msg, key); assert(Poly1305.verify(mac, expected)); - assert.deepEqual(mac, expected); + assert.bufferEqual(mac, expected); }); it('should perform poly1305', () => { - let key = '85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b'; - let msg = 'Cryptographic Forum Research Group'; - let tag = 'a8061dc1305136c6c22b8baf0c0127a9'; - let mac; + const key = Buffer.from('' + + '85d6be7857556d337f4452fe42d506a' + + '80103808afb0db2fd4abff6af4149f51b', + 'hex'); - key = Buffer.from(key, 'hex'); - msg = Buffer.from(msg, 'ascii'); - tag = Buffer.from(tag, 'hex'); + const msg = Buffer.from('Cryptographic Forum Research Group', 'ascii'); + const tag = Buffer.from('a8061dc1305136c6c22b8baf0c0127a9', 'hex'); + + const mac = Poly1305.auth(msg, key); - mac = Poly1305.auth(msg, key); assert(Poly1305.verify(mac, tag)); + + mac[0] = 0; + + assert(!Poly1305.verify(mac, tag)); }); it('should create an AEAD and encrypt', () => { diff --git a/test/chain-test.js b/test/chain-test.js index 94808c987..c3785303b 100644 --- a/test/chain-test.js +++ b/test/chain-test.js @@ -1,85 +1,113 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); -const BN = require('../lib/crypto/bn'); +const assert = require('./util/assert'); const consensus = require('../lib/protocol/consensus'); const encoding = require('../lib/utils/encoding'); const Coin = require('../lib/primitives/coin'); const Script = require('../lib/script/script'); const Chain = require('../lib/blockchain/chain'); +const WorkerPool = require('../lib/workers/workerpool'); const Miner = require('../lib/mining/miner'); const MTX = require('../lib/primitives/mtx'); const MemWallet = require('./util/memwallet'); const Network = require('../lib/protocol/network'); const Output = require('../lib/primitives/output'); const common = require('../lib/blockchain/common'); +const Opcode = require('../lib/script/opcode'); const opcodes = Script.opcodes; -describe('Chain', function() { - const network = Network.get('regtest'); - const chain = new Chain({ db: 'memory', network: network }); - const miner = new Miner({ chain: chain, version: 4 }); - const wallet = new MemWallet({ network: network }); - const wwallet = new MemWallet({ network: network, witness: true }); - const cpu = miner.cpu; - let tip1, tip2; +const network = Network.get('regtest'); - this.timeout(45000); +const workers = new WorkerPool({ + enabled: true +}); - async function addBlock(block, flags) { - let entry; +const chain = new Chain({ + db: 'memory', + network, + workers +}); - try { - entry = await chain.add(block, flags); - } catch (e) { - assert(e.type === 'VerifyError'); - return e.reason; - } +const miner = new Miner({ + chain, + version: 4, + workers +}); - if (!entry) - return 'bad-prevblk'; +const cpu = miner.cpu; - return 'OK'; - } +const wallet = new MemWallet({ + network, + witness: false +}); + +const witWallet = new MemWallet({ + network, + witness: true +}); - async function mineBlock(job, flags) { - let block = await job.mineAsync(); - return await addBlock(block, flags); +let tip1 = null; +let tip2 = null; + +async function addBlock(block, flags) { + let entry; + + try { + entry = await chain.add(block, flags); + } catch (e) { + assert.strictEqual(e.type, 'VerifyError'); + return e.reason; } - async function mineCSV(tx) { - let job = await cpu.createJob(); - let rtx; + if (!entry) + return 'bad-prevblk'; - rtx = new MTX(); + return 'OK'; +} - rtx.addOutput({ - script: [ - Script.array(new BN(1)), - Script.opcodes.OP_CHECKSEQUENCEVERIFY - ], - value: 10000 - }); +async function mineBlock(job, flags) { + const block = await job.mineAsync(); + return await addBlock(block, flags); +} - rtx.addTX(tx, 0); +async function mineCSV(fund) { + const job = await cpu.createJob(); + const spend = new MTX(); - rtx.setLocktime(chain.height); + spend.addOutput({ + script: [ + Opcode.fromInt(1), + Opcode.fromSymbol('checksequenceverify') + ], + value: 10000 + }); - wallet.sign(rtx); + spend.addTX(fund, 0); + spend.setLocktime(chain.height); - job.addTX(rtx.toTX(), rtx.view); - job.refresh(); + wallet.sign(spend); - return await job.mineAsync(); - } + const [tx, view] = spend.commit(); - chain.on('connect', (entry, block) => { - wallet.addBlock(entry, block.txs); - }); + job.addTX(tx, view); + job.refresh(); - chain.on('disconnect', (entry, block) => { - wallet.removeBlock(entry, block.txs); - }); + return await job.mineAsync(); +} + +chain.on('connect', (entry, block) => { + wallet.addBlock(entry, block.txs); +}); + +chain.on('disconnect', (entry, block) => { + wallet.removeBlock(entry, block.txs); +}); + +describe('Chain', function() { + this.timeout(45000); it('should open chain and miner', async () => { await chain.open(); @@ -92,25 +120,21 @@ describe('Chain', function() { }); it('should mine 200 blocks', async () => { - let i, block; - - for (i = 0; i < 200; i++) { - block = await cpu.mineBlock(); + for (let i = 0; i < 200; i++) { + const block = await cpu.mineBlock(); assert(block); assert(await chain.add(block)); } - assert.equal(chain.height, 200); + assert.strictEqual(chain.height, 200); }); it('should mine competing chains', async () => { - let i, mtx, job1, job2, blk1, blk2, hash1, hash2; + for (let i = 0; i < 10; i++) { + const job1 = await cpu.createJob(tip1); + const job2 = await cpu.createJob(tip2); - for (i = 0; i < 10; i++) { - job1 = await cpu.createJob(tip1); - job2 = await cpu.createJob(tip2); - - mtx = await wallet.create({ + const mtx = await wallet.create({ outputs: [{ address: wallet.getAddress(), value: 10 * 1e8 @@ -123,16 +147,16 @@ describe('Chain', function() { job1.refresh(); job2.refresh(); - blk1 = await job1.mineAsync(); - blk2 = await job2.mineAsync(); + const blk1 = await job1.mineAsync(); + const blk2 = await job2.mineAsync(); - hash1 = blk1.hash('hex'); - hash2 = blk2.hash('hex'); + const hash1 = blk1.hash('hex'); + const hash2 = blk2.hash('hex'); assert(await chain.add(blk1)); assert(await chain.add(blk2)); - assert(chain.tip.hash === hash1); + assert.strictEqual(chain.tip.hash, hash1); tip1 = await chain.db.getEntry(hash1); tip2 = await chain.db.getEntry(hash2); @@ -140,33 +164,31 @@ describe('Chain', function() { assert(tip1); assert(tip2); - assert(!(await tip2.isMainChain())); + assert(!await tip2.isMainChain()); } }); it('should have correct chain value', () => { - assert.equal(chain.db.state.value, 897500000000); - assert.equal(chain.db.state.coin, 220); - assert.equal(chain.db.state.tx, 221); + assert.strictEqual(chain.db.state.value, 897500000000); + assert.strictEqual(chain.db.state.coin, 220); + assert.strictEqual(chain.db.state.tx, 221); }); it('should have correct wallet balance', async () => { - assert.equal(wallet.balance, 897500000000); + assert.strictEqual(wallet.balance, 897500000000); }); it('should handle a reorg', async () => { - let forked = false; - let entry, block; + assert.strictEqual(chain.height, 210); - assert.equal(chain.height, 210); - - entry = await chain.db.getEntry(tip2.hash); + const entry = await chain.db.getEntry(tip2.hash); assert(entry); - assert(chain.height === entry.height); + assert.strictEqual(chain.height, entry.height); - block = await cpu.mineBlock(entry); + const block = await cpu.mineBlock(entry); assert(block); + let forked = false; chain.once('reorganize', () => { forked = true; }); @@ -174,98 +196,98 @@ describe('Chain', function() { assert(await chain.add(block)); assert(forked); - assert(chain.tip.hash === block.hash('hex')); + assert.strictEqual(chain.tip.hash, block.hash('hex')); assert(chain.tip.chainwork.cmp(tip1.chainwork) > 0); }); it('should have correct chain value', () => { - assert.equal(chain.db.state.value, 900000000000); - assert.equal(chain.db.state.coin, 221); - assert.equal(chain.db.state.tx, 222); + assert.strictEqual(chain.db.state.value, 900000000000); + assert.strictEqual(chain.db.state.coin, 221); + assert.strictEqual(chain.db.state.tx, 222); }); it('should have correct wallet balance', async () => { - assert.equal(wallet.balance, 900000000000); + assert.strictEqual(wallet.balance, 900000000000); }); it('should check main chain', async () => { - let result = await tip1.isMainChain(); + const result = await tip1.isMainChain(); assert(!result); }); it('should mine a block after a reorg', async () => { - let block = await cpu.mineBlock(); - let hash, entry, result; + const block = await cpu.mineBlock(); assert(await chain.add(block)); - hash = block.hash('hex'); - entry = await chain.db.getEntry(hash); + const hash = block.hash('hex'); + const entry = await chain.db.getEntry(hash); assert(entry); - assert(chain.tip.hash === entry.hash); + assert.strictEqual(chain.tip.hash, entry.hash); - result = await entry.isMainChain(); + const result = await entry.isMainChain(); assert(result); }); it('should prevent double spend on new chain', async () => { - let job = await cpu.createJob(); - let mtx, block; - - mtx = await wallet.create({ + const mtx = await wallet.create({ outputs: [{ address: wallet.getAddress(), value: 10 * 1e8 }] }); - job.addTX(mtx.toTX(), mtx.view); - job.refresh(); + { + const job = await cpu.createJob(); - block = await job.mineAsync(); + job.addTX(mtx.toTX(), mtx.view); + job.refresh(); - assert(await chain.add(block)); + const block = await job.mineAsync(); - job = await cpu.createJob(); + assert(await chain.add(block)); + } - assert(mtx.outputs.length > 1); - mtx.outputs.pop(); + { + const job = await cpu.createJob(); - job.addTX(mtx.toTX(), mtx.view); - job.refresh(); + assert(mtx.outputs.length > 1); + mtx.outputs.pop(); - assert.equal(await mineBlock(job), 'bad-txns-inputs-missingorspent'); + job.addTX(mtx.toTX(), mtx.view); + job.refresh(); + + assert.strictEqual(await mineBlock(job), + 'bad-txns-inputs-missingorspent'); + } }); it('should fail to connect coins on an alternate chain', async () => { - let block = await chain.db.getBlock(tip1.hash); - let cb = block.txs[0]; - let mtx = new MTX(); - let job; + const block = await chain.db.getBlock(tip1.hash); + const cb = block.txs[0]; + const mtx = new MTX(); mtx.addTX(cb, 0); mtx.addOutput(wallet.getAddress(), 10 * 1e8); wallet.sign(mtx); - job = await cpu.createJob(); + const job = await cpu.createJob(); job.addTX(mtx.toTX(), mtx.view); job.refresh(); - assert.equal(await mineBlock(job), 'bad-txns-inputs-missingorspent'); + assert.strictEqual(await mineBlock(job), 'bad-txns-inputs-missingorspent'); }); it('should have correct chain value', () => { - assert.equal(chain.db.state.value, 905000000000); - assert.equal(chain.db.state.coin, 224); - assert.equal(chain.db.state.tx, 225); + assert.strictEqual(chain.db.state.value, 905000000000); + assert.strictEqual(chain.db.state.coin, 224); + assert.strictEqual(chain.db.state.tx, 225); }); it('should get coin', async () => { - let mtx, job, block, tx, output, coin; - - mtx = await wallet.send({ + const mtx = await wallet.send({ outputs: [ { address: wallet.getAddress(), @@ -282,286 +304,287 @@ describe('Chain', function() { ] }); - job = await cpu.createJob(); + const job = await cpu.createJob(); job.addTX(mtx.toTX(), mtx.view); job.refresh(); - block = await job.mineAsync(); + const block = await job.mineAsync(); assert(await chain.add(block)); - tx = block.txs[1]; - output = Coin.fromTX(tx, 2, chain.height); + const tx = block.txs[1]; + const output = Coin.fromTX(tx, 2, chain.height); - coin = await chain.db.getCoin(tx.hash('hex'), 2); + const coin = await chain.db.getCoin(tx.hash('hex'), 2); - assert.deepEqual(coin.toRaw(), output.toRaw()); + assert.bufferEqual(coin.toRaw(), output.toRaw()); }); it('should have correct wallet balance', async () => { - assert.equal(wallet.balance, 907500000000); - assert.equal(wallet.receiveDepth, 15); - assert.equal(wallet.changeDepth, 14); - assert.equal(wallet.txs, 226); + assert.strictEqual(wallet.balance, 907500000000); + assert.strictEqual(wallet.receiveDepth, 15); + assert.strictEqual(wallet.changeDepth, 14); + assert.strictEqual(wallet.txs, 226); }); it('should get tips and remove chains', async () => { - let tips = await chain.db.getTips(); + { + const tips = await chain.db.getTips(); - assert.notEqual(tips.indexOf(chain.tip.hash), -1); - assert.equal(tips.length, 2); + assert.notStrictEqual(tips.indexOf(chain.tip.hash), -1); + assert.strictEqual(tips.length, 2); + } await chain.db.removeChains(); - tips = await chain.db.getTips(); + { + const tips = await chain.db.getTips(); - assert.notEqual(tips.indexOf(chain.tip.hash), -1); - assert.equal(tips.length, 1); + assert.notStrictEqual(tips.indexOf(chain.tip.hash), -1); + assert.strictEqual(tips.length, 1); + } }); it('should rescan for transactions', async () => { let total = 0; - await chain.db.scan(0, wallet.filter, (block, txs) => { + await chain.db.scan(0, wallet.filter, async (block, txs) => { total += txs.length; - return Promise.resolve(); }); - assert.equal(total, 226); + assert.strictEqual(total, 226); }); it('should activate csv', async () => { - let deployments = network.deployments; - let i, block, prev, state, cache; + const deployments = network.deployments; miner.options.version = -1; - assert.equal(chain.height, 214); + assert.strictEqual(chain.height, 214); - prev = await chain.tip.getPrevious(); - state = await chain.getState(prev, deployments.csv); - assert.equal(state, 1); + const prev = await chain.tip.getPrevious(); + const state = await chain.getState(prev, deployments.csv); + assert.strictEqual(state, 1); - for (i = 0; i < 417; i++) { - block = await cpu.mineBlock(); + for (let i = 0; i < 417; i++) { + const block = await cpu.mineBlock(); assert(await chain.add(block)); switch (chain.height) { - case 288: - prev = await chain.tip.getPrevious(); - state = await chain.getState(prev, deployments.csv); - assert.equal(state, 1); + case 288: { + const prev = await chain.tip.getPrevious(); + const state = await chain.getState(prev, deployments.csv); + assert.strictEqual(state, 1); break; - case 432: - prev = await chain.tip.getPrevious(); - state = await chain.getState(prev, deployments.csv); - assert.equal(state, 2); + } + case 432: { + const prev = await chain.tip.getPrevious(); + const state = await chain.getState(prev, deployments.csv); + assert.strictEqual(state, 2); break; - case 576: - prev = await chain.tip.getPrevious(); - state = await chain.getState(prev, deployments.csv); - assert.equal(state, 3); + } + case 576: { + const prev = await chain.tip.getPrevious(); + const state = await chain.getState(prev, deployments.csv); + assert.strictEqual(state, 3); break; + } } } - assert.equal(chain.height, 631); + assert.strictEqual(chain.height, 631); assert(chain.state.hasCSV()); assert(chain.state.hasWitness()); - cache = await chain.db.getStateCache(); - assert.deepEqual(cache, chain.db.stateCache); - assert.equal(chain.db.stateCache.updates.length, 0); + const cache = await chain.db.getStateCache(); + assert.deepStrictEqual(cache, chain.db.stateCache); + assert.strictEqual(chain.db.stateCache.updates.length, 0); assert(await chain.db.verifyDeployments()); }); it('should have activated segwit', async () => { - let deployments = network.deployments; - let prev = await chain.tip.getPrevious(); - let state = await chain.getState(prev, deployments.segwit); - assert.equal(state, 3); + const deployments = network.deployments; + const prev = await chain.tip.getPrevious(); + const state = await chain.getState(prev, deployments.segwit); + assert.strictEqual(state, 3); }); it('should test csv', async () => { - let tx = (await chain.db.getBlock(chain.height - 100)).txs[0]; - let block = await mineCSV(tx); - let csv, job, rtx; + const tx = (await chain.db.getBlock(chain.height - 100)).txs[0]; + const csvBlock = await mineCSV(tx); - assert(await chain.add(block)); + assert(await chain.add(csvBlock)); - csv = block.txs[1]; + const csv = csvBlock.txs[1]; - rtx = new MTX(); + const spend = new MTX(); - rtx.addOutput({ + spend.addOutput({ script: [ - Script.array(new BN(2)), - Script.opcodes.OP_CHECKSEQUENCEVERIFY + Opcode.fromInt(2), + Opcode.fromSymbol('checksequenceverify') ], value: 10000 }); - rtx.addTX(csv, 0); - rtx.setSequence(0, 1, false); + spend.addTX(csv, 0); + spend.setSequence(0, 1, false); - job = await cpu.createJob(); + const job = await cpu.createJob(); - job.addTX(rtx.toTX(), rtx.view); + job.addTX(spend.toTX(), spend.view); job.refresh(); - block = await job.mineAsync(); + const block = await job.mineAsync(); assert(await chain.add(block)); }); it('should fail csv with bad sequence', async () => { - let csv = (await chain.db.getBlock(chain.height - 100)).txs[0]; - let rtx = new MTX(); - let job; + const csv = (await chain.db.getBlock(chain.height - 100)).txs[0]; + const spend = new MTX(); - rtx.addOutput({ + spend.addOutput({ script: [ - Script.array(new BN(1)), - Script.opcodes.OP_CHECKSEQUENCEVERIFY + Opcode.fromInt(1), + Opcode.fromSymbol('checksequenceverify') ], value: 1 * 1e8 }); - rtx.addTX(csv, 0); - rtx.setSequence(0, 1, false); + spend.addTX(csv, 0); + spend.setSequence(0, 1, false); - job = await cpu.createJob(); - job.addTX(rtx.toTX(), rtx.view); + const job = await cpu.createJob(); + job.addTX(spend.toTX(), spend.view); job.refresh(); - assert.equal(await mineBlock(job), 'mandatory-script-verify-flag-failed'); + assert.strictEqual(await mineBlock(job), + 'mandatory-script-verify-flag-failed'); }); it('should mine a block', async () => { - let block = await cpu.mineBlock(); + const block = await cpu.mineBlock(); assert(block); assert(await chain.add(block)); }); it('should fail csv lock checks', async () => { - let tx = (await chain.db.getBlock(chain.height - 100)).txs[0]; - let block = await mineCSV(tx); - let csv, job, rtx; + const tx = (await chain.db.getBlock(chain.height - 100)).txs[0]; + const csvBlock = await mineCSV(tx); - assert(await chain.add(block)); + assert(await chain.add(csvBlock)); - csv = block.txs[1]; + const csv = csvBlock.txs[1]; - rtx = new MTX(); + const spend = new MTX(); - rtx.addOutput({ + spend.addOutput({ script: [ - Script.array(new BN(2)), - Script.opcodes.OP_CHECKSEQUENCEVERIFY + Opcode.fromInt(2), + Opcode.fromSymbol('checksequenceverify') ], value: 1 * 1e8 }); - rtx.addTX(csv, 0); - rtx.setSequence(0, 2, false); + spend.addTX(csv, 0); + spend.setSequence(0, 2, false); - job = await cpu.createJob(); - job.addTX(rtx.toTX(), rtx.view); + const job = await cpu.createJob(); + job.addTX(spend.toTX(), spend.view); job.refresh(); - assert.equal(await mineBlock(job), 'bad-txns-nonfinal'); + assert.strictEqual(await mineBlock(job), 'bad-txns-nonfinal'); }); it('should have correct wallet balance', async () => { - assert.equal(wallet.balance, 1412499980000); + assert.strictEqual(wallet.balance, 1412499980000); }); it('should fail to connect bad bits', async () => { - let job = await cpu.createJob(); + const job = await cpu.createJob(); job.attempt.bits = 553713663; - assert.equal(await mineBlock(job), 'bad-diffbits'); + assert.strictEqual(await mineBlock(job), 'bad-diffbits'); }); it('should fail to connect bad MTP', async () => { - let mtp = await chain.tip.getMedianTime(); - let job = await cpu.createJob(); - job.attempt.ts = mtp - 1; - assert.equal(await mineBlock(job), 'time-too-old'); + const mtp = await chain.tip.getMedianTime(); + const job = await cpu.createJob(); + job.attempt.time = mtp - 1; + assert.strictEqual(await mineBlock(job), 'time-too-old'); }); it('should fail to connect bad time', async () => { - let job = await cpu.createJob(); - let now = network.now() + 3 * 60 * 60; - job.attempt.ts = now; - assert.equal(await mineBlock(job), 'time-too-new'); + const job = await cpu.createJob(); + const now = network.now() + 3 * 60 * 60; + job.attempt.time = now; + assert.strictEqual(await mineBlock(job), 'time-too-new'); }); it('should fail to connect bad locktime', async () => { - let job = await cpu.createJob(); - let tx = await wallet.send({ locktime: 100000 }); + const job = await cpu.createJob(); + const tx = await wallet.send({ locktime: 100000 }); job.pushTX(tx.toTX()); job.refresh(); - assert.equal(await mineBlock(job), 'bad-txns-nonfinal'); + assert.strictEqual(await mineBlock(job), 'bad-txns-nonfinal'); }); it('should fail to connect bad cb height', async () => { - let bip34height = network.block.bip34height; - let job = await cpu.createJob(); + const bip34height = network.block.bip34height; + const job = await cpu.createJob(); job.attempt.height = 10; job.attempt.refresh(); try { network.block.bip34height = 0; - assert.equal(await mineBlock(job), 'bad-cb-height'); + assert.strictEqual(await mineBlock(job), 'bad-cb-height'); } finally { network.block.bip34height = bip34height; } }); it('should fail to connect bad witness nonce size', async () => { - let block = await cpu.mineBlock(); - let tx = block.txs[0]; - let input = tx.inputs[0]; + const block = await cpu.mineBlock(); + const tx = block.txs[0]; + const input = tx.inputs[0]; input.witness.set(0, Buffer.allocUnsafe(33)); - input.witness.compile(); block.refresh(true); - assert.equal(await addBlock(block), 'bad-witness-nonce-size'); + assert.strictEqual(await addBlock(block), 'bad-witness-nonce-size'); }); it('should fail to connect bad witness nonce', async () => { - let block = await cpu.mineBlock(); - let tx = block.txs[0]; - let input = tx.inputs[0]; + const block = await cpu.mineBlock(); + const tx = block.txs[0]; + const input = tx.inputs[0]; input.witness.set(0, encoding.ONE_HASH); - input.witness.compile(); block.refresh(true); - assert.equal(await addBlock(block), 'bad-witness-merkle-match'); + assert.strictEqual(await addBlock(block), 'bad-witness-merkle-match'); }); it('should fail to connect bad witness commitment', async () => { - let flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; - let block = await cpu.mineBlock(); - let tx = block.txs[0]; - let output = tx.outputs[1]; - let commit; + const flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; + const block = await cpu.mineBlock(); + const tx = block.txs[0]; + const output = tx.outputs[1]; assert(output.script.isCommitment()); - commit = Buffer.from(output.script.get(1)); + const commit = Buffer.from(output.script.getData(1)); commit.fill(0, 10); - output.script.set(1, commit); + output.script.setData(1, commit); output.script.compile(); block.refresh(true); block.merkleRoot = block.createMerkleRoot('hex'); - assert.equal(await addBlock(block, flags), 'bad-witness-merkle-match'); + assert.strictEqual(await addBlock(block, flags), + 'bad-witness-merkle-match'); }); it('should fail to connect unexpected witness', async () => { - let flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; - let block = await cpu.mineBlock(); - let tx = block.txs[0]; - let output = tx.outputs[1]; + const flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; + const block = await cpu.mineBlock(); + const tx = block.txs[0]; + const output = tx.outputs[1]; assert(output.script.isCommitment()); @@ -570,227 +593,219 @@ describe('Chain', function() { block.refresh(true); block.merkleRoot = block.createMerkleRoot('hex'); - assert.equal(await addBlock(block, flags), 'unexpected-witness'); + assert.strictEqual(await addBlock(block, flags), 'unexpected-witness'); }); it('should add wit addrs to miner', async () => { miner.addresses.length = 0; - miner.addAddress(wwallet.getReceive()); - assert.equal(wwallet.getReceive().getType(), 'witness'); + miner.addAddress(witWallet.getReceive()); + assert.strictEqual(witWallet.getReceive().getType(), 'witness'); }); it('should mine 2000 witness blocks', async () => { - let i, block; - - for (i = 0; i < 2001; i++) { - block = await cpu.mineBlock(); + for (let i = 0; i < 2001; i++) { + const block = await cpu.mineBlock(); assert(block); assert(await chain.add(block)); } - assert.equal(chain.height, 2636); + assert.strictEqual(chain.height, 2636); }); it('should mine a witness tx', async () => { - let block = await chain.db.getBlock(chain.height - 2000); - let cb = block.txs[0]; - let mtx = new MTX(); - let job; + const prev = await chain.db.getBlock(chain.height - 2000); + const cb = prev.txs[0]; + const mtx = new MTX(); mtx.addTX(cb, 0); - mtx.addOutput(wwallet.getAddress(), 1000); + mtx.addOutput(witWallet.getAddress(), 1000); - wwallet.sign(mtx); + witWallet.sign(mtx); - job = await cpu.createJob(); + const job = await cpu.createJob(); job.addTX(mtx.toTX(), mtx.view); job.refresh(); - block = await job.mineAsync(); + const block = await job.mineAsync(); assert(await chain.add(block)); }); it('should mine fail to connect too much weight', async () => { - let start = chain.height - 2000; - let end = chain.height - 200; - let job = await cpu.createJob(); - let mtx = new MTX(); - let i, j, block, cb; + const start = chain.height - 2000; + const end = chain.height - 200; + const job = await cpu.createJob(); - for (i = start; i <= end; i++) { - block = await chain.db.getBlock(i); - cb = block.txs[0]; + for (let i = start; i <= end; i++) { + const block = await chain.db.getBlock(i); + const cb = block.txs[0]; - mtx = new MTX(); + const mtx = new MTX(); mtx.addTX(cb, 0); - for (j = 0; j < 16; j++) - mtx.addOutput(wwallet.getAddress(), 1); + for (let j = 0; j < 16; j++) + mtx.addOutput(witWallet.getAddress(), 1); - wwallet.sign(mtx); + witWallet.sign(mtx); job.pushTX(mtx.toTX()); } job.refresh(); - assert.equal(await mineBlock(job), 'bad-blk-weight'); + assert.strictEqual(await mineBlock(job), 'bad-blk-weight'); }); it('should mine fail to connect too much size', async () => { - let start = chain.height - 2000; - let end = chain.height - 200; - let job = await cpu.createJob(); - let mtx = new MTX(); - let i, j, block, cb; + const start = chain.height - 2000; + const end = chain.height - 200; + const job = await cpu.createJob(); - for (i = start; i <= end; i++) { - block = await chain.db.getBlock(i); - cb = block.txs[0]; + for (let i = start; i <= end; i++) { + const block = await chain.db.getBlock(i); + const cb = block.txs[0]; - mtx = new MTX(); + const mtx = new MTX(); mtx.addTX(cb, 0); - for (j = 0; j < 20; j++) - mtx.addOutput(wwallet.getAddress(), 1); + for (let j = 0; j < 20; j++) + mtx.addOutput(witWallet.getAddress(), 1); - wwallet.sign(mtx); + witWallet.sign(mtx); job.pushTX(mtx.toTX()); } job.refresh(); - assert.equal(await mineBlock(job), 'bad-blk-length'); + assert.strictEqual(await mineBlock(job), 'bad-blk-length'); }); it('should mine a big block', async () => { - let start = chain.height - 2000; - let end = chain.height - 200; - let job = await cpu.createJob(); - let mtx = new MTX(); - let i, j, block, cb; + const start = chain.height - 2000; + const end = chain.height - 200; + const job = await cpu.createJob(); - for (i = start; i <= end; i++) { - block = await chain.db.getBlock(i); - cb = block.txs[0]; + for (let i = start; i <= end; i++) { + const block = await chain.db.getBlock(i); + const cb = block.txs[0]; - mtx = new MTX(); + const mtx = new MTX(); mtx.addTX(cb, 0); - for (j = 0; j < 15; j++) - mtx.addOutput(wwallet.getAddress(), 1); + for (let j = 0; j < 15; j++) + mtx.addOutput(witWallet.getAddress(), 1); - wwallet.sign(mtx); + witWallet.sign(mtx); job.pushTX(mtx.toTX()); } job.refresh(); - assert.equal(await mineBlock(job), 'OK'); + assert.strictEqual(await mineBlock(job), 'OK'); }); it('should fail to connect bad versions', async () => { - let i, job; - - for (i = 0; i <= 3; i++) { - job = await cpu.createJob(); + for (let i = 0; i <= 3; i++) { + const job = await cpu.createJob(); job.attempt.version = i; - assert.equal(await mineBlock(job), 'bad-version'); + assert.strictEqual(await mineBlock(job), 'bad-version'); } }); it('should fail to connect bad amount', async () => { - let job = await cpu.createJob(); + const job = await cpu.createJob(); job.attempt.fees += 1; job.refresh(); - assert.equal(await mineBlock(job), 'bad-cb-amount'); + assert.strictEqual(await mineBlock(job), 'bad-cb-amount'); }); it('should fail to connect premature cb spend', async () => { - let job = await cpu.createJob(); - let block = await chain.db.getBlock(chain.height - 98); - let cb = block.txs[0]; - let mtx = new MTX(); + const job = await cpu.createJob(); + const block = await chain.db.getBlock(chain.height - 98); + const cb = block.txs[0]; + const mtx = new MTX(); mtx.addTX(cb, 0); - mtx.addOutput(wwallet.getAddress(), 1); + mtx.addOutput(witWallet.getAddress(), 1); - wwallet.sign(mtx); + witWallet.sign(mtx); job.addTX(mtx.toTX(), mtx.view); job.refresh(); - assert.equal(await mineBlock(job), + assert.strictEqual(await mineBlock(job), 'bad-txns-premature-spend-of-coinbase'); }); it('should fail to connect vout belowout', async () => { - let job = await cpu.createJob(); - let block = await chain.db.getBlock(chain.height - 99); - let cb = block.txs[0]; - let mtx = new MTX(); + const job = await cpu.createJob(); + const block = await chain.db.getBlock(chain.height - 99); + const cb = block.txs[0]; + const mtx = new MTX(); mtx.addTX(cb, 0); - mtx.addOutput(wwallet.getAddress(), 1e8); + mtx.addOutput(witWallet.getAddress(), 1e8); - wwallet.sign(mtx); + witWallet.sign(mtx); job.pushTX(mtx.toTX()); job.refresh(); - assert.equal(await mineBlock(job), + assert.strictEqual(await mineBlock(job), 'bad-txns-in-belowout'); }); it('should fail to connect outtotal toolarge', async () => { - let job = await cpu.createJob(); - let block = await chain.db.getBlock(chain.height - 99); - let cb = block.txs[0]; - let mtx = new MTX(); + const job = await cpu.createJob(); + const block = await chain.db.getBlock(chain.height - 99); + const cb = block.txs[0]; + const mtx = new MTX(); mtx.addTX(cb, 0); - mtx.addOutput(wwallet.getAddress(), Math.floor(consensus.MAX_MONEY / 2)); - mtx.addOutput(wwallet.getAddress(), Math.floor(consensus.MAX_MONEY / 2)); - mtx.addOutput(wwallet.getAddress(), Math.floor(consensus.MAX_MONEY / 2)); - wwallet.sign(mtx); + const value = Math.floor(consensus.MAX_MONEY / 2); + + mtx.addOutput(witWallet.getAddress(), value); + mtx.addOutput(witWallet.getAddress(), value); + mtx.addOutput(witWallet.getAddress(), value); + + witWallet.sign(mtx); job.pushTX(mtx.toTX()); job.refresh(); - assert.equal(await mineBlock(job), + assert.strictEqual(await mineBlock(job), 'bad-txns-txouttotal-toolarge'); }); it('should mine 111 multisig blocks', async () => { - let flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; - let i, j, script, cb, output, val, block; + const flags = common.flags.DEFAULT_FLAGS & ~common.flags.VERIFY_POW; - script = new Script(); - script.push(new BN(20)); + const redeem = new Script(); + redeem.pushInt(20); - for (i = 0; i < 20; i++) - script.push(encoding.ZERO_KEY); + for (let i = 0; i < 20; i++) + redeem.pushData(encoding.ZERO_KEY); - script.push(new BN(20)); - script.push(opcodes.OP_CHECKMULTISIG); - script.compile(); + redeem.pushInt(20); + redeem.pushOp(opcodes.OP_CHECKMULTISIG); - script = Script.fromScripthash(script.hash160()); + redeem.compile(); - for (i = 0; i < 111; i++) { - block = await cpu.mineBlock(); - cb = block.txs[0]; - val = cb.outputs[0].value; + const script = Script.fromScripthash(redeem.hash160()); + + for (let i = 0; i < 111; i++) { + const block = await cpu.mineBlock(); + const cb = block.txs[0]; + const val = cb.outputs[0].value; cb.outputs[0].value = 0; - for (j = 0; j < Math.min(100, val); j++) { - output = new Output(); + for (let j = 0; j < Math.min(100, val); j++) { + const output = new Output(); output.script = script.clone(); output.value = 1; @@ -803,47 +818,48 @@ describe('Chain', function() { assert(await chain.add(block, flags)); } - assert.equal(chain.height, 2749); + assert.strictEqual(chain.height, 2749); }); it('should fail to connect too many sigops', async () => { - let start = chain.height - 110; - let end = chain.height - 100; - let job = await cpu.createJob(); - let i, j, mtx, script, block, cb; + const start = chain.height - 110; + const end = chain.height - 100; + const job = await cpu.createJob(); + + const script = new Script(); + + script.pushInt(20); - script = new Script(); - script.push(new BN(20)); + for (let i = 0; i < 20; i++) + script.pushData(encoding.ZERO_KEY); - for (i = 0; i < 20; i++) - script.push(encoding.ZERO_KEY); + script.pushInt(20); + script.pushOp(opcodes.OP_CHECKMULTISIG); - script.push(new BN(20)); - script.push(opcodes.OP_CHECKMULTISIG); script.compile(); - for (i = start; i <= end; i++) { - block = await chain.db.getBlock(i); - cb = block.txs[0]; + for (let i = start; i <= end; i++) { + const block = await chain.db.getBlock(i); + const cb = block.txs[0]; if (cb.outputs.length === 2) continue; - mtx = new MTX(); + const mtx = new MTX(); - for (j = 2; j < cb.outputs.length; j++) { + for (let j = 2; j < cb.outputs.length; j++) { mtx.addTX(cb, j); - mtx.inputs[j - 2].script = new Script([script.toRaw()]); + mtx.inputs[j - 2].script.fromItems([script.toRaw()]); } - mtx.addOutput(wwallet.getAddress(), 1); + mtx.addOutput(witWallet.getAddress(), 1); job.pushTX(mtx.toTX()); } job.refresh(); - assert.equal(await mineBlock(job), 'bad-blk-sigops'); + assert.strictEqual(await mineBlock(job), 'bad-blk-sigops'); }); it('should cleanup', async () => { diff --git a/test/coins-test.js b/test/coins-test.js index 81f4281de..5c545923a 100644 --- a/test/coins-test.js +++ b/test/coins-test.js @@ -1,125 +1,103 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + 'use strict'; -const assert = require('assert'); +const assert = require('./util/assert'); const Output = require('../lib/primitives/output'); const Input = require('../lib/primitives/input'); const Outpoint = require('../lib/primitives/outpoint'); const CoinView = require('../lib/coins/coinview'); -const Coins = require('../lib/coins/coins'); +const CoinEntry = require('../lib/coins/coinentry'); const StaticWriter = require('../lib/utils/staticwriter'); const BufferReader = require('../lib/utils/reader'); -const parseTX = require('./util/common').parseTX; - -let data = parseTX('data/tx1.hex'); -let tx1 = data.tx; - -function collect(coins) { - let outputs = []; - let i; +const common = require('./util/common'); - for (i = 0; i < coins.outputs.length; i++) { - if (!coins.isUnspent(i)) - continue; - outputs.push(coins.getOutput(i)); - } - - return outputs; -} +const tx1 = common.readTX('tx1'); -function reserialize(coins) { - let raw = coins.toRaw(); - return Coins.fromRaw(raw); +function reserialize(coin) { + const raw = coin.toRaw(); + const entry = CoinEntry.fromRaw(raw); + entry.raw = null; + return CoinEntry.fromRaw(entry.toRaw()); } function deepCoinsEqual(a, b) { - assert(a.outputs.length > 0); - assert(b.outputs.length > 0); - assert.strictEqual(a.version, b.version); assert.strictEqual(a.height, b.height); assert.strictEqual(a.coinbase, b.coinbase); - assert.strictEqual(a.length(), b.length()); - assert.deepStrictEqual(collect(a), collect(b)); + assert.bufferEqual(a.raw, b.raw); } describe('Coins', function() { it('should instantiate coinview from tx', () => { - let hash = tx1.hash('hex'); - let view = new CoinView(); - let prevout = new Outpoint(hash, 0); - let input = Input.fromOutpoint(prevout); - let coins, entry, output; - - view.addTX(tx1, 1); + const [tx] = tx1.getTX(); + const hash = tx.hash('hex'); + const view = new CoinView(); + const prevout = new Outpoint(hash, 0); + const input = Input.fromOutpoint(prevout); - coins = view.get(hash); + view.addTX(tx, 1); - assert.equal(coins.version, 1); - assert.equal(coins.height, 1); - assert.equal(coins.coinbase, false); - assert.equal(coins.outputs.length, tx1.outputs.length); + const coins = view.get(hash); + assert.strictEqual(coins.outputs.size, tx.outputs.length); - entry = coins.get(0); + const entry = coins.get(0); assert(entry); - assert(!entry.spent); - assert.equal(entry.offset, 0); - assert.equal(entry.size, 0); - assert.equal(entry.raw, null); - assert(entry.output instanceof Output); - assert.equal(entry.spent, false); + assert.strictEqual(entry.version, 1); + assert.strictEqual(entry.height, 1); + assert.strictEqual(entry.coinbase, false); + assert.strictEqual(entry.raw, null); + assert.instanceOf(entry.output, Output); + assert.strictEqual(entry.spent, false); - output = view.getOutput(input); + const output = view.getOutputFor(input); assert(output); - deepCoinsEqual(coins, reserialize(coins)); + deepCoinsEqual(entry, reserialize(entry)); }); it('should spend an output', () => { - let hash = tx1.hash('hex'); - let view = new CoinView(); - let coins, entry, length; + const [tx] = tx1.getTX(); + const hash = tx.hash('hex'); + const view = new CoinView(); - view.addTX(tx1, 1); + view.addTX(tx, 1); - coins = view.get(hash); + const coins = view.get(hash); assert(coins); - length = coins.length(); - view.spendOutput(hash, 0); + const length = coins.outputs.size; - coins = view.get(hash); - assert(coins); + view.spendEntry(new Outpoint(hash, 0)); - entry = coins.get(0); + assert.strictEqual(view.get(hash), coins); + + const entry = coins.get(0); assert(entry); assert(entry.spent); - deepCoinsEqual(coins, reserialize(coins)); - assert.strictEqual(coins.length(), length); + deepCoinsEqual(entry, reserialize(entry)); + assert.strictEqual(coins.outputs.size, length); - assert.equal(view.undo.items.length, 1); + assert.strictEqual(view.undo.items.length, 1); }); it('should handle coin view', () => { - let view = new CoinView(); - let i, tx, size, bw, br; - let raw, res, prev, coins; - - for (i = 1; i < data.txs.length; i++) { - tx = data.txs[i]; - view.addTX(tx, 1); - } + const [tx, view] = tx1.getTX(); - size = view.getSize(tx1); - bw = new StaticWriter(size); - raw = view.toWriter(bw, tx1).render(); - br = new BufferReader(raw); - res = CoinView.fromReader(br, tx1); + const size = view.getSize(tx); + const bw = new StaticWriter(size); + const raw = view.toWriter(bw, tx).render(); + const br = new BufferReader(raw); + const res = CoinView.fromReader(br, tx); - prev = tx1.inputs[0].prevout; - coins = res.get(prev.hash); + const prev = tx.inputs[0].prevout; + const coins = res.get(prev.hash); - assert.deepStrictEqual(coins.get(0), reserialize(coins).get(0)); + assert.strictEqual(coins.outputs.size, 1); + assert.strictEqual(coins.get(0), null); + deepCoinsEqual(coins.get(1), reserialize(coins.get(1))); }); }); diff --git a/test/consensus-test.js b/test/consensus-test.js new file mode 100644 index 000000000..9cd15b37d --- /dev/null +++ b/test/consensus-test.js @@ -0,0 +1,67 @@ +/* eslint-env mocha */ +/* eslint prefer-arrow-callback: "off" */ + +'use strict'; + +const assert = require('./util/assert'); +const consensus = require('../lib/protocol/consensus'); +const BN = require('../lib/crypto/bn'); + +describe('Consensus', function() { + it('should calculate reward properly', () => { + let height = 0; + let total = 0; + + for (;;) { + const reward = consensus.getReward(height, 210000); + assert(reward <= consensus.COIN * 50); + total += reward; + if (reward === 0) + break; + height++; + } + + assert.strictEqual(height, 6930000); + assert.strictEqual(total, 2099999997690000); + }); + + it('should verify proof-of-work', () => { + const bits = 0x1900896c; + + const hash = Buffer.from( + '672b3f1bb11a994267ea4171069ba0aa4448a840f38e8f340000000000000000', + 'hex' + ); + + assert(consensus.verifyPOW(hash, bits)); + }); + + it('should convert bits to target', () => { + const bits = 0x1900896c; + const target = consensus.fromCompact(bits); + const expected = new BN( + '0000000000000000896c00000000000000000000000000000000000000000000', + 'hex'); + + assert.strictEqual(target.toString('hex'), expected.toString('hex')); + }); + + it('should convert target to bits', () => { + const target = new BN( + '0000000000000000896c00000000000000000000000000000000000000000000', + 'hex'); + + const bits = consensus.toCompact(target); + const expected = 0x1900896c; + + assert.strictEqual(bits, expected); + }); + + it('should check version bit', () => { + assert(consensus.hasBit(0x20000001, 0)); + assert(!consensus.hasBit(0x20000000, 0)); + assert(!consensus.hasBit(0x10000001, 0)); + assert(consensus.hasBit(0x20000003, 1)); + assert(consensus.hasBit(0x20000003, 0)); + }); +}); diff --git a/test/data/block1087400-undo.raw b/test/data/block1087400-undo.raw new file mode 100644 index 0000000000000000000000000000000000000000..fa0de1ec0eb971105c3dddf1669ccc3ca6a7d5e0 GIT binary patch literal 6836 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 literal 0 HcmV?d00001 diff --git a/test/data/block300025.json b/test/data/block300025.json deleted file mode 100644 index 75a4fde89..000000000 --- a/test/data/block300025.json +++ /dev/null @@ -1,38912 +0,0 @@ -{ - "type": "block", - "hash": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "height": 300025, - "version": 2, - "prevBlock": "00000000000000005cbe0d56fc3714fdea1b542b848c9d9da8fdbd11441d83d1", - "merkleRoot": "af193f375fc1aeede6d781c0a563c1a66b4f69723d558438ba80f45ad3c1be28", - "ts": 1399713634, - "bits": 419465580, - "nonce": 1186968784, - "totalTX": 0, - "txs": [ - { - "type": "tx", - "hash": "13055be6d6784afa78ed08454651e4c81a03f96297b32f71992ef07e462b97f3", - "witnessHash": "0000000000000000000000000000000000000000000000000000000000000000", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 0, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0000000000000000000000000000000000000000000000000000000000000000", - "index": 4294967295 - }, - "coin": null, - "script": "03f99304e4b883e5bda9e7a59ee4bb99e9b1bcfabe6d6d4b69d66115595589c94866351760e113942b7489eb31fb37dd6458a7f906dda0100000000000000083e9191b1ca000004d696e65642062792067616263", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2507773345, - "script": "76a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a17cb56f386346017346398e9fe1b72a33e2a405fd1a8c826d3beb93e87521ef", - "witnessHash": "a17cb56f386346017346398e9fe1b72a33e2a405fd1a8c826d3beb93e87521ef", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 1, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "94708d4ac4532953baafcdc0aebc3ac50ffe72201585dae17f041b206da2eadc", - "index": 1 - }, - "coin": { - "version": 1, - "height": 269602, - "value": 474236104, - "script": "76a914dde8c137cbe849ffe184a29c93173d086908bafc88ac", - "coinbase": false, - "hash": "94708d4ac4532953baafcdc0aebc3ac50ffe72201585dae17f041b206da2eadc", - "index": 1 - }, - "script": "4830450221008d859c70f9e295de3f9d87d412e9ab7cef52313e8b8d29a66c8bce2dc80489fb02202a0a1ddea15200cddb5995d9b4e69ab5af1c12653a051bce444606deb40bd69f012102fab0756bc1428a54a9811f6e21eea5a399ee92954d1e438b691dbc361e6d3bcf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 17073588, - "script": "76a9144a58ac48115a26d8acc8941b7729f602db8d63d088ac" - }, - { - "value": 457152516, - "script": "76a914dde8c137cbe849ffe184a29c93173d086908bafc88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cf9c554c6881a2672476a82c222ac09ffbf15806a7050d8e66bc0f197a2af86e", - "witnessHash": "cf9c554c6881a2672476a82c222ac09ffbf15806a7050d8e66bc0f197a2af86e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 2, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ce78809dc91fc2045460ca44ce2e4c5ce77775bc1f9bae21a201cc91fedb58fd", - "index": 0 - }, - "coin": { - "version": 1, - "height": 273564, - "value": 4900000, - "script": "76a914c29b39493f94d8230ef1d5943e4a19b90dccd35c88ac", - "coinbase": false, - "hash": "ce78809dc91fc2045460ca44ce2e4c5ce77775bc1f9bae21a201cc91fedb58fd", - "index": 0 - }, - "script": "47304402200434b30d33028ed1e77c68015ec09978aff8ffd30fd63f9c6f66302aeaa2e9b302202f44d7e852f2d851a0524faa19ecaeae11e86705367a4c54e3329e84bdc4bb24012103918dd1e4c0ba1bb5c783dde27ba58646b120c055c9d6744684e56d86134df0ad", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3800000, - "script": "76a9142be2976a9b33febdbd907360ea34522bccd39e8188ac" - }, - { - "value": 1000000, - "script": "76a91403e74730a8235375802444c9e67772a5cae0e43388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "479a5e9cc43d1d4af90783de28f5448c315f62c966dbe37ebe6625f15fe59cf5", - "witnessHash": "479a5e9cc43d1d4af90783de28f5448c315f62c966dbe37ebe6625f15fe59cf5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 3, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4c87bc7a6f181b457005c7e66a85c349691ecfe616f4c1a9a5afa75d382df492", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299945, - "value": 362911992, - "script": "76a914a06c3bcd8b7d34101140c3b6226c44980aa5ac9888ac", - "coinbase": false, - "hash": "4c87bc7a6f181b457005c7e66a85c349691ecfe616f4c1a9a5afa75d382df492", - "index": 0 - }, - "script": "483045022100d7f7935d2559e3d62d60bc0ee6f8d06b248866912ab43a8fbb7837de2de40ef402203714065b9d0f77572eb4d52bdcd8a63bd9b19e0c43dcab22c1706e3ae5c73f9b01210260a68f5a3cc9bca17a043ad8b7c88d7101fb9412b57aac8708a2a14defd69f9b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 58380000, - "script": "76a914337bbf2414c5f62889d70689177dfc1a85a45ca488ac" - }, - { - "value": 304431992, - "script": "76a9142ace895a0e3b1bf093e73bbab15cf87de8a7b24888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "29b04bcefb7c6dfd7f33b38f7e4f2eaa5df022edb011ab935a5e7792857856db", - "witnessHash": "29b04bcefb7c6dfd7f33b38f7e4f2eaa5df022edb011ab935a5e7792857856db", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 4, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fba191bec53d0ac4cf542fb96c474256dc103407eca59e320c13a11bf1b59c94", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299861, - "value": 49051960, - "script": "76a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac", - "coinbase": false, - "hash": "fba191bec53d0ac4cf542fb96c474256dc103407eca59e320c13a11bf1b59c94", - "index": 1 - }, - "script": "4730440220472399ab5260ea623ff8b6acf6072693afff58fc70455fe4f194e6d6e95b18720220646b7c02ddaa27dbe3eee11fe243d76d3e7890563c0d0fdda3380cb069fc7685014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 19900000, - "script": "76a9142f3fcdd0d9f2f5203cacded82512902d58f656cf88ac" - }, - { - "value": 29051960, - "script": "76a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "84064bcb6588b5cb101940dda858cf081d5bda93c46aba86df237c6ef59367ff", - "witnessHash": "84064bcb6588b5cb101940dda858cf081d5bda93c46aba86df237c6ef59367ff", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 5, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7f7889d41778755cd8d009780d8c65e154fed4c5e57711d518e46bcc07209e30", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 49990000, - "script": "76a91406f1b66fa14429389cbffa656966993eab656f3788ac", - "coinbase": false, - "hash": "7f7889d41778755cd8d009780d8c65e154fed4c5e57711d518e46bcc07209e30", - "index": 1 - }, - "script": "4730440220099b55e2011ff4b68688346a994df9134364680d2584aca96bd456d085958e490220570e096e6a4f75f735e1dc89f6dc8dfa7737291435bc259e3fb8a0a25f04a56e01410403899f47637b223c8b9350381425639d7ac7c7431f7fce463e7c668520d5b306ff52d80ca6dea4e3e289355a7133183e0a3d6b484dc22213aa38bab05cf0f881", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 249950, - "script": "76a914e13898157be26174194169702552de162aa9919b88ac" - }, - { - "value": 49640050, - "script": "76a91419034a421bf9f6a14657f39c806944d3e197d1cf88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9fee29567f0472b7148cba6e4b4670b81f57e0e52bbcc275239a40361f837708", - "witnessHash": "9fee29567f0472b7148cba6e4b4670b81f57e0e52bbcc275239a40361f837708", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 6, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "275803d3609105914f517d706bea09b0c0064998d181a38ef5b0787496a2fa65", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1080000, - "script": "76a91406f1b6703d3f56427bfcfd372f952d50d04b64bd88ac", - "coinbase": false, - "hash": "275803d3609105914f517d706bea09b0c0064998d181a38ef5b0787496a2fa65", - "index": 0 - }, - "script": "493046022100ea2cdaf34f447d59dabdcbe354b62e14f078124d87afec7743461eeb1b8c2421022100d0624ffde1edb5a056d8ce0ed60c7596cd3787f8f2bb93cc4b7bd6c7c1ac4cfe014104606bf18bd8b5994b1e37ce13e7eed33e8508234a40d8795cfa6fe1f875c7e7eea13d31dc6fc77d2cc02880a9848d1573005d246a7a215b6b1ef48f7296a9d0b3", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5460, - "script": "76a9148b8050768153f806f459f11ea200954aa6f6c72388ac" - }, - { - "value": 974540, - "script": "76a914b4f5b5a9e5119d3f0327d4ff64a1b0a97fc423d988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1404ba05dd0b1f36de0251b1eafcb0ab91cba1a0934e8facf219962757419e50", - "witnessHash": "1404ba05dd0b1f36de0251b1eafcb0ab91cba1a0934e8facf219962757419e50", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 7, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "092a65ac32e4cad45056c6d7366f8bf4c20808bebdfe12b5cf12023824c33abf", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1000000, - "script": "76a91406f1b6703d3f56427bfcfd372f952d50d04b64bd88ac", - "coinbase": false, - "hash": "092a65ac32e4cad45056c6d7366f8bf4c20808bebdfe12b5cf12023824c33abf", - "index": 0 - }, - "script": "473044022013bbb55586aaa76b122a0c54a2c47fabfe23db91e8ba5fa48f929573c338f617022055baf8a200566a1895cec5732c0e0156ee7a3df560f4dac6183daa7b4f90ac36014104606bf18bd8b5994b1e37ce13e7eed33e8508234a40d8795cfa6fe1f875c7e7eea13d31dc6fc77d2cc02880a9848d1573005d246a7a215b6b1ef48f7296a9d0b3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e14e35fafeb5ca7f22c73faccdc2e85c9683e31ceaca100b2b8d5fd10c5db961", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299801, - "value": 159100000, - "script": "76a9140d2c815e3aca96576569aa62d5fd06ad1116a5d788ac", - "coinbase": false, - "hash": "e14e35fafeb5ca7f22c73faccdc2e85c9683e31ceaca100b2b8d5fd10c5db961", - "index": 1 - }, - "script": "483045022100da9b95c20e8c784722c1bfbbbeaa90bd8263f14d32738cf325f43a80f28cc92e02207e263ddc819451de158520e71757ef649be96ab6ad5e60d666a53c96b3047a7a014104e9147ece1c26d3319f6b7b5dbad45ab33429f77668857b9b4f3c7422632d6794a826c8e89791c6a2efb7fc4f2e1b3428a10e470315ff096a547f2e3bf91703e6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1957000, - "script": "76a914192631d280209f63886c0c591d34af37c3597a8188ac" - }, - { - "value": 158043000, - "script": "76a9141d811176562c8291a1c481af63b9b0460f9539fe88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0e0a2581f96035681c02a2ac57afcbe20fe3ce0336f8e9e77af18d321932fecb", - "witnessHash": "0e0a2581f96035681c02a2ac57afcbe20fe3ce0336f8e9e77af18d321932fecb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 8, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a8d3a2d04c032d9c9619e2528c84f25e58f127bdb49f022982c728b58470d9e2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1900000, - "script": "76a91406f1b66ffe49df7fce684df16c62f59dc9adbd3f88ac", - "coinbase": false, - "hash": "a8d3a2d04c032d9c9619e2528c84f25e58f127bdb49f022982c728b58470d9e2", - "index": 0 - }, - "script": "48304502200c8b70406f261d4b921f242d4f017e563f5dc59fe0638120db7a71ee8a670b18022100ceacfbc0bebb58298203496379711efc6d4189b1c5da3cc2e49a76fecaab13aa0141048cc0b94178715f03ed3d0bceb368191d0fdd7fc16d806567f6f2c45aecafb8f53e5ef849564072189b9b4f8bfe1564da776567ba359cfb0c05e839bcf65371ab", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2ccee8ab399ed6e7073a1fe42f156143eeaba424e8d14f0c359e58dbcc60c955", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4492540, - "script": "76a914231eaa596ef11e796966fd829350defd5c7edc0788ac", - "coinbase": false, - "hash": "2ccee8ab399ed6e7073a1fe42f156143eeaba424e8d14f0c359e58dbcc60c955", - "index": 1 - }, - "script": "4730440220065364c93b7f5682d5db502b7f7745f0484d75090ef95ed22ef905c52a5a15d702201073de556983a4fc0660bb10b33de47ad5aadd9d699905ce5f7c6e426e2ec5d2014104581c88854a7db0726977e7cdba582ff428f0402d51498b08a23d7a3cf206f21de6ca79baeaf5dc2d4bdabfa39299a0185a1a863f101661df2ad7a30dc23a5178", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3807311, - "script": "76a91426eda44de2416f71aa90079f4ef44dd6b849d31c88ac" - }, - { - "value": 2485229, - "script": "76a914220aff37d2665794bfc25db189633bf7042b650d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1bff350c4779d9d98f2e619f9bc5a227a18955c8f544420da436f8d3c02668d0", - "witnessHash": "1bff350c4779d9d98f2e619f9bc5a227a18955c8f544420da436f8d3c02668d0", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 9, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1b5077a90a0211682c8e43c45720c6efb8f40aeaf445af9d43a30551854c8cf5", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 17183342135, - "script": "76a9142e40a49056c250698cfc847b84528e7b5df3ec9888ac", - "coinbase": false, - "hash": "1b5077a90a0211682c8e43c45720c6efb8f40aeaf445af9d43a30551854c8cf5", - "index": 0 - }, - "script": "47304402200612c1c764e89b9c98f551526e4a3eada6fee532cdc4d7e5f46772624f3bc60a0220625815975118d56e14c70fd61d0ef4109b9c33b824e6123c833296e985fb02830121036e975050aa6b1de92cb49c5867a98550947304b3024dd0563415e98bc08d8204", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10079600, - "script": "76a914bc71df046ed4fe884acb9641475ceb84e71c163d88ac" - }, - { - "value": 17173212535, - "script": "76a9148ce75a361a939e0f2de59dc0db71fd7c18b826fa88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2250515cf1406e226770e41da3fadd8fc43d21f5c24906df196cfea0bea6fe8c", - "witnessHash": "2250515cf1406e226770e41da3fadd8fc43d21f5c24906df196cfea0bea6fe8c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 10, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a8b99f2e5fd3c13f53d8aacaec2fa34e6015c7c01fdf0bd729e33383dadefc5a", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 12757259041, - "script": "76a914483d262a98a8a91b36f3d011c736a242bbafa4c788ac", - "coinbase": false, - "hash": "a8b99f2e5fd3c13f53d8aacaec2fa34e6015c7c01fdf0bd729e33383dadefc5a", - "index": 2 - }, - "script": "47304402204e0b50c84fd6c006cf4ac6d269277e50d21d89db488f767e3cbec163ffda4e0d0220643c369808490bc13b2afe67324436b3a8891cb86b01d760cf7c01e7b7ec35ee0121038eebe6d14a0b9aee04459bfc80012565cbb6e17b1c11bcbe39db038f30d061aa", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5900000, - "script": "76a9142d7038bb5e39660062912642066bc2be9f525f1488ac" - }, - { - "value": 12751309041, - "script": "76a914dfa500e463d9f1d3fa336b73f602f004920b2dc788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "46b706617b1f908013cb469bdaa66d0c5a8a39689700f940cea4247083730e86", - "witnessHash": "46b706617b1f908013cb469bdaa66d0c5a8a39689700f940cea4247083730e86", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 11, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cdefb11014da8548167f91a724658bdaf812a4b5111208b0a41d3f68124de06e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4223546278, - "script": "76a91485d286072dfb5fa0f78f1b448ecfa8f16fb34c9188ac", - "coinbase": false, - "hash": "cdefb11014da8548167f91a724658bdaf812a4b5111208b0a41d3f68124de06e", - "index": 1 - }, - "script": "483045022100b4c0c32a205227792e12c9cdfee1dc9bc874cecaa3de7e45d4c6600643f4c87f022075f5a8c249f693ee2ecc6e41a2c523be0befe46edfb6a689cd9d79e16776966b0121024fc94824a23f6414e94ad843e9cd08c1afcf6843f438bb7548f01ba06e7e31d0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 29528390, - "script": "76a914da4284634385ed758e056a341030b4f796ee2c2f88ac" - }, - { - "value": 4193967888, - "script": "76a9140e1dd3d35deac6896c762d10d30651096da4300488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f7f2b176e9be30cf8a627edd4c351b0cea2acd24ad3be57ef6b1d93b6bdec8fb", - "witnessHash": "f7f2b176e9be30cf8a627edd4c351b0cea2acd24ad3be57ef6b1d93b6bdec8fb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 12, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "339b36868debde9351f463776f19dff4c16340d8209beaf9c3c7154a84c902b6", - "index": 86 - }, - "coin": { - "version": 1, - "height": 299161, - "value": 1011499, - "script": "76a914cc3fa5df5dee431ad178a480982ef89a454630dc88ac", - "coinbase": false, - "hash": "339b36868debde9351f463776f19dff4c16340d8209beaf9c3c7154a84c902b6", - "index": 86 - }, - "script": "48304502204677281e2e2352fadd35dbbb356aa16cc7f6bc44928249be81024af3ced10205022100e1b475bf52198d845f12be6989091ea448c71459a4340e13648ec003da386a32012103e2211c99443dae7afb5314a5a7b9e782da72b2e7da5672dea2d76aaf490b78e6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 733266, - "script": "76a914655faeb69c88debf10001a5ce9617f1cceef619988ac" - }, - { - "value": 228233, - "script": "76a914f21e87e9134d3a84bca77be4362c833b21db972b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "162f6199f249402b7f366b166bacd93e57471a4105387cd754a75b3ad70f9b39", - "witnessHash": "162f6199f249402b7f366b166bacd93e57471a4105387cd754a75b3ad70f9b39", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 13, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2191533d9f23d1c249b78ff916656ae15bd070b2509fbb99f3494ae08dceed20", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2853132, - "script": "76a91443f0232d3da6ed55134ee98f5fa15152eac3cdc688ac", - "coinbase": false, - "hash": "2191533d9f23d1c249b78ff916656ae15bd070b2509fbb99f3494ae08dceed20", - "index": 0 - }, - "script": "483045022100b2c0aada17a5404becb98c91550a1d1f3f6f7e92bb0ba5da2e5fbdb3b4ebbcc0022041e0975e117d74002016c46fe140f1489f1bce1be4d8365df156e30b8d5b4b8c01210225699102c9788298358010295ac57be435676f8450119e100d54ba2e33e40e4b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1291516, - "script": "76a914f6763f7b5a7433d4a60ec83e4c7b799f5c6ac2c488ac" - }, - { - "value": 1511616, - "script": "76a914586a354302fadc7cedf5736044e365aee807ab8e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "78754544b29d89312f2d16b4789e8861a0b54d26a9248cf895fc9df06fc83fc2", - "witnessHash": "78754544b29d89312f2d16b4789e8861a0b54d26a9248cf895fc9df06fc83fc2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 14, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3ef0c02df99e5d29164e7c61ff5997eb274f032c7a7342d6e4fcb77cef4c7c64", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297127, - "value": 8104561, - "script": "76a914d9bd8833e2ffdee28db81bc5c1f38859e0eb1d9f88ac", - "coinbase": false, - "hash": "3ef0c02df99e5d29164e7c61ff5997eb274f032c7a7342d6e4fcb77cef4c7c64", - "index": 0 - }, - "script": "483045022100b30aa565ea4db27f970a31b0d4de60bf5089412ae47366e821194963d367900c022050879769b083947415d530425a0e4e1d7841ebf645c5a6130faf04ff21d046800121037e9a06833327e3109f96677dc9657e88f8eddaff55ecbec2a8a06373ce36f46a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d1a73ddb2897c0a0d31d6cdbc0016e54cf12392082adfe8629f62215d217ae13", - "index": 1 - }, - "coin": { - "version": 1, - "height": 296037, - "value": 79611, - "script": "76a9141269e127673afa811c4c74e37f6b61e4267b6d1d88ac", - "coinbase": false, - "hash": "d1a73ddb2897c0a0d31d6cdbc0016e54cf12392082adfe8629f62215d217ae13", - "index": 1 - }, - "script": "483045022100df066970e4a2fe47f789e9f5e6b2f65ace4cec4acd9ef8275ef10a865c7aa46d0220211456ad62c6113592cfeae2d4df07e8cbb2ab5106f8458fced89bc3cf7bcc6101210349d51b6a940dd1ea4a6b6e02ba2f1a709accf145be22335d0cc8d407e46adac0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8060000, - "script": "76a91454fcebb9be81c95d0aa7c462b824ede2dc96f76788ac" - }, - { - "value": 74172, - "script": "76a9141fda42096ee5ee39514eb594f0036c03e41da45a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0c53187e2958931ed8626280e7bd513d2b0cfa807794d2dfb7492d79f456f9a8", - "witnessHash": "0c53187e2958931ed8626280e7bd513d2b0cfa807794d2dfb7492d79f456f9a8", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 15, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b123b9ecafa9f8486c71ca2ffbd179bd8373c5fbd0d63f306c736823c6e02d4c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 110000, - "script": "76a914be23007ebb9232f84a3f8d4b0c16fbab0182550088ac", - "coinbase": false, - "hash": "b123b9ecafa9f8486c71ca2ffbd179bd8373c5fbd0d63f306c736823c6e02d4c", - "index": 0 - }, - "script": "48304502204f23a5e32dac0450be84f2b1e549f102db0232f620eed9e3035f17f41fb2326f022100b8d5fc53c91ed99fa362b51d9c468a03575c4d845d70058746b12c948713b925014104d532af2a5d6d7ef209bbb4688ee5f9a05047b8314a707ea0aad96807cee00f6f0e9a0de612c0371eb1d4500202ce5bf6be9c1591c3d10f2abe61442cab9ce5da", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 89303, - "script": "76a91488940fe182deda820cb5f005ac00e15bdd54d93488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a02c6999cd47a5e72590ef4a747addae150cff83f7cafdc82b33cf17b5c41cec", - "witnessHash": "a02c6999cd47a5e72590ef4a747addae150cff83f7cafdc82b33cf17b5c41cec", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 16, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "40cbefb7cfe3efb586ce1e5727928a6714d77939431d9d7a20c7bf7decdc3eda", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 8970000, - "script": "76a9147467eb3bc9313db512d600fb7c96144aed065daf88ac", - "coinbase": false, - "hash": "40cbefb7cfe3efb586ce1e5727928a6714d77939431d9d7a20c7bf7decdc3eda", - "index": 0 - }, - "script": "493046022100b4925bc53175b16eb85b18d1d6ec82f16b2ae6b1af18307e1cd8fbf508719dbf022100ac35a302e21594db7f671f87f7ac2817e17fbee09a276c959d64f1ded9be2354014104a2122d293732c6ef2d1cd2ece96d17a829e9c6f566c670397f5c56013f2003ebf9e8f62ebd259711942fbcf4b9907feb7997df80412f5e9951499cb90508fc5b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8950000, - "script": "76a914717de9108474c90051224d6a97a1db93cb569e6c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7881e5c8abe79dcb726a254cd0b48f09379f358959bc1012712c2e3783f68aad", - "witnessHash": "7881e5c8abe79dcb726a254cd0b48f09379f358959bc1012712c2e3783f68aad", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 17, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "59950bdd1030cacc43b935dd38a87e83be30ba3c06d385e0d539a2c8196de74f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 34307696, - "script": "76a9146cd663323023b2c5c7f7cacd48daf4a7715c234b88ac", - "coinbase": false, - "hash": "59950bdd1030cacc43b935dd38a87e83be30ba3c06d385e0d539a2c8196de74f", - "index": 0 - }, - "script": "483045022100c7e70dccd46520584f9ffbc3cf6be55b2309240c5ccfb040c7914dcdddcb7e5d022066b1ddb0e6ff094538c014d0719070671059a83a2265d2d349f5cde73aa66992012103b302a60a76a1dc01183473276ccf87081f185f57831577efffd57c103df32636", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4287696, - "script": "76a914de1aec15396a83b3d0bd9f4222332c08c356763988ac" - }, - { - "value": 30000000, - "script": "76a914ec6353d6f3672c899547551208e61223cb2dc20f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fd3ce309bc93ed54182334585fa67ee9c1777021dfc4aba4436b78918488b687", - "witnessHash": "fd3ce309bc93ed54182334585fa67ee9c1777021dfc4aba4436b78918488b687", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 18, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5cbeb4a3a829e1f232faed261d2dc2f3b7a9d6c328d2d050869e6d7c25952728", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298377, - "value": 2000000, - "script": "76a9140989211e013ab24d37385c14c51f0b530a44df4b88ac", - "coinbase": false, - "hash": "5cbeb4a3a829e1f232faed261d2dc2f3b7a9d6c328d2d050869e6d7c25952728", - "index": 1 - }, - "script": "493046022100e44ff7c1b538ff0c6b861a5548c1e097e9bcfc209277727e1fbfcd19b8f01609022100d355c5596ad3795f679ace155311e26ab121ab97f00c1dd1cb017959427abdce0121038dc2efe0aba9ed648aebebd8e5871ee293682dc73b806c980e414c573e061a4d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 500000, - "script": "76a9144504ca217fab53cdc7099674542e633fe3558b2888ac" - }, - { - "value": 1480000, - "script": "76a914914d4b6bb77813d860485979f85992421400f02288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "19e49ffabfee963615d48e58cf0dfe1e569ac0ed4553fea8621242edc7953ae4", - "witnessHash": "19e49ffabfee963615d48e58cf0dfe1e569ac0ed4553fea8621242edc7953ae4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 19, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ed68f131b916b100527bc41da70b56a4288fac0b83b9ba912d76578db827b067", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 16338963, - "script": "76a914386a579d20e1f6d698c38a3e290a3e9f28beccee88ac", - "coinbase": false, - "hash": "ed68f131b916b100527bc41da70b56a4288fac0b83b9ba912d76578db827b067", - "index": 0 - }, - "script": "47304402207a0118c3bca7fb5ed82a09c6c3c648e90d98268c8ad2f209128f8b664164983e0220360cd86ff755e4dd3633ea21b6cd39c74ac8de4053d2257900bfc374971ac2120141049304b2705c670bf1ecf08b96a2c58753b161a4129590a325c74f4d1388e75c75650e455ecbe58de9287a1bd862446e7b681c7dd3f8a0ea113d489bcc4afe631d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 14241234, - "script": "76a9140f1e96bbac248f62f7d1a7909bb541455b7f4bcb88ac" - }, - { - "value": 2077729, - "script": "76a9148b2f63aa2c6dda5f8e592ea18db887fe364485a588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "312143313cc80c122f23ca0dc8d74ebce16f4ab27ad3bd06b490c20c6a7ebc66", - "witnessHash": "312143313cc80c122f23ca0dc8d74ebce16f4ab27ad3bd06b490c20c6a7ebc66", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 20, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "61d7349b6dd675c602da753b3d8b71bd0b56b260853e37f58743b858b0c2ad38", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 12602359, - "script": "76a914846884f070bd8d236385411fd43f4375228dfa3888ac", - "coinbase": false, - "hash": "61d7349b6dd675c602da753b3d8b71bd0b56b260853e37f58743b858b0c2ad38", - "index": 0 - }, - "script": "47304402204c97ec2bfbd062c464c86ca95595f6e5073897649aa9cce61f209584000ca29b02202bc05aa3652a0fc9798b1f72901db9190421c9805a9e67e6df32bd0c1f88240601410450f530633f763eae2b84b831eed3b05439f32b0f4f8186e879b059cd151bfc6531e2c48ba06d4f731ab9f53202cf2ddbc4bedbf6b065d549600f9e66e71d068b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11296804, - "script": "76a9144d2fbb552b05af884a64f004b9677bb82becdab888ac" - }, - { - "value": 1285555, - "script": "76a914ec30aba01f6deb0e1161a6ae6137d0ed47d71ccf88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "898a03be617f58a0fc8aef4c5415f9d4e20621850a0d0afd32be8a500f368de1", - "witnessHash": "898a03be617f58a0fc8aef4c5415f9d4e20621850a0d0afd32be8a500f368de1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 21, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "eb1e430212ed6eb93f46dab40ecff057a5d3b62322ec84fd53b9fc44ea5f407e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 7988142, - "script": "76a91483a3f14be3e4f50864405fdd9b4a495b9cd780f288ac", - "coinbase": false, - "hash": "eb1e430212ed6eb93f46dab40ecff057a5d3b62322ec84fd53b9fc44ea5f407e", - "index": 1 - }, - "script": "473044022018cdbc90abbe2bddd4a5a302bf4ba7661dd80f2b633f024e764411cdf83132d002206f83e5b766a293b6eac9cc2239061d5d7b65f000d6b5d63512ba26c387bda149014104e740c66fc8fdd2d3503f71e3b8b71132653647beef33093d8ae76016228204a0eeb892da1f974a6c9ea96fec3492322389fbf9eae6fba88ccbb42fcc00bb9756", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4968142, - "script": "76a91483a3f14be3e4f50864405fdd9b4a495b9cd780f288ac" - }, - { - "value": 3000000, - "script": "76a914a6511d422458ce969d6ff0358ba43b463ce98a9088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a9d865a4d8713e6eb332f7f4b20e2ddd8cb9458076f741199426b11d22d82870", - "witnessHash": "a9d865a4d8713e6eb332f7f4b20e2ddd8cb9458076f741199426b11d22d82870", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 22, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0e212d7eb1b6cb40d739050512dc5b383f1fe63e0eea573cdef0e491d5259468", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299734, - "value": 70000000, - "script": "76a914d9230ad8984691d6fe80de4d47d0a51008a6196d88ac", - "coinbase": false, - "hash": "0e212d7eb1b6cb40d739050512dc5b383f1fe63e0eea573cdef0e491d5259468", - "index": 0 - }, - "script": "483045022100914d6c498655ee5ef79bf66eacec5a59c6a6b749942b7a51e25658dbde2937b502202166af91fe76397799e19c5dc512900ab068d500531087fd5009664639d03ea2014104aec9474a7857a767cd0d42833c041179e97341198aaa7fcbf596297e59c88beaf561f71afb28530f5799684570866da0fb775671d3cbc5cc2502e2d3b5a123fc", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5000000, - "script": "76a914ad789c4c9a2995636f9c64349e863930649eb04088ac" - }, - { - "value": 64980000, - "script": "76a914d9230ad8984691d6fe80de4d47d0a51008a6196d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9ced854ec57b7e9507c49b80595788e7695a37bbe085d81c1a08b719014caa0c", - "witnessHash": "9ced854ec57b7e9507c49b80595788e7695a37bbe085d81c1a08b719014caa0c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 23, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ab4d6474ed7097e6ed4bbdc6dac3faf85c9233206126bfa618bf9ea7d62a43e5", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 220946, - "script": "76a914e6cdb321870d70ab0786422c55d176267d0eefe888ac", - "coinbase": false, - "hash": "ab4d6474ed7097e6ed4bbdc6dac3faf85c9233206126bfa618bf9ea7d62a43e5", - "index": 0 - }, - "script": "48304502203479e1f194332ce5721dd30a979db8c15729077c6aacf75ccd6ad85d34ef14df022100ff2b7141a55c4730c2d5c858bc0123e380b91d423d6e634b60fc71655986178401210244182720a7597dac6fd41d64491d0dcbdb14a7f132c5c6105f2ad6f9abefd0a9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 210000, - "script": "76a91432a7df1cc1a6f3ff21737f0f66412e8d8cf27d8688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "32abb1debf3ba9c240feea7fcf0c32c9e4230be80da39276a91572f51b508cc1", - "witnessHash": "32abb1debf3ba9c240feea7fcf0c32c9e4230be80da39276a91572f51b508cc1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 24, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ce8a7e9746f1cb8de9bf07eb9600ea06b34b609ce531ed978a4d3c686b041e17", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 1040000, - "script": "76a914e698d96e924c3b6e675c836a11d64252fd74b54c88ac", - "coinbase": false, - "hash": "ce8a7e9746f1cb8de9bf07eb9600ea06b34b609ce531ed978a4d3c686b041e17", - "index": 1 - }, - "script": "47304402203e29eca46b7a6fb428a4387bb3710099aef28fb83158253ab45cd1277c0e5f3902202320903af0d897e04fb8bd11c73b08f7297463e5f468077d4b0cc572659fadba01210236aa63ac25f805833298877a2179b882a90e716a93448f524e63bd6cd60739b8", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7b41c451c3fd8ebe93eb702aa5788d68091a675801da670f0c1683b09fa03b4e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297864, - "value": 30000000, - "script": "76a9141b6b91b30c409529e911b5b8f3d0c20443ff7c6388ac", - "coinbase": false, - "hash": "7b41c451c3fd8ebe93eb702aa5788d68091a675801da670f0c1683b09fa03b4e", - "index": 0 - }, - "script": "493046022100ed70f637f0b2cd98ed2be0f0d359cca6008979cafe00e8381fb3dc2b06be5b0d022100e52c56dd7d004622b20eed3b0688163881d19a5ef374ccbdf9ee4892fe3c9d14012102dd8cf552b8bc62abd6b573cd235cec4901c72ef039f364353780d55f537e0b31", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 30000000, - "script": "76a91405435e2798b3b66dec568f4b4651ce7350fc131788ac" - }, - { - "value": 1020000, - "script": "76a9143d1f652976555827a4ff644a3fbb7088bb917bfa88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8b85b8fb989f2ef49e8939a50a186f79b214bb5e8c278fa6e5efdce73ee38319", - "witnessHash": "8b85b8fb989f2ef49e8939a50a186f79b214bb5e8c278fa6e5efdce73ee38319", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 25, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "bcbd8568a9608d46a2868e9b263765c669adf64a2f1fd395303c5333df9f80f6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 54980000, - "script": "76a914ecd012edd92652b4ae156b2f5934cd897d14bb9988ac", - "coinbase": false, - "hash": "bcbd8568a9608d46a2868e9b263765c669adf64a2f1fd395303c5333df9f80f6", - "index": 0 - }, - "script": "47304402201da25775ec6d838c8570f19a0e110795feef13abd99e02349ee87ceb9caadf280220140b2b47104ffcda46701703a27716f4c67e86b02d592e1f152241bad7ffee3d01210362278b77316cf811832a472c014d17beda342a07c8bf6f1e0ea23920e483ea5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 54970000, - "script": "76a914d37f779e26718f0deec1aef0b026918e3395073f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "878b62bc56344e7713e39ba5ceb739ada5bc0cfde9f74ef9966108783d31ee8d", - "witnessHash": "878b62bc56344e7713e39ba5ceb739ada5bc0cfde9f74ef9966108783d31ee8d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 26, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fa1050cee3943c2efef86c4f4a11c20f309476632c4f602eeaf7caa1ad6cafee", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299990, - "value": 2105923, - "script": "76a9143622cc09a893b6d258a8865d988db31b1161256b88ac", - "coinbase": false, - "hash": "fa1050cee3943c2efef86c4f4a11c20f309476632c4f602eeaf7caa1ad6cafee", - "index": 0 - }, - "script": "47304402200ee3e9bdb03cfd45bc4def490e72db394274174c06ec26829ca85c020d59938b02206bc62ba813d58bd7b980ed2c7fb123e8e2ffff855b1212f45f4d4165cefc1bc1012103edf1ffeda92c1698eb0370cb125947c3f7ecb9e3ab3fd0cd980f413b514c68c8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2095923, - "script": "76a914a98fb3420fa3dea2695b8a150d3dc9b94cd4104d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "20d8e77631d35238054c0e0f1dd6ed7f42edc0a578c50318affd211c0a5c335a", - "witnessHash": "20d8e77631d35238054c0e0f1dd6ed7f42edc0a578c50318affd211c0a5c335a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 27, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a5693df0d8f53d44eaa192cbaa8b25e93f1b0ee11eda9e410bb258a488de821f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 296204, - "value": 12100, - "script": "76a91482f69329052eed1f1e02c41639a3055be44da61d88ac", - "coinbase": false, - "hash": "a5693df0d8f53d44eaa192cbaa8b25e93f1b0ee11eda9e410bb258a488de821f", - "index": 0 - }, - "script": "47304402200d2e9bae0dba9e3f79ca6a500ec6d71a028112cd14758c7a118e30e70ca888d702200369798959456573ddb8d5c808e68a04da02cd784f0820866657fa4ef338c37901210236cf55773ccd9ee3de709dd0b130bc6e53466ff140870236f7c017248f840e54", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2100, - "script": "76a914f75b71d1b0df9aa8011c19daa2c9fe15b3d61c5788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0c9df6a2c82cca4ea85ac80e7e8efafa9b2adcbbec879ea4ac62e8a40afc771f", - "witnessHash": "0c9df6a2c82cca4ea85ac80e7e8efafa9b2adcbbec879ea4ac62e8a40afc771f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 28, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7d4d851dc0d83bdee3aa2ad35eebda16268f42357b9b5298ac96d1271bb8cb9b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 110000, - "script": "76a91444f93ee19597602385db41658264c577fc6cd54b88ac", - "coinbase": false, - "hash": "7d4d851dc0d83bdee3aa2ad35eebda16268f42357b9b5298ac96d1271bb8cb9b", - "index": 1 - }, - "script": "4730440220755a0f82ca89f0a51e4c4e23f8d3c4b475a5fb9fd08699b80ddb0200e473e39c02203e0170d37377fd7fad12836794263cfc2b2088366acc8455843558db5f487bd30121022c1720309b6a8e5e544ab1660e31ad9b8c415d3c6fb322bc4583591127daae6a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a914ac078397f0e4a10c0a57face4bcd4d072e5ee12e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9e382c8d2224011a08bf3fb12af895fabe9d204fc07388c7c250e9e0b586b103", - "witnessHash": "9e382c8d2224011a08bf3fb12af895fabe9d204fc07388c7c250e9e0b586b103", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 29, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b9922deadd2db7b8b22f7c131dce4ed97a572280bbbe956c6d54b30006a71166", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299981, - "value": 100000000, - "script": "76a914439b96e79889a41346b322713e0fe8241bcd139988ac", - "coinbase": false, - "hash": "b9922deadd2db7b8b22f7c131dce4ed97a572280bbbe956c6d54b30006a71166", - "index": 0 - }, - "script": "483045022100ece739218419b7e138bff7d666352b6681cfed264d52c85c6c229d2facbd0bd302203e90bd399c6bf045b546c90ed90e6ba1a4e7371b2570eb1d53d7ef2b2a30bb1f012102ffa61094c8ff6ebe824809ea9756701aecf25396a2e046beb63fe6178ce4164d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 99990000, - "script": "76a9142deae64f4a27a793a1aa33d3b16c442738f45eb588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8a9c0788c60344ec13f21eb7c6032119d7fef634735b919c1e905d9bac41c6aa", - "witnessHash": "8a9c0788c60344ec13f21eb7c6032119d7fef634735b919c1e905d9bac41c6aa", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 30, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 1543 - }, - "coin": { - "version": 1, - "height": 299989, - "value": 5900000, - "script": "76a914c8d37561b8f3840411b895b109b0734ab28e349888ac", - "coinbase": false, - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 1543 - }, - "script": "483045022100f33cc41513875c951fdcae1fb253d65c6948b7cc15181bedc0409f09b4665a6f022076baeea8a648a2d540bdf43b85df6ab0b73acabfa92024696ae2f36539792894012103d53a8e03079f42c38c4eca2e05540dfbbdf6fa23c057f5599cb4e273a79c33a5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5890000, - "script": "76a914d6c4ecd10aa488af64e01ca8327d155081b761ab88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f15f1388ee2aaba9d14d76fe47593ead43663d62e3b61f8f50ad9bc632bb07ed", - "witnessHash": "f15f1388ee2aaba9d14d76fe47593ead43663d62e3b61f8f50ad9bc632bb07ed", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 31, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a9da56e3a0e67368401c0781e44c137011c522a40cd27365a1be0bf1bd71b7c4", - "index": 144 - }, - "coin": { - "version": 1, - "height": 299957, - "value": 502689, - "script": "76a914e49d72cd0c408776ba248df40c3cd5db0e7d0f9a88ac", - "coinbase": false, - "hash": "a9da56e3a0e67368401c0781e44c137011c522a40cd27365a1be0bf1bd71b7c4", - "index": 144 - }, - "script": "483045022100b6930c2f0671e77477eaeafa542e2d92747cbed1eff65206b61fb9de329e5f9802207ac34aecbe7d5bd567beb741b6fea83102ac8902aa0e0a79f9eb320bd761745e0121021b5ca0e67023bb957359566318c96ab5a53bb13bf55b5c9431365be0f6d9a37f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 492689, - "script": "76a9149f3e7e15604ac6e87198b7c2799b2fb4148d258988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2d0d4bcc96d94413aa96404bcd1734b43333897390eae801c180a17682254f10", - "witnessHash": "2d0d4bcc96d94413aa96404bcd1734b43333897390eae801c180a17682254f10", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 32, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 241 - }, - "coin": { - "version": 1, - "height": 299989, - "value": 35890000, - "script": "76a914cb3b446b1696a5dfa17cc99c5156ed13575baba288ac", - "coinbase": false, - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 241 - }, - "script": "493046022100f51568175a1aa5b8e807ebe17c49bd3d2bfda977e543fe903359d9351fcb44c40221009bd96ebe68190dd298e5d2ce4dcd0b7178afa1a53c81f245006d4acb803fc10b0121034b0842ebf64b61222a49b62fe5e2640f40efe87252ac8c95879556c7190b1096", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 35880000, - "script": "76a914e174479a8e57ffc1b11f5174fe58cba41ea1683388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "70043fd4ad382558452a6b30a73ef229064eaedf591649ff20d7ef7e6c505bfd", - "witnessHash": "70043fd4ad382558452a6b30a73ef229064eaedf591649ff20d7ef7e6c505bfd", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 33, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4f4657352da128fd8483d01f87daa6b9171cd9d0869d39255998ea4fe1183ab1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297713, - "value": 384078079, - "script": "76a9149b4be8eb8f182d7108bf0014d951e7e2300f92cb88ac", - "coinbase": false, - "hash": "4f4657352da128fd8483d01f87daa6b9171cd9d0869d39255998ea4fe1183ab1", - "index": 1 - }, - "script": "483045022046aa933561130a311dd47d8ab9a98660254a19be31aef85a0bde1580710521e2022100bb77cf998f21ba43e509320925d6426e3639f61402d06d77aa86ab9bb98ca11101210367deaf78d1b381544375b436733e304c7dbecf4918266e3ff0087dae7ce3bf66", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3891000, - "script": "76a914d5270008c2b07123292c824ec07b64f736feaf0188ac" - }, - { - "value": 380175729, - "script": "76a91427c51158bd917760b34754818f1ad7ec4cdebd4388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c0c1520ea8d4836acbd874033b457505c4d0c1dc6fcb28068417eccdceaf7201", - "witnessHash": "c0c1520ea8d4836acbd874033b457505c4d0c1dc6fcb28068417eccdceaf7201", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 34, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "dcec155fb496eb39dd9a5cde5171f70f1499ac23701acf67305e53687179d32c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297715, - "value": 338351610, - "script": "76a9142cd8e3493ad743b07ed581b207485f3ce9a5856088ac", - "coinbase": false, - "hash": "dcec155fb496eb39dd9a5cde5171f70f1499ac23701acf67305e53687179d32c", - "index": 1 - }, - "script": "48304502202410f7435c4b7990f07d10ad87af27c2b4408dbfc6ac2de9345dc2240981417c022100ad419c87cee3af06ccdeb4ee85797f692b864e6297fbea4dcbc98ede4f4a83fe01210380a34b27af54c18546678e8a08b95adc0e38bf8a799abc782fc9d3a4f6e250f0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 303000, - "script": "76a914f32423743e5c20b8d2440abdd8962b0dae57161c88ac" - }, - { - "value": 338037260, - "script": "76a914ad8a134e2afdc78a2c0aa7018ad63e771ceb66ce88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "19a97a7ea5104239dd739f86802942575d2bb2d8ee81b3c7b3aceb2d2e746f37", - "witnessHash": "19a97a7ea5104239dd739f86802942575d2bb2d8ee81b3c7b3aceb2d2e746f37", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 35, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "294f252b5f6e3bb31ec964bceb21eecfdd5676760eb57cc84e229157032dbc2c", - "index": 116 - }, - "coin": { - "version": 1, - "height": 297716, - "value": 359146, - "script": "76a9147c8421fe921f28abbe12a17116bde94b76d7247188ac", - "coinbase": false, - "hash": "294f252b5f6e3bb31ec964bceb21eecfdd5676760eb57cc84e229157032dbc2c", - "index": 116 - }, - "script": "493046022100c32817d23440c4d887c1f744abd052479d89ffe4ae087a23ef704f478048b3d5022100e757257cc2c3150ffbd067fc9fb30033ba9d6cf0bf65ba64c826c4e2ebfa8bb101210225ac297fcac7d470ca9b11e386dd9d0835a9acbfce7bab7254202d2467961085", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e5654631acd6af9fc28202709d5d89eeafad937562fc0c569c969260b8bef726", - "index": 10 - }, - "coin": { - "version": 1, - "height": 297717, - "value": 2081367, - "script": "76a91413f050981700ed649892a7bf237e7abefca3930988ac", - "coinbase": false, - "hash": "e5654631acd6af9fc28202709d5d89eeafad937562fc0c569c969260b8bef726", - "index": 10 - }, - "script": "483045022100b2947126b338ee1a9bbd72400b473f255d465ae9142e7114398398d7fcc76d0802201362bc23f3f4469de0d70b862aa0ba024bf823e5986adbe6073fddbfb101ff83012102121b30a9c0e774b45667a99ff129ca00c20da370a6b1fb7302da27c2f701ce99", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3292073dc0bb7405cee4f90cd28fe002dec64324cfe7162885f7264bec1ee252", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297717, - "value": 268265950, - "script": "76a91440d98daf8069ac1b4de3fa45b372ec20ec8d280988ac", - "coinbase": false, - "hash": "3292073dc0bb7405cee4f90cd28fe002dec64324cfe7162885f7264bec1ee252", - "index": 1 - }, - "script": "48304502203e2803b953c953b8a8c0065d365f38a1f2696dce7cd8fe154ad53e3f3c846c79022100c58011916121e72effbf878bd5680430d446ffbd6ba6c55a37d2911c6596317d012102bcb3f7aa4b8f0fe315689c1c17aaf386e9580a6adc6d2dca11ae0c37f42aa0e9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 62201000, - "script": "76a9143ded3e89087c0e67ed47c85d329bf4c73065338188ac" - }, - { - "value": 208479213, - "script": "76a914c408cfba1b84870b4cc11f8596e63271135fc76688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0fc3170c023676eeb77ef9ac453b26c5aee0a0fb249f2d6b247c7de439bf847e", - "witnessHash": "0fc3170c023676eeb77ef9ac453b26c5aee0a0fb249f2d6b247c7de439bf847e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 36, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5d4b14b4fcf26d281a62b2e13bc110fea7722b996e856803ab0f7724d42b3eab", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299905, - "value": 426813, - "script": "76a914b7fbdf3ddf121a1a60c2c43dee8af414960d648088ac", - "coinbase": false, - "hash": "5d4b14b4fcf26d281a62b2e13bc110fea7722b996e856803ab0f7724d42b3eab", - "index": 1 - }, - "script": "4730440220519eff177321aac952a354977a2ef0bb3fe48e8108f865b52b7a852b329480a802202f0a847d913757515f6533cad6602b039382a7353f8742231555ca8d1ca234780141041ec8bc6ceb79adfaf4a6c8de39a4ff0de1d3b49068e1c85bcce2d257430c91e5880998e8788b780fe88b0d7ffccb96c7fe6d1ea396fb0ace4337414eb0f376f2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6d85a7b662de50cea6ea39da98c51c4b3bf7b4bbb4c620c854987b3c4c8a1d31", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 77489, - "script": "76a914ddc0ac91815f5f5d842337aa43c0a6927ec6ea8788ac", - "coinbase": false, - "hash": "6d85a7b662de50cea6ea39da98c51c4b3bf7b4bbb4c620c854987b3c4c8a1d31", - "index": 1 - }, - "script": "4730440220255d3da36cf7d90c00cee7b0748fe2086c705a5b32a417160923c4486a508d3702202989bda47a5142eb86dd28a66a465a6ee12625a37369bf6498c5f867cb547c39014104b783ffcfef3588966bf06271a3155e0ee4bbc44dcf67f768c1012e5600e5c06fc538e76c25907972000034b275f191367e0fa1bf4ceb13b81ad6befa16e06563", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 426300, - "script": "76a9147d13586d6f7aed481ea74774121dd1ab50535a9c88ac" - }, - { - "value": 57489, - "script": "76a9141838727768579f8a35bebe6aa0ce2c3c02c03f8088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "73147be7f4277aa0fcdac127640897a19c699074de0d621d5ff5d4bb34c141e1", - "witnessHash": "73147be7f4277aa0fcdac127640897a19c699074de0d621d5ff5d4bb34c141e1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 37, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "553f2783e44db375b920b575a11fa927a50ec7472a66c7c76e3f05c78168fd7d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 400000000, - "script": "76a914787dd893b51b743439213f56b64285ac80b92a8d88ac", - "coinbase": false, - "hash": "553f2783e44db375b920b575a11fa927a50ec7472a66c7c76e3f05c78168fd7d", - "index": 1 - }, - "script": "4730440220407aff4a885c7bed8078b2806a17dcb1fa2bce3277e3e08daa562a59026711710220532f8e598151cd0fd9425541df468e58b87fc710cfadd19a2b1e17159e917e9b0141043461619c5ee2cd676b50a62661f87fbc4383da624309a438c680e83fd8636646717fc60b6efa59f5305936ccfb59001c7d3cb4a9fcc5660397c2f66398ae3014", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ee25f05b51a4928be707f0025f67c011fd2aafa21f029b56bb8b935e121a827c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117481, - "script": "76a91473a7dbcb8a205ecdeee1f4742db18765abcad3a188ac", - "coinbase": false, - "hash": "ee25f05b51a4928be707f0025f67c011fd2aafa21f029b56bb8b935e121a827c", - "index": 1 - }, - "script": "483045022035dad5cf6d70b9097f7c452946c01380c143938b482d7be2f5a8da068197f7fa022100b552dcd06f88124b909ec7801f5c06fc690c73c5e5c6717a115a7b1ed4c582d2014104a38d2c68ed1c069269a3e59c640b0f2214e99d0ed6c54f5e1388e44bf24fead0743a812f1045069b55424d65ea9465b78298975a9508af809487c5b82b09b444", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 400000000, - "script": "76a914cff207a539af9ee7f32bcb27091ecf7c1ce9b35688ac" - }, - { - "value": 97481, - "script": "76a91489638c427b4bd9583acc929f0cfb2e29cc8ba18e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4765e89f7d028206085da98cd352b64610b6c00ec4273dfcc3206244caee0928", - "witnessHash": "4765e89f7d028206085da98cd352b64610b6c00ec4273dfcc3206244caee0928", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 38, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d522cf3389f3bf870e06e8c5a0eb0b21c3f8228f60b761c1ebe10defa0fe1784", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 103402306, - "script": "76a9144ce233ff80184ad99b4062698dc3ef7f7e1449ec88ac", - "coinbase": false, - "hash": "d522cf3389f3bf870e06e8c5a0eb0b21c3f8228f60b761c1ebe10defa0fe1784", - "index": 3 - }, - "script": "4730440220060c95aea72ae5c10ea8b75d59da2fa56c4696eb2bd2c5ef59b6fa76a74d4c1b02201b90332e371e3407acf9eebb9ef2b9b22e91139cfb076062ff19accae79134290141048cccec22581f4cf1f1eda94011b19f3be524cb637eb1e2972452ec82c5d1e07a6995ea5c383b80fd69330910328a723f3b05dd674f549e43720ba7fea520583f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "692654a5e91888abd20bea2db828c20c96bf7e326c6553465a6349ef08408d94", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137454, - "script": "76a9148d45f0d1eb7d58baf376349ba5653885e085e8f788ac", - "coinbase": false, - "hash": "692654a5e91888abd20bea2db828c20c96bf7e326c6553465a6349ef08408d94", - "index": 1 - }, - "script": "483045022100dea21280e0f1e6c2ba7098994652cf8db97a8544dffaa4d5a7115818e849c1a502204622dd06db48703949c087e20abaa8fa3a7feabbd22400d88566d618f0cc1dbd014104045570c01721a2afa6b10df3cdfb8f71ff9ac3c66414ca58419062e7547b9054d739d2befcb13b5bce962daf19fb943cb4305227d2408c9ef1bed9647b9592d0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 103402306, - "script": "76a914b491b97929dc49f6356541022ba19303429fc86988ac" - }, - { - "value": 117454, - "script": "76a9144f1255c12a52ad3a2414710f684c7a6d2f9c915a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0456a2d502039be6a1f93985edc7b58f18f1a1f8ef9415c959835a0e7f23342d", - "witnessHash": "0456a2d502039be6a1f93985edc7b58f18f1a1f8ef9415c959835a0e7f23342d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 39, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "dadac023400aae08b1f6b25fe428f6eed1ca3f5ca4f0f71b22fc716e774e880d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 89040000, - "script": "76a9144560eeb7b8187c468a16b3c28cd507439a02f40788ac", - "coinbase": false, - "hash": "dadac023400aae08b1f6b25fe428f6eed1ca3f5ca4f0f71b22fc716e774e880d", - "index": 1 - }, - "script": "48304502204227e68f23bc859898cd609f4b151aaab4b34ca5a82b76eb26c632c6452e3c5f022100d2611ccc385874ee81400d5b0efff4df6412dd5188efcedf5ff76946022fb679014104967d907b6b7c60235af9f44fe35da1bf3700ba81ed5b8576157905b388d80a1635aa0a8bf8bede8d2f1a9a4af3d932a0191d200ef0665de7f7537c184e093329", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "acc3c9b54f41ee19bea0310b832128f65774cb93b68bf4514b8edaf9b3f2a7d0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97479, - "script": "76a91447b62eb9630168677473bb127a476a814185eba188ac", - "coinbase": false, - "hash": "acc3c9b54f41ee19bea0310b832128f65774cb93b68bf4514b8edaf9b3f2a7d0", - "index": 1 - }, - "script": "47304402200a3c3943a0d341bb9ea4dfa607de31031ac9eac93d9dcc9ac1ccaa428a2b7d1402201dbf0a3cce82d92a299f19e4d0567dee43b770e41911bd30aee854407956963a0141045cf90480d9fa55d3e0e95ce7a758fa805471427a9729ebf5f91828ef75fce6bbd3df1f02e54e1977c14f54e4c22ad85e8dc8b0263ab904ae10e36457f92b8e5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 89040000, - "script": "76a9145b50d85985ee891cfd7b757243608bdcdb24dead88ac" - }, - { - "value": 77479, - "script": "76a91472f5ff7d8ff495067abd06c0746114104ee160e388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "66ce17375418c740e00a847cb9672565c7ed571a91570adc3cca865fa69a8628", - "witnessHash": "66ce17375418c740e00a847cb9672565c7ed571a91570adc3cca865fa69a8628", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 40, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "45e49db7534ecfd930230ce56f57cd6346048c7542e3baccf36cf85534fe8767", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 14470000, - "script": "76a914a03bf37626d5b5aa34fd8d4843f4fcce1e32d15788ac", - "coinbase": false, - "hash": "45e49db7534ecfd930230ce56f57cd6346048c7542e3baccf36cf85534fe8767", - "index": 0 - }, - "script": "483045022100b3e5d0a7295a727abfc408f922729495e1c350cc77f5e9880776adfdf2ce85f50220443a01fe75e594b65e44fc688a45f778729511eb9e75020e23b265507f20d84b014104b2791d8512b6a32a68c60e7c431b55804ce2958f873f51615c5edf0261a993bf2772a8e7ad9a6c3963b616e27f3183fbbcc03a8b901ca4dd870e459b2ea9f50b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1602e119999f6928321a90acec4552c92813e7d2d1ab49dc6681f2a56b58d4e0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 13225737, - "script": "76a914adb0b4a10308892943c203b139b0316e89bd2cde88ac", - "coinbase": false, - "hash": "1602e119999f6928321a90acec4552c92813e7d2d1ab49dc6681f2a56b58d4e0", - "index": 1 - }, - "script": "47304402206660f49bb99477527ffb499f734e16a1b59bc13b2f35bbda3659abdc7c1d649d022064eb4dd180bef63cccd8a7b7999e435332e9fa9a4a47b4a655e95cbd3a46e6f401410432b59bd7871a9cfcde76867c89594bf8aff495bb95379971261b0686e017ca16ee45344f97766b5129980726a8e52c6f338057901e2e4ea7c143b09e3e101d3f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8567144, - "script": "76a9144516f9005d5e550bafe7f29e8f4a6ac5b37844bc88ac" - }, - { - "value": 19108593, - "script": "76a91406d77b7096db1569e1e3d5040b5d51aced6ec69b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "33be3a17a31a3896016147de05754c37d6fd35f117d2288f41d7a7e26c10a9b2", - "witnessHash": "33be3a17a31a3896016147de05754c37d6fd35f117d2288f41d7a7e26c10a9b2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 41, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 64 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 11262622, - "script": "76a914cbefc2b62522c09598e6b547efb8445c6d0f791a88ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 64 - }, - "script": "47304402206d0ee1156a39a57736b54fb8d0f11a45fa421b3e172c457013abb505b9a30fbe02203823c746d6095213a0811c6bbe129d1db3c51082cf3973ed405ca49465a674c00141044246e23b1ebbf997f47bb0423f9861c8f73cbc9ba3bdae2a703665cc5d61f01481cc44b98c09eaeecca1341091dcfa3a321476e25010da72ae58724961543cb3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f241ede8900e4ec80f5295f5a27b4fa2ea9a680780c30631dc44d99c34e60a3f", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117489, - "script": "76a91430b24c376e58206d364de5fa2000a7882b1bda5e88ac", - "coinbase": false, - "hash": "f241ede8900e4ec80f5295f5a27b4fa2ea9a680780c30631dc44d99c34e60a3f", - "index": 2 - }, - "script": "48304502202b681e8c86118f066827772da8ba0d143d6747d57af19ed6813e1c2fd8132167022100fa276754eb6a2bfe11232dd24f5cf8f2ffb025f11b77e16ea497298a7fc87e9901410429a18d8566ef8f0e6ad1cef38c8b4941381becba4eb7178455a818d328e0fd91e174d737b1eb6a764ab38120378ade236d1c860d5378544cbf9db258df97001d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11262622, - "script": "76a914cf7fe58350ecf914cb87a7f387fa298588f05d3e88ac" - }, - { - "value": 97489, - "script": "76a91429d23417ae57d7130260217a3b3fb7a18e2b59c488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e9967f13b1cff431d16c079f8199571fd5d13addf196c2e98b003e38928042f9", - "witnessHash": "e9967f13b1cff431d16c079f8199571fd5d13addf196c2e98b003e38928042f9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 42, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "529278c1c294a946d9f497e9664267cd800186f06456d9386eda1f99adb53aee", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299885, - "value": 346218, - "script": "76a91426bc4688171da6766e6f601d13582d7904068ddb88ac", - "coinbase": false, - "hash": "529278c1c294a946d9f497e9664267cd800186f06456d9386eda1f99adb53aee", - "index": 1 - }, - "script": "483045022100d7e44c975e50fb65163fd138cfcd52ed257889b9b4577b8bd4c8b93d6cadc1720220059d81e272a0d1904d84e0f4050371f9e7ede17d04140ac5a4ce1c9fbb2f8b50014104c9d9c81250efc8424049d44debd6fa6a244688146db1bcc18ce6443407a0e6921f045199475f2c395f1a2e05c50885cf7f9e2b13af26d9428f421ed132c4725c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "036382f58fa68eeda9d74c323bcbab7dccb5639bbbb28ac405f7d6f372a14d98", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914c051195cce439b98d9aa25685f43a65c8595fb0288ac", - "coinbase": false, - "hash": "036382f58fa68eeda9d74c323bcbab7dccb5639bbbb28ac405f7d6f372a14d98", - "index": 2 - }, - "script": "483045022100dcf890f9a5426eab064cb48fdca5cd80cbd158bf0e95f88ab2b185a25eab74ae02206137fc68c3b07834924a7fdd5bb54bbd7b008619321940e616361db7b355590301410439c306539d5a602627fdb20f15b91f8b42850ad235f16d9f9b14ce507708ce6e86fa384ed04f2526b5ea8bf0355b7626e1cadf7613598d0ada29db59f64bb99c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 346185, - "script": "76a9141d04fb571ea5f1d612eecd776bb3cc76aa9d06bf88ac" - }, - { - "value": 117491, - "script": "76a914f2485c052c06fd3f4f74c74deeb8eff91f2266b488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1294791082ff3656ea47ffa1eb159e25941cd6adc8074ce9f8e02de99795a71d", - "witnessHash": "1294791082ff3656ea47ffa1eb159e25941cd6adc8074ce9f8e02de99795a71d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 43, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "508e37b638044fea76be537710cf392d42db50136f40bf8b6429f46fed540537", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 232000000, - "script": "76a9146fa68e0c2ad4c1965fb485e39b5b62627d68ac7588ac", - "coinbase": false, - "hash": "508e37b638044fea76be537710cf392d42db50136f40bf8b6429f46fed540537", - "index": 1 - }, - "script": "483045022100e7f2a6e7d960206482ce277c5408cad4fa9cf7064a879ebf432e67d49a76e2f802203ea9e0f46f18ad09fb72da5bac1dd2b18e43de3b52c3cccf503269bebc8cc47a0141048b234558d7ea7cffb374331962bcd6954b26d6a3c3cc38a5c901048b1d23732a2ad5d38be1156247052e2f99e7d394cf6f5a002ccad3dca883d7c73a44fb0f49", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4b9d13bec16f0498a8cfb3e5dda2ff94b71908e0724938e0910a0e2c9af52e8", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914b3cf5d092bc679f837bddb7ae90f61f798bd691988ac", - "coinbase": false, - "hash": "b4b9d13bec16f0498a8cfb3e5dda2ff94b71908e0724938e0910a0e2c9af52e8", - "index": 2 - }, - "script": "483045022100f2b3f1f026ae8387c96e96216cb6574bb4b6f7823e4cb28b4ea0cb0f744acf6002203f9242f4432892d70adb713f9309a40a18ad66d686e87c60da1503d33b3f2b2f014104743d0448e934dd7492cb138513b9ef7c722ea69cd5aaf220514ad2a08c623cf41108a57e7ad469328bc7addac4cc18066658f784e091cd2cef1a6851b6fd00dc", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 232000000, - "script": "76a914b9e48dc888dbf6a0a2f25ac9ba159b64e666e7d788ac" - }, - { - "value": 117491, - "script": "76a914a4a64a10bdbc43082fb42b370e98c39c3a53822188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4e1f0208ad9dc68ab3834bad92ee2f1d36599f5a9a3943006ed4e5c9df9515c7", - "witnessHash": "4e1f0208ad9dc68ab3834bad92ee2f1d36599f5a9a3943006ed4e5c9df9515c7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 44, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "187c16668eafa29375f8610ceafc20e12aa8880389fc7f243e6f56471df9c791", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 200000000, - "script": "76a914a64d6d84ce1bbf15b758bc0f109af6168eb004b388ac", - "coinbase": false, - "hash": "187c16668eafa29375f8610ceafc20e12aa8880389fc7f243e6f56471df9c791", - "index": 1 - }, - "script": "4830450221008041d5918ae87bde80fbfe12b968376f3360ed899a93efe01a7b8789e3ef08c502206bb6b73052f94f4572b5f121ac2b5089dee31ad6eae34bf0cabdc7a7db027378014104cb364378b66e304c552e84df57cf252dbf1ae6317aa10d913f4cdadb1f7615d479fb2b199558563383d1384ec90dd104d65ac11f10c816cff07767bc9c5eea30", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "93a6524730922e2f933fd3006b7da9197f9353c82315515184c2c99dd48ea770", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117491, - "script": "76a9143d1d1e26316d97dd0d4fbbbfaf5f1a4abf0800c688ac", - "coinbase": false, - "hash": "93a6524730922e2f933fd3006b7da9197f9353c82315515184c2c99dd48ea770", - "index": 1 - }, - "script": "483045022100a33afe7dfead40e50bccccd091550d969e9a963f2a9e44e4e5df63c6cefc95160220519ee35c32ad0549e133331d43c30bb743ee30165ccd7779c576dab9914b5cb10141046fd96ca7e4c27777deb10cd68d0a0c43fa7cb5c85c4cea2220c097ba3fe187a17da8d72e3d38487a30eac7740c726ce349498f2f0452d1871fbd24022c7386e4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 200000000, - "script": "76a91442f9ed007ebda079e44649ba85a337080343293388ac" - }, - { - "value": 97491, - "script": "76a914223e72ccf7fc911d94c0111f0ce5bdd601f8520888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "73984e5bf188c71f064d7a6c62ec11f27eadf1a24d41fbf4f3891a4d294a8a3f", - "witnessHash": "73984e5bf188c71f064d7a6c62ec11f27eadf1a24d41fbf4f3891a4d294a8a3f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 45, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 33726590, - "script": "76a9148ba464fc759f34d43457e193ff59a0f60990f64e88ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 13 - }, - "script": "49304602210087ae98cb373418fdef00e5b3212ba3dda9f14c8eb5f5696cf0f9f063d4745f4f0221008b584d311e1b5886ef40039f13c841e6c93a1ad061e6ec3da80df46ad513fd010141046bc5056486cbb5a051aefc45a05426d58e46768e0ca40e06b91ce6f6938e2a752c9a4131ea9bfc211b362b1bcd027d8358573553248b8ce4434e34c3807efc5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d7539b38047b1f3343977bf0ed1a1de1945c777ae5698559259f001023dccbc7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914714459dea170631a3d926f630141e4aeba131d3088ac", - "coinbase": false, - "hash": "d7539b38047b1f3343977bf0ed1a1de1945c777ae5698559259f001023dccbc7", - "index": 1 - }, - "script": "4730440220734233bfe2bb0362be8bfacdd57920c63e06e11d001284705afadf738feb180402204e0d2276196918f62f34c7f549078367af0c90afb6070faded4993c6bd8b55c201410489fb62544a7ad92ac293ea5d697c2412c77c3889d259c44da74090941457a89e217cb30c9145a2b1f588b51bf9f8fd6e8f1bb23a1daeb54bf4a1b9b303bab718", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 33726590, - "script": "76a914ec78abbe9f01be9e818c9274323f481ce285f78d88ac" - }, - { - "value": 117491, - "script": "76a9147b44655ed5be4e589cb21de517a2265e7133b0d888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f1e6575a154a2671cecf3f13d9adbd84407869848f7efc49a83ac4017db214c6", - "witnessHash": "f1e6575a154a2671cecf3f13d9adbd84407869848f7efc49a83ac4017db214c6", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 46, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 121 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 25118112, - "script": "76a914b78c41ac587ed520b3eb6c11a923cdd0e1e17d0988ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 121 - }, - "script": "4830450220602edcb21a9df0fc9b64d659fc5c764f94cbce8f678977f1edbe0738483d3ef2022100b3b0a39cdf050e6b44de949cdb21dfbd299ec57ddffdbf3a03225d6bb39318f3014104495c66ec300f9444740bb7f2fe785845a59bd535b0a21053b1c4e6f591a17d4a09a388f606f589bc41b35ca029e4a8a9a4e251c47a70b60b5332c9f5a6cc50d6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "404dc1a3add224a38afff092550d045a846d20d4c3bc7a89add799692e95db30", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77491, - "script": "76a91491d828b45ec0497ab900f30f42e3ddb88dcf73fb88ac", - "coinbase": false, - "hash": "404dc1a3add224a38afff092550d045a846d20d4c3bc7a89add799692e95db30", - "index": 2 - }, - "script": "483045022100ea2e30701e13a12c6ae359363980c21558796adc38d218c88d2ea6d00d7b547402201063813e74fe1873aab66d762f16143f77f2cf8da77e0c2ef4e753ebec200308014104e6ff57be8cdde73a09b607d8e97f47e1edb2ba4b93bc08e5d6072cca0884bd3860fa552d85d5130a432483a888abaf021d2638b64d1f73e67df6fe12e77a5e17", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 25118112, - "script": "76a914e3543f637a75de57cc02cbc382f9845065e65fc188ac" - }, - { - "value": 57491, - "script": "76a9147e58ba36e5ee9de935a44ca38cc1eac72780cbf788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3c63bf912d2ef5ff5135e4187dd6d4cb6d1dd372a87022165d28397c9b7e791d", - "witnessHash": "3c63bf912d2ef5ff5135e4187dd6d4cb6d1dd372a87022165d28397c9b7e791d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 47, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 112 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10146511, - "script": "76a9143a2b8d5a50a278ef1f43cc07f1885a9459d6c1d988ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 112 - }, - "script": "493046022100ebf303fa9fba915434688aae5e7614e4b644be47e8fa6e949d789c9d9ac49075022100a200a66545d9b5f3922bc896586d6a6dfb23a93b247f77b7b902939cecae9972014104abe2db9fe83b335d23b584eea097bf11577ec6b8f00cd7e3d4c33ed637d4b3a2ed00719bfb1f0e2c8cca394304fcbeab73b67cd3a38a7f41d32f2287526851f2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bca20a7412d448bf5f85acd88b270f87ff297d1cb3b0021be6d09cf3dfc19077", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 57479, - "script": "76a914e3f8e9786220015654edb1e8e7988c7f9600292188ac", - "coinbase": false, - "hash": "bca20a7412d448bf5f85acd88b270f87ff297d1cb3b0021be6d09cf3dfc19077", - "index": 1 - }, - "script": "473044022065ebb76922fb302b270493662f36054fc800ae0486da1e789809bb637103dd6802205f6061a8669a4b3bab7663f6274dd1d6e818d538545809e673f0798737d6c94d01410492d04d94877ef6ee6f7f9df3b75b16ad703a2f776bf1c90e1f293a4cdfd0cef1970a9a87e945eb6c74474dabad3906c999aa27e61c343bce0f3d9f8377f1a45d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10146511, - "script": "76a9142d62d086659652a9aefad3d0d986b27cd394813988ac" - }, - { - "value": 37479, - "script": "76a914d8d41b41c4ec763c773417bedc718613cb2667e788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "77593041faf065bdd974ced64ce6b435a488e58f2efa7d5dfcaf467ea6a4d041", - "witnessHash": "77593041faf065bdd974ced64ce6b435a488e58f2efa7d5dfcaf467ea6a4d041", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 48, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0fc3170c023676eeb77ef9ac453b26c5aee0a0fb249f2d6b247c7de439bf847e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 426300, - "script": "76a9147d13586d6f7aed481ea74774121dd1ab50535a9c88ac", - "coinbase": false, - "hash": "0fc3170c023676eeb77ef9ac453b26c5aee0a0fb249f2d6b247c7de439bf847e", - "index": 0 - }, - "script": "493046022100e816dbe71e4c397ea96c298471e62f16dff61f8ea973d0d81b47210ce96d0a91022100827d66f693791000c77c95b971f3700d6b9e4fb3294bbda8c06254cf58dc57e7014104f1ca2dd4375123b679f89deaddf740bc04ffd8a2dcacb5d6f3945f9bbb749d28545ae2506546bfeda3183b341383331f18b1bb02fc4b90a1783cc16a73c6bfd6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "aa67187e2e2037982281bdb24d3a3c566ce415ac8a343f1612db06521369f52c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137489, - "script": "76a91443e88e82000be8298bcb35a684e6ab8e38f4e32188ac", - "coinbase": false, - "hash": "aa67187e2e2037982281bdb24d3a3c566ce415ac8a343f1612db06521369f52c", - "index": 1 - }, - "script": "473044022003a5d1d74ea3448f8b42fd0d27c0e854b123c5fe275b84a9b328f92b63c2b914022079cbc8ed1a1c71c5fdb3a001a4801c5a085e006c0f8cab7235399c59669fc078014104442340725b2b462341f85e6c7c684007ec25d11894c7816328780a0b67974198d595b56d45e79d05be700e77d64383ab5d60cef277bb0c8a5e384b71ae602d95", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 426300, - "script": "76a914c8a1d35b64b6a3fa74b2ecaa1ff7f7f63c1fb48288ac" - }, - { - "value": 117489, - "script": "76a914a5dea3ce9f4421f5cd131080c3c6a4391cc9d79888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9b58787ddc94e5dbaafef3419e9ad1044b43d3ce52e26b8cb7229ce86c1d12ad", - "witnessHash": "9b58787ddc94e5dbaafef3419e9ad1044b43d3ce52e26b8cb7229ce86c1d12ad", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 49, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e3ec0f4a16866cf46c32e7d16a290d4aea76cf2498bdbec13eabaf672ce77b1a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297445, - "value": 10756, - "script": "76a9149f2ea73177c3abf5ff5e59405fddcb80cf9b6c5a88ac", - "coinbase": false, - "hash": "e3ec0f4a16866cf46c32e7d16a290d4aea76cf2498bdbec13eabaf672ce77b1a", - "index": 1 - }, - "script": "493046022100fe922b4649c4a144483c00ae0bf6d672d73dff793dd204abdc41ab1013b3b62a022100b32e997b943201821780ca4cebc0e8311f62526d990690827f87ac97b5f7de6f014104dfc9eee39815c8cdab77bb11a648eab14586b6a94218edf1cf4ee3d00d4c745e7588639bec0a2a63f8d3cbae0e18b3e8fdb866eef49179397e29d6aa71674e3e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fa43a736b4f4dc53588d47c62e2321f87e81d4c82daa02c30d49e77fe32db7b2", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77491, - "script": "76a914e4ad7c9ebffe25acc7b475953d8d7fe03b5d99f188ac", - "coinbase": false, - "hash": "fa43a736b4f4dc53588d47c62e2321f87e81d4c82daa02c30d49e77fe32db7b2", - "index": 2 - }, - "script": "4830450220040d6f7b421ebc66e12c6ed6c7f75ed61916992b1777f57274cdd180da9fe382022100a923b105ed9cf9dc4b05f5ceebd3c5c0c96f786d56ee979235784830af6e611f014104d2ba5dbc7fe2dac20104f5d7dfedaf32acfd4ee983e80f16b41ae17a5439338d8c0341343b96fa8a135b5304817e527a41fade4913f79db3663ccd47f406d1da", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10755, - "script": "76a91413a9638b2bc3da07180bb8be7a14567d46fc2f5b88ac" - }, - { - "value": 57491, - "script": "76a914dfc56300f409f74d12330a9d927728a8218793c588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2addec28dc17625879eaeb997b6b3ed9326b62a5a1e0d7c759ff35093f0f0e94", - "witnessHash": "2addec28dc17625879eaeb997b6b3ed9326b62a5a1e0d7c759ff35093f0f0e94", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 50, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6c9992b6640cb8124984d8d7f05deb389ad1a642c1ae9f73e7a6546f371f12a8", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 70124127, - "script": "76a9148a63b89a1e98d70163dd7bfeddfc7ddd922b1b8088ac", - "coinbase": false, - "hash": "6c9992b6640cb8124984d8d7f05deb389ad1a642c1ae9f73e7a6546f371f12a8", - "index": 1 - }, - "script": "493046022100ec2a4c3ed1ba43473b001b4abc3026a91ae11a0d617f1a59b7e0dc9a9771c0aa022100c002c0c1e0a3d42e646e26b6b76980a04215cd12d9f680b45f400462cb429705014104f6a4ea936fc3650f801fa38038b2accdbfe7f0dddeb094cc3e16f291b324d7a94213f395f1e919e7012b8cb1ca11a9deb2eac70d3748088d158b9387074dc91c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "be6749a1573a70313ea6649dd524757e97e1e6de7eee102411e5e2f2e2634bb6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117489, - "script": "76a914c5eadb044b8c02ed9fdacd012b38b440fc40268388ac", - "coinbase": false, - "hash": "be6749a1573a70313ea6649dd524757e97e1e6de7eee102411e5e2f2e2634bb6", - "index": 1 - }, - "script": "4830450220268ae9f2013c705bd330421270fe5429c36092d078d822926661d11ad1e2f7bc0221009778d811ebeb15cb59f9e037f59688e2e57515843f12d8afec15ca604f27990d0141049bc6289cc43ff94b965ab159adc7555a145127fcd7069773e6dc1bb7a4e027126cb9f6e2a3a4bb7086bfd46f9a7fae9af46f59853ef1078f1b2f83d4065268c2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 70124127, - "script": "76a91431d9533e6e8f5f325bf07f5fabab09bae90c535088ac" - }, - { - "value": 97489, - "script": "76a91433279f15dbb3270cc5034c3b323fccf0d7f5ab3688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c55a8e969adf6a2ac79b8454720be29cd3ee417a1da8038ec951da8cfcb8efaa", - "witnessHash": "c55a8e969adf6a2ac79b8454720be29cd3ee417a1da8038ec951da8cfcb8efaa", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 51, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e9967f13b1cff431d16c079f8199571fd5d13addf196c2e98b003e38928042f9", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 346185, - "script": "76a9141d04fb571ea5f1d612eecd776bb3cc76aa9d06bf88ac", - "coinbase": false, - "hash": "e9967f13b1cff431d16c079f8199571fd5d13addf196c2e98b003e38928042f9", - "index": 0 - }, - "script": "483045022100cd8e8aff6b8e349302292be7ca845434961bf3ade81ee0fd6f53d9ae3700f4f002200d4836bb32266aa5a0ef45c71fc5415f0eb77a3b37cedb71770927c38599553f014104c42dbc1053e96a4f9cf202fdeaf7319715391989042f6e41352b5707f880ad9fb9ca64f965148a871c8d87feddf85a370bcf0e6eff36dffc6d50cc0b001bf0fa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6d5c6df7481906b61bc0528c473510374b1fad4cec3c03486a8f8a257e7b037b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914b0193895baeedefac49a277781e12e3f5887e11b88ac", - "coinbase": false, - "hash": "6d5c6df7481906b61bc0528c473510374b1fad4cec3c03486a8f8a257e7b037b", - "index": 1 - }, - "script": "493046022100c0efa33e53908bc166a16e3abe8f0d9bec2ef84632985bb33ddb8396257c03840221009755ac747cca0ad45785a38d3a767bd619876b70dd44de1f00be7a2c4b9e43b201410440cfde1d8e0c3a9fedc5272dd9f2951cba221a6d66ded38f5b87fc75a61a0fcb6d8367f1c1a17ba66e41d2d2032d2d7794b1671040fb932c96e57811f84062c9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 346185, - "script": "76a91435b81e880d3a016d5404edd5ba2dcf1e735934d288ac" - }, - { - "value": 117491, - "script": "76a9149f5ffb47c69466009172d952e15213cd6ffe09ee88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5d15cd4ba37ec7fd3b55d622343bb889bbeea9601931b8025483c4daef6743df", - "witnessHash": "5d15cd4ba37ec7fd3b55d622343bb889bbeea9601931b8025483c4daef6743df", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 52, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "aebf5e0bdc9b36469539b9586f802310fba8c621cd4e0c066f5792701253b976", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299650, - "value": 20000000, - "script": "76a91443ca2c1fce5f0874208642632e7e6c015053cfda88ac", - "coinbase": false, - "hash": "aebf5e0bdc9b36469539b9586f802310fba8c621cd4e0c066f5792701253b976", - "index": 1 - }, - "script": "483045022100965e623cdb176fd3c9821fd6a5fccab825165f3fe8da86ba1fdc8dc6d6a96eb302205f0bb30ee1a85a56f911cec1fef4944cb25d88b2113931ffc40dd64387bd907a014104962a5af289a5b70e7bf9e01c843702a26fe36d9a82b7f4bb07107e49c51803448488f6204f116a178303eb7f5233eae9621345259cc79bc99ee023619bc97720", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 19990000, - "script": "76a914b1c7f94615b1a972325d3e0fe0fbf3b62b997f2e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "614e9b36b639d1d4471eb041b835b42cc20b549880e4e302176b7e13bbd5899f", - "witnessHash": "614e9b36b639d1d4471eb041b835b42cc20b549880e4e302176b7e13bbd5899f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 53, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e24f431af8c053e9212bf98b7d22b100273cd0ca7e4f915d91820d862e07ce2c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299881, - "value": 5990000, - "script": "76a9145d1cfff68ca3ab21b56d13bba9aacb293baf94a188ac", - "coinbase": false, - "hash": "e24f431af8c053e9212bf98b7d22b100273cd0ca7e4f915d91820d862e07ce2c", - "index": 1 - }, - "script": "48304502210088b5cfc9e9e7a4dc2384801d4efbe1449f63e4ec81947f1c5efbcf3cc382be9402206165c2ef4416efd3f6e372c1d12923e02c38f724955dcd284573da020887707801410434497a8c7168b3c6fe62134a5f45f19c80f827558ae0746fd16b1f63071be724a26bb13146adadbe264be512a93e0ce3512021477f7cb99dc38b1c72d42ad7e4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5980000, - "script": "76a914b23da4f639bdd84ffe35ab9adb6af0d13355125a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "078e56ffe6ba3d15725f097dc25af8104e455ce161e91dfe1e6cfd57b901a17e", - "witnessHash": "078e56ffe6ba3d15725f097dc25af8104e455ce161e91dfe1e6cfd57b901a17e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 54, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "eb154bd5cd546954605bc468250d34b81d70efc1c228656a59826aecee0fe3f2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 489990000, - "script": "76a9149625cabe99bd6429620a04c0be55e8786fc8207988ac", - "coinbase": false, - "hash": "eb154bd5cd546954605bc468250d34b81d70efc1c228656a59826aecee0fe3f2", - "index": 0 - }, - "script": "483045022100b041775df0f46b7ed12742020b82347fce3fc428d9a6ebeb5c676b6efc6aa0c0022025edf1ebc6813884d497120d87bb01434e66b9902e529bc94e716a7e38909be201410427b89be01f4364405a43cc161e72decf8e0cc8138f5cda8fc47e3237841777f2f5620757071b81667514169f9e4965d9fc51cb68ad68343d1505596ae45db4e5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 489980000, - "script": "76a9146fe0399227a04acc813420e65b94d602bf8772da88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8d971b147f3c7bbd4d4fdd1b9f8f7fe8ab23925f09bef14d038f2100420f2d89", - "witnessHash": "8d971b147f3c7bbd4d4fdd1b9f8f7fe8ab23925f09bef14d038f2100420f2d89", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 55, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d1a156c5d8cadabf2d0fac9fff12c7d919a401ae54477ee8346694c1bec806b2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 34990000, - "script": "76a914a0ce926e819ddd3e64ddf1629f0ec6dc88a724d088ac", - "coinbase": false, - "hash": "d1a156c5d8cadabf2d0fac9fff12c7d919a401ae54477ee8346694c1bec806b2", - "index": 0 - }, - "script": "4830450220227727f5b7fcf73607a5fbccb4d25f5a64a6813f64493fb10920810da7b18ade022100d6f2229552f233266f9514c64ea8371d3fa3a446105f132616ec10d2c7b024ec0141040e2391382f9654cedd09a7f18db270729b3fe692b8ceea6fe69673d4706ae413ce4365a9aba23cfb9910d937de9101bbe41d441f594877680b3037d6db07c013", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 34980000, - "script": "76a914519e84489eb8bf6df05b669f0fb13526877682f488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8e037f68e3d915a3f7ad05359f4f9a03e6c069eac875414a6c9a7eec0a1cd383", - "witnessHash": "8e037f68e3d915a3f7ad05359f4f9a03e6c069eac875414a6c9a7eec0a1cd383", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 56, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c3745da12cb1735fb6eb67646011de07b9400d034b4dc8dd09bf2cb01ba7b77f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 11434147, - "script": "76a914b57b535acba60c09ab04b1efd0033f375da1eaa988ac", - "coinbase": false, - "hash": "c3745da12cb1735fb6eb67646011de07b9400d034b4dc8dd09bf2cb01ba7b77f", - "index": 0 - }, - "script": "483045022100af0539963f6ce43ccadd56ad304449001a944e5cf3690ef8a041d72fad8a1522022056b5d09e98ec744a9edef3ea5d54de9c2edec830ff72a0a61b411ebe0b2f9ea6014104eecd80b02bba2976262e84fc6f012d26437b3f89b9bd4b6561007f66ea1ea4d56e8af59f6f5e1d7ef9a620bfdfa1e2cdc83c76085a42a121da344c22fbdd0fe0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11424147, - "script": "76a914f660a280888d2738db5ddc0318494ff9d430b88188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6170432711a9324551f57fc837f13fb30556bf32e2c757124f0fabf38c6012f5", - "witnessHash": "6170432711a9324551f57fc837f13fb30556bf32e2c757124f0fabf38c6012f5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 57, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "132b274f2f68848bf437acf95a0d64a6324f191f2c4939907cc93c94d33268e6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 6465208, - "script": "76a914335b44ad357ca91ee55fa236897f1c9e7ca79c0c88ac", - "coinbase": false, - "hash": "132b274f2f68848bf437acf95a0d64a6324f191f2c4939907cc93c94d33268e6", - "index": 1 - }, - "script": "48304502203e82bfa3bb8301726d18c8f8c99514b4043bd2951b4817445b5dc9771f724b1d022100ea69217b0350d97c148e17344d7778e221e1a44bef832633d76f36fc10b501c5014104b687f4ea628fc933139b8f4ea77fb6ddabbef6d6aa0c42475565101803629e897b5c5a016a80054909a9701a55b75156e4d64b78e58eeb21d24ba6445856ad7b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6455208, - "script": "76a9144759eae25ff79a1697fd0d87938a286261ff980a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "edafcf87716fe81a4399fb5e2be90f14b954c40cfc4392721ebc3fcea7c9c913", - "witnessHash": "edafcf87716fe81a4399fb5e2be90f14b954c40cfc4392721ebc3fcea7c9c913", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 58, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b43774d68b1143f0268759257960aae4e6c1ca9690884747de7808851252d493", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 500000, - "script": "76a9140946ba52b1e7a3b2e8e8baf0260b411e4377606788ac", - "coinbase": false, - "hash": "b43774d68b1143f0268759257960aae4e6c1ca9690884747de7808851252d493", - "index": 0 - }, - "script": "483045022042f7b8e620bf676e63ad56cd2c6eb3391c9d16ba823fe328305f0e0a08ad368d022100c91779661ea3af2567f2940bd370c62bfca0229d1ba8692f280d2210c37e69770141042a00a0aea192dba8a936534cff8d147f58e0e22f11ac8b8c6f95e0726b7464e1c2a6b63a884dbfd929b286dd3ad1fd4098be80e2ef69030519f3c57cc1e95e03", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 490000, - "script": "76a914d4c31a83d5841bac7c87e05a2c62b419529c984088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a662d5d92a5d127efc5c72866ce3a1064f6462837c4c1aa9c1c84c2c80d0dd1b", - "witnessHash": "a662d5d92a5d127efc5c72866ce3a1064f6462837c4c1aa9c1c84c2c80d0dd1b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 59, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "04c3e2a0d117e3680874119c4275fd1cb6916307172f632def667a1232df2b56", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299043, - "value": 410655000, - "script": "76a91438fc5a9ac96d66706f0da3e3827a140e59e170f388ac", - "coinbase": false, - "hash": "04c3e2a0d117e3680874119c4275fd1cb6916307172f632def667a1232df2b56", - "index": 0 - }, - "script": "47304402205629b05041777d2d80b0650da1b4cfe9a28052cf187ea98f11ec76c0fb5901f302204e5cac33fcbf3f410a830085d2a3cdb4c5a902506fee61010c3dcc6573ef476c012103e4e15e76dae6c5f5c99857d9a0020a6986c352ba219531ec9ff0d3ae5eeebd33", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 149000000, - "script": "76a914c4b65b5ae5492fb89cf2ef0af8272fc857ec255388ac" - }, - { - "value": 261645000, - "script": "76a9147fcb5b04101f759b1eedcd61a8f77df680c3515588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "609cf357a3b1f9a145ae443293deb29b40cb5e32fa4dc504d2922e96ffbca7a2", - "witnessHash": "609cf357a3b1f9a145ae443293deb29b40cb5e32fa4dc504d2922e96ffbca7a2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 60, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7b448ad5ff1b49728e1be18e0bf8386b37bcd8f9e2c188592c4f2ba639733d48", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299867, - "value": 2213971009, - "script": "76a914c8110dd797f6c7bf73f6b1f04ae845448ea99aec88ac", - "coinbase": false, - "hash": "7b448ad5ff1b49728e1be18e0bf8386b37bcd8f9e2c188592c4f2ba639733d48", - "index": 0 - }, - "script": "473044022001c10474a4bf3aaceee0639240b26c1f58eb714929cecffceae0e8421945ac4502202ed5d56518dc0a05a4221c607f03beaf3df465bd76dd57faf80ea796d360970c0121033d159d3e8999b9e9d21ba0a73a606c0075db4c04e6a3e9112aab0ee9fba03b3c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2200000000, - "script": "76a9145b585bda447f9729ab2669f7808ad30d9d70aef588ac" - }, - { - "value": 13961009, - "script": "76a914ec55801d75b67041df7f595be08442224b62546a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cbbdfd11a852f3d012e222cb970fa8b8171722610f276607936f60e922b5abcd", - "witnessHash": "cbbdfd11a852f3d012e222cb970fa8b8171722610f276607936f60e922b5abcd", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 61, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d6194a3a1a136ab791d584580c55368f92a7b1fdfbfa422e997c17c38d1e4766", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299855, - "value": 1818929063, - "script": "76a91489f26f4b7fde36104a4d9522d94defd5c1eb402f88ac", - "coinbase": false, - "hash": "d6194a3a1a136ab791d584580c55368f92a7b1fdfbfa422e997c17c38d1e4766", - "index": 1 - }, - "script": "473044022003235fe88d4cad873513c3a3cafe938ca5ffbb6baeb38c820878f54ea672bca60220525bad062c296cd2132c4dd8f18299a9666c594c49e72849bca22fc1b25e5f49012103aceef40403f3f80c9bedf7848ecbd3dcb47d2e9682f61a44f879a5a9c99d5f49", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1668919063, - "script": "76a9140a175753d29bb03a85e14d1b99806d3bffe1034a88ac" - }, - { - "value": 150000000, - "script": "76a914f1e06c765628b6ab850682adf4d15908a54bae3488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8f91fc29f5bfa3e931cc5725420fb69460a804666ddb880be1d67d0ad6c9f6c7", - "witnessHash": "8f91fc29f5bfa3e931cc5725420fb69460a804666ddb880be1d67d0ad6c9f6c7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 62, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e5a4ef6f62115597b4249223dd13a18e10ef2024fa2cc08aed9c6c349a8456d1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298458, - "value": 170555000, - "script": "76a91438fc5a9ac96d66706f0da3e3827a140e59e170f388ac", - "coinbase": false, - "hash": "e5a4ef6f62115597b4249223dd13a18e10ef2024fa2cc08aed9c6c349a8456d1", - "index": 1 - }, - "script": "473044022073e2efd6cbb450a8a8ac8acba9c5a49c1c31cb8c5cbb4cdbf9ad96fbacc3a5b302202c3334f1fb329a5f23ad60327204309d4b14ef7a9118e484653823eb1e7bbd95012103e4e15e76dae6c5f5c99857d9a0020a6986c352ba219531ec9ff0d3ae5eeebd33", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 154000000, - "script": "76a914c4b65b5ae5492fb89cf2ef0af8272fc857ec255388ac" - }, - { - "value": 16545000, - "script": "76a914e2eef2c68092878f6523bb22f06c46e932dcdd1388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "22bf81c758e476271e6400d8b8e4de5874ffb156c1a62655c19ac67c78bdcb95", - "witnessHash": "22bf81c758e476271e6400d8b8e4de5874ffb156c1a62655c19ac67c78bdcb95", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 63, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a37e0c28faf8b2988caa60d5447230d1cb6dad0ab395dddc77973c00b0d62cac", - "index": 0 - }, - "coin": { - "version": 1, - "height": 294115, - "value": 19890000, - "script": "76a914b8b6a98262d07132736d57dee38831c1459f318b88ac", - "coinbase": false, - "hash": "a37e0c28faf8b2988caa60d5447230d1cb6dad0ab395dddc77973c00b0d62cac", - "index": 0 - }, - "script": "47304402204e830d6a7f1d3c260f114565e02c16a5608462217a10346068ed0225c7c61c1f022000e11e3a1f0b61b94260f45723f5ea90cdb2dec5fe5266498dfeedc367825a850121038b0d1627927067ecf182134406aeeea40816e008bf2aef87ac0ae9b3818a3dfc", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4403278, - "script": "76a914cf0d997c04f8ffb3f4864849bcdf32eabb97715a88ac" - }, - { - "value": 15476722, - "script": "76a91472b41913fd448d68d9533e5faa8944418157dd6b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0767b259263fb62ff2361a56d08b07c7a62c4cb16db4682b51fb1e7194af24a6", - "witnessHash": "0767b259263fb62ff2361a56d08b07c7a62c4cb16db4682b51fb1e7194af24a6", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 64, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1a613140a44f0a6c6e9c8594e5b0979fae9615ae78f25531668a5734cd547e84", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299394, - "value": 13982800, - "script": "76a914a944b6c77ceddb636a8305c90d4f53c5423e217488ac", - "coinbase": false, - "hash": "1a613140a44f0a6c6e9c8594e5b0979fae9615ae78f25531668a5734cd547e84", - "index": 0 - }, - "script": "47304402202a68c26d67ecc8a1b81c3d285271c9a92be2d4d3d5d282a98f675be9d2ef351e0220742a66b083ccbe5af7a12cd0bba628514c2f4a1ea097aeb24e17244891a9a2a9012103d1ed92ff3929322c620beb1db0dc5b596028a583b5397202098587b9f8223bd8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1450000, - "script": "76a9141b98cfbdbb22a17e48f8a873396804b56c1bfdb188ac" - }, - { - "value": 12522800, - "script": "76a914a944b6c77ceddb636a8305c90d4f53c5423e217488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f700c4eff50b50731c0613989f70cff32b59e92df2c560fbb1f58bef83061b7e", - "witnessHash": "f700c4eff50b50731c0613989f70cff32b59e92df2c560fbb1f58bef83061b7e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 65, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "dd38c33e990908f7fe4d1ea3b08a0750b1cd6becaa4fb367a4932f2a3f1e4e55", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299879, - "value": 52921295, - "script": "76a91444d927a021bc0ceff901bc70f5bb3e2ecfea468c88ac", - "coinbase": false, - "hash": "dd38c33e990908f7fe4d1ea3b08a0750b1cd6becaa4fb367a4932f2a3f1e4e55", - "index": 0 - }, - "script": "47304402206777497c64db4f4e5e205b8b234b750c2a7572d8b127f7d9bc99c8a0b178e43f02207e35b5388d2a58dfbdb9a7dbff74624757b94b75c830ee31fc7cf636064d85e201210283049b46570f7b1acced2a4025aa76c2625a8ae4e5b6f4d038eee6b98c8b174c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 29559056, - "script": "76a91462e70e18b5d700ad4e8ce59410a43f2f747a5d4288ac" - }, - { - "value": 23352239, - "script": "76a9145988e80fd7ac0be47a70dc34d33f9a6a761ffaed88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "629c67898e6cda2c32d3126389398adc030cedbab09b3f60a8611fea925e88c7", - "witnessHash": "629c67898e6cda2c32d3126389398adc030cedbab09b3f60a8611fea925e88c7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 66, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6f973c550cc7bc41e263aa196bb0c8e77838dd342944b37d1b26c5d0fc8b5a9e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 961716265, - "script": "76a914feb3fdd8671444e17f3207d90c54cad86be245d788ac", - "coinbase": false, - "hash": "6f973c550cc7bc41e263aa196bb0c8e77838dd342944b37d1b26c5d0fc8b5a9e", - "index": 1 - }, - "script": "473044022075c2f26b1e3e058333576324e6d1f83f5e7c1f97986a3f8326fe64350c5611c502203035dc36d278bf41f6481bb1727e183df05939d52148846a80cb83d778b0fab0012102c782d28542991f48f2178390445c5a684f84704b66cfd78855db9b1d3c28d58d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 26715000, - "script": "76a914bcdbeb79a75d6fce16fd828bc4dac8c36516143e88ac" - }, - { - "value": 934991265, - "script": "76a91414b2a59703e261eeaf68ad9c2bec8cd1486704cb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ce26a3427345db1d8655009a543a56ec7e28fa2ed363d73d626144918d671391", - "witnessHash": "ce26a3427345db1d8655009a543a56ec7e28fa2ed363d73d626144918d671391", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 67, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c2ef373a0c5fed784a7f48a4d70e8c85a2206737dea33c8a5e610094b20b867e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299882, - "value": 13158100, - "script": "76a914c940598b7b3a71a570a5bebeaf6a8be134476d2a88ac", - "coinbase": false, - "hash": "c2ef373a0c5fed784a7f48a4d70e8c85a2206737dea33c8a5e610094b20b867e", - "index": 1 - }, - "script": "47304402202ffefd08e8156ede0d359e987017e25061f77f0a8755fef70fbb7a776bf9bb0c02204c11992d48542a95c0dcb8351493c7af9b35e49496969260a0a1c96eaa8885bb01210381a088d3136dafb3eccf409f87141a33216628509a782fd1e0b82a9717d79127", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4576700, - "script": "76a91497521a236277cd19ac3d121452758cf5a7036bd488ac" - }, - { - "value": 8571400, - "script": "76a914c940598b7b3a71a570a5bebeaf6a8be134476d2a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cf5a5bfc6aac203f881918eca090e82ab1a6149660831f05a05d3c9f9ef2d386", - "witnessHash": "cf5a5bfc6aac203f881918eca090e82ab1a6149660831f05a05d3c9f9ef2d386", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 68, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d92537e171ca0d128554ba64d07fd2f7d48a5936e3d0939597d17f25664d2e72", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300001, - "value": 56333994, - "script": "76a914a92e419d402f3152cff2a9a356048810e806b24988ac", - "coinbase": false, - "hash": "d92537e171ca0d128554ba64d07fd2f7d48a5936e3d0939597d17f25664d2e72", - "index": 0 - }, - "script": "473044022073624d9fe4934a3acd4a0bcf1db398b54efc661623847ff7bf4e645726a69280022021aad2854b2535ec270fdbf1e133506a531b6b2d2ef8de8026a86fccf52eb6420121027978ac01db2fbfe81fea0e627e7ed4d20d3e95f61e62dfc8047ba1eb4bd2e9bb", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 15003469, - "script": "76a914dd89c81e176a861ddbc456f36d53d9951c946bc488ac" - }, - { - "value": 41320525, - "script": "76a9146a03478c20390959f513be39dad893a1926d28e188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "205751ff10c189df5821aea53a1957a11d88a205ad3a6970fdfdde7289d49505", - "witnessHash": "205751ff10c189df5821aea53a1957a11d88a205ad3a6970fdfdde7289d49505", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 69, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "928869ae89572a3dc00a19f74f67c10762f8cfc0b06aa0e634ebd1784c4e35c4", - "index": 16 - }, - "coin": { - "version": 1, - "height": 299856, - "value": 5000000, - "script": "76a914dfba28dc856c9a949fb67a55b234adb957416dfe88ac", - "coinbase": false, - "hash": "928869ae89572a3dc00a19f74f67c10762f8cfc0b06aa0e634ebd1784c4e35c4", - "index": 16 - }, - "script": "47304402203c3214fb4004c195eb6abdd53b47aafca79ab0df3817b1e92980796a6de4df7c022024695cbaf5528c24a23f6b61a21ef64aadba502019f31f29e1bde5592bcfe3bd0121020d2ff52a029a282a5e641c061588a1f1461a1d5403b6e6972f16b6a10fb6830d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 500141, - "script": "76a914ec6218d53a9b1e133c3da3765f3a24cc7ad0393188ac" - }, - { - "value": 4489859, - "script": "76a914dfba28dc856c9a949fb67a55b234adb957416dfe88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4b48bb45bce87a6bd989cf8f7e9a96ff41da755b4c618209a3a2ef8fd4fc23c5", - "witnessHash": "4b48bb45bce87a6bd989cf8f7e9a96ff41da755b4c618209a3a2ef8fd4fc23c5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 70, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "86b68604a2067c749dfbdd8e9ec2da0edc8c606e700b6949b3d1abe783b168a1", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 342903700, - "script": "76a914f33a8b320d03431748e5bc1f9433e5efbb1b0cec88ac", - "coinbase": false, - "hash": "86b68604a2067c749dfbdd8e9ec2da0edc8c606e700b6949b3d1abe783b168a1", - "index": 0 - }, - "script": "473044022054fdbfaeef2cafdf405cb26e3f178e979637304285c9c4980b25d6affd6229ec022019d9e62a074f1dfc577667ebe4121aa3f3969127e693bd01b671ed7f7a944dc00121023830cb5eea0581d1a2ea7dd5f37ed7a437d843b86bc533c2c15dda5274440fd3", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 980000, - "script": "76a91479b35f1da74c1b9b4736dc6fd45cc2808bdc952388ac" - }, - { - "value": 341913700, - "script": "76a9149d09cdcf5fe32918959617d7a8b521f1986bf35f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e129bc5e48001deb054a16f633ded73ed0053df932215ffa40b1aa97ff1e477a", - "witnessHash": "e129bc5e48001deb054a16f633ded73ed0053df932215ffa40b1aa97ff1e477a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 71, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2a34587944e2adc6ae2ee45a6f8dd7ddbe90836436988d8fd973a39e614b9748", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300008, - "value": 38000000, - "script": "76a914425caa88f502d34d1afc93508713a5d4d9d793aa88ac", - "coinbase": false, - "hash": "2a34587944e2adc6ae2ee45a6f8dd7ddbe90836436988d8fd973a39e614b9748", - "index": 1 - }, - "script": "47304402201e79e1299ab89a7718d2446e859b861d13769404254b58eabfab579cdf49d7fe022022b5e719f9548c6a0a92a45059da254ccd156bb75c5d3aa68e34ecacdcb6acea0121036bf18252cefb261bcf59b363697cd90c46dd69e9d5d7522a1c58b760cd4e4cac", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 19000000, - "script": "76a91493e7401ccedccda6b06c4b51eafa4ee600d63da688ac" - }, - { - "value": 18990000, - "script": "76a914425caa88f502d34d1afc93508713a5d4d9d793aa88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1024430301c78c3b844b80c6b44e24b8b6efa41d4a4b1d203aa889ad5c1489fb", - "witnessHash": "1024430301c78c3b844b80c6b44e24b8b6efa41d4a4b1d203aa889ad5c1489fb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 72, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "92f115064be912be1e89d0bcda6d8d0320710fd696b92281a268763a2c63a9ec", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300003, - "value": 28677000, - "script": "76a9146e53bf9b4ce2da2a825ec35b733344f8a84bd53588ac", - "coinbase": false, - "hash": "92f115064be912be1e89d0bcda6d8d0320710fd696b92281a268763a2c63a9ec", - "index": 0 - }, - "script": "473044022057b183511122e564d6ce5814c2de819603deb53f64e7200c7a4e9bae9b7eff17022026f9e9d93b3c620cca5a1fd0f94df631d14e5a5910424e802e051e08b7cce8ae012103d6a329d6f4b17d575c7c1877537aefd3e2101ad16494042fdc5d5c6fc6e0a9b1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7977000, - "script": "76a91435ea01906975d6490ffd15f7abf19ccef86a421c88ac" - }, - { - "value": 20690000, - "script": "76a914087a1e8e97612bbe660ab6abbb5cd533c77e40df88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5f6ee4bb9613ed091f5af458291d5776106d314a48c1ac45fc9a6fbb31dc7b5d", - "witnessHash": "5f6ee4bb9613ed091f5af458291d5776106d314a48c1ac45fc9a6fbb31dc7b5d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 73, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8401f78c4a02bd65a8a83efac15fa07c1b68e3560700c7be0310b330c5b0135a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299901, - "value": 5054175, - "script": "76a91440eea1ecacfb2598aa089e1cfe738ae4502f5bb688ac", - "coinbase": false, - "hash": "8401f78c4a02bd65a8a83efac15fa07c1b68e3560700c7be0310b330c5b0135a", - "index": 1 - }, - "script": "47304402207574f6a292f72a3b7d102e49e71830218edb764293fd7d82a4c771abad9f735c02207f7f351e763fc3511a17f70adb96a2bcfbceb3d576d69018d7db09a36da33505012103c9991c62e6c3f383efdbf6b240c0906d2a4d0e7b5e38166bfd27344ab13b4558", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 225000, - "script": "76a91411c2fbf79e10e5d643e52647a763090ed5e7fc9688ac" - }, - { - "value": 4819175, - "script": "76a9144ea7f3876b0a8bc66001f32e3e3df3bc5dab6b9d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b8fd984ec0297fa2a90228056c52dd8a214e81ee839c50e0fe41e82cdf26c685", - "witnessHash": "b8fd984ec0297fa2a90228056c52dd8a214e81ee839c50e0fe41e82cdf26c685", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 74, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "90bcb36eb03399850a1c8002b28c0d3c101267b918d5b7da2aa7aa6336c9057a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 608165104, - "script": "76a914153b8bfd098edd5ca4e7150b78eb6444de0f270d88ac", - "coinbase": false, - "hash": "90bcb36eb03399850a1c8002b28c0d3c101267b918d5b7da2aa7aa6336c9057a", - "index": 1 - }, - "script": "473044022047d3ae3483c8c9377378b25c0a9b35b1877284263d3e58f70677a01c37922ffd0220570e443a74d703b49bed7928638116209c1d0c4bdc19a3df5fa5bc1926d1665a0121038115524ba52d3044ff4b6c188033ffff069a2ad75608d78f7e5fe3691bb15b3c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 152730000, - "script": "76a914c6615ebc7cf067d14581b70a4c3449e9d424c2c488ac" - }, - { - "value": 455425104, - "script": "76a91433fc482aad43bf51f13c10ad82507908ebb0466f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "376a743d26ab09424021c56228b8c7a5d7948dd8a2dcece68f4657bd59aed960", - "witnessHash": "376a743d26ab09424021c56228b8c7a5d7948dd8a2dcece68f4657bd59aed960", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 75, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9f449c52d16bb422defa06c7b4ce3130a7ef79571c8a18077e22439c4b788efd", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300022, - "value": 199920000, - "script": "76a91416c9ac3637fa00f7b4e274e815a15b545b54f6d188ac", - "coinbase": false, - "hash": "9f449c52d16bb422defa06c7b4ce3130a7ef79571c8a18077e22439c4b788efd", - "index": 1 - }, - "script": "473044022034ec4a12c68b0eb967816a7f1d74dabb96281137ae81eb2cec38acdc99f03a48022055b12a8605b31b248b9308d80dbce0caeee4189da71a341ac9d2c0179483cc0d0121031294e51751731a5e92bcf325f805d25e0fef449b162f5af8078b9f00fe641cc6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 35360000, - "script": "76a914b2ff6025145c0ae90ce0c4c94c790312608fbaee88ac" - }, - { - "value": 164550000, - "script": "76a914107d0497c6ef84e169a2eaad2814230ccdfaf00188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "30c7f611e932e4cbc6fb0f6049ace1a287a945c0c2372795372c4dfb19e5adfa", - "witnessHash": "30c7f611e932e4cbc6fb0f6049ace1a287a945c0c2372795372c4dfb19e5adfa", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 76, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4503ab957600a6219f8ae8559588ca3907af6aac984313b80763efb48b5f2343", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 597424000, - "script": "76a91406ab9c45f8f067e93a2c73a1438f2e4c8f0575a588ac", - "coinbase": false, - "hash": "4503ab957600a6219f8ae8559588ca3907af6aac984313b80763efb48b5f2343", - "index": 0 - }, - "script": "473044022079d91c7f4ba556879ebc7e219402bd2ec5c7345c94e7a5fddb6f706a03c0504f0220014add8af2bcd1cca850278a0001abdf3006c22344cf3b690c3571a13435a96301210361c7855ddb770d368db5939724846616b4ea4a8ee51d5f1847a5ffa63c023e1f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 591569000, - "script": "76a91407ca4d940458922b49d5009aa1fb978a5b88682288ac" - }, - { - "value": 5845000, - "script": "76a9146a4e76dc2775d85971665a573c1e6371c238684a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7a97e28deddec43c665033b70bb50541667a588677200f43266fa53257a34956", - "witnessHash": "7a97e28deddec43c665033b70bb50541667a588677200f43266fa53257a34956", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 77, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0e7d6bc6a375e3586b84efcbaccb4b43d6c208561619b0ee0a328986f8669afa", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300022, - "value": 149830000, - "script": "76a91479e54b5acdbc31d49ab17a6812c73f1e5ee88b0b88ac", - "coinbase": false, - "hash": "0e7d6bc6a375e3586b84efcbaccb4b43d6c208561619b0ee0a328986f8669afa", - "index": 1 - }, - "script": "47304402202deb30d28555b9add60fe9958dc6fb2fb3717b66f9edc3d55ed82fb88e0d89fd022008f925bcab50da399a5926b12a76c6b11af751ce9e58791ceff3f1b99925763a012102b8961b996de6ca26ed07f3599f2bc5dd7cfd1516b2714dc46d55b68258f065bb", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 98700000, - "script": "76a9149485d636997ec22b79d4b53862a66bb713bdc9c388ac" - }, - { - "value": 51120000, - "script": "76a9147b7c800d94bda5d6f52b16277f394b3a44e9492988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2c1e4e9677c1f3cb9fadf67d4433a4745e63a19c0a1ed45288b390c400496fa9", - "witnessHash": "2c1e4e9677c1f3cb9fadf67d4433a4745e63a19c0a1ed45288b390c400496fa9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 78, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "44312822ffde37997cf6061394031439ec36397f58f665361b2573d3560e8ba2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 175010000, - "script": "76a914c645124a68c6cd7e3aacc00e42a7082a4e48b3b588ac", - "coinbase": false, - "hash": "44312822ffde37997cf6061394031439ec36397f58f665361b2573d3560e8ba2", - "index": 1 - }, - "script": "47304402207af5e1d18a6d201d9a0df89a181b629569b87c75dcf6bbcf1373bf14d1e0989802202fd73e1a66ef69e28fc38cd448d799666829849be4b2a653b3766b061c23768501210220ee63138138ee844f5b01036438276d0fb669ef73ede6ecc70a28264176c485", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 174970000, - "script": "76a914588d4ff71d79412a456e9bc7a3f8ab81af361b4188ac" - }, - { - "value": 30000, - "script": "76a914ad31cc8abedb4e2b7a67c17fe9f3bfb11d8a0ead88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d6200701dec406bd6be9436ff49ddb2c170e187b0cfebc0080c095127925356d", - "witnessHash": "d6200701dec406bd6be9436ff49ddb2c170e187b0cfebc0080c095127925356d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 79, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "05e06a8ddc27fc91bed57df6e607fb8c19cbae8ce8ac25c6bc73e5c6c5212c63", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300006, - "value": 14331996, - "script": "76a914cf9a58af9a735e49ba1b37ef08a7ffc131a128c888ac", - "coinbase": false, - "hash": "05e06a8ddc27fc91bed57df6e607fb8c19cbae8ce8ac25c6bc73e5c6c5212c63", - "index": 0 - }, - "script": "473044022065205dd5b9e52f2acf7d0e5c6ac4688436493604b79903737fb4a1f74403f8670220437658be3362f70823514e15d8c2cd86f3d821ab548960a4f2ca5bba682f921c0121029cae53000f967aa98ccc3c556f8dd894c2e1ec7400ac9a96bbb50f30f21ac56c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4321996, - "script": "76a9149c9474d73ca0979368cc482963f98ae93feb054788ac" - }, - { - "value": 10000000, - "script": "76a9143ce20975bc2cf605196c5e5959ddfa945abadd5088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f724074120a5527cbf4b063f0fd4437a2d11f2fc8a70e6041bd853f14d2a01b7", - "witnessHash": "f724074120a5527cbf4b063f0fd4437a2d11f2fc8a70e6041bd853f14d2a01b7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 80, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a38fdbffec144e5853103185dcc6bab69b05e2f7431ef62e6aeb0b14380b6b65", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 240029509, - "script": "76a9147a1b8da395daa85e92d225af39be2e96a46c645988ac", - "coinbase": false, - "hash": "a38fdbffec144e5853103185dcc6bab69b05e2f7431ef62e6aeb0b14380b6b65", - "index": 1 - }, - "script": "47304402207f7dd0768ba4ae5153efc7d92418f313846385b4c36e4983dfbf3ea27250145802203d9e8059737d3fc248410f0290a4a27272750643f2661fad0748adecd894de3b012103d249955fa9827fc4e4042841b28458c7dc2e73360cc32e15369798deb29c74df", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000000, - "script": "76a914d6b99d8113341d1adeda340660002392c1d4b3c588ac" - }, - { - "value": 230019509, - "script": "76a9147a1b8da395daa85e92d225af39be2e96a46c645988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7a331298363eed11e071ababda06efb0fcabcfbe21fe4b62c44920698305a8ca", - "witnessHash": "7a331298363eed11e071ababda06efb0fcabcfbe21fe4b62c44920698305a8ca", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 81, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5fb09b42604b9900a452322945fc910185869ff6cd7e6eef849b14b55588cce2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299998, - "value": 6900000, - "script": "76a9145fc5ec0a7e2143d4a5a6da29077d5242e28921a488ac", - "coinbase": false, - "hash": "5fb09b42604b9900a452322945fc910185869ff6cd7e6eef849b14b55588cce2", - "index": 0 - }, - "script": "473044022078f722ebb6c96b3fdd46d7b70af566b0d20a65fc9fe738d138367d61641f7a500220702a8b576d73b17581d2b7c1c56ec02e10ad922bd1bd19641e81baf768ceefe6012103c98f9cfd900c3d84935b4d4920ab1a8dbacc776b60b925218828840774e41c37", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2490000, - "script": "76a9147a1b8da395daa85e92d225af39be2e96a46c645988ac" - }, - { - "value": 4400000, - "script": "76a914c7c1800d0972a32d7c124b777196bdfad48dfd0588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ab9a5f1c1cc82eff1f64b8438bfe6b8921b40fad329a5949df6aea0ba3d21736", - "witnessHash": "ab9a5f1c1cc82eff1f64b8438bfe6b8921b40fad329a5949df6aea0ba3d21736", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 82, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4a977af175e6390e5a02fc49abb3aee67a529b18994ba09464b7c797fd0e5840", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 116560971, - "script": "76a914557f48eee8e96c7cd803a6bc2be5b9f8b8999a1d88ac", - "coinbase": false, - "hash": "4a977af175e6390e5a02fc49abb3aee67a529b18994ba09464b7c797fd0e5840", - "index": 1 - }, - "script": "473044022051c700056ba5ba0ebc75106a2fbe590561bffd9bd750900dc6994cd46ae8deef02204b55954ed352eb26cc39ae813dbe132a9896daf15c85e839cb72f4e8f8a5e474012102a26edebfb404cda01c8b39554028357ed08e5b9de9bd9bb3b57ef954e55cedee", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 34240000, - "script": "76a91416609637ae5d6166ba1b039c566da5dc2718d82688ac" - }, - { - "value": 82310971, - "script": "76a9149dc8be4535f4dab7bebfa0da12d0735de497ff8c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fbadb361a0d96738184659e802a9b2c64579bca34394d5fd9d5457822690980c", - "witnessHash": "fbadb361a0d96738184659e802a9b2c64579bca34394d5fd9d5457822690980c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 83, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "987e73683b1fa5a62b1e31e9b6ad5395ad4fea781f1e9acc960b7aabd7bad3a6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 390000, - "script": "76a9144f2d8082ca48ed2f8cb5e8417c1bd17756796a5288ac", - "coinbase": false, - "hash": "987e73683b1fa5a62b1e31e9b6ad5395ad4fea781f1e9acc960b7aabd7bad3a6", - "index": 1 - }, - "script": "47304402201b32e3c41ca4e76e487996f9d6f7705f79ea405794cb46fe8341e7641805b25e0220060a9dac0a55cde1ec2fd8a54922f678e0eb3ee4bc193b35073c06e1578f703d0121029acd9b5b18f2abfbe3760c6a2d6f6ab544e13f1a315dc8b1aa76e01ec2c74343", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 200000, - "script": "76a914da5dde8abec4f3b67561bcd06aaf28b790cff75588ac" - }, - { - "value": 180000, - "script": "76a91489632368cd5145406b32f7af02e97b51966f48e988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "700666230b80f59dc87f3ad8a53476c441c6119ab89490a90d817ed693579a4f", - "witnessHash": "700666230b80f59dc87f3ad8a53476c441c6119ab89490a90d817ed693579a4f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 84, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d1294941743b81f6b5c66d2173bc20617b8f68fa75e9af6efea61c8220ce45eb", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 50762016, - "script": "76a91484b04c09a2065b20adc4cf54f2cb47e975fadb6c88ac", - "coinbase": false, - "hash": "d1294941743b81f6b5c66d2173bc20617b8f68fa75e9af6efea61c8220ce45eb", - "index": 0 - }, - "script": "473044022051f1329f4d6dc0ef70a728b50c6246c01e0c79cf9853ddb8acca96c8f1dab5f6022046dbf29c0965fe50d0a82811c77eb08daedebfedd1c98966f4def4962c240a2e01210258c6288b432382daaf88e377c4a4d728c12fcae258be79f843d8bee45776dad4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2925000, - "script": "76a914be23007ebb9232f84a3f8d4b0c16fbab0182550088ac" - }, - { - "value": 47827016, - "script": "76a9141f2e83e7e88348b8265be26977324dc10c05e40f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2ffa6ff6eb34bec59a51c327c49b148ee756e1cc5a7cfd17e55626042f1ff1a2", - "witnessHash": "2ffa6ff6eb34bec59a51c327c49b148ee756e1cc5a7cfd17e55626042f1ff1a2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 85, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "31ef8708c94730a676961ddc89fbfcf62c6fe6d52f1f1779957197cc457b0885", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 48374028, - "script": "76a9145ccd2619098e61398ce73913b0fe27abc7bd70d488ac", - "coinbase": false, - "hash": "31ef8708c94730a676961ddc89fbfcf62c6fe6d52f1f1779957197cc457b0885", - "index": 1 - }, - "script": "473044022024685c9ed369a1659af21fe459be3abed2929ca35c86cd94b214f14ba570eef9022025a03441fb81b3c53ee8a2071937777b7cacea5e7267a0b658cfaa4baa5fdedd012102e53cebc4d684de368baea63a42403de9b5d800881bd7ea2ae1e8965c90c2e070", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 26774028, - "script": "76a9149917895610260d606f595d7e14b896b6a65e8a4388ac" - }, - { - "value": 21590000, - "script": "76a9142eb6d8929ea4ebb21d3eeef4ed599b2f57916fb088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dab4add20e9e8b09ef355cf7060dd88d189156859dc87c44fe4a5203fa644ee7", - "witnessHash": "dab4add20e9e8b09ef355cf7060dd88d189156859dc87c44fe4a5203fa644ee7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 86, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ea979aac3fcba582b6f4a13d8309bc0396934e28ac4c59c9fc098376ac5e5361", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 44297698, - "script": "76a914f55463d36d442c9c5eee22de6c012e0e0eb8cc9888ac", - "coinbase": false, - "hash": "ea979aac3fcba582b6f4a13d8309bc0396934e28ac4c59c9fc098376ac5e5361", - "index": 1 - }, - "script": "4730440220729515adad0f7c3c31d5f98059aea4a3a4f977ae1b1738b9e6287f2a0e948f0f02202f31382f142646023c59c8c7ba909861be380134129508416585b759dbbff115012103465501a4cafd4214a88cd543dda88039977607800fc80646a6b57b7b9eac6f9d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 25000000, - "script": "76a914bb3612312c465a438d0c86fcfdea513164604f2088ac" - }, - { - "value": 19287698, - "script": "76a914836d957cea44cea915c093cfd5d9e19c008fa2da88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3580d397129722f68da349e0dcd6e3d9988d247e58da27cc16b7ac7dd1bdf96c", - "witnessHash": "3580d397129722f68da349e0dcd6e3d9988d247e58da27cc16b7ac7dd1bdf96c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 87, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fcaa773d66d90f0509375bf9fd47fdb665b215959095b140d30ebc07435f6672", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300000, - "value": 3100000, - "script": "76a914c3cbce21568909ce6af06f70b37e914b47c8070188ac", - "coinbase": false, - "hash": "fcaa773d66d90f0509375bf9fd47fdb665b215959095b140d30ebc07435f6672", - "index": 0 - }, - "script": "473044022015c4ce7351c426fbc3252881efd5b34469ec4400d0769fbb7f741979a8f20853022060163bd911eb479d45b767a03f6d6db3b91f26e39fa433fe7ff2f499f82a9fdb012102b360f50aefeb645ded270cfc766e8f0351be069da58b354794920ffa4271a1e6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1760000, - "script": "76a9146229f59192c321b0ce0ea4049ec5f14be0bb669488ac" - }, - { - "value": 1330000, - "script": "76a9147e794c8cebb54f245e3a0fee3d07418f44b65e4788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "054fb024109511a90f37be3316d709c21358fe4f0b3587e4647f8d0fcb4c3cd3", - "witnessHash": "054fb024109511a90f37be3316d709c21358fe4f0b3587e4647f8d0fcb4c3cd3", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 88, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b880048c3dcc549b977b81c33b55efa0fe0b74bcf1c8e38035c8a0afc89874c5", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 66219932, - "script": "76a9145da3d17c6d9255b27c4cafbd13835362b31c06cc88ac", - "coinbase": false, - "hash": "b880048c3dcc549b977b81c33b55efa0fe0b74bcf1c8e38035c8a0afc89874c5", - "index": 1 - }, - "script": "47304402207568d5f890595056c2f833e9b4d358e6b42c69b9d1eca27014152605a1540da202202e0335e673c0f9c891e27d7fb3b90a814061ffb072bd62c274304de4c7646c2e01210369c1aabafd97957275ee8ed23105f3d402fde1d8eda0672f4f813c68b9224905", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 66200000, - "script": "76a91448c68bc667ce0d74860dda6fd9aa6676677bdf4088ac" - }, - { - "value": 9932, - "script": "76a9140dc9eff0a80b51d0551f26d3d183fdcdcee9b4d288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "50a6b1716559fcc6415c5951a2ddc8bdb2e58c9749c3d340d7dc01519554ab25", - "witnessHash": "50a6b1716559fcc6415c5951a2ddc8bdb2e58c9749c3d340d7dc01519554ab25", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 89, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "50ee9c8a6ec58473192a88262dfbc0ba8ccd0d56c621e79963adf7da8f485002", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 30126065, - "script": "76a9144b6e6cab227ee14166336a1161cedd000594879788ac", - "coinbase": false, - "hash": "50ee9c8a6ec58473192a88262dfbc0ba8ccd0d56c621e79963adf7da8f485002", - "index": 0 - }, - "script": "473044022058b28c7ecbd8a1a155480a8905f3c00e2c30ff98542ee0a1da08ca13135a0aa202205f8c308b142186dfece10d1ad3db119c55674834f31f59a1e0625694d491d554012103bcbb2d4fbc13072dd51c4cf4ef9fab8b24f9ac454515abd6f3108534cc817bc8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 30000000, - "script": "76a9141d2d60b4be51b4450ac6d95186a1614d101d93f788ac" - }, - { - "value": 116065, - "script": "76a9144b6e6cab227ee14166336a1161cedd000594879788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "87b35953f5507029f7aad06936cb6c2d600b7be55f5360e8c038410502af9a81", - "witnessHash": "87b35953f5507029f7aad06936cb6c2d600b7be55f5360e8c038410502af9a81", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 90, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "353b9b4f569c96cd489cf97f24d0d4be03825dac56186e6b8b7200eba4e68a5b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300006, - "value": 3134280, - "script": "76a91448abe414fb9e14e15b1c7dbcb140fad1d7db948188ac", - "coinbase": false, - "hash": "353b9b4f569c96cd489cf97f24d0d4be03825dac56186e6b8b7200eba4e68a5b", - "index": 0 - }, - "script": "47304402205ee0e2f68abcd649faf199c75d95c82fe7cbc2b6a35d136aee0798615c92c377022052d9331459ad6f5a60962c94878eb0dc033d63ff50deac0487b837ae17de2269012103b021fe510ed3a1cd2eed8e1065c289eb63f79eda66bda39d7ef33f4de4a94718", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2321780, - "script": "76a9143ccd638ec45571070e9a49cf91961e40bb56365088ac" - }, - { - "value": 802500, - "script": "76a914a48c35e18e369168a18029a75ceb84705b1c87b088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "48e960f022a554ac70bdaa4e9364b5fe8c1b0d9f8715cdde0f56bd30652ff7ef", - "witnessHash": "48e960f022a554ac70bdaa4e9364b5fe8c1b0d9f8715cdde0f56bd30652ff7ef", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 91, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0b6b72e182d292c992b8c099c317a8831700f426835cacb1c04991bb293087c1", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 40666646, - "script": "76a9149601092669928f9d6980354af6ecfafc7048a3fa88ac", - "coinbase": false, - "hash": "0b6b72e182d292c992b8c099c317a8831700f426835cacb1c04991bb293087c1", - "index": 0 - }, - "script": "4730440220168d44341308174fedd8de17638e5b8585dfd0d3ad84d2439d225e0ec2a709550220252d57345e133e5cbfb2bfcd4f883e6eb093a1cb692d2f00f71d6943a99673b6012103b8c9b49cc603861b0e1ff0193fb08ff37baa79f966d9e112d1ed14d7837b94e1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 13600000, - "script": "76a914bc73e5aa1d8ad3a50e5ddd7db9a2be76d7a651bc88ac" - }, - { - "value": 27056646, - "script": "76a9141c52f47458b2e0c65a9f686b8c5fb0020ba0e2eb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "354bf62c01c4089137547857d0b2f7ec6827d7fca305dd6618cb605d65f4e4e7", - "witnessHash": "354bf62c01c4089137547857d0b2f7ec6827d7fca305dd6618cb605d65f4e4e7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 92, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ee9f94c3eb764e23399bcff6d3e9f9c6804c01d2aa44bda447fa702a588be8ed", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 17350000, - "script": "76a9148e1e0cfa8e76901de9647f3c1feb10b214ffb96088ac", - "coinbase": false, - "hash": "ee9f94c3eb764e23399bcff6d3e9f9c6804c01d2aa44bda447fa702a588be8ed", - "index": 1 - }, - "script": "4730440220560763fa7b4dd607334ed25ef2ee6bbb97503caf7160c6859b3877ab9d66a8a602200728a8b1564308a2f526eafdaca005b6abb411d208029eeafcccba26573df7a9012103c83a3696295b05bb6ec8a5c54264de00413ed9c9a7b08faeac1a1e29054e919c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3520000, - "script": "76a914fe59d387308bedfdd0f37b1e2bd0869275b3451488ac" - }, - { - "value": 13820000, - "script": "76a914262403b92d1494d1187c21914d9a4764a067b9b588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9c9e3d830e86b53e782c1fb74b128f682d7b6fb6e5796a5763bcb22c01e7d933", - "witnessHash": "9c9e3d830e86b53e782c1fb74b128f682d7b6fb6e5796a5763bcb22c01e7d933", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 93, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1e3eec7a6d024e136c9fbbdcd81d7dcecbcd660933585ae55b8b18cb9694aea9", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 740000, - "script": "76a914a9f62240af9d0be8f70f1a6e926c9a85c10e74c688ac", - "coinbase": false, - "hash": "1e3eec7a6d024e136c9fbbdcd81d7dcecbcd660933585ae55b8b18cb9694aea9", - "index": 0 - }, - "script": "47304402205f7f4d32cc2cca06762d95181f48e248893e3c75cb5a6fa127092bfcc0c14bcd02205e55a6bb5cc4d220ebb523f41cb55d303b0d510dd42634fbfe06623c88147ee8012102fae2cdb83c84a13fe54a3ae540696059ddc6bfeef161264b1594fbbf4da5e15d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 500000, - "script": "76a914fbe6e9e96ef861f3f93c34848a4cb554c749310488ac" - }, - { - "value": 230000, - "script": "76a914a9f62240af9d0be8f70f1a6e926c9a85c10e74c688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c141d050c7faf55bfb044535f8e60f1169f75b00a8becf66ad4fdd00bb0ef821", - "witnessHash": "c141d050c7faf55bfb044535f8e60f1169f75b00a8becf66ad4fdd00bb0ef821", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 94, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1ef1c8dd3753aa8e0ee67a2ac03e059abc0c4da29712e0f93be0b481d49a7856", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 6905454, - "script": "76a914b4084daea798e7cbebfc9ca011f220c8ba587b4488ac", - "coinbase": false, - "hash": "1ef1c8dd3753aa8e0ee67a2ac03e059abc0c4da29712e0f93be0b481d49a7856", - "index": 0 - }, - "script": "473044022075c5e922360432cad5e55b7ae861aab0b70b5674bd8481402084e0b37961fef002203014b106e75df4f998f2b03de872c937a685211fc250fc15a4ea21a774802fb30121036e6d66423da3b704f540b6c55cd3c3674e52326c6f4de34632ff227740c18a9b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4995454, - "script": "76a914580f29765a8e34d515d061096f31a8d3524045a788ac" - }, - { - "value": 1900000, - "script": "76a914ae59f86f8e962681d6b9e2d51b5b269aaed2ba0e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ac2ee8275091aa876086fe53d2c76f527a793ad77ca574e711ac2a6ecd4394ab", - "witnessHash": "ac2ee8275091aa876086fe53d2c76f527a793ad77ca574e711ac2a6ecd4394ab", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 95, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f2c3e5b5982a84b999f8614669ff6de4edd36a0bb1408e788cbeeb7c132347b1", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 9990000, - "script": "76a9148e434b430d736c63529946031b25a0c058ef71fd88ac", - "coinbase": false, - "hash": "f2c3e5b5982a84b999f8614669ff6de4edd36a0bb1408e788cbeeb7c132347b1", - "index": 0 - }, - "script": "4930460221009874cb1f3c8523f15b5db0571e7f86e224844bc72bcb00c4dd110fc036a018360221008b8947c6e207a418cf1966d993d23d8528f28276909d77a6b757f00e4f99774e014104d81a72d5a6d6c51f6f64b20fa7bfb807f4c5726ba0066ac485898854dbb35b4b9f113a98ccf58f5e411212caecc6f3033b36a0af4d69fdae5d7a466951943176", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 9980000, - "script": "76a9146fe0399227a04acc813420e65b94d602bf8772da88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "78fc74e3759105cde81aa9bd8b0972c9c1fd241fe81df5ca82b78191a1bf6cdb", - "witnessHash": "78fc74e3759105cde81aa9bd8b0972c9c1fd241fe81df5ca82b78191a1bf6cdb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 96, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "232ba69eeb904f5a753ee71ff504d756965271865122a41fbacecd37c13eef87", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 4404801, - "script": "76a9149fca6ea9d2c36317f10317e13cee886249df99a588ac", - "coinbase": false, - "hash": "232ba69eeb904f5a753ee71ff504d756965271865122a41fbacecd37c13eef87", - "index": 1 - }, - "script": "493046022100a6716dd213a715c1c253837b7548a6b5ff1ac67746f6315bb47c579fd834d387022100d58add59b608c4d75b498f461e464df6357a74cee23ab3e9a7f4451db0b08d6e0141043f4d39e95e2ab5b5f0f2521d8d6a78a81845811013b0d2b142b1a1342e7fee1586b68f25f9d993c4d8e77dd7a39349ebb1c9fc0ce7bcc2cfabc9d06fca72d4f3", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4394801, - "script": "76a914fe5b2dbac47ed1bf8d291fd73e134ae63ff68c6888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "efedb9f2e8e28c70d4804b10a58894158dc91128afc93cbf7bb583a49b0cab17", - "witnessHash": "efedb9f2e8e28c70d4804b10a58894158dc91128afc93cbf7bb583a49b0cab17", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 97, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d150ccd78a8a19a9dca9d7391e3298ebb8bbed9ecd6520d23da58e002d2ebc07", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 3499259, - "script": "76a91424f08d2bd989b1e6a614604612c333a9cc8ef88288ac", - "coinbase": false, - "hash": "d150ccd78a8a19a9dca9d7391e3298ebb8bbed9ecd6520d23da58e002d2ebc07", - "index": 0 - }, - "script": "4730440220527f1fce6864507c04c71a3038bb35c390e89517aa2e9a13f43c623e9c76ce5102202f79011e134f3723948cbabeae8383ec0ed3f7d2ebcdda97dd8de0e416c64454012102b22d59847a1b3f06e69ced8b051589d7fe420183575a4756a76a8c2231b1fb45", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 33170, - "script": "76a91428063fd6a320ec9249a184bfd18224e8037825f688ac" - }, - { - "value": 3456089, - "script": "76a914c9d05c29acacdc725dc9023e992215337bb3131f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "41b2fe993e1e59e500739c023e0ae7f1f860b9b34174f513d62b04e00348eba4", - "witnessHash": "41b2fe993e1e59e500739c023e0ae7f1f860b9b34174f513d62b04e00348eba4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 98, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "34e762c639d84a98c2cbde51f2647c105ecc278b79d7a222c8308adfa8a14521", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 6536994, - "script": "76a914ed871ee49768c4ab8bcbf6c5f99ef6883f5244ca88ac", - "coinbase": false, - "hash": "34e762c639d84a98c2cbde51f2647c105ecc278b79d7a222c8308adfa8a14521", - "index": 0 - }, - "script": "4730440220402eafc6004b7f043c3f7f8ff0e9992f1ee3e04a7f9468c8a77e21332e11c28302201c36f0bce67a3d75dfe482a7ca885c64a9b2edc1ebe19e9a94052f388f6e191f01210248f4401d42148dbdf4da3600642e293de1014f88c35485ea3fa8ea5a30806210", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6376794, - "script": "76a914d5fa15173be347ef5a7202af50670c859f8283c888ac" - }, - { - "value": 150200, - "script": "76a9145c84ebab10bdf995178e972e5aac94c6b1c5405688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0777af11126121598a0bf7295c16a9703b6556db052ddcdd9ae407bc37d516c8", - "witnessHash": "0777af11126121598a0bf7295c16a9703b6556db052ddcdd9ae407bc37d516c8", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 99, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "bdc7565ce1fb21dff1c2712897b93e30b8ceae9ae239cae2f8631f2b5c288122", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2827450, - "script": "76a91408be6cf3931d7279f4e30eac6dcd91560e55cce788ac", - "coinbase": false, - "hash": "bdc7565ce1fb21dff1c2712897b93e30b8ceae9ae239cae2f8631f2b5c288122", - "index": 0 - }, - "script": "47304402202db1290c0e8184da9054c33f32fc13715fd3be70340acda2e1e7bfa3d8c360ba022062d70790ba8e5681a435950d6823832a7039bc2a7272ccc821a4b9ab4880d28301210244a91ccb4ae96fe214e34b4da721908a48a13fc183d57229b698292a90d6dfdf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1101370, - "script": "76a9143addb60a01267df715a36653c1a654a73a16e14188ac" - }, - { - "value": 1716080, - "script": "76a91408be6cf3931d7279f4e30eac6dcd91560e55cce788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "37b7f95affd69f589ba6864c295eed72a3abb11b132ba36f5a23548b33cdc044", - "witnessHash": "37b7f95affd69f589ba6864c295eed72a3abb11b132ba36f5a23548b33cdc044", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 100, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0106703f4510199beec1352ea385d0d1302a9ca2498b502722c83d1f22fb1cdf", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2025895, - "script": "76a914f90c134a99f369e5305bf3472e251d751d0c1a5388ac", - "coinbase": false, - "hash": "0106703f4510199beec1352ea385d0d1302a9ca2498b502722c83d1f22fb1cdf", - "index": 1 - }, - "script": "473044022014f63a962491ac90448967ce964bbff17cf51a6c1f8a895d2016999c6e908bff02200c718205f28fd7fd62e7c9cae0b8a4da74c5796d1bafce31cb68930608dc4054012102d8cff3829a5557adb705f5911cf3577a034e3c824a9894fc5e056917f67ee48c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1215395, - "script": "76a91400346e60a649683932555ccbae4293113586afd488ac" - }, - { - "value": 800500, - "script": "76a9147784eafe2c4cea0076e60219d492a1d46feb2f8c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "367c1c3a0ec8c3d8bbf8213d42202450a2157076202e998ef33721bdb280fd67", - "witnessHash": "367c1c3a0ec8c3d8bbf8213d42202450a2157076202e998ef33721bdb280fd67", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 101, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c521b0056bb58cc318df65833d4d698158238b209e1009ea59671a00d967df93", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1444951, - "script": "76a914cfc54a78492d8841a1ec3c4cb348466dd82828c588ac", - "coinbase": false, - "hash": "c521b0056bb58cc318df65833d4d698158238b209e1009ea59671a00d967df93", - "index": 0 - }, - "script": "473044022033dddcea22e24dc8e9496ec1626f1bad41b7c98de53df8b40e9b843715a7a3d202206058b2d99836d411dd36777ad3f0773b7028ed1378b3763a6a198121ee51733601210209c69af344da797855b812a3fe0084ac660aaa82f1df5e579bb3f6ba280506b7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 50000, - "script": "76a91471045f0ebc56873501033435df2931de7867277988ac" - }, - { - "value": 1384951, - "script": "76a914ce2d554e04f8917b13a44fd622b3c07f2e89be3488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6e1ec4e54d6699636ebf21c665cdb291ee545a3af6651a4098e8b0d94247c251", - "witnessHash": "6e1ec4e54d6699636ebf21c665cdb291ee545a3af6651a4098e8b0d94247c251", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 102, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "efedb9f2e8e28c70d4804b10a58894158dc91128afc93cbf7bb583a49b0cab17", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3456089, - "script": "76a914c9d05c29acacdc725dc9023e992215337bb3131f88ac", - "coinbase": false, - "hash": "efedb9f2e8e28c70d4804b10a58894158dc91128afc93cbf7bb583a49b0cab17", - "index": 1 - }, - "script": "473044022036bab2cbe023dac7efc9712dd07210d32c355a1d932328828b661874bf2ee21a02202c1b44866d46924900de0d905d2d48e1a9ef3edaa0248fa87a0e5b8a746af8db0121030066c5bed0fbc4a94efdbc57e1e5c1a4e868c52d2de229946b30d85c0d8bb03a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3412919, - "script": "76a9149b50e4718c4d7cc4554443e40d34bf6306e53daf88ac" - }, - { - "value": 33170, - "script": "76a91499c5ef32afa5cde9567ab33e59966bb72943494188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ffd03ba45678f8bb0941b131b2b9ef71103c1653d69f67f9a64d77b6acf359a5", - "witnessHash": "ffd03ba45678f8bb0941b131b2b9ef71103c1653d69f67f9a64d77b6acf359a5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 103, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7e09d4de22eb172b846b55d24ab57a191e4c90922fab27ca90355662a0ce4b03", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299617, - "value": 3000000000, - "script": "76a914020908d6834fa490da2f561ac21f00d4d2f13f8788ac", - "coinbase": false, - "hash": "7e09d4de22eb172b846b55d24ab57a191e4c90922fab27ca90355662a0ce4b03", - "index": 0 - }, - "script": "483045022031b275999404d138f01d6596d856942a645a44e97cdf410a3a2038eaaa8513c9022100a766f87c17f7ae7266188629b8fa2fd44db4077a58eb476407474e063b5fb39d0121033d190b483f8670c1b1078894e267c8087fa4a82aa8d2195a13c0f091e3137ea9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2824959625, - "script": "76a914d905632fe36392b14d43f2deee2796c06a73402f88ac" - }, - { - "value": 175030375, - "script": "76a914e6a95791cd3573b5ab3243771ad40cc2f04a06a588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6a35e64848fe1e1e648d9e807be052dd7c2961fa0f0b5c5cc67cc30a661f999b", - "witnessHash": "6a35e64848fe1e1e648d9e807be052dd7c2961fa0f0b5c5cc67cc30a661f999b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 104, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "106f0179ed78e09c1585893ce9c18106570b42cd91d173f616e67807aaf6ee84", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 97802780148, - "script": "76a914f9a2146b89b908d9ccdd42270bc8544789a630ba88ac", - "coinbase": false, - "hash": "106f0179ed78e09c1585893ce9c18106570b42cd91d173f616e67807aaf6ee84", - "index": 1 - }, - "script": "483045022014655f8862fc8a6652fe9ae284dfd5acaa3c5cd3c2562f8aa272d3a363fb27f5022100d6126cbf03a3bf8c12d6eb001b1701ee656e56cbe95a0305273a6ba286f97261012102a74a4150e024bbe78c38b07b53d447586fb987eca72d80842fbd4d219600b2d2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 222750000, - "script": "76a91426418367d9ce90dbc52755a8d2e98b6c49f72f6288ac" - }, - { - "value": 97580020148, - "script": "76a91447c141e9c8e692e2b2bb8e598ce59dc3694e0e2788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "72703ba6663c30e9550bf68d2dd8a52abc45c2a1d4b431e710aedbfe9301e9d5", - "witnessHash": "72703ba6663c30e9550bf68d2dd8a52abc45c2a1d4b431e710aedbfe9301e9d5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 105, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a466c80fd65dce6e365df2d0d720b73da9bf6f51948c8a5e6f014238aa58775a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299892, - "value": 922386000, - "script": "76a914ffcd9e9bffc532e0ce60f6ca108f89583c51175988ac", - "coinbase": false, - "hash": "a466c80fd65dce6e365df2d0d720b73da9bf6f51948c8a5e6f014238aa58775a", - "index": 0 - }, - "script": "48304502203aa280157cf70178e6ee9c11d4a7f40957310e663729d20375ac1fb522349015022100968081674cb91d63d098f790fae61f41f3a6e27711eb8d073f9211e64eb2c38d0121034c921ab6c336cc35f9998c75fbd1691d947bd103b964a1ac844ee57ac45b54b6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 901429000, - "script": "76a91450a62335fb18760906f27934895e1abba41ee4a788ac" - }, - { - "value": 20947000, - "script": "76a9141abcc01caddb34e637e6ef3b1e935dd7f1f512e188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a030141b91f410593b3d5f2943079a952277af54d332044e870f65ca53d30170", - "witnessHash": "a030141b91f410593b3d5f2943079a952277af54d332044e870f65ca53d30170", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 106, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8cf93565618a6233f578b919dccd09bd67ab595fd8bb060ee4244395ce8a8309", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299732, - "value": 343520000, - "script": "76a91404f19e5871b8c60c0189bee8bd7c645ba243218f88ac", - "coinbase": false, - "hash": "8cf93565618a6233f578b919dccd09bd67ab595fd8bb060ee4244395ce8a8309", - "index": 0 - }, - "script": "48304502210091b755f1a13bb86bcda908acd7c34cefa0570696a21d2b6f757a82135a31786d0220214ed21f448012d56f4237f3b3b585e6013f030e19c6b7ee464afa7338038741012103a36d8409b85492f88914c3d06a015f68ea2b968bfbb5168e171bfc18c5c16ead", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 400000, - "script": "76a914da5dde8cbf20315f3e00ad8d6b610c14bb6d0ab888ac" - }, - { - "value": 343110000, - "script": "76a91491c2d43bea3f61ebf55e1e640f14f0031e3e46ad88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b35fd688ed0f62031356a9b8db9129058fcc520053ed358e0c5d1dde6f03d61a", - "witnessHash": "b35fd688ed0f62031356a9b8db9129058fcc520053ed358e0c5d1dde6f03d61a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 107, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a030141b91f410593b3d5f2943079a952277af54d332044e870f65ca53d30170", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 400000, - "script": "76a914da5dde8cbf20315f3e00ad8d6b610c14bb6d0ab888ac", - "coinbase": false, - "hash": "a030141b91f410593b3d5f2943079a952277af54d332044e870f65ca53d30170", - "index": 0 - }, - "script": "483045022100d0668de97b5687d484c9de8f971d06b804d2a26dc619b824b2884bc80ecbe97002207f58896b1ff6d52ef755e2fd5de027f39f6baaff10cc7d3b19a6f0edf301ae00014104ccc493c773ed7b190fd3fec0fde94df66605923b5ba6781968921e3f7c86060f62799e085a6873cc5dc1592e99a9090951cad28102cb920da361944d1a827916", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 390000, - "script": "76a91404f19e5871b8c60c0189bee8bd7c645ba243218f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ac3f228550662a7c592878c0e0d9365ad26049fef04629732b47d31f5a9d0bcb", - "witnessHash": "ac3f228550662a7c592878c0e0d9365ad26049fef04629732b47d31f5a9d0bcb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 108, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c78a25e0e2313124c24d80cbe9f8d1c26ef8523c90fea76177715fea5bc2bf6d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299897, - "value": 300000000, - "script": "76a914318bd84a8d81c1c21d2354afce50bfb0aa177be388ac", - "coinbase": false, - "hash": "c78a25e0e2313124c24d80cbe9f8d1c26ef8523c90fea76177715fea5bc2bf6d", - "index": 0 - }, - "script": "483045022012eed9463a05dabdbf1a6cb51db2b749db78d3f1d518405eab14eeb3bb8f95390221008e699b50c4f1b52de1c4a76376234b493a68c8f816efd3ab239130cafa9c0891012102568ed5145892b4ae7bcd153f4e05e5a0e4d1ff8142fb5912e50e5d9f88aca665", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1064000, - "script": "76a914faa3316796f5ea4366cb4dd0fcbe5c9d131a2f9188ac" - }, - { - "value": 298926000, - "script": "76a9147be06736f5ea3fbc9af8e23f07c8f0b72ff80e8f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b3b33a687814628dfc81814a9b4fb7062ead2211268e4306dd25c44ca648797c", - "witnessHash": "b3b33a687814628dfc81814a9b4fb7062ead2211268e4306dd25c44ca648797c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 109, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "20c469506fe84a01ea9a0ea4e22e5216398153f9e200707b3f83a557b1961b48", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299869, - "value": 163000000, - "script": "76a914741773b4b14a083cd6c3f232725e08fd4a34ce8388ac", - "coinbase": false, - "hash": "20c469506fe84a01ea9a0ea4e22e5216398153f9e200707b3f83a557b1961b48", - "index": 1 - }, - "script": "483045022100e36e47b601c43af8b8e7e748e2f8bdf747ffb335b2d48359a5f634ef58f3ede30220291fe8050ffc4556fcc50b9de95360816ba080aea2ddb513aebf324528dbfac901210297a5fe7d3d144aa8b0e6cdaa99890f90d1ad3029f7ffb319c0d151e7bd5a06bc", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 162490000, - "script": "76a914a849ee34aeea55ebd85ca30135a6fc249ca41b1988ac" - }, - { - "value": 500000, - "script": "76a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ab19cf0773a2f7ff247e12517f6fb368fc92fda147a3014e0907d1c07ca5d4c5", - "witnessHash": "ab19cf0773a2f7ff247e12517f6fb368fc92fda147a3014e0907d1c07ca5d4c5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 110, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b3b33a687814628dfc81814a9b4fb7062ead2211268e4306dd25c44ca648797c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 500000, - "script": "76a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac", - "coinbase": false, - "hash": "b3b33a687814628dfc81814a9b4fb7062ead2211268e4306dd25c44ca648797c", - "index": 1 - }, - "script": "4730440220309543ec30b369f9314dc7c7d538bad4cd57950999f4b782b71bd7fa8370226e0220337cbbdc08ecc57034f79894e7b64f83af09934ac404c2816f4302e6bb25113e014104da6bc6a6139bb008454bfc8371141a5fb8ba6de87e9ab1578ab4c31e1b25513d6d1b1b0e66b0e39a29f6baf19f9f0faaf51d22bac02b1c07eb08058498763784", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 490000, - "script": "76a914741773b4b14a083cd6c3f232725e08fd4a34ce8388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ad2d5045450a1b6fa5f6513232a4a1f09c3390056f403f4a1ab7ea54c901da0a", - "witnessHash": "ad2d5045450a1b6fa5f6513232a4a1f09c3390056f403f4a1ab7ea54c901da0a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 111, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ab7401d13fca148a0580aec611e123d9f8dd317936c2830241570a91069962e9", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299951, - "value": 201852000, - "script": "76a914e92be97d75e18145fff978ed415535b8afd1156688ac", - "coinbase": false, - "hash": "ab7401d13fca148a0580aec611e123d9f8dd317936c2830241570a91069962e9", - "index": 0 - }, - "script": "483045022048f81cf4f4fcc91c61d153a7d6761046002b2c9cb0902a6945b89b29b2404d34022100b84eee1ef0d179827f51eff250d6c4a5a1701a42ea101cfa584dfcf36aad94e3012103e4b0d754c725dacd1ec1338efa132f46d097fbfac61f0441407c9be17aab44f8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2020000, - "script": "76a914327e588ed2bbabfc99cc600339725cc7a0066fc188ac" - }, - { - "value": 199822000, - "script": "76a91447d7f78504516b8d8ff0c8150c13ab1d21ca6edf88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4bfe8b2f33cd22d329e453f4ed9d9a8edce6547910f7fdb0263ab2a6c58d6b79", - "witnessHash": "4bfe8b2f33cd22d329e453f4ed9d9a8edce6547910f7fdb0263ab2a6c58d6b79", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 112, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "286aac0bcdccd6e670270c94e8f56b23f165293f0c63f79bc71d63ddfeb1a720", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299999, - "value": 351441000, - "script": "76a9143676f9f762ec007bf99d0d79d8afc0b32fd43c0888ac", - "coinbase": false, - "hash": "286aac0bcdccd6e670270c94e8f56b23f165293f0c63f79bc71d63ddfeb1a720", - "index": 1 - }, - "script": "4830450221008c49e126d5b108160dcb5a78bcd9a313e1c78e06318d122a5000055f8dbb986d022019fd2bd350b10bf45f0af1f0dd553b12fe7665f8d7f1625f3d1851b6b7eba91f012103b038cd334e6562635612a298c67217ad4260fb3f2dae68ad74a3763e8da01e39", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 17621000, - "script": "76a9148f1fde7bda6eaaeff9f80ee3adcf6c5c7219c99c88ac" - }, - { - "value": 333810000, - "script": "76a9143676f9f762ec007bf99d0d79d8afc0b32fd43c0888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dfa3986babe54b50d013bca88c939e4554d70a774af729acb9e733f3cde1a966", - "witnessHash": "dfa3986babe54b50d013bca88c939e4554d70a774af729acb9e733f3cde1a966", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 113, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "27bac71a6771564486c5d27e30dfcd2d20b012e7e6627c16ac932f0aa3db631d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 152042000, - "script": "76a9148ec46974ca3773150e2eb43ea53c1ad74860900e88ac", - "coinbase": false, - "hash": "27bac71a6771564486c5d27e30dfcd2d20b012e7e6627c16ac932f0aa3db631d", - "index": 1 - }, - "script": "483045022100b3fb53c28e4bc7590a341dffd4fc75ca9378c266c964a874e24ae701cdb244600220735d13f1e4ae0b5c2056c036f55f42808fc6125621dbd92901adad8fec3fe904012102220f279392d0987b3365980988be01526417da4528e417162c1e2a8c1c4f2407", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 150750000, - "script": "76a91405030c6d1e2212b027856fa22f9861d508bc56b988ac" - }, - { - "value": 1282000, - "script": "76a914d5f71f487783c928cbfb46af44c509fc7df7e5b888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "59b807f61be36d2e380bf8ec15f3f07114a59de8b75df8ec17f58668d9cfd5a0", - "witnessHash": "59b807f61be36d2e380bf8ec15f3f07114a59de8b75df8ec17f58668d9cfd5a0", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 114, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "946f08970f34e9196f415670920bb23d5172cbd7f9305ddd749907af8371af3e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299877, - "value": 43716951, - "script": "76a91487b300bf9694a6cf8f50088c40c954cdfc4a4a8688ac", - "coinbase": false, - "hash": "946f08970f34e9196f415670920bb23d5172cbd7f9305ddd749907af8371af3e", - "index": 1 - }, - "script": "48304502210084656a0947322a9dc712c100c3372102f2522a324b7d5b775b04a43b47f8ef52022034c9879f5c8cc51c266f91d291fc1e36350cc135a28357635cc89966ad4f3bab0121033645bd7da6549dc49fdfc275ef335c06a615616e560f39803bbe7dcc0cebcd56", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6716070, - "script": "76a9144a1941d41f60963b2aaeea35ef5ae7a10f988ec788ac" - }, - { - "value": 36990881, - "script": "76a914518e38d19680601c78a866eb262f1f6a41455de988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c530865b6acf4e74556725ce2796d5e67618d3f8fc712e8b0b7c8ba7248b3836", - "witnessHash": "c530865b6acf4e74556725ce2796d5e67618d3f8fc712e8b0b7c8ba7248b3836", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 115, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "efb2dcc2f26adb81be1819dc84d80e3abbc91cb3d80b8066adc4893e391cb04d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299113, - "value": 5371246, - "script": "76a914c140daabb6a4225712f2b5db3dc6714f4919d76088ac", - "coinbase": false, - "hash": "efb2dcc2f26adb81be1819dc84d80e3abbc91cb3d80b8066adc4893e391cb04d", - "index": 1 - }, - "script": "483045022100831925b73fc4caf04a157f9fd574b0d451d9e1968d0c7f028586cb4f6290e278022060d0d2c871222e9abd4f95cc8c04f4a27699cdb56dedc947f361e158b90f21f60121036d75c13adfa81210da28bdb305f9c759209691dc1b060dfa8741d8f5a8744d02", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 500000, - "script": "76a914c52acc6ed8a74a05fb3839456c11c7a453b745f288ac" - }, - { - "value": 4861246, - "script": "76a914c140daabb6a4225712f2b5db3dc6714f4919d76088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7df6ee56dfe56a9b97c0fc162bd9e715d62b56210699c582c5dee715f5422164", - "witnessHash": "7df6ee56dfe56a9b97c0fc162bd9e715d62b56210699c582c5dee715f5422164", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 116, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1cd6f20e1c2ff862901310931ee8c8ca9949120a822f78824270bc3b5de877ad", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 3633336742, - "script": "76a9148cb17fbbcc7a2c1b6d4a42bf6cc726d5c1d68fdc88ac", - "coinbase": false, - "hash": "1cd6f20e1c2ff862901310931ee8c8ca9949120a822f78824270bc3b5de877ad", - "index": 0 - }, - "script": "483045022100e1795bcb152eb27aa849358c1b807640b8dcc921c3a007d5100506a44eca27f7022010933cbc75c744060cf13e90aaf49c82dc3d3991aa739bb40387665f48ff4da70121027535599b9a8cae6e14afdb6fe223319c69197adf1392211bf83c000a1eb2a692", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3624426742, - "script": "76a914ca332e2fad8dc1b20f447a6ae45d2cbd36a82e5f88ac" - }, - { - "value": 8900000, - "script": "76a91432638fe8a334b7cd434d6d2e4ea637b7422d9b1b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2e62956d09b991b597d5b6e34aaa39462f0c45881e0d5ebcdf153db0d58635aa", - "witnessHash": "2e62956d09b991b597d5b6e34aaa39462f0c45881e0d5ebcdf153db0d58635aa", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 117, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "846a86fa3ed119039978e239031f50c2cb416743ac50f75f107a55f3b35f8e7b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 284944, - "value": 198181, - "script": "76a9142db8561d40f41c708832893815f35bedca4f9aa288ac", - "coinbase": false, - "hash": "846a86fa3ed119039978e239031f50c2cb416743ac50f75f107a55f3b35f8e7b", - "index": 0 - }, - "script": "4830450221009e8c1c04ad1c8838ce779fc7334314c584ef88d844e8ca4493dafc696287011702203262ff5752adc12724793e5ff96cdd24bda4d9b023961230279eacd55351f3ca012103767be7c470505b782f4182d99fa1e85762c1ae4c689e60583f5f5b3ea171d766", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 33338, - "script": "76a9141bc342485fdcab48a98bdabaa7d320e1be2f5f4488ac" - }, - { - "value": 154843, - "script": "76a9142db8561d40f41c708832893815f35bedca4f9aa288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "332ff53505ed943d8e4561d40561ec7d0c96cd27a8aded0f126c05ebdf532dd1", - "witnessHash": "332ff53505ed943d8e4561d40561ec7d0c96cd27a8aded0f126c05ebdf532dd1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 118, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "207ac50d84aa773967a2e954df3f0c881bccd163a0274bac35c76f3ed2e0740a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1058882884, - "script": "76a914f6dd9ebeb8c1c82d27ed0d5a6f8e9a71383c427788ac", - "coinbase": false, - "hash": "207ac50d84aa773967a2e954df3f0c881bccd163a0274bac35c76f3ed2e0740a", - "index": 1 - }, - "script": "4830450221009e5511fceb1de859df236e7c0e63564c56bcc4d0d194f799829c1d2bc44c334702202e0d421ea5e3fefa33af6c8219493e839ff4983eceabe6bfab182f2375259b75012103a9534a1e8bd2a18b6027c06d403c35002b89375f52d5ce53fa9045fe68663543", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1055372884, - "script": "76a9141e3b2f1b6824921e7225db75c7ec56d627690d5388ac" - }, - { - "value": 3500000, - "script": "76a91410eecefc7d22d7589b2dd0a6063be45385b3b88d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d8d8e2bd01d7a167f079e505dbe51274400d80e61111b369633f43b8e97359dd", - "witnessHash": "d8d8e2bd01d7a167f079e505dbe51274400d80e61111b369633f43b8e97359dd", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 119, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3d01117d87f43bde531de981d045988390bb8dec86b3d3fdbfca82fb5289c9ee", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 921161636, - "script": "76a914429f17129f6662cb9bc747997b960ef064b506ef88ac", - "coinbase": false, - "hash": "3d01117d87f43bde531de981d045988390bb8dec86b3d3fdbfca82fb5289c9ee", - "index": 0 - }, - "script": "483045022100c01cf39f259ec5b40a3e830598d9aa88ab6bbb9b776dba32740093e87930c9bd022070c62c375b3c7565f993f5f905edac684d7713867e32e8cd54e0a94e2093eaa3012102e252f4413c75591a39036edc5f6f1025ffee158cfa4a897c7ae42a1a2d26844a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 708967389, - "script": "76a914bdf404cd409fe82bdde4e50a7503299276238ce688ac" - }, - { - "value": 212184247, - "script": "76a9146cc220e8c0a83d3de0e4e01bcd075b0190feaa1088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "025ca1879dcc15bc0eaedf69d3a4127d39bd03418da7f5a956ee09be14bfd0cc", - "witnessHash": "025ca1879dcc15bc0eaedf69d3a4127d39bd03418da7f5a956ee09be14bfd0cc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 120, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "948117ebd1ede15bdf26779f35b062261e72054329fa4eca8763456ee84e194a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 878476079, - "script": "76a9146120cb5ea2aedbb9bfcba48d70a2c0cb1ea5170988ac", - "coinbase": false, - "hash": "948117ebd1ede15bdf26779f35b062261e72054329fa4eca8763456ee84e194a", - "index": 0 - }, - "script": "48304502210092e071e181d11f038b1ba48f053fbd8736c6379bf7e3d05db6e12c6df561cb3c0220047383203d27e429061c7b9557d7ec6e8780bc86a0663207c5adc5a1ecc99a9c01210311685e3a193ad4a75ec742b0dea8d3f0e8c72b327269a6098a870ad0fee05e6b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1715248, - "script": "76a9149fffab0d97979db0933ef922a1cf90c262d6d1c088ac" - }, - { - "value": 876750831, - "script": "76a9148d234ace35a9af9a886c9d7bf0cba7a80df9defd88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "82b9a9fd44ce6ade38e71be6e636b8ec4761e7111307c75f48cdb4a8efddd982", - "witnessHash": "82b9a9fd44ce6ade38e71be6e636b8ec4761e7111307c75f48cdb4a8efddd982", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 121, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "30c820171b4ba7a94f0b04ebf958e16d261c915067131b782944967914d63e2e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 365612445, - "script": "76a914bb7606670693d589b875c6a507e9671f2321634788ac", - "coinbase": false, - "hash": "30c820171b4ba7a94f0b04ebf958e16d261c915067131b782944967914d63e2e", - "index": 0 - }, - "script": "483045022100d2f98536b73830edf3ba64f3e3261ae9485b5a8b44492a9201278c3b8f82471f022025b0c0d1d640803e17c703b7ada61ea651847543bec7baaf9c5638e9e0ef77eb01210237d27ebdf7fcee25982a3853fb7fea68e2d1253dec7d26f1daa2d013524bfe51", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 360072445, - "script": "76a914f2decf0a9fbb970ad7bc701a1a6df460cc43723988ac" - }, - { - "value": 5530000, - "script": "76a914622ea215dee0c0480d044da98c9c2d51587547b188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "abeba4bc963938410b4cac241654266f8c6e796483f072bdf33fc38813290930", - "witnessHash": "abeba4bc963938410b4cac241654266f8c6e796483f072bdf33fc38813290930", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 122, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "114cefcc8cf9525552a60c0b3470863c492f0eb159bd76ba9151fb603686d8cf", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 326196079, - "script": "76a9146df7f5cc117ee10ef69c8206c9bcc22819d640fe88ac", - "coinbase": false, - "hash": "114cefcc8cf9525552a60c0b3470863c492f0eb159bd76ba9151fb603686d8cf", - "index": 0 - }, - "script": "4830450221009892cc9ef59b2ee5aa5b6f6b94258025903e75f44af19a06e9f797706dc07a480220393b0aafcee4b18ffbd09306de626664e26299add3fa1b2ce267411f038468850121029ac29af5eeafb2526cf8df8d0d83cc106de0b8aca920077703af1b1ccb2f2f8d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 325206079, - "script": "76a914644873cafb10630ce8380598087b3967314cd2dc88ac" - }, - { - "value": 980000, - "script": "76a914fe773bbdaad717bbc376d319645ebc2c22bf485d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "540cf35d71838c8239ed9b0055b7b7cd3d50f08552d23043a03356a5c6a9c9f7", - "witnessHash": "540cf35d71838c8239ed9b0055b7b7cd3d50f08552d23043a03356a5c6a9c9f7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 123, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2ec905afa8c922281543c39f1300e7f8dbd6bd933396be2c18dee745b82bcbc7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 123716000, - "script": "76a91437da323633c83a3da46c13a24515e2757244b00b88ac", - "coinbase": false, - "hash": "2ec905afa8c922281543c39f1300e7f8dbd6bd933396be2c18dee745b82bcbc7", - "index": 0 - }, - "script": "4830450221008c52420e2f9ae40bfa9ac6ea9cf621f3bfc2f428071b5c25bd77cd984f70a9bc02203390d4e1bd4ee31998592f1e974a1cda87753c1f98427beb76bf3272deab48cb01210278e68175f248c9a09199ba996ffac5b4caf4e07f2a20171d4f97e2675de54682", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1064000, - "script": "76a9145c0510aafe1a14327ec7bfd75977811596adc60288ac" - }, - { - "value": 122642000, - "script": "76a9142ca7d745a329e49a7da76f041cca7fe41b92ca0488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "25298fd74f336429d7d567662b5597ef7c22cea1d7c9042fa16b55e0496f5c9f", - "witnessHash": "25298fd74f336429d7d567662b5597ef7c22cea1d7c9042fa16b55e0496f5c9f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 124, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "90a92318e39ed1a50c5a00bdb156a26bc4a0f99a4c54a367efbf6a697cb4dc47", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 475110625, - "script": "76a9142f1c43c1ae88eb5fdf25829007a1592b076352dc88ac", - "coinbase": false, - "hash": "90a92318e39ed1a50c5a00bdb156a26bc4a0f99a4c54a367efbf6a697cb4dc47", - "index": 1 - }, - "script": "483045022100ea8f50c5450e0969a9d5021f90e11a576a08e7349893bf3b773fe489ab645fa802202e2235272197f9285c3dc495ac6db54d9b579d937afe55d45cd779cb62cd74ca01210261a029c1259f827e1254fca34348f6de0ecf4944780a917f45c446953f361c47", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 35462, - "script": "76a914cc39ce08c2c781772178fa386f894e83261dca6688ac" - }, - { - "value": 475065163, - "script": "76a9142f1c43c1ae88eb5fdf25829007a1592b076352dc88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "af1f05a19daeef6aea64ae1110d5e1f208194edbc1f58fe8d1c547637987df6c", - "witnessHash": "af1f05a19daeef6aea64ae1110d5e1f208194edbc1f58fe8d1c547637987df6c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 125, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d7d0a9c986a8feebeef215ff8ddc866de509efb9cf1760ab42674d101ba3a9f6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 467133500, - "script": "76a9145d7a7589f40cc1a3e09c970051c074cf1f0e333288ac", - "coinbase": false, - "hash": "d7d0a9c986a8feebeef215ff8ddc866de509efb9cf1760ab42674d101ba3a9f6", - "index": 0 - }, - "script": "483045022100e8d9c9efcb09697bd486be09a3dd429c00050e3f0a195b7cbe33aea0378ff7ea022025e845766caf9d89ffeb7fc6ad559f399d3a8b98bdbe8fc70e9988dbea4f2d480121028bb0f1d451553294512fa6c32d0b40f6319d64935b00ae66ddbff907d11711d4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 451423500, - "script": "76a9143f5ea67094ae4ad73fc9b940433369b3cc7db4af88ac" - }, - { - "value": 15700000, - "script": "76a9149991ad9699a1ac17518cf57c35ed1b3b936f373f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "05470be871fea368454689b1cac8cbeb801146808fa267564842dc6f07e086fc", - "witnessHash": "05470be871fea368454689b1cac8cbeb801146808fa267564842dc6f07e086fc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 126, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7c0f83824fc1e85e8f6b0c69e1fb86c8366b3828545e551b10dba64295c470ab", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 231490000, - "script": "76a914c356e37b46c415c77524148184629acd27c48b6d88ac", - "coinbase": false, - "hash": "7c0f83824fc1e85e8f6b0c69e1fb86c8366b3828545e551b10dba64295c470ab", - "index": 0 - }, - "script": "483045022100da740703556053f81776a2063b824fdd3632f339c768c3d4e3ff3a835b6443ec0220747e7ab6fa48d35788fd6eb172ccd02f8b711db79f6e05572c580ff52557d29f012102bdd58ba4a831882b67932d12cdd3b76b2512d4549d8430bd191b69ba2d07f30e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 201118190, - "script": "76a914bb629bd36fb89d655a4106b60b289ee4bf2063da88ac" - }, - { - "value": 30361810, - "script": "76a91461c53d6d41cd33e021398ccd1ff6fa410a78001188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7945d0782a1a9d548a42e32280229fec6d4d3bf197c300062a2a954eb3c081da", - "witnessHash": "7945d0782a1a9d548a42e32280229fec6d4d3bf197c300062a2a954eb3c081da", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 127, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e3f49d4bda10db46e89f69f5412f7bf845b6fc805232d7ca480da8bf03890207", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299922, - "value": 4225346, - "script": "76a914c300e954e8f17dc1d96dc6bedb473b683e94adb288ac", - "coinbase": false, - "hash": "e3f49d4bda10db46e89f69f5412f7bf845b6fc805232d7ca480da8bf03890207", - "index": 0 - }, - "script": "48304502210094fe73c288d4b44ae6a325ed5e98a44268fd9921c5c10e5da61eb276fb7fb5a102204cbccf48337f3abf75634fb5553d2ad987d2f234e497759109ea5ef07318e5ee012102327831951be803f1591e3f1768aca06d85b11acd81315016307c4af79fba354f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2579629, - "script": "76a914556744fbef0ba8f2aa9eb6fe555ce8394517dbc088ac" - }, - { - "value": 1635717, - "script": "76a914ba2e895905783181b2c7180115ece58345f3c4d588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "db0c982357c85ecaf7cfaec6da31a54afeed99771fe360c192df666d0e878dc0", - "witnessHash": "db0c982357c85ecaf7cfaec6da31a54afeed99771fe360c192df666d0e878dc0", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 128, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "31357e6c9b57fdd28a5030a9df0654f679551a20fd483d5c166a657fc8d2d61f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 210790000, - "script": "76a9143bc1c12570e035cbb69dd5ace0d8932255b146d088ac", - "coinbase": false, - "hash": "31357e6c9b57fdd28a5030a9df0654f679551a20fd483d5c166a657fc8d2d61f", - "index": 1 - }, - "script": "483045022100fa3a0ac14816dc018bb801c786a87205b530dc6bdcab8ec22b201785a9db831802202fb501dd43ececd778f5014a4e4ddf27b77e81ec8280622bea31d25a17dc80a6012102bdb7d7796c60c52817884c577abe26111bd13b52469064d938716e42be1facce", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1458495, - "script": "76a9144991f6e4fe0d10ef9a0ed0828dd90837269b334c88ac" - }, - { - "value": 209321505, - "script": "76a914a333229703b87d74fd360e73f964535dace8da6788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c05f1ad2184be66054d3d09ef6d74a67498fd4247d9894c9e55bb43d935096c4", - "witnessHash": "c05f1ad2184be66054d3d09ef6d74a67498fd4247d9894c9e55bb43d935096c4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 129, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "80642df03ed20013e4d1b5ba006540095b8f7b868801bdf52bc373a068ce00ff", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 69900000, - "script": "76a9148e5f8ae50b6f1c5baeb3863956ef950a6a0889b488ac", - "coinbase": false, - "hash": "80642df03ed20013e4d1b5ba006540095b8f7b868801bdf52bc373a068ce00ff", - "index": 0 - }, - "script": "483045022100ea6224cf34debbfa7cf067a2d010bc69d2b848dea436cb796084e432a9c14d5d02202256911e39454f805ec16d7e3178d8a229e2990c6871ad2e590d804ae1e1e384012102fe217898e8440eb1e2d8811cde22650588132e4f13ac0dc747fdebb037d461ba", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 22625980, - "script": "76a9144424bc3bf52cecdea9f2fed55d12cc9788bca6dc88ac" - }, - { - "value": 47264020, - "script": "76a914309cd7ab88e99569759f018213a2d9e32f9d828a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "007ccea62d7df2e6df491763dc9ab00ffffed6a01d3058a63085558dd598338f", - "witnessHash": "007ccea62d7df2e6df491763dc9ab00ffffed6a01d3058a63085558dd598338f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 130, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "de4120a7ddefa96e9ab365ab82de882aadbd2aa663e3eeda6d826ddd6ccd7478", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 205862481, - "script": "76a9147b6e7199ac1308b6e41f700b0000a89c3c1f6ba388ac", - "coinbase": false, - "hash": "de4120a7ddefa96e9ab365ab82de882aadbd2aa663e3eeda6d826ddd6ccd7478", - "index": 1 - }, - "script": "483045022100a294518a00b6a011d6787e775b060f906da9e0b14488df241e9d672452e6f055022016c47184b015dbed0b5d6ee274eaf0b7b109eb8cedee29d181a729c0e77b9a55012102f8917745609fd8ca4378f90a1bc03d02ff75a5bb6ca33db195623917e93b2a6a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 66312771, - "script": "76a914e0c29c27e6dc7ac5fd375bce2dcf9f7a574881db88ac" - }, - { - "value": 139539710, - "script": "76a914f85effd88fc5fa2e78cd610c0b6012c56c44243f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5dfa9be4bd5aaa203daa8d17a605dc10cf7fdc95c6b1b97f6e2dc634e2410ae7", - "witnessHash": "5dfa9be4bd5aaa203daa8d17a605dc10cf7fdc95c6b1b97f6e2dc634e2410ae7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 131, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1dd8eb978892110698dc7bb3e77e95ae20e635e11f1b9e7b56549218ed2083dd", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 399779700, - "script": "76a9141886e16d4f7162c46d7347be3e4c6cd318ac697888ac", - "coinbase": false, - "hash": "1dd8eb978892110698dc7bb3e77e95ae20e635e11f1b9e7b56549218ed2083dd", - "index": 0 - }, - "script": "483045022100eca8d8d0d7fd9e5f30d4d42b06e4cb3149ddd0400eb1f49d25f60e6819fff23a022064a97aa4611830b4d526a697246bd7e6e9febfc755a1a6df8d1a1c1c7dbc3c400121038572c63dff72222aab0dc76c2fcbdaafc9fb63842c6f7e46cef41a46583772d7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7080000, - "script": "76a914f8c708febae1879b2413814316cf9400c7134cd788ac" - }, - { - "value": 392689700, - "script": "76a9141e52bc214929dda07713fb8fa277f2f7c6d48da388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "88db7a1cb1f1620b83e62f72ed9cff9a8ccffa9c22dafd5dacc3f62a6f6b226a", - "witnessHash": "88db7a1cb1f1620b83e62f72ed9cff9a8ccffa9c22dafd5dacc3f62a6f6b226a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 132, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a462d1100e672ad9455ed127ab5c8819937ed49fc6d1961fb1260112ef66c465", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 150000000, - "script": "76a914a55ad4f5a3c3c039d06f0212cd7e4adfeeb6577c88ac", - "coinbase": false, - "hash": "a462d1100e672ad9455ed127ab5c8819937ed49fc6d1961fb1260112ef66c465", - "index": 0 - }, - "script": "483045022100cf4f1dda91df0963732d948dd3d4e6a84e0393be3d5ce1319c2de8a58595b0110220750798cf243abaf1771ad69551e527261f8b9a39fda993d002ca027a465b0693012102f5b3a0fbfd938fceb56afbf1b74b3a09be84563aef7dcd7a6c000761297c5f3e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 50000000, - "script": "76a9142c69cf8cb7d7c852a51628be57cf4a15b8e6a7ab88ac" - }, - { - "value": 99990000, - "script": "76a914a55ad4f5a3c3c039d06f0212cd7e4adfeeb6577c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "96cc2f4cf3c9947eacad94b20a004c46dfaaabba5131aabf05b1bbe161ba62b4", - "witnessHash": "96cc2f4cf3c9947eacad94b20a004c46dfaaabba5131aabf05b1bbe161ba62b4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 133, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5afc26246df5de615a11e8b4e25e07570e172fe98d0661c1cc16723bcec8c919", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 143560000, - "script": "76a91422b2379e489cf3b47a7dabb7f232de90b632c85888ac", - "coinbase": false, - "hash": "5afc26246df5de615a11e8b4e25e07570e172fe98d0661c1cc16723bcec8c919", - "index": 1 - }, - "script": "483045022100aaa002f4a789f26d9009391e8b1018ada3df190d8a69918fe9e66f3898f67db60220583e074f66b1d335f5ea345fc6b831ecc2432f4617a80c26b22df64a1874237e0121029eb08c24bd200683f6e5a1b5baba467ab6ffd651134ae51c41f156c3c6a3b46c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 43550000, - "script": "76a91416e36b218930262979ccc16bbed240f2cec04bef88ac" - }, - { - "value": 100000000, - "script": "76a914b198c8d267a0840436bfb076ac0e6ca1ede09d1288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "011bcd0073bc572ee5602b2729729c4040423691d3c2ed62e1da0976993f51fa", - "witnessHash": "011bcd0073bc572ee5602b2729729c4040423691d3c2ed62e1da0976993f51fa", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 134, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e67fc66bffe979913a3bc509753fc4ed0b75f1a00278d156d85599a555117fcf", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 95520000, - "script": "76a9141a3d39c34743845d918d3efc212f9d718c591c4788ac", - "coinbase": false, - "hash": "e67fc66bffe979913a3bc509753fc4ed0b75f1a00278d156d85599a555117fcf", - "index": 1 - }, - "script": "4830450220075ef5b983af4dcd467e0f473ca9fe50d97d40934dc4bf698bce56509eb30cdf022100efa55744a1405891f2f1bc66ed8f6b7ecc3b9628d1c595f343265185539217ef01210274ebe164c6ad24bc7665e2a2bc702fa7c0f1c781eb979819e4752e6ff3a216c7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 75300000, - "script": "76a914a3f275ffdf4b8827ba03179d4727f9b595096c6288ac" - }, - { - "value": 20210000, - "script": "76a914b7a4d08d690909dc7fa7b48ea01b9bb97dbef82388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3ae96ed7dcf039b0f99e4a1412cfcf173ca9a402bb83b2a5dba8063a41231076", - "witnessHash": "3ae96ed7dcf039b0f99e4a1412cfcf173ca9a402bb83b2a5dba8063a41231076", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 135, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c1ea2749b5867344ce95995296a4fff0e73b70f81920e4575ccf0d55009cdbcc", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 590000, - "script": "76a91486bee458d3d0ceaec4616c0852c1c403754ff1f688ac", - "coinbase": false, - "hash": "c1ea2749b5867344ce95995296a4fff0e73b70f81920e4575ccf0d55009cdbcc", - "index": 1 - }, - "script": "483045022100c99c61da118ee7501d213f2d0fc4d4fcccf8d22ff68067ecd15840e9010f2cf402201d87e325e967c74b63a879bb6e31a6c06766250574e9003e16e9b88c4ed1cea7012102feb0014d4cb9cce60041f6b7acae26f1a61b66efff58fe884c2306e1c74e8c41", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 80000, - "script": "76a914481abefcdee6df84d9452b866dbe1cb696574c7088ac" - }, - { - "value": 500000, - "script": "76a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0d94d164917712d1662110688eac29016529418acdc21e2898e491f91c203646", - "witnessHash": "0d94d164917712d1662110688eac29016529418acdc21e2898e491f91c203646", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 136, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fa13f147973991d7ba3b47997f37b2e6abca3689d1b138789bd47086002f7390", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 26363113, - "script": "76a91433171aa816b018a57f90ee0a4d25208a0737b36988ac", - "coinbase": false, - "hash": "fa13f147973991d7ba3b47997f37b2e6abca3689d1b138789bd47086002f7390", - "index": 1 - }, - "script": "483045022100b1b3dad174bbf04e4a15fcb3c6454ee383899e2440779893dfbf657935008ba902200568d15b51154a01e5f795ba4c0b6ed615908ab166d211e46e9fca04df075375012102d525f952cb91dfd479113e70cc5294947cded6724edcdef4e04adab8d4642a3d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1653113, - "script": "76a914d1730be8ac0a7f0a9410604560de8556f4bb1f6188ac" - }, - { - "value": 24700000, - "script": "76a914e09c0218f6d09c0773c8fb91097105d1622b3e0888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cf4cc8654d4fc0b4f1d1c01c1535f1a91197a0cbeffcebda665819cd5603e02c", - "witnessHash": "cf4cc8654d4fc0b4f1d1c01c1535f1a91197a0cbeffcebda665819cd5603e02c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 137, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "50ee9c8a6ec58473192a88262dfbc0ba8ccd0d56c621e79963adf7da8f485002", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 60793935, - "script": "76a914979bc4e42171994868616577179e391c0be0c21d88ac", - "coinbase": false, - "hash": "50ee9c8a6ec58473192a88262dfbc0ba8ccd0d56c621e79963adf7da8f485002", - "index": 1 - }, - "script": "483045022100eee931a2761ce6d26c42eba8ec702d54b44df6d520a746a2c6a0a1e5b8d7c30f02206c910068a7c21dd795591aa41049902dd4b6d219a97aa7599dd8d87cfd0a040e0121035671f00704f53da4859708e0a25a44ee542f4d3852561d2a935387045ed2474c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 48052268, - "script": "76a9142b515b36dd33b1f9e8513cf175e2ee7a17a2bc5888ac" - }, - { - "value": 12731667, - "script": "76a914c6d35f91f55fb689a852fd23a11818a2ffa50ba388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4ae24fad4d93596ed26857553bbb4b5f09cc6be644e02478f484665f87a61408", - "witnessHash": "4ae24fad4d93596ed26857553bbb4b5f09cc6be644e02478f484665f87a61408", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 138, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b880048c3dcc549b977b81c33b55efa0fe0b74bcf1c8e38035c8a0afc89874c5", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 88687437, - "script": "76a91445b22f0ed074e0f86a3f0c51f76e5b1fa73467ef88ac", - "coinbase": false, - "hash": "b880048c3dcc549b977b81c33b55efa0fe0b74bcf1c8e38035c8a0afc89874c5", - "index": 0 - }, - "script": "48304502210081acb424a99cc743d87c6af77d3ae204c9b3a2cae9c0ed7853c5cd6c63120e510220271cd5655c06593e35c4c8c45da08555a5cfda11ba011c4d5d80bb4936cbe2b80121032e20fa42f35a05b14cd29d3ca490521949a01675f57f453e52bd232dffe65b56", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 88526437, - "script": "76a914ba4278c622e3300df7da3ab66954e1122bd066d588ac" - }, - { - "value": 151000, - "script": "76a9145c84ebab10bdf995178e972e5aac94c6b1c5405688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "36f2aaa5964739ab2e7ddbb2bfe90a667497efc83817bebb72890063b8e5fa91", - "witnessHash": "36f2aaa5964739ab2e7ddbb2bfe90a667497efc83817bebb72890063b8e5fa91", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 139, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3e5749e6889c19b82d88f4aef9b04fcb2abbed892d473f09b4f41733fb7b93f4", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300001, - "value": 3570000, - "script": "76a91423c3bc0b201fb102a802e93ff157308765178e8588ac", - "coinbase": false, - "hash": "3e5749e6889c19b82d88f4aef9b04fcb2abbed892d473f09b4f41733fb7b93f4", - "index": 0 - }, - "script": "48304502210088a2811dccd55fbb1ea01a29f1b9cffb24d603530b1de40754eed98d464cc56f0220227946c32ef83247f0b22d7bdb0fe201f9636d382ec455dc275ace83cb1d99790121022e1e13314814ac9218c6ab5b2fe4f3929ede4205add2aee252a736e653f311a8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2410000, - "script": "76a9146b7eab61fcddc4e502ecd3225b793298ca6acd5788ac" - }, - { - "value": 1150000, - "script": "76a914336e756adadb1c91d2db6b7e26a2102109cd043d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2ece7092942c6a30939eefda9ff3f68db838b5cc2d9bc2ecd015ee2b3c17bcfc", - "witnessHash": "2ece7092942c6a30939eefda9ff3f68db838b5cc2d9bc2ecd015ee2b3c17bcfc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 140, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "12c69c3dfcadbcf29f3fbe8e1a207fbfa8f87eb3f26bfc2026f35f6c7c001ee4", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 38091480, - "script": "76a9140ae06ad4d415bf488f669ef56297b931eaaa9efa88ac", - "coinbase": false, - "hash": "12c69c3dfcadbcf29f3fbe8e1a207fbfa8f87eb3f26bfc2026f35f6c7c001ee4", - "index": 0 - }, - "script": "483045022100c9f66968bbeafbf063ac5cf45bec5331f403f4673872a2e4ae198447ea6a02d002202d74760bfdbad767837b2258dc805c442733fb3c15069974cca054fb3eb80278012103d597082c4fc9ffa1f74a423a78d9cce0001f17cf88a353d9b717932feceaeb94", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8800000, - "script": "76a91401f6a525989d766b4a0ed8838c7912bc2131d04a88ac" - }, - { - "value": 29281480, - "script": "76a914a2cc2ebeb9b6c8f32ba5d6d23420c4c61dd1e51588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3658036b9851d286a0581ff84e7fa6599669c0fcd08c92c4ff04a5de28b79015", - "witnessHash": "3658036b9851d286a0581ff84e7fa6599669c0fcd08c92c4ff04a5de28b79015", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 141, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "af3e971d70181e802c76b542392d7c0c05f75596a83f537e76e55b7110fe4882", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300022, - "value": 21000000, - "script": "76a914fe33af9594d43e1c16f1b382c9ac55b60c46d96688ac", - "coinbase": false, - "hash": "af3e971d70181e802c76b542392d7c0c05f75596a83f537e76e55b7110fe4882", - "index": 1 - }, - "script": "483045022100d144909357554842622ebde9d2a19fb0bc53bc1850d545a8144cfdf70114542d02204c0bfc7cd0e5d077e0e3656f8f47e63cc20c3c4872c316a506d18aedb0331f380121037de6056f075d3970281f4241de4045e880c4ab5af575b51ad9eca7e2ed1d3740", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11174682, - "script": "76a914c3a4ff9650ba537db1da2828babb6b7ae52f982a88ac" - }, - { - "value": 9815318, - "script": "76a9146e504490c8329a11e4a26afb4f530a1b98d5ee5388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "419ac9f292ad6d981f143ba747826d33ad03b626c3da0fa26bbf259096cb8ff9", - "witnessHash": "419ac9f292ad6d981f143ba747826d33ad03b626c3da0fa26bbf259096cb8ff9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 142, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0cad24e768ba049aac88cf1203571527711e84a46d41398a0867ea7f9deb0b63", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 29100000, - "script": "76a9148b7d7a6b579fadf4d26316915b063ae39a3e088288ac", - "coinbase": false, - "hash": "0cad24e768ba049aac88cf1203571527711e84a46d41398a0867ea7f9deb0b63", - "index": 0 - }, - "script": "483045022100e33485b974166e9139a5a6624f6359fc01769f9ad78d5bf4937c2568669685ea022036bb410e5fbba5ca2f996ed0ede2256c14ab6344c23816a9f428f72bb0e30b7301210314de589faa38054bb7845f0100f097fa49ffc75ceffd428970e5b06daf768ef4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 28940000, - "script": "76a9144721c8368148f17a251227ad9d31ca2f264d4c4c88ac" - }, - { - "value": 150000, - "script": "76a9145c84ebab10bdf995178e972e5aac94c6b1c5405688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7c9f88910e511cb6414351bfeadea40cfd68d9176679732845ac7afab7462cd8", - "witnessHash": "7c9f88910e511cb6414351bfeadea40cfd68d9176679732845ac7afab7462cd8", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 143, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "91bf065d7d19d4b0ef80d176995af9da89fcd23ccc749b6b4faf432570e7b739", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 8904376, - "script": "76a9143c19c149c129849d4b7ec62bcbd6dbcc663eedc788ac", - "coinbase": false, - "hash": "91bf065d7d19d4b0ef80d176995af9da89fcd23ccc749b6b4faf432570e7b739", - "index": 1 - }, - "script": "483045022100989dc049381c96bc9c945c4621e9b57956175d27ca36af90a18681fea20d50b7022052447d27932f8aa8efd13ab80381e7bca6cb72f404b36e4d2d28bb29a13ce9c1012103636d22c90d49b63fe925d6b96310d152f9ddeb30b6889dc55936351c84ca3e4f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1006560, - "script": "76a9145f2893e207f963ba4d0144384891cfe290c2d43988ac" - }, - { - "value": 7887816, - "script": "76a9147554f3876b5a13227e2acb68a25f133c1b0134dd88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "61efbf3fb97d849909b0d2fdd9e75da87d5cb94e7725d2f9f00c4825600898af", - "witnessHash": "61efbf3fb97d849909b0d2fdd9e75da87d5cb94e7725d2f9f00c4825600898af", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 144, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "36286f72da6f3c77c5eab676fc24836008b76d2243f5fe3f4865c5995f72295a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 46296643, - "script": "76a914281f87b3e2397339fe269d825adeb4e3bc4c2eb688ac", - "coinbase": false, - "hash": "36286f72da6f3c77c5eab676fc24836008b76d2243f5fe3f4865c5995f72295a", - "index": 1 - }, - "script": "48304502210080c35b0cbdbd44afadae10dea4c8c7549a33627dc5715e3f337cbc93e683410b02203b120cc2d42735aff407d2ffa360c28c0f1d9f604ca55a8aacd39dae95df12cd012103cb2d0a288c1f6a0588517193fe64847c06c309339d0d35f2243168b54641be98", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 44507393, - "script": "76a914cfe7261893c4a22d71db113ec35983c50e11265f88ac" - }, - { - "value": 1779250, - "script": "76a914d49928dcea3d6c6cde622fabcff1255b49b7793788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1fd1ad9b1d533fa11ab9c51e2f3bc0417ac742f6106b991d9a21d81f256e7e2b", - "witnessHash": "1fd1ad9b1d533fa11ab9c51e2f3bc0417ac742f6106b991d9a21d81f256e7e2b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 145, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f8becc3d1c00c2936d09cc5a96da2a86fe65b44ecbfeb4ee8cc6f5513893207a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 30578286, - "script": "76a91474236215830a9c61a7067d2df0b7d91f2431d0a988ac", - "coinbase": false, - "hash": "f8becc3d1c00c2936d09cc5a96da2a86fe65b44ecbfeb4ee8cc6f5513893207a", - "index": 0 - }, - "script": "483045022100ff335e36237a5d3e61c7ef1b7b4250a9369ef398f6692e6db6c95498b940623602206ce773d0449f135df4ce0e9199b77270c4b52fdbf07af4162f20bd360b9c6a80012102641b8b286fb6b836bbe93dc573baebfa7a5aeb8be19262e662c3db39cf847241", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7408286, - "script": "76a914f27c378a9bc367241f582b59506d43e4263df30d88ac" - }, - { - "value": 23160000, - "script": "76a914e231abfc1ef1474431019d9854f1ff2c2b0d315a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d2681ab0e00f8d62081e141eb5c7a36a371f861399205d785afae1b4e07f25cf", - "witnessHash": "d2681ab0e00f8d62081e141eb5c7a36a371f861399205d785afae1b4e07f25cf", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 146, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "19dab3dda7df3ad1d1f6e5951c519208826e0bdce9ec8549345b38c7f1861772", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1996028, - "script": "76a914dec45e657b24c5cb4417bf6b1adbc466677d968d88ac", - "coinbase": false, - "hash": "19dab3dda7df3ad1d1f6e5951c519208826e0bdce9ec8549345b38c7f1861772", - "index": 1 - }, - "script": "483045022100c1350217c0c13378b8b8ced315b911a4777a98c8465885d44e4cf630b3fe907a0220208f371bb1b83554eb7aa3d94c4778518e09dc12e8cea30873a979bc708f72650121038bce75485d1035cd29e56ae5cedfb2c2bfb44c3037793a622ed231fbddd3f59f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1895351, - "script": "76a9149bf549bbe4f62b0fa6b299ef152d600543920d0088ac" - }, - { - "value": 90677, - "script": "76a91493b80f661275a0e703e6371ea3a9ecf3fdb0756388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "62b3c3a2f4ee940432f367a331eb550006740f510d880afee901bb5e7ef48ac4", - "witnessHash": "62b3c3a2f4ee940432f367a331eb550006740f510d880afee901bb5e7ef48ac4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 147, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "04799828f3fb982473b40d5d6010112324974c8fe2e34de84ce3cecc77536dc1", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1900000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac", - "coinbase": false, - "hash": "04799828f3fb982473b40d5d6010112324974c8fe2e34de84ce3cecc77536dc1", - "index": 0 - }, - "script": "4830450221008a950eb32132c1967eb4b9a25f46e47578cc2661101f83d7aa5f2c332d979be002201cf8cf33c344be02a74f31bba0bb1061b2663923b33e57055d781c79fe50a453012103082934de52ac6d2d5f0806d5ad5bd240e7733d75952d2cb06ba4b782ca4ed0d6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1880000, - "script": "76a914fb2cc2d580e8db8440810e9f4ba58ea8f86b59a188ac" - }, - { - "value": 10000, - "script": "76a91447166ecf28460655d16d401dfa58da60b128128a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "77b43a0392931916e1c2c023e7ebdff1a15ebc384b045495be377d60224699df", - "witnessHash": "77b43a0392931916e1c2c023e7ebdff1a15ebc384b045495be377d60224699df", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 148, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "43b1c759dfc954b49ed6d5a34e11d46d4d13c5a0a33cfc699d9dc1f37d273b7d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 807570, - "script": "76a914c23907eeb94622657f37cf60f79dd2c64a364a5a88ac", - "coinbase": false, - "hash": "43b1c759dfc954b49ed6d5a34e11d46d4d13c5a0a33cfc699d9dc1f37d273b7d", - "index": 1 - }, - "script": "483045022100f2b064ad5e12f43d95916c13b6b3ac4ac1e8ab9323bf9ad12541fb08e2cecf1f02204b462bbb478909ef5cbf023563e09629c8b3c697ecb9c1f5e5eb9247624646c1012103a664dd4c8d0e04702a6ef31416104884bbbfcae2e0e931a07bd5a7261b4291db", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 775450, - "script": "76a914105cd2a16e9d91e19607ea9f005192a3a5c7b24488ac" - }, - { - "value": 22120, - "script": "76a914adf238c3e7a11784a44c7fce46ab9b483a61267a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "490b92a7fa735e433c89a3bc928b65d6192b403a2e96c5b6baed428b773a1f76", - "witnessHash": "490b92a7fa735e433c89a3bc928b65d6192b403a2e96c5b6baed428b773a1f76", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 149, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0ff72c71ba007359c24cf2f26f6ed9263a5037cfc06707f6d881aa6895922b06", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 700000, - "script": "76a9142f3fcdd0d9f2f5203cacded82512902d58f656cf88ac", - "coinbase": false, - "hash": "0ff72c71ba007359c24cf2f26f6ed9263a5037cfc06707f6d881aa6895922b06", - "index": 0 - }, - "script": "483045022100d131b2d8c489b1a4393c8d74bff0775ca5a8d19a96c0b3e2584140f50900ff5e02202b25e4dd1e9e8893092f3322102eefe7a1dbf68e2f570fb45a380d7e18bdd81301210273f874ebd89d0e3bca6cecdad337ea534a86f871a9292b3fed96aba302b3a217", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a914e303eaaeeaf1b833841b51330b7199ade383511e88ac" - }, - { - "value": 590000, - "script": "76a9142f3fcdd0d9f2f5203cacded82512902d58f656cf88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5a2fbbc003daeae5816fc2d47261f48a4fd8ccca9f15913e5c33b3a16dc7dd12", - "witnessHash": "5a2fbbc003daeae5816fc2d47261f48a4fd8ccca9f15913e5c33b3a16dc7dd12", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 150, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f725c8db39a2724095db54b75a038d6c660d82596c004305692179dda1924287", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 495857, - "script": "76a914f49dd072583255ec00e81b621a2e7a2eb338028088ac", - "coinbase": false, - "hash": "f725c8db39a2724095db54b75a038d6c660d82596c004305692179dda1924287", - "index": 1 - }, - "script": "483045022100b12afcf7987b713715bfeda13aaa2a784b6c4d6f594f4f6419aacaa1c89a9fe102200e9be3c76d2417f7039835e01fda4afc56bcdeb7719b143d3c1f7699ef725d49012102a80e273aee387e15f52e72cd970206b9f76cff166117e3eed335945cd7743d47", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 212400, - "script": "76a9141a1c313aa0b15d36a4eb60114e618b334857959388ac" - }, - { - "value": 273457, - "script": "76a914443486909ed6ae071b5437cd153dd6a14c6c143e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4a3ac6451164cc8329f3c1a7212d87b38ea098db1774572447ccc74a005e4067", - "witnessHash": "4a3ac6451164cc8329f3c1a7212d87b38ea098db1774572447ccc74a005e4067", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 151, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "332ff53505ed943d8e4561d40561ec7d0c96cd27a8aded0f126c05ebdf532dd1", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1055372884, - "script": "76a9141e3b2f1b6824921e7225db75c7ec56d627690d5388ac", - "coinbase": false, - "hash": "332ff53505ed943d8e4561d40561ec7d0c96cd27a8aded0f126c05ebdf532dd1", - "index": 0 - }, - "script": "483045022100be7d533a539d358bb6aa90878d94383e2417ccae547cf35d64952401350e768c02202983344076e454795214c6c2985430db471b4a4cdac25e22bac8d0921d8e3d4a01210290a9f35f79d3995eedf67ddff8034cdc348f471411bb41f555f6271690430890", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1050501974, - "script": "76a91405f91aadc4f58e2302a5f7ffdfa3eb78dd747a4688ac" - }, - { - "value": 4860910, - "script": "76a9140e6a688db0c439633d237a221898c241ae3aed7888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "305fc353044744ecdd266ff873f779a814f77eaa071b54ae276b5bb6af1b4807", - "witnessHash": "305fc353044744ecdd266ff873f779a814f77eaa071b54ae276b5bb6af1b4807", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 152, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "88db7a1cb1f1620b83e62f72ed9cff9a8ccffa9c22dafd5dacc3f62a6f6b226a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 99990000, - "script": "76a914a55ad4f5a3c3c039d06f0212cd7e4adfeeb6577c88ac", - "coinbase": false, - "hash": "88db7a1cb1f1620b83e62f72ed9cff9a8ccffa9c22dafd5dacc3f62a6f6b226a", - "index": 1 - }, - "script": "483045022100bb6aa3a3d27ef61b8b666cc0e8758643188d44274906e5fb436caed0444deca102203076505bacf68fba1d29244bce720609de8945625f97a4f4464cc1338f96b79b012102f5b3a0fbfd938fceb56afbf1b74b3a09be84563aef7dcd7a6c000761297c5f3e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 50000000, - "script": "76a9142c69cf8cb7d7c852a51628be57cf4a15b8e6a7ab88ac" - }, - { - "value": 49980000, - "script": "76a914a55ad4f5a3c3c039d06f0212cd7e4adfeeb6577c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5205823f8e9a134eb808b54bab41c21fe927847ce63cfd9b31de3c5bccdb9966", - "witnessHash": "5205823f8e9a134eb808b54bab41c21fe927847ce63cfd9b31de3c5bccdb9966", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 153, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "de7af49dacf0e9f40a9f5fd3ffa198bfbd267516eb3fdd1be6fb5b46381e1dfc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299905, - "value": 600000000, - "script": "76a914569e37008501ddc6dc9830800c204aaf12354c9b88ac", - "coinbase": false, - "hash": "de7af49dacf0e9f40a9f5fd3ffa198bfbd267516eb3fdd1be6fb5b46381e1dfc", - "index": 0 - }, - "script": "493046022100d3cb68657016c71404aa71e00a1e7547c31cf2066de5d23aed6bc3ad70743aa1022100c6119a41ae7b92a35824691c76864e22dc96061675e5edc67b53d39c175438500121031fe74df1604fdbfa1609f1262e4423a0adb63dfa217e7a6c82f87ea23f440f79", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 316000000, - "script": "76a914514b3f79cac29fb30dc152ffc778b5ba45fbae8e88ac" - }, - { - "value": 283990000, - "script": "76a914569e37008501ddc6dc9830800c204aaf12354c9b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "62827bf546cc3eabd9515eb640af57ef9ab73b6c5ac91858def9e18659cc7e81", - "witnessHash": "62827bf546cc3eabd9515eb640af57ef9ab73b6c5ac91858def9e18659cc7e81", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 154, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5102e561f82e66480c3a2e7c0217d5b2234225dd81936db5f471bc65aa6e8bb7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299951, - "value": 273900000, - "script": "76a91469a74ebebb4e803b03b18ad9a06e8f18de65051488ac", - "coinbase": false, - "hash": "5102e561f82e66480c3a2e7c0217d5b2234225dd81936db5f471bc65aa6e8bb7", - "index": 0 - }, - "script": "4930460221009ddb3effe0f278b69c41eb6a579ada7964b270ecfa2e81258a759c97d7bf0782022100992e4062fb694b3945966874957f3b7e5bdacb73071cf01f53bd86b435073255012102ed86ea5a6271daf8909c75d506dffcc716ec6f4616826a6feccb07b96249186a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 271337000, - "script": "76a914a7ba4217423b24b02c624588c61ab02a351439c888ac" - }, - { - "value": 2553000, - "script": "76a9144aca662eb3cbe6b2a993aea766f67e0aca60878f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d72c504ab4488e4d7ff6f773951fe4a6e079b3637a7a1d64d05d3bf6486dd253", - "witnessHash": "d72c504ab4488e4d7ff6f773951fe4a6e079b3637a7a1d64d05d3bf6486dd253", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 155, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0dd0130ef3c085d83d31c89ebca1b13d552fe7767b0468d468c266c1b48b5a2c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1252517000, - "script": "76a914ed275a32136c0df70e1f77e4f148e6325959c0c088ac", - "coinbase": false, - "hash": "0dd0130ef3c085d83d31c89ebca1b13d552fe7767b0468d468c266c1b48b5a2c", - "index": 1 - }, - "script": "493046022100e3441c8835368120c0af4a887d415f6591a6c23d1db59985451d0bf772878505022100847c99eafd00af601770fafa272fb2058d378902188774a120e64fe9d8a226ea0121029fd45bf29e4611a7f491beec129b48ae052d95f467dbfe85d3b90a26553cb579", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 14195000, - "script": "76a9147ca579ce6ba48f336ab70e5257b475a7fac1a4b588ac" - }, - { - "value": 1238312000, - "script": "76a914cf68471b2e5f3d3941daf946f8d2780f76e36c8a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "974aa1bd33693d8f8188a9a855d964ee9208165226e67ed449aeceef864e4c0a", - "witnessHash": "974aa1bd33693d8f8188a9a855d964ee9208165226e67ed449aeceef864e4c0a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 156, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6ad5464c0fc5f5387b2def24ded155c2880e56a8223b9d04a1078c30b7fde8e0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299768, - "value": 6148600, - "script": "76a914aa214989add45bf61b1231c057987f8a634a476b88ac", - "coinbase": false, - "hash": "6ad5464c0fc5f5387b2def24ded155c2880e56a8223b9d04a1078c30b7fde8e0", - "index": 1 - }, - "script": "493046022100d20e7239b228b162170725ae382bda504556ba3d629e3255ab9b301a94357bbf022100f3b96b40735da40c4d8afd6912970d75d677c8edc8a97014790854102da44d50012102eb589b2d02e9c47434fd0b90255d4cba3d7c971eb2569a72ff4c1e6920b8758c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3697200, - "script": "76a914dc1fa3cc6d966f249db94ce7d206d6b10b2e975288ac" - }, - { - "value": 2441400, - "script": "76a91419923565ddd46e8b6a5fd4cabaabaec40bab2a1788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "de1a8d84b9c425f7191cb734b3f0be18acb8afcb7dff7b5bdc91effee19ff646", - "witnessHash": "de1a8d84b9c425f7191cb734b3f0be18acb8afcb7dff7b5bdc91effee19ff646", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 157, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c9a888edfa39b0a7b6ba9f7c89971bf2650e5f33081c3c96a8ea863405958b38", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299892, - "value": 1240000, - "script": "76a914aa5ba3f1b5fcd61d8209297ea58123d0bbec9a6788ac", - "coinbase": false, - "hash": "c9a888edfa39b0a7b6ba9f7c89971bf2650e5f33081c3c96a8ea863405958b38", - "index": 0 - }, - "script": "4930460221008f8e21d097b8c9cbca7abf54e4fe1763fa73699bdda280f54978c18579db2300022100c2117dbc86d75d3e0322ecff86eb3911f6bf7b9afd57664de9373d809eabf96b012103b6d06ed95e7ed35d15ceba838f7d20d498a33e74f158c1230ec7cabd58452178", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 30000, - "script": "76a91440abf94ab4e4de52c88e4abd0b150b1ace4cfe9288ac" - }, - { - "value": 1200000, - "script": "76a9140fa393ca4a27c497611d404e707f60c2efea25fe88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "111a6b5b711b7937de6d7e861aeee54f26b8e78d8cc6ae2051e8bd75b7601c18", - "witnessHash": "111a6b5b711b7937de6d7e861aeee54f26b8e78d8cc6ae2051e8bd75b7601c18", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 158, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "82f1e01432c16da6c7d5bbdf45e8c9074089550d3e7c5d054f61cb078f1bdb9a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 7720000, - "script": "76a914875cd5faa8ebec5fe04fe1ef5c5c155d0171fa4f88ac", - "coinbase": false, - "hash": "82f1e01432c16da6c7d5bbdf45e8c9074089550d3e7c5d054f61cb078f1bdb9a", - "index": 0 - }, - "script": "493046022100c64dc9440d9597e121342fdfac4244110207319edaf4ded38fb479e8803ae986022100d8b9fd756a4693adf364eeb119b3a203ae2f300f5b94a91be10d390b149895aa012103316929d1d51c9f1533b68103f1f4c3874f5f426bfd69d28ffca5527689c97256", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1220000, - "script": "76a9146471610bd893181e954c40fcf619b8c4e1408fd588ac" - }, - { - "value": 6490000, - "script": "76a914917b759dc4077dcaa9f2a86fc7e7444c55c3d63888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "780944f54c90fe00886f0bbd358376a9de2a57c87716da03f60a942d5daecd13", - "witnessHash": "780944f54c90fe00886f0bbd358376a9de2a57c87716da03f60a942d5daecd13", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 159, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8d4daa22c002f63d5033a2366281dff09c05210359bedf81c08049a9484132ac", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 55318444, - "script": "76a91417139b8a0ab9e3553bcc8dfcc2a5061129b9d29988ac", - "coinbase": false, - "hash": "8d4daa22c002f63d5033a2366281dff09c05210359bedf81c08049a9484132ac", - "index": 1 - }, - "script": "4930460221009997e7347c77e35f7e25f2115f9a23c88326f61f215cf30a7a8accaa4c099feb0221009cdcd904a7c26719962f7652da2d8e83a2ffbdd6c14f780575b19904bbe01b650121024edc8447ce2f5a4b946d350a972587f16a751bb8def369102ba51359c44e3458", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 30808444, - "script": "76a914dc12287b41c4fd36733e758426a8209644b1e93988ac" - }, - { - "value": 24500000, - "script": "76a9148b33f9706422a40b5c2f30820a806c5f1063af7f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e30fbf462de5f4f8840caec49d208ed4a86e18ce2a0b0b15c48dcf9291332417", - "witnessHash": "e30fbf462de5f4f8840caec49d208ed4a86e18ce2a0b0b15c48dcf9291332417", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 160, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "af85dede2ad33f3eb61d88e2d4e4cd5e1971985e55a6ddb4f2000c62b4c98ed7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 43212404, - "script": "76a91406eb8d6259cf63a794f14244399a023a6913c1d688ac", - "coinbase": false, - "hash": "af85dede2ad33f3eb61d88e2d4e4cd5e1971985e55a6ddb4f2000c62b4c98ed7", - "index": 0 - }, - "script": "493046022100b54d0856455fafd2cc1f748cae5d4ae74d4f85842f0aefb10f90c022ce7e17a8022100e584dc884600f5ec674ca512e735f01693f8307ce8c5b3b07b217bb72a595cb101210384aeb2206296701df1deef11660b870e2e202ac40ea8d49515d3db0965df7e3f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 652913, - "script": "76a91486a116e177b17184f7b599ae4d1c2d2d3a10271488ac" - }, - { - "value": 42549491, - "script": "76a914dfa2c032c0591ff92212e00270950e8aef4b9eb488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fa4aa69f8a65b901e62b2e01a6e7bce7a30645c4f7b9206c744918b153f7a1ba", - "witnessHash": "fa4aa69f8a65b901e62b2e01a6e7bce7a30645c4f7b9206c744918b153f7a1ba", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 161, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fd2a8429137a8e08b48936538a7445499fa98e13a955cbb082efdcef08550ec9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 35690000, - "script": "76a9142b3a3ab6065de594fd0e4b99fcf214abc4c7a00988ac", - "coinbase": false, - "hash": "fd2a8429137a8e08b48936538a7445499fa98e13a955cbb082efdcef08550ec9", - "index": 1 - }, - "script": "493046022100f2809c1882bf0aae5fad23a1c155271843176143f8da8492b72e92789796fbc60221008df1f6236a5cbf8734b49a424e3ac9a7ccf32610155fa7e2b2bbed0c52487f8c0121037c833d3fe3363ea1ed7e3a3d01f5143ab4a2d02ff0a204d6328c9aa5781744cf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 13436715, - "script": "76a914ca76510afee7d4277915839a2979454df70c57d988ac" - }, - { - "value": 22243285, - "script": "76a9142b3a3ab6065de594fd0e4b99fcf214abc4c7a00988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2c08540c8470b6e4c25c7c2f907f0f88949d2b8e3c7b2504f90f421b20ca1035", - "witnessHash": "2c08540c8470b6e4c25c7c2f907f0f88949d2b8e3c7b2504f90f421b20ca1035", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 162, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "aae42250a170a85bdaef6f487ac16942908b0cd3fd7d2f091d453b7def0f20f9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1536343, - "script": "76a9149191c7262b8d144940d223b9ab81998656f3a91388ac", - "coinbase": false, - "hash": "aae42250a170a85bdaef6f487ac16942908b0cd3fd7d2f091d453b7def0f20f9", - "index": 1 - }, - "script": "493046022100af2ee7ba67cad751adfe4cb23c7af76434461d7dc4c5193bd7e890e4fe6c371b022100aa3e04e87aaa70e7209cae6a0b144421b08b8b607778ded2fb79898f818860920121028da941ed50d6bf3e7c8ca3b5a75921c980d5dcce123a397be88f0bace6a0fe64", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 503712, - "script": "76a91470d1d8f04ba6095134d30085963c438d73a315fe88ac" - }, - { - "value": 1022631, - "script": "76a9142c50c7d5c92cf406586cf6954aae00528570fe1088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1ba9cc851eac434b0b49e3e1d86f2a37655984027de510e88a863aa5cfed88b9", - "witnessHash": "1ba9cc851eac434b0b49e3e1d86f2a37655984027de510e88a863aa5cfed88b9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 163, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6a35e64848fe1e1e648d9e807be052dd7c2961fa0f0b5c5cc67cc30a661f999b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 97580020148, - "script": "76a91447c141e9c8e692e2b2bb8e598ce59dc3694e0e2788ac", - "coinbase": false, - "hash": "6a35e64848fe1e1e648d9e807be052dd7c2961fa0f0b5c5cc67cc30a661f999b", - "index": 1 - }, - "script": "493046022100cb37a5a6c53622c5cfacff9da6abd956a34ec78a559f90144e9180737afd20ee0221009fabe4ade9952ef77ec02facac7f5801dbca2e2b8c603b64bbba30695a4fbd450121035ebb27cb89175660375aef79f7ee6c1cf6116334739a2fc119178e8975e9d672", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 95580010148, - "script": "76a9147bec7721ae1fddc2e8436905fe977583b006174588ac" - }, - { - "value": 2000000000, - "script": "76a9141c1191d0690843511f0a014a8d2d42b1a3d9835588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f13bb8680c8e11b04d4be6f370d7db0ffcdab6be951d9fa934efde0dd7ba4ce4", - "witnessHash": "f13bb8680c8e11b04d4be6f370d7db0ffcdab6be951d9fa934efde0dd7ba4ce4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 164, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1ba9cc851eac434b0b49e3e1d86f2a37655984027de510e88a863aa5cfed88b9", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 95580010148, - "script": "76a9147bec7721ae1fddc2e8436905fe977583b006174588ac", - "coinbase": false, - "hash": "1ba9cc851eac434b0b49e3e1d86f2a37655984027de510e88a863aa5cfed88b9", - "index": 0 - }, - "script": "4830450221009b865d136b0f846413178024a0b1ead742cd3805b474d4aa2152b8a0d917a335022067036d175164d91529a50b75e6725a8eb3462d166a573fe145696a5e2d2aff97012102ebef2679791fe99b8fddeb09f8017120ae7f1a99d0f54d85f21e836b28a58bce", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 104000000, - "script": "76a9149485d636997ec22b79d4b53862a66bb713bdc9c388ac" - }, - { - "value": 95476000148, - "script": "76a9144c60619e6b007c15d86b298a4788a5050a93af5d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "14d50f114e8a7e0bc96f5457988a93a2dde60d79e752495192c14a9678aa2666", - "witnessHash": "14d50f114e8a7e0bc96f5457988a93a2dde60d79e752495192c14a9678aa2666", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 165, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f13bb8680c8e11b04d4be6f370d7db0ffcdab6be951d9fa934efde0dd7ba4ce4", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 95476000148, - "script": "76a9144c60619e6b007c15d86b298a4788a5050a93af5d88ac", - "coinbase": false, - "hash": "f13bb8680c8e11b04d4be6f370d7db0ffcdab6be951d9fa934efde0dd7ba4ce4", - "index": 1 - }, - "script": "4830450220196cdc3ff663074fbb111d1e88ea989c52319c29030ce3ff1f1247a80c41602c022100a021a88c0a5a36abbff9099583b12b76affbbe2042f83ef300b8f7b190323488012103d2f0307d0ff49c4982c3b8adc0ab14ae9b4c33a79845d297cffb0a3e73fd197f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 299990000, - "script": "76a914fa31576f07f2dfbeb0d68110a90dfaa311f825fd88ac" - }, - { - "value": 95176000148, - "script": "76a914b5a361d5b7c2c85acd9c4a26d186b0302efc381488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8e429f0d879876de8b62813db629da716bac75490871828ea218fad0f655a3f7", - "witnessHash": "8e429f0d879876de8b62813db629da716bac75490871828ea218fad0f655a3f7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 166, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6d79db2dad028e20ab90c712b574013e8be7d98b54c64dfc28cc1f3f0248c266", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 6239266, - "script": "76a91460578987b03548f6a244437edab630d2ad3f908488ac", - "coinbase": false, - "hash": "6d79db2dad028e20ab90c712b574013e8be7d98b54c64dfc28cc1f3f0248c266", - "index": 1 - }, - "script": "4730440220034a81d612e64d4b42f88b27c52f69cfd38a8d4dc872271409ea7ce4a48e2e31022018d83aaa19267542de511df1b2b99c626cbbeebc19689eb240f62e47c946550b0141045057d3dc2a1186da3bc808e724ef061688f5cd9e8bb987005b4b0c840b64a2403eaffbd34eeacdcce7aa997b1fc3f24328b6f0107f8f1929dd373e94ef096bf7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a7ba0792aca2cc84d605dd8cce11aa8e48bd35744380f0e18f99dd88e1a2e8fd", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97481, - "script": "76a9142aa5e0285f8b5f2a873c25ce4364bdb42d500c5388ac", - "coinbase": false, - "hash": "a7ba0792aca2cc84d605dd8cce11aa8e48bd35744380f0e18f99dd88e1a2e8fd", - "index": 2 - }, - "script": "4830450221008814ed960ea166604c4b2915ca8f9b6f380604bae61f478d13ce25af9ab97d2c022028da1ae3863524634d05b95952a8e91f7e348513cb68f48aae7304b47733a624014104a756676d2fd5ca068b6afe819d0ceae9d50716b01e64901d947f349c3df8745743509bf0cb854f4bb1f2a22d92441351b283002c39b853ae0945efda9e928114", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4955000, - "script": "76a91424e1d8d03b0ea3a7690dbfc96c6e3775f31d725188ac" - }, - { - "value": 1284266, - "script": "76a914f226e8dff9a53f1a4943a08c5b15ea514e2e767d88ac" - }, - { - "value": 77481, - "script": "76a9148174d6ba948a3ed4d5be61e009e740e16cb355cf88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fc40cec763970ac0255dffbd7889f25fc697f47b6010aacd4ceeb9a4b02bee76", - "witnessHash": "fc40cec763970ac0255dffbd7889f25fc697f47b6010aacd4ceeb9a4b02bee76", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 167, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8e429f0d879876de8b62813db629da716bac75490871828ea218fad0f655a3f7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4955000, - "script": "76a91424e1d8d03b0ea3a7690dbfc96c6e3775f31d725188ac", - "coinbase": false, - "hash": "8e429f0d879876de8b62813db629da716bac75490871828ea218fad0f655a3f7", - "index": 0 - }, - "script": "493046022100bf2c5265c321d19339a748a19533f1a1631242d80fcc3164f91e06f1f5c951ca022100ff5d27faec2d04e778bbcf8e6682521496b2cdfe60eae7ba104bd9b1c684ba75014104ea3f53ebfba1df8d0c62cfc4f167a8d729433465c748c53d67c5a69a5fc7136ae2aa276cb26b853d423103b860b43f8a954357906e14082430b24b68f00c3b43", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e63a786a9525f023efc6d2e975544c84220f2f79030c83d3a60e970188b0a4c1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117481, - "script": "76a91405b34b4619522ceb2087a04ba0df095cb3bced3188ac", - "coinbase": false, - "hash": "e63a786a9525f023efc6d2e975544c84220f2f79030c83d3a60e970188b0a4c1", - "index": 1 - }, - "script": "483045022100a83f1435a33b642b0ba64596f5c487306db435073510645f24bab89e2b102df50220317543f353d45fe831b84813a006044757ff23a1555cb2aff2293d2454f034190141047c5df75596524d59cc4411f136fa36df33f6ec27e8a3e33ee8af52ca48004dd71a90eff1c7b4913110d0630aa2d5d125fc1b10f9b651c086c9ffd1a686b2793d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4955000, - "script": "76a914f06308b64107e7e39d49998dbe383c8a06e70e6488ac" - }, - { - "value": 97481, - "script": "76a914cc64676b92fc9c1598a1db62cf8cb8f3cd0c25ec88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3ad6b54fe2f692224ad3031056601c5e0c1c037efe600823984015b925e0e64a", - "witnessHash": "3ad6b54fe2f692224ad3031056601c5e0c1c037efe600823984015b925e0e64a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 168, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "98b1c8f5d3ca78d5ca27d75b850fcf614e896a7fc4cc971c82891f953f9c8e5d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 200000, - "script": "76a9145d61b24a2bc0312e39252e861677ea12aa60fc0b88ac", - "coinbase": false, - "hash": "98b1c8f5d3ca78d5ca27d75b850fcf614e896a7fc4cc971c82891f953f9c8e5d", - "index": 1 - }, - "script": "47304402201f44759be7667cb33edeeca081fad87507725ec0a13d49ab97ed4cff388e34b60220265619020a759a1d6d17bc15814e70049e7d360d5be47f049bd8916ba6b2fec1014104c63f51bd26a3ffa700b4018e0eb772ee309936bd0443522bdd8860744c6aa456668e17ed7cbbd6c63f734e1e10581bc029ac30225d02b4e81f1b88236909966e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f7cf006b0df42f2d23134391d937bac730fb21b497fe9bda149787959027f453", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299967, - "value": 77480, - "script": "76a91491fee19472cbb758235ed81ad00281ba17d938ef88ac", - "coinbase": false, - "hash": "f7cf006b0df42f2d23134391d937bac730fb21b497fe9bda149787959027f453", - "index": 1 - }, - "script": "483045022100c4586f2789b53a0d6fef68b20dc6ece9bb64e5ad5064ec6f5e1d750e9a87dc36022056bb8e2ff529707e2f56fc5d091019b5d3c889bab6c717a6d06f0d81637e279c014104bdc3ab8f598a623395ba96ed6413b71a13cad2720d7c00861b7f1dea46a682c8c73db59a91d06f16f963ee18f48e0e54fd70d47e522fde8d50df89a3f94adaac", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a9140cb9a131143da025d11203820bf00b1e9f44109788ac" - }, - { - "value": 100000, - "script": "76a9140450cad3a3cd648f583e796602be13c6a27adb5e88ac" - }, - { - "value": 57480, - "script": "76a91479edfeb2f95c270f9361b93cbb9d05cc409159e088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "047e49ee9f942362adda5477846da6a48e60f36dbcc414bae84336f55226ef75", - "witnessHash": "047e49ee9f942362adda5477846da6a48e60f36dbcc414bae84336f55226ef75", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 169, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "519bb09291b940ea2c3ea081f282eeaf9835616b3169e85ecf587061013fb60c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 287062, - "script": "76a914701a45854dd282daee43fb8b46cb384311042ae088ac", - "coinbase": false, - "hash": "519bb09291b940ea2c3ea081f282eeaf9835616b3169e85ecf587061013fb60c", - "index": 1 - }, - "script": "47304402200635ee1fac5fc671f524d23e694bc4eaa82eeb5115c0e42cc03a1bb1a828985202207830872468b146faf6a5a6e2e49eb28e9b717da24141d658873dfbe7cbaac83901410434172fa00f9430580ac42063a36f160ebdcb361456f9e57aa0f9c6a77964dea8d95b91982fb748a15938209260be2f109caa6d2141b0a6a948f8f170df7be1ca", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cd71356ce889ca663db6a17d564e4018bb22c97324c6ee61456f21814ed1f6e0", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77480, - "script": "76a914f6d3614ae980500158bdea58f69bda4a84b227a788ac", - "coinbase": false, - "hash": "cd71356ce889ca663db6a17d564e4018bb22c97324c6ee61456f21814ed1f6e0", - "index": 2 - }, - "script": "4830450221009469208759c414a5da2abe5bbbb2b01e8886e40c0054c2e00c5f9ada4b2d6f5f0220212cc23edeaa3f69760f44f64ef117b94befb18fb59dca0e50155814967b34d4014104bee700a01a3e2d160a15ccf0b5ee5f2674423de2877d09f2e38b0768fcd8feb13c61205b3e01f718f5973756d8aa7fa9afc9cdae0ee4426478fddabe905dd1af", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 276258, - "script": "76a91479a8e358b58e4cf054aba755f0a2116670e4759888ac" - }, - { - "value": 10804, - "script": "76a9148fcc4e4b73ace64e998fa6d1db2f95a7c115ccab88ac" - }, - { - "value": 57480, - "script": "76a9147b25f4d714ac3fd71ae524ad512efad06de64f5b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "663bbd130547efd23a2f4ab153ff95c2dd21ee894a9883d537183935f3b7687a", - "witnessHash": "663bbd130547efd23a2f4ab153ff95c2dd21ee894a9883d537183935f3b7687a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 170, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "048da7b695fb22e071a74eb6e0ae3f469b95fa47178e6a8b67bea7351378998e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297662, - "value": 1222889, - "script": "76a9141e9b5d790c14144608f4c767649e7f47df5e5db188ac", - "coinbase": false, - "hash": "048da7b695fb22e071a74eb6e0ae3f469b95fa47178e6a8b67bea7351378998e", - "index": 1 - }, - "script": "483045022100b8c4e05b68d629f4440cd80e0bd4bb7c71b607b723a7c410d1453ced8267d5e6022046ca307158d5224851e4db473dff72222c1f79563eb9a5908ab9975facf39e5f014104ce198a826962885b8485cc53504031091067c40ac5866626c6e39f4f5098ee2d3ab21a7ff50053566b71e1ca643cfd2e1fbab200d584cf8ec85bb9bb5f0cc38d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "89a04230d2ffa9655c9941662d2397346b7895f7767402bf2023ac33a6cad300", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 97489, - "script": "76a914cd1dcb29f9790961e0c4820c1b9b39fe2ba8829188ac", - "coinbase": false, - "hash": "89a04230d2ffa9655c9941662d2397346b7895f7767402bf2023ac33a6cad300", - "index": 1 - }, - "script": "4830450220742f2aa3bb1d72038eee25fc9db09c1c00d47fbd7b5ece806d2a9b97102da942022100d364d4401ebbc2545285e834e94452bcc1a3bce0aba38071bb2f470580718e75014104e64f818be59ce58f7027e66c9316ea00f4be5042774cce49d08ccc21119cd64620eed87b3009dbd25c8cd765f4714fdfd020b1b14db948dcb204ae840af3dc37", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 220900, - "script": "76a914af7e2fff7fbb590ca337eb5ad9d474d8088fd7a188ac" - }, - { - "value": 1001989, - "script": "76a914910b5f5f67c1f07c08292780654160fc732777c388ac" - }, - { - "value": 77489, - "script": "76a9141528010ec0c52dd3a3113658703b0b45454d84a588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cbe07049cbc0464c55f241df1cf5b5d180c47b4b08d17df1ce80eb6e98cf67dc", - "witnessHash": "cbe07049cbc0464c55f241df1cf5b5d180c47b4b08d17df1ce80eb6e98cf67dc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 171, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f5a075ce61d4d7199874f9d24ea11e7e0ad6a4ddb9aacbd76fea968692f4bf47", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 3358877, - "script": "76a9143fb22b3244967a5467a7298c5edb7b5ceb1acaab88ac", - "coinbase": false, - "hash": "f5a075ce61d4d7199874f9d24ea11e7e0ad6a4ddb9aacbd76fea968692f4bf47", - "index": 1 - }, - "script": "483045022006217d446ff12ea2e62e1ef500cbf01843c4ede9536563d3c4683a4a50edcf39022100e70d9724c604a5470c89df3293beaf3c170033d911f16a97bf7d4b7b21f45a75014104e5ee5ea7d6e03937de56d19a666cb647b08d0269ec24c5280909aceb8ec3d29e9632d6a0df5338812258537f73717d303dd4ece58e18879776e350a7b4d60874", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "61d3c17aabeb275d5a212e9766f4e106f969055c302832f95f6689d99658b43f", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914e1a0ed2b64072bb54e9b0435577c4da28d6000f588ac", - "coinbase": false, - "hash": "61d3c17aabeb275d5a212e9766f4e106f969055c302832f95f6689d99658b43f", - "index": 2 - }, - "script": "4830450220275735346ee69eac1f41130a0a38e5497d219b4493fb11cbff61edd127171c030221008eb7b3c112b4cbf6a6d92c65856db5d00abfdae792ef4863eceac027d89ff0640141046927dd4e5869b8e297d0706ae6968e9b9a3725c53fb15599a2ed17b33ca278ef0f0ed83bbd41ffd993ceee5472e2a5daf1df73302e4bbe79cccede7acc5126ff", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3296000, - "script": "76a914e0546540364035a71e39a6e1ec1ea3673b1ce7f188ac" - }, - { - "value": 62877, - "script": "76a9146589fc8d7acbd4a1945337f1a97c56de03c5fbeb88ac" - }, - { - "value": 117491, - "script": "76a9145b7640cbbe057040e705c14d9861d4f77e64be7188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7203e26ce14b2409f12b47737ccd0b9676b33e4e87cb4526f4493469588cc664", - "witnessHash": "7203e26ce14b2409f12b47737ccd0b9676b33e4e87cb4526f4493469588cc664", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 172, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cbe07049cbc0464c55f241df1cf5b5d180c47b4b08d17df1ce80eb6e98cf67dc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3296000, - "script": "76a914e0546540364035a71e39a6e1ec1ea3673b1ce7f188ac", - "coinbase": false, - "hash": "cbe07049cbc0464c55f241df1cf5b5d180c47b4b08d17df1ce80eb6e98cf67dc", - "index": 0 - }, - "script": "473044022044e5c52785a2da56d87aab516fc61353cd5c2767bb4bf4f0260c73de872b3a7202201c62084a4c74439bff2d4a35b613f41d9f8cd864c4259006b6162d5bf0aff141014104a5570cdc0f8820414e2235c57f7298218cfc1441f5ecdfaf3d4263ddc9881787d02c751f6355d3ae0e271b7357c821751159b2b6ef714c556170bda587d079ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0375ccc9db3949d8e0be0060617c5588787fc5e2383057cea5a726cc2f11cc70", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914809789e736a62e2d40b4d59e21a64895519fd19088ac", - "coinbase": false, - "hash": "0375ccc9db3949d8e0be0060617c5588787fc5e2383057cea5a726cc2f11cc70", - "index": 1 - }, - "script": "47304402203a33e826cb9f7f1ce25f018eba2ce688b84bbc88a4ae462eeaf529fda6754136022068ebca2d8506a93cdfc9429886bfc80fa9af10c6eb84705617b1bd1aa9061bae014104c3f4b19ccbf6bbd50ad0aebeced74148cb8ef000d70e432487be326ceca33c60612c6f4942ac21e17dfabf74d595b92d9e523e7c80d1efeca55a6f51758afe08", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3296000, - "script": "76a91480b2305ef0d7fc98504fb0ce5889d69da80bf7f188ac" - }, - { - "value": 117491, - "script": "76a91465162c2ae96b1f3a2d39a33f48b520418f19550b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "82af52ee805504ee07054d894dafa03e533dbcde677f7525ef1ae0528bd43116", - "witnessHash": "82af52ee805504ee07054d894dafa03e533dbcde677f7525ef1ae0528bd43116", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 173, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4359f76ede3f1159a05b6b3b173dc1489abd057e71150203ff1bc7919a2227c5", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 8188598, - "script": "76a91474ffd322b0bc57f8602c3e5989e7b65e0bf35c2f88ac", - "coinbase": false, - "hash": "4359f76ede3f1159a05b6b3b173dc1489abd057e71150203ff1bc7919a2227c5", - "index": 1 - }, - "script": "47304402204222954625e7a66a32e9362ee5aae18892e9346677a8521d9b5668a941f1fbd402207aefbe2db4f4ce2670c8ee7b1b13e8cde18750c764fa8ae91da9de997c2dd000014104089db562fd3444e8673becff31b5170f86289aed0a7b3c18c1842b699617786f053b9de8daeea2225f4a14b0aa575c5ba37afcc11f54260d1d99c3aa28be0f05", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8ada1611dae4ef799fc99cbf1ef3054858b7bf66a1d4b699581d56d92710ee0c", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914edfc2497e47a913b4f0169e61324703293fde9ed88ac", - "coinbase": false, - "hash": "8ada1611dae4ef799fc99cbf1ef3054858b7bf66a1d4b699581d56d92710ee0c", - "index": 2 - }, - "script": "493046022100ed4cee40d76b7f7e16a407cd71c5da0ddf86e41d6bb1b8bb98ed17de5d6225d8022100ad108c12d568a2bd1958697f87f9c68cf98d08f315b787c715aa61da34de50c50141042ad2f571cd3296d46b9909ea3b9dbf4b640947b332d4f553ec5d7a12318e5c0af57186f9ae11b8d9820cffd47d4cc2a8a52eba073c44e3f61d0cba321cecfcd4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6730600, - "script": "76a914250ade7bd688807051dcf42cb95a50b211917f1388ac" - }, - { - "value": 1457998, - "script": "76a914773ab67f6aacec7dfc662e54891b6e47b8193de988ac" - }, - { - "value": 117491, - "script": "76a9148b49cb9c5f4e6ca5019d7b907b545f2aeddc96fb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "223fe498ee0cae311da708da3b62079c7eabfe8863ab6c9871e5a22de718ea9b", - "witnessHash": "223fe498ee0cae311da708da3b62079c7eabfe8863ab6c9871e5a22de718ea9b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 174, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "82af52ee805504ee07054d894dafa03e533dbcde677f7525ef1ae0528bd43116", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 6730600, - "script": "76a914250ade7bd688807051dcf42cb95a50b211917f1388ac", - "coinbase": false, - "hash": "82af52ee805504ee07054d894dafa03e533dbcde677f7525ef1ae0528bd43116", - "index": 0 - }, - "script": "493046022100abdedc9960b3ea3d3a5c287849825909ff7b4f64e8bb2f5975e4a535b5c85931022100850e851172601d24e115edc8a850952e0d22c4b7bdef819855e5ab7fc643b8480141040262335102c5143bea57913cd266ccf84ef43725597f2ccdcb37e8310c7c43371c785e6478d201f133ea2ef8efcd38677eb5ba680b82d06a5ec3877571e8f936", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "00ec29ccdb23ef0b14584f7b098d1156448a6c68bd4f96925364348ae4b6a3c3", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 37454, - "script": "76a914f96870067d2dd97c3b93fee5203153e811cc170f88ac", - "coinbase": false, - "hash": "00ec29ccdb23ef0b14584f7b098d1156448a6c68bd4f96925364348ae4b6a3c3", - "index": 2 - }, - "script": "4930460221009b87bbf0c3796ae418d9a31a30742d101a287af9c46a29a481ceee02a23da57d022100e4cead9c8c6c5e56c543e7cf8c629798def3ea763d8d913a4993d6887264415c0141043ad7e8af53a86a5ad746dbab912d0bead8b50c3f1cba8ef0b4b4f7be7cc91b391bc1799568ddb9d03f8c066e709a9a275133f22375dffe17324f69563e31961d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6730600, - "script": "76a91430d229d285949a6c68642a26c01860a4bbf66ed888ac" - }, - { - "value": 17454, - "script": "76a9147e0ff116743e6ad3d85b2d60805ef60253e714e688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "485c13c47394a65c0fef1d79a229163b552379f8af7ceed47f3c4b9683c31bc3", - "witnessHash": "485c13c47394a65c0fef1d79a229163b552379f8af7ceed47f3c4b9683c31bc3", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 175, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cfcca75d4ea2a197a98e5341ad8768562eae55da590794f29bc684bf3bdb5ec0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 4288971, - "script": "76a914595261a7987219e36b497828b491157acd50058d88ac", - "coinbase": false, - "hash": "cfcca75d4ea2a197a98e5341ad8768562eae55da590794f29bc684bf3bdb5ec0", - "index": 1 - }, - "script": "483045022100e655950417e9557cd7c6dc49013cf8225c68948da516beef03a3b18738c48eb8022068102faf5a4c1f503f3f24ba6c46cc27b316155ab6cd11d29512f3ee1af3d7fe014104b0be4ae825b10d1d7b9593deddcf06ef80e58b1383a197120ee3ad280789598f8469084cc38146d1989ff9dae31c783b04b9034fbbdfb56ddf93e822b1c0aae4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "69e90621f8ecc301b5d794a5a2e6319aa43520387e36df29531ba6b9090c5410", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117489, - "script": "76a914d11ad7b04e157d9d68f0e6f983a7cc3be37363fc88ac", - "coinbase": false, - "hash": "69e90621f8ecc301b5d794a5a2e6319aa43520387e36df29531ba6b9090c5410", - "index": 2 - }, - "script": "483045022100de4bc9fac543825bbd762e7f078e488c6b0b7fd1a0cebac2f3c098b214bc16d80220287ede8b8897ff044546f253470697b591152b20bab2c97970788e3be4295d67014104a82253b57619cc3d8505295b3e4663c4fea7cccdfa26c9561cdb60aa623577210baa6015d8bde2ba601e7287421cd26a7f6f8aaa6fea1f4bf39d747e2677565c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3690800, - "script": "76a914d371ae82de32e0c8d797b789124dac36aa166d4c88ac" - }, - { - "value": 598171, - "script": "76a914f3c0da7317682b394b612c607e66d2858092475288ac" - }, - { - "value": 97489, - "script": "76a914c09d44e24705a2b3f13f1909a30797f8d1fd830a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5a6ae09b6842d16c7327b0d2bc316eca90d3268ff469a5b7b7f837f2737ad7dc", - "witnessHash": "5a6ae09b6842d16c7327b0d2bc316eca90d3268ff469a5b7b7f837f2737ad7dc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 176, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2a4d9b02d391d8497757ac8ba1a2c8d14637e1971b36eeb40ed34b70edaa199f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 3981171, - "script": "76a914485c53e74d7e6c9b030d45eea380564fffdf27b388ac", - "coinbase": false, - "hash": "2a4d9b02d391d8497757ac8ba1a2c8d14637e1971b36eeb40ed34b70edaa199f", - "index": 1 - }, - "script": "48304502201095158755ebe6e5624653c3841e01a816054080051016fb5746af1f0d8ef248022100b9c8191cd9fe5867d9f9765996ff8b0fbe739663329211c69f3bd7545f7cb46a01410482791d8c86efbf836cfa7266073021af3bda81acd00921f7c2d33013f27eb570dbb71fc7ef296f479da2721a42eb1c2f556c2e9832ab7b09ab13549215c9dec7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ee83c7c346fa7b75511c3b7618595acd49f69af03134814a1368df7947fbfeb9", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 77489, - "script": "76a9141bed9f95f699a6f4adbc0beca3b53cd4070a1a7488ac", - "coinbase": false, - "hash": "ee83c7c346fa7b75511c3b7618595acd49f69af03134814a1368df7947fbfeb9", - "index": 2 - }, - "script": "48304502201c65fd796cd2ea9e828ee8af56be0368562ee3fb4f16793c95c4b3b47840d9ae022100f9466d2669eee28647d8c4454f5bb98c10166b3ba5a09d33a12ef92112a4e9ae0141046ef17ba18a206f8ae78e1935abc3a2ad5a879e3e3228c8459cd78d2a7adaf3101819c8e1ee42a46934be470e761b9c08bf803fd554fc41991af67e04a97a0d47", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3700000, - "script": "76a914e78756c994924a104a309e425314f2ea670f65b988ac" - }, - { - "value": 281171, - "script": "76a914454efc60ab1e91bf88fee7ed4f0a782c371f0a4288ac" - }, - { - "value": 57489, - "script": "76a914ebd7c19ded0b7b72639f963cc611f0f2cd5cd3bb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a092947c538070e2d75d0b103e70a2f74a91271de0ee0864990d63b490fecc3b", - "witnessHash": "a092947c538070e2d75d0b103e70a2f74a91271de0ee0864990d63b490fecc3b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 177, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5a6ae09b6842d16c7327b0d2bc316eca90d3268ff469a5b7b7f837f2737ad7dc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3700000, - "script": "76a914e78756c994924a104a309e425314f2ea670f65b988ac", - "coinbase": false, - "hash": "5a6ae09b6842d16c7327b0d2bc316eca90d3268ff469a5b7b7f837f2737ad7dc", - "index": 0 - }, - "script": "48304502201cfe4ce40c08d36ba8880eda02ec27246c1e958677779edc9a79ed61c9513ae6022100cba091051fee67e157d1680b729cc09b9f9473af0cb4616b40b8cbfdf45f8f53014104ae6be215df201e70e067cc0dc9fda1a41e65bbd23ca1bfcab2f57b0eca2e109709ff6e01d262261102a517e260931e249a85b2352e6da96f478db5711f69cae2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c3892544133a3d3d7cd5b6d22af506259a0f9e3fef8670f171194bbc87c9ad2c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117450, - "script": "76a914d5883fb00b78b18f81c541b0e0e09287e222411f88ac", - "coinbase": false, - "hash": "c3892544133a3d3d7cd5b6d22af506259a0f9e3fef8670f171194bbc87c9ad2c", - "index": 1 - }, - "script": "473044022034dc640fbf743b77c17e5104a55516e51ed15c37b8d4c6643d16fd0a9ee92e5102200cf5d69965e387e6d2eca1de5b45df5967a855b50cedb0999b69c837d8c604e101410485f3edb753c6b098e2b38c962275c4f52c2a67f23246226a3791e0cb782ec5b674f82bc3f268cacdec232b5da413687306ef202c7278123a9ca60e86efe3ba1e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3700000, - "script": "76a914cfebc4d97ea46836d98f8db357028edac37489cd88ac" - }, - { - "value": 97450, - "script": "76a914f584aa58d16fb88d7e618c56348554ca65b04d7d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4c50d35a4e68ee20bba2072c3c2f9142c35908c9f914895bb8e0089f082ee556", - "witnessHash": "4c50d35a4e68ee20bba2072c3c2f9142c35908c9f914895bb8e0089f082ee556", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 178, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3fd24c721778333877b3d102899587a8f3b0de566664de8f80c859c1e69c7e84", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1755588, - "script": "76a91480a958d6a5de0f1e6127ce9791b9a2565ace206b88ac", - "coinbase": false, - "hash": "3fd24c721778333877b3d102899587a8f3b0de566664de8f80c859c1e69c7e84", - "index": 1 - }, - "script": "4830450221008d1cc240f5f030fc39f7e62a78dd21705140f86d713c7029643af6f6926360970220183b501591f075764ad2de7f5688fb300c2549034273d69727cf876ebb0a5f98014104bd5c1aa990d07819f72f24c5e65bf0a1ae972d662728412202915215e58ef2240c0c50e6ca3a08f3428175498ac4843920a431d8cb99b44097e1afbf4d37dcba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5dc6974e0ff0be5a2c60252d5383d890baf2d0814ff24b976ccac61db1317600", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117443, - "script": "76a914aa247b5455a6fa6f7baab3baf942904a2d4b8d5e88ac", - "coinbase": false, - "hash": "5dc6974e0ff0be5a2c60252d5383d890baf2d0814ff24b976ccac61db1317600", - "index": 2 - }, - "script": "483045022100d35a40fd6ede381be53dedb7a3aeda9b300c94471bb0e92de7d51a0b379faca9022059cf3cd83decb93860c0d84be5e1e58e0a6ba97274e0a2a98f9cce2511fbf9690141045ee30caeda717c56765904526062981e750c2d73877a10450cce6241acd0e02117e3e78c630306dda57f3f7baf5327cfe979dc812294e5c84774947fb462fd3f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1335740, - "script": "76a91448012e7f8ee1beae5465393ab1aa8a3f9c8662e688ac" - }, - { - "value": 419848, - "script": "76a914e515e4b77a48f2be58f958ed42d60cd449e6cf6b88ac" - }, - { - "value": 97443, - "script": "76a914042c957a2313b738610b9292bf675a11f6457e3388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "32d3b23e55d0b91d900f84eb219a7e4716e7ae82f27ffd5a65b4588865f0e1f3", - "witnessHash": "32d3b23e55d0b91d900f84eb219a7e4716e7ae82f27ffd5a65b4588865f0e1f3", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 179, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4c50d35a4e68ee20bba2072c3c2f9142c35908c9f914895bb8e0089f082ee556", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1335740, - "script": "76a91448012e7f8ee1beae5465393ab1aa8a3f9c8662e688ac", - "coinbase": false, - "hash": "4c50d35a4e68ee20bba2072c3c2f9142c35908c9f914895bb8e0089f082ee556", - "index": 0 - }, - "script": "48304502202d82be34491071bea94af9d63497ccd5d88699733dbbb09cc1c0b0f9e03287db022100de6e04398b802ccbb27826bdc2c34ecffc7211dd7577d5df031b8f148d9e62ea0141041b1248f2e6c2f6007433bf46730c35ee4a41500b9e94c161e960a3ba52dccbf1b0f650eb207138bc5201796faa38b1ca866922d5e9432230075bb9b101309491", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b34530a3c6296435bac03e4eee96bb5c767c1e87d4cdaea98857cd9d1fd285ef", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97489, - "script": "76a91401d987d380aefef0c87e904be4921c136b108bf788ac", - "coinbase": false, - "hash": "b34530a3c6296435bac03e4eee96bb5c767c1e87d4cdaea98857cd9d1fd285ef", - "index": 1 - }, - "script": "493046022100bd1c3be50daf14c0fab1ab1df0fb1bcdf77bbd25cfe654e563af9790cec98e62022100a00124bcad9267d76e1607a64d44f4d7045518bc1ec797edf3cbd995a0a99d86014104795098a212313ab26400c4f78ec277fa01f2117413df7aafa28154de66a9fb5425b2819e9b595b819084ef55aa40036f622e8310666a1afce0af8b51afcff3b1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1335740, - "script": "76a914a0caf4d05350518c04960361676c28830e08502288ac" - }, - { - "value": 77489, - "script": "76a914285929da6f434b603f87c8a442e734dfeebc46eb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "de0217866c61c3bb9bd9c329ff4a3cd994c433cfec6564e35dad482f05421e30", - "witnessHash": "de0217866c61c3bb9bd9c329ff4a3cd994c433cfec6564e35dad482f05421e30", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 180, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4f67cac681a2d0d76511332e9311bfac808d05a57070fbda4b64d531e7bded39", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 112786, - "script": "76a914fe65dcfbb023dfc3850df2aac198f35c13e7184988ac", - "coinbase": false, - "hash": "4f67cac681a2d0d76511332e9311bfac808d05a57070fbda4b64d531e7bded39", - "index": 1 - }, - "script": "473044022056c5db2adcab46dc3fd166c214eade112ecf169a782f03fa3d7b09d1cd12c8cc0220012180528d23d6c620012003e5ea57a5969cc57790c80526812fad97afe514170141045841b254e0ceac7e996c2a6bc64af92dff42bc008edf76e1b985bfff6ec5dfde7ae2eca6dcab447a33a3867312fef935a62af57251b6674c3da04506f5a07986", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ba7616f6f4baea1514ac088d4febdf7e707af0c61583e6802e3322805b38537", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 57452, - "script": "76a9140035fa4bd964e2e7d97ec911540ef77d257c5dfb88ac", - "coinbase": false, - "hash": "6ba7616f6f4baea1514ac088d4febdf7e707af0c61583e6802e3322805b38537", - "index": 2 - }, - "script": "493046022100dca4cea69ab2b94b76209d1a4f838d9f8600fc9f9e684494711d625889c183670221009facc146bb19d2396e52a049deccc150263439cdafb87000686530ae9b4651f001410493c539fac57a36f81f1c3a0d9698ee59e5d8504478d6b81175fb1d8edc35ae3817ace5824b7c596506fe977a3f42c9062ab5b934d45b66845b3e84ef1180fcac", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a9140bda76507227695d224a9e07db3bc06c5cf1fd6e88ac" - }, - { - "value": 12786, - "script": "76a914ff33627dc2ab743abeb1a5483f1717ef570bd42788ac" - }, - { - "value": 37452, - "script": "76a9147f580454f0cb8129e3e853f81aa34179899805c988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "17a4877b9d2c20a363d1f52ad70bc4cc4aa5864c3297e42d2d773429d6bbbd00", - "witnessHash": "17a4877b9d2c20a363d1f52ad70bc4cc4aa5864c3297e42d2d773429d6bbbd00", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 181, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "de0217866c61c3bb9bd9c329ff4a3cd994c433cfec6564e35dad482f05421e30", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 100000, - "script": "76a9140bda76507227695d224a9e07db3bc06c5cf1fd6e88ac", - "coinbase": false, - "hash": "de0217866c61c3bb9bd9c329ff4a3cd994c433cfec6564e35dad482f05421e30", - "index": 0 - }, - "script": "483045022100f4bbfd07f20a938f41ab60bbdfe3a4b8d434e37ebf0b19f14f0cbb8c224608d702204e3f18359f7677444e97ec925b3d715425eb522426ebb64544c18edb81eff2cd01410497352eafaef76bee4a9ced58ba47b15bdb1e79fb3a270e5a9a83311f930a92fc1cdbed4b87d9834fc7993447911431dbe558e970e5431a3abb42c30960d5bf48", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "49ef8b88bcdf3bf8bc7ae7bf674728421dbb530b02c89b73b8ea377802739036", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117481, - "script": "76a9149ce524ab1cf7cd08b5faf779a359dddcab28e10d88ac", - "coinbase": false, - "hash": "49ef8b88bcdf3bf8bc7ae7bf674728421dbb530b02c89b73b8ea377802739036", - "index": 1 - }, - "script": "483045022100d97e680aff0a018d4e5f1c297abf2fa564496b95a7b1a76205a269503b9474df022071137d1aa2e22ddcc0577147f69b5bba98a175bae47e1495e8f6ffef5828c29e014104fa58445fa36f4cc6a66d574e03995e185dcce6bb78e5cb2b09037027e921ea5a8c185e2114e3258fd20a8d1052d4d2f7c74f710863460896e563016a5ab22f1d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a914a44876ed63f5054b9acebb3394c7c50f7b365caa88ac" - }, - { - "value": 97481, - "script": "76a914fcd02887eec7211b80852ba7e6207625308170b388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "259820bf9359036030f9093d05960800b7560f0133cf49d51ff7655c684af13e", - "witnessHash": "259820bf9359036030f9093d05960800b7560f0133cf49d51ff7655c684af13e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 182, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b9ebb91ad833a092adf9085bccc2eecbf8b3b9e9f10e128babda92dc9b08c236", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299990, - "value": 3356032, - "script": "76a9149443b0d1965ee6179d264e673121e60ac891f08788ac", - "coinbase": false, - "hash": "b9ebb91ad833a092adf9085bccc2eecbf8b3b9e9f10e128babda92dc9b08c236", - "index": 1 - }, - "script": "4930460221008069ea74475c45f2452d4c635ee0bee6bcb2bdc67e18c543fa85bc1c0862086d022100ea198ad162a5201c1f67452142b2947c67800dfd03feb97f5a17325e7b8dd34e01410456184d4dd268b367aea6435efdbdb8c5a387bd65a0e1833d70631198ff7b5c2da1f41412eeccd149ade33fc2a8f2926afb8583a3bfce04e4a8ef4a6e0299c0d9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "35a0122ffefefc07e4da8506be1feb6f58c88c11e3b9fdb686f475506f75e684", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77491, - "script": "76a914bd207ee8344b3c66deebcea8ccc17dbb8fcc68e988ac", - "coinbase": false, - "hash": "35a0122ffefefc07e4da8506be1feb6f58c88c11e3b9fdb686f475506f75e684", - "index": 2 - }, - "script": "483045022100d34d466fc38f3b24aaf499d5b8f027e52e1aa1246afba6242f7489e9f3b7260d0220245c5f5efcd7b44d4a6c436ebe50b0797ad2672a1b8a6c9310c7eae47d675fef014104ed6d573dccfb99b94212a5f1ac8df568aed915dbb67f5d64f83c2f182b21380e4a319a5697d0e420fb2bfff7d1d6c2178e47d2f951c56203d9c8164cb820cde1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3132000, - "script": "76a9141e640a48d1798693bd7c92924033983db4b1563488ac" - }, - { - "value": 224032, - "script": "76a9149f3e76863d0ed6e85c83db0f7629f4112ad63eb288ac" - }, - { - "value": 57491, - "script": "76a9143a859256841cf3e7b83539a4b46e14a6da5cb41388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f51bcd93c0ef63ab3aaa857fc856b20e350a0dccd5c87d6e7d26eadd9de1510c", - "witnessHash": "f51bcd93c0ef63ab3aaa857fc856b20e350a0dccd5c87d6e7d26eadd9de1510c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 183, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "259820bf9359036030f9093d05960800b7560f0133cf49d51ff7655c684af13e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3132000, - "script": "76a9141e640a48d1798693bd7c92924033983db4b1563488ac", - "coinbase": false, - "hash": "259820bf9359036030f9093d05960800b7560f0133cf49d51ff7655c684af13e", - "index": 0 - }, - "script": "48304502200cc5a393a1a55e47c76dae10e601b6e9d427ffdd18cdda427dde031785c0e6de0221008ca7b63fe297a88a894a3f9f178d59b9bc3df948038f235b2fb9c3502064d73a0141040ad3815bc3ee2c359497b1548cd484a7bcf0e7b3c119d413ef5e0deead3cb83b543ac082737008be7b591212519740d8a405a5e2ba0b5e9d2271398cb74e44cb", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e917947083d7f925fd82c21af3bab89a87be31993437c7422f7eb026fa5a3d3f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 57491, - "script": "76a9146fc49491fdfbd0b78c567217fb4dd73f8f8ef4aa88ac", - "coinbase": false, - "hash": "e917947083d7f925fd82c21af3bab89a87be31993437c7422f7eb026fa5a3d3f", - "index": 1 - }, - "script": "493046022100dda2605c30a8f187abd7ded8f79deac0377fd26155434691abe37739bc29cc02022100ebdc0ccedf8515ec2979c8defbd03d36f468803d93ea5b08b5a9400980c3ec4d014104c87dd551e8b3e91d64776f4194569cba3fa5268e81e8a9c4c43bc99895e24eb67095c03ed5db81c350282670fb87b3d9edf3977f012ea11fe78d8ba2e59e637d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3132000, - "script": "76a91488b3f7b7c52c8addd16531322e9839ef8f2ea47288ac" - }, - { - "value": 37491, - "script": "76a91460841c561f4a07dae8700c6220045d6fe6f4d55688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f1f1868bfc26cea0203c6fe0778b4d8adefb7953c368027d02da7ec1b8fba53b", - "witnessHash": "f1f1868bfc26cea0203c6fe0778b4d8adefb7953c368027d02da7ec1b8fba53b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 184, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cbc755d75dad6af84ea220644f902f63d2defdda13e4aa5d522f5bcc5539c568", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 22711262, - "script": "76a914983e212a947b833311cfbf10ecc9979844ca065888ac", - "coinbase": false, - "hash": "cbc755d75dad6af84ea220644f902f63d2defdda13e4aa5d522f5bcc5539c568", - "index": 1 - }, - "script": "4830450220787723a25ac34fc719f4096c60db2111232c40007c4c0418091c45d7608eb89f0221009d9f5a848b170c66e8855baf20e5d0f5d00339398683b246da9c2bc91782e755014104d4329542a888f44403004225bf64f10789e83918cb1dd009a00760bec544d61b18752bcde001fd1c1311e8934000f9116e510bfbaf294f5b90e55170ae7ce82f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9dae1be361ae72541ce2743d139300ec033e06e346a482771d4e8502a2f955eb", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117443, - "script": "76a914611b3ebf0315701ad4ac502b169b45cb2910014b88ac", - "coinbase": false, - "hash": "9dae1be361ae72541ce2743d139300ec033e06e346a482771d4e8502a2f955eb", - "index": 2 - }, - "script": "493046022100a04c1fd3e6ea252c8a443f323b2568e4dec63e2b0fc9d55f4cffa6d906a0c0d9022100af2416b42d262640372a4b0b34c203e6b65a7fe7546428219bcfbb9ffee9941a014104abcf8b976e564a86b712ba4c8210a26f16cd4674b5cbe0e6747f11be789d7bf48f12f9c3592ef20506db53088a5567eb931f9d1451709ea0ed9d054ba92f525d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 20000000, - "script": "76a9147cc49aeb44054a199893a1326402bbacf3f2e54188ac" - }, - { - "value": 2711262, - "script": "76a914d9618ae19a0a5f600a84398b224a5b3857ea73e588ac" - }, - { - "value": 97443, - "script": "76a9147638892ba6406d4d655653298ead2899590c34e488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "76c4c31e6ef03e3a15107ee12fe3f4f30ff458be5357bdd949b821ceb2424f25", - "witnessHash": "76c4c31e6ef03e3a15107ee12fe3f4f30ff458be5357bdd949b821ceb2424f25", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 185, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f1f1868bfc26cea0203c6fe0778b4d8adefb7953c368027d02da7ec1b8fba53b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 20000000, - "script": "76a9147cc49aeb44054a199893a1326402bbacf3f2e54188ac", - "coinbase": false, - "hash": "f1f1868bfc26cea0203c6fe0778b4d8adefb7953c368027d02da7ec1b8fba53b", - "index": 0 - }, - "script": "4830450221008f796c6a2e475f56e8c928c8548931977336212c7ca29ffdec87694d88477d5a02200e234a1c22d291d0e03f097bc4ca648a9b567665c08f07d83088d5fa61efaf33014104da081123304b837bcec6788d4b14ce5b2d8aa2a754c321ffa1745bdf0ed5e6ee941b023b600f75016a83e51ad270da16887027ce8ec4d7ec4fcdded08d3c176a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1885cd26bae0f40c3c7ccb872286368a267948a8ba3b43bef4ee40a7f9992ff6", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97491, - "script": "76a914f2e7a4fb587b75579bec7cb960d202739bc770e688ac", - "coinbase": false, - "hash": "1885cd26bae0f40c3c7ccb872286368a267948a8ba3b43bef4ee40a7f9992ff6", - "index": 2 - }, - "script": "48304502202d85a67a49a9f1e4276f2c3fe442688bcbaf261d937dcdfb71c3fc895910611f022100d1a69c1f207669af1d14092accfd938848f525798136d21a01636342042c59fb014104c17566ab05b2cdfb2007961b476eb7d49d0b1caea1b8945fd5af1542bebd7dc0b99731d40193b642d749c80d8247ab00b4ff83a3adc9d569760d15be359ee357", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 20000000, - "script": "76a91438859b3d711ae387ed72019dbf6e267986a9e36188ac" - }, - { - "value": 77491, - "script": "76a914de22eac26e1011b8d8a7dcf5327487eede77b02488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7bbba888b442798b791fb3695d897c4b8cce59b084435cb9c9ef1ccb59f61ac6", - "witnessHash": "7bbba888b442798b791fb3695d897c4b8cce59b084435cb9c9ef1ccb59f61ac6", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 186, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cf8b12e31d1b120bd575022ac293b992011b3a1169fe1f6290fbffb5ce2bbb86", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300001, - "value": 2617076, - "script": "76a9149833ec55b2edc0344d12bd5267f8a4965db51ac588ac", - "coinbase": false, - "hash": "cf8b12e31d1b120bd575022ac293b992011b3a1169fe1f6290fbffb5ce2bbb86", - "index": 1 - }, - "script": "493046022100b8a145f379e7796848e551fae6fe50622279c788511ac875f4ab94e6e0066c26022100def47a1778a603c352572996787b0bb73cd2b654a9565b3f7867e5a3d9db29d4014104c7221880430c54dddadf1260b5672d4b8032808c77da22b3a97d98e0b4ca446a6446796994c19f065b5da436f3478572c5884e4d2bb3e6ede743792578089987", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "464f44e52a8d336539cc8938662181b635098c6257804e432a396260c1f6f7a0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117450, - "script": "76a914684e70517e5300624888ab5b560fca4ba465c53a88ac", - "coinbase": false, - "hash": "464f44e52a8d336539cc8938662181b635098c6257804e432a396260c1f6f7a0", - "index": 1 - }, - "script": "483045022100d4400eeb1c125f8728d69e7874e3af328c9600f7dd44530c474f47e30067db96022033a43ceaa194bb217861017392e5907c71d0a738d5fe6f28d95b277000d64bb80141044ddb5cb2aa43ba9968acdc11a41f6d52fddb05643e62019f533dd3b7bb357a866e7c3433700c701beee19c5d230b864c5a2d8dd419b87b6cc2b31007a516b791", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2250000, - "script": "76a914bf2779070849dbd3c30e248f6f4711ca0b6aa68c88ac" - }, - { - "value": 367076, - "script": "76a91413bbc52bba6ed5e1b28c22b9842b6b09e30762db88ac" - }, - { - "value": 97450, - "script": "76a914ab1347b8018f28010920058ac1a44c00e906b8fa88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4210cc2322034792cf750016486c8195a41c493fa7186adec06b15963ffca8c5", - "witnessHash": "4210cc2322034792cf750016486c8195a41c493fa7186adec06b15963ffca8c5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 187, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7bbba888b442798b791fb3695d897c4b8cce59b084435cb9c9ef1ccb59f61ac6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2250000, - "script": "76a914bf2779070849dbd3c30e248f6f4711ca0b6aa68c88ac", - "coinbase": false, - "hash": "7bbba888b442798b791fb3695d897c4b8cce59b084435cb9c9ef1ccb59f61ac6", - "index": 0 - }, - "script": "473044022053c4a4ed72dfffd21f5528e797e354d08abca5c2545330b3ac150c70704e258602205edd8d7fd7ed4af41e0b70c109dfb0ee9a40b3f87d2598862e3db81d5b8db21d014104fedd1884ed0782b40accb858f4dafb3cc26dc4a1ebe9bdbbd4ea7a169194a13ba09583c8abb20ca59b85e20ec0ddfc93cd49bf4d694d5eb2357b54c43e967a5c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3b289c804b68ac3a9a2e395a149af60c50284c1217c5ee15b6307eb89a180bbc", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117491, - "script": "76a9141f11600691e9201c6fdde628bc0ca1ff7464bf2988ac", - "coinbase": false, - "hash": "3b289c804b68ac3a9a2e395a149af60c50284c1217c5ee15b6307eb89a180bbc", - "index": 2 - }, - "script": "483045022100f7eddf1cfa2d1e75a58e86cceaf65216dd614344a424a3f37307f498e852fbfb02207ca61508b0bb2369819c56e46a79f694aa13e7a8595168cdb5c163d98d6244790141042330d150f2a05456717746486d841369c5736b8a2415e5b06c0338c0485f3b27700ddfabf022db3a0c8c7e578c577d63b94b07ffcb2e184827d3a900068f257f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2250000, - "script": "76a914da62d103855f5e320fa3eabbfde11ab86925d54988ac" - }, - { - "value": 97491, - "script": "76a91457da192693671c05b2f1a41e6a6d762581297adc88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9fe67a7927f2abdd4c3316f25d652fba4438a68575700c8959c2861b73df6043", - "witnessHash": "9fe67a7927f2abdd4c3316f25d652fba4438a68575700c8959c2861b73df6043", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 188, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f617f863fe4cde59317471b1e38ee509add504af63c1d28b7beaf871f3588909", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 25574488, - "script": "76a914ea5bfad074724ce0eca25ff2be7ee89e578b089e88ac", - "coinbase": false, - "hash": "f617f863fe4cde59317471b1e38ee509add504af63c1d28b7beaf871f3588909", - "index": 0 - }, - "script": "4930460221008dad82cd2e4a1643e783aa12a29129d726d5cbda36274aee1def5db6407ee917022100a038aa3a8ecc0a33e6dc8bdfa9ed5ebdba65e95f599f5897bd78ed61d40058d8014104e41ae6eccaeb6afb8fc56f5db7f2fb724bda526e32b315bfda45008e4c9e3a5c1958d77c2b79a8f61c3f74b091e3d2d140138c05d92670d66c983ec24d8106e4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dd25297d03b48458c874f609c6fc547913232cc1e3c2aac762ad8c1161408f79", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 77489, - "script": "76a914cbdfcaeaaa558cbf1e74fba25b07a0a2a3bb6bd888ac", - "coinbase": false, - "hash": "dd25297d03b48458c874f609c6fc547913232cc1e3c2aac762ad8c1161408f79", - "index": 1 - }, - "script": "48304502203c287cf0aaa04ff9ec67d6bc14b0e6d9df30a4ccd4395de3d6d6396f5bffa8e3022100b6d964630e3f18ffa9fd0707ae38c04f79a7a93e83390e35168d8f714cb8711601410495b7d69ae355841a0c1440239b7e090e9c9f83bca253f8fa36452fd37a5aa80bc2e6c618c930606b185be8dcd586c4a11bcdcc5b43014ab93dce4b7fd4801ed3", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 24230000, - "script": "76a914af3880782d7dd9cb36bdc630c08a30c4b42f879e88ac" - }, - { - "value": 1344488, - "script": "76a914368ee96ba1bb455279d39cd9b81df3620684dba588ac" - }, - { - "value": 57489, - "script": "76a914a4e5a65add5093489a4bc146e369ba139f874bc788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3b4c82f5b8cf9e36a5904e6978a433a323f69afe940467c4991b74e26247adc3", - "witnessHash": "3b4c82f5b8cf9e36a5904e6978a433a323f69afe940467c4991b74e26247adc3", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 189, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9fe67a7927f2abdd4c3316f25d652fba4438a68575700c8959c2861b73df6043", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 24230000, - "script": "76a914af3880782d7dd9cb36bdc630c08a30c4b42f879e88ac", - "coinbase": false, - "hash": "9fe67a7927f2abdd4c3316f25d652fba4438a68575700c8959c2861b73df6043", - "index": 0 - }, - "script": "493046022100a8ed29339041d515c6a9b9d50984552c1c2cdf8d91098cc7918bd60b3b0b87fc022100e5dda8bc8d11966566b37599dea5f730ef39338946402e82644f336484a3e3d501410440bf23f84347d1d8d259316b9b28d5bee64cdeff905801a5f186939f6df01a01b9a5d20cb3c58dc3fc316ab471927da6ab905281018277cbd89de281a1ddd4b3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e9f1658592f3f65f288d454347e0d4c4e1cc5e49a92c64a27fbab840eb23ce98", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137450, - "script": "76a914ffc1a2bb7ddf7224c5b5c772dc86826bcdafb40b88ac", - "coinbase": false, - "hash": "e9f1658592f3f65f288d454347e0d4c4e1cc5e49a92c64a27fbab840eb23ce98", - "index": 1 - }, - "script": "483045022003f2ecf149f084e416fb26119ac6e8ad66cd40cc1b3868f5b3cc5d865658b7cb022100bb8b2f85296a9e45fa259dd264f9d4c18391b64a4d30ccc81d361e356893a263014104d59a79179e1eb23c7ebba0d1ab64ae9d3cdcffce5702b1ac6423d5a23550923cf7b183323d8107ce1e41734be37b4845b8b5115acb43cbd772c78299ca70cabf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 24230000, - "script": "76a914a5d619aa836d9263020aafd73b0951cc21ebc33a88ac" - }, - { - "value": 117450, - "script": "76a914e4a9de4eb0c3d699d4994002de024478b7b7635388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3ece388fa5de75c945aff90ddb971efc0b9fc034ff4f8d638899bb3103ff5ba1", - "witnessHash": "3ece388fa5de75c945aff90ddb971efc0b9fc034ff4f8d638899bb3103ff5ba1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 190, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c0261481a1a3c3d6ca3e92aa622e7cc0d34ef92d8ba457420b626b91fcede5aa", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299978, - "value": 1801726, - "script": "76a91427b45299b0d52a71c7e7d81e528c489e7b98ab9e88ac", - "coinbase": false, - "hash": "c0261481a1a3c3d6ca3e92aa622e7cc0d34ef92d8ba457420b626b91fcede5aa", - "index": 1 - }, - "script": "493046022100bac153ec2a0d94cf0fdb316f0ef7b4fb8b3acc6b8466a0a34b6dad17b4a5ea3e022100a149aab493b474a9401a06dd447b8bed4d26489b3f217e0ebe35bd8fb68e8b4b01410478934a3e2a86a3f7d496cadd48d2ca6b76a3415e87135061aa15f928f4447dc12174024a668e24ad3c031093d66d2ec680496c29f58d6150f05a77325c563eee", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bcd91b19f64f6e0e90cee107a3039290c6f9130fac32774168d107b30e245ad5", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117489, - "script": "76a914d8b1fece4c41392828cd5225962a99664c89543888ac", - "coinbase": false, - "hash": "bcd91b19f64f6e0e90cee107a3039290c6f9130fac32774168d107b30e245ad5", - "index": 1 - }, - "script": "493046022100e418187b18464b8c37099dea262d438dd59a044bfba78c4971d4b0dd814d8432022100ed0f3ad9ac57fbd9daea1111695da4d49fd0dad5f7a82a91db4ef768b4fd17ae014104d9e3b050eb7defe4d08feb465484fe78e6eb43179c55bd4adccef303925486e6be110b13402501afde53c289f4bc5ea464f3dbbc9911b380aa488cb15488def3", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1582700, - "script": "76a914b0326ea31749ec3479abf6c939c5bbeca0fa8ad188ac" - }, - { - "value": 219026, - "script": "76a914a9900c52c1f22f66a455409f3faa84498b016f9b88ac" - }, - { - "value": 97489, - "script": "76a914b5f4c022f16df645bc539f9eb0f493cf47cd48fc88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "570af765958108c2aad60c94457d54fe0d05edd75733d628ed4b7a6a7ce6708c", - "witnessHash": "570af765958108c2aad60c94457d54fe0d05edd75733d628ed4b7a6a7ce6708c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 191, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3ece388fa5de75c945aff90ddb971efc0b9fc034ff4f8d638899bb3103ff5ba1", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1582700, - "script": "76a914b0326ea31749ec3479abf6c939c5bbeca0fa8ad188ac", - "coinbase": false, - "hash": "3ece388fa5de75c945aff90ddb971efc0b9fc034ff4f8d638899bb3103ff5ba1", - "index": 0 - }, - "script": "4830450221009f72d77bc4633275e702432b4b420796f87ce86ebce064f67f2db09c1d985ca50220343efba47a5a14ecee79f713f467c983b84452091c03565fda20aa0719e0fba90141044f2985450c59f4d44c033b96e7ab1de799bf82849e4a8e2e4212e089fe7c7d12d1fa2ab19ec2b46efadd32112ae6b03981571962eb5c678ab15622ac545658b4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7dde1af34f188062c6e244c0fce8700f20ed8f39093d3266ea3b333a0969856a", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117489, - "script": "76a914440b4b736583cc145db9514b18ea97350a304c7d88ac", - "coinbase": false, - "hash": "7dde1af34f188062c6e244c0fce8700f20ed8f39093d3266ea3b333a0969856a", - "index": 2 - }, - "script": "493046022100d206dd48fa4b00ae1f813195ae63b733ccbdaf5a32a17a3a8993d5e290fed14f022100adf37ab5f6956373ec43d631a52925943bbd0f8fedcb3414f21d2d094cac06540141044442e15eedbb022c9598b52035058665442deb4ba630bb4cf1089e457a23650f504795bf045a33c3e7ea5e31ad56b66a1fb840a184273eb25f59af90b0ff197e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1582700, - "script": "76a9144c5f65f9dfe23ac18b24ba05652569874210267288ac" - }, - { - "value": 97489, - "script": "76a914bb7f650ab03d39d6eb6dc21a59665ff7d553eadb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "03de43ad0d9d41fc0b62d5cc5d4a972f7de4bef10c82be3c0c139295b03083bf", - "witnessHash": "03de43ad0d9d41fc0b62d5cc5d4a972f7de4bef10c82be3c0c139295b03083bf", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 192, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "add1ac93eb73b6571b48309ead14d04d4a257791b3117f228f8b2283cd1eb574", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 12079106, - "script": "76a914cdfcc79d89b3b43bba9fd2a73f26bfdb3c4507a088ac", - "coinbase": false, - "hash": "add1ac93eb73b6571b48309ead14d04d4a257791b3117f228f8b2283cd1eb574", - "index": 0 - }, - "script": "493046022100a1e49fcc37a4b441fbe36a6dc9845c16dd218f6bb3b329d8c127a4558ca05e27022100e695302d7d8385f7d5c2b1d777fb5cbc8686cef9adfe328ca37df3171ce861c4014104bd2601150a4e71870b60dc152290d2fb92e1a94f05f99e5a425d6cda63725503b9efa495f10bee4e46256e09c8b74305083b3c3eacab0fa2f97399ac96d6ea86", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bc5023ee0193cec46fa71e3f6a1f3d68a3d50858150e7676088b2d31dfc7b0ae", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 4152371, - "script": "76a914ad40801f6a7718296a7ad3a86a8b06114e1e2d2688ac", - "coinbase": false, - "hash": "bc5023ee0193cec46fa71e3f6a1f3d68a3d50858150e7676088b2d31dfc7b0ae", - "index": 0 - }, - "script": "483045022009241b3ad08bc2e1799b091a1c88cd281ac7a69e84c25941555dd2bdc8aaddfa02210089f29edaee12578bdc343a6d2fca5b4d0ffe4370b099256941a5c227f87c17d2014104eeb93b9b6347619b86b4ae00633baa1b31111163fa93399ed051cbc3009a663ec767bb2a63ede52f7271e7088be22ecb6c3680070b97682e0bae426dcff6cd2c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "621f42f995d8628d63778f317cc43ca1baa33327374f6faa9b24af6b68dc40a2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 880992, - "script": "76a914c9bbd4104333a3c1d29e353d9704ce8c0f1ae2ab88ac", - "coinbase": false, - "hash": "621f42f995d8628d63778f317cc43ca1baa33327374f6faa9b24af6b68dc40a2", - "index": 0 - }, - "script": "48304502207e840c8db51c3cf028629c60d3c184e5abe39ba61d31f7c88631d995f0ee6bfb022100ff906f6f194a340536fcef0a0bc26c15a3b53ff2fbee65356a98e6a30a8db7cf014104a69e774e96b1b3fb5646c2b1cff25c2c1a43c93ac4d407cbcc97a6c7a05c7bc6aa595b3ba38e7242019e217b85ff8435a6a8f4c1a12e448797eca2f881c6c793", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "214846c2f79f371cdd1b8bf0036439e4a505a0cd75d0ee42d7f0543c5ce04f45", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 384192, - "script": "76a914200a2933f51298bd6eb5b111c65907d440cd07b788ac", - "coinbase": false, - "hash": "214846c2f79f371cdd1b8bf0036439e4a505a0cd75d0ee42d7f0543c5ce04f45", - "index": 0 - }, - "script": "473044022029d25877176ecc8482f20af522a844aa283014d9513065e15be6283ccd39daea02201dbcafcbde8bf0898dd827aa2c369c8303ef3f79d1b638d42ecb5a7418ba7736014104736dcdfbde683a219be88757dc6287b13de507a4cfbe3c2277f5cc00d1258e98b91dfca8afcc50d122331c33e2f8e4e7639fad5f9a9bc913d56992976d954fd8", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4cbec5a06422c09fad97652cd7a0c2b52f6ba8d73337236e6c5149644f211d14", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299967, - "value": 77480, - "script": "76a914131bb23fae784ada8c2547963f57fa1d4c28c3a088ac", - "coinbase": false, - "hash": "4cbec5a06422c09fad97652cd7a0c2b52f6ba8d73337236e6c5149644f211d14", - "index": 2 - }, - "script": "493046022100de3d58111279bb3a0eff64713e22fa5910d419173852f6378d935edfe262a46402210093d9583896a1af5a690aeb40e7b4057af7b3f64d54a0c68b58cbcb6b8adf352201410496938c67dcd4449e13104d460162d943c9a7838173ea22dee2ca5eb1ece2184c8aca8479cb6db68d8b5a6813163e57522e4a9d3e0fd48a99223a07faa604cf6b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 17496661, - "script": "76a91486c01d35744050ba11b95df83a05e6024eb2f5f388ac" - }, - { - "value": 37480, - "script": "76a914e841d77195e84dc4af4ebec92d2bed2501e1db1988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0442f8b655af48eac6a8f5c87c616fc26a0d28e7f4ee0d444414f0a638aa54fd", - "witnessHash": "0442f8b655af48eac6a8f5c87c616fc26a0d28e7f4ee0d444414f0a638aa54fd", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 193, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d727659a57c1005a10a764f7b0f1d130b2f1a32f4c65ca970d30ecc75d8a9c79", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298814, - "value": 13332443, - "script": "76a914868e42f4c68fb069dbc3663cea7d074871c4381488ac", - "coinbase": false, - "hash": "d727659a57c1005a10a764f7b0f1d130b2f1a32f4c65ca970d30ecc75d8a9c79", - "index": 0 - }, - "script": "473044022030a8901c7d5e640a15496fcae53354f859174ffd4fcb67e2ac8c2d8ae7ed7c1402207f83306a38b83af985ef7830550cc8b5bc6573f351faddc1e29574a3c80fd5ff0141049c16b73e3fd2ab835ece2043234ddbd705abe08472f1ce040f7ad1c7f484b3a690a06eca155e666e928be92136ef31e6dd2e713ba9d4b981e6b426a31291e5f6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6681514, - "script": "76a914ec468e65a8f9784a9f988bc9d21b8a8f13ef234688ac" - }, - { - "value": 6640929, - "script": "76a914868e42f4c68fb069dbc3663cea7d074871c4381488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fbd24683c3ed34a7b31e22c60156b6061d30bda3d26682fdb0c6f2711494a788", - "witnessHash": "fbd24683c3ed34a7b31e22c60156b6061d30bda3d26682fdb0c6f2711494a788", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 194, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ba395c4855635018f27cf4fedc26092b4f0c3e6606cd08bf42ec62d2c186a2ef", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299959, - "value": 19220489, - "script": "76a914bf7dfb385abf4af5ee8a2f998c04e4a8974f745088ac", - "coinbase": false, - "hash": "ba395c4855635018f27cf4fedc26092b4f0c3e6606cd08bf42ec62d2c186a2ef", - "index": 0 - }, - "script": "47304402206358ae85d06e592a8ab6ff5fde151d5696d44bf16133b16f5deba3ae5f0299b302200cb1cbb53e8136f092ca81ef68b9613660ca129a4b7d96c6082f8221f1524d0101410478b2cab4499a736e29ccd5a343cafb3122559216c2b3af30b105c15f1701ff2c35e738466d7d0297cebd3204cdda437ac92b24417e2fd4dc18f4d8951e505e24", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10992634, - "script": "76a914cd430cc9a36b39fbf16a6dfe05e118c099e18a2288ac" - }, - { - "value": 8217855, - "script": "76a914bf7dfb385abf4af5ee8a2f998c04e4a8974f745088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9a092c6396be9df818924619081d47dd39ea6469427d39da76266fc13053e5f1", - "witnessHash": "9a092c6396be9df818924619081d47dd39ea6469427d39da76266fc13053e5f1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 195, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f69d534ec99c86ac247f0bab061230a5b018fbd69a861dd3fd0e56c6dbdf5ace", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299905, - "value": 4975562, - "script": "76a91478770be5aca1444090fe32e272d5501847298c4b88ac", - "coinbase": false, - "hash": "f69d534ec99c86ac247f0bab061230a5b018fbd69a861dd3fd0e56c6dbdf5ace", - "index": 1 - }, - "script": "47304402202eed0eb72dda81218d010731e16d486fdc81e2f35fa2ddd54b5b43e079d08408022020578ca10a8e2d25dd2ae88eb9f40f512b60623f97ac4989ca1c9c3e5dc81e84014104aa12ff1ffa41fe8328a5e2854c4b7f2875a3b9c57b100c69541f95b59dc03f2b5a863f72f133f74c74034304110959789bb2680d817bdba9f89234b01bae3308", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3083836, - "script": "76a914ad39c18f087dd7ef30dcaaa9de9931100c340b8588ac" - }, - { - "value": 1881726, - "script": "76a91478770be5aca1444090fe32e272d5501847298c4b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "af2a3663c18e4225ad0d970671f136c755262d93226b0a4ed4e9a81a6e4291dd", - "witnessHash": "af2a3663c18e4225ad0d970671f136c755262d93226b0a4ed4e9a81a6e4291dd", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 196, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3bfd298b240a582279d957b25c178b3c787a3f21024507e234ab20c981590d4d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 93996138, - "script": "76a9144fc5e274ffd18e6791c00f16fc7041855e521a5a88ac", - "coinbase": false, - "hash": "3bfd298b240a582279d957b25c178b3c787a3f21024507e234ab20c981590d4d", - "index": 1 - }, - "script": "47304402203c5d559fbfdb40246f5838b3783ac4098a9d31bcb26cef28347ee8b7b8c0d7b902207bed338ca09f0b27e82fd7f7c6d4f9d1088ec18037c247b61f29727be3fe2b2f014104ddfdddf976f89cf49363c02123602bae849213f81dd20b05dbdc7b41263e93083f13c924203a81c5bb60f99e790f6a5c96648b0cffce9a591d5953ebc8bb45a0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 25000000, - "script": "76a9149e7431660282a311f5e3e3711507f25ca198e2b188ac" - }, - { - "value": 68986138, - "script": "76a9144fc5e274ffd18e6791c00f16fc7041855e521a5a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dc1df861a8c2a6fb728cd72d53a88472723b25d11ef458cad958044e634b5dd4", - "witnessHash": "dc1df861a8c2a6fb728cd72d53a88472723b25d11ef458cad958044e634b5dd4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 197, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c5182f7e33281c3856659852923ac8ff389d18cb99e5b030de071afe3cd344e7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 12890000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac", - "coinbase": false, - "hash": "c5182f7e33281c3856659852923ac8ff389d18cb99e5b030de071afe3cd344e7", - "index": 1 - }, - "script": "473044022055d05bcc5f1ae235f86babd90ab94086db108947e93732715197aef0381bcccc022029717c2ac22cc6653c19eed0cb855118aca74d43a18b310e7c87120dc6efd7c401410457fbf746bf1d48c6350a52e4c264a7e505056c2aadef3fa6d03c3e2abeaf704273500cf186513da95cbc2c6cbb6e55ab5942da7d5ac281319076bb8c1b0d27e5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1800000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 11080000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c8686bf594d37c47a728c7d36c3e78f0d84fff2f52d961216e07547f46fe27ab", - "witnessHash": "c8686bf594d37c47a728c7d36c3e78f0d84fff2f52d961216e07547f46fe27ab", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 198, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "dc1df861a8c2a6fb728cd72d53a88472723b25d11ef458cad958044e634b5dd4", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1800000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "dc1df861a8c2a6fb728cd72d53a88472723b25d11ef458cad958044e634b5dd4", - "index": 0 - }, - "script": "47304402202c0a2b67a74619beeaed8299377992164db7804bab46411216fcf81b07467cfd02205ec8139e4429cf739ace1efe5beaf367d2ae33fa786318752267543cfbf2bcfd0121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1790000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d210132a66be76ed8edbfe516e4c8d1ebcea2d5a29d7b4ae652e77892caa48a9", - "witnessHash": "d210132a66be76ed8edbfe516e4c8d1ebcea2d5a29d7b4ae652e77892caa48a9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 199, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d44428f72ece7ccbac629da10c4bbacd19224a191c92e503eac700c762a027cf", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 11046550, - "script": "76a9142490cdc303abfb8d25e6a139823c0fb1c396ae4888ac", - "coinbase": false, - "hash": "d44428f72ece7ccbac629da10c4bbacd19224a191c92e503eac700c762a027cf", - "index": 0 - }, - "script": "4730440220689d5bc399da4737f85c6c5445e76b5726858ad9b7606ffe03b5f61680580d790220740a674952d74f40f95b716023c8239fb7b4be3fe41b15330c1123f712097aa7014104199dec630581c4f6450f9b41e1c03f91f24dda9bc0550739e81c21562249f9d490ff0c517cd32cbe9e77ac67d10b0c0799db8305892d73ef20e34d8b0402edbf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4405480, - "script": "76a914fed2f26063b37e438cec2703cbf5a8e4392c5d1a88ac" - }, - { - "value": 6631070, - "script": "76a9142490cdc303abfb8d25e6a139823c0fb1c396ae4888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "855094f0f0205e664c64d6fefdb6053fe28e4556c4ba09b2ca7acd5fa57f92c6", - "witnessHash": "855094f0f0205e664c64d6fefdb6053fe28e4556c4ba09b2ca7acd5fa57f92c6", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 200, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8d71fe1692f78981a20fb5a2ce977e9d7b9ae6829252727234a38b7dcb09c86a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 9687576, - "script": "76a914e2006fd4ae784640679428b6cdf7cee4dd5880a488ac", - "coinbase": false, - "hash": "8d71fe1692f78981a20fb5a2ce977e9d7b9ae6829252727234a38b7dcb09c86a", - "index": 1 - }, - "script": "473044022067b363e87789be97fcf67840ddb44c157426caf72c1da5532ffbd9f2de8867570220663b06510badb6b484d29a61100cf99531c5999885148b04745a2beccc3d2cd5014104482138b31a8348b3a04af0a8cdcfa651a91a9be4fbc1e169d44663fa98b6b404e12486545a1d7fadb1db08feae0d3faafcb558e02be7a62d8c12864804a91638", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2500000, - "script": "76a91448c42eaeae081abd067b5edf51af7e57c56c4a0388ac" - }, - { - "value": 7177576, - "script": "76a914e2006fd4ae784640679428b6cdf7cee4dd5880a488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "059d9055a8ee5e2fd4327e93dca6ea1f8dc0e7c90344e96d5727cbcdc1ba5463", - "witnessHash": "059d9055a8ee5e2fd4327e93dca6ea1f8dc0e7c90344e96d5727cbcdc1ba5463", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 201, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c91d0bdbe4f6b0c7586e872af73ed9d2a3cca9e1e9448c1121cdff277c803cc1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1880000, - "script": "76a9145a4ecb5baeddd6a79eb7ce66b0e96314489fedf188ac", - "coinbase": false, - "hash": "c91d0bdbe4f6b0c7586e872af73ed9d2a3cca9e1e9448c1121cdff277c803cc1", - "index": 1 - }, - "script": "473044022023d4f8e841778b659e52bf446405e7f4863effc2ac428f6794d86318fbf9c47d02205b9954f836b1569a474cb5196fa2814b4a507ca960e8a3cb328f4db363ca9e5401410422cfc2bcedb10594d647ad4e2aebea5838a213146be941e62f0e1d9bb47927adce5d3b377101357b912bd821de6555116bd9a790ca69cbfdf56c303738edb7a6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 500000, - "script": "76a914d2c75a23ee8e15bcde722e6ea7485b3db2319dcf88ac" - }, - { - "value": 1370000, - "script": "76a9145a4ecb5baeddd6a79eb7ce66b0e96314489fedf188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c7d157782ebb347060b2bba17725bfe0072c7c9f76f21575ec82cb59ce1e903f", - "witnessHash": "c7d157782ebb347060b2bba17725bfe0072c7c9f76f21575ec82cb59ce1e903f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 202, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2aa2c5588031bf7a21509f7a3b0718d0efeebcd4b52def0a24e047139ed8cb9b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 3675000, - "script": "76a914ddbf0eec28abbe5be544890b4e894100c2b9c25488ac", - "coinbase": false, - "hash": "2aa2c5588031bf7a21509f7a3b0718d0efeebcd4b52def0a24e047139ed8cb9b", - "index": 0 - }, - "script": "47304402207e4a04b1544c66693764c9c99e3b829d5fe365ef20e963c0f044b46d81f8219202203d00d95f32c8e078f063361d8c0aae866acd4a87227798a4f08b499c4686b3ac014104c2de0fdc9c334a2b99fba3b2d4aa7206f2f74f029b04d402053d7e801bed90b3af5bd2a93dc493b40be9896c638fdefd560c94bdb0b4d255dcea26cd2c857bb1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2000000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 1665000, - "script": "76a914ddbf0eec28abbe5be544890b4e894100c2b9c25488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "45fbbc16e5730dbef91b6b31540722f7f00ba42ff31686f28074608c658275d5", - "witnessHash": "45fbbc16e5730dbef91b6b31540722f7f00ba42ff31686f28074608c658275d5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 203, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c7d157782ebb347060b2bba17725bfe0072c7c9f76f21575ec82cb59ce1e903f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2000000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac", - "coinbase": false, - "hash": "c7d157782ebb347060b2bba17725bfe0072c7c9f76f21575ec82cb59ce1e903f", - "index": 0 - }, - "script": "48304502210086c67ea4b61bf2104b1684c399e54938b152c7deb8d1e69af9439d48a9874813022060c234fd6d52bae0baccc2f06fbb2462b2d4c03464c245713fc4eff6e42f586f0121037bedeab7fcb8f05bc5fca2bb43525bd7af9f125035149ab4f48843db0ba37c8f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1980000, - "script": "76a91438bb181091ee71cc4a0259dc2fb43dc01622d71888ac" - }, - { - "value": 10000, - "script": "76a914ddbf0eec28abbe5be544890b4e894100c2b9c25488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "60f6f7ccfe96ee03db59230a88c70f9ac2d26988c749b9b8ecebc28407f46d7b", - "witnessHash": "60f6f7ccfe96ee03db59230a88c70f9ac2d26988c749b9b8ecebc28407f46d7b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 204, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "58858d9343e33eca0c73831a31b5660486180f4f176b11916088e768ffe25da0", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 2975000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac", - "coinbase": false, - "hash": "58858d9343e33eca0c73831a31b5660486180f4f176b11916088e768ffe25da0", - "index": 0 - }, - "script": "47304402200f2f20eb41fbd592852fb6a1326e537236b80491f28c03177031c562f93b49f30220787cc5023ca30a5a5f4fa8094c339c3a852db6a5a0b8394aaf43b17952bb46b801410408e0b2378aa23e30a4de4774fdf540f6a72449c99d29ace5a07ef04537dbf29504b7c4c4d5f82a0f949a7f039e386d68a3f1d04da7c86988311ae7ac824c9cb7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1400000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac" - }, - { - "value": 1565000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "be034aeea9400c833163839e1a13d1c67e85caf95d032b2f72fa78fb0074efbf", - "witnessHash": "be034aeea9400c833163839e1a13d1c67e85caf95d032b2f72fa78fb0074efbf", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 205, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cf6457b24c043b3d3d49657c49c2c3aa3d47eeb06c7c126a1ad1d82db8f02f0e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1518129, - "script": "76a9147840ab3e10213585f7c52d7b5396f80d67140cc188ac", - "coinbase": false, - "hash": "cf6457b24c043b3d3d49657c49c2c3aa3d47eeb06c7c126a1ad1d82db8f02f0e", - "index": 1 - }, - "script": "473044022027fc052f1394ac310cb6591b1793b54163dc2ce8a5e680dae793324d04d0ad7602205954bde8c2d10072be57896cf01aa56a269e5cf9dd083630e064f0932609de88014104f442ea70b4287080b971936e8b1044cad5df7f7762a50ff340b794b656852727b27367f53062035014427a02037907e21df0188df6eb92a907af9791ea2c2b3c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 440000, - "script": "76a914e83ad96c1e7399f12c60438cc3f97cbe1aec817988ac" - }, - { - "value": 1068129, - "script": "76a9147840ab3e10213585f7c52d7b5396f80d67140cc188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b4fa7015b676fbced8117ecef47883e8f6876154dc7d68f76c307f69b49fd02d", - "witnessHash": "b4fa7015b676fbced8117ecef47883e8f6876154dc7d68f76c307f69b49fd02d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 206, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ae4501368920a52e3a6107b48a6e3f1876d3c1772cee4c13ced8bd0fe06479fb", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299396, - "value": 249990000, - "script": "76a9140afcd889830cc4b753204934be819da95d4c7e2588ac", - "coinbase": false, - "hash": "ae4501368920a52e3a6107b48a6e3f1876d3c1772cee4c13ced8bd0fe06479fb", - "index": 0 - }, - "script": "4830450221009bdc2750d58dff4422dc5ec425cc59f99aba66bc1139e30f0b4c3fe1c99875e7022047dc01394621273bc8fed1cfb71f9fbdac022f8ff3b4a2b02e879936b58fde570141040c3f07b9d1861534599bd5aad6e991d1722b8035be62bed8533301a50a078f2498f942a224ef5eb2ed696eedeb990fe07bc06184be43e432ebd8a38accc15895", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 14000000, - "script": "76a914fe4f4ebed83f0a3aa1e7667c43d38f5e663c3c6a88ac" - }, - { - "value": 235980000, - "script": "76a9140afcd889830cc4b753204934be819da95d4c7e2588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dbd2980740195119eb9314add80a841e086f53b9f56f3b6f6b762e8001bf1fec", - "witnessHash": "dbd2980740195119eb9314add80a841e086f53b9f56f3b6f6b762e8001bf1fec", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 207, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "830f94dcf2595c697378167b98ceafcb9b3e80353a9fa5fc6f10be17d9622fad", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299967, - "value": 1023379842, - "script": "76a91437ac6c595c5fa66ce8d2a1055ee0b6ddfcdccd5b88ac", - "coinbase": false, - "hash": "830f94dcf2595c697378167b98ceafcb9b3e80353a9fa5fc6f10be17d9622fad", - "index": 1 - }, - "script": "48304502205ac9330477e400f8ca387c1d6030c73d3463005566aef7a0097c60c35fe0c631022100c93b4cb50bd7338c58643430c0d615f5c5eded7fa9dbe4c954e23c0990fad3f40141049af842244aac4299345522be966acbf5b21839596913d75c2a5d3f507c1b4d28a34db3adbb923faf72aef0b0fd21f720bbfe278a946b96e4315cf31ba02c78d3", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 33671000, - "script": "76a914717bdbb3da3babe1834251a343d308781f53b3db88ac" - }, - { - "value": 989698842, - "script": "76a91437ac6c595c5fa66ce8d2a1055ee0b6ddfcdccd5b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7eb196648bce30bcbf2df7c131aa1a2cc8ae3c41e7b721e44d7f1ba895e07785", - "witnessHash": "7eb196648bce30bcbf2df7c131aa1a2cc8ae3c41e7b721e44d7f1ba895e07785", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 208, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d8a1c18ee2d90a55de5f8f86fab9ca6b8a38a6285b25fd303ba4ba7dbf68ba3a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298324, - "value": 15440000, - "script": "76a91495365ba2fe4cf7fac8a159895b51d044af74802488ac", - "coinbase": false, - "hash": "d8a1c18ee2d90a55de5f8f86fab9ca6b8a38a6285b25fd303ba4ba7dbf68ba3a", - "index": 0 - }, - "script": "483045022100934f8a16c40bf0978e748ac2c7d7be1799bee510f932e0cc424146f74d3d3b6502206dfb2a1315c4b182282b88ac83c64d843610b6c0248c74695da12f8494e4943f0141046d6556a505e02af5498a83450382d2ea926da1a7d1be057328abf9e8bfd09455f1abc71ac82266afbcfe05e113f061be907f4380c88a4cf424172d07b289ec47", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 283500, - "script": "76a914a48c35e18e369168a18029a75ceb84705b1c87b088ac" - }, - { - "value": 15146500, - "script": "76a91495365ba2fe4cf7fac8a159895b51d044af74802488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f7967d217e7cd67baa414eb08eb3fac359cbe6cd70cc2becc3e8940f39e2cb7e", - "witnessHash": "f7967d217e7cd67baa414eb08eb3fac359cbe6cd70cc2becc3e8940f39e2cb7e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 209, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c09cb62172553f8523efde81727cf72e7f63ae2070a4b735dd32d32c102da081", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299686, - "value": 62929300, - "script": "76a914ab58815ecc8ddf4e86d6daa23db54f2de1a38b5588ac", - "coinbase": false, - "hash": "c09cb62172553f8523efde81727cf72e7f63ae2070a4b735dd32d32c102da081", - "index": 1 - }, - "script": "4830450220762771baf882667a4e6eafa1154c3a75de641c0011b1eb5dd67e6de91aaf8831022100bd5fed870998266288e860f343376d23fce779211bec7fcb122a7de33743cee20141041d24632a20f6fbbf8ab51ba2d368bdbf6177b6a8f7b0700e89bf496c8de05f8ad99415f237f83fd9db625a67cca5684ab987b9a491c835b1b09f6665ea80f3ae", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 32973156, - "script": "76a91474d5651497109434ee9167aedc96b99fba69edcf88ac" - }, - { - "value": 29946144, - "script": "76a914ab58815ecc8ddf4e86d6daa23db54f2de1a38b5588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3e55827311aeaa6c1c20d40b365e1cf6163e88add060a38740292686e93cdb5a", - "witnessHash": "3e55827311aeaa6c1c20d40b365e1cf6163e88add060a38740292686e93cdb5a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 210, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f5b81ba03e75e38251baf314879ce7d290c1265f471303a3cc6efa00cf362b73", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 9493868000, - "script": "76a914c5e062f551abdd2a0d643921bb2054b5183c3bd188ac", - "coinbase": false, - "hash": "f5b81ba03e75e38251baf314879ce7d290c1265f471303a3cc6efa00cf362b73", - "index": 0 - }, - "script": "483045022100ec00dc3d491435dedeaab6877841acb66466c0e763606397412715f894d2eac4022049f5e270765b7b26fbbe2848f707937f19401c2840c52fb4b18e3f7ec4a23c44014104f48efb30e8ad677df49b4d71d785fe57efac8df3894ac25229c6049d7dceb7a2f71e515a54ed664249dbd169ce3e6d1440e6f9247d210c5ad2a4a3680ad92f66", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 9480058000, - "script": "76a914c5e062f551abdd2a0d643921bb2054b5183c3bd188ac" - }, - { - "value": 13800000, - "script": "76a91484e548b85401e5f8a68915a1f28e9dc2f0b244fa88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a9de6c9e75d455f475ef81b0a2c928c0cdca937d37c386f3710dc16c7f376154", - "witnessHash": "a9de6c9e75d455f475ef81b0a2c928c0cdca937d37c386f3710dc16c7f376154", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 211, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "977a352e316e1e7e7b118bd0e5378eda6fd5efabb6c4d9eaf4564549d96bdc92", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298270, - "value": 4224894, - "script": "76a914c4d42fe7ed1f274b298a7bbafc7a54321cca4ad388ac", - "coinbase": false, - "hash": "977a352e316e1e7e7b118bd0e5378eda6fd5efabb6c4d9eaf4564549d96bdc92", - "index": 0 - }, - "script": "483045022100dadbb5d9658604704a77760df648aaaaa3054dbcd392cd58f8c78d4f4b2ff498022024120d7766232f217f0c8e6150d2bc83552748821dad64138ea2a7b54c8e5b1f01410407e5fe78b10d41904ef68c4542a1e83b8e9fd122b56edd75588aff642005c6c15f5be341801b2ed7dd1d7b41c5ea49fee924cdf6029338e5dcaa7c1e7d10f6d7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1530000, - "script": "76a914fb14fb94375fc4a877c35326f4885bbf0e4c766788ac" - }, - { - "value": 2684894, - "script": "76a914c4d42fe7ed1f274b298a7bbafc7a54321cca4ad388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c50ef971b51f31b554ff4fb34ec4a184bd98bf6259cf4e383e9ed26733bb1edc", - "witnessHash": "c50ef971b51f31b554ff4fb34ec4a184bd98bf6259cf4e383e9ed26733bb1edc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 212, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a89b413208f2cf739bcc3cb0c4ae432f4ba293ad7657643eb0fd1f1d58af0cfc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299063, - "value": 4678520, - "script": "76a9144e90b8d7f2d646f25a100ca0eed05760f3adfef288ac", - "coinbase": false, - "hash": "a89b413208f2cf739bcc3cb0c4ae432f4ba293ad7657643eb0fd1f1d58af0cfc", - "index": 0 - }, - "script": "483045022100b374c2814a6edd302a03abda3e8632611afac9943957a6a251645950e621a4cb02202e0b82bdaa8be5d6e384999a6bc57f5bbacc3533e41bda9d76ef703615aa37750141043942507f50df12e82a31a29c488e4509c43465a1fdd1bdd19bf2c90454d2ccbd1619ab3ab4206f66796a23f2342d7206cc13e7f3ca4612c0cdf8899010693a6b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 84000, - "script": "76a9143b96fff6364a054e979f41afc7edb36d7d34e98088ac" - }, - { - "value": 4584520, - "script": "76a9144e90b8d7f2d646f25a100ca0eed05760f3adfef288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3d6e71d4c582b6fe2d21ccb44799081e15c30c8b7a0f66b0e3cfd856a594eadf", - "witnessHash": "3d6e71d4c582b6fe2d21ccb44799081e15c30c8b7a0f66b0e3cfd856a594eadf", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 213, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b20f5a66c2494971bc708fe669e2a88981a6fefb0b6ee7be7a1b2aa71f48a703", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299738, - "value": 13380621, - "script": "76a914d9498b66c0316ff015814e91bc4c03c521c8cd7488ac", - "coinbase": false, - "hash": "b20f5a66c2494971bc708fe669e2a88981a6fefb0b6ee7be7a1b2aa71f48a703", - "index": 0 - }, - "script": "48304502202a05e37c9e2b854e9cd644a3abee40d76e7e53ebad0f3775b1c84b5b50de25c90221008879708124bdb2fc352ab7025dc1bdd1b60d1cbe98c3955e263efcfd718dae4b0141048139a69db2f7af19cb3a604b05e369b7b0cb11c7d051d1510bb5c1c531a25ee1b859848c570e4987f8e7e4cb3b6001ac3770d8a17cc0c88b13e76ed16ea18776", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11013701, - "script": "76a9149151bda1761c63f39346bf2e6ccfa50157939ad388ac" - }, - { - "value": 2356920, - "script": "76a914d9498b66c0316ff015814e91bc4c03c521c8cd7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7e2c4fc9ba2a1de93bb3cbb7dedf54dc3a5ca7f55d67a721c5d24c28a9daad53", - "witnessHash": "7e2c4fc9ba2a1de93bb3cbb7dedf54dc3a5ca7f55d67a721c5d24c28a9daad53", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 214, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f0b82da4cab68cef1050c475c40f299ac114466183092721ce74afc0c880805b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299314, - "value": 3984500, - "script": "76a91433b77b04ec1de113e83c2e1ffcff5bec878919cb88ac", - "coinbase": false, - "hash": "f0b82da4cab68cef1050c475c40f299ac114466183092721ce74afc0c880805b", - "index": 0 - }, - "script": "483045022100e9fb5bebcfcd8b86b1f731f9d4b6c61efbd2c7db9436c246378c03996427536502207051775cacac188e949af0ad7ca760d787f2d4d9cb4ce6522d1ab6badb52fc0901410455df966a59f39ca4e36c647ae8262e857266317bdbd22e566c623651579d12aefd987a8ffde2847459311a43951acf1d648d84d262edcf127e08b78d7759e5a8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a9142d7f6673e6c2f0ca90c96d05c3588f8a915c0aca88ac" - }, - { - "value": 3874500, - "script": "76a9140dc7c527d0175b7161c152a5476a826b1441f8f588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6a401ced94e43dee0acaffa906e73eb50dc4e83253fc52ad65eb5da5142af7d4", - "witnessHash": "6a401ced94e43dee0acaffa906e73eb50dc4e83253fc52ad65eb5da5142af7d4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 215, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "332a1dc6f54d54fc9efbdc3b466d08b7f4918706f54897e4df830cf3acf05011", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299928, - "value": 19359957, - "script": "76a91484dc7f03115f6ae77d49da4822c53899aa3d274e88ac", - "coinbase": false, - "hash": "332a1dc6f54d54fc9efbdc3b466d08b7f4918706f54897e4df830cf3acf05011", - "index": 1 - }, - "script": "483045022048fa94fd9dfad15e726b9c95766ee418a042b1972f98b6ebecf6ea2da13851e6022100fffafda29b474abc8e7796fb9b695f5b2c9109fbf77450a8ea61aa3fd5d3f83b01410492fe2c2153cf546472755d72644421b45a42356ac30bde263fc877cb54086c706fe22ffc90ba21f59f19acc59b31f8869cce0fe491b04ecc9ef5d89ff7824d68", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7550000, - "script": "76a91468974547af9bc1199d89335d4e1975984cc16c5c88ac" - }, - { - "value": 11799957, - "script": "76a91484dc7f03115f6ae77d49da4822c53899aa3d274e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0d5858163b0b16dc6ab877c915696a9f121522f524c228e35c3d5c33e941487f", - "witnessHash": "0d5858163b0b16dc6ab877c915696a9f121522f524c228e35c3d5c33e941487f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 216, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "62650f017ac2eb9c75a0544d992c527062823d579108545cb2a5479fb359b8a9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300000, - "value": 67895568, - "script": "76a91400cc7e866bf6cf66f08e96ac114eae16408ec2f388ac", - "coinbase": false, - "hash": "62650f017ac2eb9c75a0544d992c527062823d579108545cb2a5479fb359b8a9", - "index": 1 - }, - "script": "483045022100a328092274e68f32c57084959a974e120e7883b0072322ae86e90fb995bac13502207c759d90ed46b891fe1b5e761085093baa439d271c950f77c2cff7f74895ddd30141046dda918dcb208cfb57b36987818a505be4e7a9bb2aab3120486d503747c91119ca105189d89f549ec10f277a996e47d514b1e95db54efd566a503b77a0581553", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2940000, - "script": "76a9147c3139e6f21b7256bba8f2394f8abc3c0bc7345388ac" - }, - { - "value": 64945568, - "script": "76a91400cc7e866bf6cf66f08e96ac114eae16408ec2f388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dc448c02e7e493e193c8a3fcf0f6921551775248b921843102874d97b1d0cf20", - "witnessHash": "dc448c02e7e493e193c8a3fcf0f6921551775248b921843102874d97b1d0cf20", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 217, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e5cff96e3375ef342dbc8ab44e8aa5459347c93274eb88d38c4be1772bf3771a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299856, - "value": 5642956, - "script": "76a914ceb7d42f4dfb254659cfb345e404629fcf80099188ac", - "coinbase": false, - "hash": "e5cff96e3375ef342dbc8ab44e8aa5459347c93274eb88d38c4be1772bf3771a", - "index": 1 - }, - "script": "48304502204f994f59ee2a2f2ba53a6ce7a7e4013c3c88f28116709e0db0504d5c7c0a56f5022100d37cf79ea4a0de816d86f3be1c4546e65d97a3383afb826f801513caa4aaed0f014104ca2d3ec3df5479559af23278dab1b56e29a308f2dcfbe1f41ccee450d315bc93cfc659038596171ca974363c7e7164efcebcd933e9816910166d85d70eec564d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1101370, - "script": "76a914d5e6cc809a6840b67e5db7249d0f5f149dc912a288ac" - }, - { - "value": 4531586, - "script": "76a914ceb7d42f4dfb254659cfb345e404629fcf80099188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6be72267c9a08e969702c412a53d1249ebe01cd32f0c33d62b6b33eedc26b3d5", - "witnessHash": "6be72267c9a08e969702c412a53d1249ebe01cd32f0c33d62b6b33eedc26b3d5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 218, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4908309e52f8c0e1ae37d35df4b5a6ecc6531d3d922a10375f5755f84847bd85", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 451918100, - "script": "76a914fcce3c65933d2b1122b3712bce84b837f581010088ac", - "coinbase": false, - "hash": "4908309e52f8c0e1ae37d35df4b5a6ecc6531d3d922a10375f5755f84847bd85", - "index": 1 - }, - "script": "483045022100cd472b036fbc36bb1243392db527a03ac5185ead55be1a4022baac0e3ed5b4a402201fe3414f0fe660b504995126888f902d493da9c5a231d87e10b4d02903a3cc55014104ece257102cb0ccc032ef90c1b07b9586c1fde787ef376bc03750fa64601062dda95ec5de135d8766bef7ae0797fec116f570f4420d338081d2affe3b770579c8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 33748100, - "script": "76a914c799e00b3257ad1dd78fc5fd56d1672212db7d8088ac" - }, - { - "value": 418160000, - "script": "76a914fcce3c65933d2b1122b3712bce84b837f581010088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e3602d237616ce22def4ab6a54215bfb65f06bf8bde555d26f5c66bac72252ac", - "witnessHash": "e3602d237616ce22def4ab6a54215bfb65f06bf8bde555d26f5c66bac72252ac", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 219, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a51e282d90b2153c1c5ec8f1840b2d4211f6d6eba36af1cbfbf905b40822d93c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299858, - "value": 3927449, - "script": "76a914b6cd135ae7fc316ddde9d2240a238d6d090cffed88ac", - "coinbase": false, - "hash": "a51e282d90b2153c1c5ec8f1840b2d4211f6d6eba36af1cbfbf905b40822d93c", - "index": 1 - }, - "script": "48304502210088e9145a33439b158927cd174e7835397f1b56375053150a5316065b4db6057c022061fc63afdb698582205d9a517b8a24d06c641c91d94903d785f2d306a77485290141043b9c8fd3c4eb06402830ba48a407f3749154d08dfbe91083728866202b2517f4369b1e5f62ba55f7909d347dc49a641c9f004e4da59947bf51cebdcaef1c6509", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2249700, - "script": "76a91449f5bd810958cd7d24557c05d891a6ee621aeb2688ac" - }, - { - "value": 1667749, - "script": "76a914b6cd135ae7fc316ddde9d2240a238d6d090cffed88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "68cac3f892a91a8a8939e9d1b9f33e3e5fafc1472f1508712390eb1b3c12b627", - "witnessHash": "68cac3f892a91a8a8939e9d1b9f33e3e5fafc1472f1508712390eb1b3c12b627", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 220, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2de7b1635076e9d484a279ead9d9c2a4877213c8c36aa292432a4cc5281a1cb0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299922, - "value": 5563141, - "script": "76a91480ec695555b7a305defce6509867ce5c4456ee1d88ac", - "coinbase": false, - "hash": "2de7b1635076e9d484a279ead9d9c2a4877213c8c36aa292432a4cc5281a1cb0", - "index": 1 - }, - "script": "483045022100965e4a22ebad94cb4dfcc02dead7b4faf1a262afbeb1c6b38696599a670ee8110220121867de333e197961ef31ada0d97566925c43a43d6134325019b6a41bfa5728014104652c30b28b3d3d6bd83d4cca8b1361af545640728930e9703177df06150984b703e50fcf9f2999f0d9fb2e6dd943d41ebd79216a756ae7b4f96ce7a352dae7c0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2202740, - "script": "76a9144bab299de43d5f6388f602c8febcdf67417db70b88ac" - }, - { - "value": 3350401, - "script": "76a91480ec695555b7a305defce6509867ce5c4456ee1d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "20e567b7035a956a07893bc3c06ffbee7561739ad517e072af2067e931c07884", - "witnessHash": "20e567b7035a956a07893bc3c06ffbee7561739ad517e072af2067e931c07884", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 221, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5e6c879a86b2bd4644c3dccf3964f21c814c4b3cab0f6c174fff8520905bfa34", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 225606319, - "script": "76a914843d0dc511df2ef7e13d312a7bd7a5c44c5bf2fb88ac", - "coinbase": false, - "hash": "5e6c879a86b2bd4644c3dccf3964f21c814c4b3cab0f6c174fff8520905bfa34", - "index": 1 - }, - "script": "48304502203d0179635a5f747a4cdc448078dcedf5add6297a6d61d65dcf2ccd29fd9ce254022100e49bfe71aceba593b6d2af99f97b4c47467ee09112e953dd9a957ba231132a43014104457fa673577c17a8c516bcdef8a74676363b2be363d0309dc1689821dd3b813744bdc9baafca51e1eb6f2e837dbd05549bf3d6257050d87da03d8084bf18d25c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 150000, - "script": "76a9145c84ebab10bdf995178e972e5aac94c6b1c5405688ac" - }, - { - "value": 225446319, - "script": "76a914843d0dc511df2ef7e13d312a7bd7a5c44c5bf2fb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4c99a15078620d8cd09d27728d5eab61594f0d56038ca60e00f00cfcc6551800", - "witnessHash": "4c99a15078620d8cd09d27728d5eab61594f0d56038ca60e00f00cfcc6551800", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 222, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "bac9484d0e77a444a0b75c11aa9af6dd2b647bd74bb78488cc8409455e1f90f0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299942, - "value": 4564642, - "script": "76a91478770be5aca1444090fe32e272d5501847298c4b88ac", - "coinbase": false, - "hash": "bac9484d0e77a444a0b75c11aa9af6dd2b647bd74bb78488cc8409455e1f90f0", - "index": 1 - }, - "script": "48304502205821476ba097b211050bf5dc3eb243f7fb58d7a9c6fb18b86564e39301f976aa022100e15123824e89d8a97c8572c79cf2a6e03c5ba94769360bfc4b1a3c6684336506014104aa12ff1ffa41fe8328a5e2854c4b7f2875a3b9c57b100c69541f95b59dc03f2b5a863f72f133f74c74034304110959789bb2680d817bdba9f89234b01bae3308", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3083836, - "script": "76a914dab29e122ca01cfdc00fdea6d8d88f58fcfbe68588ac" - }, - { - "value": 1470806, - "script": "76a91478770be5aca1444090fe32e272d5501847298c4b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cbf77f93ee10fd668147435243688fc1d473c5c78998d95fc5989414f8fe3915", - "witnessHash": "cbf77f93ee10fd668147435243688fc1d473c5c78998d95fc5989414f8fe3915", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 223, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0cac8f5ff1c6bc9d7cde00649deea2af571948d40e4737e10b9a05948d226e41", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 33587834, - "script": "76a914d1149728645fd4648e86d0687e115246cc060cd788ac", - "coinbase": false, - "hash": "0cac8f5ff1c6bc9d7cde00649deea2af571948d40e4737e10b9a05948d226e41", - "index": 1 - }, - "script": "48304502207698f8e949394d5df22740b89f4ce7c6fa158e3a0cdffd60b261b9de294a627502210086142bb5ba20fa53342972d3d1982c012de6ead5a42d22e2c8d84fe41900371e014104361fdbdbdf0ce71d8df283700e9f7ba97367c6ad02955558de33da5fe86adb4bfff95f98a88ffd806072b2559d9d19439155ec16e4359178d84c4f9f044d6493", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 32807916, - "script": "76a91413cbf79e069e9fcf382fd9f18e664f17593e8b3b88ac" - }, - { - "value": 769918, - "script": "76a914d1149728645fd4648e86d0687e115246cc060cd788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7b4b94b9346f73cb469c930cb274732c6c3678b3651bf5688398fbaefbac83f6", - "witnessHash": "7b4b94b9346f73cb469c930cb274732c6c3678b3651bf5688398fbaefbac83f6", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 224, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e4efbae113ec2ebfed41b8c199da19b4f507000bdff28d09bcd6caf8f245e6dc", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 30221634, - "script": "76a914e349adac3e1cc84acb4173175c96b88f91576c4888ac", - "coinbase": false, - "hash": "e4efbae113ec2ebfed41b8c199da19b4f507000bdff28d09bcd6caf8f245e6dc", - "index": 1 - }, - "script": "4830450221008fbd513eb4a319b2398f282fdf704fdcd4e00ee4a4bba10ce51271abbe75208502207e819f980a19b644d81939f5e06fa30508d86b67a2d80308063510bf0cc21c5d014104aaa94a132f656c10d619ddce4f47e0e8c4a9f8354bba2a939d9a2b3e573595738c906ba6194d94db9eaf159da70d558bf8381679fcb7eef98e2a2e8489f1105e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3000000, - "script": "76a914e394c7029eb2c5d80480f284edc9bdf98087332e88ac" - }, - { - "value": 27211634, - "script": "76a914e349adac3e1cc84acb4173175c96b88f91576c4888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "349fd4c3cc1b1586fb7076af24bb2e0ebe2ac6d3cfdb7f334ce9caa189527a37", - "witnessHash": "349fd4c3cc1b1586fb7076af24bb2e0ebe2ac6d3cfdb7f334ce9caa189527a37", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 225, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7b4b94b9346f73cb469c930cb274732c6c3678b3651bf5688398fbaefbac83f6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 27211634, - "script": "76a914e349adac3e1cc84acb4173175c96b88f91576c4888ac", - "coinbase": false, - "hash": "7b4b94b9346f73cb469c930cb274732c6c3678b3651bf5688398fbaefbac83f6", - "index": 1 - }, - "script": "4730440220152f226d1a1eb61e640fdde196ff36e781c7c1162754426e096bd5f0e6b4f65802203e45aa481372229d773bef24879866fe8d524285825f96ecc5ace1fe59f66fec014104aaa94a132f656c10d619ddce4f47e0e8c4a9f8354bba2a939d9a2b3e573595738c906ba6194d94db9eaf159da70d558bf8381679fcb7eef98e2a2e8489f1105e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7000000, - "script": "76a914e394c7029eb2c5d80480f284edc9bdf98087332e88ac" - }, - { - "value": 20201634, - "script": "76a914e349adac3e1cc84acb4173175c96b88f91576c4888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b2b73f43ab422b8adb4e5cbbf58adbb61fe88be09bb48df3bbb8efb4586426e7", - "witnessHash": "b2b73f43ab422b8adb4e5cbbf58adbb61fe88be09bb48df3bbb8efb4586426e7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 226, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1497fcf78a31daa96609d5fbe49e27929b023a7603c7074ec20adda7285a0491", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 16576389, - "script": "76a91442929bff95b785ba7de16a75234f846f2bc5a0e488ac", - "coinbase": false, - "hash": "1497fcf78a31daa96609d5fbe49e27929b023a7603c7074ec20adda7285a0491", - "index": 1 - }, - "script": "483045022100e73f55722c9d9b11313366e14058b11be269b7b138ff44bbd8df089cd5dd944a02200f1aa923ae300936d6dc3e8022dab77e26daa4b41d6a6c5f48132db89239fd4e014104d8a8bc10249e7ab0ccd37697f19cedf0114c73e73bca542cb8e41ad09b89ead48f6e84cb383677aa1ad3f7c094948183c5d320c8a77a4707597f9d296cf962ce", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 12000000, - "script": "76a914a2eb9424d630941be52428941636c0caa31deb8c88ac" - }, - { - "value": 4566389, - "script": "76a91442929bff95b785ba7de16a75234f846f2bc5a0e488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6d6c61c07eedd91c023ec9bf67c6e2b7468ce6886984686bfb3bc344af4ca37b", - "witnessHash": "6d6c61c07eedd91c023ec9bf67c6e2b7468ce6886984686bfb3bc344af4ca37b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 227, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f0b29a54668b757af8020f63d3384a36b1ca7099cfcfa967c0f7cb81520705b9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 4725000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "f0b29a54668b757af8020f63d3384a36b1ca7099cfcfa967c0f7cb81520705b9", - "index": 1 - }, - "script": "483045022052cbfae8bda73fad86464f48f49ed7e2ce473bdf9f3cf0d60528be9c8e79f5b5022100a03aebf5712c56ab8226b4078105a274028a5d3d58089744028b762cbca294a801410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2200000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 2515000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e550b98316693e73d83da75300ad3faeb99a968eeda47edaa2214457207eaab0", - "witnessHash": "e550b98316693e73d83da75300ad3faeb99a968eeda47edaa2214457207eaab0", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 228, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6d6c61c07eedd91c023ec9bf67c6e2b7468ce6886984686bfb3bc344af4ca37b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2200000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac", - "coinbase": false, - "hash": "6d6c61c07eedd91c023ec9bf67c6e2b7468ce6886984686bfb3bc344af4ca37b", - "index": 0 - }, - "script": "47304402206d55388d8453e52e9ee91591872ec6a4224c9be6862e91ca7a57aa83d9df3d7f02206adb2e6c65eb9b55c562c98c5abeaf9aa93218e00843f0235359c7666bcd181d0121037bedeab7fcb8f05bc5fca2bb43525bd7af9f125035149ab4f48843db0ba37c8f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2180000, - "script": "76a91485c926cc9a4519a5789412dc8e5bbca5f0d1b86988ac" - }, - { - "value": 10000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1e4ae00f2afbb2921e9815209ece36be3412bd794db1759bffe95ae30ec1265c", - "witnessHash": "1e4ae00f2afbb2921e9815209ece36be3412bd794db1759bffe95ae30ec1265c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 229, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6534c0124ab957f1d0cd4aa42972e295a3847898cf7f5a851c404457866ca9c5", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 4295000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "6534c0124ab957f1d0cd4aa42972e295a3847898cf7f5a851c404457866ca9c5", - "index": 1 - }, - "script": "483045022100d79061140faca029d40084616f8dcdc65b2268e6a0bc4099e5190b419b638741022005e73c5801a2dfe1b8a8329a89cf7811a769c11fd889e2f754e22745eb5e92c201410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2700000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 1585000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5e5a3bb35ac6acf35a73189414f16aae35b4eb700143b157b30d98a6430372e9", - "witnessHash": "5e5a3bb35ac6acf35a73189414f16aae35b4eb700143b157b30d98a6430372e9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 230, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1e4ae00f2afbb2921e9815209ece36be3412bd794db1759bffe95ae30ec1265c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2700000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "1e4ae00f2afbb2921e9815209ece36be3412bd794db1759bffe95ae30ec1265c", - "index": 0 - }, - "script": "483045022100870325d85c919031e5a5a5d9bc48514c7a876d00fec86d72798059c9fde890ce022006b485e224414ccc04b1b79688dad3a535c70cfc1eaa61c35605abd754091b590121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2690000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1fafcb932f0ca6ff030b025fc322066490f15179864a3613727cd7451281981f", - "witnessHash": "1fafcb932f0ca6ff030b025fc322066490f15179864a3613727cd7451281981f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 231, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4eea84dc341083452c1aac0257ab454b36888d9ec5a2c95b56e5713d9dc3c1bb", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 12690000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac", - "coinbase": false, - "hash": "4eea84dc341083452c1aac0257ab454b36888d9ec5a2c95b56e5713d9dc3c1bb", - "index": 1 - }, - "script": "483045022100f272288ef212962632bdcd104404ebc3010cff252ca9b8b8079aaf0253e31047022070533b20c1829c23b3c629c8cf14bf8980fc9613b531b95e9bd15bcca1104505014104e104b1a7cdb22d7ee5acf80865fb952360ff0af8498a7d141a5fe4d33742ecfa42ec49ff4eb8313b57cefea35b9e916cb39fa1405b3b8944f369220094bbb3cf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1300000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac" - }, - { - "value": 11380000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7e4c2bc61090dd222764e02d3f133d0d63c500d2c84e7fb34563fd6002fb2b0e", - "witnessHash": "7e4c2bc61090dd222764e02d3f133d0d63c500d2c84e7fb34563fd6002fb2b0e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 232, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1fafcb932f0ca6ff030b025fc322066490f15179864a3613727cd7451281981f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1300000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac", - "coinbase": false, - "hash": "1fafcb932f0ca6ff030b025fc322066490f15179864a3613727cd7451281981f", - "index": 0 - }, - "script": "47304402207e148ed939a477de6ccaaee0acc3fefd9a4c1c49794e3d0a5fa2909516c3127302202c2262deff8ba54815b249adf58719fe615fe5aa1f8ecaea7680028cf6527b89012103afd34045d7080e5f3d8fc0efab187951caed4b06571c7cc617d01d9abe8b36b5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac" - }, - { - "value": 1280000, - "script": "76a914cdd6cbd410b70ecbca00b02d0f962b710a7fdec488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ad1f912113a902413e4840c85bed595658facaf90e96b3d0cdde85f5b2ae7e29", - "witnessHash": "ad1f912113a902413e4840c85bed595658facaf90e96b3d0cdde85f5b2ae7e29", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 233, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "dbc2c2bc0828ea7710d8c3bb8c01a39fd4bce45bafeba188b5c665a9f7c97e1a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 11564258, - "script": "76a9148444e446b0e0b673a9df7f9f141b1d69673c701488ac", - "coinbase": false, - "hash": "dbc2c2bc0828ea7710d8c3bb8c01a39fd4bce45bafeba188b5c665a9f7c97e1a", - "index": 1 - }, - "script": "483045022100fe87a415858eb22dd9d81505b3f55728ba5e72286fe968dd67fb1375beb57f9402205819eea0f13f6b79efd80dc1d08ba454485f274e99122ec86198f64e799952cb01410403a5971577258b52229714475e20ee1c66219861b22dabac28a42804beaf8e226d2b37c29a48ddeb92a4a8f2dcd939159dd7ff5baf56a92fd91261aeb7e1aa6a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1500000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac" - }, - { - "value": 10054258, - "script": "76a9148444e446b0e0b673a9df7f9f141b1d69673c701488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0b82b25627cecc831c8a48e19437fefcc81b18ebe8252e105f96c4f1b03d720c", - "witnessHash": "0b82b25627cecc831c8a48e19437fefcc81b18ebe8252e105f96c4f1b03d720c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 234, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "08ef4e9668846e3f11bb5ab6b72ac379fec4fcbb0d049723230a0cd4a686964f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 19047600, - "script": "76a9141d03bd9811980f07dc4c0561abf1dcfc18880d6088ac", - "coinbase": false, - "hash": "08ef4e9668846e3f11bb5ab6b72ac379fec4fcbb0d049723230a0cd4a686964f", - "index": 0 - }, - "script": "48304502202b01044f381d209e8c4ec4cb4a36095a8cf79b7314903202f9e41cb03b08e06c022100ca2220ac45b577647a3dca67638a24a4075e9d81b358658347ff40ba1479a35001410492c48d00c45f8ee6bd6f068c9fe677d1f8a95b672ad303840052e3d759303666789b47f19af568d36327cb861f1964d2bb2de6e7a486857b6a03f773e4590311", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 13216441, - "script": "76a914018579859d6e174b290ae7a8b34d1d0f98d2781d88ac" - }, - { - "value": 5821159, - "script": "76a9141d03bd9811980f07dc4c0561abf1dcfc18880d6088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "078caa9f781b2c346090929c36ff28536e11c840909b8afa61c383a7b82072d7", - "witnessHash": "078caa9f781b2c346090929c36ff28536e11c840909b8afa61c383a7b82072d7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 235, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "baffe65825ae2fd54a95cf14df0633be221a38bc3edefcbddc1e882bd1dc33f2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 8674181, - "script": "76a9140b5f9578dbedb411291669e1afe5b3ff66713ec788ac", - "coinbase": false, - "hash": "baffe65825ae2fd54a95cf14df0633be221a38bc3edefcbddc1e882bd1dc33f2", - "index": 1 - }, - "script": "483045022060c4e272d15fbba3aaa2e71277024801e0f067f21fe9e097c322e43ed19489b802210089aa8d83aeeebcfb6a2fbdcc3dca9cb17926145271ea9721c4ffeb0287ef90c10141046e38ced760e3ce6224ce481056c1e00120f571dc2f4254eca8051af62c6aa2c36dfb1f4c0ec3e0e24030829781f0c637ea5a9172b495e9c2b9c077c9fb277ef5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5716170, - "script": "76a914f52f272af1f6cba2b006c1fc9876cbfa483e5eba88ac" - }, - { - "value": 2948011, - "script": "76a9140b5f9578dbedb411291669e1afe5b3ff66713ec788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f18ece5101763235b57a5525d3a2b35999bdb02ea2bd9d5d9eb8f0d37398ae53", - "witnessHash": "f18ece5101763235b57a5525d3a2b35999bdb02ea2bd9d5d9eb8f0d37398ae53", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 236, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c3745da12cb1735fb6eb67646011de07b9400d034b4dc8dd09bf2cb01ba7b77f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 13741987, - "script": "76a914561f48bcaafdf1809487b54985775fede82556de88ac", - "coinbase": false, - "hash": "c3745da12cb1735fb6eb67646011de07b9400d034b4dc8dd09bf2cb01ba7b77f", - "index": 1 - }, - "script": "48304502202a1f6ab604ef55825983aca5d3156e0f687cbb88a7dd74e690f4268b73bfb59d022100f5eec48cfe9f482193bd042a510cd28d0194b6c9fecf51779f92e6cb174becc80141041a918391c618997d97422353f44d43b18717ced1909a517745593441970c267e64f698df5a2f2f887a6caeb4b9b46f35e902f9c4b65820bf3466ea2e1df9f370", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7929864, - "script": "76a9144800670a693aea48ff264000a2c1aade9aef18a288ac" - }, - { - "value": 5802123, - "script": "76a914561f48bcaafdf1809487b54985775fede82556de88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0404ec9a48dccbf49814989ae82d1a03f6082349cea5063b0c8c6aa9303367ec", - "witnessHash": "0404ec9a48dccbf49814989ae82d1a03f6082349cea5063b0c8c6aa9303367ec", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 237, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1bb9921704561de415bcd9dec76aba350646526cb065eef893ff86ac50860518", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 2695000, - "script": "76a914cd9f95c6872bd126ad562b7139310683cc2468a988ac", - "coinbase": false, - "hash": "1bb9921704561de415bcd9dec76aba350646526cb065eef893ff86ac50860518", - "index": 1 - }, - "script": "483045022100a3c8968e70e3721b5a3d8db5bb3d745b1f2209951ed094a91c7bafacd77521c302205d31b5f7dc3c736fa0241318a051f1fe2b2e3c459ab872b11695b0d49275205901410452f1ff1699cf346d57b522b8071789c6f824b90ecddd00e388e57b20f0a51bb7a75e90d075fc8a3b8176b57e3e704200413c7fdcb41a48a5320a9f1cb15a3700", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1300000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac" - }, - { - "value": 1385000, - "script": "76a914cd9f95c6872bd126ad562b7139310683cc2468a988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3b3fc7c04f2a34daa471d2552de578255e7463e7872ef3fe153074e390c8f136", - "witnessHash": "3b3fc7c04f2a34daa471d2552de578255e7463e7872ef3fe153074e390c8f136", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 238, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0404ec9a48dccbf49814989ae82d1a03f6082349cea5063b0c8c6aa9303367ec", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1300000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac", - "coinbase": false, - "hash": "0404ec9a48dccbf49814989ae82d1a03f6082349cea5063b0c8c6aa9303367ec", - "index": 0 - }, - "script": "4730440220117f80b0ddc6c043de65ef41fb2a8cf343ed4c930f9941cd7841c4ac95fa4458022064e6881d9787b54b5d7328475087226ea4a3538d456926bb4bdc2261a4a1a482012103afd34045d7080e5f3d8fc0efab187951caed4b06571c7cc617d01d9abe8b36b5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1280000, - "script": "76a9143dfeb05e14625b32bfe7be9c5454e599dc2d74b788ac" - }, - { - "value": 10000, - "script": "76a914cd9f95c6872bd126ad562b7139310683cc2468a988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0c4884af71ac4d81fc6017701a7cd8a129cde30cd9fdfbb097099b1ef98796d7", - "witnessHash": "0c4884af71ac4d81fc6017701a7cd8a129cde30cd9fdfbb097099b1ef98796d7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 239, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "27ec73c50cb9d99793d816f05fd4a867ec7d67c3a74ff463e27d67f12f7bde7d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 3555000, - "script": "76a9145e93e0f7f835cc5c65d9f6c064b81767a2596de588ac", - "coinbase": false, - "hash": "27ec73c50cb9d99793d816f05fd4a867ec7d67c3a74ff463e27d67f12f7bde7d", - "index": 1 - }, - "script": "48304502210087eddc6a22125ba89b178bb469c77e83e39ef6fdb3ea12225ee3405092213d2b02202fca8213b84432e0a3c8013bcda79256ea1212510051477c508ff9ed786b2391014104bb5d8ac634cba4d445d19e231fe19234aefeb538aa699732eadec54ae538dc659a7e8835ffe6287a836f341c5dd9d5edab7d1496b260e0cdb01f50cd318c90d7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2300000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac" - }, - { - "value": 1245000, - "script": "76a9145e93e0f7f835cc5c65d9f6c064b81767a2596de588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3e072881a1e965ccabb705f2495e5c6ad85d81f868299bb83d3f848876e73820", - "witnessHash": "3e072881a1e965ccabb705f2495e5c6ad85d81f868299bb83d3f848876e73820", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 240, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7bc7d8837fb03518358cbb09da297f99c9b98663443025723817779fab0b0894", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 3500000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac", - "coinbase": false, - "hash": "7bc7d8837fb03518358cbb09da297f99c9b98663443025723817779fab0b0894", - "index": 0 - }, - "script": "483045022060cf020cf444c9a194c63c96cb07c3511ba7850020287fd12aa00a278ebef830022100f442927349cf8ee06dba8a5b353f289fe405bca14942e207b29e418ed91970430141048372c61c205da3b5d1535fb2cfc18830af5f2ed8d06356657d514b47ee7b08bbe9265438708cef0c13738c52ae607c9e2cb6076697b7cea63b9e69dd1e98dd97", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1500000, - "script": "76a914626ebedca70103f5c1e06ed5904f0bc478a263df88ac" - }, - { - "value": 1990000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "44ef67b925432050bb10af2633f0bc499bb652e3697da5ccdb852b551241f851", - "witnessHash": "44ef67b925432050bb10af2633f0bc499bb652e3697da5ccdb852b551241f851", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 241, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "17ea52310ce51150addcaac5e17b2323e8c7800bdbedcb9b4336660f3b32df9f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 6386172, - "script": "76a914c179b91aa8bd17ad055a27975287116c660cc24088ac", - "coinbase": false, - "hash": "17ea52310ce51150addcaac5e17b2323e8c7800bdbedcb9b4336660f3b32df9f", - "index": 1 - }, - "script": "4830450220280f03be53353209f084a22e2aadd6259cf24eb49b0b2e428d6e9585ac452e3b02210089139621595d54dfc46241bd54b6d74203b1ab51a9efc30128d84570339003b30141042bb3fdc58be4484c86337e1373d4a8a545231ca5b3520e5a64c25c35d865e974913faf17f83d8b6cf9b2aee637172cb74866b739706e3679baed121c91a7583f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a9145d21f93d690a60d67d5a28d32330a57dfbfd7f2f88ac" - }, - { - "value": 6366172, - "script": "76a914c179b91aa8bd17ad055a27975287116c660cc24088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2179eb00b5e2d800104a0d00d117c0d81ccc0d925ad27c396270c75a8b32e731", - "witnessHash": "2179eb00b5e2d800104a0d00d117c0d81ccc0d925ad27c396270c75a8b32e731", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 242, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fbadb361a0d96738184659e802a9b2c64579bca34394d5fd9d5457822690980c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 200000, - "script": "76a914da5dde8abec4f3b67561bcd06aaf28b790cff75588ac", - "coinbase": false, - "hash": "fbadb361a0d96738184659e802a9b2c64579bca34394d5fd9d5457822690980c", - "index": 0 - }, - "script": "483045022100e00eeac3144b7a9bc9abd891b6ae23b9c145b8e2d1e359c3c1b093bbb913a3c10220055a898c0c7a372ccb9fd4dc97789342ee801206878c6475b8f2b489865cddea0141049de1c8260ad5729982fa9589f0aa795a76dbd9695418c232963098eac9c1a2b3c74669555f94f6e3fe7800916a8e30651dc7eefdb82e773bb096358420818d5a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 160000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac" - }, - { - "value": 30000, - "script": "76a9144f2d8082ca48ed2f8cb5e8417c1bd17756796a5288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b9c1fe0ec24fc762ecaf06fd547158f89abdfd2f442cacda51f4a577646c4d3d", - "witnessHash": "b9c1fe0ec24fc762ecaf06fd547158f89abdfd2f442cacda51f4a577646c4d3d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 243, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "44ef67b925432050bb10af2633f0bc499bb652e3697da5ccdb852b551241f851", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 6366172, - "script": "76a914c179b91aa8bd17ad055a27975287116c660cc24088ac", - "coinbase": false, - "hash": "44ef67b925432050bb10af2633f0bc499bb652e3697da5ccdb852b551241f851", - "index": 1 - }, - "script": "483045022100898eeb46e230f14e3ac6f078844d9504e4833e9b611fd550de6eb95f7b6fd865022005ce53fefb14bbbf97e728bf61be18cc05c179f660429709e978e3e411c2f7b50141042bb3fdc58be4484c86337e1373d4a8a545231ca5b3520e5a64c25c35d865e974913faf17f83d8b6cf9b2aee637172cb74866b739706e3679baed121c91a7583f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a91464f1ddf8f325b19b4059436f1812ddd317bec81488ac" - }, - { - "value": 6346172, - "script": "76a914c179b91aa8bd17ad055a27975287116c660cc24088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dd4f2bfeb33c421067de9f833c19a1e36cff3ad2866fe883c0fdb99bf9faf7a5", - "witnessHash": "dd4f2bfeb33c421067de9f833c19a1e36cff3ad2866fe883c0fdb99bf9faf7a5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 244, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9ba6bbda4cd185f12d81ab7ef5f5f6e865ff0e8855f2743f6e15f464be151dfd", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299346, - "value": 125983020, - "script": "76a91495365ba2fe4cf7fac8a159895b51d044af74802488ac", - "coinbase": false, - "hash": "9ba6bbda4cd185f12d81ab7ef5f5f6e865ff0e8855f2743f6e15f464be151dfd", - "index": 0 - }, - "script": "493046022100e42679fa50972fa3cd882cb1376c6ee6198e514bb7fca4a5fdbfebbe0a55748c022100fb56193229eca2448c79cfa2cbfa2ca1e2679979e3f13bd73e619626c80637de0141046d6556a505e02af5498a83450382d2ea926da1a7d1be057328abf9e8bfd09455f1abc71ac82266afbcfe05e113f061be907f4380c88a4cf424172d07b289ec47", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 592920, - "script": "76a914adf95b6304caef49ee8799a65e471f1ea1ffe21688ac" - }, - { - "value": 125380100, - "script": "76a91495365ba2fe4cf7fac8a159895b51d044af74802488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f15bf0bd183affa15f8da03b4fe327df2ee61a3241682cb2a75466146000334d", - "witnessHash": "f15bf0bd183affa15f8da03b4fe327df2ee61a3241682cb2a75466146000334d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 245, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a5407b3c4f185a21b29876da472f00c58f11847e99d873510ca6cf19f75a5c12", - "index": 1 - }, - "coin": { - "version": 1, - "height": 296690, - "value": 13966152, - "script": "76a914f6fad39e02a90d87c8379790548957f88d749fb488ac", - "coinbase": false, - "hash": "a5407b3c4f185a21b29876da472f00c58f11847e99d873510ca6cf19f75a5c12", - "index": 1 - }, - "script": "493046022100bc6babaaae9fbd81016551d13e0118311ef9d0ca9f8b4a7c1482f2844c7e86400221008a0cd454da1694c21801431c7701b964593aff727dcf4f3192aae5545b428c2c014104d4370857dad9a0159a9da1fa7d40aa2576c2484d9a8be5c3e97606b9b95094301c081fb20479e01c0780cd3865edd6ff176ea52ad5b3a1799e3e8cb93a2dea3b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1600000, - "script": "76a9141f1797bffa50d49f254f1c583ab7ecf846cd7fd988ac" - }, - { - "value": 12356152, - "script": "76a914f6fad39e02a90d87c8379790548957f88d749fb488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c140980f9f9ba3c6efdea31a5f1a39e2167cbf13bd6d35f635be96df71b36c51", - "witnessHash": "c140980f9f9ba3c6efdea31a5f1a39e2167cbf13bd6d35f635be96df71b36c51", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 246, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e888024c010ec2de9f11f07491bc24bf066a2dc3cd3d5afbc19221ba546afeca", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299952, - "value": 63598215, - "script": "76a914dd3ec87d40d60a9b3b22377a3e2947dbec5bd19488ac", - "coinbase": false, - "hash": "e888024c010ec2de9f11f07491bc24bf066a2dc3cd3d5afbc19221ba546afeca", - "index": 1 - }, - "script": "4930460221009e200e42e5ca989520f2085b0b3db9c806231e73dcb89a24f923c9aad88970ba022100d60fbeaee56b0c4a4e34800d136c6c0085d1fd016763cd28d0169c1486364100014104cde254dc34c5c13588d61caf3f562ac3b825506b7498bb1829aa4150a18d8bc556cd85fc7f052dbfa9e9eb60806a181b8178f1899dd726f03b3ad697114da0f4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1063800, - "script": "76a9146aa74d499f6cbd15705c55da9b739af7311f9e6e88ac" - }, - { - "value": 62524415, - "script": "76a914dd3ec87d40d60a9b3b22377a3e2947dbec5bd19488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4cbefa26add0b81214d07840fe05b16f1d82992ae671bab565026b1b641c29f1", - "witnessHash": "4cbefa26add0b81214d07840fe05b16f1d82992ae671bab565026b1b641c29f1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 247, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c140980f9f9ba3c6efdea31a5f1a39e2167cbf13bd6d35f635be96df71b36c51", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 62524415, - "script": "76a914dd3ec87d40d60a9b3b22377a3e2947dbec5bd19488ac", - "coinbase": false, - "hash": "c140980f9f9ba3c6efdea31a5f1a39e2167cbf13bd6d35f635be96df71b36c51", - "index": 1 - }, - "script": "48304502205fc2cddcb7e668a4ac773284e38dcda24fb98b826d7293f4d42c6795411904e7022100f08a3c2946a33df144c97e4ff6c560f0ca6b45d412de465d18d271605b11475d014104cde254dc34c5c13588d61caf3f562ac3b825506b7498bb1829aa4150a18d8bc556cd85fc7f052dbfa9e9eb60806a181b8178f1899dd726f03b3ad697114da0f4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8510400, - "script": "76a914e2a42a5a493f78a04a9cc151acb8d3935b4c694488ac" - }, - { - "value": 54004015, - "script": "76a914dd3ec87d40d60a9b3b22377a3e2947dbec5bd19488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "10b1212240fc95e871e57d931e478b96bc247a7268578f85cd35b41780e1b33d", - "witnessHash": "10b1212240fc95e871e57d931e478b96bc247a7268578f85cd35b41780e1b33d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 248, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4cbefa26add0b81214d07840fe05b16f1d82992ae671bab565026b1b641c29f1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 54004015, - "script": "76a914dd3ec87d40d60a9b3b22377a3e2947dbec5bd19488ac", - "coinbase": false, - "hash": "4cbefa26add0b81214d07840fe05b16f1d82992ae671bab565026b1b641c29f1", - "index": 1 - }, - "script": "4830450221009c5f6be86780d86c5a1337e9a9edf316e266a6a3cd383ae45775759d42d661b10220119130c5a47f5ee3cfc6657670dad41278b835611088179ae7958515f879ccc1014104cde254dc34c5c13588d61caf3f562ac3b825506b7498bb1829aa4150a18d8bc556cd85fc7f052dbfa9e9eb60806a181b8178f1899dd726f03b3ad697114da0f4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 638280, - "script": "76a914683167442bb5494d6193bffcc764cdfdc8cab0ca88ac" - }, - { - "value": 53355735, - "script": "76a914dd3ec87d40d60a9b3b22377a3e2947dbec5bd19488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "03fdc031253084fb38aeb2b5df00fd8e78fa6221c4fcad9fda7b08db36ca195d", - "witnessHash": "03fdc031253084fb38aeb2b5df00fd8e78fa6221c4fcad9fda7b08db36ca195d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 249, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "32903b49d8ca65c391d7ef6ad828498a773d99ce22bcb3701fc9a96e12bc7799", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299836, - "value": 8295799, - "script": "76a914754d6bef1ccacfe778d4e9cfd7cf8d3ea8729eec88ac", - "coinbase": false, - "hash": "32903b49d8ca65c391d7ef6ad828498a773d99ce22bcb3701fc9a96e12bc7799", - "index": 1 - }, - "script": "493046022100b6b69653ea289bfa25bf71b7aeed86a070136b84a13662850a8e00806140be58022100a34ece221db2cb9b90a6ae5f8147fdb54fff3394fd5e334f79fb7a305d3114800141040685ee97330b73d172f0e36116ce3c63de1f17f77fee56c0c4066d8ade29c71eb4ac204f054fae55e837703ef3ee25f73c6cd6601f4935232b73785cd05a7cb0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1101370, - "script": "76a91434bffa7b589c48f21ce9f36c11dfa529622a743188ac" - }, - { - "value": 7184429, - "script": "76a914754d6bef1ccacfe778d4e9cfd7cf8d3ea8729eec88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "82ca8cea3231d27efd6237cbaf37507a26e2345dbfad376c47776e5b351e2a9a", - "witnessHash": "82ca8cea3231d27efd6237cbaf37507a26e2345dbfad376c47776e5b351e2a9a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 250, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "87490fbcb220e1488582045f36bcbaf5ec2e74ede28dfc6cf119511538d3bd0d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299881, - "value": 9304634, - "script": "76a9149bb5b8fbbd84ebde4eebff1f9429a166872c60e188ac", - "coinbase": false, - "hash": "87490fbcb220e1488582045f36bcbaf5ec2e74ede28dfc6cf119511538d3bd0d", - "index": 1 - }, - "script": "4930460221009d671cd5d471adb29ef56e2834bac174793bc5a34f3f3b31ebb43d055ffec3f4022100d006b1cb44fa5d9b9a7d2c5d487eaa4eb10e7d961db629c9c9d620835934410f0141048aaea05170de8de41b1f23aa1ff72e14c09caed0a5a2d50790a57bc24ba8952a49911c6e793fba5f7b592f601a6bd14c10e1ee719c6318da7561c8869045511e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8000000, - "script": "76a9141362af1b9b8b8a63ad26ce80dccd73b54741e80388ac" - }, - { - "value": 1294634, - "script": "76a9149bb5b8fbbd84ebde4eebff1f9429a166872c60e188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "69fe925b4dd1581c41382606ad94a23213b89d1f204b658f2a1148059753ac04", - "witnessHash": "69fe925b4dd1581c41382606ad94a23213b89d1f204b658f2a1148059753ac04", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 251, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d935d5b80d9ebcbebbc1eefdb1c54bfd9aa1df11ef6f19af22e9f823fd198b29", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299867, - "value": 3090313, - "script": "76a9141f1e3606459c3e48be39ded57a0d01e1b3fe84a588ac", - "coinbase": false, - "hash": "d935d5b80d9ebcbebbc1eefdb1c54bfd9aa1df11ef6f19af22e9f823fd198b29", - "index": 1 - }, - "script": "493046022100c988e3590da66c7f3918db91750ec43d817b7352b88c7f0da29496d8033b225f022100f39deb410012de3e1530ff2f86e42b1a3e2cbefee728728eca1fefaedd849469014104c70e5ba5dc59ad32ccf7c28d43c957a54bbbb112c8a9ce471e717677cebb8741afbe9dbfa3afd8414dbc5212df5fe36a9c489f7c01fac7e3192cd512cc415e1c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2423014, - "script": "76a914b891a424d36f8b151a3c8849824ec6eef284208e88ac" - }, - { - "value": 657299, - "script": "76a9141f1e3606459c3e48be39ded57a0d01e1b3fe84a588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c9f44fd8e7da7146faea3333b87fd5ce43898e92483bef616791c298750727ae", - "witnessHash": "c9f44fd8e7da7146faea3333b87fd5ce43898e92483bef616791c298750727ae", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 252, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "46e328575f03f84d33fc2812f1fb254701dc7b0ab1bfad71c32005fd6d615dd0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 154234127, - "script": "76a914d7e2f7dc589805cc35acd69917b8b50bc8e2d25688ac", - "coinbase": false, - "hash": "46e328575f03f84d33fc2812f1fb254701dc7b0ab1bfad71c32005fd6d615dd0", - "index": 1 - }, - "script": "493046022100b4cab34998168abc0a34d572bac12d4bd5db6ec9468aaad01f89d5f143040791022100a59f62b82a953e91cde9fcc49d238be2c6bbd3e82d068c623d020afc961b3e7f0141043f298e70bd14602db14f9aebab331f31478fd17932369f06cf7078e5712748538d97dd878afa4aa70b1d445148b463525d8bc1ca33dc185324857c55fdfa0ecf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 71600000, - "script": "76a91406724f1efd2210192719ba63ddff5966078f2ef088ac" - }, - { - "value": 82624127, - "script": "76a914d7e2f7dc589805cc35acd69917b8b50bc8e2d25688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1ccdeaddb5f3e8dbef55877c356286ae5091982876a8f603510c4cc5a6bf883d", - "witnessHash": "1ccdeaddb5f3e8dbef55877c356286ae5091982876a8f603510c4cc5a6bf883d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 253, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c9f44fd8e7da7146faea3333b87fd5ce43898e92483bef616791c298750727ae", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 82624127, - "script": "76a914d7e2f7dc589805cc35acd69917b8b50bc8e2d25688ac", - "coinbase": false, - "hash": "c9f44fd8e7da7146faea3333b87fd5ce43898e92483bef616791c298750727ae", - "index": 1 - }, - "script": "47304402203963c39227b0c39b4f14a0c89b5adeca392c487b6c0e852381c73c3c0783f8a0022075618f1452e1e360d61a024a315f2c75c0589339685bd5d6c16ead38d138473d0141043f298e70bd14602db14f9aebab331f31478fd17932369f06cf7078e5712748538d97dd878afa4aa70b1d445148b463525d8bc1ca33dc185324857c55fdfa0ecf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 26432882, - "script": "76a914b85db9015f80317ddf83ec214fc800a01a72e6db88ac" - }, - { - "value": 56181245, - "script": "76a914d7e2f7dc589805cc35acd69917b8b50bc8e2d25688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2e4886a6598f9d72ed2e12962535cddc8c6724585ef334df799004e351f00b63", - "witnessHash": "2e4886a6598f9d72ed2e12962535cddc8c6724585ef334df799004e351f00b63", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 254, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c8b6c0a36591f5d27dfcae0043bdee32025ec968a63ffafa5fae28aaefe5e9b2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299977, - "value": 5909423, - "script": "76a914d4cc87aa968ded6159e3977288fbeab404c55e6d88ac", - "coinbase": false, - "hash": "c8b6c0a36591f5d27dfcae0043bdee32025ec968a63ffafa5fae28aaefe5e9b2", - "index": 1 - }, - "script": "493046022100cc0395f028cdffd7db8902ee9d98037a9d55448b60c7a0f735c61b8a6e3dc2280221009be489211cdcb314b534002530cbeffcadf914a92d3636bc3553997b2f7868b6014104dd8b2e57950abb2db798db7ffd64b654f7ac98acf8d9f0d3dba26379fbb606710d14104082d5c2b500b74dac11318d3f9023f2c339eef840750c1260191a8459", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4898507, - "script": "76a9141bf32fd0dcda2c4520e9afe40b808382e66358e788ac" - }, - { - "value": 1000916, - "script": "76a9146558272fd380f66018a7aac9fb0ea2716eb2c58c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c36270b66bb5dfa23705ccc60b5704c1ebaedba4f69e98c2873192860df11c2c", - "witnessHash": "c36270b66bb5dfa23705ccc60b5704c1ebaedba4f69e98c2873192860df11c2c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 255, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f8e2c9e66cddf243156b56b93cade9aefff9fbf57e6490965c9103814bc4d528", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 115190000, - "script": "76a9144c738e6b29087f4ddbbd60a3381085be6565124588ac", - "coinbase": false, - "hash": "f8e2c9e66cddf243156b56b93cade9aefff9fbf57e6490965c9103814bc4d528", - "index": 0 - }, - "script": "47304402200fc192d5b3517468e084cfab78cee21ec95a273f8bb56a9a206e45035b6d541a02204e962f4adce7db9d2ddd99d48be91f5761260b03cd31546e4e0219e0c19103d4012103eda49e07cbefc9de47db505b3d700eefcd3e7f4310277af97506fc296a0b3491", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 42570000, - "script": "76a9147285548034a89436aec5e1970d34e1516d34546388ac" - }, - { - "value": 22610000, - "script": "76a9144359a4025a8d4e644ded9a3785e16a2da34234ae88ac" - }, - { - "value": 50000000, - "script": "76a914b920c58148f0030a48f1f93d8ba8c1b7df0c7ae288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b0db1eb42d06722fe8ccd0b176200780cbe1d58a2ccbe2bc3385778426445d43", - "witnessHash": "b0db1eb42d06722fe8ccd0b176200780cbe1d58a2ccbe2bc3385778426445d43", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 256, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "50b308a53af350026caa7c037174ef3233534cddf6c18420ccc73bb840e23e9f", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 22000000, - "script": "76a9141953b04e59fd30b812dd4bbe5ef22df0f3a3fb3c88ac", - "coinbase": false, - "hash": "50b308a53af350026caa7c037174ef3233534cddf6c18420ccc73bb840e23e9f", - "index": 3 - }, - "script": "493046022100e99996753241b760458bc04f25cd2690874ddd7690629a14a1f1b97d8f7c5867022100effd17eafa2bbc8ebcc3c35a1411887df9db193905279c315a6081686f906083014104718d794c7407857d0789ae6bfb820a74a17325fc5f7b4c630f431c726c1592b225736e6396eb120302e2f886c965d43bb3f6a5dd09d940e2b3c4c88765cea49c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 20000000, - "script": "76a914b6ec0e1941b07a89e9d13711b98cd8bedd3df04d88ac" - }, - { - "value": 1990000, - "script": "76a9141953b04e59fd30b812dd4bbe5ef22df0f3a3fb3c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "960f8dafb590e8a1dc894b5c7c91f354806b47619b487f45cb5468611a28f771", - "witnessHash": "960f8dafb590e8a1dc894b5c7c91f354806b47619b487f45cb5468611a28f771", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 257, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "174d935731d119ddaabbccdc59858cad6f6ea52b1268f602e93bd7445994f822", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 12845612, - "script": "76a914663a6875c51af9695719ebb20870dc727a71a3e088ac", - "coinbase": false, - "hash": "174d935731d119ddaabbccdc59858cad6f6ea52b1268f602e93bd7445994f822", - "index": 1 - }, - "script": "4930460221009933db5738757c5038f38c46d8bbf6e7b1d6e56482d7b1bcb588f6a8c3126a7e022100f12f6121bf11bd4aca4f6db5690114c83bbfa5f0685b80fa04c38f9a294b984a014104ee46bd5ddf14716980a35b1e55f14f22e44ba6c0f30391f0ab3659ba2469b9caed98785d724434d3a62cfd744419556225a2d493e38c2397044b178c88561b2e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1700000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac" - }, - { - "value": 11135612, - "script": "76a914663a6875c51af9695719ebb20870dc727a71a3e088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d653bf013a522038cb00b121ab1bd2cc46b0530999504eecbdeca19e8c7bcf3c", - "witnessHash": "d653bf013a522038cb00b121ab1bd2cc46b0530999504eecbdeca19e8c7bcf3c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 258, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ceeebf9630c6b939ff57e4dcec990dd2d9f792715e0a98b3c8d2e29f581c99b7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 113339, - "script": "76a914b70acd4adaf63cfbbe5b267a849fc9de81f0c0ff88ac", - "coinbase": false, - "hash": "ceeebf9630c6b939ff57e4dcec990dd2d9f792715e0a98b3c8d2e29f581c99b7", - "index": 1 - }, - "script": "493046022100b0e242306c239a5478182e2ec8df49d7b3b793ead04fd3e76391998fb515fbd8022100a9437572af2e096b6913015c35af9a08236d36ffd509641393ade89579fe9f9b014104debace441b5f0913ecc7c5c13abca6b8e5fb55f3badccf749bc71c8cd3f9bb8320671704cc7de021098d5cf4ee8ebe206ab0f0d864fd0249a07e5e238c5608b3", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a914a6cae03273e3b222b0ba961af4edef985afb6e2188ac" - }, - { - "value": 3339, - "script": "76a914b70acd4adaf63cfbbe5b267a849fc9de81f0c0ff88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a31ac72ea45ee4202f3245970eeee184e857f48578f33c01884ca3cb587bcb3a", - "witnessHash": "a31ac72ea45ee4202f3245970eeee184e857f48578f33c01884ca3cb587bcb3a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 259, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f3b7656e82208908d29d4bdb70bbecf626152a3368ce0f17532dbea0ebe0eb35", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 67475033, - "script": "76a914ef7cd1e582b1f964cad30f26e677e6fc6efe1c2d88ac", - "coinbase": false, - "hash": "f3b7656e82208908d29d4bdb70bbecf626152a3368ce0f17532dbea0ebe0eb35", - "index": 1 - }, - "script": "483045022100a5127e90182de8ac16644b68bd3ca082c87a8ef0aac535b9488f009ee52f5f2e0220192cb3d641ad5e11d3ce393da20e43c56d91b64c3e84a8bf4f4aeedbc9d5f313012103fd126359c8b3e890a731f8aea3cf1330cf44ed8be155f3c4c4f40dea0dc55798", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 27042124, - "script": "76a914a7a189c5b845dd660252d756604b3bff1ba59e1e88ac" - }, - { - "value": 33622909, - "script": "76a914c166138e76bff4ca8b7b74e32c6502e323dd856d88ac" - }, - { - "value": 6800000, - "script": "76a91441aabc9ba8e803d9418dadcf79ca95adad0c298688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "956cf452111df32a32c12e30d4e9ccb2734b1e91f317bcb462a43f3985a0a891", - "witnessHash": "956cf452111df32a32c12e30d4e9ccb2734b1e91f317bcb462a43f3985a0a891", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 260, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a31ac72ea45ee4202f3245970eeee184e857f48578f33c01884ca3cb587bcb3a", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 6800000, - "script": "76a91441aabc9ba8e803d9418dadcf79ca95adad0c298688ac", - "coinbase": false, - "hash": "a31ac72ea45ee4202f3245970eeee184e857f48578f33c01884ca3cb587bcb3a", - "index": 2 - }, - "script": "48304502210085581df33e16a15ee57df37feeb3286cf6b3b5dbba262ca028e19dd155910f8902206f0e8771e20b83e5994f2f7fd33dd0974fa0f8ced7a44767e306687f7842f6e8014104e05c542111b58bb2ba9ba193a155c21746d875695f475c5a9a04c5a3ea02dacb74e63725391cdb0c047b03b268219e5547a84abfc97a8dd861df4ba6dcd1e722", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4400000, - "script": "76a9146dc7c0e4bf5583ea138c1d47f52ef6fc1c03829588ac" - }, - { - "value": 2390000, - "script": "76a91441aabc9ba8e803d9418dadcf79ca95adad0c298688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fe4c0431c4bd2d4692ec5144cc72268452f56c558e2853cfac7c4a18636c31bb", - "witnessHash": "fe4c0431c4bd2d4692ec5144cc72268452f56c558e2853cfac7c4a18636c31bb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 261, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4e48982a02b6713052415d247ce4f3b90361eba4bc29469c170a82b0d16e40e8", - "index": 124 - }, - "coin": { - "version": 1, - "height": 297987, - "value": 37077, - "script": "76a9145a30419ab4d99c549bc812127f769a8e0580f5e688ac", - "coinbase": false, - "hash": "4e48982a02b6713052415d247ce4f3b90361eba4bc29469c170a82b0d16e40e8", - "index": 124 - }, - "script": "4730440220314f93fe2ac323b14f142db14c99e1179de1ed9ca601ab6e4c87b2e7611c543b02206b987575585fbd8a025ef7c865b1ad7212504336421659db822f18812377d6950141045f2f5e1af54b5d69ef1613e4af6ca8103a9d2b65ff2e1e597950b9f590a1fd14d9853b95c40d3fa3e9a2bff2337da4d55f3e8c7f6d904c69d6452e86d4b5e00b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "df91f2539f7cff93d7f466ee16671d475e03805285996aabe2ced48baabcd91e", - "index": 139 - }, - "coin": { - "version": 1, - "height": 299087, - "value": 34606, - "script": "76a9145a30419ab4d99c549bc812127f769a8e0580f5e688ac", - "coinbase": false, - "hash": "df91f2539f7cff93d7f466ee16671d475e03805285996aabe2ced48baabcd91e", - "index": 139 - }, - "script": "483045022071bc7fda22b23991b995d984051e83a7b289ae728794b4a99acf4e23a4a4a6ce022100ebbbdd90f5ff98c586d25e828992288c7b459eed97378d6cc9a5756784ba32d20141045f2f5e1af54b5d69ef1613e4af6ca8103a9d2b65ff2e1e597950b9f590a1fd14d9853b95c40d3fa3e9a2bff2337da4d55f3e8c7f6d904c69d6452e86d4b5e00b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "89a24eaeec8590a696d23ca29f467ceca116022c2d1e639f47d8fbbf48f99478", - "index": 9 - }, - "coin": { - "version": 1, - "height": 297652, - "value": 10767, - "script": "76a9145a30419ab4d99c549bc812127f769a8e0580f5e688ac", - "coinbase": false, - "hash": "89a24eaeec8590a696d23ca29f467ceca116022c2d1e639f47d8fbbf48f99478", - "index": 9 - }, - "script": "47304402205f50c3d65089bfd04ebd6d642d5401c13af842456da1d66f34baefe481aa5c11022063d698404c40bd3dae87f2e7c505fb98355f8416f265e1215e643c64521b25440141045f2f5e1af54b5d69ef1613e4af6ca8103a9d2b65ff2e1e597950b9f590a1fd14d9853b95c40d3fa3e9a2bff2337da4d55f3e8c7f6d904c69d6452e86d4b5e00b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "64470d3bf13c50d4f2378e7f50101d698ad6597831e570a389bdac12b6536e63", - "index": 144 - }, - "coin": { - "version": 1, - "height": 299317, - "value": 6795, - "script": "76a9145a30419ab4d99c549bc812127f769a8e0580f5e688ac", - "coinbase": false, - "hash": "64470d3bf13c50d4f2378e7f50101d698ad6597831e570a389bdac12b6536e63", - "index": 144 - }, - "script": "473044022059721332dc7c9a9b41aa554598e6e940288505e86b7afead1dc05c90315eb19c02202537a9bf2422ddda927ef0858b7c9dce42ecee8c4edae199e23a1c095c91f37c0141045f2f5e1af54b5d69ef1613e4af6ca8103a9d2b65ff2e1e597950b9f590a1fd14d9853b95c40d3fa3e9a2bff2337da4d55f3e8c7f6d904c69d6452e86d4b5e00b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9b58787ddc94e5dbaafef3419e9ad1044b43d3ce52e26b8cb7229ce86c1d12ad", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10755, - "script": "76a91413a9638b2bc3da07180bb8be7a14567d46fc2f5b88ac", - "coinbase": false, - "hash": "9b58787ddc94e5dbaafef3419e9ad1044b43d3ce52e26b8cb7229ce86c1d12ad", - "index": 0 - }, - "script": "49304602210082cd3e4247f30245340a56f88833f6f95f08a7434ff2ca3df2d29b8b6a613edb022100f38d0bbc9249caee9d8ebf9ce92cc0dd1db6d672553a84241d01a1bbf369610c01410401f1eb52be64bf0a01e827e9ae2071a9669377ce562fee911e970f6706c1233a6a1bc2ce4a9d51441fdc91df38fd2bf2a1dd9a0370d53a3a8093d72047cd13b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d0eda35dc246d70581a78d58e50031ad3368f2142c0bdf0064571ffdceec8259", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 57452, - "script": "76a914311bbb9844de9cc952ef6c24318a7c82bb75ce3988ac", - "coinbase": false, - "hash": "d0eda35dc246d70581a78d58e50031ad3368f2142c0bdf0064571ffdceec8259", - "index": 1 - }, - "script": "483045022100bcaebc697b078d45664ecfe474ff792f6e1a1648d6868a63be9b56b800b36884022049704ee9265fe0fddebe99613697bf65348129c4a2c77d768e21cd3cd98873bc01410496cff7cc27469012490d95c7c5c7189f5c53abd3b2419329f5b96d5cba3702bd25c29d9403e67c04bf5a45272cb0a387406816be5af47a26d02927c85b58d58f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a9149a5175b09049b674b7b5b659230ff78adabc819b88ac" - }, - { - "value": 17452, - "script": "76a9145aac97b4f430fdfbb12f1e19680fdd1e54074f5c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "73dd6bd64e371d910cb43c8cba3615e052f1979fd4e2209045a45e60b220e6fd", - "witnessHash": "73dd6bd64e371d910cb43c8cba3615e052f1979fd4e2209045a45e60b220e6fd", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 262, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4d50fcadac303a75b90aeae53cb3dedabd33fe77d6621fd26bab93a56db5b17f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 91568904, - "script": "76a914d5a634cc7c2c4478d3167526bde5ab17e3079a0588ac", - "coinbase": false, - "hash": "4d50fcadac303a75b90aeae53cb3dedabd33fe77d6621fd26bab93a56db5b17f", - "index": 0 - }, - "script": "493046022100a311f86102f630f7f083e758447dafb9d78791ab387ebe42264224f1055d3284022100aa3154b1358863a510d606dff6b0969e6c2a6403f59f20cd32a1414213322688012102eddf84e64b18c4239289710039b277e1981afd26e46c33457972f27f8b737875", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 203663, - "script": "76a91461284f721c52b35b390a993c2574786299d56d9988ac" - }, - { - "value": 1642197, - "script": "76a9148baa20222b40d0df0983d12ea837bcb1a1aa2d6f88ac" - }, - { - "value": 85916615, - "script": "76a914ecba1f348e935944fad9c8d731cac0975fb168a488ac" - }, - { - "value": 3796429, - "script": "76a91416e5c621741c98f1a1f8fdea171de449e5e0903c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "df0df5927461c0640e291303bed558e029b177b0341eabb5ea2369d6adb746a2", - "witnessHash": "df0df5927461c0640e291303bed558e029b177b0341eabb5ea2369d6adb746a2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 263, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ef5cb271c0a6713765e37a38ac83c89576961e60f564948ee5fce43269b62aac", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 50000, - "script": "76a91471045f0ebc56873501033435df2931de7867277988ac", - "coinbase": false, - "hash": "ef5cb271c0a6713765e37a38ac83c89576961e60f564948ee5fce43269b62aac", - "index": 1 - }, - "script": "4730440220259c499c4e2ed6030e9bf70327553d0bf93dbf01dcf16fe90bd2e0d1b98def9202200598eacfcc6ba1c5403b04287977c2bb3d23e69063488a07ab12861e7725b4fd01210264af1414a01efb0c0381767acc16cf5f271ba49d3a3272b60520da7c95a85c2b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10860, - "script": "76a9142fca5bb48ef3f0b4f4ad6089229fb4c72f809d0388ac" - }, - { - "value": 10860, - "script": "51210264af1414a01efb0c0381767acc16cf5f271ba49d3a3272b60520da7c95a85c2b211c434e54525052545900000000000000000000000100000002fe293fb30000000052ae" - }, - { - "value": 18280, - "script": "76a91471045f0ebc56873501033435df2931de7867277988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "93f44874e4f0ac55143bc43787370e7335328c5e78073c54ce097852b09c163f", - "witnessHash": "93f44874e4f0ac55143bc43787370e7335328c5e78073c54ce097852b09c163f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 264, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a527777401b6226df9b475bdd604fcd0c788efe86b34b9569aa6c430a54d2b45", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 9990000, - "script": "76a9141b66ec7e15fb997a12437c6ee738caffb2c20bf188ac", - "coinbase": false, - "hash": "a527777401b6226df9b475bdd604fcd0c788efe86b34b9569aa6c430a54d2b45", - "index": 0 - }, - "script": "47304402202a23e1f94f8096180c21661d4c2d830e4c7514d93676ed197a1345f2c8d508b10220077c54e22896bc4562846809f907cfac5f7306bd32b370b7b433ea16319657e2014104a20f6afc38b6651fc4157bc2952250376df54ee93111433619fd388f29d8e16eaec8c353a0be7e03351665fa3dea4fb221eba11ea9840bd121ca6ec46d15b2e0", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ef53a89eb4669d9199844eb61b1264606665786fc04f5c5b1b7c6d23fe6cc450", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 36600, - "script": "76a9143dbaf28bb5dedbb39a72f261f5eb6b7720db4ca288ac", - "coinbase": false, - "hash": "ef53a89eb4669d9199844eb61b1264606665786fc04f5c5b1b7c6d23fe6cc450", - "index": 1 - }, - "script": "473044022017a2df36af5ffde06a2e02bcfa201ec0fe5eb3af61f1808458cfb30f8a83232c02206f96bffb78a775d745bbe2172584e1fe7428c1b14e8a874ed3980e0f3906084c01410430eb0627e96950a23274147fcb42a21ffb29f9deef4197101f60f447b7f137edc5a10a7f66fe29654aad256b0c7e68066100e05c2394c8d813b0e08bf6f65ffd", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "47d0496574e703fa2400cf432068af6789907e1297b953958a482fd09bafa425", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 97439, - "script": "76a914f191e4163cae81b0221f3b77bd7d26b15f9d96b288ac", - "coinbase": false, - "hash": "47d0496574e703fa2400cf432068af6789907e1297b953958a482fd09bafa425", - "index": 2 - }, - "script": "4730440220518706919eaf1d56511c37b119a11d690311cf3309b36cc46f6cb6a4da55c87602207a81dbebbb9d4d499b87d39f751e4a259ed1f94f8948fdd1e7a0e1546c27fad8014104fc1a919c47c986666daa5715ffc024906f2d02c3ace83a2355926f28184aa2954ff1f600a3cc4e7e8f9d98c07259a823d08b14ba0316c4ee204a40a077c1106b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10026600, - "script": "76a9148dc8942f8b0a2a16aea83a13713fe89ff85281ed88ac" - }, - { - "value": 77439, - "script": "76a914aa7ce2637640a00bd792acfa493b3e1ca99379da88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d582986875c017e9ccf8308e7fab725f3751d6af60bb68c03101c24a5e9bebbe", - "witnessHash": "d582986875c017e9ccf8308e7fab725f3751d6af60bb68c03101c24a5e9bebbe", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 265, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e0b73d77e8a3e375dc74de675cebbc9dbce08b536810643c284cfec44bbbf5cf", - "index": 131 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 5707246, - "script": "76a91461783e6bcc1cba0154f76b3110e888173da2a81588ac", - "coinbase": false, - "hash": "e0b73d77e8a3e375dc74de675cebbc9dbce08b536810643c284cfec44bbbf5cf", - "index": 131 - }, - "script": "473044022063eadb3079a1434d63baf8536a3870c2e800d2ef5da485e6bb9fdb0c766df3f502203474987130ee0d57388cac3060291f3a3f3aeaed0a3af5585a1621e9d1e68d600141040952242c6c86577a3e399add2d46e2c7f0c8ab00ed1bc2d505f52e4f900fd560f3bc921f5f43505d2b700fd50e67082173321b3ae41b685ab17dfa8185d2ef4a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 50 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 5699108, - "script": "76a91461783e6bcc1cba0154f76b3110e888173da2a81588ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 50 - }, - "script": "48304502200ebf21c75e1106a16054d9bfb546d7f8ee1bee8916da47319eeccb3dd9e175a902210084f96189990fdd5c5616a004f912e4ac624410cb3748ecd6a6e5f61f87ea2d660141040952242c6c86577a3e399add2d46e2c7f0c8ab00ed1bc2d505f52e4f900fd560f3bc921f5f43505d2b700fd50e67082173321b3ae41b685ab17dfa8185d2ef4a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7c8c0539ce911a62977b0302d31689926466316f46d43f647b7141e67b66ce5d", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97491, - "script": "76a914e979f17d39248dfcd6eb59ee61ab6e697476952188ac", - "coinbase": false, - "hash": "7c8c0539ce911a62977b0302d31689926466316f46d43f647b7141e67b66ce5d", - "index": 2 - }, - "script": "483045022004270173af41b5c68726f6eed3e027b16f151dd31870290eb49b04842065550e022100a0818536187ce8fca23aed1d3cad1f0a72903de62098c7c30b9679ec3fd44ccf0141047bc7ab950328c883d20a6d76d015208da2e90f74f49c39680e6ededa60b27c7e3996164ef2a53bdce7f5aa66377320e078cfe6257c2d366ff340f07418ddd3c6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11406354, - "script": "76a9141b383f5afb738a8e8c3acd9aa0b3ecef7c98a6be88ac" - }, - { - "value": 77491, - "script": "76a914249244181c84e4a29dc0ebcd1d9a464c46b8b10a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "73d46ec04381099858e54f5cb378e43f0d705c86d1659f3cb363c079c8155c6d", - "witnessHash": "73d46ec04381099858e54f5cb378e43f0d705c86d1659f3cb363c079c8155c6d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 266, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c65cc917b9826fd4d1425512f436324b882bd3a6cbbeb51a5e288a88093c67a2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299858, - "value": 2237000, - "script": "76a91471b8452f49797b8bf1a33784c29d93823d4f6b8d88ac", - "coinbase": false, - "hash": "c65cc917b9826fd4d1425512f436324b882bd3a6cbbeb51a5e288a88093c67a2", - "index": 0 - }, - "script": "493046022100d69526989fa11225f387fe40051a532f851d91c6cb45d89b647c3ebc46e5901f022100d8ad24b147b6bcf1c244a22425fa4fa242d75b80968ea237129f20bfd6da0c300141047f47c5e4ec8a8b51857896562cb99cf4ec4239b851c5ee6eef7d28191b10e9f8bb713f7a5398f0a896b03751ab12c869c3303cde771c650d0cc61a01d804db14", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a5542088fc35cd54fdad395e755c245e782eb43f0ff492dfe5a555abbb004d11", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 22080000, - "script": "76a91429c370819fab8a712a450a79c41be09d471469e888ac", - "coinbase": false, - "hash": "a5542088fc35cd54fdad395e755c245e782eb43f0ff492dfe5a555abbb004d11", - "index": 0 - }, - "script": "47304402203b0bf7f5555c1087cef631f11a1af2afd1e4c254ff2838d89e5a5820d63d5a3a022074bbc056125b12c9e4f2e71072973fe366b484461a2af2954d6992174e3bb5e5014104b1c7cab3b386d5646e3499c331ac19eb356b44843e02093b41a8c95535fc0e3cdf817444c2bd8402e33c0e0e8d8ab2cb5a3a9f18505747e98dae305945692d05", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c86c27d397aaa82a5c2c79f30b809947e60d9d2961f5859ab6a8218025acf9fb", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117449, - "script": "76a9145f48e98994413acea6e3403b9562d99b299a40cf88ac", - "coinbase": false, - "hash": "c86c27d397aaa82a5c2c79f30b809947e60d9d2961f5859ab6a8218025acf9fb", - "index": 2 - }, - "script": "47304402204859f55fea55f302b403bf8ccb85159b50ea9fd331e6a0a700f72bc02d1e461f022060b52dd4b394a3a0bc90946d7402e012ec1308beedadfe7589874bd59b07a87501410411281942d22817c6551bc28ae1ba8e632a0be0153464965d29a04a8d6c5e33e1035a35e1dee9dcf772fa619adfc05ae6341e40073338132eeb1cfc88ec288f5d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 24317000, - "script": "76a914b6061bd4a4ae317a66500874ccc7396dd8d04bda88ac" - }, - { - "value": 97449, - "script": "76a914796f8999c9697ba796bf41f40f4341ed7983884588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "50bc9aabe9d3b78de346b0b1829e8b6ea9bb85a5e44871a480ee538f945cbfc2", - "witnessHash": "50bc9aabe9d3b78de346b0b1829e8b6ea9bb85a5e44871a480ee538f945cbfc2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 267, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "be9cb422b6ca069cb5b4bd14784b7022d32cad7e24f0266f2102a13b3bf6f289", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299967, - "value": 2200000, - "script": "76a914e5c46993b640f5160a1811bf5b0f8bdea6f7fdd088ac", - "coinbase": false, - "hash": "be9cb422b6ca069cb5b4bd14784b7022d32cad7e24f0266f2102a13b3bf6f289", - "index": 0 - }, - "script": "47304402204fdae1573e0c06965f2e4a2b803650d7254e687dff53cb7c5cf335c1269f0f1e02206b291df555ce01d0f718521e8ec30cb37f685f22012a60b4fb5afb4aa240bd980141043fabdc90da5c1607aef8246cbec5a1f9fd808cb8b0d3f3cec6cdc6dc9cff7efd761aedb1ca2b332c89e6b68fc2f1ab677ac341874ad25764d91ad8a079133e2a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dcba5ebd169268cbd66c9d2218fdb25ca66eaef6dcfacfce5830e2c39e4a9da8", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10990000, - "script": "76a914e649a9ba6b7361e973f54ec40420580a40e82a2488ac", - "coinbase": false, - "hash": "dcba5ebd169268cbd66c9d2218fdb25ca66eaef6dcfacfce5830e2c39e4a9da8", - "index": 0 - }, - "script": "49304602210091c95fcef524688e583454be0ee714ce23d84ad7c4069d310b1d10b046d80c6c022100aa93fc20e4e4c5b8d659a6dc45d40df2b7511579444ff7d70eede1668f7168fc0141041bf45bc096abb5fea6f9d89906d43aac3a9d70fc936afd718fe5794862fbee25454eae97f85b495c063428a2820cbc3b2cd1cfb5ad28d0938fe09a690b5b20a4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cb846477055a86c4528bb1e98f871128dcc7a46319efd98ae2a8590b2cc12247", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914bfdb9edfc3f8952e7c0daa26a4e86dfd0e857b6288ac", - "coinbase": false, - "hash": "cb846477055a86c4528bb1e98f871128dcc7a46319efd98ae2a8590b2cc12247", - "index": 1 - }, - "script": "473044022057088131de8efba0009388e252fd062d25d3e971a802c83f323ef31dc2602ac302205579f898b1c89974e9623bae1b01b5086d698498dc87695ec8ec7ec3a8e51d760141045f3578f1ab980d5f0fc5026b5b5a1cb086b8996bba9469bcb57fb9e12fac4e8d7db594517875c53ee0d476a4bae507acf4cc40b4741744871ffb44f78e373a27", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 13190000, - "script": "76a9140d353a9008b6e1c068557d2cfd08eadb4a47641688ac" - }, - { - "value": 117491, - "script": "76a91423f20150770cae3cde4058bee3c244c297001ec188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6699b374dd446b856dc61a50390eae95e3011ba39577789162c22e18ca11782a", - "witnessHash": "6699b374dd446b856dc61a50390eae95e3011ba39577789162c22e18ca11782a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 268, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f348af4a3ff3ccc48e3f164b54b526cd827ea682c5efe85ceb9040b89c88294c", - "index": 16 - }, - "coin": { - "version": 1, - "height": 299888, - "value": 1000000, - "script": "76a914646558f7ab244b7e9b2c9a9c35408c51886a719d88ac", - "coinbase": false, - "hash": "f348af4a3ff3ccc48e3f164b54b526cd827ea682c5efe85ceb9040b89c88294c", - "index": 16 - }, - "script": "47304402206e12c97ce736b8997cb5366c9c17c31a903a52f33379aa3d923075f099972e5b0220022b6f2fad9b4d0b78da62c2d013001fc4f712565d27fd418fdaf89fbaf2ca740141048a64ff22c459a08133a3a2f32160c7b82109fac3045e1f077ff20a6c347e806465a7c762d0292986eb253e92ff521d57987e394f7b8fa981907e0e5ddd7e0d98", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "485c13c47394a65c0fef1d79a229163b552379f8af7ceed47f3c4b9683c31bc3", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3690800, - "script": "76a914d371ae82de32e0c8d797b789124dac36aa166d4c88ac", - "coinbase": false, - "hash": "485c13c47394a65c0fef1d79a229163b552379f8af7ceed47f3c4b9683c31bc3", - "index": 0 - }, - "script": "483045022100ffe417e96c29effb665699520cdf9af6724bbee5bcd5f5297a15ce0396755e5e02204e579c6e6424ef9b6951e41442cd9698444c5ce5da28485f74ee88ebf7d1adc60141049862ced532b234d375131cbc0120a819bc870ae14bfbbbf49094fe03b0e9dfb7a7a92bc1bebdfa011875b0ca1b77b2558d3160ed29586ab310e97539293e9d92", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d89069615df4296c36fc4e6aa5987ea636f9151f159c013fedc37dfdc81371b0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 117489, - "script": "76a914f390b510acea649c171c1c7f6fbdded44cc5170088ac", - "coinbase": false, - "hash": "d89069615df4296c36fc4e6aa5987ea636f9151f159c013fedc37dfdc81371b0", - "index": 1 - }, - "script": "4830450221009b731a55d8ec0d11c39951bf883219fe3acd62b22e2d55edb13ca34f829facba02207f26a062b12617163ed6e364f5263f2d03925078a17079c1866d0489fbf00e52014104dc93c1c947efc8700d86649daaf7ca0fe9c17acef5a9ae31e08d8af69b2b064ff76e3defd4ed5550b27e4268850b676ea3c258de2130dd969e07a89ef44b2f93", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4690800, - "script": "76a914808c0090b820b4875aa1a11dc0da10cd5939184488ac" - }, - { - "value": 97489, - "script": "76a9144bc95de8e6c6077f77df325b6dcbcf863cb48a8988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9ee393f480118322dabb3717752047e3800eca0701e26e989dcfbe1ba10b052d", - "witnessHash": "9ee393f480118322dabb3717752047e3800eca0701e26e989dcfbe1ba10b052d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 269, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5953bd7a98b8377b71e30089cac6f97a2c6c708b0f5d68a2919f0b5dd79e79bc", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 309990000, - "script": "76a914afdc07b810f707fb0dfe937fc5bfecc3707c6c8888ac", - "coinbase": false, - "hash": "5953bd7a98b8377b71e30089cac6f97a2c6c708b0f5d68a2919f0b5dd79e79bc", - "index": 1 - }, - "script": "48304502210089cf344ad9c8c7b317b5efcded57983f92ad366e03554cc011bc05f89d2af1eb02201f425e23beb2a873ad949b1c39c9066a7a85c02245d5a688e5111a2d28c535d90141041b4ecb8d49527d0e7f4f88944d9a2c4d04a055c7f25dc7401cd5fa03a1e66fc0bed69f1b8f053459e912d7de5181b3c35f7e8e238ad1e680aa71c6c4b99db314", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5370a2d912fab83830d372d992fa7e6dadf5b4b5e99e14a7269866a5a1fde0ed", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 161990000, - "script": "76a9146bcd2a581e6d8e03338d6a2047018a4baf1b1b5488ac", - "coinbase": false, - "hash": "5370a2d912fab83830d372d992fa7e6dadf5b4b5e99e14a7269866a5a1fde0ed", - "index": 1 - }, - "script": "47304402205c256118b7594678e90ab3db94f73fa3c9396ba604bac53c4ae3f80e2dc305200220342ea795a5a0ad81b5a4f090600b04131e0d4d2adff0dad1c97c427122d14f18014104a4ada2f02439fd0188ee2f2552212d8d108994b7057d6bad6caed7bcd1d47c597224337e85a650170bb17e277c98599d3f796c2ec69bf69f4ff1b3e92afea0ea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fae857cd8cc42bf81ac08ed2c03cfaa4b7169cdd837b9abefb07807aa74ae754", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97491, - "script": "76a9148ca26e615433c7cb8422f3948880eabc80e40dc988ac", - "coinbase": false, - "hash": "fae857cd8cc42bf81ac08ed2c03cfaa4b7169cdd837b9abefb07807aa74ae754", - "index": 2 - }, - "script": "493046022100ab2d8fa9415071fd6340b5b34fce8a503acf585c8890e7df7a0833cb892fd7e4022100a06816a5a4a9d1936a3a5101509581ae1cca578c660fe9e7d082d8df76545bc40141044f5ec4d36596758d84456f99ad80cbbfd95155fbbac503b792646eb33798515e24169c87faef5169e12c2493ba4be2f069fd74754a538e5015b8e60577ebbb49", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 471980000, - "script": "76a914533f04e7c4697c4b9b31f4f11b5ebf570527cbf988ac" - }, - { - "value": 77491, - "script": "76a914deb47cacb27bd6b7ab51bb6bfd013f33dc91a5d888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "633f71c99e6609bb10bee4a624fb565fac13e7da1208f201ea79238a7fba04d7", - "witnessHash": "633f71c99e6609bb10bee4a624fb565fac13e7da1208f201ea79238a7fba04d7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 270, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "311dd262b5f6e6885e29843ffc632f4ddbd879e1cc1b435048ac8840aba99555", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 4621760, - "script": "76a91460c5a98de87367dbccb5e8b5dc1707147f5dc37888ac", - "coinbase": false, - "hash": "311dd262b5f6e6885e29843ffc632f4ddbd879e1cc1b435048ac8840aba99555", - "index": 1 - }, - "script": "493046022100b6e143721304f435642cc14df7bf8bb1cb9cda72a874f7604d9c14a59d215e76022100decf0ba6e86fb15a224754e188aa3243590a66e5780aa2f86b93736569f80ce30141045ec6f603012ec9fd93197cfc2f5e41f553250b64aead3df0a6f29aeba8e679694bb5fdf1cad133825fe1ee7c7b905eef02be2f77d4cae997f2e3b20257dd4644", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "12c69c3dfcadbcf29f3fbe8e1a207fbfa8f87eb3f26bfc2026f35f6c7c001ee4", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 14744753, - "script": "76a9145043b238e85fadd84f987649ae2d8df698ce58dc88ac", - "coinbase": false, - "hash": "12c69c3dfcadbcf29f3fbe8e1a207fbfa8f87eb3f26bfc2026f35f6c7c001ee4", - "index": 1 - }, - "script": "48304502202b9b1ac7ffc4ac2935d95afe5ee08783f020e1670b672563684b80e57b21a88d022100b7305a5c4cb4508974078a64dd15c48a2a30b21e4387b645a6b1d7a5b2a101fc01410488d5eaab91eadd835bfbe5727be2c17774b9917a9a0b54bfb70e1c78cdd476c5026532e3857902f68f7f41a06a8e9a3b44a37b6b585828511c6701002f98fc7b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "35cbfd2d0cebddea1645348683c33416ddd010502983177a3cda82fb6e42378c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137454, - "script": "76a914b7c2c96cf5e145eb67070ef4f7c60fdcb291166488ac", - "coinbase": false, - "hash": "35cbfd2d0cebddea1645348683c33416ddd010502983177a3cda82fb6e42378c", - "index": 1 - }, - "script": "47304402204a226c8a09a135bfc139fede24c9e5dfce91675d82b685dd49ab9d5944382adf02202cac93860882eaa657aab01b8ab29b5a1148a756aca4b484d31d82666873ea16014104efa08d6346f20ba0c78e3da83928141e681fbab5f9be0cb432f09304d24e28fbcddd37be5ae0e606418455f08cdc77d8b15127d63ab922902312665f12477d8f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 19366513, - "script": "76a9143c697d06f37a97319912b668c9a958148b9d2a6d88ac" - }, - { - "value": 117454, - "script": "76a9149b30b7abff8152d927b5a1bc72b2645d18ac184e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5d39df0bc99960f6cba04a0ed68e99d205a7f2b63c3b1cba9bf170d4406c9c5f", - "witnessHash": "5d39df0bc99960f6cba04a0ed68e99d205a7f2b63c3b1cba9bf170d4406c9c5f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 271, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "08ca65fa66b0bf40a1592ce891760adf057139900a9744b9fddfec5312884645", - "index": 7 - }, - "coin": { - "version": 1, - "height": 290442, - "value": 11500000, - "script": "76a914e579764def91a1481239d0a86febcaf4c97b26dc88ac", - "coinbase": false, - "hash": "08ca65fa66b0bf40a1592ce891760adf057139900a9744b9fddfec5312884645", - "index": 7 - }, - "script": "493046022100c6016f918350d9458e1c7cfd338585f8439e51ca3b81a36eda40a6709d73e130022100e6aaddde83d6fc3613787ebfd269538f6ae52ae3b7b3347610e9a60bded2ac9801410413347c1549e8f2785f386da297a017c62cc56ca7e59cbc3ef48d9e4c04d3230397688ca3c30f21c785eb03d9ae62c87418441eb16df19e93df94001c73f6f62c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "667b4412280e674ae223be50bc4931c3696f06d29c2068600ce3674964a3e799", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299973, - "value": 59645123, - "script": "76a9149c1d82c442c2bc3b3f79a2bf126a22723899a21f88ac", - "coinbase": false, - "hash": "667b4412280e674ae223be50bc4931c3696f06d29c2068600ce3674964a3e799", - "index": 1 - }, - "script": "48304502201811f0ec25823d258a7aa16965bfca649b65deae8046ba7dca959652f9ce992b022100f3bd2a32005d156b7a97c7db91ae30ec9b4b39318ebb71904414c702da8d8efa014104144ddbdeae76a97c0567023ce6ab210f9d707c24dfd49114a676595fb82d7327b820e5754fe610d3ab4c985aa61ad9401f95efc63119747577be1fc276e63e1a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b45908eba7743bc8f76bf64cc96043195bbb84d67f219eef5e480036661c84a6", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 49066335, - "script": "76a91451595b182a8823e2af7105c8a9a8d631a5a6e7b988ac", - "coinbase": false, - "hash": "b45908eba7743bc8f76bf64cc96043195bbb84d67f219eef5e480036661c84a6", - "index": 3 - }, - "script": "48304502204e41a3dd2106a71d57fe752b5456d03db31032364934759db2ecb42b457b01d2022100c1fe679212c8e9767d0f1075000e8fa6fd58165259f33ac7f1534dcc61a459600141046be3b1190c0e3cb9f3941a662ea25c59d5eb14044a91b511a592ae516d402a408b9f35925cdf1841ef15c383aa380ebc7dbacf11e677f344cc8c6d029a14851b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1001043, - "script": "76a914fb6448a2a03e08c8cf4cbe222fe2e101bb99257788ac" - }, - { - "value": 119190415, - "script": "76a9147f3746db863bae743278e23353788d1042479d3388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fdf80c889f89b4c13234ce66b078dad70c1301fed0150e393a671dd74a655c8f", - "witnessHash": "fdf80c889f89b4c13234ce66b078dad70c1301fed0150e393a671dd74a655c8f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 272, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "772ba5e3e88e45e028e5870922f6d20cf59e8928361c5406a91b69f69c7dfb80", - "index": 44 - }, - "coin": { - "version": 1, - "height": 298199, - "value": 24206, - "script": "76a914643af3c2c74b7415f03190c0f3dd5c95c33c3b8388ac", - "coinbase": false, - "hash": "772ba5e3e88e45e028e5870922f6d20cf59e8928361c5406a91b69f69c7dfb80", - "index": 44 - }, - "script": "4930460221008f8ef7757eb295aca5e9eb84378ed7ba7611ac31336262915775599dc7d66ee0022100edc8c28a4ab2e368d7c7e058b95c63d6cce3a4cfdf7b7d21708bc6fac0c243480141048e45e0c18ebbe92ef2c4d60b4731e96f84502f49f876bb374258087ee85a6f8bcce839e8d9d2912c1b1ecbe9fc6c4e3d4f2447855c487519cabbd98d592ca6e2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d180c380600455b93e2710007b29fd2cbaf4b2ebbc15344175126ba52fda6b7a", - "index": 45 - }, - "coin": { - "version": 1, - "height": 298441, - "value": 5770, - "script": "76a914643af3c2c74b7415f03190c0f3dd5c95c33c3b8388ac", - "coinbase": false, - "hash": "d180c380600455b93e2710007b29fd2cbaf4b2ebbc15344175126ba52fda6b7a", - "index": 45 - }, - "script": "493046022100f96606499d2a83cf09ce63deaaffbd8b72854344aaee14fdc84fb7d76f6f52a5022100dfdcc2a3399a6f5baba38dc4f2d76e6e856f0f505bc00adc42df942d9c6f8c4e0141048e45e0c18ebbe92ef2c4d60b4731e96f84502f49f876bb374258087ee85a6f8bcce839e8d9d2912c1b1ecbe9fc6c4e3d4f2447855c487519cabbd98d592ca6e2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bd2dcae7b3e42564727874f4de33585c9441f4f970837001620824d22171836f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300001, - "value": 846065, - "script": "76a914643af3c2c74b7415f03190c0f3dd5c95c33c3b8388ac", - "coinbase": false, - "hash": "bd2dcae7b3e42564727874f4de33585c9441f4f970837001620824d22171836f", - "index": 0 - }, - "script": "48304502200b9b423e25d4bab690567cd511b07f9985bffe60ad517f2c59a60d5101abc2320221009f83fc6a4f3906aeba90686c6acbf3cf70fa14a61a9425519a925cfab7695c0e0141048e45e0c18ebbe92ef2c4d60b4731e96f84502f49f876bb374258087ee85a6f8bcce839e8d9d2912c1b1ecbe9fc6c4e3d4f2447855c487519cabbd98d592ca6e2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000, - "script": "76a914612e4fadce1ef0eac9ac6d8a0bbdfe20e6a6cbd088ac" - }, - { - "value": 756041, - "script": "76a914643af3c2c74b7415f03190c0f3dd5c95c33c3b8388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dab24570202b9559b5c310da245f8ecfe5050d8d4c4f1d1d6d242592b3b49712", - "witnessHash": "dab24570202b9559b5c310da245f8ecfe5050d8d4c4f1d1d6d242592b3b49712", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 273, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cebda43ce6c5444f4fc37db33736e47613d49d98b03f80f89efd7fce5e25d814", - "index": 23 - }, - "coin": { - "version": 1, - "height": 299580, - "value": 102571, - "script": "76a914becf73d8e4259a5fa84b70b050ec3e66527fdde588ac", - "coinbase": false, - "hash": "cebda43ce6c5444f4fc37db33736e47613d49d98b03f80f89efd7fce5e25d814", - "index": 23 - }, - "script": "483045022077375880583ffe07ff01bc4e6b28be313d922447a5fd3ba8db85f94a0fbf0b81022100f3dcd7a5175e42bdd2f16ac62339e6786232ecfefe28035b8834475e0a7d865d01410464227e11f96aade1a3db4d1170c792c18b34af9a4070040afabbb650bd29f2bf217a814f78b98696ffe06382af4ef10a87272d46a13200ea6b8db5c3503e47fc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bb742e66eb9da26e4297f96ccc584d07604337aa600c67daa9c9b072c46c0524", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299612, - "value": 1042610, - "script": "76a914a89468dd0680258ebbd17eef89da9a3cfcba4bd588ac", - "coinbase": false, - "hash": "bb742e66eb9da26e4297f96ccc584d07604337aa600c67daa9c9b072c46c0524", - "index": 0 - }, - "script": "493046022100a3d350c5518ddc62e8d0de3a8b3d0074dda5aee63863d2eac52ccd49c41bf876022100ee09f009cdc4bc3393c1b94b5eff214583cb18f113079962a1a8e96cf3448c17014104913f2fcb5ea9cfddc2b46ba2cf0ae5ff0f7211b107b5b5bf9206422ca2629092f823f83a0ebf38196c78c490c72faf5af3e9da79ef4643151e15fcf0265909c3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d9b1372d6ad132ec504a7a39f83a3173d8b93f82c537207a2b43d7cd1d441d23", - "index": 27 - }, - "coin": { - "version": 1, - "height": 299734, - "value": 1538709, - "script": "76a914becf73d8e4259a5fa84b70b050ec3e66527fdde588ac", - "coinbase": false, - "hash": "d9b1372d6ad132ec504a7a39f83a3173d8b93f82c537207a2b43d7cd1d441d23", - "index": 27 - }, - "script": "48304502210095b18cfeb7d97d40cfdc0468ed2b834ea6fca76b18d8fad5f5284411998c3f5502204e8f5b83d7eec03946aacd4079626ac06eca77d5307f4e1210b8de903ea7566e01410464227e11f96aade1a3db4d1170c792c18b34af9a4070040afabbb650bd29f2bf217a814f78b98696ffe06382af4ef10a87272d46a13200ea6b8db5c3503e47fc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dec49c040603c615a51dc64dce1a401ed9564055feac4c81b18cb425b37ef1cd", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299776, - "value": 1198600, - "script": "76a914a89468dd0680258ebbd17eef89da9a3cfcba4bd588ac", - "coinbase": false, - "hash": "dec49c040603c615a51dc64dce1a401ed9564055feac4c81b18cb425b37ef1cd", - "index": 0 - }, - "script": "48304502203de7fc5c08ec97cf8734e310eca8ae4c304b169e61ef50f7ba2b719fdc82c3b4022100ef5ba35c764073a59913a0b5c337ebad97b4b856bc631c5c0b994fb3e6bba44b014104913f2fcb5ea9cfddc2b46ba2cf0ae5ff0f7211b107b5b5bf9206422ca2629092f823f83a0ebf38196c78c490c72faf5af3e9da79ef4643151e15fcf0265909c3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9b724cd2006b12ced38f14eca52c3eb3a5f26a006ba53d2ba49b04a10e777f13", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299814, - "value": 288533, - "script": "76a9144a7a75b76ecb264d5fc8de9b2962972c56e7cc5688ac", - "coinbase": false, - "hash": "9b724cd2006b12ced38f14eca52c3eb3a5f26a006ba53d2ba49b04a10e777f13", - "index": 0 - }, - "script": "483045022100a3378d6fbcdae4278dc62dfee2b06d2600d4dc8d3a71ecd334b76b54da86574302200b673a87d50e3ba4cb7c928b7dde03cd20842c72b756b4f22a42e01e782a1f98014104b59b747189877f688d2abbba8b39cf52a2ee13d1826b159028def01931f9be859c4986bb3c9dcd57f7b2ac5cba5f6f27518b6102aa9f0894a63dd7c0ef96ce7d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "573f4ebe401f762e8943707e3ed3c2fa75cae5f9f2d01d503f228a772a73c66e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299859, - "value": 2961040, - "script": "76a914a89468dd0680258ebbd17eef89da9a3cfcba4bd588ac", - "coinbase": false, - "hash": "573f4ebe401f762e8943707e3ed3c2fa75cae5f9f2d01d503f228a772a73c66e", - "index": 0 - }, - "script": "48304502207f6ec92eae3d446999ce18aecca95ab30ea16e0a823ac34ac72ea086b513b07a0221008d912c539dd6a7a88c299f7fc880f657adf7304a7f22c5011a6ef249c746c64d014104913f2fcb5ea9cfddc2b46ba2cf0ae5ff0f7211b107b5b5bf9206422ca2629092f823f83a0ebf38196c78c490c72faf5af3e9da79ef4643151e15fcf0265909c3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3f6dfa147ea17976be6d889cc49521823692de5a0d74fd971cb36f263eb9dc9e", - "index": 32 - }, - "coin": { - "version": 1, - "height": 299894, - "value": 609952, - "script": "76a914becf73d8e4259a5fa84b70b050ec3e66527fdde588ac", - "coinbase": false, - "hash": "3f6dfa147ea17976be6d889cc49521823692de5a0d74fd971cb36f263eb9dc9e", - "index": 32 - }, - "script": "483045022023343511e0b82e089d9b1f209fe5c76058b05c41536890c071109c2d4ede6584022100d7ef737dca17645e7b52f4867594db33771d7aa2a1589a52201bf78148b7d31301410464227e11f96aade1a3db4d1170c792c18b34af9a4070040afabbb650bd29f2bf217a814f78b98696ffe06382af4ef10a87272d46a13200ea6b8db5c3503e47fc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "35f244fe1c02d86695c662b4392ccede1403692d4bfc5f565930ba1fa9fe8e02", - "index": 160 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 1971673, - "script": "76a914becf73d8e4259a5fa84b70b050ec3e66527fdde588ac", - "coinbase": false, - "hash": "35f244fe1c02d86695c662b4392ccede1403692d4bfc5f565930ba1fa9fe8e02", - "index": 160 - }, - "script": "483045022100cc2647ee6ae664cb9515d7d73292763b3ecb79bb7a1e4932b56afebaa8351f4a02207acc553171a0363275cd87dbdccec5e26029a89525b21eb06ea22d10f3a58ee601410464227e11f96aade1a3db4d1170c792c18b34af9a4070040afabbb650bd29f2bf217a814f78b98696ffe06382af4ef10a87272d46a13200ea6b8db5c3503e47fc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "57d62e51ea08382152699122e27acb029a7e897439127c0dfccd68111e8e653a", - "index": 217 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 915404, - "script": "76a914becf73d8e4259a5fa84b70b050ec3e66527fdde588ac", - "coinbase": false, - "hash": "57d62e51ea08382152699122e27acb029a7e897439127c0dfccd68111e8e653a", - "index": 217 - }, - "script": "47304402205b542b5f6253e894443554b93ad156820f3053ff80c855aab98720c104d3a49802200df395dcb8e26a776e0c5abe8724a402bf27bc80f5be7994c063c77e2c00615901410464227e11f96aade1a3db4d1170c792c18b34af9a4070040afabbb650bd29f2bf217a814f78b98696ffe06382af4ef10a87272d46a13200ea6b8db5c3503e47fc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "691e435d856e5859ce8c4dd9b1ecfb56cd559577bb87ad261eaa9775c971bd7d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 157444, - "script": "76a9142fafdbd19ea9cb90c7bbedccfe35afdd06e2317d88ac", - "coinbase": false, - "hash": "691e435d856e5859ce8c4dd9b1ecfb56cd559577bb87ad261eaa9775c971bd7d", - "index": 1 - }, - "script": "47304402203bb54d2c505fc965e73d02c6732c1f3597ada01ce12493107228adcf106b4b0e02201cfbb3bfc876665c2a2e8829f7857068d3002877d8f10c79971e71672f71b9340141047e686ead89e47a70ad22b479aad77a8cadf38f0d2bc859ec9d57bddf7d8e8fa5066153405e3f6350bfb068e9d3fa6b7ea982896c3e90cde771969f69f134ada1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10629092, - "script": "76a914061fc21293e9b56f762974d59661d05196352f0588ac" - }, - { - "value": 97444, - "script": "76a9141c3b5f566fae121c3f60d7cf1a3d6fb93c26f27588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "29778598db5cf170f8bb06ebf66fabf083fe7fafdb3aa507dfbb3aceb3642bb5", - "witnessHash": "29778598db5cf170f8bb06ebf66fabf083fe7fafdb3aa507dfbb3aceb3642bb5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 274, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7786b1fef695745ca47211e601d0a89feac273a448fe11ec5372d4608fcff520", - "index": 129 - }, - "coin": { - "version": 1, - "height": 299867, - "value": 1510192, - "script": "76a914d4e20181f2ba4d6d9ec54ffbe9e5ef7a79c117d688ac", - "coinbase": false, - "hash": "7786b1fef695745ca47211e601d0a89feac273a448fe11ec5372d4608fcff520", - "index": 129 - }, - "script": "47304402204fd2fb35064bc1936968891f14740138034adfea39979e7c178455576d55997d02203651b769914f7b58a8c4aa1aa92017efee26245ee9027b7b10c8b396fdc4af56014104076cd3b57b59401bc43ae7e8999d4c2d6f71a1b56b8d29a16ab62e6116b3030d2a5899a84eff71108ccdd6e38f44707a0313abf4ea580f161562e6502755baa6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eed19a476c34fe2c40ac7778f305471bb38528c344dcb363510597beeaf61149", - "index": 130 - }, - "coin": { - "version": 1, - "height": 299882, - "value": 1597822, - "script": "76a914d4e20181f2ba4d6d9ec54ffbe9e5ef7a79c117d688ac", - "coinbase": false, - "hash": "eed19a476c34fe2c40ac7778f305471bb38528c344dcb363510597beeaf61149", - "index": 130 - }, - "script": "483045022100a7bbedd48d83bd36bc2bfba4955b18694df17faf97454ad28095e08df20289eb02200c13b995fa8023c93a05f346019bb7f55e2fcc1d1f8194b01aebe1e30f7ffbb6014104076cd3b57b59401bc43ae7e8999d4c2d6f71a1b56b8d29a16ab62e6116b3030d2a5899a84eff71108ccdd6e38f44707a0313abf4ea580f161562e6502755baa6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 59 - }, - "coin": { - "version": 1, - "height": 299934, - "value": 1648926, - "script": "76a914d4e20181f2ba4d6d9ec54ffbe9e5ef7a79c117d688ac", - "coinbase": false, - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 59 - }, - "script": "483045022100adb5eab9d82bafefd04f342cb6b8edf9f619d80ddc1409ca4a0d0557eb4361ee022008324cb2e2f9e561a4256452fb3bab9f173dbd6dbc5b3e840d53176063864a05014104076cd3b57b59401bc43ae7e8999d4c2d6f71a1b56b8d29a16ab62e6116b3030d2a5899a84eff71108ccdd6e38f44707a0313abf4ea580f161562e6502755baa6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3db341c76192192c56350abb22e4b039311b1aa92abff213b759aea75020c54d", - "index": 136 - }, - "coin": { - "version": 1, - "height": 299958, - "value": 1614345, - "script": "76a914d4e20181f2ba4d6d9ec54ffbe9e5ef7a79c117d688ac", - "coinbase": false, - "hash": "3db341c76192192c56350abb22e4b039311b1aa92abff213b759aea75020c54d", - "index": 136 - }, - "script": "483045022100d56dbcd9b8b4158a16831f1b82b9dd75a19f1349f53ba92dd02180026433712e02206c799212908966f5811b12e9bb313a39cd3376232f8f3c00a7e7b04f3123cbf6014104076cd3b57b59401bc43ae7e8999d4c2d6f71a1b56b8d29a16ab62e6116b3030d2a5899a84eff71108ccdd6e38f44707a0313abf4ea580f161562e6502755baa6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 44 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 3368904, - "script": "76a914d4e20181f2ba4d6d9ec54ffbe9e5ef7a79c117d688ac", - "coinbase": false, - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 44 - }, - "script": "47304402200d82152187c2c853ebd91ee09c42cbcc80017da27e5a86f2bca8faa88ac5013f02207c468127d2f46cdd0ea966020a2cd5f8126937833720d4d0c72b67d905528916014104076cd3b57b59401bc43ae7e8999d4c2d6f71a1b56b8d29a16ab62e6116b3030d2a5899a84eff71108ccdd6e38f44707a0313abf4ea580f161562e6502755baa6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 132 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1742648, - "script": "76a914d4e20181f2ba4d6d9ec54ffbe9e5ef7a79c117d688ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 132 - }, - "script": "483045022018a972b079fc210f08a4a9d1a75bbb2aee60ea6a08e93409166d3c6830d50dae0221008fe5c97d9238559027b3c9b1d47ad412436eab02308f5b1e78fc8634324435bd014104076cd3b57b59401bc43ae7e8999d4c2d6f71a1b56b8d29a16ab62e6116b3030d2a5899a84eff71108ccdd6e38f44707a0313abf4ea580f161562e6502755baa6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b654cc570a64adfa18bf101ac799a80f40b16e922f20344150eb6a4db5818cc", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a91451366b096b793530b214cc2bac20a5ee3ac5fd9788ac", - "coinbase": false, - "hash": "4b654cc570a64adfa18bf101ac799a80f40b16e922f20344150eb6a4db5818cc", - "index": 2 - }, - "script": "4730440220528c684a980f889353dc9325480665a9fdefd3693acd3911b154baec566e581d022022fdbdd47691cd94ce66001ba13911d4d28fc3f5fd5954377799895e2b59b5a90141047586cbd4bbc043f170e18537f30da0ff805f4e4056a8c18560fea7a869aebaa4e657aebe41706aaa4bb6c8abdfbc0758d4d18d47ead7ccc1f3d1023b2092237b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11482837, - "script": "76a914581510d916a33aa88decf8abfee4244100bc631188ac" - }, - { - "value": 97491, - "script": "76a914888ddd1a80202301874600bef5821cac8dd8fc4688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5e493035338c4ec38fe4800d6bad1d198cfb3cda0c4b6d161a491a6c9f91303f", - "witnessHash": "5e493035338c4ec38fe4800d6bad1d198cfb3cda0c4b6d161a491a6c9f91303f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 275, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "eed19a476c34fe2c40ac7778f305471bb38528c344dcb363510597beeaf61149", - "index": 102 - }, - "coin": { - "version": 1, - "height": 299882, - "value": 1696503, - "script": "76a9141efd84d31371664e858f50a4e9f87a6aca8d3e6988ac", - "coinbase": false, - "hash": "eed19a476c34fe2c40ac7778f305471bb38528c344dcb363510597beeaf61149", - "index": 102 - }, - "script": "4830450220793a15bb7c6a739f762d0f9bb9367068b3bc31bf0726a3a95763e8ab5e710e08022100a11f671872ad74bfc3985ef9492d49d0461b421545836567117a1975e3ab2e56014104784b83cb44d867f169a9b6dc75940a653cea9460cdef5d104bb837203d1056d505db427b731927ef05275d1b77c387f3dd0d3b9ffc1124be981c4003c51affbc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 109 - }, - "coin": { - "version": 1, - "height": 299934, - "value": 1639846, - "script": "76a9141efd84d31371664e858f50a4e9f87a6aca8d3e6988ac", - "coinbase": false, - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 109 - }, - "script": "48304502202240c4f30e1e2eb62be8e01a030ecdaa4ae4c1c1a800f9ef1ee5c384044d1946022100d6ee6f5e61bb0659b20c9e6a9c9c54cc1406d704d24bbb917ce583db92a54de3014104784b83cb44d867f169a9b6dc75940a653cea9460cdef5d104bb837203d1056d505db427b731927ef05275d1b77c387f3dd0d3b9ffc1124be981c4003c51affbc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "12805d07e80e8ed46fe7ed9e218c580d70b1ffdbdef61ba18dde8ab3b5d88045", - "index": 69 - }, - "coin": { - "version": 1, - "height": 299958, - "value": 1000000, - "script": "76a9141efd84d31371664e858f50a4e9f87a6aca8d3e6988ac", - "coinbase": false, - "hash": "12805d07e80e8ed46fe7ed9e218c580d70b1ffdbdef61ba18dde8ab3b5d88045", - "index": 69 - }, - "script": "493046022100893659c1d468d85a10dda2559e19888282d90865854ffcb3009d99a866a7795c02210086e57e764318b2c7f0668238b71782b612fdb8c75fcc5c89a997715a4caf6d0b014104784b83cb44d867f169a9b6dc75940a653cea9460cdef5d104bb837203d1056d505db427b731927ef05275d1b77c387f3dd0d3b9ffc1124be981c4003c51affbc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3db341c76192192c56350abb22e4b039311b1aa92abff213b759aea75020c54d", - "index": 108 - }, - "coin": { - "version": 1, - "height": 299958, - "value": 1693063, - "script": "76a9141efd84d31371664e858f50a4e9f87a6aca8d3e6988ac", - "coinbase": false, - "hash": "3db341c76192192c56350abb22e4b039311b1aa92abff213b759aea75020c54d", - "index": 108 - }, - "script": "493046022100bf16e9ceb3725d4ee3f47c46207bf1fbc16051757f9a7e7c209a97b1eb6f5315022100cf66b20d93c120203bf747663761c656bb0c6bdfbcaa083973980401c7e800c2014104784b83cb44d867f169a9b6dc75940a653cea9460cdef5d104bb837203d1056d505db427b731927ef05275d1b77c387f3dd0d3b9ffc1124be981c4003c51affbc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 112 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 3389637, - "script": "76a9141efd84d31371664e858f50a4e9f87a6aca8d3e6988ac", - "coinbase": false, - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 112 - }, - "script": "493046022100ea51211d67976001c3afc822e39516fff395efe94df39b4a86035ae3fbe144b1022100e6f96762303c9e9aa74792226c2b79b4f5878ba6676547c8255d1078cbd0f2c4014104784b83cb44d867f169a9b6dc75940a653cea9460cdef5d104bb837203d1056d505db427b731927ef05275d1b77c387f3dd0d3b9ffc1124be981c4003c51affbc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 113 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1735127, - "script": "76a9141efd84d31371664e858f50a4e9f87a6aca8d3e6988ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 113 - }, - "script": "483045022100e67dc9a55c21bdc923ca6a30cc9c109d97907c4aab92f871b1c76d23cfe9366f0220037538f86592b1fde8442870da977d0e79d6a49739ecbc03ea52b6d58c12363c014104784b83cb44d867f169a9b6dc75940a653cea9460cdef5d104bb837203d1056d505db427b731927ef05275d1b77c387f3dd0d3b9ffc1124be981c4003c51affbc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8cfcb2ac8e8bf54e98986a5a3546f1c465cd7ed9055a621be0ad1a285222218d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a914cccecea682e7278fcba33cdeb5198a2fe8db48f588ac", - "coinbase": false, - "hash": "8cfcb2ac8e8bf54e98986a5a3546f1c465cd7ed9055a621be0ad1a285222218d", - "index": 1 - }, - "script": "493046022100e155c3dd142e776697f1daf0de5ac4d8cb029c077c8a1ac65888b9146be3ce83022100ca0a6b377c2fa56e2fad11f1301728c06ef68f8b5ab6513aac23a61747e5f725014104af04f9c76f51b2326899089f2f542ce92fee32f440fd4f45bbc4b8e15ba48a72073e9601b95c74a7a58da812ab696501811253e91834a26a0414d05d7578e1e7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11154176, - "script": "76a914011076a0de3450760f5ce109c9d5e5f1f7e3581488ac" - }, - { - "value": 97491, - "script": "76a914dfa5d7b4ded036e8e77bb8a5826a1cd99dd4c9ac88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5773341daf3cb86318ee629f51996c70cb2b074bde2c909431c2e942dda45d5a", - "witnessHash": "5773341daf3cb86318ee629f51996c70cb2b074bde2c909431c2e942dda45d5a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 276, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6c2afe3ab93d849f9651175a7216fc96d52e24b21cae80097500e47e151b9037", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1010000, - "script": "76a914dec45e657b24c5cb4417bf6b1adbc466677d968d88ac", - "coinbase": false, - "hash": "6c2afe3ab93d849f9651175a7216fc96d52e24b21cae80097500e47e151b9037", - "index": 0 - }, - "script": "473044022042e6af7793b187d8b8a8e21a02f9517b88f7b4620e0ac00a3772fa1c5484ea25022051ed081c8788b9a9bf9f73895c60fa34270bcf4bc831a8c22fd646d308c064470121038bce75485d1035cd29e56ae5cedfb2c2bfb44c3037793a622ed231fbddd3f59f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "da808268ef90228a195bdc74eb86a5565f86fc2a1013a7bd2ea8c14338bffae7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 38990000, - "script": "76a9149bf549bbe4f62b0fa6b299ef152d600543920d0088ac", - "coinbase": false, - "hash": "da808268ef90228a195bdc74eb86a5565f86fc2a1013a7bd2ea8c14338bffae7", - "index": 0 - }, - "script": "47304402205b98f59c1c58dcab29905c56b0ab4101232500b810f26f8136bee02d418fa63902201a0d5decdf631eaaac5e1b7b385c5ff877899f3d09109ed24fbb197004090fe801210343612c84b58199cf04731e4dbaa1e8b062afbfa449652c7d58ace7bc92e5128f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 39990000, - "script": "76a9148af646acc740e28c56ac3c49fb858569c99ee07b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "002dbe6fb0abf7fdf2ec00c565aa93e3789de6c09f9a4c352eb7e41c48745dc8", - "witnessHash": "002dbe6fb0abf7fdf2ec00c565aa93e3789de6c09f9a4c352eb7e41c48745dc8", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 277, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "39cc5cbff4a8f32e6b2b195743433a2d91bfebd95122e23d296d9cd4ba97a016", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1762868, - "script": "76a914434ba8f5690c860b42d41a4d371e83686e01c89288ac", - "coinbase": false, - "hash": "39cc5cbff4a8f32e6b2b195743433a2d91bfebd95122e23d296d9cd4ba97a016", - "index": 1 - }, - "script": "483045022073dec8a3dd637791f3995d88797a679dd9074dcf7ca7ab26ecff353012f439f0022100a754b21a7e0ceebabba9055c0ed9dffffa58e4e881ed2a4c54f10fc688b3c23e0121034291d35abe74f3d5327bdfdda087e1844373e58da19e6019d75dcb723664df1b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "43db3bc5c7f32290070a36323fb23f7ff7ce51a5c612328b7a19a753e594b619", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 2798167, - "script": "76a914434ba8f5690c860b42d41a4d371e83686e01c89288ac", - "coinbase": false, - "hash": "43db3bc5c7f32290070a36323fb23f7ff7ce51a5c612328b7a19a753e594b619", - "index": 0 - }, - "script": "4730440220196bab39e5f0af0e26532a3be4a1521adb9bf0b762b9b43146dc7aefb5dfeba502206863ff10671a48b58cccb71d6c58380c16accf74f0575cb2774e684bcdd9ea180121034291d35abe74f3d5327bdfdda087e1844373e58da19e6019d75dcb723664df1b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4551035, - "script": "76a91495c45958af57ca886b5fb5c80abe3a549d804f0088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c398587668f11ccf46725627ba35be99555cad4a655e9976af2de032c3c61514", - "witnessHash": "c398587668f11ccf46725627ba35be99555cad4a655e9976af2de032c3c61514", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 278, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "43829f98f2b237bed0b5f6627c1f28aab636102d5176d134e4e40da6160331a7", - "index": 53 - }, - "coin": { - "version": 1, - "height": 298845, - "value": 1139828, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "43829f98f2b237bed0b5f6627c1f28aab636102d5176d134e4e40da6160331a7", - "index": 53 - }, - "script": "493046022100886f06fdb75e3a999c33f61e815012dbdc3ad5ef9304185adf568c92f27407f8022100f4f321091cdc69f9b14a62bd2e57b19786bdddc78784195adca06935b66c905d01410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e56777177aa89185cd6a1c17d6b51a89d53041f95fb7ac40e1030e272eeaf874", - "index": 45 - }, - "coin": { - "version": 1, - "height": 299028, - "value": 1092928, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "e56777177aa89185cd6a1c17d6b51a89d53041f95fb7ac40e1030e272eeaf874", - "index": 45 - }, - "script": "483045022079ff4a51177d4236beff6325dcbd80dc6a31aa2eacf3be77d66eb13eb67ccf660221008421f9faf6f36d5dc4901b6bf0f85c8d48fe6671c93868ee358f39e25e930cc601410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e6dfbd11e2b8c240f998b23a76c4e8c08376c761e346ff097ee71ff12bbea1bb", - "index": 56 - }, - "coin": { - "version": 1, - "height": 299115, - "value": 1038194, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "e6dfbd11e2b8c240f998b23a76c4e8c08376c761e346ff097ee71ff12bbea1bb", - "index": 56 - }, - "script": "493046022100c6a1e3f15e8c546c028bc011c551a62d857823e21da442bdd83d52e825b1c541022100af453ba49d3c16da0a1ae2c3777656a0120d6a6e51bfba087ca25d818855e38801410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4628d81a464dfc13b21c21e0d78c01bd75897aed98cc3c554ed8753c88513e1e", - "index": 64 - }, - "coin": { - "version": 1, - "height": 299179, - "value": 1096533, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "4628d81a464dfc13b21c21e0d78c01bd75897aed98cc3c554ed8753c88513e1e", - "index": 64 - }, - "script": "493046022100a2c24ecffcc45653cbfb907b5a6b83ee1e16dc19a6b5da5193a615264d484230022100afe3b17806215d9a16d5442a6ac4e86c02fac97898aa95a66789500dc128341901410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2294ab087d8b5cbbdc70c704c60c220093cb4e5738b4957d04c7817fd984ea17", - "index": 46 - }, - "coin": { - "version": 1, - "height": 299270, - "value": 1118458, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "2294ab087d8b5cbbdc70c704c60c220093cb4e5738b4957d04c7817fd984ea17", - "index": 46 - }, - "script": "483045022100fce53dbebbad7ecf51619274637e4568372984704260404b7f79ee0ab8b6304a02206abcf402eeb4c465a3e516ff7eb8f9de39c8ca6e0cc8c9fc3083ff3b0474cd9601410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e5f38158fcbec00206cfff7fbf27a0d0bc6ffa11a60329212da91bbc4acfc178", - "index": 148 - }, - "coin": { - "version": 1, - "height": 299428, - "value": 1098573, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "e5f38158fcbec00206cfff7fbf27a0d0bc6ffa11a60329212da91bbc4acfc178", - "index": 148 - }, - "script": "473044022045d8f6a9bbdaf2fff66ffc72d8282d23466799664260bb0e179727d916e7f00702200986a9a3eea702871feea1b9dc2dc9d780d8535ddfa2ab2360373e25b3fead4f01410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c675f716bae8815d3f02a1fcde8e5067f0db58ef31d73dca660af82490b631e5", - "index": 48 - }, - "coin": { - "version": 1, - "height": 299660, - "value": 1014512, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "c675f716bae8815d3f02a1fcde8e5067f0db58ef31d73dca660af82490b631e5", - "index": 48 - }, - "script": "48304502200db23e29830fb09da38ab4b8bbeb9dfaa0d802374c44f4d9d0a79ce1013deba60221008952b7e0abb7572626d618ae12f5010ec1abcc720de6594a559cda0e26ad435501410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ca9f4b16cb3638b65883eecc7a3de55c96da079e94096629fe3c3174d5611b80", - "index": 55 - }, - "coin": { - "version": 1, - "height": 299795, - "value": 1064978, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "ca9f4b16cb3638b65883eecc7a3de55c96da079e94096629fe3c3174d5611b80", - "index": 55 - }, - "script": "473044022008f1f217318860d1e6761a581a3d22a5cc42fd4036f77b37b9d614d30aa3b7bb0220024790656da399b29f1400df602d7c8a1078088e89e793b2fbc79277b5f82cf901410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 4 - }, - "coin": { - "version": 1, - "height": 299934, - "value": 1145196, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 4 - }, - "script": "4730440220147496814617b4e965bd58b124c1ac89c4cbceabd70123fd1ffa7ef1330cf103022061c9a841ed5238b458e9c2a965020d5128884a940c4efb0491748fac7da54aa601410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a276ab8e71f9349020a826d20f3d593dd8c72c018178ace54073f08c5cf8af2b", - "index": 48 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1041717, - "script": "76a91459967caaedf4d61cfcca001800a4e167cdb7063788ac", - "coinbase": false, - "hash": "a276ab8e71f9349020a826d20f3d593dd8c72c018178ace54073f08c5cf8af2b", - "index": 48 - }, - "script": "493046022100c7d07071bfd3bbb24d922d8e4200518c52c44383ff6800bb9e5ef22c8b153b9e02210099c33c40279e7a7ff8e3c443657b367e9fc446db9728591e234377652bfca12c01410487a3bde1362bfec32cd177266472098c94660461f805c35148ccf5c9b2ff085536d1a3261a967cc54dd2cbcc742493f7db8744ff1b2e706650f5c2557b2cff3f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "36ea80823e1132ba521279edf6f0f30d602edced7699f5027ee29c676f4b2f5a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77440, - "script": "76a914daff5f9b97826984a513b033d1ab3e943ec52b5288ac", - "coinbase": false, - "hash": "36ea80823e1132ba521279edf6f0f30d602edced7699f5027ee29c676f4b2f5a", - "index": 1 - }, - "script": "483045022100d8815c28d2f75063b0c8c501eccdb4442f859178fe5f6d59222cfaf6ebd076aa02201ad8209250e3e9177ee88ba487c6f443292ee2d9d78906086fb44a6062ebef8b014104eee53617620a28e95fd533dd28253d8a471fddb70221ac0bb2b14120944aee8e4379dcaad6caa31122a29e3e311d4aadb67d277b1c5cce4a0430a8e304293dcf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10850917, - "script": "76a914126b9ad432ff046b405b634b7395f4d902cf011288ac" - }, - { - "value": 17440, - "script": "76a91482ef2a46d38324dd9b06d87a2ac9a36786a7d95488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d152f08118010b71f79bbb315e0815097069cad1608edf683bfe713efca670fc", - "witnessHash": "d152f08118010b71f79bbb315e0815097069cad1608edf683bfe713efca670fc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 279, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b54fdcb65b257aa04f04255683c728da74a404a36205a8b367491bb9112c2d40", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 761409655, - "script": "76a914dcf2440817495e38a34a45fe49877dfb4a57f1c388ac", - "coinbase": false, - "hash": "b54fdcb65b257aa04f04255683c728da74a404a36205a8b367491bb9112c2d40", - "index": 3 - }, - "script": "483045022066fd4b6d8b44e31f977024b604b82dd91817f58c73fefe531a02ccfd5f5c4255022100d126f2b799ecdb440a55b1709a83621c20a112c79330aecd54633aed3fb0f40e01210305a29061071b961830c67966119a32bb8e188b0a82d6d76ada04a2f103183887", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 740736369, - "script": "76a914ce264bd2578ee548576bd7917dd8dc78e86ef65c88ac" - }, - { - "value": 10096772, - "script": "76a914cf1f3536b1a860893a2859e8cf42e7167324914888ac" - }, - { - "value": 4985845, - "script": "76a914f99b3aa1ec19dd4a9732fe06e2b822f6f3fb787188ac" - }, - { - "value": 2577737, - "script": "76a914b8e08bdecfef828b40ef7d34185ec2159260f3a088ac" - }, - { - "value": 2000432, - "script": "76a914f4ab290de39fd9931d0903b3eed37adcdf8ad83788ac" - }, - { - "value": 1002500, - "script": "76a9142ea32201fb4a034bc860d70728dfddf9699ffad288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dd0715ebd60131df4880f276ccba4b55740978b759fa09f9ff4223947a6c0542", - "witnessHash": "dd0715ebd60131df4880f276ccba4b55740978b759fa09f9ff4223947a6c0542", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 280, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "70f4fecd524ede51bf720c927f381eb96b0d4f1cb87a60f2254137085a28b7bb", - "index": 202 - }, - "coin": { - "version": 1, - "height": 299294, - "value": 214918, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "70f4fecd524ede51bf720c927f381eb96b0d4f1cb87a60f2254137085a28b7bb", - "index": 202 - }, - "script": "48304502203203edd5005da848ca4e0e845cdc8dcc2f59b211b4596170eab6c228943e64f4022100c765c66a593a95c8018bf24bd9c137a7526bb1c790660fef686c3ee608852274014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7cc653806a9f27af5d7e492c6fb3085776aca3477447cbeab57c511efba3aae", - "index": 860 - }, - "coin": { - "version": 1, - "height": 299394, - "value": 293678, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "e7cc653806a9f27af5d7e492c6fb3085776aca3477447cbeab57c511efba3aae", - "index": 860 - }, - "script": "493046022100c48d9c8aa5ec02b64429da58ef4edafeef3bb7ac81f6fd238417fb8c0c587d75022100bed923ec3b027ddb4858468e63d44ee917b7343294e1d154d0dbbb9f1cc9cb2e014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bdd261fc99eae91e23faca29ac3ee9a3dfdfaf7da475555b42be095c47de4517", - "index": 295 - }, - "coin": { - "version": 1, - "height": 299485, - "value": 878203, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "bdd261fc99eae91e23faca29ac3ee9a3dfdfaf7da475555b42be095c47de4517", - "index": 295 - }, - "script": "493046022100f363dc619c1af62968813fbe311d97184cfe4e813bb1140d8777998df7c34fc1022100d83cc56143f2ba505fd6c78d20c49b4581d2452a4fc27854008c3de836a29f06014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "17d8ca4a6ea7a29b8882fdffc0e5962cf9937031cabc9d52b66cade12937a231", - "index": 253 - }, - "coin": { - "version": 1, - "height": 299602, - "value": 906932, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "17d8ca4a6ea7a29b8882fdffc0e5962cf9937031cabc9d52b66cade12937a231", - "index": 253 - }, - "script": "4930460221009353d754515fb16a44a39c8c077fa40bfd135700668b9507731d7f168ed78ec4022100b6383713110d11e7cded7457bc5bbf3766c0dd4f95bafcd87915b612a946ba16014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "28f47647d5fed7acc6279ebed126a153c44e0963c21a3d89d27eece24038f090", - "index": 276 - }, - "coin": { - "version": 1, - "height": 299686, - "value": 858673, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "28f47647d5fed7acc6279ebed126a153c44e0963c21a3d89d27eece24038f090", - "index": 276 - }, - "script": "48304502204d16d18d2d9a6ff0f4702ae6fce4099eddf743ff6dbdb7900381f59a3cce529d0221009cff0869961687a65f3f71860acf62436f85ff3a6f731dc6659f2e8c798fbe9b014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4ced3e4d04da6b8a1400bda5f848150a862c745784162c7adb730f2d307cc6a1", - "index": 316 - }, - "coin": { - "version": 1, - "height": 299728, - "value": 863506, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "4ced3e4d04da6b8a1400bda5f848150a862c745784162c7adb730f2d307cc6a1", - "index": 316 - }, - "script": "483045022100cee5008a484464551d46c0188196a3b57a219ea4ee82b165f7914bad697c42a202200a788611cf3c20960fd85b760cc3646331ddcff66ad6aabecbbd1555a8c953e3014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fe42554bb2bc26ae4ae1e26f2229fefa271ff11e85765a1f05385161d46d96c6", - "index": 290 - }, - "coin": { - "version": 1, - "height": 299767, - "value": 830073, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "fe42554bb2bc26ae4ae1e26f2229fefa271ff11e85765a1f05385161d46d96c6", - "index": 290 - }, - "script": "483045022026933555c09e2356ad40e7436b61c83145b003d90769e189d8f796bf80f1c3af0221008ee0d10e586359857f9c9a2d3cd50e181cbc105076d7bbcb798956c2f40a28fc014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bf9eec8083992f731e17acfc30e4ef372df077e79f7f1d41525ee9a186aeb005", - "index": 307 - }, - "coin": { - "version": 1, - "height": 299811, - "value": 782377, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "bf9eec8083992f731e17acfc30e4ef372df077e79f7f1d41525ee9a186aeb005", - "index": 307 - }, - "script": "493046022100ce05e9309177a063b1cf35ed851f59dba67a75274ba1960b6822baff009018f1022100f0fc95cf7af5e8e6f0a409a84b38580527cbd3d2c2330640abb5ccf0eb739df7014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f3ac1a2e544cbfe761553c4a779559cd64f6a416d426c0c01b249b2cab516059", - "index": 301 - }, - "coin": { - "version": 1, - "height": 299856, - "value": 840851, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "f3ac1a2e544cbfe761553c4a779559cd64f6a416d426c0c01b249b2cab516059", - "index": 301 - }, - "script": "47304402205e6ce2e7d0c2dd13b0d1567c1fcbdc50cfe5311f314de2123e4fef3fd0d678d002200096a624d3f9b815c8d3062a2754edb9d630f334c83f7b303d99c50953afbc17014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "83b27bcc0002f3c09066da06b56e2323681781983daede2bbe4b760b06627765", - "index": 179 - }, - "coin": { - "version": 1, - "height": 299888, - "value": 803582, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "83b27bcc0002f3c09066da06b56e2323681781983daede2bbe4b760b06627765", - "index": 179 - }, - "script": "47304402206bd5f587ac9ff7ec9366ba2e4c706a0ba2e62813bea9fcf0cac5a59126610c91022019baee2c6401013bd1ad9b61b2020e0a9e84b61de54853222635b917d39644b1014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c8fddc149a37ad1e4fde3050a9c69f6ac84d71ac4a3f8619b90fc6c98aabf5c1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299916, - "value": 376639, - "script": "76a914ccb0d3cce180ff1b80a61cb69f92d8de38bb749a88ac", - "coinbase": false, - "hash": "c8fddc149a37ad1e4fde3050a9c69f6ac84d71ac4a3f8619b90fc6c98aabf5c1", - "index": 1 - }, - "script": "493046022100bbd15506b3bb7aa2dd9fdd8074237794d2652471c081dd918ca4d2da7ccda38902210093bae0c8163e6da7b51ffb14a5c0569277ae8d1d6e9c332670d16b4f709209c5014104f0b25b7783449e545c524611dffcbcbb93957d4f02e89d8e768e50bf26f4605d9a78418aa47b9ab73a73442410f7a629d9d4edf40bf76e40d841edd51cfb405f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "95eb632619f829d566f69466cae0c03640ca3c7f8a04ea0d105d3729c233ab0a", - "index": 289 - }, - "coin": { - "version": 1, - "height": 299934, - "value": 855311, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "95eb632619f829d566f69466cae0c03640ca3c7f8a04ea0d105d3729c233ab0a", - "index": 289 - }, - "script": "47304402203ffff93a4ded0bb2b68e03adeb3fe5faf91dabefe27660860aa3db8f3815dc4c022072b18161de1ff867159a5e9f1826e9b7b91eee03d99fe8a5ba9d895dcb24f066014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c857e3ab46e30be796e241322a4fd1a105935ce359aeca6ce61751ea03588799", - "index": 171 - }, - "coin": { - "version": 1, - "height": 299977, - "value": 882544, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "c857e3ab46e30be796e241322a4fd1a105935ce359aeca6ce61751ea03588799", - "index": 171 - }, - "script": "48304502207899b252545c701a2cafd9fc4bb45983e19c6af826b193e6fb96a16205364b4b022100c81f36e102d9bfa510442ac15fbc0d8b81b1a64aa8025743fb5834382aca5e22014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "57d62e51ea08382152699122e27acb029a7e897439127c0dfccd68111e8e653a", - "index": 192 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 857359, - "script": "76a91441fb01158444f080924e364c094bc35d1811f64a88ac", - "coinbase": false, - "hash": "57d62e51ea08382152699122e27acb029a7e897439127c0dfccd68111e8e653a", - "index": 192 - }, - "script": "48304502200485a5e2e2ef809f1a8f661e90f11926f252fdd0c2e96448ba883189199365c8022100fff055fd0615d2eded20ded701c95f58ddde3812b1bcd742f29b6f06c20269c3014104a85d428748700dfc1cdb2a798be889640d34c393ee67db074b07d7dcb9c82f273e3ef049dc2cbb315bfee6170d917cfb978adb89cb053848240636de1f345da3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c02200cd03b2848b2aebec162e66d3247fe8f986c3b298a7e3dc4a30cee848d6", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77491, - "script": "76a914798c63acd13d947a6b7e2b2d01502e1162659e3c88ac", - "coinbase": false, - "hash": "c02200cd03b2848b2aebec162e66d3247fe8f986c3b298a7e3dc4a30cee848d6", - "index": 2 - }, - "script": "483045022100e028a1d332a8118eac74dcdcaf4117daf1f519bf36749e034ca86766ac6420f8022044a130bddf8af3efbd319bb1b94ea0a7a5fb95cfb621e7b4310d63e2793eedd5014104d0d4e45bbe2876f6ad46e3f49bf6b3b1828bc01fdf45a1832b73406983ba1f6502d8c4cece56e2afe51100e983f4eba4d2810d22eec147347a551183b41f2626", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "470c82630cf7547978314860d4a765d17c5d069a58d2812148313c85edaa0a7e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77491, - "script": "76a91485aeb3e83a1ae8ba59333fc1aa32a94e7c6d12e688ac", - "coinbase": false, - "hash": "470c82630cf7547978314860d4a765d17c5d069a58d2812148313c85edaa0a7e", - "index": 1 - }, - "script": "47304402207d7504e7c4bdececa2e417c61cdf78bc74cf37afcb4a1cb84c4b280710402d410220339d9107da6402b053c4cb9aa5ae5d30baf8436042798327961312f81b289d41014104e7bb3cbd61f48acf36ff1f181f606b6d913c9dabb8177eb3dfb9b9e749864d827752c815c285e5fd9071619728cda374b254dc32643d7807f0cd94ec4f4d95e9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10244646, - "script": "76a914361e8411e4365d23156fbc82d91592721e44d41188ac" - }, - { - "value": 74982, - "script": "76a914a02355a0eb70638c97422ac4ab912c5f7bf6049188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1a02e7fd2a252ed146435ef1791b806996773a14f5e8f753df8bc3467104d664", - "witnessHash": "1a02e7fd2a252ed146435ef1791b806996773a14f5e8f753df8bc3467104d664", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 281, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "44fe88adbc2c6e3603a339650a5dc654d4a17896e0ec636dc2bbe0fa2b3b127b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299872, - "value": 72400, - "script": "76a91492f3a3d4415fbe4588fd15d0cd5a7552a7ab849088ac", - "coinbase": false, - "hash": "44fe88adbc2c6e3603a339650a5dc654d4a17896e0ec636dc2bbe0fa2b3b127b", - "index": 0 - }, - "script": "4830450220156b3ae16973d78bd04ecab70bdeb021e4a4bb930fb23b797123ee098295000b022100f7384c716a061e98e76c9edbdcab170c042322ff72fb1922155141e2791193620121020e8d328f7badd0578a110e2d0aa4ead56fa55eb516582d35d33970b7ca3c033b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5460, - "script": "5141047900000078da35cb3b0ec2300c00d0ab4466edd004371f16c41d18b3d871024314a3aa085588bbc3c2f696f786a263ab6383131ccca5777353953cf2f87b327741047d195aabd9f579ce032658eba3ef57fd152c228e99b1459ec5cfb8a04f3e4a0a969a2025a2e6622517988ab7dc620ccbd13a142ed511c2e70b960028140000002102f884647516015a0f5861633406a0c8b2ef2d8967aa61a97a5fc2b14bf0ce23ba53ae" - }, - { - "value": 56940, - "script": "76a91492f3a3d4415fbe4588fd15d0cd5a7552a7ab849088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c767ebc67e43c761c9d2276d995cd4235cf94a48a7be1f72b44dd74fcc8a882b", - "witnessHash": "c767ebc67e43c761c9d2276d995cd4235cf94a48a7be1f72b44dd74fcc8a882b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 282, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5576233216cff1c75d6018d4148370e80cce68fbeb2845083045431d355b4925", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299692, - "value": 11847974, - "script": "76a9149992fceaddc583ef6171fc5333ee7f77df2f3dc088ac", - "coinbase": false, - "hash": "5576233216cff1c75d6018d4148370e80cce68fbeb2845083045431d355b4925", - "index": 1 - }, - "script": "4930460221008231961f6e64143110b0336f14ff686e315b0085a98332fc505b466f32ed35ed0221008ba367d6e0f63fb7a484838327920407fa622e0b7c0fd4520e0ad573e35b33110121037101cae85b2c3f6ecad718156cefa364d5c436948f0f3a76738d86399464d200", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f4d751284e1afd3a6637a830085f258ab8d2f7d60c4c21bf2e9cf9c65e556262", - "index": 82 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10073, - "script": "76a914926c6cfc4851ddb8dd8bf7ca02bb8d4dc805b35488ac", - "coinbase": false, - "hash": "f4d751284e1afd3a6637a830085f258ab8d2f7d60c4c21bf2e9cf9c65e556262", - "index": 82 - }, - "script": "4730440220090a4c1f5ed103a07f8cc7e3c4a0f8d436b7bb28667cc64a35834f0acd3bd0ad02204711730730158aaea9fd6f8f648244ff645cedc88b07e2032d2fc7cce7cff2e80121024ed3c5b1d299fa86f43cff241ae1131d157010825bcd185871073f2a95260f6a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5962010, - "script": "76a91476a70cc55832c997b2d559a89e5d0f41468bbc0288ac" - }, - { - "value": 5885964, - "script": "76a914a312e284754c239d581532ef7f19f2459110d0ee88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a1f91ef6c0cf36d2f2632da3e8fff3497b6ba30e8191a7be2ad82917ff55a81d", - "witnessHash": "a1f91ef6c0cf36d2f2632da3e8fff3497b6ba30e8191a7be2ad82917ff55a81d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 283, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "938a28e89904a325fab604146f0dfe57a0be14da0b3940075d61cd0bab165cbe", - "index": 1 - }, - "coin": { - "version": 1, - "height": 292371, - "value": 383560, - "script": "76a914b74b23b751d7fde101b9a2577f370f802f67485588ac", - "coinbase": false, - "hash": "938a28e89904a325fab604146f0dfe57a0be14da0b3940075d61cd0bab165cbe", - "index": 1 - }, - "script": "473044022027c9c2fde4e533097ed1f62aa2dddee10166bfc49e9333f22fe683277d9b3a8302203bce162768f759404227882ebd1d29ec0fced320a04b91fb2f74af3fabeca2e20121034c3e19d81b46c5a9268a24c5ce016e866462c46778698b18a5e3f782138721f2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "60557e1c7632a33b58701670ed46480f26d7c256b79d097059c58ffa3822ef97", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298734, - "value": 9431600, - "script": "76a914b74b23b751d7fde101b9a2577f370f802f67485588ac", - "coinbase": false, - "hash": "60557e1c7632a33b58701670ed46480f26d7c256b79d097059c58ffa3822ef97", - "index": 0 - }, - "script": "473044022068be46734cde6422cba60666c3ae7c4cee1d8a2c6035c29e6e135b98aba35af90220009008910eb4179d3b899b5629025050be001021cea4571a14c287b8c4d439480121034c3e19d81b46c5a9268a24c5ce016e866462c46778698b18a5e3f782138721f2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4687700, - "script": "76a91426091c3fb18c5d7240154932424bd13216885e1388ac" - }, - { - "value": 5117460, - "script": "76a914b74b23b751d7fde101b9a2577f370f802f67485588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5c92531edf7b441ad27e876afcc0252aed04bde4b481833a03a9c95ab9df392e", - "witnessHash": "5c92531edf7b441ad27e876afcc0252aed04bde4b481833a03a9c95ab9df392e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 284, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1e57654dd8a2ae8cd43eaed316fd714058e944ab3b7000c8ea8e90183176cf73", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 790000, - "script": "76a914534f420c13b4af49c9cde2dd34f6dd78d1996dc488ac", - "coinbase": false, - "hash": "1e57654dd8a2ae8cd43eaed316fd714058e944ab3b7000c8ea8e90183176cf73", - "index": 0 - }, - "script": "47304402203437c48baa7db1a12ad25d4f6871d30577faa1a19a4175544216a3aa12f40795022033482acbbe0c8c6993eef76368e33571bc5202181a90efc1550513a264ddbf3e0121027d9ffcf6b145351c02c252dfcc679de664158b613a4181baa321ba8667e8b9ff", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "29d27a7b3a400f499875b02ba876d64b5fa5b6c06544e4ccddf567a5794bb93a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 590000, - "script": "76a9141eccfcc9230789a1daf9b1ca278bce7d7fd93d3188ac", - "coinbase": false, - "hash": "29d27a7b3a400f499875b02ba876d64b5fa5b6c06544e4ccddf567a5794bb93a", - "index": 0 - }, - "script": "47304402205caab992b536abdf2f8562664d085ec4bf100cbe7e0a421a878ce050ee6d252e022057b3f396463a8dc4ae7c529ba9b0006637ff9691a8dcbfdc5e0cddff723fa1be0121033398733d287a8d188607c14245a369ca89dc9c3057d84f1eb41bef2b6db6e097", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1170000, - "script": "76a9143a3c573b1f2da608c4c1cb97cf8a6401b532735588ac" - }, - { - "value": 200000, - "script": "76a914da5dde8abec4f3b67561bcd06aaf28b790cff75588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f1c97673d21ceb6a799aec54bb5f781c9630098aa1b0e1fd0b9e9cd47646cd9b", - "witnessHash": "f1c97673d21ceb6a799aec54bb5f781c9630098aa1b0e1fd0b9e9cd47646cd9b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 285, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f4614bb1ef0f0f9ac51603c39b1538161038a76556bd08ed5439cacd8c9e8e06", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300001, - "value": 947000, - "script": "76a914192631d280209f63886c0c591d34af37c3597a8188ac", - "coinbase": false, - "hash": "f4614bb1ef0f0f9ac51603c39b1538161038a76556bd08ed5439cacd8c9e8e06", - "index": 1 - }, - "script": "47304402206e6c40dfa5e6ab5229c380e8fec33c299f1452b4ea4dc9955586504006508142022027640ddc4851fb840155132c24c19a4eae1d3a858ae86513ff58787e7a964fc0012102e1146e3b32f554a750bddfbffa9ab9c1fef49d73f9881ff9fd28821dc0b1dc94", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "db42149ea14687b58ed30d085c27c649a1623485d201d8c547e441671a00aef3", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 1957000, - "script": "76a914192631d280209f63886c0c591d34af37c3597a8188ac", - "coinbase": false, - "hash": "db42149ea14687b58ed30d085c27c649a1623485d201d8c547e441671a00aef3", - "index": 0 - }, - "script": "47304402202e575167291d0b32015d39488183838b21065cd781ad458a91f927b6ec4df6040220351212694924b866e83e9669486fe3e3b8c43fa34e5f578b64f4fe57d5cde2d9012102e1146e3b32f554a750bddfbffa9ab9c1fef49d73f9881ff9fd28821dc0b1dc94", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000000, - "script": "76a91406f1b6703d3f56427bfcfd372f952d50d04b64bd88ac" - }, - { - "value": 1894000, - "script": "76a914192631d280209f63886c0c591d34af37c3597a8188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c02ddf214fba2a42651e6f1008d3962ad0286cd47feb15a2068d2832fb5618e8", - "witnessHash": "c02ddf214fba2a42651e6f1008d3962ad0286cd47feb15a2068d2832fb5618e8", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 286, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b2c333a5cf5aafc5b8a3074a6756624395051b0e99e9dd0d9b36abefce408afd", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1334690, - "script": "76a914554f654f42bb81c871ea7e5c29a74359a4b392ec88ac", - "coinbase": false, - "hash": "b2c333a5cf5aafc5b8a3074a6756624395051b0e99e9dd0d9b36abefce408afd", - "index": 1 - }, - "script": "4730440220758d3a957beefdf54903c622168d77bbe1839b65545fa06c15e16fbcb71ee99a022012ba9e504cfa17a8f618503c2f13ed2e0764bc0b075b2be9d07110d765118c0d012103475f35e3c73a97c164f525e0a4f33f58feda9396dd63c297dc5a2fe910f34e23", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "56d28bdb6966fa01fb428fa19afd78c68d62b86aa1d11af9d856b6f148b11e1f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2033193, - "script": "76a914994423799a675229719c51ecce74a9c46eb706cd88ac", - "coinbase": false, - "hash": "56d28bdb6966fa01fb428fa19afd78c68d62b86aa1d11af9d856b6f148b11e1f", - "index": 0 - }, - "script": "473044022070ed981bdfc7279cbd5911f8b5e6d417bf9bf0d9262a0bd27ed412f0d87e1ea802206e25a9d074b052e36c191d0ef52b6d9753279a9d11c0e96825b7a6e6863752d6012102aeec73a3d0280513c5df237a25ff09df85b27f2410e0f73bab95f1eb5d601a43", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1490000, - "script": "76a9143305fc8e435c26696944ac2e9dec97490972939088ac" - }, - { - "value": 1867883, - "script": "76a9143e5f9696140288cc421752c601527042551ef2dc88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ca7a6cbad1676b3b096be7584af7ebac5d2c5ff5542f271a230377778f115b00", - "witnessHash": "ca7a6cbad1676b3b096be7584af7ebac5d2c5ff5542f271a230377778f115b00", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 287, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "60f6f7ccfe96ee03db59230a88c70f9ac2d26988c749b9b8ecebc28407f46d7b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1400000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac", - "coinbase": false, - "hash": "60f6f7ccfe96ee03db59230a88c70f9ac2d26988c749b9b8ecebc28407f46d7b", - "index": 0 - }, - "script": "47304402201a1a0478e05c9868305a4a3d3659501170a16078a7dfc87d1e016b7d6398f095022051e8f38643b7b7c12d5542eae6dac661d20db33042222bef2e40474dc8ef8f6d012103afd34045d7080e5f3d8fc0efab187951caed4b06571c7cc617d01d9abe8b36b5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "316fb7544f2689f32ca74404b6f9187cc79926a5eb44eeeec62d5a0c9d572003", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1680000, - "script": "76a914cdd6cbd410b70ecbca00b02d0f962b710a7fdec488ac", - "coinbase": false, - "hash": "316fb7544f2689f32ca74404b6f9187cc79926a5eb44eeeec62d5a0c9d572003", - "index": 1 - }, - "script": "473044022060a7ff0e2144eed256eea951b0f1f13b5d42a2da78f06c2a807ba7ea5231dbb602203b4ce95c63045be16a7f0adb4b5709b4c09bcf4a91af535a74e835642a717527012102e6b43d1e214b69683b25be7a393e0008727b47b84a16a4f6bd5250bac26b6463", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2450000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac" - }, - { - "value": 620000, - "script": "76a9143dfeb05e14625b32bfe7be9c5454e599dc2d74b788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2c1c1d82549653e82b59d5bfc97c371ee9f26d06638b1d914aa86ec859544a93", - "witnessHash": "2c1c1d82549653e82b59d5bfc97c371ee9f26d06638b1d914aa86ec859544a93", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 288, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "109bca5b016157045b98ea03fec5ba339e8328cbbceb203a0d7c42cc19dec752", - "index": 0 - }, - "coin": { - "version": 1, - "height": 288590, - "value": 12000, - "script": "76a91444d9de47d5e56ff63cda7b957b0cdb05e51248c588ac", - "coinbase": false, - "hash": "109bca5b016157045b98ea03fec5ba339e8328cbbceb203a0d7c42cc19dec752", - "index": 0 - }, - "script": "47304402202f0e6ee84a4952c8f9ca34928f879f07e8367192af19bba29948a92b4bb2ea1602201818b99897a72e338a3e79629361d76dfb6ff4a59a3258961b6e3cd8dcfa63f9012102e2bcd0f305e9bfd38d57b1d7d96a73723451c62aaa02f5050ddd1330db404a62", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9a0135a7d24d8ab9e356b03bd119659bb7e039d13bf5e4ca97ef912011813946", - "index": 0 - }, - "coin": { - "version": 1, - "height": 288918, - "value": 23300000, - "script": "76a91444d9de47d5e56ff63cda7b957b0cdb05e51248c588ac", - "coinbase": false, - "hash": "9a0135a7d24d8ab9e356b03bd119659bb7e039d13bf5e4ca97ef912011813946", - "index": 0 - }, - "script": "483045022100d537027aa34f252d74213b75e6206b530aaea9b6295e14e889cc04cd0cbbc8cd0220584e5cdf995daa3639d88e29d9f5089d6b1996d72c723b5866f8abe3fd10aa1e012102e2bcd0f305e9bfd38d57b1d7d96a73723451c62aaa02f5050ddd1330db404a62", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5000000, - "script": "76a914d94eb17daa055c61c81b651e337d4840c659589988ac" - }, - { - "value": 18302000, - "script": "76a91444d9de47d5e56ff63cda7b957b0cdb05e51248c588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c3b2f57b3b56ca4f88757b8b133b8e451e20bce28937cb44d50ba244620c75a7", - "witnessHash": "c3b2f57b3b56ca4f88757b8b133b8e451e20bce28937cb44d50ba244620c75a7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 289, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e7ae40fc16e8b9fe6917088b1eaa76a1c05db664acb0137cf3375ea7d902645b", - "index": 211 - }, - "coin": { - "version": 1, - "height": 292765, - "value": 1540975, - "script": "76a914c32d60f2d5f2954cea7482cb969267e4cfa46d0388ac", - "coinbase": true, - "hash": "e7ae40fc16e8b9fe6917088b1eaa76a1c05db664acb0137cf3375ea7d902645b", - "index": 211 - }, - "script": "483045022100ac5d45bee5bc4568217bfe224b89b61f85b0a8020d4c73855178f7069384d69a02205a7c29fdb9437264bbb6f2e12ac01590b3856512e1b3def015f1f3aa2bc893520121035c684d9716aa7b5aba92787441a4dfff5956d00cbd53e4feaf9c0b94c2867be9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7836ef023c3e328c2b1ce5a656e1e26e9b02b3e535363d8239540465196ea90", - "index": 8 - }, - "coin": { - "version": 1, - "height": 289805, - "value": 1104408, - "script": "76a914c32d60f2d5f2954cea7482cb969267e4cfa46d0388ac", - "coinbase": false, - "hash": "e7836ef023c3e328c2b1ce5a656e1e26e9b02b3e535363d8239540465196ea90", - "index": 8 - }, - "script": "47304402200d122b0027a895df41ab039b5518c0621ba61a7f90e15f9de2cf166156f78b8b02204d80f5f0291fe4be99de1e84181a746b1a26f4fbe8e4f98b0b30d4ccb21a821d0121035c684d9716aa7b5aba92787441a4dfff5956d00cbd53e4feaf9c0b94c2867be9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1520000, - "script": "76a9146d1287f39566ccd60e8da35676291b94aef06fe988ac" - }, - { - "value": 1115383, - "script": "76a914c32d60f2d5f2954cea7482cb969267e4cfa46d0388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "91b47401fec564f051a8251a4427473f2c21c6de32012feed1e25078a35e1cb4", - "witnessHash": "91b47401fec564f051a8251a4427473f2c21c6de32012feed1e25078a35e1cb4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 290, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "35a2bff5f83f71e49118b0d8af19dec50f71fc6b4b446ce5aa5f25cf3b2b4502", - "index": 1 - }, - "coin": { - "version": 1, - "height": 294159, - "value": 80000, - "script": "76a9148fe7f60336b1fe51e161165e2990c97b65c10b0688ac", - "coinbase": false, - "hash": "35a2bff5f83f71e49118b0d8af19dec50f71fc6b4b446ce5aa5f25cf3b2b4502", - "index": 1 - }, - "script": "473044022029520b1679797135906131089a91d18fc726e1dfb73aa97cddb73283dbd4d28c02201376f01592d34910c4095c8f9f3b4f638047c36391336b20ec5be397bf8f2d67012102b9516a2aa0c77338990e57c626e5896a1aa22845d0ec26c0c8c728526cbb9297", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e6fcdc83df62cea267868120a8aa9162087509f4518ce1a2b187ec2e94519b87", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 45000000, - "script": "76a9148fe7f60336b1fe51e161165e2990c97b65c10b0688ac", - "coinbase": false, - "hash": "e6fcdc83df62cea267868120a8aa9162087509f4518ce1a2b187ec2e94519b87", - "index": 0 - }, - "script": "483045022057d3a3f8a436cc5fcc5e853a32c45cd6d12c6dcbe6156004b1c1ca45568ca7e00221009e7e5d8ed623333950cecdd6a469f0bcb14f83f64d2751fb5f95963fa36dc17f012102b9516a2aa0c77338990e57c626e5896a1aa22845d0ec26c0c8c728526cbb9297", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 44000000, - "script": "76a9148385618ddde5d14e1b43f1ebbcac5056e892579488ac" - }, - { - "value": 1070000, - "script": "76a9148fe7f60336b1fe51e161165e2990c97b65c10b0688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "aacedf4cb563527da63777b72c2af68419ec779cbc5cb257d94679a8a93fcafc", - "witnessHash": "aacedf4cb563527da63777b72c2af68419ec779cbc5cb257d94679a8a93fcafc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 291, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b2ebb384228d5883392122a40054faeccd13271e8c8a696139612e0a561039a9", - "index": 41 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1723167, - "script": "76a9148f788dbad2aaa8377f8d272521d2c4cae5562a2788ac", - "coinbase": false, - "hash": "b2ebb384228d5883392122a40054faeccd13271e8c8a696139612e0a561039a9", - "index": 41 - }, - "script": "483045022100ebda1ea6d3d3ae968de510e8f9eade73f79eb820e02240880be64a64080930410220713fb550354c467b9fe8004a7db55b06e43aeea49fbff098efbae482d098da010121037d0bcc54e5347955e7fd5874cb4bc118439bd39de2e88632c614ea49e6c67e83", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "faccda56c64a67ca18141c21d12d23f3bdc2cd941a4b869c5c6baa7ff331f68d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300022, - "value": 99988000, - "script": "76a914d1d7358b55b8f3a29eb9086f8672ac156a87704f88ac", - "coinbase": false, - "hash": "faccda56c64a67ca18141c21d12d23f3bdc2cd941a4b869c5c6baa7ff331f68d", - "index": 0 - }, - "script": "47304402200893ad0278b41c26fb3603631201672519dbeb841c1a2d70b18bf14e669f56b802204f5155e95f536c0548c94c3b0e51901281fce63567b103b38dd02da2bc043fb10121026788a63be63c5ba64390986972cf3b43445960fd9dfc610be5020832d2d235c0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000000, - "script": "76a9147aadae60821e6a67ec1f43c85bef4fb9acf01b9488ac" - }, - { - "value": 1701167, - "script": "76a914b434be0dd11b2f1784ce650959f6433f947fb0d788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3b133257dc71de271625b010f4e550104363d9a336375f61f38bc3fd8885b03d", - "witnessHash": "3b133257dc71de271625b010f4e550104363d9a336375f61f38bc3fd8885b03d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 292, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "472efa2efc0b71df6e08ce0fd02f8ba9f383b431c7e10661d9b8b242321ceea2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 34000000, - "script": "76a914917e6547b809746cc1161ed919ae496b8172c17b88ac", - "coinbase": false, - "hash": "472efa2efc0b71df6e08ce0fd02f8ba9f383b431c7e10661d9b8b242321ceea2", - "index": 0 - }, - "script": "483045022100b11ccdec3fea18eae8f7c4beb6f4c1e6c3544b0e670b0fad4d5a18c9c9eb9d9402202290aa9bbd025499436e44334d7fd6a0c84fa6c75115e488bad311f24131941d012103bd8130bc46abf211104d2d85181e0c04fd13456261161c45a5c3736fd3276b19", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a6f478bfc8fc17a25ce21a7599d9fe36e7d590b0450d54586d8b35cc15d21930", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 28780000, - "script": "76a9149b3290a962997deaefaa23a9483bd996700204f188ac", - "coinbase": false, - "hash": "a6f478bfc8fc17a25ce21a7599d9fe36e7d590b0450d54586d8b35cc15d21930", - "index": 1 - }, - "script": "47304402202ed115ca0ec62a72049f77d4292245ee9020542f6a044ba67b9a8056dfeacd5102205b8ba164af753f8ff4414cfde11b2d03ba0a2f94a8024d3f3bcf1d1a2b5898290121029703da9cf1b031f8919361e3eba3b572ffef08f46b043e85fa98b1bac1967fa6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7500000, - "script": "76a914cf5a97ae78c6765c53c13924442ca1c5c47b9f8488ac" - }, - { - "value": 55270000, - "script": "76a914132a7a18c3c1da3c1993dea0f61d203bcc1b760b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c5909b36e84ce28feca7661d4f7c7f4bd15f5e662bcb0893ebdd064ef7b8ac4a", - "witnessHash": "c5909b36e84ce28feca7661d4f7c7f4bd15f5e662bcb0893ebdd064ef7b8ac4a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 293, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3b133257dc71de271625b010f4e550104363d9a336375f61f38bc3fd8885b03d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 55270000, - "script": "76a914132a7a18c3c1da3c1993dea0f61d203bcc1b760b88ac", - "coinbase": false, - "hash": "3b133257dc71de271625b010f4e550104363d9a336375f61f38bc3fd8885b03d", - "index": 1 - }, - "script": "483045022100d1f101628a136f61b2b49ec35f3211b9142d386ec79f9d36b8de91e9ad0ac47102203e762b4c18552fb78e3fa8c61180cb11c82d3d965b4cef49b34493e46fbf97720141041e681e75178d798197913f40f6f2b61453165b1deb995598e43b42b36a01375fea026498313295a7451dadde2ac5d036a23c67a883c3a8fff490bbb983e3c436", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 55260000, - "script": "76a91448d34cbed6c62c2552b892af410981b8b4972afd88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8d6571393b01506db4619b6a06588de4919adc75cb35f8aef87cb6c605370923", - "witnessHash": "8d6571393b01506db4619b6a06588de4919adc75cb35f8aef87cb6c605370923", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 294, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "265fd49a74a03295c4b340f1c6eadd49556da016a5c64449f61c0d66d86699a7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299912, - "value": 1068477, - "script": "76a914005caa12264f97d1858d6f641e8470d19d3cf84b88ac", - "coinbase": false, - "hash": "265fd49a74a03295c4b340f1c6eadd49556da016a5c64449f61c0d66d86699a7", - "index": 1 - }, - "script": "473044022100f70dc8c65d86ccda7d30c98922f3213ffda953e7bce93d1d4159abd80e410621021f21387b2d825cd092c19aa0ef297e63fc548c8c836d99dc793df1c0d727eaa00121039101094857215d7cf414d407fe748de80820d1bdf620cb4ce18cc1f2dd62ac92", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "659691216fdae0aa6810d8c7ffe6e97e3b470a8eda85c5846180fb88456fdbc8", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1193456, - "script": "76a914c2c43391052c4f4ae4fbf15147edeb105580d55688ac", - "coinbase": false, - "hash": "659691216fdae0aa6810d8c7ffe6e97e3b470a8eda85c5846180fb88456fdbc8", - "index": 0 - }, - "script": "483045022100cd1223a556667ee850dff82b37aef59deca66d5ffe5f8b7e525465032cc79d37022039bded52fa047de906f5960d4313ec4df8526b4665f5f0e7419745ad367ec10001210331434643399d51a6465095f5909b7274878adafb6525e0d3f77a499b78d8478a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1313654, - "script": "76a91435a5be358c3208dde222da1d1c6110c250f85b7988ac" - }, - { - "value": 938279, - "script": "76a9144b5d3234d8c5123af2153d82f054e4ba2f0173ca88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fde1f1b7e916203e44ac403a387499b2c9a189a6917bff131dcd70cff805ec47", - "witnessHash": "fde1f1b7e916203e44ac403a387499b2c9a189a6917bff131dcd70cff805ec47", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 295, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "86ed787450c5066628e797167794a518ab4050aca3a04415b68ec5f7328b9e95", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 8630000, - "script": "76a91413e11dead3d4f7083299a318633a99d9df113b2c88ac", - "coinbase": false, - "hash": "86ed787450c5066628e797167794a518ab4050aca3a04415b68ec5f7328b9e95", - "index": 7 - }, - "script": "483045022100c0c4f479ef282fe7321cb50622e5ca8f8c80ba05dc2f066b8081d7a82744dc2e0220234771656ea0b9b155d5c9ed08d1d2d31068f19bfc57be30e78f0f7da9ca4755012102a52bcba59563c3af2e5fc34a3abbaaf088acf6e88d747d95fb1dac5b10774406", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a343005ba755c40b279175891125ef172e4011e36e6aa0b529d309dad0c35048", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299225, - "value": 122500, - "script": "76a91413e11dead3d4f7083299a318633a99d9df113b2c88ac", - "coinbase": false, - "hash": "a343005ba755c40b279175891125ef172e4011e36e6aa0b529d309dad0c35048", - "index": 1 - }, - "script": "47304402207875b1003b8a0b3695cf84e71d077c851ca2eab806c9708c6bd04f902e4f1a3f022042e8867b24aa24fb5b24c2cc0745b83652de7054a8edf09d05184538deda5a7e012102a52bcba59563c3af2e5fc34a3abbaaf088acf6e88d747d95fb1dac5b10774406", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 7660000, - "script": "76a914b06ad61bb95bcadab4050811f8901e1cbe07a78188ac" - }, - { - "value": 1082500, - "script": "76a91413e11dead3d4f7083299a318633a99d9df113b2c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ed4e37630636dd289a7bf806a8d6bc48b47b646c522bed2183e44ab0dc638059", - "witnessHash": "ed4e37630636dd289a7bf806a8d6bc48b47b646c522bed2183e44ab0dc638059", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 296, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c06afe1e69d9e156e1ac4a858a64e00e0e155f569b3112452ee3a3631a0006a2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 700000, - "script": "76a914c02e21fe5835ce5361611cde12184b490a13447188ac", - "coinbase": false, - "hash": "c06afe1e69d9e156e1ac4a858a64e00e0e155f569b3112452ee3a3631a0006a2", - "index": 0 - }, - "script": "4730440220531c478bcf6a0ffa0d67e6e2d91b70b22bc955a2dab9b5f62b97bc530b299cb402206938d14c3d8a2739995ff0c61d4f993ee505c3dacb3beabef57d4070990044ce0121028d2ac663ff325b4f411b3e5f846366df1eaea6d1ee9b0ba6c896aeaae4f781e0", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0827f5ab595944a8a0e53ad10a91311b5a6813826dc2c919faea10288bcc0372", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299909, - "value": 494920, - "script": "76a914c02e21fe5835ce5361611cde12184b490a13447188ac", - "coinbase": false, - "hash": "0827f5ab595944a8a0e53ad10a91311b5a6813826dc2c919faea10288bcc0372", - "index": 1 - }, - "script": "483045022100be2b9add4ae6bf24ef455a5a58b1b5ded7d4e049dc2d748762625497b2871671022053a9d9481374349cb8d190dc130c1e43779b6cd7f8e9bac2071112294dd5c9360121028d2ac663ff325b4f411b3e5f846366df1eaea6d1ee9b0ba6c896aeaae4f781e0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 881096, - "script": "76a9142ecf3308cfe238b1a16bbe87d6e966c78878cb8e88ac" - }, - { - "value": 303824, - "script": "76a914c02e21fe5835ce5361611cde12184b490a13447188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "97057b2d13aec42bc81dbaf5c88cb5cb4692133a0d81aab7dd7530dda4f39df3", - "witnessHash": "97057b2d13aec42bc81dbaf5c88cb5cb4692133a0d81aab7dd7530dda4f39df3", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 297, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ed4e37630636dd289a7bf806a8d6bc48b47b646c522bed2183e44ab0dc638059", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 303824, - "script": "76a914c02e21fe5835ce5361611cde12184b490a13447188ac", - "coinbase": false, - "hash": "ed4e37630636dd289a7bf806a8d6bc48b47b646c522bed2183e44ab0dc638059", - "index": 1 - }, - "script": "483045022100a48b55f699579f63652367691aaa346988eeca005a1d5f48142c1909ce6a42ca0220490948a77fa8cd01ae7ad2689ce82be31e0a524f9b7dceff1f50a641c00c7eac0121028d2ac663ff325b4f411b3e5f846366df1eaea6d1ee9b0ba6c896aeaae4f781e0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 220274, - "script": "76a91433c730a953aff27bdc67a4dc546edf1355d4a0e888ac" - }, - { - "value": 73550, - "script": "76a914c02e21fe5835ce5361611cde12184b490a13447188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9934ee52aaa3f1bfd008a15c3a8ee17defd3dcb338051c1054d363ca51ebafce", - "witnessHash": "9934ee52aaa3f1bfd008a15c3a8ee17defd3dcb338051c1054d363ca51ebafce", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 298, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ad921b089d5bf5660b2377240055d6d62c451e8e82b54741f88b473db55c2c92", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300006, - "value": 950000, - "script": "76a914f46da1a391c96e45eebc58d7500ff079e961c27788ac", - "coinbase": false, - "hash": "ad921b089d5bf5660b2377240055d6d62c451e8e82b54741f88b473db55c2c92", - "index": 0 - }, - "script": "483045022100db39d85d7656437176a73798346fab49006a3bec04fd846bc42a479a1cd7c4bc02206e688bcfa0c1452555de5d01aca68d0417ac3919ce9d5343d3a5dd0032312bec012103050931e5304081bf6032b2802593775cee2cea5daa27e0756444fd3eb72774f1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7ad3c2f8a919fab1d707a37757a6a73db341772843949dc421eaebe66528a94d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1000000, - "script": "76a914a1666c8d6c517d27f49711166d7f075ed7a0b9ec88ac", - "coinbase": false, - "hash": "7ad3c2f8a919fab1d707a37757a6a73db341772843949dc421eaebe66528a94d", - "index": 1 - }, - "script": "473044022066b776af77c222242fb573df64eed7ec112fc5ef4aaf4c8e6e12c4dda0dd302e022039031ec299a77528b45448300534729cef693efd991f3be3a3408f8a3c0d38ff0121022126d5f7b096f28692d11e5c3973c30ded085f4f821e67683a716d9f384ecbc5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 911500, - "script": "76a91479f245378f8a4b62ccb730f88223f4ee58ef550388ac" - }, - { - "value": 1028500, - "script": "76a914bbe7b2f91f674d20726b065f1917724e914978ad88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ba6ceddee3d4b4b752181c10c1934c43e0e0d1be1e8a348b8c17639d2cc46e43", - "witnessHash": "ba6ceddee3d4b4b752181c10c1934c43e0e0d1be1e8a348b8c17639d2cc46e43", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 299, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "472efa2efc0b71df6e08ce0fd02f8ba9f383b431c7e10661d9b8b242321ceea2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 930000, - "script": "76a9143e5acfca9f74ffc8392d86c4a73071d1046c94e688ac", - "coinbase": false, - "hash": "472efa2efc0b71df6e08ce0fd02f8ba9f383b431c7e10661d9b8b242321ceea2", - "index": 1 - }, - "script": "483045022100cd3e0a5de28c8be410a8880a01ecadfa064d8de2570786e038697f19981405bf02203a7bd284a94771e6fb13dd067d0cfb576570b486f78294dd9ef143a82f950e6c012103f99698956bde948b21003dbdf0b8b2f770b3472dc4361d6564013ecc3df84bc5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0b3ec64a91f7c379ee23225d4b782bbe25323dbd4f525eef7b5011adb8532d41", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 15000000, - "script": "76a9148c63c41972e73aaab09649e24169e8f65fbac4f188ac", - "coinbase": false, - "hash": "0b3ec64a91f7c379ee23225d4b782bbe25323dbd4f525eef7b5011adb8532d41", - "index": 0 - }, - "script": "47304402204a42d7b396ac2c99bc666c18d4824854eb34d6356aed70bb465ab89c613c4cbb02204105b3546c143c87985f9cfde85ab3e3f8ef8aadae6f3ce18c5afe24e7d211550121028ed8f7e94ef2cae74d8c77c112efaec1e4304ea47d358e72dfd7c21a24ec4f4e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 15600000, - "script": "76a914917e6547b809746cc1161ed919ae496b8172c17b88ac" - }, - { - "value": 320000, - "script": "76a9143e5acfca9f74ffc8392d86c4a73071d1046c94e688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e5c397aece37160ca30b84f84aecfafd43a239d6f55686e47788316641e1b035", - "witnessHash": "e5c397aece37160ca30b84f84aecfafd43a239d6f55686e47788316641e1b035", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 300, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f532f988c05936f5a9dc4cb98312170d20ccb4a99925341a4678f62a8a69e04c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4173821, - "script": "76a914e709c720dfa6efef20895dde2f4d174860c591e888ac", - "coinbase": false, - "hash": "f532f988c05936f5a9dc4cb98312170d20ccb4a99925341a4678f62a8a69e04c", - "index": 1 - }, - "script": "483045022100966bc20486b6f2994a85ad2cb1251b9388e051c3f6df5536963a0ffa6afe60d002203500873507e8245fd0cff5481ce0ba8c0444b26ef2f8c28bf8aee8da82f827af0121038358cbd8b115aa7741232b30258b1c508d7720de877a0581d15e1377ea475949", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d45eb219e89b89e52cd8c05a19e8a91997e78ffbde50572f220964f652afe670", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 3513667, - "script": "76a914d2642b747216b7e5ffb5ff47b23243278b57691f88ac", - "coinbase": false, - "hash": "d45eb219e89b89e52cd8c05a19e8a91997e78ffbde50572f220964f652afe670", - "index": 1 - }, - "script": "473044022076a4cd306ff8092488806d736f5538cb10e981489a9e6dad6cd19f2acf9ee17002200a8d27d1ea4c78b15e9028de9b61ae38bb9739e311db6b8127935d625334c76b012103f369944fa7f3c7e845eaca720053d53d72c3e528145f1bd6088be1c62533a022", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4990000, - "script": "76a91411bc765a1e33ee0449c81eef21ea0fba31ea2c5088ac" - }, - { - "value": 2687488, - "script": "76a914c577c400ea30f337b59228c8734c93720bcb74de88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "96d40c7bf21006aaa587712c05ac908984c5d28d829afd2cb291ed47d56dd5d2", - "witnessHash": "96d40c7bf21006aaa587712c05ac908984c5d28d829afd2cb291ed47d56dd5d2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 301, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3e072881a1e965ccabb705f2495e5c6ad85d81f868299bb83d3f848876e73820", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1500000, - "script": "76a914626ebedca70103f5c1e06ed5904f0bc478a263df88ac", - "coinbase": false, - "hash": "3e072881a1e965ccabb705f2495e5c6ad85d81f868299bb83d3f848876e73820", - "index": 0 - }, - "script": "483045022100f53ee6f4b4d84d6a033763853697281e7e93e53c09968ed8fb09b933259571bd02207c50d2166dda7b78a2df74724587cd56e305ce91b13c6e6daa31fdf0c49e9b02012103cba05903e33c1522407602b64d91ad92d7bc33df9cd74d5a97288d5379296128", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "391e2668170a0f3f6e321103f8f8a458e61b35bfe582c0c7a59c1150787024cf", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2880000, - "script": "76a914cdd6cbd410b70ecbca00b02d0f962b710a7fdec488ac", - "coinbase": false, - "hash": "391e2668170a0f3f6e321103f8f8a458e61b35bfe582c0c7a59c1150787024cf", - "index": 0 - }, - "script": "473044022023586f315b28e53d3568cfbd5a2264d4275e6e3d56697b8a8073f2875674370e02205adcdd8a7af801fa8e716b5bfae14bade2b1fb1ef4c38a855d354dd4c4b72bca012102e6b43d1e214b69683b25be7a393e0008727b47b84a16a4f6bd5250bac26b6463", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2625000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac" - }, - { - "value": 1745000, - "script": "76a914fb2cc2d580e8db8440810e9f4ba58ea8f86b59a188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "003f8ccbc80850a6c43c5de8923b2b1e1fa25ea4e4e7a9e3a3d6d7a3ea30005a", - "witnessHash": "003f8ccbc80850a6c43c5de8923b2b1e1fa25ea4e4e7a9e3a3d6d7a3ea30005a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 302, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3d7da636d765043ef15bbd1a8af9945216ff4aabdefd3f7fd9593aaf2d2570fa", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1144383, - "script": "76a914271ad45fcecc102c174699d7ac51e98bb6d971cb88ac", - "coinbase": false, - "hash": "3d7da636d765043ef15bbd1a8af9945216ff4aabdefd3f7fd9593aaf2d2570fa", - "index": 0 - }, - "script": "473044022049ff54f8b26202f7eb201e66f43f643e177bac323f07e844a4d21f3ef340aa8102206bc224e5889ecd4c5529c710f0101a2c68cd74fb3debbd02e1722c12c2c8ed5d01210314a77c93c0f493fb193db3d2b55fb903e9d9a5aa9711ed738c5229c6abfdf010", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "47fcfe588788306c5c7df46fb60c5d40020edc9bbfd099b0a7341fa89039513c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1064693, - "script": "76a9140eb31b65d6e37a7cb7e7805edf5317d58e57084188ac", - "coinbase": false, - "hash": "47fcfe588788306c5c7df46fb60c5d40020edc9bbfd099b0a7341fa89039513c", - "index": 0 - }, - "script": "4830450221009f483da74def05e362844a3696f0301f0dead90fbd83a5b8817d826238a73da40220786c58b5ffe96579ab603c0e3812efbbe74f54194109f2c5b1ed8fbe1d24ffc5012102cbea41f2fc66a830a445848a27b778a3c85c13b4cbcb7c6427ab6dca9cf84495", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 211467, - "script": "76a914beae959d7a988ff3542e0d4c50c3869e8dad050a88ac" - }, - { - "value": 1987609, - "script": "76a9148ef8d266125723304cdc8659c611c6d8173eb6de88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b19fd8f868f7bc3cac4dd32ca88d981f72757098d70242ff36fe4c56b18d3fe7", - "witnessHash": "b19fd8f868f7bc3cac4dd32ca88d981f72757098d70242ff36fe4c56b18d3fe7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 303, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "936a13776b3fae1bbe744b69e23b214f415fbf1be201241a0d7f1443a4ddc20a", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 100000000, - "script": "76a914cbb27b27212a73221826992d4472a34616c467ad88ac", - "coinbase": false, - "hash": "936a13776b3fae1bbe744b69e23b214f415fbf1be201241a0d7f1443a4ddc20a", - "index": 5 - }, - "script": "483045022100c0229454dfe3865ae09b7567f3d015ba71e672bddcfa409870a6a6dd09eafd3502205e2e2974cbc9f778941c0f880e2af09e035370a3a691d99fe8b99fc0e4511f800121037a8d57c3ded5ac2f7f77a77d8a17ac8be5a3f245155987fe2dd302b71889f794", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4f8999d2dec3aaa6d6b44469f80750f009cd5abedb70dd3895ee9eaa6cbf769c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 57870000, - "script": "76a9140b9c2e6fc8f72f235bb06ca0d4d3225ea919d57788ac", - "coinbase": false, - "hash": "4f8999d2dec3aaa6d6b44469f80750f009cd5abedb70dd3895ee9eaa6cbf769c", - "index": 0 - }, - "script": "483045022100c5524909a019f7b73617a681ffc2bf61f5169f7b4451d7e458e6bd8637d8e06c022049730b2fe8fea85d1f6549cbf073637ab96546c5612d86767d45a78845c7d359012102ef135603bc65d9eb87cec363e7f8d799233612d0040c2bb256d10b4b3efdb405", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 140300000, - "script": "76a9142a33303d0d7bdf7bf14c7b1651d770b23e00ae7d88ac" - }, - { - "value": 17560000, - "script": "76a9141a5ef76417af7b95642f2b892c67da61edd0a22188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "65f46855e37170c9764cb46097b58eadb6f0ac3be9db6ecb4284d37af6999fd7", - "witnessHash": "65f46855e37170c9764cb46097b58eadb6f0ac3be9db6ecb4284d37af6999fd7", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 304, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8f5a12956aba65f1cd79e24ea85ca18a6aad7997272d7c7b897231ae5387fc2e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299640, - "value": 100000, - "script": "76a91426077c33a8675d2ea6d47df122696b21bf8f33be88ac", - "coinbase": false, - "hash": "8f5a12956aba65f1cd79e24ea85ca18a6aad7997272d7c7b897231ae5387fc2e", - "index": 0 - }, - "script": "48304502210091ead6c6dc9b9e4343067ff98724142a368358580727078b1f7a718674f44f4202207d28fb790a16a9dd0bcddd3756f92fd95ecb355e6bc4cef07a707e19e89e739c012103b4673b383f465958c0edc538adac06f3b4a128b51dc37f3539d3d87f78d788b8", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "66bae9d00260203f9825b99df886a7f906a402a294df288ca3aa9abef70e4cec", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299934, - "value": 1001662, - "script": "76a914fe487bf5b78d05a445e983cfa220a57dc211972c88ac", - "coinbase": false, - "hash": "66bae9d00260203f9825b99df886a7f906a402a294df288ca3aa9abef70e4cec", - "index": 1 - }, - "script": "483045022100ba16f09e857fa3f1ebd96221f1d5817bbb29e2f33b85e6970dc56bd953084af502200634275498d69676cf463752948b5a0247c9550e8a125633773a654fc0101d11012102f829a6f6b58330230d81a249a36c8ce0ad79a3f19ae9d093ce009a0c2567539d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1071662, - "script": "76a91440f2b5893ca0e6b1ccf97eff4c1837717c33cd3888ac" - }, - { - "value": 20000, - "script": "76a91444b725860b4858f20adac3753ca5b3891d1203bf88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0b52a563082fcba08a7b45d51199dbc84dc086abc7a68cfb4080e27251663107", - "witnessHash": "0b52a563082fcba08a7b45d51199dbc84dc086abc7a68cfb4080e27251663107", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 305, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b810fbe95b301fbc57a963b7e9b072da0f1beb91b76e7f01c779f79faf722aec", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 3702782, - "script": "76a91470b9936818531f01400c4fb73e8af9ad383ab8f988ac", - "coinbase": false, - "hash": "b810fbe95b301fbc57a963b7e9b072da0f1beb91b76e7f01c779f79faf722aec", - "index": 1 - }, - "script": "48304502201731c19aec06bfcd6330b0e27d31525b3c84171ad26d04eeb76f8d66e34fb9750221008b969a21d6e2f2372769c65d940ef029e91c25fa53361a8acbc16d4aecf935be012102cc5a1d49324ad55bc1ed281689f075fb31c65bef4b8252e0c05cf57e931b76d4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "981f2b25a6befd42989090d25fa39b1a53fbc3e8b73b63578bde718c8ed0e268", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298126, - "value": 11818, - "script": "76a91470b9936818531f01400c4fb73e8af9ad383ab8f988ac", - "coinbase": false, - "hash": "981f2b25a6befd42989090d25fa39b1a53fbc3e8b73b63578bde718c8ed0e268", - "index": 1 - }, - "script": "483045022100ca9dc4b55f4c29362e95cff4bc5112fd2d9c5f94563eeb732655b0c1179bc1c802201d058b39d7d464b7e883c9a1c41a4708062c2d94ef9e853377412ceccd4c3d3b012102cc5a1d49324ad55bc1ed281689f075fb31c65bef4b8252e0c05cf57e931b76d4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2202000, - "script": "76a914d309884cae56be2ce3117e818ca26893b02e439188ac" - }, - { - "value": 1502600, - "script": "76a91470b9936818531f01400c4fb73e8af9ad383ab8f988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ec5aa9d042c54bf07ce2aa03f07625f1daa36cefffa828495c495a293648f7eb", - "witnessHash": "ec5aa9d042c54bf07ce2aa03f07625f1daa36cefffa828495c495a293648f7eb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 306, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0b52a563082fcba08a7b45d51199dbc84dc086abc7a68cfb4080e27251663107", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1502600, - "script": "76a91470b9936818531f01400c4fb73e8af9ad383ab8f988ac", - "coinbase": false, - "hash": "0b52a563082fcba08a7b45d51199dbc84dc086abc7a68cfb4080e27251663107", - "index": 1 - }, - "script": "493046022100a29c8809a9dcc6be694efff507c3416937de2f4c63920fbe2735afb941cdafad022100a89dac61a09160dfbf7cb4b8fd36782f2ac72a6ef23d49afa84264e5f51ec855012102cc5a1d49324ad55bc1ed281689f075fb31c65bef4b8252e0c05cf57e931b76d4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 660600, - "script": "76a914948be395d86880f8f62aa410ec2ac4a5f1ed3c6588ac" - }, - { - "value": 832000, - "script": "76a91470b9936818531f01400c4fb73e8af9ad383ab8f988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7174fa91c86c3baa8ddd8d4b4f74931452b3c90b1e0fedf8298d0d12d63669ea", - "witnessHash": "7174fa91c86c3baa8ddd8d4b4f74931452b3c90b1e0fedf8298d0d12d63669ea", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 307, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a3db438757d7d33d9dd20edbcc17b40af1c0435c2df67a4bf238d00f70eca888", - "index": 242 - }, - "coin": { - "version": 1, - "height": 299657, - "value": 13000, - "script": "76a91476fd7fe3b5d14cd8bd16c3f4eebfe41ef7a5522488ac", - "coinbase": false, - "hash": "a3db438757d7d33d9dd20edbcc17b40af1c0435c2df67a4bf238d00f70eca888", - "index": 242 - }, - "script": "483045022100bc8e6823399d1a6c96bb602006242f77c2a913b746cf87b3ab5629c99eb6dbe702207d48b59a571eeda115053290c7d4b2216d24f89fde4fa444dff60e8323935f400121020aa39b918ef29813310a90603242c4b3b6f666206ca0bb79eda473d7651ddb9f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "efc5f392f9f3b50a5ff6ea6a94f9bd0b4109e47eaa8b078bcac764d217fbc92c", - "index": 224 - }, - "coin": { - "version": 1, - "height": 299826, - "value": 57000, - "script": "76a91476fd7fe3b5d14cd8bd16c3f4eebfe41ef7a5522488ac", - "coinbase": false, - "hash": "efc5f392f9f3b50a5ff6ea6a94f9bd0b4109e47eaa8b078bcac764d217fbc92c", - "index": 224 - }, - "script": "4830450221008691fc52e1afbb3b4f53cae70b4c55fa3826b528b77ac39f5b87d8feff44829202200c4034444b9e635f2795efb3f5f5154f84500dbefdb957cbcdb31522e6d4755b0121020aa39b918ef29813310a90603242c4b3b6f666206ca0bb79eda473d7651ddb9f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 54000, - "script": "76a914eb1f8095f939767b978903f7fad33f2c2c44a55388ac" - }, - { - "value": 6000, - "script": "76a91476fd7fe3b5d14cd8bd16c3f4eebfe41ef7a5522488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3a77676c4bbb93e8cd9259269bebaf981c5e364d750e43d607f15f86c1703708", - "witnessHash": "3a77676c4bbb93e8cd9259269bebaf981c5e364d750e43d607f15f86c1703708", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 308, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2a66592f731f882cf45ea1e0cbac5dc86281776237e6b6d34eb49d119c85c4ce", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 1600000, - "script": "76a914d368f73003ce05ebfb34de92588d16c4aacd337d88ac", - "coinbase": false, - "hash": "2a66592f731f882cf45ea1e0cbac5dc86281776237e6b6d34eb49d119c85c4ce", - "index": 0 - }, - "script": "483045022100e832a5e8904237b0938a9c8dec58b4ea729d06a9be792164c967968446e1331302204e8fb02eda70aeb35e4d8e4d83714329bd894cae0fc1b6e28d08a4ff5b4ddf69012103a1644c552200d97720ddf96286c4cd1d259c3982e85163c67e92d9e5b7f3d47c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "68a5bf33c4b487d2015ee78e8a9591204c682a144f093b03b7139fdc9339e211", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1385444, - "script": "76a914ef352d5c25eb28792b4e780dd08cb00b6d198d4688ac", - "coinbase": false, - "hash": "68a5bf33c4b487d2015ee78e8a9591204c682a144f093b03b7139fdc9339e211", - "index": 1 - }, - "script": "48304502210092b053b29f4e79b0b74e6ff864ad29c59018a81ad8c293c9351c3cf01f62145802207bb518ba3c69e545c8955558955c18e34b2e3b70101f6339fe44ff0582cbca3d0121033234bca1ddf5a666dfe96978d0c77d62ce5ac7d5084533757753035619ed26ba", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1075444, - "script": "76a914c1301c42de7ae3845a4bb496fbc020ed02f255a988ac" - }, - { - "value": 1900000, - "script": "76a91452918ae76514dc08ce9c3515e6c540e9aa26aa6f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "147fd3316e47bda359a4daf299f7e71b91e5bd78928748699e132a40e1fece94", - "witnessHash": "147fd3316e47bda359a4daf299f7e71b91e5bd78928748699e132a40e1fece94", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 309, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e1508d44f7809bdc36564a08ce6593a402897a36f8f22a81c33da5bbff67f652", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1529263, - "script": "76a9143c1ef9d90331a71018287347a041a9b5169ddb0a88ac", - "coinbase": false, - "hash": "e1508d44f7809bdc36564a08ce6593a402897a36f8f22a81c33da5bbff67f652", - "index": 1 - }, - "script": "48304502210085e0096e6fc2c7e72c1d5dd08f1c0ca2cf0357cd57be78ed5d67e5ed5ac30d62022048b17bd9d8f7c13be57322cfec5de66d62504d33d5c0c992404d9bde0a31e265012103aa170e86fd71d2226171f5c170c96ac27a12947f6c7e37fb83f3a49cd9fe21c0", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "00aff150c1d03212b8cb52ee7a0b5609636f26e9219760f1f7bb82363096fa88", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 691286, - "script": "76a91451cd1dbf2012e7ccf95ee2682fcd701260ee016988ac", - "coinbase": false, - "hash": "00aff150c1d03212b8cb52ee7a0b5609636f26e9219760f1f7bb82363096fa88", - "index": 1 - }, - "script": "4830450221009c0027ae55d1aa716173e174ea6097663171c8f223882d1efcc58d62692924cc02200d5ce84159f775f3a8a7b89fe309b3bfd30a595c90a4f198f64c492a8e9da4100121020ef771f94c3693816908a0a8f0c7b3d399079a71aeb28bbb58b36ba8efb15f66", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1228719, - "script": "76a914760769fc4ce2d412120fb78912f25890d7e5297088ac" - }, - { - "value": 981830, - "script": "76a914d70bfc02a63a58fac491c547008b68cf4df29f8588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "af4a205d9309b423e1201498d88d8cb8bd663b88762a72325e9987c7d9b8a914", - "witnessHash": "af4a205d9309b423e1201498d88d8cb8bd663b88762a72325e9987c7d9b8a914", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 310, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "363f4acf6641b3dac1088a0ecf0817f7dd78a3ab163a9ae7ec3d0b61659fd6dc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 96017376, - "script": "76a914cb8e4270b294ca60175d6c95fdd14bb9d744af7488ac", - "coinbase": false, - "hash": "363f4acf6641b3dac1088a0ecf0817f7dd78a3ab163a9ae7ec3d0b61659fd6dc", - "index": 0 - }, - "script": "493046022100a7126bf2b5b652585e50251ef0f57a7f59fae6a2a388b9e4ddb0c221a2e37aad022100804211708415b58b4bec3dc690b12010a96619daf753dc32b5caf585e002852e012103b65b3cef23a61e530ccf9f539e2da0797f771b06d17ed8d6207687fc29545485", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eebcb87e772392de06e9c253d36550824e9485b173c91152cca3c62e762ebb05", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 96469977, - "script": "76a914b4094108c1b859d631bf333d977314946ff23ddc88ac", - "coinbase": false, - "hash": "eebcb87e772392de06e9c253d36550824e9485b173c91152cca3c62e762ebb05", - "index": 0 - }, - "script": "483045022100f6be2672595b41c6cb16cd9384ff76fdfb9ac096d1e0580e1505342442992d8b02202b658179de66781bcdd9741a1c1c65c3eb8957f6a16e2a58000c5ef300a27b190121037ab3cd9c03f3bc938b113457ab4ca361a91945f2d8ad42c43f3fbe970898b629", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 83657353, - "script": "76a914d1631196761cffc731739b2717248ec1116d72f088ac" - }, - { - "value": 108820000, - "script": "76a914f7600257ff7a3870c1641ea60ae2ce08aada86cf88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4b40b06f0b769a672d67a22185a45af4746fa9d4e46d5b7bcfed4461aaeec96b", - "witnessHash": "4b40b06f0b769a672d67a22185a45af4746fa9d4e46d5b7bcfed4461aaeec96b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 311, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9b9a80c2ad0b55144c64d95c2209740174ca6e768ca93afbeb35a8fb4e6f710f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 8260000, - "script": "76a91412d1f05eec1607889a5cb3049b7686765a3d1f0788ac", - "coinbase": false, - "hash": "9b9a80c2ad0b55144c64d95c2209740174ca6e768ca93afbeb35a8fb4e6f710f", - "index": 0 - }, - "script": "483045022000a93bc272a3c556747b371fa399220c458aee8ffd69d81f4080490a648a1b150221008f7066eb53ce3d1628fb0db6d6207ee5696dd965957f3b06342251344eea62720121021692120692b055f1b0ad6c32fc15c55e2a7df270eba65cadd0f460a586a8e68f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6c19142136834c10d5ebbc4b826ed3b8d85127848db79fc487658809d8f28b05", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 67890000, - "script": "76a9145d26b6b577a7ac894d6d68fbdda2b71816dfe01888ac", - "coinbase": false, - "hash": "6c19142136834c10d5ebbc4b826ed3b8d85127848db79fc487658809d8f28b05", - "index": 0 - }, - "script": "493046022100c5ce24ed2936fe25503af658181b0fa5185fab9bd84bc9d76f1daaa8d129dbfe022100d1b0fbaef94d356ffdc8ca9517e32eabcfa706a850609043d6d323a189963f00012103e4c008c481c5e7df9525e869dfec86a7b65f282020669ce70106f75038d6afac", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 70000000, - "script": "76a91437faa69a870ffc46eb5f5c1a2818f65e26d8d91888ac" - }, - { - "value": 6140000, - "script": "76a91435f9a2f6b2f99f8686dff43f295f735a2da25de188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ef5ddfa319ad8b5f065e84b4ee7357ac2cb58289243763bab6411aad3be461de", - "witnessHash": "ef5ddfa319ad8b5f065e84b4ee7357ac2cb58289243763bab6411aad3be461de", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 312, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9b57ac989f3e035437c696780c96c88618b9c3909d27e604e6b117e9aa491b6a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 5554544, - "script": "76a914cc663f0f150be469a49946ff53bf59dc4b1f60e188ac", - "coinbase": false, - "hash": "9b57ac989f3e035437c696780c96c88618b9c3909d27e604e6b117e9aa491b6a", - "index": 1 - }, - "script": "493046022100aa329679159d333dbb53af026efd373dd6c68fae1136c0fc40fa62f4a6b7dc20022100b9e8de72f4a849ecd21ea1cc04d1239934e9fe3422d050474a5140b83fe039e10121024be38a0564f0f4ab33cc65ff1ee5216bfbad88c7710f373900fd66f46f4318b4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cfca707b9edc24bda7aa34de9d6fcc875e9f41ea84cf6bf858d9040fe42a288e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 98370000, - "script": "76a914c4faac8ccf1be5c9b7472025b93bb24ffa68f21188ac", - "coinbase": false, - "hash": "cfca707b9edc24bda7aa34de9d6fcc875e9f41ea84cf6bf858d9040fe42a288e", - "index": 0 - }, - "script": "48304502204470206c55a08cf2f7cb301ea93ce3629d7139e849873a9ab4cebad1d5a8e306022100fb37810d4fb9aa18c1dee0f6b8cea8da56ff11d7e5f06a5df133b0929ec2d389012102414c98b45f1c1dc6e29a72514c0b5d1411be9e41abb01d2f6e80a3f2700a86a2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000000, - "script": "76a914b198c8d267a0840436bfb076ac0e6ca1ede09d1288ac" - }, - { - "value": 3914544, - "script": "76a914b097df61d768e8eda3023d9b434287b605e3d2f788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "736a40b153ccfeae6cada21933fcdecbd03435e9f3523dd9e251c679ffefd8ee", - "witnessHash": "736a40b153ccfeae6cada21933fcdecbd03435e9f3523dd9e251c679ffefd8ee", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 313, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "dfe1e1c401b06fd8c1179467ead67d417104335f5ae0aaf2674763a5add9edca", - "index": 9 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 2191177, - "script": "76a91498989c2438adb2c90c3fe9004c8eb513e0d9cf2b88ac", - "coinbase": false, - "hash": "dfe1e1c401b06fd8c1179467ead67d417104335f5ae0aaf2674763a5add9edca", - "index": 9 - }, - "script": "483045022100ab3cb120942df70e5112f7a9988aaf7c7aeaea3130a36f07c79f17477013b448022009fe346056cd74370ec3f4578aad4fc501ed39a2f7110d0b00fc9c7a18601f20014104fcc3e7fc27fdeb8fd564f1bd1bee55be46621e1d04563252703f49ab2e42658c891a041e65ae8fcf180baadb7e77f3bcb922250c03d2e2eeaba7ced4b7df8d3c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7786b1fef695745ca47211e601d0a89feac273a448fe11ec5372d4608fcff520", - "index": 5 - }, - "coin": { - "version": 1, - "height": 299867, - "value": 1112375, - "script": "76a91498989c2438adb2c90c3fe9004c8eb513e0d9cf2b88ac", - "coinbase": false, - "hash": "7786b1fef695745ca47211e601d0a89feac273a448fe11ec5372d4608fcff520", - "index": 5 - }, - "script": "47304402201a9e77c734bdd94025773b7cd2181697032af8921d3d0364f9e0b380830dc22a02206e54bc150f32c1422ce92cff723a9c050ba8e029cf9930a3b29cf455c5c54e70014104fcc3e7fc27fdeb8fd564f1bd1bee55be46621e1d04563252703f49ab2e42658c891a041e65ae8fcf180baadb7e77f3bcb922250c03d2e2eeaba7ced4b7df8d3c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9695c5d53e1e328b0286ad56afa874bdeef524abf7bbeac3815ffd0c168d3602", - "index": 9 - }, - "coin": { - "version": 1, - "height": 299881, - "value": 1217976, - "script": "76a91498989c2438adb2c90c3fe9004c8eb513e0d9cf2b88ac", - "coinbase": false, - "hash": "9695c5d53e1e328b0286ad56afa874bdeef524abf7bbeac3815ffd0c168d3602", - "index": 9 - }, - "script": "493046022100ef3a1f08c6c7ed20193d50df6d652636ccadf7df821672c9bf31a7f909b95181022100ecce170b80d7077a3345574f7998b756feb0972696813f882e295ba9baf80e8e014104fcc3e7fc27fdeb8fd564f1bd1bee55be46621e1d04563252703f49ab2e42658c891a041e65ae8fcf180baadb7e77f3bcb922250c03d2e2eeaba7ced4b7df8d3c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 65 - }, - "coin": { - "version": 1, - "height": 299934, - "value": 1118016, - "script": "76a91498989c2438adb2c90c3fe9004c8eb513e0d9cf2b88ac", - "coinbase": false, - "hash": "ffc2c3b8f9aad6aa4f8acc148ada65ea5b359e732349680022d2ea817ae0e3da", - "index": 65 - }, - "script": "483045022100aeec57ff8eb46d4826ff2e46cab99e566faa580523377677a6200da01df1d01b0220486da1797e5fafd3a012c45b5c3ab347ee1b75cc100152d8b660dab4bd4ccb5f014104fcc3e7fc27fdeb8fd564f1bd1bee55be46621e1d04563252703f49ab2e42658c891a041e65ae8fcf180baadb7e77f3bcb922250c03d2e2eeaba7ced4b7df8d3c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d1b4a000c70aa82b33d1f9775e9a9f9520318a701176d49d469724a1c5648cfc", - "index": 42 - }, - "coin": { - "version": 1, - "height": 299958, - "value": 1196576, - "script": "76a91498989c2438adb2c90c3fe9004c8eb513e0d9cf2b88ac", - "coinbase": false, - "hash": "d1b4a000c70aa82b33d1f9775e9a9f9520318a701176d49d469724a1c5648cfc", - "index": 42 - }, - "script": "4830450221008df2cbdd3975052769743452c4b479e8fef033a256432eb5fc58225f590d32930220383e8363544853175b19291735a02e76a2707d6823c73069fc87d23277415ad6014104fcc3e7fc27fdeb8fd564f1bd1bee55be46621e1d04563252703f49ab2e42658c891a041e65ae8fcf180baadb7e77f3bcb922250c03d2e2eeaba7ced4b7df8d3c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 2217696, - "script": "76a91498989c2438adb2c90c3fe9004c8eb513e0d9cf2b88ac", - "coinbase": false, - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 9 - }, - "script": "473044022062e45f3474b3287b8e5dbdcadc335ad51ce32ebdbe54646d76a8f33d2dd48348022002e59a2df1c4f9c071ebfc139e72d56e367c05d29443f6373d496d5c1304337d014104fcc3e7fc27fdeb8fd564f1bd1bee55be46621e1d04563252703f49ab2e42658c891a041e65ae8fcf180baadb7e77f3bcb922250c03d2e2eeaba7ced4b7df8d3c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a276ab8e71f9349020a826d20f3d593dd8c72c018178ace54073f08c5cf8af2b", - "index": 60 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1141598, - "script": "76a91498989c2438adb2c90c3fe9004c8eb513e0d9cf2b88ac", - "coinbase": false, - "hash": "a276ab8e71f9349020a826d20f3d593dd8c72c018178ace54073f08c5cf8af2b", - "index": 60 - }, - "script": "483045022100f69ed21bbe8e7191ff8936aeb51ed10227deb458036879c14beae328496dc661022015071e99c20cb2c5f2a386deef52fd518076f489990bb0b0b41d5fd8e7c783e6014104fcc3e7fc27fdeb8fd564f1bd1bee55be46621e1d04563252703f49ab2e42658c891a041e65ae8fcf180baadb7e77f3bcb922250c03d2e2eeaba7ced4b7df8d3c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d06517c2185377d3befc33505cf4b67a9bea7f69788d4290577a36502fba51ac", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117481, - "script": "76a91496f2c471e0e9833e2ca649f6a8d359022efebbf088ac", - "coinbase": false, - "hash": "d06517c2185377d3befc33505cf4b67a9bea7f69788d4290577a36502fba51ac", - "index": 1 - }, - "script": "48304502207c9a4cad1f812742db6704ec2d24cf8759da56b41d0d33745b877b9154c0fcc9022100cfd90d02c203e868a496feffaed6566777cc8bb335dd16f8ec7d222b96ec0feb01410423b71c2a455e22f620cc74a484fe97afe9d7fd0543a57b1071dee320d55cbfa1082f39236bdda3c0e396caed5041cf7babee08ef0b956c359344bf446ad8ed04", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10195414, - "script": "76a914e932d89135af1ed5c3722c9457744c80547e4c6b88ac" - }, - { - "value": 77481, - "script": "76a91428e89b51a192297cc2a56381c0cfd0ebcd97edb388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6ceceb3e2131378aafc6e5bb41cf2ac430e2df2da046dc85f5bd132805e4322c", - "witnessHash": "6ceceb3e2131378aafc6e5bb41cf2ac430e2df2da046dc85f5bd132805e4322c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 314, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "aca3eb7f17e6146cde9c1f71881b693d93f7b9c637a21c6abe9d1be092ef54f9", - "index": 1372 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 780000, - "script": "76a914c3fe90a28145dab4a418ec50fa1b21b12ced004888ac", - "coinbase": false, - "hash": "aca3eb7f17e6146cde9c1f71881b693d93f7b9c637a21c6abe9d1be092ef54f9", - "index": 1372 - }, - "script": "4830450220342045eebe7e4dc42bba7149543c22cd9de536da96f26b486838273af75ac23d022100ef002d7bde7bd9deb3fdcf71b827219c3487fc4facd29e31887cf2acf9c932a00121031c94db97d13cf5949d3277593855a7208392650731bd9864ec597da7b320153a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "31511f6adf935363011d61f69652cede417cfc39885289e6ab9d51d30f173a45", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1200000000, - "script": "76a914bc501128b888169495c5866baade8ec6273aebb688ac", - "coinbase": false, - "hash": "31511f6adf935363011d61f69652cede417cfc39885289e6ab9d51d30f173a45", - "index": 0 - }, - "script": "473044022042af6d4fa7fe0b9c72caba8dfedb3672f5df62b301e2c046b1de53679016c0a402200097a1aee66309a6e39da482feb01bd280686b60c54b30574979953724693888012103fbd69331308b9eccaf54078b28ee4ee3dd98f6c1aa87a90fba1f649ade536ea9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 1006 - }, - "coin": { - "version": 1, - "height": 299989, - "value": 9250000, - "script": "76a914ddd25e17885e7ab5c53e7d451c7d4f4e42a62a5588ac", - "coinbase": false, - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 1006 - }, - "script": "48304502200b6acb618db4dd691e229de5fd9f5d2bbb3a841576630053b6e8fa983efc393b0221009715ea83d61274c1c91ade6a763c74888b0320c530d4d53e33bd3f9c43f7a371012102d56b96ef320e05c7ca2403038662c5012b8cf9dbe7a1e4cb23008cc2b4d15bbe", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3bdd887911622b58804d0a22eb0c2efa067958ce79f112f5a6440c3b1ed117cc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 289990000, - "script": "76a914fa31576f07f2dfbeb0d68110a90dfaa311f825fd88ac", - "coinbase": false, - "hash": "3bdd887911622b58804d0a22eb0c2efa067958ce79f112f5a6440c3b1ed117cc", - "index": 0 - }, - "script": "473044022058e65ec81c1dc53d1ba08ed5c4349ebf94c484ad88f236d9b244fd23881ec457022013016423ba34592b1a0056b5fb35b79e13c27e15c9abdd7557d18c8d77b3a9a2012102e5d66205590c5a8199b19a4e6f3ce455ad40989fa7899937c04a0981e0628d1f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b0ea7832d92a45aa15d8ad190f26810099c6d74d5ebbcd305b4a5594a7cffc9c", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 1500000000, - "script": "76a914d4141bdf3a3a385f05744946dfb465f43e02ef7f88ac", - "coinbase": false, - "hash": "b0ea7832d92a45aa15d8ad190f26810099c6d74d5ebbcd305b4a5594a7cffc9c", - "index": 3 - }, - "script": "47304402202becba8b2103b96dcc5c39112d2dadcfca3b1881a0b04f0c7010c2a40f091bb002201d587069c18014e9e18e6f97cfc95cd6ad82046429345d67afbff3bd0e73f46e012102533915519817337d975cc08ff5f553e23eac7dbf769d58380bad892456f14b3f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3000000000, - "script": "76a914a2b1a9a16ecea77d759328b341d2592cbb13e52688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1403059176e98b1124cb827d9f6f39ebee91d5f2744c0e861a9419d7a25b22cc", - "witnessHash": "1403059176e98b1124cb827d9f6f39ebee91d5f2744c0e861a9419d7a25b22cc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 315, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "44c60b3aa01ad0d196d1230ac87b7a6384d6936cccfd1a6a88688f9fe32d32db", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299753, - "value": 4750000, - "script": "76a914dd595a5fb5f9bd75f9acd5bf2554cf2ca38749ae88ac", - "coinbase": false, - "hash": "44c60b3aa01ad0d196d1230ac87b7a6384d6936cccfd1a6a88688f9fe32d32db", - "index": 0 - }, - "script": "4830450221009cc3a9c774d0e0f06337919e2ec8ead2b9effc30ed40fdb7a0f9ff66a1865b5b02203d1df624bdb38d3b0ea902fcc6187f03ed9e4d5e592eb897044ef954db26c3e0014104fc63947b4c40984b0d5650c9da3b34b7ee7e65646b363e338bd637506339896857950fb651a7a9002f27be55db35c57bc04a9e95d3f6874532f15f121a478ac9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "17d23ef2cc65a4807380c3d95f0da780f6072e6ef97a1b395fdcb3430e4038c3", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299816, - "value": 2210000, - "script": "76a914c34a7ea55ca8f30567621507258bf637fe0496a588ac", - "coinbase": false, - "hash": "17d23ef2cc65a4807380c3d95f0da780f6072e6ef97a1b395fdcb3430e4038c3", - "index": 1 - }, - "script": "473044022066f0654d5cee74c83f55070d62a9c99c06898b19ee6b596b460af86d40746dad022001bb61ff04f194ea699fea8caca14610800d7a55cf76dbe77001f263a59eee6d014104e5277d6fe85b2f80425a9c74f37433f02efa9d2fbf28ef748953afed5529c6861b3958d7a59390540e5889c66dcc9e28574ff86b0bd7603cb82f9a8ea7976aac", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6d0d548ef07d9d289eab5a79f2d4cda395a9e78a7ef4bedae95e0c4d8da963a6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 4540000, - "script": "76a9148e171ce2764e859d549849dcbbe8f265833c21e788ac", - "coinbase": false, - "hash": "6d0d548ef07d9d289eab5a79f2d4cda395a9e78a7ef4bedae95e0c4d8da963a6", - "index": 0 - }, - "script": "48304502206da4b26e29cb16fa2322389f1868f47a6d9f2833ea5cdd87fbb87c8520b240740221009c7099f449fdab2098666e1dee08230e957fde2de1c3a657a73d7cd4e7c4939a01410482996a5eabd5ec541141c75d6455c65e80629caa6d857712e098453318f9bb5a38fea5a9ffa1cad0583d46b912bcae30c454c420f46642b80bbd7722a2dd09c4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1232e9776ecb2fc5a30b2bb89201c93ce575e8c300d68aa199e3a14836541c4a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97491, - "script": "76a9145f7e7a32f39d43557737c2873a527d2cb2b044a888ac", - "coinbase": false, - "hash": "1232e9776ecb2fc5a30b2bb89201c93ce575e8c300d68aa199e3a14836541c4a", - "index": 1 - }, - "script": "47304402204516febe32e75276c68af89c61fedde54a3f0d60087661b8a90ac4b4bbd2258b0220756e4e3a5d5dd86c0c34423c7e99f1e96a3e420852a9561c9ee68e0930443e290141047b7c78c693a08314fca9dd810ddd62f5bb11742f5852012241f4b97cc7f941526b6d082ceddcfdfc9294eed70f62e6ce12b8b90cc851537e342d841c94c8aefb", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11500000, - "script": "76a91436e1cefe33b55aa9f52607a1c61c0b7a61d2372388ac" - }, - { - "value": 77491, - "script": "76a9143f14fbc1a72c439b5e0d82f5be0dbef1fbdf374888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e22f550e52c242d2b4eee6afe17e653ec95965d16347a60b1f73ccb855139983", - "witnessHash": "e22f550e52c242d2b4eee6afe17e653ec95965d16347a60b1f73ccb855139983", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 316, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "61dbc2e42ee32bc83518ced925aeab11e5c977ef71bd23e07d580212a6555914", - "index": 77 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1000000, - "script": "76a91435b20146e8dbc94de6ff8bde70342e8836c6997a88ac", - "coinbase": false, - "hash": "61dbc2e42ee32bc83518ced925aeab11e5c977ef71bd23e07d580212a6555914", - "index": 77 - }, - "script": "483045022100bb0cd60d02918ef3a902f4256ec6db4de474aeb7d44a8d6ef6c761487fe3f7bd0220467e698b36965ccc0f68cee83eaa13b68bcf7871653d468e0bc51e9c5cf0b6aa0141040fd67647c72697defe2a42a4b38309463a6b4a05351891e8a60208ff8006420722bd9533bfb6dc7ba7be88d8170f99251a685b914f1ae712f7ee6eb899069194", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "591cf2b15a654e6c3cce6ae8028732f210c2b038e2c444471884903a70902b24", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 3144675, - "script": "76a91403d354d728e21a71080d718f952755a0bdba1b6888ac", - "coinbase": false, - "hash": "591cf2b15a654e6c3cce6ae8028732f210c2b038e2c444471884903a70902b24", - "index": 0 - }, - "script": "473044022018c160e479a700661ae73d6d409e9128784c0a837b613ed982eee79e267f06f8022030dce4b7cd4ce05815181c296d029f5cfe0a7ba2d83c38cd1efa7225590c000c014104ca2c5bbf5009c8be187fb0e909fa57f78383dc33859c11b9e6478c2447e9253b616d90383b3350d65885b419e3fd788f12954a498219c48783eadcc2b878b542", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5944a82d22f033a74596683c59a2e85ee9679c7a9bcffad856a90a4da2df0aa2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2442301, - "script": "76a9149fe1a2a09cd64743a2b06c258b6dc9ad0783c49988ac", - "coinbase": false, - "hash": "5944a82d22f033a74596683c59a2e85ee9679c7a9bcffad856a90a4da2df0aa2", - "index": 1 - }, - "script": "48304502210094b0ddb59c42e3f64a89ccba384738941f6d5d2e6e20231e125187acbffa3dfa022053040186939e9c39b23d527972257d5ca4f77a639b900caf53d99ebdb7a9edc00141045bcd66b964117ae67b0279dfc6b217d5828e6973defa5f6897bf4c8f7c99fab833891b00d6943d73f154503cb1066a72c5dde8c2aa085ce268f2efeafe96b839", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a46c697ec23b1aa5a9e990e9e3e8142e59712c32e400057bdea3beda04097596", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 2974550, - "script": "76a9143e8d072094c6a30fc02e3081001918ceb70bad4e88ac", - "coinbase": false, - "hash": "a46c697ec23b1aa5a9e990e9e3e8142e59712c32e400057bdea3beda04097596", - "index": 2 - }, - "script": "47304402206ea655a74e289930c313415a1f02fa5fc213537f5e939071f92753ec672ba92702201a8555de29315e248e256331087423c6fb12e6351f861d5612d989e1759e8987014104295aeb934b36786a41effb204999e4649653de967f4e2ed09f905d8f580f4c6abdf1640643f79471de8d42ab410bf9a64503a18ff7dfb295d3e157efb89fb38d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8539439, - "script": "76a914b58c957912afd089bd12f605a7d0bc1ce460402188ac" - }, - { - "value": 1002087, - "script": "76a91462899db282a43a76ec1f9c5b79adb0de00aa520888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6fb7ee5e64f85b100c61767398b303bc973fc65562184317ce6d404b528a00b8", - "witnessHash": "6fb7ee5e64f85b100c61767398b303bc973fc65562184317ce6d404b528a00b8", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 317, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9491a77e0972e02c221a3da7e9163b337d77ab6962911543517ca8c9579ebd02", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 2039640, - "script": "76a9146cdd71e3ad091a8605155ab2fb5f86a83eae0d0688ac", - "coinbase": false, - "hash": "9491a77e0972e02c221a3da7e9163b337d77ab6962911543517ca8c9579ebd02", - "index": 0 - }, - "script": "483045022063919108f7ef9735d7be412dceff5b3ae4b06bcecbca1b776ea45c7b32292488022100f40330a202eb23beae2505b44ea5a94e46c9c797e7bebdb2ad7463682e0d7242014104485acb31812cfc3817b6cde014895f634567f1210f890f2b37e281cf07c5ca4bf7d38e821a794a4f3b4380970866b2ad38a36b44ca54d67e1613ce9d6edfd1bc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b48585b1405740016c69e53b040b532418990d75665f883bae454d040a8155ff", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 21976667, - "script": "76a914c207649a157ace830061429c1a8ab690cd4976ed88ac", - "coinbase": false, - "hash": "b48585b1405740016c69e53b040b532418990d75665f883bae454d040a8155ff", - "index": 0 - }, - "script": "483045022046c0ff4d048728ae4e0bf677642e954f80a52376b355da1d581169d046f137fe022100a53ced0ce70ce58cdd7d91e56bd301a5b2d2d887d89fce0010e6b66886d53a79014104557ac878b6b2cc680f5fee1eaf61fbd441b9f6d443a2b1455fe043e59923fa46fb29fa6727c95678bb8a4b3119b84d1e07ecb376622eea8a31d94a3f49f9b494", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b682f5a0d5af57b1823297e9cc16de731f3d894ddd5a93b4e35b68055ab10057", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1779874, - "script": "76a9148d5799bab064b1b630d4bd5b7868f9a4da7f69f588ac", - "coinbase": false, - "hash": "b682f5a0d5af57b1823297e9cc16de731f3d894ddd5a93b4e35b68055ab10057", - "index": 0 - }, - "script": "4730440220496de7fe91785c57ce59323d7733215a5bfde35351a24a031ce7741e98567b570220018d20381b856941c06f62a9ac0d3395c64faf423cd949070bb1f1557ba13849014104058d58519e138eb32ca1c5583c01b2ffc26c1e7da0f1384025596927515695b1ef16d9f5b55f57d2f8b65085fd5e6d9fd21f3a95e08de1d116c1a1aea9d3a5ee", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4de349e8a9166239944f75daf4e8a7c858befb86d6cb4e6035efb220e0a912f", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97452, - "script": "76a914343a15f93a76662094f2cf7a78cf6cbf51604f4388ac", - "coinbase": false, - "hash": "b4de349e8a9166239944f75daf4e8a7c858befb86d6cb4e6035efb220e0a912f", - "index": 2 - }, - "script": "48304502203218db64f670e3bfb50b7c83b37336bf22a6f345fd3c6a61eb9e549383206ab502210099f5f17a2f4c7e816a40e4f2052d2ef604fb21f893b1232d01e40a1a093cbd48014104af65fa515afa44ea55e0e8bd7182fc0a1ad9e45c27394a0b41ec667ffb1154a3488a6b1ac0a6f8e83164b171012bec97687f59abff8e7eaafab839d21687b358", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 25796181, - "script": "76a914f16b586fdea2672b25c1720a1365c7bc4605029388ac" - }, - { - "value": 77452, - "script": "76a9141b437181e8e8eec7716b5c5c00c9e7b76e8c914588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "880b4eda91c08b40ac24dd5a44089a5407f0fabd7ac46a2e527effa7c48bf683", - "witnessHash": "880b4eda91c08b40ac24dd5a44089a5407f0fabd7ac46a2e527effa7c48bf683", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 318, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e0b73d77e8a3e375dc74de675cebbc9dbce08b536810643c284cfec44bbbf5cf", - "index": 93 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 4081595, - "script": "76a9147b14e4f68b5e03ca3cfbda6fced601d4418bbc3c88ac", - "coinbase": false, - "hash": "e0b73d77e8a3e375dc74de675cebbc9dbce08b536810643c284cfec44bbbf5cf", - "index": 93 - }, - "script": "4830450220285f72d6f71f0a49fc6067e1ed98a3feb1eadce5202d5899ad5a47bcbdbb992c022100af3475c22e5c64149fca29d706b705f8ed2480880c43f725920e3400a0cea2c00141049757ee1cb2b553f694581c35f46a7ee7d7c2eb93566d55b14f530d0b90d4785414972c0d2ebbf71b97bc3bd158f1309ad5fdddb4689596ead3604c279365aef1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3db341c76192192c56350abb22e4b039311b1aa92abff213b759aea75020c54d", - "index": 87 - }, - "coin": { - "version": 1, - "height": 299958, - "value": 5298208, - "script": "76a9147b14e4f68b5e03ca3cfbda6fced601d4418bbc3c88ac", - "coinbase": false, - "hash": "3db341c76192192c56350abb22e4b039311b1aa92abff213b759aea75020c54d", - "index": 87 - }, - "script": "493046022100c557d99c61abc75e134daad0b49776f903cc5ffd1a84e4b193bfd57e40041622022100862587ddb17cd127728fe7861aaad854f09a1a828d261fe3a2f1910c79752ae10141049757ee1cb2b553f694581c35f46a7ee7d7c2eb93566d55b14f530d0b90d4785414972c0d2ebbf71b97bc3bd158f1309ad5fdddb4689596ead3604c279365aef1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 39 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 4247668, - "script": "76a9147b14e4f68b5e03ca3cfbda6fced601d4418bbc3c88ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 39 - }, - "script": "47304402202abe291b6e6322b7cffd25f88c251df56d9b48db229effa96f23d6faca47125002206290a4e0dbfaefd1e333bb61c3aa0b1640c8fd05a093c82e7965e85d8b50e5540141049757ee1cb2b553f694581c35f46a7ee7d7c2eb93566d55b14f530d0b90d4785414972c0d2ebbf71b97bc3bd158f1309ad5fdddb4689596ead3604c279365aef1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "00ad6c9b7831d6df91d42f3f1ffbf6e535b2eaf20a958d2404441498753d3fb6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97479, - "script": "76a914951130d6105d0b133ed3a5f0fc77f4843777478788ac", - "coinbase": false, - "hash": "00ad6c9b7831d6df91d42f3f1ffbf6e535b2eaf20a958d2404441498753d3fb6", - "index": 1 - }, - "script": "483045022100817f5e28d77dac55d1659e1f342a34918aaf600780ed813e7c759b0bc8aa481502201bcea18f12edae454308597793d25e0c6807675f42071192a68028fed1f47fd40141040e7446e97db57f212d62d9594921b906bdff27248617d903a9019881c647b2258892a2c31d93c258c37e06c3e8efc8fbd1acac113f4656ff8c175dca757ff4e8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 13627471, - "script": "76a914a6d6eaec67e88c7264eadbb6e9d8df7ca9194e9f88ac" - }, - { - "value": 77479, - "script": "76a914b6cbd922e25b38c26fc7546a96c6b045576b0d3088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0788ff04bad74d1175b690fd3355113fda7512f3858d1697fc6c0df85d3fa9ef", - "witnessHash": "0788ff04bad74d1175b690fd3355113fda7512f3858d1697fc6c0df85d3fa9ef", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 319, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5010ed5aea9ce56aeff00b1f3417d5ffd727f0976a6f5554b9670d220fbb0c14", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 1363581, - "script": "76a914f0f2556f0bd4b496558b0c1b24a6d757203d0fb488ac", - "coinbase": false, - "hash": "5010ed5aea9ce56aeff00b1f3417d5ffd727f0976a6f5554b9670d220fbb0c14", - "index": 0 - }, - "script": "4930460221009d21e92ba488769e5d68a355f28a77ed7fd99e020920e5250cc4129bcc0049bc022100eb59e9541fd6c1107b1aff27ee70fecccde516f344e79c31bbf74f8167e60f180141047bc6bdc76baf3faf30899ee8e1d94b996f2c7c66b347140bb987a9b59ad1246f702bbce20e83f2209a2311c0fbb75c2d08d7b3bad679f2940f11ebad34c10593", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "717357bdcc0bf5680ef356eebb5d382f4436268d8903605d53bea0ffd140f2de", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299984, - "value": 1378149, - "script": "76a914f0f2556f0bd4b496558b0c1b24a6d757203d0fb488ac", - "coinbase": false, - "hash": "717357bdcc0bf5680ef356eebb5d382f4436268d8903605d53bea0ffd140f2de", - "index": 0 - }, - "script": "483045022100ef8c43b3a413181a37380d03127281f8fd2de185f4735ac217e23d0fa987d0e9022025cde1a2c09ec7e28a6803a3992382c6f1bc7e4dd2be30967f0afa7b7efca29b0141047bc6bdc76baf3faf30899ee8e1d94b996f2c7c66b347140bb987a9b59ad1246f702bbce20e83f2209a2311c0fbb75c2d08d7b3bad679f2940f11ebad34c10593", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3e67036bad3d11a3a52f47f55b48f74872e7d8bf5b43c43cd4656eca63e82db5", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 15000000, - "script": "76a914f0f2556f0bd4b496558b0c1b24a6d757203d0fb488ac", - "coinbase": false, - "hash": "3e67036bad3d11a3a52f47f55b48f74872e7d8bf5b43c43cd4656eca63e82db5", - "index": 0 - }, - "script": "483045022039de192897c1622c14e7ff2db25bf29aa5c23cdfa04d159ac3f72971509e609a022100bf82867dd03e57a2eb839ea967cc857094ec4afedf6220a3c7ace57729f6445d0141047bc6bdc76baf3faf30899ee8e1d94b996f2c7c66b347140bb987a9b59ad1246f702bbce20e83f2209a2311c0fbb75c2d08d7b3bad679f2940f11ebad34c10593", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "27cb45e23f6089a44418f2178f218a8d39edbf660adba936d06fea4e272a5fe6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299967, - "value": 57489, - "script": "76a9140d39da90648609670c976ec5e193e5cb0283309388ac", - "coinbase": false, - "hash": "27cb45e23f6089a44418f2178f218a8d39edbf660adba936d06fea4e272a5fe6", - "index": 1 - }, - "script": "4830450220495aa9da1233247aedd5e125780b28147fa809ad3cec6bc39461c5c3f38ba8000221009f43b69b770e0a8c693c5d4579242d242383363c4e5a2324044470d0a7e7a99e014104c273923b49c4c1ec475f256d323583953bb87aabd9f53b4be86800531da37f9129539d730d7e30ba355bf8c483217dedb09c62cce6ac3d856eec8973b24a35b4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 17741730, - "script": "76a9149713702c6752e9df1fd4a0eeb5c77b043dcfd2fd88ac" - }, - { - "value": 37489, - "script": "76a9149c587ec9bbb39e1aa2f0b81711eef3398ec77fbd88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "febc6fffb6d3b38b99108a6699d4352c4d1f53c4c10642d6ecd8f04f965c6829", - "witnessHash": "febc6fffb6d3b38b99108a6699d4352c4d1f53c4c10642d6ecd8f04f965c6829", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 320, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c362113f692b0eba7372f7035d5a6acaddae4331a692361376039f705a555c8a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299555, - "value": 21561018, - "script": "76a914adbfbacdb05dbe6337d4f02f2e0c25628feef30c88ac", - "coinbase": false, - "hash": "c362113f692b0eba7372f7035d5a6acaddae4331a692361376039f705a555c8a", - "index": 0 - }, - "script": "483045022100e8ba36b886d53f756f137f89b809ab72cebdc43096cdda04fb78fa02b93ddccc0220237e44601cd412c1fdac1f89775562b746876725b704bcd90a95d84667493a49014104646ee14d4b8be440e21e339cef74b547ad0fe0b42d7da28ccbc9037f43c41bc388041f2e1d17813b41cff840be908e4222be8c1daa23974985307af98a87df14", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "25159b1328907ed3b6af0d634990a4709b78f3077bef0f8a704a37e18cef32c4", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299740, - "value": 4911458, - "script": "76a914adbfbacdb05dbe6337d4f02f2e0c25628feef30c88ac", - "coinbase": false, - "hash": "25159b1328907ed3b6af0d634990a4709b78f3077bef0f8a704a37e18cef32c4", - "index": 0 - }, - "script": "4830450221009cb6ecf55ec59d72c5380e63438b574cb7bea1d320bf880e6ac49768f296a722022041565b767de1fb5783b56ad07fc73acd9298a01b2305878949c6c98a1441b03f014104646ee14d4b8be440e21e339cef74b547ad0fe0b42d7da28ccbc9037f43c41bc388041f2e1d17813b41cff840be908e4222be8c1daa23974985307af98a87df14", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 26462476, - "script": "76a914ec5e0e225a193b5d37144ba9af939ae64013f3c888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "17451eed93b3bc567c4db08a1914baeaa2dbc83aa62b307013d34b6c1c632c76", - "witnessHash": "17451eed93b3bc567c4db08a1914baeaa2dbc83aa62b307013d34b6c1c632c76", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 321, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b0639afce99dd1448059f8d944226bbbd9eb45f6233607fc0f1b86a685492d97", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 489990000, - "script": "76a9144d761c6be4f714b4c910d13fbfdb7ccd07a146ae88ac", - "coinbase": false, - "hash": "b0639afce99dd1448059f8d944226bbbd9eb45f6233607fc0f1b86a685492d97", - "index": 0 - }, - "script": "483045022048a07602c6de604cff6c17912966c83d187e846b6029464d0957c7c060ab1e10022100953afdeced2b76b561a0a2071f553e4f77f0acc0b70a59f9102754cf55598ef9014104ae0b2caffe0d38224b3349c41ec75093a3f400509263ae32cd87a948d4f05e28aba9c8782be735ae6dc494c05a64bf1d440f89a718f3ddf0bca05dc9c0b3eba7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b82826842ad866f67aa2618b251cbc92a3c0616b02594a412c4e0e2fa1917b21", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 307990000, - "script": "76a9144d761c6be4f714b4c910d13fbfdb7ccd07a146ae88ac", - "coinbase": false, - "hash": "b82826842ad866f67aa2618b251cbc92a3c0616b02594a412c4e0e2fa1917b21", - "index": 0 - }, - "script": "483045022100cb5b906225ec9773291987f83ee54b975e25e1c44a804bb75918e47eebab468102204d55d986508ccd945996bbcf8a6e6c01b594e4d336041416ecedd4e38a0a6a9a014104ae0b2caffe0d38224b3349c41ec75093a3f400509263ae32cd87a948d4f05e28aba9c8782be735ae6dc494c05a64bf1d440f89a718f3ddf0bca05dc9c0b3eba7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 797970000, - "script": "76a914519e84489eb8bf6df05b669f0fb13526877682f488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9e1bdeaea158690c412c02ba636601e7ee97d7b21b5e0b3a08124809d8bd26ad", - "witnessHash": "9e1bdeaea158690c412c02ba636601e7ee97d7b21b5e0b3a08124809d8bd26ad", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 322, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d7bb81eb51e238b2db6957b3331ba28a7bdd1921c9e5ede1ce16555c6a623444", - "index": 88 - }, - "coin": { - "version": 1, - "height": 299780, - "value": 8779, - "script": "76a91488b3f7b7c52c8addd16531322e9839ef8f2ea47288ac", - "coinbase": false, - "hash": "d7bb81eb51e238b2db6957b3331ba28a7bdd1921c9e5ede1ce16555c6a623444", - "index": 88 - }, - "script": "493046022100bf90b8d971f32e0690280c31e597f04bfa0fcf22e4525d3255e25d371ecfaa70022100807b28f9f1790da17e30e2c9365695eafb4fc84d526b8945e29f3faa1b66fa610141043726ad488dfcbc2f677f014acb3074480dfdc01c13f8252f989ed3887e5b72c09268971fc4e0c3eda4e66d9e73931c1fb63bdd347981235ebdc4caa28bcc4571", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f51bcd93c0ef63ab3aaa857fc856b20e350a0dccd5c87d6e7d26eadd9de1510c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3132000, - "script": "76a91488b3f7b7c52c8addd16531322e9839ef8f2ea47288ac", - "coinbase": false, - "hash": "f51bcd93c0ef63ab3aaa857fc856b20e350a0dccd5c87d6e7d26eadd9de1510c", - "index": 0 - }, - "script": "4730440220226ab2be72a3da32868b8e1a7edfd607eb9def31a0c8ab62e0e934c9ae0e2cd4022019b507365a98d1e01f1734d11aaf9bf0e85cf190eb8d6f7eb5f5ad9dedbf24920141043726ad488dfcbc2f677f014acb3074480dfdc01c13f8252f989ed3887e5b72c09268971fc4e0c3eda4e66d9e73931c1fb63bdd347981235ebdc4caa28bcc4571", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3130779, - "script": "76a914ec124728d95ce78f128bf7b29c3121cd1356db6988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "85152e039cdf5e540a8283ae482027796747d9312fae696d5fa2b0fd97f5689a", - "witnessHash": "85152e039cdf5e540a8283ae482027796747d9312fae696d5fa2b0fd97f5689a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 323, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c3f3e3a41493a112c083202dc26d8b6bafe0059387bedd66bebac6ec4d34c2e4", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 868061, - "script": "76a9146358c71e7194a7f41565df737556a1384c3503ac88ac", - "coinbase": false, - "hash": "c3f3e3a41493a112c083202dc26d8b6bafe0059387bedd66bebac6ec4d34c2e4", - "index": 0 - }, - "script": "483045022100c642115569b05214d381610314c9d7450c6a5608d0cfd675d31c893e5503663f022003bfae9285d0ca1990167761d762ba389953a1fb3927b59d2e695b771fb6154601210359ec5eab4a5839afd524ec79f29bc75720635de0a9be18f0e01dbaa5c3396473", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7fa0c6f859ddd46c5b10d191a5b121939526c60a17759c87112815b20efe8900", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 7811378, - "script": "76a91440873e11c31cd3e4fb95cca36c2360f7c712ff2188ac", - "coinbase": false, - "hash": "7fa0c6f859ddd46c5b10d191a5b121939526c60a17759c87112815b20efe8900", - "index": 0 - }, - "script": "483045022100ba7546400a1c07fe958f72152c24445e2f776bade7132aa4c45e85d099ff72090220363201140c427d59b2b3a55deb0fa1e1be02fe3498120326488f51c5eb4205f7012102428063244548a37ccc888d148f66af6343775f6f05c2bcc46a8db8a23c857683", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e3c6dd0aea649a72a56cf7c49be08c73085d0af2792e4fd4234a92e6a2d75b40", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 25289099, - "script": "76a9146034bcda63975118f9f2f5f93e8f6a31519287b788ac", - "coinbase": false, - "hash": "e3c6dd0aea649a72a56cf7c49be08c73085d0af2792e4fd4234a92e6a2d75b40", - "index": 0 - }, - "script": "47304402200777d4e4224fb7a3d3ceb63dcb3ebb4974401e55f49b2a89b27dfaa763c10d2902206c31837450eb8bc181d976d9d7ccffe64638dacd71058a313cef561842613672012103eb974d0f3bf503ac33c16b3cc0b7f53f465ef577326e74b95ab94f4d86a205bc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "65284714bf3455116942fea3f24791f9f8e75758486d97d9e3308ff28de2499c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 28990000, - "script": "76a914dec45e657b24c5cb4417bf6b1adbc466677d968d88ac", - "coinbase": false, - "hash": "65284714bf3455116942fea3f24791f9f8e75758486d97d9e3308ff28de2499c", - "index": 0 - }, - "script": "4830450221009d1573fcff439dde84bba2cdc68001f09a7504bc78f2a67b4595fa132affee360220659f780c3788ee0d40eb17f51cc4d21dbb212602000d3ae45f30f6ec6654cfd50121038bce75485d1035cd29e56ae5cedfb2c2bfb44c3037793a622ed231fbddd3f59f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6f456a6ee2c2c7719f09a68f0f05825b73140ada36516242002eaeccfe9b6142", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1079500, - "script": "76a9149bf549bbe4f62b0fa6b299ef152d600543920d0088ac", - "coinbase": false, - "hash": "6f456a6ee2c2c7719f09a68f0f05825b73140ada36516242002eaeccfe9b6142", - "index": 1 - }, - "script": "47304402207e5e7e4c392e0003d5a265493263ffe4ba8a745ec403a12556408f862c31bbfd02202820e07c1375753faf631a1ec014f2fe60a2f9fb5c43c197f7d43a48cf2e57f401210343612c84b58199cf04731e4dbaa1e8b062afbfa449652c7d58ace7bc92e5128f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1018038, - "script": "76a9146034bcda63975118f9f2f5f93e8f6a31519287b788ac" - }, - { - "value": 63000000, - "script": "76a914b645abcb3d27a12352e1efa87e2aaf8699c8d7d288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3c006be96c07917a48cdac11c86d2888bd1c1005f73f9a2c2ca7126e7d5e4dfc", - "witnessHash": "3c006be96c07917a48cdac11c86d2888bd1c1005f73f9a2c2ca7126e7d5e4dfc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 324, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6214996fabe31368e1f839a8518829b268b3ae810306f3e409381f1c0f4af84e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 400000, - "script": "76a91436a799410379a37565064e87156b989b297173b588ac", - "coinbase": false, - "hash": "6214996fabe31368e1f839a8518829b268b3ae810306f3e409381f1c0f4af84e", - "index": 0 - }, - "script": "483045022100f5f1b1dba61b83af9c4c728528745cfc3782a134eda77e231e58b0a3f331fcf502202a5425a50527151e879e37c480586ead23409aaa59c2e32d30a99685d5ecbab80141048bfa915437d51f123656d33b3c99f8507f9ac9422bd0e52f4ffac99463899c786368fe63cd4bf9946cbf05852227dfc90f02693b6fa594a67078c6c130f6faf3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a72d1339d36a589abf306dec83ea24b8f1fd8da784342a298bfcb12a4a864f67", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 100000, - "script": "76a914b41d52a7fc5436f73db8e8b8f2ec4e1f19db7cc888ac", - "coinbase": false, - "hash": "a72d1339d36a589abf306dec83ea24b8f1fd8da784342a298bfcb12a4a864f67", - "index": 0 - }, - "script": "4730440220119f836b003f5a3d613ab4360dab6661ffe54b9dd2f510060679aa338b04000202207da4cd2069a56670edfd784e724e3916760418f8f86121fd7eabe02dcde6a2dc0141045c67c057ecba6f75497abd0841148c6577c76a72d3e3e5f77bdd5eb8accce3e7cb4f0fb3f067126b267d55360e124b47d4119e780d5227dd1869544db5aefbab", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d92381d0b527da6f532af74b0fdd596d9dd33446d85218e35ae7b50220186414", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 100000, - "script": "76a91474515db42ae2211b56b573a92206b671cbdeed0988ac", - "coinbase": false, - "hash": "d92381d0b527da6f532af74b0fdd596d9dd33446d85218e35ae7b50220186414", - "index": 0 - }, - "script": "48304502202e760ae6d3e8fedfb361dc4437463558c60d249170681f5fa45f23c631c6c6f402210085b9562ae8672ba13f1902110b3bac154a9a45cabf6dcc656a72a6d5e67a90a00141046b6fe16d3acd7bd8203166c8b4eff37fbb669559b50ba482180ca9893f32ce1de05f17eeb9daefdcf9db861f02ec56cd3b3a49f8b245e026fe9082ecb5c3fce3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "df2650bdfcb4efe5726269148828ac18e2a1990c15f7d01d572252656421e896", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 100000, - "script": "76a9140be4bbd9380c700355ea5b565a4d8724c377cb2888ac", - "coinbase": false, - "hash": "df2650bdfcb4efe5726269148828ac18e2a1990c15f7d01d572252656421e896", - "index": 0 - }, - "script": "483045022100f9f254c4acf52469e6e5dd6cbb40b13cffe4a492bd46a4b2da41a45032a06dcd02202fc94354aa6b433b90221e42fe389204f3cb669885eb253a6f08bdfc80dea84a014104472f4d2674087e7a52ce048f72eb10b4d2780b54cf1480d98f22cd81b3e2b79b941b27e35ad1ad0450cdac455f4852f2b2aadd3ddb9deb9438c189ef97917ac6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "87a653334812248a34d34e7296ebb39adee652fc39edb3ed354d458889b53c12", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 100000, - "script": "76a914b84b265173a01b21b6519b13f1a86eb048aaf3d388ac", - "coinbase": false, - "hash": "87a653334812248a34d34e7296ebb39adee652fc39edb3ed354d458889b53c12", - "index": 0 - }, - "script": "48304502206ebb3f8bc27c4476462160255c2af27ce84f85e8811e4df3174e828842128dfb022100fa7574636584495ae42b329b7936555bf8ba7f4e4ba58085213abaea4a88c7320141047d4c0f32654c1fecc5c1ab21e17ed25dfc844d44d4ea1058add2a349bb52e6b27013dedf0a5b8a6e5a5706471b67725e6b539c07be92c0032b183a4aa3fb076e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "58ca53e93ca2071beeb7cd7d6bc140f866720fe0458e5c4eb31e8b05438179af", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300007, - "value": 100000, - "script": "76a91444b8e0a76bec6c7e9552e2b4403d1fb1c0f9bb5d88ac", - "coinbase": false, - "hash": "58ca53e93ca2071beeb7cd7d6bc140f866720fe0458e5c4eb31e8b05438179af", - "index": 0 - }, - "script": "483045022100af5ba1357065f1fa9a42d67c517d6422b4512d639943b6602abd4ff49e0b17e40220658159a395eec7bbcb9de2656a56ce3884314aa95ca247508de00ea8699b751a01410425d8aa1cbf21896c33af0b7f2980076026a377490862cec906486d061ce0aa242e644f406c5ab14e3099f58cee2a7c7426e01731b65220a58ed490e02797e809", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e2060e69db32b52d106f160ad93af2418160005f2dcad62d44c6f86602eeb68b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300006, - "value": 100000, - "script": "76a914f64a573b1bc6676bc14693e5631ed844e7312c3088ac", - "coinbase": false, - "hash": "e2060e69db32b52d106f160ad93af2418160005f2dcad62d44c6f86602eeb68b", - "index": 0 - }, - "script": "4730440220736a09f2b14b26ca30a68a0aae40160d991c374a758584df505175822441636c02204c2f94e73fc42da1a6c27b83dd2efdb441add790eb1022d75001e9133709f12b014104f7002c538abde32146df44f1912e5e1bafde67a4fa2a687ed00ee4bd156aa96441548a6506d42acc3ed87fa715fd66e7476f71022ccb7deb7615b71e8d8ee8c3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ac9188ce32d00485d917eea2b06e110504974ed4787564065f1c16ca932087b2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300020, - "value": 100000, - "script": "76a914e6af9bc071d56a3a7900c2fcaa7905b4b0243b7c88ac", - "coinbase": false, - "hash": "ac9188ce32d00485d917eea2b06e110504974ed4787564065f1c16ca932087b2", - "index": 0 - }, - "script": "493046022100a8f50303d1cfda3352fd048b9cc97809f02930058c93410237fd30e0cbddf1c302210099836b8ff54290088caeafed666c1c9769b58493ab74848b3341995ad63bfb750141044eb9134563174e4c1bdc6751169ad6f20e526bd7607b3af8ba54e520a23ea2f83fcd862a95fcddad643c095fa10f74aca23e0b52ea5a5972117c1c5fa353f4e9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "591fee2aa983249c11b256be69df5496fd3ea0cd855e28e79566ed0bf89118c5", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137454, - "script": "76a914362352ceeb4593694a1dd6b4c835abe2ccb2bbe388ac", - "coinbase": false, - "hash": "591fee2aa983249c11b256be69df5496fd3ea0cd855e28e79566ed0bf89118c5", - "index": 1 - }, - "script": "473044022055be1dcc83a7a8b2b846df41c1ed98b124131c4881ecff7db3d56402eb818b380220078488f48c4c5d3dc1e5ebd393cdd561984293c0ed86cdbf71fae77e7889ae980141040766d8790b6f411ed66c7c885cc4df5bf8980e3866fc22a59889acd0f22ce494f4f84b45ba0d8c9557fba49760a7259fbc41431d33b813bf8c2364579ac5baf1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1100000, - "script": "76a9140450cad3a3cd648f583e796602be13c6a27adb5e88ac" - }, - { - "value": 97454, - "script": "76a914679840b2cac1ee2a1d63dfad985df1502ca8ca7688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "18322690a2a3c2ea087eb3aaeb5643ce46dee125c6b5a68229d93e316444e881", - "witnessHash": "18322690a2a3c2ea087eb3aaeb5643ce46dee125c6b5a68229d93e316444e881", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 325, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fb20d13745b7b8c310ecac74c2c75fa70062cbdd5681ea5fcbb7cdaf8e599cc9", - "index": 291 - }, - "coin": { - "version": 1, - "height": 299253, - "value": 1040335, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "fb20d13745b7b8c310ecac74c2c75fa70062cbdd5681ea5fcbb7cdaf8e599cc9", - "index": 291 - }, - "script": "473044022020d90119f1f3a991261d2dfe1d3ca728bf817b0a518e3ce33f460f92ec09f1cc0220199f0dac2f909f98fb3d5473b5ae07e2764d1390aee2d2a8c7371fd7c532d39301410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "70f4fecd524ede51bf720c927f381eb96b0d4f1cb87a60f2254137085a28b7bb", - "index": 297 - }, - "coin": { - "version": 1, - "height": 299294, - "value": 934121, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "70f4fecd524ede51bf720c927f381eb96b0d4f1cb87a60f2254137085a28b7bb", - "index": 297 - }, - "script": "483045022057deeaeff073a6be2feb00e6479e75eac8967d7a09c9c39bc28a0d30ea5914500221009ed8f13f420e639393f574ed2635c5876368cd4484d1fd7cf7079a8989f1370901410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5fc9dc90cf50a67db674b46febc999503f261565a6cd74e20caa15556371129a", - "index": 61 - }, - "coin": { - "version": 1, - "height": 299335, - "value": 196087, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "5fc9dc90cf50a67db674b46febc999503f261565a6cd74e20caa15556371129a", - "index": 61 - }, - "script": "483045022100b3cc0ca7430745644c5931d783eb616facdcef26b3e79bb362a7390256135f1e02203005087dcb8cd3581a6bcc75fcfac208429eb578b800bbf3cdc2e23398de849801410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7cc653806a9f27af5d7e492c6fb3085776aca3477447cbeab57c511efba3aae", - "index": 970 - }, - "coin": { - "version": 1, - "height": 299394, - "value": 237626, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "e7cc653806a9f27af5d7e492c6fb3085776aca3477447cbeab57c511efba3aae", - "index": 970 - }, - "script": "493046022100b54c215706ce495081230538782c8c68f4689ecf9ae38da9bc8f2bc235c7a14f022100a2afbbc7423d791d418197d820b751ecdb975723060fc794bf6ed5c31019ba0301410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ab18b68de47fab11c6c2c2fa4953fb2eae3dd7237d6e1e5747acdc332f98fe55", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299486, - "value": 2640864, - "script": "76a914ff1b697b8d1e46de33e71bf88be0ce036db03a1788ac", - "coinbase": false, - "hash": "ab18b68de47fab11c6c2c2fa4953fb2eae3dd7237d6e1e5747acdc332f98fe55", - "index": 1 - }, - "script": "483045022100cc8dd25d1991d0857392822beddb26864ba7848f423213f683f4d97c38e53e910220048e97c2c1e81ed58e3c80e164996f5ceed91aeb4b218a41b189f85c6e5938b0014104e9099dd0e67b2c985c6319dd9fa0cd1aebdae765d8f54a00dc74d0aa1c6442ad1a565d8eef7682e01b63e53b5c711f9b9db0d0338614043c06f4546ee5630f1c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6c0735544555f96608d0ef17a8a6840b0082ba15bcef9be2809fd9eb99796f1e", - "index": 59 - }, - "coin": { - "version": 1, - "height": 299568, - "value": 270686, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "6c0735544555f96608d0ef17a8a6840b0082ba15bcef9be2809fd9eb99796f1e", - "index": 59 - }, - "script": "49304602210096fd618fb0453031a96bb363daece5b08bcad874b444cc055a7c850bb7480323022100e4c9c9542ddd3c76e4125919ccabebfad86f4a5e5ca135b7e14b6128caaee21801410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7391915855f352e34a825160d9025b5a81ab54d71adb9cd04a44bf82f2bae213", - "index": 243 - }, - "coin": { - "version": 1, - "height": 299644, - "value": 314370, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "7391915855f352e34a825160d9025b5a81ab54d71adb9cd04a44bf82f2bae213", - "index": 243 - }, - "script": "483045022100a9cc25c8c1ce102ceb33c8ef75e2288c8d3ef09304f83b5bb9fc63ed9bb1387e0220215fa5e82a20c6c2a605c998ac4d1e069870f3ce70cfe6cfa10c2511ceda4e4601410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4ced3e4d04da6b8a1400bda5f848150a862c745784162c7adb730f2d307cc6a1", - "index": 63 - }, - "coin": { - "version": 1, - "height": 299728, - "value": 366424, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "4ced3e4d04da6b8a1400bda5f848150a862c745784162c7adb730f2d307cc6a1", - "index": 63 - }, - "script": "4830450220487639c089452e651a0a4dcb47aa641f4a1c55e39850154fcb593e77089cf970022100cc94c1eb6b3d4803985f96013825f6ee6deb75c0c7caf1fb5de6c17059e7dbf401410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bf9eec8083992f731e17acfc30e4ef372df077e79f7f1d41525ee9a186aeb005", - "index": 60 - }, - "coin": { - "version": 1, - "height": 299811, - "value": 344754, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "bf9eec8083992f731e17acfc30e4ef372df077e79f7f1d41525ee9a186aeb005", - "index": 60 - }, - "script": "4930460221008faa6c776d0dd388e9932d4a473ee6042c6b47448faabe2f65d3688371ca0726022100ecd9b578be2156da11e99b539944681a1ee7d395661c08afc6493cf187a0170101410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7c2bff3103cf50783f689b7b44a5127e9a2069d7b50498cfa8bd5a1bfe263ef2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299814, - "value": 2554274, - "script": "76a914ff1b697b8d1e46de33e71bf88be0ce036db03a1788ac", - "coinbase": false, - "hash": "7c2bff3103cf50783f689b7b44a5127e9a2069d7b50498cfa8bd5a1bfe263ef2", - "index": 1 - }, - "script": "483045022100da8c13aa0b3a5b4c2d0346bbc8aecd15fcc47a03c70acf850b7f168b8890a6f402202ad0338256df73a0bec670b27afc792234ccad9bdb090222630873bf72493dc7014104e9099dd0e67b2c985c6319dd9fa0cd1aebdae765d8f54a00dc74d0aa1c6442ad1a565d8eef7682e01b63e53b5c711f9b9db0d0338614043c06f4546ee5630f1c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "83b27bcc0002f3c09066da06b56e2323681781983daede2bbe4b760b06627765", - "index": 254 - }, - "coin": { - "version": 1, - "height": 299888, - "value": 367051, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "83b27bcc0002f3c09066da06b56e2323681781983daede2bbe4b760b06627765", - "index": 254 - }, - "script": "47304402200dac7623514d99f287ef8ed7437aa21888e4ebcd25cd0c9aa6fc730419867a5902207d99e79b2c2e3f06f1a1facfae11585c94d5b5a785a3aeeb15967a6e5ae08b9501410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c857e3ab46e30be796e241322a4fd1a105935ce359aeca6ce61751ea03588799", - "index": 242 - }, - "coin": { - "version": 1, - "height": 299977, - "value": 390044, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "c857e3ab46e30be796e241322a4fd1a105935ce359aeca6ce61751ea03588799", - "index": 242 - }, - "script": "483045022100b890e8c547f81bc54f112f25a950247cdac8cb84c0bb4e337ae95bcfda90feef0220220f7dafe5a8e39bf66ec081df2243ff12829d2b550fe0badc9ea83b0eb51a5801410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "57d62e51ea08382152699122e27acb029a7e897439127c0dfccd68111e8e653a", - "index": 283 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 698645, - "script": "76a914625c34557e58638ec62ab78f871666beb3eb185e88ac", - "coinbase": false, - "hash": "57d62e51ea08382152699122e27acb029a7e897439127c0dfccd68111e8e653a", - "index": 283 - }, - "script": "47304402202316cba0b14de3699a6e6535a2d183037e749a5df1d3c138308eb8d5adb493f202201e9b755f03fa3b42385cd1d5a0469d3757ad60f81b76e87c4b24a1503ecc3d4e01410424940862533ca94be5a31f7f8baa2f3f729182ae79f04d377ea7f64254e7281d86534cd639d1a7b5e8bf2a8c0e65ccd1d6b09c0e03b559e2c4c568191d1a3e4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5ae75f4e778be63b322bcb902efdfa9efce97b19ccb2ce82a736469f470b3c6f", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 117481, - "script": "76a9140092ee8a84c4d01e8149cdf50d1534da2bbac2c588ac", - "coinbase": false, - "hash": "5ae75f4e778be63b322bcb902efdfa9efce97b19ccb2ce82a736469f470b3c6f", - "index": 2 - }, - "script": "48304502203116b08c153559875bf47e22e2bb07564f417b1f5349ae12707ff8605f5bc68f0221009dc91775f1e99ae0bf3592b481d24d4ff512a089c493b2ba108b23b52b858e51014104bab943e5c235969c85a867ab7d3a12ba6326a36c0f784b201eca57ff2e08c4ceb59e6be2c7dc70a788217f7505925d5620870f38f493bc1d3806636a24d5e315", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10355281, - "script": "76a9149ab99bc7a02741cbd52b034456805e073a4d100988ac" - }, - { - "value": 57481, - "script": "76a914d5bee8e18f6ed3524f582475c65d06c51bb3acc788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "23c6e721f2a244b1c5a6559a625a7f12f9a191e5857df058757e7ffc87562d78", - "witnessHash": "23c6e721f2a244b1c5a6559a625a7f12f9a191e5857df058757e7ffc87562d78", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 326, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8e6854d20591afcdddbd92f7beed660e02902cb7c886144d0940038d60b91c9a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299971, - "value": 9200000, - "script": "76a914aaf9cb8953735456aaa313c31223ed8e94f3301288ac", - "coinbase": false, - "hash": "8e6854d20591afcdddbd92f7beed660e02902cb7c886144d0940038d60b91c9a", - "index": 0 - }, - "script": "473044022017abc5bd0afb3f4e0d8960ce4f08ac45ad9e455f27bf4ba347ac2b091e8a16900220057183a9b9ff0651729f5ffbebed0f90ef40d07209880c1306ed2f89cc117a27014104351c9d99e72197af558cc778ea0c1e18f1b9da1c0850d4dc65cfcfc219c3db0daf064fc04e0b8d732eefcd22737d9409fca5db0f864ee541bcde2ea9178d774c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8aee1b8d9cc1c7abe78bc0117128ed663fcc4d1d4e30c3e773412f0d8bbc204a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300009, - "value": 35000000, - "script": "76a91408dc3fa93c67a2a3fc42906baceabc642598efca88ac", - "coinbase": false, - "hash": "8aee1b8d9cc1c7abe78bc0117128ed663fcc4d1d4e30c3e773412f0d8bbc204a", - "index": 0 - }, - "script": "47304402207f491b95b20f899994931aa85ef599947cc1d486a59ead6968e6842ec0c4d2e2022053a0637ee999d52b3a8f33ff6f88c9f16c709bf251f8e70c84f90fe702874c60014104742250dc14dc4802ad5ed6ee6d38a1f9b271402f789d50064a79c7a9fad2e7c75887eb0164a053e3b9fe316789cc7232fd949aefcb3ffbf7a238efb490905da5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1006178, - "script": "76a9140949587cf96e610d1a6460a1eb754f51e61c0e0f88ac" - }, - { - "value": 43183822, - "script": "76a914e54195422a7e8a421c6846a659e3df2f2928831f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6d4feefbf33c9a156d3723cccb0348a5cc83738ca42c5b181f5cd7243bc16669", - "witnessHash": "6d4feefbf33c9a156d3723cccb0348a5cc83738ca42c5b181f5cd7243bc16669", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 327, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4677fac8a795cf2e7290394a4d0014db98f011618288ce07454f20beaeb762f2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299401, - "value": 38442, - "script": "76a91465a8896864c41c300383193af8ee87a92218d61088ac", - "coinbase": false, - "hash": "4677fac8a795cf2e7290394a4d0014db98f011618288ce07454f20beaeb762f2", - "index": 1 - }, - "script": "483045022100fe13b7021751609e0a9c803997227406a76219a0b8117164638db5d81cf4321d02205ae09d8fd25d2ce39ed94e4e39549271f7d1da8211fa23fbc10cd05c2bad8c38014104e900ccf1b6e9438a7ca119ef8746cb7700ac8b1327bd54960c55d4194004c82d024e2999419d4347d2d93ca4a448f62efb32b6398b71052f2f13a0426181180c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8274f0ea38414211079ccee0d7bc9554fc6464c26d4654ae96a7073008dc3927", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299628, - "value": 4084588, - "script": "76a91465a8896864c41c300383193af8ee87a92218d61088ac", - "coinbase": false, - "hash": "8274f0ea38414211079ccee0d7bc9554fc6464c26d4654ae96a7073008dc3927", - "index": 1 - }, - "script": "47304402200298bf47223e7af6156f337b7811c463f599cc3429deffc011444effc6f393ca02204eb97d32f1e4a3095a0ece74274ec6b9e975515b403b9dd1e211d1e806a81b06014104e900ccf1b6e9438a7ca119ef8746cb7700ac8b1327bd54960c55d4194004c82d024e2999419d4347d2d93ca4a448f62efb32b6398b71052f2f13a0426181180c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3744658, - "script": "76a914d87b292dc896a49f1327dda47cb57c352ab85fa888ac" - }, - { - "value": 368372, - "script": "76a91465a8896864c41c300383193af8ee87a92218d61088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8a8db69dcd53e22943ac919770ebbc9ec9eeeed176089782e6ff1ed3fe5fa430", - "witnessHash": "8a8db69dcd53e22943ac919770ebbc9ec9eeeed176089782e6ff1ed3fe5fa430", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 328, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "aeb98b32310a8e879ef7081fed5b391e08fc1c319ac28e9bfd209deda4478e0a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299059, - "value": 1282668, - "script": "76a9147f220ad447ff38d977fb31339db3efb01730354488ac", - "coinbase": false, - "hash": "aeb98b32310a8e879ef7081fed5b391e08fc1c319ac28e9bfd209deda4478e0a", - "index": 1 - }, - "script": "4830450221009510e92c4e939e1ba8d46da5968afeba1dd70a508e814e7e4a348a594033fd0c0220580bd3ab4e88bd631d44261d2964028fdfe42df91344de90023dcf8fc6a32973014104948c824742555e934694d5b0f36f46384ca73c813250e0a44a9a399278d7ffe50f9f50984e3284417eb5f232a8a131b05b4998279199723cb71deba9b465ebad", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d21a08aadb02f53c7f5a46bcd6efeba7b9f7767492846fea1979a028d7856821", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299943, - "value": 1357094, - "script": "76a9147f220ad447ff38d977fb31339db3efb01730354488ac", - "coinbase": false, - "hash": "d21a08aadb02f53c7f5a46bcd6efeba7b9f7767492846fea1979a028d7856821", - "index": 1 - }, - "script": "4730440220091881d281280021ea27ad7571d2e6f0cf883898f6f56003290a49f76b9e701402202b69552c233f80df10dd9d911f6da1fedb1c2f08df187dfda2599c1e91d3045a014104948c824742555e934694d5b0f36f46384ca73c813250e0a44a9a399278d7ffe50f9f50984e3284417eb5f232a8a131b05b4998279199723cb71deba9b465ebad", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2625000, - "script": "76a914ae49671b2e9bf0d4b386d795bd3439429005152788ac" - }, - { - "value": 4762, - "script": "76a9147f220ad447ff38d977fb31339db3efb01730354488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "584f54c06dfe09a0ffb73e200ad0f572d1a93643ca813289eef909001d4716af", - "witnessHash": "584f54c06dfe09a0ffb73e200ad0f572d1a93643ca813289eef909001d4716af", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 329, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ab86495893de25f12b366cbab865102a7cbfe5d36651460f5e93fd0576f9b07f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299867, - "value": 763491, - "script": "76a914276b8286bec99a5d3eb816a642b707863146e92288ac", - "coinbase": false, - "hash": "ab86495893de25f12b366cbab865102a7cbfe5d36651460f5e93fd0576f9b07f", - "index": 1 - }, - "script": "483045022100dc07b6d01d35b65a56f3ab8a2178c65f3102f66509eccccdd4912781c71957ff02206f0ab0b31cb2ccc334f75405036c1e70853bb23009fe59f688d09616dd791fb5014104f9d7c2fbf2dea622bf3646b9d72e2426ebaf44c1540a910057d8a876513e9fb97e18aef7e126d06059edf3228edd59340668874b7f42f8c55ff4ed1e73154084", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9ec7b4be12347f7011affe470984fc2722da3bd52fa891b63da0d581ae20d423", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299973, - "value": 15100900, - "script": "76a914882f57ee66da7d4cc4b73e17128d6b03c9b167f288ac", - "coinbase": false, - "hash": "9ec7b4be12347f7011affe470984fc2722da3bd52fa891b63da0d581ae20d423", - "index": 0 - }, - "script": "47304402201783cef4cd6c427bb9a666ec011307b0d556f0a7dd7204fa17ad5c4aad4366c302207f5ad7c0b2e309236ba1ffce584a72322f2b227e19f962972cfc7a75c232e66b014104799d750a5b0ba0890a916e0ad03577ebb45fd4777725a8db03b4473b3027813eb567c5ace4f798b0e711c02e734f889a5063193256bfaa05bd8cdf3217308a41", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3500000, - "script": "76a9142519eb53a0997bb49791ab162ed71320a807ba4a88ac" - }, - { - "value": 12354391, - "script": "76a914f178b09265c555390e17e2b600db7f442ad921ce88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ba5cbb56c839a9ad5a32b4b84c88e0fa633bad202e9818c4ae84819f24794d39", - "witnessHash": "ba5cbb56c839a9ad5a32b4b84c88e0fa633bad202e9818c4ae84819f24794d39", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 330, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9d7ec7d355947d189a48eaafc7b6c1644a568bc3057d06abe52e3275721b4834", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299552, - "value": 15214, - "script": "76a914ec416d96ae71148c7f810f68f763facf6e6e93be88ac", - "coinbase": false, - "hash": "9d7ec7d355947d189a48eaafc7b6c1644a568bc3057d06abe52e3275721b4834", - "index": 1 - }, - "script": "4830450220079ae850ee067d4cab4d3b3c4f75ff6bee495aa153494aca4670e82b38ace93b022100cfccec5bdd9c6b9479c8c4adad0e27e54c5172db929746ab085a54399d4d51030141048cd2dac46ecf98e24eb7324d0df7ccf81f2f8e4f846c6b44d4dd689533ac2e964bc639e973d00b94ab53cddde05ac19eb5cd89585a100a5e769f281449121340", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "68a5bf33c4b487d2015ee78e8a9591204c682a144f093b03b7139fdc9339e211", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 26400000, - "script": "76a914ec416d96ae71148c7f810f68f763facf6e6e93be88ac", - "coinbase": false, - "hash": "68a5bf33c4b487d2015ee78e8a9591204c682a144f093b03b7139fdc9339e211", - "index": 0 - }, - "script": "47304402200852ec495ae6d8708ea188824d4af3cdcd1e10ba6b3c33d1dd3662bfe520099a0220440ac03f7cdf51a1920a54e10321a3146da5551e47e3b5ad3fa09c35d4ad00690141048cd2dac46ecf98e24eb7324d0df7ccf81f2f8e4f846c6b44d4dd689533ac2e964bc639e973d00b94ab53cddde05ac19eb5cd89585a100a5e769f281449121340", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 26000000, - "script": "76a9143b9925c88d396ded7fc0bbc61e86741a327a3b6688ac" - }, - { - "value": 405214, - "script": "76a914ec416d96ae71148c7f810f68f763facf6e6e93be88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "989235c2baeec7d6d722bc70d958188542bda7a37c29befe52957f1504323abf", - "witnessHash": "989235c2baeec7d6d722bc70d958188542bda7a37c29befe52957f1504323abf", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 331, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9d03ad907596f589027d0afad3f8cdb8027aa48a2cff7920fafb6903eecd0f18", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10000, - "script": "76a914e7088ee4a157a6581943cb12bcb0e31f05d143d788ac", - "coinbase": false, - "hash": "9d03ad907596f589027d0afad3f8cdb8027aa48a2cff7920fafb6903eecd0f18", - "index": 1 - }, - "script": "47304402202bb3074c6ce092c1ba97a9f0f7a8519e8f50bcd2ae5fb7d5633a67f2fec1d43e022065e437ed20a943a00ce42e5f31dc7de5a44bfe567beac335349bd3ecb90bf3e3014104d81a0388c3592ae3aaa9d7387a46dd582660328b4da4227dc8dc4408bbec2503988b46cd87b714356953e4e024f1085801e85aaf0c753e6f1e512d0aab6852e4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "32944e1ecdd15da983e067b55b77e2ff26580c187cf45cd9fd6b4e9924061fab", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 15324085, - "script": "76a914e7088ee4a157a6581943cb12bcb0e31f05d143d788ac", - "coinbase": false, - "hash": "32944e1ecdd15da983e067b55b77e2ff26580c187cf45cd9fd6b4e9924061fab", - "index": 1 - }, - "script": "4830450220536ccb265e9b2ad582a481d1a6d7148ae131327acf0bc8c165238707d8d75034022100fcc9efac24ffc2c8a45211d695f39b5a095ff0a6cda1165f6414b645098839b4014104d81a0388c3592ae3aaa9d7387a46dd582660328b4da4227dc8dc4408bbec2503988b46cd87b714356953e4e024f1085801e85aaf0c753e6f1e512d0aab6852e4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1900000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac" - }, - { - "value": 13424085, - "script": "76a914e7088ee4a157a6581943cb12bcb0e31f05d143d788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8003055945c0aca41256dee4d4d1a3dfc81c3045de7ca5501bd7194b5ee819a0", - "witnessHash": "8003055945c0aca41256dee4d4d1a3dfc81c3045de7ca5501bd7194b5ee819a0", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 332, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "989235c2baeec7d6d722bc70d958188542bda7a37c29befe52957f1504323abf", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1900000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac", - "coinbase": false, - "hash": "989235c2baeec7d6d722bc70d958188542bda7a37c29befe52957f1504323abf", - "index": 0 - }, - "script": "483045022100fb247d6be38ba475559629d0296d5f14539915a4e95cc9bbc68d9e49ee2fd220022071df53a34433fe5879713f6a0709b4d5ad3bbcc725c1de11502c50ed39d97920012103082934de52ac6d2d5f0806d5ad5bd240e7733d75952d2cb06ba4b782ca4ed0d6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a914e7088ee4a157a6581943cb12bcb0e31f05d143d788ac" - }, - { - "value": 1880000, - "script": "76a914788de3e892875e1652dfdf9bf9677b84086e415388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e7d66fdfbba852d9e466874bd65dc1fc4d03b089f4ac840453d4a33717f7b187", - "witnessHash": "e7d66fdfbba852d9e466874bd65dc1fc4d03b089f4ac840453d4a33717f7b187", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 333, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8003055945c0aca41256dee4d4d1a3dfc81c3045de7ca5501bd7194b5ee819a0", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10000, - "script": "76a914e7088ee4a157a6581943cb12bcb0e31f05d143d788ac", - "coinbase": false, - "hash": "8003055945c0aca41256dee4d4d1a3dfc81c3045de7ca5501bd7194b5ee819a0", - "index": 0 - }, - "script": "473044022004a5ffcc0aceb743ab0dc64c6ce55b91edeac476f091ecdc24c6f8e4f71a15e502205d06be9cc6022d4a9715519379b8877e839ec8e626237b6d054e5a5ef32aad91014104d81a0388c3592ae3aaa9d7387a46dd582660328b4da4227dc8dc4408bbec2503988b46cd87b714356953e4e024f1085801e85aaf0c753e6f1e512d0aab6852e4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "989235c2baeec7d6d722bc70d958188542bda7a37c29befe52957f1504323abf", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 13424085, - "script": "76a914e7088ee4a157a6581943cb12bcb0e31f05d143d788ac", - "coinbase": false, - "hash": "989235c2baeec7d6d722bc70d958188542bda7a37c29befe52957f1504323abf", - "index": 1 - }, - "script": "4730440220350e12659e90e2f1cb565a5b09d21ac70467896395a19e60aec98fc74a424c9402201acb6df254cf86c9e7924397995766f1f95e0ae4780951c0b7cc3ca457290ddf014104d81a0388c3592ae3aaa9d7387a46dd582660328b4da4227dc8dc4408bbec2503988b46cd87b714356953e4e024f1085801e85aaf0c753e6f1e512d0aab6852e4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2800000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 10624085, - "script": "76a914e7088ee4a157a6581943cb12bcb0e31f05d143d788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8ea590a1988f8d5b5ed225f7c560008b5c56b13cee38d555535f4b7d35199a0e", - "witnessHash": "8ea590a1988f8d5b5ed225f7c560008b5c56b13cee38d555535f4b7d35199a0e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 334, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5ac88d05e3a067087eeefe5ddb8e6d0f040ece61add8e3c93477ed2370eb8cbe", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10000, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac", - "coinbase": false, - "hash": "5ac88d05e3a067087eeefe5ddb8e6d0f040ece61add8e3c93477ed2370eb8cbe", - "index": 1 - }, - "script": "483045022100d6b85a3aaaa105648645f340d21db2eeb248582d94332c6876c5bb5ddb74529402201b751f9486ea023875cf6878a5541d85bf1527811a7ca2a6fc5c6ac92159b67f01410441dc748e05cbefabe0cd59ba2d5b9c6b3729c4b87e0a3eea23ea77fd8e0fb883614ce2f11ac217e18acfdbe99f737b6695e650de4b15158fa09bc64ad9292279", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f2a53ce3272a32f1fba101d82594268ffb4e6a544db62181e40d173a416ff57b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 11994761, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac", - "coinbase": false, - "hash": "f2a53ce3272a32f1fba101d82594268ffb4e6a544db62181e40d173a416ff57b", - "index": 1 - }, - "script": "47304402207615f7d004dffec9ec8d97f193e48a57f63b44edbaaab1674a624751e31bf2dc02200e6ecc269e9e0611a1fc9daf782b79c4b22df9f6a1966b676a1330b73ada1d1901410441dc748e05cbefabe0cd59ba2d5b9c6b3729c4b87e0a3eea23ea77fd8e0fb883614ce2f11ac217e18acfdbe99f737b6695e650de4b15158fa09bc64ad9292279", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1800000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 10194761, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "00efdb5b8e7f75df11663a0430768ffb544445ecfac958ffb795c80391a488cc", - "witnessHash": "00efdb5b8e7f75df11663a0430768ffb544445ecfac958ffb795c80391a488cc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 335, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8ea590a1988f8d5b5ed225f7c560008b5c56b13cee38d555535f4b7d35199a0e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1800000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac", - "coinbase": false, - "hash": "8ea590a1988f8d5b5ed225f7c560008b5c56b13cee38d555535f4b7d35199a0e", - "index": 0 - }, - "script": "4730440220050ef153147a57f0254c359718e8eebafa918e7deae91ac5d7de727e3052c5990220473fb5bfba88481ef947b1192e602220b9628db18732f16b8d1f556863bf1af80121037bedeab7fcb8f05bc5fca2bb43525bd7af9f125035149ab4f48843db0ba37c8f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac" - }, - { - "value": 1780000, - "script": "76a91485c926cc9a4519a5789412dc8e5bbca5f0d1b86988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "435dfdf9e23a06507a4d194c17349c25b1391c877015e15a542cd9feffc8e29b", - "witnessHash": "435dfdf9e23a06507a4d194c17349c25b1391c877015e15a542cd9feffc8e29b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 336, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fd9b95ac1165837085be53dfa336496e631e7e669c980727fdb0079b8895d267", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 10000, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac", - "coinbase": false, - "hash": "fd9b95ac1165837085be53dfa336496e631e7e669c980727fdb0079b8895d267", - "index": 1 - }, - "script": "483045022008f106812253d92eafc2600556737b76a10a41cfcf8683497a0877d41086b0c5022100c755aedf6cf0aee31a89cef557472214837d4b9291e39d2fae8c8feb826f5ee50141046c429a46e64e9c2a83bd5eb1f4a03b6aa5264583de09ee413c8f881fc35654ae1d0c4593b7b7f915db01b3801d75a7b4d9ebf27ef6c95ca0b42d1c43e15cd6cf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "062011727c388f1bc4bbcf6929972a2880a796ca1e04b956768a0b54e4927a98", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 11419415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac", - "coinbase": false, - "hash": "062011727c388f1bc4bbcf6929972a2880a796ca1e04b956768a0b54e4927a98", - "index": 1 - }, - "script": "47304402202cfe9f1bc1673ddeffbcf3ef91388c357b6dc1c27c50e0d7bc4b707b4c1581970220182ff9a5d99298da2b57f1f039192c526c938f5e9a5233f5c3ea8af9bd9a51470141046c429a46e64e9c2a83bd5eb1f4a03b6aa5264583de09ee413c8f881fc35654ae1d0c4593b7b7f915db01b3801d75a7b4d9ebf27ef6c95ca0b42d1c43e15cd6cf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1200000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 10219415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c9f2540ff319f2d9a1db6f4c4e1c84422d745ca70e63e1b9b91d506cfc37e029", - "witnessHash": "c9f2540ff319f2d9a1db6f4c4e1c84422d745ca70e63e1b9b91d506cfc37e029", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 337, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "435dfdf9e23a06507a4d194c17349c25b1391c877015e15a542cd9feffc8e29b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1200000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "435dfdf9e23a06507a4d194c17349c25b1391c877015e15a542cd9feffc8e29b", - "index": 0 - }, - "script": "483045022100a2206c98b436b3bc92625ea234177d0e8e34dac7344379be410c1bee2cbb3c8502201b918373bb602860cedd766483aaedc37a465c1e9d4158a4feeb5b97b3e9e0970121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1190000, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e80e1449bb89bc0fe336a396dd66d714de72f225b0885bae7f15b09073d88939", - "witnessHash": "e80e1449bb89bc0fe336a396dd66d714de72f225b0885bae7f15b09073d88939", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 338, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f0f86a5d97c9350177ab23b45113158ad9bafb534314d2de09c4d0b9273e59df", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1390000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac", - "coinbase": false, - "hash": "f0f86a5d97c9350177ab23b45113158ad9bafb534314d2de09c4d0b9273e59df", - "index": 0 - }, - "script": "47304402200732b7faffab7fd670c8f5c5d5e4a989dec08ad6b11eac8d975ef113ad7526ef022071791ea8c00bc02f1dc20c6f22f2cb3a5f792b28fa34d57bb814db6d050fbebe01410457fbf746bf1d48c6350a52e4c264a7e505056c2aadef3fa6d03c3e2abeaf704273500cf186513da95cbc2c6cbb6e55ab5942da7d5ac281319076bb8c1b0d27e5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "18b9ad64d86426f29937683ddc09aaba442cb188b636e53d778862520eb63cd6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1365000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac", - "coinbase": false, - "hash": "18b9ad64d86426f29937683ddc09aaba442cb188b636e53d778862520eb63cd6", - "index": 1 - }, - "script": "483045022066838e113d92e3d0302ef38e657f8f49c7b2cb9739fc00b62046368ca5aa6a25022100ffcb0ec236effe2f1ecc3605c18f4c2bf312184abb4ae3c4bfcd37d9478964c001410457fbf746bf1d48c6350a52e4c264a7e505056c2aadef3fa6d03c3e2abeaf704273500cf186513da95cbc2c6cbb6e55ab5942da7d5ac281319076bb8c1b0d27e5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1600000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac" - }, - { - "value": 1145000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "16e438d29d4a19e0df2f656564950c785884a1806b2ccc037ebea0b2ec4d792e", - "witnessHash": "16e438d29d4a19e0df2f656564950c785884a1806b2ccc037ebea0b2ec4d792e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 339, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e80e1449bb89bc0fe336a396dd66d714de72f225b0885bae7f15b09073d88939", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1600000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac", - "coinbase": false, - "hash": "e80e1449bb89bc0fe336a396dd66d714de72f225b0885bae7f15b09073d88939", - "index": 0 - }, - "script": "483045022100b60d9cac407f0c8da97e8da33c0e0de81db903cabb15217c76f862633925722802204e862d4dfc9e718467fdcdd088df976cf8283016b80e52f3b19237e4b30b4bbd012103082934de52ac6d2d5f0806d5ad5bd240e7733d75952d2cb06ba4b782ca4ed0d6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac" - }, - { - "value": 1580000, - "script": "76a9146dbc2a75b5bbee0abf61ef22ea1a0cf88c16853688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3bb4ae8053139f15015583720f578d0c9e75c294e797413cc61229e34fcb6102", - "witnessHash": "3bb4ae8053139f15015583720f578d0c9e75c294e797413cc61229e34fcb6102", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 340, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "555585470ee4e89de9afc109292ec1c5e764e79b08cac4138b4b63b7c79f4cdc", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299947, - "value": 59000, - "script": "76a914d5f71f487783c928cbfb46af44c509fc7df7e5b888ac", - "coinbase": false, - "hash": "555585470ee4e89de9afc109292ec1c5e764e79b08cac4138b4b63b7c79f4cdc", - "index": 1 - }, - "script": "483045022100b3226addd9a613e43cd13388d0299b53737ab8fa4b3ccc876a2e7798e413b8ac02205dd5f7433fdb32b70840e1f3c6f3f9617e9fcdbd99135e8f286c92078332fc7f01410478598fbe66f132b595d9ed0f56a5a118a9fd35d3799fbb69541f0cb8b9ffc125477ed5db9458409ae6a27756bc721aa250ba9a013224780a7c53bca058156bf4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dfa3986babe54b50d013bca88c939e4554d70a774af729acb9e733f3cde1a966", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1282000, - "script": "76a914d5f71f487783c928cbfb46af44c509fc7df7e5b888ac", - "coinbase": false, - "hash": "dfa3986babe54b50d013bca88c939e4554d70a774af729acb9e733f3cde1a966", - "index": 1 - }, - "script": "47304402202ea8987cd5d7c039297e494e8ef4c44a6102422e8ac9a9ae39336434eab5a7ef02203bb144ee668d79f2117f1c22a1ecb0e11182baa71aebde9607787bb86a1945ec01410478598fbe66f132b595d9ed0f56a5a118a9fd35d3799fbb69541f0cb8b9ffc125477ed5db9458409ae6a27756bc721aa250ba9a013224780a7c53bca058156bf4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1101000, - "script": "76a9148d87e436738ebb0b5f037a75e548052652a200c388ac" - }, - { - "value": 230000, - "script": "76a914d5f71f487783c928cbfb46af44c509fc7df7e5b888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "32eab198a046b5b962c72434716e5ab2c5afd2822ac0e40279126a760912718b", - "witnessHash": "32eab198a046b5b962c72434716e5ab2c5afd2822ac0e40279126a760912718b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 341, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "984533f60f4560e140aeba1b6659a452513bb2ddcb158736440db33273ff1a72", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 44847133, - "script": "76a91429aaca32588cd43202ed342a763096772fefd30a88ac", - "coinbase": false, - "hash": "984533f60f4560e140aeba1b6659a452513bb2ddcb158736440db33273ff1a72", - "index": 1 - }, - "script": "49304602210093c030641147fa34675ad25e8a3788f0efb9c5b08a59eb726c0b8759467929ff022100dc0827951650731cad1a9816656c80445ed88952eebd0e76c599074cdaf9f6490141040f467849138c6a3e1be63412a8094d61e7591e4b37fc93b60a0ae1d358331ac31bddf8129d2d6be5388391a1252904ebcdf1802392e08b9e091a84a3f28495b9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "578b60e4bb6afeef4bc5b2275a1f67040112c23e9fb4c18acc59e0babfc9e954", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299990, - "value": 37308905, - "script": "76a9146d7d043253c42ea699000834dceb696694ecf59f88ac", - "coinbase": false, - "hash": "578b60e4bb6afeef4bc5b2275a1f67040112c23e9fb4c18acc59e0babfc9e954", - "index": 0 - }, - "script": "473044022025d7bb851dc8b5a19644fa9965745c83fb2eb6e5ea0b1b88eb62bce3b4404b290220223d3ad0453931ab08bc215fa5770b7d43de170627d09a1b72f72df2d839dbe80141043a8bba361c9400d4824b40b70c9cee516e3e0f0ab733b84e9911db887976af1f9880939ee56723fad891aa8974a3fb06fce2786a2389edb4183767654dfc2cdb", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000418, - "script": "76a914f70e7ddcfdadd44cf1d587b1bb5a2c7a17266f9488ac" - }, - { - "value": 81145620, - "script": "76a9142f42ae0851858fe57ce39af112e0d0f3a515f29a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "825c4ccbdd0dc9085d210f643411fa67a166e0a924a6f6d21c01ee39a747155c", - "witnessHash": "825c4ccbdd0dc9085d210f643411fa67a166e0a924a6f6d21c01ee39a747155c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 342, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4ed8cce5ba494ea83e34c68865a11602aa66fe6a30a0fa1917486d725bca9545", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299685, - "value": 223976, - "script": "76a914dfd2acab035e374597c763dbe28ffa67e9f68cb088ac", - "coinbase": false, - "hash": "4ed8cce5ba494ea83e34c68865a11602aa66fe6a30a0fa1917486d725bca9545", - "index": 0 - }, - "script": "473044022031d72ac52521c65983b8d0363c93b2e775ef199211cc6996658070a810dd09d1022023b1aeee08286357b58f00b49e722266e045e06b6233308527aeba68bff57b94014104eeeca10c76731eea33e3b66a0fdc175e1c07ee5030c48fb433f0db215fdc40d768e7e9ccf8b15ccfd9d9ae632601e0aaf6cb1874cb4f9b79973d2e0bd4846280", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "61971c4f010dff3bc0c52308f5aeeff0a86bc5705c8351144ff7cc01b24fa20f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 277021, - "value": 46624, - "script": "76a914dfd2acab035e374597c763dbe28ffa67e9f68cb088ac", - "coinbase": false, - "hash": "61971c4f010dff3bc0c52308f5aeeff0a86bc5705c8351144ff7cc01b24fa20f", - "index": 1 - }, - "script": "493046022100fe220c6cfbb30619d08a589160f3510c610dc625eae0843500500bb28ce8358802210083c2c6a1c1525cafd8089c4ef997039f505f4bdf6d93f9fd99b49ccbfc7f78e8014104eeeca10c76731eea33e3b66a0fdc175e1c07ee5030c48fb433f0db215fdc40d768e7e9ccf8b15ccfd9d9ae632601e0aaf6cb1874cb4f9b79973d2e0bd4846280", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 160600, - "script": "76a914dfd2acab035e374597c763dbe28ffa67e9f68cb088ac" - }, - { - "value": 100000, - "script": "76a9141c6456c8eb57fcd32690c3697fed23ebfc1c6c6988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e710ac6ab29d72f7a1b39668209ffa3d0d7b8c762438e36b45c55584edda5b21", - "witnessHash": "e710ac6ab29d72f7a1b39668209ffa3d0d7b8c762438e36b45c55584edda5b21", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 343, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "70642294ddaee6ce78677d8325f88a56e3cf4a7ed0b8f2b9ee6e1139b8c0c6eb", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1925000, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac", - "coinbase": false, - "hash": "70642294ddaee6ce78677d8325f88a56e3cf4a7ed0b8f2b9ee6e1139b8c0c6eb", - "index": 1 - }, - "script": "4830450220103732d43a7d9d44fba63f358c2ae89986bd43ad677b260c40fda1975b37fad4022100960dce025a7d65482f2e4ee6e9b42c10115e367c7aba4c0550dd5b53d00215b3014104bfa71464809d4495b30e075ae06ed258066979d4e4073fa82b3e92a51c7a10d9f31872401ed1fb5117c5299d55de005c56d32b4366b4f8c06f08f0219701dddc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "21001edc42acca2538e636de370f9da88005ff059216697e0ef8dfe01993fec3", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 9479359, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac", - "coinbase": false, - "hash": "21001edc42acca2538e636de370f9da88005ff059216697e0ef8dfe01993fec3", - "index": 1 - }, - "script": "483045022024be844ddf2de6d7fa736fa7bfcbe2b9035237a49ca7f94f6f5ff0ca5beec2d0022100b704104ec19039744ea49f0488493239279279ba8f6585ee13c5b020a2a066ec014104bfa71464809d4495b30e075ae06ed258066979d4e4073fa82b3e92a51c7a10d9f31872401ed1fb5117c5299d55de005c56d32b4366b4f8c06f08f0219701dddc", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2200000, - "script": "76a914835b0a528ff00bea04da24da24e11518044e1f9588ac" - }, - { - "value": 9194359, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0cc0dd6f9fd72222dffd2f46a89b7a87dcbc4d54313e6e7d6f7bf45d41302602", - "witnessHash": "0cc0dd6f9fd72222dffd2f46a89b7a87dcbc4d54313e6e7d6f7bf45d41302602", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 344, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8ee442b5e11e9579aef98b4539e48b74d2b613680d74f6ce2d4bb4d14e0c134b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299901, - "value": 106125, - "script": "76a91425d28f254c906d6997d767e697037ce4e6884daa88ac", - "coinbase": false, - "hash": "8ee442b5e11e9579aef98b4539e48b74d2b613680d74f6ce2d4bb4d14e0c134b", - "index": 1 - }, - "script": "47304402204f138d980ec97c6b7ad8f9b67ac7b5be485eddc84f4349512137ffd08b91b22902207c6b3cdaf324cd5ea49a59c3bec02921102d26abbd933a5d837e4c5b6ac05d7e014104238064b6d29720d9271a868a98c2e78c0e0a12698570abd51e3b27b5dcac61e34f8514b496bccb004876d79fcbff2f470d8e6a69ea0fb5e8cbfee06567e5cad6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "350ef3ff10c3ef3e1956a99bb3c6022f2cf9a6c22b9ef938e5f3f4475741a1e2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2034942, - "script": "76a91425d28f254c906d6997d767e697037ce4e6884daa88ac", - "coinbase": false, - "hash": "350ef3ff10c3ef3e1956a99bb3c6022f2cf9a6c22b9ef938e5f3f4475741a1e2", - "index": 1 - }, - "script": "493046022100b1052e8c398d502206d806c8a52ac87ff01a5873d64facdb5f297869b3d4bfcf022100f63408fe27dc3f45388462d475f2aa71a359bb4d58cbf1b56fc665e925490fee014104238064b6d29720d9271a868a98c2e78c0e0a12698570abd51e3b27b5dcac61e34f8514b496bccb004876d79fcbff2f470d8e6a69ea0fb5e8cbfee06567e5cad6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2024700, - "script": "76a9142d5d0c7d4932b6cbf1e7d5849c60e9dc14d4c23488ac" - }, - { - "value": 106367, - "script": "76a91425d28f254c906d6997d767e697037ce4e6884daa88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "78e29ab14d9175dd90f61807c3635762a31e273b9c82faa5da09f057d2ae0697", - "witnessHash": "78e29ab14d9175dd90f61807c3635762a31e273b9c82faa5da09f057d2ae0697", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 345, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "bc9b12fb59bd69157a5fc7f09a0e740980a9660fef77abadcda30c7ad5365dfe", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1890000, - "script": "76a914663a6875c51af9695719ebb20870dc727a71a3e088ac", - "coinbase": false, - "hash": "bc9b12fb59bd69157a5fc7f09a0e740980a9660fef77abadcda30c7ad5365dfe", - "index": 1 - }, - "script": "48304502202130cadddb7a1b16633235eb4ea06fa668d28e4f3bc1ac96f2618977a2273b9a022100f3cf7a7114455b6eddb0aabdb5c1ff54822679379fb97e3128a7abfd806b679c014104ee46bd5ddf14716980a35b1e55f14f22e44ba6c0f30391f0ab3659ba2469b9caed98785d724434d3a62cfd744419556225a2d493e38c2397044b178c88561b2e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "013fa3e6c652b889a0a7dc41cc736a0d8e068f0d688caf653658076101c7f70c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2290000, - "script": "76a914663a6875c51af9695719ebb20870dc727a71a3e088ac", - "coinbase": false, - "hash": "013fa3e6c652b889a0a7dc41cc736a0d8e068f0d688caf653658076101c7f70c", - "index": 0 - }, - "script": "483045022100b65f51ed9c001e714ad58cff136a3e5a7136ed9d318bf0135f7f3310ad23392202204f60174a6e3e402f16f874ce03865dc18def7f758e830e2f1a70f8795e8b4846014104ee46bd5ddf14716980a35b1e55f14f22e44ba6c0f30391f0ab3659ba2469b9caed98785d724434d3a62cfd744419556225a2d493e38c2397044b178c88561b2e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 3170000, - "script": "76a914663a6875c51af9695719ebb20870dc727a71a3e088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "65dd34850904472517e837679b4be6f340473a0820a0a2eb6f594c564abdd3a3", - "witnessHash": "65dd34850904472517e837679b4be6f340473a0820a0a2eb6f594c564abdd3a3", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 346, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "78e29ab14d9175dd90f61807c3635762a31e273b9c82faa5da09f057d2ae0697", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1000000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac", - "coinbase": false, - "hash": "78e29ab14d9175dd90f61807c3635762a31e273b9c82faa5da09f057d2ae0697", - "index": 0 - }, - "script": "48304502210093bc381b215938f3866cf4698495e56c4b44e072ebee30a4c23d25f481fc13630220047baa362eb581866c12f8a1f28f71d4b5d0b98b3b39cb9bf54d346c3bc5cdcc0121037bedeab7fcb8f05bc5fca2bb43525bd7af9f125035149ab4f48843db0ba37c8f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "447dde86787541b4a3e28030f86b0a3c838d53954a258804316fe02da93ddf1d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2880000, - "script": "76a91459ab87f2518ef5916684a0c13b30d234e20ca35d88ac", - "coinbase": false, - "hash": "447dde86787541b4a3e28030f86b0a3c838d53954a258804316fe02da93ddf1d", - "index": 0 - }, - "script": "473044022008f90a741feed969f1241f0005a3efe9761ccc3ca92d3cf24737eca848fc7962022000c30cd672506ab997cb0a9263031cabcfe1d94528ab675bea981018f9817648012102192c62062f08ebbf621a1dd691e70ea2404759abc1d0192a33b35a39bbeca87a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1750000, - "script": "76a914663a6875c51af9695719ebb20870dc727a71a3e088ac" - }, - { - "value": 2120000, - "script": "76a914788de3e892875e1652dfdf9bf9677b84086e415388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "87104d1434372519911baeba177c7c2b09ae03e15e87dbf564cd45224d87ed18", - "witnessHash": "87104d1434372519911baeba177c7c2b09ae03e15e87dbf564cd45224d87ed18", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 347, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "15d11f96abfd62aa71ec219ddaa085d33a32cf9b30e68a0ed20c504127ec51ae", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 30497, - "script": "76a9141d03bd9811980f07dc4c0561abf1dcfc18880d6088ac", - "coinbase": false, - "hash": "15d11f96abfd62aa71ec219ddaa085d33a32cf9b30e68a0ed20c504127ec51ae", - "index": 1 - }, - "script": "483045022040f5f4e7870100675f6caf1c4fd806dae299d3f73b4890468eae7c282b61b3440221009bb21e42894bdce7d6f520a9af793bea6d0fba39f300ea31935ae2b81695352a01410492c48d00c45f8ee6bd6f068c9fe677d1f8a95b672ad303840052e3d759303666789b47f19af568d36327cb861f1964d2bb2de6e7a486857b6a03f773e4590311", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0b82b25627cecc831c8a48e19437fefcc81b18ebe8252e105f96c4f1b03d720c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 5821159, - "script": "76a9141d03bd9811980f07dc4c0561abf1dcfc18880d6088ac", - "coinbase": false, - "hash": "0b82b25627cecc831c8a48e19437fefcc81b18ebe8252e105f96c4f1b03d720c", - "index": 1 - }, - "script": "483045022100e6eb0db2a0fe13f2768f4118ea492d3bef1922d1543d3c3183fc3fd03054ad790220486a5d2eee6117811dfb0cd5a27b5f482c2540499ae00eb6d3b9c8890fbf037b01410492c48d00c45f8ee6bd6f068c9fe677d1f8a95b672ad303840052e3d759303666789b47f19af568d36327cb861f1964d2bb2de6e7a486857b6a03f773e4590311", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5727124, - "script": "76a91430ad7012f49eac76f9b459908035df4f1354368988ac" - }, - { - "value": 114532, - "script": "76a9141d03bd9811980f07dc4c0561abf1dcfc18880d6088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fd4c9dd188826a910e711c29fc828874d43259c750bf4843755919ccd671869f", - "witnessHash": "fd4c9dd188826a910e711c29fc828874d43259c750bf4843755919ccd671869f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 348, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "cd44dc832d1933eb8c058868b56c179aaccc983ce0ab64694adcd53f5f2401ad", - "index": 1 - }, - "coin": { - "version": 1, - "height": 293687, - "value": 500978265, - "script": "76a914b055fa8527e1651d6cfa3b154331c84ca5e97a1488ac", - "coinbase": false, - "hash": "cd44dc832d1933eb8c058868b56c179aaccc983ce0ab64694adcd53f5f2401ad", - "index": 1 - }, - "script": "483045022052a44e4cadea6faafb260f955b30e155eb8a41d7cfa3628f82a3f38ceed81b6c0221008cacbcd84485bd6be25b5471f5da50f7abe20182a3af43f9bf90e6d1c8647d620141049b0fe551be02a4f98526674fce207219ca1ed6d25553c6c9e12f366d51827fd308dd8944b640300b516ce2ec49c9e292cfcda10504c4b75a2f193b7331438e3d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8636598f12c9058104ab43290a4666b29cca930c4de1536362c5dc7e6e34ad73", - "index": 1 - }, - "coin": { - "version": 1, - "height": 295007, - "value": 450377855, - "script": "76a914b055fa8527e1651d6cfa3b154331c84ca5e97a1488ac", - "coinbase": false, - "hash": "8636598f12c9058104ab43290a4666b29cca930c4de1536362c5dc7e6e34ad73", - "index": 1 - }, - "script": "4930460221009c424fd716b6a413305098fccc5dc75eed9989f046f31bfcfcc89723e7ae0243022100e9f573e644225d44fe29d2b53b2b7405b46737d08980c94eade7a14f6947c65b0141049b0fe551be02a4f98526674fce207219ca1ed6d25553c6c9e12f366d51827fd308dd8944b640300b516ce2ec49c9e292cfcda10504c4b75a2f193b7331438e3d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 700000000, - "script": "76a91425aab4820d9a8105ae883c2c572017d40010058b88ac" - }, - { - "value": 251346120, - "script": "76a914b055fa8527e1651d6cfa3b154331c84ca5e97a1488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "feef7fba09508788f791118e03108cddd98c576e42d31f939a15f46e2eda0a4e", - "witnessHash": "feef7fba09508788f791118e03108cddd98c576e42d31f939a15f46e2eda0a4e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 349, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c798041952c0d3df581e26cb1510b829739f27acbbb1413f8de67baf250ab9d7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299458, - "value": 2372630, - "script": "76a914d149eb15033a2de80a26810c5a727ef99da4aa8d88ac", - "coinbase": false, - "hash": "c798041952c0d3df581e26cb1510b829739f27acbbb1413f8de67baf250ab9d7", - "index": 1 - }, - "script": "483045022011b996bad1246f7543b234159a06d3211dbbaf418d8edf35e5048995d59470460221008700d164f99cfc877afe425d6c296fcdc765a34c0b53e8d564f7dd04be5d56ce0141048d17b4764944bd55a653ffdee13791d5cf98abafe2b962b1cab88cdfb070478d765701725f6f59812955bdf3f1fae1c6c050df12110b0ac38d6e48025b0dfbbb", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3d02127f0ca932e6211426d3409aa83f8a37a444dd06dab6c0c1e019430df612", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299885, - "value": 3913421, - "script": "76a914d149eb15033a2de80a26810c5a727ef99da4aa8d88ac", - "coinbase": false, - "hash": "3d02127f0ca932e6211426d3409aa83f8a37a444dd06dab6c0c1e019430df612", - "index": 1 - }, - "script": "493046022100fe0d39e53817f2feb788518ff5a6dae2cc9283a46d30d514b8ecc3d72e5548540221009aa7d8fda8a210011ed3df3d3d1fe13b4c9069b2e1da6be052f3a66a335abf4b0141048d17b4764944bd55a653ffdee13791d5cf98abafe2b962b1cab88cdfb070478d765701725f6f59812955bdf3f1fae1c6c050df12110b0ac38d6e48025b0dfbbb", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4405480, - "script": "76a914fb487a0229c7fb48c07a8ade1b726f7e3f6af1fd88ac" - }, - { - "value": 1870571, - "script": "76a914d149eb15033a2de80a26810c5a727ef99da4aa8d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7c4423c6df15e115cafedc6cf63b45f8e8d56d4cf555645d4c21549fe0f9ca0a", - "witnessHash": "7c4423c6df15e115cafedc6cf63b45f8e8d56d4cf555645d4c21549fe0f9ca0a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 350, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a1a2d04e521f8258426f6cd6e88ccbcf651897c37d69f3f165b8c4ad27bf0abb", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2310000, - "script": "76a914142420c21e7adb50575ed5bd393291cd980214ee88ac", - "coinbase": false, - "hash": "a1a2d04e521f8258426f6cd6e88ccbcf651897c37d69f3f165b8c4ad27bf0abb", - "index": 1 - }, - "script": "4830450221008805af6c1be5877d4fb3709e3959de3aaa3a12910bf5343ab281d9c78c78281b02204f02c119df6e18680a6b1a614e992bb14de24cbce9f31b662aecbecb55c055f901410425f1454decf72f35ee8385df1cd1b28e50de9ad0e34722ef04e3d0983d92792d538f2a9a44ed825318a80edaa5be3ac43428677628f4311be178b773835ce644", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "68c7745b301193ec369b509b61b896da727ec28b93fb62e2777f153f27f4c867", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 15040892, - "script": "76a914142420c21e7adb50575ed5bd393291cd980214ee88ac", - "coinbase": false, - "hash": "68c7745b301193ec369b509b61b896da727ec28b93fb62e2777f153f27f4c867", - "index": 1 - }, - "script": "4930460221009c5071f3cf0f0d252e642ec9cd409fbeff37c0a14ffeaa249a0c691be871e88a02210096ce70167849ea283015d9d654fcdad12099fb43d26b6262e48880d8d9b1b75601410425f1454decf72f35ee8385df1cd1b28e50de9ad0e34722ef04e3d0983d92792d538f2a9a44ed825318a80edaa5be3ac43428677628f4311be178b773835ce644", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2700000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac" - }, - { - "value": 14640892, - "script": "76a914142420c21e7adb50575ed5bd393291cd980214ee88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "df9848e42c5b882950224a4c6a31ecd09deee4065bfc725242fe53ed8bd1554f", - "witnessHash": "df9848e42c5b882950224a4c6a31ecd09deee4065bfc725242fe53ed8bd1554f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 351, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "7c4423c6df15e115cafedc6cf63b45f8e8d56d4cf555645d4c21549fe0f9ca0a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2700000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac", - "coinbase": false, - "hash": "7c4423c6df15e115cafedc6cf63b45f8e8d56d4cf555645d4c21549fe0f9ca0a", - "index": 0 - }, - "script": "47304402206e3c7476b701e2e0f78e46ff4a95373a57a4817d39b0a9f1826845b11537c0f502203ff0a0cfb47256f8c549f7a0aba3fd417d6f12312d2a468aa4d60087ff101ce1012103082934de52ac6d2d5f0806d5ad5bd240e7733d75952d2cb06ba4b782ca4ed0d6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "382ba4026d766eadf5afada18e93e622319b63f184d74b823bd2e6358947cf1a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 2580000, - "script": "76a914fb2cc2d580e8db8440810e9f4ba58ea8f86b59a188ac", - "coinbase": false, - "hash": "382ba4026d766eadf5afada18e93e622319b63f184d74b823bd2e6358947cf1a", - "index": 0 - }, - "script": "473044022076a3bb5645bde405e36edc5b5a09941fd48a26039a2f771c01d03dc99a4508ad022002ac9f682d5bea5e63c1e24ef87f27edbdf42a8e2ba55487227cb15342e6adea012102bcca29223dd34858f5ca1e2c6513258455d6763e42a113c2ac46216fa9224dd1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 545000, - "script": "76a9140cc7a4cb0d42a97ad29cfc0a49f955d78bd0362388ac" - }, - { - "value": 4725000, - "script": "76a914142420c21e7adb50575ed5bd393291cd980214ee88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "95c0b1bd9a0e759dec2c00acc231715928c90720156e2af91ddb1d2ed0bfc68f", - "witnessHash": "95c0b1bd9a0e759dec2c00acc231715928c90720156e2af91ddb1d2ed0bfc68f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 352, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f5c38397a8fbe3ef1baa463c09dc323ce59edeb55a44a960666afe8d545d359d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac", - "coinbase": false, - "hash": "f5c38397a8fbe3ef1baa463c09dc323ce59edeb55a44a960666afe8d545d359d", - "index": 0 - }, - "script": "4830450220719589e2e7a4a37ff799be818ddd07b71560931f49d28da857e9aa46af57bd12022100ba2779f51dcd0f80f37238c4747255b77cc33612d47c8150ded39bb4b3d34d7e0141048372c61c205da3b5d1535fb2cfc18830af5f2ed8d06356657d514b47ee7b08bbe9265438708cef0c13738c52ae607c9e2cb6076697b7cea63b9e69dd1e98dd97", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8003ee0a631f4abe5cdb8fd672d7bcedabe991d73307fba4ef33bdd3a8eb4d44", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 7113757, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac", - "coinbase": false, - "hash": "8003ee0a631f4abe5cdb8fd672d7bcedabe991d73307fba4ef33bdd3a8eb4d44", - "index": 1 - }, - "script": "4930460221009c904d19e20e60433267539ed15922b80c66957765e4750068cf0b86d759d265022100bc501af1abe6d7dcb432689f62332e5296d99767196498a2f61515ce1f781fc70141048372c61c205da3b5d1535fb2cfc18830af5f2ed8d06356657d514b47ee7b08bbe9265438708cef0c13738c52ae607c9e2cb6076697b7cea63b9e69dd1e98dd97", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2400000, - "script": "76a914626ebedca70103f5c1e06ed5904f0bc478a263df88ac" - }, - { - "value": 4713757, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "55c373d567149b856ef6210399f80f8b898bc928ba22f671971ae893685c3f23", - "witnessHash": "55c373d567149b856ef6210399f80f8b898bc928ba22f671971ae893685c3f23", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 353, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "36542389072b94bcd06872cdab7753ebeb1410a11d219c142aa7d680f6f80f97", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 10000, - "script": "76a9148a35624b46bb58cfd2ef7e6cd16ba577e00b510588ac", - "coinbase": false, - "hash": "36542389072b94bcd06872cdab7753ebeb1410a11d219c142aa7d680f6f80f97", - "index": 0 - }, - "script": "493046022100a97416ac1ee0952279c5dafce0bc4fa71ffddb7c1bfbe69016e4b05b4bab780d022100d9939de05ed991aef03aa7932c77dd452c090dc4a994068ca5659bcf85cde6660141042652b0002273ced6b6093720e54ce282f75d8680fd871185ecd5156a2b1cf3139c708e16595fccb6f4bf99d4f76a05a7ebc656f95b8485a3172ebe127c6ce0b1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ab271ef7b06a9d29283d88a39c90f798f72e99d0d123ebab60fd4435803e568c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 11302996, - "script": "76a9148a35624b46bb58cfd2ef7e6cd16ba577e00b510588ac", - "coinbase": false, - "hash": "ab271ef7b06a9d29283d88a39c90f798f72e99d0d123ebab60fd4435803e568c", - "index": 1 - }, - "script": "483045022044f90fdce9504d35c5c17fc24f5a6fd2b5b97210ea2ce457ef1933b28be7325b022100ac1b212ee80b965a03a8d5a2acfc0621c682a014c9272bd6b1d78d6bf82006490141042652b0002273ced6b6093720e54ce282f75d8680fd871185ecd5156a2b1cf3139c708e16595fccb6f4bf99d4f76a05a7ebc656f95b8485a3172ebe127c6ce0b1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2500000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 8802996, - "script": "76a9148a35624b46bb58cfd2ef7e6cd16ba577e00b510588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a13c23660c9a94ea98309d70824b64e915ec99346907057e0f9c31cf876c9852", - "witnessHash": "a13c23660c9a94ea98309d70824b64e915ec99346907057e0f9c31cf876c9852", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 354, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "55c373d567149b856ef6210399f80f8b898bc928ba22f671971ae893685c3f23", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2500000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac", - "coinbase": false, - "hash": "55c373d567149b856ef6210399f80f8b898bc928ba22f671971ae893685c3f23", - "index": 0 - }, - "script": "483045022100fad0cdc88299dee35ab6884fd162749b04edf8a990b7dbaeb759ed890cc14fb302203d79aba2bcb84cd89e44ee8788a6ca2e7fd5ac40abd6ad5c3256401672d115c40121037bedeab7fcb8f05bc5fca2bb43525bd7af9f125035149ab4f48843db0ba37c8f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a9148a35624b46bb58cfd2ef7e6cd16ba577e00b510588ac" - }, - { - "value": 2480000, - "script": "76a91417add6531a3e51bb5e5510f18b8933575d0e038788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "93be8b240da7c42645df9d13ecbb35affafc7c1c09e6d2db8a933fbee9df6161", - "witnessHash": "93be8b240da7c42645df9d13ecbb35affafc7c1c09e6d2db8a933fbee9df6161", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 355, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a13c23660c9a94ea98309d70824b64e915ec99346907057e0f9c31cf876c9852", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10000, - "script": "76a9148a35624b46bb58cfd2ef7e6cd16ba577e00b510588ac", - "coinbase": false, - "hash": "a13c23660c9a94ea98309d70824b64e915ec99346907057e0f9c31cf876c9852", - "index": 0 - }, - "script": "48304502202279b59df61b8890e914ea97c98cd46c95cfffa45866c45dab4ebc49357001cd0221009521124c0919cdcb4e37114d619ad720d3f75f9e589b546d782d43b1e69b73cb0141042652b0002273ced6b6093720e54ce282f75d8680fd871185ecd5156a2b1cf3139c708e16595fccb6f4bf99d4f76a05a7ebc656f95b8485a3172ebe127c6ce0b1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "55c373d567149b856ef6210399f80f8b898bc928ba22f671971ae893685c3f23", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8802996, - "script": "76a9148a35624b46bb58cfd2ef7e6cd16ba577e00b510588ac", - "coinbase": false, - "hash": "55c373d567149b856ef6210399f80f8b898bc928ba22f671971ae893685c3f23", - "index": 1 - }, - "script": "48304502203aaa8ac4967921ce8aa9931a6e76322a650e74460a9bdb608b62bccfd34c3dc6022100e1b47c60d74a76ed61ac301d9b537c7670815f6fdd13fe654bdfb92c7c5b16dd0141042652b0002273ced6b6093720e54ce282f75d8680fd871185ecd5156a2b1cf3139c708e16595fccb6f4bf99d4f76a05a7ebc656f95b8485a3172ebe127c6ce0b1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2600000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 6202996, - "script": "76a9148a35624b46bb58cfd2ef7e6cd16ba577e00b510588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "833134f7294b463140285526461b962c366316c594dbdad156eb1e8506f90b48", - "witnessHash": "833134f7294b463140285526461b962c366316c594dbdad156eb1e8506f90b48", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 356, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fb9491cf4bcaa5418f932a61c09e6f458792ccec8c3abc5a461f877ccbb8f151", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 2275000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac", - "coinbase": false, - "hash": "fb9491cf4bcaa5418f932a61c09e6f458792ccec8c3abc5a461f877ccbb8f151", - "index": 0 - }, - "script": "48304502210088ba54976fe0d1ca3a7f01920ce045ee68d9420296ade097c74d7d74c54b246f0220539a86a13f5bf76ab6cbcd7c11f1590746b939f57c566836bd53361adaf177e301410408e0b2378aa23e30a4de4774fdf540f6a72449c99d29ace5a07ef04537dbf29504b7c4c4d5f82a0f949a7f039e386d68a3f1d04da7c86988311ae7ac824c9cb7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2d8cf172eb3381ccc74a5e123ad9e8ab8b862cb93f07297e4f92fe9909b5142d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 3324641, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac", - "coinbase": false, - "hash": "2d8cf172eb3381ccc74a5e123ad9e8ab8b862cb93f07297e4f92fe9909b5142d", - "index": 1 - }, - "script": "493046022100bb558599fb3bd907a9dc751a1ac762b52922b4a141bf8514922ecee874f7b043022100bb759c70f3c42e1dc6d65b44b4b076ff669cd969ee1b0fbf6d862053fdc150c501410408e0b2378aa23e30a4de4774fdf540f6a72449c99d29ace5a07ef04537dbf29504b7c4c4d5f82a0f949a7f039e386d68a3f1d04da7c86988311ae7ac824c9cb7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1700000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac" - }, - { - "value": 3889641, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1d2cb3f7f458b1f18ad55f9c7a0729bdf215a9f85145156cf587a0ed1438cc2e", - "witnessHash": "1d2cb3f7f458b1f18ad55f9c7a0729bdf215a9f85145156cf587a0ed1438cc2e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 357, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "51e7604fd144fc3bb244e4909c939d9cafe83826a5517b3c5e549192dfe1a369", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1750000, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac", - "coinbase": false, - "hash": "51e7604fd144fc3bb244e4909c939d9cafe83826a5517b3c5e549192dfe1a369", - "index": 1 - }, - "script": "493046022100a4c52630633f4b6560212e73285ffe9805d9766eff9591639107da60ed0ea66002210092e4340df3e421bf696b94571bcbf1d74e0e3055d0c0eaf16eed7d35d09a7f1201410441dc748e05cbefabe0cd59ba2d5b9c6b3729c4b87e0a3eea23ea77fd8e0fb883614ce2f11ac217e18acfdbe99f737b6695e650de4b15158fa09bc64ad9292279", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "351a6dfa48a1b644bbdc040bdaf561a10ae7d9503f135129bf11a018f57c5869", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 2840000, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac", - "coinbase": false, - "hash": "351a6dfa48a1b644bbdc040bdaf561a10ae7d9503f135129bf11a018f57c5869", - "index": 1 - }, - "script": "483045022100e883da79bb2ebdbc0b0ec3d7fe9f5384fdb63e3396edfef20dcfbd6630e29aa90220575362b14651a97c1758677f55d8b50641c39c1cea24bf66e034868b64a6b39d01410441dc748e05cbefabe0cd59ba2d5b9c6b3729c4b87e0a3eea23ea77fd8e0fb883614ce2f11ac217e18acfdbe99f737b6695e650de4b15158fa09bc64ad9292279", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2000000, - "script": "76a914626ebedca70103f5c1e06ed5904f0bc478a263df88ac" - }, - { - "value": 2580000, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "adf5e5bf0eeedf5551e16d95c3f4785acad5792557fdaa0fd225adec44ad8122", - "witnessHash": "adf5e5bf0eeedf5551e16d95c3f4785acad5792557fdaa0fd225adec44ad8122", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 358, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1d2cb3f7f458b1f18ad55f9c7a0729bdf215a9f85145156cf587a0ed1438cc2e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2000000, - "script": "76a914626ebedca70103f5c1e06ed5904f0bc478a263df88ac", - "coinbase": false, - "hash": "1d2cb3f7f458b1f18ad55f9c7a0729bdf215a9f85145156cf587a0ed1438cc2e", - "index": 0 - }, - "script": "47304402202d575780d2bbb9e8c454c4ed3ec18dfb05553e2bc8ab331564374babd45e3e93022027cfc5ee48130e81458947daf8678ed4602a28b6580ec5f715ac78cc2776a40d012103cba05903e33c1522407602b64d91ad92d7bc33df9cd74d5a97288d5379296128", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a914d899ad9130ec791c28461149e334623e0836183988ac" - }, - { - "value": 1980000, - "script": "76a91438bb181091ee71cc4a0259dc2fb43dc01622d71888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b42069b3eda4453f2ff2fb7b5332705475a3a79c951a17359bc3f4448e7fa820", - "witnessHash": "b42069b3eda4453f2ff2fb7b5332705475a3a79c951a17359bc3f4448e7fa820", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 359, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c9f2540ff319f2d9a1db6f4c4e1c84422d745ca70e63e1b9b91d506cfc37e029", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1190000, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac", - "coinbase": false, - "hash": "c9f2540ff319f2d9a1db6f4c4e1c84422d745ca70e63e1b9b91d506cfc37e029", - "index": 0 - }, - "script": "493046022100f2b67565d58a3c25b7136f96f45ba3259b51d6863dbad988655cbb7bc5f36af0022100d604d40005ec50bef96fedb89f5d1accec1f3dadcb2bdbd4b1c32200b3b67caf0141046c429a46e64e9c2a83bd5eb1f4a03b6aa5264583de09ee413c8f881fc35654ae1d0c4593b7b7f915db01b3801d75a7b4d9ebf27ef6c95ca0b42d1c43e15cd6cf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "435dfdf9e23a06507a4d194c17349c25b1391c877015e15a542cd9feffc8e29b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10219415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac", - "coinbase": false, - "hash": "435dfdf9e23a06507a4d194c17349c25b1391c877015e15a542cd9feffc8e29b", - "index": 1 - }, - "script": "493046022100bdcf48fa6e454ade21a9bffe5d821ef8a781b21f65e381f06b562a706964f51202210083b740848381873dc252dfb8a8f6b26cd8bdc93438e60e218301afa93eeaa1900141046c429a46e64e9c2a83bd5eb1f4a03b6aa5264583de09ee413c8f881fc35654ae1d0c4593b7b7f915db01b3801d75a7b4d9ebf27ef6c95ca0b42d1c43e15cd6cf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1900000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 9499415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "915a0f1efa6b8054ef09c803fb2434be6892c7619f547c3d85b1e1b88cbebf07", - "witnessHash": "915a0f1efa6b8054ef09c803fb2434be6892c7619f547c3d85b1e1b88cbebf07", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 360, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b42069b3eda4453f2ff2fb7b5332705475a3a79c951a17359bc3f4448e7fa820", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1900000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "b42069b3eda4453f2ff2fb7b5332705475a3a79c951a17359bc3f4448e7fa820", - "index": 0 - }, - "script": "4730440220660c51564d439957218ce05d9e8d66e0ead606058fb06e792abb49a402c984e2022076dcbe35116f0377319d28de0fd7008ced2a56a9e2e12f4ed19b0df5a48a9c090121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1890000, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "97d80dea23b1bccd743730d1fbe1190eba92ddd1cd5658bb93fa6a64834963e1", - "witnessHash": "97d80dea23b1bccd743730d1fbe1190eba92ddd1cd5658bb93fa6a64834963e1", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 361, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "915a0f1efa6b8054ef09c803fb2434be6892c7619f547c3d85b1e1b88cbebf07", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1890000, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac", - "coinbase": false, - "hash": "915a0f1efa6b8054ef09c803fb2434be6892c7619f547c3d85b1e1b88cbebf07", - "index": 0 - }, - "script": "473044022071aee46c910ce368d9a7e3a91309779caa73a502d994eca4738863c57eaee32a022068ebb1d9a871d294b624bbab39b671e1f47549d0e567c290369603fc450aa9890141046c429a46e64e9c2a83bd5eb1f4a03b6aa5264583de09ee413c8f881fc35654ae1d0c4593b7b7f915db01b3801d75a7b4d9ebf27ef6c95ca0b42d1c43e15cd6cf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b42069b3eda4453f2ff2fb7b5332705475a3a79c951a17359bc3f4448e7fa820", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9499415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac", - "coinbase": false, - "hash": "b42069b3eda4453f2ff2fb7b5332705475a3a79c951a17359bc3f4448e7fa820", - "index": 1 - }, - "script": "48304502203df2c0d1b3d8adad2ab98e9a03fa4dfb99f85a470e50c43048c7c52a87d96838022100c318f05ee0c6c9ca6d9d8d5d98f71e399e78682d4f1c79ef1a5187511b1d24690141046c429a46e64e9c2a83bd5eb1f4a03b6aa5264583de09ee413c8f881fc35654ae1d0c4593b7b7f915db01b3801d75a7b4d9ebf27ef6c95ca0b42d1c43e15cd6cf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1400000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac" - }, - { - "value": 9979415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "508d709f7fdb8790c8e10af5da34be0e780aa00f060686db93d43060c0819ae4", - "witnessHash": "508d709f7fdb8790c8e10af5da34be0e780aa00f060686db93d43060c0819ae4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 362, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "97d80dea23b1bccd743730d1fbe1190eba92ddd1cd5658bb93fa6a64834963e1", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1400000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac", - "coinbase": false, - "hash": "97d80dea23b1bccd743730d1fbe1190eba92ddd1cd5658bb93fa6a64834963e1", - "index": 0 - }, - "script": "483045022100a9683a9b43a1e74c6e25699e11fdc304d5e0099dc0e412707fae6dff611d2603022051f6260601f8e56effbbd5625c2417799637c7308d372e2431d216c2e3f3b989012103afd34045d7080e5f3d8fc0efab187951caed4b06571c7cc617d01d9abe8b36b5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1380000, - "script": "76a914cdd6cbd410b70ecbca00b02d0f962b710a7fdec488ac" - }, - { - "value": 10000, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2517ad0a4bfd32413c80f3a43ee8c08d173385716ebb28e4a5a50fa43703ad84", - "witnessHash": "2517ad0a4bfd32413c80f3a43ee8c08d173385716ebb28e4a5a50fa43703ad84", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 363, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "97d80dea23b1bccd743730d1fbe1190eba92ddd1cd5658bb93fa6a64834963e1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9979415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac", - "coinbase": false, - "hash": "97d80dea23b1bccd743730d1fbe1190eba92ddd1cd5658bb93fa6a64834963e1", - "index": 1 - }, - "script": "49304602210086ee3c24f9712047496dab411cba1b3e3ce107e76c37a0993ee18fa79eb423c3022100c44238be79950b2338a3cd148a8ffba118617c6357944eade28c02dc61d4f55f0141046c429a46e64e9c2a83bd5eb1f4a03b6aa5264583de09ee413c8f881fc35654ae1d0c4593b7b7f915db01b3801d75a7b4d9ebf27ef6c95ca0b42d1c43e15cd6cf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1100000, - "script": "76a914835b0a528ff00bea04da24da24e11518044e1f9588ac" - }, - { - "value": 8869415, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "506e2b29df148a9973359da069af459649ca9a943a6a27e082ff11b8a77e9d94", - "witnessHash": "506e2b29df148a9973359da069af459649ca9a943a6a27e082ff11b8a77e9d94", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 364, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2517ad0a4bfd32413c80f3a43ee8c08d173385716ebb28e4a5a50fa43703ad84", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1100000, - "script": "76a914835b0a528ff00bea04da24da24e11518044e1f9588ac", - "coinbase": false, - "hash": "2517ad0a4bfd32413c80f3a43ee8c08d173385716ebb28e4a5a50fa43703ad84", - "index": 0 - }, - "script": "483045022100ef429380380d6ce9e895842399b524997f3ad17eb0165429b94ac66f2438e08002201e732ac3474d9f34f8d2d0050bacf102dfee2f3e2752ff20038ae77a2c336d4f012103c78b7a24d207c3cdf4411fa2f7c36e2816471c17fa0a6bd46d4296d11fa060c9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "42f328d2697615acff34271c78b4975ff2622f489c3ec1d307871b5fa6c57329", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1480000, - "script": "76a91485c926cc9a4519a5789412dc8e5bbca5f0d1b86988ac", - "coinbase": false, - "hash": "42f328d2697615acff34271c78b4975ff2622f489c3ec1d307871b5fa6c57329", - "index": 0 - }, - "script": "47304402204a2b6d841d2c69985acb5b799e65cd3f1ec171c0409ce3c13a5a4e6b14cf615f02204bbfa143ae08d42e420161aebfc70d7c1899a766bf8bfddc93747396ab0f391c012103aa10fa80220846c1f20094fca57c8a007f66446ba0cad96c85992b3855ba1943", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1030000, - "script": "76a914732466063d4c511272443863045059c74105c6e188ac" - }, - { - "value": 1540000, - "script": "76a9142506b48887f593fa5a9b7afc1a822077526ef99b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a1a01b1ff38b7c51dad7098bfa2169ad34d0447ad762a279b356ee014b230e3a", - "witnessHash": "a1a01b1ff38b7c51dad7098bfa2169ad34d0447ad762a279b356ee014b230e3a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 365, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e862e0a210512df55fd162b9684fde7480c419a821618a952f03e5d9a3003130", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299715, - "value": 37314, - "script": "76a914c630e9bff9c5975f7301902e4e1651adf46c5dba88ac", - "coinbase": false, - "hash": "e862e0a210512df55fd162b9684fde7480c419a821618a952f03e5d9a3003130", - "index": 0 - }, - "script": "4730440220269409199c9c0c1b88b44538a14062d71371ef1b785841c335259b2f384ae83502203ffaff2f7712d6890e298ea8f8ad0e49f122726d464e91cf7501477d4c3910e001410494a8d0b11ffa943bc6174e5b093f1c687da25028b5592709488c9b1230a061d40be4e35204b3e44ed2ba5fad30c8ed8318867c3eb21b6ed51857bbb796296321", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d14f79143cee2b6933f16479a1c587d397c78ebd2b0fcee22c48e38444ada004", - "index": 42 - }, - "coin": { - "version": 1, - "height": 299820, - "value": 141676, - "script": "76a914761c6d6b984bc30510d167dee3d5196adf8a7ec488ac", - "coinbase": false, - "hash": "d14f79143cee2b6933f16479a1c587d397c78ebd2b0fcee22c48e38444ada004", - "index": 42 - }, - "script": "483045022100f74ab83b3f6775340a313477384c3fdfbf97e013300a774e40de649ceeeef0b30220589b69e757c02a84632ccf815536a4424b7dd8d415dd4b5f9e1a0e5849a6918c014104ba1f19dae5a2a36eafe79672ec744e4cc9ee24e01dd9d6996c700d36a7811803b34d827b74c9e0822c2181e130c046e2e94a4f932d280a7724910755567c2da9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "df58e5a3e57346e854d3b82a35f4e974c8ac02b85289dc996833829d573d1942", - "index": 52 - }, - "coin": { - "version": 1, - "height": 299987, - "value": 733132, - "script": "76a914761c6d6b984bc30510d167dee3d5196adf8a7ec488ac", - "coinbase": false, - "hash": "df58e5a3e57346e854d3b82a35f4e974c8ac02b85289dc996833829d573d1942", - "index": 52 - }, - "script": "483045022100955d6c30c709d37ee309d38492f1c86a0386d8003cb25a215617c321205c75540220146b1fa5a35a6f14b9c97c2e74abfa5a0a87fdb05d624b79da0c4f6f9dc17de4014104ba1f19dae5a2a36eafe79672ec744e4cc9ee24e01dd9d6996c700d36a7811803b34d827b74c9e0822c2181e130c046e2e94a4f932d280a7724910755567c2da9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 900000, - "script": "76a914bb81a1c6b7c1a1d09cd25b9abc2954b0aeba4f6388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c6056bcf8432602e0d612bd720bdf106932c833f7113b20f7a0cbbaf3c5539c4", - "witnessHash": "c6056bcf8432602e0d612bd720bdf106932c833f7113b20f7a0cbbaf3c5539c4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 366, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2c1250c35428df72c8080e0bb330eb8603aac115e2693e21623034d93799ade3", - "index": 229 - }, - "coin": { - "version": 1, - "height": 258254, - "value": 170, - "script": "76a9146f3b1484bd137cf7f26dfa73760bf47a0670789288ac", - "coinbase": false, - "hash": "2c1250c35428df72c8080e0bb330eb8603aac115e2693e21623034d93799ade3", - "index": 229 - }, - "script": "4830450221009ed0c7747a2a830be32576ce9a1b078f1c8affe542774d576f3bfb424bdc97d5022041aec55137928df634e395d61062d30392e3b6604095fa4c5f8c84349613393f0121039df64370bf6c8f5097cec0f44578d18168f85927a82de23640b29eb987c54f0c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2311a48e5e3a3bc17a1b7ba9b560cbf257581ceed16d6bc5fd33c4487337e152", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300008, - "value": 263184, - "script": "76a914e85038b40c15662048532857b20b3f3c16a0c06f88ac", - "coinbase": false, - "hash": "2311a48e5e3a3bc17a1b7ba9b560cbf257581ceed16d6bc5fd33c4487337e152", - "index": 1 - }, - "script": "483045022017aeb9b4e3f30b924259a2b4305fb4f4e8673581f3f6f74f5627397d9afb131f02210089578d0a2ccf97022c046f0a0e2be84c18aa518cddd2cfea5801ece00896afe1012102249ac6302a83f9306cf528f606b24a0c2481ba728bdeec59b06c80119256b706", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "edbaf2541436f56a06b3243299eabe7d82a3316be489e8e9d755deeb85ca943a", - "index": 272 - }, - "coin": { - "version": 1, - "height": 252741, - "value": 378, - "script": "76a9146f3b1484bd137cf7f26dfa73760bf47a0670789288ac", - "coinbase": false, - "hash": "edbaf2541436f56a06b3243299eabe7d82a3316be489e8e9d755deeb85ca943a", - "index": 272 - }, - "script": "48304502203b07afe05c231398058c1bd6a4f0501113ea922b475aba441444195d1ee84661022100f3c376593a207801b1d5a2b2a68deb07dfaca4a481fac37fc782b20ab458467a0121039df64370bf6c8f5097cec0f44578d18168f85927a82de23640b29eb987c54f0c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 253722, - "script": "76a914581d833bd9573b7b4690dc8df2e7052d79ac539b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "474f52643cfc36f0ca4556163e553d7763900db3e69fc7bc06d7390fa136023e", - "witnessHash": "474f52643cfc36f0ca4556163e553d7763900db3e69fc7bc06d7390fa136023e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 367, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c6056bcf8432602e0d612bd720bdf106932c833f7113b20f7a0cbbaf3c5539c4", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 253722, - "script": "76a914581d833bd9573b7b4690dc8df2e7052d79ac539b88ac", - "coinbase": false, - "hash": "c6056bcf8432602e0d612bd720bdf106932c833f7113b20f7a0cbbaf3c5539c4", - "index": 0 - }, - "script": "47304402207fc4ba0c6d4c7b5d5220ee24b745b406e5dd84e076e3ca6bdb39bc0c0185bb5602201c77da1d359d5a5c6414f1ec561479317b98f18ded77e93b65207fa8bd35bd160121027ed37d607ad691646dbc091d26866b8951fb50b300d33e9093c4d2bb7aad5d5b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10860, - "script": "5121027ed37d607ad691646dbc091d26866b8951fb50b300d33e9093c4d2bb7aad5d5b21204348414e4345434f000000280000000017d78400403e000000000000400a666652ae" - }, - { - "value": 10860, - "script": "5121027ed37d607ad691646dbc091d26866b8951fb50b300d33e9093c4d2bb7aad5d5b2104666666670000000000000000000000000000000000000000000000000000000052ae" - }, - { - "value": 222002, - "script": "76a914581d833bd9573b7b4690dc8df2e7052d79ac539b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "52b34b980222753b0f3f9d450a74bb3b6c0f789669f5439796ec6ac1b085559e", - "witnessHash": "52b34b980222753b0f3f9d450a74bb3b6c0f789669f5439796ec6ac1b085559e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 368, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9d533fd8ba6e30d7520073b87d1ec67c709c2f6fbd8c32a06083333523d7338f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 10000000, - "script": "76a91492a2b75744364dd2e782c4f599d6e0950b5cef5188ac", - "coinbase": false, - "hash": "9d533fd8ba6e30d7520073b87d1ec67c709c2f6fbd8c32a06083333523d7338f", - "index": 0 - }, - "script": "483045022100ce758b7efaa901b114bdadb49a91538448488295c6f2bcb00ee772f22fed61450220425e77c53ef637e8793e5e7e4baf1c75fcf7dfc83e3c7ecea00b8227ab1ba3c001410466b79fabe8c1a6df0e30a1e1939fe7757016f6c4da69853b037a8884016fd2d2dcd6674ac7d86e2647a2f69564507cf9b6a91a3315272121b4908fe16685925a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b18cf59baf64e3c6b7ad254cb578a4a871afb1b42caf0f4a18791f83ba5ab0b4", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1123101, - "script": "76a9148c847393d39901ba1d2ba4f08838c5e209936aa688ac", - "coinbase": false, - "hash": "b18cf59baf64e3c6b7ad254cb578a4a871afb1b42caf0f4a18791f83ba5ab0b4", - "index": 1 - }, - "script": "47304402203019399457446b5022d28dd2dbc1e0cb4735163e4d81b5dae6a175f07a35b7aa02203276d9c6efe6ddf8f2b73066243c2e1b08e018f6d62bda9171e4614c6a8981b901410495f6c966431a0d6a358818b2cb392fb741e9216db392597fe2db383c5550e15c3053e735c663f1085ddcd1138dcf6c6019fab37c5b6f406deac8cf6a4cc26ccc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "132b274f2f68848bf437acf95a0d64a6324f191f2c4939907cc93c94d33268e6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1002802, - "script": "76a91482818bc15d2c2f106ea2b8894db5fa32f4c0655e88ac", - "coinbase": false, - "hash": "132b274f2f68848bf437acf95a0d64a6324f191f2c4939907cc93c94d33268e6", - "index": 0 - }, - "script": "483045022100c1688c50f31520e88bfb00bbca5e84de2605765e1c3cfabdffa37509b47f788602203021af416e84badbbea7680b07017793196bedf229f1ea7c21838e60d6dd8729014104fa1a82a6bfd28da16a23b8c88fcc1ca0f69354d9474c98cbe69c106fe76e902128b79884d607fe365b59a4eb6afb05b3e93cc30f8d850db9d9c9c710cd89f038", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8a35b37cdf64de4b66774d0553b9d6a8bb86332f48f585797dcdb88ff4eb8a71", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1029885, - "script": "76a914623cfac997d4ce2ec597e40a6229f4497fa1f28a88ac", - "coinbase": false, - "hash": "8a35b37cdf64de4b66774d0553b9d6a8bb86332f48f585797dcdb88ff4eb8a71", - "index": 0 - }, - "script": "483045022100bd20201d18973f17c5e6ab626a121f70af1440bc287e0d529d93e2653cf866e1022048d246a752dc5bfb9c4235487e9facb6c0e2cb98204170daf514e1887d4a08de0141042747b8d6dd0d2151d8fd2a83b4600b8fba250ec5e6b2d55c6166ebe25ef8a384b8d8ea1701c3016da9b808a9eb082c5b5391c57ba39ce8a227a8c4d3ce065808", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bd1c3bc9246dc56f158e8eb3195fb61eb3557ecec868f118eb54cb32ffa9243e", - "index": 59 - }, - "coin": { - "version": 1, - "height": 300007, - "value": 5755, - "script": "76a914907f1977e8c97f54d463d50e8f70fd97e902087f88ac", - "coinbase": false, - "hash": "bd1c3bc9246dc56f158e8eb3195fb61eb3557ecec868f118eb54cb32ffa9243e", - "index": 59 - }, - "script": "48304502210096c0af1b1661a59083f56da55750b78ea434a1ffcbcbb81b3fd1615cba66b7e1022032ef123dc9567c2b7cd459b72cf54cd281b0245348bbe2b46857363b66b1703a01410423641667359ec400d6ef0254d956ae93bec11b8913c519eb0688dd8e464cbcf164d168d7aa35771523755bd34002633cd734e101f4a1e644e9dc19c12a6a9bbd", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 12140458, - "script": "76a9142b5930c9f810c7208204856da589ea8275bfcdb188ac" - }, - { - "value": 1001085, - "script": "76a9144055a1f719b045092d82ab6a6de027e8a07c9ac588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "bed06339018885aa3f537b031bac8cb1347542f1f4de7739b43eee8d4a2b1d5b", - "witnessHash": "bed06339018885aa3f537b031bac8cb1347542f1f4de7739b43eee8d4a2b1d5b", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 369, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6691eac10d4bcf216c3e31bdbb8a66c378dfa499ece848d5da7caf3707bad315", - "index": 22 - }, - "coin": { - "version": 1, - "height": 300003, - "value": 1979722, - "script": "76a914d5b005d75e3354fa2a4f2e4db880f2421539d9a088ac", - "coinbase": false, - "hash": "6691eac10d4bcf216c3e31bdbb8a66c378dfa499ece848d5da7caf3707bad315", - "index": 22 - }, - "script": "47304402207bd71bd6bf54a78ba383a9d5222fbb2721cc5ea24baa4025603829b00795ef6e02207359befb0487dcdf722f431ff0afc4759e9fdb2a5edb1a84b359d4414918eff40141048c0ea0691a8ba16f58cf8d9265630bbe8078c5a925b7562978c1e0614453b96168ec1d491b86fcfd5239bd1552b45e5fdbb4c009562110fb81356db844bcf981", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 114 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 4634449, - "script": "76a914230f1d29ff930bbf918c57a0f611eb9297cc747f88ac", - "coinbase": false, - "hash": "12388c682654fda29aac2866f438d9c649cad371723296bb418343be46ea33e8", - "index": 114 - }, - "script": "49304602210099932709f248764677f594f65d4d824c890fafbd683502b82f9b09264f7123b802210085b0c3299a2b3a216f88a6b72a588ef713cfcc7460b9a4abdc4a3452bb67e9b4014104c770109a145d135d3bf5d61eaadf00772ba9b928bee4ac2e87299e799c8936b3cc60af9455a488898a97ef0e7b11b26e1c900bfb4e30319e94f9a1c27e848487", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "96f26c43e4056d4cccd2dbb029eda40928a4a6cfd1d9dd8e178d99e70f1746ff", - "index": 21 - }, - "coin": { - "version": 1, - "height": 300013, - "value": 1891622, - "script": "76a914d5b005d75e3354fa2a4f2e4db880f2421539d9a088ac", - "coinbase": false, - "hash": "96f26c43e4056d4cccd2dbb029eda40928a4a6cfd1d9dd8e178d99e70f1746ff", - "index": 21 - }, - "script": "473044022047773c61f06f57841a83b31d622c22af293900a1b3e461526a1fda046c4213d4022035fc21263029802fb64ccf64e30f002d041549ace96eb3b69cdd904ea5a9f91d0141048c0ea0691a8ba16f58cf8d9265630bbe8078c5a925b7562978c1e0614453b96168ec1d491b86fcfd5239bd1552b45e5fdbb4c009562110fb81356db844bcf981", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 114 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2252308, - "script": "76a914230f1d29ff930bbf918c57a0f611eb9297cc747f88ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 114 - }, - "script": "48304502206f90c308d0289ea3a1cc6111f6062b18068f3efeb8bbefac0d65db54929d210f0221008398a840958884a8fceff22557ddd4fc1c977225f8e1267e67e3d92d1b20ce9b014104c770109a145d135d3bf5d61eaadf00772ba9b928bee4ac2e87299e799c8936b3cc60af9455a488898a97ef0e7b11b26e1c900bfb4e30319e94f9a1c27e848487", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "455ade2d6af6b839b05f7c530ccea36a61e7663ac8897bcf8c0491baa892c00e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 137491, - "script": "76a91462f3adc7cab942959bf06a59ba57140216554c7e88ac", - "coinbase": false, - "hash": "455ade2d6af6b839b05f7c530ccea36a61e7663ac8897bcf8c0491baa892c00e", - "index": 1 - }, - "script": "493046022100ef1a633fd1af89836782b781132aa023bae9f08dee39b19066454a18ec431d5d0221008843d5b1f92a939ab639fb2d7ee4e509febaf5fce501c77839bd3b2d62c87d58014104463af689d3956ee92e6a9434333a66ce07e08a78309c64192655eb89d32d0ccff663c515fe93d87fb184d27e55571bc82d4398391da09f27922f27af640c3ba0", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10758101, - "script": "76a9149bda732b7e2ce581819d174ef0c19a08592f7e7688ac" - }, - { - "value": 117491, - "script": "76a914bc027c47bb96cc336cd427bd7fac8d05c0afdb1888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7d928a6e44248dfd585b3b84f45bb78be26f406417f0dc84d1aff51d342e1bd9", - "witnessHash": "7d928a6e44248dfd585b3b84f45bb78be26f406417f0dc84d1aff51d342e1bd9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 370, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0f82638db28280dc15c990cedff4b5f9e412f12e88676ae8c59602457acef24c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299987, - "value": 100000000, - "script": "76a9147c5aab18f23b029ab073616e538d02f9275447f988ac", - "coinbase": false, - "hash": "0f82638db28280dc15c990cedff4b5f9e412f12e88676ae8c59602457acef24c", - "index": 0 - }, - "script": "48304502202a4cf486bfc41cb67407f6d0ea904d8ef5dc3850d6f6df7df1062a30254fa266022100bf9d2b8b8aeb4065c6eaba274109ac987fb1cf38842f173840cf4a77052f6fbc0141047b096191b674912de9cef933110438ab4bd2269f7072381727791527637e702913b03a8c4c09e7abd5e6f73b82b21583a6cd32b47e6ebe57dcaa19f18bdf4ecb", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1185acedd4d917f531b8f9a70f9e842abe9458e607d678364eaaadaa8083b0d6", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299987, - "value": 32400000, - "script": "76a914912264004472505b4048e3e15cf66c9ae06fa1e188ac", - "coinbase": false, - "hash": "1185acedd4d917f531b8f9a70f9e842abe9458e607d678364eaaadaa8083b0d6", - "index": 1 - }, - "script": "49304602210092032c5714d166343f04762fcbb23d24a888990abd5d1f53787e03e9dc2189e7022100f99ee57c91e27b685e76d5d0976aa5449951fcd10be44e376658629acd6f4efe014104481e4333d35c6a307d8f4e358c5f050711127b3ed3bb67507826b1a357dfb7ccf1aa0e5e5d6a17194fc50a9a0496e685ec3b2e80793042eb47e952e3e7e667bb", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "988d5b591b6daa5289c43ba97e473aab6bc11af8ba2c541cb9b7015ba7158ea5", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299993, - "value": 59500000, - "script": "76a91430be0710877b2fb3b63aac2d37db444d8835a43a88ac", - "coinbase": false, - "hash": "988d5b591b6daa5289c43ba97e473aab6bc11af8ba2c541cb9b7015ba7158ea5", - "index": 1 - }, - "script": "493046022100ac00ac49be8484de1e92fe17679b52eb685c7675c426dc95bc0abb2cdffd0255022100e4ede7fee71aa88f36912bcf59307316e7d2d97e304ec66c05a3a165a6167144014104ab9998acdd24ebd514b5daf63b2bf0ec5a481e0ae4023272c91c0abb8ff9252663eeaafa8679827ca45f7d6ff34a4d09449f2e22129979788a776d2b86224227", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "26595cbc4edeb2cd15c3c68288df24c9d195048edc296ceccf27833f2793ffbe", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 64504363, - "script": "76a914dec7334d4d54267b114edeb7938f18af61c238ba88ac", - "coinbase": false, - "hash": "26595cbc4edeb2cd15c3c68288df24c9d195048edc296ceccf27833f2793ffbe", - "index": 0 - }, - "script": "4830450220320ad68a4e09298927a3024b7168f39fbf2408d79b548483a9b05cf72bcd9e7d022100b7acaf97df3e1b336290742cfc0ba89ca5fc5e49a3a36a046079b42b8e8684e101410452c5145a2c923ee773d9bb553c190dde6e8ace51bfdab30b11bf4349646473f5412698a8ee1ebdcb474f6c0bd56098ccceb7bf83746c97c9968fa8ffe51747a1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e0b48b9da346b569febf6e55e0c35bd8a072ecb51491d10334828bf8ca92455a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299471, - "value": 1016071, - "script": "76a914997fa3cb9803f3e9be709bd24a371da3ed65eed688ac", - "coinbase": false, - "hash": "e0b48b9da346b569febf6e55e0c35bd8a072ecb51491d10334828bf8ca92455a", - "index": 0 - }, - "script": "493046022100d9bd0fbfa27424a4e8c7e572dd4bfa8bbc1db71093c59371a7270078862dc4dd022100b4240ea0078087b3034f447f73ce824aa0b267c627d9328cb7cec1ba87c7e6c6014104f774514b742f54c6aac8ca585ef76af5c0f80e507bc3cc862597485dd692e8f44d02e3825174d51b45ab747c729b8a9869a471158bc8a3d928208b0827ee27b5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000000, - "script": "76a914ae18f57a185dda965710fdb46740f3af9bdf033688ac" - }, - { - "value": 256400434, - "script": "76a914bbfeaff760e3eb9a932fb3e6542c79264e6d3f4688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f3484a690e27980a9c548c6effe7654e24a442a758a6a44072666abbce066534", - "witnessHash": "f3484a690e27980a9c548c6effe7654e24a442a758a6a44072666abbce066534", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 371, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d3d9a5a90ce398d2886adff8a2e04eeeab0908f0542827a8f387ece5c8ab5239", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 652500, - "script": "76a914a48c35e18e369168a18029a75ceb84705b1c87b088ac", - "coinbase": false, - "hash": "d3d9a5a90ce398d2886adff8a2e04eeeab0908f0542827a8f387ece5c8ab5239", - "index": 0 - }, - "script": "47304402207bc6369a4259f7d78725a8e4abc928946357210358c76a82a8cca315588e1bf7022040348aec87b32d315fc7af82566b500a4008e6576df75e7de809ad0178677f11014104b0236c572eb6198c0c9f830f9a7835fc1ae0ad7f9110bb4fa7513eb26cd50c836208ab581e14a64fefd3dfaaaa1ce613ecb18e57cc5c39487418b78154d1d09d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "448d2ac3bcce569418a073dc78489c3884be690a9af662beb8f90a866c697274", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 663750, - "script": "76a9149ee7123de82cc79a5468a13099e3f6735ac94fee88ac", - "coinbase": false, - "hash": "448d2ac3bcce569418a073dc78489c3884be690a9af662beb8f90a866c697274", - "index": 1 - }, - "script": "483045022100bfb5293ee182e28728ca5ec3b8deda07c5b01a6e6e85e889e8badb0d19360bdc02205dec9aaf561956a32c29686e4acfa84d2dbce7e31a9181cad62669994f8ed3f301410415382af4c83299598c1f6c98d533d5cfda3f5199e4a4e1acd235000369d37d37d0dadd1670fefa7813d12b041e490f8ea6580fb99e6ed19cd06ffcfc72367685", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9d078a6e2ad469f982804db6bf6823420a2100701fbf98e2119f52a85d26df59", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 712500, - "script": "76a9149ee7123de82cc79a5468a13099e3f6735ac94fee88ac", - "coinbase": false, - "hash": "9d078a6e2ad469f982804db6bf6823420a2100701fbf98e2119f52a85d26df59", - "index": 1 - }, - "script": "483045022042afa0df8d313231348f50d3939921a4a375061972e26d3076982ce6dc4fe387022100ec343736d2b4640efb397453ba611316ade12900bd4b320a52461d68c814386701410415382af4c83299598c1f6c98d533d5cfda3f5199e4a4e1acd235000369d37d37d0dadd1670fefa7813d12b041e490f8ea6580fb99e6ed19cd06ffcfc72367685", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c04031af2955c2e04a4992609b35908419ac9939877f896d5af1684caac43f49", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 832500, - "script": "76a9149ee7123de82cc79a5468a13099e3f6735ac94fee88ac", - "coinbase": false, - "hash": "c04031af2955c2e04a4992609b35908419ac9939877f896d5af1684caac43f49", - "index": 1 - }, - "script": "48304502203765b30276508134d8b6239dcb1c8aaf99232bc4de830e3e7d1ccc3cc7bd65b2022100c6c8b4b5890198eb75bbaa25922b2bb870c3571027512339c06f9bcdbcf71bcb01410415382af4c83299598c1f6c98d533d5cfda3f5199e4a4e1acd235000369d37d37d0dadd1670fefa7813d12b041e490f8ea6580fb99e6ed19cd06ffcfc72367685", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d725e4c0921a6ecece44c7208821b1bc1fc6fa10a5952ac14dc089173d80492c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 875000, - "script": "76a9141a1c313aa0b15d36a4eb60114e618b334857959388ac", - "coinbase": false, - "hash": "d725e4c0921a6ecece44c7208821b1bc1fc6fa10a5952ac14dc089173d80492c", - "index": 0 - }, - "script": "47304402205cf33d3d0d321bd02a959abd1de9c8d964e13b5837c750196ad10b0720ea91e2022060b2afd37cc560ebd20b0e923d8ebef6a2423d87648d77454aa8b8b05937d7a9014104e20c9ca2589d3b3b81b88f6606fcf84d705ce506b33799943129d0a66cdf4ebcb62dccaea7859c0b9fdb13993ddad8ec4fd2dac5d117720579bcd7a3e4099c4f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "840dac6bb8fd5b5ca3a677d878d2cd18066f75cc4a04c959c482428c79823170", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 924630, - "script": "76a9142c458cad997e4774d4b25162ffb8c06e28bc365088ac", - "coinbase": false, - "hash": "840dac6bb8fd5b5ca3a677d878d2cd18066f75cc4a04c959c482428c79823170", - "index": 0 - }, - "script": "47304402201e3328cd2ca4c0c640206f8e88774b6ae9998679352aaa587d8e524a03b5ff6a022061775191167caaf14852a4de9d85378b2f2032be120758107e1be0c8fbe802c2014104292d978b510e534d6042266dd401bdbe8459ea203ef1db34cb8e78fe199bebfd309f2f6fb97792f1c59df661fdae98123cd5dafac6451ea7a77dd6933654e8f5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "712c623e7d6aa4e0e02b4bcacac96b819ca8ca62a032dc8ae20a1b254c632db7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 940640, - "script": "76a914259c7b493b96b4b02b9ce5b3201ecd8459f068a488ac", - "coinbase": false, - "hash": "712c623e7d6aa4e0e02b4bcacac96b819ca8ca62a032dc8ae20a1b254c632db7", - "index": 1 - }, - "script": "48304502207f754004633b001e9061574f1a41d8f6433c3c5c6e2de62d1549325f2d16749e022100bfeeecabe7933e4ebb5715999415874ba9f2dcbcb449c9aa339a62c15917f3850141045bce3451fc11f22d4d6210602173afe76363170fc5591860eab860a54ac8405990c8814fc21e904bbcd117c7029fe6562f92d6dcb92ad785257761dedcf08287", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cd7add4d5f1a2f9d11afa5fcf97ca31a88efa2c12a4f5bfcc6ecc1f3cad872b2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 961875, - "script": "76a9143b96fff6364a054e979f41afc7edb36d7d34e98088ac", - "coinbase": false, - "hash": "cd7add4d5f1a2f9d11afa5fcf97ca31a88efa2c12a4f5bfcc6ecc1f3cad872b2", - "index": 0 - }, - "script": "4830450220030fafb1166b17ff76b36360dc68091ba6bb95ce88675dcffc3a870419e5e0bd0221008accabb848daa57ac1cae7a50a8ab3c87d3e790636cf3265957c9ee03e5e32190141041fcd6901d896e47d7fea711c87e1c91c2a7349d0a04569b3a5c9311ddd5ef55f25db861a42f21dd4595041eb23128fae2091e9dc1930d4cafd06e8d4ae78e865", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4ccff7409fe8c482a4e80e6378fd1993467b08796d05e6a4cc92e777f2fc37f3", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 967466, - "script": "76a9149ee7123de82cc79a5468a13099e3f6735ac94fee88ac", - "coinbase": false, - "hash": "4ccff7409fe8c482a4e80e6378fd1993467b08796d05e6a4cc92e777f2fc37f3", - "index": 0 - }, - "script": "47304402206a28a4e4db54960803d8ca06a64d01d9c92cb9585d1ecdb5a12550673764c07102203d79e03aef4186c11cc2676c1f008918de85a4caa90a7a61e8a8430fc549153601410415382af4c83299598c1f6c98d533d5cfda3f5199e4a4e1acd235000369d37d37d0dadd1670fefa7813d12b041e490f8ea6580fb99e6ed19cd06ffcfc72367685", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4743c9e7fd66a83c9a9481f6ad4b5826005ea0806e65c703b55e387a7c0459fb", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1874535, - "script": "76a914b8b13e0c3a2df20e78840dd29a64b171d30b6f0c88ac", - "coinbase": false, - "hash": "4743c9e7fd66a83c9a9481f6ad4b5826005ea0806e65c703b55e387a7c0459fb", - "index": 0 - }, - "script": "4730440220225a9dfc49a60b5eef66c7df8f1548c95379dc54902eddaa1529e58ed49b4b37022038d1f84b4af98d18044dc4d515ef57b918f2a4a70e5dc1ad0ad1f004fca6f58501410401a5c74e84b7e249b3bb502a2a2875677dd68339f26443d14b0b0a15da261d3cdd1dbfb9ca3678e7f68c5a093623df17ffdb520929509f64748ff855efb5a6fa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d1114c4a3852c2976d395a7ecb3e0698773f65ea67ba15ba6062134a41497e96", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2141790, - "script": "76a914c6b9023216a7156a9939de2c025e5ea4415a057c88ac", - "coinbase": false, - "hash": "d1114c4a3852c2976d395a7ecb3e0698773f65ea67ba15ba6062134a41497e96", - "index": 0 - }, - "script": "4930460221008201de92d2b15c3d57c9be2e7dcabe1c8d88dfd4bc85871d4f656eedef3533f2022100e8a4db602d11c8fc82121f6d67604a24df2b452464d4b3756598075f8ec10b850141044c26aee65ebf0008de84d7fe3c930c8a21b52ac1f9c0a78ec23ad97cbca680fbcaa896e2d45ffa1204cf6ee9447451518194bf9c48087e6c4b0265c661a1d81f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bcdc4cfe921235098a7bd844d6f065b79098ccfeb1c352790e3d4bca261e79d7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 4355000, - "script": "76a914be23007ebb9232f84a3f8d4b0c16fbab0182550088ac", - "coinbase": false, - "hash": "bcdc4cfe921235098a7bd844d6f065b79098ccfeb1c352790e3d4bca261e79d7", - "index": 1 - }, - "script": "493046022100e7fb3bf2922376661897c2fac7fb3dda066e0e4333aec4471ab9d9c6a873d54e022100a6dd6fcd75fa2628bc6b267524c64800bfc0d400585a3b534d56f15529b66a05014104d532af2a5d6d7ef209bbb4688ee5f9a05047b8314a707ea0aad96807cee00f6f0e9a0de612c0371eb1d4500202ce5bf6be9c1591c3d10f2abe61442cab9ce5da", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5de0b84cad5914c63a51851c5d20f1fb3fb357c5d104685ba024d358e6d00341", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 4379424, - "script": "76a914cbc6d8c7bd8ffffd7949793860b9d60d29ea6af088ac", - "coinbase": false, - "hash": "5de0b84cad5914c63a51851c5d20f1fb3fb357c5d104685ba024d358e6d00341", - "index": 0 - }, - "script": "48304502210081d612a5a78a1ec2d3e80b885ab6d3a0a53093c1f292eceb583365dd98035b3e022036ccaf4e5e36acf181ccb5976f2a1b8988fff365e11e814cedd57062b613673b0141047c2ef7c67a693aaecabc03f1ab0bea5ab3a8226d67d899162754ac7dc21fbb285fbec78f541a66184fc65f164c1021270f5fd0d62f4770e6901f28b457a88ba4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "aacbf0912ddc550548d2c0e992c6da2e7166033a946ddbf5e3e062286fb26454", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 6638275, - "script": "76a9143e8b51164977e0825aaaba3dd50e8f898be5a33f88ac", - "coinbase": false, - "hash": "aacbf0912ddc550548d2c0e992c6da2e7166033a946ddbf5e3e062286fb26454", - "index": 0 - }, - "script": "473044022020ffb5d5152d93f8f8036e34fdbe5a68989ee411cd8c6102b76bfe86b3156b630220310083aa442d910d08fb690acfb2dbb82a4c1c7d44257ce431e5b8b149ba70c701410404e20090ef0252d2daca0185b1ff23bbfaa64e708d6919a267bc7c1ae43e1d6b6f689a27a5420fb1820440a65fe23096f7b0e429a3ff718c8471ac45a7948c38", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9ed948beba965cbbfedfc80e47e172763563677f866ad7b586d96938e9746731", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 8312500, - "script": "76a9143b96fff6364a054e979f41afc7edb36d7d34e98088ac", - "coinbase": false, - "hash": "9ed948beba965cbbfedfc80e47e172763563677f866ad7b586d96938e9746731", - "index": 0 - }, - "script": "47304402204501199b922cca993b297c6a30965bf30e5ab446358d9673d214f6736d4bac3f02203d4118126e38f6c67533519ce27edbffb7f5b1baf3db025b94324ead5cb10e360141041fcd6901d896e47d7fea711c87e1c91c2a7349d0a04569b3a5c9311ddd5ef55f25db861a42f21dd4595041eb23128fae2091e9dc1930d4cafd06e8d4ae78e865", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9c0e2076162520e7a59c354e71c8bfedb436d7075d8376b1df90624e4ea059e7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 11870250, - "script": "76a914273af6faf129a29a09b1748533b611c90928f52e88ac", - "coinbase": false, - "hash": "9c0e2076162520e7a59c354e71c8bfedb436d7075d8376b1df90624e4ea059e7", - "index": 0 - }, - "script": "47304402207e2f0ccc162528a7e9eb9173c80af514a074ead42a4db42c64f1d3f9fd0cbc61022066ae98928021a673c403c22a5a0d920677e2cadb00754734502eb3d94668c5820141046d0a84c68ca26069686b5d1bb964e64ee1c2115d5c68605a55d3bd335cade0b8c0f242afecea2bf4c2930c1aa78630bf96ed33c0a580b141007d7cff5d0be85b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "620433a273d287a32fadd808eb90264e55ee34b2e74e468ab251b15b9cb4bd1e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 12990000, - "script": "76a914aa1d23190f28a060c3cc42959fe89be16dc9ff0488ac", - "coinbase": false, - "hash": "620433a273d287a32fadd808eb90264e55ee34b2e74e468ab251b15b9cb4bd1e", - "index": 0 - }, - "script": "493046022100f490d8bc50dfb8542f15dce274dbe9ade30c3b203350fa6cf1dbb404e13d6aa402210084e213055ee0009a39d9fe43e9935c20318afa0ec368b6e172d219e891ac0abb014104871b6f857e53611f097db4972faeb5a049052ee99bfe9a08434276088a59d383eedf42e92f86ee6e34781f9e61526e508cf876aef6aaa0c7813b41df09e5ed5f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "20373fb44c660de5e2cb5484c144e8121b8f0b488d5bc6b36954f4fe906fe668", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 18000000, - "script": "76a914b8b13e0c3a2df20e78840dd29a64b171d30b6f0c88ac", - "coinbase": false, - "hash": "20373fb44c660de5e2cb5484c144e8121b8f0b488d5bc6b36954f4fe906fe668", - "index": 0 - }, - "script": "493046022100a9175904a655b2cb156d9f52abbbfd723f1848833c4db417a3a9bff3ad5c16d9022100f83694ca4a9b8208ed71bbd68558c87493ad636d5afb7f521fbdaa2a15f25e3f01410401a5c74e84b7e249b3bb502a2a2875677dd68339f26443d14b0b0a15da261d3cdd1dbfb9ca3678e7f68c5a093623df17ffdb520929509f64748ff855efb5a6fa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0c418bf7309038740e0f738823193064abc7dc11cf6fe5c5f192857ab0f86f62", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 350000, - "script": "76a914b8b13e0c3a2df20e78840dd29a64b171d30b6f0c88ac", - "coinbase": false, - "hash": "0c418bf7309038740e0f738823193064abc7dc11cf6fe5c5f192857ab0f86f62", - "index": 0 - }, - "script": "49304602210088a11572dc77fbbefa9612fa1a29e98192e6fb809100090613f99d18f4d0271002210094c5da082613d67c1c9f2621601529b54396070a90d904858d6d2e517e3998d401410401a5c74e84b7e249b3bb502a2a2875677dd68339f26443d14b0b0a15da261d3cdd1dbfb9ca3678e7f68c5a093623df17ffdb520929509f64748ff855efb5a6fa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8e080270d7f5193bf9350e1de7e0807c5dc35768eb6d059d0e000aa391a5afa2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 305368, - "script": "76a9140f1537e149a4452c8b1a29342e2b25981518ee2c88ac", - "coinbase": false, - "hash": "8e080270d7f5193bf9350e1de7e0807c5dc35768eb6d059d0e000aa391a5afa2", - "index": 0 - }, - "script": "483045022100b4ea5f1586e8ea4ed86545be23c925c86dd8d09eaca2c9fb3b2e6368ea0660f8022011d6665d8dec2d754b27e817777346bfe7efb857e07484c8caf892309dd7b2da0141044bef85f93a7e009b8f64ea59a4ec4b47fd4f36439130ef75405c9e1838b8934c51ec3dd48047cd9d84c8bc2cb13c74ab9ec5f6d3d166e3cc8856a8d688f13cd2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0e906137b757a2bcbcb43757d95a66d5f907dba30d937e5fd09201dca5dcdba8", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 225000, - "script": "76a9143b96fff6364a054e979f41afc7edb36d7d34e98088ac", - "coinbase": false, - "hash": "0e906137b757a2bcbcb43757d95a66d5f907dba30d937e5fd09201dca5dcdba8", - "index": 1 - }, - "script": "47304402203886a9861e3a7b6508fff363e71c2be08a4e2694e73f4129c58db18321578fc00220249d6975a00d29d3637555b55b708258129e172f1363812e2fa4c9bfbb1c4d560141041fcd6901d896e47d7fea711c87e1c91c2a7349d0a04569b3a5c9311ddd5ef55f25db861a42f21dd4595041eb23128fae2091e9dc1930d4cafd06e8d4ae78e865", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cfffe6d3860739cef039b6b393e780aee4eccd19018d02e91ac1e3d10e429e0d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 208620, - "script": "76a914a48c35e18e369168a18029a75ceb84705b1c87b088ac", - "coinbase": false, - "hash": "cfffe6d3860739cef039b6b393e780aee4eccd19018d02e91ac1e3d10e429e0d", - "index": 0 - }, - "script": "473044022049c50dff6cabf6f0c58fbf6e248764e4cc24cc1fc83d3c4f05e41961e63f7d97022016913f131905e4e390f72b25750a945e4cb04b51c11b7c2c0012c2a006d98825014104b0236c572eb6198c0c9f830f9a7835fc1ae0ad7f9110bb4fa7513eb26cd50c836208ab581e14a64fefd3dfaaaa1ce613ecb18e57cc5c39487418b78154d1d09d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7b5155dd5aa45ae062e5faa7a80916e0dd071f55d2d9fd311476f57b72265604", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 198518, - "script": "76a914b8b13e0c3a2df20e78840dd29a64b171d30b6f0c88ac", - "coinbase": false, - "hash": "7b5155dd5aa45ae062e5faa7a80916e0dd071f55d2d9fd311476f57b72265604", - "index": 0 - }, - "script": "483045022076bfc19987c84a504d6e4d06874760239a404da0c178afb7bc9810f79e3ba7a9022100acf44f2ebca268a684a401be7fb7f11434c5e3ac8b434c06ce19f3a6bd09d13e01410401a5c74e84b7e249b3bb502a2a2875677dd68339f26443d14b0b0a15da261d3cdd1dbfb9ca3678e7f68c5a093623df17ffdb520929509f64748ff855efb5a6fa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c40a2217846bd232c177f1ef8d81ffb08c6fcb675b798da50fd2a119d1cf9201", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 157279, - "script": "76a91419047661f6c0ebff62713b975f3a72f819c7ce7588ac", - "coinbase": false, - "hash": "c40a2217846bd232c177f1ef8d81ffb08c6fcb675b798da50fd2a119d1cf9201", - "index": 1 - }, - "script": "483045022061cf7dbd4d4465d2ee1b4f17c0e761735a03f5da4afdc8ce45949bc220093179022100aa60a833c3f4ed9294bc8301da3ec22c9fa7f337c2f3c211239be2211ffa0538014104f96a5adcd60e878a6399e940d5719e116047ff7a73280e8ce80f7eb7224662b7ff0b81d8ee26b42db84022154672f32b65d120d537f38940ba6c82ebef051a6c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "885495c41fe0594b10c66b1954245a64d65b94ed74a4f21fd9acc06550159496", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 133400, - "script": "76a9143b96fff6364a054e979f41afc7edb36d7d34e98088ac", - "coinbase": false, - "hash": "885495c41fe0594b10c66b1954245a64d65b94ed74a4f21fd9acc06550159496", - "index": 0 - }, - "script": "4930460221009fcc2918b790d506100504bc6e84e4c2984a2e035949a6e813cb014ed4304982022100cd5171cf25d06b956f67c477b65adc364d588a924eda2635884354e8930303d80141041fcd6901d896e47d7fea711c87e1c91c2a7349d0a04569b3a5c9311ddd5ef55f25db861a42f21dd4595041eb23128fae2091e9dc1930d4cafd06e8d4ae78e865", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2f276219cb6ce8a9354954b81a0babfb76ca5054de51c1febfaaf9f50658ff4f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 112655, - "script": "76a9143664841e92e6f000e6335970187f3f51a36b946e88ac", - "coinbase": false, - "hash": "2f276219cb6ce8a9354954b81a0babfb76ca5054de51c1febfaaf9f50658ff4f", - "index": 1 - }, - "script": "4730440220530c0856a657c80c22f22b6d4dc775692f66530b1738216c4b17981a648567e902202b31cd49ed1c858dc910f7524b35502838157d638ced4e168dc35104750025e90141047b7dd10427c9e1ab556322885a63f2f2dfae0733ac9f35f87713749feb98c3dd88994e0a4188a9549ae83a86cf330ec18c5c857284d970001aa7380d831919e3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8900ae3f85ad69b9d0b18a86640d059ea11ddd572f1087b7e1d3504e7b0767f7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 42500, - "script": "76a9145f2893e207f963ba4d0144384891cfe290c2d43988ac", - "coinbase": false, - "hash": "8900ae3f85ad69b9d0b18a86640d059ea11ddd572f1087b7e1d3504e7b0767f7", - "index": 0 - }, - "script": "493046022100fb032cf8c23379824f8f704f6c3bbdeab9c272ba61c1e3795696e3baf2637ac3022100d6d8a8a14d16ee0ec38c977a6995d5404ce59c326928c3b7dc52418b1b356b1101410475a514c0edc8bac732649efe571a2b44fbb7ea9bd308112ad9439d3eef8f70a0b4ef44e67115ccf28af4f5f0b488c210afda8f664e3d371d7c44414a2d5309c4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ea56ed1d0b5fc9fc48ee3e991a58e04c05bc71a839f83223d965e78f29c1b3b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2700000, - "script": "76a914a48c35e18e369168a18029a75ceb84705b1c87b088ac", - "coinbase": false, - "hash": "6ea56ed1d0b5fc9fc48ee3e991a58e04c05bc71a839f83223d965e78f29c1b3b", - "index": 0 - }, - "script": "483045022100b0c5aa0abd1d0e38223a27090f40cfea72283d1b7296bac6fea5922eababd88b02207ccdd53ba33abe7b78a7aba5d827df6698ee43b523a357da45eee368de4fd153014104b0236c572eb6198c0c9f830f9a7835fc1ae0ad7f9110bb4fa7513eb26cd50c836208ab581e14a64fefd3dfaaaa1ce613ecb18e57cc5c39487418b78154d1d09d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6233ec393499de9c3833300db80c9be107f3316bc64ff681603fa7d89c3ba218", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 24000000, - "script": "76a914adf95b6304caef49ee8799a65e471f1ea1ffe21688ac", - "coinbase": false, - "hash": "6233ec393499de9c3833300db80c9be107f3316bc64ff681603fa7d89c3ba218", - "index": 0 - }, - "script": "483045022100c96731d13803e7c2bd7b8dd4e0221dae579a7dcb196970a3fd985b027d6496ed02207a502c0f680df8c9c553107d6396433af2a6fbe6865720017169167fdc323c3101410453850e38f09887428e8182248b318ab730ad09df2bdd74b6ae842af66ca71a01942679012c81f8f1760ac1625e2636c2740eee328ef3ad45f704a4928404aea4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f725c8db39a2724095db54b75a038d6c660d82596c004305692179dda1924287", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 78750, - "script": "76a914b8b13e0c3a2df20e78840dd29a64b171d30b6f0c88ac", - "coinbase": false, - "hash": "f725c8db39a2724095db54b75a038d6c660d82596c004305692179dda1924287", - "index": 0 - }, - "script": "47304402202d9221bd75093c0adceb58e30b1c963acf6a1ebdd6b0a0a919004ca6b75452c30220128468b7cd2c3d51d8cc73caeaa8ab5dc51c1be4e45ca9a09c5eb2853d5c3e3301410401a5c74e84b7e249b3bb502a2a2875677dd68339f26443d14b0b0a15da261d3cdd1dbfb9ca3678e7f68c5a093623df17ffdb520929509f64748ff855efb5a6fa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2b5159d1ee47808e4161e659b0f12b1b55e1438de80bd15f165845be68de1e43", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5500000, - "script": "76a914259c7b493b96b4b02b9ce5b3201ecd8459f068a488ac", - "coinbase": false, - "hash": "2b5159d1ee47808e4161e659b0f12b1b55e1438de80bd15f165845be68de1e43", - "index": 0 - }, - "script": "493046022100cc066621ea00c644a6339554fb1e6753ffb8102fb3d96e6f1b51f826c6a59166022100c1805e167c7c2ce288a64578778d311f2d4147c2a6261bdbc7c48ec94b4fdd4e0141045bce3451fc11f22d4d6210602173afe76363170fc5591860eab860a54ac8405990c8814fc21e904bbcd117c7029fe6562f92d6dcb92ad785257761dedcf08287", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c9bb583e9e87955bd9baec5a3b372ed4a230861e2b57d0be237afef9d373132f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 441600, - "script": "76a914be23007ebb9232f84a3f8d4b0c16fbab0182550088ac", - "coinbase": false, - "hash": "c9bb583e9e87955bd9baec5a3b372ed4a230861e2b57d0be237afef9d373132f", - "index": 1 - }, - "script": "47304402200ef17c54690759831b74b641582bdd259502e79eb7f43d07510aeba529470c0302204d28508df97352fabcfe028298e249462dd7e84363455455d7ae263d40325f36014104d532af2a5d6d7ef209bbb4688ee5f9a05047b8314a707ea0aad96807cee00f6f0e9a0de612c0371eb1d4500202ce5bf6be9c1591c3d10f2abe61442cab9ce5da", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4d7d8b42d9e52bf0dc616502954700aa329db06ffab1d7a830b4758d592abfe7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 145500, - "script": "76a914058ab1128c7c571725f73644b8ed2bfb87c7b03a88ac", - "coinbase": false, - "hash": "4d7d8b42d9e52bf0dc616502954700aa329db06ffab1d7a830b4758d592abfe7", - "index": 1 - }, - "script": "4730440220736b38c9bee9454985fbbfc003484e5b1ed8f89485322d03c23a0961e4e2c29402203ab6da67623a74623f44b9966f7c873ef57a568c92c3ce361c1b0de7d271c44e0141042e93ca33dfd4ef713fcbaa1d06f6abed8399f0e46c64d9c3d79fecc76f3471e82fd328db489e60fda17a397fd3fbf9e729499f07cecc9953c0da1eee46fc113b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "62129f0b28b95be2020f16bb81abb573e805d0812a483bb3cddc17a5b5dbce88", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 311600, - "script": "76a914a48c35e18e369168a18029a75ceb84705b1c87b088ac", - "coinbase": false, - "hash": "62129f0b28b95be2020f16bb81abb573e805d0812a483bb3cddc17a5b5dbce88", - "index": 0 - }, - "script": "4930460221009f59d510cc6a8ae0b55e0d878adfc986d462489410da64e8dd94a0a4f4a43813022100bd32100a68dd07e36a497e356943610132afd7683f27ca3f587c22b7b65a3f06014104b0236c572eb6198c0c9f830f9a7835fc1ae0ad7f9110bb4fa7513eb26cd50c836208ab581e14a64fefd3dfaaaa1ce613ecb18e57cc5c39487418b78154d1d09d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eba6e1421c5798a66bffad7aa60f42f59a95d708555c191b037d85cc1003f81b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 16787500, - "script": "76a914adf95b6304caef49ee8799a65e471f1ea1ffe21688ac", - "coinbase": false, - "hash": "eba6e1421c5798a66bffad7aa60f42f59a95d708555c191b037d85cc1003f81b", - "index": 0 - }, - "script": "493046022100f7b91ba3938e4be4225bc41b000745997e45afc24bb7b373c344edc5fe5d3056022100cf57a5ac07813a620e018157f44de069c6c9ca0283a49abed90a6fc58ec6ab7f01410453850e38f09887428e8182248b318ab730ad09df2bdd74b6ae842af66ca71a01942679012c81f8f1760ac1625e2636c2740eee328ef3ad45f704a4928404aea4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "90fa73f30efd222bdae6d016172402355d4bb5d03e250ac1087e88bbd08b010a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 345000, - "script": "76a9143b96fff6364a054e979f41afc7edb36d7d34e98088ac", - "coinbase": false, - "hash": "90fa73f30efd222bdae6d016172402355d4bb5d03e250ac1087e88bbd08b010a", - "index": 0 - }, - "script": "483045022034b7e0734400ef0e0d898c02e1fd8762356048789c0a86c9e170ea58f7409dfd022100b9c165cac035274475f462b7ef8baa668d954a484d99a5c1b4e23ec801dafc0c0141041fcd6901d896e47d7fea711c87e1c91c2a7349d0a04569b3a5c9311ddd5ef55f25db861a42f21dd4595041eb23128fae2091e9dc1930d4cafd06e8d4ae78e865", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a57fdd37133f1399e4f0d99569663b3f61f7e7db0a648f288a7b5ce7ae7b77ed", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 77491, - "script": "76a9142b48ca0cab536a7720182f48cfe789a132f9198288ac", - "coinbase": false, - "hash": "a57fdd37133f1399e4f0d99569663b3f61f7e7db0a648f288a7b5ce7ae7b77ed", - "index": 1 - }, - "script": "47304402204f21cebff29c1fcd4036a5a4930ff6b6a5cc71b9083ce7dce582687fedbbc0d80220607be8834f411b89a55960de53939e5d2858fc0b17df0191b430b1c3670fc492014104807cad7b28b3735ae6d58d4232348a721cb6216c0e01bf66328635472488af6efd67b2e3f95a4a3018acbd3d66cdad98dfe0476b52eedfae19cc81d76071cb5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d1ca3864d76e4099299f9901b58b6244df96056b9a085fe4d1f99e368fc396cb", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299968, - "value": 97491, - "script": "76a91415299d0815dd8bf5dd1e6f1a98744f9af850ddf588ac", - "coinbase": false, - "hash": "d1ca3864d76e4099299f9901b58b6244df96056b9a085fe4d1f99e368fc396cb", - "index": 1 - }, - "script": "48304502200a55d2040c0c5be31bf105cb4b1fa04739d4e01da1c65f1ff63aaf5b0ec91bc6022100ceb3429a7ffa2acd54b74bed58a6469395c0af3827fa6be68f95d1af58fdab29014104eb2ace7b797092ccf150c8be345c37de5e921b035c34f82399065bb123e7b5b39b596179591c882e69a2a25af94a29fc95e8420978fc6cb457dabc1bc6b28af4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 130135925, - "script": "76a914deb92e379612bd6ce76814e4babd5cf00da9e85088ac" - }, - { - "value": 34982, - "script": "76a9149acbb2f94a38b72e256290af1bf1cfc27d88b2b088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4dc8a701668a86986977dd079c17c955fcc8b0fe7eaffeb682bcf130ebf56f80", - "witnessHash": "4dc8a701668a86986977dd079c17c955fcc8b0fe7eaffeb682bcf130ebf56f80", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 372, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5c92531edf7b441ad27e876afcc0252aed04bde4b481833a03a9c95ab9df392e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 200000, - "script": "76a914da5dde8abec4f3b67561bcd06aaf28b790cff75588ac", - "coinbase": false, - "hash": "5c92531edf7b441ad27e876afcc0252aed04bde4b481833a03a9c95ab9df392e", - "index": 1 - }, - "script": "483045022100be9bf5ec5fc59be9687b5bc58f055c79d2eb2efce39e966f02deb68e45758b24022072aaf787538cfb4d9ab9c31963db2d6172808adee3fe94cd32b0b713589e8c590141049de1c8260ad5729982fa9589f0aa795a76dbd9695418c232963098eac9c1a2b3c74669555f94f6e3fe7800916a8e30651dc7eefdb82e773bb096358420818d5a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "717411473e05e85d6aeb27bad1093663c23f6af57f88193c969a9ec7e1e18322", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "717411473e05e85d6aeb27bad1093663c23f6af57f88193c969a9ec7e1e18322", - "index": 1 - }, - "script": "473044022006424bd8b16f58e4da6070847c268af41df018b1fb4c95fe7fbbc70c87af7a810220187eb30a58cffd8e2696020cee07fa3a59fcb6f3512968b453e5da168ec303db0121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "71b6e6dcd17c363564632f3e0beff40bf37d03d31fba02c3582d45ccdaf66871", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "71b6e6dcd17c363564632f3e0beff40bf37d03d31fba02c3582d45ccdaf66871", - "index": 0 - }, - "script": "47304402202fe042b2c005152adbd0951bfeedcd7c2a86d9d60470b0b0ee4503662b3f3fa002206c1b7869309f166399a879a464c11e74ce77b9edebe2e680aef1caad99be034a0121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "73d3e30fa43df3ab291fb8d45220f468bc58898cd3bf341ca8765fc374c9118d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "73d3e30fa43df3ab291fb8d45220f468bc58898cd3bf341ca8765fc374c9118d", - "index": 1 - }, - "script": "47304402203da67fc1d5915b7840914b01896d5052b162209d9925ebf34722a5436487940502200fbdbd25d2d32816b88dfece2c73486a192ac3b0d9da69f07f51ac6a50e2f8d20121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7f973335d82e6668a7720a2f4fec9e8d1e0a07127c42348620b2cba1b9f9a6f4", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "7f973335d82e6668a7720a2f4fec9e8d1e0a07127c42348620b2cba1b9f9a6f4", - "index": 1 - }, - "script": "4830450221008f6c763068bf945a82cf202839fe8da5f57538fd59050aec304c1aee44b662b202206adac1b8e517b6844e9f99fd2b7f3cdfff1bc9c30776658395021412aafbccf20121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7fb63bb524223dec5ae80e3123d3be3c6c3ce83cab451666fdb14cf9ddae1d77", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "7fb63bb524223dec5ae80e3123d3be3c6c3ce83cab451666fdb14cf9ddae1d77", - "index": 1 - }, - "script": "483045022100da1aa9fc9c0e40fec20728918b3deab6c90a6c4e188f4cc7ae0a4d18587a3e35022000baff783e5fd6505bca945b87c10d0080eadab4c82091a66bcbba1dd0666e250121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 390000, - "script": "76a914534f420c13b4af49c9cde2dd34f6dd78d1996dc488ac" - }, - { - "value": 40000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c6b3298c1f18dfa15743f85bb3b7eedcb5f323542067cb6294451eeb14c38c83", - "witnessHash": "c6b3298c1f18dfa15743f85bb3b7eedcb5f323542067cb6294451eeb14c38c83", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 373, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "95c0b1bd9a0e759dec2c00acc231715928c90720156e2af91ddb1d2ed0bfc68f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2400000, - "script": "76a914626ebedca70103f5c1e06ed5904f0bc478a263df88ac", - "coinbase": false, - "hash": "95c0b1bd9a0e759dec2c00acc231715928c90720156e2af91ddb1d2ed0bfc68f", - "index": 0 - }, - "script": "47304402204902009b0ca45dc7d9dbb0c034e0f685f0fd1adf0db2ce28d437f71b8eb6138702206c40ac9863f07ac7e778aa5364347ed57476bbadd5085a0b8c9717f82965d712012103cba05903e33c1522407602b64d91ad92d7bc33df9cd74d5a97288d5379296128", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "19d30f5af2e3ef036bc8c98678d6696fd998966bf7d4a83b94902945fa7034ed", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 143727, - "script": "76a9140cc7a4cb0d42a97ad29cfc0a49f955d78bd0362388ac", - "coinbase": false, - "hash": "19d30f5af2e3ef036bc8c98678d6696fd998966bf7d4a83b94902945fa7034ed", - "index": 0 - }, - "script": "4730440220413bfc424667bc34a80e58ce9c6d68b71c87ecbb33af5c4ac07697fc5a478d3e02201f62cdc76ff27807ab664da7a945e1ab14ddd68ba05a19035f0b486edb84d381012103a16de31da538ba5e6a898e7aec2100633438578d1cca07a6d09fbf228d1924df", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2979d3a427d4fb291aaf340d0825a538a89faa1cddd7743d23ac71abd798d90a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2780000, - "script": "76a9140ce83376b1facac4399b0bbb23ecd34e959948e688ac", - "coinbase": false, - "hash": "2979d3a427d4fb291aaf340d0825a538a89faa1cddd7743d23ac71abd798d90a", - "index": 1 - }, - "script": "4730440220469bb1dd4e91eb975896621bc7fa812bba770d9b9c7f1b68e503cea491f6fe1002201128167d697e3a55b41f727715fea67d9853882dabde32fd3e109547aa2d920e012103676a3b89cad4d66490c0449ec3ba11062fda2d6cb64ebc18dfe80ec9e70d7bf6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4200000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac" - }, - { - "value": 1113727, - "script": "76a9143df5347730ee414c9d4bd0f1197dc73c2cc81a9588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fd306868152c68855f6907cef165938a80db86a4e37f2cec1d9a3f1e3287db52", - "witnessHash": "fd306868152c68855f6907cef165938a80db86a4e37f2cec1d9a3f1e3287db52", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 374, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b363c86e178c71bedbfa13a10e57ad2c509684c2e6700dfbe49d088ce21af51d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 2625000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac", - "coinbase": false, - "hash": "b363c86e178c71bedbfa13a10e57ad2c509684c2e6700dfbe49d088ce21af51d", - "index": 0 - }, - "script": "4830450220043a174b6eb03a64cff60f997c9ca81ab2251e3ffee93efd773a864ad718ae0d022100a7154850c8efae4fa272ab2b5ca9fc3c2f03c0d2cb0f2a3cb4e701708a52924c0141048372c61c205da3b5d1535fb2cfc18830af5f2ed8d06356657d514b47ee7b08bbe9265438708cef0c13738c52ae607c9e2cb6076697b7cea63b9e69dd1e98dd97", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c6b3298c1f18dfa15743f85bb3b7eedcb5f323542067cb6294451eeb14c38c83", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4200000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac", - "coinbase": false, - "hash": "c6b3298c1f18dfa15743f85bb3b7eedcb5f323542067cb6294451eeb14c38c83", - "index": 0 - }, - "script": "47304402204b97ac21f37b5b1de5436d57c7ed4b034288541306af6ee0dacc4cd032a20d4b02207775c86aa57234d8d6928c560c7a925a250a16eccd12acc70f566fc9e74941950141048372c61c205da3b5d1535fb2cfc18830af5f2ed8d06356657d514b47ee7b08bbe9265438708cef0c13738c52ae607c9e2cb6076697b7cea63b9e69dd1e98dd97", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1900000, - "script": "76a914835b0a528ff00bea04da24da24e11518044e1f9588ac" - }, - { - "value": 4915000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6196df27275169d550a93bd2f364c83c4c61d4e7a3281109f122b0cbf06ce2ab", - "witnessHash": "6196df27275169d550a93bd2f364c83c4c61d4e7a3281109f122b0cbf06ce2ab", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 375, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "fd306868152c68855f6907cef165938a80db86a4e37f2cec1d9a3f1e3287db52", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1900000, - "script": "76a914835b0a528ff00bea04da24da24e11518044e1f9588ac", - "coinbase": false, - "hash": "fd306868152c68855f6907cef165938a80db86a4e37f2cec1d9a3f1e3287db52", - "index": 0 - }, - "script": "483045022100b80f379fdfbf29681c40e5e6cff5ff8a39633391046545e2a1121db81e0e96af0220707072e60fc1aebfb5d7a1b99c7932f60ad19ce45aa1f627cde3a32562a7366c012103c78b7a24d207c3cdf4411fa2f7c36e2816471c17fa0a6bd46d4296d11fa060c9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10000, - "script": "76a9147363eacab96a7b0559009192b3f04fcb2af62b2d88ac" - }, - { - "value": 1880000, - "script": "76a914788de3e892875e1652dfdf9bf9677b84086e415388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9678b90ba885d3f1dc6141907e470756c62935a17ba8072c06b1d0eecd974528", - "witnessHash": "9678b90ba885d3f1dc6141907e470756c62935a17ba8072c06b1d0eecd974528", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 376, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "07387d5ecf34c7d6bdc886c759d8f919dece7d9eacac0ef26185ffc54ef77398", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 2100000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac", - "coinbase": false, - "hash": "07387d5ecf34c7d6bdc886c759d8f919dece7d9eacac0ef26185ffc54ef77398", - "index": 0 - }, - "script": "4730440220663d67a2b52c1cac0f5d972ad46450f363a1b5dff74731c574be17b4ceb6b63102205109f55beafbcf041076eb7bbeeac2d534322a340c69e7a7a975bf5d68a9b70c012103afd34045d7080e5f3d8fc0efab187951caed4b06571c7cc617d01d9abe8b36b5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "088c77db73d9fb409a040417cb8eeb0c6f0de3271c1ffc24be2c56baccec4d5a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1180000, - "script": "76a9148b3c2ecf5918c1e4e6f019cf790eb54ad781c63888ac", - "coinbase": false, - "hash": "088c77db73d9fb409a040417cb8eeb0c6f0de3271c1ffc24be2c56baccec4d5a", - "index": 1 - }, - "script": "47304402204df38911acaafab4d7d18635e582ee95eefb49d6e7a05b04ffb31efe8378a1020220167577ab2a445427ac3025fe86553c1d7e9aff0096a468907a86b05ed2544b090121038c66b442ad6b314d4dc000be3c34353689b7f3355e56add76f73457a9bb91be7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1991d117785fc3ecc712de706828d17a80fd900f4ec25043014a7ee9b86fc465", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1080000, - "script": "76a914cdd6cbd410b70ecbca00b02d0f962b710a7fdec488ac", - "coinbase": false, - "hash": "1991d117785fc3ecc712de706828d17a80fd900f4ec25043014a7ee9b86fc465", - "index": 0 - }, - "script": "473044022027c1fae2654e94fcdb6b579597246bf8f60240b504c8f0b9371d0d0e6db066c602205f78dc17c66669afbe843ea86aadc4007aa769f12446c346237bdccabd3254b6012102e6b43d1e214b69683b25be7a393e0008727b47b84a16a4f6bd5250bac26b6463", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3675000, - "script": "76a9144cfac679e9a205c3d654815b6cab6445c52f5b7688ac" - }, - { - "value": 675000, - "script": "76a91417add6531a3e51bb5e5510f18b8933575d0e038788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "bfec0f882068ae83f87ee0a99d5b3ba241710460183fa4f319b537d72fc98613", - "witnessHash": "bfec0f882068ae83f87ee0a99d5b3ba241710460183fa4f319b537d72fc98613", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 377, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ba38a77e49f1b30633d232d8c2b58cc9a33995bf04e8fd9bf401313cdac825d9", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 12828608, - "script": "76a91498f75bb86fb906805f189de0fdff60767336c44e88ac", - "coinbase": false, - "hash": "ba38a77e49f1b30633d232d8c2b58cc9a33995bf04e8fd9bf401313cdac825d9", - "index": 0 - }, - "script": "47304402201aa9897801ab7c569937b563f4dfc21d58354382e8368c3e7451e6a71f1e5fab02201e505bde82b3bdfde68b8c09777af39e25ca81b2ade3f364ea7c4e0f124a5bab012102139dd251c92fdc687190f513e2080bcc70078fa4a6a897bd22ec1fb9e7e3d1b6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d3320aac850774b8e0cbcd5a643aea945e2c2f81c549cd1e1930c3592e6fe683", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 17520654, - "script": "76a914a6219ebe2a09ed27774b29bc9ce0ad66f3ab2cd388ac", - "coinbase": false, - "hash": "d3320aac850774b8e0cbcd5a643aea945e2c2f81c549cd1e1930c3592e6fe683", - "index": 0 - }, - "script": "483045022100ff8ce78cc887aa9ee9873bce315f83293aaebefb6c88af939857a5d24b78673402206fb841c16c9b74db79dc9b36e8a7fcfd4e7814565e5847180e30e8b970bd8b2b012103e28a7f639fdbc5a2d98782d4b461dd7bff1238a7f0aab91c4dc69ff2caeedf60", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4da221b3c75437b1dc283978eb938542f2ce07689078894b287862e5af4dc6c8", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 2134765, - "script": "76a914340ec7c6c55382eb57a989298a2bb00b9bfec54288ac", - "coinbase": false, - "hash": "4da221b3c75437b1dc283978eb938542f2ce07689078894b287862e5af4dc6c8", - "index": 0 - }, - "script": "473044022012d09833d2a5cb926c94b3c49e5ee7b8ee4f5d3352f7b315d64b170276133e13022019c07f5f7cf6f02dcf292f5e5d71e373b3cfd892251f0dbdfa8503aef29edbf2012103cb89cdbb0035b531fc97f46d53978e037959ac8c0e801bd6064657354be03996", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1300780, - "script": "76a914131079f3df589c4c8b2e473bd3f4758f6ecd967788ac" - }, - { - "value": 31173247, - "script": "76a91401c3ac995c0c7ac126e42cc0c0f83831f5e5e0b988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cc6fc850057bf7ecc25a2a8150d3696321895cb4d18b0a0509440bb4c02f533c", - "witnessHash": "cc6fc850057bf7ecc25a2a8150d3696321895cb4d18b0a0509440bb4c02f533c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 378, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "92c3d38654f4eedb7ef12f9d65d4ffe0a88611f9a8a3598c228d2a28a1d1ca41", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 33806243, - "script": "76a9141ea0426701ea21acd2c506cf73c487df87fb079288ac", - "coinbase": false, - "hash": "92c3d38654f4eedb7ef12f9d65d4ffe0a88611f9a8a3598c228d2a28a1d1ca41", - "index": 0 - }, - "script": "483045022100edf9c3590511749f036530fab19239afdffa4cd713da3c98dd5f96956e1a62fe022038e0c30c906b123c7996a9484182f81283e5ffa8cb24b989f26b5c6b0c9dd36c012103e8d00a52bd78a6ddea33911254588ab6fe9ccdef92fba69acf24ffd9c549ad56", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cd88f498f3f0dfee8231e353b711a7eee17f55eaf20ff0bf653aecc1bea33450", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 69253333, - "script": "76a914a0998ff28967b718d895a63e633535be525024d988ac", - "coinbase": false, - "hash": "cd88f498f3f0dfee8231e353b711a7eee17f55eaf20ff0bf653aecc1bea33450", - "index": 0 - }, - "script": "47304402207ad7682256577daf9a34893d71acf2a1950f2bfe465ebf6a1b7d8302d700225c02204ee106df4e487fabe5b8feab99b258be3d619d38b1e60728a212dd9e012adee8012103e5999decc57972ba68821734ba71002f7c25e7e02ca9ff64632700725f382756", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0b3ec64a91f7c379ee23225d4b782bbe25323dbd4f525eef7b5011adb8532d41", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 9478934, - "script": "76a914d28ced1ebb1fb1a33a4dd7d15900a9355601a89d88ac", - "coinbase": false, - "hash": "0b3ec64a91f7c379ee23225d4b782bbe25323dbd4f525eef7b5011adb8532d41", - "index": 1 - }, - "script": "47304402200eb7e814e112264c546271059a20e415e6dcfcf53cde33562472a0926aee1b7d0220434bb1d0b295c4c3b906cf053dc2a02e5c0e17458e18bbdfd50c04445186031401210287ef83f69ef662812799f509a1888fde55c018c9b3d76c77d49c6e6631f9a7fd", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 109990000, - "script": "76a914795bd8d7b8af78b24f62d09d0d4cfe26f7fad7ee88ac" - }, - { - "value": 2538510, - "script": "76a914f98d5e49b82c4ad384239efdceaaaa3f6fd6555188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4de5ba2d4d06cbc1d4feaad87309646768829c6a1680b5e9fcccf115bdd124dc", - "witnessHash": "4de5ba2d4d06cbc1d4feaad87309646768829c6a1680b5e9fcccf115bdd124dc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 379, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ad1f912113a902413e4840c85bed595658facaf90e96b3d0cdde85f5b2ae7e29", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1500000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac", - "coinbase": false, - "hash": "ad1f912113a902413e4840c85bed595658facaf90e96b3d0cdde85f5b2ae7e29", - "index": 0 - }, - "script": "47304402206a471d8b0eb9c8000f9b104230c0a2a4466ddb58da1bb1efe0edc625af0fd1d40220338360e452694319069647297b3155a36fbc5fdff90d02fbc7e471aa7b854966012103082934de52ac6d2d5f0806d5ad5bd240e7733d75952d2cb06ba4b782ca4ed0d6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "356595ae408e69233079e0b375b539a9ac41e0aef5b7d185996a57f7cffdd039", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 136509, - "script": "76a91417add6531a3e51bb5e5510f18b8933575d0e038788ac", - "coinbase": false, - "hash": "356595ae408e69233079e0b375b539a9ac41e0aef5b7d185996a57f7cffdd039", - "index": 0 - }, - "script": "4830450221008a9deee7e7e5e3f2ca8703ecdee54b896d02d9cb93f15244e3401d48de3a778b0220792351d5d1a1139f1738ec90eeb20c189a884e6693d4eca0b758385b593db720012102cf94f3a2d2b9740c23b538f316aa83c4843251dd1d2d2d554d81162103271282", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "36542389072b94bcd06872cdab7753ebeb1410a11d219c142aa7d680f6f80f97", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1680000, - "script": "76a91459ab87f2518ef5916684a0c13b30d234e20ca35d88ac", - "coinbase": false, - "hash": "36542389072b94bcd06872cdab7753ebeb1410a11d219c142aa7d680f6f80f97", - "index": 1 - }, - "script": "47304402202bfe2aff98d4ab177912442d2d239e6ca2f3ecce79be58703b9a971d57c3b93e02206b42880c1e7e2e247b5f6f844fcb11a493c802f04a46518f4fd41a5a2ae8e420012102192c62062f08ebbf621a1dd691e70ea2404759abc1d0192a33b35a39bbeca87a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 681509, - "script": "76a914f42f924dbad1de266f02d1c5054085a0527da61f88ac" - }, - { - "value": 2625000, - "script": "76a9148444e446b0e0b673a9df7f9f141b1d69673c701488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1f6f4156d701061c4e6175f2c2e042fe235e2f9dcc5a4cb4d09b39864ec4af36", - "witnessHash": "1f6f4156d701061c4e6175f2c2e042fe235e2f9dcc5a4cb4d09b39864ec4af36", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 380, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2db268abfc2f8316b4b1b890fae958c81cc99f1817dca68fd83f03041514b2d0", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297086, - "value": 1145130, - "script": "76a9145e296eebeeab44195de2443b44c0c99cb32e733888ac", - "coinbase": false, - "hash": "2db268abfc2f8316b4b1b890fae958c81cc99f1817dca68fd83f03041514b2d0", - "index": 0 - }, - "script": "483045022100c5767f7ada65ffebdd53c36eeba434bb2d8cb4c58d865918aad77bd0d1d5e49c0220043dca9e386e8a9179a85b1362707486db438b392045007abe04f417bba6d2dc012103e7ecb2a148dc071d8c4661ab5d7f583a97d44d6a86ca84ff97f17cc5c16ec911", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7095864550aedc5ee5e580f2d4a6c4e95205022d9b6414177d1bea1376e430ac", - "index": 49 - }, - "coin": { - "version": 1, - "height": 294076, - "value": 20000, - "script": "76a914428464d37e24a0b866b50732f4a9636bd7a0161788ac", - "coinbase": false, - "hash": "7095864550aedc5ee5e580f2d4a6c4e95205022d9b6414177d1bea1376e430ac", - "index": 49 - }, - "script": "473044022024546dadb60d87301c2776cbfef03ac46f8b560f1900428460877b45c1ca750c02202b6a5009de73b90535823e83260677833f679c0e85a7b60d9ee921ee79dfb8f3012102f63b754491e2df8e0b85ead46172da16d1945cbb4220d56105a9537dd7952bd2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e2747a62df274fb63474098fdfbd7a729b45e7ac3fcb2bb54e5d41d9835301ef", - "index": 0 - }, - "coin": { - "version": 1, - "height": 292945, - "value": 122868, - "script": "76a914428464d37e24a0b866b50732f4a9636bd7a0161788ac", - "coinbase": false, - "hash": "e2747a62df274fb63474098fdfbd7a729b45e7ac3fcb2bb54e5d41d9835301ef", - "index": 0 - }, - "script": "483045022100d070ad1ef0e9dc7fc1bf0f9f3c682b01c363ce36fd5c59b8c4925b06f09183b10220535bb6a2f08c2ab0615e0f329e39eaa70ad966000f12289db9661680b2ac0ef0012102f63b754491e2df8e0b85ead46172da16d1945cbb4220d56105a9537dd7952bd2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 277001, - "script": "76a9144f7ec7f9a11e61eefbb8292886f8e1d5b71c4e9688ac" - }, - { - "value": 1000997, - "script": "76a9148a1ec8b5fff50cac1ad90368ce3add65567e3b9888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "05364c74c9b04ed51e20cc48438a6768a25c675dcdfd1a3fc461604ac38e8fcc", - "witnessHash": "05364c74c9b04ed51e20cc48438a6768a25c675dcdfd1a3fc461604ac38e8fcc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 381, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1f73b122a46db62446165a5939216107c67556e0041230c6c217c5bcbb1ae35c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298793, - "value": 773675, - "script": "76a9145b07f7114832a5c0b2d75fcc1384ef45cd1ad1d688ac", - "coinbase": false, - "hash": "1f73b122a46db62446165a5939216107c67556e0041230c6c217c5bcbb1ae35c", - "index": 0 - }, - "script": "48304502210094ed67747a11b7028179470cfff80a144b774ca0409e96cab6c5f3536c7a3d27022030bf21e22494faad91d7dc90ecca3585e016181896f6ddd14e2cb9d0eeb287b2012103d0acd72d105abdf40a2c90f024fc6f7b24d2f50812229d014415e0b5176a175e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bd9fe10a3156ff933dabebc8af4907db2f09262228328b7193f9c358646ba9ca", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299723, - "value": 3084665, - "script": "76a9148c984e730b3c768c6fb2d9fd2887eb37b024984e88ac", - "coinbase": false, - "hash": "bd9fe10a3156ff933dabebc8af4907db2f09262228328b7193f9c358646ba9ca", - "index": 0 - }, - "script": "4730440220537cb6ad46c2474b93bacb720f058b124e0bf1808ab27181339df3d7414d4cbf02206bb2f317481a99d686bf37ef8a1912615c6158c4af4b07f65d6f5ef74102144401210338bacc443f5993f5f5e9c75a04f4a985de1348ed43df0ffb40ec32173d365e11", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fa244b5c2ee33e2b71ed0203fa736f3fc73bdd9c33ee6730cb43df2c1193adb6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299586, - "value": 2565675, - "script": "76a9145b07f7114832a5c0b2d75fcc1384ef45cd1ad1d688ac", - "coinbase": false, - "hash": "fa244b5c2ee33e2b71ed0203fa736f3fc73bdd9c33ee6730cb43df2c1193adb6", - "index": 0 - }, - "script": "483045022100803b2258205d1749defd76452e1903e7c302747a813219e95fdff80a86e441d202202bada0b9afb8378ee40cd60138e95b2f845d5d69856e74cb7a346b52c4e80a5b012103d0acd72d105abdf40a2c90f024fc6f7b24d2f50812229d014415e0b5176a175e", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6080000, - "script": "76a914e70b1dc0ca9fd59e54f80e3b5d7e3421d84bd67388ac" - }, - { - "value": 334015, - "script": "76a9145b07f7114832a5c0b2d75fcc1384ef45cd1ad1d688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "19d3527f7b8630a37044cbfd66f080d310951f1171eca8d22c61a2b75d430b3a", - "witnessHash": "19d3527f7b8630a37044cbfd66f080d310951f1171eca8d22c61a2b75d430b3a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 382, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0f53aaf128623a5173402c20f4f3cd034f9f73545abce470a623d4411f765ba7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299733, - "value": 420572, - "script": "76a9140a2db4c4f396059f12eb4a741a5db9717446df2588ac", - "coinbase": false, - "hash": "0f53aaf128623a5173402c20f4f3cd034f9f73545abce470a623d4411f765ba7", - "index": 1 - }, - "script": "483045022100c59dc4b17fc561116cd78660c4ed37125cb1eb23270369ecb1d1149cc98e283a02203d3ec51e9ded564cd8bb28472e616311bc982f518241531b66a9f7feb92cf7fc012103bfca9490aeab5010090635f88588e433c830f09e3e1d9684155f30cfc71f8556", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6f108220e6ccf8418736457cc706d4b8757093c7b867efe815796184c58ceac2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 550000, - "script": "76a9148dd5db43482a7df52ebbae3af4e005045e29e0c588ac", - "coinbase": false, - "hash": "6f108220e6ccf8418736457cc706d4b8757093c7b867efe815796184c58ceac2", - "index": 0 - }, - "script": "4830450221009de3116d77723d784c4334505c59497d077fc92aaba2ea6cfc3ae7dc0ba487aa02203f67dab4f04b6a111f8dd723fe113759d77918944f2206d80d5da2003957c836012103063ec131a7d2f917b506853cac277ea3958f4170b77bfb422df410611eaf856b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0ca1cd37cf05aac26be3e739b9443bce1b815fd0ddec1d2db712c78817ca6e04", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 540000, - "script": "76a9140d4412bfcbe01246d6deec6ecf8f0ccfe8d0d2e288ac", - "coinbase": false, - "hash": "0ca1cd37cf05aac26be3e739b9443bce1b815fd0ddec1d2db712c78817ca6e04", - "index": 0 - }, - "script": "4730440220796c74b1f09625e3105b4967cc5ff8967214e9024220c4898f4cd26419ff04f602204378412e975dc426d11fffc7c1712d1276594f51020ce022949cb915806eb463012103c6c3164e66de4e236409d30a9e6a78df28750d7aeaf7a79b225474a9fabadc61", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000572, - "script": "76a914c426803960e08d50a8d07590fe1be6f24477c5a788ac" - }, - { - "value": 500000, - "script": "76a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ccb8d8e14361594cd1664b9ee8c39d2cacb6429a89e4f33047d4c2cc22873aeb", - "witnessHash": "ccb8d8e14361594cd1664b9ee8c39d2cacb6429a89e4f33047d4c2cc22873aeb", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 383, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "19d3527f7b8630a37044cbfd66f080d310951f1171eca8d22c61a2b75d430b3a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 500000, - "script": "76a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac", - "coinbase": false, - "hash": "19d3527f7b8630a37044cbfd66f080d310951f1171eca8d22c61a2b75d430b3a", - "index": 1 - }, - "script": "47304402201db57cc83fa1351bd475740b7e1ed2ce670a8c4d3cf957f66ddcd2f39a95646002206f5e5d29a984b6ecf7e45a68be0cf7049036e480ab7458955b9bb5a49efbc824014104da6bc6a6139bb008454bfc8371141a5fb8ba6de87e9ab1578ab4c31e1b25513d6d1b1b0e66b0e39a29f6baf19f9f0faaf51d22bac02b1c07eb08058498763784", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 190000, - "script": "76a9140a2db4c4f396059f12eb4a741a5db9717446df2588ac" - }, - { - "value": 300000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8390d6bb1e04d11042412285be5fe0921ef9c2ec9cc579d403510a794fc0fb8d", - "witnessHash": "8390d6bb1e04d11042412285be5fe0921ef9c2ec9cc579d403510a794fc0fb8d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 384, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "70ab3e4c6284233ad8f7b713186221aef2866b4b0c802e56c63c16fdbd872260", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1004181, - "script": "76a9146034bcda63975118f9f2f5f93e8f6a31519287b788ac", - "coinbase": false, - "hash": "70ab3e4c6284233ad8f7b713186221aef2866b4b0c802e56c63c16fdbd872260", - "index": 1 - }, - "script": "483045022100eba4624669efecd12d556068575260753d7930c704d1088ad839a74b5182bc03022004f177b5901fb1347c2988b07804b63b7989da03f26c248fe095ec1ece59d3ff012103eb974d0f3bf503ac33c16b3cc0b7f53f465ef577326e74b95ab94f4d86a205bc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8c128ea57e9367620b6138f0a77ad68209479ffc4ccef3b226b1449a5a35e304", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1990000, - "script": "76a9148e01074be3f9e82f3c537693beda79a1fd15e5b888ac", - "coinbase": false, - "hash": "8c128ea57e9367620b6138f0a77ad68209479ffc4ccef3b226b1449a5a35e304", - "index": 1 - }, - "script": "483045022100d6ba42b7a2b9eddaef67583bb657abb454b5c462427a080e73af820da621ad1f02204eda7097d79e1eba710b5eb2d7987d0454120c6064200b217673d67fb6ee8c6b0121020de0998f4f812dc32226cb0243728025762d0715a0fc5db41bb88824b04bd634", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1d395b03730e9e6e4d959fb7a365ed43e4a062a63ea51395301f9b329e17ce06", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1474435, - "script": "76a9149bf549bbe4f62b0fa6b299ef152d600543920d0088ac", - "coinbase": false, - "hash": "1d395b03730e9e6e4d959fb7a365ed43e4a062a63ea51395301f9b329e17ce06", - "index": 0 - }, - "script": "47304402202796c528d97343610fc151fa705299ab7c3c75a8aa1521b9bf3db5b136b2267f02202c3815586509211c853ec9013ce4f5a049be9217c417d49e72fc905cefc7558f01210343612c84b58199cf04731e4dbaa1e8b062afbfa449652c7d58ace7bc92e5128f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3107500, - "script": "76a914fa38554efae9f068a6d6346556e89520c75e990d88ac" - }, - { - "value": 1351116, - "script": "76a9148e01074be3f9e82f3c537693beda79a1fd15e5b888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "eac7126fe68802d1c966a78b89c0119ad3593e2fadb735f0652147f0df66bd60", - "witnessHash": "eac7126fe68802d1c966a78b89c0119ad3593e2fadb735f0652147f0df66bd60", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 385, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0c4884af71ac4d81fc6017701a7cd8a129cde30cd9fdfbb097099b1ef98796d7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2300000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac", - "coinbase": false, - "hash": "0c4884af71ac4d81fc6017701a7cd8a129cde30cd9fdfbb097099b1ef98796d7", - "index": 0 - }, - "script": "483045022100a71a2b40d89ec07bd1fcfc09d1418eb7cf8bf4e2482b289d688e9782c5b492f1022000de4c0befb85776740fc55ec9aacdaeb4297587027ad36f34d1e8c76bd3d836012103082934de52ac6d2d5f0806d5ad5bd240e7733d75952d2cb06ba4b782ca4ed0d6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3b445c9e30764600ebbc5d911caf90bf336c251be613d15d4833fcb892db1cb4", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1270000, - "script": "76a9140cc7a4cb0d42a97ad29cfc0a49f955d78bd0362388ac", - "coinbase": false, - "hash": "3b445c9e30764600ebbc5d911caf90bf336c251be613d15d4833fcb892db1cb4", - "index": 1 - }, - "script": "4730440220039c670497871fd150f0643c881fd81329676bae7a0c00fe1cc82365f07cacee0220631f783726c401c9cb48c27a582c4fa97132cec04eb0f4ae57f2b18a0d6d72ad012103a16de31da538ba5e6a898e7aec2100633438578d1cca07a6d09fbf228d1924df", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3cc2a285c3dd5db916f6d67ffff2a556504d8524a51a88e87b93576fb4a52abc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 2780000, - "script": "76a91438bb181091ee71cc4a0259dc2fb43dc01622d71888ac", - "coinbase": false, - "hash": "3cc2a285c3dd5db916f6d67ffff2a556504d8524a51a88e87b93576fb4a52abc", - "index": 0 - }, - "script": "483045022100ec99aa96e8819e5e5534655823973c058aad9ea85d699252d0da95cdbc9663310220186d9e51c22a21d95122e6443798fbdb9fa5fd4b3b926eef42283e9969e382c00121021937f42a76525fe8fb3b593afa27ea24df13f0975dec3dc209e5ae0fc5072f3c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2315000, - "script": "76a9140ce83376b1facac4399b0bbb23ecd34e959948e688ac" - }, - { - "value": 4025000, - "script": "76a9145e93e0f7f835cc5c65d9f6c064b81767a2596de588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1a6377f2d7ac370f0d038971903e8be4de8e4dfe5e80400d766bdcbfe55f370c", - "witnessHash": "1a6377f2d7ac370f0d038971903e8be4de8e4dfe5e80400d766bdcbfe55f370c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 386, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "38ec7f990aa7079bbcba2f1de076eb4db81f4550e5e41fb717a021d7a94e5058", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299950, - "value": 14637843, - "script": "76a9141cfbc11b6f8dd6a96f219a4f67914e32c1907df488ac", - "coinbase": false, - "hash": "38ec7f990aa7079bbcba2f1de076eb4db81f4550e5e41fb717a021d7a94e5058", - "index": 1 - }, - "script": "483045022100a8de7f562b6ec659682e2d956bd29a3d9361a848b8d2979195346979377ae8750220259a92182be94ba22ac58a7bd106e9ee73bae4c08e8e40bad7a84e6257a92c4f012102c803c70353d446f0512eaa8836d60470193947fb94a386ee3281c5b6ec6acfe7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d16d23ff484b99525f4874f00c2720d3211d902a5d62e77287a2532856eea7ea", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 5000000, - "script": "76a9149cb5ab4346140ebd9d42f08f3070d8011c94fbb988ac", - "coinbase": false, - "hash": "d16d23ff484b99525f4874f00c2720d3211d902a5d62e77287a2532856eea7ea", - "index": 0 - }, - "script": "483045022100d977c7364b9e643f9910b5cd33e04244c8815dd61b7666f88cf3f3210547b8f1022022c7917d343dc3c6f8fce020a571686edb7fc8d2557beb88aed12a189cd729fd0121020215dbeeec00df216b679efde72e054243fcb561469fa8bdf4d3237553a61020", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "87d4ec5c9ba433202e46243df9d382031fd71c521f1d3b95ff68d0c538be29bc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300009, - "value": 25000000, - "script": "76a914e5c06b0c04637c96c40b86012b8104fe56ac896988ac", - "coinbase": false, - "hash": "87d4ec5c9ba433202e46243df9d382031fd71c521f1d3b95ff68d0c538be29bc", - "index": 0 - }, - "script": "483045022100ecb3a7d632c39b362632cc52aff9b8bdfa6dce61464b017561c1bfb16790516e02207271167ad9f1e0e2be0045292707f824a47e465f1e91a4b8954b1cd2b0f2f121012103850e0db0113b89154d366fe4d9dd62f46d8c60914ca243ec9582286b3474df81", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4677843, - "script": "76a9142d6f073b78fc50e25c47802ab93047b32e57ad3c88ac" - }, - { - "value": 39950000, - "script": "76a914d7c51041c0b572bbe424dce395d8b400de4e8efb88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6f9511cbec63e6fe8bf0877572d0230c809d03fbff74f1038c7c7494c25d1776", - "witnessHash": "6f9511cbec63e6fe8bf0877572d0230c809d03fbff74f1038c7c7494c25d1776", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 387, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "719a3d43412965ec50c91adba3b0756cf594480268ca92d442f97527a12482f2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 190000, - "script": "76a9146e24f8d88925eeb0457df7cfb968118cc31e1c2788ac", - "coinbase": false, - "hash": "719a3d43412965ec50c91adba3b0756cf594480268ca92d442f97527a12482f2", - "index": 0 - }, - "script": "4830450221009ca183049694409ccc664b40f3df33837c491313366d0cf5bf3ed681f7003e00022019750a8e0148395a1bf62c008080c8ed7ee9bc16100eb7c71e85ef5b99f94f10012103a6d0b315a938d846b56ea32e7452e4770e376fc9dc87bc61b3570015ebb2d754", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c3c7064a893895f86d177994e7cea2b5c8044149eeaeb2de29b45a8a87a69797", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 790000, - "script": "76a914148e5773ddf8d376d8976b4f877641aa8bf2c46888ac", - "coinbase": false, - "hash": "c3c7064a893895f86d177994e7cea2b5c8044149eeaeb2de29b45a8a87a69797", - "index": 0 - }, - "script": "483045022100efdf49349bf0065b297ea3746fd87e0bca59a44c188e2aba707a971260288a0a022004076498588f9ee23b159c16cb3466820dd905618252cce6d03f92e53887ada1012103072bb08796f38bc30c1190c82cd4cbd15ad597b5a65dd863edf764e453338145", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f510aa80811dd8b29de49b1c7ce74a28648d6bc2bdc3e65ff15a34a26fce5f63", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299730, - "value": 550000, - "script": "76a914b0145ac7cdb7d8cb6098565836f160864ba3ab9b88ac", - "coinbase": false, - "hash": "f510aa80811dd8b29de49b1c7ce74a28648d6bc2bdc3e65ff15a34a26fce5f63", - "index": 0 - }, - "script": "483045022100e81b0538e6a6d1d5bef795264eeee794476693856c695ddc3d0feb25105d9c27022065678d9dcf63a6c187b8f49be997bc5fb7da7dc30cc9e74131193ca178d4f0d9012103a6f96febceac23b0ccc4bd653189ac43bb0a08fbcf63097cbece1c34456b175a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 400000, - "script": "76a914da5dde8cbf20315f3e00ad8d6b610c14bb6d0ab888ac" - }, - { - "value": 1120000, - "script": "76a914434760f16030d21cfac0386098a96111fc948bf288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "375b170205148fcc644702e0d124511fd8b2757d3cb84b75f439ba59a631b3f4", - "witnessHash": "375b170205148fcc644702e0d124511fd8b2757d3cb84b75f439ba59a631b3f4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 388, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6c60074b32bbda15c6009a3349a3eb2439c120c12c9c1022dd5cadaf9bd45fe9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299998, - "value": 1153214, - "script": "76a9144fbe75d017a876272793739f7fc26c0cacfc4e1c88ac", - "coinbase": false, - "hash": "6c60074b32bbda15c6009a3349a3eb2439c120c12c9c1022dd5cadaf9bd45fe9", - "index": 1 - }, - "script": "483045022100ae6d591380a67ab5c3c43a53cd4404ad3dc5041870282d31f60a6fa96fd73cc1022003373a78a1e115204b2e9eea5cb2da7622e92bf8e063beb8f542c84cc9af56ab0121028ef4b723e65c623113de23f08d96050d16fb2cbaed363e51ed7fdaf18ba95a4a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "91fbee07653d38151b3ac628624716c7ed0822245335368b4cffdafdfddba2a4", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300000, - "value": 900000, - "script": "76a9142884d9aaeae23dec849e6dfbca011de267f2da1788ac", - "coinbase": false, - "hash": "91fbee07653d38151b3ac628624716c7ed0822245335368b4cffdafdfddba2a4", - "index": 0 - }, - "script": "483045022100d8d1a07ffd355129956286477da978073191dc338ecdcefcb7287334abd69c36022045c5defe2e76be135bace7327dc9fa0a2306973292bdb3e26ce221fadfdf38a80121022c3ac8a323d42bc8d07944d72a64cb649d9ff4da9442c09564abf778b53bbc91", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "91fbee07653d38151b3ac628624716c7ed0822245335368b4cffdafdfddba2a4", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300000, - "value": 1090000, - "script": "76a9145b9211b1b81fb40924b49d91e412819488842a0788ac", - "coinbase": false, - "hash": "91fbee07653d38151b3ac628624716c7ed0822245335368b4cffdafdfddba2a4", - "index": 1 - }, - "script": "48304502210083a00a16da3ec25ba04a369b4f5a0ed021449c3aa4699b822d04bb25fb29d1ec02207eedb88cfa5a9125142f9c6830582c1ef1ddcd97b94884ecf4695732382840f401210399c99b7a9d6348e07236777e1961ff6bc03603cbc8f97cfff029b81e8be691af", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1800000, - "script": "76a914387dd1595941f6ace550cd32d967ce3770f2539c88ac" - }, - { - "value": 1333214, - "script": "76a914481cf7e3fc5e01e1025b0e01ed3cd81e4363762c88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d8b50a8a188e5863b06c3e8d53bb4080f76090aa40acffd440ea9b1e74e0e135", - "witnessHash": "d8b50a8a188e5863b06c3e8d53bb4080f76090aa40acffd440ea9b1e74e0e135", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 389, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e1e441194192161b687d5069d3c8aac0749b1c4fb4ae634d5ead0af4c65ab1f8", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300001, - "value": 1000247, - "script": "76a9146f0acdad5237523f9a051a39cfa1ad9498bab81188ac", - "coinbase": false, - "hash": "e1e441194192161b687d5069d3c8aac0749b1c4fb4ae634d5ead0af4c65ab1f8", - "index": 0 - }, - "script": "483045022100e1b3eadea81b8a1f0c23709fd09efe8bf8d32033ea9a827b0ffe4d2704918c50022076cc620eb5cd5e4d18e5021c2775cac996727ee322bd9b22c4e411da5b85735d012103f179fea07aba0dbab938acac2a4fd1fb3ae2476d561d8ed5862ac301450cf183", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "43d7790452acbc4b3d7dfc8bb3c5284dc4b10b27119f02360416c3c4e4a389db", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 1001016, - "script": "76a9145dbe649ec241dae9a348610ae8b9972da57c4cfe88ac", - "coinbase": false, - "hash": "43d7790452acbc4b3d7dfc8bb3c5284dc4b10b27119f02360416c3c4e4a389db", - "index": 1 - }, - "script": "483045022100ee647c454457cc9de67a42f7e65d944ee35202022365bbbc6bd278820d873e39022035f0485a51b712618b8382d63a9832928484a7b98fa6e224a92976879da0dca70121036be4fa371f2277d8a461525a88323419307dc96af513aeabbff8024857e28e04", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a799e89deb5c75b5027c2d2ed1412ca6501f6dc0bb48f963765ad7981f53ff71", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1001838, - "script": "76a9140caa9417187dd3e3ef86cff8d43c95f2a715330788ac", - "coinbase": false, - "hash": "a799e89deb5c75b5027c2d2ed1412ca6501f6dc0bb48f963765ad7981f53ff71", - "index": 0 - }, - "script": "483045022100f48565935e3da89a95b397991818d720e0750df2c70999c178f4ecb753e610e1022022fb5257afff21e5ee6eee6ff09ecef4e5462be59acd28907161372972aa48f8012102a7cfe4e2bbb305a6bf3afecdaa903efb9c00456122bdca630e2238d8d25d135d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1756207, - "script": "76a91466b739bd6881a2dbd488456bf6a60b9641732d3788ac" - }, - { - "value": 1236894, - "script": "76a9148f81d0ce181b69211668085886f6990c4dfd7eb488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "21d57c6f0cf8125a35bb0aa8620213ac5256d44ce2b0d65b4a1220a1891b2e2a", - "witnessHash": "21d57c6f0cf8125a35bb0aa8620213ac5256d44ce2b0d65b4a1220a1891b2e2a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 390, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e710ac6ab29d72f7a1b39668209ffa3d0d7b8c762438e36b45c55584edda5b21", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2200000, - "script": "76a914835b0a528ff00bea04da24da24e11518044e1f9588ac", - "coinbase": false, - "hash": "e710ac6ab29d72f7a1b39668209ffa3d0d7b8c762438e36b45c55584edda5b21", - "index": 0 - }, - "script": "483045022100dbdd1d0fd7c54fc9c2cad284402334732831a075d932ff707b503b57550a599802200186598401de51cc171b85012c52bb92fa900547bccfaa8218f5b7fca8a9290b012103c78b7a24d207c3cdf4411fa2f7c36e2816471c17fa0a6bd46d4296d11fa060c9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39384880ff17bfbc3ef9d1cf297b6f97f0b79f95008960cea9940e741a65143c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 262493, - "script": "76a914cdd6cbd410b70ecbca00b02d0f962b710a7fdec488ac", - "coinbase": false, - "hash": "39384880ff17bfbc3ef9d1cf297b6f97f0b79f95008960cea9940e741a65143c", - "index": 0 - }, - "script": "4830450221008b4c804294469fbb29623f920c2017de20f1fdaed8dbe9c6b3ee452aa0816a4002204c5d52643ebe0d14da2793ef8e7c7e6232d7c4e88bfa29f04f06f5365829eca1012102e6b43d1e214b69683b25be7a393e0008727b47b84a16a4f6bd5250bac26b6463", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3a78dd5632aa5c706f6f082c694c3b68536765a7dac07ba71eb75733c5db64ea", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1680000, - "script": "76a91459ab87f2518ef5916684a0c13b30d234e20ca35d88ac", - "coinbase": false, - "hash": "3a78dd5632aa5c706f6f082c694c3b68536765a7dac07ba71eb75733c5db64ea", - "index": 1 - }, - "script": "483045022100aad03daf9cd1df8c3e47838a2f8d15079b323ac58cf964466029b568eb4708bc0220391f8461dde37f937e3a3f1f312caa8676e3bad8f58eb85610ab12dafa0e93d6012102192c62062f08ebbf621a1dd691e70ea2404759abc1d0192a33b35a39bbeca87a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3080000, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac" - }, - { - "value": 1052493, - "script": "76a91417add6531a3e51bb5e5510f18b8933575d0e038788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f9736d135dcc43f318df1edcb661a161509f309d23f86585cd125f08c4d23fff", - "witnessHash": "f9736d135dcc43f318df1edcb661a161509f309d23f86585cd125f08c4d23fff", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 391, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3ae96ed7dcf039b0f99e4a1412cfcf173ca9a402bb83b2a5dba8063a41231076", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 80000, - "script": "76a914481abefcdee6df84d9452b866dbe1cb696574c7088ac", - "coinbase": false, - "hash": "3ae96ed7dcf039b0f99e4a1412cfcf173ca9a402bb83b2a5dba8063a41231076", - "index": 0 - }, - "script": "483045022100feb60003f053972d357f21a42764ea55f087d0b302d17989a0e271b5d1389bc6022041b9db06bf86fc3cc9933a53eec4907c15f2913318ede3c05d6ed7f9d5a3f6140121038bbd3214f644fcdba1532e644373bf6aafd6385f76757536dc8f4f06a36a91d3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fbadb361a0d96738184659e802a9b2c64579bca34394d5fd9d5457822690980c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 180000, - "script": "76a91489632368cd5145406b32f7af02e97b51966f48e988ac", - "coinbase": false, - "hash": "fbadb361a0d96738184659e802a9b2c64579bca34394d5fd9d5457822690980c", - "index": 1 - }, - "script": "483045022100e402fcd2dd8376139b6589d5e0f8d05c64b11557bbec1ac5521800a33870474702202c3597802a5814b919cdb495bdbbc28fa58e225138e1214b8cbfaecf7ed106ab012103e61f3cc2ebfbbe7db7ba79ec27bcedb3a532ef5a5eeb5bc3e8b279fc19a5a6ce", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5c92531edf7b441ad27e876afcc0252aed04bde4b481833a03a9c95ab9df392e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1170000, - "script": "76a9143a3c573b1f2da608c4c1cb97cf8a6401b532735588ac", - "coinbase": false, - "hash": "5c92531edf7b441ad27e876afcc0252aed04bde4b481833a03a9c95ab9df392e", - "index": 0 - }, - "script": "4830450221008ebd19f2a634eb45ae08426026722f30051308f850161db81e47a0c0927bf59d02200ed64859e15a9049611aceaa94424f742d92c14127e2620214c56b27d2d3a1e901210358ba9b9a30ef48229cbb18ffeaa12ce64b9bbf15e92615944326c74fd1621c48", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1020000, - "script": "76a9145958b5e1e2bcff8f6f1076b3289dbb98b81920f688ac" - }, - { - "value": 400000, - "script": "76a914da5dde8cbf20315f3e00ad8d6b610c14bb6d0ab888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6f243746bd2b4e4c98e482da7fcc91f6f7f5d45a835a586d0c9295de45434e87", - "witnessHash": "6f243746bd2b4e4c98e482da7fcc91f6f7f5d45a835a586d0c9295de45434e87", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 392, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f9736d135dcc43f318df1edcb661a161509f309d23f86585cd125f08c4d23fff", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 400000, - "script": "76a914da5dde8cbf20315f3e00ad8d6b610c14bb6d0ab888ac", - "coinbase": false, - "hash": "f9736d135dcc43f318df1edcb661a161509f309d23f86585cd125f08c4d23fff", - "index": 1 - }, - "script": "4830450221008a90df42195c72480a510e14fa2a88456a13e90bdc5da37999a649b7515e0ee802205b70c4d3463b047c9be937f92efa39d7c746f6facb0dc44784abde1b7bf233b4014104ccc493c773ed7b190fd3fec0fde94df66605923b5ba6781968921e3f7c86060f62799e085a6873cc5dc1592e99a9090951cad28102cb920da361944d1a827916", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 110000, - "script": "76a914481abefcdee6df84d9452b866dbe1cb696574c7088ac" - }, - { - "value": 280000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1222410d68f5e956b43a5c7e5bdf90741c6debd698d09592dbf8a132e204f208", - "witnessHash": "1222410d68f5e956b43a5c7e5bdf90741c6debd698d09592dbf8a132e204f208", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 393, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "19d3527f7b8630a37044cbfd66f080d310951f1171eca8d22c61a2b75d430b3a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1000572, - "script": "76a914c426803960e08d50a8d07590fe1be6f24477c5a788ac", - "coinbase": false, - "hash": "19d3527f7b8630a37044cbfd66f080d310951f1171eca8d22c61a2b75d430b3a", - "index": 0 - }, - "script": "4730440220467b67c7e677c6c099209c47efb8945a87dd7c02d406d76e35f332e94aa7dd5a02201be753c0a08fabefe6fd3858311bf1273ffae2374998e4fc4723b366aee0a07101210245b68bdf03a46b02a4fd18f7b3a00fe851e5b68c1db8b4b4a17d199ea3a52116", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f9736d135dcc43f318df1edcb661a161509f309d23f86585cd125f08c4d23fff", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1020000, - "script": "76a9145958b5e1e2bcff8f6f1076b3289dbb98b81920f688ac", - "coinbase": false, - "hash": "f9736d135dcc43f318df1edcb661a161509f309d23f86585cd125f08c4d23fff", - "index": 0 - }, - "script": "47304402202ba393708208a23954edbcc3a9068145699bbfed7fc493f3087cfe75eaa6cd8c02200ee3a8a0d0558a78e3e34cdf0909e611a8eae7473e787275efd86ae9bfe1790b012102a8bde065b6fbf6edb2aa31f41c56488bb1a5ce78560fcdeecbbbdf485e87b112", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1810572, - "script": "76a9149fbcae35c39e1e3a1bbeddf504b5075e2733a89688ac" - }, - { - "value": 200000, - "script": "76a914da5dde8abec4f3b67561bcd06aaf28b790cff75588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "221f15c4babeef066b178bfe0d335422f5ea7bf5af76c3ab4089fc8d568d8b4c", - "witnessHash": "221f15c4babeef066b178bfe0d335422f5ea7bf5af76c3ab4089fc8d568d8b4c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 394, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1222410d68f5e956b43a5c7e5bdf90741c6debd698d09592dbf8a132e204f208", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 200000, - "script": "76a914da5dde8abec4f3b67561bcd06aaf28b790cff75588ac", - "coinbase": false, - "hash": "1222410d68f5e956b43a5c7e5bdf90741c6debd698d09592dbf8a132e204f208", - "index": 1 - }, - "script": "483045022100b02a47738ba9c9f11040cb08a9809b503e04811bd74713957242c635fe49361e02206a8cafed06382cec2bc606944976ac919b816810784fa14ed757a5625b1113bc0141049de1c8260ad5729982fa9589f0aa795a76dbd9695418c232963098eac9c1a2b3c74669555f94f6e3fe7800916a8e30651dc7eefdb82e773bb096358420818d5a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 30000, - "script": "76a914c426803960e08d50a8d07590fe1be6f24477c5a788ac" - }, - { - "value": 160000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b0f066f7d5cc618046edb31c488b02cbaba612b3ac481155ef72e97a03dd75ef", - "witnessHash": "b0f066f7d5cc618046edb31c488b02cbaba612b3ac481155ef72e97a03dd75ef", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 395, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3c10df434e3bad248bbe88259bd22e446c55ffff1803d7dc299cf3733b27c594", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299902, - "value": 79850000, - "script": "76a9144e3e71ef1d658322ff5b68e6a741c0ff5b614dbe88ac", - "coinbase": false, - "hash": "3c10df434e3bad248bbe88259bd22e446c55ffff1803d7dc299cf3733b27c594", - "index": 0 - }, - "script": "493046022100aa06e297cd5b52920469f106f370dfc18c97aea80360ceedc84c4320655091fc022100cab61f188a75eec004f8f95b8a665ea4cef942761f96d6542a8e74ab4a5ceacd012103f5bfef358ee6a6cfa922f9d589817e8ba71266194f97d1a959a8122f78aa8d9f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ed03932656d7862f61f5fe71926c2e193db4b145a1983aaa049aacfa758f860", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299692, - "value": 8140000, - "script": "76a9146e46711e25da1c0de2ff2ac34766cd9cde0c24d188ac", - "coinbase": false, - "hash": "6ed03932656d7862f61f5fe71926c2e193db4b145a1983aaa049aacfa758f860", - "index": 1 - }, - "script": "483045022076f29a329c249f87f57070ce0e1208f2c465ec0ec68489f89015a13dbabd86b20221008d3bc03fad305e2596bb4ed5bc3c5a83ba3c4a2f603ffe6cd85df25fb82c74de012102306b644943920aee5bada7f7c3f81a7d56648087fb6699a0a83f72e591bf1754", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7c3c7ef6a63a5524c78c9298307ee2c27782f1d7be6cfb44f8036e2cc2860eb6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299406, - "value": 16130000, - "script": "76a914a85a4bcc76c433afb8a848fbda6d669689d4b62688ac", - "coinbase": false, - "hash": "7c3c7ef6a63a5524c78c9298307ee2c27782f1d7be6cfb44f8036e2cc2860eb6", - "index": 0 - }, - "script": "48304502207a1b38d0fe61840f5dc592450f84cc339301140a2fc8de37f4122ae2946df71c022100c9869128c71598f758bbbeb89d3d0608341ec467bb91ca35646c8c7c97ef8dc10121024c6902b379af5aaa743370abdd22e1b08a64fa1574dbafd182bfac352ac1def2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4110000, - "script": "76a914a6aecba9d8089b127fb626ba6df8b38021e4266f88ac" - }, - { - "value": 100000000, - "script": "76a914a5654be21cd173cbe5c2354a63df23a1bfc459b488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5708f3c63be2baf9d478256cded8787c84f1eb8262c6751993a84cd04cf89373", - "witnessHash": "5708f3c63be2baf9d478256cded8787c84f1eb8262c6751993a84cd04cf89373", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 396, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "656240110cb4fa631333401b950c587e02e5a194b6c543eee773a9d37dd7c085", - "index": 359 - }, - "coin": { - "version": 1, - "height": 299969, - "value": 10094584, - "script": "76a9148e7445bbb8abd4b3174d80fa4c409fea6b94d96b88ac", - "coinbase": false, - "hash": "656240110cb4fa631333401b950c587e02e5a194b6c543eee773a9d37dd7c085", - "index": 359 - }, - "script": "493046022100fac44490c1943a1492e8c4331e5daafac56d844c1653aab9aae5ab2ad0ddd3e30221008130cb69429507b560a4a129c94ce4a8ec8022cf6baa59b57c7be459c61603750121023abd0e81d627e92dc18937a5a79f680b8ab49fe23ba9852f14044d8e72db8305", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a2885cec6163ff722c855ef077f64782553af41afe270eda2450e97951d36f5d", - "index": 343 - }, - "coin": { - "version": 1, - "height": 299798, - "value": 9359327, - "script": "76a9148e7445bbb8abd4b3174d80fa4c409fea6b94d96b88ac", - "coinbase": false, - "hash": "a2885cec6163ff722c855ef077f64782553af41afe270eda2450e97951d36f5d", - "index": 343 - }, - "script": "493046022100e5997201f2a4a863b77141253a8ac22319ba4407378395994a4678e23353e44c022100e39660051677a04977b0c94f215119bf1014912d4dc65ded379fa7e541b7afd20121023abd0e81d627e92dc18937a5a79f680b8ab49fe23ba9852f14044d8e72db8305", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "96ec6b88f5b914fdae9c6eaa7290e0eab9d8fab2a0e218e7c79fb4213178f57a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299689, - "value": 15515, - "script": "76a9148e7445bbb8abd4b3174d80fa4c409fea6b94d96b88ac", - "coinbase": false, - "hash": "96ec6b88f5b914fdae9c6eaa7290e0eab9d8fab2a0e218e7c79fb4213178f57a", - "index": 1 - }, - "script": "493046022100a33065f89a8bca93e3bc33733426f21087605f7ba79130ab4b154bee53787852022100a33a1f0b41f9d7356f1d5963f50bd3c3d1dbd3ea99d145b53546a1230fdd308f0121023abd0e81d627e92dc18937a5a79f680b8ab49fe23ba9852f14044d8e72db8305", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 19440000, - "script": "76a914bbd538b8364a8542983f9fe61b433fcb1776215288ac" - }, - { - "value": 19426, - "script": "76a9148e7445bbb8abd4b3174d80fa4c409fea6b94d96b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5ceec2d8ee90cb4b956870fac6055bead9333570f656ec3014307031de518cec", - "witnessHash": "5ceec2d8ee90cb4b956870fac6055bead9333570f656ec3014307031de518cec", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 397, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "89baa6934a2e790699804c1ae4a0b8f4e537244fb4dc78e4cdd5aabf59b2ea20", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299901, - "value": 5460, - "script": "5141044e7194426b519391acd0efd21eda207b0283837d508a0b4f31732fee0016a7d948ad72b4270ecf627b1078ccef539446d150e3e0fc661c9fca40ecec6d9652c5410462e044eb7cd618a2da9d8f7581a5196d331bcd0d38d1cef49ccb86bec16fe6b2793f6da5a6d17f9f75479c3b6915ae61eed7ba721075a683d82692e958ea05762102f884647516015a0f5861633406a0c8b2ef2d8967aa61a97a5fc2b14bf0ce23ba53ae", - "coinbase": false, - "hash": "89baa6934a2e790699804c1ae4a0b8f4e537244fb4dc78e4cdd5aabf59b2ea20", - "index": 1 - }, - "script": "0048304502210097e0b36ee0022544f3cdbc19d57d4543633eea38a88b623f66ffc9b5f88a9c5002203100e367444753cc933205c24ead17765e4761165b52377533e1f97e037aa73401", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "89baa6934a2e790699804c1ae4a0b8f4e537244fb4dc78e4cdd5aabf59b2ea20", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299901, - "value": 5460, - "script": "514104135a3af7994ffea92ae3fe31bbcf171774f6710b28020a4aae8a60c2067a5bb4d9e78ebaa7835d8b5d1eaf6b2d0cab8798c07a4f3fb25039763a534f420de3f24104a80e6bb472850549ae160004e60892ed7a33ac65af1db8cab114db519260adba9b3d80317af4c1e867833eb8f05d36e4569fe1470892ad4b067f6e63941c04992102f884647516015a0f5861633406a0c8b2ef2d8967aa61a97a5fc2b14bf0ce23ba53ae", - "coinbase": false, - "hash": "89baa6934a2e790699804c1ae4a0b8f4e537244fb4dc78e4cdd5aabf59b2ea20", - "index": 2 - }, - "script": "00483045022100be52576b14e484b114348bdea7ea0faaabb517ab3f3f19058db1406097fc17390220206147e81accef9d7499d07910320c253cec78113906d233144f293e70b2365f01", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "89baa6934a2e790699804c1ae4a0b8f4e537244fb4dc78e4cdd5aabf59b2ea20", - "index": 3 - }, - "coin": { - "version": 1, - "height": 299901, - "value": 5460, - "script": "514104b73c797f606d9c12bcce9dde31152fb57ec8b2ddf224f44539c1b743c6186bd8234cfd1427fad5ea8e3e738a80cf9161ddc1e9c09bddfb8a555938e6ff3d814e410424646ed408173bb594defcd11cd7554cfdec25ab542d99dd47c83e1a529ce15ccfb3148f3c8961fbb5475f25200f08ebfd805eb058dccbaf878b75a2d77fd1792102f884647516015a0f5861633406a0c8b2ef2d8967aa61a97a5fc2b14bf0ce23ba53ae", - "coinbase": false, - "hash": "89baa6934a2e790699804c1ae4a0b8f4e537244fb4dc78e4cdd5aabf59b2ea20", - "index": 3 - }, - "script": "004930460221009951ffbeddd35f0a1db466eca3932c408ce657783a6267d932fc91f0efad9d77022100af018d9cccda3c92f229c4cad151de0015c25746083320c7eab0d7aa33876c1701", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 6380, - "script": "5141047b00000078da0dca3b0ec2300c00d0ab4466ed10e763272c6c9ca052972c69e3884a9022084215e2eef0e6f781656b5d5a87231cd4349e534b6dea55ad4ff55e4104fb45eddb6b50b7dc4ea9c1000fb95ff771fb677285b46374b4d83097ea6d6509d5a3b3993912c5a071e658d18bb38e0a1a31dee45a84b5c10cdf1f3cb92415002102f884647516015a0f5861633406a0c8b2ef2d8967aa61a97a5fc2b14bf0ce23ba53ae" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8b5b05427f111bea94883ce7a5bdee7e7a0bcfcfebc2babefd54db202e857529", - "witnessHash": "8b5b05427f111bea94883ce7a5bdee7e7a0bcfcfebc2babefd54db202e857529", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 398, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3ae96ed7dcf039b0f99e4a1412cfcf173ca9a402bb83b2a5dba8063a41231076", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 500000, - "script": "76a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac", - "coinbase": false, - "hash": "3ae96ed7dcf039b0f99e4a1412cfcf173ca9a402bb83b2a5dba8063a41231076", - "index": 1 - }, - "script": "47304402207a8f520d099f63cfbf18aa07801992fe7ceba854b0b3ff407c7e2b135536c8e3022034d561ee2080012fe1ba770f9874fd07c84df1135a8ba7a15db896e0ed8c8a1c014104da6bc6a6139bb008454bfc8371141a5fb8ba6de87e9ab1578ab4c31e1b25513d6d1b1b0e66b0e39a29f6baf19f9f0faaf51d22bac02b1c07eb08058498763784", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6f08b190fe567e63f15d8d436a5425f44faeae187df2cb16df8f36b955bcf1a6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "6f08b190fe567e63f15d8d436a5425f44faeae187df2cb16df8f36b955bcf1a6", - "index": 0 - }, - "script": "483045022100e48d81251c0f2d332f350288c911cadf0fdd5504635b6af312dbde27835d6dca02203d378d128a1400cd4c3a7ae1bf3439970a92438453f9f986db71f40f6a4889570121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7069a1df16e76c224615fb97ed574ea8704b78b395f91f4f29598b7d7b73393b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "7069a1df16e76c224615fb97ed574ea8704b78b395f91f4f29598b7d7b73393b", - "index": 1 - }, - "script": "47304402206cafdaf07b353474ab271885ad843adb48a943030ebdf1604a0bc5d0e877288d02207327868c3745007e9e199284e47373c6453dca7004fae70780f7c7affaba9a5a0121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac" - }, - { - "value": 540000, - "script": "76a91486bee458d3d0ceaec4616c0852c1c403754ff1f688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7860c680270ac315785b4f5b83bbd05fb5bb53cbf611fba9f42db80f22e3c693", - "witnessHash": "7860c680270ac315785b4f5b83bbd05fb5bb53cbf611fba9f42db80f22e3c693", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 399, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9928f14fc34ab9a3dbbba2fe5cfac1eb7a11843d05e62a082a2186882eb83fef", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299758, - "value": 532148, - "script": "76a914335653470d9b86a60cd470e3e9816c644280896888ac", - "coinbase": false, - "hash": "9928f14fc34ab9a3dbbba2fe5cfac1eb7a11843d05e62a082a2186882eb83fef", - "index": 1 - }, - "script": "4830450220244b9230bd4f9291f2fde13e02eabaae67fe9de20d33819c7d27f765e0e6a64d022100ebf042d6fbbbb2cff37e5ded5a0cb5a2e5f58e6632927ccc251d13ec687664fc014104c1482690c2eb21a404373ef3b184f7202fab723a38b671c3ff16c82a19f0a93064da8dbe23ab484344dccfb5147e78eb702affa69a0f1051b677fc3819f78a4f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a18c67234a9d59f4f80a265252bf9421f539279cdadf253021e148c31911993a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299762, - "value": 6101970, - "script": "76a914335653470d9b86a60cd470e3e9816c644280896888ac", - "coinbase": false, - "hash": "a18c67234a9d59f4f80a265252bf9421f539279cdadf253021e148c31911993a", - "index": 0 - }, - "script": "483045022100e641396cd334bb368016dbb9e2db9648b2950671a9478411757038d0e0c9a7ca022007217bac57e0ca8a847fd678803bd620b7eeae94d416cc69f8f078279087d9ba014104c1482690c2eb21a404373ef3b184f7202fab723a38b671c3ff16c82a19f0a93064da8dbe23ab484344dccfb5147e78eb702affa69a0f1051b677fc3819f78a4f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "93aaa3e672673fc885ff3637b864ef625753e684df0ea167739f6b887f081315", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299873, - "value": 8800000, - "script": "76a914335653470d9b86a60cd470e3e9816c644280896888ac", - "coinbase": false, - "hash": "93aaa3e672673fc885ff3637b864ef625753e684df0ea167739f6b887f081315", - "index": 0 - }, - "script": "493046022100c676608eababb610a9158f014737bf2bf8c51a648b4f00d354d0c1af023c98bc022100c351f1ec277494524c5bf4dd557c9f17aa42a3f4f31b2797a73e6274f8d2087e014104c1482690c2eb21a404373ef3b184f7202fab723a38b671c3ff16c82a19f0a93064da8dbe23ab484344dccfb5147e78eb702affa69a0f1051b677fc3819f78a4f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 15424118, - "script": "76a914651d03dd005e308a44d3e5d13aba18e8e523e88a88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dec2b78570167698d549bd8bab2382e541a449316ccf02c23da8ec33635ef4a9", - "witnessHash": "dec2b78570167698d549bd8bab2382e541a449316ccf02c23da8ec33635ef4a9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 400, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ac4448d0e0275e6243bddc98e1561d3944e73395d48ebcb47b74ce29bfdfb1d7", - "index": 659 - }, - "coin": { - "version": 1, - "height": 299025, - "value": 12820000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "ac4448d0e0275e6243bddc98e1561d3944e73395d48ebcb47b74ce29bfdfb1d7", - "index": 659 - }, - "script": "483045022100d228f58bbc5e8c2d0dd677dc510e15f46b97f9d17ac5e539cbaa880996e9f21202205bb7d219a61b9ee5122ea6803eadf92da0c4c2b2d7584bdb5e6496a56f914684012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 666 - }, - "coin": { - "version": 1, - "height": 299989, - "value": 13100000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 666 - }, - "script": "483045022100fd8d544d9b46f98e4a3d37fbf4bd34baa049e9cc499b7feac1254adab42ad5e6022040105056b2fce27e0593c0783410458934b61b2432a2b786de117b14aa27d552012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "954906d69483f669be155a0da0df2c6a215ef6098847affe70d4d1b733e47472", - "index": 654 - }, - "coin": { - "version": 1, - "height": 299167, - "value": 12920000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "954906d69483f669be155a0da0df2c6a215ef6098847affe70d4d1b733e47472", - "index": 654 - }, - "script": "49304602210098122827483bbee54fe936896f3bb5f157911df9bedba936f00e71da86e201a8022100ff2de68bcc0471837aef2909b3e236442af31dbac2a1658d82a2e20058806dac012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "af468b8cfe46cfadd6b8eac0953e7221994fa9f2dade0009e52750edb450bc02", - "index": 657 - }, - "coin": { - "version": 1, - "height": 299497, - "value": 12840000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "af468b8cfe46cfadd6b8eac0953e7221994fa9f2dade0009e52750edb450bc02", - "index": 657 - }, - "script": "473044022058880ec675058c4da2565a4377f53d216f4dd7eaca7a7e940c664c748dbf382302201aaf27d0b6bc84cdfb826e115a8e5f96f6e0d33c7130939a68f7bc74223af83c012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c1fdd01af7c85d1754cbb5609e8785f1cac67261bd4c62121080f3fddcc9dffe", - "index": 619 - }, - "coin": { - "version": 1, - "height": 298874, - "value": 13210000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "c1fdd01af7c85d1754cbb5609e8785f1cac67261bd4c62121080f3fddcc9dffe", - "index": 619 - }, - "script": "473044022026ec971bcbc9d21d745102b18d51c0d1dc660dcf7c6b49c981b694289402ee43022079d826da85bbccf1e101d3eb0b24acdcb49c7f4c5d752863ed0a9afad896002a012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b66c4d633fd3f96dff48fc032ce633458ecb5a8526930a7e304506b0808e6bb8", - "index": 655 - }, - "coin": { - "version": 1, - "height": 299650, - "value": 13060000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "b66c4d633fd3f96dff48fc032ce633458ecb5a8526930a7e304506b0808e6bb8", - "index": 655 - }, - "script": "473044022021f345f5d0bb0e8c1dfa7493cb37ad4affca6a8195c3edcc68e32b8b7f3c82d602203fad110880a050cf1f68229fec2a1e4882e0d2a7e4d7b2188452be13ba92a27c012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "98ce8f278f2692d6f32528efd2430e96ed0baf51a729999000699acb5bcaf158", - "index": 651 - }, - "coin": { - "version": 1, - "height": 299305, - "value": 13050000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "98ce8f278f2692d6f32528efd2430e96ed0baf51a729999000699acb5bcaf158", - "index": 651 - }, - "script": "47304402200bed344b99f6dd20f3ded810c779b0f505593978a6447fae6b692ca8c7846dce022026e2d73a1168e5161051f2ffb24d314fdf4d5d6e78830e8cfd5e47c09e404e3b012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4eb649ea1c85956a9059e24d41ee0d972572ca4c18aab0d96f1698d94d8b417f", - "index": 672 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 12890000, - "script": "76a9147ebebd3240de0ca288d45e91354327f67773828588ac", - "coinbase": false, - "hash": "4eb649ea1c85956a9059e24d41ee0d972572ca4c18aab0d96f1698d94d8b417f", - "index": 672 - }, - "script": "48304502210082893a88c3dbedde45bc709be4a3bc1c664886164142f01b880b8cd1e41cc21802203ea05778db1785386cf8b6ac0b94d8f9173dc21788790ed410db7b16ceba12fc012102bd453bfeaa9b48ee521d85ff9bdd5b713cd9cad6f063622aed2241624c977888", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 103870000, - "script": "76a9149d3195622f29ca77f84382d03c9f50d1b66ab14588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "7366d9110ef570ccaf33483039fe5822777b387d9f444cd4b213a849eb743f76", - "witnessHash": "7366d9110ef570ccaf33483039fe5822777b387d9f444cd4b213a849eb743f76", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 401, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "42f328d2697615acff34271c78b4975ff2622f489c3ec1d307871b5fa6c57329", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10000, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac", - "coinbase": false, - "hash": "42f328d2697615acff34271c78b4975ff2622f489c3ec1d307871b5fa6c57329", - "index": 1 - }, - "script": "47304402200abac7ddacad100c5995aa04bff4723fcb16d154d25a92cea5247ef39c0db27c022042bea5f4d703f8d56748bfaac5fff07815e7d06fa88bc74b1edbd0b11fb33210014104bfa71464809d4495b30e075ae06ed258066979d4e4073fa82b3e92a51c7a10d9f31872401ed1fb5117c5299d55de005c56d32b4366b4f8c06f08f0219701dddc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cbd7650c55a2dade874b3932c51547280676bade0103e9a8a1c4895631d4027c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10000, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac", - "coinbase": false, - "hash": "cbd7650c55a2dade874b3932c51547280676bade0103e9a8a1c4895631d4027c", - "index": 1 - }, - "script": "4830450220667d7fa7b3ec768e25b9b8f779a54be81daa04341c6e42ee1185ce71bdc9b7ac022100e6cd46857ac61a130943d68d11726cdf1ccedcbc5b5b4730bd4c87e08604667b014104bfa71464809d4495b30e075ae06ed258066979d4e4073fa82b3e92a51c7a10d9f31872401ed1fb5117c5299d55de005c56d32b4366b4f8c06f08f0219701dddc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "21d57c6f0cf8125a35bb0aa8620213ac5256d44ce2b0d65b4a1220a1891b2e2a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3080000, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac", - "coinbase": false, - "hash": "21d57c6f0cf8125a35bb0aa8620213ac5256d44ce2b0d65b4a1220a1891b2e2a", - "index": 0 - }, - "script": "473044022073cc17eab1166bae34bae23f0353cd6fc5a0b55e078ba9c784fe72df653b9d46022016b41d9b3ed60519204272ed721bb7d9fb222a669b35423848e11e939d4471a8014104bfa71464809d4495b30e075ae06ed258066979d4e4073fa82b3e92a51c7a10d9f31872401ed1fb5117c5299d55de005c56d32b4366b4f8c06f08f0219701dddc", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1100000, - "script": "76a914835b0a528ff00bea04da24da24e11518044e1f9588ac" - }, - { - "value": 1990000, - "script": "76a914121a978f8980426a357064eb8f0b2d9d6444a12588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4845defad6a1729d7ac88a50f76935df3871a7095fdc821a060ba3dde81ef201", - "witnessHash": "4845defad6a1729d7ac88a50f76935df3871a7095fdc821a060ba3dde81ef201", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 402, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "38e7a78f55f9221018b9a276928b5a6fc6e48e52bf29931fd948d43a6189981b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 600000, - "script": "76a9145a23a3cde9467dcc9adc1324951729d4e58e9e7e88ac", - "coinbase": false, - "hash": "38e7a78f55f9221018b9a276928b5a6fc6e48e52bf29931fd948d43a6189981b", - "index": 0 - }, - "script": "48304502207070063b78a85757fb39c699e52eb893663a2e28db0b3122e2827871433d44a7022100dbced026257481435a42bc8d98602e0fa61575c16259269e9ef51c629a5ea8e30141041f8325b57d39bd960fd3cd3732e2c6e1d4d6a601478eb122291aa79098a80bb767ed24624fec760d9e058d90c187943bbf3560a267f457b488294e28fc98d551", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "363e5803483b6c5f062c424b73fb967043b1ea04f6925956800a2b345f10a92a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299842, - "value": 1206722, - "script": "76a9145a23a3cde9467dcc9adc1324951729d4e58e9e7e88ac", - "coinbase": false, - "hash": "363e5803483b6c5f062c424b73fb967043b1ea04f6925956800a2b345f10a92a", - "index": 1 - }, - "script": "48304502202ce44e21f2826198a426d72c221121ca473d09cd704987eabd26c1c4e500dd43022100a131ef6f59d7aa31213d2ee3cadd64b109884a89d70f830be86cca1f8a8762ec0141041f8325b57d39bd960fd3cd3732e2c6e1d4d6a601478eb122291aa79098a80bb767ed24624fec760d9e058d90c187943bbf3560a267f457b488294e28fc98d551", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5f1a5794b558aba170a223a7a0a923083a4c8edd43c2ee304373edd8e1d1b034", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299877, - "value": 1873785, - "script": "76a9145a23a3cde9467dcc9adc1324951729d4e58e9e7e88ac", - "coinbase": false, - "hash": "5f1a5794b558aba170a223a7a0a923083a4c8edd43c2ee304373edd8e1d1b034", - "index": 1 - }, - "script": "47304402204bcaf42e2fa51f4d6bbcf5a27b8056ca54531c254e144c532a05b6e3ffbab77c02201829de5516dd9f23aea94d580632de7b3c012d3458204f36e5bcf0588e759b1a0141041f8325b57d39bd960fd3cd3732e2c6e1d4d6a601478eb122291aa79098a80bb767ed24624fec760d9e058d90c187943bbf3560a267f457b488294e28fc98d551", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000000, - "script": "76a91490b9ab91dec16f1e609378a8ddf4c0ba2a7c6dd788ac" - }, - { - "value": 2670507, - "script": "76a9145a23a3cde9467dcc9adc1324951729d4e58e9e7e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "1ccbd36c8cdf1d497b190e13606be80e1ff297fcdccfd5cc74066668e55ad6cc", - "witnessHash": "1ccbd36c8cdf1d497b190e13606be80e1ff297fcdccfd5cc74066668e55ad6cc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 403, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4845defad6a1729d7ac88a50f76935df3871a7095fdc821a060ba3dde81ef201", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2670507, - "script": "76a9145a23a3cde9467dcc9adc1324951729d4e58e9e7e88ac", - "coinbase": false, - "hash": "4845defad6a1729d7ac88a50f76935df3871a7095fdc821a060ba3dde81ef201", - "index": 1 - }, - "script": "4830450221009c5d12617e46207841c0640b70c587cec9d6f2653f88664f23924e77284d018e0220713fa490ce46bed7be55162a1feb52650ec14a56a4eb56dc0c24ab43a033264f0141041f8325b57d39bd960fd3cd3732e2c6e1d4d6a601478eb122291aa79098a80bb767ed24624fec760d9e058d90c187943bbf3560a267f457b488294e28fc98d551", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000000, - "script": "76a91490b9ab91dec16f1e609378a8ddf4c0ba2a7c6dd788ac" - }, - { - "value": 1660507, - "script": "76a9145a23a3cde9467dcc9adc1324951729d4e58e9e7e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3bc1ff9cfe257902b98fd8cfd22c037700dd0ad1c4917fa0d3fc51d9e67c8003", - "witnessHash": "3bc1ff9cfe257902b98fd8cfd22c037700dd0ad1c4917fa0d3fc51d9e67c8003", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 404, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "09becaf4f90a60e7de8fa0f0c2b4169c6928c2e76401bf540109c86b7cb426f7", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 10000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "09becaf4f90a60e7de8fa0f0c2b4169c6928c2e76401bf540109c86b7cb426f7", - "index": 1 - }, - "script": "48304502205cd94b7f3e87f04aefe84d4efc930a02bb077dccbafbadd5370e33e72db80efc0221008755106c0e8e851dd9e3bbc488a2a71c62e5c31f07e684927f4eab84fc800c4601410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "94821654affca7dbcaa76d8fa99701a5cd785947cc4da85c39a2710120ff7715", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 10000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "94821654affca7dbcaa76d8fa99701a5cd785947cc4da85c39a2710120ff7715", - "index": 1 - }, - "script": "483045022020b0efd408139d784bedec0835b978f71410f7cbd406950355cf41d5609b3beb022100feaff63234e46e713d625ccf9bfc2ff9f3fe648bd22ca1e25669ea57a1dec88f01410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1423c09e9b39cde095b27047b85402c346631920cdc994dca8885761acbb2771", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 3655583, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "1423c09e9b39cde095b27047b85402c346631920cdc994dca8885761acbb2771", - "index": 1 - }, - "script": "473044022054867952741dc71b467e1d630e774251e44affa72869cb741b5c31f98a3afa9302204a46ae579aac8d44efc94abba45b9a4b5a5e8a5c1705fe5d973db445824b08e501410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1700000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac" - }, - { - "value": 1965583, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c9c45b678e0a8a1eebe9377d8abcbdcc1936e4f75600635488e97f79c2108726", - "witnessHash": "c9c45b678e0a8a1eebe9377d8abcbdcc1936e4f75600635488e97f79c2108726", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 405, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "3bc1ff9cfe257902b98fd8cfd22c037700dd0ad1c4917fa0d3fc51d9e67c8003", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1700000, - "script": "76a914e4d9de21d4128b92129528f5922ec23101be9beb88ac", - "coinbase": false, - "hash": "3bc1ff9cfe257902b98fd8cfd22c037700dd0ad1c4917fa0d3fc51d9e67c8003", - "index": 0 - }, - "script": "483045022100a9459c2e1f02c6e90a52c38e71d9a961d43eb81dac56b202e48f1f8123f7bbc902206f0a64a669598cc92b8962507e29b7f0dc58c311026380c6a39fcb257a8b073c0121037bedeab7fcb8f05bc5fca2bb43525bd7af9f125035149ab4f48843db0ba37c8f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1680000, - "script": "76a9140cc7a4cb0d42a97ad29cfc0a49f955d78bd0362388ac" - }, - { - "value": 10000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "6e4f0ec2e2e89a76a1be0b3c88e0a0467a0ccd15861b807f424c5f99dd8a70f5", - "witnessHash": "6e4f0ec2e2e89a76a1be0b3c88e0a0467a0ccd15861b807f424c5f99dd8a70f5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 406, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "63941799ebd8cf7ba8c5bec7a75e99ae983951af1194d6aea50640484d93ff83", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 1640000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "63941799ebd8cf7ba8c5bec7a75e99ae983951af1194d6aea50640484d93ff83", - "index": 1 - }, - "script": "483045022100b1e8a3dc70ea31d6d60dbce9c57bbab0ba89ce3f85938efc21e371d39b33ff3b022060b3a18a810add684c8acf3863cce5264f6f8a5b9f786f2f8585b78affb7c1a501410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9b653ddea62de87fb8ea9f25e63d7145211b5489402f3556464fd0338768a479", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 1190000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "9b653ddea62de87fb8ea9f25e63d7145211b5489402f3556464fd0338768a479", - "index": 0 - }, - "script": "483045022079a6207727ab035242d05ec42543230c1c73fea241e7a9fef6d35c8951bd448a0221008adaf4c7ab7af1598a78ccf85dfea470577b34b79246cde34b3c98879f91b7c601410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "70a3a1d666ef8e501990a6dab8c58d5e56ed95c2d3eeefd7186abb9f478cae13", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 1555000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "70a3a1d666ef8e501990a6dab8c58d5e56ed95c2d3eeefd7186abb9f478cae13", - "index": 1 - }, - "script": "483045022100a28f5cd36b32c6e998f488955d8e3fcd9bfecbaf29a467be8f9dc85c86207dd20220425e3bb1406132f12717b3f50662a8355328a5b8aa378e8ff26ee7db8a6db48801410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2800000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 1575000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d567fabd3dd262b8b263ce479c2ab3d3877ca7433c0c470650fc529d21450582", - "witnessHash": "d567fabd3dd262b8b263ce479c2ab3d3877ca7433c0c470650fc529d21450582", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 407, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6e4f0ec2e2e89a76a1be0b3c88e0a0467a0ccd15861b807f424c5f99dd8a70f5", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2800000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "6e4f0ec2e2e89a76a1be0b3c88e0a0467a0ccd15861b807f424c5f99dd8a70f5", - "index": 0 - }, - "script": "483045022100db9fb9c2d11c05590e0b54c121985d5720956de950e772f78ac24a5c3dc1950102204c6633f42068ebeb478eaa5dbb94bec2c1c10df953305f835d9415ace8e1a6d60121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2790000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "adf4a990f1efd92696da227159e80433478b77dd2125c3d712ac7077be541695", - "witnessHash": "adf4a990f1efd92696da227159e80433478b77dd2125c3d712ac7077be541695", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 408, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1a1d2be01d2a0093ee3bb16c3e42decc8102b17f6b6d661c1b4d8682c880caca", - "index": 1 - }, - "coin": { - "version": 1, - "height": 295638, - "value": 3325, - "script": "76a9144a326316cdbc9a22bb23a569287e4e32b82eb7a688ac", - "coinbase": false, - "hash": "1a1d2be01d2a0093ee3bb16c3e42decc8102b17f6b6d661c1b4d8682c880caca", - "index": 1 - }, - "script": "493046022100de526d85c9e4b2b565c67de926b24b88ad8a66ffbf3522e606e2abaab53684ce022100bdc634abaf7f25cfd40f42cad3cbed4d6f4d6eab703e31498a5a3e04fa6508080141045d5e4096cfab6d184bed5183c7633074dc4cdcdaa380cce6be809bfcf641ebca30b27b5022165e56bf31e882a090df696b2a62cc2da7f7182ee8d423dfb9034c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c59e828223bb083c3d2857c5cebbf763489c83c064245026ec4ce5abf8ee76e9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297309, - "value": 10380000, - "script": "76a9144a326316cdbc9a22bb23a569287e4e32b82eb7a688ac", - "coinbase": false, - "hash": "c59e828223bb083c3d2857c5cebbf763489c83c064245026ec4ce5abf8ee76e9", - "index": 1 - }, - "script": "49304602210086538a305166b9016f8908f8ec9207398d3aa6d2e04c551bc759276d4d9da405022100e7dbde7cee496e2fe990243aa2e985b0d0c18add384af8708775a4ab9cdf258c0141045d5e4096cfab6d184bed5183c7633074dc4cdcdaa380cce6be809bfcf641ebca30b27b5022165e56bf31e882a090df696b2a62cc2da7f7182ee8d423dfb9034c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e8b0ef45bd114a2a8f5e4a7a183f298063c3705225d3ca0ee1d2ef059ba5fa65", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 46090000, - "script": "76a9144a326316cdbc9a22bb23a569287e4e32b82eb7a688ac", - "coinbase": false, - "hash": "e8b0ef45bd114a2a8f5e4a7a183f298063c3705225d3ca0ee1d2ef059ba5fa65", - "index": 1 - }, - "script": "4730440220274a7da5e70f721d6892277c9b39bf212a9f4bd539eb653c82b89a070b3a6041022068d052ad184106113d0f3ea18b706f930b2a22007cfb6612f1f78b6b66b471c80141045d5e4096cfab6d184bed5183c7633074dc4cdcdaa380cce6be809bfcf641ebca30b27b5022165e56bf31e882a090df696b2a62cc2da7f7182ee8d423dfb9034c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 55000420, - "script": "76a914f5de083f859cfb4b06021c6e4fb52135c99442a588ac" - }, - { - "value": 1462905, - "script": "76a9144a326316cdbc9a22bb23a569287e4e32b82eb7a688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "78d955590ef9e4bb73609820ccc02ba89d580c93c84c94f0c3a2ba256116c296", - "witnessHash": "78d955590ef9e4bb73609820ccc02ba89d580c93c84c94f0c3a2ba256116c296", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 409, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ed6d476daf7aae7f5b2f2ac559fe6e121932956ad32381c14dde7bbbaa20f424", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299618, - "value": 82578, - "script": "76a91440007f40140f77435f0cdf53018696db1c0a650e88ac", - "coinbase": false, - "hash": "ed6d476daf7aae7f5b2f2ac559fe6e121932956ad32381c14dde7bbbaa20f424", - "index": 1 - }, - "script": "483045022100a920137476ab00e96648fe8fa45315fb30fc14406696c9fbbc1b14dac9fb95bb0220530d8db38067ca8c8997e1462814fee7552f575653249811904059095d711bcc01410466972e76a3953e6f6125a7f1899e176ef45abb0607a559c154f0ea1cbdf5ea9a0f2e1bc10dbaa1190b0ad2ac065206340ef4d7b3817fa4fac3c0b76eab6f9392", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d5b0519b2e7cbdf159fc4f1d8eaa974af9fef805d4e08a6598aa60026c9d4647", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299966, - "value": 1186470, - "script": "76a91440007f40140f77435f0cdf53018696db1c0a650e88ac", - "coinbase": false, - "hash": "d5b0519b2e7cbdf159fc4f1d8eaa974af9fef805d4e08a6598aa60026c9d4647", - "index": 1 - }, - "script": "483045022100f208e73734f1fdd97fb2dbdaad73e7f11f26480b6fb4bbba3010bc15b47a290302206703535825bd243fb677c334f73679cdc2ce890e5ceeb141eaeb9dec5b1f04c901410466972e76a3953e6f6125a7f1899e176ef45abb0607a559c154f0ea1cbdf5ea9a0f2e1bc10dbaa1190b0ad2ac065206340ef4d7b3817fa4fac3c0b76eab6f9392", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2a936eefb5ce285e9f651c822003d5a2c242c781a6a95f82de913405762ee873", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300001, - "value": 93845000, - "script": "76a91440007f40140f77435f0cdf53018696db1c0a650e88ac", - "coinbase": false, - "hash": "2a936eefb5ce285e9f651c822003d5a2c242c781a6a95f82de913405762ee873", - "index": 4 - }, - "script": "49304602210084c4294026591f42cc3252b8d41e5ac8c6d7243f2537986e2c6610759906e14f0221009c32dd58e4c9cc3a18327787b4a68050ad8442043f486436bc01f1d1ad03900d01410466972e76a3953e6f6125a7f1899e176ef45abb0607a559c154f0ea1cbdf5ea9a0f2e1bc10dbaa1190b0ad2ac065206340ef4d7b3817fa4fac3c0b76eab6f9392", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 94717828, - "script": "76a914719c457b5d1bb1579c36fe6118a35b00a4a12e7d88ac" - }, - { - "value": 386220, - "script": "76a91440007f40140f77435f0cdf53018696db1c0a650e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "47c8bd81046d92f3452eeab8bac9bdc40c75936ef09365d825841ac7ca47f1d4", - "witnessHash": "47c8bd81046d92f3452eeab8bac9bdc40c75936ef09365d825841ac7ca47f1d4", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 410, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "8c012c1f7215a8f349a762108617c1f70931954b4a876a83dd10633f7c4dc581", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299428, - "value": 90000, - "script": "76a914292e209d298d032db33bbf7630b12d3fc2e6467888ac", - "coinbase": false, - "hash": "8c012c1f7215a8f349a762108617c1f70931954b4a876a83dd10633f7c4dc581", - "index": 1 - }, - "script": "483045022100e393a0bd7e525e5902a02a7bc5f0e068e78e35769c4432c603661b9ffe54e3ce0220353dc575c00e6c01ec04fbf744dcce2322713e62114de860648c99df362564d7014104040420a47a1c1e0f036b9bcdc27a65cb0984b242fca002c062fd1e9d65511ee2eff20b920a3af9b9179007c21e1d8622278c3b8e48372aad90ce098af9608877", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bac4c4f77ea5fbe7153f77202938367b5e675575792a5365ddaea90bbb198262", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299904, - "value": 1590000, - "script": "76a914292e209d298d032db33bbf7630b12d3fc2e6467888ac", - "coinbase": false, - "hash": "bac4c4f77ea5fbe7153f77202938367b5e675575792a5365ddaea90bbb198262", - "index": 1 - }, - "script": "493046022100a843216215697291a9f9e3979af34e99bacc7c6040ff7f12818f010a536d4395022100850b691aa9fcf54abd81751e5533b11607ad783e80d6cb40d8a3f8279e9c8382014104040420a47a1c1e0f036b9bcdc27a65cb0984b242fca002c062fd1e9d65511ee2eff20b920a3af9b9179007c21e1d8622278c3b8e48372aad90ce098af9608877", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2e8571f58adfcbb3e6ecdd62ae76494e1cd9b3a22e2944e03309f5f2b71ac1c4", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299987, - "value": 1590000, - "script": "76a914292e209d298d032db33bbf7630b12d3fc2e6467888ac", - "coinbase": false, - "hash": "2e8571f58adfcbb3e6ecdd62ae76494e1cd9b3a22e2944e03309f5f2b71ac1c4", - "index": 1 - }, - "script": "48304502205a428f100183920a3d2a25b422bf74f284c118cf0e7af8c3c3a638543f9f6b61022100a6f23f80e7585ec6b9bb2e575e0be1120f5110d780fd7e56bd839ed7a61bb65b014104040420a47a1c1e0f036b9bcdc27a65cb0984b242fca002c062fd1e9d65511ee2eff20b920a3af9b9179007c21e1d8622278c3b8e48372aad90ce098af9608877", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2500000, - "script": "76a91404305c6da9ae49b91469f19fa8930a05b436c2f588ac" - }, - { - "value": 760000, - "script": "76a914292e209d298d032db33bbf7630b12d3fc2e6467888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "23df19b39310369364fe62ae1bc9036bbd93183906fff659bc60e6e84f7a5350", - "witnessHash": "23df19b39310369364fe62ae1bc9036bbd93183906fff659bc60e6e84f7a5350", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 411, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e444436c9f41eb45043bc0f48d7b8b780b6547ae05d1256a7fd34df6c93669e0", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299879, - "value": 125076, - "script": "76a91456d399b3d328484138cb302c9a0148d5c3a6ff6788ac", - "coinbase": false, - "hash": "e444436c9f41eb45043bc0f48d7b8b780b6547ae05d1256a7fd34df6c93669e0", - "index": 1 - }, - "script": "48304502202c073a7ee6b1fa8a778a8432469d32ddf942557afc042078b9c9e09051a6e8a9022100ed2068a7a5a6f1391bef455243867b2d9e57512019fe2082d8e027db5800ece60141044c504815968d2226a0dcac740b203951d5faa9854e8055204ef6c44569460292e5f8c1a88953aeae27475a0163a812e573250945d2b1676d7c1dd3a37dbf2aa3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "edbbfde0d80075e52da78c304bbb0d9c28d8a9f905f99105a517a5ffb5224d7d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299881, - "value": 10000, - "script": "76a91456d399b3d328484138cb302c9a0148d5c3a6ff6788ac", - "coinbase": false, - "hash": "edbbfde0d80075e52da78c304bbb0d9c28d8a9f905f99105a517a5ffb5224d7d", - "index": 0 - }, - "script": "493046022100e7055f8ddc5d068496a9dbc2596c8778aed6112c49eb8d9f58003507d868f92e0221009524c0843b194b6fa60573308d9b3d6eff08fe3ef42e20c8270b8e78bf86de620141044c504815968d2226a0dcac740b203951d5faa9854e8055204ef6c44569460292e5f8c1a88953aeae27475a0163a812e573250945d2b1676d7c1dd3a37dbf2aa3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "94a5241c4eeda717a58d557e456697419cfa77fed8cb9e507452d9229bfaab05", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 30000000, - "script": "76a9142fe47b5c3d8088d9249fdd2cfb9969ef46946bc088ac", - "coinbase": false, - "hash": "94a5241c4eeda717a58d557e456697419cfa77fed8cb9e507452d9229bfaab05", - "index": 5 - }, - "script": "483045022100caac4b1c83cad903166b9ce6d58b939d0cd7cdefc07ca3a888552c1adf314dc00220540bfd02de6bccbcadb257159845447a4dcef285650231ad746fb9c45f1552c60141049d7fb3db416e09c7aa47daaac3a6f2ddd549e8b5b64e58f0ac7a266a535fdf5985f23581c259ff4c9e6a6f5e0a42e802b4f992b05920475e790085cc12982250", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 30000000, - "script": "76a9146f43e84e2c462dffc13b43df21981949d13de89888ac" - }, - { - "value": 125076, - "script": "76a91456d399b3d328484138cb302c9a0148d5c3a6ff6788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "bb1e3209b494b674237de2d8fc8a4902b4e2fd6c42d57365136011fead6a312f", - "witnessHash": "bb1e3209b494b674237de2d8fc8a4902b4e2fd6c42d57365136011fead6a312f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 412, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "1ad931bb0d0781dfa46bd8dd3c6f241108d1e49cc80d61ce52cd610cdd013258", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300009, - "value": 1820000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "1ad931bb0d0781dfa46bd8dd3c6f241108d1e49cc80d61ce52cd610cdd013258", - "index": 1 - }, - "script": "4930460221009e0d8197a0454e43afdd27e1d76b070b53f1a20bf8e8e61ef2330bded226c410022100f7b18dc3be0c6152da944184aaeddc5df4010e19c100cf125c82e23102c8534201410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dd66b6ef77a3b3f72a31921f659371d1e0be8a1e2df607bc50313f8c29de2d97", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 10000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "dd66b6ef77a3b3f72a31921f659371d1e0be8a1e2df607bc50313f8c29de2d97", - "index": 1 - }, - "script": "48304502206b5d3564771edcd8c61d491e2a7ff4099c665df9874d43254faa3088e428b1090221008f95e15ef7e857a44b06eae2c8ec00ebdbcc9fe7eba0b8c45b0c5897503a70f201410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "34cdfb8a56099d3e72e7f54179273e99fcbd58fbb4b72a44b73730ce0e2649ce", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 1780000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac", - "coinbase": false, - "hash": "34cdfb8a56099d3e72e7f54179273e99fcbd58fbb4b72a44b73730ce0e2649ce", - "index": 1 - }, - "script": "48304502203fc08b9dfb9ba97452d6c5c532169d88f5d359d242f1c20d0b13d5fc89698e5b022100a109ac371524c01f0540fde1637bbe56fb9a889aff740db5ffb1eb910da0c0dc01410448a7b4e3ec44fc73d42a566b8e2f92948765d32049c360cc8561ac63c455c7bac53da724164046c4bf7f1c8d25b3301acaf5c987c4047a83a82417f5e2be67b7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1900000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 1700000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "05473a1714b82763591a4c2549c845e2ffcbe3c56326f672f8bdd1a3d55b2a5a", - "witnessHash": "05473a1714b82763591a4c2549c845e2ffcbe3c56326f672f8bdd1a3d55b2a5a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 413, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "bb1e3209b494b674237de2d8fc8a4902b4e2fd6c42d57365136011fead6a312f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1900000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "bb1e3209b494b674237de2d8fc8a4902b4e2fd6c42d57365136011fead6a312f", - "index": 0 - }, - "script": "483045022100da7a2b790db754f6a78f23198eafd6ad37f29e586edac722088bdb492a48016702203708443a0158d33fa136345dc44a3233147fb67bcaaa3715ee08424145c36b8f0121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1890000, - "script": "76a9144dccba2bf57f8d639f30a0f77d62fbcfa5290e7488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2596c9633ae8fe573278e48fe7dfda751e5f8b630234c69c75e5e398da127397", - "witnessHash": "2596c9633ae8fe573278e48fe7dfda751e5f8b630234c69c75e5e398da127397", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 414, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2f5c7a8afd7a00fca6b747754ce904978e8f5966fd3dac315a817e26e646e4fb", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 3325000, - "script": "76a9143ee4ffe242d35ca3e4ea053dc78f02a7fcc0341e88ac", - "coinbase": false, - "hash": "2f5c7a8afd7a00fca6b747754ce904978e8f5966fd3dac315a817e26e646e4fb", - "index": 1 - }, - "script": "483045022100ba164f97978fbed50613bded8bd38ff6a0cf9f155e0eb23903e7d4755223d34602206d5c1603f382eddb47481af46cf4a2174576b61b8db404e37b86e652e880ecad014104234dda6f8ed186102cc545b1a96df1e05f156bfdd4c77eaa44ab718cbae96f9a987adf2bc7b0e51e842dc89ca016fc25745911354a201facd5ee5cab49b981b2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1991d117785fc3ecc712de706828d17a80fd900f4ec25043014a7ee9b86fc465", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 10000, - "script": "76a9143ee4ffe242d35ca3e4ea053dc78f02a7fcc0341e88ac", - "coinbase": false, - "hash": "1991d117785fc3ecc712de706828d17a80fd900f4ec25043014a7ee9b86fc465", - "index": 1 - }, - "script": "493046022100d361bbb9c31f006e391e48a407bffe45fd4346776944facc9028af0646a5b680022100f5fbcdbbb71b5de0116784d0a62565fe081ff1d4cc9adda713bca5bf2867e0bb014104234dda6f8ed186102cc545b1a96df1e05f156bfdd4c77eaa44ab718cbae96f9a987adf2bc7b0e51e842dc89ca016fc25745911354a201facd5ee5cab49b981b2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e61faabc2a8b2d23b6b376bfc219431c5968cd8a78d6e537633a8c78eb187858", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 10180000, - "script": "76a9143ee4ffe242d35ca3e4ea053dc78f02a7fcc0341e88ac", - "coinbase": false, - "hash": "e61faabc2a8b2d23b6b376bfc219431c5968cd8a78d6e537633a8c78eb187858", - "index": 1 - }, - "script": "483045022100aea10a365eaf8eb2604e8322cb0aba5afa8a73bc8be0b5da3e7f41939a20cae40220181dc995be5f24510a56b64cd7039059b6c6e6cff6663fd823e2245f27d313f6014104234dda6f8ed186102cc545b1a96df1e05f156bfdd4c77eaa44ab718cbae96f9a987adf2bc7b0e51e842dc89ca016fc25745911354a201facd5ee5cab49b981b2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2800000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac" - }, - { - "value": 10705000, - "script": "76a9143ee4ffe242d35ca3e4ea053dc78f02a7fcc0341e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3fb7ebfbb23edd275807130ab5d092a3c1e78703fd079d65b24ea2a16ddcf2b5", - "witnessHash": "3fb7ebfbb23edd275807130ab5d092a3c1e78703fd079d65b24ea2a16ddcf2b5", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 415, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2596c9633ae8fe573278e48fe7dfda751e5f8b630234c69c75e5e398da127397", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2800000, - "script": "76a914a48b825a1a10309dcbaa0441b623eeab0cda273588ac", - "coinbase": false, - "hash": "2596c9633ae8fe573278e48fe7dfda751e5f8b630234c69c75e5e398da127397", - "index": 0 - }, - "script": "483045022100f9e16e4c75d64ddca0fcb9a16aff029afbb9ad29fb57187970559c7a0293422402202b2e0a55decfb07db042b8abc632775b76bedd4e73ccf00b7a0aad8c7552640a012103082934de52ac6d2d5f0806d5ad5bd240e7733d75952d2cb06ba4b782ca4ed0d6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2780000, - "script": "76a9143dfeb05e14625b32bfe7be9c5454e599dc2d74b788ac" - }, - { - "value": 10000, - "script": "76a9143ee4ffe242d35ca3e4ea053dc78f02a7fcc0341e88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5f21a6529eea61bee04386318caedd18282c77b2e257821fc3d258befc3b9f43", - "witnessHash": "5f21a6529eea61bee04386318caedd18282c77b2e257821fc3d258befc3b9f43", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 416, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "669b50ed77b11217122bdd22528d50f40456ba8d6a0ca7046340f1f40dcfe44e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac", - "coinbase": false, - "hash": "669b50ed77b11217122bdd22528d50f40456ba8d6a0ca7046340f1f40dcfe44e", - "index": 0 - }, - "script": "483045022100f43129c3dc958c2d94dfcc645c8e8bc5b7fe6d83e139eb138157a1990a6cf44a02205d15542d523784e11b192a50621c74e2dad5c004a072c9099615823c16dc2add014104e104b1a7cdb22d7ee5acf80865fb952360ff0af8498a7d141a5fe4d33742ecfa42ec49ff4eb8313b57cefea35b9e916cb39fa1405b3b8944f369220094bbb3cf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "209cf32afd54f3ac3cb8281361672c6c93e9cd79086bfcb9605f0b548a614856", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 10000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac", - "coinbase": false, - "hash": "209cf32afd54f3ac3cb8281361672c6c93e9cd79086bfcb9605f0b548a614856", - "index": 0 - }, - "script": "49304602210085679530b03801746ecdd4296adaeaecfc5ab5be3c1c5e7b559de899af4fe712022100b8f1c3046f69f7abf8491377dbd82267c5d5b9540a5a8816294aa0b40e1fdadc014104e104b1a7cdb22d7ee5acf80865fb952360ff0af8498a7d141a5fe4d33742ecfa42ec49ff4eb8313b57cefea35b9e916cb39fa1405b3b8944f369220094bbb3cf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e8b6d97295a4e7f4ce1748d486fb653cfc31eb5e6bef2e9bc929a40f5107ceea", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 3850000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac", - "coinbase": false, - "hash": "e8b6d97295a4e7f4ce1748d486fb653cfc31eb5e6bef2e9bc929a40f5107ceea", - "index": 0 - }, - "script": "483045022100af977847d57d036ed73563ae6aeb9ba9578446446a14f21633017222df540e70022039eae3a8c2d99c92909f8a287df7545ec6745e6ced9d72f662425464c64dedb6014104e104b1a7cdb22d7ee5acf80865fb952360ff0af8498a7d141a5fe4d33742ecfa42ec49ff4eb8313b57cefea35b9e916cb39fa1405b3b8944f369220094bbb3cf", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2800000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 1060000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5d7d97093c1bc4f1b7502d5b8a57345557f8bb3a43f65b1c59ed27ee5688358e", - "witnessHash": "5d7d97093c1bc4f1b7502d5b8a57345557f8bb3a43f65b1c59ed27ee5688358e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 417, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5f21a6529eea61bee04386318caedd18282c77b2e257821fc3d258befc3b9f43", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2800000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "5f21a6529eea61bee04386318caedd18282c77b2e257821fc3d258befc3b9f43", - "index": 0 - }, - "script": "4730440220188a5e7e736dfe398367411ba5d6fcf1e416ff7cad8eacab2dea91ac1fd6e07c02206ea3eaa6e8410e889a7d20749b4baf0468cab635880dac3b69d243296662f2890121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2790000, - "script": "76a91484f8e86e0c5b63d57f3c05e3e0152ce40e86020088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9f3161fd83c30070ca715b7e1f3f7edaa8542f6c1b04e3658b3a6985ec3c79e3", - "witnessHash": "9f3161fd83c30070ca715b7e1f3f7edaa8542f6c1b04e3658b3a6985ec3c79e3", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 418, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "833134f7294b463140285526461b962c366316c594dbdad156eb1e8506f90b48", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1700000, - "script": "76a91439487a1300ef94b72b8f72cf81d6eef17550a4d488ac", - "coinbase": false, - "hash": "833134f7294b463140285526461b962c366316c594dbdad156eb1e8506f90b48", - "index": 0 - }, - "script": "4730440220235f22a1ba0db24fd52e4fcb2573a99b8027f91b8bf8bf699f3fa9ac8a53e3080220133c1fbcbaa1f0e09710e8e1db26a20ff92105bb8947efb50149706612055a36012103afd34045d7080e5f3d8fc0efab187951caed4b06571c7cc617d01d9abe8b36b5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "29fdee8fc1dcd2240f6066a0bd636aadf4d7a394a687d74aa0f17643f70dd056", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 306167, - "script": "76a914f42f924dbad1de266f02d1c5054085a0527da61f88ac", - "coinbase": false, - "hash": "29fdee8fc1dcd2240f6066a0bd636aadf4d7a394a687d74aa0f17643f70dd056", - "index": 0 - }, - "script": "47304402201a565adf1e3435d38069c13e4cb705fc76e7877a45f848b1c13fbb337365794a02202c3c172485565704fca5c596ee53b30eb6a1be077815018fcddf14cc295fde09012103f53c59c6119fc8584763dc3ae50e10c0dc71573cde9a4c80497d037592241e17", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2aa2c5588031bf7a21509f7a3b0718d0efeebcd4b52def0a24e047139ed8cb9b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 415004, - "script": "76a914788de3e892875e1652dfdf9bf9677b84086e415388ac", - "coinbase": false, - "hash": "2aa2c5588031bf7a21509f7a3b0718d0efeebcd4b52def0a24e047139ed8cb9b", - "index": 1 - }, - "script": "4730440220503d11f1c6d04843efb9d4ef4b814ed79b9af457de76b87d5cefd9ee3bfce6ef022048abe9164f29440580b44e7b220beb398a559138af0541ef2e52cc61af4a71660121039825548e7935988a268c4f56a3f42a9ca18a78f75089261bca28a5fd57020e99", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2f5c7a8afd7a00fca6b747754ce904978e8f5966fd3dac315a817e26e646e4fb", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 945128, - "script": "76a914fb2cc2d580e8db8440810e9f4ba58ea8f86b59a188ac", - "coinbase": false, - "hash": "2f5c7a8afd7a00fca6b747754ce904978e8f5966fd3dac315a817e26e646e4fb", - "index": 0 - }, - "script": "483045022100e2593a7607b2f4db61c25dd48592ccb055c73fa6c9d180677e1192fcdc98005d02206e7204e41e8248b1501b47336319b15883cd9d15b47edbed5558d1df8a6ca30f012102bcca29223dd34858f5ca1e2c6513258455d6763e42a113c2ac46216fa9224dd1", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 381299, - "script": "76a914f42f924dbad1de266f02d1c5054085a0527da61f88ac" - }, - { - "value": 2975000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "eff4cc10df0bf0c5fb76fa58e388b7255dce8e19b1db8e2440dbf635236311fc", - "witnessHash": "eff4cc10df0bf0c5fb76fa58e388b7255dce8e19b1db8e2440dbf635236311fc", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 419, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "530f4e3ae27b5ece4a63e38096de02d6ad8aa65af7bfbcc053c4268067053e35", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 10000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac", - "coinbase": false, - "hash": "530f4e3ae27b5ece4a63e38096de02d6ad8aa65af7bfbcc053c4268067053e35", - "index": 1 - }, - "script": "493046022100f34770188ed5ec96687b825558b0cac92e354cd3016f7c42a5c85dfff9fe18d7022100e371cc886e03bd1c3652ee08249857bedec71c53afce351608b92c7ff4cb2de001410408e0b2378aa23e30a4de4774fdf540f6a72449c99d29ace5a07ef04537dbf29504b7c4c4d5f82a0f949a7f039e386d68a3f1d04da7c86988311ae7ac824c9cb7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ca7a6cbad1676b3b096be7584af7ebac5d2c5ff5542f271a230377778f115b00", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2450000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac", - "coinbase": false, - "hash": "ca7a6cbad1676b3b096be7584af7ebac5d2c5ff5542f271a230377778f115b00", - "index": 0 - }, - "script": "483045022100e20d5bf6192577a58973f7452114abb51d1f328fafce2021d0f91690eaf5ba66022019b9336ba539aaf9116317c3720739e2c14e2403ddc4e7d683e2b13518e8676101410408e0b2378aa23e30a4de4774fdf540f6a72449c99d29ace5a07ef04537dbf29504b7c4c4d5f82a0f949a7f039e386d68a3f1d04da7c86988311ae7ac824c9cb7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9f3161fd83c30070ca715b7e1f3f7edaa8542f6c1b04e3658b3a6985ec3c79e3", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2975000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac", - "coinbase": false, - "hash": "9f3161fd83c30070ca715b7e1f3f7edaa8542f6c1b04e3658b3a6985ec3c79e3", - "index": 1 - }, - "script": "473044022055017abd4677dd1cf5cc3e45ac1e2535034cf097ef678ad2ed704dab1a940fb202206923f2fe5af568aadbe1cb9c44398c593f96b56bbd1d58abe04d2196b9a2c47101410408e0b2378aa23e30a4de4774fdf540f6a72449c99d29ace5a07ef04537dbf29504b7c4c4d5f82a0f949a7f039e386d68a3f1d04da7c86988311ae7ac824c9cb7", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2400000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac" - }, - { - "value": 3025000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d7af7189e0413f0a8a3196c88eeae139cda6ebed7c3bf7c08e935fa0a522e9ec", - "witnessHash": "d7af7189e0413f0a8a3196c88eeae139cda6ebed7c3bf7c08e935fa0a522e9ec", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 420, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "eff4cc10df0bf0c5fb76fa58e388b7255dce8e19b1db8e2440dbf635236311fc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2400000, - "script": "76a9149d3f4d63e5e219a8650adbfd4988a440c36151bd88ac", - "coinbase": false, - "hash": "eff4cc10df0bf0c5fb76fa58e388b7255dce8e19b1db8e2440dbf635236311fc", - "index": 0 - }, - "script": "483045022100b6931d6acedc18af238cd113e11c222680735db5eb27f6d7c81fe7587ba0cbba02206acc26a7bd167d321595182d89394b394371be9a16dbad53d939a7fe5d179d430121029a286ed95f951c9f08fde917484676b2a7578f16f16b86fd887f124995de4f5f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 2390000, - "script": "76a914c155bbf97a7e153008badab6e745184614e8426588ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "f5bbb1351ab5c53ef1543d87fee9abc124d81d6247679bc6b24ff2c10db15b87", - "witnessHash": "f5bbb1351ab5c53ef1543d87fee9abc124d81d6247679bc6b24ff2c10db15b87", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 421, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "d6ab1f1e1ba112447b8b06a0fb676b62986bffe0ba9af4e6137587a5782fb074", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299971, - "value": 19980000, - "script": "76a9148a230ee7f9252c2ec48795c10d967d5e9674771088ac", - "coinbase": false, - "hash": "d6ab1f1e1ba112447b8b06a0fb676b62986bffe0ba9af4e6137587a5782fb074", - "index": 0 - }, - "script": "4830450221008f9b291abc83c20479583bb9415cc4e7f6d9334565a3f1057f8a13a08dfdf0cb02207dc6a109c61cf36cba267d71d46d840c3602d0afe66fe67110a08e300ffb9b7d01210375a4f74749c455762283c130b3f4be76ecb328835065acdfc7f30cd0fdbab720", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5b0d7a2c20f79870db3fb40442a712e560677d7b9e002f0f9260e1e223dbd821", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299960, - "value": 6000000, - "script": "76a914ab745fc00ba0c8f3dd40999650a2527749f0fe8188ac", - "coinbase": false, - "hash": "5b0d7a2c20f79870db3fb40442a712e560677d7b9e002f0f9260e1e223dbd821", - "index": 1 - }, - "script": "473044022045e6b7cbdb1502b192ccbdbb1fc98b34aee09a168b2cb06bc91608d4ae459e7a022052e6823336505c999040bd9a27fe4f05d07962225be475d20c9e02cf85cf4026012102977ed868dd339c73e7816aaf412b6cfbda9fc1cfade3dfa0d8e918dea002c45f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f4e8a9c9202c1942985e8faa4522b80e7c6803b2fe87ef1e8f913eeb0316bcad", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 9990000, - "script": "76a9148b108c319344c6fdcf2232acff475d5876f3c89c88ac", - "coinbase": false, - "hash": "f4e8a9c9202c1942985e8faa4522b80e7c6803b2fe87ef1e8f913eeb0316bcad", - "index": 0 - }, - "script": "473044022022b6db44c782320951f823688774e7b622290518fd7a73e589c604ab1f6a2ab2022044f8c3704505f7ea6d1b2b5be874bf738f46b7ec1d683ca199784b167191dc61012102768d86fc99754f8574fe91a0150fd4c9e44938474449f4773e96dae93b37ba85", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4a1124959551d9341e8251e583e941eebcc03f18bfde95a095934d3efb952ee3", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 6000000, - "script": "76a914ab745fc00ba0c8f3dd40999650a2527749f0fe8188ac", - "coinbase": false, - "hash": "4a1124959551d9341e8251e583e941eebcc03f18bfde95a095934d3efb952ee3", - "index": 1 - }, - "script": "48304502210096abbf805663f338910c39dc4d4678c33cb40e0b5210e6ff6d296f017040150e02202421c512844cf9aae3144ef4796f86c6423851a465b7dd892941028614d14a1e012102977ed868dd339c73e7816aaf412b6cfbda9fc1cfade3dfa0d8e918dea002c45f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1515192, - "script": "76a91476709fe3e30c6d691677c4d289964474922c4f6288ac" - }, - { - "value": 40444808, - "script": "76a9143661433ac657d59f5fa3f6b2cb903b67f6a0b6da88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3d6241e48e7f8869ef21044bc396f526e0c59b1e4a121b2f38f82872fc18ef64", - "witnessHash": "3d6241e48e7f8869ef21044bc396f526e0c59b1e4a121b2f38f82872fc18ef64", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 422, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "867f5e4a6a5937789107a65df2623e0ccab65591711660a3c556202859d319cc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1216928, - "script": "76a9148a44eae0b80e6e59144906649df82794077690b888ac", - "coinbase": false, - "hash": "867f5e4a6a5937789107a65df2623e0ccab65591711660a3c556202859d319cc", - "index": 0 - }, - "script": "4730440220519cd5739d2691664551f097a0b7b4d6d4af0542ebf1414b7cbeab28a50dd94802200228c4aad56e9ba13100b3c766bc09ad9b05310be09c3440e3f819c7220ea7dc012103c2727b202a8a02d5e9898df8437adb2a4574c830aebacd5121fbc017332fdd57", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bc00a2ce19906c12f999f86997dc66bb675c4ea6dd738867d4b323800ff42f29", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299990, - "value": 9940000, - "script": "76a914386f6d320e2d67ce48f3de940a149e72472c5c4b88ac", - "coinbase": false, - "hash": "bc00a2ce19906c12f999f86997dc66bb675c4ea6dd738867d4b323800ff42f29", - "index": 0 - }, - "script": "483045022100e9ad89f05420a4e6851841f55436051f7b2732ab5325e6b142804c839b6fdf33022023ec2ca587adf9953491809eb66b6e73b35648eb7d77fc46d7060b4fbf1beec50121024ab35d9780005e89b5f19d1e2a363bf542719cd716cc3ec11977bf65201100f7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5e2d00a93760438cac0f040c56c9f924c0aa4fb64b4b2606d4eec2e7c7f1a444", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1265102, - "script": "76a91488d2c3f6fa466fcd8543543c24f6f521b91fe47788ac", - "coinbase": false, - "hash": "5e2d00a93760438cac0f040c56c9f924c0aa4fb64b4b2606d4eec2e7c7f1a444", - "index": 0 - }, - "script": "483045022100c3742969f1138716f619f21e2691f31f0547382129bbb0d0f6eacb4f8a70084e02201b3da7b3336315aac95dad0cddf467bc4b300627847f50b8ffbcec8c6451f8610121033818d003072db940b9ac8b12f86a1a1a544ff45fd3834c9d97cfdbb24535bcc4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3d2faeb23296b10cdb6073b7d12037890a1d4d27fdb18cb9b2e6298a3eb1d1dd", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1432089, - "script": "76a91487996b75bbbfe66ecb3057c84025113bf8e0b99288ac", - "coinbase": false, - "hash": "3d2faeb23296b10cdb6073b7d12037890a1d4d27fdb18cb9b2e6298a3eb1d1dd", - "index": 0 - }, - "script": "473044022036f9679e0391728f757a38c9d8d290626377616626fd187db7f6a497a99cd0e002202528f8bd3d7bacbefa719f5f28475d9596d23e505571642c80389adbde1a9d2c01210224f0a1ea4c7a0ec22fe1da9506d0ac3a402d7925f777443553ac6a2a8f705d7a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 12644560, - "script": "76a914f9060b9b96663cd154c1a4c9b47def11c75c147288ac" - }, - { - "value": 1199559, - "script": "76a914f1b0f3bc78b8c898247a709e73a6497c53bf2d7d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "92fb83ccb76bcbaf223400a4104d6726d075d89031f345f52835d89ae6d89e07", - "witnessHash": "92fb83ccb76bcbaf223400a4104d6726d075d89031f345f52835d89ae6d89e07", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 423, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5119cd2e7f7381801d32a01a326713c40ed87c20196cabc078ce730eeb2d4865", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299709, - "value": 10000000, - "script": "76a91447ab4db7a718983092a750b0eb5fd99397c5fd5588ac", - "coinbase": false, - "hash": "5119cd2e7f7381801d32a01a326713c40ed87c20196cabc078ce730eeb2d4865", - "index": 1 - }, - "script": "483045022100ac7dcdce544ac52cd5fe2a10cf8412dd7790d6ed2b2818109ef1230a7be1ac9e02204111645906669dd6e84bc8002f42ffba17ed9f3eeccc239b04d413ca547de51a012102253a3018b8d4afd23a2ebc25ef18ae624d448f12924a2e7da3484a756ef9aee4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "59bcd375a284c42d4192eac28abdf8b0b5ff6de4c627e99b68747dea18d80fe6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299717, - "value": 12000000, - "script": "76a91447ab4db7a718983092a750b0eb5fd99397c5fd5588ac", - "coinbase": false, - "hash": "59bcd375a284c42d4192eac28abdf8b0b5ff6de4c627e99b68747dea18d80fe6", - "index": 0 - }, - "script": "48304502210087ee0291446282ce0a0b7f19328bfac6fc5ca89d6e9267647ae6a4705ec35b5d02202eb349f835b0b37f8f8774e78619b7d2b446b59d27e056977e2cb94cf6830a6f012102253a3018b8d4afd23a2ebc25ef18ae624d448f12924a2e7da3484a756ef9aee4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "20e62e35369085a9eed4f4149b5344559778d418f788bc7ebf1a124d5fd4e44d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299018, - "value": 4035000, - "script": "76a91461c40cfd8090ddb7f04ec1a1cbcd2986a526ab7088ac", - "coinbase": false, - "hash": "20e62e35369085a9eed4f4149b5344559778d418f788bc7ebf1a124d5fd4e44d", - "index": 1 - }, - "script": "47304402202074379f5efb33533157da2a3d742d95b9781b038de2ea4fc528631d295738e802206215731ed048c62c60714d9580eebe4a6b23ff50731c441f77236e73c846ce160121026b1f3905e013136c982604a255ff32fc8d24799dcd2e3a3c0e10340e15294fa7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "639722361df4d68f92527d3da58d0f34fd06eda0785ed98166659e811afad584", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299609, - "value": 500000000, - "script": "76a91438fc5a9ac96d66706f0da3e3827a140e59e170f388ac", - "coinbase": false, - "hash": "639722361df4d68f92527d3da58d0f34fd06eda0785ed98166659e811afad584", - "index": 0 - }, - "script": "483045022100c5cae7f9fffa1b69fb1e8cc65d9b8265cab9795148cbfc644ba1e169fcae7f340220487a343af0f3e2d462c5783683d3404b6fe0ec78e0e538e05021d253744b4092012103e4e15e76dae6c5f5c99857d9a0020a6986c352ba219531ec9ff0d3ae5eeebd33", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1025000, - "script": "76a914d0b0d1bc89fec562fc3c5739c06cb19ca9213f5388ac" - }, - { - "value": 525000000, - "script": "76a914c4b65b5ae5492fb89cf2ef0af8272fc857ec255388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "cba9ede8786b12994ceb35023c9d59ee51fff7211432d894481459e353e6f74e", - "witnessHash": "cba9ede8786b12994ceb35023c9d59ee51fff7211432d894481459e353e6f74e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 424, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ac375ebed5d83b0d11a8aa67ccfe871de10946fd8c5ecd07a23e3033bd6e0fdc", - "index": 150 - }, - "coin": { - "version": 1, - "height": 286229, - "value": 7273315, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "ac375ebed5d83b0d11a8aa67ccfe871de10946fd8c5ecd07a23e3033bd6e0fdc", - "index": 150 - }, - "script": "48304502201968b9cf6f04836a428c5f79a375ec2a71787c0e8d2c47bbb981f21cc157d1870221009573e3122de5ad3d58e87f801233e73ee5e92296de74d0b19d06143eeaf6a3b90121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "948808f63b060e4733a7fffe610f2b644e0f2258724c4b2af5c37415fa37ffe5", - "index": 150 - }, - "coin": { - "version": 1, - "height": 290887, - "value": 5299350, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "948808f63b060e4733a7fffe610f2b644e0f2258724c4b2af5c37415fa37ffe5", - "index": 150 - }, - "script": "47304402201b3e7db4e854ab7af9043edc7734096a0293efd39336343371c72c8b66f1e3ab02202ed96871d07fa8e0f1326042609e82e3d166191dca455def88f7ae8b6fca88f30121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "88c6393fbde7b0f621f4bd982fdfac856f0b80c1fb67a6f18642beb0cf7f0a04", - "index": 150 - }, - "coin": { - "version": 1, - "height": 287435, - "value": 6565020, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "88c6393fbde7b0f621f4bd982fdfac856f0b80c1fb67a6f18642beb0cf7f0a04", - "index": 150 - }, - "script": "47304402200e57d7e1db32dc085fa98ad795c37f08ba43f14a91625fb84f042766fe1ec78f0220008beeeb728fcdf554b3044b6694c6e050b09a7f806113be9699141f0c4082790121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "54585341ef96a683d43e1547db782401c97d7b17fa75938a7ae8fe0cc4600609", - "index": 155 - }, - "coin": { - "version": 1, - "height": 284992, - "value": 9477090, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "54585341ef96a683d43e1547db782401c97d7b17fa75938a7ae8fe0cc4600609", - "index": 155 - }, - "script": "493046022100cb5344dd9a2be4fd704eae31c275c3d78ddfc02ece7b1cd3968eb9d833e364bd022100db0cb1e5bf006b26fdec4881c47e3bdbbacdec76f145aea97439a1c4cca46d7f0121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7ef2f95249fc0a9914006503aec4c778090798fdd1a82cafca2d73d95478b681", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298340, - "value": 1045328, - "script": "76a9145bbd1efc540bbe7cea3bb3dbc8dbef1f14a74fab88ac", - "coinbase": false, - "hash": "7ef2f95249fc0a9914006503aec4c778090798fdd1a82cafca2d73d95478b681", - "index": 1 - }, - "script": "493046022100933caa57e254e7b3ce983c43daffb9c5215c718034a2e377fcae1c5e478b8248022100d23fd97bb7da78b092c48d495c9600c45fbe9df8191572abdef46cca05e05baa012102e16e65b7fd50ccde1c7bfda84e92a4005ce95018f82550000b6e25ec3ce743f9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "24975358f660dcb80324d7edfa2a6f09cb0e46c7e8b08c8c19b49e0b48692a93", - "index": 150 - }, - "coin": { - "version": 1, - "height": 288641, - "value": 6707365, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "24975358f660dcb80324d7edfa2a6f09cb0e46c7e8b08c8c19b49e0b48692a93", - "index": 150 - }, - "script": "473044022007c452d79f24d804048308783852d742b2ef8e3bf5cb0c4f39d8e172dad726e4022076cf0804de5cc101190556d5077693cec637346666849648a7e5ff9ed44ffa240121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c97f362c46112a9b25c79e26641c20ad673831bc2fe18456458824163d611a4d", - "index": 156 - }, - "coin": { - "version": 1, - "height": 283803, - "value": 10428915, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "c97f362c46112a9b25c79e26641c20ad673831bc2fe18456458824163d611a4d", - "index": 156 - }, - "script": "473044022022dcf0bcb29024aa1da3c07bd78d749f2de438b3d7ac4bebe0e774b6c5baec140220422a13bdf147be5735cba86f567a8e06325192e304c78ba0f1000db5f69435dd0121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e14a963038b1cea05803702761eb0251eb1432861d2b5804ac9cb5c247411d4c", - "index": 144 - }, - "coin": { - "version": 1, - "height": 295661, - "value": 30660770, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "e14a963038b1cea05803702761eb0251eb1432861d2b5804ac9cb5c247411d4c", - "index": 144 - }, - "script": "483045022074dac03981ba56d08e938e7d56fdb98fb55b47b1d9924624b83073ffb97c0ae6022100a479c64296baf7cde30e5b35f56539550c68b64667505d66a1507fc6a73430560121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "65fb438561c120471b97488847d8f8648fdc0027b05bc252dc5d9aefa6ef57c1", - "index": 150 - }, - "coin": { - "version": 1, - "height": 289747, - "value": 4892895, - "script": "76a914906be421fac0166422d341a78de3339d6722718888ac", - "coinbase": false, - "hash": "65fb438561c120471b97488847d8f8648fdc0027b05bc252dc5d9aefa6ef57c1", - "index": 150 - }, - "script": "48304502203e057517dd82e16777d51dffe6123c150fea8dc44e26180d540762d635982d63022100b75d4cb9873d454eb69612bfe3c0009756853b2ae01e4850dc9dd52abfe6ad040121028db7d30d096282cfa0472e4dbf59155301df5dde93fbe47312539937206e47ba", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 82330048, - "script": "76a914f2954b6e6eea412034aceeab9e8c4f7a8ebff6b188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "73250d51c1c51b318db872362fb0875b3a403c4ef011be7688ad78f1640cc727", - "witnessHash": "73250d51c1c51b318db872362fb0875b3a403c4ef011be7688ad78f1640cc727", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 425, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "338d72890609397bca9de5624029b4cfe4799698bd73ec0a5ab139ad6971dcd7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298401, - "value": 126710, - "script": "76a9148b1e0e7d92ccdf0247c6d22b26d1b40b5d532b7d88ac", - "coinbase": false, - "hash": "338d72890609397bca9de5624029b4cfe4799698bd73ec0a5ab139ad6971dcd7", - "index": 0 - }, - "script": "473044022067b52ec273537eeb32fdd66478616eb17a0b706e2ce460c58754bcd228a4612a02206219c849c05132b5532944937ad6a3665f96c456843fa90f70c4107582619acf01210377f2fd2cc39ae425b8fef5c36612d73ad29954da8c1d4d8050719ca466b37257", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 552 - }, - "coin": { - "version": 1, - "height": 299989, - "value": 16980000, - "script": "76a914d52a805a8a2bd4e45616be2a268a540c33eec36988ac", - "coinbase": false, - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 552 - }, - "script": "483045022003ff8c555186062fe4ca09c05820b8a1b1abb23aa371fae4bc02c04225bc17a50221009c15f7a9ade50fc3f73db25d3f71bc46eb27fd10f8e0c520195f11bb9034babd012102e358fbd042e1468ed95efd8801faa6a40c5978aed536b817f8b889a3d21e2672", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 40 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 33957423, - "script": "76a914d52a805a8a2bd4e45616be2a268a540c33eec36988ac", - "coinbase": false, - "hash": "736503603c664044d44622aa8d1534af9ba7804fd8da5d70d8385ba0ab5cc8f4", - "index": 40 - }, - "script": "493046022100a510f3dd46638d0460c7c1b9613c9c9302b5cab7297fa366d0ec7fb5eff0f4c2022100a28f68c4204a5b840d7a8fad564780d2662e249bfd2ec7eae907ea3a86f298f2012102e358fbd042e1468ed95efd8801faa6a40c5978aed536b817f8b889a3d21e2672", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4ee7545f30601db733726e854dcb3835ababe93db94a3a58a37cbade4562aaaa", - "index": 11 - }, - "coin": { - "version": 1, - "height": 299958, - "value": 33970518, - "script": "76a914d52a805a8a2bd4e45616be2a268a540c33eec36988ac", - "coinbase": false, - "hash": "4ee7545f30601db733726e854dcb3835ababe93db94a3a58a37cbade4562aaaa", - "index": 11 - }, - "script": "48304502205d1a4e62bab69c60336df0415b48c82be47d80b1ea9903820d716a88a510f13b022100fa9a3f73dde6c4c81df44526d6f2ade5ff8d51721b3fde940ddf00b689f4d2b3012102e358fbd042e1468ed95efd8801faa6a40c5978aed536b817f8b889a3d21e2672", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1125772f810c64c5b83f74c3cd0cb6807efb0c2e3bf31f2585a885edce033e07", - "index": 78 - }, - "coin": { - "version": 1, - "height": 299867, - "value": 38245765, - "script": "76a914d52a805a8a2bd4e45616be2a268a540c33eec36988ac", - "coinbase": false, - "hash": "1125772f810c64c5b83f74c3cd0cb6807efb0c2e3bf31f2585a885edce033e07", - "index": 78 - }, - "script": "4830450221008a3f1e6206c741c34e9132ee5225bbe467b6e2059c7657ff372e33ed2b192ed102200db5fff35f5c4d5dc6fb788a38099da0bdc2d4a708a0db7846b1885f13b252d7012102e358fbd042e1468ed95efd8801faa6a40c5978aed536b817f8b889a3d21e2672", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b31a98c5ca7d274882b930380b8716b5c0ce9b24625b301104e3cf926a2ceec", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299674, - "value": 184723, - "script": "76a91480baa22d422d91211a8fe2d3dac369804451216788ac", - "coinbase": false, - "hash": "4b31a98c5ca7d274882b930380b8716b5c0ce9b24625b301104e3cf926a2ceec", - "index": 1 - }, - "script": "483045022021d1bd3f691bad961929319b5c7a946f126c2a8431c58bec4cd583b4b7368040022100bee212086692e763747eb4783f93c04cd1f2a8922f39c899469acaa7ae8593e901210322bdb897fa51f20437991e24ecd67407b39ddcf8751d0140868cd75296d6ab91", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0ed3917a39ef4c58ad0ff1fe0099b25794fda951116d1ea4ccf0af19e691cdb6", - "index": 35 - }, - "coin": { - "version": 1, - "height": 299686, - "value": 36145029, - "script": "76a914d52a805a8a2bd4e45616be2a268a540c33eec36988ac", - "coinbase": false, - "hash": "0ed3917a39ef4c58ad0ff1fe0099b25794fda951116d1ea4ccf0af19e691cdb6", - "index": 35 - }, - "script": "493046022100ebbde6f489fac91f2c63d7ec9ed27fa9965b12fed74a401037cd787a47358348022100a25df1ae6480035af2afa8fc70f0916d578057d4c9a8ba88c57bae5749e24605012102e358fbd042e1468ed95efd8801faa6a40c5978aed536b817f8b889a3d21e2672", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d7f8b09b8cc8b01132022a6fe56268daecf9b58f5fac1bfe793a67f742495215", - "index": 72 - }, - "coin": { - "version": 1, - "height": 299795, - "value": 34990228, - "script": "76a914d52a805a8a2bd4e45616be2a268a540c33eec36988ac", - "coinbase": false, - "hash": "d7f8b09b8cc8b01132022a6fe56268daecf9b58f5fac1bfe793a67f742495215", - "index": 72 - }, - "script": "47304402203d1cc790b239a0a6a9a37b631794d6abfa9238e8f509534fb30dfba49c92b8dc02206b74bda058178524dade139c4d2a78ad03a6c53f919af89935e408a4a3b696f0012102e358fbd042e1468ed95efd8801faa6a40c5978aed536b817f8b889a3d21e2672", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4eb649ea1c85956a9059e24d41ee0d972572ca4c18aab0d96f1698d94d8b417f", - "index": 564 - }, - "coin": { - "version": 1, - "height": 299822, - "value": 16810000, - "script": "76a914d52a805a8a2bd4e45616be2a268a540c33eec36988ac", - "coinbase": false, - "hash": "4eb649ea1c85956a9059e24d41ee0d972572ca4c18aab0d96f1698d94d8b417f", - "index": 564 - }, - "script": "473044022068f20e98d29d198fc95408caa05ef606ac33f4184687dab42a4ddbea3568270f0220391916957360293399642b6cddafd89acef6e44e4ba9ec2aa0069ab13da378ca012102e358fbd042e1468ed95efd8801faa6a40c5978aed536b817f8b889a3d21e2672", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 211300000, - "script": "76a914eeb28d08ba975cc4935e533d177df4afce3f13cc88ac" - }, - { - "value": 90396, - "script": "76a9141757933c24c9a515d6738a04026ffe7b42a4a0ce88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9822434809fe66c59bef56cca22c7aead23ad7e9127898d49f811422bc8413f9", - "witnessHash": "9822434809fe66c59bef56cca22c7aead23ad7e9127898d49f811422bc8413f9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 426, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a62970947d77324014fe23084dedb8c92a7712b3658b30697ce1e16d93de9963", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1147051, - "script": "76a91494c97f7f7e338bc96e877063ca35f84cc606965188ac", - "coinbase": false, - "hash": "a62970947d77324014fe23084dedb8c92a7712b3658b30697ce1e16d93de9963", - "index": 1 - }, - "script": "473044022012eeb96527f18783639b680f327c37a6a5f3fb6f9af71231cf614f9c14aed02a0220169bafaa9368d456a2268434674017ee69488eef45eab49ab25579e251d45f0f012103c580e8e71727e91d0cc31b3158b82be336aa2ab3124bcc3b337484a8f5421cb4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fb5614ddf4d05ebca913835daddfa84f267636d49c3bb14ef487c2a73675e788", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 100000000, - "script": "76a914cecafa021013cd18d4e29748d3f751edc57d081e88ac", - "coinbase": false, - "hash": "fb5614ddf4d05ebca913835daddfa84f267636d49c3bb14ef487c2a73675e788", - "index": 0 - }, - "script": "483045022079af9d5cd0974fb681775769a4a76344d98c3bfa6c77f05efe27f13ccccc5207022100b54a5e3dc07631e088355d675f3e9115673d4ee0a3de77726a9d65e471d207f501410466c1b7ecfe283bf899e93688878de6752dca59233c54d0a6daea6fa80f10ea0e935335ee811f2958d5b61020b9b5b0fabf049d4b226a31478de0080113dce7d4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5678bcb1677a60e71aee1d87bbfd1bd924be6edff28c7e1a4cd34df1670cd2dc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 38175294, - "script": "76a914d4166d5513f4153b965b06734598471212967b0688ac", - "coinbase": false, - "hash": "5678bcb1677a60e71aee1d87bbfd1bd924be6edff28c7e1a4cd34df1670cd2dc", - "index": 0 - }, - "script": "4730440220412dcbcdbba90f8ef94f696b84b16dfdf3de963d21d2391dccf22e4a38d878df0220188604f4b5068ab8cbf1716433d527f1627adf87f325293f81093b296e5b889a01410447cb35ac4589c827dca5bc316020da954dc119780096d19c23a66e217a14ed6d42f694bdefb7f57ce57aa862d0b7dcb53ae5ed78adf03d6454fc007b790c69d3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9e1ed5e256ba736cf0aa628104c0239ac73431aff9d751a61e71e927f241a457", - "index": 0 - }, - "coin": { - "version": 1, - "height": 296322, - "value": 1055776, - "script": "76a914c187b955b5e7270ec431f237bf264e4ba761eb4688ac", - "coinbase": false, - "hash": "9e1ed5e256ba736cf0aa628104c0239ac73431aff9d751a61e71e927f241a457", - "index": 0 - }, - "script": "4930460221009e8b6d171ce8f8b460580c973bd9643fbc10b4e9e0748ca349041dcb3d92c621022100c95557caf8b8a6d8aac6cc84f25fb1fa9a5ec65efed5c0472dd856d72edd1ca80121026946de541770b4ee2764b189f5f7093fa36f3e0a4376b9e4276131809cafa7d9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000001, - "script": "76a91467322d434d1f57b24c9e6453176321dc0b3731a988ac" - }, - { - "value": 139368120, - "script": "76a9143afc1c87063e18b0122e3549e0db61521df0198188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d9a013e0f7948aac38eccfc2d0b021fbe7754141b8ea0539afba8b0568afdc10", - "witnessHash": "d9a013e0f7948aac38eccfc2d0b021fbe7754141b8ea0539afba8b0568afdc10", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 427, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "c57b74a60e8239988f438b80ab17d4f23e2ead4aa91a9b7426e5f4f93c9a4368", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299958, - "value": 2800, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "c57b74a60e8239988f438b80ab17d4f23e2ead4aa91a9b7426e5f4f93c9a4368", - "index": 1 - }, - "script": "483045022038b093f2396e4f3a6890db9d88e64feb24cdeb26696b655252872537c3a7a882022100a9f95076ef53b77ea2bb14084e54c136686abdeaa4ad515f36680976f18945040141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8fb61ecad53d89e2d02ebeb516f4f7b18f4ab4921072021614aa72875f0ed63c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299959, - "value": 264700, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "8fb61ecad53d89e2d02ebeb516f4f7b18f4ab4921072021614aa72875f0ed63c", - "index": 1 - }, - "script": "493046022100b43347a122ac34f5c8d27e8b4974a888a8516e60d43a685f75f6c97fb2514a56022100a90ed3234c94f061931abdbd1296685ed40b49aaa4813b4f9a74dd9d798402710141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9fd1cff1410bd501c05e94c5f636a090d73e42aa9dc2561153526e1a466e48c6", - "index": 25 - }, - "coin": { - "version": 1, - "height": 299959, - "value": 13241400, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "9fd1cff1410bd501c05e94c5f636a090d73e42aa9dc2561153526e1a466e48c6", - "index": 25 - }, - "script": "47304402207eb1ff2ecba283ededf568007d247738f73dcd15c2d4742ff477916fc2f84e83022066b504ded9d971730b0966dafeb8397a349e23b3f1d77750e948803a799d7fee0141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ff4c34cd2f08e5d2f805331e688ab83b7665ef0c83d9b1da66af960dbf3527a0", - "index": 24 - }, - "coin": { - "version": 1, - "height": 299966, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "ff4c34cd2f08e5d2f805331e688ab83b7665ef0c83d9b1da66af960dbf3527a0", - "index": 24 - }, - "script": "473044022009d8e3961ba9cf1869ed7ee2fadc79bc784b05cf306a62a82eea2a944e6a2001022011ede2632723647fd88814f516bc28c52072bde75fdce355d8390fbf5d54745b0141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4194042b8ae06e7ca26d549d15f8943699985129626ef8ed1860292102b0d948", - "index": 25 - }, - "coin": { - "version": 1, - "height": 299971, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "4194042b8ae06e7ca26d549d15f8943699985129626ef8ed1860292102b0d948", - "index": 25 - }, - "script": "483045022100eb2440a49cf2d484b6c5891d68798e1dd42e0ef8de0a1f51fa8c17bfa071b9b00220359c7aa1e14f3088f0adbad85edc785db85f48d3ed8ce01f4783bad71353f8250141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d7f79246c57c176a0eac2fbbfe3f3b9c81152dc34c652538dd68f9be7231e735", - "index": 25 - }, - "coin": { - "version": 1, - "height": 299977, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "d7f79246c57c176a0eac2fbbfe3f3b9c81152dc34c652538dd68f9be7231e735", - "index": 25 - }, - "script": "493046022100b658ab4e8dd278d741357f1f34ed82ab9a253c56006e5e5d5b93285d5c0e2c80022100c9d0ab70f6ad8f98a88f0930f9ef1803eaac17e07942f923000ae989b363cebb0141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "36e1e332c111ed2056cb7bdbcd91d44754c848a9cf46d50cba6e7ddb22438c5b", - "index": 24 - }, - "coin": { - "version": 1, - "height": 299988, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "36e1e332c111ed2056cb7bdbcd91d44754c848a9cf46d50cba6e7ddb22438c5b", - "index": 24 - }, - "script": "4830450221009acde065a9583531985bc090cfb341ddfb47bca33a70588fae53e173635567a8022040815869013cb48ee7ad07ff5e3143b7b2cbe909428876b97861ed1598736b6e0141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "450294edd1db3db0d6552f7d47bb9448eb999d1b843aa7d5b18d14dc1dda64ba", - "index": 24 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "450294edd1db3db0d6552f7d47bb9448eb999d1b843aa7d5b18d14dc1dda64ba", - "index": 24 - }, - "script": "493046022100c044d78bb09cc87b6dc1606f7ac7ceb4ea0413688d7e5d9d983be2525f65ed84022100ed129388997b9b61c048ee9557d00b7497aab895cd88cb5f06b3124a212d0dee0141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "127ed5c2bc6a7c28deaea8e533847b429d348fb39c0c1cdb3d8deb0b2fffb931", - "index": 24 - }, - "coin": { - "version": 1, - "height": 299998, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "127ed5c2bc6a7c28deaea8e533847b429d348fb39c0c1cdb3d8deb0b2fffb931", - "index": 24 - }, - "script": "493046022100ad669ec6367b5ef1bf9230a28310e823ef38bff8a055c2ed2b93a980ffd6caf0022100cba180054ceda0917c26da83ce87b9e3dd4effaafccb209c550d4e0aaa1a45eb0141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "21fb74d08fcd94ae2778ef01c6f57f5da01040fc49aa8f07620171ee2eaf01d6", - "index": 25 - }, - "coin": { - "version": 1, - "height": 300005, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "21fb74d08fcd94ae2778ef01c6f57f5da01040fc49aa8f07620171ee2eaf01d6", - "index": 25 - }, - "script": "483045022100cadc595dcb04580ddb447221b290cea5ff0ac80a1c1c4a3b2c22fa613f0bf4f702205773b16a58a5421f650e0c727d8aca15992df817b5e24ee3be9ef51305e311750141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4ee2858fa984c228ed39b0458967fadd282667164270a1b3686017bf5394f0cf", - "index": 25 - }, - "coin": { - "version": 1, - "height": 300020, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "4ee2858fa984c228ed39b0458967fadd282667164270a1b3686017bf5394f0cf", - "index": 25 - }, - "script": "4830450220703984751b48d96dacadee5f6b362c5713f900d2cb91c031248b7d6f58b99ebd022100869dfe3cfaaadcdf9b2600ebe71884ec68f30585fe408b04d7df93042ddf07310141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b2ebb384228d5883392122a40054faeccd13271e8c8a696139612e0a561039a9", - "index": 24 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 13506100, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac", - "coinbase": false, - "hash": "b2ebb384228d5883392122a40054faeccd13271e8c8a696139612e0a561039a9", - "index": 24 - }, - "script": "483045022100d7f77bef455df0627de870ff6af3467ab5379fc4b239e67f5c14437c94866af802202b6d61c85d2205713a7e7d659ba505e74862c6e239375b54c0a5a8dd3df99d410141044d6f22fac6a43478855cded9db236461f10e8ce49714d5780b0341956eb440460720b642d81f5f9e9463f3f40ab69e9d7af3b48844d369858da759d8164e8fea", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 135000000, - "script": "76a914af0d87c74fa4eb8631a5f665d70324f4a87e918988ac" - }, - { - "value": 33800, - "script": "76a914d8797cd1fbef23e99e769f241d6ca7384d71e42b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "043d598972a6f2e553c8d7fd728640eef19f9fa78c3f3878cb44993f5f07ed06", - "witnessHash": "043d598972a6f2e553c8d7fd728640eef19f9fa78c3f3878cb44993f5f07ed06", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 428, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "bf450acd7711860b911cdfe194acc7c22bd45b3d95459ad4a5e3b824627dd4c4", - "index": 5 - }, - "coin": { - "version": 1, - "height": 289837, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "bf450acd7711860b911cdfe194acc7c22bd45b3d95459ad4a5e3b824627dd4c4", - "index": 5 - }, - "script": "493046022100dacf74c696685af16090d489542889adf4590017cc9ed54698bd548dcc4f74db022100f11c3fb1e16224382890d73e6ab9cf84f12fca0fd110282ce567e5d2e6b47956014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c7ef413c22abedb6e123854d18d9c33d10928284735e69243a4026b2ef8d39e9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 289839, - "value": 2110000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "c7ef413c22abedb6e123854d18d9c33d10928284735e69243a4026b2ef8d39e9", - "index": 1 - }, - "script": "48304502207552fc5d946143e4e0959aaa0716e511a0ca3e6cba8f5ff274f4f77f0365b808022100991e53f50d9f857d7920ffb48248aaa6889a088d6eed3ddf55190556a4cc1e9f014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7e9b1423790d3d5631a69ec3ef1857908035a3007904c97bc74f16118358fd23", - "index": 4 - }, - "coin": { - "version": 1, - "height": 289897, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "7e9b1423790d3d5631a69ec3ef1857908035a3007904c97bc74f16118358fd23", - "index": 4 - }, - "script": "483045022061a99c2b08bc42a7351f7c909126372bae53eba2f12350131b6b55d9639d6040022100ec34f6a314db09df1e40d4298e13163846cd5b2fecc3822887919fc946d90747014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "98e3f1cbe7a10ffd7d3c2e58407bf520e34573347a366f8bc58139da39fc34ce", - "index": 2 - }, - "coin": { - "version": 1, - "height": 289965, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "98e3f1cbe7a10ffd7d3c2e58407bf520e34573347a366f8bc58139da39fc34ce", - "index": 2 - }, - "script": "483045022100c54425ccbf0118a25c1e5006911b057d38cb5c1f2ee2a717e9fe671aa656c5f1022002a250b3dd20b77da06bba924f2ef8e2728f1dfdc737572b0d74d48fec3ad614014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "425b8fbde30ccdeab9deff201c2fe450ab2093be0328b7e2581bcd189bea6df0", - "index": 2 - }, - "coin": { - "version": 1, - "height": 290031, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "425b8fbde30ccdeab9deff201c2fe450ab2093be0328b7e2581bcd189bea6df0", - "index": 2 - }, - "script": "48304502201d55243afca9bab88aa1ce2287c22beb1c50647bf6b66d05cd920bb0605a9d69022100a7929881b1c7a31d2905ab31e29548593168879aaf0edbecdd2a9af00178f59d014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "41cc6fc6cc26a9de6a77d7de373837d93d9356576b4639dff5a03c2e77a3379b", - "index": 52 - }, - "coin": { - "version": 1, - "height": 290095, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "41cc6fc6cc26a9de6a77d7de373837d93d9356576b4639dff5a03c2e77a3379b", - "index": 52 - }, - "script": "48304502203be09be29846f91ba8dd9b20a280c7bbfbe3da9b1b90c041a8b19e9617546f85022100f124284d1bb7872b014d728307176b226625a1ca43ddf2e2789449ab90a9c126014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dd1db4c90b6ebf1c519b525f14ca86ad55f6b40465bf81da4d59ce08037dd754", - "index": 1 - }, - "coin": { - "version": 1, - "height": 290161, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "dd1db4c90b6ebf1c519b525f14ca86ad55f6b40465bf81da4d59ce08037dd754", - "index": 1 - }, - "script": "48304502202c06587308815f4a5abb6b4301a72d1db42121993c1c59f0ce79bc48e5ab24e5022100e0212bc59f44de4273cf9202124081f49d84ecd0def6fdbde377f7217a53dd32014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fb223984f7ffb4652e858c058e299fede4dad46965ee39537e1a020b0960bb74", - "index": 3 - }, - "coin": { - "version": 1, - "height": 290230, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "fb223984f7ffb4652e858c058e299fede4dad46965ee39537e1a020b0960bb74", - "index": 3 - }, - "script": "4830450221008463a05a973c31257ccd44987177db25e7bb75a998d1c6a140e1d525cab583ba022075c24e4445948e17d9bb173cb95037228a914f807ccc281697992be27fad79b4014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "aa27428b0f0b70f24c1593e9f830ee8b918d1ab3317ff47c995162f625a5b0fc", - "index": 7 - }, - "coin": { - "version": 1, - "height": 290305, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "aa27428b0f0b70f24c1593e9f830ee8b918d1ab3317ff47c995162f625a5b0fc", - "index": 7 - }, - "script": "4830450220463b7fa883b1d12b7eb89ba2321cf203765df7041c6f617cc5f01aae425b1ef4022100db74f1e52aead56614f5838f1181b140247a18ab2be6ac7ff92f88fbb1b3b118014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cda5976b816be1e8353c927008f19586e004c6edcf2c8c8a69804955e946c320", - "index": 4 - }, - "coin": { - "version": 1, - "height": 290381, - "value": 2000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "cda5976b816be1e8353c927008f19586e004c6edcf2c8c8a69804955e946c320", - "index": 4 - }, - "script": "47304402200460576935aaf8eec98b8cbb57846174a95896c120596287486e78b02239863a0220571c99ec4dce29dfba91b131b4dccb8bbede04f37fa016b8c234cdb78f7ff423014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5936d46c77304fb0604f39a9f5beb8982d0c3c8121ea0a0849127c009ab5b29a", - "index": 8 - }, - "coin": { - "version": 1, - "height": 290407, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "5936d46c77304fb0604f39a9f5beb8982d0c3c8121ea0a0849127c009ab5b29a", - "index": 8 - }, - "script": "483045022076cd1dedbbd6bd31ca4d98da2ee4ba08dbbc4a209ddb6ea5e480329133e0bd5e022100c0622897bc613e406c8e06e41683ebe529e695170acd86a6d605620994d34fb0014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9b7a106602c2bd81fa637eb691db1740e452a17f95d420085ce5642fa85e7ca2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 290452, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "9b7a106602c2bd81fa637eb691db1740e452a17f95d420085ce5642fa85e7ca2", - "index": 1 - }, - "script": "473044022023f93c516c665b398f1341d2115b16cd2ca31ca91ad0f6f815a733125694e92702203f8fe24ebca023c62bd955f946a53c7e40baf2d4bce6945a5bd5ddbb4ad96eb7014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1019a323f28a5346d494dbcf8b461ec6afb7836ccc123095743f0bfb29539d2d", - "index": 6 - }, - "coin": { - "version": 1, - "height": 290481, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "1019a323f28a5346d494dbcf8b461ec6afb7836ccc123095743f0bfb29539d2d", - "index": 6 - }, - "script": "483045022061bba8c9758b4743a3f5c2f957d6ceaf3216769694cec2568c88905d71376ab8022100fb5d262e9a3090224b0908b6f617ad25bafd87d92399fc01d7ef22a07a76d851014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "797da555834f5b5df57629a93571bb539331367ca3217b5a437c927d625169df", - "index": 11 - }, - "coin": { - "version": 1, - "height": 290510, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "797da555834f5b5df57629a93571bb539331367ca3217b5a437c927d625169df", - "index": 11 - }, - "script": "47304402207d524858abdda27e2625b90318f4c1b310f358eb13c053ea8b242caa03a21ef702204f1bfa5ad23d603e1ea91d97e15b0fcbe23fcb0f6bb19f76e2c91a1d4ccd946e014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "91ff35d58640feeff4c7a3f5588e3bd96cfb05456af8b8f558bca8133ec48c8e", - "index": 2 - }, - "coin": { - "version": 1, - "height": 290535, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "91ff35d58640feeff4c7a3f5588e3bd96cfb05456af8b8f558bca8133ec48c8e", - "index": 2 - }, - "script": "493046022100df4b6a373bb187208d144216dbd540874425dc9286c53925731161e38b2132fd022100ad1d10337c28f3ff78a34b6695d48f2c9086b63598839bf0274737a02efa16d1014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4486cc069b63305310b0928a538a6066c5ca424f90701729cb1bade60add4963", - "index": 6 - }, - "coin": { - "version": 1, - "height": 290569, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "4486cc069b63305310b0928a538a6066c5ca424f90701729cb1bade60add4963", - "index": 6 - }, - "script": "483045022066e817deee3fd79785cdee4ed3adb2b77d28c0178c02bffb642410ed2c140e860221009f53767df707162b6a8698e4bc4d13373c139deff5b9c6732cf533a937899afd014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e27ad336ab02d37932ac1ccd04b9a7d0c45f2a38163104f768004be84ffb5ff5", - "index": 20 - }, - "coin": { - "version": 1, - "height": 290607, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "e27ad336ab02d37932ac1ccd04b9a7d0c45f2a38163104f768004be84ffb5ff5", - "index": 20 - }, - "script": "48304502204d884015a552a9c4c95d4d6f06f21c2e63b9e5cec4e6e55c474322164a5b997d022100b3714f717684eafc8bc2fdb00e1a5d48eeab165fabe95da674124c1848bc25af014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7735ec5db2a4e8c8ccc553b0b83eb504f137ce794a26581c8861326bfc503e50", - "index": 2 - }, - "coin": { - "version": 1, - "height": 290645, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "7735ec5db2a4e8c8ccc553b0b83eb504f137ce794a26581c8861326bfc503e50", - "index": 2 - }, - "script": "47304402206b57d52b1a6ecf5dae7e6ba0ecf19b61321ac2e784aa7f65bfc407a59c61681d02207ebd653b70393a49bfd4e39128314c734bd6682fe95599c0829fe82b0508929a014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "912ff3980dd0054e42e2ac11cb3a9fd8c5a62ce3b8c966d1b7af0f6eef1430cb", - "index": 12 - }, - "coin": { - "version": 1, - "height": 290692, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "912ff3980dd0054e42e2ac11cb3a9fd8c5a62ce3b8c966d1b7af0f6eef1430cb", - "index": 12 - }, - "script": "483045022100d14dfee8275abaff784096db13ea9de86c0fa547beee8b30c493b0559d38e0f802207207e06b406a72d486fb10b724f80fba0b803c60ebbb8fc5ea069e46d5383ca8014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fd3c467c8989b282954f048c0839b8fc99b3b0fdee98727c29a2d9a12aee1427", - "index": 2 - }, - "coin": { - "version": 1, - "height": 290721, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "fd3c467c8989b282954f048c0839b8fc99b3b0fdee98727c29a2d9a12aee1427", - "index": 2 - }, - "script": "48304502201f1ac10925bd5699577b51decfd91e1106cc8b021bd840e666d531afb7f32246022100fa0bbc6ccee7919bd2fc7fd2fda6fc693d27c3b4899ba0ff5516deed8ba70c49014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2364c9012898f02afdd2bf827e8300d01f484c500f053dd95b2849640ea6e72f", - "index": 26 - }, - "coin": { - "version": 1, - "height": 290763, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "2364c9012898f02afdd2bf827e8300d01f484c500f053dd95b2849640ea6e72f", - "index": 26 - }, - "script": "493046022100bdd2029d8ee2286544dc0aa9e2ca32adcca9fb95dfb49a13aea8e84dde4e7e75022100e71b18546b0ab047bf53245f5b86a7eb1ba95dc47c48059287f2efc3871150d3014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d3481757638137d821dceb184eff137065dcab2490a1077c32d3888b7b8d42db", - "index": 21 - }, - "coin": { - "version": 1, - "height": 290839, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "d3481757638137d821dceb184eff137065dcab2490a1077c32d3888b7b8d42db", - "index": 21 - }, - "script": "493046022100fb872ef623482a906e7de02217d7881e435b661c8b2d7b84b75511e59c0215e2022100c58d2c8dec0e051bb3751ad5897c7d91ef1f6bd818f009eddda000c09af30b69014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a199ba7c7f0377b118dbac451642e4a5e89dfb74c1267cb3edd52b3a9c82d297", - "index": 20 - }, - "coin": { - "version": 1, - "height": 290883, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "a199ba7c7f0377b118dbac451642e4a5e89dfb74c1267cb3edd52b3a9c82d297", - "index": 20 - }, - "script": "48304502207979d082603be5d5d89b442b39c087937bdb4c2457c4be549a8b2be4e0f6d886022100f918741d2f66e21d602414a2f1176a4fc2bbc99676bbb121d736d74eb5f9b658014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c0b333af1a8a94cec27fb95bee8e8d730f04d86626c0bfc6085c801ee8baa675", - "index": 36 - }, - "coin": { - "version": 1, - "height": 290937, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "c0b333af1a8a94cec27fb95bee8e8d730f04d86626c0bfc6085c801ee8baa675", - "index": 36 - }, - "script": "483045022100d26e02c77e5297c8c6a9bb08e91898c0fdea60e3000d466b2afae73c5e456f3d0220768e50d52e4b92f84159e597bc1f9f2d601ceabae7643af686f7ccdc46b84894014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "28879262b704c3930b0b811771d8adf72391cb637561f28e117b0f833ed619ca", - "index": 19 - }, - "coin": { - "version": 1, - "height": 290955, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "28879262b704c3930b0b811771d8adf72391cb637561f28e117b0f833ed619ca", - "index": 19 - }, - "script": "4730440220310235d049e6bba16a2bed5536ad9925e214c1a894aeaefd7d2ed700cea90dcb02206bf6f9305e9d93bf307feada531a790242ad195f968ddf4d498c84e53bc1d8de014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "05a086fe9b5e20ed7cc3ec10d7c51ad64b3ea609e647433a414e400be991c5a2", - "index": 41 - }, - "coin": { - "version": 1, - "height": 290969, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "05a086fe9b5e20ed7cc3ec10d7c51ad64b3ea609e647433a414e400be991c5a2", - "index": 41 - }, - "script": "47304402203613888eaed70500266a6a1f2ff4461f1bc74450b160d84d755f901eb4012d9b0220126b65b87af60966cc6a9426b965823d0a784334771b92ee511262eff656351d014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bc9cc9b271dff7d976086a37758c397c2cf8f71ec0b8b8b8a406d54e5451bc9b", - "index": 30 - }, - "coin": { - "version": 1, - "height": 291010, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "bc9cc9b271dff7d976086a37758c397c2cf8f71ec0b8b8b8a406d54e5451bc9b", - "index": 30 - }, - "script": "483045022100df19ff7fdbf265227e0449889c7bb8add858cd1d382a7c21f81ef453a5eeadf802200a48a16757b529c10759529046ff08b90ef64e37320ec9dbab5dc4d4285dc3a8014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "58d5ba7917a1510313f1d4a7f094a43c2ac2ae1c74269498d70f3d5120b10205", - "index": 41 - }, - "coin": { - "version": 1, - "height": 291034, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "58d5ba7917a1510313f1d4a7f094a43c2ac2ae1c74269498d70f3d5120b10205", - "index": 41 - }, - "script": "4930460221009625425ef9e9dd052dcf796d7ba76338d60ab57fb72bd6c473bf5c8c713871c8022100db8322b3e16f6e8907c0d9861d7924cb85f6f2536fe1dde08c0f080364ce6875014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "082de4440e569834c3445de7a9d377e598a2c27a5a0bb2a65151ca825f60da19", - "index": 61 - }, - "coin": { - "version": 1, - "height": 291063, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "082de4440e569834c3445de7a9d377e598a2c27a5a0bb2a65151ca825f60da19", - "index": 61 - }, - "script": "493046022100a76e2cef30bd1a7487e9c371c4cca8d254121f14ef86ad68298b21d29fde9157022100fce853fe4b2132f072b74c7cdeca4c7bac8e61a501cbff888830793acad55101014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "222976210ec32ca7b96e547f7b359ffb0bf1ab85dfcf822d9b2ab8978dcc62e2", - "index": 18 - }, - "coin": { - "version": 1, - "height": 291094, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "222976210ec32ca7b96e547f7b359ffb0bf1ab85dfcf822d9b2ab8978dcc62e2", - "index": 18 - }, - "script": "4830450221009bde11ea5eee70cd82dbed05ed0462140cc9a3016a896b94c5903d0d0e2ac08902207350c8b9d4f2193412b05174bd0df46e2bb102b10db03dede2d5b7dbaf9e8da1014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "34f8b917b2b47dddb289ecbfb6ccf14a233779bded99deb72cda2c180dd031e6", - "index": 24 - }, - "coin": { - "version": 1, - "height": 291136, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "34f8b917b2b47dddb289ecbfb6ccf14a233779bded99deb72cda2c180dd031e6", - "index": 24 - }, - "script": "48304502205e4f6ed9e634e4af19548b9b08752e1d081063d252a51518ea08499a34cbc4fb022100b41707ce99cf2ae037001f47faf44f05ee3954924a53384b8d332e23ffbdb919014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "839b8a86e07651c756259fdb044ff8d4620c13cf17a0e67447ba7502ba520bb6", - "index": 19 - }, - "coin": { - "version": 1, - "height": 291189, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "839b8a86e07651c756259fdb044ff8d4620c13cf17a0e67447ba7502ba520bb6", - "index": 19 - }, - "script": "48304502200d3335ec0398293a6750b7cfdbe8ffe819dccd910b905e5b33dbc212aea48b2f022100cff493800a69477684296d2399fdca1c82e72ea700c4e9a6de1fdc878928609d014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0676581a4b7bb6dd903cbf83d3e85b4b3542925655920b05d5ec86b2b13ac4c7", - "index": 42 - }, - "coin": { - "version": 1, - "height": 291253, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "0676581a4b7bb6dd903cbf83d3e85b4b3542925655920b05d5ec86b2b13ac4c7", - "index": 42 - }, - "script": "4830450220472162139401ed67c35e81c5244da998275f60f292f0bf975ef7b6d31bea8929022100fb552627ce7b46028b96589a0ab7176b6286a70cb4fb9e483f97048dc4984ff7014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "019de0dabc2a227e190458c83cec550fdddb00e16cd477dde9a617f2f2b93117", - "index": 21 - }, - "coin": { - "version": 1, - "height": 291301, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "019de0dabc2a227e190458c83cec550fdddb00e16cd477dde9a617f2f2b93117", - "index": 21 - }, - "script": "47304402201be86364523a589c6468b8d8df2754c89690ce1fec3f2bc66ebd081b2063aa5602200e24ddfb6cbc37f40a500c7d47c80c05a47f778e60738e7edcd310d73c2dcd0f014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c721c10e048a3af6249e595ad5ee7d872d7eafe50f66f8d112a5cc20bce004b0", - "index": 34 - }, - "coin": { - "version": 1, - "height": 291338, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "c721c10e048a3af6249e595ad5ee7d872d7eafe50f66f8d112a5cc20bce004b0", - "index": 34 - }, - "script": "483045022052b8a4a1d9d879ec29099d0fd96484725dbe85eb8d67788480a33dd60e765f8e022100d3c09519c357447df6a051b9e9e77081acd99455004da878db0d33a192e40390014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "71d7a4b5dc90fbdfb3e27071576f24ecd959860b586129634dd793771da06e01", - "index": 24 - }, - "coin": { - "version": 1, - "height": 291386, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "71d7a4b5dc90fbdfb3e27071576f24ecd959860b586129634dd793771da06e01", - "index": 24 - }, - "script": "493046022100f4b1814ac293cced26dd42111b4ea4deaed424a6a1540ab59fa3327e9a3f4172022100f271d081ca29b82cd08c28773cf301d876f97a1d956e920ed2e9800f83a1809f014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3ee138b338c3b8c8e45ff5c73993186b1f435e4048a01f414b1f30dd4c80ddfd", - "index": 35 - }, - "coin": { - "version": 1, - "height": 291417, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "3ee138b338c3b8c8e45ff5c73993186b1f435e4048a01f414b1f30dd4c80ddfd", - "index": 35 - }, - "script": "4830450220124d222819a74d806065c6a18f663911900ddd1955bbf15136da439f88756083022100fa9dc2a8e41465fde0b92aacefa7182981f7c11494f0b26457eb198bdc0c7b78014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2cb36395fd5bc72813af8a4c1c728f82ea09f0bfe2734cd425afefff362d5764", - "index": 39 - }, - "coin": { - "version": 1, - "height": 291441, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "2cb36395fd5bc72813af8a4c1c728f82ea09f0bfe2734cd425afefff362d5764", - "index": 39 - }, - "script": "483045022100dd8ef5fd40c2f6838300152590e83b7a1dc9a8734ce92025c1e786b477d9260302206662e78cc23a89e816bb4fb0051e5d8addf8e583336918f6206fccc6332f27f2014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0878e340c116c76b60f505cfbace9e4260d7a3b1c5b18028c643e4d8e862f117", - "index": 47 - }, - "coin": { - "version": 1, - "height": 291504, - "value": 1000000, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac", - "coinbase": false, - "hash": "0878e340c116c76b60f505cfbace9e4260d7a3b1c5b18028c643e4d8e862f117", - "index": 47 - }, - "script": "47304402206d66484461742b4d7301571c38757f1101da41542add98cb54f890b3f295152e022004b49b95b27847d974cc9ca59ea56891807767852bce2c25b7d5841f3e27cb77014104ef38079f2e78e45ba3ecb926ee3938a52d63224a0820e4bf863f13688c32c1b6d46489d4ebc180e48e8824137b7b14d7373935d30da0db1a7af699c7eb58c42f", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 47945300, - "script": "76a91481de0db3ec32b342d11099511bed22f5e6fd3bb188ac" - }, - { - "value": 1074700, - "script": "76a91479fa157cfb2f326fe01575ea7381b35abff7ae9d88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0c4195d68cafdda11b265e9d8bdd026a55088cf1245c73cf543c341f94b2049a", - "witnessHash": "0c4195d68cafdda11b265e9d8bdd026a55088cf1245c73cf543c341f94b2049a", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 429, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e7313a963e848ed4c579ff90a58d5d34cc42d0b060d076c80bb667b71ee5335e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299364, - "value": 58327933, - "script": "76a914ee5c2b4d40e430f799c7bee49084b858ca5f40bc88ac", - "coinbase": false, - "hash": "e7313a963e848ed4c579ff90a58d5d34cc42d0b060d076c80bb667b71ee5335e", - "index": 0 - }, - "script": "48304502203521dd086e832680c04eb57242e76920f1940f9c14b98731cb63f56419b72682022100d0e5bd331f735ceeea8edb647b2d4a3265f7515009e3b3e82319e1b5ff340a34014104ad5d8e98447acf93afaba5efd1689a333fbf01c4c0bbe665fb2b37014239d172693fbabfbf98f8b084030567489b3664bc055141ea551f5356ace28d456062b9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d3d84e0b71eb7807bd4683319726e09d43b11f75df47e47082d34f3074ceb43b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299538, - "value": 13362054, - "script": "76a914ee5c2b4d40e430f799c7bee49084b858ca5f40bc88ac", - "coinbase": false, - "hash": "d3d84e0b71eb7807bd4683319726e09d43b11f75df47e47082d34f3074ceb43b", - "index": 0 - }, - "script": "48304502204337df18cb0f640cdd7a8e8c7ad75656ed914ce112e72e9df7ec94ca9369374b022100935ae3aedefcde55a46400482aad2d2ebb1d3a9ea252eba80f62f022fbcf8309014104ad5d8e98447acf93afaba5efd1689a333fbf01c4c0bbe665fb2b37014239d172693fbabfbf98f8b084030567489b3664bc055141ea551f5356ace28d456062b9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4315bd763df04e2197d6d1136d41504d5deac4c6514353a9e78a1ca5080174ed", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299565, - "value": 14293882, - "script": "76a914ee5c2b4d40e430f799c7bee49084b858ca5f40bc88ac", - "coinbase": false, - "hash": "4315bd763df04e2197d6d1136d41504d5deac4c6514353a9e78a1ca5080174ed", - "index": 0 - }, - "script": "483045022100dba283ba026317aa9eae5ab2d7ba667861517e1af24adb096d890d0116c09a9f022065518797bdcf1ac0494463cf664ffd585954e902f88ecabe38429ce148cd5cd9014104ad5d8e98447acf93afaba5efd1689a333fbf01c4c0bbe665fb2b37014239d172693fbabfbf98f8b084030567489b3664bc055141ea551f5356ace28d456062b9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "11015097331b0caf7c61197f1be858f9db844026ca71368fbf579e997c0c4087", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299571, - "value": 79164028, - "script": "76a914ee5c2b4d40e430f799c7bee49084b858ca5f40bc88ac", - "coinbase": false, - "hash": "11015097331b0caf7c61197f1be858f9db844026ca71368fbf579e997c0c4087", - "index": 0 - }, - "script": "48304502200e84b7a98e568bc57fd568a5f1810a86dbab117ebc8a60ae86adb18bec0e4e0b0221009a64af14b1677a1643cc7fdf24be594f6f4526a4fe95c1938557439bdf139f6d014104ad5d8e98447acf93afaba5efd1689a333fbf01c4c0bbe665fb2b37014239d172693fbabfbf98f8b084030567489b3664bc055141ea551f5356ace28d456062b9", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 100000000, - "script": "76a914ae1cedc90b4a1eb610da3169ad6591fb4e36dca588ac" - }, - { - "value": 65137897, - "script": "76a914ee5c2b4d40e430f799c7bee49084b858ca5f40bc88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "882913bdc8781d6b181825cc3d986315400201d02375c4015df948e20da4d96f", - "witnessHash": "882913bdc8781d6b181825cc3d986315400201d02375c4015df948e20da4d96f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 430, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "341aa4dfad4549d0285538c7faf115e939c7d62fa4162a4b28033e78b5d95860", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297751, - "value": 3334419, - "script": "76a914f5a41d860ea62a8d279a25d538f094d1202f245788ac", - "coinbase": false, - "hash": "341aa4dfad4549d0285538c7faf115e939c7d62fa4162a4b28033e78b5d95860", - "index": 1 - }, - "script": "483045022100a3cca1512d2d79e6b44e9662a13a55e04b0d85c0b17d0aec5d09bb8659beed4802204a6e5e0328d11d1b8a1020e81fce72d763a611f73879000b36a370226f389b40014104b43c0e7afa2084a29d9ac02bd7bb75478fa7902443a6d2e5f40e1ba43b5e306c169ed1a20832a9ff8940f20e37ac99952e7e6b0bed44a80d4a89b6f16b2ec949", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "450b6b36797fba72ab67e434efac309f62a24b20386787df76a34c4acb564b7d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298445, - "value": 1517203, - "script": "76a914f5a41d860ea62a8d279a25d538f094d1202f245788ac", - "coinbase": false, - "hash": "450b6b36797fba72ab67e434efac309f62a24b20386787df76a34c4acb564b7d", - "index": 1 - }, - "script": "483045022062aefc01cbb8a9d607c6e2915c44f1e3a0af7b053ba686e9c71bcad4a8d271dc022100937c830f6b82c308cea49fb75a8e619a51538a776751d1b5a340bc627c24da7f014104b43c0e7afa2084a29d9ac02bd7bb75478fa7902443a6d2e5f40e1ba43b5e306c169ed1a20832a9ff8940f20e37ac99952e7e6b0bed44a80d4a89b6f16b2ec949", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b7717281af221c5300c712968530a526c8af2cc80a255102763be8ce65644946", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298709, - "value": 5506024, - "script": "76a914f5a41d860ea62a8d279a25d538f094d1202f245788ac", - "coinbase": false, - "hash": "b7717281af221c5300c712968530a526c8af2cc80a255102763be8ce65644946", - "index": 0 - }, - "script": "483045022100cd4eaa45b2d519b8cb5cea50e7706a04418a774bf8ae59a374deac5b58629cb902204e953e2209a62718086f77e11cac3ef2881d8c48c976ba67d417b11676f1d463014104b43c0e7afa2084a29d9ac02bd7bb75478fa7902443a6d2e5f40e1ba43b5e306c169ed1a20832a9ff8940f20e37ac99952e7e6b0bed44a80d4a89b6f16b2ec949", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d701d9e17bc58c8eda1abfef062b6042646abf9f7deb8a818505383215c41a04", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299022, - "value": 9505966, - "script": "76a914f5a41d860ea62a8d279a25d538f094d1202f245788ac", - "coinbase": false, - "hash": "d701d9e17bc58c8eda1abfef062b6042646abf9f7deb8a818505383215c41a04", - "index": 0 - }, - "script": "483045022100ec2c1d71df68546d854825ef856aab3812ae678d8ca744ac902edcb02a6f0db3022013b787c68ac47bb71a88bec3ed51db7a80993f2a2d884f1c62081a6388db7aa5014104b43c0e7afa2084a29d9ac02bd7bb75478fa7902443a6d2e5f40e1ba43b5e306c169ed1a20832a9ff8940f20e37ac99952e7e6b0bed44a80d4a89b6f16b2ec949", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 14020000, - "script": "76a914256cd36d44d4188047ec91838a6d7dcda742d00888ac" - }, - { - "value": 5833612, - "script": "76a914f5a41d860ea62a8d279a25d538f094d1202f245788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "witnessHash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 431, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 48000, - "script": "76a914ee0e6d5d11038aaab9ac35809b4963aefd1ec51288ac", - "coinbase": false, - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 7 - }, - "script": "483045022013416fa9fc58a3c2df366839ece51fcaf7f0cbd29f2b4f2dd993caa7c3fda0b0022100e03896d17ca6fdf4ac46f8c3b849a79d8cc67e5dacbf09f897006be52fab653d012103faebb2f2632dce045e966799785845e652093a9825ad1654fc639085449e5ad6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1051110, - "script": "76a9149b876bee60b0a22127aa92766293c2c020693e8688ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 11 - }, - "script": "48304502200211dec14ab46336288e5bcce4920fcceba43d9da5bfb1128eea21f7abbb3a4d02210089435859d660dda2cdb5ce1f23f5babd7342a6064792fda93e9af67dd6d1e9bd01210200793dd6e17de5b153c79cfb0db9698e108dbacfbca5f04fb32e109c7e960aa2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 24 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1154953, - "script": "76a914c3e48ee1e2b01b5965f86915866f0f4cf3ba5bdd88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 24 - }, - "script": "483045022100b3bb8e86df47a2ef776e86c625e7a93717c13383a66edd17489f5e8f1c553f4d02203c6091dffea24aaa5d331b882d41bf844a2c5a3c7f908a9ca7a9703ee870de400121025f61a22d431a5dd1c1c1d2be16131857566dff2708784dc11b0db791836434bf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1061180, - "script": "76a91460963818d263eef7c39535ee486907725284e56b88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 9 - }, - "script": "493046022100bd241160e59979a1427123242edfac401d9f529fecccc25962ebaac893034cd2022100acdf00714bd327623162627116d24bc6d5a4eb691e63cffb5aa06f5ac2834e1f0141042012a1eff7027e5ec566a165f5c2961fe2a7eccdc363c54547b95b0d230959b12bd415ada9539ebb9521451b14ec4e73badaa23512a4c68f7944abea54b2d1d3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 4 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 9500000, - "script": "76a9147b4bc9e5dfa9f937d7fd61f2f7eb17c26673345b88ac", - "coinbase": false, - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 4 - }, - "script": "493046022100e3e3e54a3a120a776fba422984175982de9b72b0efdeeb536ac7d59c9cf44d93022100c93176ca94b2ec31c2a57d75237e91096c8faf0f931c71fa024779e069d0126c0121037525ec2fd520edf41cfb527a50bce59b051e37fb14b382c09cf09b478049184f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 29300, - "script": "76a914b296784c7aef7360ce1b3f710bac7e5f7bca9b8288ac", - "coinbase": false, - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 15 - }, - "script": "48304502207ceb47d5d45bd61596691f315da427f850f3fb2c3b7ca9fbb857833e19107ef1022100e4440c376c70b0a5acc34cf7d4e70e12df328b2a51635a7cb939b8d6be58440a012103a09c4fc4c94d013d2febfdfe3ade4bbfdde075fc674f40bb73ef781422fddfd1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 8560254, - "script": "76a914e10fa8db1c02c0973d4c2585bef6a8cdfd88235988ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 0 - }, - "script": "493046022100937a8d5d570bb0cef513642d4db1a014b4987a81eea21f16fe84c8356bd2230e022100ae231bb3118b2dd1b58586bddb9908721e52fcedbc085dc71c389fe4aa0c8e44014104af7419598cba95105d77987e95b58c80bf5114eac453404ded3687f4a27cd174cb3f4123ec58cf8c0653cbcd56df8bb2e77d5744636f92ee471fce43984a869e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 14400, - "script": "76a914d648c2447ce85c3be4ffbdc0860f97c9d73996b588ac", - "coinbase": false, - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 13 - }, - "script": "483045022026c18c5524bc14526c8e8720241d8604b8bfbcda53f53ddc120297caafa8732a02210093b3b143d164d4f8b1b919eadb94e7745bf20e98736186e6d14608f362b67e28014104e5894b00bcd6e4061b7f1cc9aca223f3cbf0ea2b698fb265ff81d531a64456547f8a5c5f1630a9fffcace1c55aac86bd697f0c2935c6c6036f647e48d8400d26", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 9572400, - "script": "76a9146758f159f35bfe097fd96e9e61ff2d2970e27c6588ac", - "coinbase": false, - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 17 - }, - "script": "48304502206f9a8902a23754508a0f6891d4d62b39b9b529d79115298730e6d8b5f667e047022100cf13e91329bbd82d4209e1df01b85622636418cb6c587498cdecd3ca05a1b2f8012103922bcc8c7d42bff473624f04f2dbcfec4eaecc492a7eb1c2b868d2677cd1388b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ccdef6ffe652f1a6e037242c2961cdcc189904c9ce61d9bd9b25582016f930a", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 286830, - "script": "76a914ab11498be0fc12ba8acef0cdccd9ea2cecc1273a88ac", - "coinbase": false, - "hash": "6ccdef6ffe652f1a6e037242c2961cdcc189904c9ce61d9bd9b25582016f930a", - "index": 12 - }, - "script": "49304602210089654919a2ec41d35ede85e6e74c6179403e9632c252453c0e3ab8691aacbd40022100bf5f81236fa630fe7a3ca3c77f16acf35a5e743ea7421d9f51d3589a5b9f04c2012103b6537d8b0858971574ef6714ea7ffd25310c37cc9dacd0cc63dc14a51c68a16c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1134504, - "script": "76a91455efe56cb551a42bee92a1a625e8b93c48db53ec88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 16 - }, - "script": "493046022100ced5238277f7f45f51d4c0879e3c1b99bae9f707b96a5fc7f3dd2d813da72916022100f1a5411196b8954d25aeb3c2aff8656af4288a28fab55f8e71648def74e282bf012103cb3d8bc7073157f7a69e2819495746c6570405f1157f841b5d52663fe074fa32", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8056d3a86a37e9dc7f0b18953137c1d562ddaa2d5aaf4b42434a8c4b2c1346b9", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 9550000, - "script": "76a914eecf53dec9d8c7f1afc89ac6a52ab1dc73fd215b88ac", - "coinbase": false, - "hash": "8056d3a86a37e9dc7f0b18953137c1d562ddaa2d5aaf4b42434a8c4b2c1346b9", - "index": 17 - }, - "script": "483045022004f07b1d684ca0d10d8f3863cf78bc835e42069a3e9b03d2dc931492b180021a022100b84a66c9afa211272c9f34c4af43a21d5b7eaf9155656376db05860163eddc13014104a39e08effe523afae413a3c522b0109683286e0dad04263cc909ea3132f24e8c9dc79e03ae4128b4bfba66b21c858a3065106364ab31115bf9488cc2d9820e7e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "09be2f4533dadca1810a9fc669660ab764b6534e8579c3055f01f589cad27fc8", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 9514242, - "script": "76a9144005db4e32e8e0ebe6bffa43c7fade2e2a6ef86888ac", - "coinbase": false, - "hash": "09be2f4533dadca1810a9fc669660ab764b6534e8579c3055f01f589cad27fc8", - "index": 13 - }, - "script": "483045022044bf3dbf8ee109bb5f7a07964ab30c7992785bdb501e8e228a76f7e05a1fc4e00221008bf183973623c86c8e59b27cf0fcb383d42e822b2ed6e507fa14062ff2d2ec7b014104cf11a3d1ce48697381f9e3350ed9445536c154434c214ba71f7884dd28eb46ba9cf93c090d66ca655719a84c7a1189f6027057079f6f1cee0c1061c11cd91405", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "51de59b21d498720af3dea2b4be148293a097ac722d5ac71449fccd74020d8c1", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 9570000, - "script": "76a91445e1692c1a967788443107f954f9863db3d314ab88ac", - "coinbase": false, - "hash": "51de59b21d498720af3dea2b4be148293a097ac722d5ac71449fccd74020d8c1", - "index": 8 - }, - "script": "483045022100a0ce935c5c12323389b345c632f629256b84555d525f9de1b6e1b9ac6c44d66a02200fb5b10938dba688f9d9eeb25059edc2cd45487ca6b316c48379f797bbc5510f014104948dab191448c499f08e0d1594cc3db208e8420e45619b83832daba9be6c01eee1cda7f1ce53a88ff912186d750a4d3295d0f4a6e1a8a74376db3453f1ebe54a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 9500000, - "script": "76a9149d36eec441f742a4f1d72b194c08c72a436084da88ac", - "coinbase": false, - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 2 - }, - "script": "4730440220726f55c66dbd738f7903697e4a1e49ca96770d2c09068678714d0fcd4f92fc9802202ead81528be4d583bbf1be95780cfaf04c40d089a57056e04fa9b5f802b44d0d0141048d8cc6fe4e5020f61b7f7843d649f3de86ba2f2f62abfe3f5557c637e8e0d50f0fad24e9b9f1dd1dd0a7f6168b5828908b2839029ffdfcc53205eb4f5037f1d9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 12 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 9500000, - "script": "76a914dae45f58490cd7f8cf1ac24831a2d5fc8a03572f88ac", - "coinbase": false, - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 12 - }, - "script": "48304502202cd0d0eecfa392c60d43c1b9478c9e380772fe18dc4ded49339b45d1754bb47f022100a0ebb0e96bbe628bd2e36f6ce2acd36bf1cd7624eb992f0b3a18bc12f1689e79012103ffdcad4947162e1f05ac7cd9850243f4cabcc3d1e47da6d3a79d37823d2d8804", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 29 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1081270, - "script": "76a914e2582a18222a746c1a01ff54da39b66370c7c7e488ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 29 - }, - "script": "4930460221009121b75159d788ceec1b45d61747417c0ff5c1d743618c6339fc23f01fee12ef022100a27a5bb0d7c01845c3c91d1ab648c7b15d068e007e11a6c48256da98a21094cf01410429d26c13ed6eb293203e6dcee47ecce26961b072040fcad602ae5b01ac8a270f0762475acc10150c4ec59a932362cc518203d5554af25ff439f805c6fc7ee3d3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4d301d92c7b7f47b1e2d8695fcd8c6751ad225166e71b4d96e7a0eef9bcca6b9", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 6400, - "script": "76a914fba5c9f2914b8a1535d2e0ed357a82fea278e77388ac", - "coinbase": false, - "hash": "4d301d92c7b7f47b1e2d8695fcd8c6751ad225166e71b4d96e7a0eef9bcca6b9", - "index": 10 - }, - "script": "493046022100fd0abb43deb34a3219e9e9e23721e7fd183418857b4d7f341e0219820666b209022100ec90375daf50705d47d4bf99bd8e4160c4157bfec563f8c29e88bb04e474c7b4014104d3ac7b5fb4186208572d190fae26a1a08316d5ec70310ca15db6afd4f3ba137e174edba09a234da12f00a5373ea80fb17d0acd413831042c24af17fd2d532911", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1093937, - "script": "76a914fb75466d25a27c946c1c63a81321ab41a0fbebb588ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 0 - }, - "script": "4830450220746acf66a87d3f0387acc9dba10f46d37a16ea9e3f26961961cfb18654d03dae022100c4fcb832faa1c3523575a28772c31e0bdb2ab862dd78a4e124ac044fbf9bd22f012103b0133e2eb02562f64d5c00045bac5bfbe94a7ed97f3167817308eb230f836c4e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1039746, - "script": "76a9143800aa036fb904fa5f1266a8e92342b8c48d03af88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 15 - }, - "script": "47304402205a3bfbdbb6fb9b51c6f8caa8481350ac6d322f210fccd9c03478fbe153c0e81202204411cbc3dd3e6a13da1774c05f315a949aa781626f7632042f0c4c59a1aad1aa012103189bc1b81a543af314e0b6b3bb9fdc02f6ab60df35a10f6c50f7b5d89f705e85", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5196620, - "script": "76a914f2e2e2acbad94f0fc0c5c7eafe21ebe615fa1c2d88ac" - }, - { - "value": 4800000, - "script": "76a914880c2295cc27e8903ff122b51b5f43f88fd6dec288ac" - }, - { - "value": 4930000, - "script": "76a914a5e7f6af5e4cb40484f238b58a2ec18f4562bee988ac" - }, - { - "value": 4353400, - "script": "76a914521709913c73b6bfd4887b01e5b00819f52b8ed688ac" - }, - { - "value": 5215000, - "script": "76a9141e5d736be3911036ed0a6e1e6f90c3afc93a4cf888ac" - }, - { - "value": 1097127, - "script": "76a914eb0c5bf618f1bbadde639ac7db36a9ee33efa61d88ac" - }, - { - "value": 1059769, - "script": "76a9149fcfdd594fb86a45c6c98e9af9914e9e57a599ad88ac" - }, - { - "value": 5165860, - "script": "76a914fa3ee28d80d7695195dda8c31ccefc69562fe67588ac" - }, - { - "value": 4334500, - "script": "76a9143cc22dc842599bade858d0a8b4ee4b75b2c984c888ac" - }, - { - "value": 948633, - "script": "76a91494ff49bac8f59b14d8cbadc037f7d564808454b788ac" - }, - { - "value": 959530, - "script": "76a9147a49f1e8b2599cb3fc83d942cd9dc673f6d9eb4688ac" - }, - { - "value": 8542404, - "script": "76a914001eeca11b371d26b789df3ebef64774fba3912188ac" - }, - { - "value": 4616570, - "script": "76a914174773b9518fdc6d85fa8195511bb9fd844f000a88ac" - }, - { - "value": 5190000, - "script": "76a9146e228e35479a37584710b815a29a7c3d8feed8bc88ac" - }, - { - "value": 1022970, - "script": "76a9142b624997182ce88703d213fe10ed62f50d2f5aac88ac" - }, - { - "value": 4835100, - "script": "76a9141dffc6e7fda2bb72cbeafa91c87232c8e0496cb688ac" - }, - { - "value": 4384140, - "script": "76a91485b50b85693a167dc2564bec17554194d00e588388ac" - }, - { - "value": 4362280, - "script": "76a914daa78d9bf530ae829be23623bd2de5d6f31fc60b88ac" - }, - { - "value": 1735727, - "script": "76a9142c7fee6ddf2b32a45eb76b47c7108db89a1ba2c788ac" - }, - { - "value": 4714900, - "script": "76a9149bc19f38ea63fe855d63cd4ec26ef779c021737388ac" - }, - { - "value": 1007596, - "script": "76a9148636eae752697f53d80bd695fdaa0a6109a5fe9988ac" - }, - { - "value": 4746400, - "script": "76a9142f3f5b2a16292a6cb3fdd1d939cb35b603cfb7dc88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "40984b437ba75ad1f97c6bbf843559c5a9b1a865534f1055ea895e2b112918d6", - "witnessHash": "40984b437ba75ad1f97c6bbf843559c5a9b1a865534f1055ea895e2b112918d6", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 432, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 22 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1131338, - "script": "76a914388f8f48cea1a42e8ce5c6bd18d4aa60eb58d20388ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 22 - }, - "script": "4930460221009f422daf42f8af36376f0e5a2ff9cbf91e36c013a0efd2dfc96e3b9440d27740022100a1d3af2b168b6d2899d6477a14a44302e290641e9dacc4ff2ba73245b6494340014104bcf8140fb1aa02796013a4430974099911187ed03bf8fff50a3b97f9b926f60ce47f5c19685aff836da451cd1359cc6a147e8698a0c4f32ba5655a9d8375802a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e28ed39506ef83514255eb37a8b63bd7c4af849c375deaf30348bff733d35477", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10000000, - "script": "76a914fb1ed17dd5306aba7f23f9ed7930ea1f2cce457888ac", - "coinbase": false, - "hash": "e28ed39506ef83514255eb37a8b63bd7c4af849c375deaf30348bff733d35477", - "index": 10 - }, - "script": "483045022052bdda81403bd441bf577db9efe505ec58924234d9ca8e7d1961ffc26d7e1d3c02210086cb38761162152b0bc2e9b08d2bdbec1f3a81d4051b614574e658fdda16737b014104b61c37426f120558941fee0c1d0f01a1f4449163d3b82b9e9d418d2a07f4a1fa22888a4fb5cabacc62d6b20ea60111ac778a16f2027a95fbe7babef278e3e9ea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 30 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1185698, - "script": "76a914db5ca71d23d57e2cbc39bc3212835c613bdb0b7488ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 30 - }, - "script": "48304502203c1a7a0130c456d97dfa27eff571845a3aa1e1d338d73924052f038d03a7302702210097dbfd97f0caff96c53290be97958abe2009cf2296bae8bb70e64d71b632069a014104a71bee4a4cdf3346af78ffac8a851a3908a8efab3dd138d5928dcae7f6040c9ef02c277b88bbe7f5605fa7f06828fb2095d55313052d35fc832418795cd5e8c5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 25 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1062907, - "script": "76a91418d361d7c8ce9d2c8e986b44dce333253efbd83f88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 25 - }, - "script": "493046022100fea16f8b0baf57fce0a471e088150ab3a3b87c89b0b6e7ae52d02bbbfb5ad78b022100a2e1dbe800dbcc25b1a6913a8ec72309763327b43b09ac8d6d03d12892e7a9e8012103f5ddc1f0473a84dfaa753ed518071f0d078e15668ae5765523b18893520fac0c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1158761, - "script": "76a9147ccbd11e65558747ff3c29e18e98e2f6ed3ef96188ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 18 - }, - "script": "493046022100fec0abdd8f1793d3ba3eddab582bd677c3336aef86e3ba2b1d5ac005fb6c342e022100b3e27aa3423e3cae54aed6d310a3aee1a4349257040d496af2aabb48b26451900121034a273eeddf927c1a06a504e4c52236c6cbbb389db73c67e25c155824f5c248ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c585e0e388f7a5217f5e5c304cb1f4311b75c1fb936ff844686ac4fb18a8e2e0", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 9902720, - "script": "76a9143e11ec794f4d8804ad17892bc9460b092af94d9e88ac", - "coinbase": false, - "hash": "c585e0e388f7a5217f5e5c304cb1f4311b75c1fb936ff844686ac4fb18a8e2e0", - "index": 13 - }, - "script": "49304602210081edbd1c470d38147eb352d2218d6665ef98be701dda6b921f42a853e41fe2a70221009b5e395bfbd09e6d52a7523e6b9621d77dce9983eef5e7d01b68b602ae89dfa9012103b06bf59d38fad5c6d37bdc2b9093dc465f81ef62ad899121b091424de5a2ae10", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10000000, - "script": "76a914714b66260419fe61d97e6cb6ddc38f803eb9899588ac", - "coinbase": false, - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 4 - }, - "script": "493046022100f81a2121c70a85a54a4f7d8676813a693f3af5fb2f69d2c3d86dabb0355b60e2022100a6f1a958cb70630c33c4008260e8d2d4a4ed26421c9dadece6948b32f6747a18014104734702d645fa6f84194c6edfe1efc0914751c11007e80cec7b501bac45dd8943a0f53dd35e9b7431ffc53bfd1195eb3871b7fb5342281112bc5a6c9451022e46", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 19 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 942530, - "script": "76a914926241d1ee121150d7d71f2c3434348d8969764788ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 19 - }, - "script": "47304402201c070b6bb7a0c000fc6056de5d74fa43baa84bbe9bb2acc564925fc4bb162fff02202540f271bb7de2128374821f91c41247bdb77b37a5e369843037b3de40a72afe014104fe79c66b2b0d05f380efe6017515cd314e5e74b68c2ee012dc15455dbef8b1f50fc24f6f41ea4de459b17217db10d669cb5d34969c5668215bce1e6078806298", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1111186, - "script": "76a9143042caa17295ebb8047ddb51c080a67cb04cca5d88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 2 - }, - "script": "473044022028a63ee9c374dc570efc9d81e07818c7e0b4100884042a7ae267f4a516ebc4fc022065f60f898bc370d0c20de8c5bbcb371a5b4bf59cc675f43c3a6ef18966436d0701210272cac8b4be2bf9daf70d942d27808a3d7df73130045dd7cbda5dc24c531aab00", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 993850, - "script": "76a9147a0e98d4a5e81245e33a90c962420440f307d0b188ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 16 - }, - "script": "493046022100c87cfa2525991fbeef8f3d4838ee5576a288b0d4f660856635cb3f9550cac9f1022100f719f1d33d3dec02d1d36c5313c488900a87fda7e5d4500357479bb08139d990012102359a57b88b7e72baf9564158d183f370fb8a7b2cb9ca672c6089cf68a5989e78", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 967170, - "script": "76a9147c4d01993c1ee950a4ff1a03a3380972653e2ab988ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 18 - }, - "script": "4730440220432bd86967972d077e7d65a95a53f70582eeb234bbe2f8647e97c24572894479022022df6f98c0730446954af7fb860c7353f678eec961ed191f874555b695ee7746012102a7e7d735afda9077d791a2b990dafad9dd9a36b34408aa7a5f5ef9dc7ec2f6af", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1196936, - "script": "76a914a020e4d1ccbeec080f21ac8fc35ce6262fd2b8c788ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 15 - }, - "script": "483045022100b7210b2bb03018427e5cd828918a1ab7e03c1ee4362e6bdb7ec758f98a30d91e02207f32e9f33ee8abfae4c6513f244af40aa6dfa70ce5f9035878811d2163df8a8c014104283f30f1ad19de79f4a642d50a7221e83dd4492c304f4b05e915286da2a4ad54402e7fd4374d070df3979c0dbbf2d1c65588d3a8940d5ac5df24218b3ec80de7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8542404, - "script": "76a914001eeca11b371d26b789df3ebef64774fba3912188ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 11 - }, - "script": "493046022100ae33f34661b84e7c5af7765e1bac5e60e3175fb0f7d4e0a3f95164876ebf4fe2022100a3e73b8a75769bef7581f9b88827fc44f762581cb1900f5c0f50acbf4876dbbd01210308d465ec11d2f8647e11329e8cf75f447c6a90f19ce3673c852bbc4edc1ef0d3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 14 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 10000000, - "script": "76a91451dca4884161ba843e1b6d020f3c4ffbe4dbc0bc88ac", - "coinbase": false, - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 14 - }, - "script": "4830450220012ee08d4e5b7765d8440c16906ff1c91146d02b1333c964f139eb82cb1c468c022100c95b6fa8d4b4b9c3716e3e8d50e64476e2811de71f11c229a1e803a37524708f012102c5861e1992d9222869c50656e4e109d9bdba774fb5ae2fc337fd6cdebdc9ea47", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 21 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1188830, - "script": "76a914dd5c5d81c470bba4177ddc400f7d25fa40372f8688ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 21 - }, - "script": "47304402202ba9eb84973f08011fc8cbc7a5f9f1e9b573fad7514f4586836d64b5eeb0e288022054d4c8edb09ad0db69282862d6dc33328129a9d3cec53b175c908ca7645b25d001410495a8ec04c1a5cafd89d50c5f6a8ae19f70aaf4576cb5f7db06f5a91f280925436b81db67d1bb3f9a20b4b5c09667c5f82f33faa71ac5572d526f80f37e6f7ec5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 24 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 939937, - "script": "76a91457090fea0f1c33cfe548cb6d560b9499d945956388ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 24 - }, - "script": "48304502203bb14663c72874bb52472ca0f48489637cedf3f7d2542010738909592f1e730a022100e26d45b7b9974b5edb8b2fc632de9cb98a2bd8e9a915dce3af049b3c2d3e3ee5012103ec00b47f606abf45716646d803d1b0fdc1f71449eea25453cb355f444abed36a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1167247, - "script": "76a91416dc4e564b53557bda01931be67f259e83f9abf588ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 6 - }, - "script": "4730440220169cebf520ca3860b66cd291b4a4063dbe60cb9e9c3b7727e42ba4312269e3d9022048b580611883eedf0fa909de119f26eb1eb4880885f0a33afc590f0339cb11f0014104942e75fefbb00886172e9d4cd48a1b2895480e4c0d77e50d317a5f02fcebfb724f49aff635a79bfbe64d2ec0a12da66dc6db6704a92218278b9fafe45e7f6175", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 20 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1007596, - "script": "76a9148636eae752697f53d80bd695fdaa0a6109a5fe9988ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 20 - }, - "script": "48304502201b070254398a9ba8e5f3f4a23866b4aa7dbd8c124a61c761348dd347b3f48da9022100c09a1e9b665d5d657898ef1151cab3f2cc608aede1ce685fa917565c23994e7b01410447b5cc15b2dd5b5bcd788fbc35f4da75728a431b423818b9b5c3b33aec298eda1e70c1926361b838d5ae415089f11b829de637de7517561cb344fb697668aeca", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ef213e922ad1d05bead701c48b689730d7f78e39c8c801d2fe9eda4610fd42cd", - "index": 23 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 10106372, - "script": "76a91440682e61dcd36578c80e10beea532c6e3dce358688ac", - "coinbase": false, - "hash": "ef213e922ad1d05bead701c48b689730d7f78e39c8c801d2fe9eda4610fd42cd", - "index": 23 - }, - "script": "483045022100a56e04baa0e128a984579d4fc6aeb12ef39819624a6c22b41e05f850ed6cbaeb02205942e1fea60d0976a8992cf320c318edfbba9dd40a9593751b01a3b1fda4189e0141043ec5e3a3c72204ebccf60ae47f67e4b5433a5ca533602e12ea59b5f9b1587770b756550c73f670f239b7f6d23dc523a80d9f07b1bfbd11e5dc87282af04be67b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4f973e5994f73c02189b1f0f3e2179e7faa6ca6b213ed01377de1b959891a931", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 9700000, - "script": "76a91491cb473ab14d9b6464e7ae218786fff7c07a802e88ac", - "coinbase": false, - "hash": "4f973e5994f73c02189b1f0f3e2179e7faa6ca6b213ed01377de1b959891a931", - "index": 1 - }, - "script": "49304602210084ed90b6b05c70bb9ba2f105b4d4c6a462727738b93682a20c43edccc0e6068f022100ea62590b50f33b7ce93f1d597a948d03b21ec62ca72a1a1e5e69b08305e11edb0121025958b38d8cb91558d64080e4dd1948e8785a0675ba851171d4f468811c7ea66f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e28ed39506ef83514255eb37a8b63bd7c4af849c375deaf30348bff733d35477", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10000000, - "script": "76a91425597bf2e7e2f9d428d3547618b3db5113658f6188ac", - "coinbase": false, - "hash": "e28ed39506ef83514255eb37a8b63bd7c4af849c375deaf30348bff733d35477", - "index": 3 - }, - "script": "483045022100b73494eed9f9e232919a47939ded8f340a6bea099973740dda1dc099f8f282660220677f90843132c04dd46f13b2e31db400cb554b95a9dec2559ea30244d92c935301210252fbe4b31224f78387b26dc15a480448fb2b6afb480cd194ab2fd3b0a6d95778", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a3fda664ad3c43d74b16c77f9e43d542b7d97096192391be1b0765ce62e5ed38", - "index": 8 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 10000000, - "script": "76a9147fb1ea69db640a2016b9d07b744b1dc58b26dac488ac", - "coinbase": false, - "hash": "a3fda664ad3c43d74b16c77f9e43d542b7d97096192391be1b0765ce62e5ed38", - "index": 8 - }, - "script": "473044022078b46fd17d8ac340334829d4a745dd8068eefbd85887c37d21eb7a3fc245682f02202365d85e20fa8d46e60d61c82bbdcb3b158394afcad974bf9607d263879e72f40141047d22b58275b44fdba31172cde8884efc654e61449abcabb1292aac050c862687413d5cc40889f4a5af0914ee0146a88404b79f2b81bac7ae143b2889b9bb6816", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10000000, - "script": "76a9144cc1f278d7d6a5492d48a2284fe1ad63f8cc0cd888ac", - "coinbase": false, - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 8 - }, - "script": "493046022100e9690c516619867ade528e1e972a2ecdb2a1d228f0e9785dc29d3a184161e507022100f7b4108297d7ee3610414b26065987a145aed1518b84d26317c3142f4385884f01210379d390cc5d9329dd10807279e6efb9afc2e82da5a8ea813d71cb97726593cca9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 16 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 10000000, - "script": "76a91445e1692c1a967788443107f954f9863db3d314ab88ac", - "coinbase": false, - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 16 - }, - "script": "493046022100b4b48219328ad6abdf1e6f7d87294685e83930b11b955487b7a9eca782055e6c022100c3ca4c9d50a70cfbe41a3c9c80103c424361bcc2b08b5cb4d6c77bd066d6b953014104948dab191448c499f08e0d1594cc3db208e8420e45619b83832daba9be6c01eee1cda7f1ce53a88ff912186d750a4d3295d0f4a6e1a8a74376db3453f1ebe54a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9102df6151ab4f39b75a038a66c12f8f73d89d13d97a9dfc7d454d18a9eeb210", - "index": 15 - }, - "coin": { - "version": 1, - "height": 299998, - "value": 10000000, - "script": "76a9147cac0158a9465e19d193aef906555c87413b144088ac", - "coinbase": false, - "hash": "9102df6151ab4f39b75a038a66c12f8f73d89d13d97a9dfc7d454d18a9eeb210", - "index": 15 - }, - "script": "483045022021dec1a5377f46f92e75f5f03d55c2afd34ab978a34eda76f7baa4dcbc2ef2cb022100c173da0ea68923457cf83c88a664a5f7f974643e68b18abfb16575c0a72b367b014104c21c35e823441370c01b346270af246f4991381767e8de501dea1e553611ed6db613b108f15000189ed83af82716247faaf3db329e9318705936d2a951017eaf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 11 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 10000000, - "script": "76a91448221c49f40c9548dd49601f7e257f4c73e62f9d88ac", - "coinbase": false, - "hash": "1770e25f69e7c0bc95b209a094c8f7783c4bdb4a32fa8edf19b8358daf838951", - "index": 11 - }, - "script": "483045022100d28035c7e25da835f1a786298843b85182bb1d3545153ea920ee6b010f0c700602204f89f9c7084d904861440af4b3adfd1d516561325666662e50b332435dd0ed3a01410495794fbaf5f05c14572e15abbabb373b4c85fb0dbf75972222041e2d299e8036704495628712f3ffa57bef3301e3d0f3055c9d2826e6c209578f2d4248704a11", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 9700000, - "script": "76a914f199be8d88b959171903187f8d5f7481cabee37a88ac" - }, - { - "value": 10000000, - "script": "76a91406653377a0240c1057d8bdfa39680cef4e7dc53b88ac" - }, - { - "value": 9500000, - "script": "76a9146152525635ce5b4c7add61fe58b07a74010f463b88ac" - }, - { - "value": 9000000, - "script": "76a9142bb8506f2e4236d7c08ef0adb080fe995e38612688ac" - }, - { - "value": 200000, - "script": "76a914fd0734de6e5adddbacdc1feea2bb0440ee1aa06c88ac" - }, - { - "value": 10000000, - "script": "76a91433feee2c850a440d9224c1185de0188b45c8fcb588ac" - }, - { - "value": 10000000, - "script": "76a914234e6c49499dadfd4ffa90c348651f02444b226588ac" - }, - { - "value": 9900000, - "script": "76a914dd628aefde9a3b86714f4a0712ca05382ae3a35588ac" - }, - { - "value": 2345482, - "script": "76a9140d1cdf73f27d9167faeae8754ca22c3fd0581c9688ac" - }, - { - "value": 10100000, - "script": "76a914789b14a48d10c6ab22b9b0873c87a27883bd255b88ac" - }, - { - "value": 10000000, - "script": "76a9140df163d11ecce237042f438734d668f8ddca9dc588ac" - }, - { - "value": 600000, - "script": "76a914c517c7af71e20f37b39f90f17df0b9a778652ce888ac" - }, - { - "value": 10000000, - "script": "76a9143839e45fa2062b1c12b06b33a63241c3be621df988ac" - }, - { - "value": 10000000, - "script": "76a914e18b75edaf4199586cde868f6bd91e7083b96b1588ac" - }, - { - "value": 10000000, - "script": "76a91487f63cac71f664d0624a232091e4db93bcf8256988ac" - }, - { - "value": 10000000, - "script": "76a9146de67278829be2747d488e696da46994c72dfa7e88ac" - }, - { - "value": 500000, - "script": "76a9146dd3581a572a1150bda796136c41345da065108088ac" - }, - { - "value": 400000, - "script": "76a9148de2c86ed9dc08e56d37b444acdc00092a22ecfa88ac" - }, - { - "value": 10000000, - "script": "76a9141d638c2449e194915683de830a42abcb4f08b9b088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "witnessHash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 433, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "40984b437ba75ad1f97c6bbf843559c5a9b1a865534f1055ea895e2b112918d6", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9500000, - "script": "76a9146152525635ce5b4c7add61fe58b07a74010f463b88ac", - "coinbase": false, - "hash": "40984b437ba75ad1f97c6bbf843559c5a9b1a865534f1055ea895e2b112918d6", - "index": 2 - }, - "script": "483045022077db203f302c3ec007820189adaed2052a9302c777153d6d8ecf9253297143ae022100d5c2bcb49ade20bc02947a4f9853ddb786625d137c8f314591fa7b1296b0dd6e014104748c6fca99736c67901d2cafb439428b3c30aa7526936c6e782c3b9a0d27342c9e1b5e1dcdee207f00f48863b6e857cd4388a260a0320d185a67255a60393b47", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bf9d4553caf4a880e3bd72948613bd812b9e4d09eacb8b08f2992ca0d6e63ebc", - "index": 11 - }, - "coin": { - "version": 1, - "height": 299986, - "value": 10200000, - "script": "76a914c61d0ab218ad821dd41452dab5f799fe46f37d1888ac", - "coinbase": false, - "hash": "bf9d4553caf4a880e3bd72948613bd812b9e4d09eacb8b08f2992ca0d6e63ebc", - "index": 11 - }, - "script": "493046022100d2639f577e80d2cc8ecc0db0dc0d4d4783b3d19796ddef761d376d9ae48275d8022100e83ebab05d3ee59bfe8d858a13642ad36bd500cddd4bfe44dcbe1ce74f89ab380141041c98c19561ffeb1365af963eb17fe49b525b565aefc4a9045fa3da6b8c07f28c33ca8cb9fdc6a16aab4603475fa803538d4b3c25e16037a2f00c6c79a1fc1c4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 98000000, - "script": "76a91455329914c548c298fed50f2e8c6575b27b5e5dca88ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 3 - }, - "script": "483045022100d08107f8f9fa52f268ce0f23f7a606d25fa73cce7ee45bd1879d4b855ed3191102206f5405af1946e1751997ae7fcdfdc89fc90e59f706ad8a7b2051b3fc968b9f8e0141048bc6ae71d9b8fe323034f868f140537470e360ab96ec816303a7280fec6acbf6d06001cc035aa3d6b6d9574cb5af6358d84413aa3f2913bbb1046de503193d7b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1097127, - "script": "76a914eb0c5bf618f1bbadde639ac7db36a9ee33efa61d88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 5 - }, - "script": "47304402202176d3925f89e43e5aaedd961269bb86e2560335666f21453801d74889a83c70022044150937e005c7d1ea54420c65a1511480b8c2202c27e979b4d54633664bd06a014104b29beac7ce4916ab67062e872222de88150c2098b26123b112cf658b34d64003cbab2362189aa0649cebfe31522946422385a4223b633c06800b0053343f9b2c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1022970, - "script": "76a9142b624997182ce88703d213fe10ed62f50d2f5aac88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 14 - }, - "script": "483045022000f1d6b4677a346b4c2ece32d636f3b4c16d422b57e33a8bf1cf273b36d74099022100d26b65f055e61754eb3f34ece68fbed96fd8b78bd3a61bedc8df5b035b5b4a90014104cb431f9fa58ee6f0f90593409b32c4626ad6a10c8759a22a4b4ced8d14419e66d0b29c8312abea9db7f2d696b9e1792e32fde3548665c2ac288883ca33f561ca", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1059769, - "script": "76a9149fcfdd594fb86a45c6c98e9af9914e9e57a599ad88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 6 - }, - "script": "47304402202ea748793ffadd4f14ed2301de6f1cc1111c4f999f3c59c9eb5592d17a49d219022037ec360628c487a88b1f031c56217cbf06ff92c57d359afdc25641890d490baa0141041164b49b188899b726e845ec428107ef58da09901dddba921be91bc50f9d7f9f47ad8da9089f7135feaaa8fb567b6f750cb58e1c904baedc9d730802d426a3b3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "94a5241c4eeda717a58d557e456697419cfa77fed8cb9e507452d9229bfaab05", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 56860000, - "script": "76a91492d5b8d1ff5f99c7538c5c82bce9afbab1cec52788ac", - "coinbase": false, - "hash": "94a5241c4eeda717a58d557e456697419cfa77fed8cb9e507452d9229bfaab05", - "index": 3 - }, - "script": "4830450220152b6577a08ea113ce4dce488b55bb7fa587946b1cf1981bfd3385d600eee59b022100e9cbf8748f8c09ed9bfa20e0c80133c0f4fb13bc8ee085246097fd2f4a8a8a780141040fa477befc8a09f19fefdbc618a8d3743da8225814e7e0e5582b3b2ff7ad7829b69ce162075473f9c4e6d017f6a7987105924c1f12ea2b2dcc4f5e6e264d9f2f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 98900000, - "script": "76a9142fee3f92669369ab015437fcd3539073b041cfe688ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 7 - }, - "script": "483045022100d887688aa71bc13c70700a65ad850429060b662850f524c30ec2e0df020816cc02203a52121420d054ca1db90185458c48970aa4bb5812013d7e808a87acecdc37c50141040d8b51e51769702aede411365be328c1c798ec24036ac1e5f94091e866f5611fddf7b064d0e7a9484e996585e3ac87ac19873379e31c2fbd0d9cf633607f8cd4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 12576100, - "script": "76a914f2ddf172bc30e002a5499f69913322898944b8d088ac" - }, - { - "value": 13150000, - "script": "76a9148229e172293528e1c85bf1d1e8cd5025faf88f5e88ac" - }, - { - "value": 13520602, - "script": "76a91409a3d63b335f8b6da4eeb38ffe6a2ff9c9f794db88ac" - }, - { - "value": 14813900, - "script": "76a91424a6a200209812d8597755e6dd26a7bf398194e588ac" - }, - { - "value": 13870000, - "script": "76a9142bcf488000a9862285a333439f029cd952ae9e5388ac" - }, - { - "value": 10200000, - "script": "76a914c48f203c58b0360aed6feb0acb9621b0135a6ac788ac" - }, - { - "value": 14809430, - "script": "76a9148ec840592d4ff2fe9ec510402dc8424ac726729e88ac" - }, - { - "value": 41996000, - "script": "76a9148472ea8487b97be0e3f8a07bdbaeccd909a2735188ac" - }, - { - "value": 1360000, - "script": "76a914eba99baf55d8c5cacbe0c21b2a969086ec64905c88ac" - }, - { - "value": 13612500, - "script": "76a914406629bb14f36aad37d6bf04adf0d07c2c7d388a88ac" - }, - { - "value": 4506986, - "script": "76a914607ca1ab946870c050e676f3d7458a564cee663288ac" - }, - { - "value": 14380380, - "script": "76a914f29d588fbddbe138cfbc34f68a8f0742fee6899688ac" - }, - { - "value": 14673865, - "script": "76a914f43942fea5aec511fe2fa7a48253caf024f00ec488ac" - }, - { - "value": 750000, - "script": "76a9143c0ffe5c7187e3788a666bb266c31f3ee748057088ac" - }, - { - "value": 9450000, - "script": "76a914483ccf3945f7f04ef1d869ae835cf825c2d791b488ac" - }, - { - "value": 12334200, - "script": "76a9145f09849066e0e42ad756d9a7c858b9ed7814388888ac" - }, - { - "value": 13684000, - "script": "76a914eacbc34cce62c5da8df868d727a5631d02b072ec88ac" - }, - { - "value": 42000570, - "script": "76a91445154beba6aa2cad1100b69c9ed48c7acf44ba1d88ac" - }, - { - "value": 14921333, - "script": "76a91408cd0e293d35ef940a100ca2dc28e5c602baaa1488ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "witnessHash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 434, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 20 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4380000, - "script": "76a914a5a045c8bcf10deb53cb8da8a91e1a23333ab2b088ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 20 - }, - "script": "473044022019c0f8008698e353f410118e1cb5d4b1fba2d32d86be178ced22b0f1a17e2dc102201ca8c79044f0925dbd1019a64613ceaf401f57ff56148b7caa52aec26c3515920121035f1b07e7ceb92b5efaee4cf596c6499431781376a3dc55f75d70a0f66c7857a5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "aacdcdcf34187dee8221e814da6cf1cdc1c4e8ec694fa245338bd907d3b9d676", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 43695472, - "script": "76a9143cd17dfe97f403fd9e134fc398d6932623ce8b3a88ac", - "coinbase": false, - "hash": "aacdcdcf34187dee8221e814da6cf1cdc1c4e8ec694fa245338bd907d3b9d676", - "index": 8 - }, - "script": "4730440220018edb5dcb877f2999345aa5c077f0858055f681bc8632dc0ba03cc0c80d0cc8022063d6535f9f841f48c7d295321d6fce87a79efa84b622e207a2f187b754fc3d63014104aae431e7a5097064886497163809438773433962e860a1d7f2d0052521dc86c53aaf9d61336eb5138383ec89660a5fd347435bb13df0017515eb9eccf57b3c9f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4380000, - "script": "76a91455578a712d2a51ca2dbdcec0fa2f50a0e435613188ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 3 - }, - "script": "4930460221009c4a4c0638c930646035c2d6482acae1fc763fdcba88c52178b037d6cfb0a85802210082110366625c12ccef75b5ca30612ac084b9337adb50bf9125088fc34e0ef26d01210321c5c9bdc0240703b5ad98626930fa46ba17ea0ec13cc5f7f31e57169e48d220", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "69854a5034bfb423e7969fa3c9e8866e8481e3fbe047d33b72a10306176a5c5b", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 11679938, - "script": "76a914991b50db59a558c3c1c08d9a18492c0b10c6ac1e88ac", - "coinbase": false, - "hash": "69854a5034bfb423e7969fa3c9e8866e8481e3fbe047d33b72a10306176a5c5b", - "index": 13 - }, - "script": "48304502201f289f758bf7ee968cb75d2f17e548c4cb7293fca7269135431beafe75edfd44022100a8128412517d1f25a348ebc5adf1b2138b15c7248367dfd1a854800dcda06d72012102e39f59e4da9a7498150c28b2575827669ed99ab04bf2d8204bbfafe1b99ae2ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4384140, - "script": "76a91485b50b85693a167dc2564bec17554194d00e588388ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 16 - }, - "script": "493046022100e14934f0eb4796f6a8bee9ba0415b7edcc20fb57c41dbdf34781c3852194fc54022100cdbdcc3200bbc4c88e511ae9058a16577f64eb73095e04705f8fa8ad1aeb7c98012103ce3be22106a6f51708778ce5d165323a06d0089c187a6e5dfbd2df9d9e0e813c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5a157495174c5de62732d2da13f00e6090848d8e063b1e3aa57c4c6c5e1e343e", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 61258800, - "script": "76a9148edcd22861c315823d371ea1223a0ed4d6d789cf88ac", - "coinbase": false, - "hash": "5a157495174c5de62732d2da13f00e6090848d8e063b1e3aa57c4c6c5e1e343e", - "index": 9 - }, - "script": "483045022100d01edebc047703e170d86e70049bb64ac8549c10ab1140ac3c6d06c6c057134f0220194e83aeb1942a788eeab3945a1cb92dfa05a0564ab4498d09070e1452543b5b0141046312ecf59753d8e45755e142b153b5303bbde8c4885fd7a7562a4b9c29ebf8fd43c71626d9c1195517a9112c20fc3cd4e3a49eeb7d2e312a3c28df9de2c224fd", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 13520602, - "script": "76a91409a3d63b335f8b6da4eeb38ffe6a2ff9c9f794db88ac", - "coinbase": false, - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 2 - }, - "script": "493046022100dbb9721592fd8ca0e944f6f8a868557426f8e0a25a28506952c417bb312479f80221009d11e07a88f91b1cdbc3a15b27a772f740f7e81832800bad722ebc82b022ac0301210359bb61e0aa2f8329a6236008e50ad3f78830fa6027a7177fda5ec0ddf4b5d9e9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 14921333, - "script": "76a91408cd0e293d35ef940a100ca2dc28e5c602baaa1488ac", - "coinbase": false, - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 18 - }, - "script": "493046022100bdffb50b2f5c49c9d880edac3ce54b8ccec830593d196b782e2a7638b2d74eff022100d4f43f04fcb868ed9a84b8a3520da34067f9a5900f470b54e9e4c82e28535c780121022b601c45d8350d582ce5e89250edc5cb3b804d8b780e1099ba4aabee414a16e6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 14673865, - "script": "76a914f43942fea5aec511fe2fa7a48253caf024f00ec488ac", - "coinbase": false, - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 12 - }, - "script": "483045022100c9415a7377167a6911225116d8276ab82f9ef457add2092a3832e33113cc91da02203d8602da642b56460e4b252481faaf127a8bb9adc248c1480242bc47236e267901210358f80d4684af10a51c8975f091006e5b9d3cbbb658c1c5f1dfe766833e8b516a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 12334200, - "script": "76a9145f09849066e0e42ad756d9a7c858b9ed7814388888ac", - "coinbase": false, - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 15 - }, - "script": "483045022100976f0e4fba52f9da61853f82ea98ad55bcb82ab4c709264b898793737b3292e202200c4ca2da6d13d60ee33c6489e8e0831d9b3ed2cd1e1256c43362223725af56a7012103eae6b859a7abf100e902b83947972714210af7b8a629a0141acc6314c0f5a76a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10100000, - "script": "76a9146f5a56888c88458676c44e2927b7ace838dedace88ac" - }, - { - "value": 10439199, - "script": "76a9142f0a76e1f401e40f95b502be64ac079688d29ae088ac" - }, - { - "value": 11400000, - "script": "76a914f27ccb83b55ba09eb1dbfa21aa28b721d63d3bcb88ac" - }, - { - "value": 8559151, - "script": "76a914bb5a3ec420c2cab2ef166f4c1fddeb5f6fd287db88ac" - }, - { - "value": 10964800, - "script": "76a9148c0c3813404eeae9c8a1c95d89a116bf72ca7f5c88ac" - }, - { - "value": 11254187, - "script": "76a91484c4ec66ae67d12fc5ea0f0124aee68918c35a9088ac" - }, - { - "value": 10880064, - "script": "76a9149c005f9af86b825da3123586bf2f6b3655295b1c88ac" - }, - { - "value": 11400000, - "script": "76a914e6c72c4916d5ac6888fe4826b54514f46374ab1b88ac" - }, - { - "value": 10240000, - "script": "76a9141794452fa336c5839c84ea853aaa669c06c4692288ac" - }, - { - "value": 11024296, - "script": "76a91491e89934e38a7024d0008b5e47c16eca319f96a388ac" - }, - { - "value": 10590000, - "script": "76a914bfa75e4422547ffe6a843997913694a705e64b9088ac" - }, - { - "value": 11435450, - "script": "76a914c60960a25c4a910cd6985bfd8299038b38ee11b288ac" - }, - { - "value": 11206000, - "script": "76a914f658e9d47d89a101f39e94b292b19afa496e1ef588ac" - }, - { - "value": 11900000, - "script": "76a914e4bd95277432996bcf7e38a722df7747291dbd7b88ac" - }, - { - "value": 23700, - "script": "76a91424d7cb73bb148f092f6cedb41aa23086ee8d269788ac" - }, - { - "value": 11565500, - "script": "76a9140288d331d41e854222285839ba78758cc12722b788ac" - }, - { - "value": 10806003, - "script": "76a9145daf9cd79143d602cf608958438683565c0582d088ac" - }, - { - "value": 10000, - "script": "76a91448ea1aa741150307e615b331ac25ff9dadddce2488ac" - }, - { - "value": 11400000, - "script": "76a914fd23398926fb4cda82895f9fa1180a42f735168f88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "dbb220ef8a2d9dded1ee8f75c31e6ae6e8b56b3f25f07ca7fc77e2dc823ba7b9", - "witnessHash": "dbb220ef8a2d9dded1ee8f75c31e6ae6e8b56b3f25f07ca7fc77e2dc823ba7b9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 435, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 27 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1203311, - "script": "76a914cd6bc256740207eee453fcd4858b9fb7602642ae88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 27 - }, - "script": "48304502206ab696c7aa388fbeb43e91fd11e57f6af863a648bdf6fc6657e6e97f696d3977022100ef69e8b4852f4b79853eaf9ed639d1c80c85f42b8d7926240a237ef9127175ba0141044b629175c71873c21a62c57144f1597766d676578ca824665249ca8e66d39ceb13e93a7bf77ef0fb897a7b91f417074e39169f73a14cf9aa63ec5bdba01620ac", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 33 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1252196, - "script": "76a914d8bcc2b801b1cc5bb27831a2547d9cd9efc445e688ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 33 - }, - "script": "493046022100ec66917b9f5923192d7d3f12f58ade329e9173116763b56f9d03e1970cd8d5e00221009b9a5f07e4a45be1fdceb78d3633384ce287a3b6367406aaaa9924ee9136d45a0121031cf65b42a77f37d5a98631ad49db9b9db200af5a9155d1f59193bea7ec785e2e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10000000, - "script": "76a914dd628aefde9a3b86714f4a0712ca05382ae3a35588ac", - "coinbase": false, - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 9 - }, - "script": "493046022100cf412f7cfa5acf82fccc6aff7dd74ec5576364747156be35b647c81aec27e5bc022100da11be053057b9bdbf7fd708371c9d37b4ada9ddcaaf06f01655e0741f28f04e012103d2b7ddf20106d7e9e0d52ac5e47789a6412a939337fbd7a1f11af5ceb42e17e4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1242478, - "script": "76a914720441e4cca49ec247e8ccf439dbf46e5a5b864888ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 5 - }, - "script": "483045022100d184d674ed111484110c4d88db3421fd1db965f7f670ab860554e2ac44c55dc1022057e9ca012886b6b5a288d5f1d98fadb969001d0e36fcab0065373621693d7ea5014104e3fd350afc0f3d31a0e34c59591817ce0ffb878e713c8d0f01750994d72f32f0fce45704cdfe9f29409c4379bc60fe34c1e5425fe56f4801c4824424ca642cce", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10000000, - "script": "76a91459c7ad64812c5190a9c97965c290cf0970bfa90f88ac", - "coinbase": false, - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 16 - }, - "script": "473044022078a0f994b62714e726c7be8f7a095b757baf712edd4592a02e19ddadc59e2692022065242446dab9caafb259560ae5861c0fcafa7bc9d9a7c94dabb68c0c7324c94a0121036bf3331bad17d297504a8b6d889cfe94f5eeefd3d76756b9a534d53d12167f22", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1218155, - "script": "76a914bff0833eefd926688258344a01707a3fac41edea88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 17 - }, - "script": "483045022017080cf4691c79030d8399c7f64406db002eb4b0c2366960bc87834f724b779b022100d66a4cb30b912ac1ebecb98947b6d44500d0feaf8bf35e908e41b9699b2966ba0141045f6adb0ba5d80cccf3985c7b2817ccc38720b13474223897c2503bb6cebff2ae942b26247288df30896644e4f2a9bf7a048c5acf9c9ab3c4d33255c88163912b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d2ad400ca26e3935af8826064bb7626816f061b8d6b968a00c11e3a59c153bd1", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 10000000, - "script": "76a914771a9974a8b5a2a009f397d0c644589aadf2aa9088ac", - "coinbase": false, - "hash": "d2ad400ca26e3935af8826064bb7626816f061b8d6b968a00c11e3a59c153bd1", - "index": 16 - }, - "script": "48304502204d49253d690cb01a40e9a7fd49aba8bda332b6bdb468afddab70f6a74af33b76022100db10f147541d6b3e02ade0283ffece290b5b1e06484c3f811c398fca7788ee03012102f38a81cd35602d08221dfb688235c7f1f31c698036b257daa12077e68e92d121", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "38c01c33e908b641bf8cd52513ded78471621ccdf594c1070bd35cba3ded691d", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299986, - "value": 10300000, - "script": "76a914b4fa91737abfc0e93c09ed2bda40679a56a2fa5388ac", - "coinbase": false, - "hash": "38c01c33e908b641bf8cd52513ded78471621ccdf594c1070bd35cba3ded691d", - "index": 2 - }, - "script": "493046022100ae666271098e41200d1f1eb7399e5a3c2494c9131b0e97a8d03b034e6b45e297022100ed0d6e001afeb5698eff28f4730ffc89e368425359da5cf84b8e7cadd105aaf10141045ec787dd7a5e608bed2819bf1280846ab4362b62e7e36d913c16c5b85f97d14b43ae01961e71ac926d0f2e33ffaa378c4a63c262d390929f69b2c4acc8daa757", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d2ad400ca26e3935af8826064bb7626816f061b8d6b968a00c11e3a59c153bd1", - "index": 24 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 10000000, - "script": "76a9142a8ffdcd190bd0a6bfbb5211c4c55c0a5ebdefc588ac", - "coinbase": false, - "hash": "d2ad400ca26e3935af8826064bb7626816f061b8d6b968a00c11e3a59c153bd1", - "index": 24 - }, - "script": "483045022100bd4cbece255f8896900fd4d759d9b2025bcc99ef33f7e2ab8f5b7bce6c12cd030220625178ada88f829ba251d9d0203d03ec2f820f82744c6b1d2b2868c0b1b4596b014104aa1bb93ebf506df3f3405bd979e12bef6960c376c674174663f5b511bfaae4c58ae94c3d50df75be5ec09a4947a9e1af49e31b33f0870ddf682b6b41c513afdb", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d2ad400ca26e3935af8826064bb7626816f061b8d6b968a00c11e3a59c153bd1", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 10000000, - "script": "76a914abbb59fada0f502b5952ba276f4a48f64d8f6e5088ac", - "coinbase": false, - "hash": "d2ad400ca26e3935af8826064bb7626816f061b8d6b968a00c11e3a59c153bd1", - "index": 5 - }, - "script": "483045022100d80264a06b00b105dfea157dc3a7517e611fb418d29d68e358b11184102bc80502207c63be3a9ca9001904cc6eb13a196763f515187f2bd4062f24c9497f20520e68012103333053795a2a9a30e63f3efd6e01083df2a965b492cd6e5cdbd0610832dfd671", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a4e1eff4f0b59e1106878a918dc7954a3f254864e3fbf4065fc0437488747c4e", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300006, - "value": 10000000, - "script": "76a914fe3ccf799fc32e6d49e7ae3ad5dc199b6271cc3588ac", - "coinbase": false, - "hash": "a4e1eff4f0b59e1106878a918dc7954a3f254864e3fbf4065fc0437488747c4e", - "index": 10 - }, - "script": "47304402200df432dc28d84ac32c06f396c4dd282829dc25772d557e728cf53b002320fc2602201e2c8c74be4577a067b6ea242a2c7b6ec9dd34b6fe7fb22ce0fab16ace0211dc0141040ba8043318555f0a6c82f6d50e8a6eaa76625ec1f8e890de5c7caea489ae513330baa97231818b88bbacd8ef8fd41792ec6cf2f65cfac9603162f4a4da06b534", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4334500, - "script": "76a9143cc22dc842599bade858d0a8b4ee4b75b2c984c888ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 8 - }, - "script": "483045022100e9562b319ada72518d0894cc237db8b5572fefe1efd82d154fb5fe8e7ae1e45d02202576219848fc80d2fc77c8801f9f6340311f2fdb8b258589c56a35339fae934e014104459d40686128efc773e3c3873a4aaf59259bcbce2fcb8268d7451125e92916c5d595652a7c0063381c2b1f9666bade1fd4618861042c9bafe481df49e5749b9c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1735727, - "script": "76a9142c7fee6ddf2b32a45eb76b47c7108db89a1ba2c788ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 18 - }, - "script": "483045022035234d306c1d046b45dc93842982f3edc6d974a944559ad92db2eca3b5eeabcb02210090f84fa2e8bd957fff35ff97a6d61bea0c283546aaf38ea93cd89e5955d55aa8012102a489c6e5b12ced191b5e327b8f5dfddea3455c4dcc6338ba84e54ed2a986ec02", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 19 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1202586, - "script": "76a914d35ad3babb53cbf5d5249fc15e218e937bfd57ae88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 19 - }, - "script": "483045022100a2b86d91477de9b37a443078ffe85fd2fc1ae68e6f128e2203cb7208a9d6713b022011310d3a132d2d0f4ecad0cda47f1a11d37a8603b1cbde3b3a3455cb05c766ba014104a3dac426c72a73cf8509404da805fce315ad169c1847ba6172b0aa287ab43ba297eb4058cd9411a80cdf666e019e623037dbc96b95e496d57be35697bc4c8bab", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1391955, - "script": "76a9143027ccf55b4cca6fdf49298735e0193e2e55c95788ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 4 - }, - "script": "48304502201d732c9d164d31cda6f36f736a1bcdc0828218d994aca8f68e61030d7537eae9022100972ee7c795b76c3bd18d3c4fb56cd15e6a22620bbd50a5acb36d0682bad2b7f401210325e13911e3b1cb95c7d3b1592c342527fd1ca0a007551da4c03d6da99051504e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 19 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10000000, - "script": "76a9141921ca63e4f52130e6127aae1142756de1b4a59888ac", - "coinbase": false, - "hash": "a312aa99d91650c63db43f3d059c9ab924f5c038d7ff510efc520fff4382ab57", - "index": 19 - }, - "script": "47304402201aed980aa069f56bdbd9153502ef669f220d3296b3bf0887690e7371aee6e554022007eb9868b27ec94b737218e6fdbef14791d58de3f5f69b9ea2bb2ad64fd6e922012102d6e5293b7ec160ab117aad0ba31bf2791556ef859e2aa147d1dcebe3129827d6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9102df6151ab4f39b75a038a66c12f8f73d89d13d97a9dfc7d454d18a9eeb210", - "index": 6 - }, - "coin": { - "version": 1, - "height": 299998, - "value": 9700000, - "script": "76a91443200f7edfed659f8380325e8032ffc4e341238688ac", - "coinbase": false, - "hash": "9102df6151ab4f39b75a038a66c12f8f73d89d13d97a9dfc7d454d18a9eeb210", - "index": 6 - }, - "script": "493046022100d6e8e9b0789d02883567a0484bf7578a2a7a6d536dbbd94726bb8bba95dbdbc1022100ffe5a8204a64914dad09cfdddb98a95c010fabc6195016cd7c1ed4535c2a87f90121039ccbd06bd78450f2dd434a79187c2c89fb1a1a99e82df0971836a700aabc41cf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eed3d2e0aaaf1dc60a875da5f5216586464fa0b5eabdda4662cac73e66f29e18", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 10009266, - "script": "76a9146de67278829be2747d488e696da46994c72dfa7e88ac", - "coinbase": false, - "hash": "eed3d2e0aaaf1dc60a875da5f5216586464fa0b5eabdda4662cac73e66f29e18", - "index": 2 - }, - "script": "493046022100e09fb130296935932380697293d59c68e6234ebb0a70c620d4c0caa1fae84ae10221008bf2ee9f60ce4fd8559a47ab02678cb5c1e4238ed31de3918c2cf715f314bbc901210316bc163492bdfaf285d7788dc928dedfa97065483c61996acf76ff868f0d8b66", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "40984b437ba75ad1f97c6bbf843559c5a9b1a865534f1055ea895e2b112918d6", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2345482, - "script": "76a9140d1cdf73f27d9167faeae8754ca22c3fd0581c9688ac", - "coinbase": false, - "hash": "40984b437ba75ad1f97c6bbf843559c5a9b1a865534f1055ea895e2b112918d6", - "index": 8 - }, - "script": "47304402200319bf9b585b142dad4ed1d5fb772ed83d5e0cf16cddb0a5588158058861a0e402203e5c88af75b393fdb11dab0f809ff6cb942d9869bd9bd1cc7127e9eae7aa39840141044e9cfd169ec4031d0cf5bc89d7ab3cce5273a40d37bfc5f3c8355dc5ab1aa6f2ba7217dfc89301168bf595f74a9ee81c79cf3acb4287cc911dd16d28c60da025", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4353400, - "script": "76a914521709913c73b6bfd4887b01e5b00819f52b8ed688ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 3 - }, - "script": "483045022100a78ebe892c18c13c2f7bb754191545640890137252647f676c323dfdc1c6bdb1022000ef5ba6d004abd8f4b6bf9d060f88233dd4b6aa8659f342cb432bda5a429517012103b9e663eb3ddac6d7c0a75200c5bc6f6b50e0ced10131047aea3d39825649fdb8", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300005, - "value": 10017330, - "script": "76a9146d3084a29be8e56ed65f828219ec0207172a8db888ac", - "coinbase": false, - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 5 - }, - "script": "4730440220643ee0bf7437027d5ca4db94b15eb6ff14fd349fbd3174a7131a308e3f4f03e702202b99fe81844683e17c6e80906a5909761a6e40745366b579ddfd58d06bccc5d00121021cbe3461085feda4a6ec70b27fbbcaf5ad2d1dc850ba475addc98df520e05430", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 10000000, - "script": "76a914fa4127f83b843a11d396eca4e9edfb61bf4666a688ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 1 - }, - "script": "483045022058025eae32684972d75b224bda6bf103fac557c5774be2392e56d02f0846a64e022100b0d5098b04eec9b9a9d093b2f5ea65cc83619fda8f9ba3ee9acca6250655833901210349255a852e2c2a5e5575fe1b7842f41bf8efc82894de65ebe10dc31fa55701fe", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4362280, - "script": "76a914daa78d9bf530ae829be23623bd2de5d6f31fc60b88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 17 - }, - "script": "493046022100e7d882ebe1b8aaab9ba8eae11a6afd9732d6bd8d3ddccf6a246e81b8509f41a4022100fe840985ec1a896edaffe1fa22f13c6e88beffc8dddd6f502cf0fa208464592b0141049d53483475d31e0626bf1ec883f4b2f219b1992734f64a60e41fb13cdbb0053747216b5f1d14c7df6458825fb17ab968f614a366d0e1ffb429ae161682deb0ad", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9450000, - "script": "76a914483ccf3945f7f04ef1d869ae835cf825c2d791b488ac", - "coinbase": false, - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 14 - }, - "script": "48304502207a2cca355c0d6adcd077ec2f0c9d32b620d6e4b347c0a4936f24f33e70656e8d022100d57ea64e1dade3e6eadb00035d73bf45196c02f70667df880e13508282bdf426012103d3b74d7dde36d51a5e88f793e2876fb4b149e97189bb66726a4c0957fa6ea3bf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 28 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1220780, - "script": "76a91418f98d8d2fc0611099bdb2fb9ee891579d9f01f588ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 28 - }, - "script": "48304502205ba37309c4ad9eb89bf88467259e16f47469567c7d33b0ea538bc398b0144ed1022100a27132b4517893f8ca2a83b3a48f9ae1332ce5adb9dfa88a79aae6a6351e7408014104b75022f3319e83071db6c6768f436d3a0e811804e54756c78e06b08bcf81c13d34fe8b011d967b12e4f5ee1210ce66a8446bd8c5e6d4d03c80937ced42c1ecb2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 600000, - "script": "76a914cca05eca1c99d07b14d26d416d6924b3cd41c84988ac" - }, - { - "value": 10000000, - "script": "76a914084a13f4e128b907f0bc3d61a389242a1f9aefff88ac" - }, - { - "value": 9700000, - "script": "76a91448ab77bb19f9c9b5c60e3616d758c9ae81c9116188ac" - }, - { - "value": 10300000, - "script": "76a9149b55586c19277afb65c6a274e2b3aaf1daa5f62388ac" - }, - { - "value": 10000000, - "script": "76a914a91a7271a766752750c3a6cf521d1823984d9cb788ac" - }, - { - "value": 10000000, - "script": "76a9146309b13c921f0c5dd4a1f907d7e4d2ade2f364f388ac" - }, - { - "value": 10000000, - "script": "76a9140d7b37f22218ead2740cc9394b44f8bdd0c8b00188ac" - }, - { - "value": 10300000, - "script": "76a914f0c4464ba7801cc203f43dcdbf7cccbe7ffffe9f88ac" - }, - { - "value": 10000000, - "script": "76a914f9b2bda34f7dcbeb08255dc3f28ef96b294f2f6788ac" - }, - { - "value": 10000000, - "script": "76a91421b2cb699eac6ca3c6f74ae8e7eaa009192bca9888ac" - }, - { - "value": 900000, - "script": "76a914f2f9c64c2d4f699442e8d150cf83fb9bb40db59588ac" - }, - { - "value": 10000000, - "script": "76a91412c9e33a5b33e18ed9391a599fb9cd3a69071b6c88ac" - }, - { - "value": 10000000, - "script": "76a9149fc31902aa5c2afef45d151dace129984e02742a88ac" - }, - { - "value": 4119446, - "script": "76a914964118b6d7e820db230ba5afa3ed9c153295c40788ac" - }, - { - "value": 300000, - "script": "76a914238208d2002cbf9c405a933f12e99dc3b07bbd2788ac" - }, - { - "value": 10000000, - "script": "76a9141ead0ea3737b8e7301363d59604a6984ed3b8bf888ac" - }, - { - "value": 10000000, - "script": "76a914f905c20d178e83b1dfaff260020b0a651137ce0588ac" - }, - { - "value": 9400000, - "script": "76a9141bf58146cc165b7ff31908fd30881e0b2ef3a46b88ac" - }, - { - "value": 9660000, - "script": "76a9148f8d0281dde07de3dd42cf0ada297ef8ec9ec10988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "witnessHash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 436, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "dbb220ef8a2d9dded1ee8f75c31e6ae6e8b56b3f25f07ca7fc77e2dc823ba7b9", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9400000, - "script": "76a9141bf58146cc165b7ff31908fd30881e0b2ef3a46b88ac", - "coinbase": false, - "hash": "dbb220ef8a2d9dded1ee8f75c31e6ae6e8b56b3f25f07ca7fc77e2dc823ba7b9", - "index": 17 - }, - "script": "47304402202e6c670674053f6530d0c49fc8e3778c91953aae7481adad460e4ca8f09036e002201031ca408567552bfe9f363c116da289a4f85c50cf910e3b3d09f173ccf2b31b012102c5adee6d17700f4b8a9c17eb691dc087a8c6fc87f05390ad9f5c6af37a2e1228", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c585e0e388f7a5217f5e5c304cb1f4311b75c1fb936ff844686ac4fb18a8e2e0", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 9978130, - "script": "76a914fbc1f7d886685345651ec838cab4280fa385028388ac", - "coinbase": false, - "hash": "c585e0e388f7a5217f5e5c304cb1f4311b75c1fb936ff844686ac4fb18a8e2e0", - "index": 6 - }, - "script": "4830450220460ddc10e79d60630cc21a582233297ba6e4b3184ea88abccb32695646ae5ffa0221009af46206b0208f9a981388d3e4e4b4b5109a433a4091cfb83a5cbebbb3dae2ec012102319b49423adcd6e6facf0abd971328554953a8c4617d3c6887575bb7d32816af", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "09be2f4533dadca1810a9fc669660ab764b6534e8579c3055f01f589cad27fc8", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 11920000, - "script": "76a91456a292b30a03bafd324f88596bee1e0d67492be588ac", - "coinbase": false, - "hash": "09be2f4533dadca1810a9fc669660ab764b6534e8579c3055f01f589cad27fc8", - "index": 9 - }, - "script": "493046022100bfea4cc38cbecfe63f8cc42e087aef219744cf9beb3073843b00961e2217d3190221008d25c01ce69baffe6407b44e6e7c1db430c9ce40b721c12c1556e4fb985763bd014104385e6f5bc97fe708f2eeebfa24533a59c3aa98e49d14107ac29e3d1b6d57e7b59d73e8992566fbc7f7ec562bfbd98b428e932dc952429d3257f76bce1db30b20", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11024296, - "script": "76a91491e89934e38a7024d0008b5e47c16eca319f96a388ac", - "coinbase": false, - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 9 - }, - "script": "4830450220592840dd46005186d59dc6d3986392c0b593a1bd491aa415d3be71aaa4c9a42f022100f8c66a7f83fdb18b5e1a65310542f25507021caae0c6fd8dd2433c894b4ecca3014104c38a96fadd93ee92dde50045b8b081f3bc1e742307d4dbd0809fa2014bf9b108f770ffec64d2f967fbc4fa334a768c39a8548ad57504d3b333261aeee32fde3a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4506986, - "script": "76a914607ca1ab946870c050e676f3d7458a564cee663288ac", - "coinbase": false, - "hash": "3839ea1c80f531500111b2af5d1de10f69e4933a0bd901b78c92d5b0337ff343", - "index": 10 - }, - "script": "48304502200af955b4ef24a252f8a2e70d85e9949a12509d0c605eb2d2f84d16bd630996c3022100df67dffbad8038905741d0ed445a66fd5af9940db9885c072fc28ad740ea91c50121028ed9495ee023a9e0f53fb631e191b68ebcd8cea8d8a7385f9360cf5843a25e4e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4520000, - "script": "76a914eeef3f8a586a44e1528355ed6239e231cb4d3eec88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 12 - }, - "script": "48304502205c1b0bbf88817e514868c79c2cb609b7d9b626349f57898de93d6e3daf3316e002210091ea84b89007124573f623dcbd89a0a23788f6a92aa45254c9740a1db509fb64014104f8331544b4df93a5d0d894daa10e550ad1d4ee702bc0488a2bd28eb4a6f5bed34ac7a8524241ce7e69437418acaf184692280d86ad27ac66828750e94ec2d7d7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 43432000, - "script": "76a9146a833885d8020dd73fa17b58f68e66f90ab7bbc788ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 4 - }, - "script": "493046022100c962a12232caf0365355ed20abecfbafcd03e88d4d14a03b37b8d5c8980edb6502210086e7ba338c8139c92d8553719e8cc7fae5278bb122dc8ef019524b87271049ff0121021727077bced85694f731eddea69809d4da46a3b2ffdb4d9cafbf4a6c9f8dd521", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 20 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4520000, - "script": "76a9149d1e31b6a3aec46ed2b4f9259100b47fde80796688ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 20 - }, - "script": "47304402207ddf0520b7b5e448427f526c39ec7a07511ae0903546bac1947191679bdd16300220019c72be4c5c9d8ff13bb8a0b06b40dce23f4e49e26f075d3551027484b0563f0121025ca5e3890bdafc0fc3ead5636d027953e6d0f7d3396a36d44c3fbf0dc843c295", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11254187, - "script": "76a91484c4ec66ae67d12fc5ea0f0124aee68918c35a9088ac", - "coinbase": false, - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 5 - }, - "script": "47304402206a37a66f588a17ff34ec8316df851e7bca605909d98e9030d9e1525fd6d2538a0220782e82d8a312708b96f7bb4dfae487fa9e261b45f84055a34f112da8896fd18301410429dc17ebfb08182a6803f4fecb6f5d089f53d66457d5a072a6439b028c36b11d998b04d930186412523d885dc2a29ac54b1ec5c0bc9fd233af1f7c198002c188", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10806003, - "script": "76a9145daf9cd79143d602cf608958438683565c0582d088ac", - "coinbase": false, - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 16 - }, - "script": "48304502205bb2be57c0450632b89a0de38fb21b2e749589f0f692fd3731aad4e05bc8066e022100bb8bce0727df09cc0fc08f7c420d562b8d9391ac7216a9d37950d75ae260003e014104744913ba05930e636a67a7a599ed7772e9dafbffa7f9caa49e0c9a863d0d3ac27b62d5371a4fab81789c196f4ea2f86199bfb7381268677ba18158d377391cb8", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4600000, - "script": "76a914a40b4727754801733a9161c3db55d956fb1f0dbd88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 11 - }, - "script": "48304502206523a4ddd2b60ae958c212a93e82bbdb76f8584d69027d4dcacc28c075cb752d022100a4824d63cc8883f6f22c91fa804e5bc7bc6a398a1d92aebdb3dffbd49519c8f201210390d63bc7cd113b822f34a84eb22cc1953d59feb8d8aaee3a7298ed9b47516eba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 27 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4600000, - "script": "76a91487985422a514da921120c4ccb9ef4e03fb47116188ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 27 - }, - "script": "48304502203a376165aa98f04bc1ffd6d0815696440e75a512c95347d97905af10c8d29509022100c0f976ad1c1ac0f6df394e28cbd99896a958de04cf0ce89e6e90a7f23ff7c8ad014104e074a70288ddf37bca335a76bec3310e5c5a481d5baaa11a32b146e182fc46ac5fd890541ea78b90a0fd7c10b9ebc9a36fcd2025c364f11d53db791ab7da5810", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10880064, - "script": "76a9149c005f9af86b825da3123586bf2f6b3655295b1c88ac", - "coinbase": false, - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 6 - }, - "script": "4930460221008f96f6167ac8aca35fb99a6ad7ad866e090ff45cdcbd5ca6999884a62f348141022100e5d77feaf62814ab649184fb2feb1f76df6188b100f36bc8dd8ea7773a422427014104c7fb9f5ec2c861f2f9d464fe37647ec647a67572bc93de56116134add860ea1f21d3976eaf7d197603a12c7a76cd0f6f18d292dd741eb1efd140ae9ccefc6a85", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4600000, - "script": "76a9148dbab30a385350b4ee015e4c78fe020437d51c9288ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 10 - }, - "script": "48304502207d4ba2a83cf472d74934625b33e6371c6285e97e9d9c44a065119cea2e6abfa9022100b459175818e48b95e4e8be8b09b594f40a319c08df7255410eca9dcd09e1fb72014104b669fddb79332d0a2c78b9641790eebfdba1f777aa5fde442abb5610cd8674837001e4697e29e8de0b516d84d394a45be53d70735911e5e51d40e5ddf616ad36", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 9977790, - "script": "76a9142c7fee6ddf2b32a45eb76b47c7108db89a1ba2c788ac", - "coinbase": false, - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 10 - }, - "script": "493046022100a4cb704842b6a9f6a6da36ababe93b684fd49a479e3bd2de07063d215b09ab15022100a1e7386b7e756b0b0fcd7a8b6a492a2d0721821b33335046119b79fac8ab0ea0012102a489c6e5b12ced191b5e327b8f5dfddea3455c4dcc6338ba84e54ed2a986ec02", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11435450, - "script": "76a914c60960a25c4a910cd6985bfd8299038b38ee11b288ac", - "coinbase": false, - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 11 - }, - "script": "493046022100b881babbd05964119574e9b145a0f366d56d782e17e24065ca41fb6441ecc4fe022100b5cb40beed72dfb1dddf27dad87adcff5c1a66bc717643ed418f7dcacefff4100141049f3b1db7ba5adfc4ef08462429162858e4f6b8497c312a38044c8660a023299fcccb492a2dbbb1454e834b55dc69a9c523fb9fbb2efc92eab08ed76d718daf69", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ecad6874192f21c68e36e3092e9c6da40ddbd95f7af8be2fc8a0bfdb100cb365", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300002, - "value": 11685512, - "script": "76a9145289ee4cf745edc1302d5eaeb1ff86016c20994788ac", - "coinbase": false, - "hash": "ecad6874192f21c68e36e3092e9c6da40ddbd95f7af8be2fc8a0bfdb100cb365", - "index": 14 - }, - "script": "47304402200815cd1d7878d31f2c4b4ef25f770adecc8f727103f45615a2ee24bf8e902e1402206932db8764d8822f0484fa37ae831c7e264fa7ebf48f6269ca0635c67e183a820121022624d0ce42c30a47150f94624d1f6c66472f6755092286c2d3f2883e8ad90a90", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 26 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4600000, - "script": "76a914127026b9c6e664944e087c4b01b64923937e9de388ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 26 - }, - "script": "4730440220684116b7d5546c58a0bf30c742d30ed2f404a01ca6ab8fb83469d8bd854ba787022024c697b3e4bbb954783727faa286c95f2c46130b73f280961eb5044c12ac85e6014104df723bf8d26ad9252c8e577b177e56c5361ebaa2c6114de3bf87ed3a066ab8e48d66aa8eb8fdd819129809d003afaa0bfa3b859562f65f7ad5fa7d4ee7bdd0ee", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 43670000, - "script": "76a91432fd49eeef7e4dbcad7d9b629612d0279d60c45088ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 0 - }, - "script": "483045022032e0195b1d5f46522a19c12becb498a2c3204bc4d4643cfd025e5a7e7f0b1650022100d7e7860bd7c6a958dbcd6317c258822eb25e6096f43625ce916176d1987590d40141040519235bd320295c2b68ef46af2757995d20017a230d3578a8ba2964582a959f43a7e8eb54f22474ee52677aff7e905112b6a04a272b09f5ae72964dd7440744", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 14138580, - "script": "76a914dfa46e9d50a68a26ad8efc5db744cec96288cbef88ac" - }, - { - "value": 650000, - "script": "76a914fc8f77547ba041fc81f6f4bf33748efd4745e0f388ac" - }, - { - "value": 4137232, - "script": "76a91457b5ce3ee016834cb3d12de6241383d6be1ea53488ac" - }, - { - "value": 12811000, - "script": "76a914d94a57b33bf83651d4ecd8518a87715469bbdee588ac" - }, - { - "value": 12759000, - "script": "76a9142868f8a566c7457f7c18d4d827a976ed4fc32f6088ac" - }, - { - "value": 14667530, - "script": "76a914f2671e0316f834a1fa6f454e27dab1f9aa7b720b88ac" - }, - { - "value": 13785000, - "script": "76a914f8a0ca6340c51f87261ae3d95965cddbbc26839288ac" - }, - { - "value": 13912176, - "script": "76a9147e42faaaa2dc73084e62cca5e3872d6700edf88b88ac" - }, - { - "value": 4590000, - "script": "76a914a03a8006661021677f9380110e41dec2e147b48588ac" - }, - { - "value": 14188900, - "script": "76a914d31c51fb822a6d882d5dc8e5e8516d9787ffe30788ac" - }, - { - "value": 9350000, - "script": "76a914f26546ab755deeec0d77ea56a958c5ed5a79c65888ac" - }, - { - "value": 15020931, - "script": "76a91412e8cc8f05958492f2e047b6ce9c1d204751e39788ac" - }, - { - "value": 12991298, - "script": "76a9143daa3803657e6063eb20f3a87adbb3da756491a388ac" - }, - { - "value": 8665800, - "script": "76a914fe0f4a1bf09cabbbe8b67e3ce3e5216a799a680888ac" - }, - { - "value": 14330000, - "script": "76a91457349ef88d4c1ebc9d38dde09d354dfeea6d7f7588ac" - }, - { - "value": 13148871, - "script": "76a9144dff1411b5a26215f237c613b29bba0f77c4613888ac" - }, - { - "value": 10000000, - "script": "76a91426204b4000509c1547c0a130c03c54cbdc7ecc1088ac" - }, - { - "value": 13034100, - "script": "76a914f905d48f5c588241b76e83c947340e91e4b0bdce88ac" - }, - { - "value": 15180000, - "script": "76a914dd34e623434d9746243c67ff734acb4b9383ca9f88ac" - }, - { - "value": 10000000, - "script": "76a914bdd467aceba3ef37021c41f120df3c516fa2265b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "witnessHash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 437, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 42300000, - "script": "76a91485b1485fa600afa0c03c1ac00949f36ab1d4467588ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 5 - }, - "script": "493046022100ef24d3e0ec2af7da5eb28393c1e924e205a520775470c5fefb7ffb30be68ed37022100b569af06e7fe5088999dcb44b50fd18eb380928483bcdf503596d8978a5b0f3b01210299d34f1e445eed0d00f125e07d9b46c95ac489ad8207bd5a6200cb24c825d6ef", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "50ba98402dfa8bb27917bbc36f69c6c5c5f3eb74bd479bfad762825527327380", - "index": 21 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 11806000, - "script": "76a914a420614786113ef5eef9495c4745d061af82cfc588ac", - "coinbase": false, - "hash": "50ba98402dfa8bb27917bbc36f69c6c5c5f3eb74bd479bfad762825527327380", - "index": 21 - }, - "script": "48304502203134b76cdcd691806c89432e881cd6585e15b8a56b5887b8d066bcf1d9e0ee310221008a025bb4dece2eda35d05dd1f108a83dce473adbcca32ca5b552f701bb5610cf014104c6f43a85db0bf88404b178b1f228e9d99411808e05fb909c52ac998c90ca98a43ea31e4a394beda17a751b42de72895d1095bde30b7745d46f3a26973ceff02b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 13148871, - "script": "76a9144dff1411b5a26215f237c613b29bba0f77c4613888ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 15 - }, - "script": "483045022100b0b51b949af6836e3c10cf8540953fd0719b619fb4732489d44514d4cff2389402203b2fa0041e36284fe841bf8d75603d2a8110a7a3fa0b1a24884a2b0ff32e7b61014104e5e17a85c5c4f644a78b400e79bd7ada36d573ca5723ef4da7d0f8009f3ecd2228d315314135f2402bfb31358dc3cc8355c1420c44b4ba5d2c5fca76e3f1e2fc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4930000, - "script": "76a914a5e7f6af5e4cb40484f238b58a2ec18f4562bee988ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 2 - }, - "script": "483045022100e131c7fce0bda6b4aab0b19e9957f8faa585b4e72b9ddf86fe7ae9f78878c87b022056fd9f9881d296e43ee545820fd948e2c49e09512943adb8f07b525e10c6adfa014104e5670130da433a8a1de205640ef70343657ca0c00a9bcb0d42e92fa37d9bf3253345b1b0e7c5e5f102952dacab780d65b6881386b48bd9a4143ac404f0fa4697", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 15020931, - "script": "76a91412e8cc8f05958492f2e047b6ce9c1d204751e39788ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 11 - }, - "script": "48304502205d6071bb094ab20cc7b6297275ca0fdfa1cfa9502d45eb7777727693f6011342022100c8b03dba10612a743ee9053cf2b90eb3669f2f93badef0711f7cc716e512f96701410415ab729af380add375c505c08ced3fb1542d8f0ecf936b601ae73cb54403add51e1df81008226c8e12769a1a88dd3a4fa964c33af28941aa810c24604fa6cab1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 14188900, - "script": "76a914d31c51fb822a6d882d5dc8e5e8516d9787ffe30788ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 9 - }, - "script": "483045022100e30705523ded4b2854b17c0b72aebb160f761dc2e755b0f86b07197169113328022058572494502c5e154cbb5c3947e41be02c274cb323d8fb8c79fd3c63912ff1da012103b4caf1d1955f4f5c1249c3ecde5734e5f329c5050b2a3200bb70d71e74272a8b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 12991298, - "script": "76a9143daa3803657e6063eb20f3a87adbb3da756491a388ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 12 - }, - "script": "483045022100806041ca0bb18f43c8cb085ab06896e57102c8faa08825269ae1124c6f903ae402201bcada8bbc7f8a992f9c089cdf6c2e3f6fb2178fd1d9bf75dc2a65cc5c141f9c014104e8d97eac23329f9e02e180c3ac3e529993c47b417e611638512588d0c94234f6523b8481b23ef37057b1e3350b921b1b8abdb64f2e8dc48fe41e266e45040a1a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 23 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4844000, - "script": "76a914e4c174b13ac640ec54556fda1f827947184067e188ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 23 - }, - "script": "483045022100b93e253113a0873ac2a2c45cc127b5ad01e2cfcfc871f471d2d802d1507e787d02206e60cd1800b8995d3420b2c9b748f61a328ca63d98d1920ff6a8bc14df0f71ef0141049513211554b9d9c8c0577e935d77a53320383a02f38fdd1b42fd70af9dcbb44111c912b95ca63e716a34f93f932da9ef05a5b2d81df4b6640ef1bd91bd795192", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "79459bc59f2868e089b1d20b01ba3197d99ba9bbc16ea2318830331775183ae5", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 12989658, - "script": "76a914d723ff83743557352001a2119ed1923a9ec3328188ac", - "coinbase": false, - "hash": "79459bc59f2868e089b1d20b01ba3197d99ba9bbc16ea2318830331775183ae5", - "index": 5 - }, - "script": "49304602210097c936174b06cba7b028d523274e66800b314353f11193e69dd7842b1d93b410022100b7afa13fced6e6b7eb56bbe172051b825ff333e73dd5ae78b0144bcd5d0138a7012102c1ee0262da95bff94c871d885dee93d9017419fb799eef958219a432910575d9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d47b3890f00d45df78e4b7243f42ba05e5de3329d235379712d93fb8a6588b7d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 43395683, - "script": "76a914da03375246c61576c3e87d4e93c6d5e47282819688ac", - "coinbase": false, - "hash": "d47b3890f00d45df78e4b7243f42ba05e5de3329d235379712d93fb8a6588b7d", - "index": 1 - }, - "script": "493046022100a97a8855e6bf3b56ea87f0a12adab1ed62cf36c05d3bf5fb6b3593327def613d022100a050fb43a9ac6291c53991657ac670701b3479dfaf57e51fc17c3830b479eddd014104f6b72c23dd3a9ba9ed7802f2f6ca305992bee7986877fe04e6a44552337575294c7d2d7b3d98dde164e96efc7f2d57fa7a2a4ffa815e8782e60977915f3e3b29", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 10160000, - "script": "76a914a2e507baa931ee065bf93d9675b244dcfeb1a93d88ac" - }, - { - "value": 11100000, - "script": "76a91405f649ea5a29a9f70215519549ecb9d10bbc841688ac" - }, - { - "value": 11500000, - "script": "76a9147ebcc8a5e225c70931307e0e3fb4db3aa78868f688ac" - }, - { - "value": 10600000, - "script": "76a914bac12ead918508f226ae799e144154d59bdff03988ac" - }, - { - "value": 11026100, - "script": "76a914111985a61b2c2efd2aaa1e0a3d014816806cd98f88ac" - }, - { - "value": 11800000, - "script": "76a9144564fdd685cd60b725d06b2f2936d56294e02aa788ac" - }, - { - "value": 11800000, - "script": "76a914dd34e623434d9746243c67ff734acb4b9383ca9f88ac" - }, - { - "value": 10800000, - "script": "76a9143406a0c7b5321cf3ba50ed2dd35a56152c0862d088ac" - }, - { - "value": 100000, - "script": "76a914f3ed99f5ea0e2b3c648878cc214925c7b861f38488ac" - }, - { - "value": 11045589, - "script": "76a91483e2338bc9021bdfa6b17d3d426db3df897c78f988ac" - }, - { - "value": 10961504, - "script": "76a914302ebe66f0bbb66855163dfcff6b1020cb43f67488ac" - }, - { - "value": 9685341, - "script": "76a9144cf9c3cfd24fcf0579039df4dfa9929b76a0a82988ac" - }, - { - "value": 11138925, - "script": "76a914e7dc89fa8f91c31ee4e6e3137367a76395268c8588ac" - }, - { - "value": 13900, - "script": "76a914771a9974a8b5a2a009f397d0c644589aadf2aa9088ac" - }, - { - "value": 10000000, - "script": "76a914dd26076ecc49c0b44476aa08b8f49a4d4d009e6c88ac" - }, - { - "value": 11087501, - "script": "76a914eda8a507f022ac4f1927f9c0b7d1f41324358cc188ac" - }, - { - "value": 11700000, - "script": "76a914880c2295cc27e8903ff122b51b5f43f88fd6dec288ac" - }, - { - "value": 11066481, - "script": "76a9143b1a2b8ceb576afe043a83c297b8aad873e69a6388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "witnessHash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 438, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 26 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4705700, - "script": "76a914b72636a5dfb06a7b12c50e7d4e73b28a52d1c4a588ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 26 - }, - "script": "493046022100f63dc83c9c32fbb186defcc1ee29078f520e4cb28e3baf38ead9c78a9d5e28ea022100d9f0e2ed6b8efb2c327e2f31755b44f99bade783017f138db3413f3aad6c9f53012103f57f54974b2a66c16f3e1471aa1c09484176552adbe47660194116e9c2f470aa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4835100, - "script": "76a9141dffc6e7fda2bb72cbeafa91c87232c8e0496cb688ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 15 - }, - "script": "48304502205cc03d696668c6b459dfd037e858d3da70c56abd1c6c106c758c94cb760c6ac0022100aa368d609f08bbcaf16bc0b98d75f74b7d0cb3b301878ea8e37b535347a17bdc014104a2a99a940f255341024ff11402edec43d299e52023a438746cd70b46fe528e779a4d2722846f4d9449e43cb1d15d9e8ef4cd63b8f06276293a21fd522718a334", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ef213e922ad1d05bead701c48b689730d7f78e39c8c801d2fe9eda4610fd42cd", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 10028467, - "script": "76a914e86eb11e4677a2f6f55da333893ee05e75d9d0a688ac", - "coinbase": false, - "hash": "ef213e922ad1d05bead701c48b689730d7f78e39c8c801d2fe9eda4610fd42cd", - "index": 16 - }, - "script": "473044022025be47f1dfbb0e2010a2f6978e2c019c0a4b4189ee51dcc8d107e72bb7beef32022043b2606fbb062929834b99bf34150ee81ed2c8bea2e7c61b234741b86368cce0012102b3ff9b591ae128f0d94ae3c1a0aca78ac10a2d275629d65cef7de55bfbf8ba86", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "50ba98402dfa8bb27917bbc36f69c6c5c5f3eb74bd479bfad762825527327380", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 9929245, - "script": "76a914ef751e014c376d2c6e505b04698a521c9a8b5f3388ac", - "coinbase": false, - "hash": "50ba98402dfa8bb27917bbc36f69c6c5c5f3eb74bd479bfad762825527327380", - "index": 14 - }, - "script": "483045022100ae124d9915afa98ffcf0eb13c36230a46dd5f017a522ed80e1ced1901b657b1d02206c78b330941ced1cd96711b6b65fce58d5ac684eb5f0a3136bde119ba585557201410486252cc8587ddf11e96c5629b335bd6253d275afd88a041ada8576c4e0344a77be085a24a29be22b54203f0fcf645a5dfe27bfc9b0fa81e3ce903c2c6ff6acd9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9350000, - "script": "76a914f26546ab755deeec0d77ea56a958c5ed5a79c65888ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 10 - }, - "script": "4730440220381163072e0711d1a95cddb79de809a99f9d83bc3ffcd361ee6da19558e94b010220028b3d2a0459ec2df4562d019d07cdbf31ee37ccede596608261986d1c1a42d40141040d7e51b2cb3f0b1c0a349c645fd1fbb488a5bc81e30200bf7b25afd8574d631a6f116284ffe2f051ed637f31d7ee59af35348700709ca1dea6f434e8b2a9a15c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4705700, - "script": "76a91494ff49bac8f59b14d8cbadc037f7d564808454b788ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 10 - }, - "script": "483045022100b10f5b55ef25f6dfb56f29fed6cb9e00efad054a5ad3af9e7bb777909112e3ec022015df5e3259a9569db92510705143031130bf1189fc1dc35ee66ba22de93b3135014104b2ef7a418a523480040b239e4706c6b6ad0207622ba7e48654330e1b44ee260bce1534f7d31ca7a426aa0976768bf64ebbf5eeb8466cb98ceb8c4dbb489d9a23", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5f915b3fd8036ee5059ede534d2cde7204dfccb18f1b488a908ed4353fafb130", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 9939050, - "script": "76a9141864db69a8ed6cc818f654f2ce4d1724534d27f288ac", - "coinbase": false, - "hash": "5f915b3fd8036ee5059ede534d2cde7204dfccb18f1b488a908ed4353fafb130", - "index": 6 - }, - "script": "483045022100b6d653f6cf3091d0b52090fec0c0bf6085f8c6a35c3c33247ffe35e3cc6c93ad022010e0cfab24b9cb778a73a8380a27fa56c3a3635a9fdadadce33d1a7a4c24110e0141040170c2d7b1c0ded4e3b86e668a14c7d214098d40d6b5b116d311fd3ec84665c5bd32e4f9ffea48663dfba11cc191256c089b4bdfb85fb565f1a0502ed1c1e65e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f52d87bad93ed54fa161519d4c5d834653f73d6c1e496a9227826f79ba10bf24", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 8921190, - "script": "76a914cb0ef4d0e9c1668b83ef5b7ef48f4597f534b3a088ac", - "coinbase": false, - "hash": "f52d87bad93ed54fa161519d4c5d834653f73d6c1e496a9227826f79ba10bf24", - "index": 16 - }, - "script": "483045022100b0cfed6639f62b65d4e7dcb33500ecc43aabf0df49e1273f6280a8af4eda7a5302205fb18afba989c489d6b18a891af948254c29d80d35b61e2c052bc6df0e07308301210319cadf2bf4f264976821d9d9a5960e720d5742f38d1bfc27e3234fdbe0fce9ff", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "83b9b2043b0e122e4f877d74e50c5ddd3b5f523c53ffff1685ba6084505462e1", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 9500000, - "script": "76a914ec331d278c73a62d415baf4e3030f00a9b199bca88ac", - "coinbase": false, - "hash": "83b9b2043b0e122e4f877d74e50c5ddd3b5f523c53ffff1685ba6084505462e1", - "index": 5 - }, - "script": "48304502205424ce060a742c99fbe6f9aa97d441b076cd4edb66642b0a99f5562f015ab681022100cb6bdb2acd5e340a5ee0ec411efbe2c472402cfd117e29b8b0a3228d97a693e90121021faed8d196b775c9bc36a56cd862c9c9927d89990a898c27a517134fc72358fd", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4701200, - "script": "76a91442be5b5999fe4bcd73f12011057a13c4068b1be688ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 13 - }, - "script": "483045022100c686b0d70ea583ba3724d2311c8c8514c9066b1ea0aed145c047506a8246a2b80220048dd0da13efd456ea7038d1775543c2f6dbc435daf5018a73f88badfb35f6b40121039be6157a6bbbd15d99ac927d830fdebce5e68700a408ec28d2ad153c9e015330", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c585e0e388f7a5217f5e5c304cb1f4311b75c1fb936ff844686ac4fb18a8e2e0", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 9930000, - "script": "76a914dc26a966b2d83d283efac4807764e5786dc9fa6a88ac", - "coinbase": false, - "hash": "c585e0e388f7a5217f5e5c304cb1f4311b75c1fb936ff844686ac4fb18a8e2e0", - "index": 7 - }, - "script": "4730440220360e553b4ef3c127cb380229a35285132369cadc9bc44e90a7d793b7829b86cb02206bdc0d4c670b273de7b13b875d9aa1d4e063bdbcd6a4470e8fcea7066cb0fe00012102351c319c7e557cc11a26893ff7528a905699e9c8c16f021575014354c67f7526", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4800000, - "script": "76a914880c2295cc27e8903ff122b51b5f43f88fd6dec288ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 1 - }, - "script": "493046022100a1302f02da35951c49af9fc310d2aed438f59417f6723f15ffe77f052b8f7c870221009f62ba81f4f0fc6549a41dbd81f8bc0c75c66301d6bf54d7f292d063ebb25d250121036876049ac521786285c519fb6fc3860d1bea0f782785c666a47183314671853e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300005, - "value": 10066900, - "script": "76a914fd55e1eb749e6b74f3942ea2a8b5a3a588b7c7b588ac", - "coinbase": false, - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 17 - }, - "script": "473044022047947681431e36144066d2ef313ad0457c408df2bd336596435c0876571c127b0220430628fb25cafa57c4566928930bf2b7a97510401507ff0ab1709a8e162ce762014104c4e0f161838e2d9ca478ea36d9a6f7b018d0c9cb6673c04176222ef29985fd79a0948218fb48624851cf07e9771eacb8098846fffb1b302fe1687cc268bc59ab", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "804dc24267cc863314a070d8eb87a1249edc5465df65fc39ab180376830510d8", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300011, - "value": 10032626, - "script": "76a9142f71a76d1f11a1eeb3f77f124a41a99d7e8d088888ac", - "coinbase": false, - "hash": "804dc24267cc863314a070d8eb87a1249edc5465df65fc39ab180376830510d8", - "index": 9 - }, - "script": "483045022100bb359cbaba89911b77d2513ee90645a61e217bbfd11159f4a7d3ec9d5f40204d02204efeed80078b970894b20e0e17c020074a9db22aa4e501ef5eed143830b5631d0121027c02f9463ca5f9b53a605838af5a5ff1834e3a0768239d4583df46ea6701d3ba", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4701200, - "script": "76a9144f6ce855fffe7249b6cd527719fe31260fcaccbf88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 7 - }, - "script": "483045022062c56765923d456c399e3b8de60cc1d9be51bac6b94f800ad75a041562668d41022100f4d05855c569db2e37bd095d1b419fcc15c0ba568eb1fd880096b500570eb0ec014104f815930e63e74f5fcba7395b91af844731f06de77ce83f73876341baf03df03ab48f882425cc8a2004a7c38add42653bc6d702595de57d70c3a57711f3ad9da0", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 21 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4746400, - "script": "76a9142f3f5b2a16292a6cb3fdd1d939cb35b603cfb7dc88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 21 - }, - "script": "4830450220081d65ec6ffd80a8bcf97b29627ff1f8ddfc69c6b0f55386136122f6ba70fc5e022100af3ad93072b3d234732b4032c30b3f504cb92d870ee6e8002488f92331d906320141048a99956e93448cfabf4f375c0d8550fdbad54cd78047d8a6543a70dec9e3da3c504934fde4251e22e22fc63a9a4b4fcfb1de3091b809d7372479bd1d9027acfc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 19 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4714900, - "script": "76a9149bc19f38ea63fe855d63cd4ec26ef779c021737388ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 19 - }, - "script": "48304502210083dba9830ac317c444188b00fa77c03916f659651913105d140ee99a8f4b6ad9022035b7459937cc60b17a8b4cdb0c7c9b56292678a778df5889c5ec18aa906c3f550141045731cf52a701d720e781579e95b4127c4d7f1fe94861ffa3312c10c45782d1e0bd966b9b95f673ef017ff066671e0cadea0cee3486c200882ddcd7f17345f9cb", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 35 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4647000, - "script": "76a9141a1117c6baee5d2704fa155b8d22f689a144957b88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 35 - }, - "script": "483045022032d9f1d4e6c1a25b2d6b448e163b6a0a98d05981075061971a40c7b2214ae1a5022100aff9ad47a3d48b450e2757a86f79d92af5299b667911604986fa7c0d9b709dc2012103772df1e493cb56fe6454ace3e4f023362e9c80c203ddd0c71fb1d4dde7eab657", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4760000, - "script": "76a91488dab47ea396e1206da0c0f8cb1081f8700ff4c788ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 5 - }, - "script": "493046022100d2ccc6fbeac9cae058cf5859c844e80b443563181154bbf0e5d659d53529d513022100852763515faf5ecad171563b6ffc8151a9d60ee95cd141f552cb1f85c10f47d30121021f6730141e49ae382a89c908773807769316d38d3f76b529112981b30a735b35", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4616570, - "script": "76a914174773b9518fdc6d85fa8195511bb9fd844f000a88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 12 - }, - "script": "493046022100b6dc7b58e13d5d65bc3bec26869908c503de0e4be376af2804b1e807660c14e3022100e41d0c18a31181425c98a16888bf15acff11a712fbdc526e9432189c42eb5e3d014104ee9f4b9e9597103ec40259fa6a800e6d5d32872cc6d7f9842da6d92f90426c6aa7c101a578e8e93f5fe7339548f4edd29a25b695ef4100759fc5fcfcc352d236", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dbb220ef8a2d9dded1ee8f75c31e6ae6e8b56b3f25f07ca7fc77e2dc823ba7b9", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4119446, - "script": "76a914964118b6d7e820db230ba5afa3ed9c153295c40788ac", - "coinbase": false, - "hash": "dbb220ef8a2d9dded1ee8f75c31e6ae6e8b56b3f25f07ca7fc77e2dc823ba7b9", - "index": 13 - }, - "script": "483045022066e8bddc5181f75a9df7ba380eb1596aae6454eebffd13cbe3d8a1dac1297aaa022100e720d4b25915230c4f6c4200055af9d0aa2b77ab3c01a50bb7bfc9829d78f4fe014104395ace0ec5f0997ad7eec81469c0ce5237de774d99e18f17b35c8a43196686a0480b669ee0401a50f4fdf19456acd062fe2a3e231f11f0ea7fa89b6cf6fdec92", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4840000, - "script": "76a914df55056be381fbb2131ebb07cede0bc0c0874ab888ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 7 - }, - "script": "47304402206b9c4117fa92a4d1b2bbca02542d5ecd7a5eea895c43f200a0aef8cb6fbc170c02201806fea6f741fcd955077e6ac99c43288c1de46146a8147a2c1a0ea3c09f19280141044d415d96b482661059a3901481ca537f13d10c4889e04358f07ed7153e53584d6a8b4379cf547784be6c4ee2f6c2f78dc77ffc4a2d24245f464e76ef4356e4df", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4760000, - "script": "76a914b3e1a38bfe7dc4088a0b2765adcdea80213dd86b88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 9 - }, - "script": "493046022100c45a4cbc570161d77096cffa253369b58232536634481bfcc252074d08b57bc9022100b5bce3b53f0fdc541c8cf6af4e493de5c1ee14aa8d07f1e52f967fd79c761463012103970fa8a5dbad8463871661a4cca2b3a5b8c32e1a31090771add890845f0bb81b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "589905e1dfbc57726aea8a801cfb17ccfa96232b3b43e2829aaba94e7e116582", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 10060089, - "script": "76a914906de1873338762f8dc277cb3c4a2c27040a6cfc88ac", - "coinbase": false, - "hash": "589905e1dfbc57726aea8a801cfb17ccfa96232b3b43e2829aaba94e7e116582", - "index": 4 - }, - "script": "483045022100ba00a2cfdc26661a361fcacd22c324f70462d94fecfd35ba96899ca6168c26b40220215d583166d854cf6c5bc103364524c4a67e8c5731ffc91d09e824a43f83f4d80121034acc934f414d1bab97c69f8d095873af87d95e32e4b298d884cc0399a024a524", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0cbb4000fb92b9fb2488f77c0c24c2bc35e21dba7f11afb246168a8b992f41d2", - "index": 3 - }, - "coin": { - "version": 1, - "height": 299986, - "value": 10110000, - "script": "76a914e5f44c687dd14319cd6f6e1f7af8d4a87146034d88ac", - "coinbase": false, - "hash": "0cbb4000fb92b9fb2488f77c0c24c2bc35e21dba7f11afb246168a8b992f41d2", - "index": 3 - }, - "script": "4630430220700713f06ee6d28515f8d5243c9a64bb0125fdbf4da917e758d572eb95c8c413021f2641d715dd876703d3061f0eb255bca8222322f1ffe4845a679f949d8dfa9f01210251dd25d8ea938b8024d54a551b54256f0a096216107fb850daae071c1d0f0f1d", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 9300000, - "script": "76a9143c95b0971196db8b0bd7b3921d527f66008e074a88ac" - }, - { - "value": 8700000, - "script": "76a9146d3084a29be8e56ed65f828219ec0207172a8db888ac" - }, - { - "value": 700000, - "script": "76a914d433f8431306995fb7ea45213390d3bd5205620088ac" - }, - { - "value": 9200000, - "script": "76a914d346fe022a95903737f64256487d960f1bcd2d0c88ac" - }, - { - "value": 10000000, - "script": "76a9145833a6016eb94b63b3dbbec846106cb505b03b3688ac" - }, - { - "value": 10000000, - "script": "76a914138ea57912804b0416bdf48e926ff525717d9b6888ac" - }, - { - "value": 10000000, - "script": "76a914daa78d9bf530ae829be23623bd2de5d6f31fc60b88ac" - }, - { - "value": 200000, - "script": "76a914f29a1fa96e61603e9ddf46cee7e3d853cf80c4b588ac" - }, - { - "value": 9000000, - "script": "76a914103fdd1b43a0d00e858c392ea70f283ebd4ea2a288ac" - }, - { - "value": 800000, - "script": "76a914880c2295cc27e8903ff122b51b5f43f88fd6dec288ac" - }, - { - "value": 9244000, - "script": "76a914977ebf8e9f9a6f764eead20e1e7b1aae7cf45be288ac" - }, - { - "value": 10000000, - "script": "76a9148022d8f58ea0a35a77b5e500bd5d55fac180d7bd88ac" - }, - { - "value": 10312583, - "script": "76a914fc90f2aa3f5bc939d2956b83316f3362a7d108c288ac" - }, - { - "value": 10100000, - "script": "76a9140afa35251c078859bce7edddf85ba8138058e24188ac" - }, - { - "value": 8904200, - "script": "76a914254c7a2b7ccf21a1d695d24559e4e10c8e78817a88ac" - }, - { - "value": 10000000, - "script": "76a914f491f20630785f977ed204bd53970dfb47f1256a88ac" - }, - { - "value": 9000000, - "script": "76a914cd6078fb948388a2f78045ee0826a4828db7f5fb88ac" - }, - { - "value": 9500000, - "script": "76a9146425030240caae1e6bf20c3e061bf611de7cc7e388ac" - }, - { - "value": 10000000, - "script": "76a9144e926e2c60311b7babad34cb36cfa57aedf8835e88ac" - }, - { - "value": 8500000, - "script": "76a9147c5d112d87d2349a795733b2986d9878767d485588ac" - }, - { - "value": 10000000, - "script": "76a914f2ddf172bc30e002a5499f69913322898944b8d088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "fdd7833c139a12cbb6be3fbdf8ebe694441698ddadd52a8a3b52372e3911398d", - "witnessHash": "fdd7833c139a12cbb6be3fbdf8ebe694441698ddadd52a8a3b52372e3911398d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 439, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f90d9845eea45e16d0caecd70a4057d97974c4e22e647fe9ebefac2d7d9fb03e", - "index": 12 - }, - "coin": { - "version": 1, - "height": 291353, - "value": 5685, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "f90d9845eea45e16d0caecd70a4057d97974c4e22e647fe9ebefac2d7d9fb03e", - "index": 12 - }, - "script": "48304502207a940f703f52ad43067e54b8132eb14f845f206c6eb22227b6a2eb5a595c59a7022100adb3f660de6720761a199b9bc394383f89f4cb9a98a366bb29bbc08702f67a4c01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c7532adc1bf08469158391d20427f0cb796053fa37ccd50851fb65451c7d599a", - "index": 8 - }, - "coin": { - "version": 1, - "height": 292216, - "value": 13929, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "c7532adc1bf08469158391d20427f0cb796053fa37ccd50851fb65451c7d599a", - "index": 8 - }, - "script": "473044022008983e89e9e530b7a8e5bb2afeb2f30d25c2583c5e47a5dbb9fe9d9a6effada102205f35fc09874cfe01e9c7c15ba1f65ee56a55a36be594d3ed991f4bcdce5809b001410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c5f9d5f71b526dfc8a7581acf51f2ba4f945dd9c176834e8b73250b2c8ddccbd", - "index": 12 - }, - "coin": { - "version": 1, - "height": 292316, - "value": 5714, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "c5f9d5f71b526dfc8a7581acf51f2ba4f945dd9c176834e8b73250b2c8ddccbd", - "index": 12 - }, - "script": "483045022025fa2656c02b80d47f4e61961b393c4a21d7277b5b1ab2f748e3cef919ffc86c022100b17c816d819fc94844abb203150fe1e556c1c8e1e4266fb70d32bbbe0eb75c4e01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "765e892edae0b77e13ffb1b5a9fe3e0a7502078ff662081280e3bcf479c09c7b", - "index": 16 - }, - "coin": { - "version": 1, - "height": 292572, - "value": 6876, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "765e892edae0b77e13ffb1b5a9fe3e0a7502078ff662081280e3bcf479c09c7b", - "index": 16 - }, - "script": "473044022015748599eb3a2069048cd662efe864c5bb0251bc59a082f0c2d3665796480c4702202942906ed0635e2385cb37f1e995ae2b76f6e2f8884207538d68f37d338f120901410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b7d2018c916df7470a95407c27656354d572663d1e20a0c659cd5370642ecad3", - "index": 24 - }, - "coin": { - "version": 1, - "height": 292635, - "value": 6725, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "b7d2018c916df7470a95407c27656354d572663d1e20a0c659cd5370642ecad3", - "index": 24 - }, - "script": "47304402200a053dac249c7541929967bbc7c2ce52735e3ffd3640ea2f5438ba793cf63971022033ca43ae0df50d88378c87cbbba4f7ae75e839a19336e3daabf1796af333a88101410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a3d15b6cfa2b7d851ea341564992757322fbc0ab2b0ac5adb0e7874032224ece", - "index": 16 - }, - "coin": { - "version": 1, - "height": 292984, - "value": 5866, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "a3d15b6cfa2b7d851ea341564992757322fbc0ab2b0ac5adb0e7874032224ece", - "index": 16 - }, - "script": "493046022100caf797361688ce54db00f0f883c12b68ee0caa19b6c36eede87e63a425a9d95f022100e56eefefede835a025ff483179d48f943e04381766aa6cd4add322aa5fe710c601410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "08c2da2a2930f931e702f06d9170a9d3719f18b48f2946475c1b41421bd922eb", - "index": 20 - }, - "coin": { - "version": 1, - "height": 293133, - "value": 6860, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "08c2da2a2930f931e702f06d9170a9d3719f18b48f2946475c1b41421bd922eb", - "index": 20 - }, - "script": "483045022100d06c557b819221e56961dcd867ac82ca2ce7524085e94e9d32ad8f05ce99853f022075c72973ae998d5d5c1f93ed798046bf1186faf9d1bab926e30a88c36c78844a01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1f6b5913a62f6cede775a74bda3d1e38a2687ae71df56f555d7f73bec426ed5a", - "index": 15 - }, - "coin": { - "version": 1, - "height": 293247, - "value": 37398, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "1f6b5913a62f6cede775a74bda3d1e38a2687ae71df56f555d7f73bec426ed5a", - "index": 15 - }, - "script": "47304402204b982f51deb3fad08fc11d9597dc9c1d5721d26a4760151227945a54b41b6cec022061966667006c8bef5234f1dd00201fd3dc80cdccaeb51c405d7c2d9c02b57e7d01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "01e72c6a1b0db439f1ddc3684e55f14564ada42b9ef7e20c7e3af841e2862c3b", - "index": 12 - }, - "coin": { - "version": 1, - "height": 293757, - "value": 5650, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "01e72c6a1b0db439f1ddc3684e55f14564ada42b9ef7e20c7e3af841e2862c3b", - "index": 12 - }, - "script": "493046022100c0888ba3fd1b8b5901c4dd23ab8e6b71f9678864e838643aaf9a22d207ea5a27022100d44db9711714066e41ad2e660577f74ac9275675ac864ab12d8fdd3910de60f401410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d4ad7072d474c813001c3afacd05c030fadf46a0b77f10bb04c611236cd2672c", - "index": 9 - }, - "coin": { - "version": 1, - "height": 293773, - "value": 7329, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "d4ad7072d474c813001c3afacd05c030fadf46a0b77f10bb04c611236cd2672c", - "index": 9 - }, - "script": "493046022100a5d989d28802727d0c500cda655a103c6044f1b9e654c29478f4e294d6cd8a90022100c58c9d2e589a0a775224fa8e12d3b370b7faf1fd36a918dc7c230ea55d69d16101410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ebcbcd894587fbc8279ef4397b6ee94831f2e475e6f9a9bf16f9853aa5965e14", - "index": 9 - }, - "coin": { - "version": 1, - "height": 294519, - "value": 57166, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "ebcbcd894587fbc8279ef4397b6ee94831f2e475e6f9a9bf16f9853aa5965e14", - "index": 9 - }, - "script": "483045022100c67f3f789a7bd48ffc82e8913a508d32b670a0d4275346add6beb2714e3ae4f6022075d75941295d55580e83368e648510480c0c508ab0c568014119dfaba4e5c9dc01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "20353f9575f60e55af01acd2018fd3f89aa5bb6f91008ae0466c9038495c7739", - "index": 11 - }, - "coin": { - "version": 1, - "height": 294662, - "value": 5671, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "20353f9575f60e55af01acd2018fd3f89aa5bb6f91008ae0466c9038495c7739", - "index": 11 - }, - "script": "4830450220222435c19c29b55820982ada86c202e03f6481cea78af97a5dc42708b1490c51022100b3e0952b5c52f497d587d51b488649fbae5a119426e77cb114e060a4004e7ba101410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d4fe3371197cfd3085cd13d218da76650d6e035ec3a51c221ccd9d764f4e0c9d", - "index": 14 - }, - "coin": { - "version": 1, - "height": 294679, - "value": 101408, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "d4fe3371197cfd3085cd13d218da76650d6e035ec3a51c221ccd9d764f4e0c9d", - "index": 14 - }, - "script": "4830450221009cda8f069362742a1a428f93885914a86260379be7b05cb79d87237463ec374e02207e44a6d9807676409f9f1c0a78d0a2b0f20a4950dfc617e8b7579d4b24f7875301410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "89127ddb215dd80fcc352f6348e9eea92919bcf18796da688458a7753eaad64d", - "index": 22 - }, - "coin": { - "version": 1, - "height": 294789, - "value": 6810, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "89127ddb215dd80fcc352f6348e9eea92919bcf18796da688458a7753eaad64d", - "index": 22 - }, - "script": "4930460221009ac7a20365e0c615377d93d1e815d47537dcc5e533572e91b6723d0381587d16022100b2b8cd64f1dfe49dc028b7a3e902333b04960f93c1d51ff6cb050969bd33eefc01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a1db0a30bbaf279d3f281f0f44a65be0246051df724e1dcbb809f649a5db2f5d", - "index": 170 - }, - "coin": { - "version": 1, - "height": 294929, - "value": 10690, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "a1db0a30bbaf279d3f281f0f44a65be0246051df724e1dcbb809f649a5db2f5d", - "index": 170 - }, - "script": "473044022023d88676e91c845033a84517901a496975d5192819c18ba25ff6ef1db734f5eb02206e638cb9d8e00cf35cadd4aa758ed2d2b9e905e360bb12546a1f4f6c65030c9501410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "db4b16e1d81af96825255bec7efdbec710d063ac599142dbac5ff2357148243c", - "index": 19 - }, - "coin": { - "version": 1, - "height": 294961, - "value": 8330, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "db4b16e1d81af96825255bec7efdbec710d063ac599142dbac5ff2357148243c", - "index": 19 - }, - "script": "49304602210089e28d686d11a810b462099b7265783f75800717bbd714e2de1acc763409ed750221009cf2a37e9d83edd255ca84d500bfeda9ffabf39c70c8947d31241beadc28d08501410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4f15d0c9999e758decc927df55f27953ad026fcac60b1c5ffff50ac4072341d4", - "index": 15 - }, - "coin": { - "version": 1, - "height": 294995, - "value": 5860, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "4f15d0c9999e758decc927df55f27953ad026fcac60b1c5ffff50ac4072341d4", - "index": 15 - }, - "script": "483045022100e2aa57fafe6c7fa0379ef436447c4e30b7d8083fc11b7130e5ec1890df38a7bd02200798fc260bad420988ce948b32d6b092414c0278f7b842f416b9049b54c49cc101410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2da092c3446c873f25384b17b0f964575c2346dd94ece9a70b762cc85fa468c5", - "index": 17 - }, - "coin": { - "version": 1, - "height": 295498, - "value": 7848, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "2da092c3446c873f25384b17b0f964575c2346dd94ece9a70b762cc85fa468c5", - "index": 17 - }, - "script": "47304402200440ab0404258aba2b4ba9f9e3ad826e2c72acd6aa8e1ab5d15a382cf25f2bf10220722a75c221cb5578cbf1067df34932b65d2b7b2cb8d66be34004c59e7cbf815801410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8b7d39af80794ea5833995901bc75b12d94da6c7542c117c0f57e6d8dae3d309", - "index": 858 - }, - "coin": { - "version": 1, - "height": 295594, - "value": 7900, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "8b7d39af80794ea5833995901bc75b12d94da6c7542c117c0f57e6d8dae3d309", - "index": 858 - }, - "script": "47304402207d4e01f172bcaff9b99004baeafc75e865a727654f75ebd74cf967510675ae13022040478d6a0a0b39bed0459c81741ade4e7f6e6d95c2f14585fc624043d535984001410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6bc93ad442ba3103382a6375c566a0b58e31236e3c3efdaf88fc428ddc364c4a", - "index": 9 - }, - "coin": { - "version": 1, - "height": 295619, - "value": 6889, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "6bc93ad442ba3103382a6375c566a0b58e31236e3c3efdaf88fc428ddc364c4a", - "index": 9 - }, - "script": "483045022059d4b97b99e3e7f73abd5f29ab11fcc5fc3cd6ec814272ba5acd25d4f176e882022100b2ffd00c03038d0b2755ea36961ca342a1731ca5e109e434d3552048e76628f301410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bbd1fbde3060b43ee4790473bfb6bdff1044c0314edf9618c1e0d1ea9ae9c406", - "index": 9 - }, - "coin": { - "version": 1, - "height": 295636, - "value": 60663, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "bbd1fbde3060b43ee4790473bfb6bdff1044c0314edf9618c1e0d1ea9ae9c406", - "index": 9 - }, - "script": "48304502200e91e98b61bf71fadec78baf26d3ffcc8b925ebc20f8f75dc01959b9997e3d57022100ec595467f3bc8bda71d969564a814ef2392bf3e788421f0761d88063600f4ef101410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "07d259ccc6d7437399b6a0f32a640bb0d70e01167c66d6799331ce092983956e", - "index": 17 - }, - "coin": { - "version": 1, - "height": 295684, - "value": 6680, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "07d259ccc6d7437399b6a0f32a640bb0d70e01167c66d6799331ce092983956e", - "index": 17 - }, - "script": "48304502205a346b68fc6e1dd49d51358b0c0b620829843f768cbdfe77ba5bd7ee017a2981022100fd4b55c1ba431b16ca66e01b8ab816f0ddab103931e99e51d6c19aaa303e817d01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "33c794811df9669b5b8fecca14f60d09520680722eacc708f7ae89da9bfb4699", - "index": 18 - }, - "coin": { - "version": 1, - "height": 295808, - "value": 6050, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "33c794811df9669b5b8fecca14f60d09520680722eacc708f7ae89da9bfb4699", - "index": 18 - }, - "script": "48304502206de9b12c66be1cc163d74897741bf71beed13038f05f5c21804b6b53542284b5022100c4a0ffcefbaeb04f9f066e8ee6534e3ac92c515c7a659bad4f1e135a33eae8cc01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7d558ec8daa244d463cdc974ddedfca4ff70f1b6e50d4c0f0239fe456af85f1b", - "index": 14 - }, - "coin": { - "version": 1, - "height": 296379, - "value": 6840, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "7d558ec8daa244d463cdc974ddedfca4ff70f1b6e50d4c0f0239fe456af85f1b", - "index": 14 - }, - "script": "48304502203e0fc23468a781cecb1ce8f6db4265ce6acdaa77e95e2efd298db9334777519c022100c747fe7dc35c77a8f29b39d455f93afcb3e98180a941cc8b221b1ff6982dc8f901410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "04b311779256d1165249e822924c4fec7262f9a6a4e00068d3f848dcd25d181c", - "index": 15 - }, - "coin": { - "version": 1, - "height": 296390, - "value": 11566, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "04b311779256d1165249e822924c4fec7262f9a6a4e00068d3f848dcd25d181c", - "index": 15 - }, - "script": "47304402204471ccb277ee11fe643ac47024f8e6d63a35f05172c231b3f8e8421fd046707102200b6faec412e632e88981d04f6073b5ef4121e1a02faa3c07b81440c3cf5f6b4601410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d83439c6a25c4450849b3862bdb457049eab1cf6998057d9eace70a4bdb9df3b", - "index": 92 - }, - "coin": { - "version": 1, - "height": 296801, - "value": 6200, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "d83439c6a25c4450849b3862bdb457049eab1cf6998057d9eace70a4bdb9df3b", - "index": 92 - }, - "script": "493046022100f5398ebe120d8b2c60a54062da23c568014b4533bce2cefeeb83907ab034019d022100e5895fbd92ac9a077b2dbff73c68747ac22938d923be068c0394152be7275e1401410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a0ba8426f1e5f04e2723d853cb000f1be8502036dc8f05bd068197b32aff53b9", - "index": 9 - }, - "coin": { - "version": 1, - "height": 296828, - "value": 53064, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "a0ba8426f1e5f04e2723d853cb000f1be8502036dc8f05bd068197b32aff53b9", - "index": 9 - }, - "script": "473044022000882bedde743c7525b8bcd83a120f6bd9bc86aff06838dd268e7d8800914fe602204a79ee3fcb25c5b6c34b6485e4d33c6740966cb3324d0acda0d83cea7a594e1201410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b9cc078c1caecf19046255ad5f9bbbfc4629e455b010487139db9c9e7a5a2c1a", - "index": 21 - }, - "coin": { - "version": 1, - "height": 297365, - "value": 5910, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "b9cc078c1caecf19046255ad5f9bbbfc4629e455b010487139db9c9e7a5a2c1a", - "index": 21 - }, - "script": "483045022065b46a316e4d8196b6d69a30ec2d01d084c9ae2ab0240c83fe6867284539b4320221009b73d587956a0d12320b3de93e5c2963d505ef1fd08e142c1ddad2cb30451dd201410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2f8a9cfa212db9034a0162b391ad72dc5e3f224e112a9afedf689801e6aac948", - "index": 16 - }, - "coin": { - "version": 1, - "height": 297377, - "value": 7428, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "2f8a9cfa212db9034a0162b391ad72dc5e3f224e112a9afedf689801e6aac948", - "index": 16 - }, - "script": "483045022004094448fc5fa3b3e7e228b4ad994fa108ef851c8a29e1bd7c6989b5471589710221008082f511b98826f2b0efb8b53e841f1bc2791a6025a9edcf9ce8886a4f5b48f901410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f8a7ac434fa70311df25bf29d5722d41353141aee0af9e8725dfb90dddaa9368", - "index": 149 - }, - "coin": { - "version": 1, - "height": 297483, - "value": 10779, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "f8a7ac434fa70311df25bf29d5722d41353141aee0af9e8725dfb90dddaa9368", - "index": 149 - }, - "script": "483045022100befe01bba644a3307ff72c66b6143989306620754a2bd4d6f0126cc5d8099d2f0220687e5365336887998f4d48eb94b02402230640c7224451cb1d71106f1819258a01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1e7da75dd32cf7fd9930d924afcc2fca426919627c8a742092eb59b5d06164d5", - "index": 14 - }, - "coin": { - "version": 1, - "height": 297529, - "value": 6695, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "1e7da75dd32cf7fd9930d924afcc2fca426919627c8a742092eb59b5d06164d5", - "index": 14 - }, - "script": "4830450220519d832d4185599d8849e20087b513ccc8d407c089b069ac7a79612ea0df4a740221009af954c04afa4aba3eb955ba38b30f0fe0899cbefc77cceb7c8edfa4e109e94601410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4f2dd80e17e3d33aa475b17483d0a8bffbfda16465d80811a450a4969732578", - "index": 11 - }, - "coin": { - "version": 1, - "height": 297637, - "value": 7499, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "b4f2dd80e17e3d33aa475b17483d0a8bffbfda16465d80811a450a4969732578", - "index": 11 - }, - "script": "483045022100a2d81cf09b64370c8ebc044d45e787ef853f126b1e1e925ffcbd7338c39e733102200bc53a5fa3692c2dc7cb8aff7e26c83cf3d37ba39df97a8e38c4af25ec7be77301410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9873d0244d71b3358a04675e033d3405e48bfcfe7b65166c34f2942b1ca0e41f", - "index": 1234 - }, - "coin": { - "version": 1, - "height": 297959, - "value": 11350, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "9873d0244d71b3358a04675e033d3405e48bfcfe7b65166c34f2942b1ca0e41f", - "index": 1234 - }, - "script": "473044021f0ab98e1e964eca7ce21a903db7fc3c2a032114357d9f1c3a9d7edfce4ae6b402210099d28730ef5842ffc7e911a65f61b5b765dad593d9fb237c6b62598bf36f830a01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b779ae5fe2946f40610352676c2543453a8bac6b076c850768bb3f30c0b4540c", - "index": 8 - }, - "coin": { - "version": 1, - "height": 297985, - "value": 82596, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "b779ae5fe2946f40610352676c2543453a8bac6b076c850768bb3f30c0b4540c", - "index": 8 - }, - "script": "493046022100ef1f017fdde653e4701e2b48f7fc15b8ad2c6f9ac62fd5784229ec23ce626ed2022100893963dca002c807d1f902c549ce6b239a61cfbae6bb385ac457a21eaa86aa3501410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eeeb41677fb28f20099a4ed477ef202572e32598a40e7c8a14f667331a24b15e", - "index": 20 - }, - "coin": { - "version": 1, - "height": 297985, - "value": 11499, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "eeeb41677fb28f20099a4ed477ef202572e32598a40e7c8a14f667331a24b15e", - "index": 20 - }, - "script": "48304502200dc35a0a66a75e061c5407095e66b6115469d5d1e445c144b1c572919aab0c1102210093a3767aab9a04ddb59ab92c709b00871f48b84ee45f7d583507d87a2b9b648801410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "42faa43855498196514d8c79b9808028f6f21bb01700c530284007e48ed68209", - "index": 18 - }, - "coin": { - "version": 1, - "height": 298033, - "value": 7860, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "42faa43855498196514d8c79b9808028f6f21bb01700c530284007e48ed68209", - "index": 18 - }, - "script": "48304502206f8ab3ef1b006053593e12e14aa6818addcd15c74610ee9cfc894f7d25e970fe022100bfc58cc7abe607524ee220c1b25fcf26eb94bcba7a1228102cb2be6778ab20ee01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "de8e07a92328e01df5ba02085ef325741ff5caa927d24869d9bd978e82ce9414", - "index": 15 - }, - "coin": { - "version": 1, - "height": 298152, - "value": 6412, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "de8e07a92328e01df5ba02085ef325741ff5caa927d24869d9bd978e82ce9414", - "index": 15 - }, - "script": "48304502202a926c9fe07a13b690027d0b1b3d4145aaccc2ebce48dd2895937d9ab19ac64e022100f207e67f039a7accb8780c51ec78e30f0c3ac87a8bea37e414756d1b9d68933f01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3d360942f01d811842c9d66cbc27189f11f32f41a1f84ed783720b1fe5d11227", - "index": 17 - }, - "coin": { - "version": 1, - "height": 298183, - "value": 107067, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "3d360942f01d811842c9d66cbc27189f11f32f41a1f84ed783720b1fe5d11227", - "index": 17 - }, - "script": "493046022100bcd2e23546a1d24c9884ed2d85f3afb77f2f2d432888db15ce83e77b15b9b6a0022100fd73bfc2e0d7184d462ad8b634ff41ae157e065d86dc68ac2dcabf05755a7b0601410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dcc0c847e0472e572209569637760722a7fb2fb8e7bf5e9a93857d4f4c639ceb", - "index": 13 - }, - "coin": { - "version": 1, - "height": 298305, - "value": 6080, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "dcc0c847e0472e572209569637760722a7fb2fb8e7bf5e9a93857d4f4c639ceb", - "index": 13 - }, - "script": "483045022100b505cceae6f1094ab6638f221749d6ce28860ba1ad812d860a46f83a4002929c02201b59e7f25a4482951088cb91b6df98e63b2557347730f6d3c84305bef9eadb6d01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6f32077996a9d4a8c08e49e2363032d4ab94485431077ce777644319bbc4ac53", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298655, - "value": 100000, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "6f32077996a9d4a8c08e49e2363032d4ab94485431077ce777644319bbc4ac53", - "index": 0 - }, - "script": "493046022100a79297d48388235e53473f8cc908aabb09f3d750a894a9b2b0e121887603416202210086b86f1a9b40b2322ada9f2496545996aa8b4917b579066e68d9213a7421318e01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "afa2a24a5e8ad470cb723b9944916ac88c7d4052b7abf73f93f6b422f7c8246e", - "index": 16 - }, - "coin": { - "version": 1, - "height": 298783, - "value": 6790, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "afa2a24a5e8ad470cb723b9944916ac88c7d4052b7abf73f93f6b422f7c8246e", - "index": 16 - }, - "script": "473044022044e4ab5784419ded573943909ec80902d7210fe0340155385ac03ec2d72b5c6e02202bbf0c5bfdcba545c35b86570232bf8a5591331326b11400fa9306bcd1fb181c01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "10b819476423749ac6e06491ed7e0f6c8cab79dbd3a0d712275d15f12b82006d", - "index": 13 - }, - "coin": { - "version": 1, - "height": 298813, - "value": 18193, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "10b819476423749ac6e06491ed7e0f6c8cab79dbd3a0d712275d15f12b82006d", - "index": 13 - }, - "script": "4730440220610bcca1163f3e855f252eb1a22250be1ce337c4e9ae241fecf7c75a5d458e680220746a372f0039fecb6dbc6a981a26e2f8a1b9b18a947b8a99b28788ae21c2fc1e01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c7e8ff3f8d102e4e6243dc1db7fd14b008712176ba1d230db6c66d8ced444818", - "index": 119 - }, - "coin": { - "version": 1, - "height": 299049, - "value": 10062, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "c7e8ff3f8d102e4e6243dc1db7fd14b008712176ba1d230db6c66d8ced444818", - "index": 119 - }, - "script": "473044022040ea4dd6412d6337ba803e593847ed1097a0bc9f783f22d1d6477316b0f5241b02203df042470ed376fb3ea33211297704dcaa7b2f503dc73db07dc112311d9e3ed701410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1f2924246fc1bd3ac314df9e7039190539e12819aab109c0a22adf4b9cd3d5f3", - "index": 1631 - }, - "coin": { - "version": 1, - "height": 299054, - "value": 10350, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "1f2924246fc1bd3ac314df9e7039190539e12819aab109c0a22adf4b9cd3d5f3", - "index": 1631 - }, - "script": "47304402203a926070611c9144f71ae4da8cb666fc6307e4e8f7ef3fa1a6517a2efd79cd61022048bc7ef9522d35807a6e54a74d1ac06b2dcf23b503a6475b00224c47e5a85f9b01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "78e4b002837b4e0adc2ab9023fd4ccaa2bcaccbe77ba1ae3e3fce5fd0ba962b0", - "index": 12 - }, - "coin": { - "version": 1, - "height": 299087, - "value": 48156, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "78e4b002837b4e0adc2ab9023fd4ccaa2bcaccbe77ba1ae3e3fce5fd0ba962b0", - "index": 12 - }, - "script": "483045022100f8a1c532a5d7d17207a84e05ba71e0612ba3db155ef90b4d5d44c61d1395ddd3022073aa221dd370ba8a5a2d841cd497f860ebf9120980b237b1b2eb5c7d1bca226d01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fce65501cc18afb66e79ce906fbc9046cd3a09a3ac7ae36bc11430048e146fc9", - "index": 13 - }, - "coin": { - "version": 1, - "height": 299130, - "value": 7041, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "fce65501cc18afb66e79ce906fbc9046cd3a09a3ac7ae36bc11430048e146fc9", - "index": 13 - }, - "script": "4830450220406f52dc83f2d1bfaabc3c8a7995a7904c5e58af8fb16a9331f8dfe24a4e5cf102210081bb6bf95b9f111f3b32ebb570298a2d1c3a51ff8107949b9eb4c6f69dccf24701410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ec6a6f1a194fdeb1b30afcd4a1ebca391418f1ed565866a12bff7ae6a2f1a2f3", - "index": 16 - }, - "coin": { - "version": 1, - "height": 299141, - "value": 10237, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "ec6a6f1a194fdeb1b30afcd4a1ebca391418f1ed565866a12bff7ae6a2f1a2f3", - "index": 16 - }, - "script": "4730440220665158886936d00a874bc5642a331d44c7e77bff856228ac1989443507827c4a02204f604a4d7bddc894c639909a129b4a70de1f3f78a710a163835ecf22ad99e50d01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "14a630790b7334cd433caa7ec869e434cb2f44f088e834ddc2dd211aa6d3158f", - "index": 19 - }, - "coin": { - "version": 1, - "height": 299219, - "value": 7852, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "14a630790b7334cd433caa7ec869e434cb2f44f088e834ddc2dd211aa6d3158f", - "index": 19 - }, - "script": "483045022100f3ab996b9afd3c90e82b68c7ee8b755d4a900d29e46a1ab5e33ac1e9939c8a4d0220105b829de4c265f529d3dc24784fb41a482e228e9f7208d34e740aac00e5bedb01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ee30e777913216bfa33862da6c9cebb99a6ab85e83d19fef2598becdc5d04449", - "index": 15 - }, - "coin": { - "version": 1, - "height": 299254, - "value": 6370, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "ee30e777913216bfa33862da6c9cebb99a6ab85e83d19fef2598becdc5d04449", - "index": 15 - }, - "script": "483045022017003b7265366c9ca3bbef2f4ee7cf994ab3a7f255fac3440cb46ab2502e657c022100a5e491ee20027ace84feb6e8bf2ea89d790f56689be95339b5d7b2c481851a1301410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f74ab3401def47841b6f82b2e7840e3faa64935735b1803de6bf68af2c59c102", - "index": 12 - }, - "coin": { - "version": 1, - "height": 299398, - "value": 9463, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "f74ab3401def47841b6f82b2e7840e3faa64935735b1803de6bf68af2c59c102", - "index": 12 - }, - "script": "473044022019a0925a2792b9cc8972e6466fffb3c1c4b49e9809b968650ae9d283b4bd006402204c39ed14a3026c57b2e67b478d693984e33f0658035a2ed1ac7d3c458bc6e59701410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6c524f67cdcadb0c93a6210bc5ac01cc4498f3d942b6018c45f0617646d7ff86", - "index": 13 - }, - "coin": { - "version": 1, - "height": 299511, - "value": 5671, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "6c524f67cdcadb0c93a6210bc5ac01cc4498f3d942b6018c45f0617646d7ff86", - "index": 13 - }, - "script": "4930460221009e525f3d5faaa70f4babecd05a9a71d7f31e0a70ef4a4667f0db1ec15e307ab8022100a45fb51d24ad4f34e4bb8a08491a1fe70f1a1cc1a598321a494beb4cb424129401410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6c52623522adf2bab496dc7c47210d7a3df441c674a78c14c2cb17259051a3fd", - "index": 19 - }, - "coin": { - "version": 1, - "height": 299559, - "value": 8820, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "6c52623522adf2bab496dc7c47210d7a3df441c674a78c14c2cb17259051a3fd", - "index": 19 - }, - "script": "4930460221008f638ef49261f4c942bed0aaec972e36f564daef1517e2f938b3d68786556c73022100f87ac03d5513e1e5d1f12a6406e92925e188fa76e55d4ec42511a8cfa3adc12401410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d6ef237163bd73f339952a89c59a7a42d242c0be08d5e22c78ff35b40cc7b40e", - "index": 20 - }, - "coin": { - "version": 1, - "height": 299616, - "value": 7491, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "d6ef237163bd73f339952a89c59a7a42d242c0be08d5e22c78ff35b40cc7b40e", - "index": 20 - }, - "script": "483045022100814ad27fa188025c6bac910e0cd42f2459c6f7223d614c804be79d3c80a4ac4a0220690b4025a62ee886cb029d28c479f1f6c29ebf3bc22bbcd017ce03c3cfbc9e2201410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2a42773f46a7bf6da91414090f4f6bf0e4f837bb199c7c67ccbac207d4f5ed8c", - "index": 16 - }, - "coin": { - "version": 1, - "height": 299768, - "value": 6660, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "2a42773f46a7bf6da91414090f4f6bf0e4f837bb199c7c67ccbac207d4f5ed8c", - "index": 16 - }, - "script": "473044022063cb0264db4041c8870cf6558e86ef080611e678e1e5fb873a85f1af4cb6018a022022134c5e475d07a839ebd9e8e8fafda80e71a6309f6eddb7e5381a83d0a3e21001410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4ace9fd72e9270492f0d91dc7dca83d806b95947f025f1f2620cd2748a98e02b", - "index": 20 - }, - "coin": { - "version": 1, - "height": 299780, - "value": 8904, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "4ace9fd72e9270492f0d91dc7dca83d806b95947f025f1f2620cd2748a98e02b", - "index": 20 - }, - "script": "483045022100ae2ee2acb915211dd2ecca92220c4e04457adeabb2161e2fead80ce34ed7a06b02202ba4f68c7614a7ca7aa92ab7a3ddc25bbfe5a4d7af1e86b28d6354b8502dd3ed01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "17e24b2aacc568ebc167e3bd8a03d0263e5d158e833968606bdf68bc71c85663", - "index": 15 - }, - "coin": { - "version": 1, - "height": 299878, - "value": 105464, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac", - "coinbase": false, - "hash": "17e24b2aacc568ebc167e3bd8a03d0263e5d158e833968606bdf68bc71c85663", - "index": 15 - }, - "script": "493046022100c8d1d175749a8728c8cc0f0118a308b67231d466f831026ecc5228e68e81a7e4022100d051ff269757627a7e23134203608d16bdd284939bdff024d3d18b535208c9ee01410418bc18922af607462bced2b58dc2e2905444a7f0695c29f8de5abb5d3140858e6293e6dd7afce000678f63c2ef51e3828350246b4dea1d2353bb9026c197d961", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1000000, - "script": "76a91490b9ab91dec16f1e609378a8ddf4c0ba2a7c6dd788ac" - }, - { - "value": 366, - "script": "76a914d39910c26b3d55ba72cfe928fc9b4f4edec4a11388ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "0679a554a45213e3a57f0c6af98c781f11c6943221be5909a7c5c158307a1e49", - "witnessHash": "0679a554a45213e3a57f0c6af98c781f11c6943221be5909a7c5c158307a1e49", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 440, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "6f9511cbec63e6fe8bf0877572d0230c809d03fbff74f1038c7c7494c25d1776", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 400000, - "script": "76a914da5dde8cbf20315f3e00ad8d6b610c14bb6d0ab888ac", - "coinbase": false, - "hash": "6f9511cbec63e6fe8bf0877572d0230c809d03fbff74f1038c7c7494c25d1776", - "index": 0 - }, - "script": "483045022100fbfb89605b8c1ef17f446e37003172ff4bc1d2f864c0fdda8807b2719a4eae6602200e066fe171839171d612cf56182a1349ab48662f05927f412e46a079f027c120014104ccc493c773ed7b190fd3fec0fde94df66605923b5ba6781968921e3f7c86060f62799e085a6873cc5dc1592e99a9090951cad28102cb920da361944d1a827916", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "046e04c9f1c9fd45581cca2d3c4e508e634e79dec24ef04045befc2bcb1eec2e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "046e04c9f1c9fd45581cca2d3c4e508e634e79dec24ef04045befc2bcb1eec2e", - "index": 0 - }, - "script": "483045022100fdbbcf04703315713dd10d28023525077e50df3db7be027184c5d618599634060220280f08cd4347470c5f5662c2075c2b61384d8cd543d0c68f3e04a33f050098310121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0fad5a15d5a1db7eb028d0772f7bf48eaeaa51664354fe576eec0f2f59ad604e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "0fad5a15d5a1db7eb028d0772f7bf48eaeaa51664354fe576eec0f2f59ad604e", - "index": 1 - }, - "script": "47304402200df63c9fc6cd54cf060fa51cf81bdc4dc705d0282c14b502ce1952ac74d66cdf02200dd1c6ac07136b579fe3e444e74df92143b30b8e81cfb79316e9f8446aed81980121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "38b33ba4fdda75c73edcb208569271d5f6e6293f4e8cd7e6e42f0b410c49d405", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "38b33ba4fdda75c73edcb208569271d5f6e6293f4e8cd7e6e42f0b410c49d405", - "index": 1 - }, - "script": "47304402204f29fa8b075284ba1f8f6709d233d553dda8ba475b768e7f2184d93cf3b2ea7b02206ebc9407398aadd430c0c4b0ab37d259acd4824a45599a0b4e3c9d583f3d09a40121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "678708145e5623b3fa9fdca67dcdf51899a0de15193d23a2b6632bc4f51f3981", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299991, - "value": 50000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac", - "coinbase": false, - "hash": "678708145e5623b3fa9fdca67dcdf51899a0de15193d23a2b6632bc4f51f3981", - "index": 0 - }, - "script": "47304402201ff07d61a467dea644dc9b05ea1ca9bf3e70d3d517e18a0dbf8147a53c57bae602202933c1d829ac09208dc0e2e3a7f240abbb9cbaad14e314b85207082446257e560121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 550000, - "script": "76a9146e24f8d88925eeb0457df7cfb968118cc31e1c2788ac" - }, - { - "value": 40000, - "script": "76a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "3785b50533231fd9740088551a86b6b8aa4c8351a0e6eb5225fea9324c18075d", - "witnessHash": "3785b50533231fd9740088551a86b6b8aa4c8351a0e6eb5225fea9324c18075d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 441, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "98f426b4c68b6342d62141f8ceab608aefce48ae5cf8c200e32c998dc26cb3f8", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297088, - "value": 463497441, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "98f426b4c68b6342d62141f8ceab608aefce48ae5cf8c200e32c998dc26cb3f8", - "index": 1 - }, - "script": "473044022005e683086e7f53c1f15c8a4fb75b80ae69334533989367df77ada851f2cce98f0220070c5ae8e2770e8a0de035b6bd21747060d29863b68a21714f0d1cb7cc48dda5014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4ac6ecd6a4d988731b303e3e491de5f5c48ca1288a428b601492940524f76537", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297119, - "value": 480466710, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "4ac6ecd6a4d988731b303e3e491de5f5c48ca1288a428b601492940524f76537", - "index": 0 - }, - "script": "4930460221009f8a921c18dc00f3b71f87780e32b62ea8ca03000e71422395ceaa172574ca54022100977f77747b106c00b99cb8fdd2483a4e0af7a08c9078c8d962569eddd63acc9c014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "106a67fdc64fdca183905fa0af4cc97033309289fbe7ef8c67e4611adbd6e996", - "index": 4 - }, - "coin": { - "version": 1, - "height": 297143, - "value": 253123190, - "script": "76a914c408a189519929f46bc5d9c2d613e3e1daa8e13588ac", - "coinbase": false, - "hash": "106a67fdc64fdca183905fa0af4cc97033309289fbe7ef8c67e4611adbd6e996", - "index": 4 - }, - "script": "483045022100830b999f57f64d13373c0be66c3370c6c206d5079159a4060e1b55e6c719badb0220754457665588c208d91f7ca21ff45edbef6c5be3f61ddfa3f4cf56618c3a80010141048906101d3a76ae33b24064e6d5b7fc9fb8c4c8c0fc412598b2b5873950de62a4d747295ac7a927a653ef2144c7ab14368e7affe7938d23272d8e5994f402caf0", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f205105c650b4c08922977d29235d09bd1b7e16781c9fa161ac847d4549f665f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297408, - "value": 132740389, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "f205105c650b4c08922977d29235d09bd1b7e16781c9fa161ac847d4549f665f", - "index": 1 - }, - "script": "493046022100e337eae07f6386d9e638e4306c6da14ffb324b763ec062465f0871e6646d04f8022100b1416f092d633e9b0d2b2d6f1ac01d91ee6aca2e217ad1f6a351ba7ec616c8ed014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0ec707a6cb42853b6ec2cbfb267494ce7d69aa24a6f32416b010efe2c3832b50", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297514, - "value": 79315697, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "0ec707a6cb42853b6ec2cbfb267494ce7d69aa24a6f32416b010efe2c3832b50", - "index": 1 - }, - "script": "4730440220135f5e868d7ffe74a3c83a99054266f1044ed6f101d357554c90ac0c506a0dff0220635fff8688f2e09d6a54fe3f17f80cc5c2a3d7ca559114b1202b9df09afb51fb014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5fbe0f05d61bc0050b5b11a06d04a9483e016619b46a051bd202a00914d9c2e9", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297536, - "value": 84524184, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "5fbe0f05d61bc0050b5b11a06d04a9483e016619b46a051bd202a00914d9c2e9", - "index": 0 - }, - "script": "483045022100d3351d0311b6b5843e775d20311cae62aaf19b1e30969c3cc350d7949f1569e30220145283275958ff5a028ca26ec5c655f75617730650b80847b5f1faee3cbdc0d9014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "af322799adaf76d6c13fe32a33fee923ea6fa89f225661bafd57366d968df235", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297561, - "value": 227374223, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "af322799adaf76d6c13fe32a33fee923ea6fa89f225661bafd57366d968df235", - "index": 0 - }, - "script": "483045022100cd9b4c62a4f5cd6025c4afa9e37b6cb143b28066b403e6483f801a8b4528a0d602206546b1f071d07ac1aa52a3a46e74517fbc3f69c04c08ca2a66a0b409de79eeb1014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "500850a5d45e93d9adb1efa6401f9a23b2188c1c8d525d080e044faf9dff33f0", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297621, - "value": 2000000000, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "500850a5d45e93d9adb1efa6401f9a23b2188c1c8d525d080e044faf9dff33f0", - "index": 0 - }, - "script": "48304502207feacfc1fb3e631bdee404accaadf5c004303a553342d2eaf341416395a99cad022100a9e2008556d4291c4af88a629e03d18a74d441f71d9add70d72c967f59cd8a35014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "98435be4a87e081c52633a41f76c2536b8a9f649706def11f97ff69543a820eb", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297621, - "value": 1988291, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "98435be4a87e081c52633a41f76c2536b8a9f649706def11f97ff69543a820eb", - "index": 0 - }, - "script": "493046022100867f8c6786a111db8432f1c0c3e552da30422f6cb8eb21e625f4d3aabb1c4d90022100b139d80ebb0cc4875f43165bc1ada97248ae33ffe712bdcd260d15ef71af016d014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8ca8da04b6c67206ff328d7c0656a5ace682d1a29f787426f811f2dafcebb2c1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297702, - "value": 113527647, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "8ca8da04b6c67206ff328d7c0656a5ace682d1a29f787426f811f2dafcebb2c1", - "index": 1 - }, - "script": "493046022100e17942e70ee5ceb7e44d44399b4c2bc4c034dd98f03859644ede786fb53813d1022100801eeb0042a0461fdcadda094bae85448054c54781aa0b3574d28a40b29b9ca6014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6c4f61eb0d1da6dcdb9b6f34416e168948f005ccb80b7f0317c1852dc9a0485d", - "index": 3 - }, - "coin": { - "version": 1, - "height": 297904, - "value": 1223862610, - "script": "76a914fe83b18c951ca18d29e8c1cf1d15c8a24efc5a0c88ac", - "coinbase": false, - "hash": "6c4f61eb0d1da6dcdb9b6f34416e168948f005ccb80b7f0317c1852dc9a0485d", - "index": 3 - }, - "script": "493046022100924edde7979cfb7f6446ed27f14f660cd6eecda965da5e842312ef216a68ebe902210084652dce0048e0b2053dec0b96f8ede2eba093d82ae608e6de46660e1e46866501410415a474768b6f7fd59860f36234c7d951c8d3c966c1d7ae7e5e887cdc21cf46b7197e2282ed0261649853022e9486a4675a4bc2704858b74defeeb2cf7c1edc2c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3b97dc259f40d36fe135790e4d1a606d08ef6da76713a17093a605d812b4bdf1", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297907, - "value": 144747339, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "3b97dc259f40d36fe135790e4d1a606d08ef6da76713a17093a605d812b4bdf1", - "index": 1 - }, - "script": "48304502205e640b4d16890b8c77e1f5fdbd243670375185181d39174e1e70b31026e0d136022100e7630baed230f08e3ffe203c1d7a79abdc4e8a9d7d529a5ede40e13e9810ac9b014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "127b35543f0dd0ef24c967a2743724058bf82e7f50bf639f47c38f5385aee129", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298196, - "value": 567550428, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "127b35543f0dd0ef24c967a2743724058bf82e7f50bf639f47c38f5385aee129", - "index": 0 - }, - "script": "48304502204efbd81dd361538e98ea0495c2dca3b06377546dca7b323f36d73a8bcebe801202210085a658496d97baea2899af712fee9003f9f4f621a7fbd340d4ed894f43e3bf3a014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "192174ebe6cb74f8a00a03085c12a900f7d01f3f0cf0e936dad602f11724889e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298221, - "value": 206599189, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "192174ebe6cb74f8a00a03085c12a900f7d01f3f0cf0e936dad602f11724889e", - "index": 0 - }, - "script": "473044022052ebc675524ab5b059c9992532e44a38361596dda763d5a61beefbd930dc234202207f780f134e8b006bbe159c6acd81d7c90810cc8430b40d4c6f17c190a31a0a96014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a9f4fcc0d00e9c3a46d188f58e540c9ff3f6e5a3cc87e08a30ba93e0170ac362", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298432, - "value": 180866209, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "a9f4fcc0d00e9c3a46d188f58e540c9ff3f6e5a3cc87e08a30ba93e0170ac362", - "index": 1 - }, - "script": "47304402200e63c9a6f03dc753a65210aac47dfb224997d43dddc840fa6f715a5771832bfc02205ce72beb769fa3710a2c3eadcb9750ae89d0a5446f312f290bd367a3eed53f1d014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "62dbc4bcd3f6ee7f9696db298b2c3f8bd9f9358942d1c71d5f291a714c0e6348", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298550, - "value": 440871448, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "62dbc4bcd3f6ee7f9696db298b2c3f8bd9f9358942d1c71d5f291a714c0e6348", - "index": 1 - }, - "script": "4730440220786d770042c4058f15f00e6b7fa5077a09d6ffc507a183ea607db8b23265093b02200a8f1b08806095d4acb164477bdcebb2ae48cc2df99c3f02e5a7dda5bd7cce6a014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "344bfcb2ab34ba234574ba3c7d91c25e5e5fb1e29d4644b9dac96283cdf4930e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298713, - "value": 133612566, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "344bfcb2ab34ba234574ba3c7d91c25e5e5fb1e29d4644b9dac96283cdf4930e", - "index": 1 - }, - "script": "4730440220612aef10eb09988e8113cede7c67ca7b203f0129d02fa0c4d273e5690b022d010220786b87b480dac4670342ddd59ba72db9bdc58fcbc33d40873510169a41ccf919014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d13527eb7608f5056a6fb4a8312cb67f6588bf915b9a6dc58677a72f65384249", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298868, - "value": 382238619, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "d13527eb7608f5056a6fb4a8312cb67f6588bf915b9a6dc58677a72f65384249", - "index": 0 - }, - "script": "483045022046cbe0a6afb189e09264be9a16d3a3fc4df53e74ace325264b886a2da3877c5d022100aadd516bdc3e03e87fa42b37145f2ea5bced139248db11286f96a708a06b444c014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7c9c217440c05110cd8c403e7483b6c163869a50c8daabc27390452e09f69f8e", - "index": 7 - }, - "coin": { - "version": 1, - "height": 299114, - "value": 282187022, - "script": "76a91400ab32bb73b0aaeb7bf62d626333d977dc4d1e3e88ac", - "coinbase": false, - "hash": "7c9c217440c05110cd8c403e7483b6c163869a50c8daabc27390452e09f69f8e", - "index": 7 - }, - "script": "483045022021ec1e9f50d7adb599bbe3b71194635da18f5c48fe4f0fb2418f6cc935cf403d0221009c3726fbcfc7578a934c8d3e5e3dad358c0e8a9ecc109552f83de3143a5f76b70141047ca850cf141d31ae4d80ef85cf8a33d013c806e22d494c56901fda54db057c44210937a620fa6cbbedd8659ab097c8a08e49248d0f418c67d6dd615903fa90be", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9bc39ff51932917e6e8350eebd60cb960a41731c4c90778291935a1e4097869f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299198, - "value": 133539814, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "9bc39ff51932917e6e8350eebd60cb960a41731c4c90778291935a1e4097869f", - "index": 1 - }, - "script": "483045022033fdce892a0b0910dff678cc30f45e85dee0d885d8a876fbf1ab7dba0cd56536022100aab2e045f69100ec0f3632ca7f8058637c31235dbe566912d58cfb6455b0b029014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6d7137491a45f02fc0e08355dc61605cbfaf46eb9b11c18b17db3f6fafaf2ad2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299459, - "value": 93790747, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "6d7137491a45f02fc0e08355dc61605cbfaf46eb9b11c18b17db3f6fafaf2ad2", - "index": 0 - }, - "script": "483045022100e5a2cd807096958805c917bb1783c2e10761e5aa46f807806af16fd52a895051022044175e6008bd1643c51ae69f979562a44cf6c28987e12d4a3c3a7c16465540ca014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a1c5f3801000f4432a4d3f9bfa8a833faa8ecda5369088f0ad1c3cddec478e1b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299675, - "value": 178811909, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "a1c5f3801000f4432a4d3f9bfa8a833faa8ecda5369088f0ad1c3cddec478e1b", - "index": 1 - }, - "script": "493046022100a339f09def2eea5056fabfd11d146a39fd13a54e9247cf8fdf4f97622032cbdb022100ef16c4f383e0c8e72c7ff7369e9ece9a570d21e77ba4cea44da0289615f2629e014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7c6669598d2af96007b177adf2ed7133bea496eacf784a8750906dd485823a2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299759, - "value": 129951085, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "e7c6669598d2af96007b177adf2ed7133bea496eacf784a8750906dd485823a2", - "index": 0 - }, - "script": "48304502204a0aa430845261f512db34b70b7ffc25ad864b2b86d6dfac742a88f5ce95d581022100a99d16d0fe9457d64b643403ab6e0fda26364e4e8a5267ae7ec47a1953fee927014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e1ecb5f74c69877da47b1c599b25d96189b17e9c8eb8c21319086e6379fa544b", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299801, - "value": 112698103, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac", - "coinbase": false, - "hash": "e1ecb5f74c69877da47b1c599b25d96189b17e9c8eb8c21319086e6379fa544b", - "index": 0 - }, - "script": "4730440220111d6f96eabd7c424f63fcf34ba242ec278478c1602f3ce97af41ac6ffe2184e02206126a1bca5ebe4d75bc25158d719a2e220d214582d7e1829fd717c04c5577554014104baf317c6487dee87d0177633ae6e47dba9125906daa24af18882ed61d7dd929ee7a6a8ec873715a7de5595feb029ac3b06d319904ac884dcf05f22a86124437a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8000000000, - "script": "76a914fe2f60172dcc99dca17952be8f15d1bfed8df45488ac" - }, - { - "value": 47834860, - "script": "76a914ec9eff26684bded7a63cb910fdff6eed0cc1856288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "5469193cb638b67cd9702be924157ad669ac3e60a68fa65b033850919637e20f", - "witnessHash": "5469193cb638b67cd9702be924157ad669ac3e60a68fa65b033850919637e20f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 442, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "19c5eba84f2c1f0e4c5443fb30343817e7ec7bbef2a77fbc186ed2eab48ec124", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 1952633, - "script": "76a91449e319d40023bc23319a7ca433cd1f9b070e88d488ac", - "coinbase": false, - "hash": "19c5eba84f2c1f0e4c5443fb30343817e7ec7bbef2a77fbc186ed2eab48ec124", - "index": 0 - }, - "script": "483045022100cab011bdbf911f34a13bbd969481efa4a9e6ba33786eb65cb31379f904a441e002203980cf1f2619ff37fb683a76a2b572ce2e55b4d515780b1a50fd83f1c9442c43012103e31343e20c0e6a21a0a6d19b6808b11fde445af45822573e2d08f03e265bf1d1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "94a5241c4eeda717a58d557e456697419cfa77fed8cb9e507452d9229bfaab05", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 16141000, - "script": "76a914d4cb9399a4ccda525b78e2737809d4c107dfacd588ac", - "coinbase": false, - "hash": "94a5241c4eeda717a58d557e456697419cfa77fed8cb9e507452d9229bfaab05", - "index": 2 - }, - "script": "47304402202ba7636e0baf6085ab1bd82dd5bd78d8a9d06fe2c737391d09c5a242dd69294c022052102c1e0281d2baaddd3b82f267ad2b0138445ef223f2539785f91d7ac79b7f0121033bc82fcc24aa427c86dbcd6ce86753c918cb198ad9c140457e62d7f0855a3ad3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "49f5bad9af06bf2ecf6e27a9377576e38e6698d32af50c0540f14cb5e5f7220d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1399413, - "script": "76a914953c3a706df9cf0e3da14f161ca1e62be04f14d788ac", - "coinbase": false, - "hash": "49f5bad9af06bf2ecf6e27a9377576e38e6698d32af50c0540f14cb5e5f7220d", - "index": 1 - }, - "script": "47304402200de6cb3c1b4f4137de53f39422ec95927283807a5b64174bfffc4df9ae68a3bc02200fb98a84fc0cabe176cef4bfa7a52cbd20dc837c062cdeb90c04c60409d21257012103e2bf9ccf0e8dae6d92892ae2db08dc90f054fa94b72ffa1751e3b739e1610f53", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5aa0aeee8b0951a1712eefcc77cdbbd8db32fb9a057840f830af8e9da698400e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 306185, - "script": "76a914d52da0931bd2b3ecfbf60d49e68ee57bfa9a6f6888ac", - "coinbase": false, - "hash": "5aa0aeee8b0951a1712eefcc77cdbbd8db32fb9a057840f830af8e9da698400e", - "index": 0 - }, - "script": "47304402204fc6a9ba5dd12b0f7018f4c625d8b352592e5a6f5246853e2361a86b0dc7ff1002207f4caf5eb8c5cf2d9b063408d560032c7580fa03c1761f6ef6a7ae07befbb521012103f5e7ce1fc1d15991be0e78865de160dd6e4e2025e532bfa765923c7adb8a817a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cd9a44239739fa547a3c766aa92957451d1b68ba8f425486cd7e9c1207a0da18", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 15700000, - "script": "76a9140fb122964e215e057a644cadfe09843de43ba43a88ac", - "coinbase": false, - "hash": "cd9a44239739fa547a3c766aa92957451d1b68ba8f425486cd7e9c1207a0da18", - "index": 1 - }, - "script": "4730440220659598854bf50fdfde8e84dfd26da703e4134ebbc9820275bd7c81bac3ed358b02206a12ae1c0797c0b01e09f20bb81dd782dfba2dd5b38a8f4c6baa8bfdfd6f207c012102129c71374181619aa50989ec0795e04fe5e10ea75997dac099a6e758bd0c2045", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1233231, - "script": "76a9148e858fa524ab281dfcd08566217b8146101c534f88ac" - }, - { - "value": 30356000, - "script": "76a914d7294f993c327ccc7d308eddf212f777c84bc37388ac" - }, - { - "value": 400000, - "script": "76a914fbe6e9e96ef861f3f93c34848a4cb554c749310488ac" - }, - { - "value": 3500000, - "script": "76a914bf39bd8813c2c7c61ecc5ccd2dea11be552d880b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "witnessHash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 443, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11066481, - "script": "76a9143b1a2b8ceb576afe043a83c297b8aad873e69a6388ac", - "coinbase": false, - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 17 - }, - "script": "493046022100931f7e872c578a4b2a46a1d0ccd4e613892600cd8ac45260441871f327c3c9c2022100d21c95ec927bbfb1807db6f3a84fcf9c34b0fca96ad8eaa55ea63b52b39c7d7a012102f9c772e02ce3f025e7d9822d9e52b7558a1b286ee61ba69e575d307acdebd21a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 42154000, - "script": "76a9142e31b05444c40204279469c336b5fb9a4d2c5aff88ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 11 - }, - "script": "493046022100ca3dceb2cd4cf307f5b32633d383d7981a14ef140f32cb02c548293f710654d7022100ef9ef7a184c912f6367439c3a2c41bc5f04b5839918a6df885946351e7a7d02001410497a0cc9a79e2936acde45c42b046a70745e1b10b510d5cdb5f088be37f4e22cae3ee15567b65f12fa6c893bc2bf9d13305b5800307ec64e5789d53e2af3abf40", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11045589, - "script": "76a91483e2338bc9021bdfa6b17d3d426db3df897c78f988ac", - "coinbase": false, - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 9 - }, - "script": "48304502204aedff19a2e6151131b76993fdfe66ec1d490c197e7ad58fbf80de5f010c9193022100fa4e370854dbe8283b91ff639cae81b39c850651d205a8734ecb4be870301af60121035f716bdd6cce94526ccd86eaf8821ab3e6a6b856c06b056cd4e0e85a7f3ac150", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4137232, - "script": "76a91457b5ce3ee016834cb3d12de6241383d6be1ea53488ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 2 - }, - "script": "4830450221009ccbb0441ea1f45c02b8210468f90926f6e5b2467c6210f54aea1cb929b3c3fb0220461eff837596c5821a97a007428c553480b363ad6b99c95fcad8d5edbced14e40141044124b020350b947d32a8b4fc9d075078f5f79da8223ef051b31dd5925179b736768a0e8f098bcbda554f5f0d9ed40f4b77363f0fd4c78459f4267ae836277fcd", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11138925, - "script": "76a914e7dc89fa8f91c31ee4e6e3137367a76395268c8588ac", - "coinbase": false, - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 12 - }, - "script": "4730440220217b8db5f1da58657ddb3964cde70cdfbafd00c1b55ca5418778061515cb735702204f551e3e0bada339de78885aebc822875571f0561ef638416ecc9941f22f8a5f012103fe4240944ade9611163465d2b099e55f16dca23b731cce4352bd57037627c080", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 4590000, - "script": "76a914a03a8006661021677f9380110e41dec2e147b48588ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 8 - }, - "script": "4730440220081e5c5e4c224d0f7557c3dbfcded633ed32b6b5562d27f291a652d7cbdf047f022075bbe36e49206c5a5f2e28903d1fadbb8389fb1940f3c4f686285fe63cb36891014104874a6e75eb9c7ffd81238f8b4cfa097398c37f597cd8f593614a83296662163a9ab5a9eb88fc9eee57c014d7c78319753cbd36c93c414a6193eee1c9bfce6a1e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11087501, - "script": "76a914eda8a507f022ac4f1927f9c0b7d1f41324358cc188ac", - "coinbase": false, - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 15 - }, - "script": "483045022100e5d6a284ecd217f6402b4f1fdac0a6373cc77191e9625ab19ec575e5c87baad702203cdd600cb86a0f0bfb9faccd0d7d10a45c7f53f6dde41b30b1eeffe6a9e492660141046d31736ad711edc5aaf096144e283ca95e6e7c941c183fbdf109e4f6f4e6aaae4dff4ea9d072e2e6bc92f9ffad95da6f72f6b14289825520bc54e241accc4020", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 13594753, - "script": "76a9143a8bf4a40d03f3f9399d9ec413f189e66ad6a72b88ac", - "coinbase": false, - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 14 - }, - "script": "493046022100fade7562fb0a27700ad4d6e355ffb319aa5a67b3711833043f4abf23cb551cc5022100e68c0db0b94e01c42c8dbffb47b2cae9e69b8ce282f678a53862d9c6138b6a80014104c4b5ddaa591e76265bfb573269ce161db8c7e874e3fe54ac822c3058c35f275b489e6766093d4dbd26337697ffbc3c5965dd8113c0eeef0f0d2059430243039f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10961504, - "script": "76a914302ebe66f0bbb66855163dfcff6b1020cb43f67488ac", - "coinbase": false, - "hash": "889b49c8d4f45b5c623e9d6e617fd7b40a0e81805f644f1faf8b15a5b1424f9d", - "index": 10 - }, - "script": "4830450221009659784322797bbab9d42e06c12f44adb9c0d28b3bb1a100135cd0c3bab8f0ce022004be36d04698aa53ee267d6bc87fcd049c6a18a024533cd58f8c9b4ed004b6c90141049542be4dbd34b6b456bd34f27c900184293eee82dc98ad328b0e43f14a6c40532140a93972aff97a1ad13698314dac8b84b60b41a82528c6846b0bc98f8113f2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 13096840, - "script": "76a914dd73cc468f0801b3ce2fdbbb6f3b21ac1791c22f88ac", - "coinbase": false, - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 6 - }, - "script": "48304502205506d9d894f2ca2268477270fd822e337d7b158f920f94db48ac2e4cab8f34ab022100c4ac12657f93dd4ae07b3741f7bb443365fbf1baed40587cc58a4972ec086e9701410434972926229a3c80761979cd698529e3a52dcd78aedc53ec297d50f03a0eff063923b5e5d9bed5a80b34f71800cfc0447e6106a6aa4cdb551a9eb4cee1267a77", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4940000, - "script": "76a914352e65b9f2283b81121197fcc9c815279cebd54d88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 8 - }, - "script": "483045022100ded996ad710189d239581bb4b665c350bbba9c82a80d6ea43cbff8d9a065cce70220172e41cc3ade205c6cad89321962a2459a41f7c2b82db4726641e3e84172b4d801410456ecc7e89049e2394f1cf8eead146850bcf1d5ae3b4407d62e0bc3dd2bdc0bab1b762a674ee93d77bf1a17e5b623d2d5ba42016a4e46823b806aeb0c2b8c2c94", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 41661600, - "script": "76a9141d638c2449e194915683de830a42abcb4f08b9b088ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 2 - }, - "script": "473044022079eefab17d29ad56c3c79abda20b575f42a46401c799a194c9a21e94c33ce04e02201c93ed8780e0bd6e7bc13ee20803ba191fabe0ea99edd546cd622d8841344d750141041173757c715915636fb05f8d71083f6acae0d8436fc907313e4fc6440279063e82923d84b0d1227f076876e44a381108138021c7cc28da4fac777d280654a3c8", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11742000, - "script": "76a9142528e993f3a316f8778b616963ee9126a788834e88ac" - }, - { - "value": 11247910, - "script": "76a9140fcaf50be55c2c1c390ea5221434bdab127a2c0b88ac" - }, - { - "value": 11370000, - "script": "76a914eb91f720db4310ce927b44364bcf12f58de63a5988ac" - }, - { - "value": 11107167, - "script": "76a914335b8214f721a8aaa4c47515dfc833ba437986a088ac" - }, - { - "value": 11048000, - "script": "76a9146b7dd0802ed28d5468326dbbfff7f5c139073aa488ac" - }, - { - "value": 10360000, - "script": "76a9141fdbcd20a42abcaa788810d7126a92a14b1095a188ac" - }, - { - "value": 10323590, - "script": "76a91453713c196f325d0254813bdd56be57962ba11bd888ac" - }, - { - "value": 2186495, - "script": "76a914c01a9108e2aa45d2e3e2f28559a7cb62aaf3e91788ac" - }, - { - "value": 11501430, - "script": "76a9142c9b234bc44b6d4d8e6404fad46d2ea2a02bb0a688ac" - }, - { - "value": 10996051, - "script": "76a9149adfc78a4fca4549d8080bf54a98d874a161fb2488ac" - }, - { - "value": 11262000, - "script": "76a9144e926e2c60311b7babad34cb36cfa57aedf8835e88ac" - }, - { - "value": 11912836, - "script": "76a914543283e0b5fb2fa1779d82a64ced6200cbf8f65888ac" - }, - { - "value": 10649954, - "script": "76a914d2e17bd37919ed7a035ce27f987aab49ee750d0f88ac" - }, - { - "value": 11450000, - "script": "76a91477e19fd03a84753b781a444078bae53ef628cfce88ac" - }, - { - "value": 10583992, - "script": "76a914695e9c53d55152e7ff9253b3de6cac6398ba4f9888ac" - }, - { - "value": 10320000, - "script": "76a9147ebcc8a5e225c70931307e0e3fb4db3aa78868f688ac" - }, - { - "value": 11383000, - "script": "76a9143b58574b10dde8f5f66d5a9ace91616528c0c5ca88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "witnessHash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 444, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4984000, - "script": "76a914c748ea665d09abc0458ccda4f3dc4e88c24e8c5788ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 14 - }, - "script": "483045022100b7199a4788423250bc9d3f5a34e78f31abce38512e9ec9b27ab0ea23ebee26e802206da7ef1783213129750d50f5320f525d8302ce99f7fe99e765b1d4cc7aaed7c8014104182b11b84a02f26825c25b75e1a742fa1d532cd0d3531ff5dec88f135c36afd0508581e5ee1fd124394718740ac0bb5dc5b00a7a2d5c943ce31ab680ba8ec74a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 13907595, - "script": "76a914fc8f77547ba041fc81f6f4bf33748efd4745e0f388ac", - "coinbase": false, - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 0 - }, - "script": "493046022100872908aba07db2de96ac233333616dc2d763c2f8196f9e29c767a4775ffb9a3a02210081b4daece7dbe15da53722c48b2b68c1b61fa43f04ae003e0b729052a64b56b001210235af079cd997dabdfc1cf9ed9570b9fa99be3bb77d4b99e20926c8ce6d914e4b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f16b182df687ef2959714c4abcf3224db293aac8cf107bc7cd9a0c5e31a75974", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 13640086, - "script": "76a9148cb793e4ea2a2f1d19fb1b21f9e8982093abf33188ac", - "coinbase": false, - "hash": "f16b182df687ef2959714c4abcf3224db293aac8cf107bc7cd9a0c5e31a75974", - "index": 11 - }, - "script": "483045022100f111867944479defee8f7c50103ba21a4c03a40540629134f81eef4938ac28d302207785d67e063bbd9092ce9460ee5453896c76a6cc9e1fcee11cb404efbbf2fc87012103f4101662dfd294a711ee73f3f62e3d3f5a1eaeabee48680f975fa4652a87760d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11107167, - "script": "76a914335b8214f721a8aaa4c47515dfc833ba437986a088ac", - "coinbase": false, - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 3 - }, - "script": "4730440220284f0133c109b0700aace33665c252eb2823802140b2aa953484d5cbb7278d66022051e7ebe0162a80636b58ee8b80aaed596065817cea346c40648428f2f0e1ab6e01410401d76eedf174a47e79ffc58c359a622b18413a46307fb0dabed549ee78a081482438387b06fa85299a79fa890182efb2a71de586a758b1a23a960c3027c15b21", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10649954, - "script": "76a914d2e17bd37919ed7a035ce27f987aab49ee750d0f88ac", - "coinbase": false, - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 12 - }, - "script": "493046022100f9c01290c7676e4dc1af36a57d75153667517bb3a5713f6a88cc092119d86d1c022100945389b4d9d42b9a7bb896e4a5e8f09c75f186a1b73638a602d9074120a22e0f012103507abcd45ffda69b75a15511e38e79170412bc412a0374f76bfea39cb55a810f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10996051, - "script": "76a9149adfc78a4fca4549d8080bf54a98d874a161fb2488ac", - "coinbase": false, - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 9 - }, - "script": "483045022100e6f682ec88ee3e50b1300be9c9dce844dc25b904e94fad7d87f7f7987c612d2602203cadc753d0a017d6c22c304f4b35be78d0edd230688b08fdafda35e64391c21d014104cd2a0d22a3593aeb321b891211e973b4124d0fd72fc1908e75e540ae858b0df3826f76f3395ed910b90c7b4bc08bfe7e5e8f08b56a689137d6b9aa23feba2b3e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10583992, - "script": "76a914695e9c53d55152e7ff9253b3de6cac6398ba4f9888ac", - "coinbase": false, - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 14 - }, - "script": "483045022100ad2fd25a126339d640f86568c6879abe11205dcaa110752f611f8ed8b5339c78022057272f300e69ffe679d547214e1c31935b57a315e6912641ae63d09fb8d7c0e3014104400af9a3e117f0075a33be59d17efae728ec7f9c7b8498eb2489cdef787beebace94ab016fabf08151a16d3a826d2950e2552d1853e2bf97140b74c6b60d03b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11912836, - "script": "76a914543283e0b5fb2fa1779d82a64ced6200cbf8f65888ac", - "coinbase": false, - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 11 - }, - "script": "47304402206cc30d616c11805a6091e80c3eb0ab903ea513e02a3d39e65c447f7b5d6b613102207b45303feee723427d885d4463a4252070c44ce36eb4b33a8eaf8802127d80ec012103130a75409583720d1e13110128807f6392ef73efcf6b0666ba6aea0e9ce2ecef", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 41400000, - "script": "76a91412e3e9e7b78ea45fd801505e851ba8e4baf6cee088ac", - "coinbase": false, - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 2 - }, - "script": "47304402201fa4e07e485abcd4cc2587f26a652050dfb138a602c7d4e8863ff47a3bd57b8a02200f92c8994ba13969391844b37d076721d13851d3592c400221da97a4c57986500121030c582a034197cc5b3072cc08871bfcdaf3daeaacb628a98a1051b84442c813e4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 41556200, - "script": "76a914a6f77617c7717061dd7d0c4588ec69486ba5cb3488ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 7 - }, - "script": "47304402205ddbe24465887bdf67eb2b52a3b1653fdc34c015174f04045d97d450af21f13a02207102f92c6a3cc68bde4e27525a8d69728f91b89a97929b785a65197da1a016150141040b2c58f2d88f2e62aaf2c286d855890ca98c5ccdf8839c485ee199be70fe3271556ca28822f158013d4ada393b3b287bdfaef02c25c7104e258729e007a9dc97", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4950000, - "script": "76a9146df51cb8cf8272f91ffc18542b001144e57c275488ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 12 - }, - "script": "4930460221008c2d3674fb5c3c368ce2b9d5f01b9084962cfa8a62aad72ea0ac73105ef6da67022100ece5aa47d29c307aacc9ae4d6ba8b123c4d895e8dbbd6d67d39afd5c69aacd00014104e6d69d04b2ec43d99149096509de2727b20e8f375a5fb61b1baaed431208da88c7a5fd05760669facc5d6398e31012a0337dccc95615b5ef8c96b64a9dfbbf00", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 4984000, - "script": "76a9144cf9c3cfd24fcf0579039df4dfa9929b76a0a82988ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 1 - }, - "script": "493046022100a431fb01a3c09aec3a783e0eb3664f52acd149e429ff0b390b334d7d40fb013002210089d6c0af1b5f9af3ca5a127fa1d03bfe379205b7df3a161c224337c1d99d90340121023de42f4e88dde077249f5d90971e64d8b71bd03eaa78f6069f9aacea155bc011", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 11300000, - "script": "76a91413ddee46b4bcf2b95f811ee06274a3a18cd9f59b88ac" - }, - { - "value": 10600000, - "script": "76a914f2f9c64c2d4f699442e8d150cf83fb9bb40db59588ac" - }, - { - "value": 11413400, - "script": "76a914bed4064cb17295c9eea4c8027f15a38768552f9b88ac" - }, - { - "value": 10176700, - "script": "76a914cca05eca1c99d07b14d26d416d6924b3cd41c84988ac" - }, - { - "value": 11005223, - "script": "76a914987ce8d24d24b224b7a149be5047b4355aaadee888ac" - }, - { - "value": 90100, - "script": "76a9149d1e31b6a3aec46ed2b4f9259100b47fde80796688ac" - }, - { - "value": 10538000, - "script": "76a914ccb1af4d10e4ee89327e0a65cabf670f912857f788ac" - }, - { - "value": 11164447, - "script": "76a91463b15467b5895814bf63f7b9fd7261076b65aa7788ac" - }, - { - "value": 3336982, - "script": "76a9148c23a3da7806dd4a437bc81ca26ca4a02465075288ac" - }, - { - "value": 10950472, - "script": "76a9140b1e69789efc252fb4d0fa66b4faeb44199f800288ac" - }, - { - "value": 10692300, - "script": "76a914bab66bc8cb589aa583c1a4d38a1501248ed0465588ac" - }, - { - "value": 11252848, - "script": "76a9144e14c7cc91a10829a3a0f1ec46389fdc4936987d88ac" - }, - { - "value": 11800000, - "script": "76a91474e2031838cf0f1e8d2c424cd7b08bfa0d9d8e2688ac" - }, - { - "value": 10965800, - "script": "76a914cadb9b27dc46f7ab14f00123c2082a61e5177e0388ac" - }, - { - "value": 11902000, - "script": "76a914b0a30758078ddd645a83fa98fb065781937e61c088ac" - }, - { - "value": 11100000, - "script": "76a914ff55c43493ad03e521b688cd2ace638662ed1ffb88ac" - }, - { - "value": 10827010, - "script": "76a914a0ce43fa069b51e5a90e2664134b3e2d1c6c649188ac" - }, - { - "value": 11526599, - "script": "76a914f9f101307d188013a3533e3eda15e4188909a94288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "witnessHash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 445, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11005223, - "script": "76a914987ce8d24d24b224b7a149be5047b4355aaadee888ac", - "coinbase": false, - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 4 - }, - "script": "47304402207c926e8a7f84b6dca347b22903e175c8f041f006fd5a5eb76a96c4958786bb1602203bd2991d0d5eab251414a19163818dfb6b252bcb47f7fa1dfb3d6d6ee10171e5012102fcd89fc4526c3d940b058b08da66c1e88f3036d37be3711340295f248390306f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ecad6874192f21c68e36e3092e9c6da40ddbd95f7af8be2fc8a0bfdb100cb365", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300002, - "value": 13868000, - "script": "76a914b7f4d959a3d62bb0639e02609932fd0b65d56cef88ac", - "coinbase": false, - "hash": "ecad6874192f21c68e36e3092e9c6da40ddbd95f7af8be2fc8a0bfdb100cb365", - "index": 16 - }, - "script": "4730440220157fec8d0c832855cc93414d9165475a652f3e2d9b52fab38141c197691cdb5602204e240f34b64e151f826eb030be4c62884717d8e3fbd6db8a280bce2aacd61b25014104a0163ebd641ca9e7c34d40157e77fa30206cbed0ace3c039e0c852166054db2487a0f7852ec2e27772086325afb027452c15aa377959626370932e8a67118a9e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 41326000, - "script": "76a914db5780163c8e2a9cb720189bd41cd6ef038def8888ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 9 - }, - "script": "493046022100e6295cdf4c2b57f600b0e6147d07c19ed4aeaf6739a8f8c1b866718a7ea005dd022100c09c9189249e506dd0d0a106e32c61198b2200e9a9b8567bafbea700a569c0ae014104b6c85e364195e74ab5c899257d457eb461a062faa94113785bf0402c57ca529f1d338f014072b87e0c9d4ace4e8a8aeb3e811f7325a6f42efa8f37ba98e955c1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 2186495, - "script": "76a914c01a9108e2aa45d2e3e2f28559a7cb62aaf3e91788ac", - "coinbase": false, - "hash": "8f098c0d832c9962be3d517c751cb402a17ae437a8d23837c86c67cd1fd47e78", - "index": 7 - }, - "script": "48304502205d33557680c69c81841d1c6d5985323e461d1fa2aef3e391b76db40010d067d4022100abf2390d5682f099dc81215c2a1b98c127ac04935392eb9f1f3396928ab66af801210339f8234c446a163ec7763e27bead23434e68f9bf94705118bd44e17bd1d41f53", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11252848, - "script": "76a9144e14c7cc91a10829a3a0f1ec46389fdc4936987d88ac", - "coinbase": false, - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 11 - }, - "script": "473044022043aa02aa393aec472ceff91c97b74b93ffb7c08f136e405720b03bc89ed0e614022065e9d9e074ab645cc1f50391efb3e469ecd209f833ac1d4f4748c6d05124178201210307aa9d4302f13d320930085f300ab061018360e7437c011099278b79ff5eda95", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 41290000, - "script": "76a914c61d0ab218ad821dd41452dab5f799fe46f37d1888ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 12 - }, - "script": "493046022100ab7a71d9210748d8e2dab41497df22b3779fadf55c5065f4a7c0b0a598aa6a13022100e5716f4e6b16197e437ad198d6a05183985a1f9c1a8d6e644fb1191cfe1169430141041c98c19561ffeb1365af963eb17fe49b525b565aefc4a9045fa3da6b8c07f28c33ca8cb9fdc6a16aab4603475fa803538d4b3c25e16037a2f00c6c79a1fc1c4c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10827010, - "script": "76a914a0ce43fa069b51e5a90e2664134b3e2d1c6c649188ac", - "coinbase": false, - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 16 - }, - "script": "493046022100b0566ded93c6de6114cc838709765d6f5f4454d5894daa6159886ff94c9d53af02210091800fd7059e684ed78d93d131a48acaef34050f855a5d755736c1833dd50d0c01410422d40f4016b67b2e15e31a609052e5bdbe29563d06d8f39b6b6702a66d3d42dd921443def8277ef9704b6f651caef237d41b33e6c99e374a98c791a21c44ac4e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7f1ba2c5711674ce416a129fa95690cdccefa83b0c925a991369a6b9427ddc4f", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300012, - "value": 13860000, - "script": "76a914fd55e1eb749e6b74f3942ea2a8b5a3a588b7c7b588ac", - "coinbase": false, - "hash": "7f1ba2c5711674ce416a129fa95690cdccefa83b0c925a991369a6b9427ddc4f", - "index": 16 - }, - "script": "493046022100e5edf6373f032fa8be20b57259861ee937bd323aed314b585d41217b14937fb6022100bf979cc8acd3995e034d6a54e15a0f2a360645fb1c1e250e49aa9ad450d293ef014104c4e0f161838e2d9ca478ea36d9a6f7b018d0c9cb6673c04176222ef29985fd79a0948218fb48624851cf07e9771eacb8098846fffb1b302fe1687cc268bc59ab", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 11164447, - "script": "76a91463b15467b5895814bf63f7b9fd7261076b65aa7788ac", - "coinbase": false, - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 7 - }, - "script": "483045022054c7910756294ec7e210a1796a0191d4aadd156fd263603534998a0a48446eae022100f2ccad86c9ab08464e4d408680390902c12ad1e3c5f8b7ad635b5b5e8858dc83012103576d5906a699a780d6903bb016bb87b68665f617b08ba19c46f7cb3cb0212117", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 10950472, - "script": "76a9140b1e69789efc252fb4d0fa66b4faeb44199f800288ac", - "coinbase": false, - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 9 - }, - "script": "483045022100c26b23abab52e1de04ef8fdac547bea102f0b5cabbf3dee86a5a13bb914e2e4402207ce4bf9ae822e9cf1d7a7d5b8ab7bf56ce0235f27015d815bdcb3ae214bc9f42014104c07e639a7fe100709ab8f57057b39ae51019d881a0cf8e177d359983ea95abfbe003eb3edd592e1652bba985eb8c8f46a5e5366f3878c75b9a3f6b7e93c8727b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5000000, - "script": "76a914154056509f0cb2d4a480edac491483d2f8f9955f88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 8 - }, - "script": "493046022100fa32a1157ffd8b5748592f50322c0084a3b35df8e850c33d8d445beaefd03bb2022100f29c93f5a4e1518d9886593b5ecaba8b285acde41b5b526c08a7a28f8219b262012103050c1367bd9737759282f535d676a762b9886343c5a8a8bc507f4fb5907216d2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 9240000, - "script": "76a914f3709e949a9d90d35a0ec0f2c17519222315540188ac" - }, - { - "value": 9791100, - "script": "76a91482ba4613650072066806f20bd778a2be9e1651bc88ac" - }, - { - "value": 9171951, - "script": "76a91444018b878f943f929145e68a5a1a81179051746f88ac" - }, - { - "value": 9231980, - "script": "76a91450aee718d49f5c7769c7011479429cc12321e9bb88ac" - }, - { - "value": 9410690, - "script": "76a91416b431a6c0525108cb1a74418248f5c92a74d2f688ac" - }, - { - "value": 9127860, - "script": "76a91471f62a84095c921f4358116090c15cada2f50f1f88ac" - }, - { - "value": 8997430, - "script": "76a914088d7e5a8dc4a1e2e6153ee78f7132ad2809e25c88ac" - }, - { - "value": 9994160, - "script": "76a914ba2c74225a64543ad5b38a5d6bb9a5f5d0a6f39b88ac" - }, - { - "value": 8523400, - "script": "76a91496df68af3b1059d714db12f01bec6d5b095e42e888ac" - }, - { - "value": 9067000, - "script": "76a914865045448678e894f531f206584cfe448dd60aba88ac" - }, - { - "value": 9250000, - "script": "76a914b0ee1dce75a0ccc447fdd79ea1e246d028a382d588ac" - }, - { - "value": 8930000, - "script": "76a9144a87585fe7c40ede87f48900e9c7392b4740ec6088ac" - }, - { - "value": 8890000, - "script": "76a914aac08dc7e30698aedcaaab4715a66c032932717788ac" - }, - { - "value": 9255380, - "script": "76a914a342c86970e8160e6e84b0f09787d52f574b64d588ac" - }, - { - "value": 9076000, - "script": "76a9140fb9077d86f2e6630246c2dfddf14535357b1afa88ac" - }, - { - "value": 9153913, - "script": "76a914b67f88969fe211ae6f03a451e709bc87b7a4735b88ac" - }, - { - "value": 7252855, - "script": "76a914f357f92129da30e443768d62a656833bb06e094d88ac" - }, - { - "value": 9193908, - "script": "76a914b9897b95d0e1cd6656eca2cbaee41d55a12c1a2388ac" - }, - { - "value": 9142868, - "script": "76a9149834818c850a84b0767b00a796ef97c5f837d6c188ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "witnessHash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 446, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9142868, - "script": "76a9149834818c850a84b0767b00a796ef97c5f837d6c188ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 18 - }, - "script": "483045022100b9d2a0532a3e6f4e634b554cdc2fe4dd2d48a9b295f7e3a2d9e8d16dbdaa4b8402203c3678de439ba3935456fca620278de744baa17ddc422896ffe3fb20bbede5ca0121039dc0b578f9adc3d94660f7dee5f32e8f963473e35e271bde55d2deb82079b606", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5100000, - "script": "76a91489bb8198fecbfc5e699ee2bc4bdec4cd682aade488ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 6 - }, - "script": "47304402207c7b9dcb98257a0e9217ba1110a0df04eb3ec1878576a8bf7e94274e746f628502203e83cb32baf71ab02c6f518e84ff80f6ada30f3f204a7e2f65a311a37d0f973a0121027b75818bb8d7488a13816baccbb5ab42c562c81850642a36b4373575daff6119", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 14111258, - "script": "76a91474e2031838cf0f1e8d2c424cd7b08bfa0d9d8e2688ac", - "coinbase": false, - "hash": "90a266057fd7dccc07743c7f062715ea1a7839ddda0e496399e6996c100386c2", - "index": 7 - }, - "script": "493046022100a28fba91858ad80395c8edd69efab8e1b41ef95c3af05567ea17a59dcf962295022100a3bbff9ba62ba5e45d939f5c0f31ee8beea2563e2e89f92e50897ba1ae68da5c0141040ab627c66e2a184e76f860eb189ebfc49fa6d702793b5ea8aa5cb112aa667fcfd5292e2c8beac46ebc7d0f254566e3d4d9902a35e3d25bf06e57772511b815b5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f53ffd94d3af40b157d7cba42586da91eedf7af74f7f47c7fc73516741df5645", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 14279022, - "script": "76a914a2f8c483f22b7aac2e0ca0ce0c2938618b3007ed88ac", - "coinbase": false, - "hash": "f53ffd94d3af40b157d7cba42586da91eedf7af74f7f47c7fc73516741df5645", - "index": 17 - }, - "script": "483045022100b31eb372d8a3f1d087d4ffd75f282a602c20028f2df6805c2a23d60df8106b6302207831994d098d5a1e2360a5385b650395576276da2cf2771cfb73e0c133f3c46f01410472044d8729a85bdd7723b854d8e8b97da471aceed47d39cc88e0e72d7989500d9190ef16aeb2d69c53d4f0d25476994990597038c079d3520716490059a3b6eb", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "65a4b5733d9371c4778feb5c3b0ba2e93820a2c4d833371f503a01d47c2b2e60", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 14021920, - "script": "76a9149e325dcf525d92c981f86a5dd8e11a04b7dd9a7488ac", - "coinbase": false, - "hash": "65a4b5733d9371c4778feb5c3b0ba2e93820a2c4d833371f503a01d47c2b2e60", - "index": 5 - }, - "script": "4730440220558cfdde2a79da0e867359576fe3dff57a57495c1c53398b1eedd9db7b9aab7f02207a507d562be9331b3e8441075072f8bc98565604f719a337901280d0590af0250141040be6890c1bdefdadc459e0a03d7c7246e52a6562cb3aa967498ee419e84cd74be9eca8f2810236e6ea64ef782c5e50f131777514495a1a5c0fd222dbdcce700e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5000000, - "script": "76a914a1c9df47a9f8c8617769fadceb288e93f9af4d7c88ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 17 - }, - "script": "493046022100cb5341c8a731fa907b16f5dffba1b683101b16c5545a0637b0009aeb7b94b5f8022100eff4fc9c7483ea1782e1d51755ebacbeed26eef1aec78a85396f4dc20690974e0121036351f2841d7646b8a976d5ef91d4f8d0961aee618588c0edd1b016ad190fe153", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9171951, - "script": "76a91444018b878f943f929145e68a5a1a81179051746f88ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 2 - }, - "script": "473044022061a715671c0a5dc3989d0d32611f0bda31456ff83f90258853961919545ff9a80220420bc2a6e350784727af4f90c7119215e4721d849a2045674ab2cc18b34ef3b9014104c78fe617c70177bec368eed1cc9cd54ea49833105decd779a8a4f077fd06d2190a816a94f39fb8d4c63001eaf8d1a8c6d1dd743737a9f1ea09a931f699c1d2d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 40840000, - "script": "76a91438156e1a70e0f56410a417c7f5cc0a4173624b1f88ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 17 - }, - "script": "493046022100a4cd41723cc4fb7fd9bcd337daa15448e4cd4ca514ee15186d82d4c7328252e7022100ab3cb54b11dcbc8b313758ac2a06159f2192d0063357a6bcd23e2cfac0dd58e7014104dd4390638c38928d9c5e36c033977e8f94441bf6e693355ce65b318825a803e457b7e6ab0cf0bae17256c9f5119bbab3b091f2a95c9d62f6d9a95703fbcfa10e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9231980, - "script": "76a91450aee718d49f5c7769c7011479429cc12321e9bb88ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 3 - }, - "script": "493046022100af2c59bef6b876b6eabcd9bcb0e3de64589d14ad54d7569b411cb05bd82cea16022100fd884a458a57a44a8e8c94aeebe4f5d7b054754543a8bed1f5603ae9543c0794014104349acac8ab96a8b43f3abe2c7f9127206a684fd7bee9349fddce53b1496631dd1231a691f314eda831667426f92cd0503dac4d6f4a78e486a95507efb1e7a869", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3336982, - "script": "76a9148c23a3da7806dd4a437bc81ca26ca4a02465075288ac", - "coinbase": false, - "hash": "4b26ab370dc47618bd5de04592364a20f97c30ad119c1e00ccd4fc3058692997", - "index": 8 - }, - "script": "473044022071f5f8eeb907e8f1c02c72d5f08be3bce1f8f9a435bb7f23426ebeab102d372102203081f9e996f1344fdbc4fa08fc35e56eed3ee59369d34302b3985932a88f1fa8012102a0354bf72be83d6b1377a9989da3f211fbb65034b366da6239af22d867036aae", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9153913, - "script": "76a914b67f88969fe211ae6f03a451e709bc87b7a4735b88ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 15 - }, - "script": "4830450220592a22e5d2384b51944aa67d1f46aafc8081b1b55323692336f2d354d66adacf022100ed2dba156498b1943186849588707c62b8568b7a267f805285c30eaf0ee9fc3e01210389cd790818fe36634783279c583b4223db5cf8b1995763e0013513aec4e193b3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 40800000, - "script": "76a914bc12c4f9fa9d9309153c9d0fec8eb7f0718ab7a988ac", - "coinbase": false, - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 4 - }, - "script": "47304402207a8a587e200f5196cf7c548076bc488354b5cf25658bb965e0705e7d71f1dd4f0220454057e27e09fe8222599f1685d2c0c512ee9b9d65f2d87d9f023b98ccdb3d23014104b4db8e4c3bb0fd22bafd3c42084a72ccea2fbd9fc07766d9b9362f5c8f6a7381587453ae7c39f31f8c03e938833408e04c06bae0a4f1e18fe4fb0891ca3122ca", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5003000, - "script": "76a914c7de75c1221526b1c662e0d71d6670e38bce7e5c88ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 2 - }, - "script": "483045022023b705a9f1716420640288f6300ba97aa9953e373b7c9358e3a5502f0d7a2ef7022100f28812e78c7a6afc922b9066bca0352f199e31e29f83f742174e87ece8a2998a012103f06a0b01f91b90feccfd3b9b5790ae99cf5b78f75e776d4c706b785580fca4f6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9193908, - "script": "76a914b9897b95d0e1cd6656eca2cbaee41d55a12c1a2388ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 17 - }, - "script": "493046022100ad8633a7cf10b37cdc2255fbda588a908bd8ab7595861afdcf18c4917fcd4f73022100975c7b141bb0aa5578b7ad5347e03666908f49a7b9bf399344c08752f6caace1012102929909af3ab9df5ecb511fe37494ef9680dfa9db63662c23bf39e07fa41a81ac", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9255380, - "script": "76a914a342c86970e8160e6e84b0f09787d52f574b64d588ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 13 - }, - "script": "47304402207e6b86c0ac17944805d0249c364bca739f4f1b6110c1a6459ed7edd5cf5f7108022059d1504d09d7a969a8276df2a3e48b9544b2df32bcc6cf9487bd22090a8f4949012102b9501afcf53eb09c26e09621e1b4a413684f7d725ceba9696705cbd777536fa5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5f915b3fd8036ee5059ede534d2cde7204dfccb18f1b488a908ed4353fafb130", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 41135917, - "script": "76a914fe2e508a59d736b8eb2e5d338c88e96d6ed939b088ac", - "coinbase": false, - "hash": "5f915b3fd8036ee5059ede534d2cde7204dfccb18f1b488a908ed4353fafb130", - "index": 15 - }, - "script": "483045022100bd59059176df9457370d51717b4dd6823cb2e7f33a545f21ffa7be713f4ef359022015cd243c100619bae6f13dbd025180e1023eb703e99cdfde88f659381cd8f9f3014104cc8f5e25ffaf5ab571d297997de2348340b3ed1ab1534fd0a3f92afa9ef3d864a717fb71662e7d50dc6ba3c99cd595237c515dfb83887386039423e6178b54bd", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 23 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5003000, - "script": "76a914dfaeeb10bfe54179367391c91fed2b92a7c0fa1388ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 23 - }, - "script": "483045022100e959ec51358573d6f54a6d5ac8b93dc6b1c8a5c1cce5965af585be04247d999102207e2572950af3902a774f5bc0b8ad9c2d5f7efeded81f1da509c25c0ea19b9a1c0141044f4c29c1d050293aa3be036b29d44bf7904bca2567b7317fb5ce0671c0b8d858c12091be465d6936af99010e356b73e2fc377bd46654e0d916f5d317a4c29376", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 50000, - "script": "76a9149f3fb46a0aff32eabcb048978b5709322c4de86d88ac" - }, - { - "value": 13100000, - "script": "76a9145c7a50fd6d68e2a1bdf5e7741ed5bacbec7a94f188ac" - }, - { - "value": 15445340, - "script": "76a91474dc5669d3ca627caa70ec3c7fdf90bbed09718488ac" - }, - { - "value": 81000, - "script": "76a9147751f8011c608a469b6073b8d334fae43f58c7ae88ac" - }, - { - "value": 13600000, - "script": "76a91405064b62643ce6b69308e0fc6a985b4ff16d614f88ac" - }, - { - "value": 14370000, - "script": "76a914ed438c1cfd3e457d4cbdaa31a50dbbb23c814b6c88ac" - }, - { - "value": 14512000, - "script": "76a9142c1f172e0fc1eb108567ba191f1092620175085c88ac" - }, - { - "value": 14900000, - "script": "76a914c45a7bb9d8b8d7d9f3a92e76b94587ee7f3e233d88ac" - }, - { - "value": 30000, - "script": "76a914e6fc4e86f57e647a56b07df9d4ff88439fd7acd588ac" - }, - { - "value": 13864957, - "script": "76a914017dd1b98e8a876d34eff2dc3a6b64603536dcdb88ac" - }, - { - "value": 13380000, - "script": "76a914c16ee8c980a5187e154a2ed52f579aa90607516a88ac" - }, - { - "value": 14400000, - "script": "76a914795344923e800f11872017025a5248d240e3474788ac" - }, - { - "value": 13200000, - "script": "76a914203d6a31fedb2b8857b991523253c9ad4a22af9b88ac" - }, - { - "value": 13871845, - "script": "76a9143c5e962566d5e9d427cff5575560822cc3e79d0d88ac" - }, - { - "value": 12400000, - "script": "76a914c0c2dd09b3622601243c04edd89b03120acc587c88ac" - }, - { - "value": 7835759, - "script": "76a9146ebe530bfa83507b0be8c4d48c5cf49d427290cd88ac" - }, - { - "value": 14850000, - "script": "76a914e9b21ed16619283fc1662260cf6de48e3b00426d88ac" - }, - { - "value": 13480000, - "script": "76a9141cad003bbdbe0e8062bebdf6db1cfd9ac6cda66088ac" - }, - { - "value": 14815770, - "script": "76a9145e9c715abe183b5c1f6fe662a4b497499eb6f50188ac" - }, - { - "value": 13007000, - "script": "76a9143d3614b8b7bfbdafdefa7bc5476ebb4f9b71c72488ac" - }, - { - "value": 12547428, - "script": "76a9146a8d6f45d93bff9cfe1ddcb4008ac79e669f67b888ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "witnessHash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 447, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 40600000, - "script": "76a9144cc1f278d7d6a5492d48a2284fe1ad63f8cc0cd888ac", - "coinbase": false, - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 3 - }, - "script": "48304502204ffcb22ca34260585be03a2450739251739000ee4c5db6d169db0146e08e708a022100e8321d94baac214a334c24991f21ec5c65ca4237f11fa5af23fe8e22b35b2d5701210379d390cc5d9329dd10807279e6efb9afc2e82da5a8ea813d71cb97726593cca9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "19b1655392af1094d2df86d0d50c06449dfe4d1f2debbf05245ca769ded8ea0d", - "index": 20 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 14504000, - "script": "76a9146935a2ce5535669dc641cffd0cbab522a272f1c388ac", - "coinbase": false, - "hash": "19b1655392af1094d2df86d0d50c06449dfe4d1f2debbf05245ca769ded8ea0d", - "index": 20 - }, - "script": "473044022054aac19c360a6d7386c2471bdb2cb38d74f0f4eb7521a5644476d548a77e3a630220663eaa24a5fdae6eaa3123a05fb1bf8a236a6f02d6ece1c0efd25523252ecfac01410407ad45dedfda2b2574e5bde2a824f82e10093a77a14324ea48d7d11a3a37fb7621d127a0eecaea576bd72f3293118ccd092a24cc952f6d2d449e350bbc7e18a8", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 14815770, - "script": "76a9145e9c715abe183b5c1f6fe662a4b497499eb6f50188ac", - "coinbase": false, - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 18 - }, - "script": "493046022100b915ed92d5af93e71445efabcd4b17a21c51afe0fbac12989897176134a8d777022100d06632e5b2c98618063e47eea640f490d6841ea188d383559449ad450a5f867201410432503bfade5b2708c3bab06560167a4d164fcc984576beea2ce6d978e40fec39a369e9e1b16ab75aafc6639f3c2b587493b43d44f5bed1743d78a0b1d6ac312c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 13871845, - "script": "76a9143c5e962566d5e9d427cff5575560822cc3e79d0d88ac", - "coinbase": false, - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 13 - }, - "script": "473044022009e4da767dc9743a1981d93a30cc47ab15c90fec4a1963b58ab08bc9d353195d02204c6d573a3ccec947f3b1b90918e5d89dcfabbfd69a45f4bbccebdc47ff956fe50141049fa65b02c5b1eb83018e15d5a6f6b681f80ebd930260c7b7b0f0d54728a8a550dce127c1920c5861786973d3daad5c12914de69436b8b40db8319c4c9f787410", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 21 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5100000, - "script": "76a914a89794738f3e896b74aa197f21ba681436263a5988ac", - "coinbase": false, - "hash": "77b1b5ea8f9511e1ce40efb59d7d1f8a86c6b0615b8c138e284fb3c85bdf70ac", - "index": 21 - }, - "script": "483045022054462022b02a3e0ebead53e121869d9ec326041b08f5d489b36a8be147deafa9022100eb0dfaf1225ab8734b14ed0f332ba994c1831da2c41255438e5620f59540ff5b01210337925f5ed77284a7b66651d4aeaad3b5fd286084ef5d3ceabcb71fbb9c718a6e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 20 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 12547428, - "script": "76a9146a8d6f45d93bff9cfe1ddcb4008ac79e669f67b888ac", - "coinbase": false, - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 20 - }, - "script": "48304502201b696f1e4e01a54d0243709f60f5532126eebee247a55dc9e4a4c1158d361374022100ac01ce18ff489bc8739ac204c267fa2da5952b0388970686fd1aefdb78ba1e670121024bab8603999541d8584131eb32114c8cf4f421f59b40d0d6eca964e3be17a1bd", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 5165860, - "script": "76a914fa3ee28d80d7695195dda8c31ccefc69562fe67588ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 7 - }, - "script": "483045022100de84a803dcff97ac02fb24ac757c37acba9665070ca8bb0fd7e7da232e9f7799022052b0ea84db2011a9be0f3c1a80df9c860fb77bbaca0d5f16087ed7e789c2319301210342bb966f104b2aaf979647d4c56545a0c48800c242c5dce98e2d634f8b8834e6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 13864957, - "script": "76a914017dd1b98e8a876d34eff2dc3a6b64603536dcdb88ac", - "coinbase": false, - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 9 - }, - "script": "483045022100b9811a3e5c210f1740d6739ff7b726e67432a7b7460fb01bcfa2568936e6f04102207d76da67a47e57b6b2db82fcaa0eb6b202b6a6360873deafef92eb46829142a70141048278864edde81ad6b1a881f2240c4b229cec1d2448c907a842442078ffc18a94c5b39fdc9eef6db5c51a44f6e11e16ec4b42e6becbdc75a81d4cafca80a6a076", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "19b1655392af1094d2df86d0d50c06449dfe4d1f2debbf05245ca769ded8ea0d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 14499000, - "script": "76a91438f3d5ab4c78f77c4ea4a06ac74d1b8d8430572688ac", - "coinbase": false, - "hash": "19b1655392af1094d2df86d0d50c06449dfe4d1f2debbf05245ca769ded8ea0d", - "index": 1 - }, - "script": "48304502204654bf51dd576a7a95889693c98fcc91449e5d6945cd9e63ccef1c78b6b7b12a0221008b7cf76423affe9fd369b2239da3ab2f4368aaf8acd59c5b3399382d1dcd897e012103c8adcf7c8cbc2841428625551aba0dcfd3fdbe45710fd477017b7efde7d0aeca", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 40750000, - "script": "76a9146450c354a46a2ce8d518363122bf6ecc62e378f288ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 10 - }, - "script": "4830450221009ec3f4b1e1f5a58ec766ac3436766164a10ba28370498b550d60da88b536f7c502204bad59c1a4d4070639f0af0ec11df7b87f60e5a4eff726efc372376b3c6de1fb01210333ad103cb6f1b78204f95ef314b6ec9395a10f01d45068156999f2e980af722c", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8891670, - "script": "76a91473f9526707d3d4ca945e28a9dff924e79050b1cf88ac" - }, - { - "value": 9050000, - "script": "76a91465429e5f47fcd947b2a72799fe36b06d299fe27c88ac" - }, - { - "value": 9063335, - "script": "76a914a05164bd2f5df2aa83e41819ed072e72b1b94fd588ac" - }, - { - "value": 9338070, - "script": "76a91460649d2f4bccf38f5c2e9e5fa3708a17b095696988ac" - }, - { - "value": 9039700, - "script": "76a91496ec1e063893a8993e1a5f03066de21c8d6ea0d788ac" - }, - { - "value": 1022530, - "script": "76a914e0d1a909b8741db823b36236f83b53589641fada88ac" - }, - { - "value": 10090000, - "script": "76a914e72fe516dd087a8fee406f9207abb3070255919d88ac" - }, - { - "value": 8999540, - "script": "76a914c6436930f538461b6225da8b174339b3d21b44e788ac" - }, - { - "value": 9504270, - "script": "76a9145ccb8f23363ec2cc7f892fe1a3d43fe9f926bb1e88ac" - }, - { - "value": 8610000, - "script": "76a914848051d8c354909f2391cbbbfb82e9342188e2b288ac" - }, - { - "value": 8920000, - "script": "76a914e23ce96401f5583571dfaac21488cf4770cb999c88ac" - }, - { - "value": 8940000, - "script": "76a91405792d55332be831f93b91428a0986972ba41a6188ac" - }, - { - "value": 9890000, - "script": "76a9140c3d9773ab3d024fc97dd247ac0bee555370dabd88ac" - }, - { - "value": 9281000, - "script": "76a914326c19764d1cf7322f9af51bd23502bff9835d6588ac" - }, - { - "value": 5810, - "script": "76a914fd331db6e477d3b991f8114b560279a62270a63188ac" - }, - { - "value": 9300000, - "script": "76a91408ff0b6a8ab9391256a46dccdd22b5442f8ef2f888ac" - }, - { - "value": 9129126, - "script": "76a9141c79fafc028816155202071ee7a1bf8ddeee26b388ac" - }, - { - "value": 8755810, - "script": "76a914ded117e600c9ed41be1637125b45a7bf4918818488ac" - }, - { - "value": 9351006, - "script": "76a9147640f3905ea1817785b1a6eec4bf3bbaf361a1a188ac" - }, - { - "value": 9291016, - "script": "76a9145cdf16cc24f9fa1349663e7a244369414953afa388ac" - }, - { - "value": 9215977, - "script": "76a914b75a9972bac8e918ecff20835a07e613bafa180b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "810bf5b04f992908f43e29548f9c44f568d673854b63ef3aa474f29550474c3e", - "witnessHash": "810bf5b04f992908f43e29548f9c44f568d673854b63ef3aa474f29550474c3e", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 448, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9351006, - "script": "76a9147640f3905ea1817785b1a6eec4bf3bbaf361a1a188ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 18 - }, - "script": "483045022100e05bd60babccf49a47a6cb1e52b57e020272ad873c5f3958d14edf6de7bc4fdd02206c978e4470ca0c0cac68f0feb4f993d6d66ca0bba811a11caa6be8c26d9298fd0141049f9e1dfd55d4c8d5b0168bc1bd37ad0254a75b502afea56e4d3d09c654dfffa877921a4acea4f8ed4f2e820608d05e4f63a615d0281be1ffdf4418c1e794e058", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9129126, - "script": "76a9141c79fafc028816155202071ee7a1bf8ddeee26b388ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 16 - }, - "script": "47304402200138e94a2d808b620ebce683e015424680f05efb74bda799bae593c87893ac5b02200405bf714f989c6587a49021c5ce9072c0b6e62f97fbcb833e19179721d70fca0141043d212a0dacfdffc5d24f9498ed407e35182d624e40348bf9d24fc7d7e2b9388fe5dc0db87155c1c78c751a5c7ddb3ee6ba3e4321e2a53a3d29e8e5aa9b8a2395", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ccd166b2ca8be083036100f5936192d124c976c069737b5b53694309f9e35a3", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 40392791, - "script": "76a914d2cf51b90eee298eebd1da90e718782e9d66e9be88ac", - "coinbase": false, - "hash": "6ccd166b2ca8be083036100f5936192d124c976c069737b5b53694309f9e35a3", - "index": 9 - }, - "script": "493046022100db2de5ecd7e3c2ff48a5c02db808fdb1aff8c47b82c98621b723dae62a50eb95022100f5e93a9668be99bac59dc0fef8a5828e0eedbbebfc7962d8884186cb3e01d0cc0121024cbe599aba38b6d65192b66202db9ccf9ce0c97d15ae2dc6960e1c85e4dd88bf", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5732957, - "script": "76a914ad3bcf491008ea2223cd797f8db242cf7009bda888ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 4 - }, - "script": "483045022000c24343a407eb6256ff6e5796f6a6c30112cb3b396798107c7edd83970b6007022100c348a2ccde562aba1002bdc992d4b1de5c3c575a41efe7a12b17880214afc935014104074b1f0f6761bfb8b4f4d110c8783a5e7198e9993f6e60a2dbc51cae933357f8aa660af847b5bdbf76f15c72ec088c762b9630f8c5cbfd97b72b5f499f0c22ca", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 31 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 6056667, - "script": "76a914c684c64e461b1e8bbc4dec71d2642279c784b67988ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 31 - }, - "script": "48304502201a4fe05bd229d28acc42011a2831fa04d8b936b3d6618962bbf1f680864d6ee9022100d7b62b8a996b97fabad930b45449790e0bcdca679634e5e337dc9e019425c687012102fcb6c1c462d571aa7b94aa9d408592953e1084735c24eaa663f4e374fba326b6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a6348c145cd509c6136b4772e4a0c1bd0a1ca3b0f470eb8bba7afe5831faad8c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 20330000, - "script": "76a914278943373222be0372b8420bee13d725b77f914488ac", - "coinbase": false, - "hash": "a6348c145cd509c6136b4772e4a0c1bd0a1ca3b0f470eb8bba7afe5831faad8c", - "index": 0 - }, - "script": "49304602210082bdb5b2336db1231c0c394ddbbab97e014723ce38a0802c1f6c50562561cb57022100dc8cf4e14805fd8a99463e4e745943b03d58281ecd3cb2ec91c8d6112f38515e014104331a46d2370484a409a0cca12593dc4dfa243e2609943d68ad0a4a2f86f3c786288172bf0d0f89786e8de67cf45ab070e53ec5546437032427ac16704dd798bc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6729d5733f061fbf9020305729689b3751a413fd6992e76ab343e7ac9f5c2298", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 16080570, - "script": "76a914daf2c072385c709e199041b036c44d9495572aac88ac", - "coinbase": false, - "hash": "6729d5733f061fbf9020305729689b3751a413fd6992e76ab343e7ac9f5c2298", - "index": 17 - }, - "script": "47304402206303aed8009904c8d500f11c396a9656354679aa283ed83eaf7481a321280a42022055b81d27512374a0f0bb94ee045027930c73c5e0c56a3e74ef7ba958df92f3ab0121025324a3daa5b47e5ccd7a07938f8d2f0c372592d9b08275c48edc676803f4ef7b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 40000000, - "script": "76a91476fef1e8026902d50d768238a0efe1246dd9ea6a88ac", - "coinbase": false, - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 18 - }, - "script": "493046022100c2c7eacb200eaf19d36f4ecae919165e948bb23077d6eb9483ec90c06c74864e022100f844379a0a10df0d5539964e780591bf3819e51739171a41a3f071998ddc493a012102fb945c51a529b3f5ed6ed81ce3345e0b241d4fbd1af4b24d515715e1314bf32a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 38957100, - "script": "76a91405c8c22d5f7b3968493d6e90590b8ca256d9aaca88ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 13 - }, - "script": "4830450220514af2350316c5b6a0dd03e67f5476133303334a23ac3218abad3a7404619ec9022100e9e18b70f7ba5c94853b38069fb72b58d035d1a2895707f588421f008181660c01410454055de3b018f650c1c03d2a22548e1ead2735309c20d19653e628e2b57350033224dddef8e477b99889d82ef4be3ecc29f3426f5dd570b61a33142fc0723881", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "feb7272a5da311ac9fda29a3e87d569ffd9c5c5083265b28c46f89ad849b0226", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 20000000, - "script": "76a9149c76f68227aa64e626630a7b2203b2432bb09ba588ac", - "coinbase": false, - "hash": "feb7272a5da311ac9fda29a3e87d569ffd9c5c5083265b28c46f89ad849b0226", - "index": 8 - }, - "script": "483045022100e1889ae4255a1546a9e72cd11a8768499b640d25dfa74516fe8ba3f37ff826f20220381c02fb322daf31ee79eefe7ccdf2d21e4266c5f8ffb7dbe83e7c9a3de07b22014104718d4ac1557f499510ba7cad7c4365edf5f9c41da1b2fc66acdec2a698c1a85147f4b8dcd66b67ff033e78d3472c86d14960499953232a814d110ac992aacdbe", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 32 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 5273710, - "script": "76a9144d47e4ae5665c8f16a8ef690217518bf6e5dc77688ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 32 - }, - "script": "483045022015bdefe338541f9c976571c007fd472b2aac99c237ef62630c1e0e57c27641f1022100f9263c85b01c2a3f2d41254f49060a66d6ff954db0ba13c19b1c7d8c1d74e000012102291921051224b976f0523d6bf9e4d4e09cb540702b209a3ae3dd3d017a9a8502", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9063335, - "script": "76a914a05164bd2f5df2aa83e41819ed072e72b1b94fd588ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 2 - }, - "script": "493046022100b30c46e8304aef3b606a20f40526963b076ffbcc8c2837c158c0c8fdfa33e25a022100f96df2a51b3063d0597f1dcedf4bad7f41a84c37019a869149b2db2def0e5425014104a26b69ad0badda04be9bccb3cbed4e982378732ab3c5224669f05016b1cf7dc2b9bec5f3e5931fbb8dd47a9037b5e92e7b76ef3a8b16adfc061979f635b171d8", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 40000000, - "script": "76a914a5cb89f6b13487dec05b10a690e947bc54137ce288ac", - "coinbase": false, - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 10 - }, - "script": "493046022100b38f6e2c94a8d1f55797dd4b02f39a4382aabf6893f6ef76d6afd27c2576db7d022100fa0ebf5371af6c1918eeccc0bee63d4c03f4b2f41ab82df5fc92ab8524454aec01410404f792848bda5201ce9576c36a0449149b327629b721d08dcdd43dbc0c141ca1ffe21a8e5a16726a71fd8c0128ec08ca9d3302c24f41f399e09d396417e668b6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 5196620, - "script": "76a914f2e2e2acbad94f0fc0c5c7eafe21ebe615fa1c2d88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 0 - }, - "script": "493046022100a27dd82cc6784f10f5f35c0a7e12589c2ebac641d20eafd2542980fd1da0c8fc022100cf2129af8385b7da96f9b23a7665f83a16d79dff62bef3bb07b81197f02242410121026b3d28d677e9cfd691cfa051680caf524e8c722b90244cd287ddcd50a78b2bed", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 5190000, - "script": "76a9146e228e35479a37584710b815a29a7c3d8feed8bc88ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 13 - }, - "script": "48304502201eb17afc98fbf6727392cc50d8dc5b09c21dfb5a90b39a49cc20e3cb984f8de202210084f8ecd1a9c28fb33d933d4b2a15ec3c678259bef43c54ca251e404eac1a88910121037172b04c6828746df914293c3f093aaedb115fc5478b615a759e579c4c06b4f4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "75a98ce35b869772adbf643b3f8acadfa5b46b4cd8bfef26f9e079c517018285", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300000, - "value": 17100000, - "script": "76a914c485fd58a81cfc5fcc628f1308161f942b76e8aa88ac", - "coinbase": false, - "hash": "75a98ce35b869772adbf643b3f8acadfa5b46b4cd8bfef26f9e079c517018285", - "index": 15 - }, - "script": "47304402207c0b329cefc9ca8eb7048809203c7f6a7ea2ff388ed9ec114a922b745f40de0b02202e3348d5c34f99bf1302fb614f74fff11d79e648a1fc382d3f22a7cea030635c014104241604b57faea6825c53048341f157a0e9e1b2c507f744f3dbb69339cc453ce6d07129e66b20ba9f09d1e3db9181cc58a2e693f2a8ea1545386798bee575f620", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 5215000, - "script": "76a9141e5d736be3911036ed0a6e1e6f90c3afc93a4cf888ac", - "coinbase": false, - "hash": "759615d1954c62380c492a51743c365037300d04b729d8e573d3ecdb0bb0ad89", - "index": 4 - }, - "script": "48304502204d92a600c1a6458b70751ad45baca7a9396092458251e5469a3e67a47f6bd218022100fc3e7f0f524b17177b7af89e417f75a2cdc5c176f6a2ebb12223c01da46dcceb01210318f6958f258afbb705724d260c269392660c3ca6e8027e3549f641051169c839", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 40000000, - "script": "76a9142c9b234bc44b6d4d8e6404fad46d2ea2a02bb0a688ac", - "coinbase": false, - "hash": "bbc0ab273f26b206ad1ac598789da141044ccbf4f3b7ae472e422fcaf4f8ada7", - "index": 17 - }, - "script": "4830450220506627d8f9eefff0d78cb4e6a2c6b1d94c044aac8de1db35d6cae66050b7bfe90221008cc5fd24d468ae725fbef64c2508c0b6431e1e796ffd68ad4edca927dd0e25930121038aee40afd9a4312ff37be23afc503c0ac63909d063cc28465d4c035185d06bab", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 22 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 6359667, - "script": "76a9145833a6016eb94b63b3dbbec846106cb505b03b3688ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 22 - }, - "script": "483045022100d47bd92691726264d150431178770919cd41962556248c0afd518cf682539de302201ab0b6e8fd107946e020ddc533536fc702679432c30b8073c03991e9a0b8cc0f012103b871203f74c3e84d1e6acbfe2ad3ae8afcd448cee76aacf1c18eb6828ca2cc21", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 7252855, - "script": "76a914f357f92129da30e443768d62a656833bb06e094d88ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 16 - }, - "script": "483045022100d5edea6b9afdc9d7a3075db5f38589182babe1d1afeb8fd28a422cb6a54ac57402202d0d9ff8c99f423eb79410ba15bb88690f27723969d0d8d72c316e93715c69760141043101d45591871f36aa5c5d93bae9d0bb52c3c0f501821bc8da80cb8d8163c39be0f9053d327d954a94f7cdd2fee189e35b1d7d0cc609165d52a9490ffc5ce911", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 6066667, - "script": "76a914bf48b74b4ba133809b4201c861358af44092fbe788ac", - "coinbase": false, - "hash": "6b608f1ed2b1d9731c2e455b948232a60fb855817e9438c574c577a8868b71aa", - "index": 14 - }, - "script": "4830450220750aee1c89d4306916060177c353b6a11b60b53b444875bf9de0e72cc882a91b022100c08debd5186999d435bc78538ea98b8c9e04e3bc939413dea08e802555bac345014104262c109cd450bbfc1d7ef3bd3f6da17a354c1f02e3082fd38c5fe994296bfd3118eafa4a95ae5e574f8d06620f9fbdcaabafcadec6b3b4d2260c001abdd453b7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 19 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9291016, - "script": "76a9145cdf16cc24f9fa1349663e7a244369414953afa388ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 19 - }, - "script": "4830450221008d7194a9944a9776ac5106e35d96067977d93b9d7caa52202313e2c7f8cdccbc02205689a74255cc78a57d26cc8cf03407a29e5f70c2f878d5975501377020d49f0d0121037f2f0b0dc23a361e3b6c5053fea7666e5c52350cc0b695693eac0b8e48ee6db6", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8999540, - "script": "76a914c6436930f538461b6225da8b174339b3d21b44e788ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 7 - }, - "script": "493046022100903fc7857d80d90407e2a097c6f9553dda1aa5b3f13faf81e1100138583874df022100d51493b0a42db101044def71b2ae821a026c4dcf9ab965a403c01a47a5bbc8c201210340df1f1b86f5de9947ef9a72a26b8f7097bfa683abb888705e64d3037794c2e5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "feb7272a5da311ac9fda29a3e87d569ffd9c5c5083265b28c46f89ad849b0226", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 20000000, - "script": "76a914438556c4d4ac14e6b7d47ae3792289058ce80e5888ac", - "coinbase": false, - "hash": "feb7272a5da311ac9fda29a3e87d569ffd9c5c5083265b28c46f89ad849b0226", - "index": 12 - }, - "script": "483045022100b85d8b24bd1a9e490ae465256f16650227cdf170ea060b1664a1c50f2a70aa6102200b508e1adc32ab059dd85a69afe09c917ff5aeed653401b000fe928ce30158ad01210373b90042d0d240fece4bcb0e09f5d44709b905ec54094e6fd0bee2275b31048d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d47b3890f00d45df78e4b7243f42ba05e5de3329d235379712d93fb8a6588b7d", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 19600000, - "script": "76a9145052427fbc9cbc56067ef683f03517ef5acf189a88ac", - "coinbase": false, - "hash": "d47b3890f00d45df78e4b7243f42ba05e5de3329d235379712d93fb8a6588b7d", - "index": 8 - }, - "script": "4930460221008f9884e96c862e507611c8c0b0ed1263de25908d949950dbd5a936457332d7f1022100c4ffb8e888d78d25194b09becca6283dae2e4e3de61f747ec37daf2b74ead198014104d3e951433de2a3a0033ec7bc59a88f3d366b455f063eacaedc77ab1862d468c725f79c9535f95474e28b10fab24c853f2ffeda096a7267fa063abe33e791eb21", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 16 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 38800000, - "script": "76a91400511df6cb881a848cf0e693019ab053360c7a8388ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 16 - }, - "script": "483045022100c1e444ff5fbcc53d6391f01c44d5c786de29b53fc8276f27ca4d06683dd54034022040d729f1115b01a5e77193ff433994455bc56cd59002f946aaa0e75ce74cf222012103f16afe3a743f6eff12533fa155e4d20f83ca03862ccfbc3e6b3d86d6054d54a5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 20 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 9215977, - "script": "76a914b75a9972bac8e918ecff20835a07e613bafa180b88ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 20 - }, - "script": "493046022100f39d1ce431c1cb2d95bc60976703acae51b9ca83b20303f56f64c1af242a46b602210093f7507793fa0db4a950ecebb0da252d67b34d50db85621ed75ade3b13a0757d01410414ed552882b9700ea3aa600ff26ab24cbe488ebd3883711422acb71cf4b043c43f20f0d110cc52f463b8a3d17c6cd25786cbeebba365ed8aa9ca83badc66fa31", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5000000, - "script": "76a914791763eb9805371fc5d5bd92204538c1d54e333688ac" - }, - { - "value": 1000000, - "script": "76a9143ae23ec3757c3492d5fcf2fbddd4301b0400b08588ac" - }, - { - "value": 60000000, - "script": "76a9144ed84c242d2da0f2287282e3dc0a1a5c6fee1de988ac" - }, - { - "value": 55000000, - "script": "76a914ad82898dfd676b580d46571af64f4a22230277ee88ac" - }, - { - "value": 60000000, - "script": "76a9148615f34761543717b4b7abaeda7431bb7a06595888ac" - }, - { - "value": 56000000, - "script": "76a9140b13c2b8e46405bb1268e4185da05cbca1f448eb88ac" - }, - { - "value": 56000000, - "script": "76a91455191c5e137e7ac7a2af277152afd4d84e99546888ac" - }, - { - "value": 60000000, - "script": "76a91438b841186fbadbe6752e0b5da8fc342be6a523fa88ac" - }, - { - "value": 60000000, - "script": "76a9141543d67e917fe2b4c4c4c0b6c533ca4e705374dc88ac" - }, - { - "value": 45594604, - "script": "76a91444122fca944211bc10d67127b4fd46000a40770788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "36c30d565051fc52504406366cb54d219f1282d5e70e2253e23af6ab214c557d", - "witnessHash": "36c30d565051fc52504406366cb54d219f1282d5e70e2253e23af6ab214c557d", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 449, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "f16b182df687ef2959714c4abcf3224db293aac8cf107bc7cd9a0c5e31a75974", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300021, - "value": 13513336, - "script": "76a914e66c8767ba96c416e91ff59332473b3e8864ee1b88ac", - "coinbase": false, - "hash": "f16b182df687ef2959714c4abcf3224db293aac8cf107bc7cd9a0c5e31a75974", - "index": 7 - }, - "script": "493046022100cefec98a07fa712a531a2c9ea1df0099ea2235aefe7c57483d575f51a132ff2d022100b8d19ff4cbfc59fcb95f15ce545d260e7041250ceef8eef13faa2b0e119919b1012103cd4b4142e4124999fd1d1422fb9dcfe4c7042ee0b541cf45378f910b133b530f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 90000000, - "script": "76a914a9203622510960e6b670a8cf319e1633048967cb88ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 9 - }, - "script": "483045022100fdd83eb2bde64d04f0536a15a2a44cc3e9bbe29db9022df61c778d76c26dfa3202203164e0b20ad7b83538f6f2f46675c3ed27f2b691a6046a84fed879564273f7f501210313743281e26dca0ab310e376ab7081d1a1996105aa51ad3a8678854cdf201fa5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 30400000, - "script": "76a91493bf010ee52b745594411899d30d117037ac19e488ac", - "coinbase": false, - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 0 - }, - "script": "493046022100ebce8e6fde43217e4f8c3803f833c4723a530e16ac3938f7a616ef55b16f47e302210090b60cc342f0818de43d15dc5f651929672a012d608baf31c7ba9948959e9308012102b28d6d2f51bea96418dcf1decccb8544639b086b520d2934d609b51c6a4cfa47", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1022530, - "script": "76a914e0d1a909b8741db823b36236f83b53589641fada88ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 5 - }, - "script": "493046022100bf8780ddbf6998fd998cd89638185acefabf5b1d741e01a275d5ce794f3078d302210090076702e8b68c3d8e69bb33ae198f989eb13ba7b7d6860413f9e56c18942330014104906298631fa14bea3c875d9898b97c52a7904b0b8d84f763ba916a0a73150916d3d702cff27a5aa9f1e5810f0313c3e713fdf30ca9592c68f34203a4937e9e54", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 29563179, - "script": "76a914238c66df22023bfe1c5cd5aaea2734037fe9e02588ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 4 - }, - "script": "483045022100965cbba5732bfa904b25470c8da327a0f532330b33a3856e51a7754f62c8c79b02205c7bf6fdbb592d0d977b0d5eb70f72c26eb23cc9cc197569eb60d90fef646b53014104eec28b3ecd97d8401d55b72671dfd2bdb0da6bc282143a6ea3d3090d438a7f93981447c03f2eb130e135dbb47cb710cef47d6a8ce15cdc7f66b6532b5675191f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "index": 19 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8500000, - "script": "76a9147c5d112d87d2349a795733b2986d9878767d485588ac", - "coinbase": false, - "hash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "index": 19 - }, - "script": "4930460221009addd85eb1e5ac44c397fd760b0746cf685937a195fa123eff79fb031a92fd1d022100a32597877176c7e42fdd833c695dc7b4f292d9c25787ab70a5646a16bd447701012102615f718760fb73741fcd6a4ae898537caae2f8b502e46d9ae66c4d6a14745b46", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fd6f2589734ef1bc573534ca7eec086c5e1eff21fa9417e690ef3dd18e4a7e54", - "index": 2 - }, - "coin": { - "version": 1, - "height": 298681, - "value": 20937513, - "script": "76a9148f92000d9a9786f69275811cd8476b534305f33e88ac", - "coinbase": false, - "hash": "fd6f2589734ef1bc573534ca7eec086c5e1eff21fa9417e690ef3dd18e4a7e54", - "index": 2 - }, - "script": "483045022100808b8da99af27fcb954e61ba0a48e4b82b2b3b10f76e63cc5a554b286742f5fc02200875985d23fed78cab3e2fa0ac11c0742cba0c2efc0c72d2a35f5b8eeda3447801410488f4a8f10e8b3c35a3f2fb3181cb57e1f725d17334c52dd852419da67a6d643d36903f9f22d12f05bf6c3f085c4de9e79bcb8933fbc6841e634de5360d105292", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 5 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 100000000, - "script": "76a914f46acae1d837d1162b1c0812d0220c79435c002888ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 5 - }, - "script": "483045022073ec11969171ae1b3c7094756756b5505bb5f99be058047ae4423f4b786096a4022100ea9fa099e738e2b9553b2d2d3272dd8920021e4eb516b3fa8d2f59ce2d1b35d1014104fb501c8dc58b1c44fd0470117dea1fbffc71ad8d03e45a37cac213609a33ffbd6fb2c4d66985af47871c09878bcc936b78bb89c14bf71c9e03909f2b2d6986ab", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8523400, - "script": "76a91496df68af3b1059d714db12f01bec6d5b095e42e888ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 8 - }, - "script": "483045022100c8887747b2f775400db53122e70a36b5e50380321aa2743c280593a45e0a46b5022059d21ba0d0aca6c37b3f5b942f165751c5d7d93004564fc289c746fd6c4822280121035fc959116fea5bbce94348d67fa4a0390827cf8eda70382dd0c3a9ff4070e6e7", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 37260000, - "script": "76a914bdfcf92b37668c98d2b2213ada9d012b23ef779088ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 6 - }, - "script": "4930460221009ea226de1997003887a2ec08b4f9df2fcc5c45a4ef9e23430cbbfc6314ba21e9022100c93bdec96d8f9fd23525b5b0243d60562ebe3288bcce3122d28ded956e94e1fa012102bf01ef81ae1a41b9561dee3d6e80439d0937ab69a70a7f0dcd9a48740e7c17a9", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 18 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 38543800, - "script": "76a914ecc110ad72fccd59fe90f5926f68b4ae8dde5ca088ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 18 - }, - "script": "4830450221009965decda6426da2886a7720e0b552fdeaa121257f81edc886eda353bb975755022018695ee280dbd4a425269141f139ad9b7015161bb4acf44482e3003590e5abef012102b846755c1a54dc52736bd62ec025988208f0c800fb88905b724c7ca5c44a0cd1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 7 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 36581760, - "script": "76a9143875ff5ebdf12a90068447360c865a438881a45e88ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 7 - }, - "script": "47304402205e8de151556f19a8e076de728e075e3d4debe736b1f3653da341be26030545840220064cef7206a393c3cb0a83ec0254bb4a42a27a7822800b79247dcbc440103597012103a65f1da344744e46a2c3cc7bec130454f707903ed8649d0db366b8a351b20d5e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 8 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 90000000, - "script": "76a9149b5cfe149635f3ac54f3b30b9caae8c0eb14944f88ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 8 - }, - "script": "493046022100f53d82c50840f19c217bc7dd199587287b9a8560af72a18debd9bd630481b3bc022100c5009c40e8a1008a329fccbbea9084ca128acaab9e281cf2039212aedb533c15014104a08f2620c85842db196797a4f5b7440603f7b25f9db09622f27f5f4d7b6e7400f264d2f76767e1cbde526a818ec3343327c4f0c8d2943b251fac0535df19b1bd", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b6c73b487847f9f23716dd4aa37572d0ef33a061e5763a5277dafc1e09c0804a", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300000, - "value": 9386000, - "script": "76a914302156db68abb60aeb24390e7b0f3582ede0585588ac", - "coinbase": false, - "hash": "b6c73b487847f9f23716dd4aa37572d0ef33a061e5763a5277dafc1e09c0804a", - "index": 11 - }, - "script": "47304402205e7da7afad3d19cf57fded1ff1b40b78f31e8e2012439c2346a8cb0f0e9cccff02201274eb2359ed9d7022e3cf2f391c38e174b681baa4fe5b295881b4dc1080ad69014104c81fcdd400e947543a41e5a480695ad769d5b7aa51ac36ad458cf6d8ce78516673b3ed0d30c390bed0bb4978b98453f1b5dd441d7c4698dba2d8f36b9a35a366", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "810bf5b04f992908f43e29548f9c44f568d673854b63ef3aa474f29550474c3e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 5000000, - "script": "76a914791763eb9805371fc5d5bd92204538c1d54e333688ac", - "coinbase": false, - "hash": "810bf5b04f992908f43e29548f9c44f568d673854b63ef3aa474f29550474c3e", - "index": 0 - }, - "script": "493046022100a0ad392174f9c5adaebf7206f95e5505550f8a95e4b8d792362e0643b9a3899a022100e288d28c62650e77add3e11fd8d915168310fe411d9be220c87fb071dbe73485012103c60f4a12b7403438f7ad4473991bb5859f1752a7851b736ecf5e1de03e5fb7e5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 8900000, - "script": "76a914888bf0a6d73bcc2d5ffc9c5e275dae072d34817688ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 6 - }, - "script": "483045022100ee4702cb54c33bd56e3878b26c6b100bc2c45e5a639ae12966f6552c36fe337a02203e6d6bc34f83537a30479086e8c77d1343846d74d528aa7b79a761c6a412be130121033896ea84e5d7463d6f40e2ae8e30da1e6ed1ea9c819c16244db0d6fda0d76d7b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 37100000, - "script": "76a914f224ff71fd9fdc07e1dc7cbd8e39b4c03a5f7d9e88ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 11 - }, - "script": "48304502200631c65f5285e743643baa896147205fd583a496c3bc26d96ca71fbdd86d116c022100d6776231524afa90856209ca01994ec7cd209a6d50fc472fdac5328673e2e6af0141045fa2715eacd61422d4f4e5615f6cbaf32e13eb7fb57cc15daa8f2b66989165fbba4a4284b760e4ff58770166bd53e8ea9fdedae4693bff980ed9a9592d02850d", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8559151, - "script": "76a914bb5a3ec420c2cab2ef166f4c1fddeb5f6fd287db88ac", - "coinbase": false, - "hash": "b4c414b9acb15bca04f8ae614f79f547dfd82340e9651b22943342bb3628d7ef", - "index": 3 - }, - "script": "483045022013dfb2bf8dc60ac810b44bb418326695ce21516fd37f29e12b1b9af4b8fbb8e3022100aa067b05e3da7f93d66fbaab5e6054bf90f169c6313d929106db15e6a7cbec55012102cba1e742c4ddb77ae6653e94af3c0ed15d0710b53b35cdffa18a0d52afe8ed98", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 90000000, - "script": "76a9148c1e72166efebecab3f386e1885e3e81339c4cb288ac", - "coinbase": false, - "hash": "dc5ace8e7ef7536e034324c8e7949afb45492a52c16b3846722a2909decb378a", - "index": 0 - }, - "script": "4730440220746d8e2799918672c6a8d93b661accd54d621ccfebb8e1c457f39951c7339be202200f8433a5aacf9d211e9b493865b1ffea29d82a1ab51c03d4419f571fb445a60201410412d9073ff42f2cef8d7dcd8be6670186893d19aec09814f1342e543754b14e55bb74c17122c1208f0709f3c7f79140955ae62608d2cb346f06604a09008f7f64", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3ec3fb41cdd0e73a874937cac5c6ff8051f63fcab0bcc6b2da709aae0f270f36", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299962, - "value": 82614000, - "script": "76a9143fed5f5d39aa1a0cc2335da20990ce5b3c57f4b088ac", - "coinbase": false, - "hash": "3ec3fb41cdd0e73a874937cac5c6ff8051f63fcab0bcc6b2da709aae0f270f36", - "index": 0 - }, - "script": "48304502207751632760ec05d0ab9d417d9e5276775bcb4c5ebfe9860aef1d607fdb6440af022100e945a67b9eacb1f217efd6231886f043fdac37badb2ec019cf1a7ef236e50496014104f5ecd36d517b5b315b5c308bbf8bfe9e43210cba48a2332035dd0efb90dec749315db967c3e5cf51e04dbe0c78a6f08711d64d9edb66c6e2ddce892163058375", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 36865281, - "script": "76a914151d619ec4edadcdf45afbba2b3328257169a8c088ac", - "coinbase": false, - "hash": "e7711581f7f9028f8f8b915fa0ddb091baade88036bf6f309e2d802043c3231d", - "index": 14 - }, - "script": "483045022100f5687bd88f8f28bcb0740d02f9048b7e30a5a541a2a8c579ef0f220a7aebe3d1022052c19db331c8f52d0b2977dab4d63154a5b4684980b09a10a6e36b1e6245064c01210356cb0220b3717d45df10c6519a84ef3de1097a0b633d722381bc64dc720bdeb3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5a157495174c5de62732d2da13f00e6090848d8e063b1e3aa57c4c6c5e1e343e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 9300000, - "script": "76a91470813e1f240cd703029c177c7a8558aeaf360d4988ac", - "coinbase": false, - "hash": "5a157495174c5de62732d2da13f00e6090848d8e063b1e3aa57c4c6c5e1e343e", - "index": 1 - }, - "script": "48304502206a5254a8a18dddc19375d5c1c7a85ab2a32356f9acb0edc5388308fb1fd124b602210090b66926a5680dcbbb0d191537895ef2a2265c9eced133b78ae700fe99d6d8bd0121025281c2168599d6cc96f03154c5db7fff92128d1cc938c5ba3ba5e70cc3b1b4fc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a4e1eff4f0b59e1106878a918dc7954a3f254864e3fbf4065fc0437488747c4e", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300006, - "value": 13500000, - "script": "76a9147eb45eff2e992e36e2b571fcd78647631844a02188ac", - "coinbase": false, - "hash": "a4e1eff4f0b59e1106878a918dc7954a3f254864e3fbf4065fc0437488747c4e", - "index": 3 - }, - "script": "493046022100e7270f47be28ad8524ed69fa5e9f8b2b5dabf8ab98277d422f52af0a636be6ca0221009e3b0c31e29ab4f3c250d16cd63cdfa3f90a2a09cab65d1cf5b8869f2d96963a012102a5f560b6979b5f3b8013375e934de12bd53a72003a740f8c7bab9f8b657c9e44", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "810bf5b04f992908f43e29548f9c44f568d673854b63ef3aa474f29550474c3e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1000000, - "script": "76a9143ae23ec3757c3492d5fcf2fbddd4301b0400b08588ac", - "coinbase": false, - "hash": "810bf5b04f992908f43e29548f9c44f568d673854b63ef3aa474f29550474c3e", - "index": 1 - }, - "script": "473044022012df913d0cb1b86749308ad1b8ab298d9f43f511070608c5e2cda14ac2503f5f022070d826e5da5a5ad1a1dd34ec927f5532d69400883b4275c57eadd80fac5a777001210380f15d7ec8e488c7e532ae04af43ffcbb59703dae84734f6daffdb09d09541bc", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7f1ba2c5711674ce416a129fa95690cdccefa83b0c925a991369a6b9427ddc4f", - "index": 11 - }, - "coin": { - "version": 1, - "height": 300012, - "value": 13490000, - "script": "76a9143ab3a450c722e069ce515ae21e3a5701546869aa88ac", - "coinbase": false, - "hash": "7f1ba2c5711674ce416a129fa95690cdccefa83b0c925a991369a6b9427ddc4f", - "index": 11 - }, - "script": "48304502200ddac38b4eef2eb0c8e8b6f8dc9a198bf38167004f14fe10e9c8744240fbb7240221009a60d549749548a28519119e4e78f040f5dfb5c9bb6bc9eb36cb7c693f1aead3014104e4b8651057276dd6457a339fc64f94d6b23043bca87a280e1d9db7798c7a1a25edcbbf026e30f48f02ca23d5e903859912fee6d62c92ba13c0dbd599fe942521", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 2 - }, - "coin": { - "version": 1, - "height": 300015, - "value": 36820000, - "script": "76a914ac5bb7dcfbab66311b2524ffb714ee61cf99449488ac", - "coinbase": false, - "hash": "d585c42ee012736f3641c8dc661d46330721d628bf8a62dcd24eb3738fb61444", - "index": 2 - }, - "script": "483045022040f0b4b57e46cd5bf93655eb7d104e5516ed97935b6ac59c43f120a2f5a3d5d4022100df7bfdb064b3f7ac6e594d7f05cc595de87523687d0af00839e42bde6f67387b01210391d809388c525211444d5ca2dae844e332f2e8c73c86b16415f0f0f61b9c7d41", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 27700000, - "script": "76a91428621a29e7ce9fc5623ba19ba14a1428e534f0d388ac", - "coinbase": false, - "hash": "b564c7578da0c68f1ab71b717e509d16950973a2d39b05a71bf37915f20a6ff7", - "index": 9 - }, - "script": "483045022100b1789d8b38acafc3ef70553e9b6bce55765d56d4c4747d6401512758111983dc02201d4f8acaf8b00a5acfa3426c0b05ae7e0558674ea2294853d8c42666c37c98990121033af1b0c28e9b2bebb64b7250a8cbc31dbb5acedac29d95d48318e12019aa11aa", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 7835759, - "script": "76a9146ebe530bfa83507b0be8c4d48c5cf49d427290cd88ac", - "coinbase": false, - "hash": "b6118f48fa46fa21a08ac0a4ccd47cb051ac6f88e127c596a901f06fb109116f", - "index": 15 - }, - "script": "48304502210083eaf8e412aec9552640d8835c3c38c0c6c8a85f6787c6310746f70fb2f3d76102205d924ed5e36f6dcf3c7254afcb15bb5d262d1334ad8b148e69f42f9edef67b050141045967d2db01391b67e80c42a8a8114446ca1cc364b41e2bf93c5513e84824ee9c24521eb729eec6b04c8707449b27cd521b1d1c586ee5021754d9e97fa6d87f00", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8128000, - "script": "76a9144b62eeb2be03d1e7d7e3e07c8b8566af9c01172b88ac" - }, - { - "value": 94485330, - "script": "76a9145aa4d8f0be1fc1a2669bdbe5d9b20ee8911877cf88ac" - }, - { - "value": 94945600, - "script": "76a9149a346cf86b5d83454919114d491caf434f9203c588ac" - }, - { - "value": 3834118, - "script": "76a914bc3fd3e093bd28ccc0214e02c12d95b2cc69ec7988ac" - }, - { - "value": 8550000, - "script": "76a9148e3cfd05cb70010539c23803e4009f0d09f7b86e88ac" - }, - { - "value": 9016183, - "script": "76a91456c0ec44f6ecd461487af2ad4bd462f2d86ce1b388ac" - }, - { - "value": 8555913, - "script": "76a914ba26460478473f1fb2fbd6f31f71da4c8a404f8288ac" - }, - { - "value": 94308997, - "script": "76a91404f1eb215fd9f99dbdc1ee70b98ab0b8aafd635988ac" - }, - { - "value": 9370690, - "script": "76a9146ac8ccba25d09b619f08adcb78a0a859714ff03a88ac" - }, - { - "value": 9192516, - "script": "76a914c6255cef71333ba1c390e48e81c6f1d73ea43b5a88ac" - }, - { - "value": 8931320, - "script": "76a914b294e9bd49951141ef0120991b02c1f0ecf2fb3a88ac" - }, - { - "value": 9027208, - "script": "76a9146b8d9f13cbc7d45171e0027dc44983d0bc9d2ffb88ac" - }, - { - "value": 9203953, - "script": "76a914d2ac9d49ad251b4897d979c3c1edd81271f79e3888ac" - }, - { - "value": 94951513, - "script": "76a914f06a4daef1b0bcc05b1d9af35b37949d594248a788ac" - }, - { - "value": 8322000, - "script": "76a9141ad0884bb771d4ac4c41cfd8d8bd2c87d32f2e4c88ac" - }, - { - "value": 94570190, - "script": "76a914ac5b8fac6ad0de39e5c99aff9a8a74040028b3dd88ac" - }, - { - "value": 94474305, - "script": "76a914d88c81921f142497048938b28df743b5921dddcb88ac" - }, - { - "value": 8978500, - "script": "76a914a26b08dc36287c3156da453adca5827e75f7233a88ac" - }, - { - "value": 8629700, - "script": "76a914713c033a0416661c316897cb7fef513d4e411e5888ac" - }, - { - "value": 8250600, - "script": "76a91464504bb70d6f950fea2e896aac5c055fb1935c6188ac" - }, - { - "value": 94297560, - "script": "76a9144442c101e7ec022458b3691c0d096854b3937c9188ac" - }, - { - "value": 8985256, - "script": "76a9149e21da9681b0d479e90cfb493db803c8eedb632688ac" - }, - { - "value": 94516257, - "script": "76a914f09a7be64a39146a4cfbb97451a5f39ebe48656d88ac" - }, - { - "value": 9330000, - "script": "76a914523c051d4c11d65c0c8394b50b7d10f976ad012988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "c1b759121d09b36f190f34d60a86fcdacb5b7ed4560b393c4e248a1f6ab2b638", - "witnessHash": "c1b759121d09b36f190f34d60a86fcdacb5b7ed4560b393c4e248a1f6ab2b638", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 450, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "2f637d397e7a7f475b31d7cbac564ffc52ff7a2e826590c1a07b67c863e819dc", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300000, - "value": 9400000, - "script": "76a914655226afad30d329371f8d00b44860f493f180ef88ac", - "coinbase": false, - "hash": "2f637d397e7a7f475b31d7cbac564ffc52ff7a2e826590c1a07b67c863e819dc", - "index": 6 - }, - "script": "4730440220566f4f3f7ccbc7f5c4d4aa80566b6e5d9bc87fd85880629ba9dc1f97d9f2bb09022049b9b9f1099cbb3f4604411f0af1c8c50929e14a3a2d8fadc9178890c92c98a20141045ded8abe2aa662df92aa66b247b5bcfed9e88fe4b3ddf3b7c2db749285392fe5e8338ccc8faecf21dc1219e2af599630621eb091ba6e2b6693621f41f19a29f5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8890000, - "script": "76a914aac08dc7e30698aedcaaab4715a66c032932717788ac", - "coinbase": false, - "hash": "2131827f1edc2c578f63e5529ae5c19af045f1ae059e0eee58fafed22a3c9846", - "index": 12 - }, - "script": "48304502204a23a83d03c3dd75a9f7a2e369e93fd25e0afe19710acfb19b5d9a2c46f762a002210085ee67b1a43e1a93f817ed306e28afbbdd3dc03de20dc91fb52cee9f46b66d8701410457363cf1468a6913f4ea39f12cd670149a0701efe64f574e5acaecaa79c59166d5c5f78e61b8033b83753e1b8a88293d9e1f6fb6b6291c3166a096ba9f388ba4", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "589905e1dfbc57726aea8a801cfb17ccfa96232b3b43e2829aaba94e7e116582", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 9430000, - "script": "76a914699224e28922439db7ce6aa95087a0d1fe408bcd88ac", - "coinbase": false, - "hash": "589905e1dfbc57726aea8a801cfb17ccfa96232b3b43e2829aaba94e7e116582", - "index": 12 - }, - "script": "493046022100e1d7cf0fd68b3315b0f6346cff847b9bcdb0b080779086202dba14c58fbbe618022100bd8f7cb078ffa0f914cecf4bffc8a142585657897d046a7409a83e6bf6adf85c014104321a3bedf530da04b6bd6f56b8d4113fa61389576936038538a76b973811a539d0f809aedba74c641433abde82cbfd64104d5d9042801558c93dccbabadc6a63", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 9393900, - "script": "76a9143bd588b3f977087fca1c0ee4fe09eb2c6c3ec87b88ac", - "coinbase": false, - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 13 - }, - "script": "47304402207c58aa59241fd1ccc3faa49024c696092f44cc444053d162dcf303f14d46dd360220531e4f2bba40cf7b9308f8663f6758f6b20c181f06f5942856ad51d61cd71cfe01410492934785015dac92b26dbf1676ad964d0d8b663ac7758e615e3725cf35f7d603ae36bc794bfe7910b04977a63289fcbc3859c549e9b7477833a3fb57137ef488", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3d8bc0d32be4aad90d55a0de69ebe35606d1f5309a04a6ebc5cd460cdc1e705c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300010, - "value": 9927003, - "script": "76a914ba41987a903f959d2de3d2078594c7cf08f881f788ac", - "coinbase": false, - "hash": "3d8bc0d32be4aad90d55a0de69ebe35606d1f5309a04a6ebc5cd460cdc1e705c", - "index": 0 - }, - "script": "483045022063dfb505abf370433defcf8687cc1fa749ae5138e91961dda881cd9d7fce0fe7022100d7fa5f97f90411d01b9ef32e0886bcd63a93c935078b701b746efdf0fa71f68b0121028dcb75fcb1adbff78a1d01aae3d97c9a67e1f44233c71106d343a12bde28761f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "index": 14 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8904200, - "script": "76a914254c7a2b7ccf21a1d695d24559e4e10c8e78817a88ac", - "coinbase": false, - "hash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "index": 14 - }, - "script": "473044022000b812ca523a39f8432ab57117bdd70de41e4d626e86a6b080fce8712dc75b7e0220163132570bad4353fe0cfe8dfcec2019beb0a5cd155370c273166cf6e3861ea201210270167d6f017e9844ac50a6ee3ad2f3c965f86a5f2ae536da59c2696f79789947", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8665800, - "script": "76a914fe0f4a1bf09cabbbe8b67e3ce3e5216a799a680888ac", - "coinbase": false, - "hash": "39be4c5fbfddfe532179f47509f9c1a76fcc3778904114592fc5fe1206f1fbe2", - "index": 13 - }, - "script": "493046022100a760dd953a71133e47ac807afaf4d6ac331e31cd6ac39db7822a8ae969b7ebb2022100ad36d8b0d45030ba37b70c238d3164e7058c6a43b5bf93920f5a30fb55d7d29f012103b5adfa235849f84afbc02097099670f417f7a29ab475fb09ef5d6b3a03f516ad", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8891670, - "script": "76a91473f9526707d3d4ca945e28a9dff924e79050b1cf88ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 0 - }, - "script": "4930460221009e09f8ed845c89dfe2a098a036b606f851a92fdb60e77b0baa732640caf251f80221008d1fd58540dc90135b6e110d4c8f6adbdfad992d98fc6e0324324d38db96804c012102e904b5bd0d05fd5ce17f16a2090dae522a329418c1024a2c3020d38ce4d79c1e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 9 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8610000, - "script": "76a914848051d8c354909f2391cbbbfb82e9342188e2b288ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 9 - }, - "script": "483045022100c7d6366025e4fc314ba90464d8922866972d88f6ef18f7aa484d5078e03e6c1802207cf711fc7fb42821cbff6f04a5407a5d7e63836a278d457ba70db47dba14357e014104abb7facaa49b9d4c244da027bd744accea7391bd7fa7f43511ce77e8bc2046cc7d61bf67a3b3110665866aec527d2dc2b3b0514294cd8611044027f81bf8073a", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "36c30d565051fc52504406366cb54d219f1282d5e70e2253e23af6ab214c557d", - "index": 3 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 3834118, - "script": "76a914bc3fd3e093bd28ccc0214e02c12d95b2cc69ec7988ac", - "coinbase": false, - "hash": "36c30d565051fc52504406366cb54d219f1282d5e70e2253e23af6ab214c557d", - "index": 3 - }, - "script": "483045022100ac3449886974572a2d65941120f5ce44bfa9919e38d6bba161b833a62b5f14af0220234a3922354730e003b4fc15ed96196a1a8cbd685275e1e2f2b66f44aa936b94014104bb8a6a2beda4ae4153b30d5c67549c54fb88b506280bc04be1f8e3aad3c9e4cee477f03545ef04c04f3c7fac56b555a8c86f904c986604eb7390f5737f27e930", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 10 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8920000, - "script": "76a914e23ce96401f5583571dfaac21488cf4770cb999c88ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 10 - }, - "script": "48304502210097be3ef7e8aada8658d1d621e964b3aa61a7c4945e18671655761c0fc774937202203b6800885abe3e5cfb6c1bf1c362518ca2fc61f924272e6340002d5e552e80400141047170e96c720c8178047cbdf29aa1881ef164b73b67337b108cca4a1ac7aa883532e3d27d4af82fa85344544802036dc067b394a9c033f76fddb5cebc9a692f7e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "36c30d565051fc52504406366cb54d219f1282d5e70e2253e23af6ab214c557d", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8550000, - "script": "76a9148e3cfd05cb70010539c23803e4009f0d09f7b86e88ac", - "coinbase": false, - "hash": "36c30d565051fc52504406366cb54d219f1282d5e70e2253e23af6ab214c557d", - "index": 4 - }, - "script": "473044022000b5f89682b72532b3826f2f6f82a72a94951074bc88e49986e826f2bf6becbb0220433f8df9f24d9a999adda7047d908a4b2ea541e605dd22e5e31fb6ff74dd5047014104984dd87cf5ea98849bc56c3e92b846ff9b68664eaeadb1cefab3b4565de54e312a751aaaa9bea98f2ab43e83993fcf8dcc87017553caa2ed7f124edc0c9c7488", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 6 - }, - "coin": { - "version": 1, - "height": 300005, - "value": 9441000, - "script": "76a914cce7c92ad196a831e139b1ef77384695551a9d4688ac", - "coinbase": false, - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 6 - }, - "script": "483045022100e0b95596973484751e66b5a1f508474e04b3c1b5be42a092d66e5b823e36379002202ab53881251fb16ce98fa29b824120c762cb0beddb31074b30792bd5d9b6c627012103ced99cd03f47fccba4c566514b86d33c7dfdccf06fbd304027d93a25af862276", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 17 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8755810, - "script": "76a914ded117e600c9ed41be1637125b45a7bf4918818488ac", - "coinbase": false, - "hash": "ed29ed3a5ae474015b4ed1875a43acb767f68ed274b5cc64404364f737d02bca", - "index": 17 - }, - "script": "483045022100a6801d5aeca890c1c071a2586cd7095056c8ad557a44748075251e03e7b8ad3202202a5a8838b5257488de7db7de34fd458e52c4a0fb214f9ec423a454b042a4b8d1012103ee6d22880517de747467f1c5ae8e9f90f97ce02113addc7c0f9e7b434256ef57", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 8700000, - "script": "76a9146d3084a29be8e56ed65f828219ec0207172a8db888ac", - "coinbase": false, - "hash": "d69c66fad04a28f68398c16251b7eddeac01ee13471d17cc4260cdd2ecd83678", - "index": 1 - }, - "script": "4930460221009e8e83b5a8143948407faf5292af6a211fc64ac144f3197f480f2a2c1f267182022100aac5fc0c701db8c7a2a47a78a49722d6b0c33a94dd7dd131d517af80067399700121021cbe3461085feda4a6ec70b27fbbcaf5ad2d1dc850ba475addc98df520e05430", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4d301d92c7b7f47b1e2d8695fcd8c6751ad225166e71b4d96e7a0eef9bcca6b9", - "index": 4 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 9430000, - "script": "76a914b3935c5cfd20e9aec1e63e5b094ea4c0aeb3bf6e88ac", - "coinbase": false, - "hash": "4d301d92c7b7f47b1e2d8695fcd8c6751ad225166e71b4d96e7a0eef9bcca6b9", - "index": 4 - }, - "script": "483045022076e1a97d351f83e7385e1ea6839353e7403f3f01473877b6ca8cd95bd204eed20221008bdafeee92713d521013dec8b311ead492e8d752007249e6428a43cbe85395fd014104b112142efe049ca8d34ec6d3c5069860f6c8ecefe66c9b6cf7e8f088ec7c33fc524601956224994cbf90fd3f0883c09694b5eeca80ebfc25485751f90bb88580", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 15 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 9388100, - "script": "76a914da873855b7cd724638f3cda8f8f882165d199f6188ac", - "coinbase": false, - "hash": "a1d1f01f47b25c7d0fd20859f5827049c2ff3f286f6c33c67b9313c7c8e70a1c", - "index": 15 - }, - "script": "493046022100e80bf3d7a02f6a988ffd9cbcac2e204201c80c7a8e7dc0175c6c95dad29ea83d022100f55e332f8a62762da082aa2b6b19c4c069c368e2e83bea0ccd7493974b275414014104e67dcd0ce7fc404699b93e220b4b954c8447b93362799699018941246d94c11e373be7137a133740d822b829bf278d3efe238150dab8458259365eabc2767ef3", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 13 - }, - "coin": { - "version": 1, - "height": 300005, - "value": 9425500, - "script": "76a914bac12ead918508f226ae799e144154d59bdff03988ac", - "coinbase": false, - "hash": "18e353c000289be6318d719bc50852f153b91386e8356e9aac60fb81ea3ac643", - "index": 13 - }, - "script": "48304502210084561df0515dc44d5b8eb364ccd7a4cc188d0e7cb2c537a40a4bd9f8e8a1f09902205a17ba80e2cd3d9fada0cdd2602ca745eb4f7e373ede3ef9a2384296bf0ef1a00121039da94091993afc58605ddc5dd6f7734ffc0d2d687911216fdebf34fe7132b074", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "26827ec25546928dd995abcbf54b4b045509cd38dc417004698aac6fa127aeaa", - "index": 12 - }, - "coin": { - "version": 1, - "height": 300004, - "value": 9390000, - "script": "76a9148dacb0c284a9c9011b8d7cecc433f1e1fb97457188ac", - "coinbase": false, - "hash": "26827ec25546928dd995abcbf54b4b045509cd38dc417004698aac6fa127aeaa", - "index": 12 - }, - "script": "493046022100b4be4860c799df2d45fa053307b4ed1715017fcb2f22b99886eb5111bd127a540221008ce240dce95c8ef383dc539e833da5edc8326c77f7d5cf4dd44614bcb54d830d012103bfe155d769a5f5b215e6c7efeab9a5b046f477ea540998eba61d55dd28d7c804", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3824118, - "script": "76a914941648232a0a880eb9cc606a408751d34f5305de88ac" - }, - { - "value": 8972983, - "script": "76a914c12ecf27182ff7688643788d0a26d5d8785257eb88ac" - }, - { - "value": 9000000, - "script": "76a9145914a5020347b3b748688fe922a04bd3ae3cb7b388ac" - }, - { - "value": 9000000, - "script": "76a91465e15b1ad1edcf474a30415c88a72c75243e0bf088ac" - }, - { - "value": 8900000, - "script": "76a914c89d24e4466fdd585704825dcb1c28ec81fcf53588ac" - }, - { - "value": 10000000, - "script": "76a914e09338ce14ae34199ff0506fc0b9621f4e58d31988ac" - }, - { - "value": 9000000, - "script": "76a9141b3d67d86a7b55b00b7ee9c2a56413e6af220af488ac" - }, - { - "value": 10000000, - "script": "76a914ed4ebf61763643ee274657692fde0fa3c86d2e0388ac" - }, - { - "value": 500000, - "script": "76a914487ed1900678211d2bcca4e9d75056894336541088ac" - }, - { - "value": 9000000, - "script": "76a9145295e67da06250eba0041907a4299f3e45feee5888ac" - }, - { - "value": 8900000, - "script": "76a914e1a289322ba6bc2ab5e4ad73c724a86c8837dfca88ac" - }, - { - "value": 9500000, - "script": "76a914ac1229bccc7deab455b8fd844fe274740d50ae0488ac" - }, - { - "value": 9000000, - "script": "76a914cc4bc8e1700d142e00e3e4080a32d07857ce369c88ac" - }, - { - "value": 9000000, - "script": "76a9147e39237401a3948d2e5d85735a7d9fc832fcdcef88ac" - }, - { - "value": 9000000, - "script": "76a9146946e7d459aac715749b1a069ef596de262491e888ac" - }, - { - "value": 9000000, - "script": "76a914b82391f2e0ca700d4962be3070e7af605443b01588ac" - }, - { - "value": 8900000, - "script": "76a91419b6a2dbf2284adc88806dc104431922f50d8c2588ac" - }, - { - "value": 9000000, - "script": "76a914cc6417cde4f3fd78c1dd133c9a55f25469378c3988ac" - }, - { - "value": 8900000, - "script": "76a9146f194ae6212dcedf8844471aa3fe7e25955dd08988ac" - }, - { - "value": 8500000, - "script": "76a914c150f31e5bb5704bdcffa692f11f1a91f4a8ff9688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ecfdab638152d74b1f104519ac6cf7df675fb4e89e33b63983af979657e82b7c", - "witnessHash": "ecfdab638152d74b1f104519ac6cf7df675fb4e89e33b63983af979657e82b7c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 451, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "9c19aac9e2141c50c29be235da1911b65509a4743b5b0fef6e0d3cfcc5472374", - "index": 42 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 107644161, - "script": "76a9149bf2beecd50f745877c20fd07f48e28f153331a388ac", - "coinbase": false, - "hash": "9c19aac9e2141c50c29be235da1911b65509a4743b5b0fef6e0d3cfcc5472374", - "index": 42 - }, - "script": "4830450220756b1a8fc2260a4320ea4129c8f0383aa4ca1f4dbe59fdfacdbee01128a1ec58022100874ddf0ee79a736529faa4d0faec2961052d4fb8f20b0e6f9a1d372a29e4a84e012102682feb79761d9851996f626b61794dee5670cd11f05c195e19cc9103849b67a4", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 9635, - "script": "76a914be7c150acd020d354c9f6b3d430ac25a68286d4f88ac" - }, - { - "value": 7297, - "script": "76a914b0d9ea091f8cd2b6e77f0d19a4d7546b35ccbd2188ac" - }, - { - "value": 7444, - "script": "76a914a07a6f555290f1a9ab4a215862fe80bb3ebea6e988ac" - }, - { - "value": 7170, - "script": "76a914a1cf9b389c64050f338baa45873392c28e70c94388ac" - }, - { - "value": 7421, - "script": "76a914b1825c8f0ea6b95dbfb30b3c805589135235e5d688ac" - }, - { - "value": 6960, - "script": "76a914a1b68c5d49d475fba648bc41eefd43a7bb31829088ac" - }, - { - "value": 7402, - "script": "76a9144027ba767b9824c6eaa7a0e53dfd859c4ebc72c288ac" - }, - { - "value": 6737, - "script": "76a914b802c7f4a92399a03789b9dbcf0f8051707a7b9d88ac" - }, - { - "value": 6641, - "script": "76a914cfd0ec4caa74229896c4763d8ba760b4b29cc04d88ac" - }, - { - "value": 6640, - "script": "76a914e96f4690ed48ae32c4e72f582fa11cefb05bf48188ac" - }, - { - "value": 6594, - "script": "76a914e77875aac55d82adca0a6c5700925f08a43a62fe88ac" - }, - { - "value": 6577, - "script": "76a914b124f8413ed057ea7539def5f308ccfd869175f488ac" - }, - { - "value": 6576, - "script": "76a9143b5ae0170daea946ff0d75497eea640af7dea43e88ac" - }, - { - "value": 6560, - "script": "76a914447d5eab382953f80762bdf5e05b7609e0a4aafd88ac" - }, - { - "value": 6560, - "script": "76a91458414e9bd95492d5805c02596437994c55f8b09188ac" - }, - { - "value": 6496, - "script": "76a914b0b31a330127bb3c55b2d185a1e72d5ce4c03a5488ac" - }, - { - "value": 6433, - "script": "76a91417e0ede2815e4a4e73e2e1dc12b5c9512028f07988ac" - }, - { - "value": 6656, - "script": "76a9148051ef480170f5e737bdd31604bcbbfd61ab4fe088ac" - }, - { - "value": 6562, - "script": "76a914b853219eb28e67d839fa0251821548171e5b6ee788ac" - }, - { - "value": 6556, - "script": "76a91438dc8a104f7ee62be2f2e6e73ec3005a211c28cb88ac" - }, - { - "value": 107305819, - "script": "76a914ed23a91a4e082274fedfbe78cc9516811916440788ac" - }, - { - "value": 6434, - "script": "76a9146b62c92196cece151dbcda573b76314278815dd688ac" - }, - { - "value": 6434, - "script": "76a914fff5cacea9fd28f1f047e92f924186f343a47d4e88ac" - }, - { - "value": 6320, - "script": "76a914ea4efe4e01a3cde7a4d82a9c3bd74adf7bead8e488ac" - }, - { - "value": 6291, - "script": "76a9149aa262b4284e6eea7630dc945ff33acd1c2ae9ce88ac" - }, - { - "value": 6401, - "script": "76a9144e9138ca469dcced698c9b8f0fa037d28857532f88ac" - }, - { - "value": 6481, - "script": "76a91492c30a2903d493b143feeb63480bf966a0e204ec88ac" - }, - { - "value": 6219, - "script": "76a9145eb56ad59aae0e4b6d01ea1f76a951d622cbce1688ac" - }, - { - "value": 6195, - "script": "76a9143ed8007a26f7edcc2d9b3fecb2e95eda362acb7a88ac" - }, - { - "value": 6195, - "script": "76a914db6b4b323967e5eb0fb8d3b8138a7ccaa642e6c788ac" - }, - { - "value": 6671, - "script": "76a9148973dcd9e68f5d8b65529be89fb67204616b195f88ac" - }, - { - "value": 6161, - "script": "76a914806f29e273188b1b2c7c945526c58600896274f888ac" - }, - { - "value": 6131, - "script": "76a9147fb7fffb5bd54407ce796e8f4c267a9242cb889588ac" - }, - { - "value": 6131, - "script": "76a91445c58cc58967052e94e575838b82a03905b5ea8f88ac" - }, - { - "value": 6131, - "script": "76a91411274fd48a37174832afa04124e94e74535750da88ac" - }, - { - "value": 6210, - "script": "76a914aef67a5b7a22f38f78953f7d18e12ea8bb0b3ecc88ac" - }, - { - "value": 6115, - "script": "76a9148ce93cbffe228ee77fde18cbb1d5171ce608132488ac" - }, - { - "value": 6097, - "script": "76a914188648854c683901dab9b5e634aa0177bc2f744288ac" - }, - { - "value": 6097, - "script": "76a9143a03b74ee6aa11ce8db776697cdc2552d97bdeef88ac" - }, - { - "value": 6256, - "script": "76a914e0100653de4558084138109d3d9d147ee0f8810f88ac" - }, - { - "value": 6081, - "script": "76a91456f3d996274a06059161d3e518a7de036ee9486f88ac" - }, - { - "value": 6080, - "script": "76a914368de10f14c03e348b0eb2d319391285d8d7546288ac" - }, - { - "value": 6053, - "script": "76a914d2b5fbc2120b9fe285219da5e46731fb997a097088ac" - }, - { - "value": 6035, - "script": "76a914e1febcf8cf2a98c75aae0f93212d3854f3a3e4f788ac" - }, - { - "value": 6032, - "script": "76a914e6a58fd398cfbb02ec18ee88fcef108fe33fb27288ac" - }, - { - "value": 6008, - "script": "76a9148a41c5a6e31f5b6259a110bd909e2ae13463442088ac" - }, - { - "value": 6003, - "script": "76a914a987e7bb58fe3368d109fcf958a0250d4c67354688ac" - }, - { - "value": 6161, - "script": "76a91481174d2d3d7a7bfcb4e0a940167fc2a8e5873f5888ac" - }, - { - "value": 6001, - "script": "76a914fe19ef18f19cd071ab7c7fefb9ebda579683efeb88ac" - }, - { - "value": 6001, - "script": "76a91461cdd8df984b2e44e59dbc30eb50646c504a9e8788ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "01dcbe5dd8ecf909ef7e10a5efeb83bfb81c5543b3c7c5f36f18bec0a8198463", - "witnessHash": "01dcbe5dd8ecf909ef7e10a5efeb83bfb81c5543b3c7c5f36f18bec0a8198463", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 452, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "91165fb0d40be73f238dcdaff441c8adb8bd0017bdce8580349c524cdbb2ce2f", - "index": 1581 - }, - "coin": { - "version": 1, - "height": 299650, - "value": 570000, - "script": "76a914788a2c15b4412a5b8b7146c46208b53d3860db6888ac", - "coinbase": false, - "hash": "91165fb0d40be73f238dcdaff441c8adb8bd0017bdce8580349c524cdbb2ce2f", - "index": 1581 - }, - "script": "483045022100968696c9bc2f99f8e13e21de314ad97235ba04b1c07dd6e5c56eb89f745c5e53022053023dfe3921ca415b233ead6ffe33d5dc43f276d00fb4fdc74c14daba1a24790121027faef25310102ecc33292bb3f6d39bf0d7a1516e64dee69fd38e173d17442232", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0965957478d70f23c3b1733da25e12cd5d0ca41b792c3dbfc29f061cda573052", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 292390000, - "script": "76a914fe98eae8e7f86edf164129f4530a6d172a6aa37d88ac", - "coinbase": false, - "hash": "0965957478d70f23c3b1733da25e12cd5d0ca41b792c3dbfc29f061cda573052", - "index": 1 - }, - "script": "493046022100bc908785695c4068aefd92b789c097e416be00a678abab1b6991b0ae2dc18146022100e3c19940f63fe7bf93c9b841864d53bb7fa24a3057d55a144d4b2315bd1da98f01210302aaa48943d328c88adae732ccbf2d53b760d1db7b8aae76715b0570c8d4146f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1b8197a1eb87f4120298d9ce6723a449fc8b2b6891648ecef83f429a883c1237", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 299990000, - "script": "76a914fa4bc11be62b61657b2d9eb8ed1a72eb2f2cb46088ac", - "coinbase": false, - "hash": "1b8197a1eb87f4120298d9ce6723a449fc8b2b6891648ecef83f429a883c1237", - "index": 1 - }, - "script": "493046022100ab34eae14f34f10a754ad32377b2677db8fd316b2848772f9b1b65fe17f8c7d6022100a7eb7c94eda36a0864a6a788eb1b5727c64082d5ab6a09218cc31a9086b2bd500121036565544be681ff48f39c550f6e09626096be42a2f794b22df1b6b4f83b3096d1", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e6cf8e9f86d24f4e234530381c5d8e05f573fc7c72f1688dfd6db159cff5c6a3", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1900000000, - "script": "76a914501a5a003b0446f673ca64652bbc8f97aad24c0488ac", - "coinbase": false, - "hash": "e6cf8e9f86d24f4e234530381c5d8e05f573fc7c72f1688dfd6db159cff5c6a3", - "index": 1 - }, - "script": "493046022100f1afe6ee7a1411cdf181f960cb886f7649c233fc4ded9ba487e6c1d6dfe7ed50022100a90149c7450901b01519111dac4834124a0c4dc086e039f734990e7dbce538f60121030e7ebef87ab46dd49b883e978b8be5e3dad6bc08f8a5f40fa5c9d4fef4c85c9e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a2ecaa520eaab3a0540d29f18f8bd897e0a69e9e256828f0e834d3084289bc6c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 499990000, - "script": "76a914fe98eae8e7f86edf164129f4530a6d172a6aa37d88ac", - "coinbase": false, - "hash": "a2ecaa520eaab3a0540d29f18f8bd897e0a69e9e256828f0e834d3084289bc6c", - "index": 0 - }, - "script": "4930460221009ebe278d1090fe35cb25d207d5ac6107a3b65b98bdc101b84bcc3dac088a7f300221008def6b1d4316c712a3eac9a746cf9996a351a07c13a820152e3dd61498afc19901210302aaa48943d328c88adae732ccbf2d53b760d1db7b8aae76715b0570c8d4146f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 1212 - }, - "coin": { - "version": 1, - "height": 299989, - "value": 7070000, - "script": "76a91457f040629f0524dd9c257ce3f33c6a23c7800fa088ac", - "coinbase": false, - "hash": "10cfc6dcfd365ece95344732428e7e4ae766109c2ac951e52e56d81291d647be", - "index": 1212 - }, - "script": "483045022072c665c25933baaff6b738ebf5d098152381487dd4b79da135028fcf26664d0c022100a939b4ffc670b3fbd423872ffcde35e24e30ea804b1294dd29528b7710a08fc5012103fd125f758e6fa962b2892fc227ad5488b22f55d4caad3561c76af53c67aa4fe6", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 3000000000, - "script": "76a914a2b1a9a16ecea77d759328b341d2592cbb13e52688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "ff067e8ed0672b5e6716962a8a839176d8c560682ec0f5cf760e758ede442e59", - "witnessHash": "ff067e8ed0672b5e6716962a8a839176d8c560682ec0f5cf760e758ede442e59", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 453, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a4c8d3df2f6721f1c8ca94c166fd98603e3c0de0ed38ed330e41238750329644", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300018, - "value": 1000000, - "script": "76a91426ed9f1c595cc832f71d154652959f6acefcc36b88ac", - "coinbase": false, - "hash": "a4c8d3df2f6721f1c8ca94c166fd98603e3c0de0ed38ed330e41238750329644", - "index": 1 - }, - "script": "47304402201972fc1d5944c2e61130657dd80099ef198910a6d163eaf602d273d85c5c15b60220482ca2b42bdcd9196e980aa0f59f709b43d6f9b11c31bf11be7307bce1e6001e0121026816a2ca1636207359b00727dff8b1ff881230d768d9433c331c390cb570aac5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5344dd988383e9a1dd65cb7359f3dc723299608ee2e78963a9b9d24984d6534e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1000000, - "script": "76a914ced1e967d07a738c5136b5944dd8d7e188e15ef588ac", - "coinbase": false, - "hash": "5344dd988383e9a1dd65cb7359f3dc723299608ee2e78963a9b9d24984d6534e", - "index": 0 - }, - "script": "4730440220277ef1a43a02c0f372fe7c1c7c805b3d44c8b5e9bdeee0fa48d18684ac625da002202fe9c972c0f21e98bfc6b76180e9c5aec5f776f04ca6e21d850675959bcac057012102b86cecc019a9d88a3b01e9716a36222b743081919a4e3c8c14a0b504cfc09294", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "00eb5ffc4fc5ec74706c168f791c6162308c231cf3cb08726ebca42ad57fcf85", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299998, - "value": 1500000, - "script": "76a91426ed9f1c595cc832f71d154652959f6acefcc36b88ac", - "coinbase": false, - "hash": "00eb5ffc4fc5ec74706c168f791c6162308c231cf3cb08726ebca42ad57fcf85", - "index": 1 - }, - "script": "473044022018f5f3b75092538eeb473cf97efad0b119aa920df5494bd81c899bfe2717afd8022035d9a0599cdc2eaa5521664c9450785ec0a5748570ccc6e8d984aae3ef5dddb90121026816a2ca1636207359b00727dff8b1ff881230d768d9433c331c390cb570aac5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1501aa1dbcada110009fe09e9cec5820fce07e4178af45869358651db4e2b282", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300017, - "value": 5300000, - "script": "76a91480b2305ef0d7fc98504fb0ce5889d69da80bf7f188ac", - "coinbase": false, - "hash": "1501aa1dbcada110009fe09e9cec5820fce07e4178af45869358651db4e2b282", - "index": 0 - }, - "script": "473044022052a6a9d9079ebe62dedafe53f1bc212b239a6a13f19f5dfdfcb8668c105df0590220165c837c57677e4fcf063d168a8adc86c2cc05c55dcf6eb88c4c65506fac7442012103e002c57e67341d298398e7a394dda9c27223eb543ea97e125d47b3f2314a7bea", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "04eb05e604835e2409af9317e3787ce5e172068f45d2d6a3d3ffd30e634589cc", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1000000, - "script": "76a91426ed9f1c595cc832f71d154652959f6acefcc36b88ac", - "coinbase": false, - "hash": "04eb05e604835e2409af9317e3787ce5e172068f45d2d6a3d3ffd30e634589cc", - "index": 1 - }, - "script": "483045022100b7b388b431d0e692d08a6926523d0a708cec1b843640c31a3a9b489f9def2db70220397323c3044e50e780856485e15be41fbdfba0c2a88908b6d22b4bd369aa9ab50121026816a2ca1636207359b00727dff8b1ff881230d768d9433c331c390cb570aac5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b94a2b2b69a223cc8753243c508feb5384942587d8fa3627859a155a52d4146c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1248559, - "script": "76a9148a68f24e02ff4c829e130899095cd2f69c08a33f88ac", - "coinbase": false, - "hash": "b94a2b2b69a223cc8753243c508feb5384942587d8fa3627859a155a52d4146c", - "index": 1 - }, - "script": "483045022100eb7bb0cd7211f5059d57f1149ee9976c4866c1e46ad7ce8911bf123c8568145702207ccf204789366399c2402ca182ec3e9dd20153f134db1cffeca4434ac5c2733501210240f8025cad3ee151fa240fc4249523672e5c95b11cfb41ed142bf94b4ee6140a", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 9990000, - "script": "76a9147a1b8da395daa85e92d225af39be2e96a46c645988ac" - }, - { - "value": 1048559, - "script": "76a914efef738305ff7300847b015b2da078060c21985088ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "2c9e8d2ee2316ed2c4ffccd293a9c4a901a00fd8e42ed58eccb19cfe7b1a5939", - "witnessHash": "2c9e8d2ee2316ed2c4ffccd293a9c4a901a00fd8e42ed58eccb19cfe7b1a5939", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 454, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "0395aa85acc26dd67638ca29699e48accb2f9a462a6167c24bdb56bdee11fc2e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 552828, - "script": "76a914256ff8926dc10fff15104b09ef3ac8993f02a4b888ac", - "coinbase": false, - "hash": "0395aa85acc26dd67638ca29699e48accb2f9a462a6167c24bdb56bdee11fc2e", - "index": 0 - }, - "script": "483045022100ba4cc19d55dae1ffcb2e70de7848569a1f36ff800922bfd0f0a5b235b215aac90220148ad9019f9957e3b47d736eabe1d859b6871f8c91fb1382dcf973ee7af1004c012102e584fa8bdc74926dc57319358660a29b99c978ecf97eef719957194317e15354", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d06e2909ee4bb942e522fabb4408bcd81120c8f2c63c4e27fa51bc0aab0f76c0", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299992, - "value": 2198000, - "script": "76a914ca59a9767351c39419dd851f184f67aef20596a388ac", - "coinbase": false, - "hash": "d06e2909ee4bb942e522fabb4408bcd81120c8f2c63c4e27fa51bc0aab0f76c0", - "index": 0 - }, - "script": "483045022100e1c74697bf150e27879e1d0cd3ca1b76e71b988b489bcafbc79ba52447b28811022053d1427745e2ad0d7d39d90286701486f64e28f2ae427b5ef4a764302f41e843012103b12d06d98ee67b31a9ced405a13bd4a83a8de9b632b44e4b5a7adaeba4911ea5", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0fa41edf0c90665760b4fde94a3b1cbaa05e8bb74cb41c75c184a1043055d15a", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300014, - "value": 220994, - "script": "76a914379ce0d3e540dce19e26d4967b0305e4708cd53d88ac", - "coinbase": false, - "hash": "0fa41edf0c90665760b4fde94a3b1cbaa05e8bb74cb41c75c184a1043055d15a", - "index": 0 - }, - "script": "483045022100b2de269da17b81e9b1b148b6f8186ee65bd140cc50c06942f78eb39965cd583a022045638f025dc8b8136ff6acf04de539880643bb061fbc1f5769f6b4d57791ae05012103e8b85496e760c32f21c1e83b680c5238846170af383a718f346f5d5379ca1a2c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "61718d5452c51df8dc5e0db2f61b3f9c648ff5977a68f9a96a7cb78eec42fc97", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1029522, - "script": "76a914361c2dc2b7a39ddf61a30316fb0b76456831939888ac", - "coinbase": false, - "hash": "61718d5452c51df8dc5e0db2f61b3f9c648ff5977a68f9a96a7cb78eec42fc97", - "index": 1 - }, - "script": "47304402203bfcf202f1985f7b1107d05e9be9d93e5392c92d64d4d0c0526caebe8151147a02202fbef239e77c58d1242c6e1f1ec79f746b589ce053ee5b19704cfc6c568d98b40121032f468d92e69eaf380d458804a8485e3d09d8573f586c33db94ac7c30d54a1221", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3edebc87178bf3b959242ce3025bdc3fe4da6b3dfb3358368ea94825ed04ba48", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299998, - "value": 1030160, - "script": "76a914548af4fbad50c3f48765745609f83b83871a653688ac", - "coinbase": false, - "hash": "3edebc87178bf3b959242ce3025bdc3fe4da6b3dfb3358368ea94825ed04ba48", - "index": 0 - }, - "script": "483045022100ed578ca09064346551e8124fa24abd44f5fe18bc635b886eefe56c95d2d5dc5f0220654e12584acaf0007c6566419a6d68d1860b3f2ae8e50dcaa68e90840055b47d012102aef097b33961cedc6bced566f670095fe3499d9a6bd9f80668a979e8ce24740e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a13e7d82dbe17dfecd5632117ebe90cc4a0799fda1feddfe437ee4f4a8ac59cf", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 1020282, - "script": "76a9141c63d046eacdf9800ded7473c88f1c6cb73970c788ac", - "coinbase": false, - "hash": "a13e7d82dbe17dfecd5632117ebe90cc4a0799fda1feddfe437ee4f4a8ac59cf", - "index": 0 - }, - "script": "4730440220395e9f1e13efaa7b295d75e8de56abc1de6ef9c09fc62097744560df5a8679cc02201221a7cfd59390c202ba109d8d5c2c5fda496feeab3ead1681cc534b60f8bb0101210290b2caaa47cb7dc9973db0b898df9b69545aa73ec28552353b82dc6b7a83a6c5", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 5038800, - "script": "76a91459f5b8447f63287fcee0a11d8ec41df1ee8cebad88ac" - }, - { - "value": 1002986, - "script": "76a91437d27ed6bb6c66920bd75b4696ea16fb3679957b88ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "a598fc81415c72ac00bb52ea2fce4a0919caf39ffea1ccc098b6ed020754fcd2", - "witnessHash": "a598fc81415c72ac00bb52ea2fce4a0919caf39ffea1ccc098b6ed020754fcd2", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 455, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "25e5206c6f34c5caae55499a44be2b051eec3bbdde65b888ac5bb0b63ee6e19d", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 1003372, - "script": "76a9140807483d1ef110a22846946b5d31f7c7a0ea8de688ac", - "coinbase": false, - "hash": "25e5206c6f34c5caae55499a44be2b051eec3bbdde65b888ac5bb0b63ee6e19d", - "index": 0 - }, - "script": "493046022100d195a67b4dd3f3f2b91ef28cebca82c9cf1b4d77b977612b435f253a4dfb97ac022100803005b279240f5007307a8ec6b5ba252a39565ab8f39eb4a544a34eed02e335012102f894cbc3cef6689f78bddc51deebcd5da5e716d45e45804b2c78822f79a7da6e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5861c6a5593dec0bfecc487ac5ff9ad7f852b75bce7283caa7512639e5752a04", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 28000000, - "script": "76a91493ed6b848575ccfe0b7efe67694f02bc17af79a288ac", - "coinbase": false, - "hash": "5861c6a5593dec0bfecc487ac5ff9ad7f852b75bce7283caa7512639e5752a04", - "index": 0 - }, - "script": "4830450220565890210cb5861e1514e5e4f4e79b460f1ba54513585eb8e06fae8e73bfd67e022100862beec8efaa81be3681553868b5f96baf3bc4d483a0262e08f3fdfc4ad810110121029e11b2312d99ce388be72bc6b0a736dc7d43408a5159a02c9323f45cbb432079", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f38e4348d2da3ea00443975bf018772a72b58b819f31cd50f2f92ca27c02a925", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300019, - "value": 1041061, - "script": "76a9142e426c478548e2ab91accfd5d8b3e458eed381c288ac", - "coinbase": false, - "hash": "f38e4348d2da3ea00443975bf018772a72b58b819f31cd50f2f92ca27c02a925", - "index": 0 - }, - "script": "48304502203b029faf3d56eefe8389a63e2dfeb12df41c4b65debd19d3d00c6471a60b32010221009a1c34dbbcb190fd72a45fc8f04d52aac77dfd21935098f49977b021d784a7ff012102d70c55a6df30dc8dc8d7efc749ccf9f5fc5a96cdf5fc3f5ab53414f24a85289c", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cbb47d4dda28db32d83872a13890a802db1b590a08189842199c79960bcbff7c", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 368374000, - "script": "76a914a453ac43e2da54a878c3dad284baf79d0903250a88ac", - "coinbase": false, - "hash": "cbb47d4dda28db32d83872a13890a802db1b590a08189842199c79960bcbff7c", - "index": 1 - }, - "script": "49304602210099874ff52b3f0d5d4182eb624ab5431d6ab4449874bfa27efc1c4f31c27f295902210098f07d8310da2bb4aa22891a7a8fba7e056eca4ee9098ffa325f3325a6cf9706012102a682b158e3363f4724b18524fd2c75036b1d4609f87a8322d084f88537e5fe6e", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5944a82d22f033a74596683c59a2e85ee9679c7a9bcffad856a90a4da2df0aa2", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300023, - "value": 55327699, - "script": "76a91499d7589337a2c0f88f2f9f8ed37935ade01c8bc788ac", - "coinbase": false, - "hash": "5944a82d22f033a74596683c59a2e85ee9679c7a9bcffad856a90a4da2df0aa2", - "index": 0 - }, - "script": "483045022057d260058d647fd2d8fa26a7f4c8ff9585b90216aae9bfcd215a93fb4f8a08ca022100d6832d47185def9a120741aa829373658eab3bce65d009bd4c499a21e0f3ea7a012103417d38c77884e1b779346fcf8f2d632aec96deb5f658bb9e5317715cc3a1d097", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "efcc16d0e5bc34c13ee7f8f1e66745908eeaa311b88c5980d1942a02bf1f4926", - "index": 0 - }, - "coin": { - "version": 1, - "height": 300024, - "value": 47478618, - "script": "76a91419dd54979c0c46a2f79a02058c6b079a432f2ced88ac", - "coinbase": false, - "hash": "efcc16d0e5bc34c13ee7f8f1e66745908eeaa311b88c5980d1942a02bf1f4926", - "index": 0 - }, - "script": "483045022005b95d3482901ac3f412a81b02acd8182fdfd3388375cd688b1ee316da5eb0e0022100dec67ace0612e9c2daec68da5ede7e1525398dc896c219848a76e21fb063dc090121032cffdcdb663b51bfcd271e1423ee462528d21912f8fe9373b55566aa4b4aaa42", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 1214750, - "script": "76a91478f59f038ac60e9b75b5d4064948b0c70504257d88ac" - }, - { - "value": 500000000, - "script": "76a914b198c8d267a0840436bfb076ac0e6ca1ede09d1288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "b48e235cec32fcdc66e9d5d04ec94756121aa5b48acea1f541e6dccceb94375f", - "witnessHash": "b48e235cec32fcdc66e9d5d04ec94756121aa5b48acea1f541e6dccceb94375f", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 456, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "22e3c397082619aec359f43832a1f4cf47eec80ace5890bb823bc684b6b36283", - "index": 6 - }, - "coin": { - "version": 1, - "height": 206706, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "22e3c397082619aec359f43832a1f4cf47eec80ace5890bb823bc684b6b36283", - "index": 6 - }, - "script": "473044022007c523b0d3547cef97f4652db5463d134c8c70bab253c6040adc1fec5cda096c02201be3eba405aa355fb3095acea3897592150a5ccf387b2333ded7ba3fa8f944370141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eb697c500751d364686dbb1f89dd14c44369a6b5ae43eede89a6ba2ae13c649b", - "index": 3 - }, - "coin": { - "version": 1, - "height": 205330, - "value": 32000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "eb697c500751d364686dbb1f89dd14c44369a6b5ae43eede89a6ba2ae13c649b", - "index": 3 - }, - "script": "47304402204243512549966608932099cdc8a4575940f3165e330621f6ad1a660fc18a661b0220340b93054dccf1ac9e1735a7e066318c3fee7b88ffd9b890931271b9f8d2854b0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b54536ba5539449e2b537a6b859bffcd75e6e491d3193c4fe7d128dfdd02e30d", - "index": 23 - }, - "coin": { - "version": 1, - "height": 205560, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "b54536ba5539449e2b537a6b859bffcd75e6e491d3193c4fe7d128dfdd02e30d", - "index": 23 - }, - "script": "483045022100c095343dbdabb326782efcd031b1b60de60d42d9d98f86c33225d02786a6ccee02201e5a1803ec659f82ec1a8638df1ab4b7aa7ff17ddd4b7fae07467d9cbc0cf76a0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "231342b6f9cf88aaec43f5ca338895acfdf87c74455469b3f28d577b0944ec2f", - "index": 8 - }, - "coin": { - "version": 1, - "height": 205330, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "231342b6f9cf88aaec43f5ca338895acfdf87c74455469b3f28d577b0944ec2f", - "index": 8 - }, - "script": "483045022100a7b20e1197d7a3419ec807786cc94b7054053b0a6e6a0f5f229bd883c71cc246022010244b74bee6047e8332f181901e6fb12db17bcc7e83583176d71a03d2d7bae90141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f797e85863c990f734e6c3b66a7616d53ae0c7433ca4925e3aeb44952ac91f43", - "index": 21 - }, - "coin": { - "version": 1, - "height": 205024, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "f797e85863c990f734e6c3b66a7616d53ae0c7433ca4925e3aeb44952ac91f43", - "index": 21 - }, - "script": "483045022100eb949cd857ba124cb8530e60f341cdea24fe1194151f1dad272d9d0dbdd9e4f9022071c9526b181db4b7439ea7db2d34d5fa96391e48564663551b699a0d8d7056cd0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1edfffa4e49aa23925a57abe83a20b8a7c1679dc68d3e1ff0ec62f877252697f", - "index": 13 - }, - "coin": { - "version": 1, - "height": 205022, - "value": 24000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "1edfffa4e49aa23925a57abe83a20b8a7c1679dc68d3e1ff0ec62f877252697f", - "index": 13 - }, - "script": "47304402203eeae3582517a3c008539f481bf48c4bc0248f4df60a6972d07b274e810296b5022038e16eb5eb8dc57426f7d72c01124b515e856019f49fa5fccc61453ae8ad9a490141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d442aed0d81da0353fe97a77fe11684b182871c2690cae866029b33437382342", - "index": 20 - }, - "coin": { - "version": 1, - "height": 205862, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "d442aed0d81da0353fe97a77fe11684b182871c2690cae866029b33437382342", - "index": 20 - }, - "script": "483045022100f4d78bdd125b72bcdb21d54577e258bddec04e85b5fd6d1dc80f096fd34e450a02204b1e20f87ec3d047f6f3fee351d4b4bd42ff7aa3ecb254865d8d66808a1f6e140141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b85ec6722a4e0f34a621b0380b43edc8fe44c18b68f2e2a7e7e61e0990609ee5", - "index": 16 - }, - "coin": { - "version": 1, - "height": 205022, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "b85ec6722a4e0f34a621b0380b43edc8fe44c18b68f2e2a7e7e61e0990609ee5", - "index": 16 - }, - "script": "473044022014096683b525a40e0f2b1c9616317e6391da43bc06e8ff197201fe38bb624e65022040affc1cca4ef06cb4a72084ae60fae2944b17b92e28efea581b2c661e2fd99e0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "893d7a5c6e30c8447b14dc053873ecebcdfb3a37f142bd25eb0381dc496d0251", - "index": 196 - }, - "coin": { - "version": 1, - "height": 205628, - "value": 12131, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "893d7a5c6e30c8447b14dc053873ecebcdfb3a37f142bd25eb0381dc496d0251", - "index": 196 - }, - "script": "47304402203014dc3efff1f9ce8b9a779c3b5f3ed507b5a60965d43a63db21d5dd1ec3fc4302201a4992024de5988ea6073b73dad4d4199e3a61ef6d1caf5f7448d21185dccec20141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ed4a7789b249d38b1b2f1b4da0f0071362579414800af17248deeca679868ced", - "index": 14 - }, - "coin": { - "version": 1, - "height": 205159, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "ed4a7789b249d38b1b2f1b4da0f0071362579414800af17248deeca679868ced", - "index": 14 - }, - "script": "483045022100b17d8df246554797adbdd822f0dca794b9772592288c0d67982a9f81e090d02e02202f8ca5b484de4bd862eb69bfd687b3f3666b556ebcbc5b9987d3ef1a76d8a98b0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "92c5162cfc4b3837f125c2f1761557f9271d3b6fb6c99e94fc244256de91b5bb", - "index": 2 - }, - "coin": { - "version": 1, - "height": 205557, - "value": 24000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "92c5162cfc4b3837f125c2f1761557f9271d3b6fb6c99e94fc244256de91b5bb", - "index": 2 - }, - "script": "47304402206de28bff459d8085dfe93b8dafe1bd8a91997b8b7b16afbe5a81e2f81520931602207f9077fa5bb76a1ed17d1b881917972931f21dd91e2dfa08f7236bea718bf3580141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0674e9c9c3fa61d2670ec05a080953f06a9e7dc78063446fbc83a192b89962a3", - "index": 22 - }, - "coin": { - "version": 1, - "height": 205060, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "0674e9c9c3fa61d2670ec05a080953f06a9e7dc78063446fbc83a192b89962a3", - "index": 22 - }, - "script": "483045022100910d7a8c358c5651fd741d53db06d9a3950a13a3289d45b40b2cf9ba722acbdc0220367efcb186e14f49e61d10e35edd0077c9c9c0ff0328a4aea6d4268064b4a0fd0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "75d76f0382e480ccd2618c6acf0f70df766af3b39197ac9232ab0c56a35f83fd", - "index": 27 - }, - "coin": { - "version": 1, - "height": 205064, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "75d76f0382e480ccd2618c6acf0f70df766af3b39197ac9232ab0c56a35f83fd", - "index": 27 - }, - "script": "4730440220250f8703be9c98fa5667eccea47af04b6ba63d8bce0a78d98aee975606cb5e140220465e2ed49f56c3cf497ed2a948ce88e59b4978b74e44c00394dccd84022ce5b10141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "42225fbf3c170475009ade328305b62c6893dbb72f4724d66a70cbe42a5928d2", - "index": 30 - }, - "coin": { - "version": 1, - "height": 205862, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "42225fbf3c170475009ade328305b62c6893dbb72f4724d66a70cbe42a5928d2", - "index": 30 - }, - "script": "47304402206368d052aed1e578f0a125862561d2517bf06191d1817c2b4e925798fd92406302205b0052cf2be3bec6379abbb0c35e42ae9712838373357f12b6e6f19b667051a10141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c3f9b8fb02e2d0322e10a3ca2c3fa58742b2f31c71d2e588317877b4bc097f37", - "index": 20 - }, - "coin": { - "version": 1, - "height": 205022, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "c3f9b8fb02e2d0322e10a3ca2c3fa58742b2f31c71d2e588317877b4bc097f37", - "index": 20 - }, - "script": "4730440220327effa2037bcd19e30e69f85c66a767c327c4f13fb3f0a5d7ded35a40ff822602202da88c0047503957a879a3c65ff8af1853e968f683a6ef43a64a334255f25c820141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d23879e84716a0afdda0d29f47147c12d2624b2e69d68ad54a97fa89267e027f", - "index": 18 - }, - "coin": { - "version": 1, - "height": 205158, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "d23879e84716a0afdda0d29f47147c12d2624b2e69d68ad54a97fa89267e027f", - "index": 18 - }, - "script": "4730440220080fd1872ab31911b163f343d8b9b75dbd3be0dac97a1c9a18059a48d101807902200a3319d0361068c690113d42ba36c929456c85a09148dea59913714d3f765c740141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cf373d4140c476f79b442ca633a3be9a2c20e7c51aeb952fd930501b9206802d", - "index": 18 - }, - "coin": { - "version": 1, - "height": 205158, - "value": 24000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "cf373d4140c476f79b442ca633a3be9a2c20e7c51aeb952fd930501b9206802d", - "index": 18 - }, - "script": "47304402202d8010ffaaebf7a6094aed1e49d2b55fde84ffdf8ec3972c5a376a6ec83f9c7f0220379b8af4f4fe70c325fb12e8ed00759ed86c33fa68f74008aaa63aba5ad1fe7b0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c97d94a0ed12928521c6c65cd28eeed76e424e039e50e32f07488eb54b615322", - "index": 8 - }, - "coin": { - "version": 1, - "height": 205160, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "c97d94a0ed12928521c6c65cd28eeed76e424e039e50e32f07488eb54b615322", - "index": 8 - }, - "script": "47304402200773818e2a7b8c45922c649ec26bfa931471bee1ffcdbad5a9696fc9513e5ed002207a0e167643102635da435794377b53a0e6eea97ffefada92fa084514518abe670141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "42210c5ce985d3c4f6fad03d834158ccc7988dac23ff7b21c8a062048bb7ffba", - "index": 6 - }, - "coin": { - "version": 1, - "height": 206392, - "value": 32000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "42210c5ce985d3c4f6fad03d834158ccc7988dac23ff7b21c8a062048bb7ffba", - "index": 6 - }, - "script": "47304402203d06af2806acb4d9de36a3a141d99a9cc40b13d7d20c21646c9512c2bbae80b1022078752213a1868097aa07586c19414fbce86b459518c0fd9104116842371c31810141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "69dc29076d44091f2b6a18ed2d345592d04f927109772f2576e56ce529dd2666", - "index": 11 - }, - "coin": { - "version": 1, - "height": 205164, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "69dc29076d44091f2b6a18ed2d345592d04f927109772f2576e56ce529dd2666", - "index": 11 - }, - "script": "47304402200e68d18ceca988aeff8f5db70483df26256b5ee33b673c571f857f74e862fefe022030bcd56c563eeb9eb794e1f4d1bf0859051ff757d987021e5b27e7bba1371e870141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c6fff5ea5d48be04a7e7be4f59c53c5a72c984db7d8d105605c869a4fbc82e88", - "index": 18 - }, - "coin": { - "version": 1, - "height": 205060, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "c6fff5ea5d48be04a7e7be4f59c53c5a72c984db7d8d105605c869a4fbc82e88", - "index": 18 - }, - "script": "483045022100e8248dcfa1b0d313a06df68c81f80f9af2f53650b8edf4f8835b44fef68b521b022067c82cc521a5b99bdfb4b5bcfe7054200fdc7953a7ba388bbe3c3d4cbcd9f4f70141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "dfa041af53750b211992ec14f6ee1f8220a1b2f3733c83eb4ff087293f88dcfc", - "index": 25 - }, - "coin": { - "version": 1, - "height": 205022, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "dfa041af53750b211992ec14f6ee1f8220a1b2f3733c83eb4ff087293f88dcfc", - "index": 25 - }, - "script": "47304402200fbee1dcfce59a12b1f6360c5a517e9f550e744105eae1c2011d1b551abd1fca02201646842cfb65f25aba53a3f8e522192134adf376c17877364ae8eef697b9e6a30141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "deb87e284bc1de2c08b35d10f8e4df9d377959ea35c75be3bf796fe1fff319a1", - "index": 209 - }, - "coin": { - "version": 1, - "height": 205120, - "value": 10996, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "deb87e284bc1de2c08b35d10f8e4df9d377959ea35c75be3bf796fe1fff319a1", - "index": 209 - }, - "script": "47304402202b6ff401dcdfc59eba3ea51a05504c5e5adba72cf2065dc9ca3b52c079c7e0ec0220264585e0bca49354f1fb04cff09ace792475c04443c88a85d08d5b391d3b48350141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cf15c9d1c7b75866857d717d268cc21f8b3d7cf71cd449b9f2981fc3654492be", - "index": 11 - }, - "coin": { - "version": 1, - "height": 205026, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "cf15c9d1c7b75866857d717d268cc21f8b3d7cf71cd449b9f2981fc3654492be", - "index": 11 - }, - "script": "47304402201776e8f21ad04eb4bed3efe40cb97e576f231eca214e6223db8a37efb320b41a0220443c38b517e1f6ba4d845123e6439843d37cee7938cc1452d88ba6ac43a1b9c00141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "32b71c0bcf70e455aef9dffc058b655ba34d6c8405db5820476afb967eebb8d9", - "index": 16 - }, - "coin": { - "version": 1, - "height": 205160, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "32b71c0bcf70e455aef9dffc058b655ba34d6c8405db5820476afb967eebb8d9", - "index": 16 - }, - "script": "483045022100e05d8f2deb9c81de2433ba1617b09dc5ea2dc1b21d9f4de9cb5557864056365a02204963ae3f428e5d2800ca7e90799a53eb51d70083a1b832c93087bc8bdef6b0180141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "601a1e9c595907d0ed45b107318b84ee4cae7e7b54c439d76b5bfc8d014bc37d", - "index": 21 - }, - "coin": { - "version": 1, - "height": 205024, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "601a1e9c595907d0ed45b107318b84ee4cae7e7b54c439d76b5bfc8d014bc37d", - "index": 21 - }, - "script": "4730440220428b83476619fce41e546578b6281221d92df69646eb593712de934a38fab41002201f04c0193a4c045c5ae528d35d9e4b76eabed4d7c41645bf141c06a01c36ba220141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "44785b3a7a5125517232919e6e69596f784ccd7cf45544ac651661479fa760a6", - "index": 9 - }, - "coin": { - "version": 1, - "height": 206394, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "44785b3a7a5125517232919e6e69596f784ccd7cf45544ac651661479fa760a6", - "index": 9 - }, - "script": "483045022100a9bf74b868f05c027e799b69f9ebaabeffc8a6e66d126e6592659604e2baa45602207c1814e6c9c44240ecabe455c8edfc66c5e4ecb6387d53d43df53c620db120ac0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "60dbec09c993ec2b0ac14dddee6d64ab35e6eac50966ad364a738cc9fdd9583d", - "index": 18 - }, - "coin": { - "version": 1, - "height": 205024, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "60dbec09c993ec2b0ac14dddee6d64ab35e6eac50966ad364a738cc9fdd9583d", - "index": 18 - }, - "script": "483045022100e2ea80e871131ad0b11bb19c41887ae309f9e51a2b8d10797602a29a66d48b5c02203518820f6e83aebb64d64517157be835646511826c21597088ce573002cca3390141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ae58af9ad4eb4c587aa5bdad883d7f22e94db3137e08dac85f00b68076bad28", - "index": 20 - }, - "coin": { - "version": 1, - "height": 205066, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "6ae58af9ad4eb4c587aa5bdad883d7f22e94db3137e08dac85f00b68076bad28", - "index": 20 - }, - "script": "483045022100e86873ce256c590c2461efd97c51e0d9c44f7970a34ef913d3a0b9566bf16f3902200c9d84c3f5ed7ba448779de664fee8597714f6c1206d15d3ad6c16427f30220a0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "18207712d944018cb280a69f06d262568649fe0a26cef11a96fdaa10ec14bd77", - "index": 10 - }, - "coin": { - "version": 1, - "height": 205330, - "value": 24000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "18207712d944018cb280a69f06d262568649fe0a26cef11a96fdaa10ec14bd77", - "index": 10 - }, - "script": "483045022100a79cd1a443625fc860a0f05c893c0f419c3ed126334f7af36fd9232ddf942bba022033f5c9bc360e873be74cef0c1434a028ccfe6742f27b15f490beb5f35a37d7b10141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "60ff2b3ba309339bbe4649bd03c0305378b5a05fca1d639297a13037e0f4f282", - "index": 4 - }, - "coin": { - "version": 1, - "height": 205163, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "60ff2b3ba309339bbe4649bd03c0305378b5a05fca1d639297a13037e0f4f282", - "index": 4 - }, - "script": "47304402207f0faf41d73986962e187b83cd70c3f9079643fe049435059d420e70ede7d70502205452919cbd7239336876fea14ab82a3a5f23d04903da5c5fe49fb832e96664d40141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ff708f554729358c910afb7087b2d91fc7cc294f8d23bbcd9eb1a224ab2c8cd", - "index": 8 - }, - "coin": { - "version": 1, - "height": 225748, - "value": 16800, - "script": "76a9143241807a5bbf2c602d43dc5eca3a8e89930df65088ac", - "coinbase": false, - "hash": "6ff708f554729358c910afb7087b2d91fc7cc294f8d23bbcd9eb1a224ab2c8cd", - "index": 8 - }, - "script": "47304402207669de0dbafbf0688c959e4e9e68ed7e238296c0a5d2e1858f51af6a9e78f0ba02200acadff50c320f22acb8d60918c5d14e8954c342afa7ebc8aaf55e8e46db3c4a0141047b9b89fe1b2232ca86a5837e059f9c886b5e0c46270b5f150314dcf4df199aa784dc3f8d25b576596fb1a21044b14f518bfc5a15d2eb06fc391333c1dd17625f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f245fbfc6e8df66856c7db240b63f495e6f2e07b9c87f664d312685c96cf473a", - "index": 5 - }, - "coin": { - "version": 1, - "height": 210001, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "f245fbfc6e8df66856c7db240b63f495e6f2e07b9c87f664d312685c96cf473a", - "index": 5 - }, - "script": "47304402207b38353d594412ce1b61951a8149bd696ff1d5f8b4d5edac3cc7ccaf6a4901c70220304096b198f334d5b72d8d3dd33b09b6044b353c9a01c80b7956ffda9968d4fa0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1a80927d21a62a36a9e82d7945cb346585a8bc5c1f521420827d70f26fd4353d", - "index": 25 - }, - "coin": { - "version": 1, - "height": 206135, - "value": 32000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "1a80927d21a62a36a9e82d7945cb346585a8bc5c1f521420827d70f26fd4353d", - "index": 25 - }, - "script": "483045022100d31180330c1205e4ef714ad6c68dd43f8161249690287ed02deebe1330e1127b02200a41b91c34ddcd50caf13354c4e61a0fd62c384582ac7aad53a6ffca0c23c2540141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4a2a81a433698672af0dd2cf4b8481580080e975fabf4e5d26911e4aa7fc8299", - "index": 27 - }, - "coin": { - "version": 1, - "height": 205575, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "4a2a81a433698672af0dd2cf4b8481580080e975fabf4e5d26911e4aa7fc8299", - "index": 27 - }, - "script": "4730440220267da9b63ae62f8dc06038fb2da04adb47e9a2cb87cc0aa54e9f939aeeceec3c022059cd90b914caed493e842a1f7560440ae9acb77e58289a4398da0a874d0028e40141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9d83521c0fbf1d3e20d630cd94f32af7a17c732cca295645ed9ae53cf3b5e7e0", - "index": 37 - }, - "coin": { - "version": 1, - "height": 205066, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "9d83521c0fbf1d3e20d630cd94f32af7a17c732cca295645ed9ae53cf3b5e7e0", - "index": 37 - }, - "script": "483045022100de6adb755e0aab6c9eeedc01b1875f059f18fab381198a825cace584cf34d4a1022035795487055c14e45be965fcb00aa45f3246a9a9404bae2e06b3a40d6e6757fc0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "41be5127277577d6f3976189c53e776f17ac29b797e90e52173a44345216ce3d", - "index": 3 - }, - "coin": { - "version": 1, - "height": 205168, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "41be5127277577d6f3976189c53e776f17ac29b797e90e52173a44345216ce3d", - "index": 3 - }, - "script": "47304402202c65927df84a0d6cf9f04738372ee605fac17bea23684642704110663797febc022032f18e93d4da7880febbca62c6e5118e3bc375baacfaf1da06fca09332cfb1160141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1ba4ae605db8b989a736b529a2a1d0dc66339e0578f71d47119b651859b34ee1", - "index": 7 - }, - "coin": { - "version": 1, - "height": 205557, - "value": 32000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "1ba4ae605db8b989a736b529a2a1d0dc66339e0578f71d47119b651859b34ee1", - "index": 7 - }, - "script": "47304402201a82c5abd90e4f7875a0e7dfc0f1798753386c446f9797a77d61198383a577a30220372392018b9fae5c6c46179afa577f27a99a51bd6de2e2c31c6c438e17fe754c0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d561adc5a0150377621da5a4f763005b697d73eeeb6c5f90837f11d86ab4d4e0", - "index": 7 - }, - "coin": { - "version": 1, - "height": 207433, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "d561adc5a0150377621da5a4f763005b697d73eeeb6c5f90837f11d86ab4d4e0", - "index": 7 - }, - "script": "4830450221009a5d1263cbe8612e8cd535762e74940870b48b28628ea1deab0630c5b382611a0220389be07b1136009c2bd17ee257cd793790985d23f2ddf7418df5794e83d2d5900141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8c672f285b78c7ea8a468569190801fe18a66fc5321ab4f17183aaeb466e39b6", - "index": 20 - }, - "coin": { - "version": 1, - "height": 206137, - "value": 24000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "8c672f285b78c7ea8a468569190801fe18a66fc5321ab4f17183aaeb466e39b6", - "index": 20 - }, - "script": "47304402200e1bcc546cfb480491f3cb40832219b5c0eb418915cb910b1a8b88ba78d45fed022009b6209df6719bc39df76dd7d07cc1c68ceea4fa071bd5b014c9d0a5820df6370141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6a1de9853b4ce03926a3a22e8189f96e9d1d60ad6d58b44fc67fa2127677fa84", - "index": 10 - }, - "coin": { - "version": 1, - "height": 205160, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "6a1de9853b4ce03926a3a22e8189f96e9d1d60ad6d58b44fc67fa2127677fa84", - "index": 10 - }, - "script": "47304402204889fc189348318452c1205b80449352d20c816280eff0029739a37f3453c78d02200df8fbbba684fd23833b05047aa9d974eb4eb348356e4ecd93b1c685c78d26560141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1b56d7c13c1b8e1865b35e3443cf2a945513d5e19579662f7b7e3efaea05776c", - "index": 0 - }, - "coin": { - "version": 1, - "height": 205166, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "1b56d7c13c1b8e1865b35e3443cf2a945513d5e19579662f7b7e3efaea05776c", - "index": 0 - }, - "script": "47304402205db32441f18e423c39f4d10d2dc4f5c2173b7d75e2d3dc98892b2ff2f6a5b66f02202f4f1a5cecb988c54591d91e3959fa448b7f549ee1a2fe31cced0a48163108e30141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a7c52079d2c2740d3e4f06f49069e9315494af6d8f6c8491cb703d76be0d5e33", - "index": 18 - }, - "coin": { - "version": 1, - "height": 205862, - "value": 24000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "a7c52079d2c2740d3e4f06f49069e9315494af6d8f6c8491cb703d76be0d5e33", - "index": 18 - }, - "script": "483045022100cebc6f93e86ae2058cccb0444c9805c90a9946f8a2b209abdc1358df491cab6202200b36b7ab597d24d8025a5b8957497e5c00efdba1fee82926f9791a917822256f0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "00022f422421d17d5e04457451f5a716c54482ee6f91f768395bcd2d22d7ce95", - "index": 9 - }, - "coin": { - "version": 1, - "height": 207380, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "00022f422421d17d5e04457451f5a716c54482ee6f91f768395bcd2d22d7ce95", - "index": 9 - }, - "script": "483045022100ec339941d8ea7c923d2224bcd80516f61b776eb0835aa2c0fcde9d726a77e2b40220597ab446ae1008bd500149e5ca9189e9acede07a06f999ba7c737a22810dd4c00141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0cc9efafbef09e9aa736c5d2c10a54027e17f874a35a09921269cea6ad25e790", - "index": 2 - }, - "coin": { - "version": 1, - "height": 205330, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "0cc9efafbef09e9aa736c5d2c10a54027e17f874a35a09921269cea6ad25e790", - "index": 2 - }, - "script": "473044022049e2bb367ca0440ead5da2b7a2c94ed85005ee3174b2d00a5299b49c29f792ef0220106bb143cbca824ee87187598c24c80fb53dcc5a336b5ede77d7a584ede6e4350141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2aa4727d1971ab0aa7d13dabf485b8a656b9a951657517384914fc33c74d04bb", - "index": 17 - }, - "coin": { - "version": 1, - "height": 206140, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "2aa4727d1971ab0aa7d13dabf485b8a656b9a951657517384914fc33c74d04bb", - "index": 17 - }, - "script": "47304402202ac3de8cc1927a42a6d4715eef872f080dcfcc2c1b008f3af9013c6dd56a721002201e5a4af8089b9a78a9647a67f161b6c08d692fe2eb3fc2b9c9aae49fc169eac10141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6da13d756302ab5e8db5fc2b4dd03c8783c2ea4429d8354332ef90c690ce5ccb", - "index": 13 - }, - "coin": { - "version": 1, - "height": 206705, - "value": 32000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "6da13d756302ab5e8db5fc2b4dd03c8783c2ea4429d8354332ef90c690ce5ccb", - "index": 13 - }, - "script": "48304502210084a6ce52ff3621487aeef7d2608f16ef83c0d6a9c866a763ee22b6fcbbb42fa30220627a683c63f8871a8402884353ebfafd848cd61e0627a4efa07c6c517a90ce020141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d2109cd3802340d05694838c06b7637fefac19a74667e550a746ce1712279a5f", - "index": 11 - }, - "coin": { - "version": 1, - "height": 205066, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "d2109cd3802340d05694838c06b7637fefac19a74667e550a746ce1712279a5f", - "index": 11 - }, - "script": "483045022100cd752d22c5696339efe435600f1ad6e295c28f67e8142ffa0cbbef73caaf1dbd0220231efa9f6d6d90ed2e3f2997ed57fb43ebb8399c4c55d43677e3511f4a4f607d0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cb578eb579a097cdca00f5c9f4efa44a624fba28b0433d1108c9f3c6dfe6bef7", - "index": 8 - }, - "coin": { - "version": 1, - "height": 205158, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "cb578eb579a097cdca00f5c9f4efa44a624fba28b0433d1108c9f3c6dfe6bef7", - "index": 8 - }, - "script": "483045022100907a143404a9d21f1ac821bdbd4e9f0e6c22fb11e49f2607566123c465ea9eae022075846e35a69e34ba4cb24975e1009dc05e32f9d5890980de871e127e4d2c28de0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cafbf70122202bd8ac523f41499bc44b09d4cf86d7c90851c23a67490e42bfb2", - "index": 16 - }, - "coin": { - "version": 1, - "height": 205159, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "cafbf70122202bd8ac523f41499bc44b09d4cf86d7c90851c23a67490e42bfb2", - "index": 16 - }, - "script": "47304402201843371a165a3936eb67c849a4d03ef4ca22e435295e327406201ef4dd299f4602203d788ebfc4c4aca654d42d3b7660e85a86edf08fc1c5acd4451e1c2a2a5f665a0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e8d72ea4a74e59cab6d8356fb9d08ea293a4d6e30b0b8cdce7e476a5914eb430", - "index": 2 - }, - "coin": { - "version": 1, - "height": 209460, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "e8d72ea4a74e59cab6d8356fb9d08ea293a4d6e30b0b8cdce7e476a5914eb430", - "index": 2 - }, - "script": "483045022100bcfa05143c3cfc479879e909faf78347092b02d9432287c26899157b4b24c94202206a2e62cbf2a54964aa9b902c62fdfda043c1446b5f74d9731e3ee0f071efd22c0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e559d263bafd438472af049b996728d2fea7cc746fb390e22ad1295978953ea5", - "index": 51 - }, - "coin": { - "version": 1, - "height": 225854, - "value": 14400, - "script": "76a9143241807a5bbf2c602d43dc5eca3a8e89930df65088ac", - "coinbase": false, - "hash": "e559d263bafd438472af049b996728d2fea7cc746fb390e22ad1295978953ea5", - "index": 51 - }, - "script": "4830450221008e0b3ff902bbc348f8bffb30a9ef686c2ad6bd88de92eae09edf2ca10d1efc5e02201f4690093e98b80637ab201ad2aff34422a9c0988325476463f570aee563b0090141047b9b89fe1b2232ca86a5837e059f9c886b5e0c46270b5f150314dcf4df199aa784dc3f8d25b576596fb1a21044b14f518bfc5a15d2eb06fc391333c1dd17625f", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a7e90b7b0b3ea5654b3efff2b2d196afa7b5822a4dbaa9e3bde1fd757c5d9568", - "index": 6 - }, - "coin": { - "version": 1, - "height": 205064, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "a7e90b7b0b3ea5654b3efff2b2d196afa7b5822a4dbaa9e3bde1fd757c5d9568", - "index": 6 - }, - "script": "47304402207449e06a446bea65e213601e0bda6d1bbd7a4462dffd475ceb2152d93e60d15802206bfcb8762f94e5176c5fee5eb33fa4f9e4e8013608830e6336260c5d03c0de280141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7eb4a30fd811bc1d33ce125c9e9f376dfda52bb2a60605e350e62f892f4e7d4", - "index": 25 - }, - "coin": { - "version": 1, - "height": 205561, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "e7eb4a30fd811bc1d33ce125c9e9f376dfda52bb2a60605e350e62f892f4e7d4", - "index": 25 - }, - "script": "483045022100f28da4a33150fe0dedcc8a6522137a13b1ffbf75f4f9c1c4ad78e413e4822fb4022079d2151b13f4407c7efd289552a7dd2bb254706e15a5155281001f49c53d33800141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2c0481913d09b25cf2110836dcf4dbc4d1f696582594cc8fa276cac602091d86", - "index": 15 - }, - "coin": { - "version": 1, - "height": 205024, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "2c0481913d09b25cf2110836dcf4dbc4d1f696582594cc8fa276cac602091d86", - "index": 15 - }, - "script": "4730440220160eed456dbd5315fef11aa31d6fdc8a77b960dc1c11f29fcf137d21d2e0cd1d02205c615e18a180ad1f8f64013d96329632e97b7d6f389ab718556d5e65d04103640141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2be4ebfa3e0de5d87c4619f1df1d91b5debbbdef0be38a58be4dabc2591319b2", - "index": 3 - }, - "coin": { - "version": 1, - "height": 209457, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "2be4ebfa3e0de5d87c4619f1df1d91b5debbbdef0be38a58be4dabc2591319b2", - "index": 3 - }, - "script": "483045022100f032bbced8cda5ca7641bfc82c344377b8fd96f5759b894475829cde6db230d102205e89e1d26562a041b7e80d4215b91f09aa426cd8dccb46ac700891dee25e20840141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "031d53d0553f1f17c73581583f4e8d08da633e9ca64b45b29ecf649e3460b32c", - "index": 6 - }, - "coin": { - "version": 1, - "height": 211708, - "value": 16000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "031d53d0553f1f17c73581583f4e8d08da633e9ca64b45b29ecf649e3460b32c", - "index": 6 - }, - "script": "47304402203f09f6a90a5a40ac0775c75bc49297196e4e781559cc179467b9e00f3ddac9580220644ac04faa52f5887353c4be34f482cc048e57bd2935f46df3a03d997835717a0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "223f0d5ce0000fc3c2c38423a097fdefe42e768754af132e6e644f4a5ca9708a", - "index": 11 - }, - "coin": { - "version": 1, - "height": 205164, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "223f0d5ce0000fc3c2c38423a097fdefe42e768754af132e6e644f4a5ca9708a", - "index": 11 - }, - "script": "47304402200700d63f3607555a5491d15e9ee17c69442c1e7b0ae255e91d40cfc1e4f325a102206260b8617186389fc07fbfd4f3e2bae3dd6b60d5312eeda9933379cad91de8f90141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "262382a92bad0e8cf33fec055f07faa1fb72bbe7871c584aa332c36c725810cf", - "index": 25 - }, - "coin": { - "version": 1, - "height": 205024, - "value": 8000, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac", - "coinbase": false, - "hash": "262382a92bad0e8cf33fec055f07faa1fb72bbe7871c584aa332c36c725810cf", - "index": 25 - }, - "script": "4830450221008640452dc020b3db077c8642f4eb71f43d7a717ad530376b3c4e41f0caa14a30022028da5e7099c998c053cfc24122ca83384cab8312b4c1b1d1a8e39fd264b3a50c0141042dc08b8891b55da2a017eaee689b9ecac10b63578d1304ebc954d09f2e881f463e91e2a38e5eaedc59d7a528d45c1a7a79b02b12e0f192bda3e5d4d119844674", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 750000, - "script": "76a91470829b3172404c5c49c572ad19f5608e0b3cd59b88ac" - }, - { - "value": 18327, - "script": "76a914ff384351395a46af9e887468b195c639fb37156988ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9d728f581941687e5109da282ab73c143345e075de9528e2030d5d3a115e6e32", - "witnessHash": "9d728f581941687e5109da282ab73c143345e075de9528e2030d5d3a115e6e32", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 457, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "61b973a54cfb85d39867551a0184d641d5cd4b969dba05cecc5763edbb840528", - "index": 23 - }, - "coin": { - "version": 1, - "height": 299835, - "value": 3090725897, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "61b973a54cfb85d39867551a0184d641d5cd4b969dba05cecc5763edbb840528", - "index": 23 - }, - "script": "483045022100916ac49ce7c238ae77c751ef9e03091d22f6e9f41493209652e316b5c3dc71dd0220281c23439723e7d69dd603f3414650089835ac90e2e7ef61191601086f1bda66014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "edf0c0fd7a55a377a6cd04b10d76a4d586ad5733cb57c30a001834778e962137", - "index": 37 - }, - "coin": { - "version": 1, - "height": 299380, - "value": 34678357, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": true, - "hash": "edf0c0fd7a55a377a6cd04b10d76a4d586ad5733cb57c30a001834778e962137", - "index": 37 - }, - "script": "483045022100fe353753d2345635624a2953d1df2acde57b4822bef3c8e167e0cc18dcb87c1b0220748238008e4955350695f1f97bd2e3894eacc29f8e7a41f3d67003a22d54beb8014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "674beeeb55742f849d93ea228a569dae07c6ef3ddf83c70bcda8cc81a791e540", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298793, - "value": 49779168, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "674beeeb55742f849d93ea228a569dae07c6ef3ddf83c70bcda8cc81a791e540", - "index": 1 - }, - "script": "483045022100949928f8c7c0eb397cb3186a6f63e65c2486b35d3f7b6d9f4bcc754cabbd62c002205a9e83a14dfe30a7d3d584574bc1b65e66ddbf4cc2e130b3bd85f313bdc0049d014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6ceca5ab62984a5ff91f4e8954294a8cfccec5f9b3d56def447abb97363f704e", - "index": 263 - }, - "coin": { - "version": 1, - "height": 299675, - "value": 1258873619, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "6ceca5ab62984a5ff91f4e8954294a8cfccec5f9b3d56def447abb97363f704e", - "index": 263 - }, - "script": "47304402206996d48a5ddeb62134c199b32ddf79d9bc2dd0648d115690c43288a940aa1fd8022024c77c18d510e82f44828dc44b5d6f647b832ded7156719606fb5b920071e28f014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "ad98340b3256c0e8a28d6b6b755ffa8f5a043720b9d424895f10c14d0537f662", - "index": 1 - }, - "coin": { - "version": 1, - "height": 299903, - "value": 6036639761, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "ad98340b3256c0e8a28d6b6b755ffa8f5a043720b9d424895f10c14d0537f662", - "index": 1 - }, - "script": "48304502210096ff8d892032848c220a444ad7433697d7273c317b1ef98d0555838181ce902e022020bf415a31508498188fa4380898062aed36a09b69708c3601d6b6ebb190031f014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 4743962496, - "script": "76a914d667915af52ec126ed143185aae90668ac31e9b988ac" - }, - { - "value": 5726724306, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "e92e8166572c576f19e831e976a1614557ed5522800f34c90653256386529d7c", - "witnessHash": "e92e8166572c576f19e831e976a1614557ed5522800f34c90653256386529d7c", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 458, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "5e72b888c2c5c350127ceb0b6b10733ce95034af04d3ab98c72f7846981e0032", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299897, - "value": 1124800000, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "5e72b888c2c5c350127ceb0b6b10733ce95034af04d3ab98c72f7846981e0032", - "index": 0 - }, - "script": "47304402206c82b78d05639b79cfa92db93c18d12210e60c5145346005f60911aefb67b03c0220154d0183f8018e45b649a3109883ede9cc819301fe9e4ec439b241e6e7c25f5b014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9d728f581941687e5109da282ab73c143345e075de9528e2030d5d3a115e6e32", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 5726724306, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "9d728f581941687e5109da282ab73c143345e075de9528e2030d5d3a115e6e32", - "index": 1 - }, - "script": "483045022100bb829732db31b9c3c0b8bb6c6d915ba1ebc8bb97253f8415f48be11302189b74022013830a68d6f70d23e1cc9689d448f1670b0bcf44d84d6673d5704e9324fa21c0014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8de8c4538c16c25a3bd287e316d982d4dd1e489a3d4b5007941156e70a789a42", - "index": 0 - }, - "coin": { - "version": 1, - "height": 299897, - "value": 1000000000, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "8de8c4538c16c25a3bd287e316d982d4dd1e489a3d4b5007941156e70a789a42", - "index": 0 - }, - "script": "483045022100c98f9e132f0ca010a701181137d9ea0917deb947adae5ce9d6164c887324d965022018a16f443ae14e0124602770991bdf5d312569495050eb88d194e929751a63aa014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9de81225c9f0dbbad5b7ab751454cff5e268cb753ff2f30ebbce12dd11b57ff2", - "index": 2 - }, - "coin": { - "version": 1, - "height": 299903, - "value": 283015230, - "script": "76a914f3de04dcf6ece03583224826d57c136ee0fed09288ac", - "coinbase": false, - "hash": "9de81225c9f0dbbad5b7ab751454cff5e268cb753ff2f30ebbce12dd11b57ff2", - "index": 2 - }, - "script": "473044022025d5f4ea2b65018a5e9e09749a1a0ff3075f34088e658ebb2a4fb0b0cce39fca02205f031e4b3acfee19fbdb1866adad4c75cbee9bd52deaec9ced3fdb9bb7d45196014104ac024e19b6d21c2b93a8dcc9f480662c6259e9f9823696a3c4fa8e20d4fc87b464ad725a91cced3b090c52ffe9b1cbd458d25349244089fee80871d1536599d2", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 8134529536, - "script": "76a914dbaf5426e9c23a27d849877ed11ca65d04cfefd288ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "eb65f914814460cff8ce7257d87a6ff1aa5b6fb6eb88c2188bf2e1ceefb69db9", - "witnessHash": "eb65f914814460cff8ce7257d87a6ff1aa5b6fb6eb88c2188bf2e1ceefb69db9", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 459, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a76f5b4e67d13aa07e3c8d3147a6209f527ffa62456f3b20e6d62d91444da914", - "index": 0 - }, - "coin": { - "version": 1, - "height": 287191, - "value": 4555996, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "a76f5b4e67d13aa07e3c8d3147a6209f527ffa62456f3b20e6d62d91444da914", - "index": 0 - }, - "script": "473044022075d3048dc8bd155c535721960065af0a950343ee59fea8135b625733482ab0be0220215fbccfcf529f74514b47f78e52b105138c7b825bbe79f35ac0b42efb86bdbc012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "70450a226ef3998b38ac1f7ff70dcb3be5d1200228d5dd451c44292182ee2c1b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 287014, - "value": 4733421, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "70450a226ef3998b38ac1f7ff70dcb3be5d1200228d5dd451c44292182ee2c1b", - "index": 1 - }, - "script": "48304502210095da6449e4bdc9993909662ec2b61c834aeae0e2a3f61dfa5b7ce1b1091f4ef00220675cc43af22bf5e8cdc11a24d85621fc4e7c8475e6976a26ba0edda7500607de012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "81e3f047dc9044f1c89fd47b7be3de7f9b7e68276b76f9ae285f561c86d62265", - "index": 1 - }, - "coin": { - "version": 1, - "height": 292005, - "value": 6906580, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "81e3f047dc9044f1c89fd47b7be3de7f9b7e68276b76f9ae285f561c86d62265", - "index": 1 - }, - "script": "483045022100a56d289f0dfaa0aa2e756a570a3458e5a494faa6547c7af7a9af42aec099ecc3022012b4d7f6c5431a98058eea0b958e6af35d1c50adc57e48e9c6b5f9a918bfaccd012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d56db9372b14789128bb88122d32b778362df4c41be6255b7ed15dac30cc9044", - "index": 583 - }, - "coin": { - "version": 1, - "height": 288149, - "value": 1233117, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "d56db9372b14789128bb88122d32b778362df4c41be6255b7ed15dac30cc9044", - "index": 583 - }, - "script": "483045022100d12b40dc9009669e83d151f12d8f260e71cd4c6d84203ea3d46bd4e34174f34f02206cc8dc4f17ad9ec095be93cf4ae9e892612b0f5c616a9d15bf6ec2ea605ad770012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a856898e91e604126ee24a45b3f9c49216f2a067a2adb3458e6337d7bb86db72", - "index": 0 - }, - "coin": { - "version": 1, - "height": 293377, - "value": 4476381, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "a856898e91e604126ee24a45b3f9c49216f2a067a2adb3458e6337d7bb86db72", - "index": 0 - }, - "script": "483045022100f25ef9b31780a37161ea7b139aa2b7dceaefbc6a53a7cefe1f1c1fadd8f59493022070d0043695d44966f8096cf6b2bf80e6191fb0dfe2fbb6c515a685e89bf164fb012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c244912c4f1ee799eb9778c0260d6c28fb7e75177ad757b03c6ed5b45c436c31", - "index": 426 - }, - "coin": { - "version": 1, - "height": 287613, - "value": 2505699, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "c244912c4f1ee799eb9778c0260d6c28fb7e75177ad757b03c6ed5b45c436c31", - "index": 426 - }, - "script": "47304402206ab761eae79651f8284dcb6085fccc081fbecf0912a3fa67abd4a6b50e95e37702202f3962f802ec4693d806c50f286f59b2f4972486ec6f55141dbf0fc5c34b6168012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1dbeffb2c8bb3c1bafdd4995315ac1e754b1822c6e9ea90e0ca664a126639a6b", - "index": 162 - }, - "coin": { - "version": 1, - "height": 287861, - "value": 1114698, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "1dbeffb2c8bb3c1bafdd4995315ac1e754b1822c6e9ea90e0ca664a126639a6b", - "index": 162 - }, - "script": "483045022100ae33640eb798b2f227592242251b099d13a49c31c8e3da0c0cdce07800c712eb02200b1492bd51a2f5056ddd4242ea450690fc6633a5d50a3e5ea418b93ac3f81176012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "db32d244c6ba7d1c8bc27ce999aad2942aeb0086a38b6113e1e1520db9cd2155", - "index": 1 - }, - "coin": { - "version": 1, - "height": 285086, - "value": 1285915, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "db32d244c6ba7d1c8bc27ce999aad2942aeb0086a38b6113e1e1520db9cd2155", - "index": 1 - }, - "script": "483045022100fcbac2ed1572f307527db77829a2e942dbccc3d6178ebd91afc4f65f9ebbb1f902204f6b2d4c22422216e1e5305dcc44b4b8a6c83b016c1bead6e454f893973c9035012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f8527acd00befd811fde0e191a45b144f2d86b32a762e21a4142e7c67f615ffc", - "index": 0 - }, - "coin": { - "version": 1, - "height": 285587, - "value": 4636135, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "f8527acd00befd811fde0e191a45b144f2d86b32a762e21a4142e7c67f615ffc", - "index": 0 - }, - "script": "473044022037ac76b34ece94f8c7c3cca5397f090dbecf1c7ead6ecd25484e15de7c11601e022045d639dbce6dab658ae37feecba515fc3a10f4bfb252bfedcc4ba6d5f673d8db012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1891c72741a99deb1200414dc73efe7543e5fa52331c3ce5387867899eaff848", - "index": 0 - }, - "coin": { - "version": 1, - "height": 284631, - "value": 1007798, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "1891c72741a99deb1200414dc73efe7543e5fa52331c3ce5387867899eaff848", - "index": 0 - }, - "script": "4830450221008e17cb1986a3585b3f841949d86747ad28166ac17e2736736d9cb341ad0bf97102202aff78fe920f317e68af3b7f366ad832c6de9beab26c8e9b9e766c951947e2d7012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "1cbe47a66de6d9aa118a3ed7d363e372d91b4e49c8d67528932acfec3df56376", - "index": 0 - }, - "coin": { - "version": 1, - "height": 288887, - "value": 46377884, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "1cbe47a66de6d9aa118a3ed7d363e372d91b4e49c8d67528932acfec3df56376", - "index": 0 - }, - "script": "483045022100986d704470b2add3f3e368cf964c391d631279205b1be6bd75df31c277e6c4ab02200d29f072fa9dfa9bbf913fa8c8cc166a4bda9996ab46dc3c77053bcc8c025fbe012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "69f1f2fd12add1f53d3ac2aadd04c51921646dcad5f4b610188bea19e681a553", - "index": 333 - }, - "coin": { - "version": 1, - "height": 284906, - "value": 1290014, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "69f1f2fd12add1f53d3ac2aadd04c51921646dcad5f4b610188bea19e681a553", - "index": 333 - }, - "script": "473044022068e171ded942bf7053f61d93f7d4a56d520387c82c2f1ac11caa765d877eab2f02201e9f1afc791d2b3259d4eae5a561497625d31fecce713ef7e28bca46ffac060b012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "46fbdaa87c59135a6eff78947b5b9b8493f02a01110e5f308f65d05b6a8c2122", - "index": 856 - }, - "coin": { - "version": 1, - "height": 288131, - "value": 2047444, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "46fbdaa87c59135a6eff78947b5b9b8493f02a01110e5f308f65d05b6a8c2122", - "index": 856 - }, - "script": "483045022100a0fa81a2d1cdb8a47f4b56d084bf393c8ea2f5daad9abebfd7cc8f9cf7afbbb502205aff0cb484e592e053b0e82d1f1a4dd812bee0205ba376266f521bdcd361e168012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e065ae78e64382cbae2b0a61def2ebda993d727e4838c2cc6116661c3c7c6a04", - "index": 187 - }, - "coin": { - "version": 1, - "height": 287802, - "value": 1106966, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "e065ae78e64382cbae2b0a61def2ebda993d727e4838c2cc6116661c3c7c6a04", - "index": 187 - }, - "script": "47304402207498918e2d7c1773fa9ebdb347572fe38336a888cee87d97f7a7e6e483c398bb022079bd525d60c01c520d61cdfed6e3a47b40b953de885df3e3f2646d42f6078069012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a8e4dcd32730580b44b14f6222913e16a58a0131fe3e8f0757a9078145fa1982", - "index": 1 - }, - "coin": { - "version": 1, - "height": 291913, - "value": 4522783, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "a8e4dcd32730580b44b14f6222913e16a58a0131fe3e8f0757a9078145fa1982", - "index": 1 - }, - "script": "483045022100a2b601faf559d2b2a42972f3d2c1117cb8bc2c4d1c1f4e746cb29f5cecfa0bf202202c7d3725802f9a0237544dbaf2aa5e4346af9a5599646652fc38a65912ed1aa0012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cbccfbf9755f89165621c55e1a6d7f2310d5b5c2c59fbb49e66ec01a6916c87f", - "index": 100 - }, - "coin": { - "version": 1, - "height": 287942, - "value": 1029093, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "cbccfbf9755f89165621c55e1a6d7f2310d5b5c2c59fbb49e66ec01a6916c87f", - "index": 100 - }, - "script": "483045022100edace2a597b685f6f048005836edc822464146b231c6818a7a1b5ac2af6bff6b02201ad31b971ebc3427a9a7691f020eec7ee5fe23b3d62f0a9ccc7ca194f885d1d7012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2b4b0644d4ef6decb470120c5ff84ec69f18d1e4b7cb896ca418bd3021fd1b3b", - "index": 443 - }, - "coin": { - "version": 1, - "height": 285042, - "value": 1157460, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "2b4b0644d4ef6decb470120c5ff84ec69f18d1e4b7cb896ca418bd3021fd1b3b", - "index": 443 - }, - "script": "473044022029b97f4490b46e26f2bc50944d7497e5fb2265680ecc7aee69492f48d6b391fc022061908f32dc22135980fcfd30012a079880daf65241b5856bb145088024710082012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4d7efe854036017daa38a3c6f71aec84e1f413dfccb003c6ba3fb700ae992a8d", - "index": 215 - }, - "coin": { - "version": 1, - "height": 287542, - "value": 1123626, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "4d7efe854036017daa38a3c6f71aec84e1f413dfccb003c6ba3fb700ae992a8d", - "index": 215 - }, - "script": "47304402200900ac2eb19d20785fba483a8da0511886ffffcf0be81d35647abd2f56f41d4c02200267b0305c5de8dd658ffa42d7387749e72f22485fc1db84ae59a5cf9b35c242012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f59684a0b67bd21a4af7fb1809caddb5fdc3f5c94bd75689bc2f779284c14a22", - "index": 1 - }, - "coin": { - "version": 1, - "height": 295147, - "value": 7003273, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "f59684a0b67bd21a4af7fb1809caddb5fdc3f5c94bd75689bc2f779284c14a22", - "index": 1 - }, - "script": "4730440220780892217c9533eb073f1ce24bd2e3c542b6b1f4448160d61953816099b7901e022055edeecd327262c8527490bf53deba6f887ebb73c84c5487acd25f7b0248ea6f012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "60af995d8c9c425f9017ff1c1369f4bf22fa6bd72814a1bd44f954e2be821f23", - "index": 0 - }, - "coin": { - "version": 1, - "height": 297519, - "value": 3857076, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "60af995d8c9c425f9017ff1c1369f4bf22fa6bd72814a1bd44f954e2be821f23", - "index": 0 - }, - "script": "483045022100edfa83fcd3177321b80eb8f8346e5997386e5bbd7d01d6e32334de92b5662e0602203c971c9d611beff44551dd32b19a5dd0fda1a16c164d5427d18fbccce29cd0b0012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "281dd418ad7b21e20510690fd87e731c3da98b26bbdaa2196068c9794648f85f", - "index": 1 - }, - "coin": { - "version": 1, - "height": 290187, - "value": 2564532, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "281dd418ad7b21e20510690fd87e731c3da98b26bbdaa2196068c9794648f85f", - "index": 1 - }, - "script": "483045022100d08421af462b84a58689a98a1713a1dbfc1804deb07573f4a70f2d2b5b7f73c3022036dbf2947b1d5837bcdd2397d3b4a33179c88ede84959a43dbf7958b2a2a0253012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "89fdc4fe30a0beae28366a4cff894e335c02c93e676a05b465e359e2f5e3f83d", - "index": 199 - }, - "coin": { - "version": 1, - "height": 288008, - "value": 2099998, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "89fdc4fe30a0beae28366a4cff894e335c02c93e676a05b465e359e2f5e3f83d", - "index": 199 - }, - "script": "4830450221009b29339d67d21881183b3097ce83521234b98bd68db49621bd8400867e07403402202ee7e6815c2284b43db983d548561a10f589f8f0703448bfcea27da690c3c5a3012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "69cdad076f0a05521d0a1c995454c3ed6e548a36271e36acd6ec64cce5bf2af3", - "index": 392 - }, - "coin": { - "version": 1, - "height": 287746, - "value": 1038297, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "69cdad076f0a05521d0a1c995454c3ed6e548a36271e36acd6ec64cce5bf2af3", - "index": 392 - }, - "script": "47304402205b7ae043886a89222531c14fa8141eba7b51849d26111f1f9cae91549783855102207aaa0f49b54d573492e7c09b409ece718bf540853f2ce6ce11bc3141e36043ce012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8dfcf65f82a78853962bdc883162a636192ccad8c6366984ae78ce2d613f2eaf", - "index": 0 - }, - "coin": { - "version": 1, - "height": 298584, - "value": 29880070, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "8dfcf65f82a78853962bdc883162a636192ccad8c6366984ae78ce2d613f2eaf", - "index": 0 - }, - "script": "483045022100b6b265c57aad880f157e3c1b6d93e68dab397b71833dd58bdd81b8bf90088a3b022061cdf207a906509c3bfe9b601aa756a7e34957eb61f7ccfe643e96ff2e8be6d6012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "157c03ca012d815cd1cc286532c36c8128833ef673515d2a1a7f387053afd6f5", - "index": 0 - }, - "coin": { - "version": 1, - "height": 286844, - "value": 3437401, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "157c03ca012d815cd1cc286532c36c8128833ef673515d2a1a7f387053afd6f5", - "index": 0 - }, - "script": "4730440220592fb7188e23811d3d2a506a7a7a20d9cdc11d6152816b03a73a26c1177059b502200b725867c2bb2e3890b32992869aa6805f973f8c375e06f4a5d9408dc514ea5c012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7aa8e651ed148b5da0ae62ba2e7f4855cabc224f4140e4f806bb4df655bc4bfd", - "index": 0 - }, - "coin": { - "version": 1, - "height": 296277, - "value": 104284378, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "7aa8e651ed148b5da0ae62ba2e7f4855cabc224f4140e4f806bb4df655bc4bfd", - "index": 0 - }, - "script": "48304502210090deaabe0dd506d2fb6b80837fec9b4af4a36742530fa1e6db20ad8b61d1653d022003b69d3df5adffe9143460e79474e6f04d624c9b390d472a5cfa41f3daf58d44012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0757e68fa1fa0da9baeea2bb4ab6def16300aa9f28b93d3fd38fdc809719b488", - "index": 1 - }, - "coin": { - "version": 1, - "height": 292417, - "value": 4244600, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "0757e68fa1fa0da9baeea2bb4ab6def16300aa9f28b93d3fd38fdc809719b488", - "index": 1 - }, - "script": "473044022011005002cd5adfcdeb97de0333ee187bf66670ffcc7b1d055ed4e8aa9eb6f8c2022044ef7a49ffb12ed763ce6c3ac9e6413d779f76f26f28f03a4856e7e866c6e86b012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3fd61798b154933fe0b707f1125cd11e3869330a0f265eae103eb1b8ff3184c0", - "index": 219 - }, - "coin": { - "version": 1, - "height": 288225, - "value": 1184852, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "3fd61798b154933fe0b707f1125cd11e3869330a0f265eae103eb1b8ff3184c0", - "index": 219 - }, - "script": "473044022003d04ec07779ba051c14fa37c10ab645267f94b9a44fa3de8f827266df8fc98b0220349681e2092b5f3c24112bad33962421adf317a9a82cfe435f2618f746a1d0ef012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3d1690324c80668601ee27b1f7211837b51c5d4ef44e3b2c94317f1435070860", - "index": 0 - }, - "coin": { - "version": 1, - "height": 290384, - "value": 2828282, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "3d1690324c80668601ee27b1f7211837b51c5d4ef44e3b2c94317f1435070860", - "index": 0 - }, - "script": "483045022100bd1aa1bc0c68a0206dfc8e774e8008f428522366012e10dc6016399d4a5e438f022060bc2e4d711eec687ea5fa8bcbecaf9356ce253928560d80e6d8808b8b0c6d1c012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7272e8bd90ba4d700b516d30c4e9b572e37af4069de4f0d653d255f2a3fdfb48", - "index": 0 - }, - "coin": { - "version": 1, - "height": 291913, - "value": 10316413, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "7272e8bd90ba4d700b516d30c4e9b572e37af4069de4f0d653d255f2a3fdfb48", - "index": 0 - }, - "script": "47304402205adef3ffbab7926135f559f6fd1aa1d486e9077adf5a396b34c6f58eee6613ef02201e9f36a867a0c848e70ca00fba1c001a3823ee3884132d9c22ace48d4fb9aaef012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b9b0824db21b439f8affe40989d00b59c60b781c2b1f41b959ae46be93234473", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297519, - "value": 9995575, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "b9b0824db21b439f8affe40989d00b59c60b781c2b1f41b959ae46be93234473", - "index": 1 - }, - "script": "47304402204a099a265e784b57981ffd80ba890e37a84acccd53c195606858bc50633024250220187c75a5dfb75b4ae30520e401e0f4b3d7254b951b1f65ee51b5ccf75fc67c21012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2b3a93ec99a8dbd7490785a96cbc5cd057ec7a0a30c56d6ecebc2c6fe1cd3164", - "index": 1 - }, - "coin": { - "version": 1, - "height": 285661, - "value": 2700000, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "2b3a93ec99a8dbd7490785a96cbc5cd057ec7a0a30c56d6ecebc2c6fe1cd3164", - "index": 1 - }, - "script": "483045022100b33c075c7183bd5b675f0130c4aee018771736f8510901c9bd4190443823934c02206c2a3ac9becff3d0ea72ee228cf1c08b9022c7d567a12356ea55a04499762bd9012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a8c25a997308004cab55886324b4d3f3bad52c853f1a2aa2bc96dad098fa8024", - "index": 543 - }, - "coin": { - "version": 1, - "height": 287706, - "value": 1236812, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "a8c25a997308004cab55886324b4d3f3bad52c853f1a2aa2bc96dad098fa8024", - "index": 543 - }, - "script": "47304402200b6cd330ee6409977d04863080b57ea0b9cc8fe568da41ec5916ed0c7c74035002203fcc6da024e84a80e1cefdf4010ade8f6bed2ec2658d17ab71b2fed5b78255b3012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "82b64ef6163b009f1c10f934bc1f2b349729d56b86ded836f94c7ed763d3e8da", - "index": 1 - }, - "coin": { - "version": 1, - "height": 285493, - "value": 3735627, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "82b64ef6163b009f1c10f934bc1f2b349729d56b86ded836f94c7ed763d3e8da", - "index": 1 - }, - "script": "483045022100d5bdabe0fa57c7659441df64823f0b8f1b4cc1a63bbcc9d1df314abef6b020230220575ff35a69e10eb3a1a41b9cd359af8b1b97c6d60596ab24f59d2a363901c602012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "08fcda5a7b6b778474e6f88a919ea7393370cab565558187395bedc65c896c95", - "index": 55 - }, - "coin": { - "version": 1, - "height": 288248, - "value": 1073579, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "08fcda5a7b6b778474e6f88a919ea7393370cab565558187395bedc65c896c95", - "index": 55 - }, - "script": "47304402201b37ff63d09ff44a006561c36d849a577be2f0e26e3c4715e90fc31590e942d50220028e36aa076c7bd68d584b381b8d1a895d884ea5b01402bad86bfe4554e987ba012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e1dfcacafad7da9bc543bc7174e4f1783dd610119e5e9d92c0dce68d45a6ede3", - "index": 1 - }, - "coin": { - "version": 1, - "height": 290907, - "value": 2361423, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "e1dfcacafad7da9bc543bc7174e4f1783dd610119e5e9d92c0dce68d45a6ede3", - "index": 1 - }, - "script": "483045022100e0dd5678ff67669830e8b6230d8233b8b8e6fc932c3fc29ec168b4e008ad5bbe022036118943a79f7617f897e5c1c9ed64f7050b37683623e9b0600e83353fae0608012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "46e3b4c917cfd1df26ed4ff95252ea2f253b87440fb683e025d3c599016b1287", - "index": 230 - }, - "coin": { - "version": 1, - "height": 288320, - "value": 1204820, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "46e3b4c917cfd1df26ed4ff95252ea2f253b87440fb683e025d3c599016b1287", - "index": 230 - }, - "script": "483045022100b80b95aca2da16e7a0ae98421859c58678e089988ce83501ee1d118dea828c110220145ae63d7711d38bd06d1a9ae4342a326e7c322168b31cd95f29ff79d8c5df86012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a90da42b6d9a34f3e3aa2927856c80ed8898f40e5fedfa590be2e4270224232d", - "index": 1 - }, - "coin": { - "version": 1, - "height": 290206, - "value": 24950537, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "a90da42b6d9a34f3e3aa2927856c80ed8898f40e5fedfa590be2e4270224232d", - "index": 1 - }, - "script": "46304302203858bfe6db4dfdda2acaf58950c7fdeb475cd83c594849089a504357920a45be021f796212bb8cbd0882e5977de92f71e065e72b6a50dffcccfb6e7370dfb2ae07012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cfe60bb39113e1988de7ce953556702c24369368dbb21bb29ba388358bcb2768", - "index": 0 - }, - "coin": { - "version": 1, - "height": 288651, - "value": 1550175, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "cfe60bb39113e1988de7ce953556702c24369368dbb21bb29ba388358bcb2768", - "index": 0 - }, - "script": "473044022063113d366e60ca569c1828e1ed3c10a253ed1cd06b74dd272e34e2bc19353d0202205d893369a1807bbf97ad24af141ab2c07d53717671783eab34bd213d59770d94012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "d65e67e295c4943a48e81f46bccf1db8bc08ac07d63d7ea60ea20c12392a773e", - "index": 0 - }, - "coin": { - "version": 1, - "height": 286720, - "value": 5274530, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "d65e67e295c4943a48e81f46bccf1db8bc08ac07d63d7ea60ea20c12392a773e", - "index": 0 - }, - "script": "483045022100c1e9cb771a485ef5cb4a6ef9b21983e40d0e933f1d068a97c45b6674401cc17402207bd4085910aa8e460a253a0a60c5f5239fd554729150a74328f999f961e95e51012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7b5759b0743c7318526be43939bbc6eb00dfbe9cd8b5cf308f47b9b58316085a", - "index": 1 - }, - "coin": { - "version": 1, - "height": 288870, - "value": 9835000, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "7b5759b0743c7318526be43939bbc6eb00dfbe9cd8b5cf308f47b9b58316085a", - "index": 1 - }, - "script": "483045022100ad20ee828657ccbf8b6ab9bb4161d0ce79717bf68852c64730f7fb890b2b8436022020de6d2f915a9dca60c339aaac7962ee122ce492c021da6b27be5695de71d9d8012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7ddd67c232927508002da4314efb75a300d31f0c83470b6f482f58a436bafe10", - "index": 1 - }, - "coin": { - "version": 1, - "height": 296441, - "value": 45494662, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "7ddd67c232927508002da4314efb75a300d31f0c83470b6f482f58a436bafe10", - "index": 1 - }, - "script": "473044022002599f6eee2e735bdb87b4269d038a4d79fa8ada0b259b0107b0b48fd039abea022036c3c5ea408f8255cfe1b9041dace25ed1979201f1014a04ee785bcf3f77981f012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "27607ed821129ccc25cd28deecc24da2673d5a58188311d516117ce771431e24", - "index": 1 - }, - "coin": { - "version": 1, - "height": 289734, - "value": 9427744, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "27607ed821129ccc25cd28deecc24da2673d5a58188311d516117ce771431e24", - "index": 1 - }, - "script": "47304402203d63b7e76f3c5c1d5cfb38b2c6748295d1be60bf5746eeb81e6a28db091e07c8022061a191416e97e8c5cf2a4d8a3fb3cb3d7f0a2249ae204e77341c09d203c2470f012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0335a014dfef66542f31c4112fd48df8f20ad5c15858641d1743a9968ea73efb", - "index": 0 - }, - "coin": { - "version": 1, - "height": 287371, - "value": 3817731, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "0335a014dfef66542f31c4112fd48df8f20ad5c15858641d1743a9968ea73efb", - "index": 0 - }, - "script": "473044022015d995804f0b949e41ebb8b3d710f8f8452d7aba844b31b230b0d0ed71eb32cd02206ad3d553eef1ff03db07d321291b349b4df84981ce01794a8e117a4b6bf3e6b4012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e86370a0c7dd3dbeda9707389fdf3b0ed610516a18514f86762db93351f667b6", - "index": 0 - }, - "coin": { - "version": 1, - "height": 288888, - "value": 13323600, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "e86370a0c7dd3dbeda9707389fdf3b0ed610516a18514f86762db93351f667b6", - "index": 0 - }, - "script": "483045022100acc22543ce450ee1fea7447676f9b7c172a657af86a5f8f2131c6561c950eacd02203a61fd249a201cea2270e4e050c7136740768e5b024a51394b7f059d0c50cc18012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "b319d2a5d237d517cf661184d121562af4ffbb529fe9fcfe5d812afd5910ba51", - "index": 0 - }, - "coin": { - "version": 1, - "height": 285622, - "value": 2112523, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "b319d2a5d237d517cf661184d121562af4ffbb529fe9fcfe5d812afd5910ba51", - "index": 0 - }, - "script": "483045022100dfe7d2382c9ffe5b71470e503a5d38411446b2e26177dac26707f71af651df3302201d131bbfa22cceb2a41a93307155e3bf1963ea29631c569fc0089c3d0443f2a3012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 400000000, - "script": "76a9146e59a226a606a6a0098ec05660947184f364cc9488ac" - }, - { - "value": 1874520, - "script": "76a91499d372febac39ddc6feb39eeb0cb25f7b3836da688ac" - } - ], - "locktime": 0 - }, - { - "type": "tx", - "hash": "9f7704a69ef678d08755f1aec2ee7d7517c4aa82525d8c926cdce523f9863c23", - "witnessHash": "9f7704a69ef678d08755f1aec2ee7d7517c4aa82525d8c926cdce523f9863c23", - "height": 300025, - "block": "0000000000000000821c4e0acc40f88bedbce3b73ba2358b5ade58a9022cc78c", - "ts": 1399713634, - "ps": 0, - "index": 460, - "changeIndex": -1, - "version": 1, - "flag": 1, - "inputs": [ - { - "prevout": { - "hash": "a5e57eaa7ea2a32dc551aa64a6bc4c56c3a5edb1ffe2cc43dd6383b67a6e7634", - "index": 1 - }, - "coin": { - "version": 1, - "height": 284079, - "value": 30503, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "a5e57eaa7ea2a32dc551aa64a6bc4c56c3a5edb1ffe2cc43dd6383b67a6e7634", - "index": 1 - }, - "script": "483045022100fd9c59cfbbf1207804d9eab9869287ed5cb55b9a429e44460b1e419b737f14e0022069d359c1a499a8bc50850b47834523489bdfa12891665659e35b70c099538939012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "180c2997aa9bfaea55e7ba9879bb8a16c0a314437fb5f2c5f2532fa0e9b852d9", - "index": 0 - }, - "coin": { - "version": 1, - "height": 295829, - "value": 1279868, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "180c2997aa9bfaea55e7ba9879bb8a16c0a314437fb5f2c5f2532fa0e9b852d9", - "index": 0 - }, - "script": "4830450221009c5a20de437f87c387cde16ff36e5af00fdd30bef134186612b3975d288c365e02206d7dab245f653534d4c86553f066aece1205d573448be392ca5dbef0bdbb36ff012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "9c2f1f3a9a18e245104a169d313f15ef19d158a2caad239c3625740feb457f0e", - "index": 1 - }, - "coin": { - "version": 1, - "height": 295460, - "value": 505229, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "9c2f1f3a9a18e245104a169d313f15ef19d158a2caad239c3625740feb457f0e", - "index": 1 - }, - "script": "47304402201d32d01bd6cfe9ec93e86c48db831471fbd32dd43226680166c7c8a7d6bda3ee02203c8c9a971954e13aad84b30b2b3ad7ed1081f03f2b571f424315f5b44fb1e8f6012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2b9d32d588bbbeddbefc8fa7c6606670c84b18967fd9fd9ed5c8152ab00cae76", - "index": 1 - }, - "coin": { - "version": 1, - "height": 298908, - "value": 3786068, - "script": "76a91499d372febac39ddc6feb39eeb0cb25f7b3836da688ac", - "coinbase": false, - "hash": "2b9d32d588bbbeddbefc8fa7c6606670c84b18967fd9fd9ed5c8152ab00cae76", - "index": 1 - }, - "script": "483045022100b766091ee720d17c0f52ae85c848100fd2468fab3f434a8fa05b1124707b4706022048f300d237322e176da9e518b0d839a9dffe8a80524e2cfd73a1e503d7abdb7a01210269c0dc33b2bde69b558783bb922c1180d4212adbd3b25ea576a14799a5066e17", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "2a1c6f1101863a8dd06785e4d3d49e1204a265260dade62e048dc0f460f17611", - "index": 1 - }, - "coin": { - "version": 1, - "height": 289691, - "value": 983198, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "2a1c6f1101863a8dd06785e4d3d49e1204a265260dade62e048dc0f460f17611", - "index": 1 - }, - "script": "47304402205947449d9f27e0e86b79b2d013c75837774118a6e9fc61854d2f1f43e2cd65390220219e77f5204c5d87efff402496587979ec798d6e36c6aef8d2ba47b3cd958161012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "c080b81cf47a295d7558103b5c7977a59eb80c0f898e2fab9300431773a4d271", - "index": 1 - }, - "coin": { - "version": 1, - "height": 292574, - "value": 350000, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "c080b81cf47a295d7558103b5c7977a59eb80c0f898e2fab9300431773a4d271", - "index": 1 - }, - "script": "483045022100cb1966f372325f1d959c31799ad0dfccc0832d7cbd8b69001c0191acb1122754022024e3201d055cb3930599f3e21b4cdf01a28f8282ea2c8b70dde83ebb903dc6fc012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "109fb0622c21e507d00fe0040e1fde1ff1dba2b928966d2e2bd4d5acf36781b2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 292069, - "value": 985918, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "109fb0622c21e507d00fe0040e1fde1ff1dba2b928966d2e2bd4d5acf36781b2", - "index": 1 - }, - "script": "47304402206664924bbcdb4eab7835a3448317af857c30cd8b36677603e06584ded050522b02204c71a1c8fbd57b133a052f9becb96b1af64d341ab3a8f00180eb3a99aabdb6c9012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "cd3892a28724541c33a7cac8b0dc2bebe3f5c64abd7bf5137a460d975694f876", - "index": 117 - }, - "coin": { - "version": 1, - "height": 290768, - "value": 2031905, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "cd3892a28724541c33a7cac8b0dc2bebe3f5c64abd7bf5137a460d975694f876", - "index": 117 - }, - "script": "47304402200b3a060cdcd0e208d2a39a8eaf04abe49e54e40b155f7cf3c5788a664c87f609022059bf6dbfd8ed83d9466d1a63c94f2d470fc91e2c2edcaea02417c3c590b7ff28012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "4b3f78b69467cf8de803675fdba4639af8bc850fe038ace812cb484624d91aa3", - "index": 0 - }, - "coin": { - "version": 1, - "height": 292187, - "value": 1358932, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "4b3f78b69467cf8de803675fdba4639af8bc850fe038ace812cb484624d91aa3", - "index": 0 - }, - "script": "4730440220569fba2a700e88c1e5505904d2ef29c22ccfc6f601765d851706997de1fb76aa02207934c7368a17d6bffa12a4b7dc41e9649382732f0a46a77605f0c3d86ac28acc012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "7ce010bbfc18bb8bb6d1ebf5c2999cbe328e756197ca2e254772ae9ffc4c1ad5", - "index": 0 - }, - "coin": { - "version": 1, - "height": 293593, - "value": 1647595, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "7ce010bbfc18bb8bb6d1ebf5c2999cbe328e756197ca2e254772ae9ffc4c1ad5", - "index": 0 - }, - "script": "483045022100bcb0e83397f91ba3ba0eb9d6ea9f2cec7c9bcdd099f1a811d12fb39afc154dad02204af16b5537a861cd310ae2d905d9949b06a9b055b22a059deb3e85b8a487e886012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fddd0ebb9714e1a1dc2d5f4e1d5175bfb7d4fba31c00d1bccdf6ccc8b09334b7", - "index": 44 - }, - "coin": { - "version": 1, - "height": 289075, - "value": 1025598, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "fddd0ebb9714e1a1dc2d5f4e1d5175bfb7d4fba31c00d1bccdf6ccc8b09334b7", - "index": 44 - }, - "script": "473044022012ce4da043dcaf77c8148a7d60a8890e4a636a6df9e17368bde7cfc5357ac98002204de66077ed0f088a8270ed85ea819ab36efcb236ea704c8f19ddc11a86849c88012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e7bfaebb6293c3cfa14bcd7926609fc52e06b11aee5068da6055db41d0287bbb", - "index": 0 - }, - "coin": { - "version": 1, - "height": 292574, - "value": 950000, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "e7bfaebb6293c3cfa14bcd7926609fc52e06b11aee5068da6055db41d0287bbb", - "index": 0 - }, - "script": "483045022100cbe547f9a9d3ab678ba21ce2fded988cb46cfac367a4a13a5ef5b35c33141b82022006371144f38d06a5dd34c6ca49a8b91b258240160d572131055ea9d837f4aeb7012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e47d0bb81472c6697cbb41607a923d0e2ce00f2b1af1a37d1fa371f45dcc2864", - "index": 0 - }, - "coin": { - "version": 1, - "height": 295291, - "value": 1295119, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "e47d0bb81472c6697cbb41607a923d0e2ce00f2b1af1a37d1fa371f45dcc2864", - "index": 0 - }, - "script": "483045022100898ace52b718946abc9db85ea295e2d0001587f02bd2415282441ae73cb415b902206f9cfa06e1758231f47a5d102dc549d9ad024ca313938f06f08d7eb88225e899012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "3d0afc6606ef0dd325fa521d6ef2ef838843b026e6461e7684c7cb86f0a0a254", - "index": 55 - }, - "coin": { - "version": 1, - "height": 290122, - "value": 1554758, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "3d0afc6606ef0dd325fa521d6ef2ef838843b026e6461e7684c7cb86f0a0a254", - "index": 55 - }, - "script": "483045022100b249415abef29e305e6891d065cabc9b366404a3b83c6e01a8844689b931d1dd02203096f1b6daf3b96df578fdc61823f92f11f291b2393a0b0ecd37fc3c4f79af71012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "e69c96036a2067824b1062ba0d8bf3adf6af189a4f68a1f7114506d5e919edb2", - "index": 1 - }, - "coin": { - "version": 1, - "height": 288936, - "value": 2005159, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "e69c96036a2067824b1062ba0d8bf3adf6af189a4f68a1f7114506d5e919edb2", - "index": 1 - }, - "script": "47304402206950d1c4a8af60c2e21bec9060119b3ad7093cb7e03707475ed838cd2b1de2fa02205862b602d1c070baf8a7b42b469d5ab3ff627de380e65863c7701ec8587f9edf012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "53c388a6c37fabe55d8f1e299c81fe6ff1ddb7c1a273f773e542746d290e9fd8", - "index": 73 - }, - "coin": { - "version": 1, - "height": 294434, - "value": 146425, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "53c388a6c37fabe55d8f1e299c81fe6ff1ddb7c1a273f773e542746d290e9fd8", - "index": 73 - }, - "script": "4730440220614f48a50ffe43a78aea45b97b38ac1f0e2cff3c71d5d675dedec1d4656dccc8022027b6be1094ac34d7fc0baa324638d9d951b0bb190d26ea1d03cd67372fec1056012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8501efa71303a974549d45bc22b7f4d46f882a2877225a2f34410384074b9cfd", - "index": 0 - }, - "coin": { - "version": 1, - "height": 295652, - "value": 1390102, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "8501efa71303a974549d45bc22b7f4d46f882a2877225a2f34410384074b9cfd", - "index": 0 - }, - "script": "47304402204780d7eb10191925bf129be1f736a598af1a640743a9b4fe00d3fa631ce5e23402204e528db4f1402b7ef65439a82a9effc6d2ab30e9ae79d664a7735d1620f88b76012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "033b4f43a449537b0bf9767bcf7423f54bf74aa0433c2482406aa50d54fad169", - "index": 0 - }, - "coin": { - "version": 1, - "height": 295398, - "value": 948805, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "033b4f43a449537b0bf9767bcf7423f54bf74aa0433c2482406aa50d54fad169", - "index": 0 - }, - "script": "483045022100916bbd6a1deca52e3c6dc4f64868945b8304fef4ac566a20924760876f36786e022043bc5a0bd083acd57e6048b419f2dc4bb95ac25238093454a1319c9443664f8a012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8ecc7145c04fef8ed19809822a44ae4799ba3ddf408e844872ec88d145168578", - "index": 0 - }, - "coin": { - "version": 1, - "height": 292574, - "value": 104500, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "8ecc7145c04fef8ed19809822a44ae4799ba3ddf408e844872ec88d145168578", - "index": 0 - }, - "script": "483045022100b2486e8018f90242250443f677e48b53a0d1ef6136615389f120ac11d6f1d32d02202f4d8f9cfe75dd90c18f6d7d4308837fa9e0463f83d64313c09221333fd49bfa012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "05415069db265b8c7484f9801413105937e20eb8a4e9d069b941ff16f1abb754", - "index": 1 - }, - "coin": { - "version": 1, - "height": 295878, - "value": 704302, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "05415069db265b8c7484f9801413105937e20eb8a4e9d069b941ff16f1abb754", - "index": 1 - }, - "script": "483045022100e44fb23f76a18b545efb57834a0ea5bc650e362ebb0a9e9df0124d6aefdaf6c7022042978543c6a56514d81fae83d62a33d74293d12c501180c780b0bac3a3caac93012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "0557f8a01e60737b7549afb829c777d5fc22d7dde5ce56953f8b65d8fb438859", - "index": 1 - }, - "coin": { - "version": 1, - "height": 292411, - "value": 1882789, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "0557f8a01e60737b7549afb829c777d5fc22d7dde5ce56953f8b65d8fb438859", - "index": 1 - }, - "script": "47304402202a7fd372e3d78564b1a11a7270bc4fb2c5a4188e78a92077604a981fd3f20f9802204d166b65722960cc1ac560a24817f9c76957b604152c2d236c97b1bab0adafbb012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "44553bb44d9f6c25f8617437fd4bb2d562f854e783a13b084086c03e4412683c", - "index": 776 - }, - "coin": { - "version": 1, - "height": 288521, - "value": 815862, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "44553bb44d9f6c25f8617437fd4bb2d562f854e783a13b084086c03e4412683c", - "index": 776 - }, - "script": "47304402205189501a79963e08781b05d332f7a6978020fb4f03647063db3f0dbb885638e3022065c7552a2fe425647a9f463aea0a7f5ef3896fffd5ee59f362e1e1c78fcda7cc012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "65ba438da066d29a779c00f50bc45c34b401f4713d87b6135c44dddde9998db1", - "index": 371 - }, - "coin": { - "version": 1, - "height": 289016, - "value": 1068445, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "65ba438da066d29a779c00f50bc45c34b401f4713d87b6135c44dddde9998db1", - "index": 371 - }, - "script": "4830450221008d45bfa4b40af847ef5a0be9d8b7759b8dce3c2efb63c2a81609b4d2b425ab33022027d2214d2ccc8d12fff9e0bc02baab3d492f93c4b1448fe3f3526a4112e41f30012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "fa272b22e8d20b96d0cc9099522ffe4d129f57970612e4a636c65a93d9718a84", - "index": 121 - }, - "coin": { - "version": 1, - "height": 286410, - "value": 10000, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "fa272b22e8d20b96d0cc9099522ffe4d129f57970612e4a636c65a93d9718a84", - "index": 121 - }, - "script": "4830450221008a7c7d253d9901cad4ae1e3bd839d08bb9a299191e7ba47e965603c09c7b99e90220642027f234efd5b180bd51f8ae682f97236cb81d59866c24dc04de0b583616d4012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "a1b3bf3d2ffec94a2c07da654f23b7f4c7e234947c59fded8de8c8cda312faef", - "index": 206 - }, - "coin": { - "version": 1, - "height": 290766, - "value": 110563, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "a1b3bf3d2ffec94a2c07da654f23b7f4c7e234947c59fded8de8c8cda312faef", - "index": 206 - }, - "script": "4730440220413221a0cdf755af0cf548dbebd8715aee2e870d3366a2a03a50bef85aa4b0b5022069ca8b71bc64f9e37ba076aef967c069aa2678755ad8a736a8232ee3513b33bb012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "daf581d42fc2d552fb068b7f43b9f3dd6edc9a8ff0bccb44b83c1a996e6e2b38", - "index": 151 - }, - "coin": { - "version": 1, - "height": 289627, - "value": 636293, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "daf581d42fc2d552fb068b7f43b9f3dd6edc9a8ff0bccb44b83c1a996e6e2b38", - "index": 151 - }, - "script": "483045022100c7e3820a398e581ec03463dad27f6f3c7ad81ea995c9749fb2460f96a273581f02205f0f225e4bd6bd860d80f9bb14674b9a4a6af4d3ac4f512a9c3e3ba72bf68fcb012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "21d9febfddd0482ba73c4a43917881930039730776236ad40dc9684a8c921c0d", - "index": 363 - }, - "coin": { - "version": 1, - "height": 287308, - "value": 139560, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "21d9febfddd0482ba73c4a43917881930039730776236ad40dc9684a8c921c0d", - "index": 363 - }, - "script": "4730440220226eaa89ad0be809514b3fe226edeba97d32b67315d7170ba490a089016ccaeb022028b2c90a07c978d5bc5a60e6d6de5e1650396abf3e1c6f7207e2c945ed6e5456012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "8a7c1b84c5eab983b6f364f1a6cc2170236c66e1b9e77d4cb817396fe57a362f", - "index": 0 - }, - "coin": { - "version": 1, - "height": 292411, - "value": 175168, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "8a7c1b84c5eab983b6f364f1a6cc2170236c66e1b9e77d4cb817396fe57a362f", - "index": 0 - }, - "script": "47304402204bbf6918b9346eb1b6e07905c6f760bba0a636e03daa2f2083eb697e5273319302201376106c0bb6cf81ab0fccddd51a5dd52a83a24079d82276bb347e4477139290012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "6d842a7e1b2bcb44a65392fd850d48c43a637edee21ffab58d78a191cb375f88", - "index": 38 - }, - "coin": { - "version": 1, - "height": 289964, - "value": 1083015, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "6d842a7e1b2bcb44a65392fd850d48c43a637edee21ffab58d78a191cb375f88", - "index": 38 - }, - "script": "483045022100f007ff53b390df8d4914ada8a926589dca6f69ff7adca1b3f4479dfe0e3a476a02201166221255d3ff2ff6e99c6d264680f7ea529a20314abf90453aa9950fec1997012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "012d3307c2d7c4fd9fc0244ac94b64dbf4f7d901b7f19c8b08134200806fd274", - "index": 1 - }, - "coin": { - "version": 1, - "height": 297658, - "value": 2108602, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "012d3307c2d7c4fd9fc0244ac94b64dbf4f7d901b7f19c8b08134200806fd274", - "index": 1 - }, - "script": "483045022100890c9eea66c6805f32f6c91ad663d3c03dbaaf80d776a1416db371e9badcb526022015b6c5779f4d7693539ed392e7d7ca6bba6206e6cf9daf1f0fe41096ea6234c9012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eea6a77113f19fa44fc62beec6c693971a68a422e8a9c87c44583d97698c9a5b", - "index": 1 - }, - "coin": { - "version": 1, - "height": 295073, - "value": 1294139, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "eea6a77113f19fa44fc62beec6c693971a68a422e8a9c87c44583d97698c9a5b", - "index": 1 - }, - "script": "4730440220773f620674cde7a4c7728982286a456098bc3ec5f8b5ff121f57bf5620965070022073248b515cb6462f4d8f02aa7f68b9c36c2d607bd21ebff7e8ea44ed1e56326b012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "5ba4ee96e48d754d9c4727585f8a4da7217df1d9279aaabe4d8a6aef1b6ecb32", - "index": 0 - }, - "coin": { - "version": 1, - "height": 292574, - "value": 350000, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "5ba4ee96e48d754d9c4727585f8a4da7217df1d9279aaabe4d8a6aef1b6ecb32", - "index": 0 - }, - "script": "47304402200d03ed21ef177cec8b6b5b6968f51f1a41995fcfa43a33786ced111b8b4a62480220523a031ea20d7535d32bae2918e2f14df430f62e6d78cbb96fc919e3dd008f93012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "118bd27cf6d2ebf8a0bcdc7faf106f84f62ed0f9ab68600f6e675e5a40a236a2", - "index": 77 - }, - "coin": { - "version": 1, - "height": 290306, - "value": 881121, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "118bd27cf6d2ebf8a0bcdc7faf106f84f62ed0f9ab68600f6e675e5a40a236a2", - "index": 77 - }, - "script": "483045022100f31baab4ce1a1ef1af8652da507c61dcd4a8b8beacd84b4e43bb0f9bd6c8e514022067c2d66860ddc796096a0a08283ba20cd687a3dd6e88ac56165aef59caa5bcc6012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "eb65f914814460cff8ce7257d87a6ff1aa5b6fb6eb88c2188bf2e1ceefb69db9", - "index": 1 - }, - "coin": { - "version": 1, - "height": 300025, - "value": 1874520, - "script": "76a91499d372febac39ddc6feb39eeb0cb25f7b3836da688ac", - "coinbase": false, - "hash": "eb65f914814460cff8ce7257d87a6ff1aa5b6fb6eb88c2188bf2e1ceefb69db9", - "index": 1 - }, - "script": "483045022100d0c0e74965055e0975fd00bb2b51e14a41b346e1dd129c373ce7389d623c9b8502207c04da477b7adcae68bed5230e6c4673021c20f3430224dd49b458330309924d01210269c0dc33b2bde69b558783bb922c1180d4212adbd3b25ea576a14799a5066e17", - "witness": "00", - "sequence": 4294967295 - }, - { - "prevout": { - "hash": "f33fb429f338d9fae4f0046523047fdaab24611ddd6758cf925840254bcd0930", - "index": 0 - }, - "coin": { - "version": 1, - "height": 287387, - "value": 196041, - "script": "76a914f1fee1bb6451f0d7310d4a3c84c30abe2f0fb9ac88ac", - "coinbase": false, - "hash": "f33fb429f338d9fae4f0046523047fdaab24611ddd6758cf925840254bcd0930", - "index": 0 - }, - "script": "47304402201c3c2c706c8d866a1bf8779a7cd3bd5bf715ec02cce66ed53feabab980b5183d02206fdeda32d334863062c13cee82718d1b512912359156246d25deb55d74155ef0012102ec8ffec825bc4fa6f22cd58559dc65e124b53ab3be1c7d6f792d2607db2cfe5b", - "witness": "00", - "sequence": 4294967295 - } - ], - "outputs": [ - { - "value": 35400000, - "script": "76a9146e59a226a606a6a0098ec05660947184f364cc9488ac" - }, - { - "value": 250102, - "script": "76a91499d372febac39ddc6feb39eeb0cb25f7b3836da688ac" - } - ], - "locktime": 0 - } - ] -} diff --git a/test/data/block300025.raw b/test/data/block300025.raw new file mode 100644 index 0000000000000000000000000000000000000000..5b3b1b7e0425ae7c35fe7da471e534c404efafd5 GIT binary patch literal 284231 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%0DX3TmT?)PwKJw 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�z4vfmy#Fb9vE)FY#^t^m95)4)(FIGxC}n3 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𝔒5VHbmS07NY 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%0ATMSN;a(A2VV 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

?#hOZ+rCrSE?~N$E;#ehhPeQp!_Jf1 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%0D&qOnlIx|D29vo z%b1^|OCtRHW3X)SW_2C?aMtI5ea=+*zG@;rk%5!{x4Z`s-?Vj|znLN)dQhC1zx0VM z5&da^HFh@gK_;m-G#|#FP*@|?t5XWr#^N7&=XE5_Eu$YfIg(%oo@EV&xp4%<9|4CR z5Wdq;ZH$XaJVM?!vHp5gh*c+4_|wI{^r^Q~Q{crq5DKho-Qc%Z8TneaAa zD_=u0OfVsYjbK6u8^MGSHi8MEZVUvXV7~}~D3}o9TEK)5GXf@rn30?O{vRlK19KpF z|95}}F$aHR=nX*op6rbkoIWsN3EAc@dbh+mlsF52<9`kUXb|V|xBUE?-=Z;$cW1Wu z8KDzP`) zh~Xl)eV|kax+9pKz7FLnLpl{RPNL#$Y4-XVs;_;Xlvews)@A&Pwo>ZI$OC#f3ch)K zbA|8gKLj(o^Aq*&*=0IKLv->K`7l|vxHYH)#6S364yKbmI zg-PmGjiblSVY=52)JdI{u`BVESbVRywevXF}EH4*%Qf2R!5{b*HDZr?Age z;PTZ&MBXx?O!Y6RLCqd}CpIh{k6UF=bAM*?V&qF{>SWdwVd^{bg)gi$JW&k<7Q1Uo zvmawcb9&e7pg#DLD0&NXvjnExm^6}np6}3?unK4ult^8pT?up=E2oX%4I^@$OvYWv zn@7XKUvcs$AGxg+x$y&z!t-(d)cHZByZ`VQu~~ng*2U%r{Z+xps}BK2SE*XhYk*jw zR^bm3P~5zq$CX~;hWot7E$@7wqH=HW&X(btd4@sm1uG3I5^$BZSk<7V!z8PLn=$f> z{KvcQ2IEt72(+C&256yP$62gEC@>=Y<4R_-2%r1xUJO3n*F(vrTjy$j(fgD?=V2Ln z=Fy@Kq8yMEyJK3-e~x;|<86dGD|E>%5WARhZ$cicS$C-Ip890M6!5m7J0YLw+^F+X zuCp=aji502TQgeNAerVb47ry37)nA25yP$bCKKINjmrT489-=s8^}Q zBZzIk@p6BPxCJx|%KW?hHR97X1%7imm0-~R~AfSd6I z^ZQvo3mfu%XhEihzHM?cC2@pzPdcnin`)v<5$dbRC{&hwxoNkUpDKJrrn@yA!=j#J z%lw$w*>?U^I77di+jL9$~^J!(%O^<}HLfK(oO7 z>J5G?KZB!H9sI_tt+RhrAwA~#2I1@52AjT&f;4r6bd53(2qirF4J%0e``GTM^Oz_x zwRUuMgoIVTDDldVcG6=6=93`Va!LgCnQ+AHu14>z3#-yqHuB?E25W^P8IMl>0yE@;6txC&iV)o)PnZydYv zXAr!DF!bNi|KAytznOy@4f~t5xQ41CDYH)6H-b&zKBW6+RLqN$`LG8s{701zYeXfM z7aQl`C`_X=n@uu`zgtUCI`nWjZhs<%eg9aw4`--D@p}R$+$=N$+I5<>Tk^0s{m^-` z^VUo(I);gRAAY;>marxd>m#=4c)RrPK&+y&`tOWyUq4fa-OoPADJ>b&=lx;v$h>34 zhRJ~)IT+~rpb7YOtXJd_kB+mF9xIcJRtK4dUM^ZF9H7Yg+$#;Ko&Tzt;RM{UhJlom zK2I;%s)<`E0&n}_o7yX3)aHhP%~1XK8hUIWbnwLsU+ zs#0cBW7kV>N4$;JgRW#3Mk(Hf?(azQ9Rn`YEMkGe5sm`yZ64bLe`ycZCYXW^+|G)P zh-U;72#<}i+^b7>VSai5u|Qe(2dl^&xdLMmcNh}~r7y$OrDNsBr(?~Ne@vsU^;EZ~ zOXC7-(7C?6Fj=wpGRVLwVA%^wdc#8RjU$&TR#)~&aXb^_Zwvv0^Y4`)X>x6qIU ze-zfu69b_@jme)@k&VfbS(O!&*#2mfv0&kX!ONZHD#elyl4HI-wuk2N7}x;yOZMTR z1|{4QFWW8|+9FJwx5>=&-~zYu(8IJw5qhZh7GA%sj%lQYcekD4lf#lYU}jhBorfKr z$b)HegjU@|HYFHLBFon3&?ie3kN{^?4cN#BAN>>wF!+9J{5Ab+W*WWHL%tU0^e`7zcG_ zc$jpNWmG>O9_D;G`+E}^bW`AtkGznbC9Ps~#Iv)XtnY>d$>Z7|>FhQ8LU;=%gzy$j2r)QdLWscu6GGn1O@f0=L;np` zH%RtBtYN$HuR-|#H-g_V7vlvVf?L>n=dIX`#gg`uPw&LHvE2A^5Q6_ZbMZId^G{9^ z_pIbWA?e$dwEf@}xssx157LhH41L=ky?Mk3bIwBz6yMap<9WtQt(vl z*V+r550WX(7~J?iUAP}Y-U=*2@94L)pII3XR!n)wW2j9RDc&u5OQ%h1%?9at2MIB7 zM>lAq@XsUMK2!4;2v*1EnSRhj^$x>Z$HZ4~`k_+yD~`%sd~E&>I0^+^8XSz%EN%>w z8gD!a1@!w*xIH(v>&0D2Pv3T{XZQfIK%L1S0O>1wp0ZSF^AVcENcy!Mk9Dz&xa(hO zOUK-86}uGD2Huuyq_@mwv#1+;t-9Vr>}W(4F}#WpZo=Dt=d$QS7T9H(ukQFnoC~{Z;}e6quMEU3(qxwl9!)`ke$dTa1+E+sSC& zl&dj2%()A3>6_on8=+h7r7rF1eQPa=DY%CQl}@yHC>7=o8xEeZgl%wkJZ)MUaN@~> zCmV#q^KBrs{|LJ_yACi`;pfP-^-z)hKn^!T|6>1f$94g;mziw{KAWaa^*f zi98N~``nguD;A!zMNaV~NW>x6#>O9W#kkp(?Wz8iRONFWQV8>cD4>Q6O2X|m@wTqFd7g98! zlhhago-_I{2(C@2dUj!B@k;HM(&A1!HkA(V*2A>PK3>J$;dV^z?>i9k1T0V;6z_f` zf66|Ob4UMfuD8?NcmF8VobbfbeQZvGF$lp6`?ibP`EGN(L{&w9q~76#?q#I#X?bsP zeb`jg7r%E9LU1r4gy3L82*JUG5Q2jVAp{2#LI@5fgk;QMLdXLL6GBjbli(nT21%1a z2o8d15Xk-wlQ#(7u*yh7;+vrJPM1*f&RPP(O2jS88w3Z*qCp4_Vr>3qF0Rub_5819 zJ$Q}-9@J-_`rr&7-b<_!hZ}0{HmT1GGY#T91E5-pzs`uc_uzX~l;Ec>N;NsJdGn0z z9_088gVqB*f-;~xLPsAvd(JuRfYWAr1~MI&{kN)vG{d`GcUs*n&@3Ew?qnLkQCL%9 zm7`KNSTkZ#jWp#`#K&*&Q5%WR%aVs!yt@jwC4f4VcA;bG^8Q44_4jlRUFzOE*pKEU zvs~;_%1M09-;EszfomkjT3U=WlGTGqBx$=o26G-NZZW&Yn-p{O-;H>&DE~YAfi9_2 z^3lt)>Z#$rNPIkm7=TXQ))Lv(^|EDn%y`!!gL#q|r~tPwO4}7Sf3VZ#OO$&U5?kp| z$6jTA3;)3kgD$&H-tR-#p=4^IQiKOWIZ~kR(d2$d2MtCiDx&nq&B2Bm63LW>LXB+T zHqk3>y}gjn%Xt|A6Rh1AvrKXiw+*AkysS$`HqA?c*!%Z}q+BYBOhO}<90vp!w{STHEt#%7GiGGCsa2C;wsUkwA7LkWX>Y5J_ zVtEh)gaU=nwXype9b2tQrRGVlQJ~V#j=s$*=Va3pSvd0wfz*PU*9s_XYvXjyPlvE( z=X^W*Xs69NvZU?h#aVBkP0&iY%JqHg_uB$1%l_lGYUD+;KV=s-4L?vW^}G6-^<6p+ zna2V>Y6L0esGMn23v;L~8otCQ!{N1lqCjta@{QpP!) zv#^ar57+POU)fQyjRM*QUEgx-`7uZMgRe!OF83J%HAq3!HLI}XYgb;v(2_XOn6G8wECWHVSOb7uu zm=FSRFyUVT4nnGb$9E7)g5dvel)M4(l*ZSACKF17HFgUlPyJyvTI?50Zvg!N-aOp+ z@xQr)>w(%kagEj>TS!mug0xjL4lhDma!iYcF)!Z8PME+R&-oQzhT%PmRU zY!&ymD3PQ%v$Fjrb&DtAj5c2%VM3D?Uk_-Pv{Xti_}!#ap@l!zWq9cO7n<)(kA7{k zhIP}q5Z*-qX2I1+%6#*615VyF7zxdFTd%Ep-(4NscHn6jx-tSTRyBfwg6Z2CmKz9`DV4wugT>Pp^w4H94`4 zHbVNi-Y<4M*bN zhwAMPoLDB9)x%G#NNmqRjG5+FlPgCX?mdMd{P8by_XjDBN}M)}8CzC53JgZoO^6T*y_qmM1AR=7d#v58)@iM+9e{4 zS9j}H^3QT07O3I+lYtAA?VG*tx-{P&{_=|6eyF%g8q>qDs`mbF0@29ZU#kG>$Q3T6 zN!s*yNyM=3vM^NWD$chS$j+jrQg@DjuCB=J0YZTqlRu$o`p4&gZm)wEO?4!y-l7?r_+leCy$>G69mICUJS1(b~mG^YYBY-V-{q21tPlL>cr`E~1mIvo2*AOF z5H5oWAzTI%Lbwbjgm4*52;nlA5W;0JA>_^6%)mi72bO_h zllH&Z$qkl)*JlmPrRQjz-?k@qDWZ^IEfrY30q|Ops$&*~*!_9{b$)mck|kL9+HfumD);{I=w4 zPMPzB3o+NWXfx?zyW{QS_b-w*k=)c^Rxg3`wxArQJ^Fl?8gcBS2L^=`Ia##c{@{xD zwRWf0uktz=Rcp%y)-~%Kx2N&I2jTLWR}rVL&;8;-QynRJBN=geR|h`mXC(>LL#H=< zv=J(S#YBGf1nl+|38NE{J5gUyi_=1dDUp6v4=~7}A`W0I#UoM$Q3XprE)-i4-Ywxr z{CqG<`MJ_|@q!{7>hTOAkQaGzcWb$#OD4~2%|y6`^*E+-kVci-c0v;ilv%5iXFE4gfCA21%mqnl6l2cT2dNg2e+#Ygaua&2mNRFP4 zfFNqLm;4hp7q2De%;=N7ArE1M?wQ~UwWvjcI0`w($0P3{DL9xALU1r4gy3L8ND2-n zgb*A|2q8F_5bDPRAvoACLI@5f{13rzaB#;L+j}nVvc@wn$3~obAIGLDPw)olK$7Tx z$A1vWf~5cd1OIO{>~9778-E4?{9g(FPk$7(>!32^vYGU>rpA?+*7KB5%l*iN)Fc&Q z9`HjXY8to-Y9m4@x(kMVl!uetKpUk57f+ACL3`@n2m))@`+dUSBQE3e`=Tzfk!WE^;R3@&H$pNr~8 z;iXy1l~11mT_3tapA9Av+CBqjhu+L{y!ai2C!zIiBJRVRp=d+TF@^?7t$`y?ka+ik zboUt1d(E!obZic5RS~)|8|YD3Qkh6mB%)aOOlrs- zz}lq$S}h6IQ!5ANr=G7C30yj{{j{R;U8J(78h^CDMuHP4bUN*aiz`$3`^*#2Z2$Tr z{D6+vU`@DXYSd)p*yOWb8mStFfA%bF@_o^%M{v`wYYuHWlPKYgEZbyTFYI|@&b_Zho) z;4rWsR1B}b`Z@LopTaAxmRW_ytK!E#7Oo8S(GJ$Q<-I4$_&_Ky6Lf>%`ctUIuXguI za*rdiS_wyKH1FuUXg#>4`b+R={IUg49YUT8BDwD7JAM5|g$j5pw?bYf=~XyLvK+Na zRz0M<#Cr0d1?FHv2ze^73)e`E7<|HPDk-N1HWha88z|Dk)r3nd2G@J6?>Rv{0hkct z3BZI9PXH!_cmgmXB>e{yLd*l05Mmy{gpfCLGY1DjGzjQG7z_gVzj5$}xlm~qxc?WYqa7b_ei5B6B6kT}bJMAI; zW$mR`uMZZwwf5jBr0eq&PF)1rYssl}b+x}GU9lvNjuZ-w$>Nrk>7LC&b&T?#0Zrd> zHv@OWO)cdxC601zX1S@W7bnA}rdq|aouY7I;|m;x2!Ca2U!@e`B(69;22rX$|9RfB zgiJk3dgS!36+>$VG)TA}&}yYNRS|)Ukc_jfHM!pc9V5 z@-0DVOp~`>7dhK7WlUA+$gEt->^!sT&Tdxa$FIvBz$gPH6IvUleM;QJYOS-KX>sm8 zxf~cZB{qgP?oK=@hB?J!+Jd9d#GGV(V(}_%@b0NT#`68!c5r&cI+<-Bhpmu&20BT$ zp%~Gw-xkT-vuBzQd)_=-ZgG5B5p0yVPqtT~1e4xVEgvS5{T!GES9|K8NbR&UiN%o8 zAO2Zm>9hB&j;N5R%LR%5fVM>II5dy&&)d>!w!5NAwZwVBWx|#2Ivs(4(z!tY$uW70 zk2BjNp9fg8V5lL|-6GC;(KAd=gL`QlhI8s~dWKDmX(gWVTAq*P2Q*LcPblX}yvc9R zawZ(VHTKb!^KXhv4y-;DK-&!wyoKNNW*FE?CgX8JS4b@tuTrk+)K*WbE_8Y4P1w?$ z0y{ z33lR2?L2shfWd!uel_U%-B-6{wcLy*dusXr5%-o+SwwB$H;r_IgmgD3UDDFst#p@k z2nbRl3P^V&iiD(egDBnIDbfh2?qd&w4-eKj&cYnc2VpvG=j}#D16f zyJiI4+KQk>Lu^uRO_W+TYHIqFt497dPGQWs^V7Jv&H(BQ4&no7@VM! z9^ovEaxHFrrXQV!ulI@0S;FxO&?+b=OoD1-v;#-VQucziYII}Zw>5a~%J1W5ykOtY z>1%$}2b5x1;}tTsJn&M~FSQLW({V6C#wh%*Qh-wu!5Poe^Z6d|xI;N%;#`4dO;eQY z=h!`%w8}soFmpddhTZH=mtaIfMLgEzG#sT)LABRM^Qae{1I$jFL<+7H@bJ_}B`%G; z-KYmv>au?~X@c4C8~j#=Pat5A-$0##v7@e@t3TP&9vU4dQHNLNM=Mc~l4gWJ)HCpq zISyNQQjXIVgIb|&N<(1hSm=8S0oDnTX~0m!AOxcERWOvojBHLnW@If8&Mi;=l%u&& z95(Wm%GzqFCmOLs00kz5WVc{K2+6>Nkn9#r2=N&46;BDJsUMMHPfGkza#mfBis4vW z;rG!n2r-s)YB>7^=^ilQ|8x(?6(Jr2?1~VNag*O51O~x72!TCiA7RP&I)q^8UHr-T z)?u;FVmokyz#t6$?*I+rJV30)|C---O%dz8tG{>pO+9+K@;#4<%I{?X$KI=lYi;Ep zH!fQKz)@Xj)?kCVITtsA3Xoj#}u~ZlkZmhmLm(+A56*8&6S3Uw{5m; z4l`!I46b7CIl)mnk2AgcnN8JfVv1<}Ar~8ggUKgnH-l$7`IDynlFb`n1{lgrm6tQ$ zJJ^Pke-tU=rTy|wQ|epq!aTb4rD{ecJW1z40XRzJaD(%vJ}$q2W~uw0(Ox#4LBSzY z-%6N#m5{o*-p~C2S_SG#{%yv$)b@Jgp_jQL2mzqcVi+?4;sz^%fJ3Hn`*` z16l=^(fud?ZtrQ0*kYopbdV~`&vo7yiz?AiNu|TD;QU?lK{3|>xLLIPJ|=%YznXr& z_I;d$?Yq-ZZ>7sf)SWl3FxH4<)PX&+6O7Fh!Gwt~cmLsdiPbT@67Vm=JHV?h2# zh;;zFBE%7Z2_cRkM1?gJrMimvj!?T=&y)E|$2;`L1uW~?>SvD&*NR-<{7?6Q2qE2b zliwg|DhLHZ=zm+4+KmL8ADuSp=RvR{tBYaI+D8U+f?dV!xiKxH*_zZrA{sTJS$+9Plu9Jw^e+KR<*#=p0~!D zE691_{lnS85{joaXY0CZW6+E;{{}QY0`=h|ZURcjE11Zw1SJD2>fou&)0n%@a^DEK z8>2jdqomF>Sy@DN_rsBYNJMeEfcOB1M#?9~byZl3sORZI&pOnDjB=+VaXpY(0;eRr>c; z+SKUV%FjM!5w;GvujEasb*%3Vnw9*m=>etBzYZjC=@9xfFZmr>h=ds{V!S2g^s71!mt@;%rcjMV7-p7kf+1BK^9cC?8PM_Jq0vdBf5B z+FO$9^3(hl?2IUC4_)kAI_O|H^q(m2;pAZ=0_VfJ3fJ=4JTfM#mkSX*5!$`*r{FI> z=s#Sa!RGgqqnZX<1zk#vxyYdiGmqg_=yrV9*^t2DB|XX-*^2h*P698oG0lBC;K=Z2 zKG|0hfe%&N@rqv0qMM!WIs^vdY-1{NnVd3ij2{D`Ko=mc9ps^Y%+8Rk721#U+1>G{ zDn^NYkFD2Z*R;3N!&stz*yjMn+T5`s3iVCDUSIVMiIUx8>V6&3`a*W(km5)G9kuVB zz@|xXS8^R|G^^;Sd83pa;|^^c7THKot5sMu+L5k3iE8I#u^duhCj^6ogPlL~Yt{(W z)+hA&;u~uw&r&MbH6YgB!mFaUTC2-f#0Q|H()~LTf^7&f-5XqP$S4QFLh`QFU&S9 zm@6X#_IB|_8*`v7rm)T!e8%;C+z}Mp&n@Y>9z=cPha`~pFxQ4@2I?E^(E9WaJyjxQLc*5HgsK!s{}`~ z`KTp+fC+f_!RFqsvFi4)Hs{Yz|FouT&2JY=oC0h+X7h2d&YN@3V^v@d?Z$u!bh-mJ zQNJx&bR;~Yt4fp>4(z0P3~AB(#4J9E)s4I7(2UgouZtdx(SvAy z+pY%n94TU3#^kw=77lvrEM&ve%@>r;S80z`bh1f3so>>NJ zO#VF=3b_6EOt4Ga#hW9XuoXzqT!S$s%~w@30;H;Ale%klf%9SW4r;wA48^!?J81;+ zrd!uBG`OrT#a^{2`t%!{=Kj4`pa;xdKNoH9YwL}4F?*1Z-G-mKViRESTNhEjU~*+D zCq>#Pup@+{w1@HbnslbpKPX=dDw8X$&2^K-h3Dq;ZEJ>^HaJ@RdmKO5yuuBDKQom4 zsQ!X^NgMC!vuI6*hY`Cbj&GYya$0_z@ou>8SVNdMUsPk3ev0}B51E8Tp(Nfg{R_T8 z?&q}Z;WaXnu>Gtf2*AOF5P*XTApi#xLI4gXgt!qfA=IsgkRI%c5P*XTApi#x-U{&B zP;>)>AdLOLkN+F7|L-IChPP-e)=_05$YdSo4o0lu%iZ{;?l5~Z_ALeQH~xH^x40hA z1OpG_V(PssraK5#T#s$?N8Bu2|AbBxH6kdj>CJ5Q0(H&lcL=7%RB}>@5AJLsy5TCz zDQ!C*x#Nj#U!o?VdAUJ7cG?>c@=$#2??#6sKwXs(?lD{}LBQDbhzUS5|Xsi+#GCh?loHxRG z^!pb zyu%bYw9FJKYJ5InHu)=+VlDM>aoJZ-y)1oioZVmn@n41(i%^W7*G~pl%O+;KX->Oc zOWHB-!#2n7wR~r|@R7bB?%sXW{Jww{C=D;t;x1K`WjVHI*nJkOJe1vi_9uEFAfJ&f zXi;{P%N+;>oiCB7&9D-vdNR60u|ZfvxsMh6v8jC! zM9H6g*{2ji>?^!f2bu+zt6twMA+;;Aslc@0=%pW{I;V7NJ9EW55h)ACQ&{r*(~4$` zaFh?~GaW*k%P=pt8ui)JgCeUGkq9S>>-=<{!YC7WbtV9zK+VE+vr0vD3dJ?_5!hBK z1~}sR+$enJpYa`|XKvJUHCZAfdH{B7<`=Uv=eeyb=1YT_*ONJUNaGSnMlvU*_uz%h zFi@fK#y1FVJz>Ik^%yy({rxU}Av*qtT;^WG9=DYm;H-*wm$0qD5Z*SJJ+DZ1dd6(J zg7YTaz7l(0PsAF@OJYh3SvF>dRwx)ka4;d%SA-B8?1~VAg9#x72NOaF4km;U983tw z)xm@i)Po5js7Jd&vWYUk!O{0C>*&T=Q3{gW{+U!cMmJCeLU52o7KFhd?%}_)2e(1? zM#KKg_4Qi-fBou{6WVD%Wm6j0nQUyh4?myXJ^5L(6yKC*x1)n;y7}REV5!qiK8`LL z`N&S|u}R(6gPnlkl5q#dfN1PzVXSrB{yxB~4?0(R{px?ri$BL`<*|dIGTy)&-h?}$ z`)GEoC=kl$Yj1vz#sd`fc>3QhEAxF`+fJ2=5c zwOj9XI)`s(*52Ja#b2j^rdfZ}A1at>wDwnKxIK88Ts;UXr$c)@+pOw+@7SpmWbV!` zngE}erXV6Q3CMinW2RZL)s)Z6b$?}HzI9`rX~6O1z@nN2s#VqN9-M`(4CKtohb76D ze0(XOV^1AS^@`|eR8mnZcZkIcn&y)0nF0K(nAjo#0DKo%ee^V(-&!z0Z^wI z$HRyedph9}1qaH`zk=zqiruHnvqWH__gfz%x_vQ6-am{Xab;?RXGj^tp>6GFpoyw` z|8n-E4L{&rSAu*0I|R_$m@5@c2F_aExVZg9?`_`By6QdQ>A<&_7yR_*}j4&_V+^?pomRW z1PgzI+nfpUm_GnLsa2#$9&!24wnL|27JiKcJa9k&v=jEZ(F#8dySL)Nu9C+}FGJ%@ z{^k3;R8QlX;@#Tg3W{;(GqN~yFB@p$iQs=W)paq!ou&aL3*HYb?WY~n6>0C)*`3Dz zm=R9xf8*7;l=f$_D$t%=ffBk88wYU?vbz)u}vmc_!%fv^lr2w@qR5W+I) zQMDRJ26N1q2Tv-BlY;U@T~!ggm?llA;c4a z2_gLmCWQ3k%}I1H2H%3J8yo}yJP3ntn}WY_@!R-+!+SK2$T6spY5w}D&4Pye-s_w# zD^26ZuR#zE0(g)W_S?M2eZ^K1AWscUW5_t-A++PZr{+#hiI)o?8h^Q@W!riD{HaQY zRnwPhQlMl3e6sZ4IPJe*(s8g)qV@dqE5hkJ9h`bIj(2H)@L(sA_il&Jzk!9Lyl)t} z#I0|oq?M2`_>_-HP!9)jJMxsSW+Bgeg2?6~2I_mIe&<>H?o`QGc2k>!>52J>;7$i$ub#EBIYmMCFFDUbxMFDwr_R!WBUF0i>7ewWrp8{ zSso*0#hHJ9>JCGTd+P4;w~i7ze#^(%o0>BS7u>z*N%uGHZP=4qXc#gB>5WSY%%;v43JKeGvO@3yeh44Qf*w~b~2Dt zggO0dOF*67^-G+`*ehxIT-lQ`fP7ASY;5NHBHgx$I8D*cX1qHFdf8*3K2)2T@nsX6 z!O+Tnajd;R~M7OyN~g z(d03hChAK$%C2?^9tgl4)9)EL4HVv6$rkRV3$j7rf@LlIs>>dzE=^$Bo>6SS}XuP?G@ zzABipxYl!Nep}~y>H)HRRW^ofV zjcNI(%`omdOO=$S-`gaBqa=%e*H&H`D5Hz%{6ZMN{ZHr**Wt#;IfmxvZEA{EGr)dn zXdTdyC6U4C>USOUd?p%Bl$|!>?}WAAs2pbR__WquNjLyW9cf3|ufBj8^xtU$T=U6( zo%eJFkxW;q$t$}}UMhV{1WFdbd+>Uo&b?gTN~=Fx#5G_jj#{qTxe^himm-J4!L$?y{8!)XBL1K}84pEYEYuC!0tzuk%jiD{6Wd|v zReUgA)+wTxe*L<3Ox48_P>#3W932SkZs$w7Bh?fjj;i%#9fMpyd52kO-1G(d z)C7e>x>j4mz$p+5x=jPH?QcHZy%R2nH(GLV|6ZjM;VS2B22a{#zeB4L{D3vE8Prqq zE8d&C>*IUdMVY+q+cxZ4h3_mm@K%wZ{cv?+3e$z+xwrvvhuJ7rSVU>%%n(Gw=klYe zqvg4Rtb&`r!q)T?B_cDlAUtW=`Bk6YRPZMahv+OebQh;@S^Rf$O?4N!hH>A~=#M@K zPr!tbG#E?>;WC&I!euZaBwq#-LI4gXgyhR$LI~->gphd$Fd^j5+|0m1GEorDfk5;& z&fTCS2>x%&z;FEeHpbpa(CL1#GRhIeGd-(Ct>PI#u(v!FBfs%$5O)A#TyAqF*8peM zGs_NXUoMxFxW_Q$QR71DcS)eKy+W&>^Uhg$WJMMzZElKx<&dFVYG=tjkM-Hi6W3^c z-)3v3ea!|%6)&<+6q-@yA5^iBQuCq&9AzVa$)E=Go;Xis#Gm9=(vOWgt77|SZ~}F? zX1TBhI;$t{G;UFz8&vtn{2J2H+5}I&EIbZl7o1w>0N#8kXG*hvhs>I*j`pxAxnLwb zj>AFezt<;`z!mmgH!GIC*b1mOCW;+nZjCNHq!j)x^~h*?{_MeH{B5eTt*R8>KQan^ z-cXD({~0_h#9c|dnRz=F74w?n>0_fXJ`gx}#64y0yy*E1lT*g1hcGD~*RRaw=fD|rzFr|c&sUe_9ZdOJgxzB(Fo*r6*e{&d zN)`G?B1I`C4>#pF{uF=xFJVMb{O?@0wphD1{# z5DL^pUR$8weLZ&bFs@$NMd^-yGsvIKj!QJL-%Bz#OD%~<2XMFm#~h|3krs~7H?f@C z35k-X5o{}mx<2B#k0R=5GpkL)1e}u(PSxvJZ9Myk;Unf+1gwo0wxbmJ!3_-cgY2l5 z$iYGw38*T-S{SX`eOw-N!fKiymVfr&#Nb`)`Y-*%snxx0|%wdpsKy+}spT;`d{!<=WdO1y175 zA#^mBDwJ~lNvhUI_tBk)Gbg1|7mm0>Gss(o8coqk@7*qh;9x=s!NG(Of`bX6{vRO( z2fHGK;9x=sn8Ab)FdJR?B>gg^XNuNLMio?9_%hYVmr4)sy@q8t6*a?lI1A}VFd?KL zZxZ}A4&DIWZK%3|$);5bWK9~q-(}~`69~2(Kh;o=X>a@*go7aN0fgZHznY6%mKLr@ zG_I8{JDHQVvbU8hJ27|gDVYwq#EifEXhDX3=|I_G9Rd`W31}R46>4iID=SM9l4;V9 z_9Sq&S~VH+BlycOfBy{-9Lhw?+smRdpWjZ>qk^BbWtIOmv7W@IHAYGvvwbxQ#j3Mb zI7%+LZP+4F{jjQ<563~GgXb;G+1e+DU(Br$Cqp(?B&vZ>&}Bc59%w8JP*evlbaoH; zLBaZ)q866*}p*O?&rJ=tsRV?t`E^+s)4P%+Zt zatQiy`iG8L=TYeNUNSnbe@KPShPluo>^C$eDRav(^Ol!8z-+zF;{N;tA~x9y01eQoxgg7jF|Pk4%@?Q>|W$Ucd_~o@sMZ! zQvv&VKnW4^cKZi-wl&P0kw1*3j&e}c?64b zJZdtbB0koqsNqCkp$QuJZtoV=Zb!Om_2TyqT9qz>CWPAh;u2 zlwO7J>KVRPukL0}e0^_TOs_QU$$mh|*SEcga>GEgpd+~c_VL5jz!%tRD(!-irfrN7 zHeG$>aV>ljhp4cL;)E4I9h(FSI$n}e`HOl=vXeYrJK{;R`*pXL)BrQks8adM(;>wrXTx%Lbz z`k1oaq+xm)p%6Xuw^K@V;OIecs$M@C--IRie8$T-C@4y}PLbt%3y#pe4tSFOWPO@c z*P3%Y0zO~*;r@f#U+X*LM)1++2$t(>E;;@}O%Eg{cO zbkKM{g5n{(L2!--Rd(>cNB%)Po5js0R~5`VmYB>BpM{2cakkCT|1$ z4T6Itx*#b!2>(Gcc#!D<5PNW&vAN+~99~ej#tDkWPL#t=s%?7eQ^-`Z)B3PE2kj!9G#_~p&lV*e2+d}{0!YzK5A;C~pafbfX75dRL zp7aE-VgGBYEQ0i>4BS~F1Wlsnn|Xz%2ws`$%WppdA3LXPiC1ZlfCB$ID+a5OVd-|W{AQ?V;WvAQv3-M(n zCmba!URBqMXm|}=`wU_!_j_wX`d_Ryenv;6q*jGosB=b^fI0xygGI+8l0 z?9AMb!lwa+uw~->Lkqu5IAa@-#LzjrfY$ zs$ZP#>LC03*XO*Fv?+6-{qTmQ9h#fzW^qY_xvXC|vio3ubk7(rrte_s~I@SbtMbkk#F2|kfY9HN1 zOq)^Gg!i5n_i$RriXOL%Z~`9%$3MCnPjhgY4ANqKXS|{ETj_Y|{D;T0f_J;GB-VLG zy?|I?PW%SJeYV2k4c;;r+{e-|Svh}*SrTj>4C^MJI69P()P&WV2qDh|bLL?Qv;9;m zzgPUaVewtEJ3fbYs=S=*Zp$yoxK&mlyaf|NcncV zo=$Z?FXsbDA_&y4$7!K={!Kx+?`ZG6{UT=?J6eU4N4#i^_UaT*qNhwswG#liP(mwt z-`UtzyCQMopu>xO1(%Tx2Uex`D<^fqIF|LsG{Z&F|7R3BS@D?qf)DPAi z^j9@* z#~-4&-Nco2MBLzQ67UrZeR0fQ=7XNW#|VuUSF&!d=6xKeL)7`m&!Q zdhzRT5isb|^z}epYW(W=m-mBs-%b#WQLW6TH^&$d>SJkCEwl^to<=`l2fhj3jWl9b z|254PcIU}KRjr5s&4rmfW6OviwKLu9;Db7-eF>Ied-%6RRxW10A6`yRmSQ?4M_PMv zevcQQ>ex}G(8&P#exg1y+~U>q7*v!}l!hbQrvyYgSrWzHlpO8083`7FBg(;()qi)( zXCQLqiSKEhmoJ4AtCkmIr=v{VBn94twnfU_gD_rA;Pn57c@El*W~O2!ohOZis`$Ka z%T#K|U*EaH9SVoea&7@V2!@~knBx*18rf;;xEHi01ME3$Z)GGn?%fIV?zVX+b8ez& z3OK6EMtQGo$(e;2=Ne#sD_rnUNBU07`;#%%m#D!)N-2AI?L)@!?^9Rt zx09HGGZn!nXRaTNNW#RA#RB1d7sqDLToXhMF<br>Src({V)ikzB}&!yz|P!GsXhg9)MTM+oY{uK2$pI0&L|1KkaZf*=}%q96&J?pRoz+VSQJ$)89t!}(45N=MRqen%{k`qcG2uJyZ*Qrlj%I4muPkZ$pxXH@KKhsD2M)BXi@-191 z(klga@qqi1>mDrYUb6mGll8{%Y70+%*CmmUP}*$LjUAa# zX3>(K%)~HHzg9p7dF%r8Phm-v1JY(ypVd$CNQO@DpC9rf?sH!l;G2v7c-nQmbfPrvT8XQOEq!l#+cnj9zaVT~2;XVzDb_Rh(mr$D-gmde z$Vvf=r)vYx-!D=Kaet4KZdOooq)7l0V-K9gx`iZ;j2HDdFE?yY#fV-|ip{KYExMlY zDRq&Z1Cc=8!arl8kd^h|7gm15bcfp?O(*R?CN9;VmBZhOJ$~Z9A|p-?Y}0(;sX)~g zBhz(7I4_;6QZ@Bl2j>;gfuL(1|3aZ6kc9a4OFXc9aLXu4j)2ifqHI=khW$_*E`tdn6a^DPC<-QoB+Ot!2yS_E zvzAjHP)5mKM4G-quk1X{?P!55ayXGo9E;_~b#sLnAuu7N!*5QagHRHLu^mXj03M;j0{J;ON?6Y3LVQ9T=`d=N`iRr?2C+}atn^g(3RD+V zYBs-^1Dlh;hqLQpI=VBa8dbLaVJ~*->bJS$L?v;lJeY$?1(VAh*;u|i{cx0zWNbyv z4msXMet1d%>A(B`4#36&oIv4>N3!w^E%cMeNv!q7cY;&6Qr~p_U%5b zcT4Lv+_@U4U%9x|*`F-^J?7Nn0%61CU6ba8)gz5fJ$+uXENQ!6i2RTI@~tn4|9-#} z6m|bbG?zytaHK|!$X#((A3t*AN~XPgL5vx3mHVbxlpXE3M-q$I(pmqO(&sWCZ#d z)v5rkf`^rK{FFgwQQ&{}Cne5qfyw5rX;Y8kJ&(wH-&*kwfn{(glRC*(tIupe5 z{wLhaB^K7E3eP-rgFcpo{9cvtS^3;x-*W%tPk<9>yrHP*t7h_&?Yd!0!Nz!L7Rx%jKs zW6c~F&bmg~uUTSwP^kGE4`dPyb~HXjAejN7z>shq%7fMf9gj=IZc259ySu$@Y~P6| z%h;CoQDsxk)(wC4#qu4Sx*H@(3kESfI8($i!%>K=r58WIr_!3e=VS zdn_>2a=C2_8lrHSnunL=N3;BO>(SjGF;Q*QEGrp5$%BQX)T@0+JDspi@%zn*MPyv2W)Vkx)SFhr65ni;|;{6RF|oevnxO)2%Zg* zWI&$6l8cApVZVWInVF~kQch+vW0-^(PCf}7cLIo;FYPsl=;ck}kLy&XAbg7Qs-cms zbsoD%Fj3^HbdF_yV#aZd1SK0xpdCcG8j{~hH(@D1V( zZsYR}0N=*Q8~FaFR2IP3HxjUII`cIuQxxUJq+|JwUxVcSAl3oIc--b{{xi*2jpP{m zyMOv;rrPSJHg>##6@F58)mshLC&TIEStrBFK*87e9ebKHqfneZ%fmm($0X09(k-cg z9Zbiid|h*umh8Z*58bpj0{1GH&~~4ni+zYv+t`Ic$dbg7PRomU_+>XX%*XQQ!1u^> zIzHX+R{1`sM3dBUHv~^ohL7{W-Vkhv$btDCm$X@%2@N_i~V-?L5U?7S~!d z<12+HhQL>9sQ4^9N!ZST{c#VBg#9I^l%F-p45V3A#Jt!`TWm?$S?R{e=hRx5iKc^^ zb1;$Bm2h(u$;nev8?K>f4=JC-7G)~Jh|v^L_D3{_0v~ik$!z#MB7#_@S5AW4t?oMT ztQLQp&0oyKA;N)ivg~UZ6a(7z*h!8OdS|B_%h$fQiu@6i@bU!tkWET=t^{=+@@#fg zWj1iUmnS_w$!x~txJZm98eesrqQi;)3RWh~EPwS-t z`oGm)pq#t5S}6vh9JZ|mMfDDAVI&CgdY6ZFLUEQ-ubZB0b|PPDy$1@L>t4X%P}8BC z9vyOo!G9Y#eO0PO^}38v+2+8Ja$o6h89Jz~`v*F0U-|L;`uEee{vThhQ>*&+>^n%C zHqnTi6`IL>zqGUiTwM{F5~kGr@V!UcU$e=*(Q^>!eBlKS{J7U*34b*#|1ALX;j%gLUr zS$Kn!0v!jVl?CTP3qu5_@rne`zq!Ft$`5nU!Z}}V{SJC)OLDbj3O}@F)LG@MlxI+F zEzYI>w~z(wZruPlYYXp@ouGG~!OA{L?SXGEJJEQ*cZk_APIFsrC6!hh1ZAoin9^1`|TK3?_td8B7S_GMEs8TNQV*tI?`& z$U2;wRu_Ka%?t_Z`4N$)oI_h$uD`gZ79kV`6GA8oCWK5TfC(Y}2quK|kQDvzc9ievoC4%MzF7#8LGYj7K^0?2)iUUXUcd)o~!J;<_M?# z(5#rTJ?qA&L^dPcN(SCX=%~seI@VqGR_T2V>h8Rs)~8Fm*6>d~@g_}f%l?b6I zVy|LO>|V6THH)I{Uj!#VH@04Smh4EdwIM6(iiBgCHv*xcn^07VU5lXnASFSERVm#2 z9A0U0H(s<-!Z3=SP6rF^yVnEY;P98kFCNIH4ViyZtz-)~vtI09)T!R+>o_6Iv^=4B z2mM)~%ElV^F@)+Q-OR*s7x*=Uf?shizOSpCrGm+h440H10cw@f@ZIYk*m#&W?rlC< z#nr8b&l-J&?M!bu3d;rT!4ZMF1KB!F3MltOOfxi_gz4{62oQGvSS-<5<_hooZASg8 z)D&2OV2zbCaY51iO)}E&?LWRhQeHw&4=hgWnePV>n0=fCLP1H@^HK`k9_i!PJ-GEV z7+MBDjl>7I>}f2lrX2-Clw1)9@cGvO*W!p!QMb2<$oip%-p_mB^4Xy^IFX3!mEML^t-fK2Jbbz#tkJ$L z|ITgjk79i>@J)3Fs;XD=ou_)J9xY$`!lDX)kjq?sO7OXqzDl(6!U0Sqv{Zuax|=Syi$k0k&Fy^*ZXCrHs_X zx;}%fXxuUGzaKh>?s-?Hz884v^|dT;Z*VckqRjYRM^}5Gf*Z1GTg>kaUA-rO-y+~j zDC>!vB%kHxraUu}c${+N2w!+adnOw7YS#1dPv{ArgPDIg5^(ZvF?QTB>FyPr-kS1D z+Hz_`wXJr3S@jX1YR1a7$WMcWYH#yKOFcWlx z;9wsLg+OnRb=h~ex8QY-kZzqZ|JSv-oK#wFhBdALJ1uV2h{{0-^uUA==z$3#&;t`f zpa&*|Ko3j^F%Muuh{>GngBiW5VgFqI9;Qt+D zL8i!W1N;r=@~JppB%9bEhKp^rOxw5Az*@Vk>_)?Gb1v6eo%uu+SwQv%?yuCMoqP+7 zixvN7mW{xb$Nqkz5#`ANB0%*^f`e~&z4zC6_QMW+vj?GEv7BmQUiFHV^i5S~FVJ_O z8PWcwKYVw4ZSL#@7ZY{w|9L6MZ5hwXiu=y$zV zH1dHjPeHl*h?G2NwL~6UzhLXpy%o(yN+_jkqc{?2v$obg+mH}B3QRRG-m`Fv7JVY? z%uU6Ykb1rY18ap>|HjWl0bRXIkW`1h?$ccxN z^S9=#=({9f-@c8ja-(7IRF7aoS=~ig%m?%Bmaa}|({H}cg5D7;r?gNE)BiD%neQ>n zn}mHt`zm9@@!r-}vdx`cN_J_Y(dB zLzhCZY|?W-*taYSgSKEFX$jCb3pKC)5Jp zBqRAMh^*X%GI8Z^85k_uvi1o^ao!nGst@5#DMC+mIuHxgnEZR*x$f6}uC^P^+F9T` zm=}&yoIo?PtQ5;AN%(qS5_5z%3yw07ojriR`-}T-cGse1)wC-bR-Z{MhIrKatA~l6 zaX+kqP|z(5Xv*&s!@rq&)1uNNS#3b$idX0RYiMTuc<^@l(xFc*1)-)tH? z{1H`L!%w2|UlHghR4;z__V#sq-lAMAd5XZNAq$xq*T8W)h%&-u)G(eY9&fYATHa~`(=`o_O@o3*&+w{XIrJC!xTp6t=p{jpb8 z<8U%k?~cp9z@impHr5750n4`}9&CIW?RBitiXYwQ+&v?nVcu1ibCokN;P}l%Fl=2d4tMniGkB434jW9oe0{lno18> zl(2h#=+8>W+%H zWE$os!3z9@YGvR$)?%j*n`5`?m;kltPit06StaW=b}mOZp5(SrdATRT;=m+E%Fua* z-bG35mp~;x6#9kFoLghc2n;sl(M=5@ge)(iHVeiWEZ9g7n#sp3B*yI5~D#8E@`>yWm$_&nlXh{N}r`X?61*a-nKWvN1uqG-zN>jpH1iBD9(rIpw z9t>}4WoBcISA=bWCrPnUTqE0G~>wg@L6#w)Tx^V3~;)wyrg_*Lb+T z`!%Bl4hLnuBs=Zz?gY@g^$)5PtCWMf_h*pUx=XsBPu#Hzt3~Pm8bQai)%kGt@Zkdh zKcZ7#Xj~?cOlrgxi>jHb+Z)^bd<vSy3DjJRyTLOdWElhT3cs?>5C8k&L`Gwr*Zju5M zP}R~!Ho9sTl=_UhonE>Njb+gSIARXkIrMbhm$l-5$m6r|6SFlj(y}9?dWhMP(P0Cd zRZy4S*8sZ{IJQ@4HnOccp1xs&yC~S_0VQY2+JHiBaj1h9E$0O6IO!n8W=mkk?EhK z#0`7InHZ{xto;x4JSv=&(UQbj8VU(sZ)BH{TFGbH8}l^@oQ;aTcGIQshJYDN2+3~2 zgb;#*2_XdcaBpa)IADCnK7Xgha&miv$~cqXMfrKb<9D^6Jl0LsAz%g*LU;=%gzy$j z_&?nP@;^el=Vk_e8;fqB3WVSwp!LU#xRGMtyTHp-HhfXuuhhTunz9FT;DO-t z8|?;}TDZ*~{3j)e5HjuJ?37-{;3x|3H(+AaPEcm^z5fgq>tq22S8gBJ)~V#tHTnJc zw{%hP_5hCnw@? zg_hf4KK%0&!IFgCC=1}+aI$oFKl=<@si5SqTW7PAwgxHBikS5f7*n)2&B@h_$)I@k zuZ;;wCWnztho57Tc6@poy6IxXfSXDiPm%)h_-jT|A4OmjuEOHEvvpgv^cLr4KTPL6 z1k)xV4;_fE**#NBp5DPlg;R2<671O?i z)1T#2r#(Zh8e=m$&*3|DK3s9rzGpoB0i1bK(i$ZG!w``kHCyoG>a3X%UyxgOTb=hb7skHJH@_Hiw-LeLjYF*zg)GY1510U}nV%7`}YcLcz z>BiL5gUTP($oFfl2w?gqfVBY?9@FxJ)nXc-!8Ul3IRATDQig>Y$=n3%Djhr@*=?Zl zCD(Ure1%wG*O6IToac^0%l=G$+}DUARc>cQRqhaVW5R z*Q?L(_XFT47t%4I+O?%^L`z-M!!^U$)eaYSz;^6Q5yJG>IF|8mhk<|2UI1Pv1hN*A2-wcD8x98p2zfo7b(;IQSk37KYZ>>k4!&s_7!=vX}O9ipx_ z2+K+<-y}Z8Bv%RZ6`ZFLC_tl+TQu&FiqvnAkRR;IH`{|;v6NV@s{yOG&oobgU>zx> zB+jtZNrLsPNuo@h{x^<87i6*>ObFpEm=KZ(g9-nqF(CgV1k7Mpgn$`L2mv#g5aL_@ z?-3k?qPL~VHz@jh6^>!VzT@R9xb#;(pV-SWGw0vkpeTqvxQ(JWe*OP6|Gy3J{~4%T zWYjww2}t>|4i8xaqdEgS_p7^6QK|FhHTdk^9^8Eme4jwqx9U?6Ul5Xdc5|#UQ>yMX zY1~2bm<%s48Q~G*^{2>ER4}FSC@o*NE#J*)M5xJSwhJ6U-SD6do z)#vggMK54?t}AP|n8w_kjI5bJJj|}u?=tF@Q7qNL1wui`1P0GNi9~KfM&pHgBvIMD zvE*GEr%-ieM$CJ?!he2qPytH=rSPphMNgZvOa0+7M}|96)XYfOCgj;fl<&No({F`l zugmp-#=1u1&hZ=JayOqeBUy!6+7lLAo zVeiqf_=$H$9n7|>3q)Zw*~Nc9Nd}rgUgKw^#FLFht!%Q%GHq<;gK!^AjxcUzG*@w# zV!7KB@fcvPlu@bN{W64W=V8s0P(>YON^ffqsh2!x$qnz_HZXk(8G%^P*)1!w6o+Sm zX=}#MN4WhLjsq0TlEqmDSELtL%W0o?3dLH{7-Kx8);{i1G_O2rcc{*yTHR|EI5dVW{adZJM2516N~dGP zWr2bf>D=2vG0{>SL$XRpom@W<3XDGgJXuZXqjdf@aMdRcs(1K#ZpF5=_il}OeAya| zLVjTpo5u?5B0ISKO8l{D9i|*f?8S5jJd)glF-&XDXKcnuXsM4P2*vV};!-9s&0>IEDt^;E8;*(>oA4b2UPEW$dRd;3zx)b`ma zTFkQ|lR+h|KrB#z{~3f|xliP&R}N!bDtbcW%&dp=7nY0oR2b>Mj&>{YQX=s~$iP4`%6Q<2^K9f!Xry83NX!uaGG8{1K#9-E+n{?gDd>JS&Iq`Y^o3k?%Yv}-HXAH3TkKRqJ*HF}@2;SzoNeNNE82q=6u^W~ z^8hA6e@^1vc23e2&FDJsic`y5c z8wy1|6e>%sBfWtg)00$ncJJ9Ta*E#;_>vV|Bz}KQj6D?*>hI?K)w`Oq0`~MLu$C^4 zhmC9f%i?iaM|}Y&;iiJOtWgA|7M<(MONNx6z`>*16wwxKn~W0Q%kPddZ_d`C?53rQ zxtoU(#0RW6hf2Uc&Adh;o5=AEle-(7XQngvqQoj~6Kg}3k!7;Pvoq`5S_If}Wh4~d zvQ3IHr{A(&$NJqWMS_E+&7(Ck*_Q$e zZ;VE_61SgJcqus6ysIoDczNUwEZH{p>`A(jH^ngSj#o{>SWP^?hc-K&P>b<>+QZ!0 zw7MGz1taQS4pUqj=nZTIiRqE?WxmZ%N5?#=yYrpQt2vRm+EM)1lI@xlR%tdSf=N?LM!D1PalY#qE6xa z<2Y=yKX)fF@ycSOq3P|%&gakOY>*yKZsPo~4!YpMH+tMLnY4@_x`X?O6tWcog(H{{ z3P&&@%%Pza1^Y%QMZttnih>ED6a^DP{SBB9YFogBP}_1H;2@Oz8wRg|3OHWo=c0s7 zBNndlj!Tu49~~0~yH?1w;JTj&>^PFG}S3Fg~9MA(0mC4IRj+&tNgtOYYvweH-` ziQkpmb+@35d1|SsAkA4B&g9G76t+CK$jy$317vm9{()}&NG@5O@6HcC-P&pW5i&AO z`F`gE`omjNdtE>U7{+<}*4mR^_fRUy*1h2POON3?(a!dphuwA4i=S7_G;h{!02w$b z!Ja@?bIWri1@WlU?-sIW3O&&x^0g}KWP}$Xg1?SK2c4&X|5oVkh&FR8`< z3J3*i75?OO-P*~VAMZNe3edMfdLy!s+ibR1(UsqufcA8bv>^xw9zqVmWZOu$&OCkA zzF~tRK-h#CUnQ4NARRf;r2g!FOc1b-8NAs1yIIdKtanyKR7o-UU#bM-hF3Xq|M)VI zMRep=v-LpX^$M^TLL-=3lbK!5s`su%Yg5OXIT?#YNz?!DzMST4LQ5x#(Glqk7SCm)#og0+j z7+*UBdo=aEMnW9P=6H6vjy9ZZ1ykm6LOPKZ(0o4PQ@+og0WN?A&5Hk-Fjl`PIy_~{ zjeLDGBz5xcQkW!PVcIabOB zaPJju4>!Q_e(G8VE@+7Ra4U@X?F(VHL@^BF6^Z=k{;zfrpInS%1-GToXh3;lM2LGWGFy&?IC)YI_hA$3$u*EC+|;rK3ZD3={ILmJ2GT_Y6; z!2braYyTU>9sIB2|NlMTuQlv%rG(R7yLAaaSMicfHSlB~sC(=H8_15Vi?&}9v><$?`jbs(Q znB>XotefNm(Qsw3#~NjqNmBQExki0Io~vyfNsRg#!_)2C838SfE;8y<-3btKv3w^R z%p>tprxC~o&CCPww{NHBO`JZiVqT8CBl=my4osh*Y2EMX6Wdm7*}MP3AzwegNC|hl zXc7dN>i84OK*;pWd~fde{iIKJ*s6lI5XOU9#pWoGPC!;U5o{e^4K2H2m)#`hNtm=p8Dh#*1>KZOoId=?}FakosmaA&n)s#$UPYZ8~az?{SqEa)r^a6E&%R&s?uJ($szLu6r|t{PC#X(n-tdvtt}| zR^>+uJ$oM7n<_j?xdVl3k~tWCpMX|@dZ0hU{j+P3PVb`k73pWg5_?jaLM6r~$HG_~Il0CpDuR~hF7HoyKZ!)?HCBiNVu6~V-_0U< zDV8r=?9}D9+?IIbjNVK|Mi zeB+(Q16Ei~hs$aq@n`8j*;6_*wV(voXKF#2LHfW#irzj`!Wxb8%5*01Ye$mhrQuxV zm7Hi16ewUqXbl}q2o0^*O{`iJR!O6?E@mE(^ei3w=hy-~WEmxRWI>PG2wnn;Q7|FY zWq=8x7zGnTT?UvC+C5-GsCfVrLi_Q03J#J6gK+R~i7W`{u6_Jp5d2z}EPIn)HXK=< zq~_T!RU@lp-ZPoad)K}kBn1aC7ypHG`BOuez1!5BK{ui4SEm|2)@Zj3sW5zGTSp#4 z>i&b0dCui4gj`=(zDfF{KB4=qq>UIC~NQ^sHuwkb32z8@dL9MVTtp)HFUFgDwnNor@Lm0j}@fU5cZSug*M z?U9N10eoIpTqd8ef2mZ5o8|mN+1q^c*tEI^Y zTG4r9I{QLZ=?F3-0?A^z*`*rTy&BtSdU4-? zmFRPE#lajG@E6hBRJbm-IAy*Z^Q)1|hVYyL1tc9W1AunHmO*-t^4C1GK}2GsX)Ap} zlCv^aNVw{CE~vfH{Ns+((X@#_bBCGh3N5aWhM5R8G-}wa11~4C z9IR?f_6&ey-pL0(a~3~9>wB|i@}6?Hi#zuHg8R4R1r+<8oce={OPJ2t{f%(zRkP{U z_@ec$aXwl8OBb89QE3v%y*CDWF-PN5}jQWoI&&pD2UOcJ%S$g8*Z#@KdfrqaVqyh7uFuVn43YcS6XY zUsdl&J|%Xixge$Nbc#`kKP!5btM~lSsxs+f>SV6^Z(8 z6k5|Qs*ru$)Togv*jFh0Y_RQR7-P^)M%>oiH*kG}=?X*LeE3ouU7W;EQsNHOlI?!x zcv!!VW4p)2Ev{k4Y+9Dpny0*0L2H6QO04?@tII?8vrm91RS)ny!sy;F2Tm4RY7T)z z5yuDWaw$1USB2xFn|!^6+@z@G@0#C-kaJ1XOgC`QJQ}aXz~WCASe*5~3MKqt%Y%dz#VO7bc^Wc=YuJ0UY1A_1DP-sy5`uYYjIV=Gux?MFs$8BIP|Wz;&A^ zp=K7lD$k9wL3p8sJ$KK&ASXuc%hemr6j)gIJCuY#(Ist`fkoY+o8WwcX>^3w+a7GT z`;-j{{SQ)jG1h>sJBvD0MB;Itip6V+Y{6)q=N!)(2O@5|kZU?=D{R{50X+y>nEf3J z!FgtN)zjhA{)u0G-i{SX5byWoDqJHeL(dA{RPkDJptOC8o9Vb9YH)bpSl)57J>V8Q z->~!fRc(~#U6s|MSHZB%(|=HRklku)SgGk#HrFsE{ZwYL!{6QSzKNZlyL}!}Yo{Rz zP;dT1illf0O9VX)B{v?m&6lb?-$dwR>d@VOrQO?EiN6l*fX&;XnW|X8*Ap-IL?YdH zZcc~i@ghqqAX_b({b@)sEbI<2L0?k_(`s4TFmwmRMq4_3KToR&+m&`;_* znPMtsfrSLm57$lRv&}Rbf}$e~Njq(a3nB^DjWuNV-WIETw`zL_%cJ$XSwiX27UF6m zEM8TR99@sDP2;0j2h^bqj;VW+y}c3@!0K?RsT2(f<+i+n@Upy4Ri!NEhI~4n|r6v{aAnt8k@`#X@NmbfFuTcX+7DJ2~6|9=AIAF;fVXMiK z-ayNUMGcMhH{_?W^LlpA+=bnUnq1%S5S-dn0inRm@il3I1YqHtHhKj$*xZa;P&&E{4w^br|c^B;GN)YYSjB+6rP&k4Kp>PBfLepC? zA(WzELMTOJC@jyYWWN01+!5mDWackW6}jnyS_~fvzb@=EAY)wqpY8z>LTwA!H$rX8 z^%VSXoV%9ik}CL2t=Xin=`IfY*}nT(>o)yE;2OX|7z=`b5Cs1_{DXLl|ANrh+Wj~D z|4G4x-EkECpWvo7sN>fhn7?^gx8~|*B zBKsAUqere!fo8!5RRK8s054^CgJ#}*E&i6sVFnRd^>%|LH&J@{AE*AFn?R|Q3&q}G z5a(rLQ|#*b;oW_+_5zG-Bl*b{89WDJx*S%ZFPtF4djX2WkeN?Z{|jvd5R#Fqo)e7CY|RlvqUr zT?pgJqoEYEx^;X%(kh-WXwORtN6>Y)%%?7-B5y#lX9GtIn;_&eFcvZ zE?O$?0|EB97e_0NRPpDAEB?e+@nIti{j8{YJUhzK=)8K?n!fkzjR$N1m*kdlDK_G( ztlMLSEY|Q*-i?ulpBrMwp>-=85~{TUHeTSuH^*)JIv+T8#s8es%5t!-vOZPE350J@ z7chEdu=MLS1eoK$25`>4KCFPMhdh!e!LEF zkQ(~m_ICf|3>I*&II$cJf|7=;p^HhjbO$XbG|N*e2T9%48)oI72tnR zSF_`vq8k^NxPJJIbsP_~h9Rf`@6Hhkd~{gBsecp(us4=o367u?^8CHSJ}alL`x_jR zkLa@X)&BX?K+PEbp}_ozbA@L^nFq%K?n6$@8DQg5dyf|8w{1s<@F~3t(WY%F-+w5ee{yHp`jBmk*uX zSqxOqQ~HwKv>6q$r-f3%3#^QiA={6!buV;byx%lRYIl=*g+JqNi?kkhvoZ^3GPU=w zj084-E0a)uPTxZN( z;8zcM_9u6e(5ysixd4R)Ne^F}LR$)4WnuzZl^~N3$Au4rEd|~pw-4j7zc|7FRkH(o zwyqJJ^hnd@Ck_5_zt}u~UGG~Rw>EeRA8DKO38CO2GYt1uXrgytZI{=2r=Tfvc=4Ft z#Iu`vVxMSxMi5cuVfr$)>JTv$dSF5*^uUDB%ooha`w>hC?Z@i`2cakk;QvOlYnZfi ziWlja`;Jh)&Wee8(+Im#;CcKtO#ZtZ``@{TzXAT*p9bPw{s#Dep2y*S`?T_u*X?Y0 z-_Z?MNni72P5P&DoQAJG80h7u%m!Aapgo$wT`Z5QQfG7|aK#bc3adv6z9+0J9Xsv% zz3Wtl5*7gcp~BE3CF~kYk;b01iw(*5DH$&2Rx?N*sg2o#o;?vfYQWmEJH%ZLh)B<5 ziN^_sI8qUF92bF=>If+Jj`Qz?+NPxg^9=Z!x!*Yn4ne_3N7;g}wRH+sul2{atv}o~ zukj3Nc2AW+vNF#M2N3RmCxGcZkR`v~`AuOh;|C@du4=A*v89d}eY>bN?q9Fm!KRsi zx-ix}bsej4yJlIX$CXaHE=Kcd5SHLAoUE1$65~aOw?Gnpt07<;VW^?o3tP$B`($*O zYP*r%b7}0vtG+;-&~4;C5DT{a2huj?XFj8x$yG2YJIt$(MZdEiKp26$w1Z2>5wS`R zyu+0s2ei7a@f6@{j_0$z^Gat89END#RGY4>WB=}7Iy9ap|O>HEIYp@cZ z=RYZXZ!z%WjkHkvw;pjppW9_7rNY3TD;6ExoEle><}##*x@~h}bc{d3sP+)K@ zw3M@9&GIRnPxvu#G5sS?QHS~L-f!&42e0FIIE-&9u@b@wkGZA-YYsD#Uj0fSVQZB( zkv*xHjWSE6ww_4eNR1YuB36lwYU}$V86gS&8tOv`Ir?jImsn&%lqt7M^{*4GE%bcO zXuJ(Jl<+=-%=gMnfZO6>^*}3dS*@XB(WS{=uLl(c30)H?hhz^Zc-v84N#&es(((1x=sX7UHpXg_5Os!#ckJJ^Ex(86ZL;!fbqv4Lj6INX~ZhAp)SUcFw>std1X z)6?!;Dtef+9%#g`IzsETN#i+e@S;&&b(3O|2 zO1$h#w)Wj*C0k|U**L7>RL(Q+&~hkwd?r%UESVmBiFOS{yqEY&_#rWW0Xz{U+2i{; z!Bfk6&d_fJ6GFiZCWNM~K7;1_P1+e0I*u3(e14Y1@vn!*G)~EaRTYaCUOje6g(mA@ zLMWKQgiwrv3IEe-kiYRitp*W7TYa72|Bj*{90cJ%2!sEI$!qqY#lk>NDp4QO=JDSA zQk|#;AqG+88iW64F0OqH;#@$g2Y&m1@H35K5oQn`*MHGsvgG?xbYX*@ zcFSf!Pyo2o1lB1nYZ@YKrzX?&3DSyZbH>*DmFHsah``Wk z>}8W6|A_09w`=y-VV0of=HIPiA&@h7q3gA=2^efnswXU}&f0$fT=n5>n)9JPWD_2k zr`h1jmnyBP;Kd_1oZ?RsdLH)_HgxFp3-vTg&UI-P0qebB^a?@=>#SXh;aw%8?IO<- zW-a*2nF>6KbIe}Fl37+sF#yY`HOR@OXO?^@>734@tD~_7hZWdH4KGHIC=m(GcIpm* zaRDoSN=vU;Fb{SII=N==FFDVI1^?u0kjylf8F*J<*p7IB4V+(p`LcF;kLCX2%7zVt zJmaC@t@z$#g}vb6CH33KA>A-lO#T?wiLtMDr}ysRsGU%72DnQi$E7lUFA(8Q$_Ssl zQ5t6fyvcEjjq;qtucl0tj2rq%I16V>fw%rvT3B0u;xh{kG2*Yc;9#ix^B9}t+lKYS zb87AP+lhFp`*D#h2WB9J(#q*ZA%CvyAC^?UV zZ!7%I4j#WJcvrW=uyup{44So?S_={rjhCAvhE6vl{5W3tctJmA{taIlUV-OG`yi+S zW+AjJZ~8Q!x!qZ60ZWlCk<(p~h7woW_TWk3s-%RQYs=a25;PA66GCwdCWPj}U_vOD z!GusQg9)Kr1`|TLY!cJz<+#8Rf`X!fBF0=_RP5MI6J$@U1;}Q2l(Gm zbd7T$7zE)Q2qi)A|2KeN`_ujl>v0YLR6%3*n3(pOJXQ41WO?hp8X9lgUE?OG3}?(X-9}|VPN(d_nRIrf zmC}f$!aG>CjTg*Zw^)&m8=r^Xy&f$9lmx-)^ScA>+Z*%ZMr3ZxZ5hWGbiNn!h|zcC z@``-A4nMOlPl&1mEH>6W)|3pP727BvEV@mJl6hm5Hra_+Z| zKQRYLjVE|f?=~QtSB(I%U`th%7}jZ4_6lbBc}R>{R=3N1!f8t65(Lv4h2sR!lQn^} zKsg}KlihfHW3&R%SM#p`Yd@m&^9Ds^mL)Fvi z^=h(6Ds4ZCqM_~^kp3Qf>^(;6068C`W~6gE}!seqHsfHo~3l4C@ET>$y;#fC-^#Fqja^WiTO>%V0ui zl>kf#O{_-cXql~>2t#so@Lu11k_VS41S#&0 zfsh-;6n#NypcHD%Cl=6xoUP{qQQ#&iWTSSHWkSk;}uc!_wsBp_N-oY}_Xhugg#=|lnR%`$7v zgv|s;ZQ!zV8J+w{#21DHgLI06yzNr+WX-WYYt?hhH=YQXg=>IZQ3MD}=lqkF_NPG&W84O(ipym9B> zi+KGA-#%9UAH2h@v=}DB&pYYvoFmVPmGo*4PQxB9p)|RXe6+Zx74BLLAvahkbo$}i z=e24jhQ@W2XM9V%hwVqI>_Q05Pu`MXrvw-#>OX_fY>;K$3&HCGb2aYGXS{BgPFc>N z!^=w-E14WA7xNUL3`B48(B_0*x58UoF6O{oD1q2dNn3Ql(KIyEX&phz)DL#7woA!= z4>%HH8Rbtg4&eya9R{)0apBhIN;KeShH3*6&cRFR(W6NLz}jj<0;M zZHZrZOpi)r3lO=iie{|2F(m?|#mI(Pgq+bw{4tPXxAs`ijZX|1+B0|`n<^{6d?>|p z{$)%+*DU-FMdr96{m|i22JJ9$@ZBV7El-aT;xG3-RNNk?6N^Qp>;oM*{Qb~yffD5t zgEPhPs|MefP3E?)W$nxbHr8%BgP!U@tHA0C*8na2F#NqOX5Tg%xV@67|rcjE43854P z6GGEqFd-DTU_vNv!GuuUf(fCx1rz?KAD_RYl&P~HzjOQZJNwUC+NyoJVuu3<3^&a( znGISq|C3mUg9xEU=sLjvhN5ev0s;7ckp*A-^1ng!+Q%UI`~NEb|K?1t@jYAUl@h!O z(&GK19r#x}JC1aw%Fh41!42qolJ&MVbVM;oFnjyny%yq`1rc#uPQPkTQTrqUSSuGi1_8x8#q#rREe=snDrHEh8x8x3Rr3tJ#Nn?I*_i1*Pe16wHxr@wm z{`;vjD4t)admW!(JnX<$+5rlE_Tz2=5Lbnb+y(~U8pB76QF^7swH%cXj74ikLe52j zXCJn-4o!zDz9 zL0D=^^X_7%!UV!S5a|UT_MKmKZP<#P;)rJQc~&h-Vz$C(OP%?T7tDbO9p;LyX+KjN;20zuwaB0CY=nf%|d6 z&%cE1cr}O(G9ilUmj_(=-}vPF}u4bcRDA{Z|S;w0HI(^!6WXMwq!4Ipm2XROw}(< zpMEqYN9Q77RJF=ByQ@L{vm01jHqvKq*q79(Xgq#j+nTW#|i~BNDM7T$p@AXk_Fi8IXt45ljg4H$v$M z_Ki?Fg1ym)mI=UwP&$GMp=AOvA=Kc2384lDOb9hN*9rdb82mTTU1KnaJ@{W`@PAV|^X8umA1^JkV(V&RnkdDEsd2#tz=sKnRIbJuiL z`_KbP*v-T|vEdw8Z~Tlb?dFG(vU7+dzTw^z6*oG>tSzhEm*LeU(}!YR9>uT&e8q!p z*V%~4#iV|#?frI}1f|I^Y8zBALIV2Ll6Piokf?*O~j zk|httSOq=+1%MDnr=fHDC!fz_v{m&&o=knVyz!Y22n9M%|3TeQYHcXH!^Y1FRXYqc zX>xMTT}q@L+WdD+*xO$)q#jg3$aQWoJvmsu%B!UK(OEFXJ!2yHg{2HTl{aj6^=xru z_!q&4V=DxC-Z6ZIID2iPA$X1;m@ewU>G@-|tGJT#M%hID<`Z_mGh9^H-!A;`wo#`$^ie3k%vGmFev=fgp z4Q=nNk{TY!%V_>sJA0Qwe1CwkmeFqD;(0km0C0yXrNZ&+D@b^v+RHa||x8HC-9AY*V55MT^!WF_ESX#RQF?%|Nx8Qr$gdGZ; zXs1KQE3JQb?L=%8zsxy|s6BRegQcps0xxA;-lfv-SA7e%U(1F;f1K|mkcovgPm&24 z74g0>-gHJWJ&HYbx}5r59l+bs4~Q($J6axPR` zgaS1|zgy+h6{o{3cy9R6c;@>>ibx>3hv52~0qfOi>WC;YH!5I*oKPD_)svVc?GuYA zld>DfY*Dgt38Vb1#pQwNN`{FWl|U%4XX_fl?@$Fr<8!Ca6T3Z-E~0vYX*#@e8fpI6 zFx=%H_7R<5KNNb5o2Vz_mhZXB3bvAsZfc#BU{34XJt?JlnpnJp1&5ReMHHA2iYPE4 z6j5M8Xbui0gt`ncA=G7n38ChJv6cJ4ir+0ycjX&u-FJ^(W`c=6H-EzsoR;>wY6{J? z|MVk>5NaO4z7c93t`i)D!T+vO4N{>80XztU{~iDTmf&9__zBOUo!eVvkEbJzKiRrs zFSj$^T`!{lmEeCS&%DkV66A5#Gi$#`5%V>w*+dG9uYC>m%)+^l_@BN`JBN^CrY9?B zZSlPqPbnA6a@`gU#}9*hN&AMs4Kt-Jf@G{0mPh|jtT$(4dkS-7cc@jd^^Y)>%zVyL zE8aTE@}SP7AmwgkrUQp|XdC7e>?ejgA!_pxH@x^sezb8ubvMp~HSmQuq!Z=W5?0s} z1>14A88kSOif~Egll+NprMoK}Ww?;?z~zp0mQQuPPax!$8{>L(oNcpT#PlYU?0PZ{ z>F5{gWF4v>O=~Y$*^i9F;!J+eXy$mPJ$fs?aYV?U6Zw>FUSiqP@pySU)Rrgi5j`o7 z2M%)~e}A~yA}WQVg3HsJaUQ(EfvGN=ggSDsgcxd0kJ@#`ezK5 z($X*tO>%Zlmlu)g@urzb^yVho@Lq=A%|B>Kh*Jj6!|^WYywmz(wbu8{clTKBXYf#X zr7#800JX!UiW@_0-&Y_Os9E^)YmuM~b zz;LHodX;2sZB?hWGtaeRlh&(W8&A*G<1{5hzx{=!VdMeKV-T->GlsdmN-aw_IN6!V zxBPWwW3ef<>)W>S4%uClC%~%#ccqbu+^40;Kc+~YIjv+dbmzZvS=<*F#SZ>hMi4{F z1WOP8Zk2XVk=DJKVs8|6QEE|pj^&xxF!8%;HsK^5Ocryu2smR%Crs_kt?z*xsy5uVuLCuc))~E@PG+n z4h^*gVBZL}1Ykm_B>)pbEdiJiY6-xE(85E$vXx;fI(Pe7=yBE~UzggB{Q>+FDhnN} zVl#4272Oc1CAbdoe}}<;m%xJ%8pK=t4Z+v44Rm2X=-y!3ZkD@nSs>&{27r-1#^HeLm$ceuYpId&5fh%6=0Y*k8Ju8iOX?%!gq z#4oG6M~BlL<+(fO2qAx{OjGwR`iXN*t!PAPaQ0#x(OjNuBj3DOBEi>-PHHjW$%hT! z!e*RoN{ebl0_5voJU9EphK*d=F=S#KlG!IC;av3!AmpB#-*4A_#CykdD?KHE+=<++ zl*4;UV%$*qd|!;Qa1f@#!tYkO&X&R1U%c$PINe27`((dpgu3$f-aWLoAYDp53G`xM z*SW@r>{rc;euyQ2W)tR&uL_QPw2F(Di0!v8#0o~b|SI4-vMV^_d zB!O}*#@)}HnqrMM$02SS3N1~ZYCtUKiqpghgBMnNU=ShF%x^{N)uunffPIYe9U? zNiwh6gf|KkntYi(imLQFtMx=~$xX@%nuri!FZlEIQ9mhB3+5+ug|dvsRs+(iJ5(i^ z-}6=SzV#=*$OkIGFupFfrug_yeU5m(Z!6NbuwvA?kGD?vVZooqk$UrsAFRNk;=euJxMAmR|7$ZNY!xSc=2eyV^i^^!q?O}>R#$#c zeF$koQA%qN4V%JV(9mfD2MRfwwH3TeJEa|lTR?hpJV}NdRU=DZ)}9aSkT9dr8w5hZ zmVoPu5)l|Eh72VrR;zBxV_May{y;W*F~Ly%j$^AHf_MpB_IG1``a>#B)*7t{!_cEO zOUb+!3EI1ZSgU;`&ZLU|j4+JBYy7@5(}G?{N4B8#G4Sz0{4)o3N(H-(k8;zGo}Sz~ zy8Z13lw_=|p&WZ(aP1AloAj)2O)yyv-Oh2*_j%_f-?nklEx8RP8JG|XC@>*3xn;d? z=r%+y6qLv=b$d_Z(J{@H)gGA)viwik&&P|Q7qn24feE1=1560D4q!s4bpR7Wtpk|w zKOGLzYN#W)&To))<{)_g8^^9O^lucr#!xQpg&aDW?=RpbWAQxOw@9*1HaM^SZ;Frkp)1c8rgg6U;Ztqkp;)c2$f3o|6T#c#d0PEARp)|4RRdNDXkTudqf%f8F(IHqblBR&CteJw6J)!2%m~9X^#7f zzDgh6Vr^QE11ht9Up^3Odf6f}&)BBxKsX~-cW#MF#1BOhf6aTe#wxz#@++`47JQ!m zO;uHbJIs;eY z3{=o-{4A2+)>YWJcoLAhkFXI_g=F5Z9Q+yM`*h#=bKI|l1jg*KYikk3wEP}WQ zQ1|QTJh0^F&$|^05wY`lkCEsYRgwE&AFzFnpQ+FwTMIyssnQmnvb6!$yb~K@d5&D> zF-sc}*#zOr#QyX=v_!klrPq+u7_a0bRRDXl;;WvP-A81dc#KMP`x^s4juZ?1B5`3z z(6n$#q(>_bun=8tAg@fyfxHZhz<#7ne2Z7vx=YD^9;>?ILywruwzhbi_ zXxOIlVbPrH^RNgf@zc?R^Rgp+h~m#ju{|>V!16||>di3(pC*T#5>lZ^{)+W{ZLj&` z;Au;hL~W{W@e){);y+$tL(DF1y&(}v0F#n5=wZQ34I1l{O#1I1{f%giu9&fbb4MS1 zEEG(-G$&CC4M2HgdV2i&>wb5=12(1jB_f-~VJdLQ0=TvNJ>JDt*}^sSIAr2t_u;H; zJ_jI=ln5q-`A0xbe5=zT>&U?UJvg6-LuS6CHQhQ<`ueVytBY&m9V?dBll-CY-+yXr z11I{z`Wj~`I$Lt!Jmyp1d|)MK5H-5|_>E@^glD8{j_j*1Q1A_`0hMHHA2 z=Fm`~f?~!s=;=~^3YJ$x z=*U8?;lR4-pNU!xv(-8}WsT;`eF7%$1S8P|B661GM=IEsaEDqFbohP1;fV4>ZMg+C z`q2!Gp1rfI0|ZcShCbdgM)hn^=13t=xQ$fBy(yzgjp%QLe(0XUbd8|HZ$(qX}v zAcUb;v~TM=9F_WNC`jPY@^V;ec9jt?v6*KYcuzMYGiA7b{&V-(aYV8-RZe{6AVj=+ zPFlKvx^Kue{~0W;`ZG@#z6z>%_TrU)5oc#&bEAvNnP8Dz;v-_m_WfP8xZv)W!1gZL z4-mA^zHy2|;%5r)Rx9LxhL$L!Od=NDsuM6!F8x)L1x>+!&(juigLwQeOt5Mw3G)VB zAlL%)))|}OrJ4OJ&3ScN&0`R9q?LSn}7m}^Hk$ay7IlBkB{j}1!!cgm~dw! zVVS3Yhce%phkIy*|08$oGfx~V8YwF^!_UdUnFpVa-ya4Bz|jCbsD$Rv4S|1_VdJUz z>@WeDK7NGmsm0A&<`uIh(wqttpjEJW1;xS7f(h9|-N~r2ij2>Fn*3)I5rmyJxl7JHNrKcK*3vYYTFKD7{Er=EUY8Hn8v!E75 z;qS3SL*pYRR@Y*y4ZXPa1@rb3*Rc9EWnwD~QGs3yYvmz`F;n&(cvv_#&BwUusDMj~1+J zQRlL1((>(IiFDJ_PYk~7m`>j5ks*VN^qa0aU-u#N1-70Fh9OR_&d#$>hc#`fm$WFg z&;&ocoOM^*w0vKPkTwtpGz)CJUjsPUU7^rCxG9Cw!T&40^?B2R;MbmyW0BqC4Q1(% zlb#UvUW62}3qhF&CWPj}U_vMy!Gusaf(fB;1QS9{2AB|PGQfmTlL01#nhY=@^p^nx z_%%}bwdk|@J?*aZ(y03k|@JN9-FemOu@{Udzh*)Dksh zd3D~CgFdq#Z7TG(^$3%&%xJ%vKyyWQD+#-q?TFOs#j!U=?Wd(tePRcrbkf+QNF3}& zW1s+>)V5RQpV9sq5jE!6h5T9@i(jaLL<7j z#s0cUC_>1#O9Ha^(DRYX2(f|@P?cp+no<;~?U{@Aq|D5dWOA_uS*AE{UFBrL%!(hr&j`LDyF>;<4qyiylhhVSV$@tpW zi%b;Hfjc2!kPPd~d zU#M3#ifKG$_cA-jG_PO+hy`0(Og6!AkKB?tSpS8h@=*psHIdi)oft7g5;4cO{f za)Glzn=w1E9;!VbzEysqhYX20VX&?v8^(A{psV!EMV0gp@MFQY3+h&cx)Zeo{ioVQ z>}h1bZDpO%)!~X)(arYWQCBXid;nB$B3LT?Uz+ncLr+trNPi?Ht-&-ynypkQo{tWflX1I79n<^=z?ZFCVt z`$0NVjnFgoAr3nM7mumVcsGkrZjnTGJ)z?lk=$t;5>BwP+|5kVnapGmybUhK75S07I)(y zT&2GVjP||}5p`-^B!rYJ0U*KL|KBKijqm@?Jp7IC*NjWx zxL9{Ng%?hiHLfVv!N!y!qv_?f*nhJgf0)2My~=^wrW`d&A}^M=ohG{@QjhVr3Qwxt zFWRw#nG?7PL2oOTOta&C6a}YoqsWg&>oG3R0s5A;R!k?2oS%H28ZeU%HL&jf3uBV# zEboeseAq|_ulab>$iKlv!$9fwp5U`Bvbw6TWx21?$0NTFS&MN3hfBKU4u-4A z5;^6>ES|rj5)7BLJpDh!y=7EZUH85%At4~GNP~2DhcpOCcQ;B&iL6%IjP;3`Y!q-(7+wWwIOlG(x+_czhZ)E6OzP zcBUkG!rVZgvgqtvsQALf3z}A4jh*9>TJ&OGwQ#1}?9G~Is`RLy%+aHad}lQ(q$n`= zSNVbDCok5?gww@9Te}$EZO3L<{kA%DERWCtYI^2YiPgP7*R()~ANmBB`1yX-KD{>m zi@gauGs^jiy;6P5ZkWTwZ!(rc?7-EVXZ82#9DZ2FzD-pLee%l=EBmXq|EQCML#|X+ zbVJW~AQW``7AN^IETvY0^QHXv^V;BVxVQplBE+zhebR;&k5tU`f`BapDJ`a!m>ml| zzgr(@Op$l{r>?l2`RBAXuiy+kWAp_kaKX*iRS$Ne;Hn=r9i&iNmidKp7<_L+GJau~ zGW@mNq@sD<^mh(0FYR#`5q<(^TPzq@ zR|caeKgT|h*Vl<+2FqYfA@|lvmSanj{kUT^SQLko5csh``TaK(DY0%qNe1HlP*F!m z0K%Mya=?u3#Rj`VZ23Y3e$wiWMa0h*S}Bmw>av;*NoM1(EiF89EXyx&}1Qv&_o z*8GOTY+b`Q@7EM2C8{6VPrit{Zf9|P5N!E8X!6#t4WsRVC}7a16#}wnT==3vtv+ql zq}i3XqzbgZ$6Gh5zf{B(1-+M~d;D|N9`a#5?`wXc z;uuXNun$5lgoFlrA_R?KLI@hId*_G^PdbF-4LM`tBg*pyr`caIYSD#xa4tE)?M#J3 zoCBB;QX>EpLK*`mgct%aA*9vU@eM*)5QKuj|0cp-V+M9y;f8A)GLG@{Up7a= zme8&7sXm$4b^u$mpJ8}p9S$2A>PQ;(#b);rkJi}hy&Km4X!<#6micEN6rbZ&C>5d| zL;F`A-SzE=W{1OTNep>4er1WagoIB@%t$!5fpb8gOY+J%wVlDyI+!yFSANI0ZGAQG zLfBfOB`RmopWytbcnL~`t6_S;%{k#y;^jkx5y7&O3pU2jt-J9jQGSji;VVog~x@zP}JsNYLG*e(_IFb*}SWX_k@cFpvWle+g=1{*GEZ9_Q zYR9=3)(=18tUnqTbX9Wv8DwbugKvRf>Tn&e6u4s~jj*+GMl=*7pV2WE(=4|(N3fD&msaSU&4-$3Fu=ed%lwikBBe( z&zA3cJ_=#IbPG4@u9v82rfdYZocGYz^7T=w%i7*~*&>-?G;HIfCcUD#jXj9hjJ+d9 z2hEFd^=nPN)YB_%mfwmNIy3m(udk1}&VwnGJCG&4>buM4XeD9dm5t4xi=s%4f9 zMe@FV{_TlA7~sH1^~)pL$?#ng?pwC%wry%2a-YvQ-FJt}hZOb2(^1{ofKX8Kr*K8d zAD4+Cj)bBM>363J`!sOZr+ZIFSy^xQ^t-#}yTH~ic84&z`mXlM$x{>F_=u9T;U5LA zvLemT#?&zGWLxDyJ)(IJZ|e<TZy@$9xUDy*bs#3(JRzHJSH zpibg@oDSdH{DNtKZ2z@j>MV}k8tpQ?cS_>q!6U~UIe+ojtf?UQg}YDh2Ge!q_+@qTEPDB06W2d#_{5cmfl= zS5YkKwjp~ooyV*Z1#}>E`6HQ*t2~TQAPr;Pun8N@$v_50B1dxdR+y2M{ZBILEG?k^ zYa|lhnu{&Mm5Uf~w9;@#7e~l(?$gr1<)w%XRY|uzJs5^_-pyAsdX-ZjDdYQ1^GelC$4I{n zd;o+3b#{M4VRHpC8-91Xtex|XC}iTK^`4`M5Zp+n+x&ii*)&BD5m=e$h2U?AN@Zl7 zI~CTeoqQ)7w!5nhqtxA0*F$`T-Q6GR*Fv_gCE`S!6j1>>3y@t zgP2)wc)*reDRh6~F|GH{j-tRGF*qI3YgQ!m?fGRW^$6yrm_e!z5DGdEX&UFrh#dH{ zEIpU6P|<;8zl=c>ANQXA4+n(L`1I_KwXmc#dq}42z}YVAmD;RNR^>|Vy!{@FI*C8s zGGGpU+|l#r>Qb<8_!_>wZiN+5NQSJ~E&9cvmc};F>J>X1tn9wgIjD6kW_+9hLF3PS z+UY0y)ZQ(8fm`>#6v;iVUniF~L&+Se9Pf+gl>g7c77nYQ#(Vm#dpjl6=BTdUHu2&0q`mMdhnI^UV3WxYz0I`)Rl8Qo-lcR z4qH?_Znn0b3CupC`kP0=an!Ktel(#9#DFjDL}K$y2$r?nAwYbgnb8P*k6?ECDt$C6 z)K!3a&3`-2)PNtRvN~qcg{RiqZ4-I1&178Q&8#pisrjec9~FZ=F@jV%0W7?)glw{9 zWPg^p-L=uWg|5Dk9Ry9NtAu1}$&N&WWV|pK`$t2-4CZr!dP2cYgm&R&GOhq%42Q8A@IBterTp;9Yj?{?d!6_Kp>w zJB}zJGS8)FXnk-5amgv2Me22mfH??os9ts9YRiOJ zT4^z3J4_8=ZG@V}V$qYmwT~Sp@=S@AUdr%(gU@s+4}Ux;$eM^`Yc>Iz1zlAZdE`7; zEuQX~g}aPQ7e~s+q|A#bOhfC)AXxHGIzR8r0E^gE9p#T@^rB3Pp4QjRt3K|lqYlMS zemARS?*hYTkDma9f{vkk6bTkXv6K4%dUZvd$xMBrh6$XW=hs`YnVj5lPSHaS4V{ZjC zg%9wNz9p$5cnFx@OaF7c0vJ{Q88NnDdZVmy9B^Ss_dG`s_EHzgp62!_^ud4rfob7q zDG8KItSY5FV*=tSp4`n*PJg$^!%Ue;Ii)Owz{_BvHs@s455xj93)cuPy_VH3tUREz zFk2&$-fmV%gsae!X%rbtFa03P=jludgcD9NqbXiGUu6l{3Uqvj&v$qN2}+S(b2$BQ zN}PSF&EyZs2gAEjJS898qa&0os(4;xZcDlE9P7=6Rl?6h(aab8bQEeKq>c^tM2IH< z6GA)zm=NL#z=ROgg9#z12NOb24<>}5{(1rqlE(i3Nl_4c@Lxa{#F|_)Hd0}=z2hHk zaqVW4s)io2M6R$NOkMleH_Z+F^F2=Si2pv`cq04kbUWL0WB9a@X0hQ_Me~P+i{}o~ zZ?)}#HEb`Uas9LSb=*5%Qf!vLc{Y|&HjQMWrOsfC%o5T6SuJNTm=YT?&K0fUC@;nXSeQyx@5yn9I$LDe0EG4$w z8hW^yZ>pWRIF`VLtYtA>FNxi&2=P%Fe-Kb5f09RE3(*O73P>A~Q9U|)2@MkdfvQdo&P7z&8Vxfc`cb+737c&psY zAP>BcPuE-%s?mS~44$BN>nc{peJb*E5mCqQ zYbcm-{ z=w2-uvl`_`e-^Pp=N1HulD2NW{!kB3Je*8xbeR-zJ9NF~p?}ObzJ#50IO_u7g>P)m z8r3Vr&c;kiO=Bjo|K&oC*c~;*KmYej=23cqN%e zz1{FnT3A$SR9o69%SMIJah$x{!5_(ji$H;hV`j|~o7l@q?sb!dtK>LU;=%gyi60LI{|_gb*-;2_awx6GFfYCWLsa>jVem;PBW(>h-<0A01YV zh#qSmwHTDS*GTq11w6<+HAoR0g#R}&_*%nmO3|+Yet_zPLh9*GdievwbL1^Fl+_r1 z->VVL<@ffUbpiK`p@uHXRwt#QT`p@~1&>O|x=wFm=BeKcU_`URS?ba)Qg~#r7f&ob zdN{Av(%OGYD~_W5JiC~u`p-oYpbLPnMzq)q8uTvgP!yzL3hKA%;#vneW@l4W9C<6o z9A7Hn?g8~n+fp*89^=wT*3olH!+~csIRmiI>wO*Gc>FfTo2qf+hT_xz+bptMyNCCr zi)!dxz2_)j3#pawY=s`%8W#FbXRI`Cs7vP*z>>(k_B*G(Y}-5(d)*#BuK;k6cgBEO7Rf(+1onc#1nb! z4S_)9VzWc9l$E@0EBBx8Wt+coXsxtyy&qcbp%jO<;ow>@-&=vBoRCRH$)t4=;;S13G zSbsywz&^E83jC6-`Sr(u%v0|6IMO>2sSW;^1X!^p>WSkTf-u!!c8@;}XF8dh#qx587 zHg|h+P5vxcfG*i*ytD3<0PhldcS**$npnr?F{<&S(h|q~QLdgBJzwirfeYPe`?7y= z@Ba+-cjPZZyqhM^TTNICt8SzkRmz#>=2>KC_ z@tzs~hjWF(56s)ZMn;(_^HvdL`c(h@=O3gHleoO-s_mNJ3h|fYv<7`;H4g$dAS%0ZhS`ejWPkAR-*9S{o40bRp4Ww}pf1N~pJW7vYM%aNVZ^W^x#p^MBJ0sBc2h2quJ}5ljd{BbX3^ zMlj)j8Uu2yJETYeb_hGfw15dAUIa`C@giVCNQYm?Hwec59iKtG!A*?3hER~&z)f_& zMp(&bU9N^jtJCkFQxp&+y<;Up4Dz`4a1gqKOzq!f9j-n{UBlf9e2s9g=4zo_JPq-f zVxNd$_zI?!GkN8}$G&pF1USEq{kNc$Q&OF3-ig4tUYg?J6Kl8FSY~2;0VbWQ9yn;m zv#YW5XFnM;%EG1osV?^yI~+`}jhK9t`4ov<;_o$)cpUL|fO9{c%=hwK<$7RASnDSB zy@=Z=5Pd#%$h=$WmQgWISPwM#mShowCDl_V;n)1$q%hA|L`F6qiXS1}Qq>+8p!b|y zY-@QOCKr~3KU?(cC8iX$eRLaf3EQW#MV@7N*J|e|zik_5qoR0dhR&;2)#|&|68xO{ zY(m-pcKfcUq)@@ku>FTAUZPLYs%u-sz(MHnA9gVI0yjh^hRD^QHSw^gza}ve$wQoa zQe1RV(r^o^V^ptVwTz{BD5gbYG>@G(1vhe#=oA*;nLXYJ>S)h^`m+B%E0(Ydf`QA~p7*ZK=pB%k>aFBb>J;xfako~X;wA>&n- zUoPlPf&I>b1Gg$)0xOktA|(#X)`M}#NZ>d>;duIo8eF3WcHiJh z7Wb-S#Zo#&67{sIc^6m6y#{%hb;@J3Eg%$h0Kfm1mUJc6RfWx#?IdLa4two^hP(WO z^ysrbGn0GOM8KIlF2R1En^7fAe=EJVz*7y|kW)S&ZWIhWApWNDt!b<{5eNlVR=5Um z0}F>|cg=EyBpwt~_vA6KKlsc~JB`QaSHvvfiirDwt7 z6LR<+auH|Nd99~MwPkdf>(C5nf5%SSIkI0tMxI&(U*W@WS{AD6tH zXElKHo6u0kky>T-48GJWwr?8bbRm43rgs*m?`-lTU&Z!r__J3Cx}4adwj&{%MRyx9 z!|ZImQ76Zkp5SwFTPNWHrQ;_Xdx|EYo+x!|dxx3TRw8ntVlJDiv-adM8}+Q}#S{}C z>K-#Ga4-n8RRv$Sa3sBZ8td9asHVbq-Psm6)*P_D`!OXdE6j17v;b?psH6B>+Tljl zzm=-T*;Uy2IG|nRL_C{S;b^VhjXAl~3iU9JMM)i=mBW|=E8wvpt|V{CG{>6Sllg#c zR(d~e zV8yK^)8#9=G3I=Ksf?|g6rm(fPZ_kcZRf5CbRm&Cm1%S+qZv$*^oxF>9m^G+Ow8u= z=Fv$3)y;*JVBlmg&_wI%9Yl0_qhe=tC`GK`?N-e4@$qAKrwVd|%!CEf5L}3I9wO4G>sF`fwm+4U0c( zSgWil(`c!8rFkFYI?`2z_M-3(uwjk$#b(Fv2ai>CmJt&=yEcVtZdV*4d720qDTX!s zePDzKVnJ6|plPIi7F$`MmDO6W5*^{{W+5c=0(ODn+h*Wv37an!z|sghvERehGI4(U zr4t-;Nw*Zf-3fIi6-}Jop<>GN9*O!>tcTJo{9M9cuHy>LD{M3Tm<&_08PffPxp#72 z==dwGj)GjmZQyj8Z6DF%pxefE?lldm5lSCIXsj_76i_gjRi45{O&M)MZGjl-x0dpD zE@Q$FfK}5OIO#Iy!-@=jr#KUQ*|EqIDel4)N!Zm=?>TEuDT_*8!AEGR87&F!w8m=DM-z^ z@3=W3xkbg_MV+!LqBWU_wY53?_tF0x%)O5`YOImHG10S zzbVzcMk+WhY)34Pt#GWvz4#8^7jua7X7Jbe4uW71fPiArTID2=k?_qXx9DZdl=iD7BB2OU`P~~?wNoyV zA3U@k$V;i6#(-j!`G*N7Vi_pUU(&|k0JC(@OQ(aPz;7I8&64Mrlqu&OW0UB8G z^5AChwCCr+AG7ejUqG)`(A*P#_wvGo$NK5~`k!4jU^T^mVpX%NBB^f&Q48qvb;IQO z4^iG%jY~{?v`;u%UeGf*5CE(UCx23s`|xnVB`Lr7S?rF0SqCSBhokS#`CPD=>YWH_ zX!`K4-?E%s?bzI8LCB)SD1PK296za*Y59(TsHlD=B_9!+XBsGTpfssPo2NNxR_|yN zNaTy)Y{D`Y)q23(wtTIXMRcJD4HK?@u279%ov2;7S*$@~r{?&|^x=}0LuU1AKB?_N z+SvlmHn61JnTvz7mL0%3=kBnSFu|9St-y| z{c;tysu-BpIQ6Ls5SO0b)LyA0kslyBM_uVpi_iqw+7~i(kITe!!?+Xv z^dJ~kuZ9dkO&#*|zNC2zB5uaj#3p~(GHZ2nHM^)$p4oUpyUs8(2c^ zW8~OjmskT`CBbC{2xVN$-Ah@Z~@raEaB^<9(|f9?2f!7F@vZLo}< zh7J?QKCEOtQuXqi9dKm@lwbZc?>zarn99RB{+aF5DDm{RcYU)e5eX=!@3i;$9;=c8 z%U4~fJ}D&UN*UgFjWSuw$=(-NJ;stO=FV5(mvjCWO$LO5lHgem`Qk|q0{7Xn4;uyI z((|2uYApB=Jbq!N6yk`8ss)^QjU;?F?bc{@9)D+G_lHkXj-<4SG6mVj=%}9eyyRu` zPaqbkF}Xs*ME#7D2gi?xF9eDl*)AuWV+?Y9$*1CbXBefO@wYrzfLPhKa2oee$R%8P z%!|WF-uB#@lAwhT6F+*KF1XuZ>jZtfdUu`JYYDYXIhcB!;p?+LP6QNJowxgKzr!X{_?CrnEpqYW2bXAz1IK_1f^r=o61O_9?yfW= zYEVaPkhAt1|ENK`Zw}f|-D2y=?9o(!nQ1&x+>GBA?2da0I*l*6S@TD}*2k{SE_!0R z7ggInm;tKI;AM=z_(41wNRQC*cOFrHJsfHv@NfP2`&Qa5@4MK|ozL91r#=h(Ib0h$sPg$qW|WQ-Q@*R|VtKHNK#~*@ zCG*N$&Av(iYa~VUoi9)U9xoFwJb&n)CE0a&2ZmxsnGtz(vlG7WC3)G0li6l>=zpvw z^PKQO+T#}Qly^&BLQ&~weq8y)k1BqPz4#P+B;O3ocu4N>N}sSY!G2FdRujnO88iGs zLuF<8`OMA6(q5_W!Jni5L0`hZJt*^B)68UQ#oanyhE}M>=x8gsePcEX^DJ%Uv=j%H z7Y$gnsqRtl#6WQNBSEBr_(Q8lc;{_qE?$nf+~fxmo57mJKqycb`8O0(qUXE-DVM?V zQGLgKO%rphHWB%$8gOIMH6jWaHe|2)w)!+mI27yD{udB0+@3%W3?k7-ny9q98dY%Mi=V zOU14smOBSsmo)ZgaM85zQkeI(2lZ&j?7t#ZL6`?7g!+jP=7BvClC^>fA#el}Lg2`f z`h3TD8jWDtS`e*$6~G<7VXC$L zeu6TxWlXdZH>dhYY~Bg35XoM{SwvJu=rK^}!^R%Jg%Z+^%Fq&8r_U_o+x&pax}io$ z4F8$I_#IM<3Mf9ufAYsxJP%7Bl|G3HE<$|Eh(sP9@qnzfUxhKl89x_VZP>Jd^)G@! zd&Z|Fgf%ND-o+SUQhN-2RTZSW?Z}&n=&ZE1M?}nlo^B$T!nz$q21(%St``ia|YDF8?PZ0UbN9 z0A6<}u1Jf2hnU?ZJqc{ieIFe)MwqY)5pLfHnSv|)cS1xWpou@M2-!A z_nC0Xh5_WAnkp|6ek67mAQq@G`8#;BiJ$4?sJWF5z<1OKOC_QA>8C$Q{ATxEpYzN? zQb$4n*fQ{yUG1*d!(dTI{=!lnTgQ+Gw^LB$_!(eh+wAmQ4MTuX(2dh{$@~%b>Xy=d zm|hW(+F_%whW&I2kW$M}uuD}(qh#*}3MLCpXkv4%?IJ`bJ=2oYRqyEQy(cNEdL;~B z@-U5x1w;R095T)XSHK9Vf3k^W>IcfJv~b;fA!v#; zG$3y6ywK<1&EJf0>!iXkWANS_bCH__PyenE2pZoQW^Il?H6Hc>|F!GeT8&UO@3? zTqC%-wE+HuZzY!SA(KsT2S;-~=d@ofx9=&y$Z;QP?gxH^aH8(kg$MP*0FEN*B-T^= za`(0G_7$@DF?_jSd{%D9bU^8hA< zm;QuZS2BGLppu5I@kTm!vdvFc1NP8ykk#q#VNMJSt>}+_PKB@oudhOx= zt~zj2et+%ZH)ZHo1Q*Kll0w674$-=*r%Bpas+b6b3&gyzftr+mrM+h`gGljq!2{@h6Ny(eZ% zre?ksYK&_H%~Cl>YbbCybdtlHB$_5Ps+V*xf$K-c=QXKW`8+;j%)ltCP_- z3EZg%N~LBYkGRmgK2I?rGjNv#HA#IB<|3@l*et-cT)IF;P=J1*&I>GD#OgSW`AMCk zkjegOz4MY-*!XV2cOS`P>Waf(DX^rtn(lqyo(IzW@A(SCom!(?P z1@5APV)VRvGakQ;l$CxQ)EvCH*^1nljG)O_PNX?E(z0=6Q;Xtw0<0}_`Sp=gG{t0^ z`LcGYxk=rxy4=r@i@K4v{jG#OpLYweU>nL5+>2XR>zvDd8P3)i`3~+#d=#f}Z~T$< zl#5e^jr!CHFufujJ9XY>?VArb!CaQDBmlGFI2h2ir82_%&cH8%;+8kiD$pAGU;K#2 z#gV;ckk{feoi`%8Bi-1IqWDt%VAFuyeNo{at|m|iB3`EUMkpvp$W^Gi!^P!H%~dcsTNqPuFSe%1zg^) zb+(c;@?Co^sJ7QuT>RPKNj!IjC)&j$apSM&$$m;eEa(c`Ui0k%DzCSDwhH=@)1B~vevX%{2+~fp4e5?F)z_1$Ps+l8vcx8in^vM{m znCU|gO6}rhb5(k%kUp=9b2ktQ%tc-UxZ#t=vdkZ^+)`#D=XyR?lg-i@6Y069A-Ek~ zcx8w$3`i zeqU!%%2sTD^2ym`)7^oMUTu& z7Wc_pS)w>OLN{06al$|y%C*kD%b&l=$oC-gF&mtLzjYj=UUq3JPS=dQQ_~Okx4?;8 zW~HAm<=kuKh#wU0Cr;DE;gH-vJ*-U9y<;^RCD4EdgaRw{{nLYiXwg##`{-@hAH1rN zU%$uFNB>Yf{YG{JkzDDWs?0YaB|*B_cj8dRm?wEw?x>QH4`!Ltvsr@UvC;!OC)(e-t&bbl5N2xXh1fA_%*F3ZuYTbZR@ zwWP+W?uevj{@EtF%U%PG0R&K6AdH7G^CKm1mObkljOLNr51u#Xb>8Qi5k_98=!ZQ= zZ3M0pJ#oK<8~O8n)?KES**Co9XPV1tZq2{-XQn_0y3U;?lTG=h0 zggfPEuYxaw_-qcid90za#0hkG(~7Zb6Z|HD{~s!Z!pH}jLu7$&O=^)ggSgI z`DYU|bo^$f8SypU9;g2;yDxP50-^1@K-V{IC2ruyD32)}=`EzCrsImKN6*SJ+h`A~&g6uAYh7oOSa!nC z>}d95*h%3`16rlJ&XXFKFc|v^9%C}pUjelO1-(0UJg2q)mM)i3XT+bA*g%uwD-SvO z#Os&i5%>O76xz3H-qh+lqJCfS64|<15+j~vo;U%g?qJ2q4=5W>4O*3LzQ<`=LmX`L z&3#?{ns2UCdWEU)tt1c&)GA!X+7L`(O}%&FFb=!W*p4?ZiLo&my+*;W*?RGVYRpg* z*t3S|c=)}v72QQ}mj2#Hrf28B7&rasU{F<#Gc;6Q2d@IhIe>bFYXDc=>49OJnsG5@ zi~FU7mD)p8BPgrjgl3ZO8Xut+M*N?kVy?vbl-p2W&3z+b*M3n4w25R%h_2_cpM zObGS=5kh*fCqhUMCWMe4Ob8)8m=Hqx>lyg}l(AiEeQkXiBVGB!0^@IRcz5ml^vFOk zcS+PC_Ww;E(l=^4jvEepTwAoLjKu_8{6XIfj^iWdz5 zmQfEBH{|HN)R3s>7?r0+ZW#OehD>SMQ&m^mLi=Uy(G1i>8jhM6U7y|l9aM=aKifPvatuqCtS>(kKH2;0e= zV#P+Q18;1cHc5ID`?yzOa$%34Y1P$;7T-@O-OQ~-=M&>UK9PTmL33AhZ~VzvQ2)ni z)jgipeqhVh>DR)Rk61KffoSV>+~dCyz93QPk+^u`5@7z4+q`guhN@Sw(kGvf^a(S< zvxFCZTKMq9^i|wErp2?_)fQOtmsL%-frF?q9-qE)El0dZOV)zQrjaZ(-?5+cqZ#LC zfSfoF1-uZjmLGKVys}%$w2XK{O68nmSV`kK*lpgz?bxfczTQfN4L>j~J!_3%Ngd5y zl}$O*?#i!a4-h=>tr0zYXIH#z8H*M1nU`u3{|?YB&~taLn)Rt>{?qL^2I&Hd1xz85 z(M*0%tX7WcZ29Qt+|fO4C&21FWjF^(<4Fwdv4<1&A8mg(Qt@R}MATqMRj+^D`(2ke z1kIaq6|2r6pjyk3N?Or2_R}~0N`g607_LupXqW09zm{<>xPjyB_zx0)oQr(O7arH? zM_K1#HPUK|8#~I@l}DQm<1CnEhuWDun#w#WpZCTypJHt|M-E{BBsZhk?Qa^fXovOX zaxv!_EUCntxgE*RDIc0qZz}4Bz5clq$;ifNW7cm|k6futHGF_(LFY_dx^tCq13WH+ z4)j$yZ^;O886baq-LHVuoLX4pZgU4%iE;Onn1hi!LgFtZOKIP}x2E!=Bf^+%Ba5Z@ zsFDjSoL)dEP{;cB+w!W&9C$p?SVp$m*;-gp@sh=WFDg$;Z~4f#npw`%;Se|v@KIrg zcHu9DSq6NYK5;=mCyPxyeh(K3N7q|r0s47=7JY!Zg=+-2Qh!6nMCpZ-EQ){>fjRM0 zlYC7Iv0$O(Tb;x?F!S;ZLY_t|L^zJ~)TZbsaJSx%Y00|MZ=dKmDyH8J^LP?9b3zOO zGnfzpW-uWH%wR%Dt_~)I5FAVhAvl;2>h6Jn8SIG=FoOwiOu<2B!EeIkwKSOhPKxU{ zrP_d&2S-14_h4TYF8737V=#z4xG9mn_OEZk@v;-OdqX05un-ALs+2oC z)E`G2%B7;&c5j&=p`&(7bk?;S?j-LxR*kEp9U9X84P_C=1Y>o_%)h;9$g>eI&&4TLqW|4-fWpK2-UveWWOGQU8GubzvDDG0mlXWe>lre+ixr>Y zrexA9eAMnsISiFGyFe)Dk~*;kpT@ZfXL&xwNHZTqpK=?LeXdz-|8uNi4?*Q?1G}dYqZq&d$#TOPwxDNA=6NmsHlQrHIaFud3JUO zmOuLwz((n-H;{+C!sWB_$0Y__%p~y_B@=taOy8;zrVcQX)NwEk_Bnxj&o&XqCVqL( zk`!v;o3^=%?S>%m|K>)0&NCLDplL_v0EB|B{3|9M>kto9juWWBAYlhrMC6yp4o4$g z@Z`-I2ay0Z53oB<_C;p8U|&!E#jfek-%U@kpHJ1xjH?chr;o%O|3GF9+tfh(i% zrr;~0u*%24JA!U{8^$Q`2#q}FA~dWWc;jYSIG3h~z^UOM!du0O4w@UHXH0C0z7(g` zNg}UQbBzYSv&r)kw)tZepfo_W32i!eBBU_uDL!GsWgg9#!01`|T~4JL$S z;9x=s=)r^#euD`izs&Uv9E71D1O~}tZ=(M-0)sI0CO}{F4o>DQ`u)}!LF=>iS*=NM zGrVdDO4l9^VoX5H!A*d^_VAm`!9U;Q8j%q8<&f;bFFVu%21ZJ+yBpE!@;~ZHIWfI$F2xUg^hcE)vo50h{WuEi-vOt-X_!V-J?3m2C_W&B4}u9jR=R(fszB}i z2FG2PS;mtInqlT|D5}tug`i#C$#T+yOMX=y(paki;;0dH+6Mw+n#D4g_kj9k#4rI< zSArfK`cmqlEu)3S-4ncZ29eiVWP+KYC_&87wCZZ4F8wNJ@`F22GsHlqM_9Jyacg_# zPsAPDxqd5B-ERS=PQa~Gm@LWZ0@Jvw)HzHR!!mOyyf~awv6`?C6OqkcnQH?F%z+d9 zDpnP%TomSx6tBGbxov!r(szklU-g|IHsAUA`8D2sq5)N4*TCCec1tPF)#oCfwS~mG z-o7J;l~1G|$39>~>YKEQErgy5@f1xzur0rZ+hUwijh)$Zyl@~tc>>dj%cLVz|82QY z5SVYbW0*K&4;z~Qm`m&FeY`B%>R;xdJ}b$kug8NzdHQF^6?9;A(FwCyXlg_{)5bX^ z-62}sbQpNlaoX2+B5XDsk=i2yT&W)YHg9Ze2Kz`4Cv%ueg>NqFP1+~=9OUHUN9qs9 z_49yGpw8r~3qR1=NKC2YMB)Y%U{<2|;y-6X<@*&HF8n^H+*+~SB@Q?@#-mCyf-Df1 zWpN8rv3g;pTGzno(_}yW;U;&;qSkjrAQp7igrhW+ZoHK#a0sQ`it@VEHz_~H#w|Y=c@)8v`V#Z_Ib{_c_A*p&zEPs(|CYz@IpyUOdCoyDWdz82=uQbfmfFKQy>&rUEvzRX;V;6m1=n0{3ROF zHB=iKj5Kd2q?xV+9WcddQzJO3LU=2qeqs9}h5x=}O;4;+U8b?E?2ETLX={zQ86DEk zy)Nq^yaf|NFbXDwU=&OU!6=vzf>AIbBwq$QEFR)pz=V)~1QSB~5ljf_$Ljz_3=v%~R#3=-9A z(~>Th$DVvm7R5honN27%^d87y82~5mFeRYL`gvYz|L|RP4VeuIgCp;a&&Fs24Nqw} zVKG*wNzvCCS2G6|^gS_^4|Z$b)EGhi3K}jhwwJaDRbT4cm0=dXo*S5Fy39(Z_UlJ< z@i)nprUf=!)dsdcopdc1voNrV6JOEh?!nd5ljM1zLAb5zQ}FTsu;TqJ{1be}%!c-q z_ksK=dud?Wbf#m$8~9%JKAw?qq;z1xoKc_oS6N>RB56LCpJNm@Wwlz!(Fr4`lc{x+ zEL5=ye$c-d{n>BUwx=H}AFJcKST1@ND7|VNN3GviMI*$tl`Z~s0^AheSI7E2JL-~U zO(uJYwJub0$kG3{!}rCpR4es@4}b0jhSHWuDg|V{64pr+JHb#ks5*^f=w;ugZH0G1 zj4|=SLsy%JCFPAxvLrB5sYFE3>>AMe*0S5(DX&bM*Q#==8=Ld(eJB*~;5C3#2}@Nv zcRa(RaS+FWN%fAP-;Av%uaKX@T;!A{n>;UofJa>8jqpz@QU7or^Y`&~y&I8Ptw9eS z#=KI{`^cf=JI@ZugTaIlE`tdnTm}QGsJc zwc(P+q!9$SU_wZ%!GsXpf(aqG1rtKL2TTa*p6dVy!5|30K^S`zz^`Etgpwfc00hAx z0Kdt&T+8o;xX^=NX*9OKLd?WSPM)!-+^>3k?SKCN0C=0H)S1&GFHF$_g}b#v50!%D z>l3LEePcGToJ@zX&H(;AA*3}BGBrT560>IeVj?c#Y$1H&530I+H*YNi{S5*WU zO`3>ynGd7AV#jT6XFM^wmC|^gMobLcJ9V3im*=E(-cdns1~ZIoJ~aV}g8mGxFAYX5 z$0N?{=buH?&}Baw-T6=Q((OcB#V#WRpNEDFe4luLf=*TycMs0P445KNeudqdprm-<{z&dQ008Q`)4GR3l z_)Bn}IK@d`Z)<5mVqF8m)ZfvtFR-mImGfK2#WpLba#DcPK~M&NSf^OHZpPhT6AkjD zn_}j5CHManmek_LQ`hQh4HQhkGw{Emg!XYhM)gwh(x`pqk(7H{^6peik`n2S8=lO) zPf`y#%V9|wr}P6EohT(>o#k1wgA}E4Tm~u%(3*oC&UaI!8IRAP@4+8h&jiK~SX3uC z_R$zfMp*KADv8?`FDC7s-Uq{y+!h0t5lnq|G)bF@h55pTQf-mOaGN6g!*=hspO`4ku2bTSp4`THTwlKXdoF)=8pdiA=a;8`5z6}rKEW?%RBMdxQ@u)r@{ zD(I(Qd5~WbZ`A}`oC5PiW?U}ti$vNR&S@1+!i^PghDWI%i@U!wO39n+-~I^nAlRJI zHGq=@dQ5z%9`v>zVchmL!^o|(65A8j*{I`G>nV+?Dy@W|jHkLu^Xx6J-d@1vipatJ z@9^c(@qO499WHI&a5?mP*bsn&2_b|66G8|DCWHVSObAJ=!Gw@PHczCPmbV^GC}~LW z8g^&De>AuGN^JQjE8v)kI>TLKF^DAq6aJ?kL7oV)1Yl2ubol=P;2@L)A@ofMzDCK= z4s09Kr=~DCMTE@6{g``qUZdb&qa=ts0Pz<81;DSx2JsgE4}gcpMmMf4y?+-+<;Wl! z7aFb`Lzp#yS;-&%MOkq;Dk~gV7gf^e8Zzh6{26<-+@0$F0^V+de7mJc>*!Z6R?N2d&GUQk`hz= z9!WHX`%H^2jItB@iq7(ZBGT-*RJGurEu_$8;QYm&HLv{2IN-B}@&beC6EbIq$)#|} zwBK4{Ji6m^2&}Xb7v}kWdqBF={^6+)%T8=#_7OE%P7Mo{TNjh?=29(C|AjJD#a{^a zsr=OLGMV#Zdlio+hMJ$^PP0dk_hj&HbdKd&%AJxtROXJ8OF^Ejp~*sJs)=Y9>txf~50AAMzKO_255!axEz$kNn4 zjDBd{Q7Dz0{6)ILhNhb`Os!LUPPBiN$#2iIKa=2~R^f`@Wz8CDL!J?FDhjq%T7}!N zM3PD6_8&B&q(8sAto--_xTo%3`MPKo?r`H9yr8v87M)dryt`Wb$f~@kN^WHL@6p}{ zVnOGCJkW_*yS@}nGfT!cWh#jFj!6X#AkTW|ca_SE{)`p`?x}P04}ZSMvLaVxA4sEohWIbZkFl5j2Sa&SAxP_K#D_E#iCEDRa)7 zF)54JFrjJIUt3}v6(lfkj7ico6(DrXn}pW6-P>WGP55xGN91GT1S`OA;;s+K2p5&B zo;$Q2IjsZ9q#S3hy-Tl)x~G-Dx+Dv31FeE`4x;!23nL8sc3zNVx*187{k@pn2&el& zv9vTC#$tBPmRYc*Li5eN_41c_Lr(n&FC%&bkVs_qP6{(BaPU_L&bc;$O#`5|BsOZ-gosh+MgZ&22=L()zOexM(PtJ2pn1Hjob!F1q0u(N#O2?X&q5r zTJ4ZXA;|ug9y^*3Ij4p&kNF4>dqgp$O|wFyVLh(_gTHkYmUPr&FTy>FfP>Sh8p1p< zA%uBgLJ0G~gb?O|2_gA1m=NMdz=RO*049XGAOHM_w=RJ{*8vWKU=Wbq#P@52cGp=$ zU$lB`xHY4lG1n_YGxT-;&NWKjlm%b=YY>3n1kr2%`X=*m?XUk`<>4lGa0OM~coFA< z_!cI;Rn>zG?^%U+X+*L^ZB&{op5lcI!mGeWa2#3*i?ls`n4i81<@I3!Hva@J8+t@~Rae>s>ZW6Uwfew-t3hgnZ$vO26*Uc4Ru`N>mS34aW# z@!u=__;=`Sz$921uI+S|66)_WV3c6&^3M_-n<|;=+n2rsK3H6n$>uvTdhhmfXMHv2?z4qEx>M>#_>GAK3&&FZ0hN#HYqP+m!b>){VZp&MGz68r*FjwC|nX7c1%c zj$*p_+X%RhdGlB3Uf6T=d5`aMc5kxh8pVbd7nbB0DAy9~@h9XLfhvT~mpr>2&**|C zM(&MIO{$R@_yliy{%)@cfuEYQ(@I~&dtk*ocb=zSEQ6b84bQugi~@wfp9N_aa+kVw zyAljyJ?K$sKqydx|78MWI1FMy^qS`{#_#TNt2q{m`Cst(gLyTF%apc2Ol4=`Ap)jj^<>RsJ*?V}93T{Q zZBX=c3YxY=@Hk0Imw5Nx)g-jOg8hv0Jjq2KDQ@Q{7q-BmF^cP&x9$`RG!LkTRxlde z5nfL?uwwY2`k@c!;9XIY5YR3_Z{Pb{f%nKQf1epuon3Ck2VW8vjowX>X#kNO&H0=TxR=D{Hb>5f2b| zn9H8@`D?#%P=MMhAU-6iSaZEF9QaWWpP=hNNP=O7jd-4x)~{|da?h}53^=vbe;0=* zb12H09%VtDln^X4d41-Cf5a4GCcT=WInu%RUDq* z2X>Y5EyS_=Dfv>iJamNcDWJzy-X*=vy=!Z#IcJV?M8djHoiI7_Wqn`jk-zb8O$bAa z@UmCQjhH-wEQ@Kzx_`=V6ID_tzEly;HSJk%x8S#j@Ci%^;ZqUz=m9H7B&)Y6Im!y{ zvaHc%P1^x#^9~iB@)Jw94^9w6049VO0x;o!3Ih@vVhF&V2r&d;LP&*!2_eH1*YOR) z$bUzKuWKi5S98fP6}O~^?*jBR(5_@j8Tcr?esn^H{$KS&m#3*zZ2FX9~t}&G4Ubkwr;k-PXD@iY6_rUhk~&PqE6U{69LJn|FK9J+#NZZAI*e8Q(y6~!UfS1h zyl~W-WG*jCgV>OU>{dc|+b;yD2+CdBKf$^Rm#5cAl+Ydkv7o~@*0}KJ9*xW$+r&5m zYZfhAJCT4a!=z(e8<}r}q>Jf*Q?MG))}3-8Nq?sv`^=T;@i|sq?rYbHi1e9;kdFx1lC5as{7c*fLC z!u@KAiR9$O++7SxN8kO5JrqmPb%XQg(Ufl>xCIkJa0@1c;1)~>!7Z2&LQyawWE=xb z2&qR2XRTKIj8BN>l^%its6?w98`_GWjunRJq7Zlvx&`GRw&gm&Z{plFQmrox4*5RP zF}z2fLZ&sK?y3tv#|}MX{}+_J_V9ls{{X!CRAs{WvMM%m{u&LP^$y2ZxUN2c3w)ON{Rlzio_J6aPGgI43t?`+&f5J(3u=WBv- z1bakq)S>RE<#p&8SF|O*3+$UVm2@ape+y8f!#|F))$VBGwe-XI37ie>*s#C#GuwEM zTaGvlscn6)QtCpec}*8NZX38@%fAeoUgoN!E<`0;;q@L730+y;7}gJwIawp&IG(gL zt`*fn41{|IB;d+&9~l*TQCeLF=uYK$hm1-V$X|@ky)QxP#1*Xw+q(6LFMl5L3;IVIMe$#34C7lk{7VQUEUd0 z!b+EFq^y9|YHw|bi?>UhUOiqaT=CxEp>S9`kZOVZtv`3NQX%=T+q$D1Pn=C{^}Tkg;K8hV)Nar7x|Zdbxls||4zy@;K*1rQ4i3RhSab4a}OZxS+Pm7=cNF%s`k$R2YtZ&=8! zn@{h}QX6jrP6HHNke+k+WMk~BnDg3Xv+z;fhXe9Gy1mX3r`>vbOd)A_Gqr} zx}Qpcl$=qzyE8C~9E-0TlJdk{BRX($AlDZ-O0`<-&EvQoal{Ng4)*c~B^BW(@hywg z19vMp>z5jP0c!_kvVXU$;e?omO*<$Z=B-hm%gft`i%#;=q9MspbYGZ5R;MA*3t2vc;{VK1a0S@=r;;v_+LUk47W}(+mtA9Lw4pM%mWibyaSjJ zVhO;65K90igj6_~5aJ!K0~}z zzhO1od+o2m82jH(QvW|q?{9J@{{VbBN|YmnVl`s}&MT=jy_^l7TkdX%^J&S+GS;{5 zQYBX)(;Dfas~CTrl*!f4Vf&T8V{9oZG4*iBdp=m0;y1NSB-FhOVRP0{0r?u+F7bL6 zh9-tY-n)UtOx`N1dJ=K1Tw9wRU`&?Slp^)+C|`FP1uTCF8VULDOt%aP!|{D#NmXXi zCw~rr0EOz`Gy!7??vhK}b1%?*jQpaXz|miH_93dkyt{$1o>4glybEx;sorDnp7=IF z#85Q(SnhXw3ULCO0Ug%U5(By|aAK|cPpeB=3Ob?#SK`PEXk?=zkeH>t*@vIrJ^~a2QWD)ILy~m{Fu?0Tx9;JAYgCz1= zG_6WbRoMY)f1p@Ut~Z=|%5PalPD5u`lFQ&`v2gKJST#4nClYsX@jS|Av*Cxw(sx4FonxujN?0Y;fHq8sZ@CN$;x`?lcQ_GGfYpH51*qtbPbmJ4ao zx52P+Hg8Tm;WSMObI<`?iEfPSWMM>s8 z9sk``C;u!rte85})}vycU=FB4=)8hr!rDG(>-@&6?xT>5z=GV3#gJb%t1%@Si=Uo{ zo^9*FQHybXWHX479A@m(asR9;PiET@?8kWL_K`##ReOEJ$e+btpl|DM4L&z=PcSUJ zy~F)0w!ZUop|^KXi#YKlwRBAiLJO+Y-E`pg*AHU-?%p<{u&$BS+w;VOa3Pai^S|ko z@pTP7V>8gXflyGot#g`b1RE*`sxQa%&7V`EZmXZiU{}9H=KmaxiLQ_TR0|j|*||g5 zV`ImvOh)N#khxC7ZbslNAV^l`2}}R`+1JS!D0+-*1gG#|82T9-9UrmOkul0!&7Na2 ztBz2s^c-!@aKd&;yA8rJHg~}Y>)}sK-@KiewEW(nNd&OrQ767~e#_n6!!hu)QoiIN0-u@;1odFT z|5Oji6CtPvd*Xkp2jq#6>bXvEkU4G;z~6*u=ot*ce-QToGQ@rpWUsl0;R$koIC&>T zMFJX+4t4BV=I=*V*Zy-5{@*k@@DIU%6?;w4+BEZuR}B*04d0CTo{?}LGm>>dO*cFP zbr}{|SSI6mlxX!}Jl0`aZ6`<}Iq|;QZaL2z_)WZ8DhCBFXJD)p+TJsNae;F#&--?c z$Ie-?Juz+0r0=32W|#ycTyzaypA!H(j6w@>zdm}U`B$fTKYn2lWa@iq?96OS@rC$s zy(15ffIilF-h~Y9i0h!$mj>QYwEK*0L1Mfj@b$LZeTv<7{FNKFXwC%JlH)8E_KGoh^b6Xu8k8p`@c= zwaF$=@|%}!?`*5QwlP|~*E-QYY@rn{7WUL-BOi_$&6h^!jnhGLgG9{uFabj5^8$-k z4;B~j1l99N>CtiD0imEXL3kEaadBMJb#9Jp-@~bLbv#$1zeI2&S+!z?&-C<`4*?yu z+OoKi+pb4hL)HDUoRa3dS?M~QZJMvoa)X-RP5%0Gz6x}cD~#&&QpfxPNBX~1T?R`f zk5Y7d8H@<3o~D#WD@R2;B?F5a^|3c)k=5RucSvQD>K7W2>q zLP1B>yDS5Y%BR!#AJblXA{HKuf3{5Z-QyVefK5w_QTXOA3b2uWm*v(%{%aU}+lAO% z#m06fph0Q#|{$ebmbyoPhz$F`DIh!K%s~pal zvi-N52b;k8a^7zxe%O&<1sr#wZnF|$b)Vzk^UIx zgv&T~R(zoRjcw|5z?&eY2LCpMj!)Ztq!L7YKJ&`#?EB7imV|QV<`gq$Drwaf1p3eM zn?UFYCj1lp@8YYcbzQO)Y+zAiw++z7l*4?6mG_33vKh6^k8evgcwMsf9x9xwYh-_p97}I<1 z+HD6lmUpWqb#%L;!exHZJql|$JIW7X*D8P8LY@dmjbwsmo9>;1*e~QuZDmmZ?Uw3! zO_sHx-K6v|mr&B9S!l}jxA#=7Z=a!6=6O1=Z)(9tL7dyg-+4=OqYmrAa=P`o>z8U^ zZU9{zOPzRcJ|At&y3#OxnSzGOD_cJ?weP^Gk{vOH90&zU)vGG3di+^>ac1AkqAi{;>^W^YDPx~oPVgBtUQnEs8EP+M)J!h*V(I-10r$X4KOshyQQ5eZ}( znYZs4TMWqyKP{V4nSyn`V~z?}gj4Y6bWZ3-o9(2##tf!Pj@}d1w=4S0K1+~gWIU5C zn5}X3CSZ#Q09I1c;*i^08D%N6ze`5LvVuGq=mGh58}TFu+HfuWIm^ z!(?<`OU3NRQ%9A&b3TtgdkVK*ROo<}{I{#T^Q3=^mOt8}Evd@c#W}0( zlK4$Y8IzS;$7Q>p7zDMm(}*Viz~*A!4EtrxRPfbNS!g)MCPCZgeCS(YF61n@XK>W_ zYp|`iP<0yZ_215*D^J>?UaS*q#MoNFQ!FG+hRL_1)`TCd?jqGYQxB1zNDXd%qpGZ_rCE}*wy+~6t3ny z{1^(V{^R*WHw)Qhw$0U-PP)qi{Wm=Khx|31j|J|U@TN8WG2b$D=}G=X@4y@Xr*SQMm2gEYf+SHeC6I!{1_Vb3){luS z2-3g)f|&dMbfKnRrCuH-B?wF_i8}lDi zMQ;3s9;LaFz_FQ1w38f@ajyyoO8RBe*7wN>oVuzc-m=VoLa}TxqWi21!~%6De|t{} z$@mo=>JAzKlE+hQrti^SDR|EG$}<}}W46FQYc2u~sNp#M?Az%hhEb($DYPYMgKP$K z=^yrbAi?US>F9gUvty{4AkQ?#z4g2~((|?>w^@7>_T{NJB1Ndk&}z1jnbSBsfI1fG zZr(;w6~}t0~b>b8~+@G1!@-lmP*-7%N4_eHOw7h|BFBx z|9usn>ZR1;hMC0YAy~azm}0;#W`*H?{&(ohGFT^ExL_ho<@I+5J?$p*01XL zKq%-ENS8}~GL`SN9SLY-M~O(SctN8cV*Wl=;Fmr&$qANT^>kNoC=)Ig3Z# zPlv_;7(2d7i=uYQa)iN+baS5`idSgE?^L<=2+TI|S*fcCtNuV0j6PSb{aLSD;Nt`w zJYFO^!q>YZVTVo3Cy#dRVJ=XZoz6JEVFMF6bk;9Rv>%^bAYfVsI)*5`V1?i8*sgiT zFZ}4)=bu4;76O8{_P?d_5*Fj>{Pw!>DKQ&^0nyXOfJ4&i87mlKgx-Az1&8wbutDB86J zhz0gxUE{YohOxFX)-CMaRmGLJWj<;Y(R}PK-+m^k^(duNgp@c#_+7hWAgU_uCO!GsXnf(aqC1rtINYcL@M%V0uCVhtvQ zU>QsZ!7`W-@@D=A{Qh^4ya~|P82azb0T_Y*`y@F?dViDixMnRBI#tg+D#fU`yj^oE zuweWJW-pTe@zZDdJ{z{d)-57%Ioh`|-Z0d6NG6mjkZQJ(+f8~ucEo|B77v@y#>Y(f za>m>=uJ|UCpHEJ_^D6`FK8k6);@(G$Pr&yGnrK~p`@TZb_w0s*a)46`43mYzAGJJE zb`dG@H>_(`coSP?u6sm|Xs7*TGc9t!b49fOT|8|)`$i``Bq-sfN2`Td4!i!qVp9i7^rk^W@hQ1+h7dvfY!ck11JSvLcL5N^B)j>kvEumPeRoS(<;sY}oGXRnToU zD*jSa%y(w|ZG&2_IW6PmeQRiJ$yLKBNLz32*|GDKsoM4`*of;Ytr;=$gK1$?+`Ef~ zh$6cMN9|;X)NPhvhDd1;J57JOWyRQ$5^r2$N@{adL`Wz9?jBGqP}W_=@*6;YK8zvJ z$9Y+$YP7!^@BwrPS51C^nmz7aQRzNHel}Ru`0#hV7=y~k{M5`(qUpgF-oPa-Q~j4c zD=2RG9_)UhcI(f~l9fI)U}+_}#)hnXX`lo4$AQmJ{YAK;X1d0>R^S3c=m3A1SvQvk zLnV=%lq&N+I;Po+<3V717xTJ+RoZPP9RKa-_&w+E`dhb3({g6<@3z5=#@_Cg`LmZE zy8Usas*PUkEDOi`Sr7F2gVCq-^~`8(LB; zHSe%&r3%5Q(y}b?L`E#*_*#NpiMjl(?eU<1yeWZSE@kjz-Lp1wPzxcv1$!cdw_rjD zZ^49+G#E?>0W+8o!doyQgttob)8QiL6LM1v7*ayctMm*$t!_twwlz)9rHb#0`yWD_ z5SS3+gsu}DB!>oJFi8Fmk_Cg<129DY_aylydvJ}x7AL;x252oRTsyMj#@NRvNefbP z*UZIDDfYEr-vs!pewq+ryCuG%RxDj^fG6JTOShZ;&^LPpL-AOwqur;~1GvDg#V;ST zca=F##$70!!85AYykkr){jhBFK}+;}*Ev9o78)d6^_@$HC-Hp2^;ThsC~>O|oli-6 zTM15`W>njv4L!WvCY^u*U^V(x7%O7>sDw7}0nfLY3alC#FW96RlcZm`+|B>>=h{Ok z`|0c-70M%DFUncVibU{)$vJ;u>Mw^?btpU_Xm>PeqvHim_d1e|R7q`ADoigA{$+kR z9=5T2TFu4i<@fM|i_ik{LufkBt8(QDN);`2?G+<2ZpSZszp2U;{MDH*tNvcA9Q!NP zD^=i{ZXODYTx5sk*Q++z+CM)^5%Z4sV7^t}xOgBF(CziU_%~24=!^;f%tB0gO{Tg4 zz8@mvj|$JFK3m+4#^T`-MF*?lq#QQjM$rRLc3h23S#H=mV9 zypGSu@u2CbuZp#ytG0CzQ}lj96GddPuzG)0y5Z3bFZl`CNa97xE@C*aJBgNWGX0tM zRPxVfEG^u%@l<+sLPTfpgrBFDP)-&jc>%=&btZrL12@xO{5$N7i7EQ)JMx-*Dl9HR z^qQo|^`bdDcXLe);NU!3*1@lyDTfjojNIE2{H58QPcg%W6lmBBsj%p@sDE(*p}?SU z)!@Y(dC4C?zopd7)z5%pn?jU^#yya{z8-})%x0P%d-NKPnpm&wGd=?M=a8jh3ZVwx?^y|GF6GCs26jR2v*GRUh?ZUORYaLr1T=bNK*Z3)C|@&qEen5t{F7Y-{H z>_}dRz+raFmQ4sz9I93`0-OO0GoSa!eUIm(^QSw!JkqoldF+6f1-cO9>SfKIR~&cX z&+kOZ%8&lMef(tQkiNd}0o@S7Ch@aCyJ28##vwlQv0*UJ_?M_{@tMdYvFD`@E2L?^ zmlP%2%FTH5oBged6cj;7k_je+ zKo3j^fu4T;&x9CTq}M-lbIcQdm^O5uM->u(Km7M8p%NT55iy&!2i26`JkjjU82}}zWmEEVdLTF zIJ-Ut?rZ-!i1z?77dHX^s+YkjyC;J_d?@0%5b;4W0xe*bNGU+tp^d;jZRk+<*YZ9v zsQB@I>uxH(f0?htW32vL$1;d7*v;5IbaR)OrY_GvokP=2U-dGRIu?=UhxOR0Piiae zGgD7HTHIfSEWOTsn#l3?o@W8Dy;z+*wOGibEnula)}<4_V|r}`DHJQonm<+*?oIk8 zZ!{1KH2b-V72Ne^GpOFnu}1%$oIVTUku_;G?<5U;_My^CF&x?v06$J1Kb2SANP@_` zW*&L3d&IFme7P4u=G<%}j3=%8HvZ4rGU)K5jJ_IS?*BC2d#|6&_VbLs_+3IcMb+c| z1C82_xuH;C1d|CppM{Vu`!ha6#)X~*<#f9y{%GQ;w3zyH5|s(pa(-w!>c6BD8aKAa zx*+%=D&xNWD&)l{xz`_bBKJoZwz__qyy?0e1P(oc=~HyKzL(9Iw=^SoynCd%}xMw_>{@ zyE%`E{@HAN&8Xd9PN=b;2*YmkMOU7&(yt za+tsJ4v+ak^5ST^ZafJyFx`$R{ov8FHPKkU6M7cuIOZlvds@p6nMl7I?Wg3P)=T}_ z1_j-#QZpw?#5|ap`2piWTS2-ll(zEL>~4Yfe%vkdPCg~4I)JIjvIC4dMu}Sms3d~FHiJt(WK=FOm0voY26K3O)3L+xpR~LU2tp#JSAuT5&n2Prb zPG%W!8v_&5u%$+P=Vjb+Q=vjDoq2EHXsyc7;`r&*^dp!!+Rh0Au|R#@Rjls}Rv}F8 zv39qbyE0ztn$t|?Z)(0_fwyq$l!JACWC-j~FwNySe?~pLrp5A&Or~+oATUie+^_B))uq7j@>-ziW4?XR9~n@}k;t>FBMxkhl^U&2d%h9>a`FAp7lGuV zdzI13ZTm(e_~F(wlXgaRz^4yoTKo=~SQmA-r67{xlaXX|p{348``aVfL~8qN-yQ7A zip>D1o;)g=H2gI8osFWiPaNf2tZTT(*H=Uw-u{7;EKdZ1c~wyFepM_y8jc0($Lb$u z;!>W5lwD3_2DOx0#fzXY+pF_?$mU1@_dYAdqHD3&h29a*&Xrvc6)&D(B5*=GXj^>s zvSNyB`_ENSU}?fX(-1$IM88rPs&X9=m>JzoeImel{DvWPOM!N7CJ0-NDH@nA)=w=p z$h&X1inXF>eW-RY?ouP^K`d>WHkZ-1p4c4;xk)|=u=*bltgVGJ6+p`T(fodI`8L5NYIq(uUVk@j60x9{CMf3 z-pk?l4H=&$q-q_P7gD$+1=4n3mjLxgOn<9)F!zyo8;QFI(hGz;y?M4wAHN(|4`n@G zcZtA&%9i}CKTJI&;R#sroOj=5ZjE;r(~5k0ES|nPA6Zp2wo$2R1uXfH(ZT3)D?iQk zTMQE)E?=YQ5G0wv+q9EO@7zzOEj^}#z6q8+01{p&1SwM@^Jn#uoLc4Y5Ku?Tg*<0; zgN@I@`CyEFD%nv1)kzPd3by z<3C>2O)WO(_CCr0LV=BzT;sR)BQ`v;92FY;GkSxVE{2lVi{YGXyF$Ue?IQ8hteEuw zVWXbpN7Z1K1r2;>--ySIVxd0`pC>dKW_{i{;{D;UVGcoF&fc3(Q9e%g2K;Z9cW?cg z+U-G*TGb8nQsk1wjD>04gCGw~2+4xMgpe#4ObE$>!GsWx0Vagd7EB1CEtn8e;W@SV z(%-*bmT~rB?iNy7g=l|DZFUj8q`G`~T+KpiR0=U8*ZB>Sh=LFp1hF9I;Qx05U!y;W z^SH^kT;um}tW%QINPH~$SB=fI-a~kP{!QI~=rbaM-?2$$q;rty{rdE%TKU5& z*-ZEIN9-j8{lUNqX?vd8_@Rn>_uf4pd@o;#V%KXJo%3}@an_q};!0E*wahzR=}>(8S4bc=J*1J#des@-=6&wDUx1IG_ssO`-LQTxW4qnmlOEuF zPND&VFv9oKgbNtjvO32cM%BxX*g_*f-Ls!rK{ zvBau09~u8{I$bofJlg@*+e-%s1?3RND{5Vi(_Ez8#&@yq3@@w%+*RpXpAX2n&+WbE zVaZJf_Ghzm!gy4E@2Ke&YF~Xs`+}*SX6ubQ_pW-UZH$gQ4edS<3zP|0w&b@?j>&%T ztFHo`Kg#`Zn&yl11Sks$ANYyMiLl5hxi8W=U8a-cU}S@q9qJ7otzZ5eah^ zwe2UB?>yTz2E+nQApgECwkUz7%Z5yuR{Y0NBFSS>2pznd2%h!LV?w!i(`Gk-(RxLm zZ#=N{DJdqz{iAb-SwR$z?ulNuE8wUVY75xxYI=;AbMLp+hHP^`+q=V6Hf1`nckdocp5>oY-k}^? zK)}Iew*7+6s<9rPA{grI(@>P6FqFtC0>2fSJs>6$3Cv6%;J&oeO4}Cr>5(p>lxJa< zW=x^r@7X^$hOfMZ*Bl46+v2L^EY-7y>wY2j;T6JoNHOYiFC>q8!g7echPUk%BvB2p?y5+i& zL^3OGtPV%{4s%yTkV?(e=|5M3o2^8UT6G5A3LYVuLNpAe7Ji3TKZt?XrOiB>%z&SU z3xS?_aT2_acd(OsornuT!5suj;?hGG8HDwW2RnjfG|#Lc7zGnT{X_^x!JY`gDA?jX z2pz$M5IX`UgxC=>8>%h+S(u>tQ}%$t)IeZ*Z+7au<+Y;~)tC z{}*ZQwTItC(QCi{cl`f%-s2`?b45Dlmv$HWmZU#F8%>&H-5YA<$aC$!Jr7^{3OMLk z;cRCd7(%bcS{2_4T_(Q;)8+Cqq57=kRx&nv3(v=ZTbZK->b-eMBo~wpocXAuuX3x9@SgW<4-q5Z9P*yaU0t5=oR;VG zeG46Y2*cSxEYJbWzx^~XV;eV@;FGj+nEs=YY+qqp{s=xZ!TcmsvW;kH+6H2n4 zAtE+#8k_EFbmdeV+jtmMB=Z~G0l zcb-K6VKiw0)f99RAuo+U}D7inD`Tk$~i{I>iSqBuhzwT8Kt>198{E}+JnF0-@>gofaMYtZ25K<;=wVirwkSHS~{CbkdU z@1_mOrl>A;X`RosOzGjMjqVy&S9#1HiTbbTJ!%WpLs;FS*^Ao{cqK$y9zv(m50naY zZs4k6eBo4Z4IFWd(ihFpD%M8$x+n5NE40i=Tb(qq`k6{N;8;;lPBLZ_3J{3yJnh#F z<^7y$m64=-$R|LuW_;SEJr?Zw}&ZKFoG^8cXuwRtyvhbOB3OQyJ zC%PmTZ~@YqlW)w2MsjJ4!aPMg*wBk36~6Ze)e#3C(nc-z%h0sJYXqkbsH4e|m>HQu z&>)VF)v+uuFccBsDhm>{a^`o=9yN!ggu>xv%p%8FEx*2fZ(Xq?Zq42NSPEyp`Q+n; z@60O|@(>7b!GsXr3O~Wq*a#!7^c1-lFOEUFB$?wDki3bYe?Ed0{N?S`V+cmUgpl+f zObFpEm=MBSFd>AuU_!_kI+zdwW-uY7!mktjrom$9F$n@$5Q5+29+`AMg7vOtXQ_IN+90LI>xiH1E+y5kTzHRRNeRTJB zap|4pW6$UUMa{KKWF25;8hm8?Z|`XVv!2*!*%^E}wfxwK;`_q@L8(P2kHSg8+343u zW50lGmC334x!(sNhaZw*nP0}}2uFV#+(9o4F98<5CEqLiU;s@{a#gGqMnN&Ui4%*x z6b)2^4|+dljp%HC?tXB6g-6xhfkhVtM@{a|iTs@OCINKXcZFCL2%D&_y&(BN>Jr7;UzpZ)mK0 zJ|~FA_Qia^@)Hw@LuQmjrGrjmF6UbMgFjFJ?WnJcl`T!KxS74NS_|9f!SpaWYE9I3 zo_utMMbE)?AF;&;*dQlUSNgc4g2Tk!N4NxIP|u-#8n5ldhCO{D*XGl zu!B9L4D&eLo`||s44fYBeRtcuYLfE~CofeZ@h(Ha3P8$6UW%$dbK7u^z=}3l_ zXcLwC%+%X&4xEZX5f^gg+BWwU@552kaX)SR%pD++j#Ffi=bM1Z4O9MlgLZfLiT!@y zfdldy5DL1H1?G2evT}V=A5_CdaF!ygx_zsOfa}f0)EoX%D^oH>t-roZe`Kg&CHub2}f zg^0W6!_NVCLSTb}u;i1c%RGgPOf#!X5}HGqTR z76NdqqG>fYAv!1bMUpLfv|X$VZB7!zLeE> zsa4V_;RsK`Bi4t?4%cqHHdq22Mg4?lh;QUbH>RgikQnD7K*jfQc#x$w z{c)UoLbVv!oxNvZuCRV7C$@9pY3{UPWnWw#I{0v%IpwzFf=k`}ArJ~|s_v==ACO7j zj>Uc8*@h${-bG6LkY|67I;u`(R<4Q3Y3)ueuv&>U$2>|$_x(?fU#}_DA8dd&x>ijhcJB@@lVI}%*(7MxJHY%fuYie zfm(zbEaw50xVsywz7=|?^QS%ii|cW%Ue?R0p~{b-=sf>%cAHO2F5U6FwzFVv+eu43 z|CaVksVZ-tvYhSlmPd!x&?K-IPlA`?5`(XR(#!uuHfCtZ#IK}%@hcOTu0mXOgV|k1 zAQq@s`1`hAFfTaHMH?j+e(5`SS7H+^tyyS~rORn1n6$X0wzvf(b&pQ_cbshca?x4C zp9ot0v^=cg!5L1wFh{?2ibR(p4kUHp3%37;k`B1zap!4M27g$LV@W~h&-;<hpR*MATzq)$+R676b1go9v1M)NN4cm~5;i z9m!zxpl;Ww!S;#z?CaSJI;tac4`9hVczeH!)qX+?3@XHCa=5m1dvV&t zx$qc$fwS3O%gWUHB(^UFjHFpBT*%#fd~UBu#DhZ;`rJYOm#1T$(Rh0DbkVRd>Nvm$wT%E%dd{bGzV#DN559x z7=IxXLLM+7gy3L82*JUG|0xW}{|HH#!JY_7n8Ab)PXH!_cmgmXq{6Qg90amArNP%o z213#Q(`j%J_iz)Uul?sYG58w6&B}bq@=b{6%qH%5KYAW%GQ-Se^_k&&U=g*WLcXZfs!~we&tJ*vue>UDgCzLe zw;IxK)sg*-6{-Lh0YjM;!@se-C!gBXlg#>azkL%ei9F@7I}ZOgOUR{tK>1I+N;qnp z^5gMXjc^!;^=&VyZgExXq?seW>f2hk1)EXrmYKJp>1F=*(^lelG|b&Mm-0K3?^v9{ zTvV@aZk^*M0cGUQU&W)Jf&39kQHYs( z%QB~!W||a*lII{gLKdwqET9Dm!T0Wrmmf53@ak=KZZk~22p{}$k3rInt^dGE|I?gt~0Kbyq2c=e;Y?cRwdy91gZgLHoh_4oAC`kzOKKhsxN z<&*s`G9&|nF6cBp`_QvBo;>sB~f0&I*L;25q2k;$@^5`r|~mJD0d<7ODiEj##Jzdhc- z>3*#$6Qqzg*;5i7Oak@%0PDaL$SWv}m03r;)8wa`{25`UNG2!Yzl!)!1tzXXd&o_Z zbn_>$?OZ=4s;=wfc-(GK7EDncg~x%9gO#cF>Eve8aF+3M<)0)Rbj$DGVqqwSS3bL> z);d}!sdn|Gm-~*a6mrK=Q+G068t$v>4_9D!l4jj(yCuu|aUAkPYoim`vcN5MO2qqo z%o@n+11|BwP;{PG4MSsMmxvjcGn<**C3lVO9$K-CPIZ$4DgAqqy>vnL>>6MWmmnh< zHArc;FGi=};MD^CH-*#W-2kS~Tl3QLOog{+fKbp8+!!&6$2NeC^>dmx!=`E1gP7^2 zllSX`RY^}&v(R>}MuEBgVXiF=_L%T+nnhqnGj)L(7d!U;1T{*1oO=B zj$x0n7qW`;NN+8D2~aHP#?T4(9gz!QE8e}xHq=sDP@!UMcO>4iQm`uKA|{K3uXSlV&o=cOma6Rmn~B^@KDnDOrS~w-I^?QS%t# zxIIuR&>^R*=Ki(ps4+n2*5-$(4{~$vKZFd6%u#>VzZtRC2TnfhFwcRbevwIxSBG;J zU~>hu}7g)4L7ByzYli5G5XCY1Oc~2;0jA3HoVTADY{i6lfu1$`^S0gr{+W(CnyyvCSt*1QKo&OzaL8n!D~W> zyupMJe*-3jR5+Lr;%}}49E7p|F2}yf9b6;ys^7wQ3Ue=adx=4D>pL#aGdiW;uTkRfF4q{wxG7tac34LQT;cr!OW4x8Vl|-XdFR*p6;C99r+Og0eN-ucd z`VCA#dX-l%;G7=%&b))ZGlM1f`n1iApc}eRQN3 zVNr4YKWmuwcU@{JPlIs=GdV7RBRlj)1j>xvVxu?4+3SL;lwpA>$#rU8Vt0T)HaYTasVpA2JmvQnPrIOWcz)BF z2eZ{t@ZV$5Ugt-%%Ih=LmA_`LdJ6P1P-a?v?ffsrJ=@8mFSGVD-r$u;zg(|>iuq#Q z%)*j&E71>_SEW8XT|GAs3dc*b>NT2JNSr4O>`nF{sr%9P;^}I^@iU-U&;guDI6-qs z{=wrrbWbTNYCi#hY+`5u4ps-UGTD;honrXkv44aMRex6H}LPpgOP`(?UQY6HlU zU$O7@va4$p{@LITI9?<)!RuCyVS1j4{?@=U zY9GtC6a=!+4iWZTm0E)u!MdRPYLts3skovXfi{>wfmooZyNY$@elYa&#cJoO>t2E( zjzEr7xWQ*vJj;pnM+qvIukR)R+7`4EN|g3x8Dr|u(@8%+*K+*=NAQN;R_EEh-7;V=naBc+qrNbTQd!u5 zL@3gZt`^@zk0)QBmnc!Eb|h2TG(%H`f3XS+H&;#<{ZRS?KDjGFXu-RLCjwT{+1{y! z!YqsKgDJoTrVJ66v~5|J0bwPMSa-fr>YlP3p6azEq@X$3pP&31{Iiz~v|(J;U{dF_ z8q!nOch)tOsrRK}7jW-m`aPbYZu^ikUMWHk*9v^bM?H^dw9*aUJpJ~|`=qy`nzDpX zh(CF(WVXgntKG8!>TgR9v+ko+p}H!fbr5gEFl>&VP-$0jo$}}AC6W+A6x5G!)b>u+ zpR}z*gpRq-dRhAn>~tdXed?q)I(PejtPV|#96-@9t`Yo!qMpdW+6?U6kz#L!qh(wq zb=ZTnWS>&X9_k0%uYo1>f3%mt&&$@^K0-CV+EcIM>(FZoq(qA+oUHd2rGM#ss+-5f z!iInuOb7upm=FSHFyVjx$FeA5d?!{4Lrvc@%G>>}30Zno94R;)dDI*JQgo_O5Z=B7 z5kfEuCWK%VOb8h!024x-5SS2BkJkzQ??87GqW>KSul@D^_vYf7d+3;qC%i@VShip^ zY5E~qd4T{6zQeWH{|oo<55Xf$aGBXCRi376=1o;)8rSsGtqhZlzRhDXC+8<)FX zFss3yD8QdS95^prHLX7yCf7s%2)L^|{bgv6dVrg4qr!;}OU(w2BZGP0s&fqD=qK65 zNAI9V-IF2)(|kb*MXD!t*{#S(j_GAD#`aS8aws+LjcMz%$N>xNwFva^5krKXbQItd zs2-AL72h^PlV`M{xkULQ-bxq%lnRvKe@o@#m^g1+2;Wdxrl!C2;(^9-vdu@r$&kU1 z`s#Zm(?%w6)Rx{B`8baescCIKAt^+KJBwuB^JiKri`{j#4oA3avIm5Mjz0HCB9`q) z@QS!QTx25Nt*}x?u57(s9og`WKIdEQKLpO~;Hrf^yHGS=YM)}^^gwPXi?tSMJ&0Ec z^JH3`pc+7R142PJUN5v?$o?BO#AOkwZWB=t<>xlB{$!N`?Q!LXM>xuY0yS`KOw28} z8Cjnw*xa)xLue#Sc05#l>Y;e!PFhFDu6+cC01==Zug@*(WuWvdIyCm=-#I}y%e!aV zzuTJI?^-^@@L`!f$Pbvq<-RcAFjyL%3pd}gH%jS!sXBAp75%_5p^YY=@X1msH1xS5 zT}?Q5^2+xTr3imzj5i``^@{I>RL>vDN60JuDqGN&o`9n^>}4TLNjE(1-Y8x8MyI~y z@|#g-C|7)lL%i?)o3wfw=&2f(@qDftD=wjAZ7kcP{zM}ovPiiIBh#_ja9noZ1tSYM z_5>$iw>%DUx7#^64cy4;8$PMOj9;v3``$ufEKd1vujQ=)5Tsw|lRjL4WNnQV^8xM!Gu$q)S3lT0t6-mXZ=sqy;3UyGy!3KuY#h?%#U&!2Zv*pL_53 z{mi-M#TawUah%u4hro4z94I`3vMsmZ&2#H4?})l%TE6rFnqag2cS?)LnX;lVw8Coy z=Rc)QlFZGi8qpOwVnDK&!sT7y8T*Gi^CF_$&QKaO>0e%J3oFYzOIhx2!{j zFEGp3rv^GUFfS@)HvTL#>Ofg$mrAblygMHUCsDm%!-DLyOtjkN+X+tB)NK1EGe=TZ zD9gZvP)`6Rgt81w2=xSDLTIV&d>lGgy;B)nb6+I{V~51G^T!y89B0j>s@mE}&-*Yuq>g+Q=C14{rul*?W+x!;8s!KidiX83viZo5GP2XWD zaOQ*|>Q7_|y9Taos*A6V{E?*3#A^MFwL?ra!6xJ9@Gx9pz@CF`z=+xO{C7Q?Fpvgcs9YI_?R$f7=1VlvD`klK02B%3vF=$Aoy%a|1+j#5jhde zw#VIn+>ydxEyWqIwHs3j(2FOjduhvfW|N-`*$l+H0HDB?|5D&1 zq}ktvGY50EI{0Fif#1T^YPeRajAUn?ll5;E!p0wRJqcoq-E}E_5+1WRLTDE)MKLlw zM9lXq^!U;P%A$bvdD4&a3`7kHJJp2dv^n<|M8oLnxN--4V%={US0tgY1M}dZ6RTG> zNL_Of)`swwdf1=&!;44+i}~o9%lUndbo!Yv?{Lf(06&U3)@bpTONbm{B*IbjVy1o^ z$7DKP^*WpJt{qR8j^JQ#7@;e|$>tLVwrcm{>i9}@%SMYMO755=y*r$7nO367?1ND9 z-IF~y&obP8H$eJ4aV@&)y~42=6N42MRjYk9ec<@t8vtOdL50WCuXp-;PTvO9cTllM zRgsnv5k9IqK#z@jynSm58JL>JQQ?no(8;VGvx*dO84F>4b^p)qAzK2u-ivmk9^+Vk zSWM8rPmATi+WctJScLH56aD_P9;qefut$Xy&!>G@x7zBrv$KHf&Xq>7@kqEMrK?kd zHvFh$hlW$P?|j#=*NYMHdr`)~0F(;M9RKChKbXOzfh{nHrnhy=0wMdA#^g>2i)MDO zvfl5I@FpBbzuLn}`J_ zabe}p$NY`XaQ2#qW?^4}tHGU!Na{*iE;y_4TtX)Jd++kb0(X6WVLnoIduO!GrV}?u z{D2ugOLv6XH~ZpNt#4R=!xy@DropH*0CpM)mD~yBKc9yNm9Tp zkWDP15BCIE^2P8R!|1*RT09N`d3LO7lhtO^5(OfEojj)5u7^(Y-y`k7y0rhit{jZc z>AL~yF|CZLO(skgdqq|J$#+G&*JD4p2i(>gBnEEeNPhpT`J+;Rj%AyLxv$!5YsaYf zk&lw&qf+uyrYN)injqK`ejQ<5!cPk6y55W>DVIJKsWP3LeFv}47V9+US0JLRGr(Qb zQXG}*SkOVndF| z!;uXJj^&@^VTc-k5&8UV%WM`dxQ9rr*1ywr(N4~`H}mb<8aYrZ*a%Ly5V=(PgC(eJ zT!a~4=C%RB(6nX3v=Cd`;4-AkFIEPa-Cy_duKiZXKT5wkw)8VyW@Vy}I8|-kFEgKj?L%z@j;xYfI7?k5x_SKgSD5%l99BE~~ zxKhCP2qS(H>|g)c{QOK)19h5{Quufv=N=0E>+F)GZS#|&ffaFJGns?H5Jp)~-i&bS zq27rQ=i>%P9>T0Ev{MsrLdVadAqX=1lPyV~P)*r=X{h6IpMkm}-1&JgUxi z=owb;$pu2eW)}Fj@H&`(S^9A8=2-0u4aieQk}A?qkoEwluLmxn7Gnde`C0Fbh1^o? zbuz^+^`(>YOSF2In!x=Pe=X`!b4jatHxLT8j+(b$yrP!nfklT4B!QpS$E0iIVali7 zVt;9t_LrMOOlH6pa`y3`PAy`ipK|4K^g;MD;>Pf9Cnx-I&`40iYoSs6J2?Q>QD0dg zmCs((AE*-^-=3LgW95p^df{P#rMHZ##+>kNicBpHus|ZGr$&oDj&Z+Z)1u8d$#Bs( zC8Z16+=kVCKALqBh~vZJ?Edjv5}ucn#UpPulE|I(;PU(D{#+qQ_+HB^Lf2M1|2+K< zz)CVPEe&^(4Dg`iJ0zNhUFBH1sCTE`{nlITP zuaGc{f&PGjaI9R|lXS=9JiL90=`~=)={+@-z6gqFOrB~f-)IBBD?)n5dwRdI(IEF| zly9Yf7ngy4S^q+j%r-3C$zgPPu5GhqG_TrSER0uQ@zGmz1~PU3RPNgfa8Mt-`I%+; zcIAhK=B}*D2G)ig-t?ZtGk`$Ck3AU2DvndK@@rs$?ivQ)7D zF36SoQYb;vw|)Yc$+1rt6VF^}i<3-m=*9b56#3r7z^9pm`^12_`2E(J*x&IIFb{bR z;O3?|tW7TBvzYP>aa^AAbTqgUb_aTSOJbrPZVhMs^H5BD4gNCq)~)xe(Ev8Opq5tg z6pr!-VG8Ap^L~|9IC}InD8RvlP=JF8p#TRHLb(hkgmM{72<0-E5Sm$o384T76G8zF zCWOA3>nZpVJ8;X?6#YPFsjOn=@;!P#3d7-RlmyFj|IbIJfB^g^h+c~g;toKp2MFJ9 zLh!ZNAl~98Uvt%WVzeCpj*>+>7MZ`Y_EbB2qc}wb7 z>R^!E)QS71BHyKg>|U^Fl0%qs76YWI`O+KqPd~|O*>(13w`Y7uv`1RC1K%+(UH9;S zr_WBuez*ujERbi>pfdWiVk4U`y1xk|0*gdgP4iqQ2mcrsSzxA{%R@(B*drish%IazPr zYY3&U*pr7_nA2pL=?d=7Y4xSwBZRb`q87Y*CJ-7im_q{eo-i`OOeE>4Rjpb|;sGBf z+Olz(cP36hTF?EHLBHX{6p<<`2&KBXGHYs~$mE%{gNo!~9Vy{ZH+rPnIsOkp-deS1 z^YE}cpbL^W5fHfJp2z!y1}N#TJt78OxP=#tceErV7Y-kFV?rpO^t7Wyj9%V3coOU} zt%bTV@FNBI4V;v>2kB%7&sKV*Zji7g_2 zJfM%Uo`X=b3_as`@aq>n`*-eR#i33{g`et>w0#recm;=zb7jmf7@%;~;OTz;4m?$T zwk9RCL)m!`FWNI~F)@7Cw945~H&ndk2v~{EpQS}rvuQxx4`JahfKVY3QxjscE>!LK zM9`04Ogj7lLV;rSsu7mA*Rxn1=X@Po@GwA7zy*}%c;vYj`-x}6n zNAQ~RT(4Y^x`#MNdgn4aoXm?f(?C%PDy}H;1t1n|9_V@TPTDYa15Sk>N`C>9OK4q_ z@STBQU8tP{{WMuaUKBvfc;fYLytPWKZbLeFyFFtS!Dr~vN^88i(kFwO8EwbMKq%Nu zBzs?Vva$DGLwGz^h^}iC>L;}1ut1ZOM2}8X4h=#{V0j*v-P7iKZ|b>FFolNc)Mj4o zv#x&oWXFy8na4Ncfcfj+8U!nF2xdQKGuKLcf_e@?Q@g2T~d^-c5T*!Bmu&fB(riNO3>~8ga9#;b<+{s^g ze^V!U_J+9W&~HPZ>W2tV%9$koI0~Q4LK=4C`%@qmSe|fIEH{}{1*s~Ciitf1!v(?) z>MHYRlLu`mVvoXd1Ec-SegpS{hjt<(k)Pe;`%N0g6YvYKt+%mm0EwhrQWa;<4IQHc zcB+O{smK=VinFC8;5YhC)r!efr!w*g!yghyxfqauiDr>-Aa0!anLXk{epHmqRQ<3Sao#ft%P#m zW_A6N*WQ9BbwfVyIAbQB;uCgP4-s~?Vk5TA<&LUp$7BGZKuPz{0y&K91fnOmhW(Md zXVLtTH)P=a_5@!Hwo%p&<_CTXFL_|={xYEzyv+s9WpBM89GAPGqX4PuRPN;~+0$U> zv{GG1AQX%Vxt=}PObDFQr`I3*RVGs9 zD7sB%1V@GCeAz5W4}gQ)j2S*}XgQgG2FeBMSpQYw zt);A@X_nnvIsLC%94IUZg-P3lS&iGf7)JHZ7KUelEed>YWnrtV#K=$^8{0_5@F0 zHL9WNs|}^^q?9t!^B;-uO@nATw2aV<%D?B>c5h2Eg^I)A?5+XapM`iHi(|w>;B^@p zHtQGuM0e8=X+^KkX~D~Z;ZfBeq0C!A3MsT2FOy}&L7lIy6np0}oNo2AA%AoBzF~yv z8S*D6m%)TkE`tf7Tm}wCcYl9DC|5uPkd zltC%U(H22g@Z>1i{@AAq@C}#-T4YClda(4J|3Z0;88^Pn?;m(_8|?y(CLqT_-f%f- zqF#&p&3OCXdMrAGlKs(4yaGbZ>F>Ox*U>+DOf+sy>Kz`P&OhIYS#a-AnFjhZ(1hfw zo4(whKn_buKHEo}hJrgaUP2SHYl2ZZ3BO@MCw!-rfO!KrW-f}31Zl~{#I$IOAtbn($d~*iSbbsGvz4-U$LQC7&%BCuy)wSOI-i}B@idUsd0AG~>TO-h z7_jA6u_mOK7m+ zPsT2q&ShBL;^i2?PBPg_{i*heb-{Q0sEU?@_RJMqZ0`d{<&V0Y*mb7Z8C1SBH1eT8ITDbK zmUK$mQ+YJCe5(ex8J17$ss;w~r+T(7k5dh0QKwtg(8gZw(Q7mxC(|YjMO4NZ0GC$5 z{<1!G{*pHLa%H!4Ws-dP`HlL^stD|~UUZ{qx^W{(ez#S?Z?Rn*MYguzTdO5gDpNnH zCyjTOOkC*A@)$`{^J`}WruM;3BrkLNRJrBd z#L4V9gpy7`i?BH~sesJ=3mF{OnLCN~fmGQ+#vt>3J`B^LsP90rK>gOgP}YlzG9Aug zcleVlsI3EJCW=40pfnMbzGf89cx_^&s0r-*v*vJKh$O~mO~~S`L})EncxPZt8f0DM zrsOc;S@dEE7OMUWCHt#Z)tJTFJ)`ZU)?g`mFN4*kJCbvrdzhhxlJ(UL;1$dwP1Hi| z?>zmqq}sexSi(?b$*6c{Q99Y2!knW9UeRIu3+3k{_RyY{nP=|vgRSq}TlRg^vk zp`sDeFYr=XsbbF@Ae0KX#_Tmr-+#drk(NE!>lyZAHjbe#*Bcphc(V2>+o}*K6^y&i zlM|mWXH@v8bPXN|Pd9ol8}27DeVbP}b6PITB|?P*Zff!Jrg%x&XP5u8_(#&ZKvPyf z2fH>wI)!H)X1OJ&EdviyFRUI~=PFXOR$ccMw5@S?AMPFh+5N!Q2Q3nM$m=FqZFd-D+U_vOs z!Gtgu1`2SnCqe-ZCWNNyU_vOs!Gt#g90X)H0sI=sK=6MPM6coh{LPR0qItyMziX5- zH8t4mB#zGeuRZ*K0nux}2I2dEXC7{HCRZ7_p&%+|AR9A&;A6AYBPJyCKko$BciG<| zj|-6^+SM*{K`0R&7p(Ul^yOeJf7^@8*?E&YN=rzTp{=Av>x01*LIBetr&nph+N)^k z2bG}+Q<#!(oq4t2&9Ly9r$;2PDNYfQC^2FH3s@g8CbAUp+f}sEmfnq@AQW{tu4^m& zY2C@y6Kq6Q&DjTh`mm9XN%BLsKy=B{fXDZi9>}AWrVm58M!i+*DZ`yVeKk~oaXz); z%VK)$;R%u_dEKu$yYHyBq#UXUR>H5mP&yyIHT?JJaIjwHss_<{$x2=BlBF`rcvt>> zeq{ev>0PCBwN}ds9-*`G(>fU7?a)EYN)az-6ZI&lz9EVt)g*LB4ksPI#%A>$H$Q^*El!IrANaIfkb z+bDeOcR&h%EOpM;r;0F;rD>(>Pvg>7#iT$0%&m~4*i>bYaC6k)?{VbL-};tamzl%n zG{Q@=_u(1FSv4$By(-payP7Za+km^ZHfR$+ENo`1+7?ynogoF0PBi(nACZ7VPb3g? zOr;Q28r-*$EANk*KNom@;J!GhhD2YSVZ?>b{1qq`Y*e*p36eR{d1WlXU{p@6#K3}z zMSOQeyI*27-q7NXg)FeRkxkS-0X1^DC*x_pOQwJzN@LELTZPtf^_Cw-&S=8gG7t(j zTVhY}dyax*slb&^y4t)*r=_nav0nsCg&6ihS_Wx5LZOO9Znc|I-N=T_MvKs>1B|1lYAGJl9*&|cqkzY z%nR70HJsiRB6Q$%uDub&+Qhv%$^(mwZrR#)f8Z)7ldg=_q#_!zc6Hh%1f(vlPq z{)nPM%Wp$+vzGxa>04yrZyMGFD9QLqYFOGzw(9cQDR}5Clt0*gr7c#;i=1HA!&}i- zYZZdB5ljg46QOJbdm@yLU_xjX3?_s^ly4}7Rhe#8TcJn9Z6}i}U$C*I&m<$D8N2zA zJgCp_8`QOc38Ah9ObB%?U_z*CxxNbhCd6K&AV?An!fz0U-bBG`vHv@3@xP$|HEY45 z&eS~VX@;`0_XLsuo4U7VtGDg-f9-~gUasi#kaMA@Vh z&)7$hlVeuNfzPqA)?SkfC-;SBou83iXv78IfhJ{~s?5NWf9HO!l@Tmo{#D$jECrNd2oJ?T+pkFx`H}6Umg=Qx)*eoGk1>lq)E*Ds=H{ zt_4osp^pK_U1XS%pfa#RT!imewk?T1n7w_7WcrAar6qFY{48%znzw*h#DsWfhnhfU%qQ zD#KGE{!lyjEW#a$Jn}qzMfA~*CBfbrB=5X|X~GI%s)j%wfyHP#sg!3m!)#iqH=#qm zoJcFl*wP)FGK~c-T3BAzzwGf=rdfOEWY016YlPc94lmOmJTsQG-y0Qf_TSY182I2R zu(IBOd$OY)1qU0#-xz66H=7mwA<*w_2Bo*ap^+j|`U+4gP*-x*E(Vxf?*4pYmiL1& z_@2f4T0@h_-X4Kp>l)ibEBuK$1*gC*l{o3m<=R-gAreva+6~G_%f=cw*u~N>EjXFw zc@n+kVL-xFb9bTO@J$&{d9$`@Uh8p0Xpz=eh&*Z6<2f6nKILIp3rrY^8!@msP~IWi zb^bJ48^rF(HLYbu?_qKLM1Wdk*ge!A<{Ct`pc;4hn#86qcz^h1B!AAD|K+F63Z}ks z{9nVVsE7A}t#RA4`qF%8wniVwBsXG|-}S#|>U#5v20^zdbyaDE681rD9gI=h#N>F2 z?r1dZKhXr5dOgOB((+hY*t4lZ9OZ9YNu!$u+!gEVKrHG5>#&Fq_ zhi|@X^q>PT3pP`7-zI=<`*(S`^6iWH<>(42w##>zBHl`qGQYq4iST?6q~BKVV+Mvf zpF&WIvtQ5ZP3w`d)^Z(AYT*p*s=5;=%asA4z>M)VeADBkh4q!##vy4U4vfdVy!3oe z#&1knt)2Kw&mVCjMHh-43ARI8tNw5WzMV>fS(d4YgXoPYg<$!h_Dk*}mP#@lD3!s4 zP%487p;QJFLSYLggl4P~@QyM&<&1R*D90Ro&4W(yxBDkMzu3-hk^N zgpzpl)p#w{TFtgb-1qpNoi*)=t@Gj$CT&5PpSB<8s{c-agO0rYBLZV@9Cz)d=ef=z zUoCyS+8MDcKgUsi(ZKV4T9*u}S>VKGx4ZPAuQ(N)`d4sBqOofg<@F@;!X8|lUr@R1 zV;-#hP3S<=kt-rBZT1?zEQs4ri&phq|4O^|tG&<{^2$N#fm&WU-CkEZu!0RKF1WY^ z;fU~$2zObucrz{{a%jz$YTZEvxI_N%U&%l$*fM?H+HJQ38+b_N>lHTr)IT-)g@439e<#27DOu^|!t84-OAS^bLmnU$DCqvx zplCX?VUgp$SQ+0}InxRnqKhr~*PnmHcO$b63!SUEdO#=%kl3D_w=h>`i;jf;=9fS) zF=)Fxrj5$u<-fdv@@y8E>i~aQS2ei(vI(02d)iNYQP-{S#5)9`}(~GB>+R-020@sfRe&e(qMecU=MV}y^X4IULHqlhGLvn0H zzg0(i{~Q;Va{a49*C!F>ek~hQLuQocLywH)lSawHGIq&Ce3pcVm}+7YA1NvJ-fp&96hX4SO|H}g4_YjOy!92o9&hyc$F?2M*GGm zQDE)=#8r2*q;c6@)JD!jU)#{%eY4HVD^z^Ow2vs zC+zoxht8|NdrBTRj@5*T%5SFBGOB0?LwUQ=7jlWDJCV&nQiHF)%H3c~_h~|nbGn>+ zI&VyED&;t`fp$8^}LJv#`g&vp?YDd6?P?rHFgy#NWLZ}@96GH9Cb%KL% z5F|$i0p0(n{QvLr^PA?duMr%C|F3xL+3f8BfZ^9`U)bP~ebXUyxgxmbT2kM5?vkk4 zyb8ps^`sfT*W!F{LVeb-vNOj@S|brykm8R=5W|M!l=#V?#UAm|w!L7WAkPEt(p$nu za#l?{O|bMbSD${4df5KHviKuYc=OCy#H~lu{s<)1MthSNW}PeiDo7a+N=CP!qEIn; z>{doJ#431)Ta-plKakk;JdC(ZQ1DoB{|=yo_MZPbYBS8Em9C5Kr6mGXT5|9HdcHRt z!pDxBHi|n7zRpKlKY)o&r~Yvas?V9Y@bH|yM^VH{&&3{nY-se^wn{AQh6%s@|4)$C`vfEq5eY36~L-sOsxIFiBkCNX!$K%3=&lV zi)X5(%W3xt^k%-H3d92VL7u(+Sio#EIz0D#h(Xg23c)}jGWlf&>6~wPOunX3y;m>G z=YlYic0~j=Gp8g#t_A(bvbmFFrC5MRMh=fkMUtHaI5b==O>={$oaA>&+S~?aH~m9Q zB1|qq`N{Z#EQR!d!w{fUp#Ai}3gjUcuRFGq-?+^mCrL47;Oy*)8azT&(2rGBnm|X> z1q{g|%6<7P;)gb3!)vD+jI}8c=IqGJvd+=wXST(#_Id3H7N}mei)k5daSRoud%1P{ zMfeEvsFMy{V8T2G`%1?Ch6WXc33vfXdv;)J1M zA^|uZ0NgD6D;E3{mHV?%{jXdr{j{G5sKV_(l{6J#dD)rLAn;x~S_2*eELF>159^)s4J2=RWqCgxy30aq-%u@(350?Ts?TP3_yUVWTw=?YX^yGmo4RJ0m@+C6&gMAogxm6ooK2iSwVu6iqT?4peHuibh3P18)H5c@W z-|LsTPl-M?Uz&~Dh>>nZ-J#Zkg2%~0SVm$t`O(`Kj!d``OAVUEsougOJ_k!O1V7S6 z+p(c=jF888c~mL{dLP;`OB6cl^|F6<@;K9(N@3EPI;y20kth)La1#46GCkZm=J1P z{(lDW|8D&Ke?jPLIrhlw6swShpPn^kJLn68<+XduX^hth{oi?uoA7_d1SKQ^%KO8N zsH5YFxFV5;>+K!IE;%ATgfb4&wzu&Eynw0V9G*PUMONPR&tU~ZN$}ye�-#Qae<2 zl(|V|AAatJ1wU6E_4&eNkrfFZ6~}uaQL&JxUkuwkLfch~;MM8a8Rj(B(E$D|iP()| zqA4gPtSFDskCM6^l~jBIT1~>>Zn-pY;nC4dKIeMq;25+aIDA)m~BV@fik7bIJM_41)t7HZT-Vk zB;5Q~cSC#NNSS;hGaImB4V>UtRk+BxC?p7(!Df1->$&jAqb-MUsKt6Kn^NF?fAyj~ zoGs8(pUcJuD#ZGC=6?{ve7kEJ+VX>i>^+``4@14wW~u;j2UiZKd8sfc1ZIu(nSb=-a2_whb-|FI2-hiqhI{H{3~$wG?Kqz4TABx26A%1i|Kl zEbkh3#^Pfw(UIJLYp@!JlKt3%Zhv6vTRLSvwMpC$NeHFbL(kv-bo)L*h{bU#?}Z)z zED8N0zBesfB&=wRWmn4rgo4dR8mt8NsGhPW`s2TfNZ^Rd+Lb0-JA%7MRR279&L%+{ zI3VCfon~H@Nx)i2jO&KtkjWg1u{^yvdh4WDE$PqY&$Gbk|KN@A-?#PH*6lIA+yi47 zp7EV$9ozoV&zRj!o?TR$OS~HsSM9g}COp!2sONS{_JkDi`!}DfJ#0d@G;(^h-6|I| z%v4(ANC86|yhiZHh0%z-+F6P}(>L#(y1!}FDV^&3o zSLTA8foclMq6coDu{SV!oY+3eP!7jNjE6$O?AB@Uk<_PyRXmZ)Se~iA>3dT^P*Ga0 zM`nbBE@PBJHWYebLMY3?gi!MUCWQHagqjDiCqg}eTgtB6OqC-fNb6RrwTK20YTjPs zaCBqKAd(<5##|HjE zfM_-zmrG6GGGpnpUR9(11`|>3(}OguXkbz9oey#WC%Q>n=}iSg<#>so4UC6s8=cnw zj83D}&0zHdr;vcBKUdxKi8msx>5w1#ihOOYW&iiLQgcSSXG=SpLxN1Cng;R!RoMrN zcNR+qvy3p=FT3F>Sv6%kF%i-=1v%_!NX<5X3d4e*e;wLg-qmDVw)>8myE54?9{L$l zQE77dJT4o?Jg`h`*u@8S)zEIeqq`%#zfDfLY9AQ&l08?Q-ia%KdK`y8Bb(DKmnkFOr zTevdT(T6H*vbUA5Rr+y$h|^IPs<%d`cJhSO;afDNotESG}iS%C{TP~wZRCIk2|w*e->%is{+*Xez%4{ z`z{$eA~+=TGh81o^#oW(@Lb)lcc=)dsz~L*{%?LXcnXLXdK|CR2)hhxD5_hp4bTQ* zo1e1UeYM`n9$+P1*j0jI964pdn96o2qBa$un>FHka7hXrZ)z9Y6+)>s`SuvkWYe>C z0euC{JIu+1^pAH_io1PuBh1a+9 z0BallH3f5pv%;1O$1q=qeV&7l^|R&IpmOyUu7W(==`96n5Nr_R8o!y(sSBkZ33ROaTtu-GyDUEM!3PHMNw*>45#AUzT z$Bp?x8u5C~MAsRbSc3`wryfC`_&@asB81lC^$Z+@p&*dFiDTCgdlTNTd51q*a|}GU zO`7L~<1S2BzSt$}m`z>#H3&mN01e_D{@Ml5|54v?1>8ys!6_Sp?zS7Mf1gx{nD>GCPI71BXRD zNnn-k`b=zZY7C)7L6L?3*i)I*P7;jlI#paM2}=Vt2+C9mc2Nig{iak4Lx9O+3Ooek*4=`jB4B6Sox`6x zU)_8Id6HWolyGgoIvwXJCq1la#*;XyX$)>sszYWQva)Les)$4Ur=zQaq$3B8I3B&?3K-cgs+1Fvd zQrJ8EWjHt3HcChBQgj^6`{1610pk9H@;?aQqblQ7 zKPdJlO(M)jv%Ro_CZZ9qW+iUv=1zDtd3lh|PjhM;zASm6Q4;f`TA5m6VSW?}TQDIM zwqQb-LqiJ#Hh>PLGMErbWiTO>%3wk$mBEBicXJ)zAdCdTHwYs^@V#q7r$_1f7EVD+ zv_IEZ((&?3{`GZaAQ>{q$N&hRL5v58tGUTKTrt%&rTdBN9HQjRWkJnsBKgnH&$jyH zXiBa<05sP>w6-Ucr74_jjKQjGum_ z`^DjYM#V$sn(whnBMFyznmi&lzq~Qk5g!J3SrpR)pMKjy^<0FeLSn%^&xjQqQ|k+* zy!Hv_z1IXe#Te8|La=ny|9Z5$(t&om1%1b?Qv_$54Uw?}?<`*uzAbq{u^CKs%AKwS zq~Bg272Q6eplKwJTF=V0%W+h52@+Z85I^@UvHtp`&k6_yTk2zJSNK>2UHIZ*#W3dB zUX@%>iwiuH*$MieI+L7*x$q|7+B3p4p4jQ+8ceh%w~zS|hFg3`LJRc|fVTx3e)QY1mW|VCB+OdB*$d8Yn@^b?Dj9H)8x6{Q z4Syac(FUwR_qcH?tvNwCO zW#}rvKJ#G7&sFv$JZt@xs7hWpB?rov3EHoGzy)FJ9@UBp%ndH3y(jM{=o++c7wX#* zl?JA2wL6;Nas8dy2QAiBtTcMzr;@gkcnpID352MaUH4B|x+ji4)FAbQ4gQ+M@dV6V zHOkH_(v!gwSK{hXSNkJG%hbU-=hTKXJLUEV-JO5uz(LFPuMv{D6wmP7$@sdY|Ktzx zv@8+c&sPU_wy5nT$`gC?1ZBV!1YX-$cGF(Kt)e7%{J*E zLFQFIL;H z%G;QA9W2m<(<5PdC$z6o^K5^zkXzRn6>fxesqW-r=!`7hP^&jqjj z8pJ(-0sjBIhW)<-{7uf~ir@%j7iGAypSOyjV zt1l{zv^T`yM1MaxUF}6D*bL(vAEs~`nE9sYCb#t@5BMBmBzVMHv2x{u9zUZM+N3&q zM@Kc}Zb6#Sc&?|V?xa&ROD7OY%5~meHNo5NtE-I_xTAaDjPz;i(PiDnZ2~Wp3#Uvcx&~X>D}8pbwok8fvisAB`0ONex?Yr z#;vgd&i04zkqX6dtW=-od0u3Xh?&9Mp&{a{78}`P$u$w39puO=u*p`U?flv>rU?*A zSdm_~O9B?Yc6DqW*!bHr7~DTDwd7}2oAbd>0hbf)f!bZ zPR&#+s^VyNl{T=fk&e+)a0}kspfuJcJ1mO;3*INNj~V^)KSn!sxN_&eINJJY%!T+u zF?8QCNPT+fOBc+(vA~dU z)!Z3L@re+XUhy-ms!tntR!n z<`ssu&G!~!y|zGDDnc^D350^tD-`%~W`yu^Mp(sm39@ZAa|--E?ny4~EejJ-#{E7} zh6JH}_}t-k?`Q{EHmC8^c7p6kqohzS$`j8MQLLxHg-xv3%LVEdA$kGeiX<4?`(HHvBQrdjD$eu0a6McGRsG5QVf%gj zFu(i;p#ksY=N0p6tY1g)pcH+9eAiA>DBX=Q)Nw>F|BqJ%kricLZc+NuFRwH%j>&u| z>E9C}E@Yl>is9%cd0qNZ8AukJ$~_e3;`aJ*korPDcMtl+RL4=gc6EE`3_Th4ick|K*fOP73IA)jopDnb)hkd@R47r{a zKeZ{&MBkZ0UeL{{YlWqk`S;};A^lc7I{K7Fo40Z2>jL?>)(bd&xI3Me`?P_VnWT2V zAe6UWp>z&!c03k*Q0HjUuGwJ-Uv+}Cx9*cswZo+6%(4i>mw#0%9v?NDiNe~cpHa*s z5)`8t0pW>Wo|Ep_O!pRaYiQ7c1;9?7!I`ZL$=>O7GDT4iabGY_~Dvt#bxQxOfCt)Y0P z^osBqOi}KtzZLN|DettnhA%0=Tq^P&<=G9mv%`u*)9>5D?MK+79K>XI2}sY(pNKwt zX=ef$g$D=%%*xxRBAyto!WHHwCW&Wj%N4TDM&Y07DtEnMGC)^EsG>&jdS&tgF|UpJ zJ^ZXp#XL_AwE}L=E~z}wfX3V z^G-&f20_!uf9>MQSgq8K(*a45_-vt!7!MEMEC$yD1+CBH_FNMW?@Mw5q3X#A5{?70 z8}Arq*yd3O^%>vAC}02CeD2n&TJ_^i84wDT-&e(o!9?m6kSAltw9`?1@2Idhdp_6Z zu|;-QFE;*i*yz_Bgwo~hqEy(vgfbHq^Jdx>+UaQrOGw?DF{iGip{G>uR#bpkFakW6 zwth@IYE8qeC|ptgXP5<9M`JW4Z_GKOEjos&zG)pW478SWX?A`>c(%29Yc8(G*qQgO zYNe3yGucdn;tMmhaG+(tI5m)#sC;0RsH7@&=fhmCV{52Ot(~Lr(W|$gl!MeZnKRzUuBA zWIR~tJl>OQw@IYR|Irv8_#0RnVH^9dFm;z|kA0!=^^+ZOouXQ)apDK)tB3-3o<*jL zl>k);HimHx;L`PzJc?n9Rl(Ip{Qb;H5UdBP7g$Is$>?@nj{f_x^!7Ji1QSQ09RNq09plLYW69gfb6I2xT6a5b8$2gwWvx zFd@{oyzX}MsOz;{;7kr1;bM1H!ZtRcLQz_g)I9PcDp!ofZy^2I&kVR#!BU_WveQmYLb#3jR{h2O zN#<`GM-2sr$_Jld>C*o7)aKRPgp*#3h$_A$WQ<}&7s!wGZQzZZaphDI7Rv%|*#q~U z2@0@?NUhy|AM#KzJ-1PJ=BecVWTFxA4MK@)Z7**h^wj$S+FtOo zy~O=_xzF>alKAR5Y0Nx&!Fy^zsX)gSuK2T}xk=~iE{jY1;~mPny;yW7olin5;doC( zdD+ay?`~kSQ?={6?WpoLkrU7358RBT3>`mYPtytLd)d@nkF99gkeCBo&F?S`jq}LaF!q z>nwA(LL=GKc#jc_?c&?xIZK0z3@dCy9tTRB5SVT)y{f=m`?K|u4#d>7n$^~KamPxT zdhnSB8d_(xEOxWGl~n1#(umc!LUa@EIFQE9IA|W8KFZhEN&`(qz0D#1Eq|yS(LX zXz`0tqeapaVnswFgU&5sBKUW$7pMigD%S6&suug92Uq7o=KYtLr9P5=%63@p;kL71@_Uyu*JvB7w2gM;t)q`Y{y+ zyl61wwo1A<9X@8_TKm(fJV7n~qaTLv@jtQZBr9KO+n_zL*`y`!=PHSF*GnwpvKLaV zSaf7L*5`=;widhfjo&(dAnxUi--0fW-=J~V>0CZU^3|8==QJ8oa+0vb`q#~9<~^CW zQuZ}o_a%35rJ~Yg8q^y5sV5Cc)9)BeFk2j=#PqjDxxJw75TI5I`~ow;0l!+fbma9}0OL zr-q@@EVlbKH*(_+u(Hf|X&yJ*#f^9qcD7AR*8qo zIulsRTeS~KHxZ|cy{&YC!^vT^KuA(LX_8*&R>e*yW80rMjO|@3{ ztRa*L0oL|y!=IyZV@g{sbpNysZ!#l18_DabD#R5&i|Gg|yO=$;`w-Wqc z<ENnG23OI5l6Z`L;m8pVXy+ z&);nA1N$IgobQmoy+)3K57AD^Q-9W2VrXK{{D0AQmSI(O+uNr*ln#-S?vzGAx)r3m z5m2NX>6Q)=6p-#NY3T+*B%}oC7Lk0H@?87y!RuQ4JHs6TzjthyT_O{A14uX z@VF|zx$c+ui7RmJ3~~MGpjg5>-dvs|8yj=s!|m~3TN$bz&&s0rs5GUHpziH=GyQF8 zx-IQu6$8KEDSAA&y?uqWfu|raF^eLtHk?EcM**{}d3#O!ZAN(}3v6Rf?BSYVOg!z{ zdry;q0X^522{|AXsN1^k7s;h)vs&FpEf;l6cku*}2Y%jx@A+hAP#v+k=1{lOtOcxO zu@Nh|bNDh;djJhkM4v`yRA7Y7Y~if zw9`U(0w#ncj$lFv>A{2$(t`;hqz4m1-D(Kw!M+hfdN3h`^k71WWBUI9_}?IU1A`!x z{6EG2-ynK}?@PBR(oK0c2sN{)Y^Q~fcYD@*>u>z!AcO|<7JoZO_4<7*d9swXY%sV- zDQA)|-JC-IVYml9$d`-)scDH^3opr- zZ0iRHi@(q70Il==89YS=k)GW**W3D%-)ZS2QazKQ?{L%v?_&^&_w$o(L;?aZc{U~` zTpIr_GysO%6BD}-*P~aV{miOTLy5g_e7)q}Z|@HF>R)F+8sGHLCL9%95?-xE9<8V? zl{`rwbukFjSE(i#+t2DJ2BtcHoNPvj__M1ATvu^7&} z>7_$6UZ-w7Z!*&TNU#7eZx|&D(3{2pH|5n%iq88=Ty&R5M z7M_m{B04HHe$EfcHh(3NH@6>qMTn1~F9RhEveG9iYqUACpLjka8|`{O*;H`E4whoX z-auj(`_#n^4HNz}OIdLThN5F7nF$m3NCC&hcw5(J6N|~e+UacqLtoMC<`9m*eEI4p~QbTyHeg|2cAKZt|*5?VRw8{5!M4*qk5tZ>s=S z{=M#klKUYe8HBfq15H%-8#}~ttFA6wBg{-uCX>(-LXQsK07Y&0j_F$Sv%Mnimy?+W zCp?eSc*%=fljm(8k1X)#EoT6sKwZi8j};qu#L1^cDfH4<=t$aa1x+hy#)rOd0VP-L zbtdvex*!~dVyK?Ub7Wx$LjAXXyF`{Z4oNyG+H@$VV=EKg}D`xa7ca>BS?Jm<7bGz(K z%>qr;Qxbn4aR^pdxWVtI4&sejVYbR$o+78z><{{-0`*E2N;SPlVV-yKE*`W(DA5$l zz8e>7X~6Euu*q3ct&H*BjB$ykk(8E9?(UbmXI~)v1`|T~4JL$O8B7SlGMEs8WiTNG z%V0tXmcfJ&EQ1Ll2{@P#^2^-hH%JN%lBfPVeuJ2U{~~?A!EY+DJw>!w;+5EMoYWRA zTZsjnTI@IY4N`dcn>o1gzyC)6>rqDksR1EpAHti7pH?IlcM943VA{DM;?ku%xB0&6-H*O|a;7UM#LGb?@A-SKc-M>JX$2nRRP{!h@R}N zy_bHyd*JX?s1bQLS|?h6C+!kXKWFAwR15YNH2A(AJC|u}8`F8L1W@=6aL*k{&7uV- z+@IGmX2KzUi9M&91`eS%$ogUAZT;xWXOwaR$G2=~BFdPJGi`JBb(!aRHmI6{z!L;T z!gZ{^m$v%vJ>@t)3rbK#UI==4PGMPo8`f7cLux1YwhVX(oOYs@7T0<5Z= zbcTUpMrBkW^%y*ANNy*Z)_c|!D)y!Tm^P)oCG33Q^BDJLzy1#~4 zRntgmF~f8$lokdSut~yj=P&jx0_UKsOgZmb$N!>1zIq=a_{>BF?laa?Y>b!1W36A8 ze)x9u0--=j_oolK|2mU?(E5lV4ckTFH2>gjgQHvt9UUg`-dsdjg5`ERFfTxeno?2M zY=*qKTUNEzrfj`_dHyt*4~{hP`lmpuZ!FTH)usai4vy~$e ze!wc18Zjl(N2s#UHF4H;NF8Y+)^%$IHb3Vzy%bQG*}dKMNo^O_UaUyC;Wod;o9hQI_sqKNd%<#8)$p%U?*bc>wPP z%z&e1*|H^)nqAh0Fpl0^fABpj7WV|n(cwV+TVkt0&hJ=Ye)R^xLu%)~PcmEUeyTN= zDJ2leE4=7b{(-ZQsDBhDl<`9UPZA7s1^hc-35C6K{179lUmfPf{JFn|;36(i?rgg+ zLe@xr2~7tAa4;bR;9x>X0uCmGkRD73Aw8H7LV7SEg!EuS20Ok2lq%F!@Y?Etflc-Jz&tbm;^FwV?DtJQjuJ>Y(^w9~bLKn(WVSSu_S5tSnd2qLIzb1i++V`pC)& z3jW@E!Aa%L_!e2e7L><(mJMZ(vh22-k;%uQMz~FHaa!ZI7tBky5Tb7RquEe9An>E6 zelFKr_hzr|;T!~}Iv=Zl5IYzDb)@Xz+?JMQLwo;$yD38tV_$|{EN*J83pB&$A1I(a z@RQPKQT(a+3)wP6o&>LMJXK)#wDTbmK4wVe;uf&pon8Rr2=>#Pj~ovAKPWT4q?h{P zv>gYsK1}z=cT%t$kN}<_SW0qDRqWW1wuo9b9GXVS0Ezhbn8^uWz6!12S>(UoOkyU4 z!2))H_omx4$vy6`e=-<#HB%!_we(B+4YD_pWwy(&&hENjY~Ve1vuriKFs#;ZT~j!H<}M$w7M2;E%(de8Xf+r&4cOULo*1pr z@b+CZ9X3ggixDe(h;mDTl99_$lUm$yDM1zx3zXp3vEG?g)+(`{!}W>b>^J<_rbCyb z^z9+i%p^RFq_Hg~w1A^vE}l40b2QXf7sD2|*Pak5<@V67(^Sn#J*r?ov!hzE~UF;0t?0;mGSvuuFhgV640D8K&*`M~#2>(?$8tXAq`f*07hj^)l9RSCiZgaDi)o zdjL2SuPp&prS#-*4mY8P-)>1hmDNljW(W^TeC#x_HC?m=go4hQz|L_CH2zTWf5$0R zZD+9Ef_pN|9&C{JK%msLho?>D5Los4DF1ZyPylD%$!{0UsuwLMUqDTnsgE;orSt^l z<@^Z{3e2(IAoxR#1ko*8@qkD^^W4N|{hO~c+k%OyV||tN%D8p>7Pug(qkW}$+-Bxi zpYVHO#4{VJV1WKA%-R)(G>Y5 zx#Aq&y5y}9@mrCDv4PTCRdVfng^{$>ge!a;39 zvlg?#1mU%56dn_I*6js`9ON4$`#&Z4-}2lWvHu-|LF@sDbNQR^xqkC+k84@a$==2P zb`;_kNhuS-7Z}7s_k4`EF0IE`-H<>RINUUp`N87k<7|SDXPD^D3z@m7`Zm2nlWDhT zZ{4X&IsR>^K?l!2Ot@=0sz>Az;o2Z}yy7pyD;-qjvSX=f6-Kc`Q}H07M-Dg$y{^~8 z$6L0y9$gwKgo2xV8U20xN|=Rj-h&8BvxbEWDBk>kX4^|v;GEG2kJzI1<4$=@=JH_r z68J?{YY%@c&WQ}?u1Es~;AmzB%ejIs%!7nPD*KkTJ53JnldrZE$r0h)3FfPwK{KFT zGhvYg@9M%vl&tSTdZ^^oqubBu=U$bwM3kS8$vh4a1=7)qUdUZua7nFj3iVG$oL-x(R8V-U4;qOc9Tk- zCITCap$uhGQ=#8@t8#+0j^c5RKIKX4pgUKnF?MkpjkjIE!!h6}p+~Jt`P9GsWlKD0 z@JvdV7b}uJY}2&K6t3bFQnO5S!T=8tO0&>7(9EM5DLt#`LNTLTxcwp{g#W{=X7YIx zzbsO!wKN@YM84u0|JU5vvd<{a1KgF0uTjM!Ex#$;hn1lJm_+{LSvwF5G+F)A-x+YV z-r!BF)_*HLuTAw)_r$}k2&~s-dU7N~@)VaJ8x@Y?F6KcxmlrN`OLyR|4IjB2sSUIIC)th6zE%g-QDMjOcHBy@_Pz~hd38k zrF02%RF;VCQ}pS3-D&h-nRx+#@86Fm*ymrYvplroCYMEcw^*#urQsnk9HSO}Cza&) zdUvonw;KQl!vrMJ`#y3+C+7W{PwW7`>+&Esk{-omA;{Ia1=W<0i));q0Rl%bA%x3d zLI{_^gb<2?2_X~(6GA8oCWK_xU_yw$0TV*F3?_v9GB*JZk_LlN@^ARR!B`LkgG@Ao zF!pZ{y^(^mfBnMJqsnQxpUt9G;x%J}a`uKlmJ^se`Yk(^+3z`Y~!%j|;E)vf) zuAyA1AvcHZY+yS33 zc=e&95C5;|_-O>RllafvY-O5R63%p$k_%%oZ?qHe*^A4Pfz>a9u|YKK7`hd$R!S0` zJGEVLmG>gI4Askc zyc30^c+g2z8!zmtb>Pb)&TiD{L;TqcU-`ivrv~?orMLSP95k)E9?*PSe6+P3?lXu4 zdA%up!|7{4I8uY7>%b||{1%plSHAn06;Hr)~1 zy{lIL`_@h9#%bQ!Xo^oVt68vY@8CsM5f;wAmtrdtK8bIssJ+-QNs3>kNc~5(yJ- zZi21VLUKlL_cQ|$N#t%JiNl~xt#fJ!--Cxk+y$V@VWLhDsTxL?0h5L;b!vV27FO`h zBSYkDf~)wUxNJSBF8%n^EJT{u@y+!q#crtQKP#TH3SH!e1sYlVtR*nqabi}l6arT9 ze{D%h-MP!ql51JO!(}0^*%!P|5%~G?_NK;316n&V&@9kQ^}1vHZ1iELe5`D*PHnqw zXuFJ)X+1tnlto_5Mp@JO@YB{7aPQgAd}U(4K!wsmuQlRQF7hvTs|`koMOY=#HVO}D zrhaeD21`}1-(rsH@OCWY;5Ru;8w^Y{pIegRA7+Xy4t7p@&KQG}g@q$s_j}h0m<754 zaG#EA=AFYv_Fle1NPW~*rFQ=1l^uk6vmILpR4VoQ8NZZJ^DA?v z8u**KW70-l+@2n$2_d8h6GGi;2*AO<5dv^9Aq3!H z!v6sL2IqWo<4yA4-p}m0;t;wOz9>^gn=E$&!61AG!5|2NLEHfd-$Bg7-xzzNVIb@4 z{^kyD{O`Xxlj~RC^3HBv&5oh=M*i!p!@HiOZ6m+-&okFGB(EMJSokH81Ls})#nGTM zEW*cXB!7v^^BY=Di`aF-kAu&$*vnGumIclqpUK8 zL*2arewSXgUn21O;xOF}oT&CxZ&Xc_i1vly>ri|r;@bWJxS$(!JiGp_Y_cjhbq{%2 zD4p-3hB$xH4VaV3IXLug>pgNlKD1~U11|WKq(L%_L-7n1c@ZxNPtKFAl;ydFwbr|c z;Gb8GB>j7_7j*pg^zXjV5B7Rx)-9v1IF@TUc*1kuk;|nd{=hK6@gp8E+fFjN%{pHy zZuYoG>Z>ZkMxns8wl341YVOo^!e*r0mx@3rQ21Pft~)=yO3IA(!CQn`#OX-f_$A*W z*}+z2F0EX{3}$Y&RbU2py3Orr)6A&3Nq*tOCA)RBDL3OnHXRHhX$cJj#C~846qH?% z)1J+M@R{Con0xd4sd2_+JWKn7%xYbZ(*~B<@6fW0;3)W$zH9D`ikMx>h*waNy?D?P z@f-_<^{l|efRAj0$>;Z(JD?See==2v4*g5VdW6*pHd7U$edAG>k1{*8oV2qIMU>U~ zOFh61(8Zd4bL}*30i*axL-f<3U?5<;7J~K3QntU*x zD7_Hp+N^7(E<@ZEk0j}r9Ht>rY#BxkT+gCC;w`#(5udZgt|-u!(l8TGD`DKEuz|B@ zcq-m2%n8H-wOfDs`-7Nu?ng~k*)GV~Z|;U!ZcFve!Mp#G=#yAyvul(ivjjR}z++Pd z5%F#0z^RlP>FS-TyBgDof)x)d$ci~nyd8l$8t77%8~nbH#38=L6(`*QE$A|dR$rvB}_IQsc=barKJZ=o@mF6SyU?3*N~#>)}~Vi`nf!foQ2R9 zObDSZm=Ho+Fd>AtU_wY<4JL$O8B7SlGMEs8Ws_IBcrRVG#2+Bxs69`$=rXc@A^+g@ zR85ALxK~(Zw;#j@fe9f#=w<>A0xA$dgWw&6-yn$ncl`bvVsH2sA~mL>sUTS`isv<%u1$v&fS<$Rps*97onuHGaX zT5l>Kjjvau&~@k2_#);Mj!py~aBXRum%$P8pc=VziE9{7>&j-<3F;fl;q3MA#~6`~ zc1TdX`PZR%IE(r7vE+SC30H3|Kj0Jq#OsI0>E*xB&umH@VP!G+ZHUWO0(WtG2L()SZho7zU5 z9wi??({r1mpd@`7`02>bq z`seyE9o|*5HJtRMA!qGp7hQRaP@*cy+}!~#k&sS?sY6F^F`R>!>WI$}-3#0iP`Mux zK+s@+pI&5`?DwI0pu_ZavySr{lv~>5CDYmy=A}b$J{)5m71OrjS5*jI_OWWU8v>gX zJ{X6mS>NeQ-#3!74fIy~IeFjD_D;JgiqMHxhqy1XQ&2#V9grgdDY1MM;hxqd;U26egVLa zKWNQDZP>k}9jg)IN9Pr3Jlm+I4RsN){Gr`mgYYdPQ~0w`ZCY#L04hZDwl zD2z@#zAX>5O!&g$lMlI$P@2`}i`LzN$ti5IQs64I0eWheh)WR``0AhbMGh%SGEoHv zO1x{yraz#0wXQqH&j7m|_6H((deO$6A3h+ON(!G4c)Wfwi5jG6N! zorbw$7H1<85QRN-V!CORRa`$`ios-MGDin`&apQl3SPu|)@V|E^{}jZk`)Mj=49cqBAf5%ydp0V6 z?M$z9{PbKskKnT0JR=V{0pbO&@td$;C1_hXgJ+N9n?pviXdk~z!(8obA*baPT=~5X z9J;Iy)mNKqV~v#iN_IO0Mjy8mSK!_0YL!OBJK<8vj~w&B2@qKCZ>?32OCWQ^sTh}v z6J$3mUA<@?`ilv=`EZGS_NhHQ|Zce#>yYO@r3tk zZ%`J<9J>wmDn@!%oDJXVurk*3!BGg~I3X{Kz#z`I&@{5)MEua9SC5%07fbYQrcWf( z#Gi(GpeF4z#=O-tg^EWnEqL*Y(JcFrQn*{6qA`MRS(YR(Lm4>U)P%rEd9!Qa1eZn{ z=Y8qk>to8g*#SbQ7WzwV>b8ACAQWg`{KqWdeWc|<<7*d_5OZvzd(*gB{?fPj$q_^9 z?cJoSB4=vy{6zV3fd6jK^S{PPAc6oR~txgg>G9_td9I zQZe=duEO{R6SzLme0xMjmOrHG;-Kg*O&tTQ*H+cJg%FyL2%~S%=n_UNvDlEU^^qFS z;vt>8(@K}89gsdk303dsn)a$sch@^K`LvD5V=1U&@lXycRjjue909A)F{%U( zxF=KhT06DKZC3p+F&+{#@4Vv~+@#>S`=z?__a*UQ^!ew_`h{Ti8B>+^s;`vLpPu}y zZAcT@YZPxwe|e=m!{yxR7~qV2GuF{}&p%8z&T)1n-+>oCk3gkXjvr%NWlQyX*DM6p ze8)9aGv@-vqHS;S4?VNf!4C+Ez7l`%?4ICLu`)TWMHV}mGGM|Zc_=2rpJDOKF8d@0 z2KKtqd;3p6X5MiX>W{@l^fvJT?Sj(U&E8q7JgD}H9d6ncwWTaAHaLF7o>RP>-lkyc zkm)I=3Y^D(94WdOgiFRr=v3E2TrU6or^T1%*8@2r!2&qOlRld$j(lPv`K|fAC#{%8gJ;x62eetHuRC?H z&xS~e=w$CPi$hojCWNpIObB5am=MA;KGvR&!S=EP+GlFdnR-kFik`!~%11FJ&`rnV z^2kO@gqQ~~A;dg@2_f|aFyVimBgo$fF%Mwh2zlV>H!ztZ)EtB{+=b_t^L~}F_nB{9 z4fVnQ43i*L?!RTpH)8({@HajN@g5-60T62f0{Fkx7XBG$UdARpe!I_Tf3Gt6F*!F) z61v~w4_{xS?{;~_O4X+bz+xpcYNE#F+i+8zn7#(^WdO4s?7=K>bTlX2m)+`|_7ay=+Und?vp5yv8FOa%U7 ztK->t+^^|liN6vwz?w5xlk;~AzGear@|If|5tr_hPH=wsiti!qz%o%S%$}@d|d#Ll)581iH^>@JpI=gizgGI`s^2-mFXlEKCnkGV3EOyW0 z6cl$pu$5#NI8)5AFMu6c)E_M>9Z%@82Wwl-!GG10XoKS-5W2 zF4~2&d0+QKPBludSx32nXW~N^KRK%w8@~{QZiMmH0%zF?OxdD!tT8`|5`Co=zi6uW zy_1^x!zglTwf<9^EE7qn5w248V&nYEZRrdPeQVd%`$@K_3R}2Lj*w7e5!ZQ)AF%5W z59Su?G|$!yQDx}adIAkn&DVvGv2aBgjdo zd5P^%t0yFp<;d-1UBHhg-3csWv-VVJqw1m&LVqE%I5fM{7Qmhq?@@~_7l~LKb2MEG zb$91fZ<=>mLFQpSXvF06rnUB%UqM2Dh|Da1XY~o{k~9I9+#Buym~F#oyQ(P1A$f_l zTdO7JuU$fQ^UMEo9LkN4LHPdf01n~~{tLeU1Mstxj@&OjUqTeTg$tQ!Qz=?xdO)Evy2D8 z%J9RsUVelMtsNI<^Q~|`^7j(-DLP1gn05;W@Wg$QSjp4hYrk-#{9_XE-_QqDUu^R zr9iX5Qj&k>1}bo5)MYZ!ZCmudc8@5Y>g7}66m>oQ?nZO5Bl{#ANLF>nI^$MK$)h~< zjMN)nSgfvy@Wl#YS|@P)TZLWpUrN6?cE)yU|rj;0yYH0TQ^2FO&3=Y;I> zmbw}Q!xTBLybtDqn@{_+bhuqgNUK+YYO^)|m~UJ$$?~tq)d9%si?b1;*0td+FxxNG z4{^U1VEkT537SCu>4W0YFa{{kL^1rnoURVl%6rWtkdf)bhD^;|{anj}MMj6CFx2Hm zn}Ww4en{j~=N~7IjljcHQK$VxHWQ^$bmz*t0|*6L#JGNf<$XjkqH>S;wF$e`NOQYd z$65k}LWAAgv?iuRkFwkHfLm^2BwOtAAFyQi%efEsvaX?9N#4`{eqVRgKb$K4QuX() zKd|-M*B#@IsBWGk-ONT%iB?&}6-OU;?tQe`SoZr@IU}gv-`666juFvflfPA^P{rER znT8YSBlL`#ckHQRe<5r)-k8T{I_R6#C1WGr@coKpkzc|g2Vwk@P?Mt}Hra%<$N4aN zXB7Sp90lv#y$7VnuV?gyL)Eo*N`+pzl&6dh&x^Oqa(j+$xBcE>2-e?k5d5+K0;7v( z4LcVa@B2K@`KiYKdETf|y@K1BafpIu!_5#nrq8@>q>%WstTrLJ;r^V4;YnhgoF@Ul z%h)kow^I|d4TL;kLI`=lgpfQKOb9U#U_yu|024ypYKSKQ`$mW-024wy0hkct32qYn zf1f4aAh=xN@s}2>=koojjdD#ck@X0##p7-u`rk45zc3d!V*eL8_KpAjH^5)N`cmDe z8Lg||BP4^g@2_r_Y&|N2pI9F?>-*~Pf~2-38%T=Mo($jeXY&~Kin_aOoyDhB zQ(k2vb^B+PT%K72)Bq>2pqCs*T6ivpUVxB!uAlayo(o^ln~cS@vp#sSybs8J*ic}1 zbn(8q+RpHs*zo$1KVZ{{$}_VY)*|xgkk!Kc{pLdla5470`~4C}-qym-QM3DH+gZ4Y zhO5maf#O2~6m)~FKn0id#y8|ip7uq+n?DbhBK-vYaCSfuejD$}C! z6K>tv=p@(JO?AA%9Q8q{pWq|bhd#?C(SJ70C_d+Us=U0sRx0L_AOY9JvbPs}M@=8IHOnA6Iq zv5K&)yQ)p4U)uwaL*3{sI7xx6NiWn29H%N9DomsLw~>5m3?7LRtWdi~F-N#b&ZHjw z&Q(EC_lK%j3I(5N4ol(59CRt2Ea-ZvcJ;Y?x16Y)BMdlrMPz}E;PP#GY8DUC2r^-i zvcKjIIbsN451G}_^e#?2Sk`e7p+Q5sYpTX``YhN@5~_p_iDlzB(|V>*Gsaq5Pp_%bkuv*$M+n`Oc-lo>&VDj`@mY;js?MZY zft?Po8Jt6&Bq_48eS#aG0#?`4in`BO*m3AMt&061{Dx2&lQ@8D(dFFX1OJ{$4;R8^%g+Y)&yA6zI*PaO zaxw5qvKV`HdmNT)8@r4P&tTj9AmFh+O;?2t;bA*`hl^+(Dt3WYxiLG|yNPvCEw_2O z%J82vU%-SA(t`;hqz4m1vVSlkg!EuS2$=Fv9{-UM^Ys90>-;QzO z21G&d58_NfN)I6E|KITcPYRwK@}v9h6S}8rmy@lLHqT7gXL`$HOKEE!KggC|dy5Oy zFP|p085BAHZy=qvxzY&YlYfpD(yo94mn<2_uX zbNV147AS!JK*5Xk#cfod3Z+*X0g>jOO^lz-n7ZCl}*Y zj(BApTiYcDKR{m~O;Mi6SH~uOq*wFsC$u9PB}_^gnHa|9Fge$0(nEB7xmk}@+J02} z1nsi~-k(%ocRb+8AF!7z>!Z0=-CiP+O zOs}PNlhjyp_Ms0nO7};0{DDM9hAHF`_L?{4`!*#GaByqAJvnOOa)Vu{b;w5>FJ?md zLRC(7ie#9|2g@OdQNI@fgJyNtvBKT;Wrp|J*(eeARqn4u1=dWxZ;I(h-rb!j`Zmm+<3;Y@k)31pgCCJq*X83}Z-q{8N)exZv{P zBRz|IDGY~-J)%ixbR-*+z~Zvg=X9R0#G4~Ec;soc_nWdmOS98aoQ}Q``Q=4`ruPj9 z1%|qRUgK{n{VfzG6e-Oov?e7Ecjt!?dCC|*9Y6Vec+a``ML#y+?Mi)|7kV95?tI0S z?)c<#Dy2*d*QTfeWlp?F-R8D;Z%IojckXl3i1$DQEicP^n- zgzSoVBm)84b*FITh72x(?Y-^Pym7dnUfZQx4h6o!+dsdR0y7obUI(iSL;~~SH!^Uy zH2n=h`&wT)Mzr8rChmEj89Y1a{oo&Il@PY6IObFpJm=Ka!g9#yA1`|Tv7zmfaz7djvg9#x32NOa74kr9- z1`dKj5YGJO~tHIt6d#_CN&cp8jAq1(j;DVQc{qk$hLE5<$<%lpG1r@^PRsh;$ zXhUFKw`GI38siVb)b#g?UupxXexZeKVng%d{~6DWrMH&L9AWs#a)wq=3Oeh9jzin$ z$xW&k+7u*YRd#{n(J@(FsBO0eP~E5oPUn^7&wX$FU2@7)mfaM zdG;u7?lFtcZq>gBCI!Kn`lnT{mx?m>>1G?B?jovuY6+VNv`D*!Pr$EJE(13z0G9`} z%9JGy^OA#TZlSNOwtG*UfGYZZ@Zfqe_oqagH?RR-xzMoZ8mYrqdR#x^7KZc^B$rRL zv$apZ))h<0FX%Q}82ATgy}$)3rFnDhE|x=usfq5X-?ehM?AWaRkssTvcApQuL4wB* zhGOiz?iVEeVST+~4~6Y3_X|*oGzs#r;M>)o3lfSAd>r_=oc0BnmtL%7>YQrL$L4CR zx06cHi7fBRO_r~ai>_m-Tw{?&?4vTyqzG%&rVAmzO` zSd#K^Gpl^!tI=^2u0%y`ZbueHalrxB#P8!(K$-fd6N((e=$&;q32 z{p)7U7QWD6doOEOj?7&7Y|Jpzzk2F|da==qeo?R>T+|*DSob$KMi7-kNGac2ZKr6TOTpNTlB!Y8gI{W3i046(l)#vY=}W`XA2 z|1-=ymzaZ1^;Ruic@$4I+_ummb~eCFV3OM`U`b{0t@Gk39EJBvX|fY8S%C|dC|va1 z66aPyT|c~Hj`qN~6t@U|3jq)cG*!JG(JT|3ddSD8)AM0uE+}Xoc0ILz1EY!90Atcc zt6x$9)U{Cs6|d0U5VCs~OLj86EEY^sEk^=$amhTxG|E4>vql46RWH;sYrfLsBAdnov7mzj{J584o2ar677u$ir6+4B!-Q$u z-C?4LSM(xfABjH!(-1fZcjsW_Uncr9)iBkozh}2EVHIqyB`D3wpk(}Y-l7AWifbV6@|V>48ReKobk zj|y!uYU2%f_*VKssn2|I-o}Suzyc>9(8HD+Oi;A6D_F{p!6D#OMIz@bpRP4~g~P^C zl;m7ELSurio0TB-U3;fBToFBECgt9^7r>@;9zI7E@mc|D1im`CgP$$-RO-e z=G@S|Q&^-vzw~=0{J68Xoq3Y)R;Y`>4A+36L zwxr6&(;Df-Ev&&D;QBo+2l2wU=SHF@2o}qe3Q4+N5Dv)BCU_uDN!GsVng9)K-HH6?`-v}W%m=Hp6 zFyUVb{x=rgKotl@K?>C%IW`EvK@bfBSrBsp;#|CUK2I^D^6U`a-j*7^zbKCA{G#o~ zWBHpsxK6cD2hi3Mr~QwM^;eG=&YPp|ePT6tV->OCnK;vapc@0stMWTmuPUG$%@}bd2jKSk{Hj0V~T;7B0nu^BK0*n!OmtF+8=0Yn^Vc z8!jXfILlk;D%u6-qEa-tWm`k(;|4kU6Q7N}Xcj3-7wup<_Pi8GP7@fJ5Je z%YkL|jrP+<05opl59)N1&p#kF>%_t2E7OFb&wdh$;9%Z=VnH}kNl1UfvdLiSZz<$4 zfGF$(VcE-vEVP{qhI>yeKJ9%{o@&dSQA|O-m~LTZ6J>(W$dHF%G;hV9Q^+jvLJv5u?K&H z>$nAn$VLKT=$**F)}01M{)~Yh(XWWz1|g(Tl|W> zI!b|hl(AAJkn|?X?Y%^-i@UwqR#V;1S>bkspxE`4q*4N}Jp(ueLO+{$Z>WIdyUU{C z8{^HCHg1z5+Pb^ZR?9k12rqBrKs|Q4y?bk6r*n1qya+D)^cLDvrY{AV+n!2R9$LkN z3g#uZfo)J7olbdii-nGtJ#0fSgH^;wyTviRsI$wNyeMub4kJXMX1%q4d4g;gD}NCaN^O zDD=|RWE;>7o_~&vKC>yLKY-r{CilTgm;}#Cd^GVA;=gzo3YEZ8=FZO@U2eJHTX)vw@t= z{hnEOEkHehbnPjMJ#cGvYmz4xVX zG{ylC3)HdxX_hGLGl{)@BgWLPdkVESo2fLe_r*Kc6hgy`IA?+`%WB{#nEWeN3o`Lf zw?(W?Yo|ze2b@Q=qS5#Z5K6z$@;L=Y0imGt;mTV9SbB%gnmJW(sZ!GN1W$)2Y)O|^ z)`rWknh7DXcfnEUj73EF?{$Wl#?r^ItvveJTJGV6Fu8N*gz7s^m0@lN5DLte+~7A; zt*etlPzgyMODJzHT>?5!(asO4O+wD?Z~A0QUyj!x$Wu1846iSseG@nRbO{RY!=xLRYTi1$cGJ62jdwrUHBV4xhI^dQxGhJ z2_aYp6aMFK1PKknGT1jlXbUEUKom>}_2YqL;7ThpykFkM&`qr;J}Kr|J?u8Ru=MjZu0xzrMZ7&=nc%NI`Edi+u>^9A5)nVcrlv(fKng(CV~GlPkrO# ze~0(K5%|WJgW&zYur>eWs)H!sh8!rne`MGjFvR_cRF1sEgIaEjM{V-$nIo?;I&hzf zu72j-Y~lXU=n%~$l9&>*+M$VHqE?HXyAv*FDuU_I-~0@x8z(I4+=;pttSkL&CIrQE z#&-~PWZvD@qjo#azU3W&pTMmKCmV~zC+}D#DGWzr@7jFP#H4~blT*i(;GsPIJ$(i` zc>WpC1gA7To1FBRISiB>*?AE;XT#8>`MViHXbbG0j=pjO&WM$dc=ECF#U%ICSR>;J z|1-~Vx=4a~)Jgi~nVj`+V+m$JC}=a1W*VE4$o%h@mXYd~lZ(Q&Zs97JvM$E<{m;MH z<_j9ZQP{J=Z3{CXD_(~0aBe*0jBWq$sCSpbwA|~;?24I>V-p3_Qz@9PNU>VD0XLl|S9uj&8Rf&HD~&GU*CLDtE53J7NLE6Ug2&#z zU;F#qGO*F}n&4RVO++uA_cS$Nz5U1@+og)By*5A0K5XA(-ISu|jlBb$r^>sdH6Yk7 zZ)J!0jruu9+oaUJB^wXD9NqkOTvH5WsD7>Mv^eyxN0X3%25Al#U*)!+nnhsbuhDh) zB6hdo1FWmZ^1#{aZc^V*1msG2?if^|=r!5iM|i(v+F(!@{3BIRWGB`9Hqb2S_{00C zq5FiHtJ_zrDFt!7tkHWzrQ_=C?JV29qG}`Q37|IPQIj7-k|@Oe#Zb5TN!TZ>!Yss$ zBY}1l?K(@2=e|LP2M@5C#}))N)^NG~-h7R)|}B zs!zrGu(C0kUMVWRWLR!`4iwT#IsMh%Z?oNUM0YF<;k>`AvjD40zo!bzPL90T>kHhJ z3T}b^sbM5r-Qyfb6866Lmh2-9DH1+e*4)J*9~p^`K96-`qBO8cGsABC;6tmeEMl@3 zbL1CCW(6C6TftMiyDQ$r!Dyc4K(oN!ts4Z_w=tTxT4!&h)iOU(Y?mLu|G}zD@0j!G zePG{uoX*+^C(L1t3W<9gA;Li}bqx1kdPW-uXyJYYho zLqos}_KlEy8B7QvIG7NUFM|mos0R~5P!A@Ap#CPoLDF0h4uYiEf5YSrz+Yx~e|lGM zoJj3anSDsK1LunOx#|XF|DCx2;Xg?I{%_Xg#-H{#!2d(=DSwA;T|WctrP%QGorvJ= z)%{D8^4yl(DvzzWIvyimV0+h&VLOr%Jqi^|_HzDP+y_EIM^yy{7)nIm*JE8DDw}U@G%@4bp`zXSRiOiG(5LIrcmN!_Wxx2n zzEa*jJ%W&Vt$BI^op@6_nC*8#!&&eorRgO%{S9}*o`=e{c)To>_b>ZJNCY5%Fyoj}yo`*|7vs&q& zKKMC+^^=enpRAP}C8(wyhc$peBn3AeBjwzFHyhxFw0v+j?Lq&FswTEG#w z3KPFb;t8CL8|D|B$5byC`ZA|4>b}f707v0Y(dm;CxH5@19X(8f9H%<}!2mNhlWa0* zV59j7P9tzn3pl~AoAoW{wS0~0{d2rK9>d-rtIUFQ>U370jXX298{Fs33mO8Zrqz~v z0`^B5PUemHyx=RMtcdsypP8@2QrZxQ>7185eQ z2f9IUu-p*>y+j+Ub(56BzDeqSVLvm&HfJ07QPX`V_@}iv#QHPc_z;4F2_awx6GFfY zCWQKLgn$|B8zEo@6GFfYCWL?)Ob7upm=H1-ag*R6m;^yI2qr-|_&30VVDiStf2)Gu zum^DA}?KO3_*KJKG&M~kYU-8WbI0_}kabZfGdC7@Dfi^Ve zCW&s2sk^u}VITYi*lBB9nZtotpsc$d(h|!j#(EG*@4(Hcyk5AcNd2QVUVk_#1sB^T zjPS*PkqjIKioK4;xxtmM!nX}JgZEG2q}AaF6h16;JEc5cU8g4ey&D{CocZS&mRZ45 z(YGiecH=*v-aEr-Bl}1dx?ROunP5{fvF{5Dti!tHAh(%!DwL3a5Swjf9qxylXc9F%$4xvFF;+eq08|$mp59WuGYG<4)C(FtJMUvL<@oJdYFx#wqA zdYSIb6zd!UVr}}59!v=Jb%YQc?1=v%_zlnr@M;E4q9RkLdNY4sNP0jqx9Rrm2I&4f zM1yb;#6A2AlQ(`E2!sDSdjR5G{^cI7$4&`{y0*_07bM0^(uiMWaPKzyB?c0}o-vz5 za(nP|pql}kf9Sb?Hj~n7V76=g%04IhQY_1b&RUX#SY6d_yBCB0_ouPYz4>}5@KLND zC>QJxG!Y`Va{`am&EQGj$*S{shbfofh8_VOL^Q=dq5|hRJn!~P7C)a&bu&F;Gh{!> zE@D7o#3NyI210={^*T-Pve8=`w38rO%kyZ2KX7RW9#o5WVx9yPw^j_!)eJnbP&6l%sTbu0O-*OHYfy#pNIvZ@t0nW@~o|}$3 z`^U57#qzwW!7i2n$s@&!Y(!}8)^)5%`-`QAMEyT>iMVBdTE$*%>Wa0+C%KRkJCB~; zrpf`H3=@NI{J2w{E)Jnfk1g;&WvvLMaH+fq3g=le;%8rV{au&^{XY9TR@OjI`qQfw zhjjsp2Xb>-fu2k4nW@iTZTr_%xD7V6T>)kRMRRF#p$jKOXhyQF{7XQRMVB^@>S_kI zorayUZ;2XkUZB?Q&!eGKVMYVjcmVS=yyYe3XF~mcl?M&yJ`}lHnF*9*+1kL@^c3h( zC((x8@2BAi#API;Z?neE2a|MN1VvAJ`IN;dlmelk^CeHWHD}hjy11KyJ`!lM++8Cs z(^y+gl85g+M&hasI0t$}d6<-==Vocv8e31((RpYeu=w?OI9Df?Kd7sq;TkFiR+)pc zCHV4CzyqjL=%bWGQ`*QWd7?O;4Z3{|xwKm499w9^b$F91qnYRE&;{ zdT^g?X{*5Qv#qRzo<1wWFQ|tZHM7__{bUoI{2>;?uC4K1Yud{n_qQqDxqjC1SSr3X z1N25E3Se6`mpyw=@%`r@%;B7RQ7uQ{@a}>Zz)ui0)I1 z6W-Ho!sbHsK`c=_D8}i(&tN}&`$-j{HetNC{w8%~&Ap^2+65$?=kHvojPnpuOaX7F zKq>qT7e+t8yXu_DTBZ2*)w&7qh@f{FZp29HSkK`I5DU~sUh^lFS*DTITlkwAmYFXa za$33XaWtY91G{_Da;}1XH&KMZE96M6O41|KtEReK_JaB*atyH_f90TSew2fIj!0P@)*!~{U zudh47%qhUiJNTv;Bll9@M*n8Y)M2%Sdg?>fCmHAZvA-%ReTs4 zzgfu&>R3r2!Lm5%p`n}?(Hm>zG0LPGq9%3@01NF_m+Z;z>NnAU$8|B2(7-f*pF96C zUM`;_&Pbi--X$4uR$y-H2EYUL9mNt2LUd7@l_F9!)mqBWU_uD# z!GsWig9#x32NOa74km;E983tgGyj7kI!Ge>FM!|3?@2^nj<@Ov;j=0GVp6a#YJHWT zDZPPU5XOSwAB3?W_y;i$AnxE_zUDdw=lt0#OQ2ghNA%F)-R?Bzvz-cQZ#~vo$~_r$ z=@tr>3Sfma<_veez0Msx85~zjJl0SL_+3>6EC=6^6eJ5O%cI|&xu9d`pEn=f#}$UU z_O@T)_=47I?8Q&%CT`5F(8_Y&$w?H-FL*G(Hdk_^FsQZIEoGa|DNg39-ru%J1IcgW zvX1-5EFp`paYFIt|3$)=57Rr+KjT+$G+9z{xDC=J1%prLkAq5&1H$5&ZWXHm?Rl{L z%g>+MYHJxG!X*CkV&%WP5FGJ*d5i9Xw31og#SogY^BM_*eIr==`bxh31XR=$r+9Sd zHH)V8nD@H(De%}TJVfZ>$Zxmeg{Hq@spEOy!fB4mrUGM+=U!UG{URfKZ&D<&9H;<8 zYZlVA!VViO1#IH|?w8iWSc^B$zs&a4=H%Ev&x*grG_nG$o5^f0f^BA|6HCMG6?~`JTYNFIVUn6odtjgjXTtR*3=(Hdpr&NCi1HCO z=Ho|v^=-9bfk6WeHNd6yhy`m`8dxSE&YvyjBgKMA&8gL=+|GebhdV>2S<1lTJdY{N zl(~NQ9fDHzI@YEUmXfv*)wh7^1V(f3hIB$}---x^Qo?j@sWh(N?XMYp~sc=l)S`tOq`@pbNN-ypC0JW=`_f){> zy3PFGv?J`l{dFYYFc*nX*_u?UW^A6ce#)nDPZ8rB$c*)>N)O=kp1V^8z#~q3CKxf2 z(~(NvFE;Z2M#$wC(@*JxgEfBOl=`}j9jWXpo7a%*pyZmi=8 zd&QM@d$Pc@hBCcc?#7prd87Kmz$B!7OIz17&!++t^#(h4<*;0@66(Eiw%eYdcFfu> zWk^Clrj3eLrf+UUOH5B*pj@~(zzDqS75Ix2uZ|6TfYi_oKY)f{44wm(!D zYznXFfWEKLOy+EiOL$nl8MDYfOd7T4Fjmrio5kI0UyWEJ{YMv zSl0M>=d%b7Tj7f_w;6X$QP*-oXTS+X&=0n?+_xy8T<~OQ!_#W%;1SzIEr=h~BMa@2 znn8mGt=H)mL3DsrAT!f_p4YC{JGtAZ#B~)Xa%ZWil5XM@_4k1_y^UX3>r-gyxmkZ4 zO^Eh=%EftSB~@*(<8~MvLsE6+$nSg=N-Dhe7X0|$%UFwz>Y%0;FJdlb*1tUF9)}aM zANq0=rmr6yx$14w#KltTthdf2FyHcQBVfFcr1%!r+!ZKr{i{r|QK5MXuf1fKHm)g|Z_r?;5!{VY@o%PtKQXCBVl6T!x|!Axp`ma*h%u9-PHh^(DBr$uIaT zwjCbz&OYrG1VVvjk=G7ckREZPj_&yrY+?=Tm{vAEPStP4v@bk$AIc-W-#>FHg(D{w z%X#l2kKh+4B1PEIW8s_?zpDDKZ@#EMw(jFzBwH5{3N#JB=IZ!uue(>uDGU{t1zqkA zzr?xJYglI9_*;)#ON-*H&I-Vh!ITZ1B~Vr=@`x|!%QlOF_rah5 z3N+w8=+6~=`162Ucjw4QMYl7Gx-LmjKDjp}OuYnz0xR0zK)57TWRyqms3Gj55(;^VdG{SxM-1lNg(h-=etJN?S$mhPA%l?|C$tOOruDsKFpJ0$~)G5W*-h z;eSFix+Hj$!uSS%v{yY$;GI0|7ONSE6HGu`k@?OtmDU4s58)s}h10}RSbP;uvql_B7?n_A_70k zji2@}fAANpRWpa>Wes6I)iR$HjVY#72QyzVob&377*Y2zoSB$J!;urYFowqat+JRG z`spTKeF=vBXh4kU$o15+lfmDkh*B78{7{HByB$zfo}Zw0iX!Z05cuBFBUSb=zeK)e zCg#)19{{v0P57X4S`Vmmt@<2jGYlhJu4FM<-Va$D&_dcc`c44Mp+TG3%}$DL&BHaL zcHVz2WzOO=J$r`l8mWzh6Dv7cVU3y!Os-15Wqdl+Kq|>b6baYKYBeVDlKTT4(!fd%&Q~(wwgQ*!M8Vk-z>?Gr=M${x zud|2S7=IcesD{{!=;hw$m*S2X4g3I0`t!Fl0cG8v(UXFk6l0Nr8vBTY@)`5e(t@ef z&T7%t&dN5mwUgARe4v+2rGFQx_rVlZ(cyr_0NTJKE%un6H(p7+UmAJO@KR-ex9EX} zx<0L>xR#5Cu6Zvx4%=ZR3tS|rx-^TZj)P;`*%eiu-j~3RYY(wiHHJfrV5{D}iB|n! z`<$$~T0@E~3&kY5;FW*!v)`u$njHT*t^28mxYaGJ<*c@k5Qn9gzw5n{5 z979n*fYVYKdL%!rkDsh;&|gB%#eR#1npxX+amYAtXLmFmw_^;rThM){ARmhI8Xa|q zXo7~H*TY}f@>og-Z%1Y+^=pUg0D)pDU=~PT2ZSh}rY^-OXen_pHM=6kG)BE*4MTEC zQ{s-+Lw*JYfBwE(WqiH43#$+AWd?~#qh3mjSG+`2_KWX+eW`T79u*J&189B!%A&CH zRm*YYdq+}TIHF7^*7x~)zT^9qM1zfuF?kozJcNI)APHYGF6;N@BOKzd{xO=uY;o|I zEff9Be0=lnxelKhn}BugQ6l%B=rPeqxMT;r8~8 zRmuC>BfDkMdweYkvlw&0B?L1;HxSOuQEmmFHY}xuZkM$@$$&GmT5zYpA^h|rOlD-Y z(hCEEM|GWX_n)CGk1bM>6$s-|Mys6YN*5I|TfH3LR`=e=2~& z1i9e<1B8PltN%jT4bp*ByZ@Eq-}vu;rMfr%{4c`afbg6-1}FNjhdNkqeLM*1tV3Vt zhs59b@Bc2v|5v5`?=X|mGoTxso?CP{q{AN+3)5)0vQdkRN3KEtdh^IXf*x2AOGMV& zzYJlFEHmJ-Q0NZ26@jrdzRuPYaRj`x@Rz(Fe=ptvI(lA1;WhPvkX;~q>c+CPM)sks z?udf$U@3e#7pI2(ol+|+ZeZz&QtxRt+r*<%&6Wa|LbT3TuhO|uDkt}jIN0E^dLNnt z?><-s?m7W-S{sr*2vxDvzk?=>{wr6W9h+_Mv$lzAxuuw1Hll=~zRYHU>A| z+v@b)%6CfnvB@rPX;3h*6%uP=r+zyV=q3jpS}w}(P=35u+_4hmdY4mi;q~p<)4QW5 zYCHA{r<-tY02FS)dd6TR@Hf#_l}Zo6M2$<^`v3g6@<4>}>4ePvui;RPXn*fk;0_V1 zXx)M#xzjg=QT2KpdTXs{7OA3VFHJ&PX%+fQql!0u!MmJA*SbUu1IX!~DLet26clb08>KfIEm z


g@0gwj&I>FzzJ9r^cCQK}Kix7;7m|J}njV5V5k~9Q^dS386Dh%d<0J%_`MAql z`PImOe}%kevpp`}k|inH{P1j*kot=XrTVXMA)xskbj-NHa9c0??jN41bWVA}2|+lo z;yU@>7>FEa&!sBc*a$xE3xV*l^$B&;w_TOH-sZ$R#9c1U-5rY9?}bWj_-w^Laf-m# zK#&3^gyh0tLI~`^gb>(+386k22<*X*2!TDA5CVHJAq4hdLI~_{GW`FZqc=baQtSpP z0f0CF5PJavX%P4EFG$}o2#7@t2W;QWDr|#~&O1O8TANZ6p}yF*@xhR%S_j3Z*9+1qKsXb(;^XbOz*p>8rYI_X|KO+8hS=-29B4YcT@UOdvf985MT z8qZ=2!!m3!wDHs=eOUx+n3Izutaz*iy!+6#W9ja4*D+4lhvGTgIli*d;Zsj@j#T#9 zQ*Es=yW&IgApeii9y|Efd9{soVA~eV zNqx$(GnB|W6x->0um!<6?i?u8xt$rTa_`}J;eW>hCD0$(aew4|Gx#hcTG#0DExss; zY_#(9i6-B8+Z; zVx+!?0)v*Ek?A-0yMl4pBq|e6`Uq=9hGf{+aV*gN1BsTjfN5i@UxWVYf_Vz+$SGVe zejr~-pa{_1fcKd@_nmH_TY?F&rMAw) zn?^{VIZ=QkhtCwA5}4FTEW)QPD~3DT9lXqgN%&!@iH&gXD%AMy_Y!7cIpp7WE9iq- ztt}nzuPREkFZhHUBLQYDuU=Cy@cs|ZK#ts7ao3FnAvp8teD%f76Y`Y>vk zbGJH;+`Yc*ZUGLk$2zz(xqi3aK4)^Z=IL|LNWdMIgk6gZZ1fi@wCn!sb{tf zj$FeIg5;&ExWo_(+ILXQOMQ%i-A-6Q(RDA8dJ}uTRLh z5%6Gu`QsZ1XI*#h6#xbV@~6!oOXA@U4$x9|I%;A)?>IB1238m=IzLz=RM}049W(0x%)u@_-2;mj_G;xjZ)!4g$jed&1uU z;o!jKNVeU(VdT9fpVHeOD0}#IU2YhF|Bmn=2nTT&{|mzZ9cH%l7amDWdNdaB<%pC# zH1J+r_FK+W&QPkQOqO`MI)DX7PX2+ccW4Fqz0rkEP&(U*5@m-&<=3RO6Z?6>y-WVWwMWMdwBHvqWY?s@t@3D$ZJUa42Q$Xq6~I_0DL`7g<9@AiLx}Ia%bi> zcTsa}0B&Fu=FC#RjzZ$Qi6^e2(AiA*ocu`)JP6F=8fFbCfOljl`N!Q{{IS4oLb6CsMcwBK$7{e@NlqVcGDqFgsJx z;)rbAoWe#J0%Cze;m>K|cyu!3^5O+N8pryS!0UqeEj%xzG)*7=@xjQRU$V0x;DKhP zNNG+M;6;+ZC)+akReVbgo9Z|cAWF%dvj@<0rQadJ)Lx1IKuV!scfhl68x69OdG7~q}RLRySjN8E70!{d@WA&5=Mc%>X zJ!db9DfJ_8+;I){3XJ$U5&uw)Ko3jng+B0PIEar5$9O0B`#MwZtad9{Se-@+NtVPK zo=ge}mk`!N^T1!nYX6plKs!G{6m)pmuo|k6!dO;9L$8?cyT?K(V-vT-2y7ILTAAf1 zd==+6`?;^&jC;-^R5uF1D2m?AHLSfD=g&r|4{YC7Aodik*H%UI*ZZe9RA zT_~TLT?kW9i@ecV=*2S7P7rRh@2*~T9$n?4CGu54=gojfzEswsD_6o)37Nx~Hxv*2 z4TQ5BZqQ4$YFb}CqQ(ixG35;W@;LD8ZT<3>^B0EUxEef=FU~w!|aT;ohj-j0$aTDla1c&{pbP|rAhmFi zG#kV|fH3-Bh4vf%0K~e0Wa0bd^FcAyNARy~o9Yc z^PCL`j5P0Ks_X))gPzHE&HX4i*dIz!hJHv3vg0`;xqI0D#i01}Qss|~m4IK_6%8WV ztzP`8A;Ha+K>Ie|NRYl7*F)11V&d@Axi(c5SfY+4^h6BW6Fvnr;olo6 zIK{X|OCqig!zzr1oC+Fma(%Zhrc8rL{To7%D}E&(svN64NujSNLMUIHM1f-zA48M^ zR;VR-g`h&m&}HdW0!nid+vaP1^@_7*%BnU6h}tT&F} z9Nj-pFzL`~-FrY6^Rtn;uvrdRZ^cI``;#u6@@^wWNe#@n=lk|n$y~Gw^h8SXg2^7Q z-xD98e&J6jS-~h38$lrLIc=WnnRnQdxRPd~yiG&{GkhoMRKyKfbIzdmlo1!BKr-s= z5kmW_LD16tGOq=?5QPr^o2-Xi<*+~~=*lyQBYfOn+jKPpaW+F-xAMA#Stk3D%%8=P zM;R<3Twq%Q3)XPc&Wdd5E9{Sbv%Uy(^T%Z8eEHTab>pD>8&zzqHL#T4|D=%aMLAd! zjrn#-{oAv}^iqOad68)P&mrm~)o?P13-a9mA@kYQvfD}upUeZVLg}-k~4z|A*KLK_|HN* z2*Uq`vKt`$Utsh`7XC8PMRpVS(U!7@8sTzIWP1)QO396bgV+ZU!h_fc5QKxci+@>{ z>k=jl4b`O({0qZR4nN5vD5c+`KjC!of~WR|(Il*7G=2?iF7Yh%)B2Rn`n^z-UQUxK zM1Dk^fODd+u0xcjta`R7Q!`Kx)0$Xm5%4yC13nM+ElLjU$B7s}4`7_o4#G>Upd1Te z0(l*N+AVupM;640{H7jlm&hM_8Dj^PpEzBGa?ENQqlJLxcWCpvbc9#k1N6kEF$G18 zAw!D1-n@iq9@TII*Ty2kZu8FGP zXau1{`TJ-NPAQz^I_1z7n&}ZinNcffkZ>LAxY>S4(6D*8x`s@Pu-~NRSMKApPfd(s zG7C)%)RG)rK>ZPe@8 zCYYw_Sihl*_m4V<=E=A|tySt|9u)ihn)q(pY~2~M`3|06$uO#lHG18zVnf?ofQqxm zP;Y7ag!n9y0l5TBm!SPQ#(Iu}sqC5_?k`M>`NncP3oyP*6@Bb&xm3viTTI z4&lQ0U|j{WgtpF`u#D%Y5njqx|DcdW1YWL>?NgRL#*O_YG6wq?gpQ1OJ+saj%wg(o z<_y?z!$5K2e}ZuPGSir!S##cD_e1YU3cPhj##9mBA@D2J(_e^es40E};b?oTdqb|$ zrTHXh{eZ%B9LtCveQ*$mp|B2f(bxL{-0={Eg9#xB2NOaa8iH`JBSH`kCWPemU_uD% z!GsXjg9#xB2NV7i;s4^~4aydqYmuLfB`kX-l9=-vHzs<~sy+5xB`)s|hGs;&9z8$3_wB6P^o{n+4%06=4vD;@C&;h{wI6e$pmg4;*Z9kL8_x=F%@q)X_W!gLJee+nrPY7M7F2v1 z-Rw5EU{7-3UhgXV<{VhF2Am3iV24z8F+FqWChFCYa2{E&@-g@a%SSa?`ge>)lcno; z?9{-Ac>=ad_jE<)7y$Tm-9r#Zu7C8I~NAd~< z1to-AaO$tE2G%?0Jy+Pq7F31S<1Oz2yIiZsa$qAz!dhWB;mSK3Z z?GaurkitWMx88(u+UaNXh3 ze3eeC2^7Irw6e{V!;SvBWtP$%Aqew(DL7C7T|XJ4(&>pB=gSdZv5T(bQG2A3_f9TN z1Zbz!d+ZVIYMM6yYqE;kYO(KrG{?sl)kENGnMpS$HAEq~u}mvsvb$9nm>pu?fCTB{IRhRs>#SQg$y|0wt9Is$u1jdeOa|i@;Kxk$pxtI#%A!s@DZ1 zKq$~8{Q729;EI-+m(xAdJSHWjddrJqPfuMqfvR)2GxcMZxTHiYVD4P+Ir^MQ5IQ-p z&$#ShUw3BXV8Z`g9+1sqAgl*FA|zc06GATd%|bc|W&gV@{9h2h;SZ)%e0|a2 z9>riw*w&zrTKa3%@%h|9IEX(0f$+a5d*k3Bj0SNR|1v&*5xx@8wZC;Hjqao5Z`+wz zeVY4<;%8mH04D2jzQTO*y7fBJGL*Q zOe?V>j-@n#SkMjCqApGk@T*EBt;fft^qO+m7TYtD}5$sface2*$E$YmX&g0m`Zux4ChCb{59X6C_J1GfC zK=WZz#lY66Aob*Xn9UmFqASl{*QXX=Kltp{p8s6b!lH)8a9y9)IcqlD!@F4q63x3M zrt9A&je?mqNjy43AM+$AWB7fk2fo2riFp?{$lYhRpX&VLgrnl+6E9862Q_}joe$UB z50?PD0PV}QV3eddGbHGqh%3@wjQ<*Fj-Z?z@{cowks#Bd%F6o!#6sK3|sp zF{3iitg7)AZA!8G(pxXgDrY>-28adva{al4QWi0OB!_ke>X9;^j9TS8^LH;kB3M`L z&BKZ`iiYxL0F!TC!@A+Bg;*^$gI_H}XL$p1N($;f#TDhYOsnR>mRJ4H7|u&|JjdF@ zGe$53|9QmU;)I=#Xv@?JqwoxmnzG>@l`15Cv;aO!A8}IA3`&$7b11pp*HgE9)f37EJ8ivfjY&q#Ts5iFm~-+3wzBF;(`ewX*ie= zf@Uxw)V~ozT(BcTE)SRxf@Uxw1kF}zaTH9{Uiir(NGK7wlN%b8YZAzX3&o?gVwdHx zf|d}Ab90H+4z&DdR(Dq5Jd^kpDT^ir(ki-YZ=mkKJ5bdbfI-Tam7duG#SnK z+>%H5GumC$4jssUz>D^OLZJ+Z>u;-Y(#iACV8raw@oE$w6T_c|#_dTig?+FlMx}obr2Nm#LVZd7e2_(ll}%cq2F+Sz6rshx*E{B9q?5ikcJ9 z+^cK)M8V+))Wf9mm|F{(j!TVcUlJwWO<7+1cAw_)6R#C`pds*?6Hi z)l|c3X|%6NArGNMJ#CxO(P9t~3(B-^H;#5$5czZT{iyC=0dIt^L}ZJ!y>!0gvz^+z zkaf|;0Q;0#E76n_hL($<&>Vk%sma;f-8Xec0YpdBW++cao8eKi#KkGT<)&E*jddw^t?;0@-*%1 zX9In>45)(-bbwe;*6b^L#bXC@T^*W#(urwN2fT~jdlWr%sE*-`+UOAZRYVWy{qVKK zPtYhyC2|1M3MK}?;~}O&U3vzM(Eu_ex z2oP52y^l)LobB$1sI`X0TKP!$9Nzfvf4PglX?V0d@}Xq&qDw^*HyujE4MEgAHCT;1~0xANUIUVPvqfdw9j}<>u!CHw?BS_%#5hj(ht>I zntvRF)LwR9un^PY2@0zKd1%+d*QX1K5i>KRI?fN@l1{T;z>y1vj+@>M@?#5S))Jr@ zgnf?HFEVUm$E8qM^&)`xCtWD?Lv_V{eB1ENbVP4nD=nwQ{4b*m&(}{mg1hV98a3zW(JX*iOHD-u%nT1EzDcMgpOFA0k11%sQxI1 z>eNo+_Yn3M!V?L4Zkgi9%W(^3lt2~Rw-6QAc~XJ;TCO2Y(E}u z^p$FRJg4^RKCo&HLOv1at-?p{8t_|u-m9ba-4)BnSqeJ!m$RJu&JG{{1&3-Wgs^~Uod=Qs}W z8QdU3h|d5MLhJ*W5Mm#|g#WpYAioiE9d9xmgoGdz2Ei;yru?sD_68_H>;;Ge_!nkx zKpJD_t&u(=Vuv;H_gzuSUs95c?A$kEgLs#JIe@!ux$(N^MO#J$Bf zj-bATy3`|2_DE{VLZ$5y?A#FMjS zSRTqBf5NJ{4yA97uRb6%hkl?gZ&=`4Q{jj|(u8RVkj0m!PQVUCCL&})8XX`m0qSLN zR|*+oWun($Kq(+kS2K@07*_fPyK8RX{x#0cHxG zW=jYDtqbOD1-~{={P=KB=F`>8^`mNNpm2S=8aH4OU6aL%;!FKj^f4W!RGJ?Nx34>z zOAvi=Yt8oo+ME$8ig-kov=ieD?)~sxy-PswD5F>T#d~aWagF({jN#v`11-*8$2v(~ za6OT8rqW7BV0cbc%ikn^e|<>IWY5f^VUCqg3#g^54WR#U`+WCPfkDZWqRFGCb44mt}|U(O@r{tWaeBK0&s7Nr|X` zn1iok$!4*_AL{kx(7vVal_}6Du{-CRxIcOer%z^BFg%9-ZFoT78BM0bEv&g+uDK9- zXx^?rPoXIuS&3=Jk2d=j(Lsk))ZnMMEu(vdN26_x+s#pu*}&J0_ZTK$`8Md|m*ehj zCA~J?v)j!zlcEd9k_?NIi0iMAPQ2q$oZdi388X!<#?8Oof}T?aZq^xpI<`vec!>z}_Y<2SS17T7N`xDA?No~#d3HN4c9{X4|3DcM2&3Kl!biS`dt3Sn3gZB1- zRihP-N)&%K>w7=TuSX?J?CjWx6Qd*Yv>g`AlxlpC7zxFI_V;F$-#42piW3mV%bi|& z+Ns4w8n)lJ2J^(j{+oHD%hdyUIC4oxHYy=iqDQY1aA{g`h7oo~wqN+a%)=A8LXy!{ zciVvaW?>x2Qo~L*62DvHT3AJC+fs|3JWfp2;J>yg9Lvvr{T(1D#li?LjE=3?>Xm;{#c?o9n9`V@YT0#orpX3C>*R9D1kt}l%5V7noH!~sMI@grbD zh|K^KLTm<@5MncKA{+#xASeUj$0n9t_Iq;S2)h z&MOV8mOKRO8~+XBZ2n~*u4h=yo@t{xDG`Xc@N)llzG5;mW+bX z+cT$mo(B~>oNY8VBqBv!fe)A*l#Il{Ev{G2O5U?m)vW495Z7vsRM$4MTWBBs#bROe zI~0_~?F!}-6_lswD?toPB9Y$BhwoSIS3h*TjCz+#wjN1HHVu5e+D79MO!sw(ShdVG zU*)ox$nrH#o6tS3$b3@|{Y|3ZISHs+xE|3)XmImrOo(O+539#Nt4GT+eVClMToWT^ z75L>~c=t&tP?;@MO7q9-#Yz?4Y}R@p`|RVamVgl58%2ss?)o}ulme*jf*5fko7iwp zKxbZeMbsP%#^K1ZLf7+>2I0{M^z-)Nz}-?Fv}wL<@#dBvX4cQnXp4TvlyOcO2V#? zle{%wQU;?CvVN1?>Cc6Ox!q;yj(u$L5Q>5N`pFQGwqKM@b?D`0QR@ugfTqlMA%#m*0n=qEbfEd!|$6`b;&_CP35)Lq}L z{_^*FI4iV-qOwx@9X-kB{G#kpbV!j&(!|mcnhsJ;KzXKll-KTDLxWX2)j>7G(ID)C zU6B4(Uy=?V+OOA3kAZ0q@Z$D$tY3C9-^gjB*J0X74ko?@AE(|nBF1$%IhbN@Z5P&7 z+yrjdhx3CMWUukXzkB#x)xs|8_*={RE2YvFtDcVmnV5PWAKhX6|g~r2fOIW5`sJV!?~HS;KHsBQ_F@7wyT2@i*GyX zt&0M&K;N!Eb^+Od_PbI0`>Up*Z<=xuS;drWl=59+Xe`}2QYO=L-+?KX+nq(_>#a)_ zRR{NWj4VS8E<5f=T~IUe%5HG-S0YC0S7N;Ls0oxLfqugH7)sLbH~t%h z(IAO3h(7=!{Qtdm`J33)KC6oNlR2uE8!|>nBN|)l4)mJ5l#_v>z+=)BPVWExZMb>w zIgA3a+r4sBUwU>qOC&i=lG#so?Au%zU$8C85}+T_{7EO?vZZY`i>~vCcIhz-l0}Rd zPtEgC3lAIBoPVSSGJcNmkConiAx?d{q$JH%q7*B&s|H_UD^e;5@5co3ssXcT;KR)I z@EH>lx|oz2mh)ozcDGHDoT@WSYSY{Oqx`@gWIgeCjVw6w7Y9SU)N_#|2PR?C$yrEM zC_1ja!e7!}+lfz_loSoQ0kNROLPwbhV#78oJMqE$eTs&CGt9iqMynE?qXvhhw;kUX zh=6N&Qt?Lo*ysrwzI&$E7r#1fd&!{s17*yQh?RkxxDi*-U&E3<&e6hvCG2k(w8E2q z%@;!nPYbq8ygJnG_>3`fhyxU7q7o4;G-EtQv?Y12OYk)21!-QaB(usU++o+5`tyh6 zz9bLOF-!rv!8E;(l_ zq)!72C&f<4?d@h5ve#xGf(7X#$BVMuDpKw-plJWdvTTLpSqFEM;la70S#=9R|xHJ6GEyAV8VY={J+CA`f2DLjw}??C27x??JppkL{|m_f9n(rBHUbPwG+#`IA}fy~hi*{gn=gO5%x!uQ);-R{@@@*) zeMl@QF+j&kj!B@pq_45ru9f79y{Etu0iM3im4Y(ncPk8(W7>qVAAXrVxzPP^EvQB-+R#+mGUWtGI+OjM=9ULm> z17hV2YkmagABM(;N*ratc&hIr>^n!oE}Xi=$uWi%Wbb%JPea zy>BKacQIw&0#^_`jr?<3Xg}Xvq`hVmw2&>Bw>!2V?z?5)|LN4jJn3%cxbg4@pz}+s zLPFp~dU$o$A691S%9Vcf{5Z|w`OB#ddkO{I_&2{NS->i$e;>lk%;oVhN1UWZW;2VJ zvN5;CPbCX`q^x3+J5_R%{;wV2$XSjuyy=3tu!}HkgYRMPWWDIqbw;Zw@faU)Z{mr| zErHrE$jp5i6->vi;VNFfT!%~6KUR@nBnS&(kf~ivak7&F7;d1OsKV++PohNaT!SyY z9zxDq^bF%DGkH67;ZgVK3m`cL<B?NU`*RD0XA$)+} zaU-iEJBXwgAMK#!adbIU8~pBy%q90dSwDV} z5@z74{?YZyYE}FZj=RJMxxLRb5Ii;*V?WKg_!_-t_TQII5eezogd!j)4N3?i zAT3CPba!_NDBU5_B^}a@fOLr^b*Z^YeY4 z8SAr~lDDrc4qtAP*#7(&`a3i3%u_{sD;(hyD8j*nP=tdCp$G>P!u%bf2nV|&6yab( zD8j*nP=tdCp$G>PUW;&$R9gFa8>%24cWNb;O0Qp{Lk1hsj^_V0MuQaU|2qhScoPtR z0D|!A?89XlldSPO%A1>`+PLix-F|Ec@EFNG;lhW=DHx^oD~NV2$pLR0Zi&$u!*dOI zhTW&SlKWeQhefP$Kfouz&tz5Zt-!E@~$S?VH5&_v}M8` z?g$XeoIctK{T-5C)MwFKuSFZQ=f*#?=E&fom-59$jCVu3RJ@90UxN`0tiPWfb+ z0-^G^1FywJzPjFig7WPn)`>Wg((xQ1*;;(DiqtvkIsbG0cJ=)lVa2Wl!D+UBjIng) zz(AbVKSzXuB|!fGdd)(m%o>CJ-z-vLY@NxXY zI5#Xgc&cfry-6Dwbe=9*7q2cq!>Z4q!cJ8Lgo2Gf zX4ZEImO1fBIc=E4vZ!n9cAW}0jp>v&pMRGd6;a|V0A4RgDv5cPU!qvVD}fOvuEI|v zDdItxM%i}}J*QBLSg8wy0^`rW9{g=kj~scB@q#MG?_19DZ*TW# zCSx6GA_J-m;6;QBT-dKuKqV`jJI)m)5soT`cocgTto1D-Y zWH2F=^%oLDe@7_m!LA5pJ(v)Ra4;bh;b1~2!oh_9LHLz&w@&C%Tz>t{jazYX zoapg$ENS^YGO#lmB$vI;A6&Wk|ErY!@BG1ajK1>CudCz#8)m+m#<96px6H)j+6l|M zK6<93yl!3{r)6UQs>@w>)Nv?05%yJ2|0stO-$+??+D$c~l1-hjx< z22?S@^SaAtKUe!1s{l6vy1UE@VNZ3wmJo#sj~@g-De5Dra16wGS*a*kcBUt#G$sc=rFbD@ukDbL`Fi$H+KChGSOmzl|gg%2ItR z{$wE+CykQU4IEsfcq`SJ2VYU@KDkpuNNiJ|^^VAb;o-TUSBp0qODUfU5DSzFm+kr* zlqp6y_$<|HY&G?X?x_WpME6U!d+gJ`Dj? z=K#XU>9;(uEVhr~1Gb;<6K5@p-`$~&cghkZsdxC`48(#B3uxxwhSbyE#AIO&&CF6# z3R+-$raF9h=O{KK@%XX8_9p}ggRefmo0yDqYb-i8i+g}i0yE!9tliWhYDn1!fiF~T zKqye!{Us0<-UJUz#(8$v$MwdNq9%yT57_U*?6{5y>6tfvtcWy-IzKzjwb0&TaL94E8Yp9o zrH(eiAwb+2I%oOb(nf98RC;=19o6P5vPW{CV+P2-O@5{(R{^PFF-x37}v%m@vUQG{@*TY+lzG;m{Br zCMouZP!E%|-mFt3VnBA2Bo7qfU_vOu!GutRg9)Js2NOaO4km;m983sJ*TIBP)`JOQ z?(qL0{0fXfvQZF}U6&|d@dqa_gFZfxeL>tYnM!45{C=<-y~y@TY>-qJ1j7Gal^(=C zfS8Z#tjj;t9h4mu$PCKS3kFpi>X@a!w_E#OB-?>Hf*jn8Ikxiz7|;lt;Ww&K_akiG zd}&H%en)(W{At@oa=Lb4GI`{JTM`fRqfboSI#iqAMDE~?mM6YaPxWFhF*2t=D80~t zw3A(X8K^ivki**Qr5lortGT7Q;IvXyseoqT&y&7)$K_$OtOgRW5(Yd|_&dtrN@TB# z@OU+m#pq;)f#>by1nGe*24O>(Sr*#pZ;IL}2t z_`Z&myeF5j2UA*i3Gmia^S-zMCFeeA0jdire%adTyOwY0ioX!QPaLK1U(*1N)=;h; z(0jZhTSvwvBH^z=t%p-z9&?Y#joI5Q2oXaP3l`E{#u_n_8~MHL>ZXf!R`qrExn-T} zKv<+w!PzHT5n;x$Aq-%n(xDEA+&0+~rEd3_cgWX+N1F9dKh&k?&Z&O-nD6+O1BeBd z0R6i&!U+UWPI$PkY`1Ax23pTSrZ2F?M9}S^nKIgvHZ@a$oYDNh*UX2tN{50c6 zVh;pg;CwNmnM(dx@hMW&p=n;c?|jQ#^4|GmvY8FSaPQgjZ2ufo3uAF1Zh^$*XllnX z)f%-`g;wpiu+o&qle!-gqwPZ7$vIsnz`RGWks8$j{2W@0asm>mFy)|QG^U{-(l-bF z9yn^xetsYpZ2Ps1A7IcticWim$Ie;sL2&Hsb{XT|&9zCP)ea>4i&VCq@?$rqpM3vt%w_%Ix zXv!>!cRxs^9cku61-Oc2Zk?Z9Pn76#sAYNaPSt4H^ti*Pmm8sxa5k%3vQH6+1!^Pz zK3podi89&Yd*@!A-dSrmwBm73mzyZDr(5~0@x;Y=_rx3l!ld^+D9}_m2d_yqxvkhh znG>}y;C_*&x{ojk{XOU0KaLg5m|Q`)pJIOP@G5(uf{Fa9C!cwp^;?(x*RQK_i;91V z$JpT=LmBn6k?ygUBjIO#oM|Bo^NdW*TS|pY;brqQgHFs<47nFjgo6p82nQ2F5e_DV zA{ z9l{`#y$*y|E)HTJKp=dbySQ@k>+x|E3A>A!LyDmXs(Dlbw&I zT3DDoTJF>{9k0(-2j~$XviAoE9Wc`b@8?`}ox4Pm$lp;>(9Pa66Guvm-w03nGld44 zXwFj=_b_n;j*^i@R?Q3%Dbes2+p&|) zI>QQG3^+pBZ`L-UG39&K;fe;sqyLXTrviCYkqrACjFwc1A`uO~cSDv_R^KRD8HgA= zsF3pk3uo;^`lfVBAT*oP6Mj`*g2E^}p*5xEJe))M;$F-*Qr&@AFec&4o#^e=!}Pnw zcYB8=($4g1#fOpT3k&k6^$(8TJy1vhtV!yS)u+%O8)%IZ1D^vAadz<&`z*1w?pCpk z@XJYm{nLk_BlX|W(-|_A*^>3CvqY{eR-aU>@;N*6zRSn`Hb~^ zHFro>rqRes6Y0Y#9&V!@3oKl{Y}Y#7fH(>-HzjM>o$=I9?e1!vn&oiwL$oia6Qq4b z15Xej_a^M{D&<^h?o7!nPOy#t#!1&Zap)P-l_(#ZvC<&;Gsgm>4H^$G>?X;3)6X@) z|3q&lF6zBd00PML>tK{)G%6w4W(CLUt)M8-CH zQ`*}4>)L>|Uthy^8JrpBA2OW_e^O3igT)5@y$g{J3Y}U^JxNCIxZJJD$NaD;DRptS z{$Wjw3Nzmuqpk*6x`4ieaGG61QTpTaEY<2buqz zd|RjCz5i3uC#~T(MZ`$~%t9!`!LA5pIG7O1a4;d1;b1~2!@-15hJy*A3ri*)zd_RQ{|@ojQTU2E;V~-bBYg5K;jaEZ0q3sO_oDdka96$> zhy%FJocx2`r{P_(o<4N=h`w1li7G4Zcx~0#S%o)Tg82*R;eN-|z}tr$kwi{A>9rI- z>ROb{!%HTm^CgGUB&0@JC97xbbpuO}VI9#T<1yS2NJ4a1?Jbhgi@QVTE83DNo@}&e zI=@964dc&5fMD#TjtzSS`0V!zWjcKkX4*<&&v%g6IV$bB2d|2i|7X83DC{mr>dMD+ zsnYTUNMknI&W@Ds*~28%0_vKU&tDyS;)X|`o&oKu+tCdx!wO?YiHUFe5yIhANN-Kb z%Kp)J-j2Fz%~%Q+D*PSNc*;ccgL2W!G)^Y!8(N$@7eb?7M^_e_ng#c)26Aua1N(<= z8m>&#J$@-$=wV5z5;{- zWx{0-&WBO!%Ot1uK2S$msB+mEU@qk2xaV@~zxY ztu25Bbw&6Y&c@}r49E@#*J)T7Czu%e%NL;epGyb^g#MBmWFu1@62180ig{FuCO zkD;!y=kOwM#D7k7D(qgR`ORg-)#s*RF^gP4EEsK2zE5qB?MpoM(M`;Q2|Vp~dy7u_ z@O)xdttA4Qa#{yd-~hzfobavaFWONR`=jm{{Rlh;xOw+26znf#(bOsX`9y%(;gvkaV7Yh| zM>0-oJFCY8g@#t)>1z|JQ=nP@gFM`MFSkHajHv@}+}N%-=c^t>N6U+COGmt+OXv=H zd@dOjQp;o9Z6`%+A<|fyewu~@Y1K*CnDlKL9w_0m9lvq#mZ4|{6GG7pCWN9HObA6Y zm=KC)Fd@vXhN2nliqP3`Fd>xTV8Uw|{@-EtzjFW}kiL$>S1@}WN3TGdBt!hLWASd} zqHeA=R(F3$eS`MomH!5DA0Q0Bu0-&U;XV6d6{MQ?jS6ts+;Z{K*9b`Me=Na&JPWjG zQLDgnd<*QrIyuPvO=U5M#yl0o+01^%6f#OPeK+T$S+7|ZrQl8rEW^y-N1rk+|F$9D zaf5z}FOFY*UAb~@QLdDg0dAwh!%f$Ad>{d`c$!o_<&)ypTjjD?Rgf?_Ume3w!cM^* zy7j^xQ4oR)gn|*_eU9BCNM*G!5t*}=#UR-g9ZxPOjxZt{d zEY_dTZnPEP}Sy$l%y?Xq0wdKZ#1!ltK9Hkm;^? zx!-iIRZ46+Sx^*5y&?2(POTA3pp7Sf8;WCS`50&yY&B<5ap70FNze2LgPNa>;>NAj zf1lxauk^0(EL!2c`ANP7usgihGx(!=%-8oZmgE6jL9co!<9O&BMf>_p)ZH_7@{NIJ zfg=3UF8FX$Sk&6Peyxe8ESIBe6nFjD$-Ctfcg9Q0FU|0p=pnF+8k3IA^yDlHy(p^D z{25t4Pwj2Ipq3{l^Q3pGDXK*ObRmp3=+vldN@&j4+)xg0`dAC^rmSaG2r-^gjc?GH zrQTB!VFZYrr(JOxvRxsFIS`#d$@v#}> z)%$`o)ED=$t-g1x#>L-%g#6O>D7cQ1mf|%~HHnu%Ec|MHH~i%XHP3cGErI!zUL-qj znU#B#B;nibH-S)~*5vPVZ0o&AGx2J-&zc}}Z$^Yng=Su_Y&FYFwXq;c4-q*ESOm*Q z+F(*={C)xz`4QF^rHb*6AiBFWo8I!G>O`2M&t3m)V*zs}SJLno#e_R%CI-IkO-w^? zkB#dX4-?EQaZI;${VOQ*mTNSipm4EgX=gTIa)ER2As9=0*r)3>*I21!F{~NdR??<$ ziyjKxM8$6j^wg3r6j>(Z_cE>DuBAM_iF`3(o+aI8Bdz@d6^chNAry~bLMR@=git(! z38Ae{WXPBhX}LwEsQJi1EhUY8L#%@6v|>DskY`H+2uc`WzNLzv(Nr4gr zx$c38HhQuTZr@{0Wuh0z4}s?ql&gOq{X6cy@5r7=zm)d=wW+DE7h{HB7gm95_xjoB zBqe7xDv%jl@7k6gL`4XpZRk--x1YN26v1 zdmwf?WxH#ez%b1G>%ur{J$e5A^u3m_U4x5G83!UJyZXGqx;;zC3JU|xK5!BjpYY)P z6GB2A);0kJL$3BRv4p5T5{ zjNUUN={5~wS74{JpRi9AMbzgyY7cfg4Sj+hSCf0s26`cW+6+ang=p;E4)zdq20*c{ut3#_WVt6AiVO=mTP zY~CwjAe@P|C8Xu;lpZg=a4(%Kl&S}a1qQo+cj2S~U$ySCZ@bgi+c^ycUhrMp!{UP} z16-;@*52)J#-0F&v^{(xbxD0`c`Q6&F>~!1o*!Uu;m!{6JR#2uS5#y zaC+=m#@7SP4O8-)M#f#M8vv(+r9| z3(gsL#O-Le4bxx+pE?mF8^3(`l_Uv-8FiA*{&xk>pxATnMF>{uYZ%cORHw4W^gkuRAvs(pL{7H{RVUD-w!5 zFd-CsU_vPNz=Y7m9!v=J8DK)F&j1ttryrAEtv%6qgP;c9VoBly3EzFGCe19-9j?+-k-^q){6+8t`?;KJ5Yl7hwC_c z<(vO^_5#G(TxSq2-Mhu`?I}BX|0nWV!7|M9Nuk#D$W8ZeTdO~lep)XS zQLwV4+LQaNL+*CUW-`4J)nVN*obT^;0)!ejlxaQd6m_pk>H~igf7Rd! znc7fFb}=otmty5?!6wWj8l4DL>Z2MgHMtP%+PcKFee*WEiL)QLS~-0##9~Y4z-D7E z%2oPexRtLhBt4ykHpe>YIcDS;_TOvzQG9-n^SAvu%nWp({_BG9kXTyx*3+76>n-}T zMUU3?#H4mr0=t_Yx*#LBRDa$BTBY~q*Jw)gm}(i$gO4^&yBxT8o5BO1-!S_uweE7J z@DT_F8|o|vI2}_>>@ZqW?T#Z;QttQY4AXS2%i}POtr8!z&H?2aDeS?XZu>RCn<{oQ zlA?rP^52u@x0llIP#S&mCUkN7vyC4V;FrcE*iJKASuKr#GFy;DOJ8QXG+RC~q#xlM zDyy>Ot5aEEdX=chBUM4|$iIE?^>JX=z&ug0ZPjQ`o~tMZ;{~n#)G;K+uIaEBxoP-^b{`>Ox9zwAH@*(dlfY8~K|@y^(%F<>21UsJWK|t7nYcxpB7&SR{cp85nf0 z9YdL3v+nH0osS*YFJSNKYzC@CxChgb)Yhv1IZ_-(yU+q}Htg2lVsu+%m1m2&)ks%& zF`3Sj7e7@H{`FBdC2%Y*dahHB$AZW&LB@hdz9mEg`q5G!&eOYS!@1LTU;Xr$17gAW za3xR&1^Ke0?#k@EJnXn#OkA-{ZnjbUQ$@Ae9fu=q`N$!XSj6s(UUoPj# z(!bP$y8!<3C`WFsB--pa=D#2mqK)!m;QzqBSJ~;sxPmx7ls&n<#tfAb`A!4< z6@5JoLE=b^X~m?%5q7K6>F-0(tA?PdE0_=pDKH_F;b1~2!@-2mnmd>fT2ufNLSYXk zgu)(72z6Ii84fZf4Z=~7boDw1a0Rp1k?_jLAP(R<_i@EuaI-uRRipNqOuj3rVZyb2 zCy8lB^vcCS5D&ue>-@t%`~DMN7%yM(VXmaiH+Thx8ycHWRf3g6w1dgEJVje^3Y>r` zYWl=!c|xUdDcX1K^v9aS%xBlDli-Y^nNrR#m)Wk~r83Em05Mi?-0XLlFcIWl_%Mk- zEq+^m+rnC$s!TFIxx4ii8!$Hr>*!fiz+kTzti2x0utS7z%h0?y@*Dp^U@lWI;b!TN zm^Z+gu5@wzqsheBU9a4`VsEXhs$p(tXDEJlce0ER_Ne5!V#&GBRM)g1Ni4(N7 z4CEFN>t{)y7}0zSm!y>N`DjCd^;Qe$!7yB>awK<(fG7Mm%!RriHo6rtY#uG+Q<4;s zeSPa~2gBg`@5UJaxb|hePbr?TMT8iy5uW5pzY%)0k6y3kbnSE0VFm`^b*cv{^fUPI zUQ;w|ixQC85S}GI^xoj86zBb>W1HODcV@H~J>2?uf(5|f0xj~WN4ovPeI#?a1gKpn6j-t<;mdMSx-28-jmjP*`= zs7lb*pXBr4Ba-f(T{MVir$byBSr*EN^R6gO-&NrJ@`1)UylMTKmNZv9&UoLoZ-6wc-tdD zWOk&;vk>;f8eii@;dU6SC|RBFscJrAuvZMvLu9A70lE-$hTv}~8pcAn2WWH8MJQ(c z2)2rH;yF7h+?{r(^Ajq6DO#@z0*~>UCcnRxlP_9u(TqbfaUT}S%|t4k=faZOmbiIY zw@86dpq2E0J@~o7mvW^)tG8Kx8VN1@>HRxj?kiBg45&%=4C%x6BmyP~uzB*LkwaT! z)=hh|2VZ2w%$%o%M#`neWPKmO`C&lwB zU_vO&z=Tkk8CdWm=S_L&H!V1B8c!fwT2USZM#(#8Zc+*Cu@Q)gLEQtG5b7Slgiuoe zCWI#TV8Z|OBS>SQ{dg7OAP~Ne@K-q5e`*`_bnu>pt4m_ER$UEn19lBw;pBCsyYlh> z=Y+o!`@ci@b?;FL>@FYuh8enoe3oeJ8@%qTT~72* z@pJnmLKrea#!x!~+`S9n5g?{J&UFIGsqTF5f(gnFi7Z=R0hCn)?j< zK;8Aw|0pHVrlt4Ur-RhQn+@2Nh(9l;@;WX)Bt&9H+oFEOz4Jj!9t zRlzMAlz*dMm=e6OFQQrw`&+4m6c{+lW;;763k$wJIOU8F_ae4o?eEAKsA-Rq-;@Fn z?n0EC>qI^j!Q!Fj4%pn*7u+7^w+%_yd6HKFoH+?=!kRCKIa4~{=Gyc!wf0Ur z1-e76SA1AY$lJmZMUqzAmmEMPqta8tA_`&N>rO8w(U|X(k6aR}8ck$5G}3jy16H_! zsa)`c^)D12O7&{NsqXO$+mlhJ`f%`X)x<+aj9*AU{xtlu$M!xjYixWm;y?YF;miKe zxN3++vHwU_aNdWQlhcpyr3#HcnFIWRF%+%k-Ji+sWx*ppXi{6T>fII6J|PM}{TPGa z*WF-59t5`Li79Kmot!kouD8M?TEBP;ktC8$3aFuvXevdFp`0FGfc++nCYM9YPIyW4 zUH;jVbxyZf7X8heii@viW>NQEBY6`=0dB$VjnX^m7`{!Pm^VzF57Uj}e2(ODX$m%4 z--fBmn76~gpMNeWp4qe?6QVaIf%a(!h2{&Dsz&L{<8`UzLD3hlpPS6j0n0yV=4+Bq z@z93S)R+du0!8@c!xcVbGtFZ>KPr}it(R1`U%~2$ zzY~o>i|pq2<0o5N1|jhF;LN9mQ4t|yx9WY<6N^xqY4#a}Z zNJ8Qwx4+iI-NdL$pK)esE`4P3L3w{`iJ~lKsyo_)j28joh*h_1jrKS}Hfvg*$#%f} z4!3Nm)u9s4Qpr5=-rfEf;LZSBCUFJf6o%TAE$JjA=E`IN@W&T*O!-L1Cg~T*Un-9E z46*JYKoQQ~(?gkGmc(HZuzZr~g~5uOmq3{qaaMHx0PXhVR#PGrxL`skaM?o+ZHu9ijbr72((Avj5je2a-o$=MS#LzK)YuKEBR;TyYl(X-YaJeo8J%pGzrei;iv# z^L8*^`EQU4!2f~yxI{RW;1sR^M$PC_{5z9hvj(Ny`Sfr}%G5Xuk5l!|0yF^r+!$!i zmmAKGh+V7}w#UfoP;fp;f9I&j`7ThnCBqsQI3W~#;n(FTlV5E99$Cd>N!HBMP;WUU z?Gs-vBr$zWd#TXQ=U!7*I)GIMA`Wvm@vnIuiFtR}O{(q*xV2!cpR)KFGEBqo`Tg10 z3_7CyJU21of>MjSt z9WK55slOzE9^86R;Z*Vi^EHXtf#F^kudc)pCC{e$`$l3kEYl4KSl*)ij|n-8z0ZC4 zl+NU&G4_(bs*EM1k`UL&I{o$^inHZAE$ahb4jmM&`5_$x(pPC!f$Ax(#9T-A6>Vdi zASCY>n!Hn@0?b&|wpJu;+mwjrbye_;p4+Mzb&m^B~MU_$sq@Ex?59Ce^}i_rqcde66n=y^>3g z%rC?3K3X@Ixg$W#l8nqvN)91F;KLzqrTpAQr*N)H2D~p*y^NPijwHC#n^Mj2j_FC==RJnR zn7LfO<(EwjpT7A?|8GudfV zhNX7KeTvp((jen*l?rJFF_FN*a~?8py3H5oh_RcPvg;r8OAx4x*s@Gz&6+ES#kxemg>rhG&7lH3R=H+AO{>i&k;1oUa(Lc241`<7_#u{f#|! z>N{?b>IB-ZTSk;>zYvu$U1O@scVSs-e+A*z_)$fHpS_Mv4Er(&y;5-~G?}Vvt2oe+ z+nyh<$=>jWGOC?UowUUM7gtdH6F=slQ_oU^Nz}@8{%mFcj)lmzlNV6nf(fC(1rtJn z3nqjD7fcAvaKVHyw;D=juq#5z3?_t<8B7SBxwwjO5Ke*=ltDmv9c8az6eJ73&H!9t zbZ?czsv7$7N|UzIVU|m-0`GlE=PMTnfiOrG4&pAZGd`CH*CxVIZXvQ&I^F6Y^s`PS zO|afoy(P-i@Kdd3y4k+6A9y*Z>b=t?G3I#$$+!L)6A}3+KQ7)0fARd_mQ02rluHb3 zzk+r6Jj|^trd&R!Pr`@^<&UI9Dr?wkSoWDwcEo)bcF;B)4J0KDj8S(h#=m@Qs^vrw z(O|>YJovu$jEmDPgigOwqo3Cc*;o%XY21Bt9tHkcw5M_e;*zQ4idYUiM63 zoW0YinX{)zu)2T%5shU=JR%iosEQ6%x~oBdkia$-j*h!;7NR=#Ya@sbrt@7cWA&=q zx~vMJd{xbN$Yh(%$WyS5>~l&UTy{z|FQVRWr2;&cZp8%7!0)_-N>|C3<-uZr_X;w(2+^Ha3GgfT-jrm>1INMH zv-v9Kay6tdE|BolX5uC67X{dzH|i--$G)ONX~uE^Vu59mmyeeV^WN^Rczm|~nJ4NC zQJqlq4o~q2l5n5L(%UIw@S5uszx+03Z%z?MMO}>tw7_QWPX=c7?YoHN6-8wl4 ztp#pF(E9dYE2-ANZd$dC$I$pWy)aBX@ddn7fU8(*ZTUt)Z+VShPA~9c6?KjGBYdLS zakqCIy=jDtHGf5`(6ywTw&7;9-VAv^4TOR%4Y#eSC#MrKmL?ui*EqZzd5Ebge?|_OO!sYgLlg6#~f|?G_&=EI~)(`M$;XI9zGg_mWsu^9&?y>ah)fI$L^-3KPNic z4l1{6Q;`Xp-)o&44_AQF3`_{68JG}CGcjflOr#h&O%k{9iCi<|Mm$ZDotk?PF%OZm z1*FNM1gL!g6GH6+m=J0oz=Z$l9+2+{wGUudgxUu%A+*D@cb5X^!=`Z{xR#UL0nlK*7=OvG*ZR_T#0HUU~rcDwbJ*w?v_%R$EZmD$RN-g`@5 z6x{?8e)*P07C(FJM}DJi$HBT#^GFxiY;0aW{#Y*GL^h1`C(}{**U<<(BR#fI6Ua-fiGg(Fbz{Qh&a6X+;&$%H05{l2(#ip6^8Z`;)fWR>JN zENylu$5Qa{pF_1o8Eb)6&Q0%KS#xBvUZiXy)3aRMc#iPVPbZc1P2$+N-A-l34^lPw@mo@QLZZ-0X+T{W?9HmZ6Z{16-n!$%lNHX? z*FKZWTve8VUx6xW)GzrrPvKR8rC&!&d-WP_+}TPtEhjZj3=T%Bkg&i;#^#rLo_^1k z{|A#Szdst;XVbYN-+20zCX^HhE{T_Uye}W!d2q1K&MlDP3s7Gm2ybbkdou5BOf~9B zOQKgc#QKffBI3vAEG^+XllOqPse)4BUv`}Arbk^=VZCo*KD4|(Q;$*MUaMuCMC{Fo zVp5OZGOi4~s^h@r>4Hp5dj)Z%qbOTVr5Wb{E(Zte*%Dnzx^}_Mu3 z&FBhCAmroI59yirI?tCnUS918C)C1J9L5~WvtzKujUzM%h*B* zYi;uxc8S5_v+jaX9#7l0su?u&Y$!;CWI#JU_zK%4FxIK6`{@r zObB%@V8Uzja1hjiARdI_*P-qT2|-e25J+EV5Ux;|!2BPQrC;*^01

Ur^1HcnUobUDoYOg3M+&8Zsg&uJjh!bZ|( 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

gP6CAzHwI4_0J; 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
Uw=VbB^#xF6+Ow} zl#*%t+1Q?hGy<=k$YX`BaWGp)K_8BDSbh=~L7jqy!m? z2ca~GzW^B|_%ASgjQqY1 zNRQcF5zwQBCuBnuLpB4QF{OqDsz07-;H;N%hG<;HzW~Sz<(TQ6jWV;KnXc5f*t+AfQn)_>06i5CdwVGdcai+bM<_%{QaH7HD0b5G6GK4r!?$)3 zKnestws_smoDV7!#4NdRRdG0VUcWJ>)SVb5Tf|z5%^02`tKgBl~&s3M6xm$Q} zjY)_eu>r9V1#-)LFPZNu;;6m0W;T%gDR7q46F0Y1r|gw+G$bDiMVI#Xbrz4@AGoedg@{|V(LM_AL^=0m@gvh`s5$&^nk z+N2-8Ugyl#j!@#AO$T7q*%0mrWdpH%X`iHV#nI?d8H+k@T6d}Z`$wEe9JbPHzbC1o zWVkPixA#LKt^H2~g_Qx$^2=ZLC_>7Z=^x!+rk^&yZhkf*V23(GbEs@@Zk1~Dq zcJ9D+LQf~i>7{Gp4|fJ5qO%T#-n}KK7SIlLmLkM?hS%kc!K4cTnD+yU*}hZyKO@TQ?96w&fd=3@?5{wjXQf#cp6N)Bbud zx(q?3P>@iA@U_uC^z=RN+0Vag79!v;fJ(v)}dN3i>^$0Nq zU{8dYf}05cS4MdQW&c9>jX(bv5WZmme)$Hr@^x}~a_A3`IgSCw9V(R z7lRK;V!T;j?M(4syaSG@Hix~3e#Ezxcis{mZdTF?s~1ZoylKgY*VU*{H;+840mY|( zT`VS}!Okp2{*4bD`x0^4a{ZL2G=nIlDEEhCu%5_C4#ff!$HwE?B0@u5vWn%*_m~?F za(na#POhr+m%_iiRXoTLhQ3%~+Q@=+_p-(;nqi+k&w64f60)^%>gL8f?Lha0>z2U* zaG^JCvQL;$_M#I;_P6DT`EF^3zWYeu*?ur&)FTt@%mAzBpzNo~@qEiICw70_XWEq` z%15x@|H_$S9faA0T`@$4xEu_eek#}rcXhbuXe@7)B#%3lI^V)2b60b~Zs4GQl%bry~SP3ZZ?9_I_)uf?y+(sFKB9(){%`YtK% zvk(v#{z1nII3^T)c;OH09<>D7^8aKvY2e_XkR7JNEnaK&vI_kMgUbArr<-X4NLNj6 zr(0XQUT)7TU^IuvSsfpaRQF-3V=FG6yCY}d**pQN5G-B&>+J#+Gh!9;$+VH8bKzmk(_xh_XGOMo=DM6*m2n92ZEUz?golhEwAA z`wU*tx%ca)v7cX6pZt=tpY14VHtnO6$*W z8>TKH4qZJ^u5>MU6{W5TBR%^e9xwGa5DUyl-e9;S>#zG}gQ1GN+m(1fn5V<`qt@Rj z1}X%6x#IfBTuF)zVGr0X;}GJ8GKCuPpanDet3J@Abc=W)j~2ML6xsIuhfkb6t?t(@ z2zx>*%p`UW$qgIS-~CjL-uq7Eq=6;nag}cy!Co_<(@h9*1zu`z%j^oU!E;RKPiZ4@TsNzZ9_gsXln+B-411E7oI|5hvE9*1)PYr$x z3vFEZySE;&YoconRd_6YIvJk1XD%uW?4p(s%2M4rz+hS(HfM;Yu*;~vH{@nJ7P0dd zEf!@pjSlMG6YHRtvfVYKm{A;feaI#9|ip&=J z)|JAxttWgh?55vPE@vM4m*7k9j~32B(aZepJ*#^Ps8D50*&39Z0Gq?_P^V+AZ<3c+)v4^cN(??@y%ec`DG)KB$Ju+ifKmW#qlOX+c2TEu z$2bPHEjAjmA6Qd)taxm8yHJOdiWix0ON4FJ0w-%QAwLpHb+DAF&rv4rrv8;%(f;c} zVRpTal+a*Q4c_m4=wO}a-(n53+%rQUm`S{|J*U8cko?6$;*KnWepWj?YC+`XFtr98 z1=j47Auf7EkHDF-W8)K#Z9R9D)$9(-Fh1)54e^I{F+eORQ{(EPW_jQAQQ4BkO;2*m z6IfN{blODY1rtf7i{9Q%TEKFVp}p3&KpxK8brvLc;!#+Qpw2dhmqo@FBi{>KEYSSD zR02vT8Nv=LqWZYAL7|1%HDI33A$X;2Nn%>7^9`*i;XRDo)^HTK6KM@B-IqyBn;dsA zeJ&Xp+)M6-dc#*G2hU@=hF|?&KnEpQs~ZV<#t5>q$}cg{j!`pyq+A8=YhyL*)pMCC z@_Et#Tehjmo_*l)XVbHF%6^WRTRorU5?1ONV9i%$qU*jf% zELUL6gQTj|vUF3<-irIUS!Bp})z@9`7m)&%OK@XE-&dQW>nD+YwD3^3D6ebSJ@@V( z8?kUihutYYZ9uU=8UDwb$VirGl%JW;l?8CiF!gM$Rb?W+a{l;6n=9(+>SR>(ZD1o{ z*T}*OiuHDyonVhDZLtt?v&h{!4wNc)r=p{3TMs876qu8|fpAJWN|ZMZ2&kX^7?`9r zo7QonkmeiLsd-W06eeB=4}F3lTu?*W=E)m(4kLB~OCApj5z%?BfGsiMA8?8RZ2Od! zt`O>h2_e)26GEs5CWKHAObDSKm=NkxLy~4ej4>-M-6jdzub=!rx2@R!YU7{1GgDHw zXa5A))Sn#;@grbDh#vtHLj1^0g#Qb|H&6zG(SM=r#()2B7zJT8h`Rvs2O!qvUkJb9 zO_IJj9k!9Gwqj zoHvV(2bQJ#-a26%IYb!0GOLQ^*ZC~g+v`Z7YW-6A$754%yL3P3JI_6K)XxOvk>~m8 zui<(h8C3h7~c3WCv zbXsEXN2Oy#Zt)iOw31`vLJN_Z}$@^+0MLVAJt!#cx z`I~k?Oy=?K@AU*wX2z+{S$s{k2c))O#!-^SDvJ>3?~B`Fc`bC)b7pfAd~1fIF!&}? zNkBY^GZJa^qOs{9rPrs~_?-UyU{*7=jz8xE@R%;~ux<+tl4TX<_H^BNs@_ zxe8$2cIXWkE4mmx1O_rh3=oYq3F@a6ghsz--i>E9ai-}l!VrI_QHWk?QfT`Uhy})k zzs{sxtt01PrS1I9Djf>qkR?B@?MIc@rZ21O2VU(Ae+&TXP`2~^r?T$7W1j|WqeHkd zr@apoXgv4gQ*ms?7h_YSN`P3P&g2j3)MyeSMA+XVs3z%RSAOP3&|KMHd%dt1;W=A_&rNWs_2mruD$FOhknCrU4$@}R zTTs}g;hu{jUpiK{G%Q6S4M(S)m;v@-1d!MztCEfTG9MA8joME(TUuMRh{JQVbT?w! zF>$m)UxhmzJI~Q2aL3fk)Ul(5FcR4v;HJbkFlEXw7$ubCMX3RVH&SOEZr=TA$w?RD zu)1`TcpmZ2>k)QhOE44bn1-(?5DUz3-9WfXOU39}00wN^=JSN{kMC*Cci)?o@_97r z?{)e}qjWun;L+{4FR?eYp4}Uj%xtXWZY&wKaf0{rLb@Tqd;=ROehq}YE$6Rfpl z;k=U}n2Y4M5dL*)lPq|&MXmI(Xw8yJ0)j^{AtYT-F=e>T|L8!h^kBdXJu>La3Pz22 z@5lP%MJ7!{msE4a|AYn+LZ}D!M2H^&6GHq5m=NMez=V(r2NOd4$o~Q1AQ%N<^uIuO zgYX~*;9rcsfl<-V?lkJY@#0v57aL~p@yy%uWTb999E8yzSvZJw`IkSqM!2m>Rfp4$ z16R>O!cP0lfPT%i;>P?BeQ?qtPHNah0l=Y?Y*=`#sxP~2#H(cLH%R1z!jn()TUGG` z4OY30j$XYa1U^SlD*Wlu^b(TRD^PNKYeY6&Wd!bhpi+ZDAQoI{UV0;xVf0>I6If(c zRJZah3XSkOX*m@uh`}$^)`BJ^&AeXN9a)gqlA#p7B|+ZnX!C{`V;tp zAn1Fv9?CujR}$nm&NPt;6Q2(3OeZ%w3;06n)qZ^Bcw}V`Fr24FxnpEi-Wlsu0y{n) zdxOR)Q?w;O@q`|MSVD5BV*-c;Wold(B6+N_C6gezk{5wlZq-3@6tnL3v6hn+k=faQ zz!F%Eg}aH`>tmz-1zQ~Tjz@8YI=Ys`cjmKzFZY|!?EQk*<=WWdI}-{$FfH~>w6Ub4y*X?leOf<_MlE*Rt+u7{UgIZwIG?H zKIjKcM5V_u?LSd^7B&48My>QwPmOq9Ie?#YerQNcxp1D&1EyWA-5vQ> zElKv}iln3Us|Ch$Z@9S7sU=IG3c;Z8m*FGa{GU13cW~lED_%!!r^Dj(c-c$MC6#S> z9+&$Dc#s1l>6_WY1LD1CEQvojDpysfxaesPT`RNa?*^!S>W!h%`#vkxjuP!~afI`mt zEE}6ing_6Vpo{IVoBW)%QfMzPkwBMInUeJfzDGX~Bnr#?Sf$2DhAmDQYM)ezGjm)GKzK#J<**xTIp21$(we zCzEHo0>(~VM?Z2*fwO-3JvnB0*TSc<2$FEa5C=O>W#^WM$+q5A3vP_MbWlbERS0H- zZZMotEtzE=%j4ZjsXDXGyEl(|y2~|3buo-7Zxu78TMETPXr?G@(#y$)&W-o30PZrb zBpmTp8=@XzRyVgqWYmc;d_9CcU_uCcz=V(#7fc9&y`pfn7|uikyJg@jr-dx5l0a7q z4Zbn0pQF#HG4}=6UO{qUFd@VhfC(Y408IFwdIb565LW>9L`a3-WcdGvIuJs2~h>vjiay&U95sXLB_3o|Ot!BYx>(4i0|8K(&|Nj|oE})Y+V<9O;-OrlR zx4>9fzNl~gdMoIK33uQuyFWZ|U7?d#FNG%~y`A7* z$lvEkLD_qLf26X#8jTjE+jK(cdk`O7Q!6U)%)jsGuJqBRi>il3klQ4&nwbjl2l%I|Gud=??!vGE8yTnn^ec3&rlq zuWX;#`s#1JOv#h8t0j2*bb*OB<`hPQil$!?3wkCL!=aYl&si|0s6oiD6DPGQedmzC z>Sv3Us&cSLs5@&6N5LdbND-K#xRaXMYLR^z61@tyPH1Reqbu2?-QpZSZw!6Qi103+ zqNTwgJ&(ug(t*|7OkG*TrRLW|Ry8F)?t7%m2rOQ>yW=TR&E^q#R;jQs5H%g;#apE4 zU&x@8%$?qW#jyf?x%%HZYD>~CouUOxv@4(_Bahx=v!Z)dTEId$s_-K@PZ_w)Zd&l^ zQydgYTtjcS4&*VH#t}m zNR-nh_9Q@gi0MGM-TazB&JQc(CF67`m`rRX!{IW&?<@m@ z-L)CF&*S~D_11vjg9Y~oUE&&tawid`;=Pwv@1O9ahmW;L!%+yo>GKFvjV|0ZM`qF> zly^MH$)A=o$(zOAa4;S-ig$zN zzto&@0uavlx%*ksm|jdl>yS4c&T@oB?o_IH&(nxwqYsW;6*NF7uu+p62=`?s`iaRt z_Cg?{loX4lnlIkvd9ci5_o}qOCI8Sjb%hY3{48X37JOrV!|_rt0y~fy`f3H9CUrZ&nf?6FB); zt@w$sqX*uB_PANqgwAwAMFVYlYu}SLeN|wQv!F=k!y;>h`+i;(%zImy6uJYt=MJ4V zB_gN|1V!FofA^ly&DU{?Nxs)S`$_s;WAxE7A-Pf8;Ez7m=Y+=D9-NE~<6nW1bcETx zLXZ54=Q{&>azr{2htKoNWV&V@_=*gXX4_{G8=>iCt~<|&m+voAw`)Gs*_?O!Vf>)- zBX_hMbzWIt?^{KthZO`4let}s7KtL8hTXRl)!^`uO5V$7nF(X}C_@^*+-w6Utq=N+ zI;mpcUoMm2OU(4EvLLbVo8gYPl91&$xStwxj49ZB19D?M8WX3_0|Ng3MWi~>+j@a_ z#t0APo+pmZ?JNsMqYl|ZQ-#;%ic)yi-qx?d_t97-O|>%fJl0IIf2XZOq)=g9Y@X#3 z78qX$XSWkjSB(*0{wjgzmzcX*{c>=BAWpMtD#N|EWuj2dMf4*3jp)0m;x}=aRi_BP}jQZl-~)xk!60t=B(oqaOuyu zDjyh-0mK6JCVyc^kG8#azMEQ{5M9wV{+=Lk4xin;i?}Lyyy0!8n=f#IhFD+Qb8$Pt znRte$ye4`+4u&f`a_1GJtKF&#Z7OY(^FS=nv5Y?iB9rQ*?WV;mCpf%j4--jzc%Z!@=rU>v5>KL&j$=gXX>g;U1Vxr^o zrUm#Z<>)u~-n%|%S^!3#z|-(QrD80&gB%t&L6iCG%M8&-vzU9C8#c}+nTrcCe7DqG zgDr4L>Mhi1$JgpH1uVsj*oTHWTXVH-)O#MpE)d$**2a}`Rr@FdMzQ%m*(vxR^G z#Xh|KS$zwZ(B7|}Clyc6mt|MPfLjg+TAS76*KG|oCBDMmHlFzWTzvj}{kgD14Zk0e zQUCAB2r%1!1L4fQ{C*7SjS+qVOG5^|r&bus?Jiu8)^pJHMHVBs$zMW10d^iMWPn`N zZGolgsjr*G*2nQ2F5Dq4UARJ5xK{%KYf^aY) zgv?+{1lrE75DQOT?5Kv0w-O7Dj4<9)G`+A=Hc>T({_Ht&=p7XcXteJUTlh&U= zhl#HFaNm$F#H!;+xbc}Mr6W-Jg%uP>@-=0ht1{{>wd=!^LTi zHCjEX5r++qQfjFiGskQ$<$+DG6N!w@r^HeO77kUVO>2^E5+(($d|;XZjrjk%QgOul zo-nnZJY4$4!#P>ieZQOZ^m(b|cD&nQn>h1*AgmK5qRh(~zgx`NWwF}uR=z|h7%$&Z znt@2C`}XVM{kdhJRZ!k((LJU2vqkf6h?^mnh|rPbkf?}beH-rCC!fi(+^BmTz!Ei% zh96!`EE$2ixe%SWQ~b0W+Ha?TJDiwuf|f(!GM9gOOQuOPey0f&Lqh6FDlgfu^t^1f5&eP=}27hMz)i^7K!10{D$q;qIjsEEkN z4DbaOY+a#FLk<2SO>=XZc0fC4!k!qOyNN@0-|6MObPrzLTXp^-!1k+7%)N0^Y=1{s z^K)j{>}chEmn?Fv?x|L`iM!4Z?Elo5fkENQ6){q>B5E}~f($-s>aDDn{>0Z-+g@&Q zyq09&Dt_D=0IpK?3JO5kVZs*6-)6B{iJLW-R+ZciSRCI7wsy`zJny9hT!CtZs~&vA zVRNcLyEHbTUlJ=aifo$W`S#7RJDn-1kx7>EtW_*fRk^^gVE3$cCz5d&w!s1?h#v1r zOYg@pnmZ_!eXMt=LI7V->aAFkA|YKY8#Rfjd{k8d4Vi=FeXE0!ZR3R}VsS7{7nepqg!lH#&2vrJ%LcT`EVhKHrPB*tgZy2bn~z zLbMu9s%V1QMS^tM@_T;}&J{~ue!!t& z-Q@19`QAKId!$4QFP`-AWiBM80A>i$BVdLQJpyJ3(Ia4nkPiPZ5DtQ}|ACX&7#**~ z+r<(3@D))-U5oByl~(1-Y1TCegDgmc=mQYK|GOalCS`LqquD;8T9#ng%p5ZleIJ(y zw}iNo*S81Lr-)iwN)f-gqyq%urL}tL{vkdm?}J=Y63sAUYp~*{N5z@-*MB}sdO`SS z2@OjAWV(tjP_+IOXqe>MZ=&?V&mE&PeULI$O!Ah-+BRtUBapO@qVr%@3mcyAs%#k< zW-?@2jBNS6w*Qn1%OMJOwE4eSHC{bk^uJx&gGwN|qspe6NwzJp6h{q9Nya40aZLA# z6*&A9!<;Z{1x7aO@x^56+)w_fh=k^&myQ0dv1zG{HBaSzfoTSmKUXvLk%N-<>|ytz z&bPavJXNypoyp0VD?(-2cpuy%MNxEtO!~9O{D{>-50PwH>lK$?7XP4nm9sP+m^!@C znXPBQZ}Dg49c)VbM{(s0=%2vvcuBC)aG=2-ksqY4`Z;?4t}MTJub%K(W6~a&J{Nvu z!WHKbIPK=xQOHxkm42Y+R@b}OH+|qBg0va>8~XQE-vXz8_9Wvz4C|m5-yMcz6U&ys zz_fKZC(M##yZR#_YeEw3`)QuQu^!pv{&qBt0NUMq>ewb!OsK!@$I-p*mjBd9fr9m_ z4|giYWPOi=of8To4|z{v&NWkb2Hm;+sqV~Wq~M>d1Lxwhm5k%etiwKi*wt_!PP?lo z=2lFm55W)Z{erI^F@0SoK)awz202+^dL_T1z*GxBPMozqz%5xN7$A6YKb-NB_t+oz zNi7_uyKjCRh8c-wS^hNNaxJ-Z*+4{JSvQ_KhL$=9VXh=FG@yi?FMEf6%)yD;&uujy zh8NEyPv$3R^EDUD)e5wnXUr;H0ckSQiC>F1AUk|aYGV*>_i*2=y_+M8;Q@~HQ#*I+ zz(1?Tpd;h2kQC%>e4<55pKYGG-jQ-L@x_Z)P!*v#`b&L;Xk#OxI&i<7nsp>GYh=9K z&#Z6ybc`EcOx6cuHPMXpGiL-0A{uw`pdT15EEocQI!H0!Gt*zD{CsjD;aQz*DNWEk zCu_rwv3v~Z8nG!fMOJ!*nSR5zqg04~QXz;b2evPd|b@@kWM&q{?rKH?Lt91e73{1>xvTpuFb$ zCd6M82<65n7gf`Dyj?&0Df$NrN_e!@Ul#}<=?4&Ta+9?A2MQ+|t%dFnt5o#qR9A{L zsgWhPvsr#9N2fE-RmR{1=flBKqA;7mK1L8Yrer2`G;gUNk4VoFnIHC3kBWPB;LH_u z4E5xx^m7WaR@V5W!eyq0v-eQF^Z8U%--_m4scL4?vt37bfIpab`e{*f7<%qR$o11E z5Q{zdop%Fi#cl!YUu zVZZ4FM@io~z;Gs*0rTr|uE!Jl$vgT9fx@Ke0<8XJAL5-6UIs%wQIm}gzjIa@*8O?+ zyFw&g$WvRN5S`)sHHS^`U+>z|*?I!^QtdKlVqqCNzfMy1B)JrP6!Aa_d%33nb{Sv@eV#6OqW@lmc;S>&Z7+v3^b?eqbY1?qvpTd0;;zs9iH5Z z!#nS4ly7A|UoY2rOIDdxX}e95AD&M{DDmeQ6ey)hyH_PeP-fecA`Qn;&R}a?QP_UY z3f$D%Fh94g_t8Y3ZIRu%;Gs;~)gUsWcy*ci z?6A1J^rHpeyoVAABdAU=09R1PtC`fDk*bo}6))13nrNqvZMTY$#aQWp<4z0AKjUS< zUjn{Z!g9rzcu1Ejh-Z+W=D$BeiPD#JP5=0K2HP2rt|=XwW?j9mk>``#e6V)jY@`xQ z+CNhllsA?G#9EhCs1w!;-;B-Z0Sq_t+pbnw?_d6gtGthd<>~NoD05sC?>zQ$vp({y zdjsl^OO1@zb-YjI%LiRm$8mcWlNSq)V;6jrArC7ozdj}nHv+EQiCG@|W)jHgzvEv- zXXH~v-PYrb%^o#+_gEqMkW@q&Xcm;CaJ#kgmLK+kMdQawBkw!@QJX)f?7!GMHOt9Z zAHL5F14be3YaJu;It`(A$-qX;0}r|%&#JK21q8e#$n$Cum z;OjOm_2@LlNh-95)U0ALrxo$J+7ML$W(Y|ET#v&+U+!1@J#G{2JnK!tAv_ zgXo8w5PwY|P}hAVe8oXKGq*#{JEPDYoW6sX_YcFTqrWY7gj*>l=ytvJiE=`j8T^T5 z=knCV&+mEXEP>H0AOO-kJ0Z>bgqkLsO>4~~zqvKt*N1ap5E|n_Ayteqm;}uI-k+$1C;_anV=>f8s z_+#I9<3jfc=rrVi2NFqgQ_yWY`vobvWHS(EkfqQ;Kcy|asJ~o5^sqzvK^pv6H?o{T zhd0Z6#YI(zHq{kbJw62}bN=q7x{E$J1q8VRRU_&P1d^K8@s@JWy*-@H9NDbq#U8zNgY6BMT+hi2Fh;mt(KsfUrlN%#{b&@d2J(xcasN zEvYu&i%d@olDK2KAAR|@p8QtDMAV4^^~L_M#R~Rq;DnraNvXw+Yuy?$TWp#{r+21c zq^6d~n$rof?;ua+n*(nP+}Gb8R1p|vwcAHl`=YOGgQ-GM_Z)jdyER;5Vua=~d%^E1 zML@Ko`fRCiigrfZ1k;nE_dhUaK5CI$f4mU=p73CdY3@&z1eg}ThH$ccSC}Q`@hbLU zH`M6<`jtcRYC^k{pIS$FTLYSHFQp+wVOLt16|ml3saC^idd}k_HXK_YrTn(uzK?_S ze&P4+JP1d@3?X;~GlZxIFhdAO!3-fBW#_K7fzOzbe~jjkv;L6@YjU%QsK_bm^jC!9 z8dCTy#XEP$)18GV@byK9ujzQW6?9KCwm0l48^+rS z-0urif9!GS`&KWo=US=1yvqvJIgnQ~+IO;n$h9%GsP6-5e5RTMqywRoAIIL{gwSR( z+f@G|2X@(LO&y~*^IxKVDfZWHYC;mcA7fCgzAM}RG~1H$uGAuM_X9Y8{x%C26ZtFO zPM^1ChT^+O)Tu(N@IaO{Ofl`eI8M&!m1-Y;e!D?Hy3{qg-a8@_%)v4X-h_bvP$=t%xSS8CDE5_k7nU0 z1(<3-B(z!PHSsFb!QXnUW2W8fenL&N7$&H3q>z%O0ksBVVsvmCTQHFxZ)KHxEJ|D& zpgN5x8MFwcyrr%?2JQPV~as<6b?Ctf1P`EH@t7k#9zd2pOrhzOig+a-&n`!OAMr4_vu zQQ~<%|0lQ$;hZIYpFEb^i0_(op&5f$zE(DG7f=Rg#|+&r+xf1!q%SJdV)=s%!@F@{ z`jH`3ERZxo=a%eW>tSqP{eZ41%l%1MzXP~a(~E29&2l!QPW^Bc;0si5UHMvG{0vJ% zGUqhCht8L3axlo9wXI-(t7!wX&`Z3Dz+nVfp@y@1EL`63bM7Spy71TRkNbO>d9Me} zQ4pyJRq^;-f%G<%i40Peu#`9E^|Y_J>bK%4wBI|RE4>=1K5f3eWz*0~$_8N7&yfcE zXb(R5i7Q`ntkobDE76>^Vt{8BOqFvT**>=xGz7nDR=v*irjhwbUxg(>aoM04L>q^B zhmKFFN)Lkk^j{3z1Ck~pwE^yM)?_x1wX+|+_tTOz??Ov^--AGbMW|h^?1omY~M?%M3zY?*zDeEP1yxX5k_cRN?K0W$Ymx?S1K~L%J=^rfYQ7q5QNs%|H zH{^^in|gnsbnR2%s2W>)l)FI43}y%+GngR+xL~)FLSzP*AtZ1GGlU=<%n*WbFvI`! zBgo~g5QKw0@kWH-#OQ0J^L0b;D>wV`xq})G`Fd9T3fFS%PPG0j3 zLin2ye(l#_0$_ZGhGFNRYrEHm70KtbPZJhh-nC!fw1V&t!oS-6lsI+>AeTi6+4uMK zIZbYQvaE()o3>xB%$#KRgBUm)>;3Om0kL^Qr};Su39Nv$?3YpCNWC!>I}|mYXQRYB=-HAI22&uMUo6 zM0&K&TUqn$oNarTXgiG~g9KLD8LXiJ(A6}vmg^m&8R|*KhNl$BuDG%$BP!KZ8ShOK zRp9-i*|xe52v;{ht@TpKpWN=YP-#|AKgB(+kbI(`MAeMv@QMz z)!DSS@;-Ho&7#sY8{feT2G%({M;PxK`6R8F39e$MJ4j~`KZ8S&sj zd*w?*7%k!#SG(aJyaq(3I`D2EToekQdZq4GtlhdRh0 zK*K&DB>r%9V7%(-hb?Hv#$U;0^N`TM4X=1)0Ml$bIl(ArSaOcgXO!MQ1l4@1DMgeQ zpdD+~TLf}(AHzJYhLuXSwUF*nZ&E!J^gec`$I&w4N`NaU3qVTUO?0b6#7IO;&foYa zmZ?R|$bNkJe6GsdM?ZlS?qSfnaC`$^t7{b9!_m56eM<_>T!%a1 zAAl}|GLtc5$R~zM%ymna04Io&$bD-PZr1jPpz0Z~XA>@VodQt2z{S_`%5!d6xDWBb zG-hwlA3v zt^W4iz)69JwoboB7ux7zWZdq zPfFu=e$Mj=`#&qgV1^Ksf*C?k3T6mFDVQMyrC^3ow;F;{uqQ%94wxZC5bdmtrc9 zdYI?abf2EK{)DG^Tn^2g_ILVJI^0m!C!&b1d-lChJJmRFfR^{-zDBIBC*rOB+eachBUZLlB=juIwWkBZ{1VL@tv zh38K_q-?`Abl#*uLA3Q?5`pn|)_>v>C?THXJ+~1%WIvbFXC}ZHvD>k>urOt0Wp$4> zKw#v_iPZ^^F~ucQ&p}*U#q|g|KJm+%#eg!hW^e3w=CMTO0dZRVwct2%rUB;TtbF2+9AWoy(u%&iE25^Z0ek7HT6 zb4hRJc=_jwQ_xWS@9Ux+Xmndi@G3`VGq_dE)Ix^Z%8TRq@Ympi1j=PRf0!{GC3cH& z^uVrz9d-NaMVGq&aMR*+U#?ASZc8E^s>jIcJHQp_()*RZOXg+pJ}yTJHY{K#_M=^5 z-LjKY@A|4K7H@7WFkg9?58S32%{to36?|?~-m_I+aoBf4cDCe?^-*I<^?|A9@$ElV z8K7YO+bo!>$c{kH#54Hyq96wT#V(p?jZ$ocS1!CZ92WCKHo#dj40~zVc4f*x-ZtMC zt(t#A6VH5KawoJJ)#OdB!16ZBpN(bE73$d`Gi(qE@-7miRWru%_*E^!#wqSvj<4?dS!9~Tl0TMseu z*|jkpcy=%T?hxVfx;&C*!X=>>PJ2710~FC7K*$Vc2mvmbAq2Q!h7gW|8A3P;W(eUZ zm?4Ct*3CKg6|izC7xuXLQZZ#gzAzE_?xL2iB{s~5p*by0kYoXv;eYxO^yY(boh(!bk3oPfD??%Q;B-z1l1(TQA;SPgsLM_$GC6O&@>|9t7bxLHOFkZ;G_9 z{rRR;`#%8c1Cp{QHc+^=!$llmC zBc71{iP!c_Ewsje1D*u%1qy|~6E%WxO`ga3#PFS=#SDy6u4j~L9{d%{qv1(to6>eg z7Bs+d*xsdcVj-NDC`GIWzD6(EwOz_8_!W6vv*)-_DPe|HZzjj-6f@iGea1^r$Ez@kCbd^@(7Sdsd#t z52}A;zUV6is?vQ3#TBC#cd-%0C0;FlVt7H$_e6dGCZIuJLFV~fj&K@4ASe$rJE)}o zmc(r{o*Korb?lQ;(42FGQHOB+z1+_qCuibeKOChB=KNcXY2mQxhqt(VMCPYk_%uPKa^3i9!PgLgBmfAI5&mu7^q+)FOY@0E)J@&=!h4A-UI7*@-dP|S$7v*7SgQCOK zo~ys&n;+=QxF>&DOO>*i;rar_IJ`!24x7M^&HDLJXMHN^r?rM}ZDq6XQ7Vlb!M3;+H^X*s$My;3q{h&K{XQsXD~wuoWTsCb`60u z*b^ae1~Y_c7u_AWA3hgjwpOf-y)ZR=);_o>uL+Ppen}{!Ck=?!Hj+4;sYj4M6CP=f%rL-`f_KGA7~$TtP=xv9RM? zN7~K?Ch`j;mLZ#KSQADQOCG+|83NDDBfm8l!ck)4{wx*Yk$EWUyoC2CFi>wRsLDLV z(cmO{-8iYZB>ezz1xnVxt)het4d|$wuFRyawn$?6@lwaw9kqJc$@Co;Cj(!SUmdWG zdW5)BvYPl4O^#2)oi_0wO?s+soRuy`t^*ul&T`l-P)un5ysSMh6a3R36`h24W*!6p5F_=7ifOrZxskRVnqs?B3xDr)v2 zrp8|kz6G-}8CeWRDJVmWkj`O8tH5={NfW)?uCu}o_uMzwXWp6H2F^oJDRvsjsnsD|IuqYzlP-&*ipSB) zo*GRzeAC6gT1J`y&B(aw!ie!-3U{6#?~e$$Qzg7TGGu&iS;_G^>vfommerL0A)xOZ zDn^oyPsIKly8_yUSH42ID?RU0qK5nWctq|N zbAQ1YJ3#RNnfX}#y_av0HMK5Kt2f|Yz}T#ZmAgh+7f0bPd~ezUHpwufL?UOt&%~fU z5by;S9se^7-;JwA%~x2gRW29E+;>LdWbgQHy{_nR%F&Kg#;=}-4czpuYi;29`ujpH z4#F#bA2@{xd2D(T4&DPZUG!7odTBer7g&ns8p9dK?0Q&+FK_V`DsW~{uTR~hJA7F> zkOa@a-jk*nA)*c;uI%A-r2Sk+7}ICiLyf8Ul-S1)4!a0bsq(Nu~W(c7f zm?4B_V1`itA0at%uqQ&~1DGL1K7biQzra^5QBwCJ(QgrND~%o$%?ad!O_sk>prTI7*ZIX|PRgICr_Qi`dE$mzdVJ$NAve zqqkJ(HYL4rMg9cGV3X(7z)&?$EPi~4g?Sr?pFh^s&;wpMN74tGLr>1y<1U$~ff7)< zWO<9GvfOB*3%){=_}%uDLB-M}-}+16&Y)_A^b8pT;AMd(g0J{9Ft z?M|PZ)G)kW=uN-von}8KkTF;VY;aVMcac9@uGKn*DOBFl5+GBAYlSLD-X|D5 z{8K>(D(ENSe(G;7kNBsw5>(w?`ASSzmJ%x?u2WRoH(hZKCRSYIHL4@VcAQBQDMO>i^0XrFsgy>$P1pV`M?lHd=F_7$ zpS4bkvlsI(t6XJGB-09Rn6@EXFEPO&NzLsnbg9#9;a zBbMF%a$AGlbA%56}j18=)qh9|J+o)&UIhJbTawDyWHKNRAzYFxK+Pj5JVAq0%P-VJ0-vBF9jPt`5KH_N}u8G5l-4 z24VC~^5NRALG-~*350*R`rX{U`MHhHvgt7|b5hPBDs|e5?zoZ5GUh$l%e@c@E1*6l zRc7Y{r!lRM^%)Fiqt!hX%qoHnQT|2!h2`ZpZS)gRe2@S5T6V)D4xM{bGGQ zYA)dIW1Ao36-p=>Gphlm6or3|Bn6viu4pICH*9LF&*v)jfkOq2fzYn_&EmG8<);PZ z#b$L;d}SaLe2Wxe_{-(cXiA^1VD><-rj4h!m3o;cEPP>ID$b=fP}K%)6q!wmpWi#} zwsEBBDJ!_7O}6u0WH4x&O|%$(=-Y`$wkc3APN-{67X3}~xfHWv(^N{Dp~O-PQdjG# zx0H<>v66&8&@3nkG%?HXn01skA>E!R{^QYpcU%C{RQ{R-Z`3CBRQR?E&@Myb=?1c7 z=Ol8Jk%Ps1kKR++l3|y_ie&lW8*zP z=q2Jj`#NQUv3$N0yX>2!iK<#Lz^4pHX+Xb~GPx?R|6uyV1`3gUMddE4nioG@(AoIRwtTh{k1XE-pmE5GN5o1rJj*Tp&gL~Fn$t9&PB32aCOGESYU4fnBW zar6m==oT09X3bf?i+Gc_Q`g;!z%+wG-(7>a_8m?OH+>lXoChSD7L%`uvf#OfX>*m5B)O2;x4I5(z@eyV?pG-S>jpGoMcP}s?WfSV2>Y3^OiU}V_A zX|DD!ZIaE5rMt9VCGA-jC%DI6VF{x(bP$q)8A3=3W(Wz`!3-hD1v7*o7tHWK-2>8U z2y(%m2+=rTh7gT&9pX2U@*2$kU6}swBmf9V{|AL|O#-NBpp(22ZP8M}D$yn96{xJ7 zrVF~(ZV<-bq!6wE^mMD&rI$_HvsXq4v(@}p=CYu-Qy=T3n`7Hra0C+^aL5?CZt|!( z7Ge0TrJS+gmbC#)H=jj(rLk9LW0U;M^5z)ypZ*ts){>bsiH*da&)If)m)%_1V#h}8 zW0g6~o;4=-1B>q@GzZj=p0#Z0zRkrx4CZHk^xf|hj@E<+M&rk!+RF;yG!$qA0r8Q;WgjG^aPJ(M3w$ZESHUnJEuXEC0>TL)%R*+$gzaEpBf&}a_W4c%1LZ@9<2_-|J_Mq?#rILO-;(-LNql|J zbpT(`ah0JCFRN}TvCDj1C*0-Bx0DLJ$){us?q%gd#NuC2jP2kkIb)r1P;lVB>g#;k zm=m9{v&+IffFnJ;JLSS~H2ie$&#B^|D(H%JbxKsq+pOwJCZY}0_sOtH4Pk`>%GF6M zk_a)4tzYeGz)`YNt{$PGTl4C>)8>0osFGVpxN$H^m+Vc@**aj2W&r>K9~pn&mL8^9 zjZIFFTvZuggz4Qb7bF>b7=De>2=p9-34XL14>(E+s^f+e?KG{37`YY2(U5K#n{%c< zRI~w4SON}zOVvi8S)f^yt7Z-5V!)i2Gs2&n2lElNa`4`MkyxcCG{fr=_<@5oF%Li^+}kNWWvU$?+f+D((n$8`nNbWO>k3Yt&gmL9C<%3_S;FOGi}lnhb& zQ^pA@gZ_3QES-Bd{_6WP=dkjn&%Z>NVHfc;5>D`(A_iqfu^$?7!BN8BITWtXE%dwh zitOO2c+B1DbMY<%HM2SGySU6XJ8WM8S72KF8o~plSm}F~jrIY4?@y}CzRQ_^kc@IM z*TKdv$_$^Ktq8&6iohN2(?C=Acd?NN2GWIfFJ=&iWd~WwQO;GjU@gY-A!G(Kgpe7` z5Ng*DGJ`!4LS`^S2${hQA!G(Kgyh`83?T>yGrSSuH^Jx{%5Eb3H4p}$5G$1@(@Ed| zH2OBb7mc;<$ldkYum1m^uZ_e#W-4gPVPN} zYN;;ciI0hQ>jW{`UIN>Ch}qV0ct)Eo{R9UqYsP+)bn8+e^uQ(=>5#V}Yb&ST0=`Em z1G|n_%w}YAJ-!5^Z`}7xjduCA3F>TzrO15{?F(mNG97@EJlZdRGCo~|9}lggcI+6w zo#38WYw>$vW%X0oj+X&`Jv39=-)V*?6t#|lz~aY|XL;artQ@QA>DEP7CB|nvVizx> z$=d;G!lW0hB_Fdws8b|y+9bkyvD*Y+=un38q}sUS&}2lA8ybXP&D0x_JqR@@b7fzN zJW&xVIk(K5(^7OlRZ~7oN~y!G%fSJ%&O*w~s`Q8y>*D&K8;u7S?pxc(CT5bwD)0zM zxuTi;*&z-JyT8q{#@59x!89&Ddp%*GUrl_U2F_5mY_#23i|<9>nX z81w2Z@@&uaDqw>Sc9*~NCOnT%*j3rWqYRe%vzQK)UWTU=EZbs0KTA;3$UF} zSG z*ZW#C(gVo@V}h^;?XVH&3^Yo1)~Ubhd0R5YC^0)LIsso`0Q%?S3RGyC{o1Zh7j-O! z%@+2u23d1y631}WZn%Gb`JQiH9`JE>pXT*qtsv$M)>i*A!s13a;_tqQTJT&c%^<4A zb+ZS2LHThFz{mRSX=e2=a8DLh5pBx!N6WwY!ie^!>3N?iSM&QxU@L~NBP~PsyQL~Y zFRnLX)fRY6G6ccL#=q|JG57DQTLS71N*QFJi=f21;Z#W>C)bQGL-$(3j$`-@}_k@;Gb2czXBWEI_UPB-y)bPR!CORYJ4ZqQ0(3XqAf4Xp?)F+dtgt5U=Pd?k}42#>kjX#E2?EDrQSGuTY2!v4}tDj zrg<+|$otvO7dBLgAOSOk2of+uh#&zogy;+~Lr8~T55xZ*W^Y3LH45L9a=xYjQ18m( zqYou!f4*$1p>|xgh#axWzV>U7L_G+kK@VC3R2w(JpY#vQFK_{mlBk%fR5m2HFKmg}-{?iBsHV=s#nQ8rm0F^z#0@(7F(e*euO4CLqxQ85k(}Ur| z_Z`V(g!%8z`$aV#=>%;xB~|Ph?nB>&`>|^rDc$r;Sxi*p^f0QaO{#~Rw{NMk*P^w2 zW^hvkHrea!-Cbz@M#FqaMA)%gaOM%|^m1e>S8x$HV{YCp48xc@^} zht$TG`S>jN;eUPGKJVGsGEM1wzjc{W1J!2qzpl&-5b34Ylm;IvSY?;Y?qNow;gV>r z$|XDARgsy{7X@~hsEKj(PBk-*eqwqa{5#dzzSkL-wd*C?mU&Va-n)21b)Z%M1;ZsD zBepmt3O7o8Oi6iNaDYzk?0-~uh-@voV{l;?L!JbonIi=?j|{@#?IzclIgL|Xd>pbz zc%gGYLmvu+(AXr1Mnl*WsKOGAQeR7iEYzjeZ@N@thfIHz&%Bxa@YtkaqtGcHYC{O@ z!JY_#J(wW`_F#q(*awRHAq!p1F!>eX9+OmUc(Z?t`^Mw+^8wx0)mEfixnhv+0W*X! z9Lx}sQ~)!C^y77ggHRX*lsB>L8ihef2%;ZA7!E>V5Qc-ui(71X-p}9X&k4fYH+992 zFsBqRKfTtln^yAwVfdv&r#rLvs}>85TWX0dPLJPXPLH)edE-$aMsr^f_9H!Tqc^7S zp)7jw?V`l{qlhpaZ;4A`eLM!5lze?g5M9?YfSNWabI$C@A*`R0Sv!Za#C)IZxf4f5 zhui7?QZpA2yT9*fNoW8^iTY-kC!0up%aeKW=%`}j>8!3N+vx$%hL$-goqZ3|0u-PA zKh0|UdBEOZg%)qIl3efHtMH-MAEtmu`BYQ*;N5w7_I(V%mpNR-^Gujy)z$#(x6N@J z7%|xG%jMl@At!>LT{J%d)yLq?x&lyyE#3=;m(y}E^7|Z&*6_DF`nW7!i_u@CIEG={ zjy!w|Ow{YV7hJy^lj9t}t&!f|-_}b`4l2qB`(91U@=E)=WIo^v%8co636F*h%6v&Z zY9{IRXV>O5ter}B*em99!$<*~?$lqb%L< zX41$~UCRwN2&lH+0EVGxs*d!f3X0z;*?y#e-Df7A@d^-Efr@@G)=*PzO?BQR&c2lLXw2Ib+?*Y}RnR8g~ zty@Yak3@&qdp7fPV!UTNwGB;KTtB~WKv)ofV#r^M#L496kkcfSyOigcTzT}WKCK;~ z-^U3cv>IeC9+73piG*N^^=|doa({}Y{xicu!YGE*aIQfOrJNd4Y^3t=i_>~h2>4jB zHTlg9=KB)wy<}Qyw4t>*s@ZD&uof7SOkQV)bSV6vCxRG4qFk^iLI??F2q7exA%u`% zhLCU=%n%|VzziWtaxg0W`ImZQNK zq|`_)&RqNeTEXX;zf&6Q`B6p}iA)1wX3iH`f%N{ESJZQx2v*W9v2dO`<3hk9wT$F6 z{x<@bg@g~GJZznqh3Xr^DlKiObbP>_!{^GED!?=YWhB1zmh0g7EGVi@FIxTKd7#^L zqroAkKrpv4hsb!8!X&V-$CN<8$gWiKAtL9B_JL1;9aoKdI|}lWCr*CK-TvUfT)-EU zv|B(&`}s962Z_v%UtaE&o}lFz-&~w%1WAOG&!iGL{2O4e&35bH=jnizVGITw7v4JD zZev-O=>D|c%P^t(_DOP2;X$F8c5lVGk9K^4|BYC)$o?Ssa;Yo|5re;@K5A@5JfGnq=xs zwc7RrK0*V#D*{!eykcyyDwZdO-(yed<@X!p@4$9N!<1?hrj-~tq=Nx2(3358y41Q; zThBW;@cE-wZANkF3hgf;wu3XVE*kg+Ou!eEiIddd5^6&zjs6U+paX#?T8>Ci zj>*T`)gX^$FWrKp^qz*PiE92%^NZxx%l?p-j)lD+&Iu*Y=!>*n)?^4NfR%o5f%mry z8B5{~E`Fw+R6njvUNQTm;rRQ=r#JsBtUsvkB33yAI0(_A`#425#A-g1oR??3v}QV{ zmy~HJqs>{#Ii#mbp5PhKEGTu**aHEYfK?<8G2~woR#M$AKQQ1X_gDpg$wqLs(u!f$ z1Nv^|?$a5ux8hg@wm6}a;t$W{DWc$K#_;r>n`>IGeDZ|mL%w=l{Yh&y7~KgbuZbGa zP_!Kt)i>}&D=^pY_pP@ecu0Ln0Q8+!3)%?vd0=>33xc-#_&jMlO-)NHk6Jh%9Ui6- z;-3=(!34uKh%4c%(_l=E&=$9`zm|0%dSFf>+on+?MUkIH^BO@g8v_C#H+XW9<~Ot} zk3;vr#0;Ri8>a8UNH+M%*y%cTAUSi|Lr5Cuu-C7mTK!ANLyq;@uI*c!1P8bJ=qshox|8b>I6v z&w?TkL}-8+LWBmG;eWaZ#5F`{fISf+G|;Yr^xb{i6vt928p54irY9Q3eGb@}*RSaY zVI7zR`0p8i4dOSE^4gz47!MMugHZZ^Pze7}A?v#-rRc$wb+T6lIj!%=%S9U0AcFR| zcZFD(O!{KDh``<`pCjz2CIVJt@=c^hWgab0jO#P>jaf2}QJbFNmZnFbVBWAEbmW$!HhKml$o*N}mt{Ysbu=OWNBJlpZ`x{h1y9&hPt7 z9ZtrxBUe5(HdWaORTOA^{hdBtys@;YR6htGKe|gs!!)V5g!A$!6vL|+|Am(Cx}#qX z9HpkivTUYbFX~U~O7;`_tfuwDomVW;VWW)Yy5&&2(jrfO<&5&wD6yh@Kk>vU zoYP7ofWUb4LqUlgR(iJ(P*k8aKCjb!cP5>Rj99~U;Hfn1doxFNRPw_5q3V(+xfg$S zqeBUx*iif4~sHgN(LKCx#>W%4rzRY}RV!pY(g(9PQdU|X*fSeG$iF z%0qbK;~nbX$}j#YtACF#8r z_M=(2?%kzI30Lsm-jbJqW*A<{yN}DnV;8%hR>g}|Q9>{CW*3Nz>yerT@U+tY+pSYxSoF1Wb)zV>oxziL({Lh>){< z#3q5^x!at~o#w$U=dAk+lqb9`GsY0480I)~`~TiP4J%Lfx?HW&5gU|YX*1V3oRl4L zR?H9~fnX2J5Q050LkRZ3459u%La+z+L`ZxMW(d(4V1^K#0cHq^uMI7ntTCVDibxZc zGYl58a1nJ2-CZDLb@6;`8({zY0T-mhuLt5c#md(}c@yfcDS+4HtAdgAVHI$U^9S{( z(Tg@Q>Rs1<4MM`3lG4|H{V(;y|D8eriPQfF{qPUN&%?h4cFCyaSE|xKX;UiM9_l66 zN`Kh6Wyif8;x{4%9JS2fE$-Z+VY?hdJZ#RIdnbr5BIwkVoDq93j$Ka}?Ti?DDkM3- zTpv{sU3A)7+P8RS?vfG{&FO|S=lk^lDfQ!5T;PNapIoB0!}7S7_9Bi+8U7sO^t2@T z=W4`X?@KYN!MP)vLo>}>O=&Zmov(5f<2zh-pI*Fd%0!OVpH}VG6qB(TWO(3DHl7Pd z38#SYJ|fw)N+o%KCOKF4Er!gySB#Ow9#y5r$$XyHcz`b`W1y+@IQX#cG$XuJvPqQ` zCYC5$Jav}n9o@*iltT88R0P2KJDX9Acz=QKqaE9yFhZknTiHCXUimQXt3`74AlTT5 z0luK49UAe}#oRzH?dk!%#cigGv*CUG0cJ{<4bbi}v*1%zH(z!`O0+<8D>wSR~ z=`T!BF%WgK*#xwIG^KG+zBl<(*9JCyUV+v49*x=OSR|q`5xs{JEKd2=0>7*mzlY}Q zBgvk}5_h-(#r@kgEDNe@BndHo(z^DBE(JDGLDlia>;{oxL+UhX7Jw`0iX{v=BNERE zTJ*d|B;^E_us&GN80yV`%ecE88ebdA`Q|xr+-d;&_C5_tYyF_%;W1-H#umRQids%q z%sDl!90HT$#n0p-s3)E938V`=Zg2lX9ovzvM22?@EsusMfAe%B*!yDiwv*XthBnaflL>Ho89d^b7v*%W%l3VsQ zmAPEuD8=C~@ukq2fh+7D47Jz~=VfZfPk+d=tK~5oWl@w({<9e!Y+zhNxESW^&o3K< zp8sTCED`4lV%S{G+B%5dy!Scu$;a`Sd_M>%yphT6w8gUA?}j-|>lgj@sU@(YEG#I? z+Bovbs-O+GlX;xm>~q=Uf)QK<~2)C?qwvNR-?{#{<;YMu+$?o;q01e z)57oD2z0kq;_L>9WG_b1+AwwwAwl(!?xFagAg7h z4F7isze)J~gYaericp&woNX&{fw?2`)v~SlsYH|&Jl}>NW<$)SEI;5V`Q|Wag$%Qp z9?!tx(8mfOJ9OBhY~t^3qLYkws&>n+K=D0ZG2tFn4>cwd{BmaMuS+&rQBB=df;Ihj z8Co)|k}3D=gRy|>ufrMF$n^1WI)Xwh`IjNy5+?#wd`T*&eTN3FovljnfGf~=_3uQD zsz_f-o#Vj4EO?_sIP=cEG6HG14*uN$XRYh z=3}dZka9K@KSHK&Ne&qdJL~0ifLLHbJd*HEYxkM$-PS1CaQPa9$MB_(8vjwq>}?g* z?^)1v;gzq*GSn1ZCatG>b@8!trRFS?Z-_j8*_NRbOKHJZBTXK{QNp_1nU?aS1SZQ%*ocmkwr~|5qT;Dn(9jqo@u{M6N|2Yi>It`?Ja9m*# z$MEVHMPh`jdXH;U|4n2qH-F}P-K5zx+a@3tWLU|pp(&g50@JIj_ra#`mX+U=h9xJj*KMr%9ZcfbI0*K1|#MjM_+kJDQ!(6g5Zo(IQZBTU=V<1{tQ9+ zrYf|-Pydg#vy7{%+txUZbT>#!N=PZ4(jg@R0@B?f-6h?nl!SnUl#(JLodVL0A|Tx$ zaF_btefYrdu6@qAeBBRg>^b*Z^Z$&oW(X;961q-omsUg$f8p0`qj36uFSqp^*g61O z8<}4kqR6C({!?rMbz6?A`)RxTV-02D6%r}qotE7~; z_COl$9d8&_`jp)i)^T^V{WFe<a)@z)scaeujLVQ9H^ zY3tYNdTw) zZeCv;$LDECb`2(kWY=Iq2%5o!5Hy1cA!r5@LeLB*grFHr2z5U~EDqQeA+Z1dV>k#X zLGtXINO%p>AeaSV_P$`acZM&BT{N zqr+=W^E<#Nzf(JI_;P@kYqG=rYK=tJ^Q5nXXqH7tn3u|I z23uH)%eULFKK`ZxXuA3btQxdAMgul0vx^rhF;(#gROGk&Zd@6M+G#SvJP@?)ufjaHao?&Gm>Q0y? zuvb^C9GK@;v!zzHPfenhVAjNeGeK7ij0b1KYJ&NTgB-rA zwRmn~?@Va6kQ18|GgiWM{sLlwvhMHbnNPD9;f018Q%v%X;pd(zs`0TUfqEF`6SKfh zdd*@cz%LNRKmI(=%p&p7hMF)?t&98dN+hn55k8vhZa(5XHZcMeqvv18r9l;-TVe13 zk5m6XrXk&rlu{X(DF2slDR6qaU)i#L1GeLOrsHg=#Eg0u$?yeM?@+{>^_-Br7IPXh zclI|Amg*5GfKZ^0>uhiU^}|)Y#j@zM!Vg zjh-=UF-bnVGyZ^|mts3=0eF?05Icag_egiif+|JxAdG5LBr^2-WUL$#;jYS_t}znO zEKs}fw^@YK@10Hb87rbY_8^0q!Any8W-+D1P6>{P`>iWJIYDY%hX3%Z@F#1 z-<}F8=0vI{2V(sjdARDQ>ap`+OxX5KZ@`k;nl6OAEt->lY}^sj5Gs82=N(ULWs`*6GD6jm=NMKz=RN=0Vag_jOz^l z4^ri8ECazT2;y%d;kAo{P#A>aHx(GJL7EzOaWa5uHVgM#zM<`|!Ygv~nCl0Og4m0j z$`k)Eyq22Hh8VZj#`>EkzOiqxoujTmZQW*d;6zIf^Dm3;&%mZj(_QxQShz6vAD}rV z-$Rg*;U!|yZ)twwGSi5v*6+^<&6xIQ_+&TuX@S=nHIe+3aQiK55>@)FBAY;NqlYIk z-bu`*3^^PXUMOXxJl~#7RWrOw@cQnS53bt;S#M9=@gAxGV(l=nKpa}wjTfV*R{5>W zYu#V&^HKaDsyo?uJJ3r^ZXFp$EuTAC6pqR|<-U3X8P*FnQ&J=B>HNrTSv=RZ7$Xz* zoI4ihc$vRb1+Zb}FYFKvk4PHQzPjD9^?xe;X5mAaj53VoVsZzG(cQ_sM3it~`dlf_ zvSid+3iSgN>fR7I3%M`!>8wpx;;S_or98C-Y(OX|VV83C#Ytnfq4f4p!040ggrS16 z;fbaVp4X2K*ekXT-0*>EfiUb`(~_qV9WINb6xErWGhTYM_oE^)8fuM~UZ#x+K+~+h zBlXv;N{`a~x}q8?Nn#ZP-jrcj9}@(rgbQtU4)k|^BEZ6T-j?25Qmw^V4`}NhK9FjY zjeoNu3Vr$yrq_n<#RlNnO~Qy>TFX<0c+-nG6LfU#W35jF-4Wf z^jw%swR4AkAD2a5h%X6{5LMR#t%A}obW2(+JDqJab<)oQQp3@R9g1FoGtgI zR%OxzJMfl2bS>KxZqe%@ES*zzBPF#px4%{K{BhLoGQ+?_3zgqXH^Fk_f5wbTQqNE= zN+JCrHnPy2%yf=>8F*i`owQ{sI_g4_(9(|qhKEw#SqT}R?44hwANsP6n8O*f;gxb^ zU1*kU`%_QS6$;CBEe{tuBy*GNnI7UI*Acci8}=ORnu!#Nn4?iU6qGxcTD5?n*+$un zI!T-IDVE@9azC6iN<+9n{VX#lg@ElvvvU94E{G6p?i&PqU_uD?z=RO&fe9g5Gnf$S z#y|{-OY4Z)``CQKmd6o`Fi6d2Ey$*!!bkb77cX(TU|Q|gAU*?32(b@fLP+;qXE;cz z{NG{rCWc?*XmRk_FP*N*BHK%p3bqjR=WzYR?bjH76NRsR4B|fi0}5ZeIEX>G$-DgX zJdWVJ*GP1&?-x1xHOR75o^7Y@X5Df=ng0}y(G14*Hn1_aaa{^aj4%VRlkjAg$NjjO ztkTiO^xn(hqpOZM*33F!I}~u({iVV}+^5@Z6r~Ohp=8VIp@>Q=b%wEs5ii4Py1PuY z_Rma#SJXlep0kkhF+DZLRC=eY#nSdQEj-)lL-j*G3O`Z4qG%|d{eRk3@Tt~x{@!-k z+&oTdy9?2<*z%?FeJoCe3>9o!$*yAnJ;DpL3zV#XsKA}xccxX{gYXv1Tb#9M)6>KA89!d$Zo#XG*Zd+P5z}x~G;f__ z8DeG+2s0bM0{I4V0moG)~E2%%L;@l*8b60%*m9?8Kkyc!I;%xC)S>4DS^+EQ@V z)^QI@0{d#iA?F+2O{$MF8=dYv`rL-kBv4JCs00G*2u$^k3qRc{G}=0QcB}D&Z%=wk zKyE5edVz^M+c)GVojTB@k$<`nrgq6<1!FVae6{`!uK8DX8@KK8jUTC8)#mJ?pQjFh z)e(-!zQ&_y?&8wFp4?V)QW+SJiMOXK?PE$kimgVxau0$Utdw}}9ocN5VMMAIbp|yE zTm*;-%hq`;ML~9`%s5@|vw-B7M&O|B@d(*CW-`eCCu;g6Cm7&{g8f|v%v3|`pQE~hFPfmR?Eln@^$v09BC zboZ7w_KGYP#S#uJU`YG|LnK~a}?=mA0?<*FFffo zcN)clU0Nd!Y?%()hu0v^C89(Zwm2)Z#CdoxT)*HptH~XY_osUeO-A`&T-x|FAgItC zM=dDZIUvhE3CH$L3hB{4|MBQ$6M;I^LI`rft_aCA!GsVtg9#z2y>83Y zI^Xwf&j-(>%R=H5M;8uyU^(wECbIb}`Q2`pbAlijObAKs!GsVtg9#xX2TTa*@aqr< zVcku%x`yGVvP<}nqi+%_RE&#^UDv|5UN|#cL*Y&N>a~wS3h0mh3#b>a%*|8^=s} z_fxT)M;$!_Q&)!j55jVDzGb>uK=C;KuYce8GGG+R*b+T6Vt;&hA=KILAnvxs*HH}E z;1iT}L?8vC5X#fb6AB^X-&8z2CBW^IwKk&T;M0%iMy@4M&5~*Yh8fUo>+g`3;oI11 z786Q%`7AHL9vz8p)(J}z0Y#Lhy8b>&n;m%zkg*aiW~z|1nRwbX)E;%3V{r#`tTr{h zcRp^|HW?wb{JqT!bcr~%@D5t|yx(xzc(w&g_aRKZ`eRay*`_34 z5;(10ozi28_D^!|XRwbDmXBQI#|LK_csU4j_dq{-<_1!JdowFPo8XP%nRn>TY^_ji zlD5zkH>uZ3rE@_5y!KSl??N7mcOwZrAZg6?(NhrK$(N`6KAg!GT+hPNn?-tHz1OF0;{fsq{r;z9b#6=( zT}wnUY}%`I=n?Yz1TPvop+Ef1$$p%BIhe;D^FfnRpCdNj$>I@~-e)U!CESXT7(9u7 zpa%^ZpPWb#U_WXx)EJeULc)o>?YU)lL1WOkjN|H+rU3LHlnHBIkWeQk>-PZBWX$J3 zazEyiPV&Kur0!_KlNl>W#h|bOdk1`~(RCT&6Q5Jeslz{=R;*UPc0e*p!d{j~NAiP5*YDsW8 zC%>a}CFY|Br_;;oV!H6otAr}x*8<%;;ExNUeh~Qj0KrJ`zJVzd@uOcM3L19mb9-92 z-Kh_vwW%oVfo=PV2%KnNhQxS9v1VZB8Ya8T_${X~KSHQN?!KKDPRtH83(8u0N#;*M zWnYu_aoyrF3cli)P&5$^oYe}NZULgn)TT^e2BOdMg20ye&v?>t^gZ{W$5)f>xh%{c z?mRKFEQyqZw#+~*Fn@dv;X(r<(W95o*b&{$C^YV8lZW@M8(mq^4B2gYh8gzaE$q;(-xTKHL_cxFJwc9F~5JEjLA%uEhLI}*jgb-5z zCWM#*Fd-xl2NV9QA2U~3%WvY+AwAT+B=ELs?sTnIQoOg*4V+(K8Bwbi*TF@i zwxYvoMZ(!@E!^(Nd-rF;k;TdF!VRn+P>(W7#TaM06V%R8US{J4{w1rj&%Vnfeah(? zTWyFC;dlnTV7=cM;%}_^n)5QjqpB^A)2fA=#!@)?DRGHZMffUZAu!Jj96x^vJ}3R* z-P&Z?6ihqLxbQt8y$rdGpI;{=pYoEs`l8}c6~a-mtonRUVW2u34~nG7L8UKwS`*aJ z=J2K>RPDVdm0S8-XqxpmR*`ln&TCD*?`*bapHgL!2sO56o6q8D>T0Z$mfT$DfVE2Z ze1}B8nmv$XmSpXDK*^JfuM&D3KqGU!?sYY(E9;5}jA&5KpG#t`6v_1&p7v%T~ECqyZ+Zwu%GCeMxr{^H(E*If{ZzCUE z9fxyh{L{D8W}_p!ao#965bpXgH_xrX*XwvGihy91vC|0k4t^y{>xADy%ldTmup zDSCeX1Mg1EqRh*QIg{eD!m62nr^fw6$c2LRQiu7p`vu28>IR-z58ahAnEX&Xc~8O| zn3VzT)0N5jacjYWnOy7EylNwiHp89)qA~D}Kuby_chKlG5;fs| z#!IfVB|+x6x>+kB3cs;PB}0j3D4KPR;g4275)nP8LcbJ)!+P9Oo6$)d$BLOvNViDN zU{DZg;R9ih2c1LM9_dFTF7?QQHQZP2fFIQ8*&xHasOTR`5f{gVu;-=7eUTz1eIl&m z>VwM5CwMmp~8f5&iS#2t8Ln3rA+nYwf_cTIEX<2d0h^YvvvnEmErQH- z0?=4-YdTkE$2$0t*RU20vhI!Bd^7k4R57^}pQ7`io3~y*hB@A^vhpZ7YczHU3SUPl z*ZJjqOZazj7IZ}WJ9>UXsx)XgTM#w)u{n(0&M+UN)m4p7ty;f2La-*C3f~JXEvr+> zZ!lEzidCcaUOgO=)CkhSk?BBIC#vJBTCY3*27RpejS=rhVXI+oO}q zTLc8I@1YYF(^x*hI3tWy4-1d_Xx1z|cTm)6$>;7gi!@g%9EqfKd4hMXfhqK{l4mHm zuvFyUYBRU(_@~VT1n=e9`k^>cOEa{bD7uavz)>j*2k~ecv@jASMNIjeR~sLEC(VQ6k z(w)Q_GCwiZ!|{E26j$&V2|lv0R`XI3sfCOB$60ErZbBU#)l*V`A{77a&`(x$kG1qp zHg_MUv1xN;Dv@)X=N)Rn{ay+PWhuBKtz&wqXbkACKXG14K zTVz~@Qf8k#dV)Rf6S*Hy3Slmo5W-wAA%wYLLI`uggb?O}2_eh{6GBpUFd>AwU_wZ4 z4<>~CGXDm}ZzAb6OxMiwZ}k(f@{&!9_5nL4i_;GTuU*6RO|ZN6F$gL_Fb(1Xz%c!P zml*y7_wvt3{fR2vEsK+vTw6K7jGXL@uuNX9!o)B@zC(ZbY-sa|EU+7jOMFhHbBLvw z5cf95Qzh9|-nYZ;V#if(+&JC4jv7GD3i>?$6Dzum{m>J=3v(+7IW6UA^;_(iMOJC8 zd}8JlY4xaX4?1udNxf@BsNj{?YFqL}bdcxZ;M>x^v=s*7t_pYWH5S9)vwT1u!=GWs zl)KU43cg%-JNe}jsZb@la@|IQFsJ6*Q+H}|r@*Rrz}nnY1ShoQ`sbYX#S0YpM^vK% z4ZTAqc84gd3NlHNrRG2=u!7&;Vg`e<$Y*gGruvfv!59LW1Nw zQB#3A!S8jglx?5UD?0aJli1#`IbPy5M-P50?W5X=T7(=u4ln__lBvRziKhJN`wCZ% zp)*~4HL=LfBp36c4H6?N)}D5$jB3D+Jkzg&ouxm?PpqH~yuyM-A!9&%QPa4yKfdc@u<@hCYC+{*~0M)b=fN^#E|5Wj$K$s$teq zwefm(I(xB{&b*qOWCa$-6p?ph$x{trCwOR+{<1@}y{{!vIw4$SY_|Gp?T9K9;=s0!D{n=Q1^j;gMpMfN7k5kqX@3UnJryUI^j%X`&8_*Ke?0 zw4=V`h&M3r?*DCDp<|s&-t)*F1;T~Op|7SYbrTzwn+f5==Pq|z8l&6C+ItOvqexzh zyJV{?s+V8lYi+Vfvb!SDeM}mKJ8!i++(%lpZGpz!{kh*2B9SO`j>ONSP%o_78n8(t zj`_1lP*NK{-RkH4UQPs5)PO}87N3w$spI618lxz>@Z%q04-9j~dA|JI%rq^m|J!hZ zVfCNK_%)KarpZ)zYQ7k%DiJCCbltSNzT&n4Cw9uQ>#2bG4p2-FgTG%aay0b;Yf!Q^ zo6KgB0NM0)fxx5!syrOeM{8(az+FT5V`(wBlC&P=&;(pjzgu1Ha7|&OJ!Gd`PZpl$ zN)HS>KtPdGXY_V|Sm>mX?aZ8TyFuW!Nk6=Ow9>IhVJc0=! zcmxwd@CYXSSF1lLlAGREs^D;Dtko&9qiAr%bW6?rGVYwyi#;<%Zv-(eIUquaaRC!T zj0>0$VqC5x90a2voVydoAD0srL&u~z0q()v|Q&0aV()p zfd0lB;r4zvFw*RYE2$dz*vKP`CtW8`qFA4Ek(4<#@8~cHn5-w>7L9w7aq3kl)bFu= zt2fOlOeR0@mx#QTbMbNHT|uB-P?nuXETdJiV-V;I>v76FQ87ZvcbWRR9-*D#aTzs< zlFJtW6LnQOycgk@&2f55Wq#C|_XN~u=GAE;mREct{=l^Ax(wSSxCgF?ZaEgIxboeLLZasWa)HnI zJ;p>^szs!rAF4|S-*F*hxQ-y5YN>p0ulm>{i&oGR;dbBGN&P|(;XAN~$brFUfe3dz zxkfNgv?zPa(>ThE##Qwt)64hach~Rrk*g(S=oxcE4J1 zTj5SqwrAEV3ZvXr9e_2*&Ad2kML{g4!lBFDu;G!W5>oF{Q{L05YF=K|Q?^zEv7pSu zC(%5j4h{(2~es{H^ivDBFr7+zT9iIHcw)wUT?5V&%a#9rSp6(vD4e zFM$d7(Dq<)rz5E(<0)rQIc)5m-69Jw`Aq5>UxVjAt!fLzL-p2x2bmE@@N&Sv1T8wB z@9gWZ*W6h03Ce-*@EfBAeDT<|RG@f}uR;77F`>6@RB6}d1rufEEbD?-jn8tk%E$=n z_pQ0i`H5Lbara&L78+K=C*^bR4UcAJrGbr(=m?v!II%pnh~$rXcE2Dv0~11U1}22y z3`_{Y8JG}aG{A%qqX8y_x_cmw1ni0sM*=20kT|_-!b6^wg3I?Se~&L?3l_Z(@oy4|m?QZMDIAXBftQBp+*9ID%5(nl z3Dh_!tGs;#X)AM?z(g~e_9%`Bmv4{iw6icBGn;u;?uh6j@~ZjHVp3v1ef)1sO#dLY z{OHBNZq(fsZ9>y5%v`Xx6z%9-IEOKdfWnmHYDQ zCu>pZtR*3hrf@z!u=5wRFYPKlWBhxQ&Dcq;OxgP@!=UbZakW{l3~Xj+-K6$DkhGe9iRxl;Oq10&W5?8hZgiuZ7f#iQ*obqd@3vC59+-TRH0cHYxOv3cD( zInRNYk>JDUpOM>Jc`kZX#^ZjJOq$L@I2x&&BCc zr|+;kT{E9+`k9>ha;N zD%vHQC$6~mQo!7Ps?ixY<|HXrEl0l|(uXbfV?y&j-Gb<&5*ThNa2wEX)aFGU$0g=T zv_a+q2S+@Erqgm5ILGpXtqqApGnTDayBe54=Uj=pYdJg}#_a2S#*(BYK=-UU^wC#j z+o8sk`%B2bw;F=7zEHRAYW9@To~ez#crg3o74b!^&X*+gvj@MnKaKaikq71=V%FXc z*oe*ETRv*(z;2i;A{YATZFFC}BYQ(L0jb>e5QqhuhyPLWK)v-fY=1avIQ8h2#J)bvginzON;_~D zg6<0U=gtr$zirlGdn9jE7mP^e&E_UC^kRNCiQ06d4`r)@0}VLLMKi|E7#&kBimo_m z#3xfoFyR-g&;tzZleyudv-)Sf{y?*!OvL-fc;2J?*iROIeMZKoGh!v{d^lL*e}@gW zy_ZwJ2N_shW~#2gsit(hpX^qubyJm15GCQ2)kgsj?)zK}M|;IEFMwEJMXqZMS9T`< zHCjE0tjVEncIGA4%#fs-|04W|V|Y!&@#5a(0tBS)8G7pi4j=sFm{CJ#Sh(kTrt$GL zoi42fBk*iIqF<9jK$>C_vIQS3(=&Z=aN4|M-Ig34I{8i9!y~NV*!YzO*T1%J1rtJu z3nqjR7fc8tE|?GkQZOL|q+miwYM-KD<9$xJ(1+r1KbhvOBdPDmmGSe)A_S#`n2`$_ zo`3D33MPbjq3aC430Buo2ZC7;2XIraeC^^O9K9)xzsAwana1ZSI^5<@tJ5wyJWEPW zDxcwAyEq8LK^y=`5#T0s@=qdu>KfvOM8a-=ps`dO+Uk* zb2=1{{$Fci;#2ae-_YOvRlJ6FZ$RzAUYd+#sXz`hD@soOnWrl-C75T)I_S)d##mqt z?tT%ABTN_^cbqnjpZTE5C;I=~CH;qr$F>4Y?(^y8hWLVdB{ofgFCiS&uwM z8nzP(o4|vGkHkPM(DK5cU+ZbAu0xR_Z^7}MCEMqh7#E5n>$%^ZEQ499L$Yk|#yYvE}E7L86{nR@zc_LWIKG%n~*C^aec(2R_`RxVnkejAG) z%YWj%tbF`LuTY!9;dM2E8L$Y8*=5|%mTsxz<-SN{R?HkloBkK`m(=Ytup>OIOeZOy zfL1}tpNTs@tcB0q_))*e_BT<6VmEjw8s83GowsPPn{V>r(1D}ED$$5=v;TTzJ9am; z9%t6=r1`1bWSDA@#;x1Dmig4j&>P86Lr=PCBjg0MjZ?nElu`rhBRhHVj2jm08t8Z)|w>Z{Z&Ne*kYI=s8H&+HM)j z8}lk%ZH}2*$i|%Ri3V->iBfDzTs+*<0Gb8ng03N)nZo>*_={A(h99f~xx!z(Nk`*S zTEoX#cP(f7`)qIJ2J%K6DG1+#02fRM z0WO#j>d=rBS1zMpLW41`Vh+|$V4?Txy*e$1203%ainAQCDR0M16bSXegb?EbCWIIl zFd?LSz=V+Q0TV*H=Q_ec7!86^?phm~Jsg@;gYPVY%e2q5_n)%yU&AN}2tgMdBB$4Xv{CK^^des;?@n>zlR2X*hE(KQhP?vhU!?7^vHMW zobh&)DK@`t(s1>!1Knd1qu0QUduTJe{FUX7)eyVB>EMKC{zbHx(gyS?rB%e3bc}V` z506cN_k)hVzCBJm#Jf_jwL)GEiw|ZVb1Ga^enxW8o_1aP=^5Cwgm9VdBK61+4bp;%!4k0)l zF-g2rs53i?y%&a*X4;qa!k)Y&L-P^uz6Q)OCEPiND>DjK(Bg^$W~S$`6tsBYci`CO zliVwav7{?;9qs2nsY?hf-+;xlm@G(I8C!y zx7X%i*E-W?CV=zUPOF?;3-YZWXQUvE+!ve0sEQcow7$?!{}YOv zVCw3Cdir%yS%=IQ(MaW=xOF+b-YJ_rntUFD!m=K~4X^uLtKq#a-O_qvO5Md=F)(qk zw3@?7h!a_VFHwN}D-a4g7et_bT)&f8J2W?|G!Q`9-Z$S*zuDXPXw~Ny{^MaLigIAV zmzQ8KL$hj++bkTih&qe(l(6jp*_e$q+f>;bczn=eL>{i?~q~MkFrp2 zq+#HUrXe~Mdo^@C5<1)AY6Q0Aaqw-@DwsI=E-6Uu!rU{S{qTY7s(0@z^R4;>zopG! zsP79|9pf|WH;itgs9GYH?g`4dsx8>Yy}q9cE>tPKUGcntS4Y(Wgc0sR8(2Eeu|p)s z4wuLDnF~)`()Ngt5^{f@mjI!_N?g|vZfYxxSUlrn(!Bh9+hPjQ&Yto(JVDJpZ<|`= zkc&`81_HBs*q7&0N>r@~na+3PgSGIR-1A00D@6G@I}2gmriAgsZADP~ z`{i|E@}*jLhC7}CyNvPTDHnUEvX*(9nCHN%6*^;E(Z2b#_|SG&w!zT78!7f(y!b@16^dvzWu|61X>v*rC^#9Znk0N5i7 z%7Uq!L1uJB-ZQxo0k z37?O5ME4%o>C0*oW3+rB;_p&AD1iR{Tyf&xo14$j{86T60&-uz@CdN~h&c-5Axxqx z;$+cN^c+~V-5jo_PO+!;u~{XFouTH%o(6BTF0<0N1USiCBU(1YKrFC=>EEgeaUa*? z#&sXz+g_$Ae*Jg2#VyZHON6iiz0L!&qU< zix6jo-D+ZFI z99xxl_?IA59rkh#Pi}f#V2;<@$bj-NIRkRb=Al!T&U`ra{1=}d$J?w zelmZY$&(;hX(2o-QnlwNcyf$@X5E4?_>$bm^QZ}fi47l@o|meAxZ1p z(@}xAUDO-QflK$4?NK`4r1zSQl;bF_zpnRr3Q2Kyk_8=*cHM>tkd8CHRB}CX_I|Cf z`AM{qj`-`3pJ;@^5Qc*ZAq)o-LKqGvgfJXT2w^yw5Q1hfA=KRiVK~?oAq)o--pKHq z@@x=TUHcdWbsz@eKY;W#gD_8B&WmoH;gvH}&=yn~-W$>c+j{-0{a449f!K?i48lLp z|DY!`P2hO2kNI?U*p(pq~|b^fCwV@8Ffizp-`@U~FV?b37N3 zkPF(H>4gQim7H_P!Yxdl+yb&KL($6GqhhJ#P(raL-yoS{%8>`l2JE6@7|#7J z!rn#V(6_7dS(5QPLw7??3O?U#AwGduiLk;-HL01_TR+aTvj>2QORjtdhdWRGX=O~B z%wlNejFGe)A7r5JGYYV1XQ`s#%0ta?ea^d$%}HH6UovIr=zgWX^X`ijrOf*N&Po2$ zevch0uy>l;VaMvL{VVrdQjSf81NL_?SUFod_beJ%iZ7*JEF;bV%>sqp-!3eqVBO{! z2>$b6OVnZJC(y!27$JAgL? z&qK{NUL*dl85W=~bv@ zxZv;$e5Kac{IHoG_WkZO(1rF`2(9Z;*4KBFE_V8}$SE~ZC zK&uOXyRfC1&_Ozk&HtUU39ih?UGfjlvBjsELOdVB?4nxj&qu>iQLW-FCeYz}(D5BI zzMt0l!rh9a_+lHinO~hRp}sPp4;qO7jTP4sIP+%vI7h&dN;r9cTjh~VHGde->b!#u z`L_#ESYS^cYJ}|cOj{U9AN-F>ofwBG4XNEKT04x9+$c9~#}9Oh%T- znZ5l{>_Mk3x*gDmU`FT~#W{vKW<4Ht4RfF#c3m+#{DO~TLXgHG(jL-f8h02)dJjRV zb|?l+(E8BHn&MvP+=B`K^&LS%LvRmvMF{S}gpiaSObEd}m=MyBS|7Bz zjvv3}N#*{LmNXV;UXpyjEH;r{iaCbCma1m?U$*IbCJutDn>c)pq#_zreN^Mj4f1vV zS1UW?)T>c@egAJH1+fSq9^fX>Ui)e{<ze=4?q~1HB(nNt=+&EYMVqJC_ihoiZ{((GlD?w( zz5WHtWC0I21E9cxf?M@_0UP|QH>Uyw0$1I9jz4{te7hf^%)n8x9->G}yg}~5ejelY zQ4e=#$B@G$43%oYAAUkG5Isx@`r$JGYs@%*6-|k7AJG(@OHhB!XUe2>=dzzWLu1da zxR?c?-3ird)w3Vx2wq~o;Yl_|FvR}ii5R>>S?Lx6dh zXWqg43=PBoj?_nW%5W={rS2j3sXvTU?eIoC4i?V1DXXT#7|0KpM`JL1Vnz#o4TkBk>Y8IB+lg^ zZ!aUfT58d^2X=y&d`daDa%ed3j1%Q}7vYC(7~$EE$%V4JPG%o|z4vMY(nxUH{pmuI zp!i4vy^>){eVj=9Mz2b^FR&Tv)1RrFRzK~tOy$@EZ&}7v^kgEx(1h$RKUdJ9MbJc< z5`Se}(DACqHld4(#})_$-HT(ghrIp^?im3!48@%LJDHrJUjA-KsNx;8&Qrgh9P5Yt z-Z|jM(UW$m+L&i{gM#L!F6gj6s-%*X`*h&l9eFWkKRTH zp6oUd3ygLDJjbDFa~KP){lhh-C747~F!OtRsC@U6ld9DCx@m|n7l0SyB42G!B-r2m zN-ipv_NGs8uZel?#J|$=z=}aEM%b3~2@ngqvI*S#Huqa%X_dI|&O;K&Fnn9ym^qi# zmz|^Bi=!PHdXod3Mljhg9#I*oWjB?vAtPskn3){oPKGCdzT@$Lx*^Qj83+YtgRUVQ z?4>k>D6##G(&5CR+~kAx^*@{88&*6z*(miS%GAb%+Fgh=nwTFw%?04Ae6=x$7=parg`wJ5OR1(Ci*Oo&2>+%q-; zi!uttCUjnh~|@#z0EqK&f1y+B53 z#TrPS@CiCkX+D`iH8|-ZxKk;K;TpNs3p7ifF!Cy;?;CE%s00x^={(1nLl%Xtg^Jg0 zssnO09R(O@n)P?2UT_M*y^Ev#Fp9l_r#4Z_hGD(nf~NXoV=3$fjh2JGCL9%U<`>kH zXRh(=TWhi~2-^s!x;7tiV&8n8O}~H7+_?S-dWP>j68bT-i-&%u%N)zh&~{1KiX6Ik znZcwSq==ZB#LxiDOJBNVFL0jc9}24p(C$xa+$496n=zi8VD8Mgcxx}p4zvqOhL@0A za8B1w2*H+-5BIagixA_NcNIS;&O5|Oi=3NuV}hgd{YF31q9gELMfElR{MkJ`Bn!D* z#`G7R7@wZLb=r_~gg&!t7Mef6__~V86wZ$~d~VKser`yB&N)rYkMGzoHJl2(BzO}3 zpoVWP`Z2fLKmc}P?*$>z=f@g%eq^n4_hNq6LxP3cN#YAJ9j#?1l$p?!Uns-KM257z zcu%c&@-3KxnNZdsyA+u2cpw(lwJm3I5GwB42*2#r&)zZRGKWJXN z6g&DXQJy7C=Haln)oGJMbIbp+L0E~zHpSBjCAY)X+`4;~;U1&1^0D`nj=p&q|H$by z2dHu>l#Y=nlp8%3TM)przwJew!hOr_${|! ztT>&-JLyl$+Rvj(zHONrWswyC?>-W%bt9rqO#8^NsHGTqjdunHVFa>Zjf_TVTk%Xc zOMqBle&HI#edlNn3wD+%L)mBXuyiT1Jsf7f`9z>*gv1vf;NBw|fpBjdZB~;g|3!e% zMsm}K@?RhBW*-}{KIMXaTF+$ol{bYO!aXn{gnM8@2=~B*5bl8qA>0EKLL3R05aLL{ zgb+spCWJT=Fd^iZxejpQyOGK&!l&0jdJ~4P zeGI~QkW?AOU;GD@zV_8_Do^}FyFAL|JXef>Y-!$~FP_7vy?bUOSm92RAB0~iQxs4X zb^%AFeUM{LT>^L7C!|oe#&vYpgs(dDjt{ZwP(kJKi2pP&p%q#x)D1XfXsrsI4^Ij1 zev|7q&+t{9MrWs|qfO`%Dnl+_2bT5RQi9RCTWF*qif4zDdQ5zxLdT4LiaxqM9l!6m z+4*|{9hiatTb>nr#cw4X4?AcX9O&#jlb(DoBCU9v_+Idc-lG1m8N_#hH%X+U6)0Wd zNlK+$Q7h>TZrU$x>@ca`@=@cxV^uI~F$=@`IW zGZnNe`R=~LEU+|}TKHUdOiLA}*J6{6|EJgH;3>^!a|4NPmQOp1!t-~ppn=_=k=kh- zE|Jw&;SI(+`W17^gARCUx+ski>PaI2o@5tM8Ka0>v_>6CRmMQa)+hDc}j>;|X z*qUfBU)}%sjq2gfh5>`jXo!T+@vzvh&oTx$AE4Sr_D{2J#TT^YE!MuQIptS!o0ul_ zy1VYEuFb_^|Mol5w}KAfoH>Q0O{`q~WI;rS2)4Smw7yG$x|lCb?g(m5 zR3xLyx#g2rKdg)_cvK3Ch1-NWeO_CibB9kqKnkakiZb9xP6u?5r_o_yZ^PV_&sYh z$8MzVDBB7}*cihkq)a$TdkXu}I*iL-C_`o7sGb$s={;ifFb|0Lbc!Y2Jk#;&eKvvB z0P9oXUhYc>vzM{cK)q?(6Fwq%=~@l*~IlVNHqOiH!l;1!g6$LELH$^;P$!W*qOhwUx%E zJvs`edGgp`KcyVgs&}_%^iv4;K6-rMr5P_`I(bpfBueQSS7T&Y@kZ6E*o>}PjpEa6 z8U*5CLI}jcgb+4^38DUu5H^Ed5yECLA*4nQCWJs7ObCHEnD9o3|92<^!SGE9>opYK zWFW3t07C=&=O;Mr88BsR7CeQeMj}3I0@wZ<1j9FR_WFPSS8vR3GB5u;`%%GE1#sfL z8WJB!Bluqu`s|*KqVN>A*sv-K-&QCwJp%TFq?FCScSX63e_v<8EVzAOLt*e#(Pufj zbpcfzw+`m_DMV1dNb4p;yp@J(!a;p>`$d<09Q~^wA#opaTc-|N%76O6;{aHo=C z+FZP%dmh=hET^$MiJm4W(J1$Q^n0=hCN`=p@a#jG1I5M?PWY4Jabd%xZt^e*$d#X= zar!T39`RV_e55!V0uI}jZ>-$LHCysy=`|U-SH*o|KwGGGpg-G{q0kNRu zLgq{VcSQ~IiF60+E372^Pgq8H*fQ}?s%Q_Kh7XuTfdxws7J@~0pPz1f++FQ6X_KJv zledL^q%eH;Xx=>G(85;%hy|r%Xpl*i851;!@(N!d4AY)^2m9=6n}&^(m`t~rbpv8I z8}OFkFMDHMAec@sO9>cF$z_z#RoDbRfV7fv7j?Tr3}0&EiD^}=FsPNW1fIKUxXfhi zE_Xwn9pB?UDmm2bn1*3Pb=4;miXx%Vn{^`rTpm|AM>Z4hORI zIaTTtDZ9Jpwv?)s#jN@}Sh^kS(BFkU3~`CvNcV*GPTn7B!disUX|vnomuD3?%sfKn zAaDjY%29i7Xv_Uw&!r<|J1|9cL~fVF`7{p*+6GDS0^Oh^6W?Zf8R~gIjnOkV+D?n`K`SI{-$H}#5r|zKU-Zq z#5;|6k-zZS2(G+Bk#pv_+#}w3Mj8TfFd+ouU_wYH4km=q9!v z`2WAZxYn?niUj{W`xab;U-H&I6#0N!@;U(#R*|?e47O#uKwn`k@0c)wB6f+fQ z+|h`=RqyA*iuHJ(KbAUhUV8ILM*o=9|54lTWC1iW`7@-Mts$>Et5o@_SCs^%NW_TK zTL!Z|k%f7~{fI9os(}L^*thCM+mR?N%fs<6&OYj7Qtu|M#Uy+-G6wo*zvXw;q5y|X zLK(_&*5+0x8fnADFWZRDC%;my`b3Z2F(bU|UTQ0z#qk5vs?7(|Q7uYFEG0v-c{dzf z4b*s^$q(zlyq8xjm=yImdZT!K8<&BVPMJ|kJTU=OT55i+a^Y3 z8)*b!ws=Y7hd~ql%W}gbm5vVJu(I|yGvjH8g`r{H&m%@kLx5I6=}cbnyi6t;t5|tJ zfKgjSR}=h^rP!*+pS^_L%%cd4=1DiO18Nrs`G@pp6e+0PCvT|fV|5hE8`a31$_VdO z@?xgP{+?3+B@~M7?>rTstY+VaR~2NzTQ0PpoagJK{61zbYXe6Xn+6;%PZGyw;*G#w zh~B_mgme5pZ`F#AYmMXacy{@-)B3Bq-;N7PXA%?dcSNR~BWN%Z?X}?~FfXr=l+}@8 zuDmJyBfC#C+l|PsnfE2hR9wbmq2cP^EHdLK zsio;67R_PH{uR?!o)V8wn$d`MggL#vLF6!EA`nZnU?t+*fg=m4@ZQsIs}8+BgHrc` zVdgJ0R*mm0ut`dRc0uQY?8Uz*z7ccV9g%nuPTrKBzk$g$O4!+3x^0q#yZE+S53QDdvJDRB#^Gom=P-z7<{gf>A z%nL%{Q(nCY@8dBirOws`3JfT2ac|dZ3u@6?CLLdnqYeCG(r?zpTpTa%?&wZ=69#l4 z=**VCU07=JmW6IWM$0zy9?palIi3nGLR0&wj`v)&&C3zIV;-O$WbCJKnc~&vKy`H> zwh}AKtzb;)fAG!YLw&X(ru7AeGFm{ z{yT=>WG}A82JsI!Ie=^CuVRk$sqi#It!=62dXcN z#_@^fd%0P7zr$HmH*rVVc>g^v6K_b@P9Khnpl5IT)vmwL2JBbbb3w(Ol1*lzhli`X zpLfzs=wgV03C}G$7Ql!R?;7)YDlWUW+t;7SF zogvA@EbQeDS2+V;zJLLmHOD0g-_8VwlGgYhhK9Jo z1tpLHs`>VRnNZlHk>a^F&b&~kWr7`*VdwsagoXJQC&88}voUP=l{Byx9lrO7p%+t| z$yj`BgKm!Xlkn%aDkkstr|~8~zQ{g&4|E|I6aL=s6wjThjqZBuSlz=B;U}R|ZGIvH zCrtRlv&ukYC>4hsI3x`xapZrPJIko7y0%@D(jqM#Qc8D9Hy9u#-Q6A1NJ$Aucej8@ zw}gZ=0*cZ|E1kk#%Cql>AB=C^`+dhZ#{PYutcy9({FY2$EX* zO};=Cr!3Cg3r>ObYK1q)BaE>*W$x6TA;^JjLV9sFN!$*==Ll%$xb{|l5E^KNQNDk^ zK(t9@E!<8NsO~`1uWW%3ndzepTb7XEcPSNZ(Y$#yfVIEPi@+4zUM zTig`mK)axPxt0!PjV$~^FB|th2O8wQMcHpUDkQ>Hc68v9q%n7=1U|kqNjiRrFV6^w zNM|_@M|s6w#zwr^SAwN;;rzCkLlIpPiYNXW!X0!542JO?U6o)^S{Ki4YfqA$Sqm*c zn!X&pr^K$jUI_t3kCNG1#bfDQ3j)O&QD@%<1(a|nb(zygqZfhjQ}kY^kTe`j2=x^q ztOvUyg!N!T2rj>#H-8D{v5dJ0zU;FEuD0}Van-b}3KZ6*6o4my7dTiM7qON59R#?L{#? znmiX9BqJm@SQI9Pqd@LW7DM>-;l9wOspQ#sEJ@FOcM{RP3zxNwVr|aBv@GZ|yUt{e z;Acv7O9Bi(mMI&xc*R5>ZxRaSxeqK-$;0ao02DWit(()0ZOyc`c;$Kk*9ad)T5QGY z;m2xtyC;>}c*+=xG3^RLT%ibYGDjy=e%PU$znbliB8`rPb+jfTT6Veip0r~CYl!&6 zFKCT^X?$6VNw$LZGv^UK5%{e9U7uQ7`8g{{mu2dl#ni{Pgt~{)~SL z=s<1I)syiNKUHIq#vwJ{Gd~m_`LW%%mYPkMSXs`{cg+^|+YvxvpzVMF^Y{5c@={L> z@n@HJ)SL0$B&X-n?kE?|F_dX^^c?Flpsx_KuaxoQ7s z9EM@jiTJy}81HlXJ%6f^&|XE8DB&_;kA?>nf0>CTwfydkMUGbXPozdQ5x?={jzb{gHubYYK6MmJ4QAvz-~q64VYFEEu@da z@7cr6bV^~TKcIb1KaY(if6FmJ0{5(;N$Ah?Ht4L$-yVE|E1G^J^0>pVUSsffx?ou8 zKwFNHECc)Pg2-{+I|PKH3L#hjuLJCc;&2|h|5RRSeS{v+4G`KMeXl~fX{EB zHs~6{4I{>F@cA^6)p#$DsCE?8dLjgAO!ITAP@$z4>x^GzZUx@ z%3k{!#C(7lfSU+^g#@CEU0K~kx#-_xZOv&k$kExq`k9rbIdguPdq1-b3H<^rRti5` z?K6@rolAD~swG?NuuA(V>D=h)=&|DK+{$X^54?_0y7!X#FKDp)J4A7Z1ool{A+}ge zUMpoxVsHagZ-tcnc$I;L)Xqzmgj}UGmDvrjQ{IEHgSIrac6eSLxX7ge3k`xL8Zw$BzQ zUfJi^AHE-J3d?abagiST2*d(S?5<*Uo4K#U3kbl5X6V^G`6NHf>uS)4F*oeJt@UUo za>f-AC`>O?WK^EEE%>x=H|&s3K2a9x@8RdE zC^LIbybBSR8iCnmr{(A8bi(E(vkq=>6e>@u62yB}NU_~|)q-PLH*%tDdZVKUW{dK3 zOl@Z-n4xzjamge*E@j2butYB{dG}<>c-ig62sOy;*FEck5%c|lZv=ur9c);*;<$`2 z5%QYn{GQ6fbReSbndckj1*XA0L=lIYtD>oj_i8N79pu=i9g4M6{7O4M(c1~=xzJO1 zVHE`o1K)B@MiRcGK3TJ`3?tD>nDky|G$CCi5M|-0Y>(4Z;TZU{p$v3fRs5VXou7)U zdqPPc7qQXJpNz*ccKcfq4{dRkhEd8b;3?Fia|n$v4G+d(kaSJ5yf|}8s@o-g#CgDe zT-R#9!<4xPFkY`@sV=|p%R>Q-$@0mQ z&y6!3g7gQ8tzW7Y+jq*V@K7jT%WqRy-7?Dz20}sk;UnD!V`BrU%$vCE@&Y) zn<{D0P3IuReu?;dCt>{F$QKHrSzu$vHH16uJ2SitlSo6aJp8i`@j}eqeV{KS+o(t1aW`99O!wkS%@>#rPaQNh6^8*CoU_uDO!GsWm zg9#y7IG7N^dN3h`^>%oLj_ag-1U{|~m;UL-Qe@9sm5Q0GXCQe?1FbJbTyva@O z;+i+vj(P9Dr4yCbQxNoH3a7pMg8Je0xr>_&z&}}dQ8LVf-x(X-d4{%ab-vB%=$@;3UXMxfyK@5GdC?5tUSc>Q6YoLjJ?`*B)P9z7i6xBY(Thndr= zF7A3^71~vbgLbyWQMdSkGbK)#ZOTV4cb<>+>-xh{u#Rju>W(7?%T2M~UR`j)op~_m z&6FA0Sl|m6-Y)3Q2*d(q-QQuxPCcL#UCCW}@74Y0SF?2lHJB^!Pv2*7#ZNQ#=~Vix{~cHJf#*XX%t(rkry17`OUmNA25XrH5A0*N;qqOJ*Usk zWqn@AI*BHwo7yJgtSok(efbv7uLam?NQuLChMVzuZAf_b?n|L4$LD>dG`AJQ6bZOV z<p21Q&8^hGx(K?4+V^{rCya4JJu43)S@s@t7>e7vVBKB(f6$5U< zFr#J7hWtYxv~!Hne3vHR<@)mUBQZZ$*{tZOxE+a16UkRc3BJMlGp30blE2M1Gl4Dy zJ@Vu#*5^)-maW3KFj&*d$H9fdbRP;6%jtAd5kupT(+fAa2?4O)`mRSerxG=dG}Jtb z%Yu<{LB)6rV~#Djv&M-*a?=`U7nFWscy}g>rfIp$sg?}xPDTeTRvG_-uwv27sSU;j zD@B|o9EF8<_@hzm;(=k_S5%>Q(@3h{?sVXWcBM5)E!=xo^T82__5T3zklNg)T~tQf z-&QH^mHDb#y%wxn5$t!75YPKKGJ7duAxt?9E~KBtd-K{!q(~zSTd5(p)W{DN{vB$^ zh>ke+;4@YT#KD9Rh=U0s5C;=NAPy#kKpad6fjF2D0&y@QBw+^=Lfzs2Li`%7C@oG? z1fDlWzSc34qd$)|cBt3+aE+8V(dydIAQk`w!#9ES`o;g}13*F2^#9I4fLMT=48&C) zj@a@0d)^0I)25t;$EKJ+vHTS(&J5|$X=W7sw1t*DgWxD$>|s29`e=19v+9cin?Qm< zVwWq<@WTi8??Y(B&;|Jad_{wft74rz-?h3_-t!0lRtdHq5w&_|X(R6?`Bawu7p!-L z<_0hWw+xR=FdR}U)5LAVDP1pjHn>|Jj*~M3n|wOh>S{g+&FJ|T;p(#(Nu|FE6Mfrw zt!3?CtiBbuBYI~z>h#~YpJF{he*~1xQi*0Oi>mND(@~W1FH+deG@k6`S4U;)y=3am zi^F&XO{=a3&#-)=C-2-vYZ1{tvY>c9+u)lUJXke?&H3o)>}V(01)S+^!o|el#*2uq zxbxP0l)4LjK2t(W@N04gzk7;2cX2DQ-WYrq_$t;|{}IFDhL1mSCZA1AdRnR?ns>b@ z#g0lIH$od6Q5x_$Tr_|2(}Eh$F;1|QFL{=E&namrQ|fv9{YbmjKDdd=Ka2A~t;ydm zG~z%raSvYDTPacEHV-|rc=Ll`&rT=qF8+gNSB-*=IADht{we{sovsSant7M6XZ9U= zDl!zwGdWU{QX5=M3`2iHLCJ()@c7b%69r5NJS~3Ze4`Cq>XEjS)2|;$>yc&-wr2w+ z8QM8}^{E-Fbk(KZX1nAk`~C0myiGI0Y`l;SHDz6<;GwY#S6#R~h?gCiWG0g!6Kc|- z$77|C5N||D7?}BrXjTA*kdhy0S7wobI=uE)-5V55l=WjGIF6!MLGybfxC2JUSW2y@ zK)b;B^M9*F?>+gDFVce0sF-p}9X@cb{ff{Jp+giueLv8`XnnE=IA29r;*stv#^`TK z=OtnIA9S^DwJAMr8*;d7MB%%QW&R9^1*JDxt@sh?#5$g^G`aQ-;jQ%a|F=C!1MtmqBMXO^s%l@#Szgd9BtM~Wb2f8SBYFbFf^K?2%Dj?1 zEGsUsRP>Fgd-u>*hAIwc8*byXeGQ)6pqTa)I11GXR%Be6Fv)1Uc$1(4e!6UZ)+2m1 z(@{5fmV2K$eSib)K&{EOJluY=p7p`E?VqzNGUGFJrP!|mc}{LgJ)}~RvG~d?YL)%27&;Xx`{oI2bx>CIr=kt?)xR1(yJ>&r zu2*!u@ay?bG9ekb+E?wn*gn1Fw3_AgkTUH(Fz5V;bMtkiuSAUN=$%lE}^B}I!g($K$u&lN~(N$a+1e!;IJZcXv|OoN{g*V!xw#^ND5m* zaeM1Q)GI-DDT&t599JysAGr9#9@;Tkd3y#C-S?ou!e81M1a@aRqtNy8oVvA1owZY` zH{Nm#g++?Y$6c$pfY$>S924{R``%YXaBl9-vu2P_2}EDzFkbed?)VhI65pn1`e)i6 z)COI3VL8QnNhW{JqWX85)UFc4dJhI89+Mayn?1x4yDzT0!2y(12d`ld;+ExBX>-w- zZHt=As~#X^hiu#n;c|7|P2WcbVnLZj#%CGk8q_Ti6O|aj#_TX2#_aabz6w*Q7x?&q zeOd1vutAC2`?u5s_S*3Aztqu$O5!%GY@;SU;-v!ub*7&seCPO66$mBm4rzFdGkR1T zgSm^_NQ~yj-Cy^@2pU$~T|e4pj*%{B_`{Uk({fo4Hz zgm&qMI*dQjs2{VP;NB~6(Fz?O=#Delo9(xiMIrsjs^6tm=t%paQOAlIH`7feAO(rC~-MCfq zt_GO6pTS09PGn5<(dIZATDZJbN3S(1{2JkPvf{FiZakGQ5DUypUZc1u!^@{i$imXA zw66rHxI=t{;O0lvXr;;RF6KMNv=)vagtWU$;6c{AqxD&=g0)k3aOh|%WGJ|nr3A(< zN?_criyuNrZ(p~CXU}v#a!0idrHZ@Z!o$;P*gs_r7>V8HDd$B$g<1$9B-j-pgai{p zz~{|R|Kt^^eF469$-Q|)Yo)Gc6VLws1Q}KsXC(&b=zlBuz=RN|0Vae@7JvyM9S$ah z^yBq;VGx>upb~`QARYh&(>Iaynnk$D16%{`I(LqlEJnPBq%KX~M@PKbCE=FHYkv*m zUO+s+P4?uUaVGL8oouZ}mRfR|O}G)k2H(VIC*V@UVA|J_svd99qYtQsk!z5Qc#KOH zDrQoa)>_o`y7xEkow>mf6R~$j8(U*d(7gM9hfiAxM5+^B^qn*p1|2h@TPOF!lbbDA z_xw&BMV<~;r~u2u9iJVs4_P67ru<~lj6S;8Rwp_CMK;HJ{Ic1Vf%$BQ6?%w|uVfjt zw*L^#*V6FEVlnKhe5O}dN}RTlEhsvYd+!l&o-$M09{U@v3)&c_b5rj@KAI_K=I|1_ z1vI<5Wj*eU`@q^}a02~p7JH$StXnU<7Yv5n#qAgZR&leKmWEhqsZR<&_M>ABnE<~q zgk(^i!;5{#rO@-lcrRJY1a&ZM6K%e_ETyMG?|N_Uqg)o z+;U?4N2n>JTMBeBkNdW_w2$WtlP=QgfYlMP_W8uU$$7p>+ev2^4-U&TIxS9eKNf0> z+)H>|^7|*yg`lwe+bj(Bk}O%;SA7G96^g8qSDLn-^MS2Kx{#@gg~4?U(1Z?ut$ zAYW*{KO$nQ9KG)tj)Eh4JQR-rGnf!UW-uYt z|04w9((2VTDuaZ~g8gZh9iorY$OBrjsNj!IkFD}FguW)GLM98qgb*@=2_a+#6GF%g zCWLhOb%g(a%xDnG-h|O>j0W*0H!=E}0dRQze9O7)e5c7O-IAHe^PI`Zg!9_PZ?X?p zucJw4r4yO)or?~Z$Y$BN#v3o!&7SQF@y6gqGe-k}q&K{{pp$#jGkV@#cA z17$Hnrc1`}I&3R!Do|zLh4HgqvNpD?D_~9NoY3XZ%p&O6d6loOsJhE0E3+T?m+< z>cpE%vGf}n;h6MiDEnz~B z#fux5bhcRj7}Y2w`C?L-X38a8zdJ`d0=FeqF-@Ho#ISl!(B z>vNvHa!EDETs%;16d=lR0v*C!X`^imQL zXLA!CDU}W=fCs-@e|r$=z23u(AN;Xm71q%^5eoj87c+r)n{R6|j!n$=!!v-Q47ml& z&pfyE2clT|bDox@R@XLgsD>X@sz>a0UVKh`Lj#0@(r@KkC83y;AiH4XFJBlg^}ut* zJ-5j3IiYz(eb}n2H|GIIaclR|-?W9dH%9Xa5^*Dy~3}DDGaU-&Pbd1 z(Tr)R-_vU{k)?xXc@L|O6AEW?4dE=D)t2z-W3rlPcG*kQ5AKYw6cH9VM4X(zk{@5G z@kWQ>QFZH{)xq?fvNVy0TaROJ#Dg3rZ`Ja|$TuO;o!`glMIq<`6GG4fCWNpaObB7U zsA?|u$b3JT5Q16&yEq7=|2ua9lH%WF0InhYqJ_g_Ykyv;QDX+@DT2ia zZrS+Ewg3Dke{eOT*(9gW#6Of)UzCB5^iYj)^zyEyLl zyip3Iq+HzxcJO42aSPpAFQzEESS^YJDQbaK3!Dj8tQ)XX<1nSVcooC1>Mt8JWvJebTVg_2^i66c-uKCgs&Eu!?^-w3^;J_6H&^s539Wf>ENN~NCJgF{ydeKc`BLpEG&k$2 zSurlYS+yJ4-8)S)Q^~Qx0wERyQ#jI%$vOEb3yoU=RY0kDnC~6m7sTkruNsBE(s=X1 zDs~+@1a29A7IapY_9U?fVnJ!Rg3bdB)HS)dL!-m*5Rezdy*2yz@MBVyi$*2F>FsVF zb2tjq7Me^k$GcQv4=w2|g7z0y3#jz!#sgdQauQZ0c&&lbFK8zhnvUUiG}y@Za~(Nl z=O!kfG8R+__!-f~W^ zF0+cUta0fcrY(1KU!Q6=LyZ-mr9d{h} z>vX%!UR+4MZ+G8nf+Vh&zmTgP6|gzRz8TK3w11;4X_X?fs?SLh>_rIa6w?rZP!CK9 znR^BkLNZ)1A%vq~LI_8}gb6GChTm=NNbz=V)Ha~tpyI<9 zPnnT&O5=W{&ps{sE$N2={qVVHfrEHSsASiM@H{BVZMb%XO>>p5dBuhkXHAXCVxb>s zmjZTFWT(Krq_gAl`p;DiaE_{X`p9tesolrC`YEO`p&rsWo{RJrk`E|_qEoTt>vK@a z8KT2_#7HS0Zu_~Wo#sD*qwoq|7a5tD3|_Hd68kDXxavP>RD&&_&9F(h;pNW202E|_ z+l8y!)xZ$(aI?@06GvZLNri3g1rF|4YszHp2#@)K%&2UUhroHD!Q+-#L()o^%Dt5y z1j89&#h$^K1K$gUm$KyE%IO#au|WO8Rjm4R?iGCu_Mdl*6o03FD?hXHYE!RHbiULCmy^KkfC@Ce=v|ZD+tx?G7QBsocb)X^dY5h&e63w351X1GX{B_f z@eXG;wJahlaR;74=q7_G48%UXLRLLIZrGU&Z?4vjJcRw(_}e9jFi7mYGTitcFhN7P zK~Q3^9Z&Rwq18Ut*vP1~S< zx85!!9M$HE)IO9lki9)M)I=EQrTumibwjc3^dLle7C0V&aJgJ5!Cp5keek7O;}_eD zhxlHY(voh1@52%OYBgD%fo6em^`CDM@46l1-WJk*8di?kYBDU_uDP!GutE4}{@hSA;MeOn4*1L0I-5 zq{7#dS;Bi-iCv}@jcL5Q?(1y$B9e<}yVp1h0!k4705U@WVopH(!%YU^+JF8(Fnn*s zT8oCJE^PauZ@0Yz_4J8?+pb5|Ws>IbfofH&IIvijVKVN!iy-&&>{~wf^(q-ThXN&B z;NQ1+du(%0aTVE*LNlaYK_Tx6){GJER|502=~uUk(7Lb*W>q^HL}nZH2hw%8ZjS?* z9m;S_`iQv2vamxd(Qp5<-_Ub7vH}!fy%+dMeHCj$#~+hE6?Y`{sYS3r zldauWAqMP^lHIJ#e)JMdw-9}x9*a?cz~(5jrf^Yb42Dh!nKIMJ>i{b}3&WvZ!3+N4 zH_$H7sl}_bWHpGq86{P#p+-(DfV{(9+tROpLL_3GEXW>tN_RjL*rn|^LCl1OVb{|; z{jQ?c0~8TL%a)cMA4dYZbfp449xphMa}!)H66uI}bBu}x)g!y!UbZxbCKTT^@e zlSo9k`b5))(nw&Nwtxn5%~VIb&*$TWo0;}>Rv8$!tiioaT&&S@S{Bu}fM$Vak$;Wv_o`T z&`fBn_k3=r`R%F2h3%h{<)O3-lg#*g@ixzc*~O^3S@ttLeM1g>d9DK?XTb$iFqJ> zVm8}s+DD!8!uPOXNR;8s^-CZlxpZ0ybSakhz7#jVBxCzi0#YK59aJh{*$AQA5^mvLcr zW6_S0RvL_&Mnk6(CG06B{?ZGZ?1!1YPz*iAL*WkCJlcMe1ux`DA1cSExskOP_|ARX zPDVe$dF*mP29OobC|XuX!4P9SEM(S?@@V$i{Ug$KJ-HLKP?4RYA)r_s+;UyDt7*>X zZ16q?ZZYFee$Oz$2m0jS(B8M#rlxFY_U{HUb^~=S%@>zQtj6{quv!Z5!Js`eaf&F9 ztj>2PDvr}t_mCz6Vu3k^YZN!2d>Fp44(pHbsS>3oA4#zx2F122%gVQ+*U*Ok@Qx~k zx$jQxF`|iZF|DwK&F{fXx;$x$v(6{vXVScPFD`WZ0UU(lU_z*`2+733t_Yzxm=Hp7 zFd>BEU_uDR!GsWsg9#xN2NT{%aS#@QKpup{{{aiHc>rgd@XO^8td*KPp_BJ!gqPiD z?P1qQ3Q|r7f@u)QgE)wr%*{VoSQB3?(MrI&&c$+$Z;O%VjWL@f8HbLFu-&&pZ7Vq)B&4`+Rb96_ ze!T=ROt!htLKv0#Ek`$ARd-Pk z%|icZe_p`d;g`UM^PLYdO6hO?+})fq>v-awWFgY#@#u_U;#N2ly<;yiIS>mIE!U!W*3ZjM&Agwm&8Svt&lVL1W#m z{!)epX`1#7mBNr7hy^9?T7|zG`(_ev<2^{k8gh_|<4Ic|bLjANN zIVxoh4RVf-Evr&ziF+eX*$@$x3iE^g5p2Zn9;y})3)Bc*-LHJB5VSC|B|<7pUne0X z1INcL3~szBB$q2lS+{>+)&NuY$W;SmI#UR^ggSgM-%*4nyKH4U=S#*ElM{xcxX!{@ zpm9QfA48ET`#b}s@(-S0)~DQGDsY2TVO1T4a!Z)Q{VVHvN_55rd7HjzXtL(G!yv6)Zc*d+x|{>&GS1ilr7(_)JJHN`M$+Sy~WN7*jD>$%9GFyzecqx5hennb0r$GyA^k4 zy&wz+6G9jcCWK_-U_uDP!GsVrg9#yM1`|Ti3?_u2`68uc zR&w&sW2_%3hy|7Pum9~w5Fw-=ug|9c2bjIa(VJLyjl#9Wxq%Wv`}PJwFqu!Oe^VMrs1#38C@_yQD)KT> zKIJ5hSh>?S0Owld5x+g^#Mac!)7DqcAHdG3D^z+0Yx^Vh)qJdAR-X{mgQvtTJ{G#L zw5+7lmnbaF^e>R_5Yf!OvK<^nEofy$x^oVkF-I2OP)7N)afs1pD89qfjLzM8%%bP$ zsmGMJCw<8JJD^#h&gAbnecMl_=TjJZc~9}DFDvTjd_IZ>!q4!}XsZ@@@kujDfHedv zQtETho`?nfj6v;wpNSxbb&ty?7yHt+tvbxZgx8b|2nA{u{)Un=$^SZ^;0lAFALvQi zs9fn3p&_SLg3CsizvvcmnDQJr2?sY#T$=i91kTqLS=2_VfjBuivxC3+;^=v1Fca*o z1P}^J4|K@-LiUra zq0Ym=e8Dz2%#&LgqiJ`n0zf(Rjg1WX7q z1zFsjj&P8C^QKwjYY@H(;n#k?iFDU~24OUayST{!T(b`g zv~=iic}qt#x?TGXmuxdQgO+Qr#Rf3|APB$7AN-Ss9~%zf`0eDE@ttQqRN5~^G8M$p zYhp?5&C6c8Z&8U4F0CY9Z zwABwtHSShfpxWnDahxH%?f+CfN{VkYEYeAA^EKlf4zTZ|;~wIQ@L7r61neV+q_O>c zu-{V@N76%!m6@`M{JWrd_y1{E>wUDRB5lNQTUiTQS`Mr!p5m~1k_uGbb&{c3Ch-wl9ftp1CjyO&dyZYrfA=y6=d z$DaJ9x1O8Hv@wakF@%*pFE>_Q0%jK3RJDbP{a7}mj9(?t;RlulV&utp9)I6DuF*D1 z9{@gxLpywiUZA)9>gDM&oTR~QL3upy#>vM1%UJ+NesY6SH5B zC0QVf$>ZB&G*vj6aHWhzIb*r^oYBUt5Q3V(yGPN&Cz`FO_nA3KOHsbXD zd#D|-CSDGS#6b!;rHGpS8K^}mY5KqnH@Lt1`)C+(j~L5{ zsxlEn4PLA&h7p(zvd$Vm(USjWUcaK&AcDpa0+*j+N4Gw#Sjefh2b$&l*C_s?hY{aa}Hi zUzAUzqR)SN^(~RiIcdDiFt%vc&-o?FMOE6TMGi-C$Nz1m8`d;Z0-Kcl(D@|`<+JXG zi|}i~V^(E@8GW(F&`{y;h=%&L|Dk<+h4Ct^KJP9@B`Rh#QRCwwqy-#2-p?LhR;Iur ztX0vCBiT&`(yRfMT-o@$s-p_n`Rithtp(jRj|9x2Dy#k*%1Yb}gQ6^9h_Si&opy!h z7c*o8zRTG5M6+kUwReiJcYsZ?6N05*_SL506_yDOT2d>xvUDP)Sr9Geyq;qutP!M+xF8%sd4OvM|sH6#2h+b+q4Urce9% zzR^zjcNyLzy~f-XdM8oIG3Zfu5_VB$-;hoCcJa|hxoBqT*DV239y;yVX7~ML+(c?% zCAy{?{+;5YtbXSCh8>2F9$%{Gi0rvHgyrw_4hSF44gbklL6hSvCNy4>ZH&z@nPaR@ z+WW05pxqL(lnUkb)VPDS9R8W4D;uyT%keY$Da&GYQDt2EU-C^Cjq}58O~qxA)KyXz zC3)bWc`&YG`LjN(6BQ-1DVYNvx&<{@(a`DH3~asi3QvM}r;GXc&-C$JQqtNt}?48NE>Vio2EP85tQQrSD@ zSQsaRIIF%QIL-S&EKsiged4{4jd}QrPNl0ylbo1y5I>ytNFZdsp_VR-W?-)Q+5>E4 zO#fbJBZR-36eFy(2Vv`CT{Qm8|ImcA{|zy3Re;pl10WQXlNq~f>C-blH9k{}8sq-- zkB1d11OhQ_=0eT2=a^e#(y-wuJgn2dWIj$bf#FzJ=*VtHd|$J;GhK_3NcRIX;Jza< z(1oC`^%}yhr4Kat-i!P~!z$^&q}Uaht$p$6RbN5fK02=cbOOgPBpYsx{)~S>Kj5FR zgn=P<85(-mA)pxzlQCuzK6j=hMHC-`a4;bR;b1}t!oh?Pgo6no2nQ2F$P6ZgkQqz} zAv2f|LS`@_@XB zMuQL@#C(9*hnpCE?O(gey8M%{rtxWY#qdyW5m~sdN8VrTL2jv{HpMUa{hI0aA>P

2&ZI~dm?@s*o6B`^kU?AA` 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�uZz|%g;&n_)Oyqo4#Wm`YMd0`>TDe{@D|H3WNfyjQ{DvV-$5a zKN8iTc%DeYkh_m6CQa-U65HEbx<9tZIK2AW4G+12CisymnV34m347=sZN~__*0X>& zqTCy0ZZ17KA54LxenAb_6@;soVDmOOyF*OYyq-)%en=R=R@#x`3?fgmMKC$5Qul(Q zC$iMD_Iv!#{iBuz(dr^b8zxaxB~X~<8XFx_MjBZ)TgjiwX-g;R z2K74MTh9-+*^gn9<0*IoeIl3;3NtVv6lS?<#;q!`y&{S-){Oj^KV(8)Ev%gP*323a zr}(U=#jrpNS1=*eJ%9!ab>!tnqEfo=zS<+sOPz)c;DrX(%$=a`*1%FPLJ z2_ms5>uIzSa`})pW`y-*1Y8Cfe)^Zrgdb6E%fQJ}VBle|-!k%2w69Hh^h>&`<|D;* z$+?{MNnjK>bGntMmzDd8f|TQJ!eg*)Li5DG?wmx~Fe9v9rWmm)89$f&#}Xj1sO!RH=T z-$Lb2K_cCvuIz{hR!QCV(yi1&7Ta$McBmrrk}6dWQxzjdDu z$;9ckxVu5;Tm9XX-6kLus9U%+cX86$%Z^cZr0$V#hY7zFL>v+ms9?0Exs!-)QRwmH z09esxy3ki$%PSR>x{plkd-n{bAFpQS-r4Y~SL(K*%*^dbSiY^xST%};zRAr&n(D94 zb6%ixa@jR0lo}!VaJ_Ao(b2L}Zh?n**z($iCMpC>uhy*Z^28s1*Hgln=X11vZwrqm z8MogL%Uk%j3thQ2{0voINDTMCp9-N&6&)^NctfJe(pUd>cJMepF&H@i@U&rgV_q*N zR{Vlq4_Vf>e>}CjL$9hO()jFjDNsWNXcnkjxNKIvH2&c1IV~P#_lnO#gVSKn@68w3 zcv#OU&6cOglOK5iivr08PB%?a69^!Y1boNMeVLwYjkC9E{eO%J%uLRG?*U?gjhS3Q zIHjNKLvKbgni%&-XJ2&rBZtbmjxCSjs8ZP3D_=UZ#SZWqZW-uX?%wR$&nZblmGJ^@BWCjyL$MC^~&p1gd6xdoG}X#I2A%6TC4*uFJjuv85a|&S4WFqZ0t?41WG+I zZT7&M%CNhz*Q+^V=V!k7HFKF&LBT>Xi&8FYzD$XaQ59k)ip_ToUI3RQXxj))6YQ__ z6pGab(8PQb-HOKE$jz{k^!4%aGUjyd1b+LVRJhDD7mu6iX-Pa>L!ZOd`;QQGpMOGg zi5@H;=7}lf9NwOK3Dn`i=8FsTbNv=~cJIcMP>iYU3lT&M8$RK)`uNd+J;4lyJag$6 zZb+j?(r&*|)(kVqvx}SROuX@0gwLILIq@p#_=~OaYrBy;{kTF)jBh2RX)N})fI~cB?ZOvcmBqULP93@) zaA$Zm=BB*Z{Wm5ImL};;(KBmH=dys)``CXz=W|DnuUdx}wq%xYhiVd=^e#7(Ra zo!$)!fTdl32n3ucE=h2dHW;Jt#mu+bBH&O)DnGpY7ES#tx2c;RYw4>pcq%M%u9qRH z{_s*qpNgy2(`1gddK$3q*L5h@sx#mpSO9M!=<@Bquyd{zJ7aW}G&U%fpNzj?vDq)> z39Wd$@hew{4QKzUKs-Fe(tNEtu&7&-1CGar@EJu+E9$Q?d!+gU3SZfbxcqn}pjDtY z=x-<%rZtkaoJqVBmHzDfNPj{->OfjO8@3Ka2I(rpwL&If!^f(Wro4#r3D@2nYe;XV zNm=c)zI?q-aaxgsd}c&dT_6;wHTfILMrK8DaA$_%SNogc-Cy`#h)Vsr?#q_z0{XHz zsK0z9;UNMYUxdb=BhWV_01FioBKpJg-W$Hz+7H%xNQH-2zbOiY0>kP*DPty;+DiKX zt4*z$%oCpFDQlQ_Hx^Mklh=U7yTq8f`efi-;rD#TZ(d{fr&}r%Jdydpcr0ld8f{#s zfu*B{m5y`@OUk%{a0Oe@qaA{iNN-?9jVCyn@KEYajlfTa zc+H@3!8c7Xv4;<-)jPj9eTkG|NO)p|SB3To%26;O%uj@J6zqvmj)DoH90e0XD_k%k z6u4kQsBr-kLWdNuJgUojt#d(KFIPyRG? z_2ekgY_f6?sG?!L((db=%|E}#FW767*`3R0Z2DTIltE;ufu2c^dAJ=!p*9)w!`i&vMoIDBqmQlBuwxU`uW>AVT zHTX79hpBGdb$dFdf~bt{KJo<~!Wx~Dah%`LgL3DiTcHadpUBY*9*XQ@Bx?;6#5|EV zU9c1-m#BN)>9RyL%R3!TDD|TEMh$*y@ZRd=IDTySi3od|m-Z4+Yzcq)wzTwZ^C?$! z{lM?cqiI%r2wyabxuUe*_a}XN#qauiir&1&kY=krI$WKH zV0G6L0-LpsDTZh_l;`<=a6W&l@@19A{;saTPTU>G$;#>|e!adou=L<%vs$-1&voa^ z_1%2B-j@Xn9Kh+~&sFi;GE%}`k!V#bs?{7w0A)CH(bBC~ zqv}2bS<~-6f2B||VL_ff4TnG6`A|$aPJ1W=I~Af@pY(}1RB^gd{AfK=<9&R=rgiJb zs09ORSc-v!XDYDLUOs)$?3UyKgs2<;u5#jc{g0tcQF4z)-@P7(-z0zWXcCA8T15VZ zomD;lH;z;3Ce!lY%@v8bi*IB6F=mNM)sTwZ^?#+^D+0FW?Qck$rk3G}_OGc1y)vIg z9bCML-e`TN*1YY(E7Tcaf*PEwmtWUA&YDT=wqFWof^gb|GP5|eBWCZK{Cqq~Mc(Dd z-e2+r=2!%xzH98+J_*UD!*$PQd9ImI09SwX=Cy6p!QNBvPo_XD&{6xp&7#BO-yrUA z;QNKWGN{?>ncA`=&kz>{snIq^<3Yh-kbsAHnX;P*pAxt7d&Bb+ESAjAFo$UlkLI`< zp7y4Qm>&Wr2u5e(-g~QQ9MLTzm>U1LP8re>_A3PM<%DGRZAsT*g1ubeL_(7F?x{3F zkr3ig367M==5m$&JHa9F1*=Sym=_6k4wS$P54OL6GF)hCWMy4U_vOu!GutRg9)ME%vFS62cs*j0%0^rsr&zx z(ID>PI{R>i(M2(C2JfaP{cC@^j4Iw<#QXA1J@-nx!3@AP!|<0CBr%y-WG~zVLDR(N zETMO)YqIO!HpwO|9e%6h;tEz{?ZB-dUdtFh8$HYsjl(5Lk~AOFbK4*2-pfRkX}T9H zj^yYH^Dkf5g(LCemn-!FzWlsvOFoWrXi_cpcx#>jLF?FNf!eWvEO{-{Ii@IwEVfuo&ME6llL_WtI0l5bXubnpwFq-kPm*! zj(>4){>J-(X=7j%*d>0T_TZBqFZ?odVL66gRO=YY()|}ASfpch#3jC5Fy~HEK~XJ& zs)6%kBaBZgaYM@ff>cd5dvy|lq8MIvs9}b{k?iE@4Wf&Eyp8XezCQdNpNOc^8YyxH zTy`ODROa*`5LkB%UO-+pD`Nd!GgeLBsAZ5bewJg%l&GrM_p!_`69k_Okg*{P+wc%N z+m9roQtJH8l^6;Unq3y(1?!A5&8TR+44$!jhGS<{$CogZbFLxH!zKQ`& z1u8dx?v32BB#WqdH~Tv=6?cHTuJ9Cbp^2!9|9$2Ox-k!X6%VoVG~{-5?oK3{igu|M z?1ro736|1)hDIlKm@rEF0=mE~`T@EZ2}@-WreR_kvRRP$ z?5s#JOe;A5B3!-6jPPP&kmC@pI#T91zwt-s8oW|eE0K|h%85bZbOeBK^U->=QAq6u zE80(7!uAZJj@CsDX0)}z{E;7uKY#t%f&rtsn^Nsm`&r7n=Y5|}ZPfYZ|F8@1){9g3sYn@H@hvwm%GX*j-Eo^;fKB4yanF%PSSozEj7XinK8h%r@l zU?&0b=4WxoFQG{%9nnyRg9)Jw2NOaW4km;$983r;!@-15*nT62WM3UZ;(8Mon;_{-5`}R2!%oH1&DvRj^S4t24XKjMklVb zHkS-X6o106%Q;#S`q(sHgO zp~m>>K5Mr0Q#igYbJs^q=`j2pFGC^RxqbT(Il`1wGy1hCDmBr28%;$N>P<2?CVAPKUgs2e|7sNF-r)kSFA5dJ1oibZ$dLb(ayS%lL|*e zH{-$R_bN(Tr`bK{icEDk=3zQV=^cfK+(TecABNyr$NeOkN9ERE&W891G@vQ|o@y*} zu{V&VfSs!YVtT5XbAI*8Mw0Q7w2o854_fx|>t-Q{YFcDWd6GM&AJZ{xU0XarO_{{I`Iq2xRh#ryusdx_ov@`m&QQ%>C6w%d#ei>t}0N z>q{$9t3T)dfR>P#ejy>}u%~U#aY55fXJmcKShh%EY9KeRRcThhRkdU`p9fe^ou*nB zPCyxCm;N_lnY2OP5W2)`;t0b;>6l7S%{X~#uQ-l>by zXf2|K^e}Y$SF2zDmn`F-1#whwJFEfQn)u>&UesNam9c%Vw=z-fu(U-3d^N}V(Pq?L#1Qu?$K+*ghl6MEM zhQcjzAK$&lu%UFK!_)nuTFV(RE8)heF!FC`p$R60vgbLK^Y~_0;}Y=_|4ptJ1(Pwy zk-z7NQs4cco5rqw@y6gkp+SUDR{-`zs4D;yLR|rv5Xx{cA(Y`@!vFLmNUNc+zgmZb zpbms(|Bk|7#qKo=+OD{dn{T`fuy0H+`S{PvOlx=CNfF&szXIuhXD_aU^p%HS=K%gm zY0uqD61w7lo#mPjg$QE|dxsF+s^H!1q{eYP^u+uy9{`jkPNjx8h=y;LFm5`0D=-iY zbJ^BLO_9M-fa9!Vyk{E)dz$HH5o_9~k6k2UTnil^$Jq`~N!CFjG!9L(L$-UsA@mC< z`ln>$)$hvKRMAtgPpo+usuD~OGRJNWN_}tOW-~~d1!95L3V$i?gD?H1tDC9pt-jZX zai*x?CS$5$Be*3cPQu5_VOoN~&TvJI=cd@ksKW+v;bD@Grbb_%73z;vqy_d>k=$tR zSO9j}fDZTl(}j&jU)Ff}5V48K`{xbVV;p=>*}pNoB0pLZQ{u-uxQ@ zz&cppjOI#qO&brFbewOvR;3G$sI{6^hP6>zdOd@JK^l6Mw7{m#c`Zg)c+#Mi)+owJ zM^ZTMAI}1%9c3nS6HQ0W_!ez|c7Zbd@0&sK1Unt8+tS=Ajc;8s+DrpE=+U|7{P&y}mHPAT9vBy$p^SN-9ja%9KkCg;P_@(7aNg}9x zpD-Gd;3ue{Zs@!9`XSvw&iZKYK?qBH^-d397hK<_#lX9xRCkm+SRWKTv;5ut?rhB7 zackMC94}r&h6CtAu(b0BK9-5WQ&9jL%NQnG=xgQ@seTc}&ueD3g=$5SJe&z%YE`RL z&KzTugE>>XG>&s=E0U|LJuG@|AuJkatR9?53y1%$la~wNuUWXH$XW=QH$6(mVX{xc`p~|(bu8oi!&Iq%s;H#@+87Yjc1u_rY?O$GHVqDO_u#H5dZB+mUIpsSp7C$M z7J`1i^LFAAIUOX=B(1~5c6>x4>jt-l+XF(1pX!JAfLUYk)5R_mb*-ii+-XuxL@37- z;X+@T=NU^!Wv1;C^>-^r>As{IxB*)T%E+dgzhv}94){@=<&}E>WNDG;4%@+9&F|=c zWBcOIfGH?f|27NjDTxUmmC=-2V&}n{u2ic3GOvm*OASg4i*9^jx7jc}#EDTL8KFt| zNu)1)yH(pKX;eXkuvn&fV~!40Y$0{dm6ogN7SUepZ#q`mz40UzAc%l62_=Owrx}d%a*q_*_tz zOReI}WDECE=-LgQva{&f1M;D%fVj#tevV&1f#D#@@mx0lv)O20!j6uqvp9YM?YxlJ zw;E%rstrFEke&ZIQ5;6DPNd#x5?`GiSot-?PZrYTbk|Vud&ig0N5$@(yJ_rUz|6Z5 zCP(k79Zp2$oWDlRZ13! z1?I)CFkEt>5RFHM(zCf9aeF{Xl)EN=1|PR`35vaNnJPac%6sQJUnDi#2hcu$uFWa`CNpf*zx3Ae zrgs%K6!u_3DD1(6P}qYBp|A%NLeUH+grXTt2t_lP5Q^q-{z3N1_s9GRjsA{hQv4M{ zqR322`8gcEbd-@tNgV6bO+2)bF@dN8j z3`;znZUVO*vxO@U2QeqtLHf#HU*~-OAy6uu`eV7fv|`^@KS?v^4Odmcr;3~R(LG;l z)$mJ^tbPp-(bf2Dk|w#8?tPlKFGw*kHL*Ld(;G_;(u+Y>c38k-A_IoxA9Zn?+MM=`8D0qI)LDkh+P3eL zteK-YC^7szVNWxwXz!G^OIimB-rU>1VV3Fi8eRDAg8vx&jZku93SU70;`+UlPsb)p zeR{vGY*!KA5k;cPtdnGCfGd^sb|RQn+Jrq-x10?s@F?7>A36Pq?}tj%n=`tqijPUP z9wR#+&M}M#4-YZRP>isCJ#XKEg^`6mqiz;@$Nm$dTyeLQR?on@hxT}|ko7O^ToTdj z>{6LE*gb^!FixuL(iFd|B4DHmqzw(^Smz!9=Zl%;J^^l{qlzN=cwRw)bX!$QZ7}E{ zwm!9#&hN>xfC4Abg)q{tVBU(D?b}|XZd`9Oo}6_U*R2Av$i^)_^nuV0@48rn<+F0_>tzu|k%xn2EPASZRot!bh7OYb(TIm~+%z#*sn@AhA9HVu2cl zOLG!p6P_{4q#Mtg>Q`?spZ<)Y4i{%A1;Q$8Oz`WUkQtF<@Eros?t7HA!Q*{llD{5J;1 zOAfLU{cc1^Ush9QiD_a#xTO}{R4R7M$_32$gNC1x7}8rcD0N>Zo&Btt5vdz1iqdU% z=zHPS?Q?&y0kJ?0!{4_M?z2foE>bg(a?;I`eXJp>2MK7RVzP{Mk}Aw26-5|qfM0mP zayuPafKp&gpm$a}=L;TOo~)#v3;D*O>g(U*JXA3B;1!0ejOOg$alcVLUF^EJpzi3Ib9_9@uWxzNt9(HnrKk(xefRdIT_ye_;kFzo zQow{zG=mAD#03*V%WE(p)MtPRp$rETLKzMwgfbjV2xT~!5cIJWe|_YImby%4)0PK0MyVqa$vu6%r5k$;(GtQ9Fl+Q>eV z^M+EVc+##3aI(nCX}VO_^B^b1jOh#mo5Qh`MCvB`byZLmE2aE}nDvvs_r=hyRfxN% z>08Msn%TpiJZmN?iN3?HNp9dK#_UNO&Ew}Vr{!Zfg)Bq}HQ3Q(0p%7YISaWs4$iNT zk7Q{tr!Ck0{!)T%QjYFVclg$t7GWmqntYlk?wxK+hL-yF8@d_Jn5db zmLp|tn|fdj13U!SwQ4iDGHj*4zN@Yo*h4+)WApxvn50o9qmJdx5@UCuU9edby@1+d ze7oh$wa43>aXRVmFC28I2)1k@mI~I_rOKHB7omC<@5BK0=bd`kWnt;&idL9?n#a}32IJVdT7 zD>lER{}qL)3(HD$7`Kq^shMFz#lmN+d?0H@N3Zy27QGPZ&=w+c=hiMPn<(uJ;fZ5`4eBakG*NyG%(T{JL^^_X(8Oz~}Ifu`9 zxs2%GA>6kgn!Y-QBcY}&SAg^3s7xGme}{OdH*Q^ny@s~Y8unvW)vR)Y#^#8QkI6B4 z;_peVOEqvv_4u0~9HvOpTlbXT2d3Ty1q@z73d3rG4>+EYMzytI+<$A=lGL%8h!r>O&?kv#;0JK11wH1S3|GdpO_w6)?gAyhLy+;O?>fiy z1@tSB9iHE}w5{~L3MD_L4+ti3S=rQ-kC{>mJdr>FN425pBwta}mq2{?Lb z&350I(V|Kk7X0$Y9_T@2D{^xI1F>i&C8b?s9N&)E_%_yA-D8`m{JLt1QjR~vCSY#i z3c{)EviXqlrjS0j-p7rth1RZACy#PpmFcjfnLMXz)gwX05ObA6dm=KC^Fd-D-U_vOu!GtjPBb3bI z;U6FK&>+P%K9avv!^cQX9A$5uTHbZ|CQYp8mG@x)w8O6=9HdePAv_3WufymS5P}#0 z5R8Jj3y>oII{R>i@IKFI2_8SjrM}rzV9sTnic*bZvwr1&{(ncf84>!N+M2O}LWhfY zfc4P(6{(K&Ob*Ijal==LKXi(LYbG?01bCe1lEO9{mGSj6;SkxR7nNVTtz>*I-8t%C zar<+$6DaB~lV@*4L+ac7Z$>YVyf}R+zgY$1Z)oHGNHB4@_r~gO`Ja=x9A`&+M?W#6 z;}Xa|azMgKWOCD9zJve;4DM=qm z{fNtfoAlQRr~Cpi+9x`o;m^7Hi26c3(ZDGeW1TC)wTqbmv+LX3cw)$lA=p#ex1p-s z)FTRfuKvT%j*%Biv@QG*7tDAPf#0p?Y}b5&BgL5-(>jvkyCrD@8tZ<)mEg;G$jP&W zFI~_iCOw0Odyol3O8X~$_D-VNJ=E8r;e4|fl1N2NzkKw$%92?9^V31}aut^*U_q8T zySDk-4P*kM7n~b<_ix#wM9VFF*Yp>*!a2pKzi@Vgp#r*OxUP>HMr0(<%dybW`)~DS zXBpxtvI0e-s(j+hzUALp2G*HLht(8Px(fdv;@&c>s-W%rCZr{#5$SHEJETFnLj?ip zP7wtJq>)ZhNok~8x;vy10qK?w;a$eNFFx=bYv0#>JjcV={b!$hX00{9|2cEctN?p@ z)Q(5W{Kz4I_Bc%Z0cCC*y+ zfLq8eBT>}523TcbM&kMMz}wM2Y`uK{Oms|1=0v@Lz$URB{(c2qBhs-tH16&X>=3PQ z4TU)sZYz5YmCPeB;2cYPGHb7&qIZQTo?t~+UIp%ooWfTxT@ZpQdXUlF2^tf_i zyXix(#YCms_a@b@fM!9N@t00W_+#tXhAnIBbvUK3O8VKwTtS=gE8u_Tm(n4gnb{9C}uran@pGT(dfS&` zRgqSKP|%q>T|3}fOUdx9G#MOocn7EEdSX*F(^0*R4C@@*5GtC2BPU@bqK;W*kaSh2 z%il;z$MKXrsx^yUWjk1cd=9Ev-Jpdsym=Ho{Fd-xh z2NOaN4km;k983s7IG7NEa4;bR;q)UciB4t#KHgLAl9#c2+d7w7Zdn+5LZ6ksbGi~8 zJ3+_{CWLhOb%cX38U%#@I|$!oAFg3EmDQQXo$T<-ozMw}^PJRBVY6_yYZwLb2RAYL z+JD~!;cFj*_=B6Q%fDPJws6LZ&0|xS^mfEDC944Q-3RaC)Mv=~W@%-hVO8 zxWJ?Q^!#cu&9rnJ@Byy6%>PNNPg>Xbg&G6X3N)zuGswKU-H1_vT7cO*@YG(Ihf-P^ z$p=%W53jel;uoz72?j9#_KaKEm21R9=W(Gx&AEf`vd2f;hm6*-s%#qf7G!||1~zc!>d$#+|{uvZs7_@jIjp^trvQO70{hbmgGa9 ztS{8CB0pUY!rJpPp8Q!~`w*H|{iRPkFPCJie6nlh3a-*-f*SKdRkM7>MJBmeQOEon zt3hA~7LA-#a=mc@VWitqV7DRfQ+dnc2yue>gg}z9;Rsp;;2bV+WAdk2_QIS!Bu#5* zGCBTDiRA;Vsn~Dn>QFpSoAb#LC|g zJD^u`$M7CBp!?gb(sb-dn|7B36w|J795f!cJ}cx5nit6dRHU$eoH_EifLD-kxm(pE zp|qv3VE)S*ws1ZvYGSH{+Emt)Qht6_xDsdL|0BtA9R=Hx&U*ilsCUn`S_7Q-J0b{NDvCGJ3C!r>Vrp)EZF+6C>Li3R)1Ibi}6XPNtz^t$+luqE{J!y&L^>|>oOF$S1g zK%w|EQT*iM-G~$-Q*_r7d8q*M+u|6%Bv4tNcM@a>nLt%#_UG1+D990Y^e{&z?Vt@H zkr`RUk;IHZcmmfZmo-&?C}0BY%|mS0)sj!!2)nF5<|R_;+&yhm>YM7$#TB25?X559cCWevlt{j3`R%iC(l8b6VIv@t^^?T(>yx<5Yw`c%K%q zMKoy1gjSKwr0^o~_LZ6N>z{{)uYfKDGbYy%{$h8ezf+=9D@$I8VB@&lF$I(5l9DPP zBMEQOv9cOt9Im`As`+ z-)Hxq%G+YMn%~aYeQONVNIm4lmrUd7^?!`Pt}Jpu|1{RDN&3kcrOERxzoz&Zh5+b? zw62lRLf?pbb#@r1uFR+U>G8*t=zhpN4CMctmkT+9j&eQrUG z%*6}XsuB$0M{7mHQv3v*gaV!^{2i);os4-aWvacY76>z+1Ul~TtoXm=%fZJNvz!ll zio(nf9MPtJe(CRx@M%U>Y4OQhH&y06?Ey!xZcb6dUV%b5k(X$o<84yO&=g2c6#qj-6z0>1Y%PYk47#74vMgG&V>A(orxbyz+!}BlnEu< z3tp}FG7fI>ijS7=*kCS_a+Q34bdWbyEH9b{Gz*lhe?qxvhRv}$y`F)c6?;j~;+-ecO0M01TXe%9ZB;PTal)mZ_ ze7ZFl6sRi^_Uqu#89i8Q$cQZ!hy`WFzoK9$U!MN`33ANCD(|WE_vhWK-ZGh!^Rm{| z)eogfW`RQr>TWUYO6H2HXYq#K%YVT)D|_HVxWpyt%hdw+>4Psn^oGID3bj8s^6Qg^ zgNupUiutK$wWQ4Ou(!ovDg|JT6J8$z@0a_?!crmDdC*b)gpjD)@Aa4V;lyV-J9@Q7 zktZg6mq|doKn=s6%VmqVNU(*p{(i}O&hK&hRC=NFTWkj1Izp7gd(0b2r+{t6>cWqC z_GX~9V8~h4sO_nZU(m?D{P3-^JKo`HpDVczp@(=7>XO7)(uWzI8Fz+#n{?Uz8!m)f z+eE)x`?fQnXEXpi(I5I=j#+zCrL>pW&!H_6DvF&27f)B>l)TNu)^_c42TDyqZR<6N z(^Y#WDKk+ITy0nUWTa`5PZySqWhLymez55bud{1YYS!cbMokBlP{Q4GZ1 zz2=9}&B)Y8-4DMHTEP)Qn4$y|r(^o5*QIP!>0-S5K^P-Tt?x@;f^L6*&l$gNi)09! z!GsVtg9#z&HJI=}jRE2cOT-es^F#5Mg7ApT!a`Wk0Ja^agOeU0&UDn3|RecCU%me>%NDl3?Z>PfDy zeL2WXJBa-Nu>c@x`b~`gH+)u$nLTKT+H4)Ar}F znBwZAz7^V}Rku(yV~7m4jrg6~v2G&vhN<%Br*D%@EBV3*yK>t!m(OGQk8iJh;{8xv z49$r4m*I&4rt=9dTb*48W@s8zrR3 zV!P#4fz^VNj%ed>MvzxR4lAm&48($xKzSSwDrfQKSA1S*AWD6@@=NE_-5ttON~5>9 zeQOC3z#qAX$yW!t_~1!CvY?Mwa}LE@qcv$jV`A-}>gvf;@Mr?D!19v6U8rO*53lW# z9{7v@VfDJ^Mx#rh>RjO>f4Yh$hs>=|9bjLsiKh}hS4XaNwES zr(!^1L#@zkA;nTUMm@%kmCtc*R z$CV}L&ayWpi%Me7G|Vu9_}b`RzJ(*F?0%Cim2w#Ow5iwaoS-UgP;37=+tOH_06%5Y zI|oiAXspSfE>w?}!J}R~Ao_4xI?9XLOCrwXl8yOtkQ|Q6mwFac_-V>G2VKaYaalPF)O%YuCX&}=RH#wWXOyF@_^e0P}>kPzR z(r_^Bd7_PUIX8r_MT=(D?)_j%LIx_7UY4BHsldypt?`t1k z3|J*^$30%#i2+V&BiULpBnos7sy%06f^$0BEjaSW!*3Y&(Mk#W8_HF({mcl~YIW7s zG^XF_*mcm@epLgKNN8t*i$u4}CgVM#{5u5lBlszkhn}^he7K4TjjqD9ePl=Q@sZI=&(|eS6>W8vXIn5Ci#OmG7FktZT zEzmCHIYbd5)6K|`Pi=uu07D?`Cw5P9nO-il35U_kBz)lC^?HxCdU0=(ZUX*cJZo^y zM&DEW%#v9mqz+89lQ*Q>@C87fv%d4~8~0rVWx@f!1g?Fd-sQSu+*>#dN8Ln;|OUvbFU|RA6bl&dl z*Fzu2@F6y*EX2FxTHinT7ST7Xg*CWV2La!I5+EIDgqcllu9mgs{WuzTj- zpxw^ot(YQP1fEAw+Wj8UC}2{sow_X-g^Jcd|MwoF0!}52xbKR#GcV3ec`IF=njJXnhUfHT4~MXp@;a~hneQ7 zO}ER#nV*lJZ8lpU$ww>zuT?t1IDQrCf2r0#+gKp&bKCs{QB++%h;AY|G>UALK_3oOWFtj5U$zFzz@+Kai9JsXxXb+&C>6&s*MB&@Rm%hCuIAfQ zP5m|`L|gvB79(7TXK|0}-0zd_K)diCfSgL+y=tr-Cshu=UHZ|#wt4a1ou8%lcFo$+ zYdz_iMZgg+7+v|{O9e1a`F>AVK9D9p`}q{6&%=tsva_*zlc&NHda#bVy345#g#gE{ zIi!;ZQyrKl-13`+_o1Bk!i-GOay$jjCt=w4)Aq16EDpRk8$`>|Y}%R;ulR8Rws%PT z*IxfI3KT>2UoVONEz5x-!SmD68yPb{%+5h>`S4ory-?bIpYOx8NV77)O8z0muhws;)R)vr&TD!*+O8rj{If)`Gjn__*m zJzJDQw6GZu>pMSDA3EoTGXJqwMT{}fEGT_YgoIiY zeyN*#P&2JXf1l61%j;n4{I-ZDKN_0i-An~jU~AcrIDw0f;X#qx`&HlVL)KXd#KN2G zW?{bG(q*lG9QeBnp_~q?w@;8vtGt`8dm3s5Q^W#;cE_}WNe7he$39{QG-=G z%JeEJx?tvyYd`HK2l0>M5mdwayxisCKcA%gzVL9deLU4{LX&N0b8L)BLK=H02)y#7 z0FU20eZu@%!PIUzr5qh%)z($BiwcSWfwcs(OWg0-bkH&FPhRq(4Xt}@?`zM4(Ta=+ z>}~W-9De<%Br@baeMB0b%pDHk$P1B!FUlIj;kEGTPN!JU$FyhU3s?k{p9nP|C!QcZ z{U7WPFC9;G)a17A@4b5TX_0hWHkSCbBL}POu128Unoe3AP{7TlS*r3GaTMd$AcdYM zqNy;8>k?^fA_87G{zpCY2>Jg(Vlq2Zh>DbpEcno3xV$LywL`c+nUX+|L(0mXrGpX1 z`5a)+9PT&G?#JG7TbQ2q?6AmEk+_XxX-D`WS8~D^r~?80(72O7U5FSnMQS}Pbd)&2 z#vsEfcsopSBQ(&`JbL0J9H+lhCLSm%$Z%=(cpf^O$2H_SHlV_Ae=lI(^$c@y=Y`SK z0QFQI^dog9XVwL0T|PfKe2U}nXr?vJg|Yb13wWzua;ZXBbo&xGaw;yJEZgi~(%e(k z-z+g*oIjRKeQsv-BR3!17N}U4+=bpSOd=PDj3o$sm2rJEuH$jsE&QP3Ei%EEkNIS| zcI7!ezW^_ZKa%WM`^;-IZBgN2JZh@@B^5^Ff#`YaMJ+#OQ!zI56#u3YIGFM-Rwe*B zE-uysmuYMlHRVXIyf4lFb}a1 zv;4c|L2Nl1e}M{4IkFA7tE++qKSP>qN(U%t_tyx)_#ZINm(TIIF~p!4@-NRvppd_N zT2!Gx7wR=3l+Kp`crJr4UUY4`@brOKX(!)tjRLO9^+juDzmvTxj4?%KVFp4$=_Mmf z{FE^IK892Jeo!yQ8|IZ{q^YE|?ATpp^4uB1KLjRe)Y4Q-r$XIr9SzsZ=T`Py4o?LY zl6v@6{M>$qeA3hTec&RPIk^V$*U~@Fvd5pp1kmYJl86YSvGc!m^hk>oL(7>FIwkhM z1>xQ=(_T+G+J$`aFrh8Ma~x{F)%LA!17DNuITG3Ge)ByD#KDA+R2)nQp*@%oLVGYF zg!W)Us9O!8J=ixwXb&cY&>l<(q5buFWssEgCWv2So%R0n71b&3l6diUwKBU(!6Aod z1=m;y0&x(|f>0X7et`Ikn=pLsmxCCHn=HV;VP@JZAa&pQen3o|!`nw!os3(nF+Z&r z*0JpfMF{l7teb&_&x0aU(hEAj7l+!E2@aBM-!pe~-za@}^0n?;P=%!+J2V9PYv6;U zI*o}(M-=j#Gi=Z5Xl@xI84EvGc=W(Qo%xx#rPN2@__WF>Zh`kpxyFAV8v>e({~@cEpty1TPQ4n! z?uw^NA8@@ki(j_KJv$9vpX1uyD0pkOFcBmA(o8A* zakJ+gFQFLH{*KgoA1iqk%nxWx?afyDfpc@=G|>@o_ZtmNIJ{TPi} zw5liq@2!d7rt=IAy!W}?qT6t)B$AV1Ve>g$j zZd&e+3E{w(q||%3e&}3X$GVj%I8qAMLO+HJW(uLXV)(7?i>(rph@xL*nRH2Zmw_ELnCN+0AUPNHM2T%4^Ue2d& z-HC)Lch;~saOB8~!U2lUO8SNZPMAhuI^W$JU}Epi{?7N5-4%0&KmypH2fBcCjp05Q zV!346)L0QS3*UHNmyJ>F4A&@Vz2cGD@802_Zfb_4dlxzLUXiU!b+A8m?~%s^iVDR# zw4LyLsMBmK^!f0{iy6XjFd>BDU_uDP!GsWog9#xF2NOaV4km=48B7R4Gnf#9W-uY- z%3NnS2byP6pNJb>KYyJc?7!!6NyVl^_#WI=aP*p9t}xwb=*9%?c-%8q9el>hjGI>1^ zSs>v&^ZP6h=(vib6p!NA8*+i%AeFokAvzJXLn&4=!KD42%^#gEzIqF&@`(<|I|?!^ zQF3e@gTFk!!|NxMKG}3Cl+5?S{t1iSDKrE1-)1GN+>%s=4bx|@;E$0ypJPl{Z|#Xp z;r6+zIZl55gjxky6Hi8CrZ6e|kTTwh)^WTQbcxE^VtBy|DEe)`qZ0X>31;5aTRaeUm=%A@!3Z@s-;i@J(BxAi{} za=tm}oxCFgZ^4NJ<28R7)6l@C;dlyMuOwMrEmJ2xl;$@iZou;U)cv^g`|3>LD9-L|(b5Z@mlwng!|?{)F;$yYK%YJB!h!#miogk<<~^7w+35y00H2>z6a1 zw7k;*&i~<;=6m0jS%cLULvRuCIO$bVlgu!QyBgB&E3Xv=Db zxw+)6ede)lNT+68u+@i?`p^&sW>h+}6DaRjJc@gzZP?+Uj-QFq=Br_|q)A7xU~=Uue4`8kXU#85~Bw`sLc*4uO=yf{xiZf6KO@D}J+Cb0A9%qru9m`?|Q~3z6|iYgp)xqm=NL$z=RN2049XE z0x%)O6@UpLt^iC3$?U;|kbVSX_%#yRo=-%VUsNTw@*q@`J5y{YGEMPaBOwUGK|l#& z5I{Hzg7}*-d+nElWbq*O;wJy_@6j(R%ar>0%a)T_nOlFP{(bu?G3|bnU7*P4^dY-&P<}@s#YhR3TQaD$bHr8N@51=jaqZCp4lUi z{}Q71X0ebh&^f)>_Ib&e_VcRuX^g6;mcS?jCF%-~3fyYMocG0>R*Sq+E;33lqaWQd zFgRVRG5MnXRR-Ad#ru^!@0*A7YFaNwhxj*CGZt5c`+Se`g>ljRf2?dY{GKocbtZr9 z!Ul;^b!P4`3{KSa*JeYXE2k&NUv}{gyr$ScRBJLEAOb1BFHR%Jb1oFNk*$lL$&KxE z-`-g<5&MbKAm#2ktq=hd+)(m|p}D=V9BvLzr%5zr31^ z4omWv;)wI)2dNv0`KPF)uRn|c6EtjD$E>7i1*%?c6~XlckNZaHv68SKzvGJaebIpX zsut=y14($onCt2uZu)FbOQP?);*%JJooSCd)b2P#0_gXJ7~#lKNsws1G@O}xbH_gZ zATziwrA`5ukwBMAp+)|0v+}%%TtKMt*#7wxx+dx4j1b2)H?m| zPrkn|Ze9HQIR@Qk|K~X-lQbjwVKApt8_ITdTUS^_H&uQs^so(O@+o%xc2x;*;;((a zVf4?T_LvXDrq7fuUH-aF5t{j^Blw*!vS2OTo5A)L>CY^$ELPy3-~HI4n4 z^4a;p-5?+Hv05K5mbaA*>bQ_(&z1WA6ERd?le}=`{nT|z8YvefFK-92mvmb5CU8< zAq2Q!LI`ldgb*tPCj3u7f^-k0AJMKc+OgKVD{mLSE~Jc^sBq%wbkCx2CTPdMPjdev1)|P8#IxJMOzGKck6+8o$KbYIf`{jNNV4eI*aIz4~K)&`&2Y8lad5TJRg8i&~i0Y=GIu7q+YjViCw|E5@!C_ zrHGd*yQr^guDr*&aJPZfxFEwvpol88iLs#o9b?k15Fe9(P}=)+ig%frsc=mZnlAh^ zdJ^08^%@~tQ1=_eG=y#X_V?On1^mj-b8w^24zqN(M}i|4lBRG;N(}ZX)6~KB3T7rA zY(6L@i{|&o%S^NM!{Et-W}yCS7tV^FR0^%Ccv-FNyV*@|l~>nj=0@)pea`5=?4U6# z1Z@fhLv7pYu(Hsx`rgJ4 z`Lk^LOX3sL>?mS19TLG32PwdD*`hg3uR91LI2`#I6VKVa4pb~Z`8=j^A4jxSkd*Yk=UDVR{UczB+P3LvNqJ!z!AkSY zCPVwU`@O^lY*dkp^j)(UoB4GUAQqI?WJ-rX$H_e?;fz+s3rU$4>v0Fs>sy+H%U|lc z`o|mjfc=z?HSVv@7gOVtDBqd4Ww^oAnlEUtNjKlZ!8m^Fn!ok?XhP^ReisFSZD%fq z`DV4iD&7!tiYsrYOLCY|r)ku{TN*GAfW3eZJMUX=7cE%D@G3COTifI$w6>8ApC!DH zymzOIDZ2(ZI{=ic|Hh2tJvM{E2IAxky%4EH#-9xPja&qoG1K;xPb)2S2l#4$)9q(# z$lAgPcl=T_p3+G+C0Y$s$`yvDPBB&5$&qj`H=D{ z^N1;9bzkja5=(yk{Ma~KGlUeAo1er>l_w=$T-gT_y1w(>#U8PODWCg>7;cg9^;?)3 zgt%ZrNYV@@ge1*iLI}gbgb;><2_Xyz6G9jcCWN3FObB&{L)_K%G#n%y1)(qq32&nC zHUE&XEm5&`FZR7fp61v0@`WS*HsjC4|tt^zJ; zeetSUXoi`;ROrx`tM)fehFyxLC~shT0QaRASJ+d+r@RQ;%_@ho99Ryw$Q?+ZI9bg* zrCwn3e#(b-8Gv%fZ)oU3+jr!<)xKOh5DS#ye`B?^OA4+f|N2@wtMBPL9en2YT>-V> z{B4pRuTk3@P6^7uZV`9C_eW4#pM3Q+%QzW#2I0KqBRy@U!8EW( zyg%%Ll+0>K2TXNYiHH}BU6>-0Z+qD|w+J`wVnXEaecRAs0o7!oO2}5aWJImbahwOv zi(aENn0l(scIfC4J|1Z?a7Kx0QXHXGYW|v^Oh~GZ<9XZhx4h}(!S}}0vZbG@w@uf8 zP@wkik2mqaX~Fa%%c9k;yklC|u6tKYnt)fS8}ZjkIqF072ScI2IR&HUT5+_D4~Z>B z6*+WAgnHWTxSzZG`;nlQf09Ed`duv!<+MqtRzm;RG_SfJgpC4UBZ(~o`zx4(s`ZY( zf%3igkIS@#h){L&oMI5|fM$W& zplb}bc!uA)9Z{{IA10I3@v98V69?WgrWjDooW{+f@+KHX~LMqfUD z+l$Q9PaN0nrW-KDa2Sq-UAQxAp9x_&m=MBnFd>BDU_uDP!GsVrg9#yM1`|TkYcL^% z;b1}t!@-0%G8|+&8-!&yf$|!pGsWyQm4fC;R%kTYjVI_|*pl_$fgaKzm<4ekH~EKa zu|XWbf8kyJ@u%oe#dm{8#;5)r@qle6+6#sdx%vFd0fj=NduB(k6OVyP=ZHte?3ML` z_Q8dS&cte8PJ8a+n6f?tE;Rn4>jB~sxNN4i@a=9@75CMbl{KVyE< zH0_!GWJk%|toL`6uZCij`PYLV>?z7(8ef{$_pK4_*b`@cqEaKZ@Yo>x2`AC6`Di*5 z$c@V#@CgijSG)*jPJ#k#$lS|nCNK7Bvu%CV4ek7x{|Bq#*?STZgZxGe5(UE=V+HyY zol;n3y1Cv-ajw-!#Z;ugOa>AoTwkR_iyFoH!T3upu3?JqrAG+j2($hz06Q{>CajDe$KH z>E{m5lV3eoCH?v|6t&o@6sy9M<@swNQ#@eO+5Y2$pro;*jcweyhS-)^~*9kdy9B;u}xU>(wZS3n##Hb&4nMWGzHUSQK)*C)o>wr!<`2gfqGc&TxS$_a#rcF>X)6#n;`T76GG^t%VjV3|Fg0m7is0)Ixf8}3BE3mtE&}PE>zVlf)pQpmQNPJS zT=M|uzS$383uZde9Hd5j?!1USC=6}A#$galgLnWCdjet+Zi4(j23@H13#3*VxgBu# znl&eM2KQV}vc<)YP82!5$-*MK9x_0Ifr&hT*-eHoGuI0kJ7|zmKPtP1)>u!< zgRJ$r8dHz4SoVPHpyJ#J||>4lgv9NDE+ww{qR}9@tR&E z>U)~aLC{_2Tgbf8^G}}fd(`EUc9U{V22%lvILtRm$L{VfIiIta3acwT>%#nT8w#$A z9A1LMuii3!K!ZNkVR8k+ud%b<1(%2l6n_|xV#GFcY(`5DjVxd6=S=S&0`q=?AJdqXuTzBEG^^|}?kjIw zSuuGLu>0!1i>8^w0EK2(XU2Do{nKS1L~K@=+!cpeBMI77QIeN?leAYyd$yQP7uW7J!<;bm9Y#athXBEQUc?ir?`o!gteU{vVmXu^h}`w% z5qMOmy}{#6wBtrtc2|2jMuu3w$EiT-{sIsSjI4jxst{jk7>{6WtZ8(0>lI`Zwzrr4 zIAW0*Q_dhPdS?_#1snzs8&HJbkiD(@hONVmxtZXJLq$p-oqiCVr13m$%$s^|D7x?( z#Gentz1ObzK+996HTl*Ox&58-2U-mia%>xV)Wq82Lt{vqyE=lIU3-4LdL2_dOCm=MBdFd@{x5dv|rZ-hV`ObCHEm=FSSFd+ou zU_yu)x(;y=&Vn%hCYW90EC>ogFbu+3kYxI%S%Pan4a7jS^^MD4e3K@ebjuOhHXt3* zdM1^0?Z0nw2!9_(CPd^fjmodFyioR+-#Ev)r86B6?|4il)C5d^R5szhgd=xN4Nq1N z>c2B9p0K`QD~Ty%XX-=4AG)|T{PFEsMp6_sPySyhG|2H@SPkPmM-tdz6;_exMbvWo z%uz#9s$PF5+sbOp6IdX8pWAU}pA#K zLZsHQ1BO>A(;>DAXp8*7;=9en^X*u^1uR`3#foQw3R^Y}Ya^Wu8@a=HpM+t(S5v%Rb|R?#<4%W3w8fKy~)$Cazp?tGmR=scWp z##ws$%@hvxa82Jz!`WS4moF_G=s?i9^uIU8*M|qVqEyBlOqm;pvAYc-YtA-Zu3Cn; z&um}}}?8^Yef)e37VmV@T z9#%M5BZ(#!96LvKyya^poeHL9B?@>Oh%!J`HBpgj!8EbI^@7%6*BhN31TEqUcxSx=t{?Wl77KB`2`0Ow#8qE0E&JEbeX7|Awt8x7$RiD3w;JnPHs!6zjd^o42+xptpm&u=@_&_YM zDeixEp;h92lClJ+;7fDTtP_(f^MsBq-?o2NSPZz~Vjei_4v zeqwjRrbr|h#2EfU_GQPeU0rApxDCPHb$X5AY^|o{UcsmW?bF&qFfwP@uWau=C#UUU zK^tfgdM9g?2LY+!D@;!8>gYFqmqgCx;$`c>Z}#@5%_i+JQZtHYdOYbMd;}9h_y{J1 zU=K_P!5)|pGFf0~A6|9I$+gsa^)7XnXrUHkv2KciLLhgCWwg<(r`QK#NWg^u=^l`8 zg!l}wZ~RX`f_x*SAFneUgrgu720{Eypadb|wU2LN__aL!G$0_cQ1>I7s~8?!QT#g- zMpyazYyS;mFF+6vVr_2n5C5LWXl@6d`JepdQ$ovI4K-Sv4YXEhw+>9u6)k-gR-EX7 zDxW9W{;jvDmo#hW?GdA6-nmLRjQNO^Jds4agLo|F`s)+$>_a(L$L4pyEF=X6az7{% zY+<+}DqTEb6T!|q{DF+)E~_pO1B^3SBsl?S#=@JWG{gOO$Ktn25vnWe&U@=e>;rXn z;*5Y;pqbr2!_Zc#h>s(7n_yNwd=0&CwNeG=`v7*w2J-~t@#_?Gpw`R~`F`Rl&av=- zvmA!Cd`F|oScL#3E?xR7#e##E{0=-&j5Bc3>=JNf`t!O5C*Dy!+;Db*I*MFGME)?} zBAY~;k1yO1{e19&Vm&i@_6&xV_uFDj8LR<0(rXK$wC9>6uXT&KM(jfc=b-`X-&SSQ z5j}x3vVJBRDAdwRCwlMbNryMd1!u{tRQ~0hr9I$kA*y!k!;A$KaXCzHG%&8p@=QwO ziaS>2mOAbEJhSE>26_;bKz|@EguyMJY-F??bbJ2(+<3QB{CJCC_=5$clJ_nSZ^;C^ zf!Eq`s?mATG4+_28TnLUc^gqKn5JT)-Bvo2H`r}@!E*qFf)cFLA6MkP#S>fbT9R|B zqL<4jRrWV=?L)FyD7JOK2Ye<2PL#2ikS+a)R)?S;n65WQE+HzWO`&wTQ8e7$|Xt&oN>}Y@vonmt-?9VfHkc|#igT5B{|9>(Qe-V#eH74O7_4nM_{#U zH)K|Rha=Z7d(`bGq4=d~IHxs6uy^f|5St+Uy51+W507E)I@%2ZcLsFT;?z8@hyq^z zJ4~Z?v!iK+C}P|w?h`S>DeRdP_llTf`hf|W(&GmBp6-xTKjUPt3(8NIT3gQ){gKjm7+rY2|;C<&UtffH-hAGSX~ zaIS8yWa~+clS8`99vrmP;`XhI#1i*6wD=6f0(*?FAzZG%(UamQZsdo%+M>SCw~bn_ zXfDL`5G-Wqrell@@{A$LUX1K^aY~knjXhb&%8+6dn#Rko@x$jWiwb%E;kWuH>mbwv z6GGB(Fd+nwU_uBU!GsVzf(apb1QSAR2AB|HGr)w94v%iy(YafGn6A))}lQ;Q?@WL^FtOd+pTK=VRN?Q1RbNu89-h$RYB(+<% z`P$IUx`1t120q#Guci^^SiWOoB~zcs>siY1TWOvlBOont zSk&x&F(!qNs%kck^YFuB(YJvOLGzZ(cLobNw;dITp%`cWPG!)v@uy&8KRu?s$ETz& zP#w~eX4C!Z3tZBsr7)GX$ai2fIzbA#<0qiF0vd4~WJ?C>AHWF!PL>oqX zzb7%F%(iA$$R55tjlbXc2~@~9m-6{=FhpmmZ9lECj8Zcumk$1ms~ zjnGWd&feai+LKzUqmdpK%UF)vB_E=|-b^~{XAXiR*FMHXN)Ak|D3uvK_}Zh<8<>3L zK1gSoildgS^x=x}cU1xCUHB&yo!+ZKGfspt5%&|pz>fh~=cMT2hT_pF?P=}V61Q6t zffH-7Vh#qT?tfk_Kx7;x^}b+M+`nLXwh{TP+*o(B&=7dZ7qqZTRqYB+|A?li?BO0l zr9ZIBO(l3zkHkmw**#N`S9&E9@T|+bvKOn;OQP(k_9gxj^Xeb&y`z!TJFs+)(r<8& zqKC%a{b?5Lsa5?$tZ(QvFig{V_b1UJzu2?k=2ed9G!yTTTt3i)Bfpc2x9KioL)YLP zgfc6Q6@}Y~`(ZK+7)Mf{)FNUqwA$ zlTUIa>_ickUkkie)lNQ`?bqh#8gw5Tq@;(8HYw>GS=&yIJtmBT0n?bjU$g*rv92MU zsfuk0{alUGoTi-Uei6Klq$vSM_9fGRq;n3(@}^urgi$(!eZm;dm5m03Mgos@B!lKX ze0wc=>6g{+bX3C)JBvc*l);2he)&LWp|+6GGerm=NL~z=RO@049XE2QVR|!>?!IAe;oDEC}ImBHcBN{_h}s zlRvnYq$6r0*1KxCw1%fDd8rb{Pq*YTC|-*V!e|h}-;|{PL%44@WiO`lhacjqs49lD zs;uxs+m7XrzLJW1P)#xT$?5}TQX?oOgjkR2lPmN>U>c0vT;FmG&Mv%qjbQ%z4JS&# z5%eQk4yFSQ39<}kIl-xFUh%4MQqOyTAD2VM+vs`CJg00xNfw6=jo7i8h>tb~??Xw= zwyTOAcvBrJ;|F)NBEoQt=75vGpyrSC4}S*1E&?-ya>1@ybCi^OYZtTIP58>37^B#- zoxqA6!&Sv?bNw2Rd3S|i%%2bArP6aX*)x_~J8iqgdXLb5m-s-LL?-tW`MhcTxckdX zVp6X4$!*MnWii(nt?K;=N_%~ThbO?9>7$e}uU3i)2Nm8D5yB92v;6XL^y=7mzjwAD z5hw6Km;&8i$vZBONSOup=)alKFz{_Ft z$=5k7j>~8khyCEl-El{V?cH9be6m^d@_&axUm8Dth4`h2;|?bZO+_yI@9G7xZ0ldM zrW+N?lJ=U|q7R3UC^3dz@(QF1P+5t)i|h`Gz2WsefQftYQ6gs!TJ%b7@?XzwQR;-~ z{fE67%rp@5$z!mTs($Zr1if5;U`JRlSH&mCN=*Ddv1@d=GGa)1_0BTf*Y^TtpBoog zw|0P86E3W+vpDN$-PJo%h&p4EKllcHBn;)%b%bXaV(ls`Xnxfw^|Z_DNpwK zophcp5DQ9o*YfQhI{Q9vaSx@CbMicW93BZ=hYfMC8|K%Fgw&oFz;d|lU1tsNl+@!= zW_OLwwngf*xhnOO%AiIjm>&o}GJgv0p>tdh)mmuksdJy7Ht}JRSgE2AW>tTrc>g#! zQ*KIxHKhPLA*Oc{C3&Q;ravx|G*tGpMh|^HE zTTCf8es9^1PStuiB5Kd|D@{pn)Xk1l@LWnGAQh4p$`Tftz=4;=Ik^4a+GV-!y zrstQ>YW{6)zMI2QC4K{oiFDM z4N6J(+~G~&2K+n4`??7PJZY~m>%Cv9q-1OJZaj+vSXY^*K7F2sG<+?<^9bFe?+G6x z7kNJUpmPXcTik7lq}ZR`69;x}7c;uOhOsMQ?>N!JVA^#=M^)1% z@T=$)cE>XO7~uaqRe&;wTo>_l+CML+4V8KPmYVafv_(-QCx_+Kvr1``Ze!lQRycCy z3b7rO;K_$_9xRIMuZ4QmYXgy=s}od9T2XWMXUhLx%>~O9{&nFRV(_|U@fD|nL&VHw zM)|Abqk(&D>~vb;dX?>5BZbVshOc-^d0QLgPat_tVJZXQ~ ztUBc-&ZlPo9plMBhvn0U(z|9X%^7~sApCC{ezkrs2jg1Brw2=LJnTP5GC4->0!V-#x|)^>}P(BwQ~UEvEDvy$!<$WCMV6^@@>m)@KT5+Lt>%V6ID!A(;`5 zWy6inG5U3iO@_x&L46leBL3<>^heW8_xdcua@h1HoP7u_R{qR?E7sqHx*VYzxC?b< zU={i1!dz9z>%2TaqStFPuA&?~EqdIbaS`xtP7VkK%J4r|%hO8|11KsWr;ZV`>w0>n zHKq|CH7!5t54S29Qdf>U1gsEzGt^B^*>u*hm>R-6U|A;EgHI&&GmO&jW2k1UZg>ua zf)e4M?JvIL+i7(u#Y`HEpH!zdMpX`Xd9eSCs#^5k#g4}SW-`uvtGc8czjC|j)5gXQ zUi89Y^|A~K9zUVqq)6O;2ke=H_Tf5klImI7euV&&+^vTrWJdhGQd{wz`ezA~PcP?# zLtgR$IX@NEWkbw~bL0=3KE;7jR|1FfRRcE|;%u51Z}d!UnxMD~uQ43oU+*%8cP9aU z!(>RioAGg%)T?d6-sO=v;mwTmH_fpS_OQ`QW0pxvY1AWsLzMXJTP;)z?{&8MWBL2L zum+sY=|vmn?5 z6GH3*m=Izgz=V)ig9#z61`|TvYKVQf&hVQ^c#UN@!Rq?QH|&(Y_A!V-0D<&P{^44t zJ%Q6GB>hT-DEiTlhH`|d$65jQoY!Li?;s5_M{v^w#J|z=B*U9$Tg^n1VNK>Zg$lXC^NOG^Tj6UBz|v0tRvC%j2ST$fZ-_Y$!E zk8AWe;K=2p1!tzQ+NAp`6Us#Hj%ezNpQyXe;i|$>pqphG2&e+FKpFn0S(uvIFxDM} zO-J8IV$g>e{EG-3I0yP$u~;pdBnhM60nH*8l9^agG_Vt!rg|&n!l3t#}f9pH^|7iQmsH&pw{U4STBqb%K z8w3IAl5Qyh1*B8DLqfWdZV+i{r9(g(k#0dcC8Z?)+j!2+GX`Vq^SkfyeSNNT=2>g+ zy*}5REB2N`-5z!4eA_Ev+j|TlDuQG;N$0B9Nqy2FMYZINT#DjzJ9ts89^zg9-=|!H zLg7y+brTd?x)=l5j{C3exdU(ED6}P9hUja5LZ&^6yo1S93|y=qo>yE|fin%vanu*~ zJvM#~yEHYkTaq@C9u&k&p-6R|H|1gQYc0yRN@V+GqGQRJ*Q zqGl@5zP~!|g@v1i_^=qef2vzy>W$zi@2 zMK6NM(NZA$obJjoPh$At8!VZrS0#o*%cH)?n0LpAS>X)qJk~CoaP;TEfe-vZ zEYM2E-&hqtzccS?6n#~UVT?pEPK8B#sk>q5q9RJu+eb1>fsF$6;id1(j~dl_+sz^} z5kqYvAJ3LQxIFiGKWpY5%v#6%`wanL57#w@gKc$!WP59Ur#jdn*xHSsBE|#}>&*#n z>sxG>=`j-`FqSW0dj4m67EB2BFG7e5_KOhWf(aoBJD3oHW-uWH&0scVzd8_B6ejh#G=9340Uq~TN?pTfM*pLsBw ziI8L4Y$>=j+4j6pDBjqj@A^LvUKH0A#{%sll< zPHUDp#1Oo5-xf831UtcLY~9YUF`w^nEir8pm^Y?DaG$V=rS!nYFD6QUi&b?OF&Fuq z5jCFZ(XL?SE97`+hR;8=gLf;y9lP*?M{H2Qrqbwe?%hb1c}hFh*KVN_@M$;B3z+m& z{8lg|VUdTk`%-C=aK@)7z3#qSc-W*$*$c}L2>~Ou4c(_khHpdG@%BlLvN>zyqVm>Qd>8ZVpA~y?n(^4P zpdss@W_k9)eKFFg;aHv&h!A<^)P89^T=b$03vP+ag@5ED+#c}4jt4Vh;-6m)V_j7b zPu&y!;vg_C@LB!NuVJbqPcOnW0CvzqA?zgKQNf7PL`mKq*8PktSMidVNuq+UnYU0c z#~0FdfensurmL^(_r9TyEzganWjM&vUTpQNlS{s>fD1BzHwo-CYZO3tnxs^r&`zx z!YgKX3{MvQTnPUGSU#tww^3|7>GL!)T6^1bGD>HsyLmK=W%JmQIW1TF!}jkk1oc6G z?hH-W&(r$?91jvUj5q6j=}#X-lDO4H+hXhd660J!_%sH*Cuy2Q;y554HmR^qzgzRg zzQ!d>XuFLst#p4c87{lSA{nt`x?7Nge=YV+jK22qP3Gg@h?a4je07elmtQfL zw2mq(w{eGci^`4Td(S5h8tL-%DOX^XE}q%e#heT-tz><{xYAE8YIa0-inS9%S#H}z z8r9GgXdeB)0Gh=W^UBgFBK**VL~&xqTDp+2I0>uIlA}js7DQg#0PNY8F5})?k`T$@ zd=dG)o@5TAz$+%?!TAwe7tAAs2yY`#=wnT3KB8Ao&E;ygpZ_>D{F!}k>BSc+AJmAr zl-60bo&6WUkY>#cKNOE^F~wM@%8|o-5BovY6W@I=>S~c^x@SS#z-g=CBlX{QUES^8 zq*P%&=dDLUdNV7(HbStR9bIT@`vu=Qtnj_DH1MX=$4)|czF(%Fb8hgZMUv&ZpF7hP zz0o#BnnQdq5jMyJ{ZJiWib58nx%zAEA%6 zR}spve=!}Yr@U1WHy!F+6hldxko%a0=ADLtD6AlWpl7z0^J*+%yWw5mPVQkLe$uzD zZPBxi!AnCEn}~F)y9>kuE!_V>kW0jUBg;Gl>W8aT{Gq77x^*Q?pWHX|vEKZO8D*ot zqYSKeR4)rL`rC z?+qjofLRu39dc1n?j_b8R}a$h0o|~XWlGnaad&!FlI5xFM|dA=*ffDjF%Q1cgmC+ke0L_99;qx0(wwnH^^O?1Lb7?Oku0jX70$Q>)qBwQ6sF3p(ai1^8HvK6qx0@2Jt84 zi%wskWCjdbq@pva-K)%2o3AI}6mj@W*xzXKWk(%?icqp_dhA*f=h#CWmtLL5qUjDd zm#dnm4hR`BFz5WYe?hpHj_8R9_gYau<11!2FUK44*pb+XMdA!aj@*F}ZONHiHQv{}D_GVKbNzQUU-I zLLd$%gg_ij2r)y~A^yKn`oCb^H5C3A7{2!H|5Jx>lef8M0cI6>d%x~da8>fDplyaG zN%=|Mb^izPJyK+h_riI5L!Br2lqbj=OdPlR9iFD+e_%|>Fb(5;Xe>@8{Rh6~UXl9<}qgB-MUHS^~rZ1?wLwpc7Xb)i}-{B{B6$%`Asg1J9 ziWubEEkW4T)QLG%dz$QwXY~`N?Ap)(=ufMp5!6F|v77BF7N6*krp}U!9=*M#@M*V} z$^*yFGjSR?WXuYS&*@}6L4bK@u+i_i*L#WETq@GlJ1_MqNk+shNq`;ppiuaC!=DWj z%rgC==9hX<>dxg6F*jUNuW&jO9=fN0JML^nwgfnK1xuV)UE-yZ3tq((iehCX@=3Sh zZYRILlDOK^Efy0i=-u7VtA{As{I^%vWeRr`TL!-7{~`$Xq)s9Fsi6mVc>b#hI7HTo zKWVbB7Rl$XzNtwuA^$6$2vs<$PlSPmOvJa`$9^A63gr!d%oVru9B1@>p2G}$`BqHk zRerLe#6qHHIj{HBsE0B;umn-jpX>)cDL;FY>dr>_ld{YQJrZ->#H^weL>_k|p8d{_ zp)3bYOA#D$;cicMF-1RlKHd^LvM`}8+((jjEB|X98F~zGn7*Z`-Gp?`&dYsvGkC?3 z!nuU@*1_2eCEv7_ATIb-SilB>PQG7*xJt-{98O{BNk-SaUx{$#ctx4l)0yv$1EPUN z@@;)ro)D5|;qnEB9jh?J7lxzUCS55Fvciykw?bKU5%f|pR^e+D1U_Iw2z)Ovw=NGoc9a2^o+o z7#)8-WONFsp@)Ib{Frek?6CspJ;c~YG0&gm+=@{AJ#h@>FjF*&q#)_-XxyD=qyiQDb@w@&$kl74(e_%NpYGvvh;z5))gcD714`B3Uk`mDRq z*^YAZtAn|nQtR+Gft^-t!%JoR-*3(Y%N71%;dJ-*hE3YM7iI}*{6RibmLs-A{ihR; zir{ysvGalmO2BzC=fevOsxItfgP%|qjLj6e;0ZmW78CN4h1+sOiw%Kyd_kM^?>z|a z`8=cH(?7zS>DXpoq*X9ebF3jhr6E?eTl5Io9+u1_L@xzlz2oI7ku&KG*OQl+-rZ)% zE(AVr7F~(qYm9&AKu}(<^t-HMt;uwbF04on#KO7c6W_#ogmPY{eXm*C(=X~t1dhiQ z=92I9^Pc&MqhumO`tc2MGda~K2h}$fHuAeY)}F;cEa<$6djF*YY&`#_U6O%u^zBe_2e(^NCJ8gx}0BTm@7!H-o{)e zKp}HSDzme$&Qp|61i$Hw7!mu*a8&}{rE~@* zL~99dLVsiQ*z{?^ps?_cJA9mpAq{OEC1d`Il6dLA*rZMzpKA#mX6&)0^`z?kJ|lm5 zrQFM&`3y6}@Zr4@THibBQLTQrOMt5d`fy!i_-nVE3T7;}`V7n%)Mf9Na|~a@OLpqt z!3&(&F|Mpw7(mkIi1w z;;%8>%*~Em_S;+@7v@hP|5s-lp&B$w*S>v|1NaA^K~42TE58uy_Z(6sbbCkCuQsdg zeK7>NIVC;E@JW;b0691iCP^48e2!vuv_9MC(9Vfu(z4dVns`3tmrKL^iX3?QZ~Vn?8;vN>@J%W+Uv_ludpS~$uIVQEWh%( zOKPSWPd&O=M^!1-9vS-Kvu8xo|5YpjUDT#o!(0BbpX8kp(d?w;={)MB<7LX)(?I2( z%%wu|h2gz)cC@}b7*@dRu_J4sp~BxpJh2BuAKOvr7e#(VZD24n z+Uv&6ZSG=OQ?Fuk`!9u5pj@;qf8H~vQ>&}vFEl0FT%tU65$X7!^VLV<(D1{A#f(}4}+^hxKzv>V~ zGxEc$%mw%1gi~NkJZL-~I~2Mtw!1$7Uf|jy?k`Dx(AK?$fBzo;bg6jF{h|WY4z-{- zOIFdGuZ7Uugnv3vwZv&EVa-s*Ud&I8u#N6*wn2hWZr16;?q?4<>XrI{g9)t(j5?|P zNQSy&{VXliWE)=3#P-A^xw0cA=S;bGs89o;pfqFp^Ikuk?Kk}Ua2K2`b$dja<#baU@A zYEAs)W%p1658K0G;q9BlS#lk@rYLILW%RqBizU~=lJT%=IvFfvi{iIP@%Bn7&zz3~nd2{f~DZRXA>3xHT)-tHR0RR>51_LmmxQU)V> z`d-m(?T{A6Cn|VWa8HGG;NvhK~pTQGj6IF_O1a;8a(&h!i(G)ofy);q4Pi2LdBQgPxdsrR= zFTdWTUm&IHPIn5H*+(Nk=2Z@4978u4v%FHSBBWtz)_`V|`4fs<)_rEx8z z$LI0EtC(F_i}m&1wao9_&E^t4qoNF@+1*eKX#f0HukePZRVjlZa^!3K;I^L0qInqj+pS}mhl)Bl zlq%7{#$3^U+=MzBG93B`ZY%v%<0^gfDfkXrB8dvhk9xZrHh#}ggI3c2`jUKFpNH&H zzb3e3GI3P;$Alhz%z7tq+HC^oREoWA(!mEyCQwsE)PR68T>I3|;&hKT!w4r~+j=y25L-5uSx`-ilN$in+~H9t(!)l%9Fwl$m8d~{XP;7 zI%lGv&-s%rO`Lw3KuJ5`a?n1|W=@|scgep=Ls`dAq`Uz*aGv$OLY9P4^f#G&A*{#N z#=%6)k&@xUPvDp0oVNV$KLJ94+T%ZW{QZleYHHXvUk4jk&mz<*oYGg^%8yU1x%Dow zbT`s3fR%dey%hIl;h*;v(%fF~aGYwMd0mR!!rk!e6FgR9PB)_?aJ8T;E+jrak(JIp zJt;)>XGF)+e2wPmB$USsqtVn4m+I!k&;(27iDunPzV(%Bf3t#+e%rX$(EH^Y$#$F3 zWKk51P%P;h&@3<)bPeG?)q2dvrSDMtl?E$92{OxQ_DOxvKc&r!WM34LTm)l4Kyf9x z*J65?#Ca^GWz*H;ofglIu{PNXUtfc!cRWEyn>_^KU_uDO!GsWmg9#xB2NOaN4km;k z983s7IG7NEa4;bR;b20@mAQ^^kX32_8|gqGd=q7_`Gb$+PmxvD@r;9$*3tttHnyI- zR=vAMSr7wo6J@V`8^m3J_=B5_&p#>*(CRV?jBg*wv`14cWx(C~eDn(~+`Qe*!_-XO z&u1$iSP4`7MargzlxL5mn)x}cmz!W9g<+OmyOKbs>)Z)d`Zs7s&p*SAiu|V+Uj{4M zTvQF`uIzHJo zk8M9)%LgVRLEZbmW<`^@zhaEDK+%lkZY`?}52op5#5BpgSmm98IzvAE}gFKKaj#PF!HLQ8Lx+)NPCahtGje5d7&u zA@pbuEbnlV$@T9{Jt@6t)LOz>ci&zxP>qOo8kR;i8Z`-ge}Fg~oAZ*2%Vt zGwDk?Ojv)osn0rJfnP|8OC~ipQ4J-+fEVNMIaWG#v~Qt zgyw*`3Yv4t=}CkYQumxq|voFC3TU{kuJ)pVz2Ep5oLLV zmLMHhbA{jGX7viNW*ft>J|aI(y?mGKIoCtQN)Gz_F~(4h}ySfj$H^ch?ZE@*u}=%o0yxFL=nR zuu(AgJ;ryzm`3_hNh`g+nv#fV2q<>3Tws!`@JNDU6+75+C6+e>MhAa+ZH|5}KxO*0>g!N!T2*SaH5QKvXAy?-A0pT}+@ET>w zwOjhXMU8N`Cq>*6UJ73S)->LAjgvQ#?%K!yr~Uwh@Hg3qYk%#(ApF1Qv7FncR8TSj zo??bC7C(huG}q?S7%@(q^Bv8XRn^Wcz;0Qcx{l4E5nX|i0ON7loI@U`G_CGony^vl zBg>r8#1?$0hfnix#;eVe+Yu|Ov6()o7Z%#9!>DE&I(l_l7RC!o#z6i<(dmm8+8$TC z%eA(ue=q)*E8iX#-@#@9d#a*C&ESL$G{ejvD3JKl#oo$!2!lzf_DroCm0@Gh@}$Vi zA+@5|;JuE=BOh2Yb2H5{=EueoxQ(X-d^V*D`-r=15tKC)O_&iZQ|Tvi&|vlNNS*!^ z`ytw1cao-}lApGw+{4FyJH{cCx-$>BZ5}D~v3!Lk6D;{CRtwW}R#Y;{>~RcpKVs?7 zHQ*jsFjtQR z6G+nHZJ;6dqsZ#VD@2zsQ;}b9TYt}bg{JMVy<4+64a5Sa!k;d*MgIl+Joaq6bpF)G zPdmQQRp*@LV9n7$k{_nZdA6|~mW%~e>VuxUS1_dmu?r7_>QC;oQVdSXHFfL_>#-KL5uV!zE_qPjg9t<1!@+d;e(bseLV*>5|2>_ifXFL7-*{XTyv002w}`H1~+2 zWt>n#o#Qs|a41msFV>e=j~Uc4@!=gx=Q4ALMKhPr>gOv@d5B(0jM61_ejox~6zegS zno1yLr*Vn=={x*3T8aS~X%F*@%Iw88ns+SBUx0Rj8m_-L{Pe}BfFS;KBYDOfD-@J8 zfgJNT8|vq2OdfQtj}X5X0q>_#Oa4aLNL%gOu&0Nn&@(i4$wK8PkHLUTPhsUu8|eOf z5iFPux`uECxEBgcC1FZpnGD0C(ey;#UrY~UT9K%ZdgSH?EMV_JfE&y`^x)fvQ|_21 zAG;D!?g~D^+YItKS*%`Er1vg9f0Bgcqe++EE%^5WyAz@oXyyAS>%(*QRLL;T60xjF z-(G$npo5?%>171bnr~mi8$#}Y1+5rbT%H}gMzQ9dFC2d5K{mqg#1S^A;c7b z2_dWp6GB)ICWNpaO!%LE1nC}#DY%aCn@D$!(S=HHBIgcYXelYqd|;84iv2bEe)k&b zKyrAHa`b3%sXZ| zp%8rUV7HI!|2Q#vKi@>V%U`?@FH}AL1ulO&G(+{@ac20w%+RkH6><`@un+H4>EYQd zJGd2JaLa~N*1Dt~YXeE7T{BI%q1Ml+A82N+%^ioD9Ww)D?hol_BUGs9l)|@upQi~r zR{tRoih`0$PF)RAjuHAt7Z&{1r?@$zsG*Khd=Bc)JQwQlK(mbK#qz~VHTq+|Py__u z@eeW&kpFle@#FJ(f31vM_}>Suf^zk5v(EFZ5Bb{lGxj`Gp5E71xWj1swbGXvHt2O$ z0me?!3a}B-e3t5YNs);Cw;)VS5j}&zPPj;$DV4d+%gKf9-R~y{Pz;~{ZjF@BWBK|? zT>H^}hingLzr5UD2x)B%mU;%<4qr%!-T>!#a0a~WD{Xk=FQguqVQd2zSsz^3G=*Vb zGF|34iJLCr28|E;(}k!ooCancHlgwwLjpFUFA3u$(8{EU;k+ji~&{jz@P)i{kZ{4DCCe7&|us|dD73?8@6 zGM5us?hi4QZn&QVMf>mv(^R$$HTv~;+c?{{cyJ|q9+iFLw&n}u4=~46tb*E_V5o#= z3m$YE%M(6%sztY@K5tF@&0fBpGBooo%&u_nbWtT87E^Z3BssxXf_$d-e#EaS&iE-i45kM?ZBl+iIu{rS8Kh=*Cj3Cxz#^V3} z+H85dcifgQH2PWeC=Uz<@Y*8Hghxa9krskmy-o1^mssqyiDKqsSyc{R9xD$!swfGd z7&5LQ91piiq15kmPXR^8t=LRr^%4*7XV*PC+jm`+gKg4iXAs~rr)cVOKVqq0?++lI zxV%Il*BMhbKRm;K%THK-;U|d;ff<+(0y8in1ZH4D2+Y8QkPMeO81?jL#IP6t=vwh- zK_nNv+J!1D?c*x@qbsvI)Lt%#djJzc+yj^p;vT?+kdgwJ5Mnc~zwZQ-m1#eiU5|0X zMc90|{l~M{>nUm1SOrp020=Ioqi?bg*J6WE_9l#8`}R%sgKHmyWZ@v@<0kv?Z=5c* z@A9SUlS7g7?wyCbJ7vqp z)CWt(YT#IaoWIquT*G3oJJF}~x>XyqZMj)--$7bAJ9wBI2n9;jf0@EyhJWP{4U#3b zz&m(9Cgzo{y}e4~=9!=;&o;OTeSwukgnYLnCdE}RHqh^J zS181DLNlWMjpZNwh%G`inDfM_#x_k;a_Np2Nuxy2D(-O02c{l=_iex`~0Nn`AZ`ml&#lvV4$2_8Hd7RYlo}#&@tvD8)W`Z*eG~Q&`uu_@Auw)uG z2Z>1Jld?7-ZYuE5@X`VFH7tAaVD~Nnt~_T zQ7xV(oP_E;WjT#IKrGNXg1`5nU+EW1RMMEnh(OdGy0tu#XuBE9A^4&LkEHg9&R7Q+ z0Ih*Nu(WJmvxb2J?*+cSS-JAQOsLBGsUuH_XKNIb^?M5eSa$sPQRcAU(%8+Ps)Z3r zWx&$fo_n3Eom5oa$ke>O&-hF17&xMU5-NsJTme7o)Gp{5 z=>@sA53ID4s|U=(9PBqPI9>N&SSXa>9YB~1CWN3AO!%MBINTakGN}=Vdc;<}ersuP z&&d$TQg|>1?vgx6Qc+lgFjoOY2w^Um5W-wAA%wYLLI`uggb_A9* z6V0xD8-#@*kOu)Rh=aI^;@2t+r_t)GxR*uCdFhOf7kss>l?RlW*Zw((MYze_{Cyl* zZ8Sni8B4$$F#M7D)-`88QSjUq#bk=GcKX{h06;~8myF$(#S$TqJ3MiOCg5q>|-c?rCsyo zo!?dg`$OVaFHwKlxuE*X;9mi665EsJ=R|T+9^6_*DPXJX+i)?DkIr0V&$3}kDM|PM ztZ9RmK<&bcCQfMeH6NU;VWST7MxN(}G)BLj!eeyeh#N<9$Au+B=*3AW&{*&j6Igrf zh>`8ZIH8=9(fBhtOKhb#w9RT3hy|rPdHwzinX=|-a0c?~V9u@SuXD7hG!5Cdn~R-J z#Bk#AWk4bx)=_$Z@*PKjl0sDNJhKcPkwp4EbAEMsAk7}8=Urg#9a<_JGES_eq*qgS zNv_=HzaYu9vwOos|BkiG+u!eJXb7?pESbf?^x2}X6;9dWN4$g!g>oO_5M}(w{>$7E za!DUgT7Vi2cpv`B?Sv**EuS?MVFsWo9DgeIKg0dOtmJ3lOuIwHj{bO&unRbKMWrgT zysexKDNpoMOTJNNI7^B9UETL`pG9B&&`|pH+e<(_y&>#evn(-bV7Zt<dp)#e!10UBR>z0B7WqZTkZ>7WB_JuGH=`WTxmG2Af#9cxa3A|bt1#B zR%fe&;rpcJ#k^u)vzt}*Fb+5DJ^FVDNWp{I4D4m_)E3vjQH`iHI`s6hOQWvK zZOyVW4v{GCpN^@4TR<7}XjqpDV>xHq;020JX}Fx}cue(?+56=~LPC|t@fe?=iS>sG zu;=cxeIvZ9V7HZ% zj#r{rB+}37BeCYX)eIc!3hmmj@1hq@Su9lES_NEhgkMLG`+MOY%H;(ck^K1j;of=& z9}N8dvq1Ut7YgA|vt$zOA4EmG zhOJ$f``~APyO+Rc;VFsmiBz(sZ-y2Ch32$Gwy*@od&SzW+o`P{4+(FDbZD`Dk3xvV z4%r=A2V#K&=ua1tQQoewT@NQl+At_DH^J{dEwxwv$QI4@`ZARw!;j5?`fF3uYOgFEsWSeCZDUAmeuzm^p^l znbdq34MJW)lAa88pld(As*ua7B`!nyx^5w0;d_8ZOaV(K-)R=EjZjC`9B-#3pql2H zVq=$`K0c>;fc`z;>sHq9S!yr<{e8Gx5wJ>Kf3S=UHXL&D6%V?8c;+*#PKKsRA{VtQ z+3*%Pdd`}8zklb~77sbYxxXZmrMH96=}CTjaER=~T4NTK)!&D%fFk^F7ye8rt3QZ; zQ2%u#iKH;>Rpd+5=|np&`@5G)12FHHolSrjmG?zOv(E&waW`NVJmh%!7SBlvKQZhb z+%5gy?`Re}FM(K~C7M5X20w;B4u5AA8%yS{U^puEBkJjk@rbNv?Wlu7a@I72z$6QI z)edE)Vac~U{5*mg`{8iO&U8yie6_w}jVjN@jMH8Np};CM*AQ-Bk5Wr;iZNd_$*Akl zs)>a5?I2k1+;?+E)X8Enfk_GiiV5n)M|y9vvA-vmU*vuas+zqgO1qp>&*$}78N0V_ z!32VEFd+otU_uDO!GsWmg9#yI1`|Ta3?_sWAHakVgo6no2nQ2FuFQ3W-vr@nl)Whx zzQ*W6vL7bs++3sTt6N8Rw@-0>R@7#$efuWTUHkZdqbvx*K@7nEW?gPFAOEVeyZrkN zmJU*6%ev2uv=?nHnVwn3rIvOvg-ey0z*8OV0*AEOpTCVfHJw}Nq7=1ZD0NF`Hj}Iy zU#}Nzr=ESEwfOt22C(PxU#vnZ7ko#2*x;o+~x9!I2kK3`y;jcwQ*uBTL zwp#TZ8i@ZH(ufs^#Aav$BpgLZXaW<8nm*wj>^$|uJ`Z^cyUT5*N zO+ih~Lb7iTF|@2BzctOxtLtRWaH(Hykiz@4>y<#vnbB9YXS-Y&@(2E~Ek<%X#^IpNii&(1TDGGV1Hkz0w=8SKf(a1S$P0+3t`F zkCR{0tKvy~`%M+U3@Ff0nTd+wzVCmv>UzJoS0>G9{e6}$I@20$nWO31DtnLv5DPjN z#GBG6LJP&hQ2sBG<{Kd z>vmsU-OxN{dF$Zj0TxN7j?FR#vWE z5Puu@9!%=olQ7E5N9y=^LQ6VyRBYM~3Plj~fC(Y!;o#VfqB@l&MlxJ=q!czw=sbVO z<^}tWD8s_MUzAsW8p3)oAq3%ILP!=4CWNpaObB5;nD9US2-0c@>%o2z(&5(;4uUce z!h>M+rc(Je12AmII4WNufdsdRIEBR`(W^=NHS!waK_L9U`GcDvd@VLe_2DLG^AD>* z4sG{+HIs`R$A#&AMC!9R=0NOjBDfq3s|25C4Wc~`ofJtMVdujy{wSmV_x>R$3Eo1{rGV{mHtpzZTE<%t zPya!W^l7GVvc7(l9(QEX0I+aL$j|AZO{oJ*UsYdgsY0{6RI18h4lB|IVeg{$?fC#u z>;oUs{Zp#v2AySnNPi_-a6*B0+Rk(P5exL~TGJhUnBC@Znub`48XK?(GS3J+u4g~VpkSt6Zjc}876db@o_5v8FHJ?q{TKJjehyayco6R!e~ zzQd3$F8k)S3~C_0x%2$Kztlk$u0?x&j<-GV&KU5N|4%3^OSr{Blueo^=~@ZuYd_~2 z43+j_@SLyee(dP0xPD}VB{SfcEH{Id-CVqP6_7XY?Hgb36lVC=E#)3N`iCp#!bYG~ z&>@^qtF>4E0T-KFE!C^wrisz~LL-u?4*4K`kD~cxPMmO9GMHZ1EH5PFnJ4=&$kJ#O zCoz}S{`bCrH+*DM+O+(gD-H++#=5@=KgEcwe@{$wUU8MC<8lyhW?yzpiSlWj&er`y z-Z^b)e1PDqJftHJF6XL`&-xAIkalWevJsgHoCLnxj_M_H-2IJJP#gL8ejl@@er2BO zPsq?V(Se!>BY|0qe@cm8;?su(CPG^+^q+6+FaXZnisiv}+WmG@*$me%oM zE*JMV@4nxMJb>0Qt|6Q;m@LPWHh2L+JdqdM627_1UoUIr3KcOlPc6px2L=O#C{NvL zz91tP!s+`tQfZ)YXc<09R$R@0O7l-agb>z)2_bnsm=IzLz=ROig9#z52NV9MA3<7uBf|eT z5Z;8cYmA=etn9ZZp}n0zy&}j`=;SauBFAuzlOX;8#9e?;_P=l!*ZvxaeYnX0{C)J{ z@NZArc}&?*6c9_CS7CzZu* z^Fq7F&f~(KFASH6L>KB|nu*RGjVYt}(gi=OGU}FXI1BDldPbZwbfE&nNb4cJwMz&2JqpHK86n zMZU(XkGNvcajqYhE%n-kca>;nz!0^TQEx5?4y9iKvykR6j8ZPo3Nv2?EOB_T=yizT zV%QC99mb@;W{6Wsdh~laFz7h_cknF#(vqzFmF@8lK2t;}|(lN@J0m+N&N zM(%&6&vXdHf)WZxueFT1ACO2eIW6J+{1{xH`NFLEv&X#ubNR2sC#*5Rb_Gi;4p|r@ zd(mH-@;gpvme%b}(MkeO@@m&tKkNqRmOO$23jaK7Xzmj|n>B3w@aa*)70JP{P&@Qn z%WmodJ;vM{TM{I>Kp|t6U;ZB52H6)*pX2G4sN2u2pWbIC^gaEupC4Uf7Xg%lz}>>% zKK%Y5xVin_9z~CSO}C)3^h`7#Rf^Vo%}x>BPV;l!K%f+amPuH~hp`+N>qF0LpsKef zND!9G6hDAmvr};F9v9&R^dXd{wI-vt;zHGMx##G^Th|ZG#(MYlum;u^lCro_;vZ*~ zC(+2_dit6GC7QCWKS~z=RN2049X=3w)faLh<3SNt(N6vZA%eQ5^ijxN^CO)@rJdp*K&5Fs*`ASW< zsC~=jBwGzS;uMCV?b<+JQ13%{nzowyJ6#2(!k=7A50xOz-M?MQ2xe{3;@zb*@jFL! zSjVPNw#VmA+||_;uw<02PP3SM8WZ4}! zqB_0(HUXZ>1zMG&B|?Ib7BM?|3yO!1ddr-|IM*%Q-!Ci!jrFHlw8~xV=Zi?a&i(;; zq!qF%2-YLGEbF@H=~ZiibGQ3|9+VY_?GvGHMPe-zm>GbpM!%{-d%dI{H^~a0oVVSr z?*erX-t)3jM-!&veRas7&Z*#GuQ2woK&=boqYko?nRszSB`le4OUlkSvtG2vuL@NR z{BkjOo)m6j7ip5bDfn_)oA){uXccI>|Cg#cd?Y3Y`m6iR?|ixykk-ma)>P14Z?8Xv12(;X%TY)E z=t+4I8P-=kLR+T1HcEeW{>1NLGvOT=?)z;(yP!Ox&HIqIJ*EJmHgs^(cYKz(gh&tJ z!SaKz!i#${spT|rKrH7BGLs*(m2a6@`S#|W?T`$wCTdR;hFnyL+5^ltGNOTYfj!69 z5KgC{Ryf0>AWPKFe{fLkk8OCbU;L+tO$Ge8D+yB4G$sTTU<=L@y0a#rbPN0=|CX-zkv`0;s4uQ`AwPfwF<#_cJJ`(@2E1IoOiz0w`fn^>M$j` z*6y1aeeL6$+{NEC+@Y70JXYoy;ZrAr56ys8$gO@!;ae~$>J`JH~xrX!JL{9sME`{44szz1}x?dx{;5V*;W|;W{ zAURe0pU=+`&4P_KsfoCYB-*U-3=c}=+=dk4d;Q>o#dMo%VRAbts2Uo?V+a4j;`{?Zuh~;?-UZs!87kPQr-9?201dB zsMbVb-yh>(Q zs%6}tfd+PedXTwwqfFn*MMt4OW(WNV#l0Sx@6A$XT(U1e8i{{4o{0b^a)ln-VW`@- z20Gb%RS)rKI2%>V73;>@ao>H%Ox1Iz9cUJm%h|@>&-)`Zine!2W5i#+k0);Pa}+FN==*-?<$Ml9JZX4p!||Gr`^Eq_gX9{D;a^4 zyE$s;-)iF@Davu6H}@~szh>o~>~`|8lPM%T=nMi<$ha-x5jpEn`GwlPjHX9_I* znseQ%5?#q9P@Kn4#AffYH3=~ibUJ;`@&WF}Ap0To3plO%TKv>V&50(QKPM8Scv+_X z_*5UocfUUEt;p3Q0eQd%@t1Tr>k|$0k(PA?QBm6>6s@oLt{$mb)p|&~X7Bp^E}DSe z@PD7c|q#gXre(TQ{WC78OpO*A}q{x-B2_FLA#yA{OO%Mdd3cS3XW!?6WF zZoPCLmWAVOrHA#3z1A3weG!sb3(4!jgb?=tCWN>L zFd?MF!Gw?wzn+DIu<9ldf}rf$#~={C3E|f$>-gGA_9H`jjr zf3puaj{J(HE|Av`z<%%7h(RNEJISv*fem4`ReczS*Pu>a}nMSgR^*Av=DZR>X zk3B_np^((}PIr3W?Kferj*oe~Ub{a%#YBJSnF!7B`G*Ql)^vGyPJb<4Vm+LFRb2Q{ zF|jDtL~A1;hf)SN{%aX=l8v!w+|}FL!kKgs*Ve47U81NcJ-Q*otJ>v8PpsQJnh->#G-RF(Ehf5Z^#sVzf3RUq&1- zcJoIHKu|ILYQAEx+vrhj#KeV8b@K$g;E3 zoV4OGuO-Sov|de%ZYpYdqTx3SkLmFOIDgOOf(_Mwog^X~D%WTscTUBuGFsDJj;Vvx z2AGaK&JgV`9$BkHFTe-AGSOfsZ7n;-Kt7F@VDUtDS)P-wXEU)2>8q#DF7Fb9{?_QV z!7m+mNj7Yng0r`)Nix`sWF5XJzmOV0@@|r{Bw&QHoA*V?&07oDu;>w1ecr=k5t>G=6elN z3M)V?&|Ch`lPo@~dtzm7AZ`+~?5EkhoAJo|NjmDw;ypWk;Rdf{HzQz{Mc08FMoE7n z?>q6^s|*dvf^*Em43kF=O6b~>kAJuyL2<`lgE+SR<1*|4Z;z>Z`pxrBV=SC|Z#VKk zGAz+PBPJdq{#Xj(9$f>c=1_Nc9DLbjj}6xjUXw%fyRH<*eMuphVS~{FGYEXZgb?_E z2_dux6GCVYCWO$QE=Ex1Q5;!`U5tBesAznm?KdP9!=w^%bL%XB+Ha*65Qu{bA+-W9 zA%yl|!vFLm$bW=%&vl4{(CQ}6USl1I1^7SB;z9fch=I5%lfGskPD~n*Z!cB)dL{p; zfm=Lj`Y1|NbgkVtS%Cjvu3*(W31=(W+Pa3oe4h65ik=SbVeoPAmHFtTbHsAFFL1&O zML7ZL%f5cYPG4z!UZS@qcw1!asqMxr&%Wu|sQjo09(}O7*uPi>N+LB(D64O8r{m4G zdsFc+e_M!XGv+No%|soM%FF@?q@!++{jN9Ci8P|h7}oDQ!UyTXEO|L)v4+G5vmm4+ zZ0K{lM0v!Fa?49L_|38d*LF|Ud9Cu>SH)rur02y$^-7Jvsp1k(gfNk0%%VBa@i9#W zhhRD>%@KpuYe>lIh?b?Z5IdnCs{OfV=yl}!tfSSg5aCIt-FJ!k+y?k(-`MAINE0;| z0mG-AWv*C){9XPbKQH5xM&al8G|Ikfu|JcbKNcwCk<5w*`Vh)IGV}lA?X9D->ejGd zx=~t?mhLVIrIeJAE@@B%>F#a>LFw+076Cy4X{5WQJCx3Esqc6;XAH-;p1t35&fm|) zn#{T8n!oG5XPH^{Y%l*%gdLPZhEv@dY!em9xNg(e`C@Fynd1F^8;(M^c3xwO{hrar z73%mte@uRQ5NT(<5<~O`R*5SA+4?9n@9XzaO&0vL?+7XN(Yc+IJj3a=NWN~bV&oea z8+}HjW_Qe8BsdDCXWe?U_Q7#0-wN20C#OYJwtg0GCx@Kw?nItE6H3O1h6;aZH)1yH zJF|F8gU^HLI+ZxW)l{tZ)*4*rigW}?W_=L~umYazLu~SnN8X$$GmB)Pm@ORnsu^ab zmB05iasBlH;qWpPSoo(KzNccbI0<~%MKB#VU3yO18nbHH%Oq>|BV3SwYCe^V8ZceX z2yV6GEDOuYxWPVVR>hWW_`_~Ha`LNRN<Az^7z;M&aty{?jiG zy%mzEUYWwP`UM7T022~~$}Shr(Pcf)gy(VOvTU*}rz0w`R0SWoxu=~-wCetf`l0hd zoMW)%OB6#NJzPTz*1DDMv`SvF7IxIF** z6Vnmcg^?bZ$H&8{)0R5$BuBvRnmJUG_fx^zQ7TF=ZFX2jnP`UXZbb3bDaYk|7lh&dTZ@lja~3yT%COv1jEX|W2jFMA;4+W~ z6hhubv+9;WKpI}`S~niEcX-mgDDts@{w1S`(UT!U6!n~3--coCl_Chuz=V+46-)@h z9+(h*hB0C zm=IzgZZaH%!v90GdxL~~MKNg+(i;lFi@1a|!ZWQee8Y}GNO2LCNqbbi5{memFO-T5Q&{Q5`AaFZ0DSv4BTVzSh zZO7fBP9`z#=i1Mb2vULw2Ad*Y#Yvq$fZ}`nr>ygI1UBcY4x;x>ej<5SuJxyxVi%q` z-|cp|OZJu@#7O~nHjBRV)BbdZxyYLmbD!Gqf;^suc5(Wd;P5=b9N+S1e`to8KTv3# zx}#DR&PaF&Cu+s}cmY34`$ez2 zDP_BFU`XalpbozcaD(12EK$8{eey9CzE=x|a3xtC9_GXSeX+ZQO-7h?4U#KNsKA|> z8Hp%~l+q_1Fz-)ET-}PFed!t1^ZL2@_(=<_gI;F~^!0j!l6b8n?J=;LXT6SwaO+Jp z9xis1dPf7_l7H4yqz}N6A@-i#Nv58vkJ_fPdxvDm(H*NQ!%z;Vs$W;s#pZ3TP($xc z(kQe}<<-72>SM5c(Tp7W^gzT-#NPEh!KX|-2)3&gPJ3qT$N-fmj#Wy25@GCEJKfLv zfg?k{n}g6eFLKr4Oo*Wk_Gb=1LpQdxzw5XXySKEIu?p-OvT7u0e6F3M=v(0H?)<7Npb5UtN-#P zW>%0fV)z%hD{L+5kYxYh`TNMq2&XE5k%TffMuXvwm%5aO?cMNFqUh6L$E2MmYmDxw z9Ww61J?qr50%nis<24Gx7goEX;4jv4;iDFZ|!TM0w?wx9KO4=CF0QUZN_hzSr1(OL@KP) zWL#D&wHf}^>np(l6fJmz;p7->mUkKand>r2F3c5%JS6eN-|QdY>fKc(wUO{?+kmh~ zB(u#@KO?iFK(g*Rd_t*G0Eu_=H!H3d-GD`A^!!K05Tt+!Aq)o-LKqGvghcjWLI}gb zgb;><2_Xy@5hYpw6s9#D^^x;y5l+`+TCchJe4{wdA|~uiN(p-5f0_qG_@Cwh5ki{h zzhL;kBjMk|)f*iB9}L2czy2FXZ~P460R9H)8}37zndnOW(Y^F4jsEOvqvFEEi?*BB zrTxu6{K;aPHZ67b9Tx3v{LC^iAFj|P|HLRgL}~y>uDG&IEKjuxxc5T!k(Ll2IU!dD z6x4gZF>DCmzm6n3bSvOkz@SKPV?+PxcQ;@J4s=HZ_y%`k-;=_)TcJT-Y2T=n%9QTz z9`|lf2pG{|1GSVqCU{t1XTSMmBJ}gMVFP#3<4qj(!yevy#~8m3;sQm&pJ8UT5xF2P zfN}3#$KLVSfbg;3XvwgidTzuEcLC>#Svp`1Joj_fndNsDc?B+Xh@OLrwdk@eLSJgW zP05_hHGE)G{$))-GmC%9dXFkaSV;&Mi>l+0d&$ZiQ-@YA8RqQzHhWSnCfWwG6xj35 zqOmbxnx=Bq?A3*Tj4)5MWqp74btzL^kQM^{EsGyOSzuwwKQ^d~@Df{!Scv%sK}M>^hbnEk9io6CW#{Ac#EYc%n%#h-`7Z&~a*TsArQe z3=P761ISHj7as+zW6LZ=ePux_7@7&SCwipa6T4N zQ!L_=t?w* z@MBWx*uZAuR{_A>f#7ezXd2isqF-5Q`&{T9(Ky|K)TEvosO6zQ~k1gGm^A~11m zGM|)u#XHv(jNoPZQ{L?L8;^G?v(2LJRrpz0V`oK1`8}lZ4C-YdJ)v=|)^s42 zAMrPLr$t^CHRY|x&VmGhBL>wi2f5wp%2?TingFiv?uKMcYxbqjej0+_Fn^Q+8A*rXMSeXHr(xf z%I>^pqHg;PTjc!xwaZlUZF0@=qvz1n>JNWjNAX>?cvD`?skFPE7Us$lr|ppdaq@1CNf67NSUWMaNvzxLOIPI~@sL6e>U zTYSsJZaN!+S9U*rbp$S(#GXrwA1Jt9*~LZsS^&4cArV!`QqMQ|*%In&<{JITNFG2} z=Gwi!U_yt*?bWaYih^?DV`CJKM3OEZaTcHVOW*ew+pT<4J95>689B$eXR_BmHgFU$ zV`yy)_nE^Uv<7-7?VrCBpC+dpS)5E+XS^27EpYplT!7M<_~+>%Vg^;cagAvyBrCz0 z7P%|Dqh5lN02fTZG5C_J7Fbk$f0iCNX4Sgor6^zTdBe`NL$UQw$8X2I+2fD!2yhXg zX~I9R>l1~&^B^r%;xOtv;*N5Bz40l-fZF^!F75YXGbRX+G=MPNWX)eL5{=E~?Fa8$J_cbj#Klnb~E=)J~RNp1+ zTllMGaX1R{xyy0%0`#HflDWfG-O^G{ZW{94YOXnjjx8cL$&bJ0!$BebyK8VIJo1;Q z>T&YW8(bI9<(<%Ymd-g?uEcpS+vXU~G~^3#`K?%lm9|{AKu5^1f$S`5u-l!(t(m2& zwl`D7O=FtozvjfCG_4gC1IIpD9WY&{IUZw^42i2guf%vfu9QO7#eGh4E~kL0cZ7%S z5gDVkm$X@e+LMwCFZSXVi{#4DOU;aj@vzB(pDhh2&25t?ee!m%p( zlGi@YuJ}W3sG$YU`E3$TNE{v}DMK5D96~^#FBlba__c{dMI6bGrHV$Q7T2apXS)r; zo>UGL-J;Omk2`2PAyw+4%7tPr5oY)AM`PZXXG(jxp9%pfm=F??f(aoJDVPv~W-uWH z&0s48knx-{TZb^b!Fp){A z&a_AB;`Ylg*453tDsC?)eg#Z=!V`%g#KgfQ{A6KDMbP%VE0%(d7?dz`8Znb?Oi3LK zlm%sEm&_(Axsut7&p1f@Zt7=gyHAX>+>>OgFNW5MMEra?Gr*y)G$yz7-bj|&zSM2H zTjMICPq5SIsT+gx`7&JWfv93OP!^O3YE5?BBj=YrAUXU|-$3M3-nrs$=H8U1NyG9 z0UtLjX5D4)a?5GfN+B6}1XHMSk^cF5W)1aE$D$)Oz_#WJ7GS&-lrv$p+HKYh46m5g zISbv(qLKS3?nSE-`pe)!XSy6UFqRB*pQbGoVAXB(pRgd0?cXLkQH;2ol4JVz19uUS zUx?jjUnJUOqUholLXUOM!NTTUABOc?&z(IGQ>jG~;Tm@J8sziWa^PWdX7WXu}n-KRG z17=^8Rtl<(p*@%o zLVGYFg!W)U2<^dy5Zd3owruB}r+(jsq9xg`?pzW&#na;Ap|~5g0tv)HFbv`lKqw7j zAV31~zs1ToD)u)F-}o8CA^gp}`~&fj_Ztbb(&(<7K|WF%iPSoi_GP7<6BC*d?aweX{=#7XVT{Ms z?TUh~-LG3nKq3BnNE0HFD{*i(>)LQ1H8?Eu5k11r78IE86asP<*(qt=;k*9MS&(5 z{xso_Pv4G*ztRNUl@|;gQybOlnGaQH>ixksz4`TpnA^7tz%Ps_NXlmo=$T{Q8dthk z4v$20{vOfFa`_GRkISR2%N?LB=(wtRuwMD7%KeJ=9xn5%(YxfKpX*!pRP{e;@0hbl zr`Q1}2PhztNyw=%hv@7)EoW$`0M50Uc*RMkZ*cVe8I?i0HL&0wTFdnsBU|~yM;ks2 zcwd;!0o*qI!dA}g14Av888hT&;x&NbYzrHxOvm_m15VG}dq>`gu3hG@s3$m6UYLa0 zbE3yAL1Tk{zb#$A?^DuF)$pK=o|@TNBuHBAw`n>d^FYrQ>`E~u#tIlyZsrBS>I_gp4t-=Ar`=#i#G z#x8Na8+B8}xi`>+TBu_3*f%5-Mx7D}ikYBcpWY8qeRXK;F&- zlKTb|LTFz)mKrMRFZaHnGKW5~C-^>}!cq~LxI?F}!^(t6aEL{H)sU{GZ4;#unvT?AP(Vg7`_oKCj{}pwob8CN2GBG ztBcOJB$DFU-KZFd1^63=Z~XQD;7y$1tTFS+f*Kojl=)*9s& zgPL%qWMHQVQW@13J7Ue6SbBO2?#kDslCq^;LQ-TOc_Kce2LJdkqR7`KeFwyG&e+MC zX?W4yizCEo8et0OJ}_Sjd&x%LO#r9DaWN3(Ix80`pl3hd(7CMiBA=`de!PY*wLJFO zc)XRx3i$Rx3G`=73yMLe$Li@z(=#Gf{Ji1R%YsCU*2QN?EgL-LJ!9>C1zgf;b@5|l z?tF{>j^)gu0s9>6z4)528f4k}Ih@b$k({fcAJaO>L+?0O+oMUkmZ#SEt9rKScC$K# zwP;-j1U??JVFe~xoyG+ayIk%^GJI=FjrfShd$&4Ltu1i#3c;#2@e1HCP%r2VgY8IS zdDDsFY~&GAafR&?|N6C{a~p}`8~x)uUq8PZA%>&Cdz+?8;x~sQ|CMvDKN_|_^R4aB z!}4LB`1Y_cV(g+{SDt_xhTpWK#71U*eH3>7*d``3g*Pscpx->(yhQ$^PJw08coW_o z;EWP8{rmUP$OOtXt@+=Kt=V+nevmn_qPDc0u!?#svcwPix7DcGf^apTh^J_HNP02& z?fs(~W4)e;j<0*6kAo9nA7#T)+#=jH8*5+WL$jRRB=DhPiRpI~*LJj%#qR0YA6Pb{ zgZ^#ppgh&7TE#@=REI0by+?C=gf)#X+v$M+iiT?aC$lO8uxsva)MUJD+1D=*Or&j# zb#bQ`++bL|*B3jnan4vV_*a2?f#!pLH=$&h?T}S+Af2s|;V}MjV>wpu@lPBMC42#I ze=d2&OJEHM<417`hHHL7q!}}kq_NX1;azM~Ow%BXPoqgB*6xzOIw9yb``<;0Yge>Y zAO~BvTSc-HCnz@FM{mjJ2y+Ms4Gu{{p2&I)M{!$kN^H*EJBf=cK`=(H;1MIoVMPLU zG`VhSf^&T!g9}hA(3t;sQ7B7xdkJ7pF}d?d@@mQ4CbSg#RF9~<2g!+^D9Mg+IkFMNNYF4vy3gKZjq`93u z(lsCm2NOaNZn5yhLj&F+dIe$T@Nsz+dGE6ieh%J?12)1V%ovBl$`FKu2_a+#6GDIs zCWM67U_waqfC(XF1`|Ta3?_s$_|0Vc|ECBC;Uoy7OTCiRD*M!siEF&#o7spiNk;5< zZcr8^$Ol3AzjGIVBm6%I|I$uUT|M?;dtOXy@!9iTYHF+g&5 zy!uJo#?U(~$I-%!t`2pHuS2e~WLo&w_$g~DF~`4-83VJ_|CBYdhGD{0v^ZM@Gx%L& z;xTm<7HO_>Q;YMR3}Va6AN9a)biz$vbAPjoHo?8IZUkwXPmeGOpTcfm6~q|@M53ps zs{>_$hCsiE8H2mn*C#q$&(EGc9fk=#!WDoex~YdQip}6crAs; zOgSU5UMTWFZWbH~e>_lO8Al1{%-fvpq?1(IWL~#J6i#1V0V*3lhe;9XS{G6{3e!eL zO_Fns)PtPc7}Ks+?9b~@{FPO$zb*H=ca-}pLN)X8`(?=_ij;Y1tiO%m>A~87V<_d? z?Z*+uV6@NaZf`rpiCKW7;Kf*(<5NcDl5kL?tIE_GI_gOsZ|Op`cT-whe3r!U3Hm;` zo*q{VQ*0_aZv^Mcu(PwP+45BqSdcaN`cBrxk(pBtT)4KM9Q=DC zjJq48FIC#`R^9=JasOJX2ih_IG+_@7d%HI!)3mT=G)Dq*Lh-a_K*vY+%e!7X_Efio zGHKx`D27$7I2C>{#>31V=W1>;-qW#vcX1i`K})}<@7sQH2v8O%R{xYWX1Ks>6i1DA z*JFq1JO4Xb#+8tj4I0b)9Jz6DU*HsufqUPG;3T^Cuwq!Bm+seO=<2o%eCNF6=ahc- zh?l;p-FzDguKrmF>lV&u*Y%oH-9r6)aV*WKa*)h{5X*_mA@c65SINm&Wngoj-WlGt zYLM17nNgVw3vRR0n(-9o`F9CY^Hle9#Y6|7T3|Nv2EsjHA@U_uC)!GuuP8bW5UCql>!CWMd~ObD?;{||)!_tVBVF#0!?-T3+6 z`2!FL|1E~U5v0TJkWuh#v)d8B{lw&=5qW1sQx5sYzXp;&0PzQZ^Co{jM~3PhZKIzP zFWz@zlQI(4-1TO7n1v>lHMcjAo;c{TFbm8LW*=w_oh`@B&^2R;sIv_YT3TGemK7L( zKARfJt&Gcpe)Q}Z@FS~SGsB&}oWN3-uiL1d&(0|*j^}Lu+1KZhzzl4Exf8+@?AZPT z3AhW9@Zn=K6Q>-aZ%@B!lKXsxGiWjoI)Q%l9QU7l-5j#X%G8>hR`-#*ChoP3JI2{Y zBytq>YqQ#8U`a5%>hSBx%K~8zueHo2YDs1Uo}#By?nH7D)`w!x21I})Cb%>C4Iub+ zOup}e-7|_A^s>4$Duxoe8WovqwIOT0vafx4Zvo5FoeG>6pPO<>y$PodkS7ogQHzDE zD=)A>xfPq`R8J#h1QZ2bRQFJof!@5vMMugoMifPVBD@Tf^5AfBNmM92v=nz^n;(vX zh(>z&)KqvZvv>)!mfjj2_scV6Jx--*h1sTM$2mn&peRre^oI#`_s>&j30@Lde53qy zLBEbJB57FjF~bP3&J4Iw3_jbmeFnywmtBmmmyU{h@l@Ufohn~|zGGF@ z3GiFc+Jyjx&9b|r%>7%bjBa-ZObt==Fl=UC3(cs!-Ml)p9|9)ct@BL=$s5Yqbr>!k z6YDMU4k~f6E7#}nyf+1nFU({GfO>(l?)Te54r~(@48VW?4*k2>>H#A@ZnYw13$Cn* z--6 z`*Jncqiq8I%gGBeI;5U6>le{P?>-IXBk)iIO{f<9DZeE{LVjqCBh(Q4$&@x#y3bg{ z;iHJT36Zn`vI(GCV66Mc9yd{I)98OISE>xC>&pL-PyH$)QoJVn=}_iG8*a##_Zh(Q zxgRzxfm_y#5Kw&;2~aq0kI3m~nxu)8DSO;Th4V>}fdWH~{>lN4<9nt1;>xk7->{(4pj8$=05g`i0M8K2@ z(1u{gaK z#SqBiE@-R-ortP{3A@I!YC2sxSBksVBcy_KT|748?GcXR*m7ux%BE$KZ=fy;UOyKN z?FpHeilp56NEnNok9j46~dd6=?cNHmZKw+X;{(HYVpK#@fxd^6J-Av8;HV@ zrHx-Mem+-1w2zqbG}1YcZ1j9hGFJT@UN-v$=L=v_pgl=H`TV`xw_3u42d+G+G+{}9KY~+x;k6~?Fjqj(ekI&mQpYs#@{4R< zn3_3IFVHyr_v?Dud6~5L#5a_Z2ATBM{N!z^52FYDd6+$~{j@Z+i`Sw$LhY=2fPZxsuR=Po&Gl5)z|HX>7IX6Q!?ujd&X(BPJpL7e4x<*CY1g2O_KQ4uR<@>_n^T8#<>#0o>9(}g?gpBJqB7sGOZc1sOT2M0l12S^} z(X8LCfCO`C)mR~1mTPl8Ll4w6=PwLd@p3Z2W`3o^9^?SreT{IWJ;WX<7@ia?B1iFD zRTU1z^gcWJGo}BI;o3U8riKKs2d>kqHrIt2o1_u*DoXgEP{BI<@5zTJf@%JTfb_!7IC)j!>dSVzg zQ=8mi83^kB9pe8MXx}LNZ|>v9&mfQnK|F}P_$$MI4>Q{HeZG31&!u20J1&Z;27<82 zC5#@tMVtwwyF)eM7?1}?fs+LsEbWHZAAYTD)|JM4)_-Mof2f-K$0sFOqZLuTr@*HV zno0j%)RT(Pr1~sJI~B$Qif{qUai1n-f@<7Eu^g{nGQPT?rDjPVr7@tS0DM$$G* zp79HQx?85`ED_Mb)6CPR$LoU*6a^Y={fU4+`;m^Jhn8rVXpHvy#7Zk5mZ7{-=Cs|} zpbHZ;ASDNOzaZAkCpx_enrgFqRO?uWpYuK(m(qfdV8QO=$y&JCK<+b zr;+TAvNuN>#Fi-BYGMAhZMu#rZ^ZX4l5in^SYlS_c zm5^McGr&uAoe)>aZ1+Z#E;ygo{Vm*s@2`I?CxFf_NG&GkEr&j1KCGFBF+AoG&e%kp z;s{pw+Q615s})g64@Y5F@k1xrM^Gq0nut?D)&n7Z>1^h4wj=giqten3&&hxt+t4EX zqE5u7DHV&j`GrY#rnU@bsJ)^?2ddkfY>{iVNYQNI{6426oHAt-YMg1y7dBn37wW2Q zH0{++`!IK}OQ>ynAOAW_21@=6*S+_j9Vxqry>e=ElD~DOxjsP(KT*_;evw<#=gOMYJ}do znV}13#fK6mnMsom?tYMWWH%{JoIEX*^f8PMya5fdYS^dV6eKiX(X-rii*dp|&&EkJj z>1u57=P*7g2#l&k#7&j&_vd3MjlYl0e!N3S=CVi?1uWhcmHrBg85*|Nz#hxsX_GTc zA0eM9cHc~`cCq9Pqv?(}FwB4kK)(@gi#+*2k(W3*xA6AfM*eE@!E&z88_MF!2ol^o z`&pT+a1>7`&3mN3`3D(#(L-RSu zpd@#&4-SPcFmuEQ68`xUU1+l=Dg%%$LDdH}dRTXzUR%?XQ5v zLqE1t}EY#!43*f~0dsMUKdNLEQ%w$M>RTX($v>5v0Lkr5} z%iu?cN8fQl|Gu)uLSSa7VWV9%)v(Wdh+NfBZ`aQljl_nJFC?!S#-RY0gK!e`(6W}8 zsNetg=C*Y*LnQ9g35PDOoYD=rn&Q@N3*dc0=OmxCqo^=wn0j4OQkit1R@$Li4y{bD z9NIj&qs^ORrv|K@leRqc3z=`mMppk!lH-hc&+D6wyF4MP7)j9y+dZMH4QRT??+=;( zG~X;fs$*^tHV5qm6@kYcOE<4fxd&`!*vKAbdA7sA-FbEeL>(5yf}DnRec0-1cL}X# zsuiE)M;fBz`XOdMQwsB8_pK zURL?ke-KA(w4iCamxOCcj03?Vm=F@Uf(aoU1rtIz3MPbb6if)=D3}nEQUDV|QVL)~ z$eX!|a1c&{5FP~KAhGPfqb!KK_?vyW0pV~9uaKei)O*U2O4YsCt&M)nTc*(agTICN ze*h$$EigAKh@x~iLYD>Wek%)Y-8^EA=dk@}6`zlt2bjPhV@n_Tx$kYsRzxqmk3ssv zT-zP?+0}IW;H~aX|H|8h`Opk9e+JJ|%{H%;2T!a60{8+`2b-$yeh!Ulw2U@`@6CJ9 z_KkJ~h#{k^E`negu!mGn&NsfdYi+9DBGTRka;7ke$}%vxj8Km<+)fft@z3Ht)FM;T zWY2A*Ws^$3bq@49k1ju}d%#c#Y+vQX6 zAM@)B3Mg5(&Dv5^((zRDGoR1%2Q>@}kt3enYfH$tISRBi9}sB)%k-WzGK%|1MIAi7 z6j|5bQt_H!GJd7?v<$sF=sEtD>3Sog;Td6m|9ohY`R&wHu_)vc}?5FPV3rn4)R z-HMv0baYRGqi{KORWPr$$b+pojiqhgtFP2+eB(Zsn80wCFu{CFdLGFsBIm}{BDt?bF-!=mUdq&P|_;71tdG+HuQM0x$#k1H$JV3kWwO@Mdq#h`H90KW?=kQjlx>QHr@}{g<9_gd?QJw<+Y%T&(ev{qK{NkH#-kiq0oC+h7|!?pk7eUd#qqJbWF%K zh|@B~MpInB9`R-&#nIsURTfr;V<}r2gY8D`GttW?{0uItlb7D67)Fb} zAIA+8KlcG;fu+-KAY4%-ntE)Hs75mJB2MR}O|>1ylZ$aZg3^M1uEKFih*k>b%b#Eg3sJI~e_g=X&16S%CKwEir`kU_uD% z!GsXjg9#z52NOaN4km=86u^WK)`JNltiOqH5D5RfZ1vwTdXtm?_b42M(I5r@#C(8Q zm%oMhHw=K8Zxa1wsIBcLfAN<0*jlf$<;NIqvnhsa9naF{Dzs92`(UAue^Ra5;u&ppZj}~=#_b=8dV9a)2i8}|MOBxT`Vy8BdjQ9o z?VwaWHTF`!hhASpX1@EB&Ag#dtO@2^QCNzq+(!=By$U{j{;n3Uy{_$3JYcZu8-{9v1?u`jK_ro2%apv)Mb$AcZ|*po`>tU*2PPX%bwZANf+V z<5yS*HasL^k)K>eO3UAv!<`cU>!A=>q_pcJRf!75(QvWfMylf6c zyJ4j)0TPG@IrGVnsr&^W@&~>Yb?U zZHKPbheSc@{>z#`3D&-5#$!FI!M-?(7(#1#>6hDFPEl=CT6Pbe*V5=XT!AH=%zoKV zy0q7QOg#KaW9MWE`6QT}>31z1&-C$?M)+cZ8pyI0{s)y4avpRDQ!dVLrPZ zr1R%eg}ZlJ8zsz#0*edcihm&-N*h#0{M2WAZJav6J?V_z?u`N6qVZBHCF6*hFkZrN z^MDiZw$ift_$!JST$R$;C@?QRSmrFue3A)z*iZL%&#m;l0gCVV2EtYP$@+gRE!HIs zM0S1ipx@plD|{RO#Iu5bGQ1tX$=ek|=0i#YtL?Af2uGM-uGjc~4LgnPecl{?wq~QJ zS2IpM7zyDhm=MBIFd>AaU_waD3?_sC7fc8NE|?GkTreR7xL`s^HUmruc{4W={^>?oI6jM91oX~9t7ckgYb?29E9*7_Tg{N<{yM_ zOmS+{%pi!Ud?f9St;sHXK;VP7MugAG{(c)7MLyRB$n~)!-}&amS`kK-n3(C>Fsd;r zdOcck6hF1PkfLAb;0t{FP}=u?^E=3mDI5Lk-}Nej6)*6uUfbm0-WeG;see_NvLE#s zSSUVk$3*aPsrHc@+1Vt=P^V^mOgqP zw<|8d8K;SP0L-rz7H?W6-S34@Q@PMxw)k2rxh*+4VI(g15Qq7Bl&3yW6j%iGhpYUV z@R((hR}Yf<)lIw4qasYHO9cWW5l({T2aAp$6$58@AZpp+WhS1Z4{GD>O-Rss7x|CW zEw=mPYB_zAXGxkm9$^gQl^pSYFDw76zSt6Mq`dfMh zpRcjG_YQkc-8)mwyH)bNzDNe>gXi`?V~TL$?@j0-?|SQIQK)eZR8uVdT-0CU?~x@0 zmJ>j0xZVrnJ$gF(&?08&TzPEmtpZ}GY3JQ+!4f$~+n<#kW@T^`ESX{xR4<74cacK$ zeU-BFCtw_-Kl@YCAsy_|DWr`)0$LEtZ|hxFe@T}h!nd)a%vbr|f{4nZP4#=RLlw39 ztVHkE-NOL8kmPX5oiEBBSA&p(9Qf%+23CvMJGi|*->PZ^e69W@pe#@q^!sh0{j_-! zo0Ou)jxae|9)j?EGBQ+LPpG=jf;7}G7k>)K*&8+nJrL=HsW%@?NBr0_<~i`XE08tZ zki+l2UDOX|k6%~4gC%HgAe?@PCBe=t$j5uqS>h^ge@Ejg*D3dwmQdM~c`iqyV><}- z6e$-Sdll0I2Q89sF{=_*XRCg%C*l#cZ@JsoVAiv%4na7W5Q1+ijLJ&@ZfDk0l4np|9nU5R)8i;)WLHOUi$qi>?a9?2PL|xspoj|s=c@)Jm zFLQbKAJlaj6i3VqtaOw&U}&Vpl=}{<(2KGrD@mUt!6zFdew+r*FLzq_xvt)S5)k`6 zxZoalOJ~bt3^=5HJ2ii=i%ZEnKpGhId;F)Y1WfL|h2jmq4;ALsG}Er0uX5)CPy5(= z&o+1h=l9*1fECq)fjT-z3>dNockV@R%`oea6|vDsn84nv!P}`Y^!}BB1081mV6}v^ zGl`kOvBiS!`7ximM}9h-Qk@1xiMPKA)kDJfNkD8&_nIfas;s#Z=5?ft4eHaY7xIWk zy^p73&^gcsqG$%8$EqV7HtZfEr;Jg7>=$F6X}El+*^F1@F9K?H{S^=rLw6ykC8m2CBgoHI<-Opmw74>GoT2l`ar>5}E3x_jTIZU$Nq)R_Dp zs2LE_?M+d!ct>Wg65kQNI&IN*{AOQ-Lz^H$GLt(OQ4h>TL^Wdg_U7gCU`YlZ`PC9z z&j=&zVlAB)r{vrl8Znaxih`0qAco(6HJw*`YGgruGP|m-WE| zOBWt9mJ0EHqm=$pYC*|EcX@YwF7x|Nu4V<&cde~V-y8wxy(+N+Gy6Gdcb#U|2_w$KdQ^gWajm5wH(0<2o%LC_tR}$C;sE~-q&$t#f2pew= zlP|t=d_EG(=D+jdOT6Sqm(dvUUzhGc*@o|!DRm|@?q><`jfJ(x8dcq~Op9=m>78!J zbfDWQJxm6=22J?M^My>B7^ATi1NFGCKfLRjSxaJU*9b&ow;w*m0m=gPk$>vdBRPdv z`lc!(@@@LnEmW7Y?G7dvSKo=!IM%rS_}cj*I0`Yl>UoEBKO#%c!Ljd(>kKbxcUEi; zI0aO-u|tFgFn*nn^It$*uOk%$QPYD-+A_$-h^J8vTgM|M`hH7PQ-H(tOJc11kgzbu zlIxpq4FSBIx+Q!Y8L@@&%eLAVp3+H1sPPosNd3i-K(pdQr_(h*YX9}ULoUYT%VxH* z2=Svhz71{c<25JJ6@LgI!Gush5%NERJrNSRmY=~FQpF8tyrHY@Y|mrfmg3I7Ul5K4oP5`?pVBjpVg{;)=5RMfV;JuF%E za~qgdyTV0Py@BDsf%L}DAe07i2q5O=e{d&%f-U?teV$IsrtP53(k1n7mD0ta$g0ED z6^z05Fp3q_*T6Li_Q-IgVOGjbJ`E(oo^`a9v~K*wGK8WRvZ|U%Z{Lmr*AGFv94qE} z^`7}Sk5fT}6vC%qV)O^$YYz0ZI45l8X?n2lw1D;R#2T-RUy

Mi{rTheo~9%Xsb@ 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 z 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

7Rgi~>UD+sGu6nZVHi;2XuSnl&=K>}v)i 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

df`vaiekargZ2hR4C_a09dsroFEHy3gG}cNO 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 Nb4M#c85v6MY#KTYWNsm| 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�xGb;7_b0p3lz6e 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 literal 0 HcmV?d00001 diff --git a/test/data/block928831.raw b/test/data/block928831.raw new file mode 100644 index 0000000000000000000000000000000000000000..1cfb441498566a70a283458e97136cffad0047f8 GIT binary patch literal 1804017 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≥x~tES@FzBY>(mL2zloUbd1|e9V{4~-zjMV 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 z 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[zd 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