(await ethers.provider.getBlock('latest')).timestamp
await ethers.provider.getBlockNumber()
[카테고리:] Development
[ethers] contract 배포
const cf = await ethers.getContractFactory('DasomContract');
const dasomContract = await cf.deploy();
if (!(await dasomContract.deployed())) {
throw new Error(
'Error occurred during deploying the contract',
);
}
[hardhat] hardhat network에서 다른 계정인 척 쓰기
const hwwallet = "0xda50da50da50da50da50da50da50da50da50da50";
// impersonating HW wallet
await network.provider.request({
method: "hardhat_impersonateAccount",
params: [hwwallet],
});
const _master = await ethers.getSigner(hwwallet);
_master.getFeeData = async () => {
return {
gasPrice: ethers.BigNumber.from(0),
lastBaseFeePerGas: ethers.BigNumber.from(0),
maxFeePerGas: ethers.utils.parseUnits("800", "gwei"),
maxPriorityFeePerGas: ethers.utils.parseUnits("800", "gwei"),
};
};
master = _master;
console.log('master: ', await master.getAddress());
[zsh] 파일명에 escaped character 입력
아래처럼 $'<escaped character>’ 형식으로 escaped character를 입력한다.
$ git mv DasomFactory.sol $'\b'DasomFactory.sol
[ethers.js] bytecode(=creationCode) 얻기
contract 컴파일 후 bytecode(creationCode)를 얻으려면:
(await ethers.getContractFactory("DasomOLIContract")).bytecode
이걸 keccak256()으로 돌리면(ethersV5 기준)
> ethers.utils.keccak256((await ethers.getContractFactory("DasomOLIContract")).bytecode)
위는 solidity에서 다음을 하는 것과 동일하다.
keccak256(abi.encodePacked(type(DasomOLIContract).creationCode));
[git] @{ } 표기법
Git에서는 @{}
표기법을 사용하여 다양한 브랜치 및 커밋 참조를 지정할 수 있습니다. 여기서 몇 가지 일반적으로 사용되는 표기법을 설명하겠습니다:
@{u}
또는@{upstream}
: 현재 브랜치의 upstream 브랜치를 가리킵니다. 예를 들어,main
브랜치의 upstream 브랜치가origin/main
인 경우,main@{u}
또는main@{upstream}
는origin/main
을 가리킵니다.@{1}
또는@{2}
등의 숫자: 브랜치의 이전 위치를 가리킵니다. 예를 들어,main@{1}
은main
브랜치의 바로 이전 커밋을 가리킵니다.@{yesterday}
또는@{1.week.ago}
와 같이 시간 범위를 지정할 수도 있습니다. 이를 통해 특정 시점의 커밋을 가리킬 수 있습니다.@{commit-hash}
: 직접 커밋 해시(해당 커밋의 고유 식별자)를 지정하여 특정 커밋을 가리킬 수 있습니다.@{branch-name}
: 특정 브랜치의 위치를 가리킬 수 있습니다.
이러한 표기법을 사용하면 Git에서 다양한 상황에서 브랜치, 커밋 및 이력을 참조할 수 있으며, 특정 시점이나 이전 위치에 대한 정보를 쉽게 얻을 수 있습니다.
[git] repo로 tag push/delete
tag push
git push origin <TAG명>
tag delete
git push origin :<TAG명>
[hardhat/ethers.js] HW Ledger 체크
ethers.js v5 기준 hardhat 태스크
import { LedgerSigner } from "@anders-t/ethers-ledger";
import { task } from "hardhat/config";
task("checkHW", "Check HW Wallet")
.addOptionalPositionalParam("accountNumber", "Index of the address of the HW wallet")
.setAction(async (taskArgs) => {
const accountNumber = taskArgs.accountNumber;
const _master = new LedgerSigner(ethers.provider, `m/44'/60'/${accountNumber}'/0/0`);
_master.getFeeData = async () => {
return {
gasPrice: ethers.BigNumber.from(0),
lastBaseFeePerGas: ethers.BigNumber.from(0),
maxFeePerGas: ethers.utils.parseUnits("800", "gwei"),
maxPriorityFeePerGas: ethers.utils.parseUnits("800", "gwei"),
};
};
const master = _master;
console.log(`HW Ledger: [${accountNumber}]:${await master.getAddress()}: ${ethers.utils.formatEther(await master.getBalance())} ETH`);
});
사용은 hh checkHW 0
와 같이 한다.
[ethers.js] ERC20 balance 체크
hardhat task로 만든 ERC20 잔액 확인 태스크
task("balanceERC20", "Check the balance of ERC20 token")
.addPositionalParam("tokenAddress", "ERC20 Token contract address")
.addPositionalParam("address", "Address to be checked")
.setAction(async (taskArgs) => {
const ERC20 = await ethers.getContractFactory("@openzeppelin/contracts/token/ERC20/ERC20.sol:ERC20");
const erc20 = await ERC20.attach(taskArgs.tokenAddress);
console.log(ethers.formatEther(await erc20.balanceOf(taskArgs.address)), await erc20.symbol());
});
[ethers.js] Transaction details 얻기 및 ERC20 Transfer 정보 얻기
hardhat task로 만든 txHash로 transaction details 얻어서 ERC20 Transfer() 이면 정보 출력.
task("trasactionDetails", "Get the transaction deatils")
.addPositionalParam("txHash", "Transaction Hash")
.setAction(async (taskArgs, hre) => {
const provider = ethers.provider;
const transaction = await provider.getTransaction(taskArgs.txHash);
console.log(transaction);
if (transaction.value === 0n) {
if (transaction.data.slice(0, 10) === "0xa9059cbb") {
console.log("---- ERC20 Transfer -------------------------");
await hre.run("parseERC20TransferData", { data: transaction.data });
}
}
});
task("parseERC20TransferData", "Parsing")
.addPositionalParam("data", "Transacton Data")
.setAction(async (taskArgs) => {
const abiCoder = new ethers.AbiCoder();
const decodedData = abiCoder.decode(['address', 'uint256'], "0x" + taskArgs.data.slice(10));
const to = decodedData[0];
const value = decodedData[1].toString();
console.log('To Address:', to);
console.log('Token Amount:', ethers.formatEther(value));
});