diff --git a/web/cashtab/.husky/pre-commit b/web/cashtab/.husky/pre-commit deleted file mode 100755 --- a/web/cashtab/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" -cd web/cashtab -npm test -- --watchAll=false diff --git a/web/cashtab/src/components/Send/SendToken.js b/web/cashtab/src/components/Send/SendToken.js --- a/web/cashtab/src/components/Send/SendToken.js +++ b/web/cashtab/src/components/Send/SendToken.js @@ -129,7 +129,7 @@ // Fetch token stats if you do not have them and API did not return an error if (tokenStats === null) { - getTokenStats(BCH, tokenId).then( + getTokenStats(tokenId).then( result => { setTokenStats(result); }, diff --git a/web/cashtab/src/hooks/useBCH.js b/web/cashtab/src/hooks/useBCH.js --- a/web/cashtab/src/hooks/useBCH.js +++ b/web/cashtab/src/hooks/useBCH.js @@ -17,6 +17,8 @@ import cashaddr from 'ecashaddrjs'; import ecies from 'ecies-lite'; import wif from 'wif'; +import { ChronikClient } from 'chronik-client'; +const chronik = new ChronikClient(currency.chronikUrl); export default function useBCH() { const SEND_BCH_ERRORS = { @@ -986,10 +988,51 @@ // No unit tests for this function as it is only an API wrapper // Return false if do not get a valid response - const getTokenStats = async (BCH, tokenId) => { - let tokenStats; + const getTokenStats = async tokenId => { + let tokenStats = {}; + let tokenResponseObj; + + // map Chronik token stats object to a valid tokenStats object expected by Cashtab try { - tokenStats = await BCH.SLP.Utils.tokenStats(tokenId); + // token attributes available via chronik's token() method + tokenResponseObj = await chronik.token(tokenId); + if (!tokenResponseObj) { + throw new Error('Invalid chronik.token() response'); + } + + tokenStats.id = tokenId; + tokenStats.decimals = + tokenResponseObj.slpTxData.genesisInfo.decimals; + tokenStats.versionType = + tokenResponseObj.slpTxData.slpMeta.tokenType; + tokenStats.documentUri = + tokenResponseObj.slpTxData.genesisInfo.tokenDocumentUrl; + tokenStats.symbol = + tokenResponseObj.slpTxData.genesisInfo.tokenTicker; + tokenStats.name = tokenResponseObj.slpTxData.genesisInfo.tokenName; + tokenStats.documentHash = + tokenResponseObj.slpTxData.genesisInfo.tokenDocumentHash; + tokenStats.totalMinted = new BigNumber( + tokenResponseObj.tokenStats.totalMinted, + ).div(new BigNumber(10).exponentiatedBy(tokenStats.decimals)); + tokenStats.totalBurned = new BigNumber( + tokenResponseObj.tokenStats.totalBurned, + ).div(new BigNumber(10).exponentiatedBy(tokenStats.decimals)); + tokenStats.circulatingSupply = tokenStats.totalMinted.minus( + tokenStats.totalBurned, + ); + tokenStats.timestamp = new Date( + new BigNumber(tokenResponseObj.block.timestamp) * 1000, + ).toLocaleString(); + tokenStats.initialTokenQty = new BigNumber( + tokenResponseObj.initialTokenQuantity, + ).div(new BigNumber(10).exponentiatedBy(tokenStats.decimals)); + tokenStats.containsBaton = tokenResponseObj.containsBaton; + tokenStats.blockCreated = tokenResponseObj.block.height; + tokenStats.timestampUnix = new BigNumber( + tokenResponseObj.block.timestamp, + ); + if (isValidTokenStats(tokenStats)) { return tokenStats; }