[Token Distribution Series]#2: IDO, Auction, Airdrop

SKN
Decipher Media |디사이퍼 미디어
35 min readFeb 26, 2023

토큰 분배 방법은 토큰 이코노미의 중요한 구성요소입니다. Token Distribution Series에서는 on/off-chain token distribution model에 대한 글을 시리즈로 연재합니다. 본 글은 Token Distribution 시리즈의 두번째 편으로 IDO, Auction, Airdrop에 대해 살펴봅니다.

Author

Matt Yeo

Reviewed by

Reviewer: Yohan Lim (@normalmangrc)

[Token Distribution Series]

  1. Introduction
  2. IDO, Auction, Airdrop
  3. LBP
  4. Lockdrop & LBA

[목차]

  1. Intro
  2. IDO
  3. Auction
  4. Airdrop
  5. Outro

1. Intro

출처: Investopedia

2017년 유행 했던 ICO(Initial Coin Offering)는 당시 많은 프로젝트들이 사업 운영 자금을 확보하기 위해서 선택했던 펀딩 방식입니다. 불특정 다수에게 달러 혹은 비트코인 등을 받고 자신들이 개발하는 프로젝트의 코인을 판매하는 ICO의 방식을 활용하여 많은 프로젝트들은 손 쉽게 천문학적인 자금을 조달할 수 있었습니다. 이와 같은 ICO를 통해서 BNB, Tezos, Filecoin과 같이 투자자들에게 막대한 수익을 안겨준 프로젝트들도 있었지만, 투자자들의 돈을 가지고 잠적하는 스캠이 훨씬 많았습니다. 실제로 2018년에 Satis Group가 진행한 연구에 따르면 2017년 동안 진행된 ICO의 80%가 스캠으로 밝혀졌다고 합니다. 특히, 투자자들에게 투자금만 받아가고 토큰 자체를 지급하지 않는 경우의 사기가 상당히 많았습니다.

이처럼 사기로 인해서 많은 사람들이 피해를 보자 각국 정부는 ICO에 대한 더욱 강력한 규제를 적용하기 시작하였습니다. 이로 인해서 신규 토큰을 런칭하려는 프로젝트 팀들은 새로운 형태의 토큰 분배 방식을 찾아나섰고, 마찬가지로 투자자들도 ICO에 대한 회의감을 느끼고 더욱 투명한 형태의 새로운 토큰 분배 방식을 원하게 되었습니다. 이러한 수요에 힘 입어서 2017년 이후 더욱 다양한 형태의 온체인 토큰 분배 방식들이 활성화되었습니다. 이더리움과 같은 프로토콜 위에서 스마트 컨트랙트를 기반으로 토큰을 분배하는 IDO, Auction, Airdrop 등의 방식은 ICO와 같은 오프체인 토큰 분배 방식보다 훨씬 높은 투명성을 제공합니다. 해당 토큰 분배 컨트랙트와 온체인 데이터를 열람함으로써 정확히 어떤 방식으로 어떤 지갑들에게 얼마만큼의 물량이 배분되는지를 파악할 수 있기 때문입니다. 해당 글에서는 IDO, Auction, Airdrop 각 방식의 핵심적인 기능을 구현한 코드들을 분석하고, 이를 바탕으로 각 토큰 배분 방식의 장단점을 논의해보고자 합니다.

2. IDO

  • 소개

2017년에 진행되었던 ICO들이 각종 부작용을 보이면서 이에 대한 규제가 엄격해지기 시작하자 2019년부터 IDO가 활성화되기 시작하였습니다. IDO는 Initial Dex Offering의 약자로, 간단히 말하자면 탈중앙거래소(DEX)를 통해서 토큰을 런칭하고 상장시키는 방식입니다. 일반적으로 투자자들은 Token Generation Event 이전에 스마트 컨트랙트에 투자금을 묶고, Token Generation Event 직후 토큰을 배분 받아서 즉각적으로 DEX에서 해당 토큰을 거래할 수 있게 됩니다. 최초의 IDO로 알려진 것은 2019년에 진행되었던 Raven Protocol의 IDO입니다. 당시 Raven Protocol은 Binance DEX와 협력하여 전체 $Raven 물량의 3%를 판매하였습니다. Raven Protocol의 성공적인 IDO 이후 많은 프로젝트들이 IDO를 토큰 분배 방식으로 채택하기 시작하였으며 현재까지도 널리 쓰이고 있는 토큰 분배 방식 중 하나입니다. 초기에는 DEX를 통해서 토큰을 판매하는 것이 IDO의 의미였다면, 지금은 그 의미가 확장되어 각종 Launch Pad를 통해서 초기 토큰을 판매하고 분배하는 것을 IDO라고 지칭하기도 합니다. 대표적인 Launch Pad으로는 Polkastarter, DaoMaker, Solanium, Miso 등이 있습니다. IDO의 경우 매우 제한적인 물량을 소수의 선발된 투자자들에게만 판매하기 때문에, 선발된 소수의 초기 투자자들은 IDO를 통해 큰 수익을 올릴 수 있습니다.

  • MISO의 사례
  1. 사례 소개
