UNPKG

@nori-zk/mina-token-bridge

Version:

Nori ethereum state settelment and nETH token bridge zkApp

67 lines 3.03 kB
import 'dotenv/config'; import { appendFileSync } from 'fs'; import { Mina, PublicKey, fetchAccount } from 'o1js'; import { Logger, LogPrinter } from 'esm-iso-logger'; import { NoriTokenBridge } from '../NoriTokenBridge.js'; const logger = new Logger('PollDepositsRoot'); new LogPrinter('NoriTokenBridge'); const logFile = process.env.POLL_LOG_FILE || 'pollDepositsRoot.log'; function logToFile(msg) { appendFileSync(logFile, `[${new Date().toISOString()}] ${msg}\n`); } const possibleNetworkUrl = process.env.MINA_RPC_NETWORK_URL; const possibleNetwork = process.env.MINA_NETWORK; const possibleBridgeAddressBase58 = process.env.NORI_MINA_TOKEN_BRIDGE_ADDRESS; const intervalMs = Number(process.env.POLL_INTERVAL_MS || 10000); const issues = []; if (!possibleNetworkUrl) issues.push('Missing required env: MINA_RPC_NETWORK_URL'); if (!possibleNetwork) issues.push('Missing required env: MINA_NETWORK'); if (!possibleBridgeAddressBase58) issues.push('Missing required env: NORI_MINA_TOKEN_BRIDGE_ADDRESS'); let possibleBridgeAddress; if (possibleBridgeAddressBase58) { try { possibleBridgeAddress = PublicKey.fromBase58(possibleBridgeAddressBase58); } catch (e) { issues.push(`NORI_MINA_TOKEN_BRIDGE_ADDRESS is not a valid public key: ${e.message}`); } } if (issues.length) { logger.fatal(['pollDepositsRoot encountered issues:', ...issues.map((i, idx) => `\t${idx + 1}: ${i}`)].join('\n')); process.exit(1); } function isString(val) { return val !== undefined; } function isPublicKey(val) { return val !== undefined; } if (!isString(possibleNetworkUrl) || !isString(possibleNetwork) || !isPublicKey(possibleBridgeAddress)) { logger.fatal('Internal error: required values undefined after validation.'); process.exit(1); } const networkUrl = possibleNetworkUrl; const networkId = possibleNetwork === 'mainnet' ? 'mainnet' : 'testnet'; const bridgeAddress = possibleBridgeAddress; const Network = Mina.Network({ networkId, mina: networkUrl }); Mina.setActiveInstance(Network); const tokenBridge = new NoriTokenBridge(bridgeAddress); let lastValue; async function poll() { await fetchAccount({ publicKey: bridgeAddress }); const value = tokenBridge.latestVerifiedContractDepositsRoot.get().toBigInt().toString(); if (lastValue === undefined) { logger.log(`initial value: ${value}`); logToFile(`initial value: ${value}`); lastValue = value; } else if (value !== lastValue) { logger.log(`CHANGED: ${lastValue} -> ${value}`); logToFile(`CHANGED: ${lastValue} -> ${value}`); lastValue = value; } } logger.log(`Polling ${possibleBridgeAddressBase58} every ${intervalMs}ms... (log file: ${logFile})`); logToFile(`Polling ${possibleBridgeAddressBase58} every ${intervalMs}ms...`); poll().catch((err) => { logger.error(`poll error: ${String(err)}`); }); setInterval(() => { poll().catch((err) => { logger.error(`poll error: ${String(err)}`); }); }, intervalMs); //# sourceMappingURL=pollDepositsRoot.js.map