UNPKG

@flarenetwork/flare-stake-tool

Version:
106 lines 4.48 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.waitFinalizeDefaults = void 0; exports.saveUnsignedEvmTx = saveUnsignedEvmTx; exports.readUnsignedEvmTx = readUnsignedEvmTx; exports.readSignedEvmTx = readSignedEvmTx; exports.waitFinalize3Factory = waitFinalize3Factory; exports.getWeb3Contract = getWeb3Contract; exports.getAbi = getAbi; exports.waitFinalize = waitFinalize; const fs_1 = __importDefault(require("fs")); const forDefi_1 = require("../constants/forDefi"); const utils_1 = require("../utils"); function saveUnsignedEvmTx(unsignedTx, id) { const fname = `${forDefi_1.forDefiDirectory}/${forDefi_1.forDefiUnsignedTxnDirectory}/${id}.unsignedTx.json`; if (fs_1.default.existsSync(fname)) { throw new Error(`unsignedTx file ${fname} already exists`); } const serialization = JSON.stringify(unsignedTx, null, 2); fs_1.default.mkdirSync(`${forDefi_1.forDefiDirectory}/${forDefi_1.forDefiUnsignedTxnDirectory}`, { recursive: true }); fs_1.default.writeFileSync(fname, serialization); } function readUnsignedEvmTx(id) { const fname = `${forDefi_1.forDefiDirectory}/${forDefi_1.forDefiUnsignedTxnDirectory}/${id}.unsignedTx.json`; if (!fs_1.default.existsSync(fname)) { throw new Error(`unsignedTx file ${fname} does not exist`); } const serialization = fs_1.default.readFileSync(fname).toString(); return JSON.parse(serialization); } function readSignedEvmTx(id) { const fname = `${forDefi_1.forDefiDirectory}/${forDefi_1.forDefiSignedTxnDirectory}/${id}.signedTx.json`; if (!fs_1.default.existsSync(fname)) { throw new Error(`signedTx file ${fname} does not exist`); } const serialization = fs_1.default.readFileSync(fname).toString(); const resp = JSON.parse(serialization); if (!resp.signature) { throw new Error(`unsignedTx file ${fname} does not contain signature`); } return resp; } function waitFinalize3Factory(web3) { return async function (address, func, delay = 1000, test = false) { let totalDelay = 0; const nonce = await web3.eth.getTransactionCount(address); const result = await func(); const backoff = 1.5; let cnt = 0; while ((await web3.eth.getTransactionCount(address)) === nonce) { // if test is enabled, it will skip the timeout as it was getting stuck here if (!test) await new Promise((resolve) => { setTimeout(resolve, delay); }); if (cnt < 8) { totalDelay += delay; delay = Math.floor(delay * backoff); cnt++; } else { throw new Error(`Response timeout after ${totalDelay}ms`); } console.log(`Delay backoff ${delay} (${cnt})`); } return result; }; } function getWeb3Contract(web3, address, abi) { return new web3.eth.Contract(abi, address); } function getAbi(abiPath) { if (!fs_1.default.existsSync(abiPath)) { throw new Error(`ABI file not found: ${abiPath}`); } let abi = JSON.parse(fs_1.default.readFileSync(abiPath).toString()); if (abi && typeof abi === "object" && "abi" in abi) { abi = abi.abi; } return abi; } function waitFinalize(web3, options = exports.waitFinalizeDefaults) { return async (address, func) => { const nonce = await web3.eth.getTransactionCount(address); const res = await func(); while ((await web3.eth.getTransactionCount(address)) === nonce) { await (0, utils_1.sleepms)(options.sleepMS); } for (let i = 0; i < options.retries; i++) { const block = await web3.eth.getBlockNumber(); while ((await web3.eth.getBlockNumber()) - block < options.extraBlocks) { await (0, utils_1.sleepms)(options.sleepMS); } // only end if the nonce didn't revert (and repeat up to 3 times) if ((await web3.eth.getTransactionCount(address)) > nonce) break; console.warn(`Nonce reverted after ${i + 1} retries, retrying again...`); } return res; }; } exports.waitFinalizeDefaults = { extraBlocks: 2, retries: 3, sleepMS: 1000 }; //# sourceMappingURL=utils.js.map