출처: MISO

MISO는 Minimal Initial SushiSwap Offering의 약자로 Sushiswap에서 2021년 1월에 출시한 런치패드입니다. MISO를 이용하면 프로젝트 팀들은 토큰을 손쉽게 발행해서 자금을 마련하고, 펀딩이 종료된 토큰을 Sushiswap 유동성풀에 올리는것까지 한 번에 진행할 수 있습니다. 초기에는 이더리움으로 제한되었던 MISO는 업데이트를 거쳐 BNB 체인, 폴리곤, 하모니 네트워크 등 다양한 체인들을 지원하기 시작하였습니다. 2021년부터 시작된 Crypto Bull Run에 힘 입어 많은 프로젝트들이 MISO를 통해서 IDO를 진행하였습니다. 대표적으로는 Yield Guild Games의 $YGG, BitDAO의 $BIT 등이 MISO 플랫폼을 통해서 프로젝트의 토큰을 런칭하였습니다. 하지만 MISO는 2022년 찾아온 하락장에 큰 타격을 입었고, 결국 Sushiswap 팀은 올해 1월 MISO 플랫폼의 운영을 중단하기로 발표한 상태입니다. 비록 MISO의 운영이 중단된 상태이지만, 이더리움에서 대표적인 런치패드 중 하나였고 코드나 구현 상에 문제가 있어서 운영이 중단된 것은 아니기 때문에 해당 글에서는 MISO의 사례를 통해서 IDO의 구현 원리에 대해서 간단하게 살펴보고자 합니다.

2. 구현 방식

MISO는 IDO의 방식으로 Crowdsale, Dutch Auction, Batch Auction, Hyberbolic Auction 등을 지원합니다. Auction의 경우 뒤에서 더 자세하게 다루게 됨으로 해당 파트에서는 MISO의 Crowdsale이 어떤 방식으로 구현되어 있는지를 알아볼 것입니다. Crowdsale은 말그래도 누구나 참여할 수 있게 대중들에게 토큰을 직접 판매하는 방식입니다. Crowdsale의 경우, 판매할 토큰의 양과 가격을 미리 정해놓은 다음에 선착순으로 누구나 와서 토큰을 구매할 수 있습니다. MISO의 Crowdsale 컨트랙트는 아래의 주소에서 확인할 수 있습니다.

https://github.com/sushiswap/miso/blob/canary/contracts/Auctions/Crowdsale.sol

Crowdsale.sol은 총 36개의 function으로 구성되어 있는데 여기서 핵심이 되는 function은 총 5개입니다.

1) initCrowdsale

function initCrowdsale(
address _funder,
address _token,
address _paymentCurrency,
uint256 _totalTokens,
uint256 _startTime,
uint256 _endTime,
uint256 _rate,
uint256 _goal,
address _admin,
address _pointList,
address payable _wallet
)

initCrowdsale을 통해서 판매자는 Crowdsale을 시작할 수 있습니다. _paymentCurrency에 토큰과 교환할 재화(이더리움 또는 ERC20 토큰)를, _totalTokens에는 총 판매할 토큰의 양을, _endTime에는 판매 종료 시간을, _rate에는 토큰의 교환비를, _goal에는 최소 판매 목표를 설정할 수 있습니다.

2) 토큰의 구매

토큰의 구매는 initCrowdsale의 _paymentCurrency를 어떻게 설정했느냐에 따라 다릅니다.

만약 _paymentCurrency를 이더리움으로 설정하게 될 경우, 아래의 commitEth를 통해 토큰을 구매할 수 있습니다.

function commitEth(
address payable _beneficiary,
bool readAndAgreedToMarketParticipationAgreement
)

그러나 만약 _paymentCurrency를 기타 ERC-20 토큰으로 설정했다면, 아래의 commitTokens를 통해 토큰을 구매할 수 있습니다. 이처럼 이더리움과 ERC-20 토큰의 구매 function이 다른 이유는 ETH과 ERC-20 토큰에서 호출할 수 있는 함수가 다르기 때문입니다.

function commitTokens(
uint256 _amount,
bool readAndAgreedToMarketParticipationAgreement
)

3) 판매 종료

initCrowdsale에서 설정한 _goal을 충족하는 양만큼의 토큰을 판매했거나, _endTime이 지나게 되면 finalize function을 통해서 판매를 종료시킬 수 있습니다.

function finalize() public nonReentrant

만약, _endTime이 되어서 판매가 종료되었는데 _goal만큼의 토큰을 판매하지 못하면, 토큰을 구매한 투자자들에게 투자금을 돌려주게 됩니다.

