import {account, publicClientL1, walletClientL1, publicClientL2, walletClientL2} from "./config";
import {l2StandardBridgeAbi, l2StandardBridgeAddress, l2TokenAddress, testTokenAbi} from "./contract";
import {formatUnits, parseUnits} from "viem";
async function main() {
// 이더리움으로 브릿징 하기 전, 여러분의 레이어 2 지갑에서 ERC-20 토큰 잔고를 확인해요.
const l2TokenBalance = await publicClientL2.readContract({
address: l2TokenAddress,
abi: testTokenAbi,
functionName: 'balanceOf',
args: [account.address],
});
console.log(`L2 Token Balance: ${formatUnits(l2TokenBalance, 18)} FAUCET`);
// 레이어 2에서 withdrawal 트랜잭션을 전송해요.
// 이 과정에서 여러분의 ERC-20 토큰이 소각(burn)됩니다.
const withdrawalHash = await walletClientL2.writeContract({
address: l2StandardBridgeAddress,
abi: l2StandardBridgeAbi,
functionName: 'withdrawTo',
args: [
l2TokenAddress,
account.address,
parseUnits('0.5', 18),
200000,
'0x',
],
});
console.log(`Withdrawal transaction hash on L2: ${withdrawalHash}`);
// 위에서 전송한 레이어 2 트랜잭션이 완전히 처리될때까지 기다려요.
const withdrawalReceipt = await publicClientL2.waitForTransactionReceipt({ hash: withdrawalHash });
console.log('L2 transaction confirmed:', withdrawalReceipt);
// 레이어 2 withdrawawl transaction을 레이어 1에서 증명할 수 있을때까지 기다려요.
// 이 과정은 최대 2시간이 소요될 수 있습니다.
const { output, withdrawal } = await publicClientL1.waitToProve({
receipt: withdrawalReceipt,
targetChain: walletClientL2.chain
});
// 레이어 1에서 withdrawal을 증명하는 트랜잭션을 전송하기 위해 파라미터를 build 합니다.
const proveArgs = await publicClientL2.buildProveWithdrawal({
output,
withdrawal,
});
// 레이어 1에서 withdrawal을 증명해요.
const proveHash = await walletClientL1.proveWithdrawal(proveArgs);
console.log(`Prove transaction hash on L1: ${proveHash}`);
// 위에서 전송한 레이어 1 트랜잭션이 완전히 처리될때까지 기다려요.
const proveReceipt = await publicClientL1.waitForTransactionReceipt({ hash: proveHash });
console.log('Prove transaction confirmed:', proveReceipt);
// Withdrawal을 finalize할 수 있을때까지 기다려요.
// 이 기간을 challenge period라고 부르며 대략 7일이 소요됩니다.
await publicClientL1.waitToFinalize({
targetChain: walletClientL2.chain,
withdrawalHash: withdrawal.withdrawalHash,
});
// 레이어 1에서 withdrawal 과정을 마무리해요.
const finalizeHash = await walletClientL1.finalizeWithdrawal({
targetChain: walletClientL2.chain,
withdrawal,
});
console.log(`Finalize transaction hash on L1: ${finalizeHash}`);
// 위에서 전송한 레이어 1 트랜잭션이 완전히 처리될때까지 기다려요.
const finalizeReceipt = await publicClientL1.waitForTransactionReceipt({
hash: finalizeHash
});
console.log('Finalize transaction confirmed:', finalizeReceipt);
// Withdrawal 상태를 레이어 1에서 읽어옵니다.
// Withdrawal은 완료되기까지 많은 시간이 소요되기 때문에 필요한 경우 해당 함수로 withdrawal 상태를 조회할 수 있어요.
const status = await publicClientL1.getWithdrawalStatus({
receipt: withdrawalReceipt,
targetChain: walletClientL2.chain,
});
console.log('Withdrawal completed successfully!');
}
main().then();