@tokamak-network/thanos-sdk
Version:
Tools for working with Thanos
98 lines • 4.63 kB
JavaScript
;
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