function withdrawTokens(address payable beneficiary) public nonReentrant {    
if (auctionSuccessful()) {
// crowdsale의 물량이 모두 판매된 것을 확인
require(marketStatus.finalized, "Crowdsale: not finalized");
// beneficiary에게 줄 토큰 개수(tokensToClaim)를 계산
uint256 tokensToClaim = tokensClaimable(beneficiary);
// tokensToClaim이 0보다 큼을 확인
require(tokensToClaim > 0, "Crowdsale: no tokens to claim");
// claimed라는 mapping에 beneficiary가 토큰을 수령해갔음을 기록
claimed[beneficiary] = claimed[beneficiary].add(tokensToClaim);
// beneficiary에게 토큰을 전송
_safeTokenPayment(auctionToken, beneficiary, tokensToClaim);
} else {
// crowdsale의 설정된 종료 기간이 지난 것을 확인
require(block.timestamp > uint256(marketInfo.endTime), "Crowdsale: auction has not finished yet");
uint256 accountBalance = commitments[beneficiary];
// beneficiary의 commitments를 0으로 설정
commitments[beneficiary] = 0;
// beneificary에게 이더리움을 전송
_safeTokenPayment(paymentCurrency, beneficiary, accountBalance);
}
}

withdrawTokens는 auctionSuccessful()을 체크한 후, 만약 판매가 성공적이면 구매자(beneficiary)에게 구매한 토큰을 보내주고, 그렇지 않은 경우 구매자(beneficiary)에게 투자금을 돌려줍니다.

  • 장단점

이렇듯 저희는 MISO의 사례에서 IDO Crowdsale이 어떤 방식으로 진행될 수 있는지를 살펴보았습니다. ICO에 대한 규제에 대응하기 위해서 등장한 IDO는 위와 같이 코드로 구현되어 있는 특성 덕분에 투자자들이 더욱 신뢰하고 참여할 수 있는 구조였습니다. 정리하자면 IDO는 다음과 같은 장단점을 가집니다.

  1. 장점

1) 투명성

위에서 언급한 것처럼 IDO의 방식은 더욱 투명한 토큰 분배 과정을 제공합니다. 토큰 분배와 관련된 스마트 컨트랙트들을 확인함으로써 어떤 방식과 구조로 IDO가 진행되는지 알 수 있기 때문입니다.

2) 즉각적인 유동성

IDO를 진행하고 나면 토큰은 즉각적으로 투자자들에게 배분되고 DEX에 상장됩니다. ICO의 경우, 투자 이후 토큰을 분배 받기까지도 시간이 오래 걸리고, 거래소에 상장되기까지 추가적으로 시간이 소요됩니다. 반면 IDO를 통하면 투자자들은 바로 토큰을 받아서 프로젝트팀이 조성해놓은 유동성 풀에서 거래할 수 있습니다.

3) 개방성

IDO는 DEX를 중심으로 이루어지기 때문에 이론상 누구나 참여할 수 있습니다. 국경의 제약 없이 지갑만 있다면 IDO를 통해 프로젝트의 토큰을 초기에 구매하는 것이 가능하다는 것입니다.

2. 단점

1) 효율적 가격 결정 불가

ICO와 마찬가지로 IDO 또한 토큰의 초기 가격을 프로젝트 팀에서 정하고 토큰을 판매합니다. 그렇기 때문에 토큰 가격이 시장의 수요를 제대로 반영하지 못하는 경우가 있습니다. 특히, 초기 토큰 가격을 너무 높게 책정한 경우 IDO에 참여한 초기 투자자들은 큰 손해를 볼 수도 있습니다.

2) 탈중앙성

ICO와 비교해서 IDO는 투명한 방식의 런칭이지만 더 탈중앙적이라고 볼 수는 없습니다. 이는 초기 판매 물량과 가격 모두를 프로젝트 팀에서 설정하기 때문입니다.

3) 스캠

IDO는 상장 심사를 진행하지 않습니다. 그렇기 때문에 누구나 쉽게 자신들의 프로젝트를 IDO를 통해 런칭할 수 있습니다. 이러한 이유로 IDO를 통해서 스캠 프로젝트를 런칭하고 러그풀을 진행할 수도 있습니다. 현재 확실하게 규제를 받고 있는 ICO와 달리, IDO는 여전히 규제의 사각지대에 놓여있기 때문에 스캠을 당하더라도 제대로 된 보상을 받지 못할 가능성이 큽니다.

4) 규제적인 이슈

ICO의 경우 증권법 등과 엮이면서 많은 법적인 규제를 받게 되어서 현재는 거의 진행되지 않습니다. 하지만 IDO라고 해서 증권성으로부터 자유로울 수 있는 것은 아닙니다. 아직까지 정치권에서 IDO에 대한 큰 관심을 보이지 않았기 때문에 관련 규제가 없을 뿐이지, 훗날 규제의 대상이 될 수 있습니다.

3. Auction

  • 소개

