Skip to content

Commit

Permalink
create job unlock, lock for mina network
Browse files Browse the repository at this point in the history
  • Loading branch information
Sotatek-MinhVu committed Jan 2, 2024
1 parent 9fd4afa commit aff3797
Show file tree
Hide file tree
Showing 11 changed files with 346 additions and 163 deletions.
20 changes: 14 additions & 6 deletions ecosystem.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,24 @@ module.exports = {
script: 'yarn start',
},
{
name: `mina-bridge-product-submitter-${process.env.NODE_ENV}`,
script: 'yarn console product-submitter',
name: `evm-bridge-crawler-${process.env.NODE_ENV}`,
script: 'yarn console crawl-eth-bridge-contract',
},
{
name: `mina-bridge-product-crawler-provider-${process.env.NODE_ENV}`,
script: 'yarn console provider',
name: `evm-sender-eth-bridge-unlock-${process.env.NODE_ENV}`,
script: 'yarn console sender-eth-bridge-unlock',
},
{
name: `mina-bridge-product-crawler-consumer-${process.env.NODE_ENV}`,
script: 'yarn console consumer',
name: `mina-bridge-crawler-${process.env.NODE_ENV}`,
script: 'yarn console crawl-mina-bridge-contract',
},
{
name: `mina-token-crawler-${process.env.NODE_ENV}`,
script: 'yarn console crawl-mina-token-contract',
},
{
name: `mina-sender-bridge-unlock-${process.env.NODE_ENV}`,
script: 'yarn console sender-mina-bridge-unlock',
}
],
};
2 changes: 2 additions & 0 deletions src/constants/env.constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,6 @@ export enum EEnvKey {
ADMIN_ADDRESS = 'ADMIN_ADDRESS',
NUMBER_OF_BLOCK_PER_JOB = 'NUMBER_OF_BLOCK_PER_JOB',
ADMIN_MESSAGE_FOR_SIGN = 'ADMIN_MESSAGE_FOR_SIGN',
GASFEEMINA = 'GASFEEMINA',
SIGNER_MINA_PRIVATE_KEY = 'SIGNER_MINA_PRIVATE_KEY'
}
5 changes: 3 additions & 2 deletions src/database/repositories/event-log.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,14 @@ export class EventLogRepository extends BaseRepository<EventLog> {
.getOne();
}

