by Mineral of MBM

거래소에서 최초로 특정 컬렉션의 NFT를 리스팅하려고 하면 아래와 같은 트랜잭션을 승인하라는 팝업이 뜬다. 이 트랜잭션의 효과가 무엇이고 왜 필요한지 정리해본다.

Untitled

먼저 우리가 거래하는 NFT 는 대부분 erc-721 이라는 프로토콜을 따른다. erc-721 프로토콜에는 NFT 가 갖춰야할 조건들이 정의되어 있는데, 그 중 하나가 setApprovalForAll 이다. 이 함수가 정확히 어떤 기능을 하는지 찾아보자.(https://docs.openzeppelin.com/contracts/4.x/api/token/erc721 참고)

Untitled

위 함수는 operator의 주소에 함수 호출자가 소유한 콜렉션을 transfer 할 수 있는 권한을 부여하거나 박탈한다. 즉 타인(또는 컨트랙)에게 내가 소유한 nft의 이동 권한을 부여하는 것이다. 남이 내 지갑의 NFT에 손댈 수 있게 된다는 말이다. 따라서 operator 에 들어가는 주소는 거래소 등 반드시 신뢰할 수 있는 써드파티여야 한다.

따라서 오픈씨에 리스팅을 할 때 최초 1회 트랜잭션이 발생하는 이유는 오픈씨가 해당 컬렉션을 내 지갑에서 이동시킬 권한이 필요하기 떄문이다. 권한이 없는경우 거래가 발생해도 내 NFT를 이동시킬 수 없기 때문에 반드시 이 트랜잭션이 선행되어야 한다.

간혹 특정 사이트에서 민팅을 하려고 버튼을 눌렀는데 메타마스크 팝업에 위와같이 Set approval for all 이 뜨는 경우 절대로 트랜잭션을 실행하면 안된다. 99.9% 내가 소유한 NFT를 이동시킬 권한을 획득하려는 스캠이다. (일반적으로 지갑내 NFT 중 FP가 가장 높은 컬렉션의 컨트랙에 위 함수를 호출하려고 한다 → 제일 비싼걸 훔쳐간다는 뜻)

응용편 :

setApprovalForAll 은 내가 해당 컨트랙의 NFT를 소유하고 있지 않아도 호출할 수 있다. 따라서 내가 민팅을 하자마자 바로 플립을 하려는 경우 민팅전 미리 이를 호출해서 거래소에 리스팅되는 시간(+가스)을 줄일 수 있다. 해당 함수를 호출할 때 먼저 권리를 부여할 주소, 즉 거래소 컨트랙의 주소가 필요한데 이는 내가 이전에 승인한 트랜잭션의 파라미터를 보고 확인할 수 있다. 메타마스크 기록에서 Set Approval For All 로 실행된 트랜잭션의 이더스캔을 타고 들어가 보자