Skip to content

Commit

Permalink
feat: add wiston to ton-to-cw
Browse files Browse the repository at this point in the history
  • Loading branch information
meomeocoj committed Aug 31, 2024
1 parent aa04a2e commit f21a4cf
Show file tree
Hide file tree
Showing 9 changed files with 84 additions and 30 deletions.
1 change: 1 addition & 0 deletions packages/cw-to-ton/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"baseUrl": ".",
"outDir": "build",
"declaration": true,
"declarationMap": true,
"rootDir": ".",
"paths": {
"@src/*": ["src/*"],
Expand Down
2 changes: 1 addition & 1 deletion packages/orchestrator/src/config/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: [
Expand Down
9 changes: 7 additions & 2 deletions packages/orchestrator/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion packages/ton-to-cw/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
18 changes: 11 additions & 7 deletions packages/ton-to-cw/src/block-processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -134,15 +136,17 @@ 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({
blockHeaderProof: blockHeader.headerProof.toString("hex"),
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) {
Expand All @@ -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`
);
}
Expand Down Expand Up @@ -208,7 +212,7 @@ export default class TonBlockProcessor {
vdata,
});

console.log(
this.logger.info(
`Updated keyblock ${rawBlockData.id.seqno} with new validator set successfully`
);
}
Expand Down Expand Up @@ -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`
Expand Down
26 changes: 21 additions & 5 deletions packages/ton-to-cw/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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
);
Expand All @@ -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(
Expand Down Expand Up @@ -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);

Expand Down
19 changes: 16 additions & 3 deletions packages/ton-to-cw/src/start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand All @@ -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(
Expand Down Expand Up @@ -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()
Expand Down
35 changes: 24 additions & 11 deletions packages/ton-to-cw/src/tx-processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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,
Expand Down Expand Up @@ -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 {
Expand All @@ -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;
}
Expand All @@ -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 {
Expand All @@ -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;
}
Expand All @@ -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`
);
}
}
1 change: 1 addition & 0 deletions packages/ton-to-cw/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"baseUrl": ".",
"outDir": "dist",
"declaration": true,
"declarationMap": true,
"rootDir": "src",
"strict": false,
"noFallthroughCasesInSwitch": false,
Expand Down

0 comments on commit f21a4cf

Please sign in to comment.