@flarenetwork/flare-stake-tool
Version:
Utilities for staking on the Flare network
105 lines • 4.43 kB
JavaScript
;
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();
let 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) => {
let nonce = await web3.eth.getTransactionCount(address);
let 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