public async updateStatusAndRetryEvenLog(id: number, retry: number, status: EEventStatus, errorDetail?: EError ) {
public async updateStatusAndRetryEvenLog(id: number, retry: number, status: EEventStatus, errorDetail?, txHashUnlock? ) {
return this.createQueryBuilder(`${this.alias}`)
.update(EventLog)
.set({
status,
retry,
errorDetail
errorDetail,
txHashUnlock
})
.where(`${this.alias}.id = :id`, { id })
.execute()
Expand Down
43 changes: 34 additions & 9 deletions src/modules/crawler/bridgeSC.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 20 additions & 3 deletions src/modules/crawler/crawler.console.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import { EEnvKey } from '@constants/env.constant';
import { BlockchainEVMCrawler } from './crawler.evmbridge';
import { SenderEVMBridge } from './sender.evmbridge';
import { SenderMinaBridge } from './sender.minabridge';
import { BlockchainMinaCrawler } from './crawler.minabridge';
import { SCBridgeMinaCrawler } from './crawler.minabridge';
import { SCTokenMinaCrawler } from './crawler.minatoken';
import { sleep } from '@shared/utils/promise';

@Console()
Expand All @@ -15,7 +16,8 @@ export class CrawlerConsole {
constructor(
private readonly configService: ConfigService,
private blockchainEVMCrawler: BlockchainEVMCrawler,
private blockchainMinaCrawler: BlockchainMinaCrawler,
private scBridgeMinaCrawler: SCBridgeMinaCrawler,
private scTokenMinaCrawler: SCTokenMinaCrawler,
private senderEVMBridge: SenderEVMBridge,
private senderMinaBridge: SenderMinaBridge,

Expand Down Expand Up @@ -61,7 +63,22 @@ export class CrawlerConsole {
async handleCrawlMinaBridge() {
try {
while (true) {
this.blockchainMinaCrawler.handleEventCrawlBlock();
this.scBridgeMinaCrawler.handleEventCrawlBlock();
await sleep(15);
}
} catch (error) {
console.log(error);
}
}

@Command({
command: 'crawl-mina-token-contract',
description: 'crawl Mina Token Contract',
})
async handleCrawlMinaToken() {
try {
while (true) {
this.scTokenMinaCrawler.handleEventCrawlBlock();
await sleep(15);
}
} catch (error) {
Expand Down
110 changes: 21 additions & 89 deletions src/modules/crawler/crawler.minabridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,51 +7,44 @@ import { EEnvKey } from '@constants/env.constant';
import { CrawlContractRepository } from 'database/repositories/crawl-contract.repository';
import { CrawlContract, EventLog } from '@modules/crawler/entities'

import { Mina, PublicKey, SmartContract, UInt32, fetchAccount, PrivateKey, fetchLastBlock } from 'o1js';
import { Mina, PublicKey, UInt32 } from 'o1js';
import { Bridge } from './bridgeSC.js';
import dayjs from'dayjs';
import { Token } from './erc20.js';

@Injectable()
export class BlockchainMinaCrawler {
// private readonly numberOfBlockPerJob: number;
export class SCBridgeMinaCrawler {
constructor(
private readonly configService: ConfigService,
private readonly dataSource: DataSource,
// private loggerService: LoggerService,
private readonly crawlContractRepository: CrawlContractRepository,
) {
// this.numberOfBlockPerJob = +this.configService.get<number>(EEnvKey.NUMBER_OF_BLOCK_PER_JOB);

}
// private logger = this.loggerService.getLogger('CrawlContractEVMBridge');
public async handleEventCrawlBlock() {
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const {startBlockNumber, toBlock} = await this.getFromToBlock();
const {startBlockNumber, toBlock} = await this.getFromToBlock();

const Network = Mina.Network({
mina: 'https://api.minascan.io/node/berkeley/v1/graphql',
mina: this.configService.get(EEnvKey.MINA_BRIDGE_RPC_OPTIONS),
archive: 'https://api.minascan.io/archive/berkeley/v1/graphql/',
});
Mina.setActiveInstance(Network);
let zkappAddress = PublicKey.fromBase58(this.configService.get(EEnvKey.MINA_BRIDGE_CONTRACT_ADDRESS));
const zkapp = new Bridge(zkappAddress);
let zkAppToken = PublicKey.fromBase58(this.configService.get(EEnvKey.MINA_TOKEN_BRIDGE_ADDRESS));

let zkAppToke = new Token(zkAppToken);
const zkapp = new Bridge(zkappAddress, zkAppToke.token.id);
const events = await zkapp.fetchEvents(UInt32.from(Number(startBlockNumber) + 1));
const time = await this.getDateTimeByBlock(26164);
console.log({time});
console.log({events});

for (const event of events) {
console.log({event});
console.log("global", event.globalSlot.value.toString());
console.log("global", event.event.transactionInfo);

switch (event.type) {
case 'Lock':
// await this.handlerLockEvent(event, queryRunner);
break;
case 'Unlock':
// await this.handlerUnLockEvent(event, queryRunner);
await this.handlerUnLockEvent(event, queryRunner);
break;
default:
continue;
Expand All @@ -61,7 +54,7 @@ export class BlockchainMinaCrawler {
`[handleCrawlMinaBridge] Crawled from============================= ${startBlockNumber}`,
);
if(events.length > 0) {
// await this.updateLatestBlockCrawl(Number(events.reverse()[0].blockHeight.value), queryRunner)
await this.updateLatestBlockCrawl(Number(events.reverse()[0].blockHeight.toString()), queryRunner)
}
return await queryRunner.commitTransaction();

Expand All @@ -73,50 +66,22 @@ export class BlockchainMinaCrawler {
}
}

private async handlerLockEvent(
event,
queryRunner: QueryRunner,
) {
console.log("====event", event.event.data.amount1.toString());
console.log("====event", event.event.data.amount2.toString());
console.log("====event", event.event.transactionInfo);
console.log("====blockNumber", event.blockHeight.toString());

const eventUnlock = {
senderAddress: "event.returnValues.locker",
amountFrom: event.event.data.amount1.toString(),
tokenFromAddress: "event.returnValues.token",
networkFrom: ENetworkName.MINA,
networkReceived: ENetworkName.ETH,
tokenFromName: "event.returnValues.tokenName",
tokenReceivedAddress: this.configService.get(EEnvKey.ETH_TOKEN_BRIDGE_ADDRESS),
txHashLock: event.event.transactionInfo.transactionHash,
receiveAddress: "event.returnValues.receipt",
blockNumber: event.blockHeight.toString(),
event: EEventName.LOCK,
returnValues: JSON.stringify(event),
status: EEventStatus.WAITING,
retry: 0,
}
await queryRunner.manager.save(EventLog, eventUnlock);
}

private async handlerUnLockEvent(
event,
queryRunner: QueryRunner,
) {

let existLockTx = await queryRunner.manager.findOne(EventLog, {
where: { txHashLock: event.returnValues.hash },
where: { id: event.event.data.id.toString() },
})

await queryRunner.manager.update(EventLog, existLockTx.id, {
status: EEventStatus.DONE,
txHashUnlock: event.transactionHash,
amountReceived: event.returnValues.amount,
tokenReceivedAddress: event.returnValues.token,
protocolFee: event.returnValues.fee,
tokenReceivedName: "ETH",
txHashUnlock: event.event.transactionInfo.transactionHash,
amountReceived: event.event.data.amount.toString(),
tokenReceivedAddress: event.event.data.tokenAddress.toBase58(),
// protocolFee: event.event.data.fee.toString(),
tokenReceivedName: "WETH",
});
}

Expand All @@ -131,10 +96,10 @@ export class BlockchainMinaCrawler {
}

private async getFromToBlock(): Promise<{startBlockNumber, toBlock}> {
// const latestBlock = await fetchLastBlock('https://api.minascan.io/node/berkeley/v1/graphql');
let toBlock;
let currentCrawledBlock = await this.crawlContractRepository.findOne({
where: { networkName: ENetworkName.MINA },
where: { networkName: ENetworkName.MINA,
contractAddress: this.configService.get(EEnvKey.MINA_BRIDGE_CONTRACT_ADDRESS)},
});
let startBlockNumber = Number(this.configService.get(EEnvKey.MINA_BRIDGE_START_BLOCK))

Expand All @@ -148,40 +113,7 @@ export class BlockchainMinaCrawler {
} else {
startBlockNumber = currentCrawledBlock.latestBlock;
}

// if (latestBlock >= Number(startBlockNumber) + Number(this.numberOfBlockPerJob)) {
// toBlock = Number(startBlockNumber) + this.numberOfBlockPerJob;
// }

return {startBlockNumber, toBlock }
}

private async getDateTimeByBlock(blockNumber: number) {
const endpoint = 'https://berkeley.graphql.minaexplorer.com/'; // Replace with your GraphQL endpoint
const query = `
query {
transaction(query: {blockHeight: ${blockNumber}}) {
block {
dateTime
}
}
}
`;
const response = await fetch(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
query,
}),
});

const result = await response.json();
const dateTime = dayjs(result.data.transaction.block.dateTime);

// Convert DateTime to Unix timestamp in seconds
const unixTimestampInSeconds = Math.floor(dateTime.valueOf() / 1000);
return unixTimestampInSeconds
}
}
Loading

0 comments on commit aff3797

Please sign in to comment.