앞서 살펴본 IDO는 많은 프로젝트들이 ICO의 대안으로 사용하였지만, 효율적인 가격 설정이 어렵다는 단점이 존재합니다. 가격 결정을 시장에 맡기는 것이 아니라 프로젝트 팀에서 하기 때문입니다. 따라서 시장이 가장 효율적인 토큰 가격을 결정하게 만들려는 여러 시도들이 있었고 그 중 하나가 바로 Auction입니다. Auction은 말 그대로 경매로 토큰을 판매하는 방식입니다. 보통 Auction이라고 한다면 낮은 가격에서 시작하여 더 이상 입찰자가 없을 때까지 가격이 올라가는 English Auction을 떠올리기 쉽지만, 사실 Auction에는 여러 종류가 존재합니다. 그중 대중적으로 가장 많이 쓰이는 Auction에는 총 4가지 종류가 있습니다. 첫번째는 낮은 가격에서 입찰가까지 올라가는 English Auction, 두번째는 높은 가격에서 입찰가까지 내려오는 Dutch Auction, 세번째는 모두가 비공개로 가격을 제출하고 가장 높은 가격을 부른 사람이 상품을 가져가는 Sealed-bid first-place Auction, 마지막으로는 모두가 비공개로 가격을 제출하고 가장 높은 가격을 부른 사람이 두번째로 높은 가격을 부른 사람의 가격으로 상품을 가져가는 Sealed-bid second-place Auction이 있습니다.

현재 온체인상에서 가장 많이 쓰이는 Auction 방식은 English Auction과 Dutch Auction입니다 (Sealed-bid first-place Auction과 Sealed-bid second-place Auction이 잘 쓰이지 못하는 이유는 현재 온체인 상에서 입찰자가 제시한 가격을 완전하게 숨기는 기능을 구현하기 어렵기 때문입니다). English Auction의 경우, Opensea에서 NFT를 판매/구매할 때나 MakerDAO의 Collateral Auction에서 쓰이는 것을 확인할 수 있습니다. 이러한 English Auction은 IDO보다 효율적인 가격 결정이 가능하다는 장점을 가지고 있지만, 역시 치명적인 단점을 가지고 있습니다. 그것은 입찰되기까지 계속해서 구매자가 비드(bid)를 넣어야 한다는 것입니다. 따라서 만약 인기 있는 토큰을 구매하려는 경우, 이 과정에서 가스비로 상당한 양의 이더리움을 사용하게 될 수도 있습니다.

이러한 English Auction의 단점을 극복하기 위해서 현재 온체인 상에서 활발하게 사용되는 것이 바로 Dutch Auction입니다. Dutch Auction은 높은 가격에서 점점 가격이 내려오면서 첫번째로 비드(bid)를 넣은 사람에게 상품이 낙찰됩니다. 따라서 구매자는 때문에 단 한 번의 비드(bid)만 넣어도 되기 때문에 English Auction에 비해서 가스비 사용을 획기적으로 줄일 수 있습니다. 이는 한 번에 여러 개의 토큰을 구매하더라도 마찬가지입니다. Alice가 B라는 토큰을 Dutch Auction을 통해 구매하려고 한다고 가정해봅시다. Alice는 $100에 1000개의 B 토큰을 비드(bid)를 넣습니다. 모든 입찰이 제출되면 해당 Dutch Auction에 할당된 모든 토큰이 분배될 때까지 가장 높은 입찰가를 제시한 입찰자부터 토큰이 분배됩니다. 그러나 여기서 중요한 점은 각 구매자가 지불하는 가격은 선정된 구매자 중 가장 낮은 가격을 제시한 구매자의 입찰가를 기준으로 합니다. 즉, Alice가 $100를 제시했어도 가장 낮은 입찰가를 제시한 구매자의 입찰가가 $80이라면, $80*1000만큼만 지불하면 되는 것입니다.

  • Azuki Dutch Auction의 사례
  1. 사례 소개

Dutch Auction은 NFT와 fungible token 양쪽의 경우 모두에 적용 가능한 토큰 배분 방식입니다. 많은 NFT 프로젝트들이 초기 민팅에 Dutch Auction을 사용하는만큼, 이번 파트에서는 2022년 1월에 진행된 Azuki의 NFT Dutch Auction의 사례를 다뤄보고자 합니다.

출처: Azuki 홈페이지

Azuki는 미국 캘리포니아 기반 아티스트 그룹인 치루랩스(Chiru Labs)에서 출시한 PFP 프로젝트로 블루칩 NFT 중 하나입니다. Azuki는 위의 사진에서 보이는 것과 같이 2022년 1월에 총 3단계에 걸쳐서 민팅을 진행하였는데, 해당 글에서는 첫번째 단계인 Dutch Auction Phase가 어떤 방식의 구현되어 있는지를 알아볼 것입니다.

2. 구현 방식

아래 링크의 Azuki.sol 컨트랙트에서 Azuki의 Dutch Aution의 주요 구현은 찾을 수 있습니다.

https://etherscan.io/address/0xed5af388653567af2f388e6224dc7c4b3241c544#code

Auction의 시작가는 1 이더리움으로 설정되었으며, 20분마다 0.15이더리움을 목표로 가격이 일정하게 떨어지는 형태였습니다.

uint256 public constant AUCTION_START_PRICE = 1 ether;
uint256 public constant AUCTION_END_PRICE = 0.15 ether;
uint256 public constant AUCTION_PRICE_CURVE_LENGTH = 340 minutes;
uint256 public constant AUCTION_DROP_INTERVAL = 20 minutes;
uint256 public constant AUCTION_DROP_PER_STEP =
(AUCTION_START_PRICE - AUCTION_END_PRICE) /
(AUCTION_PRICE_CURVE_LENGTH / AUCTION_DROP_INTERVAL);

