Skip to content

Instantly share code, notes, and snippets.

@pjt3591oo
Created June 8, 2024 00:46
Show Gist options
  • Save pjt3591oo/d9a1a293b00f2bb1e3e4a45707c9828d to your computer and use it in GitHub Desktop.
Save pjt3591oo/d9a1a293b00f2bb1e3e4a45707c9828d to your computer and use it in GitHub Desktop.
deposit-bridge log
import { l1Provider } from "./common/messenger";
// withdraw message for prove withdraw
// withdraw message for finalize withdraw
async function main(tx: string) {
// L1: L1StandardBridge.deposiERC20To => L1CrossDomainMessenger.sendMessage => OptimismPortal.depositERC20Tranaction
// L2: L2CrossDomainMessenger.relayMessage => L2StandardBridge.finalizeBridgeERC20
/*
* 이벤트 호출 순서
{
transactionIndex: 0,
blockNumber: 40795,
transactionHash: '0x0efce44826e8ac4868f33f78583252c04ca8ef24d9d02abb1bf44a23872f6561',
address: '0x2910E325cf29dd912E3476B61ef12F49cb931096', // ERC20: OptmismPortal은 safeTransferFrom을 이용하여 승인된 수량만큼 토큰을 가져온다.
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', // event signature: Transfer (index_topic_1 address from, index_topic_2 address to, uint256 value)
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33', // index_topic_1 address from
'0x000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b090' // index_topic_2 address to
],
data: '0x0000000000000000000000000000000000000000000000008ac7230489e80000',
logIndex: 0,
blockHash: '0x1209bc83e0217b28d1c40cdae64b10c812094c527aee22f2b501fe19c335bcf3'
}
{
transactionIndex: 0,
blockNumber: 40795,
transactionHash: '0x0efce44826e8ac4868f33f78583252c04ca8ef24d9d02abb1bf44a23872f6561',
address: '0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090', // L1StandardBridgeProxy
topics: [
'0x718594027abd4eaed59f95162563e0cc6d0e8d5b86b1c7be8b1b0ac3343d0396',
'0x0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb931096',
'0x000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 1,
blockHash: '0x1209bc83e0217b28d1c40cdae64b10c812094c527aee22f2b501fe19c335bcf3'
}
{
transactionIndex: 0,
blockNumber: 40795,
transactionHash: '0x0efce44826e8ac4868f33f78583252c04ca8ef24d9d02abb1bf44a23872f6561',
address: '0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090', // L1StandardBridgeProxy
topics: [
'0x7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf',
'0x0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb931096',
'0x000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 2,
blockHash: '0x1209bc83e0217b28d1c40cdae64b10c812094c527aee22f2b501fe19c335bcf3'
}
{
transactionIndex: 0,
blockNumber: 40795,
transactionHash: '0x0efce44826e8ac4868f33f78583252c04ca8ef24d9d02abb1bf44a23872f6561',
address: '0x6509f2a854BA7441039fCE3b959d5bAdd2fFCFCD', // OptimismPortalProxy
topics: [
'0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32',
'0x000000000000000000000000e898a42ee3ac477c46dd6c912e7af795d44464e6',
'0x0000000000000000000000004200000000000000000000000000000000000007',
'0x0000000000000000000000000000000000000000000000000000000000000000'
],
data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000024d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004698800d764ad0b0001000000000000000000000000000000000000000000000000000000000019000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b09000000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001040166a07a000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb93109600000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
logIndex: 3,
blockHash: '0x1209bc83e0217b28d1c40cdae64b10c812094c527aee22f2b501fe19c335bcf3'
}
{
transactionIndex: 0,
blockNumber: 40795,
transactionHash: '0x0efce44826e8ac4868f33f78583252c04ca8ef24d9d02abb1bf44a23872f6561',
address: '0xd787A42Ee3ac477c46Dd6C912e7af795D44453d5', // L1CrossDomainMessengerProxy
topics: [
'0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a',
'0x0000000000000000000000004200000000000000000000000000000000000010'
],
data: '0x000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b09000000000000000000000000000000000000000000000000000000000000000800001000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040166a07a000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb93109600000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
logIndex: 4,
blockHash: '0x1209bc83e0217b28d1c40cdae64b10c812094c527aee22f2b501fe19c335bcf3'
}
{
transactionIndex: 0,
blockNumber: 40795,
transactionHash: '0x0efce44826e8ac4868f33f78583252c04ca8ef24d9d02abb1bf44a23872f6561',
address: '0xd787A42Ee3ac477c46Dd6C912e7af795D44453d5', // L1CrossDomainMessengerProxy
topics: [
'0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546',
'0x000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b090'
],
data: '0x0000000000000000000000000000000000000000000000000000000000000000',
logIndex: 5,
blockHash: '0x1209bc83e0217b28d1c40cdae64b10c812094c527aee22f2b501fe19c335bcf3'
}
*/
const { logs } = await l1Provider.getTransactionReceipt(tx);
for (const log of logs) {
console.log(log);
}
}
main('0x0efce44826e8ac4868f33f78583252c04ca8ef24d9d02abb1bf44a23872f6561');
import { ethers } from "ethers";
import { getMessenger, l1Provider, l2Provider } from "./common/messenger";
import { TEST_EOAS } from "./common/eoa";
// withdraw message for prove withdraw
// withdraw message for finalize withdraw
async function main(tx: string) {
const from = TEST_EOAS[0];
const l1Wallet = new ethers.Wallet(from.privateKey, l1Provider);
const l2Wallet = new ethers.Wallet(from.privateKey, l2Provider);
const messenger = getMessenger(l1Wallet, l2Wallet);
/*
* deposit 호출 흐름
* L1: L1StandardBridge.deposiERC20To => L1CrossDomainMessenger.sendMessage => OptimismPortal.depositERC20Tranaction
* L2: L2CrossDomainMessenger.relayMessage => L2StandardBridge.finalizeBridgeERC20
L1에서 L2로 메시지를 보내기 위해 L1CrossDomainMessenger.sendMessage를 호출한다.
op-node는 sendMessage 이벤트를 감지하여 L2CrossDomainMessenger.relayMessage를 호출하는 tx를 생성한다.
*/
/*
op-node는 L1에서 L2로 메시지를 보내기 위해 L1CrossDomainMessenger.sendMessage를 호출한다.
sendMessage 이벤트를 통해 L2CrossDomainMessenger.relayMessage를 호출하는 tx를 생성한다.
data는 replayMessage를 호출하기 위한 데이터이다.
{
hash: '0xf382dfb8157ed6b82c1553ffbc87774368bed3488afdc534b4bb920093f911aa',
type: 126,
accessList: null,
blockHash: '0xd58a652ec7b60ebfb9418d45fc2b11a5a94ee3238440360d46ef72281e2d879a',
blockNumber: 176415,
transactionIndex: 1,
confirmations: 44,
from: '0xE898A42eE3AC477c46dd6C912E7aF795d44464E6',
gasPrice: BigNumber { _hex: '0x00', _isBigNumber: true },
gasLimit: BigNumber { _hex: '0x046988', _isBigNumber: true },
to: '0x4200000000000000000000000000000000000007', // // L2CrossDomainMessengerProxy
value: BigNumber { _hex: '0x00', _isBigNumber: true },
nonce: 27,
data: '0xd764ad0b000100000000000000000000000000000000000000000000000000000000001b000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b09000000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001040166a07a000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb93109600000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
r: '0x0000000000000000000000000000000000000000000000000000000000000000',
s: '0x0000000000000000000000000000000000000000000000000000000000000000',
v: 0,
creates: null,
chainId: 0,
wait: [Function (anonymous)]
}
*/
const l2Tx = await l2Provider.getTransaction(tx);
console.log('L1의 브릿지 이벤틀르 감지하여 파생된 L2 트랜잭션 정보');
console.log(l2Tx);
console.log('\n\n');
/*
relayMessage를 호출할 때 전달되는 인자
[
BigNumber {
_hex: '0x0100000000000000000000000000000000000000000000000000000000001b',
_isBigNumber: true
},
'0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090',
'0x4200000000000000000000000000000000000010',
BigNumber { _hex: '0x00', _isBigNumber: true },
BigNumber { _hex: '0x00', _isBigNumber: true },
'0x0166a07a000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb93109600000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
_nonce: BigNumber {
_hex: '0x0100000000000000000000000000000000000000000000000000000000001b',
_isBigNumber: true
},
_sender: '0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090',
_target: '0x4200000000000000000000000000000000000010', // L2StandardBridge: L2CrossDomainMessenger.relayMessage를 호출하면 _target에 해당하는 컨트랙트를 호출한다.
_value: BigNumber { _hex: '0x00', _isBigNumber: true },
_minGasLimit: BigNumber { _hex: '0x00', _isBigNumber: true },
_message: '0x0166a07a000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb93109600000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000'
]
*/
// // relayMessage를 호출할 때 전달되는 인자를 decode하여 출력
const decodeParseRelayMessage = messenger.contracts.l2.L2CrossDomainMessenger.interface.decodeFunctionData(
'relayMessage',
l2Tx.data
)
console.log('L2CrossDomainMessenger.relayMessage를 호출할 때 전달되는 인자정보')
console.log(decodeParseRelayMessage);
console.log('\n\n');
/*
[
'0x915B110e8cD64B91E67278965627E3baee9B53fe',
'0x2910E325cf29dd912E3476B61ef12F49cb931096',
'0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
'0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
BigNumber { _hex: '0x8ac7230489e80000', _isBigNumber: true },
'0x0000000000000000000000000000000000000000000000000000000000000000',
_localToken: '0x915B110e8cD64B91E67278965627E3baee9B53fe',
_remoteToken: '0x2910E325cf29dd912E3476B61ef12F49cb931096',
_from: '0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
_to: '0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
_amount: BigNumber { _hex: '0x8ac7230489e80000', _isBigNumber: true },
_extraData: '0x0000000000000000000000000000000000000000000000000000000000000000'
]
*/
const decodeParseL2StandardBridgeFinalizeBridgeERC20 = messenger.contracts.l2.L2StandardBridge.interface.decodeFunctionData(
'finalizeBridgeERC20',
decodeParseRelayMessage._message
)
console.log('L2StandardBridge.finalizeBridgeERC20를 호출할 때 전달되는 인자정보')
console.log(decodeParseL2StandardBridgeFinalizeBridgeERC20);
console.log('\n\n');
/*
// L2 토큰이 mint된다(이벤트는 transfer -> mint 순서로 발생)
{
transactionIndex: 1,
blockNumber: 176415,
transactionHash: '0xf382dfb8157ed6b82c1553ffbc87774368bed3488afdc534b4bb920093f911aa',
address: '0x915B110e8cD64B91E67278965627E3baee9B53fe', // ERC20
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', // transfer
'0x0000000000000000000000000000000000000000000000000000000000000000',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x0000000000000000000000000000000000000000000000008ac7230489e80000',
logIndex: 0,
blockHash: '0xd58a652ec7b60ebfb9418d45fc2b11a5a94ee3238440360d46ef72281e2d879a'
}
{
transactionIndex: 1,
blockNumber: 176415,
transactionHash: '0xf382dfb8157ed6b82c1553ffbc87774368bed3488afdc534b4bb920093f911aa',
address: '0x915B110e8cD64B91E67278965627E3baee9B53fe', // ERC20
topics: [
'0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885', // mint
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x0000000000000000000000000000000000000000000000008ac7230489e80000',
logIndex: 1,
blockHash: '0xd58a652ec7b60ebfb9418d45fc2b11a5a94ee3238440360d46ef72281e2d879a'
}
{
transactionIndex: 1,
blockNumber: 176415,
transactionHash: '0xf382dfb8157ed6b82c1553ffbc87774368bed3488afdc534b4bb920093f911aa',
address: '0x4200000000000000000000000000000000000010', // L2StandardBridge
topics: [
'0xb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89',
'0x0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb931096',
'0x000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 2,
blockHash: '0xd58a652ec7b60ebfb9418d45fc2b11a5a94ee3238440360d46ef72281e2d879a'
}
{
transactionIndex: 1,
blockNumber: 176415,
transactionHash: '0xf382dfb8157ed6b82c1553ffbc87774368bed3488afdc534b4bb920093f911aa',
address: '0x4200000000000000000000000000000000000010', // L2StandardBridge
topics: [
'0xd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd',
'0x000000000000000000000000915b110e8cd64b91e67278965627e3baee9b53fe',
'0x0000000000000000000000002910e325cf29dd912e3476b61ef12f49cb931096',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 3,
blockHash: '0xd58a652ec7b60ebfb9418d45fc2b11a5a94ee3238440360d46ef72281e2d879a'
}
{
transactionIndex: 1,
blockNumber: 176415,
transactionHash: '0xf382dfb8157ed6b82c1553ffbc87774368bed3488afdc534b4bb920093f911aa',
address: '0x4200000000000000000000000000000000000007', // L2CrossDomainMessengerProxy
topics: [
'0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c',
'0x1d37d78b46bab40717367e57b093035b5748e6ea7c79b80b387a75fc824cedd2'
],
data: '0x',
logIndex: 4,
blockHash: '0xd58a652ec7b60ebfb9418d45fc2b11a5a94ee3238440360d46ef72281e2d879a'
}
*/
const { logs } = await l2Provider.getTransactionReceipt(tx);
console.log('ETH Bridge 이벤트 로그정보')
for (const log of logs) {
console.log(log);
}
}
main('0xf382dfb8157ed6b82c1553ffbc87774368bed3488afdc534b4bb920093f911aa');
import { l1Provider } from "./common/messenger";
async function main(tx: string) {
/**
* 호출 흐름
* L1: L1StandardBridge.depositETHTo => L1CrossDomainMessenger.sendMessage => OptimismPortal.depositTranaction
* L2: L2CrossDomainMessenger.relayMessage => L2StandardBridge.finalizeBridgeETH
*/
/*
* 이벤트 호출 순서
{
transactionIndex: 0,
blockNumber: 38529,
transactionHash: '0xb6c350a4ae901c12e3edc7a4b171bc7a5cd500990cd2779891bd19c53a8f5e6b',
address: '0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090', // L1StandardBridgeProxy
topics: [
'0x35d79ab81f2b2017e19afb5c5571778877782d7a8786f5907f93b0f4702f4f23', // event sigranure: ETHDepositInitiated (index_topic_1 address from, index_topic_2 address to, uint256 amount, bytes extraData)
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33', // index_topic_1 address from
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33' // index_topic_2 address to
],
data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 0,
blockHash: '0xe667703903fd3d38c637e1645a8156a7fbcc89ab8b1645861c8cc5040e67238b'
}
{
transactionIndex: 0,
blockNumber: 38529,
transactionHash: '0xb6c350a4ae901c12e3edc7a4b171bc7a5cd500990cd2779891bd19c53a8f5e6b',
address: '0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090', // L1StandardBridgeProxy
topics: [
'0x2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5', // event sigranure: ETHBridgeInitiated (index_topic_1 address from, index_topic_2 address to, uint256 amount, bytes extraData)
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33', // index_topic_1 address from
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33' // index_topic_2 address to
],
data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 1,
blockHash: '0xe667703903fd3d38c637e1645a8156a7fbcc89ab8b1645861c8cc5040e67238b'
}
{
transactionIndex: 0,
blockNumber: 38529,
transactionHash: '0xb6c350a4ae901c12e3edc7a4b171bc7a5cd500990cd2779891bd19c53a8f5e6b',
address: '0x6509f2a854BA7441039fCE3b959d5bAdd2fFCFCD', // OptimismPortalProxy
topics: [
'0xb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32', // event sigranure: TransactionDeposited (index_topic_1 address from, index_topic_2 address to, index_topic_3 uint256 version, bytes opaqueData)
'0x000000000000000000000000e898a42ee3ac477c46dd6c912e7af795d44464e6', // index_topic_1 address from
'0x0000000000000000000000004200000000000000000000000000000000000007', // index_topic_2 address to
'0x0000000000000000000000000000000000000000000000000000000000000000' // index_topic_3 uint256 version
],
data: '0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020d0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000004658800d764ad0b0001000000000000000000000000000000000000000000000000000000000017000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b09000000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c41635f5fd00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
logIndex: 2,
blockHash: '0xe667703903fd3d38c637e1645a8156a7fbcc89ab8b1645861c8cc5040e67238b'
}
{
transactionIndex: 0,
blockNumber: 38529,
transactionHash: '0xb6c350a4ae901c12e3edc7a4b171bc7a5cd500990cd2779891bd19c53a8f5e6b',
address: '0xd787A42Ee3ac477c46Dd6C912e7af795D44453d5', // L1CrossDomainMessengerProxy
topics: [
'0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a', // event sigranure: SentMessage (index_topic_1 address target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)
'0x0000000000000000000000004200000000000000000000000000000000000010' // index_topic_1 address target
],
data: '0x000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b09000000000000000000000000000000000000000000000000000000000000000800001000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c41635f5fd00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
logIndex: 3,
blockHash: '0xe667703903fd3d38c637e1645a8156a7fbcc89ab8b1645861c8cc5040e67238b'
}
{
transactionIndex: 0,
blockNumber: 38529,
transactionHash: '0xb6c350a4ae901c12e3edc7a4b171bc7a5cd500990cd2779891bd19c53a8f5e6b',
address: '0xd787A42Ee3ac477c46Dd6C912e7af795D44453d5', // L1CrossDomainMessengerProxy
topics: [
'0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546', // event sigranure: SentMessageExtension1 (index_topic_1 address sender, uint256 value)
'0x000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b090' // index_topic_1 address sender
],
data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000',
logIndex: 4,
blockHash: '0xe667703903fd3d38c637e1645a8156a7fbcc89ab8b1645861c8cc5040e67238b'
}
*/
const { logs } = await l1Provider.getTransactionReceipt(tx);
for (const log of logs) {
console.log(log);
}
}
main('0xb6c350a4ae901c12e3edc7a4b171bc7a5cd500990cd2779891bd19c53a8f5e6b');
require('dotenv').config();
import { ethers } from "ethers";
import { getMessenger, l1Provider, l2Provider } from "./common/messenger";
import { TEST_EOAS } from "./common/eoa";
async function main(tx: string) {
const from = TEST_EOAS[0];
const l1Wallet = new ethers.Wallet(from.privateKey, l1Provider);
const l2Wallet = new ethers.Wallet(from.privateKey, l2Provider);
const messenger = getMessenger(l1Wallet, l2Wallet);
/**
* deposit 호출 흐름
* L1: L1StandardBridge.depositETHTo => L1CrossDomainMessenger.sendMessage => OptimismPortal.depositTranaction
* L2: L2CrossDomainMessenger.relayMessage => L2StandardBridge.finalizeBridgeETH
L1에서 L2로 메시지를 보내기 위해 L1CrossDomainMessenger.sendMessage를 호출한다.
op-node는 sendMessage 이벤트를 감지하여 L2CrossDomainMessenger.relayMessage를 호출하는 tx를 생성한다.
*/
/*
op-node는 L1에서 L2로 메시지를 보내기 위해 L1CrossDomainMessenger.sendMessage를 호출한다.
sendMessage 이벤트를 통해 L2CrossDomainMessenger.relayMessage를 호출하는 tx를 생성한다.
data는 replayMessage를 호출하기 위한 데이터이다.
{
hash: '0xc0b451761314611a2473866ce21f5ea1710ace624d3f55281485ed64c23de8a2',
type: 126,
accessList: null,
blockHash: '0x95d7065e02e93e52376c85280a33e198e1e8e22feaacbde842498ef36ec3c1d2',
blockNumber: 173769,
transactionIndex: 1,
confirmations: 485,
from: '0xE898A42eE3AC477c46dd6C912E7aF795d44464E6',
gasPrice: BigNumber { _hex: '0x00', _isBigNumber: true },
gasLimit: BigNumber { _hex: '0x046588', _isBigNumber: true },
to: '0x4200000000000000000000000000000000000007', // L2CrossDomainMessengerProxy
value: BigNumber { _hex: '0x0de0b6b3a7640000', _isBigNumber: true },
nonce: 24,
data: '0xd764ad0b0001000000000000000000000000000000000000000000000000000000000018000000000000000000000000fe36e31dfe8cb3a3aa0cb9f35b191ddb5451b09000000000000000000000000042000000000000000000000000000000000000100000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c41635f5fd00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
r: '0x0000000000000000000000000000000000000000000000000000000000000000',
s: '0x0000000000000000000000000000000000000000000000000000000000000000',
v: 0,
creates: null,
chainId: 0,
wait: [Function (anonymous)]
}
*/
const l2Tx = await l2Provider.getTransaction(tx);
console.log('L1의 브릿지 이벤틀르 감지하여 파생된 L2 트랜잭션 정보');
console.log(l2Tx);
console.log('\n\n');
/**
[
BigNumber {
_hex: '0x01000000000000000000000000000000000000000000000000000000000018',
_isBigNumber: true
},
'0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090',
'0x4200000000000000000000000000000000000010',
BigNumber { _hex: '0x0de0b6b3a7640000', _isBigNumber: true },
BigNumber { _hex: '0x00', _isBigNumber: true },
'0x1635f5fd00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
_nonce: BigNumber {
_hex: '0x01000000000000000000000000000000000000000000000000000000000018',
_isBigNumber: true
},
_sender: '0xfe36E31dFE8Cb3A3Aa0CB9f35B191DdB5451b090',
_target: '0x4200000000000000000000000000000000000010', // L2StandardBridge: L2CrossDomainMessenger.relayMessage를 호출하면 _target에 해당하는 컨트랙트를 호출한다.
_value: BigNumber { _hex: '0x0de0b6b3a7640000', _isBigNumber: true },
_minGasLimit: BigNumber { _hex: '0x00', _isBigNumber: true },
_message: '0x1635f5fd00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b3300000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000'
]
*/
// relayMessage를 호출할 때 전달되는 인자를 decode하여 출력
const decodeParseRelayMessage = messenger.contracts.l2.L2CrossDomainMessenger.interface.decodeFunctionData(
'relayMessage',
l2Tx.data
)
console.log('relayMessage를 호출할 때 전달되는 인자정보')
console.log(decodeParseRelayMessage);
console.log('\n\n');
/*
[
'0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
'0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
BigNumber { _hex: '0x0de0b6b3a7640000', _isBigNumber: true },
'0x0000000000000000000000000000000000000000000000000000000000000000',
_from: '0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
_to: '0x30556546d4b398C3b0F67f0e1586feAf11CE9b33',
_amount: BigNumber { _hex: '0x0de0b6b3a7640000', _isBigNumber: true },
_extraData: '0x0000000000000000000000000000000000000000000000000000000000000000'
]
*/
const decodeParseL2StandardBridgeFinalizeBridgeETH = messenger.contracts.l2.L2StandardBridge.interface.decodeFunctionData(
'finalizeBridgeETH',
decodeParseRelayMessage._message
)
console.log('L2StandardBridge.finalizeBridgeETH를 호출할 때 전달되는 인자정보')
console.log(decodeParseL2StandardBridgeFinalizeBridgeETH);
console.log('\n\n');
/*
{
transactionIndex: 1,
blockNumber: 173769,
transactionHash: '0xc0b451761314611a2473866ce21f5ea1710ace624d3f55281485ed64c23de8a2',
address: '0x4200000000000000000000000000000000000010', // L2StandardBridge
topics: [
'0xb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89',
'0x0000000000000000000000000000000000000000000000000000000000000000',
'0x000000000000000000000000deaddeaddeaddeaddeaddeaddeaddeaddead0000',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b330000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 0,
blockHash: '0x95d7065e02e93e52376c85280a33e198e1e8e22feaacbde842498ef36ec3c1d2'
}
{
transactionIndex: 1,
blockNumber: 173769,
transactionHash: '0xc0b451761314611a2473866ce21f5ea1710ace624d3f55281485ed64c23de8a2',
address: '0x4200000000000000000000000000000000000010', // L2StandardBridge
topics: [
'0x31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33',
'0x00000000000000000000000030556546d4b398c3b0f67f0e1586feaf11ce9b33'
],
data: '0x0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000',
logIndex: 1,
blockHash: '0x95d7065e02e93e52376c85280a33e198e1e8e22feaacbde842498ef36ec3c1d2'
}
{
transactionIndex: 1,
blockNumber: 173769,
transactionHash: '0xc0b451761314611a2473866ce21f5ea1710ace624d3f55281485ed64c23de8a2',
address: '0x4200000000000000000000000000000000000007', // L2CrossDomainMessengerProxy
topics: [
'0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c',
'0xa7a2e7a086cb5f2448cbdb134e0bb37dd00bc82bf116375356928472ac3653fe'
],
data: '0x',
logIndex: 2,
blockHash: '0x95d7065e02e93e52376c85280a33e198e1e8e22feaacbde842498ef36ec3c1d2'
}
*/
const { logs } = await l2Provider.getTransactionReceipt(tx);
console.log('ETH Bridge 이벤트 로그정보')
for (const log of logs) {
console.log(log);
}
}
main('0xc0b451761314611a2473866ce21f5ea1710ace624d3f55281485ed64c23de8a2');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment