From fbb7c19f40906463b7f5a5e3d1aa31c074a24c8b Mon Sep 17 00:00:00 2001 From: ALPAC-4 Date: Tue, 11 Feb 2025 17:25:37 +0900 Subject: [PATCH] feat: add wallet balance for monitor --- src/workers/index.ts | 37 ++++++++++++++++++++++++++++--------- src/workers/wallet.ts | 15 ++++++++++++++- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/workers/index.ts b/src/workers/index.ts index 42143c0..6d8aa6a 100644 --- a/src/workers/index.ts +++ b/src/workers/index.ts @@ -30,6 +30,7 @@ import { MsgChannelOpenAck, MsgChannelOpenConfirm, MsgChannelOpenTry, + Coins, } from '@initia/initia.js' import { Config, PacketFee, KeyConfig } from 'src/lib/config' import { env } from 'node:process' @@ -41,6 +42,7 @@ import { RESTClient } from 'src/lib/restClient' import { State } from '@initia/initia.proto/ibc/core/channel/v1/channel' import { generateMsgChannelCloseConfirm } from 'src/msgs/channelCloseConfirm' +import { bech32 } from 'bech32' export class WorkerController { public chains: Record // chainId => ChainWorker @@ -90,15 +92,28 @@ export class WorkerController { for (const walletConfig of chainConfig.wallets) { const key = createKey(walletConfig.key) + const address = bech32.encode( + chainConfig.bech32Prefix, + bech32.decode(key.accAddress).words + ) + const balance = BigInt( + await rest.bank + .balanceByDenom( + address, + new Coins(rest.config.gasPrices as Coins.Input).toArray()[0].denom + ) + .then((coin) => coin.amount) + ) const wallet = new WalletWorker( chain, this, walletConfig.maxHandlePacket ?? 100, new Wallet(rest, key), + balance, walletConfig.packetFilter ) - this.wallets[`${chainConfig.chainId}::${wallet.address()}`] = wallet + this.wallets[`${chainConfig.chainId}::${address}`] = wallet } } } @@ -113,8 +128,8 @@ export class WorkerController { } public getStatus(): { chains: ChainStatus[] } { - const wallets = Object.values(this.wallets); - const chains: ChainStatus[] = Object.values(this.chains).map(chain => { + const wallets = Object.values(this.wallets) + const chains: ChainStatus[] = Object.values(this.chains).map((chain) => { const syncWorkerKeys = Object.keys(chain.syncWorkers) const syncWorkers = syncWorkerKeys.map((key) => { const syncWorker = chain.syncWorkers[Number(key)] @@ -125,12 +140,15 @@ export class WorkerController { } }) - const walletWorkers = wallets.filter(wallet => wallet.chain.chainId === chain.chainId).map(wallet => { - return { - address: wallet.address(), - packetFilter: wallet.packetFilter, - } - }); + const walletWorkers = wallets + .filter((wallet) => wallet.chain.chainId === chain.chainId) + .map((wallet) => { + return { + address: wallet.address(), + gasTokenBalance: wallet.gasTokenBalance.toString(), + packetFilter: wallet.packetFilter, + } + }) return { chainId: chain.chainId, @@ -324,6 +342,7 @@ interface ChainStatus { }[] walletWorkers: { address: string + gasTokenBalance: string packetFilter?: PacketFilter }[] } diff --git a/src/workers/wallet.ts b/src/workers/wallet.ts index f48197c..6752ebb 100644 --- a/src/workers/wallet.ts +++ b/src/workers/wallet.ts @@ -12,7 +12,7 @@ import { WorkerController } from '.' import { DB } from 'src/db' import { Height } from 'cosmjs-types/ibc/core/client/v1/client' import { ConnectionController } from 'src/db/controller/connection' -import { Wallet, isTxError, MsgUpdateClient } from '@initia/initia.js' +import { Wallet, isTxError, MsgUpdateClient, Coins } from '@initia/initia.js' import { createLoggerWithPrefix } from 'src/lib/logger' import { bech32 } from 'bech32' import { delay } from 'bluebird' @@ -32,6 +32,7 @@ export class WalletWorker { public workerController: WorkerController, private maxHandlePacket: number, public wallet: Wallet, + public gasTokenBalance: bigint, public packetFilter?: PacketFilter ) { this.logger = createLoggerWithPrefix( @@ -392,6 +393,18 @@ export class WalletWorker { `Handled msgs(${msgs.length}). txhash - ${result.txhash}` ) + // update balance + this.gasTokenBalance = BigInt( + await this.wallet.rest.bank + .balanceByDenom( + this.address(), + new Coins( + this.wallet.rest.config.gasPrices as Coins.Input + ).toArray()[0].denom + ) + .then((coin) => coin.amount) + ) + this.sequence++ } catch (e) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access