이때, Azuki.sol 컨트랙트에서 살펴보아야할 function들은 auctionMint, getAuctionPrice function입니다.

1) auctionMint

function auctionMint(uint256 quantity) external payable callerIsUser {
uint256 _saleStartTime = uint256(saleConfig.auctionSaleStartTime);
// block.timestamp가 설정된 _saleStartTime보다 이후임을 확인
require(
_saleStartTime != 0 && block.timestamp >= _saleStartTime,
"sale has not started yet"
);
// 구매자가 민팅하려는 quantity와 이미 민팅은 totalSupply의 합이 auction과 dev에게 할당된 물량보다 낮음을 확인
require(
totalSupply() + quantity <= amountForAuctionAndDev,
"not enough remaining reserved for auction to support desired mint amount"
);
// 구매자가 이미 민팅한 nft의 수량(numberMinted)과 현재 민팅해가려는 수량(quantity)의 합이 일인당 제한 수량보다 낮음을 확인
require(
numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint,
"can not mint this many"
);
// 구매자가 내야할 이더를 계산
uint256 totalCost = getAuctionPrice(_saleStartTime) * quantity;
_safeMint(msg.sender, quantity);
// 민팅하고 남은 이더를 구매자에게 반환
refundIfOver(totalCost);
}

auctionMint는 Auction이 시작되었는지, 민팅할만큼의 충분한 수량이 남았는지, 1인당 민팅할 수 있는 최대 개수 미만으로 민팅하려고 하는지를 점검합니다. 해당 조건들을 모두 만족하면 getAuctionPrice으로 해당 시점의 가격을 가져와서 구매자가 내야할 이더리움의 양을 계산한 후 민팅을 진행합니다. 만약 구매자가 계산된 이더리움보다 많은 양을 지불했다면 refundIfOver로 차익을 돌려줍니다.

2) getAuctionPrice

function getAuctionPrice(uint256 _saleStartTime)
public
view
returns (uint256)
{
// 아직 sale이 시작되기 전이라면 AUCTION_START_PRICE를 반환
if (block.timestamp < _saleStartTime) {
return AUCTION_START_PRICE;
}
// sale 시작되고 이미 설정된 AUCTION_PRICE_CURVE_LENGTH보다 많은 시간이 흘렀다면 AUCTION_END_PRICE를 반환
if (block.timestamp - _saleStartTime >= AUCTION_PRICE_CURVE_LENGTH) {
return AUCTION_END_PRICE;
// 두 경우 모두 아니라면 현재 시간을 바탕으로 가격 계산 및 반환
} else {
uint256 steps = (block.timestamp - _saleStartTime) / AUCTION_DROP_INTERVAL;
return AUCTION_START_PRICE - (steps * AUCTION_DROP_PER_STEP);
}
}

Dutch Auction은 실시간으로 가격이 내려가기 때문에 그 가격을 계산해주는 function이 중요합니다. getAuctionPrice function은 _saleStartTime을 입력으로 받아서, block.timestamp와의 비교를 통해서 해당 시점에 맞는 NFT의 가격을 알려줍니다.

Azuki.sol의 특이한 점은 보통의 Dutch Auction과는 다르게 Auction이 종료된 후 입찰자가 낸 가격과 가장 낮은 입찰가의 차액을 돌려주는 기능이 구현되어 있지 않다는 것입니다. 앞서 설명한 Alice의 사례처럼 보통의 경우는 차액을 돌려주는데 Azuki의 NFT 민팅에는 해당 기능이 없었습니다. 물론 Azuki의 경우, 3분만에 Dutch Auction이 완판되어 해당 기능이 있었다고 하더라도 사용되는 일은 없었겠지만, 통상적인 방식의 Dutch Auction과는 조금은 다른 방식으로 진행된 것이라고 볼 수 있습니다.

  • 장단점
  1. 장점

1) 효율적 가격 결정

앞에서도 언급한 것처럼 Auction은 시장에 가격을 맡기는 구조이기 때문에 IDO와 같은 방식보다 효율적인 가격 결정이 가능합니다. 그 방식이 English Auction이든 Dutch Auction이든 IDO처럼 미리 가격이 결정되어 있는 것이 아니기 때문에 수요에 의해서 가격이 결정됩니다.

2) 투명성

IDO나 Airdrop처럼 온체인 Auction들도 스마트 컨트랙트를 통해 진행되기 때문에 투자자들에게 ICO와 비교해서 투명성을 제공합니다. 위에서 살펴본 것처럼 Auction의 시작 가격, 마감 가격, Auction 진행 기간 등을 알 수 있기 때문에 투자자의 입장에서는 믿음이 가는 방식입니다.

3) 개방성

온체인 Auction은 블록체인 상에서 이루어지기 때문에 이론상 누구나 참여할 수 있습니다. 국경의 제약 없이 지갑만 있다면 Auction을 통해 프로젝트의 토큰을 초기에 구매하는 것이 가능합니다.

2. 단점

