From df4e287817e0506f2ecf66df081216739fcc5694 Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Mon, 4 Mar 2019 10:45:51 -0800 Subject: [PATCH] utils: custom inspect for objects --- lib/blockchain/chainentry.js | 3 ++- lib/btc/amount.js | 3 ++- lib/btc/uri.js | 3 ++- lib/hd/mnemonic.js | 3 ++- lib/net/hostlist.js | 3 ++- lib/net/netaddress.js | 3 ++- lib/net/packets.js | 3 ++- lib/net/peer.js | 3 ++- lib/net/pool.js | 3 ++- lib/primitives/address.js | 3 ++- lib/primitives/block.js | 3 ++- lib/primitives/coin.js | 3 ++- lib/primitives/headers.js | 3 ++- lib/primitives/input.js | 3 ++- lib/primitives/keyring.js | 3 ++- lib/primitives/merkleblock.js | 3 ++- lib/primitives/mtx.js | 3 ++- lib/primitives/outpoint.js | 3 ++- lib/primitives/output.js | 3 ++- lib/primitives/tx.js | 3 ++- lib/primitives/txmeta.js | 3 ++- lib/protocol/network.js | 3 ++- lib/script/program.js | 3 ++- lib/script/script.js | 3 ++- lib/script/scriptnum.js | 3 ++- lib/script/stack.js | 3 ++- lib/script/witness.js | 3 ++- lib/utils/index-browser.js | 17 +++++++++++++++++ lib/utils/index.js | 3 +++ lib/wallet/account.js | 3 ++- lib/wallet/masterkey.js | 3 ++- lib/wallet/path.js | 3 ++- lib/wallet/txdb.js | 3 ++- lib/wallet/wallet.js | 3 ++- package.json | 3 ++- test/address-test.js | 9 +++++++++ test/block-test.js | 6 +++++- test/chain-test.js | 9 +++++++++ test/coin-test.js | 9 +++++++++ test/hd-test.js | 9 +++++++++ test/outpoint-test.js | 10 ++++++++++ test/tx-test.js | 10 ++++++++++ test/wallet-test.js | 25 +++++++++++++++++++++++++ 43 files changed, 172 insertions(+), 34 deletions(-) create mode 100644 lib/utils/index-browser.js diff --git a/lib/blockchain/chainentry.js b/lib/blockchain/chainentry.js index 313ef567..4ad89f36 100644 --- a/lib/blockchain/chainentry.js +++ b/lib/blockchain/chainentry.js @@ -15,6 +15,7 @@ const hash256 = require('bcrypto/lib/hash256'); const util = require('../utils/util'); const Headers = require('../primitives/headers'); const InvItem = require('../primitives/invitem'); +const {inspectSymbol} = require('../utils'); /* * Constants @@ -349,7 +350,7 @@ class ChainEntry { * @returns {Object} */ - inspect() { + [inspectSymbol]() { const json = this.toJSON(); json.version = json.version.toString(16); return json; diff --git a/lib/btc/amount.js b/lib/btc/amount.js index 57a2883a..0dd2066f 100644 --- a/lib/btc/amount.js +++ b/lib/btc/amount.js @@ -8,6 +8,7 @@ const assert = require('bsert'); const fixed = require('../utils/fixed'); +const {inspectSymbol} = require('../utils'); /** * Amount @@ -296,7 +297,7 @@ class Amount { * @returns {String} */ - inspect() { + [inspectSymbol]() { return ``; } diff --git a/lib/btc/uri.js b/lib/btc/uri.js index a0eb2771..fa789479 100644 --- a/lib/btc/uri.js +++ b/lib/btc/uri.js @@ -9,6 +9,7 @@ const assert = require('bsert'); const Address = require('../primitives/address'); const Amount = require('./amount'); +const {inspectSymbol} = require('../utils'); /** * URI @@ -187,7 +188,7 @@ class URI { * @returns {String} */ - inspect() { + [inspectSymbol]() { return ``; } } diff --git a/lib/hd/mnemonic.js b/lib/hd/mnemonic.js index 8c34902a..d5932aab 100644 --- a/lib/hd/mnemonic.js +++ b/lib/hd/mnemonic.js @@ -16,6 +16,7 @@ const sha512 = require('bcrypto/lib/sha512'); const wordlist = require('./wordlist'); const common = require('./common'); const nfkd = require('./nfkd'); +const {inspectSymbol} = require('../utils'); /* * Constants @@ -508,7 +509,7 @@ class Mnemonic { * @returns {String} */ - inspect() { + [inspectSymbol]() { return ``; } diff --git a/lib/net/hostlist.js b/lib/net/hostlist.js index feeda353..ed313503 100644 --- a/lib/net/hostlist.js +++ b/lib/net/hostlist.js @@ -19,6 +19,7 @@ const Network = require('../protocol/network'); const NetAddress = require('./netaddress'); const common = require('./common'); const seeds = require('./seeds'); +const {inspectSymbol} = require('../utils'); /* * Constants @@ -1351,7 +1352,7 @@ class HostEntry { * @returns {Object} */ - inspect() { + [inspectSymbol]() { return { addr: this.addr, src: this.src, diff --git a/lib/net/netaddress.js b/lib/net/netaddress.js index a363add9..efcf4a4a 100644 --- a/lib/net/netaddress.js +++ b/lib/net/netaddress.js @@ -12,6 +12,7 @@ const IP = require('binet'); const Network = require('../protocol/network'); const util = require('../utils/util'); const common = require('./common'); +const {inspectSymbol} = require('../utils'); /** * Net Address @@ -456,7 +457,7 @@ class NetAddress { * @returns {Object} */ - inspect() { + [inspectSymbol]() { return '`; diff --git a/lib/primitives/address.js b/lib/primitives/address.js index c7c63dc4..6bb618c7 100644 --- a/lib/primitives/address.js +++ b/lib/primitives/address.js @@ -15,6 +15,7 @@ const hash160 = require('bcrypto/lib/hash160'); const hash256 = require('bcrypto/lib/hash256'); const Network = require('../protocol/network'); const consensus = require('../protocol/consensus'); +const {inspectSymbol} = require('../utils'); /* * Constants @@ -285,7 +286,7 @@ class Address { * @returns {Object} */ - inspect() { + [inspectSymbol]() { return '`; } diff --git a/lib/primitives/output.js b/lib/primitives/output.js index 9d8b8596..c24c1118 100644 --- a/lib/primitives/output.js +++ b/lib/primitives/output.js @@ -15,6 +15,7 @@ const Address = require('../primitives/address'); const Script = require('../script/script'); const consensus = require('../protocol/consensus'); const policy = require('../protocol/policy'); +const {inspectSymbol} = require('../utils'); /** * Represents a transaction output. @@ -187,7 +188,7 @@ class Output { * @returns {Object} */ - inspect() { + [inspectSymbol]() { return { type: this.getType(), value: Amount.btc(this.value), diff --git a/lib/primitives/tx.js b/lib/primitives/tx.js index c9fa8b5f..d3ead244 100644 --- a/lib/primitives/tx.js +++ b/lib/primitives/tx.js @@ -25,6 +25,7 @@ const policy = require('../protocol/policy'); const ScriptError = require('../script/scripterror'); const {encoding} = bio; const {hashType} = Script; +const {inspectSymbol} = require('../utils'); /** * TX @@ -2040,7 +2041,7 @@ class TX { * @returns {Object} */ - inspect() { + [inspectSymbol]() { return this.format(); } diff --git a/lib/primitives/txmeta.js b/lib/primitives/txmeta.js index 61e22f15..9b5402ed 100644 --- a/lib/primitives/txmeta.js +++ b/lib/primitives/txmeta.js @@ -10,6 +10,7 @@ const assert = require('bsert'); const bio = require('bufio'); const util = require('../utils/util'); const TX = require('./tx'); +const {inspectSymbol} = require('../utils'); /** * TXMeta @@ -118,7 +119,7 @@ class TXMeta { * @returns {Object} */ - inspect() { + [inspectSymbol]() { return this.format(); } diff --git a/lib/protocol/network.js b/lib/protocol/network.js index 6fd35cc2..f564be62 100644 --- a/lib/protocol/network.js +++ b/lib/protocol/network.js @@ -12,6 +12,7 @@ const binary = require('../utils/binary'); const networks = require('./networks'); const consensus = require('./consensus'); const TimeData = require('./timedata'); +const {inspectSymbol} = require('../utils'); /** * Network @@ -336,7 +337,7 @@ class Network { * @returns {String} */ - inspect() { + [inspectSymbol]() { return ``; } diff --git a/lib/script/program.js b/lib/script/program.js index fa562270..a68baf90 100644 --- a/lib/script/program.js +++ b/lib/script/program.js @@ -10,6 +10,7 @@ const assert = require('bsert'); const common = require('./common'); const scriptTypes = common.types; +const {inspectSymbol} = require('../utils'); /** * Witness Program @@ -84,7 +85,7 @@ class Program { * @returns {String} */ - inspect() { + [inspectSymbol]() { 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 fbcab8f2..6330a000 100644 --- a/lib/script/script.js +++ b/lib/script/script.js @@ -27,6 +27,7 @@ const Address = require('../primitives/address'); const opcodes = common.opcodes; const scriptTypes = common.types; const {encoding} = bio; +const {inspectSymbol} = require('../utils'); /* * Constants @@ -325,7 +326,7 @@ class Script { * @returns {String} Human-readable script code. */ - inspect() { + [inspectSymbol]() { return ``; } diff --git a/lib/script/scriptnum.js b/lib/script/scriptnum.js index 649e0310..0631fe06 100644 --- a/lib/script/scriptnum.js +++ b/lib/script/scriptnum.js @@ -9,6 +9,7 @@ const assert = require('bsert'); const {I64} = require('n64'); const ScriptError = require('./scripterror'); +const {inspectSymbol} = require('../utils'); /* * Constants @@ -201,7 +202,7 @@ class ScriptNum extends I64 { * @returns {String} */ - inspect() { + [inspectSymbol]() { return ``; } diff --git a/lib/script/stack.js b/lib/script/stack.js index ff74ab4d..4ec14e82 100644 --- a/lib/script/stack.js +++ b/lib/script/stack.js @@ -10,6 +10,7 @@ const assert = require('bsert'); const common = require('./common'); const ScriptNum = require('./scriptnum'); +const {inspectSymbol} = require('../utils'); /** * Stack @@ -80,7 +81,7 @@ class Stack { * @returns {String} Human-readable stack. */ - inspect() { + [inspectSymbol]() { return ``; } diff --git a/lib/script/witness.js b/lib/script/witness.js index 69271705..27d8bc3c 100644 --- a/lib/script/witness.js +++ b/lib/script/witness.js @@ -15,6 +15,7 @@ const Address = require('../primitives/address'); const Stack = require('./stack'); const {encoding} = bio; const scriptTypes = common.types; +const {inspectSymbol} = require('../utils'); /** * Witness @@ -170,7 +171,7 @@ class Witness extends Stack { * @returns {String} Human-readable script. */ - inspect() { + [inspectSymbol]() { return ``; } diff --git a/lib/utils/index-browser.js b/lib/utils/index-browser.js new file mode 100644 index 00000000..4de1817a --- /dev/null +++ b/lib/utils/index-browser.js @@ -0,0 +1,17 @@ +/*! + * utils/index.js - utils for bcoin + * Copyright (c) 2014-2017, Christopher Jeffrey (MIT License). + * https://github.com/bcoin-org/bcoin + */ + +'use strict'; + +/** + * @module utils + */ + +exports.binary = require('./binary'); +exports.fixed = require('./fixed'); +exports.util = require('./util'); + +exports.inspectSymbol = 'inspect'; diff --git a/lib/utils/index.js b/lib/utils/index.js index ef46911d..2ec261eb 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -13,3 +13,6 @@ exports.binary = require('./binary'); exports.fixed = require('./fixed'); exports.util = require('./util'); + +const {inspect: {custom}} = require('util'); +exports.inspectSymbol = custom; diff --git a/lib/wallet/account.js b/lib/wallet/account.js index 271cc171..b83e5a81 100644 --- a/lib/wallet/account.js +++ b/lib/wallet/account.js @@ -14,6 +14,7 @@ const common = require('./common'); const Script = require('../script/script'); const WalletKey = require('./walletkey'); const {HDPublicKey} = require('../hd/hd'); +const {inspectSymbol} = require('../utils'); /** * Account @@ -772,7 +773,7 @@ class Account { * @returns {Object} */ - inspect() { + [inspectSymbol]() { const receive = this.receiveAddress(); const change = this.changeAddress(); const nested = this.nestedAddress(); diff --git a/lib/wallet/masterkey.js b/lib/wallet/masterkey.js index 71be8944..d1786e4a 100644 --- a/lib/wallet/masterkey.js +++ b/lib/wallet/masterkey.js @@ -21,6 +21,7 @@ const util = require('../utils/util'); const HDPrivateKey = require('../hd/private'); const Mnemonic = require('../hd/mnemonic'); const {encoding} = bio; +const {inspectSymbol} = require('../utils'); /** * Master Key @@ -680,7 +681,7 @@ class MasterKey { * @returns {Object} */ - inspect() { + [inspectSymbol]() { const json = this.toJSON(null, true); if (this.key) diff --git a/lib/wallet/path.js b/lib/wallet/path.js index cd5167ca..b566bbac 100644 --- a/lib/wallet/path.js +++ b/lib/wallet/path.js @@ -10,6 +10,7 @@ const assert = require('bsert'); const bio = require('bufio'); const Address = require('../primitives/address'); const {encoding} = bio; +const {inspectSymbol} = require('../utils'); /** * Path @@ -295,7 +296,7 @@ class Path { * @returns {String} */ - inspect() { + [inspectSymbol]() { return ``; } } diff --git a/lib/wallet/txdb.js b/lib/wallet/txdb.js index 7af7b69a..7dad796d 100644 --- a/lib/wallet/txdb.js +++ b/lib/wallet/txdb.js @@ -20,6 +20,7 @@ const layout = require('./layout').txdb; const consensus = require('../protocol/consensus'); const policy = require('../protocol/policy'); const {TXRecord} = records; +const {inspectSymbol} = require('../utils'); /** * TXDB @@ -2156,7 +2157,7 @@ class Balance { * @param {String} */ - inspect() { + [inspectSymbol]() { return ' { @@ -182,4 +183,12 @@ describe('Address', function() { + 'zdkfs4nce4xj0gdcccefvpysxf3pjxtptv'; assert.throws(() => Address.fromString(addr, 'main')); }); + + it('should inspect', () => { + const obj = new Address(); + const fmt = nodejsUtil.format(obj); + assert(typeof fmt === 'string'); + assert(fmt.includes('Address')); + assert(fmt.includes('str=')); + }); }); diff --git a/test/block-test.js b/test/block-test.js index b4ed2d6d..2ff7848a 100644 --- a/test/block-test.js +++ b/test/block-test.js @@ -11,6 +11,7 @@ const Block = require('../lib/primitives/block'); const MerkleBlock = require('../lib/primitives/merkleblock'); const consensus = require('../lib/protocol/consensus'); const Script = require('../lib/script/script'); +const nodejsUtil = require('util'); const bip152 = require('../lib/net/bip152'); const CompactBlock = bip152.CompactBlock; const TXRequest = bip152.TXRequest; @@ -107,7 +108,10 @@ describe('Block', function() { it('should inspect a block with a witness commitment', () => { const [block] = block482683.getBlock(); - assert(block.inspect()); + const fmt = nodejsUtil.format(block); + assert(typeof fmt === 'string'); + assert(fmt.includes('Block')); + assert(fmt.includes('commitmentHash')); }); it('should create a merkle block', () => { diff --git a/test/chain-test.js b/test/chain-test.js index 59e79a31..d50237ac 100644 --- a/test/chain-test.js +++ b/test/chain-test.js @@ -15,6 +15,7 @@ const MemWallet = require('./util/memwallet'); const Network = require('../lib/protocol/network'); const Output = require('../lib/primitives/output'); const common = require('../lib/blockchain/common'); +const nodejsUtil = require('util'); const Opcode = require('../lib/script/opcode'); const opcodes = Script.opcodes; @@ -883,6 +884,14 @@ describe('Chain', function() { assert.strictEqual(await mineBlock(job), 'bad-blk-sigops'); }); + it('should inspect ChainEntry', async () => { + const fmt = nodejsUtil.format(tip1); + assert(typeof fmt === 'string'); + assert(fmt.includes('hash')); + assert(fmt.includes('version')); + assert(fmt.includes('chainwork')); + }); + it('should cleanup', async () => { await miner.close(); await chain.close(); diff --git a/test/coin-test.js b/test/coin-test.js index e35eb24b..c47e0131 100644 --- a/test/coin-test.js +++ b/test/coin-test.js @@ -6,6 +6,7 @@ const Coin = require('../lib/primitives/coin'); const assert = require('./util/assert'); const common = require('../test/util/common'); +const nodejsUtil = require('util'); const tx1 = common.readTX('tx1'); const coin1 = common.readFile('coin1.raw'); @@ -39,4 +40,12 @@ describe('Coin', function() { assert.strictEqual(coin.coinbase, false); assert.strictEqual(coin.index, 0); }); + + it('should inspect Coin', () => { + const coin = new Coin(); + const fmt = nodejsUtil.format(coin); + assert(typeof fmt === 'string'); + assert(fmt.includes('coinbase')); + assert(fmt.includes('script')); + }); }); diff --git a/test/hd-test.js b/test/hd-test.js index 72c4bbaf..367bb75f 100644 --- a/test/hd-test.js +++ b/test/hd-test.js @@ -11,6 +11,7 @@ const HD = require('../lib/hd'); const vectors = require('./data/hd.json'); const vector1 = vectors.vector1; const vector2 = vectors.vector2; +const nodejsUtil = require('util'); let master = null; let child = null; @@ -101,6 +102,14 @@ describe('HD', function() { key.toBase58('main')); }); + it('should inspect Mnemonic', () => { + const mne = new HD.Mnemonic(); + const fmt = nodejsUtil.format(mne); + assert(typeof fmt === 'string'); + assert(fmt.includes('Mnemonic')); + assert.strictEqual(fmt.split(' ').length, 13); + }); + for (const vector of [vector1, vector2]) { let master = null; diff --git a/test/outpoint-test.js b/test/outpoint-test.js index cab9ae7e..0d72cab6 100644 --- a/test/outpoint-test.js +++ b/test/outpoint-test.js @@ -7,6 +7,7 @@ const assert = require('./util/assert'); const common = require('./util/common'); const util = require('../lib/utils/util'); const TX = require('../lib/primitives/tx'); +const nodejsUtil = require('util'); const OUTPOINT_SIZE = 36; describe('Outpoint', () => { @@ -116,4 +117,13 @@ describe('Outpoint', () => { assert.bufferEqual(fromTX.hash, tx.hash()); assert.strictEqual(fromTX.index, index); }); + + it('should inspect Outpoint', () => { + const outpoint = new Outpoint(); + const fmt = nodejsUtil.format(outpoint); + assert(typeof fmt === 'string'); + assert(fmt.includes('Outpoint')); + assert(fmt.includes( + '0000000000000000000000000000000000000000000000000000000000000000')); + }); }); diff --git a/test/tx-test.js b/test/tx-test.js index e7100e07..8b31554b 100644 --- a/test/tx-test.js +++ b/test/tx-test.js @@ -22,6 +22,7 @@ const KeyRing = require('../lib/primitives/keyring'); const Address = require('../lib/primitives/address'); const BufferWriter = require('bufio').BufferWriter; const common = require('./util/common'); +const nodejsUtil = require('util'); // test files: https://github.com/bitcoin/bitcoin/tree/master/src/test/data const validTests = require('./data/core-data/tx-valid.json'); @@ -1112,4 +1113,13 @@ describe('TX', function() { assert.strictEqual(value1, value2); }); + + it('should inspect TX', () => { + const tx = new TX(); + const fmt = nodejsUtil.format(tx); + assert(typeof fmt === 'string'); + assert(fmt.includes('hash')); + assert(fmt.includes('version')); + assert(fmt.includes('locktime')); + }); }); diff --git a/test/wallet-test.js b/test/wallet-test.js index c21ddc4e..1cd9bb7e 100644 --- a/test/wallet-test.js +++ b/test/wallet-test.js @@ -19,6 +19,7 @@ const Outpoint = require('../lib/primitives/outpoint'); const Script = require('../lib/script/script'); const HD = require('../lib/hd'); const Wallet = require('../lib/wallet/wallet'); +const nodejsUtil = require('util'); const KEY1 = 'xprv9s21ZrQH143K3Aj6xQBymM31Zb4BVc7wxqfUhMZrzewdDVCt' + 'qUP9iWfcHgJofs25xbaUpCps9GDXj83NiWvQCAkWQhVj5J4CorfnpKX94AZ'; @@ -830,6 +831,30 @@ describe('Wallet', function() { assert.strictEqual(account.n, 1); }); + it('should inspect Wallet', async () => { + const wallet = await wdb.create(); + + const fmt = nodejsUtil.format(wallet); + assert(typeof fmt === 'string'); + assert(fmt.includes('master')); + assert(fmt.includes('network')); + assert(fmt.includes('accountDepth')); + }); + + it('should inspect Account', async () => { + const wallet = await wdb.create(); + const account = await wallet.createAccount({ + name: 'foo' + }); + + const fmt = nodejsUtil.format(account); + assert(typeof fmt === 'string'); + assert(fmt.includes('name')); + assert(fmt.includes('foo')); + assert(fmt.includes('initialized')); + assert(fmt.includes('lookahead')); + }); + it('should fail to create duplicate account', async () => { const wallet = await wdb.create(); const name = 'foo';