diff --git a/apps/ecash-herald/package-lock.json b/apps/ecash-herald/package-lock.json --- a/apps/ecash-herald/package-lock.json +++ b/apps/ecash-herald/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "axios": "^1.3.4", "axios-mock-adapter": "^1.21.4", + "bignumber.js": "^9.1.1", "chronik-client": "^0.8.2", "ecashaddrjs": "^1.2.0", "node-telegram-bot-api": "^0.61.0" @@ -1171,6 +1172,14 @@ "node": ">=0.6" } }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5812,6 +5821,11 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==" }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", diff --git a/apps/ecash-herald/package.json b/apps/ecash-herald/package.json --- a/apps/ecash-herald/package.json +++ b/apps/ecash-herald/package.json @@ -23,6 +23,7 @@ "dependencies": { "axios": "^1.3.4", "axios-mock-adapter": "^1.21.4", + "bignumber.js": "^9.1.1", "chronik-client": "^0.8.2", "ecashaddrjs": "^1.2.0", "node-telegram-bot-api": "^0.61.0" diff --git a/apps/ecash-herald/src/chronik.js b/apps/ecash-herald/src/chronik.js new file mode 100644 --- /dev/null +++ b/apps/ecash-herald/src/chronik.js @@ -0,0 +1,26 @@ +// Copyright (c) 2023 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. +'use strict'; +const { returnChronikTokenInfoPromise } = require('./utils'); + +module.exports = { + getTokenInfoMap: async function (chronik, tokenIdSet) { + let tokenInfoMap = new Map(); + const tokenInfoPromises = []; + tokenIdSet.forEach(tokenId => { + tokenInfoPromises.push( + returnChronikTokenInfoPromise(chronik, tokenId, tokenInfoMap), + ); + }); + + try { + await Promise.all(tokenInfoPromises); + } catch (err) { + console.log(`Error in await Promise.all(tokenInfoPromises)`, err); + console.log(`tokenIdSet`, tokenIdSet); + return false; + } + return tokenInfoMap; + }, +}; diff --git a/apps/ecash-herald/src/events.js b/apps/ecash-herald/src/events.js --- a/apps/ecash-herald/src/events.js +++ b/apps/ecash-herald/src/events.js @@ -6,6 +6,7 @@ const { parseBlock, getBlockTgMessage } = require('./parse'); const { getCoingeckoPrices } = require('./utils'); const { sendBlockSummary } = require('./telegram'); +const { getTokenInfoMap } = require('./chronik'); module.exports = { handleBlockConnected: async function ( @@ -58,6 +59,11 @@ const parsedBlock = parseBlock(blockDetails); + // Get token genesis info for token IDs in this block + const { tokenIds } = parsedBlock; + + const tokenInfoMap = await getTokenInfoMap(chronik, tokenIds); + // Get price info for tg msg, if available const { coingeckoResponse, coingeckoPrices } = await getCoingeckoPrices( config.priceApi, @@ -65,6 +71,7 @@ const blockSummaryTgMsgs = getBlockTgMessage( parsedBlock, coingeckoPrices, + tokenInfoMap, ); // returnMocks is used in the script function generateMocks @@ -77,10 +84,12 @@ parsedBlock, coingeckoResponse, coingeckoPrices, + tokenInfoMap, blockSummaryTgMsgs, - blockSummaryTgMsgsPriceFailure: getBlockTgMessage( + blockSummaryTgMsgsApiFailure: getBlockTgMessage( parsedBlock, - false, + false, // failed coingecko price lookup + false, // failed chronik token ID lookup ), }; } diff --git a/apps/ecash-herald/src/parse.js b/apps/ecash-herald/src/parse.js --- a/apps/ecash-herald/src/parse.js +++ b/apps/ecash-herald/src/parse.js @@ -5,6 +5,7 @@ 'use strict'; const config = require('../config'); const cashaddr = require('ecashaddrjs'); +const BigNumber = require('bignumber.js'); const { prepareStringForTelegramHTML, splitOverflowTgMsg, @@ -25,7 +26,17 @@ for (let i = 1; i < txs.length; i += 1) { parsedTxs.push(module.exports.parseTx(txs[i])); } - return { hash, height, miner, numTxs, parsedTxs }; + + // Collect token info needed to parse token send txs + const tokenIds = new Set(); // we only need each tokenId once + for (let i = 0; i < parsedTxs.length; i += 1) { + const thisParsedTx = parsedTxs[i]; + if (thisParsedTx.tokenSendInfo) { + tokenIds.add(thisParsedTx.tokenSendInfo.tokenId); + } + } + + return { hash, height, miner, numTxs, parsedTxs, tokenIds }; }, getMinerFromCoinbase: function (coinbaseHexString) { const knownMiners = config.knownMiners; @@ -52,6 +63,23 @@ let genesisInfo = false; let opReturnInfo = false; + /* Token send parsing info + * + * Note that token send amounts received from chronik do not account for + * token decimals. Decimalized amounts require token genesisInfo + * decimals param to calculate + */ + + /* tokenSendInfo + * `false` for txs that are not etoken send txs + * an object containing info about the token send for token send txs + */ + let tokenSendInfo = false; + let tokenSendingOutputScripts = new Set(); + let tokenReceivingOutputs = new Map(); + let tokenChangeOutputs = new Map(); + let undecimalizedTokenInputAmount = new BigNumber(0); + /* Collect xecSendInfo for all txs, since all txs are XEC sends * You may later want to render xecSendInfo for tokenSends, appTxs, etc, * maybe on special conditions, e.g.a token send tx that also sends a bunch of xec @@ -66,6 +94,7 @@ if (tx.slpTxData !== null && typeof tx.slpTxData !== 'undefined') { isTokenTx = true; + // Determine if this is an etoken genesis tx if ( tx.slpTxData.slpMeta !== null && typeof tx.slpTxData.slpMeta !== 'undefined' && @@ -75,11 +104,30 @@ ) { genesisInfo = tx.slpTxData.genesisInfo; } + // Determine if this is an etoken send tx + if ( + tx.slpTxData.slpMeta !== null && + typeof tx.slpTxData.slpMeta !== 'undefined' && + tx.slpTxData.slpMeta.txType === 'SEND' + ) { + // Initialize tokenSendInfo as an object with the sent tokenId + tokenSendInfo = { tokenId: tx.slpTxData.slpMeta.tokenId }; + } } for (let i in inputs) { const thisInput = inputs[i]; xecSendingOutputScripts.add(thisInput.outputScript); xecInputAmountSats += parseInt(thisInput.value); + // The input that sent the token utxos will have key 'slpToken' + if (typeof thisInput.slpToken !== 'undefined') { + // Add amount to undecimalizedTokenInputAmount + undecimalizedTokenInputAmount = + undecimalizedTokenInputAmount.plus( + thisInput.slpToken.amount, + ); + // Collect the input outputScripts to identify change output + tokenSendingOutputScripts.add(thisInput.outputScript); + } } // Iterate over outputs to check for OP_RETURN msgs @@ -120,12 +168,49 @@ thisOutput.outputScript, ); } + // For etoken send txs, parse outputs for tokenSendInfo object + if (typeof thisOutput.slpToken !== 'undefined') { + // Check output script to confirm does not match tokenSendingOutputScript + if (tokenSendingOutputScripts.has(thisOutput.outputScript)) { + // change + tokenChangeOutputs.set( + thisOutput.outputScript, + ( + tokenChangeOutputs.get(thisOutput.outputScript) ?? + new BigNumber(0) + ).plus(thisOutput.slpToken.amount), + ); + } else { + /* This is the sent token qty + * + * Add outputScript and undecimalizedTokenReceivedAmount to map + * If this outputScript is already in tokenReceivingOutputs, increment undecimalizedTokenReceivedAmount + * note that thisOutput.slpToken.amount is a string so you do not want to add it + * BigNumber library is required for token calculations + */ + tokenReceivingOutputs.set( + thisOutput.outputScript, + ( + tokenReceivingOutputs.get( + thisOutput.outputScript, + ) ?? new BigNumber(0) + ).plus(thisOutput.slpToken.amount), + ); + } + } } // Determine tx fee const txFee = xecInputAmountSats - xecOutputAmountSats; const satsPerByte = txFee / size; + // If this is a token send tx, return token send parsing info and not 'false' for tokenSendInfo + if (tokenSendInfo) { + tokenSendInfo.tokenChangeOutputs = tokenChangeOutputs; + tokenSendInfo.tokenReceivingOutputs = tokenReceivingOutputs; + tokenSendInfo.tokenSendingOutputScripts = tokenSendingOutputScripts; + } + return { txid, genesisInfo, @@ -134,6 +219,7 @@ xecSendingOutputScripts, xecChangeOutputs, xecReceivingOutputs, + tokenSendInfo, }; }, parseOpReturn: function (outputScript) { @@ -273,12 +359,13 @@ return { app, msg }; } }, - getBlockTgMessage: function (parsedBlock, coingeckoPrices) { + getBlockTgMessage: function (parsedBlock, coingeckoPrices, tokenInfoMap) { const { hash, height, miner, numTxs, parsedTxs } = parsedBlock; // Define newsworthy types of txs in parsedTxs // These arrays will be used to present txs in batches by type const genesisTxTgMsgLines = []; + const tokenSendTxTgMsgLines = []; const opReturnTxTgMsgLines = []; const xecSendTxTgMsgLines = []; @@ -293,6 +380,7 @@ xecSendingOutputScripts, xecChangeOutputs, xecReceivingOutputs, + tokenSendInfo, } = thisParsedTx; if (genesisInfo) { // The txid of a genesis tx is the tokenId @@ -321,6 +409,105 @@ // This parsed tx has a tg msg line. Move on to the next one. continue; } + // Only parse tokenSendInfo txs if you successfuly got tokenMapInfo from chronik + if (tokenSendInfo && tokenInfoMap) { + let { + tokenId, + tokenSendingOutputScripts, + tokenChangeOutputs, + tokenReceivingOutputs, + } = tokenSendInfo; + + // Get token info from tokenInfoMap + const thisTokenInfo = tokenInfoMap.get(tokenId); + + let { tokenTicker, tokenName, decimals } = thisTokenInfo; + // Note: tokenDocumentUrl and tokenDocumentHash are also available from thisTokenInfo + + // Make sure tokenName does not contain telegram html escape characters + tokenName = prepareStringForTelegramHTML(tokenName); + // Make sure tokenName does not contain telegram html escape characters + tokenTicker = prepareStringForTelegramHTML(tokenTicker); + + // Initialize tokenSendMsg + let tokenSendMsg; + + // Parse token self-send txs + if (tokenReceivingOutputs.size === 0) { + // self send tx + let undecimalizedTokenChangeAmount = new BigNumber(0); + for (const tokenChangeAmount of tokenChangeOutputs.values()) { + undecimalizedTokenChangeAmount = + undecimalizedTokenChangeAmount.plus( + tokenChangeAmount, + ); + } + // Calculate true tokenChangeAmount using decimals + // Use decimals to calculate the sent amount as string + const decimalizedTokenChangeAmount = new BigNumber( + undecimalizedTokenChangeAmount, + ) + .shiftedBy(-1 * decimals) + .toString(); + + // Self send tokenSendMsg + tokenSendMsg = `${tokenSendingOutputScripts.size} ${ + tokenSendingOutputScripts.size > 1 + ? 'addresses' + : 'address' + } sent ${decimalizedTokenChangeAmount} ${tokenTicker} to ${ + tokenSendingOutputScripts.size > 1 + ? 'themselves' + : 'itself' + }`; + } else { + // Normal token send tx + let undecimalizedTokenReceivedAmount = new BigNumber(0); + for (const tokenReceivedAmount of tokenReceivingOutputs.values()) { + undecimalizedTokenReceivedAmount = + undecimalizedTokenReceivedAmount.plus( + tokenReceivedAmount, + ); + } + // Calculate true tokenReceivedAmount using decimals + // Use decimals to calculate the received amount as string + const decimalizedTokenReceivedAmount = new BigNumber( + undecimalizedTokenReceivedAmount, + ) + .shiftedBy(-1 * decimals) + .toString(); + tokenSendMsg = `${returnAddressPreview( + cashaddr.encodeOutputScript( + tokenSendingOutputScripts.values().next().value, + ), + )} sent ${decimalizedTokenReceivedAmount.toLocaleString( + 'en-US', + { + minimumFractionDigits: decimals, + }, + )} ${tokenTicker} to ${returnAddressPreview( + cashaddr.encodeOutputScript( + tokenReceivingOutputs.keys().next().value, + ), + )}${ + tokenReceivingOutputs.size > 1 + ? ` and ${tokenReceivingOutputs.size - 1} others` + : '' + }`; + } + + tokenSendTxTgMsgLines.push(tokenSendMsg); + // This parsed tx has a tg msg line. Move on to the next one. + continue; + } // Txs not parsed above are parsed as xec send txs /* We do the totalSatsSent calculation here in getBlockTgMsg and not above in parseTx @@ -429,6 +616,23 @@ tgMsg = tgMsg.concat(genesisTxTgMsgLines); } + // eToken Send txs + if (tokenSendTxTgMsgLines.length > 0) { + // Line break for new section + tgMsg.push(''); + + // 1 eToken send tx: + // or + // eToken send txs: + tgMsg.push( + `${tokenSendTxTgMsgLines.length} eToken send tx${ + tokenSendTxTgMsgLines.length > 1 ? `s` : '' + }`, + ); + + tgMsg = tgMsg.concat(tokenSendTxTgMsgLines); + } + // OP_RETURN txs if (opReturnTxTgMsgLines.length > 0) { // Line break for new section diff --git a/apps/ecash-herald/src/utils.js b/apps/ecash-herald/src/utils.js --- a/apps/ecash-herald/src/utils.js +++ b/apps/ecash-herald/src/utils.js @@ -5,6 +5,7 @@ 'use strict'; const axios = require('axios'); const config = require('../config'); +const BigNumber = require('bignumber.js'); module.exports = { returnAddressPreview: function (cashAddress, sliceSize = 3) { @@ -102,9 +103,32 @@ }, jsonReplacer: function (key, value) { if (value instanceof Map) { + const keyValueArray = Array.from(value.entries()); + + for (let i = 0; i < keyValueArray.length; i += 1) { + const thisKeyValue = keyValueArray[i]; // [key, value] + // If this is not an empty map + if (typeof thisKeyValue !== 'undefined') { + // Note: this value is an array of length 2 + // [key, value] + // Check if value is a big number + if (thisKeyValue[1] instanceof BigNumber) { + // Replace it + thisKeyValue[1] = { + // Note, if you use dataType: 'BigNumber', it will not work + // This must be reserved + // Use a term that is definitely not reserved but also recognizable as + // "the dev means BigNumber here" + dataType: 'BigNumberReplacer', + value: thisKeyValue[1].toString(), + }; + } + } + } + return { dataType: 'Map', - value: Array.from(value.entries()), + value: keyValueArray, }; } else if (value instanceof Set) { return { @@ -118,6 +142,33 @@ jsonReviver: function (key, value) { if (typeof value === 'object' && value !== null) { if (value.dataType === 'Map') { + // If the map is not empty + if (typeof value.value[0] !== 'undefined') { + /* value.value is an array of keyValue arrays + * e.g. + * [ + * [key1, value1], + * [key2, value2], + * [key3, value3], + * ] + */ + // Iterate over each keyValue of the map + for (let i = 0; i < value.value.length; i += 1) { + const thisKeyValuePair = value.value[i]; // [key, value] + let thisValue = thisKeyValuePair[1]; + if ( + thisValue && + thisValue.dataType === 'BigNumberReplacer' + ) { + // If this is saved BigNumber, replace it with an actual BigNumber + // note, you can't use thisValue = new BigNumber(thisValue.value) + // Need to use this specific array entry + value.value[i][1] = new BigNumber( + value.value[i][1].value, + ); + } + } + } return new Map(value.value); } if (value.dataType === 'Set') { @@ -126,4 +177,31 @@ } return value; }, + returnChronikTokenInfoPromise: function (chronik, tokenId, tokenInfoMap) { + /* returnChronikTokenInfoPromise + * + * For best performance, we want to use Promise.all() to make several + * chronik API calls at the same time + * + * This function returns a promise to ask chronik for token genesis info + * and add this info to a map + */ + return new Promise((resolve, reject) => { + chronik.tx(tokenId).then( + txDetails => { + console.assert( + typeof txDetails.slpTxData.genesisInfo !== 'undefined', + `Error: no genesisInfo object for ${tokenId}`, + ); + // Note: txDetails.slpTxData.genesisInfo only exists for token genesis txs + const genesisInfo = txDetails.slpTxData.genesisInfo; + tokenInfoMap.set(tokenId, genesisInfo); + resolve(true); + }, + err => { + reject(err); + }, + ); + }); + }, }; diff --git a/apps/ecash-herald/test/chronikTests.js b/apps/ecash-herald/test/chronikTests.js new file mode 100644 --- /dev/null +++ b/apps/ecash-herald/test/chronikTests.js @@ -0,0 +1,87 @@ +// Copyright (c) 2023 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. +'use strict'; +const assert = require('assert'); +const { MockChronikClient } = require('./mocks/chronikMock'); +const { getTokenInfoMap } = require('../src/chronik'); +const { tx } = require('./mocks/chronikResponses'); +// Initialize chronik on app startup + +const TOKEN_ID_SET = new Set([ + '3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109', // BearNip + 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a', // POW + '54dc2ecd5251f8dfda4c4f15ce05272116b01326076240e2b9cc0104d33b1484', // Alita +]); + +describe('chronik.js functions', function () { + it('getTokenInfoMap returns a map of expected format given an array of tokenIds', async function () { + // Initialize chronik mock + const mockedChronik = new MockChronikClient(); + + const expectedTokenInfoMap = new Map(); + // Tell mockedChronik what responses we expect + // Also build the expected map result from these responses + TOKEN_ID_SET.forEach(tokenId => { + mockedChronik.setMock('tx', { + input: tokenId, + output: tx[tokenId], + }); + expectedTokenInfoMap.set( + tokenId, + tx[tokenId].slpTxData.genesisInfo, + ); + }); + const tokenInfoMap = await getTokenInfoMap(mockedChronik, TOKEN_ID_SET); + + assert.deepEqual(tokenInfoMap, expectedTokenInfoMap); + }); + it('getTokenInfoMap returns a map of expected format given an array of one tokenId', async function () { + // Initialize chronik mock + const mockedChronik = new MockChronikClient(); + + const expectedTokenInfoMap = new Map(); + // Tell mockedChronik what responses we expect + // Also build the expected map result from these responses + + // Create a set of only one token id + const thisTokenId = TOKEN_ID_SET.values().next().value; + const tokenIdSet = new Set(); + tokenIdSet.add(thisTokenId); + mockedChronik.setMock('tx', { + input: thisTokenId, + output: tx[thisTokenId], + }); + expectedTokenInfoMap.set( + thisTokenId, + tx[thisTokenId].slpTxData.genesisInfo, + ); + const tokenInfoMap = await getTokenInfoMap(mockedChronik, tokenIdSet); + + assert.deepEqual(tokenInfoMap, expectedTokenInfoMap); + }); + it('getTokenInfoMap returns false if there is an error in any chronik call', async function () { + // Initialize chronik mock + const mockedChronik = new MockChronikClient(); + + const TOKEN_ID_ARRAY = Array.from(TOKEN_ID_SET); + // Tell mockedChronik what responses we expect + // Include one error response + mockedChronik.setMock('tx', { + input: TOKEN_ID_ARRAY[0], + output: tx[TOKEN_ID_ARRAY[0]], + }); + mockedChronik.setMock('tx', { + input: TOKEN_ID_ARRAY[1], + output: tx[TOKEN_ID_ARRAY[1]], + }); + mockedChronik.setMock('tx', { + input: TOKEN_ID_ARRAY[2], + output: new Error('some error'), + }); + + const tokenInfoMap = await getTokenInfoMap(mockedChronik, TOKEN_ID_SET); + + assert.strictEqual(tokenInfoMap, false); + }); +}); diff --git a/apps/ecash-herald/test/chronikWsHandlerTests.js b/apps/ecash-herald/test/chronikWsHandlerTests.js --- a/apps/ecash-herald/test/chronikWsHandlerTests.js +++ b/apps/ecash-herald/test/chronikWsHandlerTests.js @@ -6,7 +6,9 @@ const assert = require('assert'); const config = require('../config'); const cashaddr = require('ecashaddrjs'); -const blocks = require('./mocks/blocks'); +const unrevivedBlocks = require('./mocks/blocks'); +const { jsonReviver } = require('../src/utils'); +const blocks = JSON.parse(JSON.stringify(unrevivedBlocks), jsonReviver); const { initializeWebsocket, parseWebsocketMessage, @@ -109,11 +111,11 @@ assert.deepEqual(result, false); } }); - it('parseWebsocketMessage creates and sends a telegram msg with prices for all mocked blocks on successful price API call', async function () { - // Initialize chronik mock - const mockedChronik = new MockChronikClient(); - + it('parseWebsocketMessage creates and sends a telegram msg with prices and token send info for all mocked blocks on successful API calls', async function () { for (let i = 0; i < blocks.length; i += 1) { + // Initialize new chronik mock for each block + const mockedChronik = new MockChronikClient(); + const thisBlock = blocks[i]; const thisBlockHash = thisBlock.blockDetails.blockInfo.hash; const thisBlockChronikBlockResponse = thisBlock.blockDetails; @@ -123,6 +125,24 @@ input: thisBlockHash, output: thisBlockChronikBlockResponse, }); + // Tell mockedChronik what response we expect for chronik.tx + const { parsedBlock, tokenInfoMap } = thisBlock; + const { tokenIds } = parsedBlock; + // Will only have chronik call if the set is not empty + if (tokenIds.size > 0) { + // Instead of saving all the chronik responses as mocks, which would be very large + // Just set them as mocks based on tokenInfoMap, which contains the info we need + tokenIds.forEach(tokenId => { + mockedChronik.setMock('tx', { + input: tokenId, + output: { + slpTxData: { + genesisInfo: tokenInfoMap.get(tokenId), + }, + }, + }); + }); + } const thisBlockExpectedMsgs = thisBlock.blockSummaryTgMsgs; // Mock a chronik websocket msg of correct format @@ -166,11 +186,10 @@ assert.deepEqual(result, msgSuccessArray); } }); - it('parseWebsocketMessage creates and sends a telegram msg without prices for all mocked blocks on failed price API call', async function () { - // Initialize chronik mock - const mockedChronik = new MockChronikClient(); - + it('parseWebsocketMessage creates and sends a telegram msg without prices or token send info for all mocked blocks on failed API calls', async function () { for (let i = 0; i < blocks.length; i += 1) { + // Initialize new chronik mock for each block + const mockedChronik = new MockChronikClient(); const thisBlock = blocks[i]; const thisBlockHash = thisBlock.blockDetails.blockInfo.hash; const thisBlockChronikBlockResponse = thisBlock.blockDetails; @@ -179,9 +198,36 @@ mockedChronik.setMock('block', { input: thisBlockHash, output: thisBlockChronikBlockResponse, - }); + }); // Tell mockedChronik what response we expect for chronik.tx + const { parsedBlock, tokenInfoMap } = thisBlock; + const { tokenIds } = parsedBlock; + // Will only have chronik call if the set is not empty + if (tokenIds.size > 0) { + // Instead of saving all the chronik responses as mocks, which would be very large + // Just set them as mocks based on tokenInfoMap, which contains the info we need + let index = 0; + tokenIds.forEach(tokenId => { + // If this is the first one, set an error response + if (index === 0) { + mockedChronik.setMock('tx', { + input: tokenId, + output: new Error('some error'), + }); + } else { + index += 1; + mockedChronik.setMock('tx', { + input: tokenId, + output: { + slpTxData: { + genesisInfo: tokenInfoMap.get(tokenId), + }, + }, + }); + } + }); + } const thisBlockExpectedMsgs = - thisBlock.blockSummaryTgMsgsPriceFailure; + thisBlock.blockSummaryTgMsgsApiFailure; // Mock a chronik websocket msg of correct format const mockWsMsg = { @@ -226,10 +272,10 @@ } }); it('parseWebsocketMessage returns false if telegram msg fails to send', async function () { - // Initialize chronik mock - const mockedChronik = new MockChronikClient(); - for (let i = 0; i < blocks.length; i += 1) { + // Initialize new chronik mock for each block + const mockedChronik = new MockChronikClient(); + const thisBlock = blocks[i]; const thisBlockHash = thisBlock.blockDetails.blockInfo.hash; const thisBlockChronikBlockResponse = thisBlock.blockDetails; @@ -240,6 +286,35 @@ output: thisBlockChronikBlockResponse, }); + // Tell mockedChronik what response we expect for chronik.tx + const { parsedBlock, tokenInfoMap } = thisBlock; + const { tokenIds } = parsedBlock; + // Will only have chronik call if the set is not empty + if (tokenIds.size > 0) { + // Instead of saving all the chronik responses as mocks, which would be very large + // Just set them as mocks based on tokenInfoMap, which contains the info we need + let index = 0; + tokenIds.forEach(tokenId => { + // If this is the first one, set an error response + if (index === 0) { + mockedChronik.setMock('tx', { + input: tokenId, + output: new Error('some error'), + }); + } else { + index += 1; + mockedChronik.setMock('tx', { + input: tokenId, + output: { + slpTxData: { + genesisInfo: tokenInfoMap.get(tokenId), + }, + }, + }); + } + }); + } + // Mock a chronik websocket msg of correct format const mockWsMsg = { type: 'BlockConnected', diff --git a/apps/ecash-herald/test/eventsTests.js b/apps/ecash-herald/test/eventsTests.js --- a/apps/ecash-herald/test/eventsTests.js +++ b/apps/ecash-herald/test/eventsTests.js @@ -5,7 +5,9 @@ 'use strict'; const assert = require('assert'); const config = require('../config'); -const blocks = require('./mocks/blocks'); +const unrevivedBlocks = require('./mocks/blocks'); +const { jsonReviver } = require('../src/utils'); +const blocks = JSON.parse(JSON.stringify(unrevivedBlocks), jsonReviver); const { handleBlockConnected } = require('../src/events'); const { MockChronikClient } = require('./mocks/chronikMock'); @@ -15,11 +17,10 @@ const MockAdapter = require('axios-mock-adapter'); describe('ecash-herald events.js', async function () { - it('handleBlockConnected creates and sends a telegram msg with price info for all mocked blocks if api call succeeds', async function () { - // Initialize chronik mock - const mockedChronik = new MockChronikClient(); - + it('handleBlockConnected creates and sends a telegram msg with price and token send info for all mocked blocks if api call succeeds', async function () { for (let i = 0; i < blocks.length; i += 1) { + // Initialize new chronik mock for each block + const mockedChronik = new MockChronikClient(); const thisBlock = blocks[i]; const thisBlockHash = thisBlock.blockDetails.blockInfo.hash; const thisBlockChronikBlockResponse = thisBlock.blockDetails; @@ -29,6 +30,26 @@ input: thisBlockHash, output: thisBlockChronikBlockResponse, }); + + // Tell mockedChronik what response we expect for chronik.tx + const { parsedBlock, tokenInfoMap } = thisBlock; + const { tokenIds } = parsedBlock; + // Will only have chronik call if the set is not empty + if (tokenIds.size > 0) { + // Instead of saving all the chronik responses as mocks, which would be very large + // Just set them as mocks based on tokenInfoMap, which contains the info we need + tokenIds.forEach(tokenId => { + mockedChronik.setMock('tx', { + input: tokenId, + output: { + slpTxData: { + genesisInfo: tokenInfoMap.get(tokenId), + }, + }, + }); + }); + } + const thisBlockExpectedMsgs = thisBlock.blockSummaryTgMsgs; const telegramBot = new MockTelegramBot(); @@ -70,22 +91,50 @@ assert.deepEqual(result, msgSuccessArray); } }); - it('handleBlockConnected creates and sends a telegram msg without price info for all mocked blocks if api call fails', async function () { - // Initialize chronik mock - const mockedChronik = new MockChronikClient(); - + it('handleBlockConnected creates and sends a telegram msg without price or token info for all mocked blocks if api calls fail', async function () { for (let i = 0; i < blocks.length; i += 1) { const thisBlock = blocks[i]; const thisBlockHash = thisBlock.blockDetails.blockInfo.hash; const thisBlockChronikBlockResponse = thisBlock.blockDetails; + // Initialize chronik mock for each block + const mockedChronik = new MockChronikClient(); + // Tell mockedChronik what response we expect for chronik.block(thisBlockHash) mockedChronik.setMock('block', { input: thisBlockHash, output: thisBlockChronikBlockResponse, }); + // Tell mockedChronik what response we expect for chronik.tx + const { parsedBlock, tokenInfoMap } = thisBlock; + const { tokenIds } = parsedBlock; + // Will only have chronik call if the set is not empty + if (tokenIds.size > 0) { + // Instead of saving all the chronik responses as mocks, which would be very large + // Just set them as mocks based on tokenInfoMap, which contains the info we need + let index = 0; + tokenIds.forEach(tokenId => { + // If this is the first one, set an error response + if (index === 0) { + mockedChronik.setMock('tx', { + input: tokenId, + output: new Error('some error'), + }); + } else { + index += 1; + mockedChronik.setMock('tx', { + input: tokenId, + output: { + slpTxData: { + genesisInfo: tokenInfoMap.get(tokenId), + }, + }, + }); + } + }); + } const thisBlockExpectedMsgs = - thisBlock.blockSummaryTgMsgsPriceFailure; + thisBlock.blockSummaryTgMsgsApiFailure; const telegramBot = new MockTelegramBot(); const channelId = mockChannelId; @@ -125,9 +174,9 @@ } }); it('handleBlockConnected sends desired backup msg if it encounters an error in message creation', async function () { - // Initialize chronik mock - const mockedChronik = new MockChronikClient(); for (let i = 0; i < blocks.length; i += 1) { + // Initialize new chronik mock for each block + const mockedChronik = new MockChronikClient(); const thisBlock = blocks[i]; const thisBlockHash = thisBlock.blockDetails.blockInfo.hash; @@ -165,10 +214,11 @@ it('handleBlockConnected returns false if it encounters an error in telegram bot sendMessage routine', async function () { const wsTestAddress = 'ecash:prfhcnyqnl5cgrnmlfmms675w93ld7mvvqd0y8lz07'; - // Initialize chronik mock - const mockedChronik = new MockChronikClient(wsTestAddress, []); for (let i = 0; i < blocks.length; i += 1) { + // Initialize new chronik mock for each block + const mockedChronik = new MockChronikClient(wsTestAddress, []); + const thisBlock = blocks[i]; const thisBlockHash = thisBlock.blockDetails.blockInfo.hash; const thisBlockChronikBlockResponse = thisBlock.blockDetails; @@ -179,6 +229,35 @@ output: thisBlockChronikBlockResponse, }); + // Tell mockedChronik what response we expect for chronik.tx + const { parsedBlock, tokenInfoMap } = thisBlock; + const { tokenIds } = parsedBlock; + // Will only have chronik call if the set is not empty + if (tokenIds.size > 0) { + // Instead of saving all the chronik responses as mocks, which would be very large + // Just set them as mocks based on tokenInfoMap, which contains the info we need + let index = 0; + tokenIds.forEach(tokenId => { + // If this is the first one, set an error response + if (index === 0) { + mockedChronik.setMock('tx', { + input: tokenId, + output: new Error('some error'), + }); + } else { + index += 1; + mockedChronik.setMock('tx', { + input: tokenId, + output: { + slpTxData: { + genesisInfo: tokenInfoMap.get(tokenId), + }, + }, + }); + } + }); + } + const telegramBot = new MockTelegramBot(); telegramBot.setExpectedError( 'sendMessage', diff --git a/apps/ecash-herald/test/mocks/blocks.js b/apps/ecash-herald/test/mocks/blocks.js --- a/apps/ecash-herald/test/mocks/blocks.js +++ b/apps/ecash-herald/test/mocks/blocks.js @@ -69,40 +69,48 @@ "height": 0, "miner": "unknown", "numTxs": "1", - "parsedTxs": [] + "parsedTxs": [], + "tokenIds": { + "dataType": "Set", + "value": [] + } }, "coingeckoResponse": { "bitcoin": { - "usd": 29197.29473491 + "usd": 29452.48207906 }, "ecash": { - "usd": 0.00002841 + "usd": 0.00002843 }, "ethereum": { - "usd": 1937.87839962 + "usd": 1992.05966869 } }, "coingeckoPrices": [ { "fiat": "usd", - "price": 0.00002841, + "price": 0.00002843, "ticker": "XEC" }, { "fiat": "usd", - "price": 29197.29473491, + "price": 29452.48207906, "ticker": "BTC" }, { "fiat": "usd", - "price": 1937.87839962, + "price": 1992.05966869, "ticker": "ETH" } ], + "tokenInfoMap": { + "dataType": "Map", + "value": [] + }, "blockSummaryTgMsgs": [ - "0 | 1 tx | unknown\n1 XEC = $0.00002841\n1 BTC = $29,197\n1 ETH = $1,938" + "0 | 1 tx | unknown\n1 XEC = $0.00002843\n1 BTC = $29,452\n1 ETH = $1,992" ], - "blockSummaryTgMsgsPriceFailure": [ + "blockSummaryTgMsgsApiFailure": [ "0 | 1 tx | unknown" ], "blockName": "genesisBlock" @@ -4605,7 +4613,8 @@ 18660017128 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "0473d97d997b61c5018205b27316b6ae660a9b7835a46166fa87e0b1b26de2dd", @@ -4638,7 +4647,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "05b4fd23fbe566b5d789f536cc41e77539e6e23e1f5ecb6d8ae67e386ba2e94b", @@ -4667,7 +4677,8 @@ 634455 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "05dbfb3db7f4a73de336745335f419ced31b42b2c3e05cdba4cb50e06eb16471", @@ -4692,7 +4703,8 @@ 209997947 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "074d2111cd7014c04d626cf4d96ca273234f5a7c014e5edb0e03145e53a838f2", @@ -4721,7 +4733,8 @@ 23306976 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "0d0a722a21aeca90ebb3d0954475ccb67f18c02945bc138c1f2ae6d507e3feb7", @@ -4754,7 +4767,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "0d9a82afc6b2605b25f8dab8b398579c3d408dc4c25919f6827a1afa5a0f6e5a", @@ -4782,7 +4796,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "0e64f62f9cb16a31cfa2188d6c9ec674c13f3d2f5320672fc45f02a8a1aba38d", @@ -4813,7 +4828,8 @@ 426164618 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "1205ec2b6105716eccb95f5b26c5d65d81a390ac8bacc6ee1f20aa1757015143", @@ -4846,7 +4862,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "134b0feae8567aa52d73975746376b785564cbc907f8ce7dfc44f90edd869145", @@ -4874,7 +4891,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "136742fdb231e1342f790a5123f46414c3957f7d199b80ea729ecba274e3b787", @@ -4907,7 +4925,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "1478f35e98cff2227a826bc93463d2813b5161929267806d49ec994088747bfa", @@ -4940,7 +4959,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "15461fbfdafca9999d195353f6fcbafef4769cb100585315829dafddc66c5ccc", @@ -4969,7 +4989,8 @@ 3576130750 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "17da7f7d89c687a99b2ed270014fe79be67938d75cf6fffd5afdfa18dcf92624", @@ -4999,7 +5020,8 @@ 6985000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "2061d46821889fe8767c6fb747b87e37e3961eab46e8a7dc9098719d170fca52", @@ -5032,7 +5054,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "26df82bc6624d8814fe23073ba1b1b8b1ddff68de955ba01fd8dbb5e2db34eb6", @@ -5065,7 +5088,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "28bfff0be82734dbfa346cda5d45fb8deeaacce6edc817bd9d6f2c6c82c203ea", @@ -5098,7 +5122,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "29e4bcf352a9524856099ae43fa25b2c67f661e0486875a35a3dc5e02466c4b5", @@ -5131,7 +5156,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "2fddd13d532ec44c43ee4fa68b587f15d575e73d566e7d30f6bc495a61074e42", @@ -5164,7 +5190,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "30cfe0f7b05197b371e050eb06642e969d037754f456f76272e98890b8ed2581", @@ -5197,7 +5224,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "32f7ca6768bedb81603dfd5618263f84c7cb42fa4bae4eeb2dda8a4eac0cdd4d", @@ -5230,7 +5258,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "3411daaf624965c7731bc169e7831d9e56075986a1639cb1dc74e1b8d9c797b9", @@ -5263,7 +5292,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "35d7346a26f456fcb2b5dec7801964de18d15b90c68711b70742dde052cbc0d4", @@ -5293,7 +5323,8 @@ 1000000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "3d53a4e291acccb5af5f8f65518edf28de61e5004b21150145bd73acf6303cf3", @@ -5328,7 +5359,8 @@ 40819954735 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "43c50a9f8bb247a389e5233ff38eb59be3df550feb3a18d0dcc967eea9b0748a", @@ -5363,7 +5395,8 @@ 11005638042 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "4b0ae95c4571709ea1634ea1b70946845a0d9e9a4c5b0f4d298feb8c8f5df026", @@ -5393,7 +5426,8 @@ 1532567 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "4bf5a856c75adbc50669ac3f7184958424db99da65d218d986e194d2bb8b3cdf", @@ -5422,7 +5456,8 @@ 50411107 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "4cf484655aa1948cfc3cd291a119806c8b2b5e0d233e44866dc0c9015b24ce1e", @@ -5455,7 +5490,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "4d46bd9ba22889a496cf4d37e5f0307216c8be93885ba82fcc0d3965c63693c3", @@ -5488,7 +5524,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875", @@ -5524,7 +5561,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "4f55182147356e5ccbf6c06225e817ac405a50fbe04c0f6eb5a4eb04462c7b12", @@ -5557,7 +5595,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "500e26ccb9a73e0a3b4b2973c5b37af1ddeae23cfce41b987d1ba3e942387c54", @@ -5586,7 +5625,8 @@ 245389245 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "5200a3bf8928a7aae450aa58b550957333e0bebfa352bcc4c108e9b396a4626f", @@ -5616,7 +5656,8 @@ 257183737 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "53c43d805bbbb9618e48cde71f5ff659fea02689f825cde823984b30443f0b30", @@ -5649,7 +5690,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "545f14c319f00273c894e02e7e4170e2f186da3e9022629f659f8f6b1e579a1c", @@ -5683,7 +5725,8 @@ 546 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "56bc3c81bb81bc92ba25acc407602207a0fdada4261f7f205d141ab34b616ce9", @@ -5716,7 +5759,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "592f4435d3ef8e2e2f0108cffc7b727798f359bad8521a084ca668bad55512c3", @@ -5749,7 +5793,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "5d4f5668277ac87f170711461f0bef8f716556b6433c39729a4d0f22a1f1a9ae", @@ -5782,7 +5827,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "5dc730eafbde4aeec06bf63995e76ecb957ac9266427e63eb23454e49b9f35c0", @@ -5811,7 +5857,8 @@ 68795544 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "63ee98065e0c2358423ccc2ceae21a00ff8ed5e132d460a463334f1368ae3936", @@ -5844,7 +5891,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "64d204d6dd894e2b93ec2a9a518fb6c9fb9313098a06859b605e440884372c60", @@ -5877,7 +5925,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "67b05c5f3cc1d1d2415aae8232254bc790fe8d1965e9b529fc3b7bae4acf818d", @@ -5910,7 +5959,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "6d88f6ad363660c11cc53d6630b6b99b2f99d0ab68b00dd06ba63636e7b15891", @@ -5937,7 +5987,8 @@ 8900607564 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "6fb44256ab3b7ecdb4dd4955d94dd1f6dc1bdeee8a523651fd71e699c524af01", @@ -5970,7 +6021,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "707051559904c61d0873824b9a215b93c90452724be49342554438215ba392d0", @@ -6003,7 +6055,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "70cf40ea8427d0fa12c411434f5f753780ba986f51947f43eaa5eb1ee4c4b9d7", @@ -6032,7 +6085,8 @@ 683 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7168c1feb93bba72b68c5ac833a9f428dcb88a9e199f53db1613bcc07a70dfec", @@ -6065,7 +6119,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "73db52181851a5a5734a21a19c9082c84f0e3827284e26d2cded7e5d2bea8363", @@ -6094,7 +6149,8 @@ 19953027475 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "74352cbc58d6e5891dcff7714575735d31b4fd3441f557a2aa5d1c4cb34d3274", @@ -6123,7 +6179,8 @@ 2383 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7453cfad5d4ef44c4033acfcd694fff185be18fa08528ac3d33953c38dfb8d74", @@ -6158,7 +6215,8 @@ 1432183485 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "76f684f3c861f5ba39872f322d0dd759729a74895a6b376ace563dd8db494f15", @@ -6187,7 +6245,8 @@ 10923801 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7d85c406e5a0cd75fb92388f8d875e3e7eded9584d01414f18f57793063b1e69", @@ -6220,7 +6279,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7e4596fc927d0da2c1d4ee1290ffaf3731d873951bd2da60676848d5c8495ee8", @@ -6253,7 +6313,8 @@ 2761788 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7ed7de6b7709faafca4d5f92db0af65df90852f7457284039e583554d0d6f527", @@ -6286,7 +6347,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7f6d27c7f7869d8f0a1bce28b955238b4999d176b0be5b7f8738741c67b6585f", @@ -6321,7 +6383,8 @@ 28655737383 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7f70502f4a0fe4ffc993648a440a56d048298c442e12d6e4d2cd12497357a702", @@ -6354,7 +6417,8 @@ 129306467 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "817c602ce380eda55eae2e64f1501499ea66e9fbffd6aee4c013f5a0e0d8bb77", @@ -6387,7 +6451,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "826ca512fdaa287c0a38ced748713ff7e9b199f3f43aedf6d49d35d9700bfb6d", @@ -6416,7 +6481,8 @@ 3000000000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "8692a0f9ee9217faaf60f76044adc6aec3afe7ebde1f46c52f06da4bf28b126b", @@ -6445,7 +6511,8 @@ 4753764 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "8a459bb01fe0304d3617a11004b1651ef4f6cf7173e98894f5ded93b3f98eca4", @@ -6475,7 +6542,8 @@ 1000000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "8ae36d52d6d053da7252f8c34284d0b1296990271e22f82acd0ef8e5daf8ebdc", @@ -6505,7 +6573,8 @@ 4500000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "8d15e3628717cca44be6838c6bedbd254650ab8cc5ed66dd1d3cc5ea6f8c9c2c", @@ -6535,7 +6604,8 @@ 9500000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "8dc7771f7904fd00bfbb810e6fdf35e90cfcd495f9e822db5620959d021ccb89", @@ -6565,7 +6635,8 @@ 119778476 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "8f595f2617777d72231772c8994cb8ec4e6c7ec3678cc77c88f7f4c799f8f752", @@ -6594,7 +6665,8 @@ 121734563 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "9162b6dac6e0945f6438343c57d08b69e6306f4e09d94842bcc4aeca22f854be", @@ -6627,7 +6699,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "96cf034489782a60d9346e508bf9d97094293ccf51166bd49a4e1f6cb7538c04", @@ -6661,7 +6734,8 @@ 546 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "9bd8383325ec538562c92d8f28f19804d9727196fe1457aec5cace66c1d96fda", @@ -6694,7 +6768,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "a0895e299c51d87548a63aecc49edc2db717815a32ada2c19718643f1acc99a9", @@ -6740,7 +6815,8 @@ 17335859300 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "a1974c915f3a274907be819533a3c3d4bbbcbf112d3be82970b9100641eccbf3", @@ -6773,7 +6849,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "a1e4bd0b2b151ce40efd30cdedb663e75d438cd518c52c7d3b09e8eb5e9518f8", @@ -6806,7 +6883,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "a7064b6bed0cfcd245af8e76d5f521539152238d3f54e4cad4def3e53a0efe61", @@ -6839,7 +6917,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "ad531c21ee34e502b8ebf131fa6d75faacb91eec9afca2c7e4c1c058ee88bf40", @@ -6872,7 +6951,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "ae01d244f951d4d1a781fc61a9df0dbd13bff47adb0a52efd05e78828d73932d", @@ -6901,7 +6981,8 @@ 5009000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "aeb6af4e6b341950c72079ec20fff64e041564ff3d28ca2da2c592f16245bc56", @@ -6934,7 +7015,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "b0a4e83dba5e7fbbd563bde7fba6ffe12a4c177d7983714c3325b6a75b28980d", @@ -6963,7 +7045,8 @@ 15109907 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "b150577f2e443eebe6878f143345f3b44d0aedb182af416b90f8e90fefb8328d", @@ -6994,7 +7077,8 @@ 15900000000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "beb17b996dfbcea463334fca9f090dd4f5f3d514e5da7e0eedc1e599e6eb81e8", @@ -7028,7 +7112,8 @@ 546 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "c044e68b45fa2806f5da654ff7026b25b78a92b7cceff39c19612a92af0fb86c", @@ -7061,7 +7146,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "c125f4fb2cf67a105eb2a75a4ecb810a7fd1f27a522868cdd27366f9bb7224c6", @@ -7094,7 +7180,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "c4a481f1228414ede06e580dfdb7949afea20ca92b30a2e164a0d8519f43b685", @@ -7127,7 +7214,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "d1a2187b8ac0a4af195d041d217396c6bdffa4410fc477b4d9c04ca0851456fe", @@ -7160,7 +7248,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "d84be37cbc6a429e19e6946aeaca645be5ddb908fa9193e77a097cff4d333a86", @@ -7190,7 +7279,8 @@ 230000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "da8e9086128365532152a791dc6a647c5e33f0daee39b1cd86d2fce7f0ddb6d9", @@ -7220,7 +7310,8 @@ 97115436942 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "dadfb51c7b27b6df4c062d0f671c8eada8e88666afa84bac39b504452bc76a2b", @@ -7250,7 +7341,8 @@ 511440400 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "dbcea63c91f4b03fb4cbd50c6d187243a4dabe95ea3ed7c99219acb194a4a070", @@ -7283,7 +7375,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "dc222e2a8f62441be0781771cdc7aa52a0f27b819cbb082bed7095521b5e5876", @@ -7312,7 +7405,8 @@ 210000000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "dc237a1db441e29593cd423a8e6156084f89b975fcf7c6219bd4399120bc0515", @@ -7345,7 +7439,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "de56767590f1f8e5dbef4f9d89eb06e21cc39507e87f821bb12b707912a3d5dd", @@ -7378,7 +7473,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "e73ac16df97c2d88db8474da8a10cace811137d719827726488239e38745769e", @@ -7411,7 +7507,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "eee95b08153dd77e0666c230c5dcdcd73d0338ea4ca3e228761d6bec21824d0b", @@ -7444,7 +7541,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "f0bbf184b8e3ebc8b2e153c157c0acc4535d9af4e4db0f4b9260620884cc94d7", @@ -7469,7 +7567,8 @@ 50402475 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "f0ce51a1e1cd309ee9a03b134411604c10659ba576383f97306a53214068bc02", @@ -7506,7 +7605,8 @@ 7591109999 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "f12c38e8d9748a933db7ea36ec95c72b91b6e46641949ff08c0748743f94e27a", @@ -7534,7 +7634,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "f8f937a56055bc876938ada58bd695397b8904217336804670cc64192cf69b03", @@ -7567,7 +7668,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "fc251d54c2de4e47a0222150d0964f178ef06a4702a8e25a5d9ab285e005794a", @@ -7592,7 +7694,8 @@ 2302590 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "fd8362916275878dcb45127ad8464c51cff592c1ec81fcf57fccc08313be46b8", @@ -7625,45 +7728,54 @@ 0 ] ] - } + }, + "tokenSendInfo": false } - ] + ], + "tokenIds": { + "dataType": "Set", + "value": [] + } }, "coingeckoResponse": { "bitcoin": { - "usd": 29197.29473491 + "usd": 29452.48207906 }, "ecash": { - "usd": 0.00002841 + "usd": 0.00002843 }, "ethereum": { - "usd": 1937.87839962 + "usd": 1992.05966869 } }, "coingeckoPrices": [ { "fiat": "usd", - "price": 0.00002841, + "price": 0.00002843, "ticker": "XEC" }, { "fiat": "usd", - "price": 29197.29473491, + "price": 29452.48207906, "ticker": "BTC" }, { "fiat": "usd", - "price": 1937.87839962, + "price": 1992.05966869, "ticker": "ETH" } ], + "tokenInfoMap": { + "dataType": "Map", + "value": [] + }, "blockSummaryTgMsgs": [ - "700722 | 97 txs | unknown\n1 XEC = $0.00002841\n1 BTC = $29,197\n1 ETH = $1,938\n\n1 new eToken created:\nLambda Variant Variants (LVV) [doc]\n\nApp txs:\nno app: 1629498127|85\nno app: 1629500089|91\nno app: 1629497915|79\nno app: 1629500647|79\nno app: 1629499023|76\nno app: 1629497534|78\nno app: 1629498535|87\nno app: 1629500798|79\nno app: 1629497457|77\nno app: 1629498288|72\nno app: 1629499274|64\nno app: 1629500162|80\nno app: 1629500720|82\nno app: 1629499774|94\nno app: 1629497610|79\nno app: 1629499360|84\nno app: 1629498460|71\nno app: 1629500318|76\nno app: 1629497132|78\nno app: 1629498060|88\nno app: 1629499897|105\nno app: 1629497763|75\nno app: 1629499571|93\nno app: 1629497054|74\nno app: 1629499185|75\nno app: 1629498375|70\nno app: 1629498610|74\nno app: 1629497293|68", + "700722 | 97 txs | unknown\n1 XEC = $0.00002843\n1 BTC = $29,452\n1 ETH = $1,992\n\n1 new eToken created:\nLambda Variant Variants (LVV) [doc]\n\nApp txs:\nno app: 1629498127|85\nno app: 1629500089|91\nno app: 1629497915|79\nno app: 1629500647|79\nno app: 1629499023|76\nno app: 1629497534|78\nno app: 1629498535|87\nno app: 1629500798|79\nno app: 1629497457|77\nno app: 1629498288|72\nno app: 1629499274|64\nno app: 1629500162|80\nno app: 1629500720|82\nno app: 1629499774|94\nno app: 1629497610|79\nno app: 1629499360|84\nno app: 1629498460|71\nno app: 1629500318|76\nno app: 1629497132|78\nno app: 1629498060|88\nno app: 1629499897|105\nno app: 1629497763|75\nno app: 1629499571|93\nno app: 1629497054|74\nno app: 1629499185|75\nno app: 1629498375|70\nno app: 1629498610|74\nno app: 1629497293|68", "no app: 1629497209|76\nno app: 1629499706|88\nno app: 1629497685|81\nno app: 1629499504|84\nno app: 1629498864|64\nno app: 1629498773|66\nno app: 1629499955|96\nno app: 1629500566|71\nno app: 1629497990|82\nno app: 1629498205|77\nno app: 1629499836|98\nno app: 1629498688|79\nno app: 1629497840|81\nno app: 1629500240|77\nno app: 1629500399|75\nno app: 1629498945|79\nno app: 1629497378|72\nno app: 1629499638|91\nno app: 1629499432|84\nno app: 1629500022|85\nno app: 1629500482|72\nno app: 1629499103|75\n\n45 eCash txs:\nqqv...y7y sent 201,835,617 XEC to qqn...gd2 and 1 others | 1.00 sats per byte\nqrf...ldm sent 6,354 XEC to qr8...kys and 1 others | 1.00 sats per byte\nqq4...xph sent 2,099,979 XEC to qp0...rj6 | 10.69 sats per byte\nqru...y7r sent 240,420 XEC to qz5...7p8 and 1 others | 1.23 sats per byte\nqp5...pck sent 4,261,646 XEC to qqz...cc8 | 1.06 sats per byte\nqrh...47a sent 47,684,497 XEC to qz0...c8j and 1 others | 1.00 sats per byte\nqp9...jlg sent 69,850 XEC to qpu...dtm | 4.18 sats per byte", "qp9...jlg sent 10,000 XEC to qqm...uqa | 4.18 sats per byte\nqr9...3zm sent 425,718,894 XEC to qzx...xg8 and 1 others | 1.00 sats per byte\nqq4...w64 sent 110,320,517 XEC to qqt...q7t and 2 others | 4.10 sats per byte\nqph...72y sent 15,326 XEC to qz2...035 | 2.01 sats per byte\nqrp...rtz sent 1,008,221 XEC to qp2...qa4 and 1 others | 5.02 sats per byte\nqzs...qn7 sent 6,941,377 XEC to qqh...ytf and 1 others | 1.00 sats per byte\nqrz...k3d sent 2,571,837 XEC to qr4...kxh | 150.87 sats per byte\nqz5...7p8 sent 750 XEC to qrf...py0 and 1 others | 1.12 sats per byte\nqzq...mzs sent 717,296 XEC to qzj...e2s and 1 others | 5.00 sats per byte\nqql...h03 sent 89,006,076 XEC to qzj...ksg | 2.13 sats per byte\nqp0...t92 sent 612,181 XEC to qzj...ztx and 1 others | 1.00 sats per byte\nqpm...k9g sent 199,999,998 XEC to qqp...zqu and 1 others | 1.00 sats per byte\nqpa...czv sent 612,208 XEC to qp0...t92 and 1 others | 1.00 sats per byte\nppt...gny sent 88,521,997 XEC to qz3...rj3 and 2 others | 15.28 sats per byte\nqp2...pca sent 294,905 XEC to qp4...0fg and 1 others | 1.00 sats per byte\nqpm...k9g sent 199,999,997 XEC to qpl...eep and 2 others | 1.00 sats per byte\nqp4...yuu sent 289,611,690 XEC to qqh...zy3 and 1 others | 1.00 sats per byte\nqr4...ffa sent 1,975,381 XEC to qr3...w9u and 2 others | 1.00 sats per byte\nqql...y4w sent 30,000,000 XEC to qz8...0fa | 4.16 sats per byte\nqzn...amg sent 3,285,159 XEC to qzt...rag and 1 others | 1.00 sats per byte\nqp9...jlg sent 10,000 XEC to qpv...jap | 4.16 sats per byte\nqp9...jlg sent 45,000 XEC to qry...tf4 | 4.16 sats per byte\nqp9...jlg sent 95,000 XEC to qrt...lp5 | 4.16 sats per byte", "qqn...e9j sent 21,197,785 XEC to qr2...rh9 and 1 others | 4.10 sats per byte\nqpp...p3l sent 1,217,361 XEC to qz3...hef and 1 others | 1.00 sats per byte\nqz5...7p8 sent 150 XEC to qre...t4t and 1 others | 1.17 sats per byte\nqzj...ksg sent 937,282,770 XEC to qz3...rj3 and 4 others | 1.92 sats per byte\nqpm...k9g sent 199,999,998 XEC to qrd...vnm and 1 others | 1.00 sats per byte\npqu...4ws sent 551,094 XEC to qp2...thh and 1 others | 1.05 sats per byte\nqzl...52p sent 159,000,922 XEC to qpt...67y and 1 others | 1.01 sats per byte\nqz5...7p8 sent 750 XEC to qrf...py0 and 1 others | 1.13 sats per byte\nqz5...7p8 sent 2,300 XEC to qrf...py0 | 1.14 sats per byte\nqp9...jlg sent 971,154,369 XEC to qpu...qhj | 4.16 sats per byte\nqq4...qvq sent 5,167,950 XEC to qqu...vun and 1 others | 1.00 sats per byte\nqqn...gnz sent 10,499,318 XEC to qrj...eya and 1 others | 2.21 sats per byte\nqze...e3p sent 504,025 XEC to qzv...geu | 5.00 sats per byte\nqqs...7c5 sent 101,520,270 XEC to pzz...qn8 and 3 others | 1.00 sats per byte\nqpp...m7l sent 23,026 XEC to qqe...fmm | 5.01 sats per byte" ], - "blockSummaryTgMsgsPriceFailure": [ + "blockSummaryTgMsgsApiFailure": [ "700722 | 97 txs | unknown\n\n1 new eToken created:\nLambda Variant Variants (LVV) [doc]\n\nApp txs:\nno app: 1629498127|85\nno app: 1629500089|91\nno app: 1629497915|79\nno app: 1629500647|79\nno app: 1629499023|76\nno app: 1629497534|78\nno app: 1629498535|87\nno app: 1629500798|79\nno app: 1629497457|77\nno app: 1629498288|72\nno app: 1629499274|64\nno app: 1629500162|80\nno app: 1629500720|82\nno app: 1629499774|94\nno app: 1629497610|79\nno app: 1629499360|84\nno app: 1629498460|71\nno app: 1629500318|76\nno app: 1629497132|78\nno app: 1629498060|88\nno app: 1629499897|105\nno app: 1629497763|75\nno app: 1629499571|93\nno app: 1629497054|74\nno app: 1629499185|75\nno app: 1629498375|70\nno app: 1629498610|74\nno app: 1629497293|68\nno app: 1629497209|76", "no app: 1629499706|88\nno app: 1629497685|81\nno app: 1629499504|84\nno app: 1629498864|64\nno app: 1629498773|66\nno app: 1629499955|96\nno app: 1629500566|71\nno app: 1629497990|82\nno app: 1629498205|77\nno app: 1629499836|98\nno app: 1629498688|79\nno app: 1629497840|81\nno app: 1629500240|77\nno app: 1629500399|75\nno app: 1629498945|79\nno app: 1629497378|72\nno app: 1629499638|91\nno app: 1629499432|84\nno app: 1629500022|85\nno app: 1629500482|72\nno app: 1629499103|75\n\n45 eCash txs:\nqqv...y7y sent 201,835,617 XEC to qqn...gd2 and 1 others | 1.00 sats per byte\nqrf...ldm sent 6,354 XEC to qr8...kys and 1 others | 1.00 sats per byte\nqq4...xph sent 2,099,979 XEC to qp0...rj6 | 10.69 sats per byte\nqru...y7r sent 240,420 XEC to qz5...7p8 and 1 others | 1.23 sats per byte\nqp5...pck sent 4,261,646 XEC to qqz...cc8 | 1.06 sats per byte\nqrh...47a sent 47,684,497 XEC to qz0...c8j and 1 others | 1.00 sats per byte\nqp9...jlg sent 69,850 XEC to qpu...dtm | 4.18 sats per byte", "qp9...jlg sent 10,000 XEC to qqm...uqa | 4.18 sats per byte\nqr9...3zm sent 425,718,894 XEC to qzx...xg8 and 1 others | 1.00 sats per byte\nqq4...w64 sent 110,320,517 XEC to qqt...q7t and 2 others | 4.10 sats per byte\nqph...72y sent 15,326 XEC to qz2...035 | 2.01 sats per byte\nqrp...rtz sent 1,008,221 XEC to qp2...qa4 and 1 others | 5.02 sats per byte\nqzs...qn7 sent 6,941,377 XEC to qqh...ytf and 1 others | 1.00 sats per byte\nqrz...k3d sent 2,571,837 XEC to qr4...kxh | 150.87 sats per byte\nqz5...7p8 sent 750 XEC to qrf...py0 and 1 others | 1.12 sats per byte\nqzq...mzs sent 717,296 XEC to qzj...e2s and 1 others | 5.00 sats per byte\nqql...h03 sent 89,006,076 XEC to qzj...ksg | 2.13 sats per byte\nqp0...t92 sent 612,181 XEC to qzj...ztx and 1 others | 1.00 sats per byte\nqpm...k9g sent 199,999,998 XEC to qqp...zqu and 1 others | 1.00 sats per byte\nqpa...czv sent 612,208 XEC to qp0...t92 and 1 others | 1.00 sats per byte\nppt...gny sent 88,521,997 XEC to qz3...rj3 and 2 others | 15.28 sats per byte\nqp2...pca sent 294,905 XEC to qp4...0fg and 1 others | 1.00 sats per byte\nqpm...k9g sent 199,999,997 XEC to qpl...eep and 2 others | 1.00 sats per byte\nqp4...yuu sent 289,611,690 XEC to qqh...zy3 and 1 others | 1.00 sats per byte\nqr4...ffa sent 1,975,381 XEC to qr3...w9u and 2 others | 1.00 sats per byte\nqql...y4w sent 30,000,000 XEC to qz8...0fa | 4.16 sats per byte\nqzn...amg sent 3,285,159 XEC to qzt...rag and 1 others | 1.00 sats per byte\nqp9...jlg sent 10,000 XEC to qpv...jap | 4.16 sats per byte\nqp9...jlg sent 45,000 XEC to qry...tf4 | 4.16 sats per byte\nqp9...jlg sent 95,000 XEC to qrt...lp5 | 4.16 sats per byte", @@ -11390,6 +11502,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "36" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -11424,6 +11561,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "9879374556200" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914e1d5310eebf49c6a04360385d943bc74d541502088ac", + { + "dataType": "BigNumberReplacer", + "value": "400" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -11454,6 +11624,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "1122" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -11484,6 +11679,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "512" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -11518,6 +11738,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "9879374555500" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914e1d5310eebf49c6a04360385d943bc74d541502088ac", + { + "dataType": "BigNumberReplacer", + "value": "700" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -11543,7 +11796,8 @@ 99999757 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "1f7b1bb6b028cefedfe32b56cff88f8c840b250ce1aca1c470f2727935e83d50", @@ -11572,7 +11826,8 @@ 1025339067 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "2095ebd23a146fbfdd0184efb6c9766a9a5d542fb55a063df3fff1670f1bb273", @@ -11606,6 +11861,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "9879374554000" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914e1d5310eebf49c6a04360385d943bc74d541502088ac", + { + "dataType": "BigNumberReplacer", + "value": "500" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -11631,7 +11919,8 @@ 93553 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "22836e6b6f4861d0b8f18735e6e342981e2edc0c686cdf06da892ab7d7d75512", @@ -11666,7 +11955,8 @@ 174237800 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "264a42c30ea9d82bdbf3f8c4d9b7fea006984f96aa9f561f55116684ea21d0f5", @@ -11700,6 +11990,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "fb4233e8a568993976ed38a81c2671587c5ad09552dedefa78760deed6ff87aa", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "949656550" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91428cabb69be3e20707574d7a0ddc65a801b6ae59988ac", + { + "dataType": "BigNumberReplacer", + "value": "200" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -11730,11 +12053,36 @@ 546 ] ] - } - }, - { - "txid": "28f3ec1f134dc8ea2e37a0645774fa2aa19e0bc2871b6edcc7e99cd86d77b1b6", - "genesisInfo": false, + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "242" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } + } + }, + { + "txid": "28f3ec1f134dc8ea2e37a0645774fa2aa19e0bc2871b6edcc7e99cd86d77b1b6", + "genesisInfo": false, "opReturnInfo": { "app": "memo", "msg": "Reply to memo|�V��iM�j�t[P\u001c\u000e����J\u0018_�z7�\b�k\u0005u\n|From what I'm gathering, it seems that the media went from questioning authority to doing their bidding as a collective NPC hivemind!" @@ -11763,7 +12111,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "3d83bc3b70bd190d27c17df3585fdb693d852d654ced5c46cfdac76afb889b7f", @@ -11797,6 +12146,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "9879374553000" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914e1d5310eebf49c6a04360385d943bc74d541502088ac", + { + "dataType": "BigNumberReplacer", + "value": "1000" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -11833,7 +12215,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "56ccc295c58381980ece3ab43a5510532d9b2e83f2959c15baa07f1aea98748d", @@ -11863,7 +12246,8 @@ 100000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "657646f7a4e7237fca4ed8231c27d95afc8086f678244d5560be2230d920ff70", @@ -11897,6 +12281,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac", + { + "dataType": "BigNumberReplacer", + "value": "999848" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144e532257c01b310b3b5c1fd947c79a72addf852388ac", + { + "dataType": "BigNumberReplacer", + "value": "17" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac" + ] + } } }, { @@ -11927,6 +12344,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "66381" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -11963,7 +12405,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7d53e2bf385b0dc071d1e64c50e358227a7a6832cc80b6df73d524a98e9a64f9", @@ -11988,7 +12431,8 @@ 98417832 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7df5934f7a1ac0d4fa18bff20994199756f2756db9753ac0833f09811be9eaa5", @@ -12027,7 +12471,8 @@ 1123907956 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "808ec05abe93ab44b24c1fa0d4f1771f392213ecb234c56b79d5267ece96b2a4", @@ -12066,6 +12511,46 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac", + { + "dataType": "BigNumberReplacer", + "value": "18301223" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "15219" + } + ], + [ + "76a914dee50f576362377dd2f031453c0bb09009acaf8188ac", + { + "dataType": "BigNumberReplacer", + "value": "100" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12096,7 +12581,8 @@ 80722796 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "8970772be0812a5b0e9d47472a7162bb8787d259f111a94b6eefcade547d4845", @@ -12126,6 +12612,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "227" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12156,6 +12667,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "19" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12186,6 +12722,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "96625" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12220,6 +12781,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac", + { + "dataType": "BigNumberReplacer", + "value": "999846" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144e532257c01b310b3b5c1fd947c79a72addf852388ac", + { + "dataType": "BigNumberReplacer", + "value": "2" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac" + ] + } } }, { @@ -12250,6 +12844,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "471" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12275,7 +12894,8 @@ 95017 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "b6f643aa5a5b26bab1a51d904b23c0799f384c469cd2dd5f27bc90754664d730", @@ -12309,6 +12929,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "9879374554500" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914e1d5310eebf49c6a04360385d943bc74d541502088ac", + { + "dataType": "BigNumberReplacer", + "value": "300" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -12334,7 +12987,8 @@ "xecReceivingOutputs": { "dataType": "Map", "value": [] - } + }, + "tokenSendInfo": false }, { "txid": "c88eb6c181c8879707f8d950e8e06dd6158d7440ae0424e2ea0f9ed5c54c9985", @@ -12364,6 +13018,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "10000" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12398,6 +13077,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "9879374554800" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914e1d5310eebf49c6a04360385d943bc74d541502088ac", + { + "dataType": "BigNumberReplacer", + "value": "700" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -12432,6 +13144,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac", + { + "dataType": "BigNumberReplacer", + "value": "8989" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144e532257c01b310b3b5c1fd947c79a72addf852388ac", + { + "dataType": "BigNumberReplacer", + "value": "11" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac" + ] + } } }, { @@ -12462,7 +13207,8 @@ 200000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "e2b11003706e934b68c563db37d2f6b4cf435ce43cdb6c77e68c93be36616c60", @@ -12492,6 +13238,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "167" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12529,7 +13300,8 @@ 554 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "ed1d839b287abb65b838622d9acf64b399b1653bcf6bea503442bcaef81890c4", @@ -12563,6 +13335,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "fb4233e8a568993976ed38a81c2671587c5ad09552dedefa78760deed6ff87aa", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac", + { + "dataType": "BigNumberReplacer", + "value": "949656450" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91428cabb69be3e20707574d7a0ddc65a801b6ae59988ac", + { + "dataType": "BigNumberReplacer", + "value": "100" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a914d94bba6bfd2f5d9036452d9b6b12a254df6aab3188ac" + ] + } } }, { @@ -12600,6 +13405,45 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "53902" + } + ], + [ + "76a91445d12108b291141bcb09aa6cc2caa1254d20128488ac", + { + "dataType": "BigNumberReplacer", + "value": "1999" + } + ], + [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac", + { + "dataType": "BigNumberReplacer", + "value": "499" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "a91454594a4a445be66bfd95f9c90ee7aec7f5cb4ef587" + ] + } } }, { @@ -12630,6 +13474,31 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "101" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } }, { @@ -12669,6 +13538,46 @@ 2606 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "164488" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914dee50f576362377dd2f031453c0bb09009acaf8188ac", + { + "dataType": "BigNumberReplacer", + "value": "3600" + } + ], + [ + "a91454594a4a445be66bfd95f9c90ee7aec7f5cb4ef587", + { + "dataType": "BigNumberReplacer", + "value": "56400" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac" + ] + } } }, { @@ -12699,43 +13608,134 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac", + { + "dataType": "BigNumberReplacer", + "value": "8878" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91435d20230fcc09fe756f8680c3ae039b86fb4032d88ac" + ] + } } } - ] + ], + "tokenIds": { + "dataType": "Set", + "value": [ + "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + "fb4233e8a568993976ed38a81c2671587c5ad09552dedefa78760deed6ff87aa", + "4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875", + "b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc" + ] + } }, "coingeckoResponse": { "bitcoin": { - "usd": 29197.29473491 + "usd": 29452.48207906 }, "ecash": { - "usd": 0.00002841 + "usd": 0.00002843 }, "ethereum": { - "usd": 1937.87839962 + "usd": 1992.05966869 } }, "coingeckoPrices": [ { "fiat": "usd", - "price": 0.00002841, + "price": 0.00002843, "ticker": "XEC" }, { "fiat": "usd", - "price": 29197.29473491, + "price": 29452.48207906, "ticker": "BTC" }, { "fiat": "usd", - "price": 1937.87839962, + "price": 1992.05966869, "ticker": "ETH" } ], + "tokenInfoMap": { + "dataType": "Map", + "value": [ + [ + "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + { + "tokenTicker": "BUX", + "tokenName": "Badger Universal Token", + "tokenDocumentUrl": "https://bux.digital", + "tokenDocumentHash": "", + "decimals": 4 + } + ], + [ + "2c46c017466f06817ecd3ba1c76d11e2c37db21a3fd899b84d2ce7723beeba0a", + { + "tokenTicker": "tst", + "tokenName": "test", + "tokenDocumentUrl": "https://cashtab.com/", + "tokenDocumentHash": "", + "decimals": 2 + } + ], + [ + "4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875", + { + "tokenTicker": "LVV", + "tokenName": "Lambda Variant Variants", + "tokenDocumentUrl": "https://cashtabapp.com/", + "tokenDocumentHash": "", + "decimals": 0 + } + ], + [ + "fb4233e8a568993976ed38a81c2671587c5ad09552dedefa78760deed6ff87aa", + { + "tokenTicker": "GRP", + "tokenName": "GRUMPY", + "tokenDocumentUrl": "https://bit.ly/GrumpyDoc", + "tokenDocumentHash": "", + "decimals": 2 + } + ], + [ + "b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc", + { + "tokenTicker": "CTD", + "tokenName": "Cashtab Dark", + "tokenDocumentUrl": "https://cashtab.com/", + "tokenDocumentHash": "", + "decimals": 0 + } + ] + ] + }, "blockSummaryTgMsgs": [ - "782665 | 43 txs | ViaBTC\n1 XEC = $0.00002841\n1 BTC = $29,197\n1 ETH = $1,938\n\n2 new eTokens created:\nBearNip (BEAR) [doc]\neCash Herald (TRIB) [doc]\n\nApp txs:\nmemo: Reply to memo|�V��iM�j�t[P\u001c\u000e����J\u0018_�z7�\b�k\u0005u\n|From what I'm gathering, it seems that the media went from questioning authority to doing their bidding as a collective NPC hivemind!\nAlias: 12345\n\n38 eCash txs:\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqzx...efz sent 999,998 XEC to qq6...f27 | 1.08 sats per byte\nqqc...c8e sent 18,698,998 XEC to qz4...n9l and 1 others | 1.03 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqqj...9g4 sent 936 XEC to qpw...x5g | 2.38 sats per byte\nqqh...lpy sent 29,022,106 XEC to qqu...0av and 1 others | 10.05 sats per byte\nqrv...ffd sent 5 XEC to qq5...fn0 | 2.36 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqrx...4nm sent 1,000 XEC to qz9...jhz | 1.00 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.37 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqpl...4l0 sent 984,178 XEC to qpu...4d7 | 1.44 sats per byte\nqpt...2wg sent 23,656,838 XEC to qz6...74j and 2 others | 10.05 sats per byte", - "qq6...eq7 sent 11 XEC to qpx...kvj and 1 others | 1.47 sats per byte\nqq3...x4u sent 807,228 XEC to qrh...pdm | 1.00 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.37 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqz9...m57 sent 950 XEC to qqj...9g4 | 2.16 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\n1 address sent 237.57 XEC to itself\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.36 sats per byte\nqpy...6yp sent 2,000 XEC to qqn...678 | 2.02 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qq5...fn0 | 2.37 sats per byte\npp2...mza sent 16 XEC to qpx...kvj and 2 others | 1.01 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqpx...kvj sent 32 XEC to qr0...d2u and 1 others | 2.03 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte" + "782665 | 43 txs | ViaBTC\n1 XEC = $0.00002843\n1 BTC = $29,452\n1 ETH = $1,992\n\n2 new eTokens created:\nBearNip (BEAR) [doc]\neCash Herald (TRIB) [doc]\n\n27 eToken send txs\nqq6...eq7 sent 0.0036 BUX to qpx...kvj\nqrv...ffd sent 4 tst to qrs...6k9\nqq6...eq7 sent 0.1122 BUX to qpx...kvj\nqq6...eq7 sent 0.0512 BUX to qpx...kvj\nqrv...ffd sent 7 tst to qrs...6k9\nqrv...ffd sent 5 tst to qrs...6k9\nqrv...ffd sent 2 GRP to qq5...fn0\nqq6...eq7 sent 0.0242 BUX to qpx...kvj\nqrv...ffd sent 10 tst to qrs...6k9\nqz2...035 sent 17 LVV to qp8...gg6\nqq6...eq7 sent 6.6381 BUX to qpx...kvj\nqq6...eq7 sent 1.5319 BUX to qpx...kvj and 1 others\nqq6...eq7 sent 0.0227 BUX to qpx...kvj\nqq6...eq7 sent 0.0019 BUX to qpx...kvj", + "qq6...eq7 sent 9.6625 BUX to qpx...kvj\nqz2...035 sent 2 LVV to qp8...gg6\nqq6...eq7 sent 0.0471 BUX to qpx...kvj\nqrv...ffd sent 3 tst to qrs...6k9\nqq6...eq7 sent 1 BUX to qpx...kvj\nqrv...ffd sent 7 tst to qrs...6k9\nqz2...035 sent 11 CTD to qp8...gg6\nqq6...eq7 sent 0.0167 BUX to qpx...kvj\nqrv...ffd sent 1 GRP to qq5...fn0\npp2...mza sent 5.64 BUX to qpx...kvj and 2 others\nqq6...eq7 sent 0.0101 BUX to qpx...kvj\nqpx...kvj sent 6 BUX to qr0...d2u and 1 others\nqq6...eq7 sent 0.8878 BUX to qpx...kvj\n\nApp txs:\nmemo: Reply to memo|�V��iM�j�t[P\u001c\u000e����J\u0018_�z7�\b�k\u0005u\n|From what I'm gathering, it seems that the media went from questioning authority to doing their bidding as a collective NPC hivemind!\nAlias: 12345\n\n11 eCash txs:\nqzx...efz sent 999,998 XEC to qq6...f27 | 1.08 sats per byte\nqqc...c8e sent 18,698,998 XEC to qz4...n9l and 1 others | 1.03 sats per byte", + "qqj...9g4 sent 936 XEC to qpw...x5g | 2.38 sats per byte\nqqh...lpy sent 29,022,106 XEC to qqu...0av and 1 others | 10.05 sats per byte\nqrx...4nm sent 1,000 XEC to qz9...jhz | 1.00 sats per byte\nqpl...4l0 sent 984,178 XEC to qpu...4d7 | 1.44 sats per byte\nqpt...2wg sent 23,656,838 XEC to qz6...74j and 2 others | 10.05 sats per byte\nqq3...x4u sent 807,228 XEC to qrh...pdm | 1.00 sats per byte\nqz9...m57 sent 950 XEC to qqj...9g4 | 2.16 sats per byte\n1 address sent 237.57 XEC to itself\nqpy...6yp sent 2,000 XEC to qqn...678 | 2.02 sats per byte" ], - "blockSummaryTgMsgsPriceFailure": [ + "blockSummaryTgMsgsApiFailure": [ "782665 | 43 txs | ViaBTC\n\n2 new eTokens created:\nBearNip (BEAR) [doc]\neCash Herald (TRIB) [doc]\n\nApp txs:\nmemo: Reply to memo|�V��iM�j�t[P\u001c\u000e����J\u0018_�z7�\b�k\u0005u\n|From what I'm gathering, it seems that the media went from questioning authority to doing their bidding as a collective NPC hivemind!\nAlias: 12345\n\n38 eCash txs:\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqzx...efz sent 999,998 XEC to qq6...f27 | 1.08 sats per byte\nqqc...c8e sent 18,698,998 XEC to qz4...n9l and 1 others | 1.03 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqqj...9g4 sent 936 XEC to qpw...x5g | 2.38 sats per byte\nqqh...lpy sent 29,022,106 XEC to qqu...0av and 1 others | 10.05 sats per byte\nqrv...ffd sent 5 XEC to qq5...fn0 | 2.36 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqrx...4nm sent 1,000 XEC to qz9...jhz | 1.00 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.37 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqpl...4l0 sent 984,178 XEC to qpu...4d7 | 1.44 sats per byte\nqpt...2wg sent 23,656,838 XEC to qz6...74j and 2 others | 10.05 sats per byte", "qq6...eq7 sent 11 XEC to qpx...kvj and 1 others | 1.47 sats per byte\nqq3...x4u sent 807,228 XEC to qrh...pdm | 1.00 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.37 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqz9...m57 sent 950 XEC to qqj...9g4 | 2.16 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\n1 address sent 237.57 XEC to itself\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qrs...6k9 | 2.37 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.36 sats per byte\nqpy...6yp sent 2,000 XEC to qqn...678 | 2.02 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqrv...ffd sent 5 XEC to qq5...fn0 | 2.37 sats per byte\npp2...mza sent 16 XEC to qpx...kvj and 2 others | 1.01 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte\nqpx...kvj sent 32 XEC to qr0...d2u and 1 others | 2.03 sats per byte\nqq6...eq7 sent 5 XEC to qpx...kvj | 2.56 sats per byte" ], @@ -13146,6 +14146,31 @@ 0 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9146d69b5cbe7c85d87628473c43620c0daa9a8102988ac", + { + "dataType": "BigNumberReplacer", + "value": "3566918" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a9146d69b5cbe7c85d87628473c43620c0daa9a8102988ac" + ] + } } }, { @@ -13180,6 +14205,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "fb4233e8a568993976ed38a81c2671587c5ad09552dedefa78760deed6ff87aa", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9141c13ddb8dd422bbe02dc2ae8798b4549a67a3c1d88ac", + { + "dataType": "BigNumberReplacer", + "value": "33943689000" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914dadf34cde9c774fdd6340cd2916a9b9c5d57cf4388ac", + { + "dataType": "BigNumberReplacer", + "value": "500000000" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a9141c13ddb8dd422bbe02dc2ae8798b4549a67a3c1d88ac" + ] + } } }, { @@ -13211,7 +14269,8 @@ 106152387 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "ea54f221be5c17dafc852f581f0e20dea0e72d7f0b3c691b4333fc1577bf0724", @@ -13236,42 +14295,75 @@ 0 ] ] - } + }, + "tokenSendInfo": false } - ] + ], + "tokenIds": { + "dataType": "Set", + "value": [ + "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "fb4233e8a568993976ed38a81c2671587c5ad09552dedefa78760deed6ff87aa" + ] + } }, "coingeckoResponse": { "bitcoin": { - "usd": 29197.29473491 + "usd": 29452.48207906 }, "ecash": { - "usd": 0.00002841 + "usd": 0.00002843 }, "ethereum": { - "usd": 1937.87839962 + "usd": 1992.05966869 } }, "coingeckoPrices": [ { "fiat": "usd", - "price": 0.00002841, + "price": 0.00002843, "ticker": "XEC" }, { "fiat": "usd", - "price": 29197.29473491, + "price": 29452.48207906, "ticker": "BTC" }, { "fiat": "usd", - "price": 1937.87839962, + "price": 1992.05966869, "ticker": "ETH" } ], + "tokenInfoMap": { + "dataType": "Map", + "value": [ + [ + "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + { + "tokenTicker": "BUX", + "tokenName": "Badger Universal Token", + "tokenDocumentUrl": "https://bux.digital", + "tokenDocumentHash": "", + "decimals": 4 + } + ], + [ + "fb4233e8a568993976ed38a81c2671587c5ad09552dedefa78760deed6ff87aa", + { + "tokenTicker": "GRP", + "tokenName": "GRUMPY", + "tokenDocumentUrl": "https://bit.ly/GrumpyDoc", + "tokenDocumentHash": "", + "decimals": 2 + } + ] + ] + }, "blockSummaryTgMsgs": [ - "782571 | 5 txs | ViaBTC\n1 XEC = $0.00002841\n1 BTC = $29,197\n1 ETH = $1,938\n\n4 eCash txs:\n1 address sent 10.92 XEC to itself\nqqw...6v4 sent 5 XEC to qrd...9j0 | 2.37 sats per byte\nqpk...pga sent 1,061,524 XEC to qrt...4v7 | 1.10 sats per byte\n1 address sent 0 XEC to itself" + "782571 | 5 txs | ViaBTC\n1 XEC = $0.00002843\n1 BTC = $29,452\n1 ETH = $1,992\n\n2 eToken send txs\n1 address sent 356.6918 BUX to itself\nqqw...6v4 sent 5000000 GRP to qrd...9j0\n\n2 eCash txs:\nqpk...pga sent 1,061,524 XEC to qrt...4v7 | 1.10 sats per byte\n1 address sent 0 XEC to itself" ], - "blockSummaryTgMsgsPriceFailure": [ + "blockSummaryTgMsgsApiFailure": [ "782571 | 5 txs | ViaBTC\n\n4 eCash txs:\n1 address sent 10.92 XEC to itself\nqqw...6v4 sent 5 XEC to qrd...9j0 | 2.37 sats per byte\nqpk...pga sent 1,061,524 XEC to qrt...4v7 | 1.10 sats per byte\n1 address sent 0 XEC to itself" ], "blockName": "buxTxs" @@ -14029,7 +15121,8 @@ 415534376 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "36902d988d7e309c2131e59a1256dd950443155aa9f6929d24055971d0b105b5", @@ -14059,7 +15152,8 @@ 299300000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "3d90c355be7e3aeb18d5885109a167fd2c8446ec657865ffba6577a81243f71b", @@ -14088,7 +15182,8 @@ 499204 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "97f3ebde1a5753b6772128d69a081fd514322fac0ab63303b9f22b0079a5aac8", @@ -14117,7 +15212,8 @@ 402049000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "9c1bfad01aad003052441327081622df4f1430454d9e4072c8ebddd7d13cc13b", @@ -14146,7 +15242,8 @@ 9000 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "cd9cf4bf000b413c49d45aad382716c98d4ca2a39bc0db825bd80192962dc05d", @@ -14179,7 +15276,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "da98b479e957e34b462025e483644c13c0a6924f04a31ab6473fe5c23babc5fa", @@ -14216,7 +15314,8 @@ 3300 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "ea0a799f0e3bab448064925b3ccdb6e8ff3ef07105c6739f6eec0a4aa674e1f3", @@ -14258,7 +15357,8 @@ 1883283149 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "ec584ba3c1734a422c16ec40d598fe91f870c8d17c5f9d2b6c4e1cbaf82f7237", @@ -14290,42 +15390,51 @@ 95390 ] ] - } + }, + "tokenSendInfo": false } - ] + ], + "tokenIds": { + "dataType": "Set", + "value": [] + } }, "coingeckoResponse": { "bitcoin": { - "usd": 29197.29473491 + "usd": 29452.48207906 }, "ecash": { - "usd": 0.00002841 + "usd": 0.00002843 }, "ethereum": { - "usd": 1937.87839962 + "usd": 1992.05966869 } }, "coingeckoPrices": [ { "fiat": "usd", - "price": 0.00002841, + "price": 0.00002843, "ticker": "XEC" }, { "fiat": "usd", - "price": 29197.29473491, + "price": 29452.48207906, "ticker": "BTC" }, { "fiat": "usd", - "price": 1937.87839962, + "price": 1992.05966869, "ticker": "ETH" } ], + "tokenInfoMap": { + "dataType": "Map", + "value": [] + }, "blockSummaryTgMsgs": [ - "782657 | 10 txs | ViaBTC\n1 XEC = $0.00002841\n1 BTC = $29,197\n1 ETH = $1,938\n\nApp txs:\nunknown app: SWP\u0000|\u0001|\u0001|���]�𷕪��7���؉�v��\u0018�\u001b�֯�\u001d��|SELL|110.00000000000001|\u0000|�Ϩ�O���+�u������Y�(���\u000e<D=�ήX|\u0001|\u0000|2747\nCashtab Msg: Sending a message transaction to test parsing in ecash telegram bot. With an emoji bc why not? 🤔\nunknown app: SWP\u0000|\u0001|\u0001|���]�𷕪��7���؉�v��\u0018�\u001b�֯�\u001d��|SELL\n\n6 eCash txs:\nqzr...tfg sent 4,681,584 XEC to qqt...2qc and 1 others | 1.00 sats per byte\nqp9...jlg sent 2,993,000 XEC to qr5...taj | 4.18 sats per byte\nqpw...ms5 sent 2,843,535 XEC to qpw...f2s and 1 others | 1.91 sats per byte\nqp0...c3a sent 67,528,995 XEC to qph...tg5 and 1 others | 1.00 sats per byte\nqrn...54p sent 10,255 XEC to qqs...tsk and 1 others | 1.00 sats per byte\nqzt...zwy sent 18,832,831 XEC to qrv...rm2 | 1.00 sats per byte" + "782657 | 10 txs | ViaBTC\n1 XEC = $0.00002843\n1 BTC = $29,452\n1 ETH = $1,992\n\nApp txs:\nunknown app: SWP\u0000|\u0001|\u0001|���]�𷕪��7���؉�v��\u0018�\u001b�֯�\u001d��|SELL|110.00000000000001|\u0000|�Ϩ�O���+�u������Y�(���\u000e<D=�ήX|\u0001|\u0000|2747\nCashtab Msg: Sending a message transaction to test parsing in ecash telegram bot. With an emoji bc why not? 🤔\nunknown app: SWP\u0000|\u0001|\u0001|���]�𷕪��7���؉�v��\u0018�\u001b�֯�\u001d��|SELL\n\n6 eCash txs:\nqzr...tfg sent 4,681,584 XEC to qqt...2qc and 1 others | 1.00 sats per byte\nqp9...jlg sent 2,993,000 XEC to qr5...taj | 4.18 sats per byte\nqpw...ms5 sent 2,843,535 XEC to qpw...f2s and 1 others | 1.91 sats per byte\nqp0...c3a sent 67,528,995 XEC to qph...tg5 and 1 others | 1.00 sats per byte\nqrn...54p sent 10,255 XEC to qqs...tsk and 1 others | 1.00 sats per byte\nqzt...zwy sent 18,832,831 XEC to qrv...rm2 | 1.00 sats per byte" ], - "blockSummaryTgMsgsPriceFailure": [ + "blockSummaryTgMsgsApiFailure": [ "782657 | 10 txs | ViaBTC\n\nApp txs:\nunknown app: SWP\u0000|\u0001|\u0001|���]�𷕪��7���؉�v��\u0018�\u001b�֯�\u001d��|SELL|110.00000000000001|\u0000|�Ϩ�O���+�u������Y�(���\u000e<D=�ήX|\u0001|\u0000|2747\nCashtab Msg: Sending a message transaction to test parsing in ecash telegram bot. With an emoji bc why not? 🤔\nunknown app: SWP\u0000|\u0001|\u0001|���]�𷕪��7���؉�v��\u0018�\u001b�֯�\u001d��|SELL\n\n6 eCash txs:\nqzr...tfg sent 4,681,584 XEC to qqt...2qc and 1 others | 1.00 sats per byte\nqp9...jlg sent 2,993,000 XEC to qr5...taj | 4.18 sats per byte\nqpw...ms5 sent 2,843,535 XEC to qpw...f2s and 1 others | 1.91 sats per byte\nqp0...c3a sent 67,528,995 XEC to qph...tg5 and 1 others | 1.00 sats per byte\nqrn...54p sent 10,255 XEC to qqs...tsk and 1 others | 1.00 sats per byte\nqzt...zwy sent 18,832,831 XEC to qrv...rm2 | 1.00 sats per byte" ], "blockName": "cashtabMsg" @@ -15772,7 +16881,8 @@ 25651049 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "0d07e0722247e4df90213755a5a90b2d1155499c98ae37062462715d45dee835", @@ -15806,6 +16916,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "036b46fcca75948dec00bdcc95533677fdccb861497c0d9d33fb7da5d21986b5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9141969d9250b61a67c45fe6c392ce8d5ee657e5c7988ac", + { + "dataType": "BigNumberReplacer", + "value": "409" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91454b92693bd9379068c033c5f98790ef89526bb2f88ac", + { + "dataType": "BigNumberReplacer", + "value": "6000" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a9141969d9250b61a67c45fe6c392ce8d5ee657e5c7988ac" + ] + } } }, { @@ -15831,7 +16974,8 @@ 1003862 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "425deba1bef907163aa546aca36d4bd6c0e2c1a6944fde23b2f0503a5a88cabe", @@ -15868,7 +17012,8 @@ 2200 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "564f79a4fd7c798ca5d4460899e0bae06ad84055ec5693885142346fa80aa841", @@ -15893,7 +17038,8 @@ 2029425 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "649123ec1b2357baa4588581a83aa6aa3da7825f9d736d93f77752caa156fd26", @@ -15930,7 +17076,8 @@ 1100 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "804e4cb47961434546c951c718351b3c33b1e4ddfbde3a262d7a191b2b6a8c60", @@ -15960,7 +17107,8 @@ 20322018 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "86f2bc22c9d2e9545335dc759cb3274a37ab64d83eb26bc19d7938b1f08c952a", @@ -15994,6 +17142,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "036b46fcca75948dec00bdcc95533677fdccb861497c0d9d33fb7da5d21986b5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9141069c0f04b4ca8693344e6ff778f34a6e05724ac88ac", + { + "dataType": "BigNumberReplacer", + "value": "335" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91454b92693bd9379068c033c5f98790ef89526bb2f88ac", + { + "dataType": "BigNumberReplacer", + "value": "6000" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a9141069c0f04b4ca8693344e6ff778f34a6e05724ac88ac" + ] + } } }, { @@ -16019,7 +17200,8 @@ 25650594 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "9e89a1e464c13a10e2a0a693ac111d4f054daac13d6c22a8592c73063c93143b", @@ -16048,7 +17230,8 @@ 120348 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "a51b843c19bde5b37f1199564f6a0ff705690ee300a228a6dd8f65fd9a876eb0", @@ -16077,7 +17260,8 @@ 1278764300 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "adb8f5232d92e94a8f0abb2321ff91175afc66b090bc7de40a337cc13759d637", @@ -16144,6 +17328,95 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91410c6a5beca4acfe75eba5762efb22507d560790588ac", + { + "dataType": "BigNumberReplacer", + "value": "10594" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914640de2abeaace5867f163e139d05ce9c1394ded488ac", + { + "dataType": "BigNumberReplacer", + "value": "4424" + } + ], + [ + "76a914145dcfd9d0fd303f747f189577aeeafa40c3d3ce88ac", + { + "dataType": "BigNumberReplacer", + "value": "22" + } + ], + [ + "76a9141fd95bf62f6f19dfd496f09b32cf5582debb83b488ac", + { + "dataType": "BigNumberReplacer", + "value": "31" + } + ], + [ + "76a91494a8643a988a18125eba629737fdcdc8a1de56f288ac", + { + "dataType": "BigNumberReplacer", + "value": "31" + } + ], + [ + "76a914b91b48680a1536c19fde25cdd0d122d61da8abe888ac", + { + "dataType": "BigNumberReplacer", + "value": "63" + } + ], + [ + "76a914d6c4ec6ec1b1711fe66eb771ef33e8801bb4f7b888ac", + { + "dataType": "BigNumberReplacer", + "value": "8" + } + ], + [ + "76a9141beee7879f4cb427e99558199b116a2f7238e57e88ac", + { + "dataType": "BigNumberReplacer", + "value": "16" + } + ], + [ + "76a914be621b1aa458f726583cea23c4af515a846f05b288ac", + { + "dataType": "BigNumberReplacer", + "value": "8" + } + ], + [ + "76a914ae789c93c904055b1ad88b1c645645d9f045178588ac", + { + "dataType": "BigNumberReplacer", + "value": "100" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91410c6a5beca4acfe75eba5762efb22507d560790588ac" + ] + } } }, { @@ -16173,7 +17446,8 @@ 257033764 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "dfa431134fdd2569afce9e7ec873ef6231dc13d89c530d6608061f22d5a94281", @@ -16209,7 +17483,8 @@ 0 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "f13a8d2897f75c30657dc736f51afc4835dd4639c084ef52d2809955b458591b", @@ -16276,6 +17551,95 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91410c6a5beca4acfe75eba5762efb22507d560790588ac", + { + "dataType": "BigNumberReplacer", + "value": "15297" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a914640de2abeaace5867f163e139d05ce9c1394ded488ac", + { + "dataType": "BigNumberReplacer", + "value": "4424" + } + ], + [ + "76a914145dcfd9d0fd303f747f189577aeeafa40c3d3ce88ac", + { + "dataType": "BigNumberReplacer", + "value": "22" + } + ], + [ + "76a9141fd95bf62f6f19dfd496f09b32cf5582debb83b488ac", + { + "dataType": "BigNumberReplacer", + "value": "31" + } + ], + [ + "76a91494a8643a988a18125eba629737fdcdc8a1de56f288ac", + { + "dataType": "BigNumberReplacer", + "value": "31" + } + ], + [ + "76a914b91b48680a1536c19fde25cdd0d122d61da8abe888ac", + { + "dataType": "BigNumberReplacer", + "value": "63" + } + ], + [ + "76a914d6c4ec6ec1b1711fe66eb771ef33e8801bb4f7b888ac", + { + "dataType": "BigNumberReplacer", + "value": "8" + } + ], + [ + "76a9141beee7879f4cb427e99558199b116a2f7238e57e88ac", + { + "dataType": "BigNumberReplacer", + "value": "16" + } + ], + [ + "76a914be621b1aa458f726583cea23c4af515a846f05b288ac", + { + "dataType": "BigNumberReplacer", + "value": "8" + } + ], + [ + "76a914ae789c93c904055b1ad88b1c645645d9f045178588ac", + { + "dataType": "BigNumberReplacer", + "value": "100" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91410c6a5beca4acfe75eba5762efb22507d560790588ac" + ] + } } }, { @@ -16301,42 +17665,75 @@ 25650139 ] ] - } + }, + "tokenSendInfo": false } - ] + ], + "tokenIds": { + "dataType": "Set", + "value": [ + "036b46fcca75948dec00bdcc95533677fdccb861497c0d9d33fb7da5d21986b5", + "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5" + ] + } }, "coingeckoResponse": { "bitcoin": { - "usd": 29197.29473491 + "usd": 29452.48207906 }, "ecash": { - "usd": 0.00002841 + "usd": 0.00002843 }, "ethereum": { - "usd": 1937.87839962 + "usd": 1992.05966869 } }, "coingeckoPrices": [ { "fiat": "usd", - "price": 0.00002841, + "price": 0.00002843, "ticker": "XEC" }, { "fiat": "usd", - "price": 29197.29473491, + "price": 29452.48207906, "ticker": "BTC" }, { "fiat": "usd", - "price": 1937.87839962, + "price": 1992.05966869, "ticker": "ETH" } ], + "tokenInfoMap": { + "dataType": "Map", + "value": [ + [ + "7e7dacd72dcdb14e00a03dd3aff47f019ed51a6f1f4e4f532ae50692f62bc4e5", + { + "tokenTicker": "BUX", + "tokenName": "Badger Universal Token", + "tokenDocumentUrl": "https://bux.digital", + "tokenDocumentHash": "", + "decimals": 4 + } + ], + [ + "036b46fcca75948dec00bdcc95533677fdccb861497c0d9d33fb7da5d21986b5", + { + "tokenTicker": "eLPS", + "tokenName": "eLPS Token", + "tokenDocumentUrl": "elpstoken.com", + "tokenDocumentHash": "", + "decimals": 2 + } + ] + ] + }, "blockSummaryTgMsgs": [ - "782785 | 17 txs | Mining-Dutch\n1 XEC = $0.00002841\n1 BTC = $29,197\n1 ETH = $1,938\n\n1 new eToken created:\n<><><> (&&&) [doc]\n\nApp txs:\nCashtab Msg: Testing a normal message but give it some <i> spice </i> because <b>why not</b>?<a href=\"https://cashtab.com/\">Cashtab link test</a>\nCashtab Msg: <b>Try to hack the format</b> ${true && <i>yes</i>}\n\n13 eCash txs:\nqq3...x4u sent 256,510 XEC to qp3...scq | 1.00 sats per byte\nqqv...wwc sent 5 XEC to qp2...dce | 1.07 sats per byte\nqzx...vth sent 10,039 XEC to qza...e7g | 5.01 sats per byte\nqp3...f6c sent 20,294 XEC to qza...e7g | 5.01 sats per byte\nqr7...wlz sent 223,965 XEC to qqr...8y8 and 1 others | 1.00 sats per byte\nqqg...q4a sent 5 XEC to qp2...dce | 1.07 sats per byte\nqp3...scq sent 256,506 XEC to qpu...ez7 | 2.38 sats per byte\nqpw...ms5 sent 849,061 XEC to qz8...y4c and 1 others | 1.90 sats per byte\nqrm...f33 sent 17,099,643 XEC to qrx...y9d and 1 others | 2.44 sats per byte\nqqg...v4e sent 49 XEC to qpj...yv6 and 8 others | 1.20 sats per byte\nqrh...6em sent 3,125,893 XEC to qz8...tu7 and 1 others | 2.01 sats per byte\nqqg...v4e sent 49 XEC to qpj...yv6 and 8 others | 1.20 sats per byte\nqpu...ez7 sent 256,501 XEC to qp0...upp | 2.38 sats per byte" + "782785 | 17 txs | Mining-Dutch\n1 XEC = $0.00002843\n1 BTC = $29,452\n1 ETH = $1,992\n\n1 new eToken created:\n<><><> (&&&) [doc]\n\n4 eToken send txs\nqqv...wwc sent 60 eLPS to qp2...dce\nqqg...q4a sent 60 eLPS to qp2...dce\nqqg...v4e sent 0.4703 BUX to qpj...yv6 and 8 others\nqqg...v4e sent 0.4703 BUX to qpj...yv6 and 8 others\n\nApp txs:\nCashtab Msg: Testing a normal message but give it some <i> spice </i> because <b>why not</b>?<a href=\"https://cashtab.com/\">Cashtab link test</a>\nCashtab Msg: <b>Try to hack the format</b> ${true && <i>yes</i>}\n\n9 eCash txs:\nqq3...x4u sent 256,510 XEC to qp3...scq | 1.00 sats per byte\nqzx...vth sent 10,039 XEC to qza...e7g | 5.01 sats per byte\nqp3...f6c sent 20,294 XEC to qza...e7g | 5.01 sats per byte\nqr7...wlz sent 223,965 XEC to qqr...8y8 and 1 others | 1.00 sats per byte\nqp3...scq sent 256,506 XEC to qpu...ez7 | 2.38 sats per byte\nqpw...ms5 sent 849,061 XEC to qz8...y4c and 1 others | 1.90 sats per byte\nqrm...f33 sent 17,099,643 XEC to qrx...y9d and 1 others | 2.44 sats per byte\nqrh...6em sent 3,125,893 XEC to qz8...tu7 and 1 others | 2.01 sats per byte\nqpu...ez7 sent 256,501 XEC to qp0...upp | 2.38 sats per byte" ], - "blockSummaryTgMsgsPriceFailure": [ + "blockSummaryTgMsgsApiFailure": [ "782785 | 17 txs | Mining-Dutch\n\n1 new eToken created:\n<><><> (&&&) [doc]\n\nApp txs:\nCashtab Msg: Testing a normal message but give it some <i> spice </i> because <b>why not</b>?<a href=\"https://cashtab.com/\">Cashtab link test</a>\nCashtab Msg: <b>Try to hack the format</b> ${true && <i>yes</i>}\n\n13 eCash txs:\nqq3...x4u sent 256,510 XEC to qp3...scq | 1.00 sats per byte\nqqv...wwc sent 5 XEC to qp2...dce | 1.07 sats per byte\nqzx...vth sent 10,039 XEC to qza...e7g | 5.01 sats per byte\nqp3...f6c sent 20,294 XEC to qza...e7g | 5.01 sats per byte\nqr7...wlz sent 223,965 XEC to qqr...8y8 and 1 others | 1.00 sats per byte\nqqg...q4a sent 5 XEC to qp2...dce | 1.07 sats per byte\nqp3...scq sent 256,506 XEC to qpu...ez7 | 2.38 sats per byte\nqpw...ms5 sent 849,061 XEC to qz8...y4c and 1 others | 1.90 sats per byte\nqrm...f33 sent 17,099,643 XEC to qrx...y9d and 1 others | 2.44 sats per byte\nqqg...v4e sent 49 XEC to qpj...yv6 and 8 others | 1.20 sats per byte\nqrh...6em sent 3,125,893 XEC to qz8...tu7 and 1 others | 2.01 sats per byte\nqqg...v4e sent 49 XEC to qpj...yv6 and 8 others | 1.20 sats per byte\nqpu...ez7 sent 256,501 XEC to qp0...upp | 2.38 sats per byte" ], "blockName": "htmlEscapeTest" @@ -17032,7 +18429,8 @@ 700 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "4d6845d856e34b03ef6830313c4cc75f80daee491eee7b8d55f32cdb8c2b72e6", @@ -17057,7 +18455,8 @@ 2135 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "7b0802223d4376f3bca1a76c9a2deab0c18c2fc5f070d4adb65abdb18d328f08", @@ -17087,7 +18486,8 @@ 1272 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "a2f704933049b5c5a712a9943ac2e264fbeb1354cd5f2187e31eb68a8f38aa72", @@ -17124,7 +18524,8 @@ 1100 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "ac4e0acbe7f0e0e25ef3366e2d066ebaa543c0fe8721e998d4cab03fbeb8a5a9", @@ -17149,7 +18550,8 @@ 1027980 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "b4fee092558400fa905336da8c0465e6be857bb6fad758825a20e90a6a12c323", @@ -17174,7 +18576,8 @@ 2944 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "c04ae7f139eb16023a70d1bb39b1ae8745667edb09833e994a5b4d48976a111d", @@ -17208,6 +18611,39 @@ 546 ] ] + }, + "tokenSendInfo": { + "tokenId": "b9877d8f8d2364b983707df905d592f534a3ada18e52aa529a0f72fcc535abf7", + "tokenChangeOutputs": { + "dataType": "Map", + "value": [ + [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac", + { + "dataType": "BigNumberReplacer", + "value": "3" + } + ] + ] + }, + "tokenReceivingOutputs": { + "dataType": "Map", + "value": [ + [ + "76a9144e532257c01b310b3b5c1fd947c79a72addf852388ac", + { + "dataType": "BigNumberReplacer", + "value": "2" + } + ] + ] + }, + "tokenSendingOutputScripts": { + "dataType": "Set", + "value": [ + "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac" + ] + } } }, { @@ -17233,7 +18669,8 @@ 821962 ] ] - } + }, + "tokenSendInfo": false }, { "txid": "d9915ae3c4a7ec176746d3902295c1d2cf8912db589289842c14803a67cfc9d1", @@ -17270,44 +18707,66 @@ 2200 ] ] - } + }, + "tokenSendInfo": false } - ] + ], + "tokenIds": { + "dataType": "Set", + "value": [ + "b9877d8f8d2364b983707df905d592f534a3ada18e52aa529a0f72fcc535abf7" + ] + } }, "coingeckoResponse": { "bitcoin": { - "usd": 29197.29473491 + "usd": 29452.48207906 }, "ecash": { - "usd": 0.00002841 + "usd": 0.00002843 }, "ethereum": { - "usd": 1937.87839962 + "usd": 1992.05966869 } }, "coingeckoPrices": [ { "fiat": "usd", - "price": 0.00002841, + "price": 0.00002843, "ticker": "XEC" }, { "fiat": "usd", - "price": 29197.29473491, + "price": 29452.48207906, "ticker": "BTC" }, { "fiat": "usd", - "price": 1937.87839962, + "price": 1992.05966869, "ticker": "ETH" } ], + "tokenInfoMap": { + "dataType": "Map", + "value": [ + [ + "b9877d8f8d2364b983707df905d592f534a3ada18e52aa529a0f72fcc535abf7", + { + "tokenTicker": "SRM", + "tokenName": "Server Redundancy Mint", + "tokenDocumentUrl": "https://cashtab.com/", + "tokenDocumentHash": "", + "decimals": 0 + } + ] + ] + }, "blockSummaryTgMsgs": [ - "782774 | 10 txs | ViaBTC\n1 XEC = $0.00002841\n1 BTC = $29,197\n1 ETH = $1,938\n\nApp txs:\nCashtab Msg: Why not another one, this time with emojis 🤔\nCashtab Msg: Can't believe already need to test again\nCashtab Msg: Another Cashtab message to the TG bot. Making it longer to see if spacing is a problem. Is spacing a problem? Is parsing a problem? Who can tell. We will only know after this message appears (or doesn't). \n\n6 eCash txs:\nqrw...re7 sent 21 XEC to qza...e7g | 5.00 sats per byte\nqp4...v8x sent 4,568,709 XEC to pqg...tlg and 1 others | 2.02 sats per byte\nqq5...ck4 sent 10,280 XEC to qza...e7g | 5.01 sats per byte\nqzj...u85 sent 29 XEC to qza...e7g | 5.02 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.37 sats per byte\nqrk...wcf sent 8,220 XEC to qza...e7g | 5.01 sats per byte" + "782774 | 10 txs | ViaBTC\n1 XEC = $0.00002843\n1 BTC = $29,452\n1 ETH = $1,992\n\n1 eToken send tx\nqz2...035 sent 2 SRM to qp8...gg6\n\nApp txs:\nCashtab Msg: Why not another one, this time with emojis 🤔\nCashtab Msg: Can't believe already need to test again\nCashtab Msg: Another Cashtab message to the TG bot. Making it longer to see if spacing is a problem. Is spacing a problem? Is parsing a problem? Who can tell. We will only know after this message appears (or doesn't). \n\n5 eCash txs:\nqrw...re7 sent 21 XEC to qza...e7g | 5.00 sats per byte\nqp4...v8x sent 4,568,709 XEC to pqg...tlg and 1 others | 2.02 sats per byte\nqq5...ck4 sent 10,280 XEC to qza...e7g | 5.01 sats per byte\nqzj...u85 sent 29 XEC to qza...e7g | 5.02 sats per byte\nqrk...wcf sent 8,220 XEC to qza...e7g | 5.01 sats per byte" ], - "blockSummaryTgMsgsPriceFailure": [ + "blockSummaryTgMsgsApiFailure": [ "782774 | 10 txs | ViaBTC\n\nApp txs:\nCashtab Msg: Why not another one, this time with emojis 🤔\nCashtab Msg: Can't believe already need to test again\nCashtab Msg: Another Cashtab message to the TG bot. Making it longer to see if spacing is a problem. Is spacing a problem? Is parsing a problem? Who can tell. We will only know after this message appears (or doesn't). \n\n6 eCash txs:\nqrw...re7 sent 21 XEC to qza...e7g | 5.00 sats per byte\nqp4...v8x sent 4,568,709 XEC to pqg...tlg and 1 others | 2.02 sats per byte\nqq5...ck4 sent 10,280 XEC to qza...e7g | 5.01 sats per byte\nqzj...u85 sent 29 XEC to qza...e7g | 5.02 sats per byte\nqz2...035 sent 5 XEC to qp8...gg6 | 2.37 sats per byte\nqrk...wcf sent 8,220 XEC to qza...e7g | 5.01 sats per byte" ], "blockName": "cashtabMsgMulti" } ] \ No newline at end of file diff --git a/apps/ecash-herald/test/mocks/chronikMock.js b/apps/ecash-herald/test/mocks/chronikMock.js --- a/apps/ecash-herald/test/mocks/chronikMock.js +++ b/apps/ecash-herald/test/mocks/chronikMock.js @@ -22,6 +22,7 @@ self.mockedResponses = { block: {}, txHistory: [], + tx: {}, }; self.mockedMethods = { p2pkh: {}, p2sh: {} }; @@ -30,6 +31,15 @@ self.block = function (blockHashOrHeight) { return self.mockedResponses.block[blockHashOrHeight]; }; + // Return assigned tx mocks + self.tx = async function (txid) { + const mockedTxResponse = self.mockedResponses.tx[txid]; + // If the user set this response to be an error, throw it + if (mockedTxResponse instanceof Error) { + throw mockedTxResponse; + } + return self.mockedResponses.tx[txid]; + }; // Return assigned script mocks self.script = function (type, hash) { return self.mockedMethods[type][hash]; @@ -69,6 +79,7 @@ // Allow user to set expected chronik call response self.setMock = function (call, options) { // e.g. ('block', {input: '', output: ''}) + // e.g. ('tx', {input: , output: {}}) const { input, output } = options; self.mockedResponses[call][input] = output; }; diff --git a/apps/ecash-herald/test/mocks/chronikResponses.js b/apps/ecash-herald/test/mocks/chronikResponses.js new file mode 100644 --- /dev/null +++ b/apps/ecash-herald/test/mocks/chronikResponses.js @@ -0,0 +1,238 @@ +// Copyright (c) 2023 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// @generated +'use strict'; + +module.exports = { + tx: { + '54dc2ecd5251f8dfda4c4f15ce05272116b01326076240e2b9cc0104d33b1484': { + txid: '54dc2ecd5251f8dfda4c4f15ce05272116b01326076240e2b9cc0104d33b1484', + version: 2, + inputs: [ + { + prevOut: { + txid: '72eeff7b43dc066164d92e4c3fece47af3a40e89d46e893df1647cd29dd9f1e3', + outIdx: 0, + }, + inputScript: + '473044022075166617aa473e86c72f34a5576029eb8766a035b481864ebc75759155efcce00220147e2d7e662123bd728fac700f109a245a0278959f65fc402a1e912e0a5732004121034cdb43b7a1277c4d818dc177aaea4e0bed5d464d240839d5488a278b716facd5', + outputScript: + '76a914f5f740bc76e56b77bcab8b4d7f888167f416fc6888ac', + value: '1000', + sequenceNo: 4294967295, + }, + { + prevOut: { + txid: '46b6f61ca026e243d55668bf304df6a21e1fcb2113943cc6bd1fdeceaae85612', + outIdx: 2, + }, + inputScript: + '4830450221009e98db4b91441190bb7e4745b9f249201d0b54c81c0a816af5f3491ffb21a7e902205a4d1347a5a9133c14e4f55319af00f1df836eba6552f30b44640e9373f4cabf4121034cdb43b7a1277c4d818dc177aaea4e0bed5d464d240839d5488a278b716facd5', + outputScript: + '76a914f5f740bc76e56b77bcab8b4d7f888167f416fc6888ac', + value: '750918004', + sequenceNo: 4294967295, + }, + ], + outputs: [ + { + value: '0', + outputScript: + '6a04534c500001010747454e4553495305416c69746105416c6974610a616c6974612e636173684c0001044c00080000befe6f672000', + }, + { + value: '546', + outputScript: + '76a914f5f740bc76e56b77bcab8b4d7f888167f416fc6888ac', + slpToken: { + amount: '210000000000000', + isMintBaton: false, + }, + spentBy: { + txid: '2c336374c05f1c8f278d2a1d5f3195a17fe1bc50189ff67c9769a6afcd908ea9', + outIdx: 1, + }, + }, + { + value: '750917637', + outputScript: + '76a914f5f740bc76e56b77bcab8b4d7f888167f416fc6888ac', + spentBy: { + txid: 'ca70157d5cf6275e0a36adbc3fabf671e3987f343cb35ec4ee7ed5c8d37b3233', + outIdx: 0, + }, + }, + ], + lockTime: 0, + slpTxData: { + slpMeta: { + tokenType: 'FUNGIBLE', + txType: 'GENESIS', + tokenId: + '54dc2ecd5251f8dfda4c4f15ce05272116b01326076240e2b9cc0104d33b1484', + }, + genesisInfo: { + tokenTicker: 'Alita', + tokenName: 'Alita', + tokenDocumentUrl: 'alita.cash', + tokenDocumentHash: '', + decimals: 4, + }, + }, + block: { + height: 756373, + hash: '00000000000000000d62f1b66c08f0976bcdec2f08face2892ae4474b50100d9', + timestamp: '1662611972', + }, + timeFirstSeen: '1662611666', + size: 436, + isCoinbase: false, + network: 'XEC', + }, + 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a': { + txid: 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a', + version: 2, + inputs: [ + { + prevOut: { + txid: '33938d6bd403e4ffef94de3e9e2ba487f095dcba3544ac8fad4a93808cea0116', + outIdx: 1, + }, + inputScript: + '483045022100dad1d237b541b4a4d29197dbb01fa9755c2e17bbafb42855f38442b428f0df6b02205772d3fb00b7a053b07169e1534770c091fce42b9e1d63199f46ff89856b3fc6412102ceb4a6eca1eec20ff8e7780326932e8d8295489628c7f2ec9acf8f37f639235e', + outputScript: + '76a91485bab3680833cd9b3cc60953344fa740a2235bbd88ac', + value: '49998867', + sequenceNo: 4294967295, + }, + ], + outputs: [ + { + value: '0', + outputScript: + '6a04534c500001010747454e4553495303504f571850726f6f666f6657726974696e672e636f6d20546f6b656e2168747470733a2f2f7777772e70726f6f666f6677726974696e672e636f6d2f32364c0001004c000800000000000f4240', + }, + { + value: '546', + outputScript: + '76a91485bab3680833cd9b3cc60953344fa740a2235bbd88ac', + slpToken: { + amount: '1000000', + isMintBaton: false, + }, + spentBy: { + txid: '69238630eb9e6a9864bf6970ff5d326800cea41a819feebecfe1a6f0ed651f5c', + outIdx: 1, + }, + }, + { + value: '49997563', + outputScript: + '76a91485bab3680833cd9b3cc60953344fa740a2235bbd88ac', + spentBy: { + txid: '3c665488929f852d93a5dfb6e4b4df7bc8f7a25fb4a2480d39e3de7a30437f69', + outIdx: 0, + }, + }, + ], + lockTime: 0, + slpTxData: { + slpMeta: { + tokenType: 'FUNGIBLE', + txType: 'GENESIS', + tokenId: + 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a', + }, + genesisInfo: { + tokenTicker: 'POW', + tokenName: 'ProofofWriting.com Token', + tokenDocumentUrl: 'https://www.proofofwriting.com/26', + tokenDocumentHash: '', + decimals: 0, + }, + }, + block: { + height: 685949, + hash: '0000000000000000436e71d5291d2fb067decc838dcb85a99ff6da1d28b89fad', + timestamp: '1620712051', + }, + timeFirstSeen: '0', + size: 329, + isCoinbase: false, + network: 'XEC', + }, + '3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109': { + txid: '3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109', + version: 2, + inputs: [ + { + prevOut: { + txid: '0e737a2f6373649341b406334341202a5ddbbdb389c55da40570b641dc23d036', + outIdx: 1, + }, + inputScript: + '473044022055444db90f98b462ca29a6f51981da4015623ddc34dc1f575852426ccb785f0402206e786d4056be781ca1720a0a915b040e0a9e8716b8e4d30b0779852c191fdeb3412103771805b54969a9bea4e3eb14a82851c67592156ddb5e52d3d53677d14a40fba6', + outputScript: + '76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac', + value: '6231556', + sequenceNo: 4294967294, + }, + ], + outputs: [ + { + value: '0', + outputScript: + '6a04534c500001010747454e45534953044245415207426561724e69701468747470733a2f2f636173687461622e636f6d2f4c0001004c0008000000000000115c', + }, + { + value: '546', + outputScript: + '76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac', + slpToken: { + amount: '4444', + isMintBaton: false, + }, + spentBy: { + txid: '9e7f91826cfd3adf9867c1b3d102594eff4743825fad9883c35d26fb3bdc1693', + outIdx: 1, + }, + }, + { + value: '6230555', + outputScript: + '76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac', + spentBy: { + txid: '27a2471afab33d82b9404df12e1fa242488a9439a68e540dcf8f811ef39c11cf', + outIdx: 0, + }, + }, + ], + lockTime: 0, + slpTxData: { + slpMeta: { + tokenType: 'FUNGIBLE', + txType: 'GENESIS', + tokenId: + '3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109', + }, + genesisInfo: { + tokenTicker: 'BEAR', + tokenName: 'BearNip', + tokenDocumentUrl: 'https://cashtab.com/', + tokenDocumentHash: '', + decimals: 0, + }, + }, + block: { + height: 782665, + hash: '00000000000000001239831f90580c859ec174316e91961cf0e8cde57c0d3acb', + timestamp: '1678408305', + }, + timeFirstSeen: '1678408231', + size: 299, + isCoinbase: false, + network: 'XEC', + }, + }, +}; diff --git a/apps/ecash-herald/test/mocks/telegramMsgs.js b/apps/ecash-herald/test/mocks/telegramMsgs.js --- a/apps/ecash-herald/test/mocks/telegramMsgs.js +++ b/apps/ecash-herald/test/mocks/telegramMsgs.js @@ -7,6 +7,9 @@ module.exports = { overflowMsg: [ '700722 | 97 txs | unknown', + '1 XEC = $0.00002862', + '1 BTC = $28,595', + '1 ETH = $1,881', '', '1 new eToken created:', 'Lambda Variant Variants (LVV) [doc]', @@ -111,8 +114,8 @@ 'qpp...m7l sent 23,026 XEC to qqe...fmm | 5.01 sats per byte', ], overflowMsgSplit: [ - '700722 | 97 txs | unknown\n\n1 new eToken created:\nLambda Variant Variants (LVV) [doc]\n\nApp txs:\nno app: 1629498127|85\nno app: 1629500089|91\nno app: 1629497915|79\nno app: 1629500647|79\nno app: 1629499023|76\nno app: 1629497534|78\nno app: 1629498535|87\nno app: 1629500798|79\nno app: 1629497457|77\nno app: 1629498288|72\nno app: 1629499274|64\nno app: 1629500162|80\nno app: 1629500720|82\nno app: 1629499774|94\nno app: 1629497610|79\nno app: 1629499360|84\nno app: 1629498460|71\nno app: 1629500318|76\nno app: 1629497132|78\nno app: 1629498060|88\nno app: 1629499897|105\nno app: 1629497763|75\nno app: 1629499571|93\nno app: 1629497054|74\nno app: 1629499185|75\nno app: 1629498375|70\nno app: 1629498610|74\nno app: 1629497293|68\nno app: 1629497209|76', - 'no app: 1629499706|88\nno app: 1629497685|81\nno app: 1629499504|84\nno app: 1629498864|64\nno app: 1629498773|66\nno app: 1629499955|96\nno app: 1629500566|71\nno app: 1629497990|82\nno app: 1629498205|77\nno app: 1629499836|98\nno app: 1629498688|79\nno app: 1629497840|81\nno app: 1629500240|77\nno app: 1629500399|75\nno app: 1629498945|79\nno app: 1629497378|72\nno app: 1629499638|91\nno app: 1629499432|84\nno app: 1629500022|85\nno app: 1629500482|72\nno app: 1629499103|75\n\n45 eCash txs:\nqqv...y7y sent 201,835,617 XEC to qqn...gd2 and 1 others | 1.00 sats per byte\nqrf...ldm sent 6,354 XEC to qr8...kys and 1 others | 1.00 sats per byte\nqq4...xph sent 2,099,979 XEC to qp0...rj6 | 10.69 sats per byte\nqru...y7r sent 240,420 XEC to qz5...7p8 and 1 others | 1.23 sats per byte\nqp5...pck sent 4,261,646 XEC to qqz...cc8 | 1.06 sats per byte\nqrh...47a sent 47,684,497 XEC to qz0...c8j and 1 others | 1.00 sats per byte\nqp9...jlg sent 69,850 XEC to qpu...dtm | 4.18 sats per byte', + '700722 | 97 txs | unknown\n1 XEC = $0.00002862\n1 BTC = $28,595\n1 ETH = $1,881\n\n1 new eToken created:\nLambda Variant Variants (LVV) [doc]\n\nApp txs:\nno app: 1629498127|85\nno app: 1629500089|91\nno app: 1629497915|79\nno app: 1629500647|79\nno app: 1629499023|76\nno app: 1629497534|78\nno app: 1629498535|87\nno app: 1629500798|79\nno app: 1629497457|77\nno app: 1629498288|72\nno app: 1629499274|64\nno app: 1629500162|80\nno app: 1629500720|82\nno app: 1629499774|94\nno app: 1629497610|79\nno app: 1629499360|84\nno app: 1629498460|71\nno app: 1629500318|76\nno app: 1629497132|78\nno app: 1629498060|88\nno app: 1629499897|105\nno app: 1629497763|75\nno app: 1629499571|93\nno app: 1629497054|74\nno app: 1629499185|75\nno app: 1629498375|70\nno app: 1629498610|74\nno app: 1629497293|68', + 'no app: 1629497209|76\nno app: 1629499706|88\nno app: 1629497685|81\nno app: 1629499504|84\nno app: 1629498864|64\nno app: 1629498773|66\nno app: 1629499955|96\nno app: 1629500566|71\nno app: 1629497990|82\nno app: 1629498205|77\nno app: 1629499836|98\nno app: 1629498688|79\nno app: 1629497840|81\nno app: 1629500240|77\nno app: 1629500399|75\nno app: 1629498945|79\nno app: 1629497378|72\nno app: 1629499638|91\nno app: 1629499432|84\nno app: 1629500022|85\nno app: 1629500482|72\nno app: 1629499103|75\n\n45 eCash txs:\nqqv...y7y sent 201,835,617 XEC to qqn...gd2 and 1 others | 1.00 sats per byte\nqrf...ldm sent 6,354 XEC to qr8...kys and 1 others | 1.00 sats per byte\nqq4...xph sent 2,099,979 XEC to qp0...rj6 | 10.69 sats per byte\nqru...y7r sent 240,420 XEC to qz5...7p8 and 1 others | 1.23 sats per byte\nqp5...pck sent 4,261,646 XEC to qqz...cc8 | 1.06 sats per byte\nqrh...47a sent 47,684,497 XEC to qz0...c8j and 1 others | 1.00 sats per byte\nqp9...jlg sent 69,850 XEC to qpu...dtm | 4.18 sats per byte', 'qp9...jlg sent 10,000 XEC to qqm...uqa | 4.18 sats per byte\nqr9...3zm sent 425,718,894 XEC to qzx...xg8 and 1 others | 1.00 sats per byte\nqq4...w64 sent 110,320,517 XEC to qqt...q7t and 2 others | 4.10 sats per byte\nqph...72y sent 15,326 XEC to qz2...035 | 2.01 sats per byte\nqrp...rtz sent 1,008,221 XEC to qp2...qa4 and 1 others | 5.02 sats per byte\nqzs...qn7 sent 6,941,377 XEC to qqh...ytf and 1 others | 1.00 sats per byte\nqrz...k3d sent 2,571,837 XEC to qr4...kxh | 150.87 sats per byte\nqz5...7p8 sent 750 XEC to qrf...py0 and 1 others | 1.12 sats per byte\nqzq...mzs sent 717,296 XEC to qzj...e2s and 1 others | 5.00 sats per byte\nqql...h03 sent 89,006,076 XEC to qzj...ksg | 2.13 sats per byte\nqp0...t92 sent 612,181 XEC to qzj...ztx and 1 others | 1.00 sats per byte\nqpm...k9g sent 199,999,998 XEC to qqp...zqu and 1 others | 1.00 sats per byte\nqpa...czv sent 612,208 XEC to qp0...t92 and 1 others | 1.00 sats per byte\nppt...gny sent 88,521,997 XEC to qz3...rj3 and 2 others | 15.28 sats per byte\nqp2...pca sent 294,905 XEC to qp4...0fg and 1 others | 1.00 sats per byte\nqpm...k9g sent 199,999,997 XEC to qpl...eep and 2 others | 1.00 sats per byte\nqp4...yuu sent 289,611,690 XEC to qqh...zy3 and 1 others | 1.00 sats per byte\nqr4...ffa sent 1,975,381 XEC to qr3...w9u and 2 others | 1.00 sats per byte\nqql...y4w sent 30,000,000 XEC to qz8...0fa | 4.16 sats per byte\nqzn...amg sent 3,285,159 XEC to qzt...rag and 1 others | 1.00 sats per byte\nqp9...jlg sent 10,000 XEC to qpv...jap | 4.16 sats per byte\nqp9...jlg sent 45,000 XEC to qry...tf4 | 4.16 sats per byte\nqp9...jlg sent 95,000 XEC to qrt...lp5 | 4.16 sats per byte', 'qqn...e9j sent 21,197,785 XEC to qr2...rh9 and 1 others | 4.10 sats per byte\nqpp...p3l sent 1,217,361 XEC to qz3...hef and 1 others | 1.00 sats per byte\nqz5...7p8 sent 150 XEC to qre...t4t and 1 others | 1.17 sats per byte\nqzj...ksg sent 937,282,770 XEC to qz3...rj3 and 4 others | 1.92 sats per byte\nqpm...k9g sent 199,999,998 XEC to qrd...vnm and 1 others | 1.00 sats per byte\npqu...4ws sent 551,094 XEC to qp2...thh and 1 others | 1.05 sats per byte\nqzl...52p sent 159,000,922 XEC to qpt...67y and 1 others | 1.01 sats per byte\nqz5...7p8 sent 750 XEC to qrf...py0 and 1 others | 1.13 sats per byte\nqz5...7p8 sent 2,300 XEC to qrf...py0 | 1.14 sats per byte\nqp9...jlg sent 971,154,369 XEC to qpu...qhj | 4.16 sats per byte\nqq4...qvq sent 5,167,950 XEC to qqu...vun and 1 others | 1.00 sats per byte\nqqn...gnz sent 10,499,318 XEC to qrj...eya and 1 others | 2.21 sats per byte\nqze...e3p sent 504,025 XEC to qzv...geu | 5.00 sats per byte\nqqs...7c5 sent 101,520,270 XEC to pzz...qn8 and 3 others | 1.00 sats per byte\nqpp...m7l sent 23,026 XEC to qqe...fmm | 5.01 sats per byte', ], @@ -180,7 +183,7 @@ overflowMsgSuccess: [ { channelId: '-1001999999999', - msg: '700722 | 97 txs | unknown\n\n1 new eToken created:\nLambda Variant Variants (LVV) [doc]\n\nApp txs:\nno app: 1629498127|85\nno app: 1629500089|91\nno app: 1629497915|79\nno app: 1629500647|79\nno app: 1629499023|76\nno app: 1629497534|78\nno app: 1629498535|87\nno app: 1629500798|79\nno app: 1629497457|77\nno app: 1629498288|72\nno app: 1629499274|64\nno app: 1629500162|80\nno app: 1629500720|82\nno app: 1629499774|94\nno app: 1629497610|79\nno app: 1629499360|84\nno app: 1629498460|71\nno app: 1629500318|76\nno app: 1629497132|78\nno app: 1629498060|88\nno app: 1629499897|105\nno app: 1629497763|75\nno app: 1629499571|93\nno app: 1629497054|74\nno app: 1629499185|75\nno app: 1629498375|70\nno app: 1629498610|74\nno app: 1629497293|68\nno app: 1629497209|76', + msg: '700722 | 97 txs | unknown\n1 XEC = $0.00002862\n1 BTC = $28,595\n1 ETH = $1,881\n\n1 new eToken created:\nLambda Variant Variants (LVV) [doc]\n\nApp txs:\nno app: 1629498127|85\nno app: 1629500089|91\nno app: 1629497915|79\nno app: 1629500647|79\nno app: 1629499023|76\nno app: 1629497534|78\nno app: 1629498535|87\nno app: 1629500798|79\nno app: 1629497457|77\nno app: 1629498288|72\nno app: 1629499274|64\nno app: 1629500162|80\nno app: 1629500720|82\nno app: 1629499774|94\nno app: 1629497610|79\nno app: 1629499360|84\nno app: 1629498460|71\nno app: 1629500318|76\nno app: 1629497132|78\nno app: 1629498060|88\nno app: 1629499897|105\nno app: 1629497763|75\nno app: 1629499571|93\nno app: 1629497054|74\nno app: 1629499185|75\nno app: 1629498375|70\nno app: 1629498610|74\nno app: 1629497293|68', options: { disable_web_page_preview: true, parse_mode: 'HTML', @@ -189,7 +192,7 @@ }, { channelId: '-1001999999999', - msg: 'no app: 1629499706|88\nno app: 1629497685|81\nno app: 1629499504|84\nno app: 1629498864|64\nno app: 1629498773|66\nno app: 1629499955|96\nno app: 1629500566|71\nno app: 1629497990|82\nno app: 1629498205|77\nno app: 1629499836|98\nno app: 1629498688|79\nno app: 1629497840|81\nno app: 1629500240|77\nno app: 1629500399|75\nno app: 1629498945|79\nno app: 1629497378|72\nno app: 1629499638|91\nno app: 1629499432|84\nno app: 1629500022|85\nno app: 1629500482|72\nno app: 1629499103|75\n\n45 eCash txs:\nqqv...y7y sent 201,835,617 XEC to qqn...gd2 and 1 others | 1.00 sats per byte\nqrf...ldm sent 6,354 XEC to qr8...kys and 1 others | 1.00 sats per byte\nqq4...xph sent 2,099,979 XEC to qp0...rj6 | 10.69 sats per byte\nqru...y7r sent 240,420 XEC to qz5...7p8 and 1 others | 1.23 sats per byte\nqp5...pck sent 4,261,646 XEC to qqz...cc8 | 1.06 sats per byte\nqrh...47a sent 47,684,497 XEC to qz0...c8j and 1 others | 1.00 sats per byte\nqp9...jlg sent 69,850 XEC to qpu...dtm | 4.18 sats per byte', + msg: 'no app: 1629497209|76\nno app: 1629499706|88\nno app: 1629497685|81\nno app: 1629499504|84\nno app: 1629498864|64\nno app: 1629498773|66\nno app: 1629499955|96\nno app: 1629500566|71\nno app: 1629497990|82\nno app: 1629498205|77\nno app: 1629499836|98\nno app: 1629498688|79\nno app: 1629497840|81\nno app: 1629500240|77\nno app: 1629500399|75\nno app: 1629498945|79\nno app: 1629497378|72\nno app: 1629499638|91\nno app: 1629499432|84\nno app: 1629500022|85\nno app: 1629500482|72\nno app: 1629499103|75\n\n45 eCash txs:\nqqv...y7y sent 201,835,617 XEC to qqn...gd2 and 1 others | 1.00 sats per byte\nqrf...ldm sent 6,354 XEC to qr8...kys and 1 others | 1.00 sats per byte\nqq4...xph sent 2,099,979 XEC to qp0...rj6 | 10.69 sats per byte\nqru...y7r sent 240,420 XEC to qz5...7p8 and 1 others | 1.23 sats per byte\nqp5...pck sent 4,261,646 XEC to qqz...cc8 | 1.06 sats per byte\nqrh...47a sent 47,684,497 XEC to qz0...c8j and 1 others | 1.00 sats per byte\nqp9...jlg sent 69,850 XEC to qpu...dtm | 4.18 sats per byte', options: { disable_web_page_preview: true, parse_mode: 'HTML', diff --git a/apps/ecash-herald/test/parseTests.js b/apps/ecash-herald/test/parseTests.js --- a/apps/ecash-herald/test/parseTests.js +++ b/apps/ecash-herald/test/parseTests.js @@ -24,11 +24,12 @@ blockDetails, parsedBlock, coingeckoPrices, + tokenInfoMap, blockSummaryTgMsgs, } = thisBlock; assert.deepEqual(parseBlock(blockDetails), parsedBlock); assert.deepEqual( - getBlockTgMessage(parsedBlock, coingeckoPrices), + getBlockTgMessage(parsedBlock, coingeckoPrices, tokenInfoMap), blockSummaryTgMsgs, ); } diff --git a/apps/ecash-herald/test/telegramTests.js b/apps/ecash-herald/test/telegramTests.js --- a/apps/ecash-herald/test/telegramTests.js +++ b/apps/ecash-herald/test/telegramTests.js @@ -12,8 +12,8 @@ const { telegramHtmlStrings } = require('./mocks/templates'); const { overflowMsg, - overflowMsgSplit, overflowMsgTwo, + overflowMsgSplit, overflowMsgSplitTwo, overflowMsgSuccess, nonOverflowMsg, @@ -89,10 +89,10 @@ const thisBlock = blocks[i]; const { blockSummaryTgMsgs } = thisBlock; for (let j = 0; j < blockSummaryTgMsgs.length; j += 1) { - console.log(blockSummaryTgMsgs[j].length); assert.strictEqual( blockSummaryTgMsgs[j].length <= TG_MSG_MAX_LENGTH, true, + `Message is too long: ${blockSummaryTgMsgs[j].length} > ${TG_MSG_MAX_LENGTH}`, ); } } diff --git a/apps/ecash-herald/test/utilsTests.js b/apps/ecash-herald/test/utilsTests.js --- a/apps/ecash-herald/test/utilsTests.js +++ b/apps/ecash-herald/test/utilsTests.js @@ -4,6 +4,7 @@ 'use strict'; const assert = require('assert'); +const BigNumber = require('bignumber.js'); const axios = require('axios'); const MockAdapter = require('axios-mock-adapter'); const config = require('../config'); @@ -179,6 +180,23 @@ assert.deepEqual(map, roundTrip); }); + it('jsonReplacer and jsonReviver can encode and decode Map containing a BigNumber', async function () { + const bigNumberMap = new Map([ + [ + '76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac', + new BigNumber(36), + ], + [ + '76a9144c1efd024f560e4e1aaf4b62416cd1e82fbed24f88ac', + new BigNumber(72), + ], + ]); + + const jsonText = JSON.stringify(bigNumberMap, jsonReplacer); + const roundTrip = JSON.parse(jsonText, jsonReviver); + + assert.deepEqual(bigNumberMap, roundTrip); + }); it('jsonReplacer and jsonReviver can encode and decode a Set to and from JSON', async function () { const set = new Set(['one', 'two', 'three']);