1) 복잡한 방식

고정된 가격으로 토큰을 구매하는 IDO나 ICO와 달리 Auction은 가격이 계속해서 변하고, Auction마다 그 진행 방식이 다르기 때문에 구매자의 입장에서 헷갈릴 여지가 있습니다. 특히, Dutch Auction의 경우 대부분의 사람들에게 익숙하지 않기 때문에 토큰 판매 시 혼란이 가중될 수 있습니다.

2) 가격 발견 (IDO에 비해서 오래 걸리는 시간)

IDO와 Airdrop의 경우 토큰 분배가 매우 짧은 시간 안에 일어납니다. 반면, English Auction과 Dutch Auction의 경우 효율적인 가격을 찾기까지 시간이 걸립니다. 따라서 토큰의 런칭 타임라인을 고려해서 토큰 런칭 방식을 결정하는 것이 중요합니다.

3) 스캠

앞서 언급한 IDO와 마찬가지로 스마트 컨트랙트를 기반으로 누구나 Auction을 실시할 수 있기 때문에 사기의 위험이 있습니다. 실제로 많은 NFT 프로젝트들은 NFT 판매 이후 투자금을 가지고 잠적하는 ‘러그풀’을 저지르기도 하였습니다. 이러한 러그풀을 저지른 Frosties와 같은 일부 프로젝트들이 미국 사법 당국으로부터 기소된 경우도 존재하지만, 대부분의 러그풀 프로젝트들은 처벌을 받지 않은 상태입니다.

4) 규제적 이슈

Auction을 통해 판매한 해당 토큰이 증권으로 분류된다면, 판매 방식과 상관 없이 높은 수준의 규제를 받게 됩니다. 토큰이 증권으로 분류되면 각종 공시의 의무, 거래소 상장 제한, 자금 모집 제한 등의 여러 제약 사항들이 발생합니다. 따라서 토큰을 런칭하기 이전에 해당 나라의 증권법을 면밀히 살펴보는 것이 중요합니다.

4. Airdrop

  • 소개

Airdrop이란 주식에서의 무상증자와 비슷한 개념으로 기존 암호화폐 소유자들에게 무상으로 코인을 배분하여 지급하는 행위를 의미합니다. 예를 들어, 특정 지갑이 A 코인을 10개 보유하고 있다면, 해당 지갑에 B 코인을 100개 무상으로 지급하는 것이 바로 Airdrop입니다. 2017년 8월 중국의 우지한을 중심으로 채굴업체들이 Bitcoin Cash라는 신규 코인을 발행한 후, 기존 비트코인 소유자에게 1:1 개수 비율로 비트코인캐시를 무상 지급하는 Airdrop을 진행한 것이 대표적 사례 중 하나라고 할 수 있습니다. Airdrop은 앞에서 살펴본 IDO나 Auction처럼 토큰을 대가를 받고 판매하는 행위는 아니지만 현재까지도 많이 사용되는 토큰 분배 방식 중 하나입니다.

이러한 Airdrop을 진행하기 위해서는 가장 먼저 Airdrop을 받을 지갑들을 분류하는 작업이 필요합니다. 단순히 특정 시점의 코인 보유량에 따라서 신규 토큰을 Airdrop 해줄 수도 있지만, 더욱 까다롭게는 거버넌스 투표 이력, 프로토콜 사용 이력 등 여러 조건들을 만족하는 지갑들을 선별하여 Airdrop을 진행할 수도 있습니다. 이렇듯 Airdrop을 위한 조건들을 설정하고 나면 특정 시점에 해당 조건을 만족시키는 지갑들을 기록하게 되는데 ‘Snapshot’이라고 합니다. 그리고 Snapshot이 완료되어 토큰을 지급할 지갑들이 확정되면 비로소 Airdrop을 통해 토큰을 무상으로 분배하게 되는 것입니다.

  • Optimism의 사례
  1. 사례 소개
$OP Airdrop #1 Allocations (출처: Optimism)

2022년 진행된 Optimism의 $OP Airdrop #1의 경우, 단순히 특정 토큰 홀더들에게 $OP를 Airdrop한 것이 아니라 다양한 조건들을 설정한 이후에 이를 만족시키는 지갑들에 토큰을 지급하였습니다. 위에서 보이는 것과 같이 Optimism팀은 Optimism Users, Repeat Optimism Users, Dao Voters, Multisig Signers 등 다양한 조건들을 바탕으로 03–25–2022 0:00 UTC에 Snapshot을 진행한 이후, Airdrop을 하였습니다. 조건을 만족시킨 지갑들은 해당 Airdrop을 통해 적게는 271.83개에서부터 많게는 27,534.98개의 $OP를 분배 받게 되었습니다. 해당 글에서는 $OP Airdrop #1이 어떤 방식으로 구현되어 있는지를 살펴본 후, 해당 방식의 장단점들에 대해서 다룰 것입니다.

2. 구현 방식

1) 머클트리 증명 생성

머클트리 증명 (출처:github@miguelmota)

