From ed0df1777ca2f138233afb22f4781c5e174c0ee3 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Mon, 10 Jul 2023 20:42:00 +0300 Subject: [PATCH 01/12] fix optional blockNumber property in eth_getTransactionCount --- src/service/rpc/evm/AbstractEvmBasedRpc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/service/rpc/evm/AbstractEvmBasedRpc.ts b/src/service/rpc/evm/AbstractEvmBasedRpc.ts index e24c7b0577..66be2d6b8f 100644 --- a/src/service/rpc/evm/AbstractEvmBasedRpc.ts +++ b/src/service/rpc/evm/AbstractEvmBasedRpc.ts @@ -277,7 +277,7 @@ export abstract class AbstractEvmBasedRpc implements EvmBasedRpcInterface { return ResponseUtils.fromRpcResult(r) } - async getTransactionCount(address: string, blockNumber?: BlockNumber): Promise> { + async getTransactionCount(address: string, blockNumber: BlockNumber = 'latest'): Promise> { const r = await this.rpcCall('eth_getTransactionCount', [ address, typeof blockNumber === 'number' ? '0x' + new BigNumber(blockNumber).toString(16) : blockNumber, From ae14d46229ee0c1cfc905f1d9deb5b406ab2378a Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Fri, 14 Jul 2023 20:33:06 +0300 Subject: [PATCH 02/12] stash --- src/service/address/address.ts | 195 ++++++++++++++++++++++----------- 1 file changed, 131 insertions(+), 64 deletions(-) diff --git a/src/service/address/address.ts b/src/service/address/address.ts index dfa4b90bea..b103609ec1 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -7,10 +7,10 @@ import { TokenDetails, isDataApiEvmEnabledNetwork, isDataApiUtxoEnabledNetwork, - isEvmBasedNetwork, -} from '../../dto' + isEvmBasedNetwork, isTronNetwork +} from '../../dto'; import { CONFIG, Constant, ErrorUtils, ResponseDto, Utils } from '../../util' -import { EvmRpc, GenericRpc } from '../rpc' +import { EvmRpc, GenericRpc } from '../rpc'; import { Network, TatumConfig } from '../tatum' import { AddressBalance, AddressTransaction, GetAddressTransactionsQuery } from './address.dto' @@ -40,22 +40,23 @@ export class Address { }: AddressBalanceDetails): Promise> { const chain = this.config.network return ErrorUtils.tryFail(async () => { - const [nativeBalances, tokenBalances] = await Promise.all([ - this.getNativeBalance(addresses), - isDataApiEvmEnabledNetwork(chain) && - this.connector - .get<{ result: AddressBalance[] }, ApiBalanceRequest>({ - path: `data/balances`, - params: { - pageSize, - offset: page, - excludeMetadata: true, - chain, - addresses: addresses.join(','), - }, - }) - .then((r) => r.result), - ]) + + const fullBalances = isTronNetwork(chain) ? await this.getFullBalance(addresses) : { nativeBalance: '0', tokenBalances: [] }; + const nativeBalances = isTronNetwork(chain) ? [fullBalances.nativeBalance] : await this.getNativeBalance(addresses); + const tokenBalances = isTronNetwork(chain) ? fullBalances.tokenBalances : isDataApiEvmEnabledNetwork(chain) && + await this.connector + .get<{ result: AddressBalance[] }, ApiBalanceRequest>({ + path: `data/balances`, + params: { + pageSize, + offset: page, + excludeMetadata: true, + chain, + addresses: addresses.join(','), + }, + }) + .then((r) => r.result) + const result: AddressBalance[] = [] for (const [i, nativeBalance] of nativeBalances.entries()) { result.push({ @@ -120,6 +121,45 @@ export class Address { }) } + private async processTRC20TokenBalanceDetails(tokenBalances: {[key: string]: string}) { + const result: AddressBalance[] = [] + // Processing token details + const details = await Promise.all( + tokenBalances.map((details) => + this.connector.get({ + path: 'data/tokens', + params: { + chain, + tokenAddress: details.tokenAddress, + }, + }), + ), + ) + for (let i = 0; i < tokenBalances.length; i++) { + const tokenBalance = tokenBalances[i] + const item: AddressBalance = { + address: tokenBalance.address, + tokenAddress: tokenBalance.tokenAddress, + balance: tokenBalance.balance, + type: tokenBalance.type, + } + if (tokenBalance.lastUpdatedBlock) { + item.lastUpdatedBlock = tokenBalance.lastUpdatedBlock + } + if (details[i].symbol) { + item.asset = details[i].symbol + } + if (details[i].decimals) { + item.decimals = details[i].decimals + } + if (tokenBalance.tokenId) { + item.tokenId = tokenBalance.tokenId + } + result.push(item) + } + return result + } + private async processTokenBalanceDetails(tokenBalances: AddressBalance[], chain: Network) { const result: AddressBalance[] = [] // Processing token details @@ -232,33 +272,58 @@ export class Address { }) } - private async getNativeBalance(addresses: string[]): Promise { + private async getFullBalance(addresses: string[]): Promise<{nativeBalance: string, tokenBalances: []}> { const network = this.config.network - if (isEvmBasedNetwork(network)) { - const rpc = Utils.getRpc(this.id, this.config) - const result = await Promise.all( - addresses.map((a, i) => rpc.rawRpcCall(Utils.prepareRpcCall('eth_getBalance', [a, 'pending'], i))), - ) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - return result.map((e) => new BigNumber(e.result).dividedBy(10 ** Constant.DECIMALS[network]).toString()) + switch (true) { + case [Network.TRON, Network.TRON_SHASTA].includes(network): + if (addresses.length !== 1) { + throw new Error(`UTXO based networks like ${network} support only one address per call.`) + } + return this.connector + .get<{ + balance: number; + createTime: number; + trc10: [{ + key: string; + value: number; + }]; + trc20: []; + freeNetLimit: number, + bandwidth: number, + }>({ + path: `tron/account/${addresses[0]}`, + }) + .then((r) => Object.create({ + nativeBalance: r.balance.toString(), + tokenBalances: r.trc20 + })) } - if ([Network.SOLANA, Network.SOLANA_DEVNET].includes(network)) { - const rpc = Utils.getRpc(this.id, this.config) - return rpc - .rawBatchRpcCall( - addresses.map((a, i) => Utils.prepareRpcCall('getBalance', [a, { commitment: 'processed' }], i)), - ) - .then((r) => - r.map((e) => new BigNumber(e.result.value).dividedBy(10 ** Constant.DECIMALS[network]).toString()), - ) - } else if ([Network.XRP, Network.XRP_TESTNET].includes(network)) { - if (addresses.length !== 1) { - throw new Error(`UTXO based networks like ${network} support only one address per call.`) - } - const rpc = Utils.getRpc(this.id, this.config) - return rpc - .rawRpcCall( + throw new Error(`Unsupported network ${network} for now.`) + } + + private async getNativeBalance(addresses: string[]): Promise { + const network = this.config.network + switch (true) { + case isEvmBasedNetwork(network): + return Promise.all( + addresses.map((a, i) => Utils.getRpc(this.id, this.config).rawRpcCall(Utils.prepareRpcCall('eth_getBalance', [a, 'pending'], i))), + ).then(r => r.map((e) => + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + new BigNumber(e.result).dividedBy(10 ** Constant.DECIMALS[network]).toString())) + case [Network.SOLANA, Network.SOLANA_DEVNET].includes(network): + return Utils.getRpc(this.id, this.config) + .rawBatchRpcCall( + addresses.map((a, i) => Utils.prepareRpcCall('getBalance', [a, { commitment: 'processed' }], i)), + ) + .then((r) => + r.map((e) => new BigNumber(e.result.value).dividedBy(10 ** Constant.DECIMALS[network]).toString()), + ) + case [Network.XRP, Network.XRP_TESTNET].includes(network): + if (addresses.length !== 1) { + throw new Error(`UTXO based networks like ${network} support only one address per call.`) + } + return Utils.getRpc(this.id, this.config).rawRpcCall( Utils.prepareRpcCall('account_info', [ { account: addresses[0], @@ -266,27 +331,29 @@ export class Address { }, ]), ) - .then((r) => [ - new BigNumber(r.result.account_data?.Balance || 0) - .dividedBy(10 ** Constant.DECIMALS[network]) - .toString(), - ]) - } else if (isDataApiUtxoEnabledNetwork(network)) { - if (addresses.length !== 1) { - throw new Error(`UTXO based networks like ${network} support only one address per call.`) - } - return this.connector - .get>({ - path: 'data/utxos', - params: { - chain: network, - address: addresses[0], - totalValue: 200000000000, - }, - }) - .then((r) => [r.reduce((acc, val) => acc + val.value, 0).toString()]) + .then((r) => [ + new BigNumber(r.result.account_data?.Balance || 0) + .dividedBy(10 ** Constant.DECIMALS[network]) + .toString(), + ]) + case isDataApiUtxoEnabledNetwork(network): + if (addresses.length !== 1) { + throw new Error(`UTXO based networks like ${network} support only one address per call.`) + } + return this.connector + .get>({ + path: 'data/utxos', + params: { + chain: network, + address: addresses[0], + totalValue: 200000000000, + }, + }) + .then((r) => [r.reduce((acc, val) => acc + val.value, 0).toString()]) + case [Network.TRON, Network.TRON_SHASTA].includes(network): + throw new Error(`Use 'getFullBalance' method for network ${network}.`) } - // TODO: implement for other networks - TRON, XLM etc etc + // TODO: implement for other networks - XLM etc etc throw new Error(`Unsupported network ${network} for now.`) } } From 1723c40a4b8607975d030ff785cba96eaa1bfd05 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Sun, 16 Jul 2023 03:36:04 +0300 Subject: [PATCH 03/12] Tron getBalance implemented --- package.json | 1 + src/service/address/address.ts | 71 +++--- yarn.lock | 408 ++++++++++++++++++++++++++++++++- 3 files changed, 436 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index 5a87cb8e4a..84bc08f18f 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "dependencies": { "bignumber.js": "^9.1.1", "reflect-metadata": "^0.1.13", + "tronweb": "^5.3.0", "typedi": "^0.10.0" }, "devDependencies": { diff --git a/src/service/address/address.ts b/src/service/address/address.ts index b103609ec1..3a9197a325 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -13,6 +13,9 @@ import { CONFIG, Constant, ErrorUtils, ResponseDto, Utils } from '../../util' import { EvmRpc, GenericRpc } from '../rpc'; import { Network, TatumConfig } from '../tatum' import { AddressBalance, AddressTransaction, GetAddressTransactionsQuery } from './address.dto' +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import TronWeb from 'tronweb'; @Service({ factory: (data: { id: string }) => { @@ -23,10 +26,13 @@ import { AddressBalance, AddressTransaction, GetAddressTransactionsQuery } from export class Address { private readonly connector: TatumConnector private readonly config: TatumConfig + private readonly tronWeb: TronWeb constructor(private readonly id: string) { this.config = Container.of(this.id).get(CONFIG) this.connector = Container.of(this.id).get(TatumConnector) + const tronNode = `https://api.tatum.io/v3/blockchain/node/${this.config.network}/${this.config.apiKey?.v1 ? this.config.apiKey?.v1 : this.config.apiKey?.v2}`; + this.tronWeb = new TronWeb(tronNode, tronNode, tronNode); } /** @@ -70,7 +76,8 @@ export class Address { if (!tokenBalances) { return result } - return [...result, ...(await this.processTokenBalanceDetails(tokenBalances, chain))] + const serializedTokenBalances = isTronNetwork(chain) ? tokenBalances : await this.processTokenBalanceDetails(tokenBalances, chain); + return [...result, ...serializedTokenBalances] }) } @@ -122,42 +129,21 @@ export class Address { } private async processTRC20TokenBalanceDetails(tokenBalances: {[key: string]: string}) { - const result: AddressBalance[] = [] - // Processing token details - const details = await Promise.all( - tokenBalances.map((details) => - this.connector.get({ - path: 'data/tokens', - params: { - chain, - tokenAddress: details.tokenAddress, - }, - }), - ), - ) - for (let i = 0; i < tokenBalances.length; i++) { - const tokenBalance = tokenBalances[i] - const item: AddressBalance = { - address: tokenBalance.address, - tokenAddress: tokenBalance.tokenAddress, - balance: tokenBalance.balance, - type: tokenBalance.type, - } - if (tokenBalance.lastUpdatedBlock) { - item.lastUpdatedBlock = tokenBalance.lastUpdatedBlock - } - if (details[i].symbol) { - item.asset = details[i].symbol - } - if (details[i].decimals) { - item.decimals = details[i].decimals - } - if (tokenBalance.tokenId) { - item.tokenId = tokenBalance.tokenId - } - result.push(item) + const balances = Object.entries(tokenBalances[0]); + const serializedTokenBalance: Array = []; + for (let i = 0; i < balances.length; i++) { + this.tronWeb.setAddress(balances[i][0]); + const contract = await this.tronWeb.contract().at(balances[i][0]); + const asset = await contract.symbol().call(); + const decimals = await contract.decimals().call(); + const balance = balances[i][1]; + serializedTokenBalance.push({ + asset, + decimals, + balance + }); } - return result + return serializedTokenBalance } private async processTokenBalanceDetails(tokenBalances: AddressBalance[], chain: Network) { @@ -287,16 +273,19 @@ export class Address { key: string; value: number; }]; - trc20: []; + trc20: {[key: string]: string}; freeNetLimit: number, bandwidth: number, }>({ path: `tron/account/${addresses[0]}`, }) - .then((r) => Object.create({ - nativeBalance: r.balance.toString(), - tokenBalances: r.trc20 - })) + .then(async (r) => + { + return Object.create({ + nativeBalance: r.balance.toString(), + tokenBalances: await this.processTRC20TokenBalanceDetails(r.trc20), + }) + }) } throw new Error(`Unsupported network ${network} for now.`) } diff --git a/yarn.lock b/yarn.lock index 1c685e1a68..7f5a6ff2a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adraffy/ens-normalize@1.9.2": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz#60111a5d9db45b2e5cbb6231b0bb8d97e8659316" + integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg== + "@ampproject/remapping@^2.1.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" @@ -278,6 +283,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/runtime@^7.0.0": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/template@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" @@ -360,6 +372,183 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -577,6 +766,28 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + +"@noble/hashes@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/hashes@1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/secp256k1@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -598,6 +809,28 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -617,6 +850,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@tronweb3/google-protobuf@^3.21.2": + version "3.21.2" + resolved "https://registry.yarnpkg.com/@tronweb3/google-protobuf/-/google-protobuf-3.21.2.tgz#0964cf83ed7826d31c3cb4e4ecf07655681631c9" + integrity sha512-IVcT2GfWX3K6tHUVhs14NP5uzKhQt4KeDya1g9ACxuZsUzsaoGUIGzceK2Ltu7xp1YV94AaHOf4yxLAivlvEkQ== + "@tsconfig/node10@^1.0.7": version "1.0.8" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" @@ -729,6 +967,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.2.tgz#5764ca9aa94470adb4e1185fe2e9f19458992b2e" integrity sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ== +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + "@types/node@^18.15.11": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" @@ -879,6 +1122,11 @@ acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -962,6 +1210,13 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +axios@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" @@ -1028,11 +1283,21 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bignumber.js@^9.1.1: +bignumber.js@^9.0.1, bignumber.js@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1048,6 +1313,11 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -1329,6 +1599,19 @@ electron-to-chromium@^1.4.118: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz#2d917c71712dac9652cc01af46c7d0bd51552974" integrity sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w== +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -1495,6 +1778,34 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +ethereum-cryptography@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +ethers@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.6.3.tgz#9bf11d1bd0f18c7c55087d1a52fdc8f3c33c8bab" + integrity sha512-g8wLXeRWSGDD0T+wsL3pvyc3aYnmxEEAwH8LSoDTDRhRsmJeNs9YMXlNU7ax2caO+zHkeI9MkHiz6rwxEjN4Mw== + dependencies: + "@adraffy/ens-normalize" "1.9.2" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.7.1" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -1600,6 +1911,11 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== +follow-redirects@^1.14.8: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -1721,6 +2037,23 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -1801,11 +2134,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +injectpromise@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/injectpromise/-/injectpromise-1.0.0.tgz#c621f7df2bbfc1164d714f1fb229adec2079da39" + integrity sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2317,6 +2655,11 @@ jest@27.0.0: import-local "^3.0.2" jest-cli "^27.0.0" +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2448,7 +2791,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.7.0: +lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2514,6 +2857,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -2731,6 +3084,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +querystring-es3@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -2746,6 +3104,11 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -2830,6 +3193,11 @@ semver@7.x, semver@^7.3.5: dependencies: lru-cache "^6.0.0" +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -3047,6 +3415,25 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tronweb@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/tronweb/-/tronweb-5.3.0.tgz#b40c4aa68f81b70bac4d8de52960b82b61f9ab04" + integrity sha512-i03+3UviQacqdrr3VgXHDL8h/2E24BeULak4w6+yRkJaCuEyxjWOtEn1dq87ulTkHzS/vKK0zIyvW7rSxuISOA== + dependencies: + "@babel/runtime" "^7.0.0" + "@ethersproject/abi" "^5.7.0" + "@tronweb3/google-protobuf" "^3.21.2" + axios "^0.26.1" + bignumber.js "^9.0.1" + ethereum-cryptography "^2.0.0" + ethers "^6.6.0" + eventemitter3 "^3.1.0" + injectpromise "^1.0.0" + lodash "^4.17.21" + querystring-es3 "^0.2.1" + semver "^5.6.0" + validator "^13.7.0" + ts-jest@^27.1.4: version "27.1.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" @@ -3080,6 +3467,11 @@ ts-node@^10.7.0: v8-compile-cache-lib "^3.0.0" yn "3.1.1" +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -3181,6 +3573,11 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +validator@^13.7.0: + version "13.9.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" + integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -3269,6 +3666,11 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" From af4c9314d5b68472c5332e02e48ff7db1ee3b161 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Fri, 14 Jul 2023 20:33:06 +0300 Subject: [PATCH 04/12] some code style fixes --- src/service/address/address.ts | 46 +++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/service/address/address.ts b/src/service/address/address.ts index 3a9197a325..0344e71950 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -8,14 +8,14 @@ import { isDataApiEvmEnabledNetwork, isDataApiUtxoEnabledNetwork, isEvmBasedNetwork, isTronNetwork -} from '../../dto'; +} from '../../dto' import { CONFIG, Constant, ErrorUtils, ResponseDto, Utils } from '../../util' -import { EvmRpc, GenericRpc } from '../rpc'; +import { EvmRpc, GenericRpc } from '../rpc' import { Network, TatumConfig } from '../tatum' import { AddressBalance, AddressTransaction, GetAddressTransactionsQuery } from './address.dto' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import TronWeb from 'tronweb'; +import TronWeb from 'tronweb' @Service({ factory: (data: { id: string }) => { @@ -31,7 +31,7 @@ export class Address { constructor(private readonly id: string) { this.config = Container.of(this.id).get(CONFIG) this.connector = Container.of(this.id).get(TatumConnector) - const tronNode = `https://api.tatum.io/v3/blockchain/node/${this.config.network}/${this.config.apiKey?.v1 ? this.config.apiKey?.v1 : this.config.apiKey?.v2}`; + const tronNode = `https://api.tatum.io/v3/blockchain/node/${this.config.network}/${this.config.apiKey?.v1 ? this.config.apiKey?.v1 : this.config.apiKey?.v2}` this.tronWeb = new TronWeb(tronNode, tronNode, tronNode); } @@ -47,8 +47,8 @@ export class Address { const chain = this.config.network return ErrorUtils.tryFail(async () => { - const fullBalances = isTronNetwork(chain) ? await this.getFullBalance(addresses) : { nativeBalance: '0', tokenBalances: [] }; - const nativeBalances = isTronNetwork(chain) ? [fullBalances.nativeBalance] : await this.getNativeBalance(addresses); + const fullBalances = isTronNetwork(chain) ? await this.getFullBalance(addresses) : { nativeBalance: '0', tokenBalances: [] } + const nativeBalances = isTronNetwork(chain) ? [fullBalances.nativeBalance] : await this.getNativeBalance(addresses) const tokenBalances = isTronNetwork(chain) ? fullBalances.tokenBalances : isDataApiEvmEnabledNetwork(chain) && await this.connector .get<{ result: AddressBalance[] }, ApiBalanceRequest>({ @@ -76,7 +76,7 @@ export class Address { if (!tokenBalances) { return result } - const serializedTokenBalances = isTronNetwork(chain) ? tokenBalances : await this.processTokenBalanceDetails(tokenBalances, chain); + const serializedTokenBalances = isTronNetwork(chain) ? tokenBalances : await this.processTokenBalanceDetails(tokenBalances, chain) return [...result, ...serializedTokenBalances] }) } @@ -129,19 +129,19 @@ export class Address { } private async processTRC20TokenBalanceDetails(tokenBalances: {[key: string]: string}) { - const balances = Object.entries(tokenBalances[0]); - const serializedTokenBalance: Array = []; + const balances = Object.entries(tokenBalances[0]) + const serializedTokenBalance: Array = [] for (let i = 0; i < balances.length; i++) { - this.tronWeb.setAddress(balances[i][0]); - const contract = await this.tronWeb.contract().at(balances[i][0]); - const asset = await contract.symbol().call(); - const decimals = await contract.decimals().call(); - const balance = balances[i][1]; + this.tronWeb.setAddress(balances[i][0]) + const contract = await this.tronWeb.contract().at(balances[i][0]) + const asset = await contract.symbol().call() + const decimals = await contract.decimals().call() + const balance = balances[i][1] serializedTokenBalance.push({ asset, decimals, balance - }); + }) } return serializedTokenBalance } @@ -199,8 +199,8 @@ export class Address { blockNumber: number time: number hash: string - inputs: Array<{ coin: { address: string; value: number | string } }> - outputs: Array<{ address: string; value: string | number }> + inputs: Array<{ coin: { address: string, value: number | string } }> + outputs: Array<{ address: string, value: string | number }> }> >({ path, @@ -267,13 +267,13 @@ export class Address { } return this.connector .get<{ - balance: number; - createTime: number; + balance: number, + createTime: number trc10: [{ - key: string; - value: number; - }]; - trc20: {[key: string]: string}; + key: string, + value: number, + }] + trc20: {[key: string]: string} freeNetLimit: number, bandwidth: number, }>({ From d9de70c33439550dd35a35922e6f7199723ce05b Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Mon, 17 Jul 2023 13:22:02 +0300 Subject: [PATCH 05/12] removed TronWeb from dependencies reworked processTRC20TokenBalanceDetails added decodeUInt256 method --- package.json | 1 - src/service/address/address.ts | 76 +++++++++++++++++----------------- src/util/decode.ts | 25 +++++++++++ yarn.lock | 13 ++++++ 4 files changed, 75 insertions(+), 40 deletions(-) create mode 100644 src/util/decode.ts diff --git a/package.json b/package.json index 84bc08f18f..5a87cb8e4a 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "dependencies": { "bignumber.js": "^9.1.1", "reflect-metadata": "^0.1.13", - "tronweb": "^5.3.0", "typedi": "^0.10.0" }, "devDependencies": { diff --git a/src/service/address/address.ts b/src/service/address/address.ts index 0344e71950..a1203aced7 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -10,12 +10,10 @@ import { isEvmBasedNetwork, isTronNetwork } from '../../dto' import { CONFIG, Constant, ErrorUtils, ResponseDto, Utils } from '../../util' -import { EvmRpc, GenericRpc } from '../rpc' +import { EvmRpc, GenericRpc, TronRpc } from '../rpc'; import { Network, TatumConfig } from '../tatum' import { AddressBalance, AddressTransaction, GetAddressTransactionsQuery } from './address.dto' -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import TronWeb from 'tronweb' +import { decodeUInt256 } from '../../util/decode'; @Service({ factory: (data: { id: string }) => { @@ -26,13 +24,10 @@ import TronWeb from 'tronweb' export class Address { private readonly connector: TatumConnector private readonly config: TatumConfig - private readonly tronWeb: TronWeb constructor(private readonly id: string) { this.config = Container.of(this.id).get(CONFIG) this.connector = Container.of(this.id).get(TatumConnector) - const tronNode = `https://api.tatum.io/v3/blockchain/node/${this.config.network}/${this.config.apiKey?.v1 ? this.config.apiKey?.v1 : this.config.apiKey?.v2}` - this.tronWeb = new TronWeb(tronNode, tronNode, tronNode); } /** @@ -94,35 +89,36 @@ export class Address { page = 0, }: GetAddressTransactionsQuery): Promise> { const chain = this.config.network + let path; return ErrorUtils.tryFail(async () => { - if (isDataApiEvmEnabledNetwork(chain)) { - return this.connector - .get<{ result: AddressTransaction[] }>({ - path: `data/transactions`, - params: { - chain, - addresses: address, - transactionTypes: transactionTypes?.join(), - transactionSubtype: transactionDirection, - blockFrom: fromBlock, - blockTo: toBlock, - pageSize, - offset: page, - }, - }) - .then((r) => r.result) - } - let path - if ([Network.BITCOIN, Network.BITCOIN_TESTNET].includes(chain)) { - path = `bitcoin/transaction/address/${address}` - } else if ([Network.LITECOIN, Network.LITECOIN_TESTNET].includes(chain)) { - path = `litecoin/transaction/address/${address}` - } else if ([Network.DOGECOIN, Network.DOGECOIN_TESTNET].includes(chain)) { - path = `dogecoin/transaction/address/${address}` - } - if (!path) { - // TODO: implement for other networks - TRON, XRP, CARDANO, SOL, XLM etc etc - throw new Error(`Not supported for ${chain} network.`) + switch (true) { + case isDataApiEvmEnabledNetwork(chain): + return this.connector + .get<{ result: AddressTransaction[] }>({ + path: `data/transactions`, + params: { + chain, + addresses: address, + transactionTypes: transactionTypes?.join(), + transactionSubtype: transactionDirection, + blockFrom: fromBlock, + blockTo: toBlock, + pageSize, + offset: page, + }, + }) + .then((r) => r.result) + case [Network.BITCOIN, Network.BITCOIN_TESTNET].includes(chain): + path = `bitcoin/transaction/address/${address}` + break; + case [Network.LITECOIN, Network.LITECOIN_TESTNET].includes(chain): + path = `litecoin/transaction/address/${address}` + break; + case [Network.DOGECOIN, Network.DOGECOIN_TESTNET].includes(chain): + path = `dogecoin/transaction/address/${address}` + break; + default: + throw new Error(`Not supported for ${chain} network.`) } return this.processUtxoBasedTxs(path, pageSize, page, transactionDirection, chain, address) }) @@ -132,10 +128,12 @@ export class Address { const balances = Object.entries(tokenBalances[0]) const serializedTokenBalance: Array = [] for (let i = 0; i < balances.length; i++) { - this.tronWeb.setAddress(balances[i][0]) - const contract = await this.tronWeb.contract().at(balances[i][0]) - const asset = await contract.symbol().call() - const decimals = await contract.decimals().call() + const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract( + balances[i][0], balances[i][0], 'symbol()', '', { visible: true } + ).then(r => decodeUInt256(r.constant_result[0])); + const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract( + balances[i][0], balances[i][0], 'decimals()', '', { visible: true } + ).then(r => decodeUInt256(r.constant_result[0])); const balance = balances[i][1] serializedTokenBalance.push({ asset, diff --git a/src/util/decode.ts b/src/util/decode.ts new file mode 100644 index 0000000000..361b258ad5 --- /dev/null +++ b/src/util/decode.ts @@ -0,0 +1,25 @@ +export async function decodeUInt256(uint256Hex: string): Promise { + const hexString = uint256Hex.replace(/^0+/, ''); // Remove leading zeros + const byteLength = hexString.length / 2; + const bytes = []; + + for (let i = 0; i < byteLength; i++) { + const byte = parseInt(hexString.substr(i * 2, 2), 16); // Get the current byte + bytes.push(byte); + } + + const firstByte = BigInt(bytes[0]); // Convert the first byte to a BigInt + let decodedData; + + if (firstByte < BigInt(10)) { + // If the first byte is in the range of ASCII digits (0-9), decode as number + decodedData = Number('0x' + uint256Hex); + } else { + decodedData = bytes + .map(byte => String.fromCharCode(byte)) + .filter(char => /[a-zA-Z0-9]/.test(char)) + .join(''); + } + + return decodedData; +} diff --git a/yarn.lock b/yarn.lock index 7f5a6ff2a6..c819deffce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1801,6 +1801,19 @@ ethers@^6.6.0: tslib "2.4.0" ws "8.5.0" +ethers@^6.6.4: + version "6.6.4" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.6.4.tgz#f03a86effcd55e82aed96a2fb9a56a9febd3e3d5" + integrity sha512-r3myN2hEnydmu23iiIj5kjWnCh5JNzlqrE/z+Kw5UqH173F+JOWzU6qkFB4HVC50epgxzKSL2Hq1oNXA877vwQ== + dependencies: + "@adraffy/ens-normalize" "1.9.2" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.7.1" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" From f8214c3fb47d54fc0d2c2251cb10cf901eae40e3 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Mon, 17 Jul 2023 13:29:18 +0300 Subject: [PATCH 06/12] some code style fixes --- src/service/address/address.ts | 16 ++++++++-------- src/util/decode.ts | 20 ++++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/service/address/address.ts b/src/service/address/address.ts index a1203aced7..d8f6988569 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -10,10 +10,10 @@ import { isEvmBasedNetwork, isTronNetwork } from '../../dto' import { CONFIG, Constant, ErrorUtils, ResponseDto, Utils } from '../../util' -import { EvmRpc, GenericRpc, TronRpc } from '../rpc'; +import { EvmRpc, GenericRpc, TronRpc } from '../rpc' import { Network, TatumConfig } from '../tatum' import { AddressBalance, AddressTransaction, GetAddressTransactionsQuery } from './address.dto' -import { decodeUInt256 } from '../../util/decode'; +import { decodeUInt256 } from '../../util/decode' @Service({ factory: (data: { id: string }) => { @@ -89,7 +89,7 @@ export class Address { page = 0, }: GetAddressTransactionsQuery): Promise> { const chain = this.config.network - let path; + let path return ErrorUtils.tryFail(async () => { switch (true) { case isDataApiEvmEnabledNetwork(chain): @@ -110,13 +110,13 @@ export class Address { .then((r) => r.result) case [Network.BITCOIN, Network.BITCOIN_TESTNET].includes(chain): path = `bitcoin/transaction/address/${address}` - break; + break case [Network.LITECOIN, Network.LITECOIN_TESTNET].includes(chain): path = `litecoin/transaction/address/${address}` - break; + break case [Network.DOGECOIN, Network.DOGECOIN_TESTNET].includes(chain): path = `dogecoin/transaction/address/${address}` - break; + break default: throw new Error(`Not supported for ${chain} network.`) } @@ -130,10 +130,10 @@ export class Address { for (let i = 0; i < balances.length; i++) { const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract( balances[i][0], balances[i][0], 'symbol()', '', { visible: true } - ).then(r => decodeUInt256(r.constant_result[0])); + ).then(r => decodeUInt256(r.constant_result[0])) const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract( balances[i][0], balances[i][0], 'decimals()', '', { visible: true } - ).then(r => decodeUInt256(r.constant_result[0])); + ).then(r => decodeUInt256(r.constant_result[0])) const balance = balances[i][1] serializedTokenBalance.push({ asset, diff --git a/src/util/decode.ts b/src/util/decode.ts index 361b258ad5..46c195177f 100644 --- a/src/util/decode.ts +++ b/src/util/decode.ts @@ -1,25 +1,25 @@ export async function decodeUInt256(uint256Hex: string): Promise { - const hexString = uint256Hex.replace(/^0+/, ''); // Remove leading zeros - const byteLength = hexString.length / 2; - const bytes = []; + const hexString = uint256Hex.replace(/^0+/, '') // Remove leading zeros + const byteLength = hexString.length / 2 + const bytes = [] for (let i = 0; i < byteLength; i++) { - const byte = parseInt(hexString.substr(i * 2, 2), 16); // Get the current byte - bytes.push(byte); + const byte = parseInt(hexString.substr(i * 2, 2), 16) // Get the current byte + bytes.push(byte) } - const firstByte = BigInt(bytes[0]); // Convert the first byte to a BigInt - let decodedData; + const firstByte = BigInt(bytes[0]) // Convert the first byte to a BigInt + let decodedData if (firstByte < BigInt(10)) { // If the first byte is in the range of ASCII digits (0-9), decode as number - decodedData = Number('0x' + uint256Hex); + decodedData = Number('0x' + uint256Hex) } else { decodedData = bytes .map(byte => String.fromCharCode(byte)) .filter(char => /[a-zA-Z0-9]/.test(char)) - .join(''); + .join('') } - return decodedData; + return decodedData } From b85137df33195289e2bb239e887b3eacf569eff1 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Mon, 17 Jul 2023 13:31:27 +0300 Subject: [PATCH 07/12] rolled back yarn.lock --- yarn.lock | 421 +----------------------------------------------------- 1 file changed, 3 insertions(+), 418 deletions(-) diff --git a/yarn.lock b/yarn.lock index c819deffce..1c685e1a68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@adraffy/ens-normalize@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz#60111a5d9db45b2e5cbb6231b0bb8d97e8659316" - integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg== - "@ampproject/remapping@^2.1.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" @@ -283,13 +278,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/runtime@^7.0.0": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== - dependencies: - regenerator-runtime "^0.13.11" - "@babel/template@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" @@ -372,183 +360,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@humanwhocodes/config-array@^0.9.2": version "0.9.5" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" @@ -766,28 +577,6 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@noble/curves@1.1.0", "@noble/curves@~1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" - integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== - dependencies: - "@noble/hashes" "1.3.1" - -"@noble/hashes@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== - -"@noble/hashes@1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" - integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== - -"@noble/secp256k1@1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -809,28 +598,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" - integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== - -"@scure/bip32@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" - integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== - dependencies: - "@noble/curves" "~1.1.0" - "@noble/hashes" "~1.3.1" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" - integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== - dependencies: - "@noble/hashes" "~1.3.0" - "@scure/base" "~1.1.0" - "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -850,11 +617,6 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@tronweb3/google-protobuf@^3.21.2": - version "3.21.2" - resolved "https://registry.yarnpkg.com/@tronweb3/google-protobuf/-/google-protobuf-3.21.2.tgz#0964cf83ed7826d31c3cb4e4ecf07655681631c9" - integrity sha512-IVcT2GfWX3K6tHUVhs14NP5uzKhQt4KeDya1g9ACxuZsUzsaoGUIGzceK2Ltu7xp1YV94AaHOf4yxLAivlvEkQ== - "@tsconfig/node10@^1.0.7": version "1.0.8" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" @@ -967,11 +729,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.2.tgz#5764ca9aa94470adb4e1185fe2e9f19458992b2e" integrity sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ== -"@types/node@18.15.13": - version "18.15.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" - integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== - "@types/node@^18.15.11": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" @@ -1122,11 +879,6 @@ acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== -aes-js@4.0.0-beta.5: - version "4.0.0-beta.5" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" - integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1210,13 +962,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -axios@^0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - babel-jest@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" @@ -1283,21 +1028,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bignumber.js@^9.0.1, bignumber.js@^9.1.1: +bignumber.js@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1313,11 +1048,6 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -1599,19 +1329,6 @@ electron-to-chromium@^1.4.118: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz#2d917c71712dac9652cc01af46c7d0bd51552974" integrity sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w== -elliptic@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -1778,47 +1495,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -ethereum-cryptography@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" - integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== - dependencies: - "@noble/curves" "1.1.0" - "@noble/hashes" "1.3.1" - "@scure/bip32" "1.3.1" - "@scure/bip39" "1.2.1" - -ethers@^6.6.0: - version "6.6.3" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.6.3.tgz#9bf11d1bd0f18c7c55087d1a52fdc8f3c33c8bab" - integrity sha512-g8wLXeRWSGDD0T+wsL3pvyc3aYnmxEEAwH8LSoDTDRhRsmJeNs9YMXlNU7ax2caO+zHkeI9MkHiz6rwxEjN4Mw== - dependencies: - "@adraffy/ens-normalize" "1.9.2" - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.7.1" - "@types/node" "18.15.13" - aes-js "4.0.0-beta.5" - tslib "2.4.0" - ws "8.5.0" - -ethers@^6.6.4: - version "6.6.4" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.6.4.tgz#f03a86effcd55e82aed96a2fb9a56a9febd3e3d5" - integrity sha512-r3myN2hEnydmu23iiIj5kjWnCh5JNzlqrE/z+Kw5UqH173F+JOWzU6qkFB4HVC50epgxzKSL2Hq1oNXA877vwQ== - dependencies: - "@adraffy/ens-normalize" "1.9.2" - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.7.1" - "@types/node" "18.15.13" - aes-js "4.0.0-beta.5" - tslib "2.4.0" - ws "8.5.0" - -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -1924,11 +1600,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== -follow-redirects@^1.14.8: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -2050,23 +1721,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -2147,16 +1801,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -injectpromise@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/injectpromise/-/injectpromise-1.0.0.tgz#c621f7df2bbfc1164d714f1fb229adec2079da39" - integrity sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2668,11 +2317,6 @@ jest@27.0.0: import-local "^3.0.2" jest-cli "^27.0.0" -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2804,7 +2448,7 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2870,16 +2514,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -3097,11 +2731,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -querystring-es3@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -3117,11 +2746,6 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -3206,11 +2830,6 @@ semver@7.x, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@^5.6.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -3428,25 +3047,6 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -tronweb@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/tronweb/-/tronweb-5.3.0.tgz#b40c4aa68f81b70bac4d8de52960b82b61f9ab04" - integrity sha512-i03+3UviQacqdrr3VgXHDL8h/2E24BeULak4w6+yRkJaCuEyxjWOtEn1dq87ulTkHzS/vKK0zIyvW7rSxuISOA== - dependencies: - "@babel/runtime" "^7.0.0" - "@ethersproject/abi" "^5.7.0" - "@tronweb3/google-protobuf" "^3.21.2" - axios "^0.26.1" - bignumber.js "^9.0.1" - ethereum-cryptography "^2.0.0" - ethers "^6.6.0" - eventemitter3 "^3.1.0" - injectpromise "^1.0.0" - lodash "^4.17.21" - querystring-es3 "^0.2.1" - semver "^5.6.0" - validator "^13.7.0" - ts-jest@^27.1.4: version "27.1.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" @@ -3480,11 +3080,6 @@ ts-node@^10.7.0: v8-compile-cache-lib "^3.0.0" yn "3.1.1" -tslib@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -3586,11 +3181,6 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" -validator@^13.7.0: - version "13.9.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" - integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== - w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -3679,11 +3269,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" From 112121c5267ecdd746435725bc5804c0b7fcf810 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Fri, 28 Jul 2023 17:06:58 +0300 Subject: [PATCH 08/12] fixed issue with empty trc20 token balance and with multiply trc20 tokens --- src/service/address/address.ts | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/service/address/address.ts b/src/service/address/address.ts index d8f6988569..4d84666d74 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -124,24 +124,19 @@ export class Address { }) } - private async processTRC20TokenBalanceDetails(tokenBalances: {[key: string]: string}) { - const balances = Object.entries(tokenBalances[0]) - const serializedTokenBalance: Array = [] - for (let i = 0; i < balances.length; i++) { - const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract( - balances[i][0], balances[i][0], 'symbol()', '', { visible: true } - ).then(r => decodeUInt256(r.constant_result[0])) - const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract( - balances[i][0], balances[i][0], 'decimals()', '', { visible: true } - ).then(r => decodeUInt256(r.constant_result[0])) - const balance = balances[i][1] + private async processTRC20TokenBalanceDetails(tokenBalances: [{[key: string]: string}]) { + const serializedTokenBalance = []; + for (let i = 0; i < tokenBalances.length; i++) { + const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'symbol()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])); + const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'decimals()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])); + const balance = Object.values(tokenBalances[i])[0]; serializedTokenBalance.push({ asset, decimals, balance - }) + }); } - return serializedTokenBalance + return serializedTokenBalance; } private async processTokenBalanceDetails(tokenBalances: AddressBalance[], chain: Network) { @@ -271,7 +266,7 @@ export class Address { key: string, value: number, }] - trc20: {[key: string]: string} + trc20: [{[key: string]: string}] freeNetLimit: number, bandwidth: number, }>({ @@ -281,7 +276,7 @@ export class Address { { return Object.create({ nativeBalance: r.balance.toString(), - tokenBalances: await this.processTRC20TokenBalanceDetails(r.trc20), + tokenBalances: r.trc20.length > 0 ? await this.processTRC20TokenBalanceDetails(r.trc20) : [], }) }) } From f815f08863692bb6f0b3f279ca5b9550f2f085fe Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Fri, 28 Jul 2023 17:06:58 +0300 Subject: [PATCH 09/12] fixed issue with empty trc20 token balance and with multiply trc20 tokens --- src/service/address/address.ts | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/service/address/address.ts b/src/service/address/address.ts index d8f6988569..dcffb676a8 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -124,17 +124,12 @@ export class Address { }) } - private async processTRC20TokenBalanceDetails(tokenBalances: {[key: string]: string}) { - const balances = Object.entries(tokenBalances[0]) - const serializedTokenBalance: Array = [] - for (let i = 0; i < balances.length; i++) { - const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract( - balances[i][0], balances[i][0], 'symbol()', '', { visible: true } - ).then(r => decodeUInt256(r.constant_result[0])) - const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract( - balances[i][0], balances[i][0], 'decimals()', '', { visible: true } - ).then(r => decodeUInt256(r.constant_result[0])) - const balance = balances[i][1] + private async processTRC20TokenBalanceDetails(tokenBalances: [{[key: string]: string}]) { + const serializedTokenBalance = []; + for (let i = 0; i < tokenBalances.length; i++) { + const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'symbol()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])); + const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'decimals()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])); + const balance = Object.values(tokenBalances[i])[0]; serializedTokenBalance.push({ asset, decimals, @@ -271,7 +266,7 @@ export class Address { key: string, value: number, }] - trc20: {[key: string]: string} + trc20: [{[key: string]: string}] freeNetLimit: number, bandwidth: number, }>({ @@ -281,7 +276,7 @@ export class Address { { return Object.create({ nativeBalance: r.balance.toString(), - tokenBalances: await this.processTRC20TokenBalanceDetails(r.trc20), + tokenBalances: r.trc20.length > 0 ? await this.processTRC20TokenBalanceDetails(r.trc20) : [], }) }) } From 7c90726ff1b3dd7d5aa78ccb9867969467c89c2b Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Fri, 28 Jul 2023 17:11:24 +0300 Subject: [PATCH 10/12] fixed code style --- src/service/address/address.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/service/address/address.ts b/src/service/address/address.ts index 4d84666d74..dcffb676a8 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -134,9 +134,9 @@ export class Address { asset, decimals, balance - }); + }) } - return serializedTokenBalance; + return serializedTokenBalance } private async processTokenBalanceDetails(tokenBalances: AddressBalance[], chain: Network) { From b8ac8634ac59a098f9544ffa6e08395916bbb5a5 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Tue, 1 Aug 2023 17:47:56 +0300 Subject: [PATCH 11/12] added getTokenSymbol in eth rpc node helpers fixed decodeUInt256 added decodeHexString --- src/dto/rpc/EvmBasedRpcInterface.ts | 2 ++ src/service/address/address.ts | 4 ++-- src/service/rpc/evm/AbstractEvmRpc.ts | 12 ++++++++++ src/util/decode.ts | 32 ++++++++++++--------------- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/dto/rpc/EvmBasedRpcInterface.ts b/src/dto/rpc/EvmBasedRpcInterface.ts index 4e85edd9d4..328d99881b 100644 --- a/src/dto/rpc/EvmBasedRpcInterface.ts +++ b/src/dto/rpc/EvmBasedRpcInterface.ts @@ -131,6 +131,8 @@ export interface EvmBasedRpcInterface { getTokenDecimals(tokenAddress: string): Promise> + getTokenSymbol(tokenAddress: string): Promise> + getContractAddress(txHash: string): Promise // web3_ methods diff --git a/src/service/address/address.ts b/src/service/address/address.ts index dcffb676a8..9d4f61d461 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -13,7 +13,7 @@ import { CONFIG, Constant, ErrorUtils, ResponseDto, Utils } from '../../util' import { EvmRpc, GenericRpc, TronRpc } from '../rpc' import { Network, TatumConfig } from '../tatum' import { AddressBalance, AddressTransaction, GetAddressTransactionsQuery } from './address.dto' -import { decodeUInt256 } from '../../util/decode' +import { decodeHexString, decodeUInt256 } from '../../util/decode'; @Service({ factory: (data: { id: string }) => { @@ -127,7 +127,7 @@ export class Address { private async processTRC20TokenBalanceDetails(tokenBalances: [{[key: string]: string}]) { const serializedTokenBalance = []; for (let i = 0; i < tokenBalances.length; i++) { - const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'symbol()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])); + const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'symbol()', '', { visible: true }).then(r => decodeHexString(r.constant_result[0])); const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'decimals()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])); const balance = Object.values(tokenBalances[i])[0]; serializedTokenBalance.push({ diff --git a/src/service/rpc/evm/AbstractEvmRpc.ts b/src/service/rpc/evm/AbstractEvmRpc.ts index e59a154d73..ce853b33dc 100644 --- a/src/service/rpc/evm/AbstractEvmRpc.ts +++ b/src/service/rpc/evm/AbstractEvmRpc.ts @@ -10,6 +10,7 @@ import { TraceType, TxPayload, } from '../../../dto' +import { decodeHexString } from '../../../util/decode'; @Service() export abstract class AbstractEvmRpc implements EvmBasedRpcInterface { @@ -150,6 +151,17 @@ export abstract class AbstractEvmRpc implements EvmBasedRpcInterface { return response } + async getTokenSymbol(tokenAddress: string): Promise> { + const response = await this.rpcCall>('eth_call', [ + { to: tokenAddress, data: '0x95d89b41' }, + 'latest', + ]) + if (response.result) { + response.result = decodeHexString(response.result) + } + return response + } + async getContractAddress(txHash: string): Promise { try { const txReceipt = await this.getTransactionReceipt(txHash) diff --git a/src/util/decode.ts b/src/util/decode.ts index 46c195177f..e4be749453 100644 --- a/src/util/decode.ts +++ b/src/util/decode.ts @@ -1,25 +1,21 @@ -export async function decodeUInt256(uint256Hex: string): Promise { - const hexString = uint256Hex.replace(/^0+/, '') // Remove leading zeros - const byteLength = hexString.length / 2 +export function decodeUInt256(hex: string): number { + const formattedHex = hex.replace(/^0x/, '') // Remove 0x + return Number('0x' + formattedHex) +} + +export function decodeHexString(hex: string): string { + const formattedHex = hex.replace(/^(0x)?0+/, '') // Remove 0x and leading zeros + const byteLength = formattedHex.length / 2 const bytes = [] for (let i = 0; i < byteLength; i++) { - const byte = parseInt(hexString.substr(i * 2, 2), 16) // Get the current byte + const byte = parseInt(formattedHex.substr(i * 2, 2), 16) // Get the current byte bytes.push(byte) } - const firstByte = BigInt(bytes[0]) // Convert the first byte to a BigInt - let decodedData - - if (firstByte < BigInt(10)) { - // If the first byte is in the range of ASCII digits (0-9), decode as number - decodedData = Number('0x' + uint256Hex) - } else { - decodedData = bytes - .map(byte => String.fromCharCode(byte)) - .filter(char => /[a-zA-Z0-9]/.test(char)) - .join('') - } - - return decodedData + return bytes + .map(byte => String.fromCharCode(byte)) + .filter(char => /[a-zA-Z0-9]/.test(char)) + .join('') } + From 1fc7927d9b0f6f8c136be2d079a219cecd0e8988 Mon Sep 17 00:00:00 2001 From: Philip Mantrov Date: Tue, 1 Aug 2023 17:58:53 +0300 Subject: [PATCH 12/12] fix code style --- src/service/address/address.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/service/address/address.ts b/src/service/address/address.ts index 9d4f61d461..bce7049530 100644 --- a/src/service/address/address.ts +++ b/src/service/address/address.ts @@ -127,8 +127,8 @@ export class Address { private async processTRC20TokenBalanceDetails(tokenBalances: [{[key: string]: string}]) { const serializedTokenBalance = []; for (let i = 0; i < tokenBalances.length; i++) { - const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'symbol()', '', { visible: true }).then(r => decodeHexString(r.constant_result[0])); - const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'decimals()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])); + const asset = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'symbol()', '', { visible: true }).then(r => decodeHexString(r.constant_result[0])) + const decimals = await Utils.getRpc(this.id, this.config).triggerConstantContract(Object.keys(tokenBalances[i])[0], Object.keys(tokenBalances[i])[0], 'decimals()', '', { visible: true }).then(r => decodeUInt256(r.constant_result[0])) const balance = Object.values(tokenBalances[i])[0]; serializedTokenBalance.push({ asset,