일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 스마트컨트렉트 함수이름 중복 호출
- rust 기초
- 스마트컨트렉트 예약어 함수이름 중복
- SBT표준
- vue기초
- chainlink 설명
- 컨트렉트 동일한 함수이름 호출
- 스마트 컨트렉트 함수이름 중복
- 스마트컨트렉트테스트
- ethers typescript
- ethers
- 프록시배포구조
- 체인의정석
- ethers v6
- Vue.js
- 러스트 기초 학습
- 머신러닝기초
- ethers type
- 러스트 기초
- ambiguous function description
- git rebase
- nest.js설명
- multicall
- 티스토리챌린지
- 스마트컨트렉트프록시
- 컨트렉트 배포 자동화
- Vue
- 러스트기초
- 오블완
- ethers websocket
Archives
- Today
- Total
체인의정석
smart contract에서 동일한 함수 이름이나 예약어가 있을 경우 본문
728x90
반응형
account abstraction의 기본 예제에서는 getAddress라는 컨트렉트 함수가 있어 ethers.js의 getAddress가 대신 호출되어 오류가 난다. 또한 erc721 기본 예제에서도 함수이름은 동일하나 파라미터 개수만 다른 safeTransferFrom과 같은 함수가 존재한다.
이러한 함수들을 그냥 호출하려고 하면
"TypeError: ambiguous function description (i.e. matches "safeTransferFrom(address,address,uint256)", "safeTransferFrom(address,address,uint256,bytes)") (argument="key", value="safeTransferFrom", code=INVALID_ARGUMENT, version=6.13.2)"
이런 오류가 발생하게 된다.
이러한 경우 직접적으로 해당 ABI를 지정해서 호출해 주면 해결이 된다.
await expect(NFT["safeTransferFrom(address,address,uint256)"](account1.address, account2.address, 1)).to.be.reverted;
await expect(NFT["safeTransferFrom(address,address,uint256,bytes)"](account1.address, account2.address, 1, "0x")).to.be.reverted;
이런식으로 NFT라는 contractFactory에 원래는 NFT.safeTranferFrom()을 써서 함수를 호출했다면 해당 케이스에서는 함수명과 변수명을 같이 지정하여 호출해주면 해결 가능하다.
계정 추상화 기본 예제에서도 마찬가지이다.
const createdAccountAddress = await aa_accountFactory["getAddress(address,uint256)"](walletOwner.address, aa_owner_salt);
console.log("createdAccountAddress >>", createdAccountAddress);
// initCode
let initCode = "0x";
await aa_accountFactory.createAccount(walletOwner.address, aa_owner_salt);
if ((await ethers.provider.getCode(createdAccountAddress)) === "0x") {
initCode =
await aa_accountFactory.getAddress() +
aa_accountFactory.interface.encodeFunctionData(
"getAddress(address,uint256)",
[walletOwner.address, aa_owner_salt]
)
.slice(2);
}
다음과 같이 .getAddress()가 우선적으로 호출되면 해당 컨트렉트의 주소가 나오기 때문에 ABI에서 문자열을 직접 지정해서 트랜잭션을 일으켜야 한다.
728x90
반응형
'블록체인 > 퍼블릭 블록체인' 카테고리의 다른 글
ERC4337 + Pass Key, 계정추상화에 패스키 적용하기 (0) | 2024.10.14 |
---|---|
smart contract에서 동일한 함수 이름이나 예약어가 있을 경우 (0) | 2024.09.30 |
다중 체인 환경 hardhat써서 로컬에서 테스트하기 (0) | 2024.06.24 |
폴리곤 Polygon amoy 테스트넷 사용방법 (0) | 2024.06.05 |
AVAX 아발란체 테스트넷 사용법 (0) | 2024.06.05 |
Comments