Optimism팀이 해당 Airdrop을 진행하기 위해서 진행한 절차는 다음과 같습니다. 우선, Airdrop을 위한 조건들을 다 만족시키는 지갑들을 분류하고 토큰 할당량을 정하여, 하나의 머클트리 증명을 생성합니다 (이 과정에서 사용된 JavaScript Library는 https://github.com/merkletreejs/merkletreejs에서 확인할 수 있습니다). 이처럼 지갑 주소들을 Keccak256 함수를 통해 하나의 머클트리 증명으로 해싱하는 이유는 각 주소들을 개별적으로 저장하는 것보다 저장 용량을 아껴서 궁극적으로 가스비를 줄이기 위함입니다.

2) 토큰 분배

이렇게 머클트리 증명을 생성하고 나면 이제부터는 온체인상에서 토큰 분배에 관한 과정들이 일어나게 됩니다. $OP의 Airdrop의 주요한 구현은 다음 링크의 MerkleProof.sol과 MerkleDistributor.sol 컨트랙트입니다(https://optimistic.etherscan.io/address/0xfedfaf1a10335448b7fa0268f56d2b44dbd357de#code).

[MerkleProof.sol]

우선, MerkleProof.sol에서 핵심이 되는 function은 다음의 processProof function입니다. 아래의 processProof function은 개별 지갑 주소(leaf)와 앞의 과정에서 만들어진 머클트리 증명(proof)을 활용하여, computedHash를 계산합니다.

function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
// 만약 current computed hash보다 current element of the proof 같거나 크다면
if (computedHash <= proofElement) {
// current computed hash와 current element of the proof을 해싱
computedHash = _efficientHash(computedHash, proofElement);
} else {
// current element of the proof와 current computed hash을 해싱
computedHash = _efficientHash(proofElement, computedHash);
}
}
return computedHash;
}

이렇게 computedHash의 값을 도출하게 되면, MerkleProof.sol의 verify Function은 해당 computedHash와 proof의 root가 일치하는지를 확인합니다. 만약 computedHash와 proof의 root가 일치한다면 개별 지갑 주소(leaf)는 Airdrop 대상인 것이고, 불일치한다면 Airdrop 대상이 아닌 것입니다.

[MerkleDistributor.sol]

특정 지갑이 $OP 컨트랙트에서 Airdrop 토큰을 받아가기 위해 아래의 claim을 요청하면, MerkleDistributor.sol가 해당 지갑이 Airdrop 대상인지를 파악하고, 머클트리 증명에 기록된 수량만큼을 지급하게 됩니다. 이때 claim function은 위에서 살펴본 MerkleProof.sol의 verify function을 호출하여, claim을 요청한 지갑이 Airdrop 대상인지를 확인한 후에 토큰을 배분합니다.

function claim(
uint256 index,
address account,
uint256 amount,
bytes32[] calldata merkleProof
) external override
{
...
// MerkleProof.sol의 verify function을 호출하여 airdrop 대상인지를 확인
require(
MerkleProof.verify(merkleProof, merkleRoot, node),
"MerkleDistributor: Invalid proof."
);
...
}
  • 장단점

이렇듯 저희는 $OP의 사례를 통해서 온체인 상에서 Airdrop이 어떤 방식으로 일어나는지를 간단하게 살펴보았으며, 위의 링크들을 활용한다면 이더리움 상에서 Airdrop을 진행하는 것은 그리 어렵지 않다는 것을 알게 되었습니다. 정리하자면 Airdrop이 가지는 장단점을 다음과 같습니다.

  1. 장점

1) 단기간 내 토큰의 인지도 향상 (마케팅 효과)

Airdrop은 대상자들의 입장에서 토큰을 무료로 받는 행위라고 볼 수 있습니다. 무료 토큰은 누구나 좋아하기 때문에 특정 프로젝트가 Airdrop을 진행한다는 소식이 전해지면 해당 프로젝트에 많은 관심이 쏠리기 마련입니다. 이를 통해서 프로젝트팀은 별도의 마케팅 예산을 편성하여 광고하지 않아도, 토큰을 원하는 사람들이 알아서 해당 프로젝트를 트위터, 블로그, 텔레그램 등 각종 매체를 통하여 홍보해주기 때문에 충분한 마케팅 효과를 누릴 수 있습니다. 그리고 이러한 과정이 매우 단기간 내에 일어날 수 있어서, 프로젝트 팀 입장에서 Airdrop은 매력적인 마케팅 옵션이라고 할 수 있습니다.

2) 투명성

스마트 컨트랙트를 기반으로 진행되는 만큼 ICO와 비교해서 투명한 과정의 토큰 분배라고 볼 수 있습니다. 어떤 지갑들에게 얼마만큼의 토큰이 지급되는지를 누구든지 볼 수 있습니다.

3) 커뮤니티 구축

