ERC20
MUST
- ERC20 함수 호출자는 리턴값
success가true를 리턴했는지 확인해야 한다.false가 리턴되지 않을 것이라고 가정해서는 안된다. name,symbol,decimals는 선택적 기능이므로 이 함수가 항상 존재할 것이라고 가정해서는 안된다.transfer함수- 반드시
Transfer이벤트를 발생한다. - 0만큼의 토큰을 전송 요청했을 시, 정상적으로 함수를 처리하고
Transfer이벤트를 발생한다.
- 반드시
transferFrom함수- 반드시
Transfer이벤트를 발생한다. - 0만큼의 토큰을 전송 요청했을 시, 정상적으로 함수를 처리하고
Transfer이벤트를 발생한다.
- 반드시
approve함수를 성공적으로 호출했다면Approval이벤트를 발생한다.
SHOULD
transfer시 호출자의 잔고가 부족하다면 예외를 발생시킨다.transferFrom함수의_from이 호출자에게 어떠한 매커니즘을 통해 의도적으로 승인하지 않은 경우 예외를 발생시킨다.allowance를 설정할 때, 동일한 지출자에게 다른 값으로 설정하기 전에 먼저allowance를 0으로 설정한다. 이는 기존에 배포된 ERC20와의 하위 호환을 위해 강제되지는 않지만, 토큰을 사용하는 쪽에서 따르도록 권장한다.- 새 토큰을 민팅할 때
Transfer이벤트의_from을address(0)으로 하여 이벤트를 발생한다.
ERC20 연동 시 체크리스트
- weird erc20 토큰 지원 여부
- decimals가 작거나 클 때를 적절히 핸들링 하는가?
- safeERC20을 이용하는가?
- OpenZeppelin
safeApprove는 deprecated 되었으며, 초기화 시에만 쓰고 추후에는 increase/decrease 해야한다. - OpenZeppelin 버전에 따라 USDT를 대상으로
safeIncreaseAllowance작동 안할 수 있음 → 먼저 0으로 allowance를 초기화한 후 다시 등록해야 함 https://solodit.xyz/issues/unsafe-safeapprove-and-safeincreaseallowance-mixbytes-none-conic-finance-markdown
- OpenZeppelin
tags: blockchain, smart contract, fungible token, defi