ERC4337
계정 구현시 주의할 점은, 서명 인증 시 리턴하는 값 SIG_VALIDATION_SUCCESS 와 SIG_VALIDATION_FAILED 가 각각 0과 1로 매핑되어 있다는 점이다. 일반적인 true, false 와 반대임에 주의하자.
MUST
Account
- 계정의 함수를 호출하는 이가 EntryPoint 인지를 확인한다.
- 계정이 signature aggregation 을 지원하지 않는 경우, userOpHash 에 대한 서명을 확인해야 한다.
- 서명 확인 시, 서명 불일치 외의 다른 오류가 발생했을 때에는 revert 한다.
- EntryPoint 에게 최소한
missingAccountFunds만큼은 지불해야 한다. 현재 계정의 예치금이 충분히 높다면 이 값은 0일 수도 있다. - 반환값은 authorizer 와 validUntil, validAfter 타임스탬프로 패킹되어야 한다. (uint256 으로 인코딩)
- authorizer
- 서명이 유효하다면 0(
SIG_VALIDATION_SUCCESS), 유효하지 않다면 1(SIG_VALIDATION_FAILED) 로 설정한다. 20바이트를 이용한다. - 또는 authorizer 컨트랙트의 주소를 리턴한다. Signature aggregator 의 주소를 리턴한다.
- 서명이 유효하다면 0(
- validUntil
- 6 바이트의 타임스탬프. 0으로 설정할 시 무한으로 설정된다. UserOp 는 이 시점까지만 유효하다.
- validAfter
- 6 바이트의 타임스탬프. UserOp 는 이 시점부터 유효하다.
- authorizer
SHOULD
Account
- 서명이 일치하지 않는 경우 revert 하지 않고
SIG_VALIDATION_FAILED를 리턴한다.
MAY
Account
- 계정은 최소 값보다 더 많이 지불할 수 있다. 이는 미래에 트랜잭션을 또 실행할 시 사용된다.
withdrawTo를 통해 회수할 수 있다. - IAccountExecute 인터페이스 (
executeUserOp함수)를 구현할 수 있다. (안할 수도 있다)
tags: blockchain, defi, smart contract, account abstraction, wallet