UNPKG

@hyperlane-xyz/utils

Version:

General utilities and types for the Hyperlane network

64 lines 2.36 kB
import { ethers, utils } from 'ethers'; import { addressToBytes32 } from './addresses.js'; import { fromHexString, toHexString } from './strings.js'; /** * JS Implementation of solidity/contracts/libs/Message.sol#formatMessage * @returns Hex string of the packed message */ export const formatMessage = (version, nonce, originDomain, senderAddr, destinationDomain, recipientAddr, body) => { senderAddr = addressToBytes32(senderAddr); recipientAddr = addressToBytes32(recipientAddr); return ethers.utils.solidityPack(['uint8', 'uint32', 'uint32', 'bytes32', 'uint32', 'bytes32', 'bytes'], [ version, nonce, originDomain, senderAddr, destinationDomain, recipientAddr, body, ]); }; /** * Get ID given message bytes * @param message Hex string of the packed message (see formatMessage) * @returns Hex string of message id */ export function messageId(message) { return ethers.utils.solidityKeccak256(['bytes'], [message]); } /** * Parse a serialized Hyperlane message from raw bytes. * * @param message * @returns */ export function parseMessage(message) { const VERSION_OFFSET = 0; const NONCE_OFFSET = 1; const ORIGIN_OFFSET = 5; const SENDER_OFFSET = 9; const DESTINATION_OFFSET = 41; const RECIPIENT_OFFSET = 45; const BODY_OFFSET = 77; const buf = Buffer.from(utils.arrayify(message)); const version = buf.readUint8(VERSION_OFFSET); const nonce = buf.readUInt32BE(NONCE_OFFSET); const origin = buf.readUInt32BE(ORIGIN_OFFSET); const sender = utils.hexlify(buf.subarray(SENDER_OFFSET, DESTINATION_OFFSET)); const destination = buf.readUInt32BE(DESTINATION_OFFSET); const recipient = utils.hexlify(buf.subarray(RECIPIENT_OFFSET, BODY_OFFSET)); const body = utils.hexlify(buf.subarray(BODY_OFFSET)); return { version, nonce, origin, sender, destination, recipient, body }; } export function parseWarpRouteMessage(messageBody) { const RECIPIENT_OFFSET = 0; const AMOUNT_OFFSET = 32; const buf = fromHexString(messageBody); const recipient = toHexString(buf.subarray(RECIPIENT_OFFSET, RECIPIENT_OFFSET + 32)); const amount = BigInt(toHexString(buf.subarray(AMOUNT_OFFSET, AMOUNT_OFFSET + 32))); return { recipient, amount, }; } //# sourceMappingURL=messages.js.map