UNPKG

@tokamak-network/thanos-sdk

Version:
98 lines 4.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateWithdrawalMessageUsingRecept = exports.calculateWithdrawalMessage = exports.migratedWithdrawalGasLimit = exports.hashMessageHash = exports.hashLowLevelMessage = void 0; const core_utils_1 = require("@tokamak-network/core-utils"); const ethers_1 = require("ethers"); const utils_1 = require("ethers/lib/utils"); const interfaces_1 = require("../interfaces"); const { hexDataLength } = ethers_1.utils; const RELAY_CONSTANT_OVERHEAD = ethers_1.BigNumber.from(200000); const RELAY_PER_BYTE_DATA_COST = ethers_1.BigNumber.from(16); const MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR = ethers_1.BigNumber.from(64); const MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR = ethers_1.BigNumber.from(63); const RELAY_CALL_OVERHEAD = ethers_1.BigNumber.from(40000); const RELAY_RESERVED_GAS = ethers_1.BigNumber.from(40000); const RELAY_GAS_CHECK_BUFFER = ethers_1.BigNumber.from(5000); const RELAY_GAS_CHECK_BUFFER_INCLUDING_APPROVAL = ethers_1.BigNumber.from(40000); const hashLowLevelMessage = (message) => { return (0, core_utils_1.hashWithdrawal)(message.messageNonce, message.sender, message.target, message.value, message.minGasLimit, message.message); }; exports.hashLowLevelMessage = hashLowLevelMessage; const hashMessageHash = (messageHash) => { const data = ethers_1.ethers.utils.defaultAbiCoder.encode(['bytes32', 'uint256'], [messageHash, ethers_1.ethers.constants.HashZero]); return ethers_1.ethers.utils.keccak256(data); }; exports.hashMessageHash = hashMessageHash; const migratedWithdrawalGasLimit = (data, chainID) => { const dataCost = ethers_1.BigNumber.from(hexDataLength(data)).mul(RELAY_PER_BYTE_DATA_COST); let overhead; if (chainID === 420) { overhead = ethers_1.BigNumber.from(200000); } else { const relayGasBuffer = Object.values(interfaces_1.L1ChainID).includes(chainID) ? RELAY_GAS_CHECK_BUFFER : RELAY_GAS_CHECK_BUFFER_INCLUDING_APPROVAL; const dynamicOverhead = MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR.mul(1000000).div(MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR); overhead = RELAY_CONSTANT_OVERHEAD.add(dynamicOverhead) .add(RELAY_CALL_OVERHEAD) .add(RELAY_RESERVED_GAS) .add(relayGasBuffer); } let minGasLimit = dataCost.add(overhead); if (minGasLimit.gt(25000000)) { minGasLimit = ethers_1.BigNumber.from(25000000); } return minGasLimit; }; exports.migratedWithdrawalGasLimit = migratedWithdrawalGasLimit; const calculateWithdrawalMessage = (log) => { if (typeof log.topics[1] === 'undefined') { throw new Error('"nonce" undefined'); } const messageNonce = ethers_1.BigNumber.from(log.topics[1]); if (typeof log.topics[2] === 'undefined') { throw new Error('"sender" undefined'); } const sender = log.topics[2].substring(26); if (typeof log.topics[3] === 'undefined') { throw new Error(`"target" undefined`); } const target = log.topics[3].substring(26); const data = log.data; if (data.length < 320) { throw new Error('Bad data'); } const value = ethers_1.BigNumber.from((0, utils_1.hexDataSlice)(data, 0, 32)); const minGasLimit = ethers_1.BigNumber.from((0, utils_1.hexDataSlice)(data, 32, 64)); const dataOffset = ethers_1.BigNumber.from((0, utils_1.hexDataSlice)(data, 64, 96)).toNumber(); const withdrawalHash = (0, utils_1.hexDataSlice)(data, 96, 128); const dataLength = ethers_1.BigNumber.from((0, utils_1.hexDataSlice)(data, dataOffset, dataOffset + 32)).toNumber(); const message = (0, utils_1.hexDataSlice)(data, dataOffset + 32, dataOffset + 32 + dataLength); return { messageNonce, sender: (0, core_utils_1.add0x)(sender), target: (0, core_utils_1.add0x)(target), value, minGasLimit, message, withdrawalHash, l2BlockNumber: log.blockNumber, }; }; exports.calculateWithdrawalMessage = calculateWithdrawalMessage; const calculateWithdrawalMessageUsingRecept = (txReceipt) => { if (txReceipt.status !== 1) { return undefined; } let withdrawalMessage; txReceipt.logs.forEach((log) => { if (log.topics[0] === ethers_1.ethers.utils.id('MessagePassed(uint256,address,address,uint256,uint256,bytes,bytes32)')) { withdrawalMessage = (0, exports.calculateWithdrawalMessage)(log); } }); return withdrawalMessage; }; exports.calculateWithdrawalMessageUsingRecept = calculateWithdrawalMessageUsingRecept; //# sourceMappingURL=message-utils.js.map