From f21a4cfc7a8ce9d279e7d7522e150df2d97db7b9 Mon Sep 17 00:00:00 2001 From: meomeocoj Date: Sat, 31 Aug 2024 11:19:57 +0700 Subject: [PATCH] feat: add wiston to ton-to-cw --- packages/cw-to-ton/tsconfig.json | 1 + packages/orchestrator/src/config/logger.ts | 2 +- packages/orchestrator/src/index.ts | 9 ++++-- packages/ton-to-cw/package.json | 3 +- packages/ton-to-cw/src/block-processor.ts | 18 ++++++----- packages/ton-to-cw/src/index.ts | 26 ++++++++++++---- packages/ton-to-cw/src/start.ts | 19 ++++++++++-- packages/ton-to-cw/src/tx-processor.ts | 35 +++++++++++++++------- packages/ton-to-cw/tsconfig.json | 1 + 9 files changed, 84 insertions(+), 30 deletions(-) diff --git a/packages/cw-to-ton/tsconfig.json b/packages/cw-to-ton/tsconfig.json index a6e7bf1..bc05d51 100644 --- a/packages/cw-to-ton/tsconfig.json +++ b/packages/cw-to-ton/tsconfig.json @@ -4,6 +4,7 @@ "baseUrl": ".", "outDir": "build", "declaration": true, + "declarationMap": true, "rootDir": ".", "paths": { "@src/*": ["src/*"], diff --git a/packages/orchestrator/src/config/logger.ts b/packages/orchestrator/src/config/logger.ts index 279c2e0..8385d48 100644 --- a/packages/orchestrator/src/config/logger.ts +++ b/packages/orchestrator/src/config/logger.ts @@ -7,7 +7,7 @@ export const logger = (label: string, webhookUrl: string, loglevel?: string) => format.label({ label }), format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), format.printf((info) => { - return `[${info.label}] ${info.timestamp} ${info.level}: ${info.message}`; + return `${info.timestamp} [${info.level.toUpperCase()}] [${info.label}]: ${info.message}`; }) ), transports: [ diff --git a/packages/orchestrator/src/index.ts b/packages/orchestrator/src/index.ts index 7c38d1e..1a2b316 100644 --- a/packages/orchestrator/src/index.ts +++ b/packages/orchestrator/src/index.ts @@ -23,6 +23,11 @@ let appLogger: Logger; config.appConfig.webhookUrl, config.appConfig.loglevel ); + const tonToCwLogger = createServiceLogger( + "TonToCwRelayer", + config.appConfig.webhookUrl, + config.appConfig.loglevel + ); const app = express(); const port = process.env.HEALTH_CHECK_PORT ? Number(process.env.HEALTH_CHECK_PORT) @@ -35,10 +40,10 @@ let appLogger: Logger; app.listen(port, "0.0.0.0", async () => { appLogger.info(`Server is running at http://0.0.0.0:${port}`); const [tonToCwRelayer, cwToTonRelayer] = await Promise.all([ - createTonToCwRelayerWithConfig(config.tonToCw), + createTonToCwRelayerWithConfig(config.tonToCw, tonToCwLogger), createCwToTonRelayerWithConfig(config.cwToTon, cwToTonLogger), ]); - // tonToCwRelayer.relay(); + tonToCwRelayer.relay(); cwToTonRelayer.start(); cwToTonRelayer.on("error", (error) => { appLogger.error(`cwToTonRelayer`, error); diff --git a/packages/ton-to-cw/package.json b/packages/ton-to-cw/package.json index ba7bed7..3e4b7d3 100644 --- a/packages/ton-to-cw/package.json +++ b/packages/ton-to-cw/package.json @@ -29,7 +29,8 @@ "bignumber.js": "^9.1.2", "cosmjs-types": "0.8.0", "ton-lite-client": "^3.0.0", - "tonweb": "^0.0.66" + "tonweb": "^0.0.66", + "winston": "^3.14.2" }, "license": "MIT" } diff --git a/packages/ton-to-cw/src/block-processor.ts b/packages/ton-to-cw/src/block-processor.ts index 7e2311a..34f3f3e 100644 --- a/packages/ton-to-cw/src/block-processor.ts +++ b/packages/ton-to-cw/src/block-processor.ts @@ -7,6 +7,7 @@ import TonRocks, { import { BlockID, LiteClient } from "ton-lite-client"; import { Functions, liteServer_BlockData } from "ton-lite-client/dist/schema"; import TonWeb from "tonweb"; +import { Logger } from "winston"; export default class TonBlockProcessor { // cache validator set so we don't have to call the contract every few seconds @@ -15,7 +16,8 @@ export default class TonBlockProcessor { constructor( protected readonly validator: TonbridgeValidatorInterface, protected readonly liteClient: LiteClient, - protected readonly tonweb: TonWeb + protected readonly tonweb: TonWeb, + protected logger: Logger ) {} async queryKeyBlock(masterChainSeqNo: number) { @@ -76,7 +78,7 @@ export default class TonBlockProcessor { queryAllValidators = async () => { let validators: UserFriendlyValidator[] = []; let startAfter = undefined; - let valCheck = new Set(); + const valCheck = new Set(); while (true) { const validatorsTemp = await this.validator.getValidators({ @@ -134,7 +136,7 @@ export default class TonBlockProcessor { if (isBlockVerified) return; const vdata = await this.getMasterchainBlockValSignatures(blockId.seqno); - console.log("vdata length: ", vdata.length); + this.logger.info("vdata length: ", vdata.length); const blockHeader = await this.liteClient.getBlockHeader(blockId); await this.validator.verifyMasterchainBlockByValidatorSignatures({ @@ -142,7 +144,9 @@ export default class TonBlockProcessor { fileHash: blockHeader.id.fileHash.toString("hex"), vdata, }); - console.log(`verified masterchain block ${blockId.seqno} successfully`); + this.logger.info( + `verified masterchain block ${blockId.seqno} successfully` + ); } async verifyMasterchainKeyBlock(rawBlockData: liteServer_BlockData) { @@ -164,7 +168,7 @@ export default class TonBlockProcessor { fileHash: rawBlockData.id.fileHash.toString("hex"), vdata, }); - console.log( + this.logger.info( `verified masterchain keyblock ${rawBlockData.id.seqno} successfully` ); } @@ -208,7 +212,7 @@ export default class TonBlockProcessor { vdata, }); - console.log( + this.logger.info( `Updated keyblock ${rawBlockData.id.seqno} with new validator set successfully` ); } @@ -262,7 +266,7 @@ export default class TonBlockProcessor { ), }); - console.log( + this.logger.info( `verified shard blocks ${JSON.stringify( shardProof.links.map((link) => link.id.seqno) )} successfully` diff --git a/packages/ton-to-cw/src/index.ts b/packages/ton-to-cw/src/index.ts index aafef08..3e6c7b1 100644 --- a/packages/ton-to-cw/src/index.ts +++ b/packages/ton-to-cw/src/index.ts @@ -15,10 +15,12 @@ import { TonbridgeBridgeClient, TonbridgeValidatorClient, } from "@oraichain/tonbridge-contracts-sdk"; +import { Logger } from "winston"; export default class TonToCwRelayer { private blockProcessor: TonBlockProcessor; private txProcessor: TonTxProcessor; + private logger: Logger; withBlockProcessor(processor: TonBlockProcessor) { this.blockProcessor = processor; @@ -29,6 +31,10 @@ export default class TonToCwRelayer { this.txProcessor = processor; return this; } + withLogger(logger: Logger) { + this.logger = logger; + return this; + } async relay() { const processInterval = 3000; // 3s @@ -43,7 +49,7 @@ export default class TonToCwRelayer { await this.blockProcessor.queryKeyBlock( latestMasterchainBlock.last.seqno ); - console.log( + this.logger.info( "Prepare to verify masterchain keyblock: ", parsedBlock.info.seq_no ); @@ -54,14 +60,17 @@ export default class TonToCwRelayer { ); await this.txProcessor.processTransactions(); } catch (error) { - console.error("error processing block and tx: ", error); + this.logger.error("error processing block and tx: ", error); } await setTimeout(processInterval); } } } -export async function createTonToCwRelayerWithConfig(config: Config) { +export async function createTonToCwRelayerWithConfig( + config: Config, + injectedLogger: Logger +) { const client = await initSignClient(config.mnemonic); // setup lite engine server const { liteservers } = await fetch( @@ -96,16 +105,23 @@ export async function createTonToCwRelayerWithConfig(config: Config) { config.cwTonBridge ); - const blockProcessor = new TonBlockProcessor(validator, liteClient, tonWeb); + const blockProcessor = new TonBlockProcessor( + validator, + liteClient, + tonWeb, + injectedLogger + ); const txProcessor = new TonTxProcessor( validator, bridge, liteClient, blockProcessor, - config.jettonBridge + config.jettonBridge, + injectedLogger ); const relayer = new TonToCwRelayer() + .withLogger(injectedLogger) .withBlockProcessor(blockProcessor) .withTxProcessor(txProcessor); diff --git a/packages/ton-to-cw/src/start.ts b/packages/ton-to-cw/src/start.ts index 0b8b587..9043382 100644 --- a/packages/ton-to-cw/src/start.ts +++ b/packages/ton-to-cw/src/start.ts @@ -15,6 +15,7 @@ import TonToCwRelayer from "./index"; import dotenv from "dotenv"; import { initSignClient } from "./client"; import { intToIP } from "./constants"; +import { createLogger, format, transports } from "winston"; dotenv.config(); @@ -30,6 +31,11 @@ function validate() { (async () => { validate(); + const logger = createLogger({ + level: "info", + format: format.combine(format.timestamp(), format.json()), + transports: [new transports.Console()], + }); const client = await initSignClient(process.env.MNEMONIC); // setup lite engine server const { liteservers } = await fetch( @@ -64,14 +70,21 @@ function validate() { CW_TON_BRIDGE ); - const blockProcessor = new TonBlockProcessor(validator, liteClient, tonWeb); + const blockProcessor = new TonBlockProcessor( + validator, + liteClient, + tonWeb, + logger + ); const txProcessor = new TonTxProcessor( validator, bridge, liteClient, blockProcessor, - JETTON_BRIDGE - // "b4c796dc353687b1b571da07ef428e1d90eeac4922c8c2ee19b82a41dd66cac3" + JETTON_BRIDGE, + logger + + // "b4c796dc353687b1b571da07ef428e1d90eeac4922c8c2ee19b82a41dd66cac3", ); const relayer = new TonToCwRelayer() diff --git a/packages/ton-to-cw/src/tx-processor.ts b/packages/ton-to-cw/src/tx-processor.ts index 4296539..d55ce44 100644 --- a/packages/ton-to-cw/src/tx-processor.ts +++ b/packages/ton-to-cw/src/tx-processor.ts @@ -9,6 +9,7 @@ import TonBlockProcessor from "./block-processor"; import { setTimeout } from "timers/promises"; import { OPCODES } from "./constants"; +import { Logger } from "winston"; export default class TonTxProcessor { private limitPerTxQuery = 100; // limit per query @@ -21,6 +22,7 @@ export default class TonTxProcessor { protected readonly liteClient: LiteClient, protected readonly blockProcessor: TonBlockProcessor, protected readonly jettonBridgeAddress: string, + protected logger: Logger, protected latestProcessedTxHash: StringHex = "" ) { this.initiallatestProcessedTxHash = latestProcessedTxHash; @@ -42,7 +44,7 @@ export default class TonTxProcessor { // workaround. Bug of loadTransaction that causes the prev trans hash to be incomplete if (offset.hash.length === 63) { offset.hash = "0" + offset.hash; - console.log("new offset hash: ", offset.hash); + this.logger.info("TonTxProcessor:new offset hash: ", offset.hash); } const rawTxs = await this.liteClient.getAccountTransactions( jettonAddr, @@ -74,8 +76,8 @@ export default class TonTxProcessor { hash: txs[txs.length - 1].tx.prevTransactionHash.toString(16), lt: txs[txs.length - 1].tx.prevTransactionLt.toString(10), }; - console.log("offset: ", offset); - // console.log("txhash bigint: ", txs[txs.length - 1].tx.prevTransactionHash) + this.logger.info("TonTxProcessor offset: ", offset); + // this.logger.info("TonTxProcessortxhash bigint: ", txs[txs.length - 1].tx.prevTransactionHash) await setTimeout(2000); continue; } else { @@ -94,18 +96,26 @@ export default class TonTxProcessor { async processTransactions() { try { const transactions = await this.queryUnprocessedTransactions(); - console.log("unprocessed transactions: ", transactions.length); + this.logger.info( + "TonTxProcessor:unprocessed transactions: " + transactions.length + ); // since we query our transactions from latest to earliest -> process the latest txs first for (const tx of transactions) { try { await this.processTransaction(tx); } catch (error) { - console.error("error processing transaction: ", error); + this.logger.error( + "TonTxProcessor:Error processing transaction: ", + error + ); } } } catch (error) { // reset latestProcessedTxHash so we can start over to prevent missed txs in case of having errors - console.error("error querying unprocessed transactions: ", error); + this.logger.error( + "TonTxProcessor:Error querying unprocessed transactions: ", + error + ); this.latestProcessedTxHash = this.initiallatestProcessedTxHash; return; } @@ -131,7 +141,9 @@ export default class TonTxProcessor { } } if (!isValidTx) { - console.log(`Transaction ${txHash} is invalid tx. We ignore it.`); + this.logger.info( + `TonTxProcessor:Transaction ${txHash} is invalid tx. We ignore it.` + ); return; } try { @@ -142,8 +154,9 @@ export default class TonTxProcessor { await this.blockProcessor.verifyMasterchainBlockByBlockId(tx.blockId); } } catch (error) { - console.log( - `Cannot verify blocks related to transaction ${txHash} because: ${error}` + this.logger.error( + `TonTxProcessor:Cannot verify blocks related to transaction ${txHash}`, + error ); return; } @@ -160,8 +173,8 @@ export default class TonTxProcessor { txProof: txWithProof.proof.toString("hex"), }); - console.log( - `Verified tx with hash ${txHash} in block ${tx.blockId.seqno} successfully` + this.logger.info( + `TonTxProcessor:sVerified tx with hash ${txHash} in block ${tx.blockId.seqno} successfully` ); } } diff --git a/packages/ton-to-cw/tsconfig.json b/packages/ton-to-cw/tsconfig.json index 1cc2935..0b87a53 100644 --- a/packages/ton-to-cw/tsconfig.json +++ b/packages/ton-to-cw/tsconfig.json @@ -4,6 +4,7 @@ "baseUrl": ".", "outDir": "dist", "declaration": true, + "declarationMap": true, "rootDir": "src", "strict": false, "noFallthroughCasesInSwitch": false,