Ethereum 2.0 Staking을 진행하는 과정에서 배운 것들을 공유한 글입니다. 공식적으로는, launchpad 이용해서 deposit transaction을 생성할 수 있습니다. launchpad를 이용하지 않고, 직접 트랜잭션을 생성하는 과정을 설명할 예정입니다.
일반적인 경우, 메타마스크를 사용하는 user는 deposit contract의 deposit method를 사용할 수 있습니다. 여기서 말하는 일반적인 경우는, 트랜잭션을 create, sign, send의 과정을 한 번에 해결하여서 트랜잭션을 전송하는 경우를 말합니다.
import { ethers } from "ethers";
import dotenv from "dotenv";
import eth2DepositABI from "./src/contract/eth2DepositABI.json" assert { type: "json" };
import depositDataJson from "./src/validator_keys/deposit_data-{TIME_STAMP}.json" assert { type: "json" };
dotenv.config();
const rpcURL = `https://ropsten.infura.io/v3/${process.env.INFURA_API_KEY}`;
const provider = new ethers.providers.JsonRpcProvider(rpcURL);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
// const signer = provider.getSigner();
const eth2DepositContractAddress = "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D"; //ropsten testnet
const depositData = JSON.parse(JSON.stringify(depositDataJson));
const options = { gasLimit: 140000, value: ethers.utils.parseEther("32") };
// Creating Contract Instances
const depositContract = new ethers.Contract(
eth2DepositContractAddress,
JSON.parse(JSON.stringify(eth2DepositABI)),
wallet
);
// const contractWithSigner = depositContract.connect(signer);
const tx_deposit = await depositContract.deposit(
"0x" + depositData[0].pubkey,
"0x" + depositData[0].withdrawal_credentials,
"0x" + depositData[0].signature,
"0x" + depositData[0].deposit_data_root,
options
);
// const num = await provider.getBlockNumber();
// const balance = await provider.getBalance(account);
// console.log(num);
// console.log(ethers.utils.formatEther(balance));
// console.log(contractWithSigner);
const receipt_deposit = await tx_deposit.wait();
console.log("receipt_deposit:", receipt_deposit);
https://docs.ethers.io/v5/troubleshooting/errors/#help-UNPREDICTABLE_GAS_LIMIT
https://docs.ethers.io/v5/troubleshooting/errors/#help-CALL_EXCEPTION