Airdrop을 통해서 프로젝트 팀은 빠르게 홀더 커뮤니티를 구축할 수 있습니다. 별도의 사전 작업 없이 단순히 토큰을 Airdrop 해주는 것만으로도 많은 홀더들이 생겨나며, 이들은 토큰의 가격 방어를 위해서 해당 프로젝트의 커뮤니티에 참여하게 됩니다. 이런 방식으로 유입된 홀더들이 더욱 활발하게 해당 프로젝트에 기여하고 홍보하는 효과를 기대할 수 있습니다. 이렇듯, 커뮤니티가 중요한 Web 3.0 비즈니스에 특성상 Airdrop은 단기간 내에 거대한 커뮤니티를 구축할 수 있는 효과적인 방법 중에 하나입니다.

4) 특정 행동 유도

출처: Optimism

프로젝트 팀은 Airdrop을 위한 특정 조건들을 설정하여 사용자들이 특정 행동을 하도록 유도할 수 있습니다. 가령, 자신들의 프로덕트를 활발하게 이용하게 만들 수도 있고, 거버넌스 투표에 참여하게 만들 수도 있습니다. 토큰을 원하는 많은 사람들은 프로젝트 팀이 설정한 조건들을 만족하기 위해서 열심히 노력할 것입니다. 실제로 2023년 상반기에 예정된 $OP Airdrop #2의 경우, $100 이상을 Stargate를 통해서 Optimism으로 브릿지하기, PoolTogether에 3일동안 $20 이상 예치하기 등의 조건을 달성하면 Airdrop 대상자가 될 수 있습니다.

2. 단점

1) 덤핑 (지속성 부족)

출처: Decrypt

토큰을 무료로 지급하다보니 지급을 받은 대상자들의 대부분은 해당 프로젝트에 큰 충성심을 가지지 않습니다. 그래서 토큰을 받고 바로 시장에 던지는 경우가 많이 발생합니다. 이는 Airdrop이 과거지향적이며 프로토콜의 미래를 기약할 수 있는 인센티브 방식이 아니기 때문입니다. 실제로 작년 10월 토큰 Airdrop을 진행했던 Aptos의 경우, Airdrop 이후 하루만에 40%가 넘는 가격 하락을 경험하기도 하였습니다. 이렇듯 Airdrop은 일시적으로 폭발적인 마케팅 효과를 일으키는데에는 적합하지만, 지속 가능한 커뮤니티를 구축하는데에 최고의 방식은 아닙니다.

2) 탈중앙성

ICO와 달리 온체인 분배이기 때문에 투명성은 가지지만, IDO와 마찬가지로 탈중앙성을 가지지는 않습니다. 어떤 조건으로 지갑들을 선별하여 얼마만큼의 토큰을 지급할지는 전적으로 프로젝트 팀에서 결정합니다.

3) 규제적인 이슈

Airdrop은 여러 규제적인 문제를 야기할 수 있습니다. 일단, Airdrop은 토큰을 무료로 주는 것이지만 이 또한 증권법을 위반할 수도 있습니다. SEC의 관점에서 실제로 돈을 받고 토큰을 판매할 것이 아닐지라도, Airdrop이 해당 프로젝트의 경제적인 가치를 확장하기 위한 행위이면 판매로 해석될 수 있습니다. 즉, Airdrop을 통해서 프로젝트 팀의 프로덕트가 더욱 활성화되고 경제적인 가치를 가지게 된다면, Airdrop도 판매로 해석되고 증권법상으로 문제가 생길 여지가 있다는 것입니다. 여기에 추가적으로, Airdrop 받은 토큰과 관련해서 세금 관련 문제들도 발생할 수 있습니다. IRS는 Airdrop을 통해 받은 토큰들을 undeniable access to wealth로 해석하여 세금을 부과할 수도 있습니다. 이러한 경우, 자신이 원치 않는 토큰을 에어드랍 받고 강제로 세금을 내야하는 억울한 상황이 발생할 수 있습니다.

5. Outro

토큰은 Web 3.0 프로덕트에 있어서 결정적인 요소 중에 하나입니다. 토큰을 발행함으로써 이전에는 가능하지 않았던 여러 실험적인 BM들이 실현 가능해지기 때문입니다. 토큰을 통해서 더욱 강력한 커뮤니티를 구축할 수도 있고, 유저들에게 특정 행동을 유도할 수도 있습니다. 하지만, 토큰은 금전적인 가치를 가지기 때문에 그 발행과 배분에 있어서 매우 신중해야 합니다. 지금까지 저희는 전통적으로 많이 쓰였던 토큰 배분 방식인 IDO, Auction, Airdrop의 구현 방식과 장단점을 살펴보았습니다. 해당 방식들은 분명 ICO보다는 장점이 많지만 위에서 알아본 것처럼 효율적 가격 결정, 탈중앙성, 분배 등의 측면에서 여전히 개선할 여지가 많은 방식들입니다. 따라서 이러한 전통적인 방식의 토큰 분배들을 개선하기 위한 많은 논의들이 있었고 그 결과로 Balancer에서는 LBP(Liquidity Bootstrapping Pools), Delphi Digital에서는 Lockdrop + LBA(Liquidity Bootstrap Auction)라는 새로운 토큰 분배 방식을 제안하였습니다. 시리즈의 다음 두 개의 글에서는 해당 방식들에 대해서 자세하게 살펴볼 것입니다.

--

--