diff --git a/offchain-modules/config-cli.json.example b/offchain-modules/config-cli.json.example index d233572e..6e9269aa 100644 --- a/offchain-modules/config-cli.json.example +++ b/offchain-modules/config-cli.json.example @@ -1,5 +1,10 @@ { "forceBridge": { + "common": { + "log": { + "level": "info" + } + }, "eth": { "rpcUrl": "http://47.56.233.149:3045", "privateKey": "0xc4ad657963930fbff2e9de3404b30a4e21432c89952ed430b56bf802945ed37a", diff --git a/offchain-modules/config.json.example b/offchain-modules/config.json.example index 32c6472c..ca7193f7 100644 --- a/offchain-modules/config.json.example +++ b/offchain-modules/config.json.example @@ -1,5 +1,10 @@ { "forceBridge": { + "common": { + "log": { + "level": "info" + } + }, "eth": { "rpcUrl": "http://127.0.0.1:8545", "privateKey": "0xc4ad657963930fbff2e9de3404b30a4e21432c89952ed430b56bf802945ed37a", diff --git a/offchain-modules/ormconfig.js b/offchain-modules/ormconfig.js index 76d7bc12..c58bb8d9 100644 --- a/offchain-modules/ormconfig.js +++ b/offchain-modules/ormconfig.js @@ -9,7 +9,7 @@ module.exports = { database: 'forcebridge', timezone: 'Z', synchronize: true, - logging: true, + logging: false, entities: ['{.,dist}/src/packages/db/entity/*.{ts,js}'], namingStrategy: new SnakeNamingStrategy(), }; diff --git a/offchain-modules/package-lock.json b/offchain-modules/package-lock.json index 5750fbcd..6cc3851a 100644 --- a/offchain-modules/package-lock.json +++ b/offchain-modules/package-lock.json @@ -1512,9 +1512,9 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@sqltools/formatter": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.2.tgz", - "integrity": "sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", + "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" }, "@szmarczak/http-timer": { "version": "1.1.2", @@ -1694,6 +1694,11 @@ "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, + "@types/zen-observable": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz", + "integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==" + }, "@typescript-eslint/eslint-plugin": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz", @@ -2086,6 +2091,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -3252,12 +3258,12 @@ } }, "cli-highlight": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.10.tgz", - "integrity": "sha512-CcPFD3JwdQ2oSzy+AMG6j3LRTkNjM82kzcSKzoVw6cLanDCJNlsLjeqVTOTfOfucnWv5F0rmBemVf1m9JiIasw==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "requires": { "chalk": "^4.0.0", - "highlight.js": "^10.0.0", + "highlight.js": "^10.7.1", "mz": "^2.4.0", "parse5": "^5.1.1", "parse5-htmlparser2-tree-adapter": "^6.0.0", @@ -3273,9 +3279,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5030,7 +5036,8 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esquery": { "version": "1.4.0", @@ -6170,9 +6177,9 @@ } }, "highlight.js": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.1.tgz", - "integrity": "sha512-S6G97tHGqJ/U8DsXcEdnACbirtbx58Bx9CzIVeYli8OuswCfYI/LsXH2EiGcoGio1KAC3x4mmUwulOllJ2ZyRA==" + "version": "10.7.2", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz", + "integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==" }, "hmac-drbg": { "version": "1.0.1", @@ -7119,6 +7126,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -10943,7 +10951,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sqlite3": { "version": "5.0.2", @@ -11921,26 +11930,27 @@ } }, "typeorm": { - "version": "0.2.31", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.31.tgz", - "integrity": "sha512-dVvCEVHH48DG0QPXAKfo0l6ecQrl3A8ucGP4Yw4myz4YEDMProebTQo8as83uyES+nrwCbu3qdkL4ncC2+qcMA==", + "version": "0.2.32", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.32.tgz", + "integrity": "sha512-LOBZKZ9As3f8KRMPCUT2H0JZbZfWfkcUnO3w/1BFAbL/X9+cADTF6bczDGGaKVENJ3P8SaKheKmBgpt5h1x+EQ==", "requires": { - "@sqltools/formatter": "1.2.2", + "@sqltools/formatter": "^1.2.2", "app-root-path": "^3.0.0", - "buffer": "^5.5.0", + "buffer": "^6.0.3", "chalk": "^4.1.0", "cli-highlight": "^2.1.10", - "debug": "^4.1.1", + "debug": "^4.3.1", "dotenv": "^8.2.0", "glob": "^7.1.6", - "js-yaml": "^3.14.0", + "js-yaml": "^4.0.0", "mkdirp": "^1.0.4", "reflect-metadata": "^0.1.13", "sha.js": "^2.4.11", - "tslib": "^1.13.0", + "tslib": "^2.1.0", "xml2js": "^0.4.23", - "yargonaut": "^1.1.2", - "yargs": "^16.0.3" + "yargonaut": "^1.1.4", + "yargs": "^16.2.0", + "zen-observable-ts": "^1.0.0" }, "dependencies": { "ansi-styles": { @@ -11951,10 +11961,24 @@ "color-convert": "^2.0.1" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11986,6 +12010,14 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -12005,9 +12037,9 @@ } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" } } }, @@ -13197,6 +13229,20 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "zen-observable-ts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz", + "integrity": "sha512-KmWcbz+9kKUeAQ8btY8m1SsEFgBcp7h/Uf3V5quhan7ZWdjGsf0JcGLULQiwOZibbFWnHkYq8Nn2AZbJabovQg==", + "requires": { + "@types/zen-observable": "^0.8.2", + "zen-observable": "^0.8.15" + } } } } diff --git a/offchain-modules/package.json b/offchain-modules/package.json index aa1e8a75..fb94b291 100644 --- a/offchain-modules/package.json +++ b/offchain-modules/package.json @@ -25,7 +25,7 @@ "tron-test": "ts-node ./src/scripts/integration-test/tron.ts", "prepare-xchain-test": "sleep 2", "btc-test": "ts-node ./src/scripts/integration-test/btc.ts", - "xchain-test": "run-s prepare-xchain-test eth-test tron-test btc-test eos-test", + "xchain-test": "run-s prepare-xchain-test eth-test btc-test eos-test tron-test", "integration-test": "run-p -r start xchain-test", "ci": "run-s clean build deploy integration-test", "test:unit": "nyc --silent ava", @@ -93,7 +93,7 @@ "sqlite3": "^5.0.2", "trongrid": "^1.2.6", "tronweb": "^3.2.3", - "typeorm": "^0.2.31", + "typeorm": "^0.2.32", "typeorm-naming-strategies": "^2.0.0" }, "ava": { diff --git a/offchain-modules/src/apps/cli/utils.ts b/offchain-modules/src/apps/cli/utils.ts index 080dc8bd..5084a02b 100644 --- a/offchain-modules/src/apps/cli/utils.ts +++ b/offchain-modules/src/apps/cli/utils.ts @@ -5,12 +5,19 @@ import { Asset } from '../../packages/ckb/model/asset'; import { IndexerCollector } from '../../packages/ckb/tx-helper/collector'; import { Amount, Script } from '@lay2/pw-core'; import { asyncSleep } from '@force-bridge/utils'; +import { initLog } from '@force-bridge/utils/logger'; + +const defaultLogFile = './log/force-bridge-cli.log'; export async function initConfig() { const configPath = process.env.CONFIG_PATH || './config-cli.json'; nconf.env().file({ file: configPath }); const config: Config = nconf.get('forceBridge'); await new ForceBridgeCore().init(config); + if (!config.common.log.logFile) { + config.common.log.logFile = defaultLogFile; + } + initLog(ForceBridgeCore.config.common.log); } export function parseOptions(args: any, command: any): Map { diff --git a/offchain-modules/src/apps/relayer/index.ts b/offchain-modules/src/apps/relayer/index.ts index 5aab73f2..fcee749f 100644 --- a/offchain-modules/src/apps/relayer/index.ts +++ b/offchain-modules/src/apps/relayer/index.ts @@ -14,11 +14,20 @@ import { TronHandler } from '@force-bridge/handlers/tron'; import { BtcDb } from '@force-bridge/db/btc'; import { BTCChain } from '@force-bridge/xchain/btc'; import { BtcHandler } from '@force-bridge/handlers/btc'; +import { initLog } from '@force-bridge/utils/logger'; + +const defaultLogFile = './log/force-bridge-relay.log'; async function main() { const configPath = process.env.CONFIG_PATH || './config.json'; nconf.env().file({ file: configPath }); const config: Config = nconf.get('forceBridge'); + if (!config.common.log.logFile) { + config.common.log.logFile = defaultLogFile; + } + + // init log + initLog(config.common.log); // init bridge force core await new ForceBridgeCore().init(config); diff --git a/offchain-modules/src/apps/rpc/index.ts b/offchain-modules/src/apps/rpc/index.ts index 4e429265..5cee3a9e 100644 --- a/offchain-modules/src/apps/rpc/index.ts +++ b/offchain-modules/src/apps/rpc/index.ts @@ -5,7 +5,7 @@ import 'module-alias/register'; import { JSONRPCServer } from 'json-rpc-2.0'; import { rpcConfig } from '@force-bridge/config'; import nconf from 'nconf'; -import { logger } from '@force-bridge/utils/logger'; +import { logger, initLog } from '@force-bridge/utils/logger'; import { ForceBridgeAPIV1Handler } from './handler'; import { ForceBridgeCore } from '@force-bridge/core'; import { Config } from '@force-bridge/config'; @@ -13,6 +13,7 @@ import { createConnection } from 'typeorm'; import { GetBalancePayload, GetBridgeTransactionSummariesPayload } from './types/apiv1'; const forceBridgePath = '/force-bridge/api/v1'; +const defaultLogFile = './log/force-bridge-rpc.log'; async function main() { const configPath = process.env.CONFIG_PATH || './config.json'; @@ -21,6 +22,10 @@ async function main() { const config: Config = nconf.get('forceBridge'); const rpcConfig: rpcConfig = nconf.get('forceBridge:rpc'); await new ForceBridgeCore().init(config); + if (!config.common.log.logFile) { + config.common.log.logFile = defaultLogFile; + } + initLog(ForceBridgeCore.config.common.log); const server = new JSONRPCServer(); diff --git a/offchain-modules/src/packages/config.ts b/offchain-modules/src/packages/config.ts index de8b7a79..59020582 100644 --- a/offchain-modules/src/packages/config.ts +++ b/offchain-modules/src/packages/config.ts @@ -83,7 +83,17 @@ export interface rpcConfig { }; } +export interface logConfig { + level: string; + logFile: string; +} + +export interface commonConfig { + log: logConfig; +} + export interface Config { + common: commonConfig; ckb: CkbConfig; eth?: EthConfig; eos?: EosConfig; diff --git a/offchain-modules/src/packages/handlers/btc.ts b/offchain-modules/src/packages/handlers/btc.ts index 1fd1f3d4..0ce7f322 100644 --- a/offchain-modules/src/packages/handlers/btc.ts +++ b/offchain-modules/src/packages/handlers/btc.ts @@ -3,7 +3,6 @@ import { asyncSleep } from '@force-bridge/utils'; import { ChainType } from '@force-bridge/ckb/model/asset'; import { BTCChain, BtcLockData } from '@force-bridge/xchain/btc'; import { BtcDb } from '@force-bridge/db/btc'; -import { throws } from 'assert'; import { BtcUnlock } from '@force-bridge/db/entity/BtcUnlock'; import { ForceBridgeCore } from '@force-bridge/core'; @@ -23,11 +22,14 @@ export class BtcHandler { if (targetHeight <= latestHeight) { continue; } - logger.debug(`'btc db lock record latest height: ${latestHeight}. target height: ${targetHeight}`); + logger.debug( + `BtcHandler watchLockEvents db lock record latest height: ${latestHeight}. target height: ${targetHeight}`, + ); await this.btcChain.watchBtcTxEvents( latestHeight, targetHeight, async (btcLockEventData: BtcLockData) => { + logger.info(`BtcHandler watchBtcTxEvents newEvents:${JSON.stringify(btcLockEventData, null, 2)}`); await this.db.createCkbMint([ { id: btcLockEventData.txId, @@ -50,7 +52,9 @@ export class BtcHandler { blockHash: btcLockEventData.blockHash, }, ]); - logger.debug(`save CkbMint and BTCLock successful for BTC tx ${btcLockEventData.txHash}.`); + logger.info( + `BtcHandler watchBtcTxEvents save CkbMint and BTCLock successful for BTC tx ${btcLockEventData.txHash}.`, + ); }, async (ckbTxHash: string) => { if (!ckbTxHash.startsWith('0x')) { @@ -60,7 +64,7 @@ export class BtcHandler { if (records.length === 0) { return; } - logger.debug(`unlock records: ${JSON.stringify(records, null, 2)}`); + logger.debug(`BtcHandler watchBtcTxEvents unlockRecords: ${JSON.stringify(records, null, 2)}`); if (records.length > 1) { throw new Error( `there are some unlock record which have the same ckb burn hash. ${JSON.stringify(records, null, 2)}`, @@ -72,7 +76,7 @@ export class BtcHandler { ); latestHeight = targetHeight; } catch (e) { - logger.error('there is an error occurred during in btc chain watch event', e); + logger.error('there is an error occurred during in btc chain watch event', e.toString()); } } } @@ -81,14 +85,16 @@ export class BtcHandler { // send tx according to the data async watchUnlockEvents() { // todo: get and handle pending and error records - logger.debug('start btc watchUnlockEvents'); + logger.info('BtcHandler watchUnlockEvents start'); while (true) { await asyncSleep(1000 * 20); const records: BtcUnlock[] = await this.db.getBtcUnlockRecords('todo'); if (records.length === 0) { continue; } - logger.debug(`get btc unlock record and send tx ${JSON.stringify(records, null, 2)}`); + logger.debug( + `BtcHandler watchUnlockEvents get btc unlock record and send tx ${JSON.stringify(records, null, 2)}`, + ); try { // write db first, avoid send tx success and fail to write db records.map((r) => { @@ -107,7 +113,10 @@ export class BtcHandler { r.message = e.message; }); await this.db.saveBtcUnlock(records); - logger.error(`there is an error occurred during in btc chain send unlock.`, e); + logger.error( + `BtcHandler watchUnlockEvents there is an error occurred during in btc chain send unlock.`, + e.toString(), + ); } } } diff --git a/offchain-modules/src/packages/handlers/ckb.ts b/offchain-modules/src/packages/handlers/ckb.ts index c0a0a961..9f6a2715 100644 --- a/offchain-modules/src/packages/handlers/ckb.ts +++ b/offchain-modules/src/packages/handlers/ckb.ts @@ -5,13 +5,11 @@ import { asyncSleep, fromHexString, toHexString, uint8ArrayToString } from '../u import { Asset, BtcAsset, ChainType, EosAsset, EthAsset, TronAsset } from '../ckb/model/asset'; import { Address, AddressType, Amount, HashType, Script } from '@lay2/pw-core'; import { Account } from '@force-bridge/ckb/model/accounts'; - import { CkbTxGenerator } from '@force-bridge/ckb/tx-helper/generator'; import { IndexerCollector } from '@force-bridge/ckb/tx-helper/collector'; import { ScriptType } from '@force-bridge/ckb/tx-helper/indexer'; import { ForceBridgeCore } from '@force-bridge/core'; import { Script as LumosScript } from '@ckb-lumos/base'; -import { BigNumber } from 'ethers'; import { RecipientCellData } from '@force-bridge/ckb/tx-helper/generated/eth_recipient_cell'; import { getAssetTypeByAsset } from '@force-bridge/xchain/tron/utils'; import Transaction = CKBComponents.Transaction; @@ -28,7 +26,7 @@ export class CkbHandler { // save unlock event first and then async saveBurnEvent(burns: ICkbBurn[]): Promise { - logger.debug('save burn event:', burns); + logger.debug('CkbHandler saveBurnEvent:', burns); for (const burn of burns) { switch (burn.chain) { case ChainType.BTC: @@ -85,10 +83,10 @@ export class CkbHandler { // invoke saveBurnEvent when get new one let latestHeight = await this.db.getCkbLatestHeight(); while (true) { - logger.debug('watch burn event height: ', latestHeight); + logger.debug('CkbHandler watchBurnEvents height: ', latestHeight); const block = await this.ckb.rpc.getBlockByNumber(BigInt(latestHeight)); if (block == null) { - logger.debug('waitting for new ckb block'); + logger.debug('watchBurnEvents watchBurnEvents waiting for new ckb block'); await asyncSleep(5000); continue; } @@ -113,9 +111,15 @@ export class CkbHandler { cellData: cellData, }; burnTxs.set(tx.hash, data); + logger.info( + `CkbHandler watchBurnEvents receive burnedTx, ckbTxHash:${ + tx.hash + } senderLockHash:${senderLockHash} cellData:${JSON.stringify(cellData, null, 2)}`, + ); } } - logger.debug('get new burn events and save to db', burnTxs); + + const burnTxHashes = []; if (burnTxs.size > 0) { const ckbBurns = []; burnTxs.forEach((v: BurnDbData, k: string) => { @@ -140,8 +144,10 @@ export class CkbHandler { break; } ckbBurns.push(burn); + burnTxHashes.push(k); }); await this.saveBurnEvent(ckbBurns); + logger.info(`CkbHandler watchBurnEvents saveBurnEvent success, burnTxHashes:${burnTxHashes.join(', ')}`); } latestHeight++; await asyncSleep(1000); @@ -153,10 +159,13 @@ export class CkbHandler { return false; } const ownLockHash = await this.getOwnLockHash(); - logger.debug('amount: ', toHexString(new Uint8Array(cellData.getAmount().raw()))); - logger.debug('recipient address: ', toHexString(new Uint8Array(cellData.getRecipientAddress().raw()))); - logger.debug('asset: ', toHexString(new Uint8Array(cellData.getAsset().raw()))); - logger.debug('chain: ', cellData.getChain()); + logger.debug('CkbHandler isBurnTx amount: ', toHexString(new Uint8Array(cellData.getAmount().raw()))); + logger.debug( + 'CkbHandler isBurnTx recipient address: ', + toHexString(new Uint8Array(cellData.getRecipientAddress().raw())), + ); + logger.debug('CkbHandler isBurnTx asset: ', toHexString(new Uint8Array(cellData.getAsset().raw()))); + logger.debug('CkbHandler isBurnTx chain: ', cellData.getChain()); let asset; const assetAddress = toHexString(new Uint8Array(cellData.getAsset().raw())); switch (cellData.getChain()) { @@ -188,8 +197,8 @@ export class CkbHandler { hashType: ForceBridgeCore.config.ckb.deps.sudtType.script.hashType, args: this.getBridgeLockHash(asset), }; - logger.debug('expectType:', expectType); - logger.debug('sudtType:', sudtType); + logger.debug('CkbHandler isBurnTx expectType:', expectType); + logger.debug('CkbHandler isBurnTx sudtType:', sudtType); if (sudtType == null || expectType.codeHash != sudtType.codeHash || expectType.args != sudtType.args) { return false; } @@ -208,17 +217,26 @@ export class CkbHandler { const generator = new CkbTxGenerator(this.ckb, new IndexerCollector(this.indexer)); while (true) { const mintRecords = await this.db.getCkbMintRecordsToMint(); - logger.debug('new mintRecords: ', mintRecords); if (mintRecords.length == 0) { logger.debug('wait for new mint records'); await asyncSleep(3000); continue; } + logger.info(`CkbHandler handleMintRecords new mintRecords:${JSON.stringify(mintRecords, null, 2)}`); + + const mintIds = mintRecords + .map((ckbMint) => { + return ckbMint.id; + }) + .join(', '); + const records = mintRecords.map((r) => this.filterMintRecords(r, ownLockHash)); const newTokens = await this.filterNewTokens(records); - if (newTokens.length > 0) { - logger.debug('bridge cell is not exist. do create bridge cell.'); + logger.info( + `CkbHandler handleMintRecords bridge cell is not exist. do create bridge cell. ownLockHash:${ownLockHash.toString()}`, + ); + logger.info(`CkbHandler handleMintRecords createBridgeCell newToken:${JSON.stringify(newTokens, null, 2)}`); await this.createBridgeCell(newTokens, generator); } @@ -230,7 +248,9 @@ export class CkbHandler { const rawTx = await generator.mint(await account.getLockscript(), records); const signedTx = this.ckb.signTransaction(this.PRI_KEY)(rawTx); const mintTxHash = await this.ckb.rpc.sendTransaction(signedTx); - console.log(`Mint Transaction has been sent with tx hash ${mintTxHash}`); + logger.info( + `CkbHandler handleMintRecords Mint Transaction has been sent, ckbTxHash ${mintTxHash}, mintIds:${mintIds}`, + ); const txStatus = await this.waitUntilCommitted(mintTxHash, 200); if (txStatus.txStatus.status === 'committed') { mintRecords.map((r) => { @@ -243,11 +263,14 @@ export class CkbHandler { r.mintHash = mintTxHash; r.message = `mint execute failed.the tx status is ${txStatus.txStatus.status}`; }); - logger.error('mint execute failed: ', mintRecords); + logger.error( + `CkbHandler handleMintRecords mint execute failed txStatus:${txStatus.txStatus.status}, mintIds:${mintIds}`, + ); } await this.db.updateCkbMint(mintRecords); + logger.info('CkbHandler handleMintRecords mint execute completed, mintIds:', mintIds); } catch (e) { - logger.debug('mint execute failed:', e.toString()); + logger.debug(`CkbHandler handleMintRecords mint error:${e.toString()}, mintIds:${mintIds}`); mintRecords.map((r) => { r.status = 'error'; r.message = e.toString(); @@ -298,13 +321,13 @@ export class CkbHandler { } assets.push(record.asset.toBridgeLockscriptArgs()); - logger.debug('record:', record); + logger.debug('CkbHandler filterNewTokens record:', record); const bridgeCellLockscript = { codeHash: ForceBridgeCore.config.ckb.deps.bridgeLock.script.codeHash, hashType: ForceBridgeCore.config.ckb.deps.bridgeLock.script.hashType, args: record.asset.toBridgeLockscriptArgs(), }; - logger.debug('record: bridgeCellLockscript ', bridgeCellLockscript); + logger.debug('CkbHandler filterNewTokens bridgeCellLockscript ', bridgeCellLockscript); const searchKey = { script: new Script( bridgeCellLockscript.codeHash, @@ -355,9 +378,16 @@ export class CkbHandler { async waitUntilCommitted(txHash: string, timeout: number) { let waitTime = 0; + let statusMap = new Map(); + while (true) { const txStatus = await this.ckb.rpc.getTransaction(txHash); - logger.debug(`tx ${txHash} status: ${txStatus.txStatus.status}, index: ${waitTime}`); + if (!statusMap.get(txStatus.txStatus.status)) { + logger.info( + `CkbHandler waitUntilCommitted tx ${txHash} status: ${txStatus.txStatus.status}, index: ${waitTime}`, + ); + statusMap.set(txStatus.txStatus.status, true); + } if (txStatus.txStatus.status === 'committed') { return txStatus; } diff --git a/offchain-modules/src/packages/handlers/eos.ts b/offchain-modules/src/packages/handlers/eos.ts index 1d91459d..f4c691ec 100644 --- a/offchain-modules/src/packages/handlers/eos.ts +++ b/offchain-modules/src/packages/handlers/eos.ts @@ -247,7 +247,7 @@ export class EosHandler { try { actions = await this.chain.getActions(this.config.bridgerAccount, pos, offset); } catch (e) { - logger.error(`EosHandler getActions pos:${pos} offset:${offset} error:${e}`); + logger.error(`EosHandler getActions pos:${pos} offset:${offset} error:${e.toString()}`); await asyncSleep(3000); } const actLen = actions.actions.length; @@ -312,7 +312,7 @@ export class EosHandler { } await this.processUnLockEvents(todoRecords); } catch (e) { - logger.error('EosHandler watchUnlockEvents error:', e); + logger.error('EosHandler watchUnlockEvents error:', e.toString()); await asyncSleep(3000); } } @@ -320,6 +320,7 @@ export class EosHandler { async processUnLockEvents(records: EosUnlock[]) { for (const record of records) { + logger.info(`EosHandler processUnLockEvents get new unlockEvent:${JSON.stringify(record, null, 2)}`); record.status = 'pending'; const unlockTx = await this.buildUnlockTx(record); if (this.config.privateKeys.length === 0) { @@ -364,7 +365,9 @@ export class EosHandler { record.status = 'error'; record.message = e.message; logger.error( - `EosHandler pushSignedTransaction failed eosTxHash:${txHash} ckbTxHash:${record.ckbTxHash} receiver:${record.recipientAddress} amount:${record.amount} asset:${record.asset} error:${e}`, + `EosHandler pushSignedTransaction failed eosTxHash:${txHash} ckbTxHash:${record.ckbTxHash} receiver:${ + record.recipientAddress + } amount:${record.amount} asset:${record.asset} error:${e.toString()}`, ); await this.db.saveEosUnlock([record]); } @@ -413,7 +416,7 @@ export class EosHandler { await this.db.saveEosUnlock(newRecords); } } catch (e) { - logger.error(`EosHandler checkUnlockTxStatus error:${e}`); + logger.error(`EosHandler checkUnlockTxStatus error:${e.toString()}`); await asyncSleep(3000); } } diff --git a/offchain-modules/src/packages/handlers/eth.ts b/offchain-modules/src/packages/handlers/eth.ts index 9d171fba..372dd9f1 100644 --- a/offchain-modules/src/packages/handlers/eth.ts +++ b/offchain-modules/src/packages/handlers/eth.ts @@ -1,12 +1,8 @@ import { EthDb } from '../db'; import { logger } from '../utils/logger'; import { asyncSleep, fromHexString, uint8ArrayToString } from '../utils'; -import { abi } from '../xchain/eth/abi/ForceBridge.json'; -import { ForceBridgeCore } from '../core'; -import { ethers } from 'ethers'; -import { CkbMint, EthUnlock } from '@force-bridge/db/model'; +import { EthUnlock } from '@force-bridge/db/model'; import { ChainType } from '@force-bridge/ckb/model/asset'; -import { getRepository } from 'typeorm'; import { EthUnlockStatus } from '@force-bridge/db/entity/EthUnlock'; import { EthChain } from '@force-bridge/xchain/eth'; @@ -16,10 +12,17 @@ export class EthHandler { // listen ETH chain and handle the new lock events async watchLockEvents() { const latestHeight = await this.db.getLatestHeight(); - logger.debug('latestHeight: ', latestHeight); + logger.debug('EthHandler watchLockEvents latestHeight: ', latestHeight); await this.ethChain.watchLockEvents(latestHeight, async (log, parsedLog) => { try { - logger.debug('log:', { log, parsedLog }); + logger.info( + `EthHandler watchLockEvents receiveLog txHash:${ + log.transactionHash + } amount:${parsedLog.args.lockedAmount.toString()} asset:${parsedLog.args.token} recipientLockscript:${ + parsedLog.args.recipientLockscript + } sudtExtraData:${parsedLog.args.sudtExtraData} sender:${parsedLog.args.sender}`, + ); + logger.debug('EthHandler watchLockEvents eth lockEvtLog:', { log, parsedLog }); const amount = parsedLog.args.lockedAmount.toString(); if (amount === '0') { return; @@ -46,9 +49,11 @@ export class EthHandler { sender: parsedLog.args.sender, }, ]); - logger.debug(`save CkbMint and EthLock successful for eth tx ${log.transactionHash}.`); + logger.info( + `EthHandler watchLockEvents save CkbMint and EthLock successful for eth tx ${log.transactionHash}.`, + ); } catch (e) { - logger.error(`EthHandler watchLockEvents error: ${e}`); + logger.error(`EthHandler watchLockEvents error: ${e.toString()}`); await asyncSleep(3000); } }); @@ -63,12 +68,22 @@ export class EthHandler { // todo: get and handle pending and error records while (true) { await asyncSleep(15000); - logger.debug('get new unlock events and send tx'); + logger.debug('EthHandler watchLockEvents get new unlock events and send tx'); const records = await this.getUnlockRecords('todo'); - logger.debug('unlock records', records); if (records.length === 0) { continue; } + logger.info('EthHandler watchLockEvents unlock records', records); + + const unlockTxHashes = records + .map((unlockRecord) => { + return unlockRecord.ckbTxHash; + }) + .join(', '); + logger.info( + `EthHandler watchLockEvents start process unlock Record, ckbTxHashes:${unlockTxHashes} num:${records.length}`, + ); + try { // write db first, avoid send tx success and fail to write db records.map((r) => { @@ -83,6 +98,7 @@ export class EthHandler { await this.db.saveEthUnlock(records); logger.debug('sendUnlockTxs res', txRes); const receipt = await txRes.wait(); + logger.info(`EthHandler watchLockEvents sendUnlockTxs receipt:${JSON.stringify(receipt.logs, null, 2)}`); if (receipt.status === 1) { records.map((r) => { r.status = 'success'; @@ -91,16 +107,17 @@ export class EthHandler { records.map((r) => { r.status = 'error'; }); - logger.error('unlock execute failed', receipt); + logger.error('EthHandler watchLockEvents unlock execute failed:', receipt); } await this.db.saveEthUnlock(records); - logger.debug('sendUnlockTxs receipt', receipt); + logger.info('EthHandler watchLockEvents process unlock Record completed'); } catch (e) { records.map((r) => { r.status = 'error'; r.message = e.message; }); await this.db.saveEthUnlock(records); + logger.error(`EthHandler watchLockEvents error:${e.toString()}`); } } } diff --git a/offchain-modules/src/packages/handlers/tron.ts b/offchain-modules/src/packages/handlers/tron.ts index 29dff14b..ac63bbd4 100644 --- a/offchain-modules/src/packages/handlers/tron.ts +++ b/offchain-modules/src/packages/handlers/tron.ts @@ -4,8 +4,6 @@ import { asyncSleep } from '../utils'; import { ForceBridgeCore } from '../core'; import { ITronLock, TronUnlock, ICkbMint, TronLock } from '@force-bridge/db/model'; import { ChainType } from '@force-bridge/ckb/model/asset'; -import { promises } from 'fs'; -import { sign } from '@force-bridge/ckb/tx-helper/signer'; import { getAssetTypeByAsset } from '@force-bridge/xchain/tron/utils'; const TronWeb = require('tronweb'); const TronGrid = require('trongrid'); @@ -79,7 +77,13 @@ export class TronHandler { }); for (const data of txs.data) { if (Object.keys(data.token_info).length == 0) { - logger.debug('invalid trc20 tx, token info is undefined', data); + logger.warn( + `TronHandler getTrc20TxsLockEvents invalid trc20 tx, token info is undefined, data:${JSON.stringify( + data, + null, + 2, + )}`, + ); continue; } const tx = await this.tronWeb.trx.getTransaction(data.transaction_id); @@ -141,27 +145,25 @@ export class TronHandler { if (lastTimestamp != 1) { startTimestamp = lastTimestamp; } - logger.debug('start time', startTimestamp); + logger.info('TronHandler watchLockEvents start time:', startTimestamp); let minTimestamp = startTimestamp; - try { - while (true) { - logger.debug('get new lock events and save to db'); - logger.debug('min timestamp', minTimestamp); + while (true) { + try { + logger.debug(`TronHandler watchLockEvents minTimestamp:${minTimestamp}`); const ckbMintRecords: ICkbMint[] = []; const tronLockRecords: ITronLock[] = []; const trxAndTrc10Events = await this.getTrxAndTrc10LockEvents(minTimestamp); const trc20LockEvents = await this.getTrc20TxsLockEvents(minTimestamp); - const totalLockEvents = trxAndTrc10Events.concat(trc20LockEvents); - logger.debug('total lock events', totalLockEvents); for (const event of totalLockEvents) { if (event.timestamp <= minTimestamp) { continue; } + logger.info(`TronHandler watchLockEvents newLockEvent:${JSON.stringify(event, null, 2)}`); const ckbMint = this.transferEventToCkbMint(event); ckbMintRecords.push(ckbMint); const tronLock = this.transferEventToTronLock(event); @@ -177,12 +179,11 @@ export class TronHandler { if (trc20LockEvents.length != 0) { minTimestamp = Math.max(trc20LockEvents[trc20LockEvents.length - 1].timestamp, minTimestamp); } - + await asyncSleep(3000); + } catch (e) { + logger.error('TronHandler watchLockEvents error:', e.toString()); await asyncSleep(3000); } - } catch (e) { - logger.error('TronHandler watchLockEvents error:', e); - setTimeout(this.watchLockEvents, 3000); } } @@ -264,9 +265,9 @@ export class TronHandler { // watch the tron_unlock table and handle the new unlock events // send tx according to the data async watchUnlockEvents(): Promise { - try { - while (true) { - logger.debug('flush pending tx to confirm'); + while (true) { + try { + logger.debug('TronHandler watchUnlockEvents flush pending tx to confirm'); const pendingRecords = await this.db.getTronUnlockRecords('pending'); for (const pendingRecord of pendingRecords) { try { @@ -277,15 +278,23 @@ export class TronHandler { } else { pendingRecord.status = 'error'; } + logger.info( + `TronHandler watchUnlockEvents tronTxHash:${pendingRecord.tronTxHash} status:${pendingRecord.status}`, + ); } catch (e) { - logger.debug(`${pendingRecord.tronTxHash} not confirmed yet`, e); + logger.debug( + `TronHandler watchUnlockEvents getConfirmedTransaction error:${e.toString()}, ${ + pendingRecord.tronTxHash + } not confirmed yet`, + ); } } await this.db.saveTronUnlock(pendingRecords); - logger.debug('get new unlock events and send tx'); const unlockRecords = await this.db.getTronUnlockRecords('todo'); for (const unlockRecord of unlockRecords) { + logger.info(`TronHandler watchUnlockEvents getTronUnlockRecord:${JSON.stringify(unlockRecord, null, 2)}`); + let signedTx; switch (unlockRecord.assetType) { case 'trx': @@ -298,7 +307,7 @@ export class TronHandler { signedTx = await this.multiSignTransferTrc20(unlockRecord); break; } - logger.debug('tron unlock signed tx', signedTx); + logger.debug('TronHandler watchUnlockEvents tron unlock signed tx:', signedTx); unlockRecord.tronTxHash = signedTx.txID; unlockRecord.tronTxIndex = 0; @@ -309,22 +318,26 @@ export class TronHandler { try { const broadTx = await this.tronWeb.trx.broadcast(signedTx); if (broadTx.result == true) { - logger.debug('broad tx success', broadTx); + logger.info('TronHandler watchUnlockEvents broad tx success ', broadTx); } else { throw new Error(`broad tx failed ${broadTx}`); } } catch (e) { - logger.error(`TronHandler watchUnlockEvents broadcast tx ${signedTx} error: ${e}`); + logger.error( + `TronHandler watchUnlockEvents broadcast tx ${signedTx} error: ${e.toString()} ckbTxHash:${ + unlockRecord.ckbTxHash + }`, + ); unlockRecord.status = 'error'; unlockRecord.message = `tx error: ${e}`; await this.db.saveTronUnlock([unlockRecord]); } } await asyncSleep(3000); + } catch (e) { + logger.error('TronHandler watchUnlockEvents error:', e.toString()); + setTimeout(this.watchLockEvents, 3000); } - } catch (e) { - logger.error('TronHandler watchUnlockEvents error:', e); - setTimeout(this.watchLockEvents, 3000); } } diff --git a/offchain-modules/src/packages/utils/logger.ts b/offchain-modules/src/packages/utils/logger.ts index 61e153aa..23ca1eb2 100644 --- a/offchain-modules/src/packages/utils/logger.ts +++ b/offchain-modules/src/packages/utils/logger.ts @@ -1,17 +1,33 @@ import { configure, getLogger } from 'log4js'; +import { logConfig } from '@force-bridge/config'; export const logger = getLogger('@force-bridge/core'); -configure({ - appenders: { - out: { - type: 'stdout', - layout: { - // ref: https://github.com/log4js-node/log4js-node/blob/master/docs/layouts.md - type: 'pattern', - pattern: '%[[%d %p %f{2}:%l]%] %m%n', + +const logPattern = '%[[%d %p %f{2}:%l]%] %m%n'; + +export const initLog = (cfg: logConfig) => { + configure({ + appenders: { + out: { + type: 'stdout', + layout: { + // ref: https://github.com/log4js-node/log4js-node/blob/master/docs/layouts.md + type: 'pattern', + pattern: logPattern, + }, }, + app: { + type: 'file', + filename: cfg.logFile, + maxLogSize: 100 * 1024 * 1024, //100M + backups: 100, + layout: { + type: 'pattern', + pattern: logPattern, + }, + }, + }, + categories: { + default: { appenders: ['out', 'app'], level: cfg.level, enableCallStack: true }, }, - }, - categories: { - default: { appenders: ['out'], level: 'debug', enableCallStack: true }, - }, -}); + }); +}; diff --git a/offchain-modules/src/packages/xchain/eth/contract.ts b/offchain-modules/src/packages/xchain/eth/contract.ts index 45ce2a9f..cb069919 100644 --- a/offchain-modules/src/packages/xchain/eth/contract.ts +++ b/offchain-modules/src/packages/xchain/eth/contract.ts @@ -61,8 +61,8 @@ export class EthChain { topics: [ethers.utils.id('Locked(address,address,uint256,bytes,bytes)')], toBlock: toBlock, }); - logger.info( - `Eth watchLockEvents from:${fromBlock} to:${toBlock} currentBlockNumber:${currentBlockNumber} confirmNumber:${confirmNumber} logs:${logs.length}`, + logger.debug( + `EthChain watchLockEvents from:${fromBlock} to:${toBlock} currentBlockNumber:${currentBlockNumber} confirmNumber:${confirmNumber} logs:${logs.length}`, ); for (const log of logs) { logger.debug('log', log); @@ -71,15 +71,13 @@ export class EthChain { } fromBlock = toBlock + 1; } catch (err) { - logger.error('Eth watchLockEvents error:', err); + logger.error('EthChain watchLockEvents error:', err); await asyncSleep(3000); } } } async sendUnlockTxs(records: EthUnlock[]): Promise { - // const admin = await this.bridge.admin(); - // logger.debug('admin', admin); logger.debug('contract balance', await this.provider.getBalance(this.bridgeContractAddr)); const params = records.map((r) => { return { diff --git a/offchain-modules/src/scripts/integration-test/btc.ts b/offchain-modules/src/scripts/integration-test/btc.ts index 32ceebbe..6743c06e 100644 --- a/offchain-modules/src/scripts/integration-test/btc.ts +++ b/offchain-modules/src/scripts/integration-test/btc.ts @@ -1,10 +1,9 @@ import 'module-alias/register'; -import { logger } from '@force-bridge/utils/logger'; +import { initLog, logger } from '@force-bridge/utils/logger'; import { RPCClient } from 'rpc-bitcoin'; import bitcore from 'bitcore-lib'; import { asyncSleep } from '@force-bridge/utils'; import { createConnection } from 'typeorm'; -import { CkbDb } from '@force-bridge/db'; import { Config } from '@force-bridge/config'; import { BTCChain, getBtcMainnetFee } from '@force-bridge/xchain/btc'; import { BtcDb } from '@force-bridge/db/btc'; @@ -33,14 +32,17 @@ async function main() { const conn = await createConnection(); const btcDb = new BtcDb(conn); - const ckbDb = new CkbDb(conn); const configPath = process.env.CONFIG_PATH || './config.json'; nconf.env().file({ file: configPath }); const config: Config = nconf.get('forceBridge'); - logger.debug(`config: ${config}`); + config.common.log.logFile = './log/btc-ci.log'; + initLog(config.common.log); + // init bridge force core await new ForceBridgeCore().init(config); + + logger.debug(`config: ${config}`); const PRI_KEY = ForceBridgeCore.config.ckb.privateKey; const client = new RPCClient(config.btc.clientParams); const btcChain = new BTCChain(); @@ -81,7 +83,7 @@ async function main() { LockEventReceipent + 'do lock', feeRate.fastestFee, ); - logger.debug( + logger.info( `user ${userAddr.toString()} lock 50000 satoshis; the lock tx hash is ${lockTxHash} after block ${lockStartHeight}`, ); let latestHeight = await btcDb.getLatestHeight(); @@ -107,8 +109,8 @@ async function main() { return false; } - logger.debug('btcLockRecords', btcLockRecords); - logger.debug('CkbMintRecords', ckbMintRecords); + logger.info('btcLockRecords', btcLockRecords); + logger.info('CkbMintRecords', ckbMintRecords); assert(btcLockRecords.length === 1); const btcLockRecord = btcLockRecords[0]; @@ -145,8 +147,8 @@ async function main() { await account.getLockscript(), ); - logger.debug('sudt balance:', balance); - logger.debug('expect balance:', new Amount(lockAmount.toString(), 0)); + logger.info('sudt balance:', balance); + logger.info('expect balance:', new Amount(lockAmount.toString(), 0)); return balance.eq(new Amount(lockAmount.toString(), 0)); }, 1000 * 10, @@ -164,7 +166,7 @@ async function main() { ); const signedTx = ckb.signTransaction(PRI_KEY)(burnTx); const burnTxHash = await ckb.rpc.sendTransaction(signedTx); - console.log(`burn Transaction has been sent with tx hash ${burnTxHash}`); + console.info(`burn Transaction has been sent with tx hash ${burnTxHash}`); await waitUntilCommitted(ckb, burnTxHash, 60); await waitFnCompleted( @@ -175,8 +177,8 @@ async function main() { await account.getLockscript(), ); - logger.debug('sudt balance:', balance); - logger.debug('expect balance:', new Amount(lockAmount.toString(), 0).sub(burnAmount)); + logger.info('sudt balance:', balance); + logger.info('expect balance:', new Amount(lockAmount.toString(), 0).sub(burnAmount)); return balance.eq(new Amount(lockAmount.toString(), 0).sub(burnAmount)); }, 1000 * 10, @@ -194,12 +196,12 @@ async function main() { if (btcUnlockRecords.length === 0) { return false; } - logger.debug('btcUnlockRecords', btcUnlockRecords); + logger.info('btcUnlockRecords', btcUnlockRecords); assert(btcUnlockRecords.length === 1); const eosUnlockRecord = btcUnlockRecords[0]; assert(eosUnlockRecord.recipientAddress == userAddr.toString()); - logger.debug('amount: ', eosUnlockRecord.amount); - logger.debug('amount: ', burnAmount.toString(0)); + logger.info('amount: ', eosUnlockRecord.amount); + logger.info('amount: ', burnAmount.toString(0)); assert(eosUnlockRecord.amount === burnAmount.toString(0)); return true; }, @@ -207,12 +209,12 @@ async function main() { ); const lockRecords: BtcLock[] = await btcDb.getLockRecordByHash(lockTxHash); - logger.debug(`successful lock records ${JSON.stringify(lockRecords, null, 2)}`); + logger.info(`successful lock records ${JSON.stringify(lockRecords, null, 2)}`); const unlockRecords: BtcUnlock[] = await btcDb.getBtcUnlockRecords('success'); - logger.debug(`successful unlock records ${JSON.stringify(unlockRecords, null, 2)}`); + logger.info(`successful unlock records ${JSON.stringify(unlockRecords, null, 2)}`); assert(lockRecords[0].data.startsWith(LockEventReceipent)); assert(unlockRecords[0].recipientAddress === userAddr.toString()); - logger.debug('end btc test lock and unlock'); + logger.info('end btc test lock and unlock'); } main() diff --git a/offchain-modules/src/scripts/integration-test/eos.ts b/offchain-modules/src/scripts/integration-test/eos.ts index 8a6360ff..a4889e6f 100644 --- a/offchain-modules/src/scripts/integration-test/eos.ts +++ b/offchain-modules/src/scripts/integration-test/eos.ts @@ -2,11 +2,9 @@ import { createConnection } from 'typeorm'; import 'module-alias/register'; import nconf from 'nconf'; import { Config, EosConfig } from '@force-bridge/config'; -import { logger } from '@force-bridge/utils/logger'; +import { initLog, logger } from '@force-bridge/utils/logger'; import { JsSignatureProvider } from 'eosjs/dist/eosjs-jssig'; -import { CkbDb } from '@force-bridge/db'; import { EosLock, getEosLockId } from '@force-bridge/db/entity/EosLock'; -import { asyncSleep } from '@force-bridge/utils'; import assert from 'assert'; import { CkbMint } from '@force-bridge/db/entity/CkbMint'; import { ChainType, EosAsset } from '@force-bridge/ckb/model/asset'; @@ -16,7 +14,6 @@ import { Account } from '@force-bridge/ckb/model/accounts'; import { CkbTxGenerator } from '@force-bridge/ckb/tx-helper/generator'; import { IndexerCollector } from '@force-bridge/ckb/tx-helper/collector'; import { Amount, Script } from '@lay2/pw-core'; - import { CkbIndexer } from '@force-bridge/ckb/tx-helper/indexer'; import { ForceBridgeCore } from '@force-bridge/core'; import { waitUntilCommitted, waitFnCompleted } from './util'; @@ -31,8 +28,11 @@ async function main() { const configPath = process.env.CONFIG_PATH || './config.json'; nconf.env().file({ file: configPath }); const config: EosConfig = nconf.get('forceBridge:eos'); - logger.debug('EosConfig:', config); const conf: Config = nconf.get('forceBridge'); + conf.common.log.logFile = './log/eos-ci.log'; + initLog(conf.common.log); + logger.debug('EosConfig:', config); + // init bridge force core await new ForceBridgeCore().init(conf); @@ -66,7 +66,7 @@ async function main() { let lockTxHash: string; if ('transaction_id' in lockTxRes) { lockTxHash = lockTxRes.transaction_id; - logger.debug('EosLockTx:', lockTxRes); + logger.debug(`EosLockTx:${lockTxRes}`); } else { throw new Error('send lock eos transaction failed. txRes:' + lockTxRes); } @@ -91,8 +91,8 @@ async function main() { return false; } - logger.debug('EosLockRecords', eosLockRecords); - logger.debug('CkbMintRecords', ckbMintRecords); + logger.info('EosLockRecords', eosLockRecords); + logger.info('CkbMintRecords', ckbMintRecords); assert(eosLockRecords.length === 1); const eosLockRecord = eosLockRecords[0]; @@ -135,21 +135,13 @@ async function main() { await account.getLockscript(), ); - logger.debug('sudt balance:', balance.toString(4)); - logger.debug('expect balance:', new Amount(lockAmount, 4).toString(4)); + logger.info('sudt balance:', balance.toString(4)); + logger.info('expect balance:', new Amount(lockAmount, 4).toString(4)); return balance.eq(new Amount(lockAmount, 4)); }, 1000 * 10, ); - //unlock eos - // const unlockRecord = { - // ckbTxHash: genRandomHex(32), - // asset: lockAsset, - // amount: lockAmount, - // recipientAddress: lockAccount, - // }; - // await ckbDb.createEosUnlock([unlockRecord]); // send burn tx const burnAmount = new Amount('0.0001', 4); const generator = new CkbTxGenerator(ckb, new IndexerCollector(indexer)); @@ -172,8 +164,8 @@ async function main() { await account.getLockscript(), ); - logger.debug('sudt balance:', balance); - logger.debug('expect balance:', new Amount(lockAmount, 4).sub(burnAmount)); + logger.info('sudt balance:', balance); + logger.info('expect balance:', new Amount(lockAmount, 4).sub(burnAmount)); return balance.eq(new Amount(lockAmount, 4).sub(burnAmount)); }, 1000 * 10, @@ -193,13 +185,13 @@ async function main() { if (eosUnlockRecords.length === 0) { return false; } - logger.debug('EosUnlockRecords', eosUnlockRecords); + logger.info('EosUnlockRecords', eosUnlockRecords); assert(eosUnlockRecords.length === 1); const eosUnlockRecord = eosUnlockRecords[0]; assert(eosUnlockRecord.recipientAddress == lockAccount); assert(eosUnlockRecord.asset === lockAsset); - logger.debug('amount: ', eosUnlockRecord.amount); - logger.debug('amount: ', burnAmount.toString(0)); + logger.info('amount: ', eosUnlockRecord.amount); + logger.info('amount: ', burnAmount.toString(0)); assert(eosUnlockRecord.amount === burnAmount.toString(0)); eosUnlockTxHash = eosUnlockRecord.eosTxHash; return true; diff --git a/offchain-modules/src/scripts/integration-test/eth.ts b/offchain-modules/src/scripts/integration-test/eth.ts index 090a9e46..bc1fe2aa 100644 --- a/offchain-modules/src/scripts/integration-test/eth.ts +++ b/offchain-modules/src/scripts/integration-test/eth.ts @@ -2,100 +2,64 @@ import 'module-alias/register'; import { ethers } from 'ethers'; import nconf from 'nconf'; import { Config, EthConfig } from '@force-bridge/config'; -import { logger } from '@force-bridge/utils/logger'; -import { asyncSleep, fromHexString, stringToUint8Array, toHexString, uint8ArrayToString } from '@force-bridge/utils'; +import { initLog, logger } from '@force-bridge/utils/logger'; +import { asyncSleep, stringToUint8Array, toHexString, uint8ArrayToString } from '@force-bridge/utils'; import { createConnection } from 'typeorm'; -import { CkbDb, EthDb } from '@force-bridge/db'; import { ETH_ADDRESS } from '@force-bridge/xchain/eth'; import { CkbMint, EthLock, EthUnlock } from '@force-bridge/db/model'; import assert from 'assert'; import { ChainType, EthAsset } from '@force-bridge/ckb/model/asset'; import { abi } from '@force-bridge/xchain/eth/abi/ForceBridge.json'; -import { Address, AddressType, Amount, Script } from '@lay2/pw-core'; +import { Amount, Script } from '@lay2/pw-core'; import { Account } from '@force-bridge/ckb/model/accounts'; import { CkbTxGenerator } from '@force-bridge/ckb/tx-helper/generator'; import { IndexerCollector } from '@force-bridge/ckb/tx-helper/collector'; import { waitUntilCommitted } from './util'; -// import {CkbIndexer} from "@force-bridge/ckb/tx-helper/indexer"; import { ForceBridgeCore } from '@force-bridge/core'; import { CkbIndexer } from '@force-bridge/ckb/tx-helper/indexer'; const CKB = require('@nervosnetwork/ckb-sdk-core').default; -// const { Indexer, CellCollector } = require('@ckb-lumos/indexer'); const CKB_URL = process.env.CKB_URL || 'http://127.0.0.1:8114'; -// const LUMOS_DB = './lumos_db'; const indexer = new CkbIndexer('http://127.0.0.1:8114', 'http://127.0.0.1:8116'); const collector = new IndexerCollector(indexer); -// indexer.startForever(); const ckb = new CKB(CKB_URL); async function main() { const conn = await createConnection(); - const ethDb = new EthDb(conn); - const ckbDb = new CkbDb(conn); const PRI_KEY = process.env.PRI_KEY || '0xa800c82df5461756ae99b5c6677d019c98cc98c7786b80d7b2e77256e46ea1fe'; const configPath = process.env.CONFIG_PATH || './config.json'; nconf.env().file({ file: configPath }); const config: EthConfig = nconf.get('forceBridge:eth'); - logger.debug('config', config); const conf: Config = nconf.get('forceBridge'); + conf.common.log.logFile = './log/eth-ci.log'; + initLog(conf.common.log); + + logger.debug('config', config); // init bridge force core await new ForceBridgeCore().init(conf); - // const ForceBridge = await ethers.getContractFactory("ForceBridge"); - // const bridge = await ForceBridge.deploy(); - // await bridge.deployed(); - // console.log("ForceBridge deployed to:", bridge.address); const provider = new ethers.providers.JsonRpcProvider(config.rpcUrl); - // const blockNumber = await provider.getBlockNumber(); - // logger.debug('blockNumber:', blockNumber); const bridgeContractAddr = config.contractAddress; - // logger.debug('bridgeContractAddr:', bridgeContractAddr); - // const signer = provider.getSigner() - // logger.debug('signer:', signer); - // logger.debug('abi:', abi); const bridge = new ethers.Contract(bridgeContractAddr, abi, provider); const wallet = new ethers.Wallet(config.privateKey, provider); const bridgeWithSigner = bridge.connect(wallet); const iface = new ethers.utils.Interface(abi); - // listen - // bridgeWithSigner.on("Locked", (token, sender, lockedAmount, recipientLockscript, sudtExtraData) => { - // logger.debug('event:', {token, sender, lockedAmount, recipientLockscript, sudtExtraData}); - // }); - // const filter = { - // address: bridgeContractAddr, - // fromBlock: 0, - // // fromBlock: 'earliest', - // topics: [ - // // the name of the event, parnetheses containing the data type of each event, no spaces - // // utils.id("Transfer(address,address,uint256)") - // ethers.utils.id('Locked(address,address,uint256,bytes,bytes)'), - // ], - // }; - // // provider.resetEventsBlock(0) - // provider.on(filter, async (log) => { - // const parsedLog = iface.parseLog(log); - // logger.debug('log:', { log, parsedLog }); - // // do whatever you want here - // // I'm pretty sure this returns a promise, so don't forget to resolve it - // }); // lock eth const recipientLockscript = stringToUint8Array('ckt1qyqyph8v9mclls35p6snlaxajeca97tc062sa5gahk'); - logger.debug('recipientLockscript', toHexString(recipientLockscript)); + logger.info('recipientLockscript', toHexString(recipientLockscript)); const sudtExtraData = '0x01'; const amount = ethers.utils.parseEther('0.1'); - logger.debug('amount', amount); const lockRes = await bridgeWithSigner.lockETH(recipientLockscript, sudtExtraData, { value: amount }); - logger.debug('lockRes', lockRes); + logger.info('lockRes', lockRes); const txHash = lockRes.hash; const receipt = await lockRes.wait(); - logger.debug('receipt', receipt); + logger.info('receipt', receipt); // create eth unlock const recipientAddress = '0x1000000000000000000000000000000000000001'; const balanceBefore = await provider.getBalance(recipientAddress); - logger.debug('balanceBefore', balanceBefore); + logger.info('balanceBefore burn', balanceBefore); let sendBurn = false; let burnTxHash; @@ -106,15 +70,15 @@ async function main() { txHash, }, }); - logger.debug('ethLockRecords', ethLockRecords); + logger.info('ethLockRecords', ethLockRecords); assert(ethLockRecords.length === 1); const ethLockRecord = ethLockRecords[0]; assert(ethLockRecord.sudtExtraData === sudtExtraData); assert(ethLockRecord.sender === wallet.address); assert(ethLockRecord.token === ETH_ADDRESS); assert(ethLockRecord.amount === amount.toString()); - logger.debug('ethLockRecords', ethLockRecord.recipient); - logger.debug('ethLockRecords', `0x${toHexString(recipientLockscript)}`); + logger.info('ethLockRecords', ethLockRecord.recipient); + logger.info('ethLockRecords', `0x${toHexString(recipientLockscript)}`); assert(ethLockRecord.recipient === `${uint8ArrayToString(recipientLockscript)}`); const ckbMintRecords = await conn.manager.find(CkbMint, { @@ -122,7 +86,7 @@ async function main() { id: txHash, }, }); - logger.debug('ckbMintRecords', ckbMintRecords); + logger.info('ckbMintRecords', ckbMintRecords); assert(ckbMintRecords.length === 1); const ckbMintRecord = ckbMintRecords[0]; assert(ckbMintRecord.chain === ChainType.ETH); @@ -153,8 +117,8 @@ async function main() { ); if (!sendBurn) { - logger.debug('sudt balance:', balance); - logger.debug('expect balance:', new Amount(amount.toString(), 0)); + logger.info('sudt balance:', balance); + logger.info('expect balance:', new Amount(amount.toString(), 0)); assert(balance.eq(new Amount(amount.toString(), 0))); } @@ -178,8 +142,8 @@ async function main() { sendBurn = true; } const expectBalance = new Amount(amount.toString(), 0).sub(new Amount(burnAmount.toString(), 0)); - logger.debug('sudt balance:', balance); - logger.debug('expect balance:', expectBalance); + logger.info('sudt balance:', balance); + logger.info('expect balance:', expectBalance); assert(balance.eq(expectBalance)); // check unlock record send @@ -192,16 +156,16 @@ async function main() { const ethUnlockRecord = ethUnlockRecords[0]; assert(ethUnlockRecord.status === 'success'); const unlockReceipt = await provider.getTransactionReceipt(ethUnlockRecord.ethTxHash); - logger.debug('unlockReceipt', unlockReceipt); + logger.info('unlockReceipt', unlockReceipt); assert(unlockReceipt.logs.length === 1); const parsedLog = iface.parseLog(unlockReceipt.logs[0]); - logger.debug('parsedLog', parsedLog); + logger.info('parsedLog', parsedLog); assert(parsedLog.args.token === ethUnlockRecord.asset); - logger.debug('parsedLog amount', ethUnlockRecord.amount); - logger.debug('parsedLog amount', parsedLog.args.receivedAmount.toString()); + logger.info('parsedLog amount', ethUnlockRecord.amount); + logger.info('parsedLog amount', parsedLog.args.receivedAmount.toString()); assert(ethUnlockRecord.amount === parsedLog.args.receivedAmount.toString()); - logger.debug('parsedLog recipient', ethUnlockRecord.recipientAddress); - logger.debug('parsedLog recipient', parsedLog.args.recipient); + logger.info('parsedLog recipient', ethUnlockRecord.recipientAddress); + logger.info('parsedLog recipient', parsedLog.args.recipient); assert(ethUnlockRecord.recipientAddress === parsedLog.args.recipient); }; @@ -211,7 +175,7 @@ async function main() { try { await checkEffect(); } catch (e) { - logger.warn('The eth component integration not pass yet.', { i, e }); + logger.warn(`The eth component integration not pass yet. i:${i} error:${e.toString()}`); continue; } logger.info('The eth component integration test pass!'); diff --git a/offchain-modules/src/scripts/integration-test/rpc.ts b/offchain-modules/src/scripts/integration-test/rpc.ts index 7b4d524b..073f2266 100644 --- a/offchain-modules/src/scripts/integration-test/rpc.ts +++ b/offchain-modules/src/scripts/integration-test/rpc.ts @@ -6,6 +6,7 @@ import { Config } from '../../packages/config'; import { ForceBridgeCore } from '../../packages/core'; import nconf from 'nconf'; import { asyncSleep } from '@force-bridge/utils'; +import { initLog, logger } from '@force-bridge/utils/logger'; const CKB_PRI_KEY = process.env.PRI_KEY || '0xa800c82df5461756ae99b5c6677d019c98cc98c7786b80d7b2e77256e46ea1fe'; @@ -39,7 +40,7 @@ async function mint(ckbLockscript) { }, }; const unsignedMintTx = await client.request('generateBridgeInNervosTransaction', mintPayload); - console.log('unsignedMintTx', unsignedMintTx); + logger.info('unsignedMintTx', unsignedMintTx); const provider = new ethers.providers.JsonRpcProvider(ForceBridgeCore.config.eth.rpcUrl); const wallet = new ethers.Wallet(ForceBridgeCore.config.eth.privateKey, provider); @@ -50,22 +51,13 @@ async function mint(ckbLockscript) { unsignedTx.gasLimit = ethers.BigNumber.from(1000000); unsignedTx.gasPrice = await provider.getGasPrice(); - console.log('unsignedTx', unsignedTx); + logger.info('unsignedTx', unsignedTx); - // const bridgeContractAddr = ForceBridgeCore.config.eth.contractAddress; - // const bridge = new ethers.Contract(bridgeContractAddr, abi, provider); - - // const recipient = stringToUint8Array('ckt1qyqyph8v9mclls35p6snlaxajeca97tc062sa5gahk'); - // const ethAmount = ethers.utils.parseUnits('1', 0); - // const testTx = await bridge.populateTransaction.lockETH(recipient, '0x', { value: ethAmount }); - - // console.log('testTx', testTx); const signedTx = await wallet.signTransaction(unsignedTx); - console.log('signedTx', signedTx); + logger.info('signedTx', signedTx); const mintTxHash = (await provider.sendTransaction(signedTx)).hash; - // const mintTxHash = await client.request('sendSignedTransaction', sendPayload); - console.log('mintTxHash', mintTxHash); + logger.info('mintTxHash', mintTxHash); return mintTxHash; } @@ -77,7 +69,7 @@ async function getTransaction(ckbAddress) { }; const txs = await client.request('getBridgeTransactionSummaries', getTxPayload); - console.log('txs', JSON.stringify(txs)); + logger.info('txs', JSON.stringify(txs)); return txs; } @@ -90,14 +82,13 @@ async function burn(ckbLockscript) { amount: '1', }; const unsignedBurnTx = await client.request('generateBridgeOutNervosTransaction', burnPayload); - console.log('unsignedBurnTx ', unsignedBurnTx); + logger.info('unsignedBurnTx ', unsignedBurnTx); const signedTx = ForceBridgeCore.ckb.signTransaction(CKB_PRI_KEY)(unsignedBurnTx.rawTransaction); - console.log('signedTx', signedTx); + logger.info('signedTx', signedTx); const burnTxHash = await ForceBridgeCore.ckb.rpc.sendTransaction(signedTx); - //const burnTxHash = await client.request('sendSignedTransaction', sendPayload); - console.log('burnTxHash', burnTxHash); + logger.info('burnTxHash', burnTxHash); return burnTxHash; } @@ -108,7 +99,7 @@ async function check(ckbAddress, txId) { const txs = await getTransaction(ckbAddress); for (const tx of txs) { if ((tx.status = 'Successful' && tx.txSummary.fromTransaction.txId == txId)) { - console.log(tx); + logger.info(`Tx:${tx}`); find = true; break; } @@ -128,17 +119,11 @@ async function main() { const config: Config = nconf.get('forceBridge'); // init bridge force core await new ForceBridgeCore().init(config); + config.common.log.logFile = './log/rpc-ci.log'; + initLog(config.common.log); const ckbAddress = 'ckt1qyqyph8v9mclls35p6snlaxajeca97tc062sa5gahk'; - // const publicKey = ForceBridgeCore.ckb.utils.privateKeyToPublicKey(CKB_PRI_KEY); - // const { secp256k1Dep } = await ForceBridgeCore.ckb.loadDeps(); - // const args = `0x${ForceBridgeCore.ckb.utils.blake160(publicKey, 'hex')}`; - // console.log(secp256k1Dep.codeHash, args, secp256k1Dep.hashType); - - // const fromLockscript = ForceBridgeCore.ckb.utils.addressToScript(ckbAddress); - // console.log(fromLockscript); - const mintTxHash = await mint(ckbAddress); await check(ckbAddress, mintTxHash); diff --git a/offchain-modules/src/scripts/integration-test/tron.ts b/offchain-modules/src/scripts/integration-test/tron.ts index cf5e8cab..80f414ab 100644 --- a/offchain-modules/src/scripts/integration-test/tron.ts +++ b/offchain-modules/src/scripts/integration-test/tron.ts @@ -1,10 +1,9 @@ import 'module-alias/register'; import nconf from 'nconf'; import { Config, TronConfig } from '@force-bridge/config'; -import { logger } from '@force-bridge/utils/logger'; -import { asyncSleep, bigintToSudtAmount } from '@force-bridge/utils'; +import { initLog, logger } from '@force-bridge/utils/logger'; +import { asyncSleep } from '@force-bridge/utils'; import { createConnection } from 'typeorm'; -import { CkbDb, TronDb } from '@force-bridge/db'; import { CkbMint, TronLock, TronUnlock } from '@force-bridge/db/model'; import assert from 'assert'; import { ChainType, EthAsset, TronAsset } from '@force-bridge/ckb/model/asset'; @@ -73,10 +72,11 @@ async function main() { const configPath = process.env.CONFIG_PATH || './config.json'; nconf.env().file({ file: configPath }); const config: TronConfig = nconf.get('forceBridge:tron'); - logger.debug('config', config); const conf: Config = nconf.get('forceBridge'); // init bridge force core await new ForceBridgeCore().init(conf); + conf.common.log.logFile = './log/tron-ci.log'; + initLog(conf.common.log); const tronWeb = new TronWeb({ fullHost: config.tronGridUrl, @@ -91,9 +91,11 @@ async function main() { const memo = recipientLockscript.concat(',').concat(sudtExtraData); const trxLockRes = await transferTrx(tronWeb, from, to, amount, memo, userPrivateKey); + logger.info('trxLockRes:', trxLockRes); const trxTxHash: string = trxLockRes.transaction.txID; const trc10LockRes = await transferTrc10(tronWeb, from, to, amount, '1000696', memo, userPrivateKey); + logger.info('trc10LockRes:', trc10LockRes); const trc10TxHash: string = trc10LockRes.transaction.txID; const trc20LockRes = await transferTrc20( @@ -140,7 +142,7 @@ async function main() { txHash: txHash, }, }); - logger.debug('tronLockRecords', tronLockRecords); + logger.info('tronLockRecords', tronLockRecords); assert(tronLockRecords.length === 1); const tronLockRecord = tronLockRecords[0]; @@ -154,7 +156,7 @@ async function main() { id: txHash.concat('_').concat(tronLockRecord.txIndex.toString()), }, }); - logger.debug('ckbMintRecords', ckbMintRecords); + logger.info('ckbMintRecords', ckbMintRecords); assert(ckbMintRecords.length === 1); const ckbMintRecord = ckbMintRecords[0]; assert(ckbMintRecord.chain === ChainType.TRON); @@ -168,9 +170,9 @@ async function main() { const balance = await getBalance(assetName); if (!sendBurn) { - logger.debug('assetName', assetName); - logger.debug('sudt balance:', balance); - logger.debug('expect balance:', new Amount(amount.toString(), 0)); + logger.info('assetName', assetName); + logger.info('sudt balance:', balance); + logger.info('expect balance:', new Amount(amount.toString(), 0)); assert(balance.eq(new Amount(amount.toString(), 0))); } }; @@ -189,7 +191,7 @@ async function main() { ); const signedTx = ckb.signTransaction(PRI_KEY)(burnTx); burnTxHash = await ckb.rpc.sendTransaction(signedTx); - console.log(`burn Transaction has been sent with tx hash ${burnTxHash}`); + console.info(`burn Transaction has been sent with tx hash ${burnTxHash}`); await waitUntilCommitted(ckb, burnTxHash, 60); return burnTxHash; } @@ -200,9 +202,9 @@ async function main() { const burnAmount = 1; const balance = await getBalance(assetName); - logger.debug('sudt balance:', balance); + logger.info('sudt balance:', balance); const expectBalance = new Amount((amount - burnAmount).toString(), 0); - logger.debug('expect sudt balance:', expectBalance); + logger.info('expect sudt balance:', expectBalance); assert(balance.eq(expectBalance)); // check unlock record send @@ -237,7 +239,7 @@ async function main() { //await checkEffect(trc20TxHash, 'TVWvkCasxAJUyzPKMQ2Rus1NtmBwrkVyBR', 'trc20'); } catch (e) { - logger.warn('The tron component integration not pass yet.', { i, e }); + logger.warn(`The tron component integration not pass yet. i:${i} error:${e.toString()}`); continue; } logger.info('The tron component integration test pass!'); diff --git a/offchain-modules/yarn.lock b/offchain-modules/yarn.lock index 8f277de2..ec09eca5 100644 --- a/offchain-modules/yarn.lock +++ b/offchain-modules/yarn.lock @@ -844,10 +844,10 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@sqltools/formatter@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.2.tgz#9390a8127c0dcba61ebd7fdcc748655e191bdd68" - integrity sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q== +"@sqltools/formatter@^1.2.2": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" + integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -1002,6 +1002,11 @@ dependencies: "@types/yargs-parser" "*" +"@types/zen-observable@^0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" + integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== + "@typescript-eslint/eslint-plugin@^4.18.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz#50fbce93211b5b690895d20ebec6fe8db48af1f6" @@ -1301,6 +1306,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + argv@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" @@ -1869,6 +1879,14 @@ buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" @@ -4286,7 +4304,7 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -4882,6 +4900,13 @@ js-yaml@^3.13.1, js-yaml@^3.14.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbi@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.1.2.tgz#7502ed36fb2b32bb37efb3d2d0b3806a0d771780" @@ -8088,6 +8113,11 @@ tslib@^2.0.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== +tslib@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + tslint-config-prettier@^1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -8222,27 +8252,28 @@ typeorm-naming-strategies@^2.0.0: resolved "https://registry.yarnpkg.com/typeorm-naming-strategies/-/typeorm-naming-strategies-2.0.0.tgz#c7c10bc768ddce2592ef9ad4d2dca55fd5fa6ad6" integrity sha512-nsJ5jDjhBBEG6olFmxojkO4yrW7hEv38sH7ZXWWx9wnDoo9uaoH/mo2mBYAh/VKgwoFHBLu+CYxGmzXz2GUMcA== -typeorm@^0.2.31: - version "0.2.31" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.31.tgz#82b8a1b233224f81c738f53b0380386ccf360917" - integrity sha512-dVvCEVHH48DG0QPXAKfo0l6ecQrl3A8ucGP4Yw4myz4YEDMProebTQo8as83uyES+nrwCbu3qdkL4ncC2+qcMA== +typeorm@^0.2.32: + version "0.2.32" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.32.tgz#544dbfdfe0cd0887548d9bcbd28527ea4f4b3c9b" + integrity sha512-LOBZKZ9As3f8KRMPCUT2H0JZbZfWfkcUnO3w/1BFAbL/X9+cADTF6bczDGGaKVENJ3P8SaKheKmBgpt5h1x+EQ== dependencies: - "@sqltools/formatter" "1.2.2" + "@sqltools/formatter" "^1.2.2" app-root-path "^3.0.0" - buffer "^5.5.0" + buffer "^6.0.3" chalk "^4.1.0" cli-highlight "^2.1.10" - debug "^4.1.1" + debug "^4.3.1" dotenv "^8.2.0" glob "^7.1.6" - js-yaml "^3.14.0" + js-yaml "^4.0.0" mkdirp "^1.0.4" reflect-metadata "^0.1.13" sha.js "^2.4.11" - tslib "^1.13.0" + tslib "^2.1.0" xml2js "^0.4.23" - yargonaut "^1.1.2" - yargs "^16.0.3" + yargonaut "^1.1.4" + yargs "^16.2.0" + zen-observable-ts "^1.0.0" typescript-service@^2.0.3: version "2.0.3" @@ -9021,7 +9052,7 @@ yamljs@0.3.0: argparse "^1.0.7" glob "^7.0.5" -yargonaut@^1.1.2: +yargonaut@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c" integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== @@ -9060,7 +9091,7 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.0.0, yargs@^16.0.3, yargs@^16.1.1, yargs@^16.2.0: +yargs@^16.0.0, yargs@^16.1.1, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -9077,3 +9108,16 @@ yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zen-observable-ts@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz#30d1202b81d8ba4c489e3781e8ca09abf0075e70" + integrity sha512-KmWcbz+9kKUeAQ8btY8m1SsEFgBcp7h/Uf3V5quhan7ZWdjGsf0JcGLULQiwOZibbFWnHkYq8Nn2AZbJabovQg== + dependencies: + "@types/zen-observable" "^0.8.2" + zen-observable "^0.8.15" + +zen-observable@^0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==