diff --git a/src/routes/v3/slp.js b/src/routes/v3/slp.js index 0bc7812..5fd0fda 100644 --- a/src/routes/v3/slp.js +++ b/src/routes/v3/slp.js @@ -390,11 +390,52 @@ async function balancesForAddress (req, res, next) { const query = { v: 3, q: { - db: ['a'], - find: { - address: bchjs.SLP.Address.toSLPAddress(address), - token_balance: { $gte: 0 } - }, + db: ['g'], + aggregate: [ + { + $match: { + 'graphTxn.outputs': { + $elemMatch: { + address: bchjs.SLP.Address.toSLPAddress(address), + status: 'UNSPENT', + slpAmount: { $gte: 0 } + } + } + } + }, + { + $unwind: '$graphTxn.outputs' + }, + { + $match: { + 'graphTxn.outputs.address': bchjs.SLP.Address.toSLPAddress( + address + ), + 'graphTxn.outputs.status': 'UNSPENT', + 'graphTxn.outputs.slpAmount': { $gte: 0 } + } + }, + { + $project: { + amount: '$graphTxn.outputs.slpAmount', + address: '$graphTxn.outputs.address', + txid: '$graphTxn.txid', + vout: '$graphTxn.outputs.vout', + tokenId: '$tokenDetails.tokenIdHex' + } + }, + { + $group: { + _id: '$tokenId', + balanceString: { + $sum: '$amount' + }, + slpAddress: { + $first: '$address' + } + } + } + ], limit: 10000 } } @@ -404,19 +445,17 @@ async function balancesForAddress (req, res, next) { const url = `${process.env.SLPDB_URL}q/${b64}` const tokenRes = await axios.get(url) + // console.log(`tokenRes.data.g: ${JSON.stringify(tokenRes.data.g, null, 2)}`) const tokenIds = [] - if (tokenRes.data.a.length > 0) { - tokenRes.data.a = tokenRes.data.a.map(token => { - token.tokenId = token.tokenDetails.tokenIdHex + if (tokenRes.data.g.length > 0) { + tokenRes.data.g = tokenRes.data.g.map(token => { + token.tokenId = token._id tokenIds.push(token.tokenId) - token.balance = parseFloat(token.token_balance) - token.slpAddress = token.address - delete token.tokenDetails - delete token.satoshis_balance - delete token.token_balance + token.balance = parseFloat(token.balanceString) + delete token._id - delete token.address + return token }) @@ -444,11 +483,14 @@ async function balancesForAddress (req, res, next) { const url2 = `${process.env.SLPDB_URL}q/${b642}` const tokenRes2 = await axios.get(url2) + // console.log(`tokenRes2.data: ${JSON.stringify(tokenRes2.data, null, 2)}`) + return tokenRes2.data }) const details = await axios.all(promises) - tokenRes.data.a = tokenRes.data.a.map(token => { + + tokenRes.data.g = tokenRes.data.g.map(token => { details.forEach(detail => { if (detail.t[0].tokenDetails.tokenIdHex === token.tokenId) { token.decimalCount = detail.t[0].tokenDetails.decimals @@ -457,8 +499,9 @@ async function balancesForAddress (req, res, next) { return token }) - return res.json(tokenRes.data.a) + return res.json(tokenRes.data.g) } + return res.json('No balance for this address') } catch (err) { wlogger.error('Error in slp.ts/balancesForAddress().', err) diff --git a/test/v3/mocks/slp-mocks.js b/test/v3/mocks/slp-mocks.js index 936600b..3081789 100644 --- a/test/v3/mocks/slp-mocks.js +++ b/test/v3/mocks/slp-mocks.js @@ -71,48 +71,19 @@ const mockSingleTokenError = { } const mockSingleAddress = { - a: [ + g: [ { - _id: '5c93ed62a19119333d1595bc', - tokenDetails: { - tokenIdHex: - '6b081fcd1f78b187be1464313dac8ff257251b727a42b613552a4040870aeb29' - }, - address: 'slptest:pz0qcslrqn7hr44hsszwl4lw5r6udkg6zqv7sq3kk7', - satoshis_balance: 546, - token_balance: '4616984' + _id: 'f05faf13a29c7f5e54ab921750aafb6afaa953db863bd2cf432e918661d4132f', + balanceString: '0.002382', + slpAddress: 'simpleledger:qpujxqra3jmdlzzapwmmt7uspr7q0c9ff5me5fdrdn' } ], t: [ { tokenDetails: { - decimals: 8, + decimals: 6, tokenIdHex: - '6b081fcd1f78b187be1464313dac8ff257251b727a42b613552a4040870aeb29', - timestamp: '2019-02-25 10:05', - transactionType: 'GENESIS', - versionType: 1, - documentUri: 'https://developer.bitcoin.com', - documentSha256Hex: '', - symbol: 'DEV', - name: 'DEVCOIN', - batonVout: 2, - containsBaton: true, - genesisOrMintQuantity: '500000000', - sendOutputs: null - }, - tokenStats: { - block_created: 571272, - block_last_active_send: 574758, - block_last_active_mint: 571272, - qty_valid_txns_since_genesis: 172, - qty_valid_token_utxos: 170, - qty_valid_token_addresses: 170, - qty_token_minted: '1000000000', - qty_token_burned: '4.99999995', - qty_token_circulating_supply: '999999995.00000005', - qty_satoshis_locked_up: 92820, - minting_baton_status: 'ALIVE' + 'f05faf13a29c7f5e54ab921750aafb6afaa953db863bd2cf432e918661d4132f' } } ] @@ -274,8 +245,7 @@ const mockTokenStats = { } const mockBalance = { - slpAddress: 'simpleledger:qp9d8mn8ypryfvea2mev0ggc3wg6plpn4suuaeuss3', - satoshis_balance: 546, + _id: 'simpleledger:qp9d8mn8ypryfvea2mev0ggc3wg6plpn4suuaeuss3', token_balance: '1000' } diff --git a/test/v3/slp.js b/test/v3/slp.js index 93729b3..0061c7a 100644 --- a/test/v3/slp.js +++ b/test/v3/slp.js @@ -505,12 +505,15 @@ describe('#SLP', () => { // console.log(`result: ${util.inspect(result)}`) assert.isArray(result) - assert.hasAllKeys(result[0], [ - 'tokenId', - 'balance', - 'slpAddress', - 'decimalCount' - ]) + + assert.property(result[0], 'tokenId') + assert.property(result[0], 'balanceString') + assert.property(result[0], 'slpAddress') + assert.property(result[0], 'balance') + assert.property(result[0], 'decimalCount') + + assert.isNumber(result[0].balance) + assert.isNumber(result[0].decimalCount) }) })