sudoswap AMM 시리즈 : (1)본딩커브를 통한 효율적인 NFT 거래 플랫폼

verse2
verse2
Published in
13 min readSep 15, 2022

이번 verse2 포스팅은 최근동안 많은 주목을 받은 sudoswap 프로토콜의 sudoAMM에 대한 소개입니다. sudoswap이 새로 도입한 유동성 집중 AMM, 사용자 기능, 유동성 풀 구성 등, sudoAMM의 특징들을 살펴보며 주목받은 이유를 2편에 걸쳐 살펴 보겠습니다.

1.sudoAMM
1.1 sudoAMM 소개

sudoAMM은 NFT 거래를 위해 설계된 유동성 집중 AMM(LSSVM, Least Square Support Vector Machine) 프로토콜입니다. 거래자는 NFT와 토큰 간의 스왑을 낮은 슬리피지로 경험할 수 있으며, 유동성 공급자는 구입 또는 판매 풀에 유동성을 공급하거나, 양쪽 풀에 동시에 유동성을 공급하여 수수료를 획득할 수 있습니다. 그 결과 유동성 공급자는 LP 가격 범위를 더 잘 제어하고, 보다 동적인 구입/판매 벽을 설정할 수 있습니다.

sudoAMM은 오프 체인 오더 북 방식이 아닌 온 체인 유동성(LP, Liquidity pool) pair를 사용합니다. 프로토콜의 기본 단위는 LSSVMPair로, NFT, 토큰 또는 둘을 동시에 보유할 수 있는 pool입니다. 해당 pair는 기존 Uniswap의 x*y = K 방식이 아닌, 맞춤형 본딩 커브 (Bonding curve)를 사용하여 NFT와 토큰(ETH 또는 ERC20) 간 스왑을 최소한의 가스비로 가능하게 만든 AMM입니다. 나아가 사용자는 LSSVMRouter 컨트랙트 하나에서 여러 풀에서 스왑하고 승인(Approval)을 관리할 수 있습니다.

타 플로어(Fractionalize) NFT 프로토콜과 유사하게 현재 sudoswap AMM은 서로 다른 ‘ERC721ID’를 구분하지 않습니다. NFT 구입/판매 풀은 ID에 상관없이 같은 컬렉션 (프로젝트 단위) 내의 NFT면 동일한 가격을 반환합니다. 즉 희소성이 고려되는 것이아닌 각 컬렉션의 FP(Floor Price) 수준에서 가격이 결정되게 됩니다.

풀 생성 화면

프로토콜의 사용자는 크게 유동성 공급자(LP, Liquidity provider)와 트레이더(Trader)로 구분되며, 유동성 공급자는 Token / NFT / Trade pair에 유동성을 선택하여 공급할 수 있습니다. Trader의 경우에는 공급된 유동성에 기반하여 NFT 거래(AMM 형태의 대량거래, 구매 제안 등)를 진행할 수 있습니다. Trade pair에 유동성을 제공하는 경우엔 NFT와 Token을 모두 공급해야하며, 대가로 거래에서 발생하는 수수료를 지급 받습니다.

sudoAMM은 새로운 풀을 생성할 때 이에 해당되는 유동성 포지션(Liquidity position)에 대해서 토큰을 발행하는 것이 아닌 고유의 스마트 컨트랙트와 연결되도록 설계 되어있습니다. 타 프로토콜의 유동성 공급자들이 LP Token을 지급받는 것과는 대조적으로 sudoswap의 경우 모든 자산들을 풀의 스마트 컨트랙트에 귀속시켜, 추가적인 토큰 발행이 필요하지 않습니다.

1.2 Governance Token
sudoswap에는 거버넌스 토큰인 $SUDO가 존재하나 아직 분배가 이루어지지 않았습니다. sudoswap은 DAO(Decentralized autonomous organization)의 실현을 위해 Public Launch 시점에 개발팀의 multi-sig 대신 $SUDO 보유자들에 의해 직접 관리되도록 변경될 예정입니다.

9월 2일 발표된 거버넌스 토큰 분배 계획에 따르면 $SUDO의 초기 발행 물량은 $60M으로 확정되었습니다.
- 이중 $25.12M은 $XMON 보유자(41.49%)에게, $0.9M은 0xmons NFT 보유자(1.5%)에게, $0.9M은 LP 에어 드랍(1.5%), $15.08M은 금고(51.1%)에 배치됩니다.
- $9M은 운영진(15%), $9M은 SudoRandomLabs(15%)에 분배 되도록 설계되었습니다. (해당 분배는 1년 클리프 및 3년 베스팅 기간 조항이 적용됩니다.)

1.3 Protocol UX
1.3.1 트레이더 UX

컬렉션 구매 예시 화면

트레이더들은 sudoAMM에서 유동성이 공급된 컬렉션(Collection)의 NFT를 구입/판매할 수 있습니다.

NFT를 판매하는 경우

  • 판매하는 경우에는 ‘List’와 ‘Sell’ 두가지 경우가 존재합니다.
  • ‘List’ 기능에서는 원하는 가격에 NFT를 등록할 수 있으며 구입자가 나타날때 까지 기다려야합니다.
  • ‘Sell’ 기능에서는 본딩 커브에 기반해 즉각적인 판매와 정산이 이루어집니다.
  • ‘Sell’을 선택할 경우, 본딩 커브로 인해 슬리피지가 발생할 수 있으며, 이는 시장가치보다 조금 더 저렴하게 판매되는 것을 의미합니다. 판매하는 NFT의 숫자가 많아질 수록, 슬리피지가 커지도록 설계되어 있습니다.

NFT를 구입 하는 경우

  • ‘Buy’ 기능에서는 NFT를 토큰이나 다른 NFT를 통하여 구매할 수 있으며, 한 번에 여러 개의 NFT를 거래할 수 있습니다.
  • ‘Make collection offer’에서는 토큰을 예치하고, 여러 NFT에 대한 구매 제안를 넣을 수 있습니다. 이를 활용하기 위해서는 다음과 같은 조건(Parameters)을 설정해야 합니다.
  • 시작가 (Start price): 첫 번째 NFT를 구매할 가격
  • 가격 감소 폭 (Price decrease): NFT 구매 시마다 감소하는 가격 폭
  • 최대 구매 수량 (Max number to buy): 최대로 구매할 NFT의 숫자

1.3.2 유동성 공급자 UX
유동성 공급자는 sudoAMM에 LSSVMPair를 만들 수 있습니다.
이때 유동성 공급자가 만들 수 있는 Pair 종류는 다음과 같습니다.

  • Token Pair: 토큰을 예치하고 구매할 특정 NFT 컬렉션을 지정하여 생성
  • NFT Pair: NFT를 예치하고 지급받을 토큰 종류/수량을 지정하여 생성
  • Trade Pair: 토큰과 NFT를 동시에 예치하여 위의 두 Pair에서 거래가 일어날 수 있게 하여 거래 수수료를 받는 Pair

Token/NFT pair 생성 시 유동성 공급자는 다음과 같은 조건을 설정해야 합니다.

  • 시초가(Initial price) : Pair에서 설정할 NFT의 최초 시작 가격
  • 본딩 커브 (Bonding curve): Pair의 Bonding Curve의 형태 (선형 / 지수 곡선)
  • 델타 값 (Delta): Pair 내에서 거래가 한 번 발생할 때 가격이 변하는 크기
  • 예치 규모 (Deposit amount): Pair의 내에 예치할 토큰/NFT의 수량

Trade pair 생성과정에서 유동성 공급자는 아래의 조건들을 추가적으로 지정해야 합니다.

  • 수수료(Fee): 거래 수수료(%, Trade pair는 나머지 두 pair (Token/NFT) 사이에서 실제 거래가 이루어질 수 있게 유동성을 제공하는 대가로 거래 수수료를 지급받음)
  • 예치 규모(Deposit amount): Pair 내에 동시에 예치할 Token/NFT의 수량으로, 해당 유동성이 거래에 사용됩니다.
  • 추가적으로 하단에 Bonding curve를 표시하여 구입/판매 시 가격을 표시해 줍니다.

2 프로토콜 구조 및 본딩 커브를 통한 가격 결정 방법

sudoswap 구조

가격을 결정하는 과정에서 LSSVMPair는 유동성 공급자가 설정한 특정 본딩 커브와 연결됩니다. 현재 LSSVMPair는 선형 곡선(Linear curve)과 지수 곡선(Exponential curve), 두 가지 종류의 곡선을 지원합니다. 2가지 곡선 이외의 본딩 커브도 향후 화이트리스트 과정을 통해 LSSVMPair에 추가될 수 있습니다. 본딩 커브는 해당 거래 Pair에서 거래 후 가격을 결정하는 데에 사용되지만, 이때 호출하는 Pair 자체를 수정하지는 않습니다. 즉, 입/출력 검증 및 가격 업데이트를 위한 실제 과정은 LSSVMPair 컨트랙트 자체에서만 발생하게 됩니다.

2.1 현물 가격
현물가격(Spot price)는 1 NFT를 해당 Pair에 판매하는 즉각적인(Instantaneous) 가격을 나타냅니다. 이때 해당 pair에서 1 NFT를 구매하기 위한 구매 금액(buy price)은 기존 현물가에 delta 1 단위가 더해진 가격으로 설정됩니다. 즉, 한 pair에서 NFT를 구매하는 가격은 NFT를 판매하는 가격보다 항상 델타값만큼 큽니다. (선형 곡선의 경우 델타값만큼, 지수 곡선의 경우 델타값 배만큼)

위를 종합해 보면 아래와 같은 식으로 정리 될 수 있습니다.

buy price of t_1 = sell price of t_0 + delta

예를 들면, 현물가가 1 ETH이고, 델타값이 0.1ETH인 선형 곡선을 가정한 LSSVMPair에서 1NFT를 판매하는 사용자는 1 ETH (첫번째 트랜잭션 때의 판매 가격)를 받는 반면, 해당 pair에서 1 NFT를 구매하는 사용자는 (1+0.1) = 1.1ETH (두번째 트랜잭션 때의 구매 가격)를 보내야 합니다.

따라서 수동으로 현물가를 조정하는 페어 관리자(Pair manager)는 거래시 가격 차이를 염두에 두어야 합니다.

2.2 선형 곡선
선형 곡선(Linear curve)은 점진적으로 가격 변화를 일으킵니다. 이때 선형 곡선에서 현물 가격(Spot price), 구매 가격(Buy price), 판매 가격(Sell price)는 아래와 같이 결정됩니다.

2.2.1 구매 가격 (Buy price) 산정

선형 곡선을 설정하여 구매 생성하는 경우

  • 선형 곡선의 경우 현물 가격은 구매한 각 NFT에 대해 델타값만큼 증가합니다
  • 예를 들면, 첫 거래시 현물가격(=판매 가격)이 S ETH라고 하면, 1 NFT를 구매하는 데 필요한 구매가격은 (S+delta ETH)가 됩니다. 구매 이후 새로운 현물가격은 (S+delta)이고, 따라서 판매가격도 (S+delta) ETH가 됩니다.
  • 이때 구매 전 현물 가격(= 판매 가격)에 비해 구매 가격이 델타만큼 상향 조정되는 것은 유동성 공급자의 차익 거래를 막기 위해서입니다.
  • 만약 구매와 판매 시 현물 가격이 같다면, 사용자는 1 NFT를 S ETH에 구매해서 (S + delta) ETH로 판매하여 delta ETH 만큼의 차익을 얻을 수 있습니다.
  • 구매 가격 = (현물 가격 (= 구매 전 판매 가격) + delta) NFT로 적용하고, 구매 후 판매 가격 = 구매 가격으로 설정하면 이와 같은 차익 거래를 방지할 수 있습니다.
  • n 개의 NFT를 구매하면 총비용은 다음과 같습니다.
    (현물 구매 가격) + (현물 구매 가격+ 1*delta) + (현물 구매 가격 + 2*delta) + .. + (현물 구매 가격 + (n-1)*delta)
    공식화하게 되면 아래와 같은 수식을 구할 수 있습니다
    : n*(현물 구매 가격) + (delta)*(n*(n-1)) / 2
    n = 구매 NFT의 총개수

2.2.2 판매 가격 (Sell price) 산정

  • NFT를 판매한 후 현물 가격의 변화(totalPriceDecrease: 현물 구매 가격 — 1*delta)를 계산합니다.
  • 현재 spot price가 변화되는 Delta보다 총 금액보다 낮은 경우, 새로운 현물가격을 0 으로 설정합니다. (음수 값이 도출될 수 없습니다.)
  • 현물 가격이 0에 도달할 때까지 선형 곡선으로 얼마나 많은 항목을 판매할 수 있는지 계산하고 반올림합니다.
  • n개의 NFT를 판매 한다면, 총 판매 금액은 다음과 같습니다.
    (현물 판매 가격) + (현물 판매 가격- 1*delta) + (현물 판매 가격 — 2*delta) + … + (현물 판매 가격 — (n-1)*delta)
  • 총 구매 비용 공식과 같이, 총 판매 금액도 수식을 구할 수 있습니다.
    n*(현물 판매 가격) — delta * (n*(n-1)) / 2
    n = 판매 NFT의 총개수

2.3 지수 곡선
본딩 커브를 설정할 때 선형 곡선이 아닌 지수 곡선(Exponential curve)으로 설정한 경우, 현물 가격은 구매한 각 NFT에 대해 ‘델타값’ 배만큼 증가합니다. 이 부분을 제외하고는 선형 곡선과 같은 특성을 가집니다.

지수 곡선을 통하여 NFT를 판매하는 경우
예를 들어, 첫거래에서 현물 가격이(= 판매 가격) S ETH라고 하면, 1 NFT를 구매하는데 필요한 구입 가격은 (S*delta) ETH 가 됩니다. 구매 이후 새로운 현물 가격은(S*delta) ETH이고, 따라서 판매 가격도 (S*delta) ETH 가 됩니다.

선형 곡선과 비교했을 때 다른 점은, 구매 전 현물 가격이 (= 판매 가격)에 비해 구매 가격이 유동성 공급자들의 차익 거래를 막기 위해 ‘델타값’ 배만큼 상향 조정되는 것입니다. 지수 곡선 또한 마찬가지로, 만약 구매와 판매 시 현물 가격이 같다면, 사용자는 1 NFT를 S ETH에 구매해서 (S*delta) ETH로 판매하여 S*(delta-1) ETH 만큼의 차익을 얻을 수 있습니다.

따라서 구매 가격 = 현물 가격 :구매 전 판매 가격 * delta)로 적용하고, 구매 후 판매 가격 = 구매 가격으로 설정하면, 이와 같은 차익 거래를 방지할 수 있게 됩니다.

  • 지수 곡선 선택 시 총 구매 비용은 아래와 같이 구할 수 있습니다.
    현물 구매 가격 + (delta * 현물 구매 가격) + (delta² * 현물 구매 가격) + .. + (delta^( n — 1) * 현물 구매 가격)
    이는 현물 구매 가격 * (delta^n-1) / (delta -1)로 요약될 수 있습니다.
    n = 구매 NFT의 총개수

2.4 멀티 스왑 시 가격 산출
사용자가 한번의 스왑에서 NFT를 다중 거래하는 경우, 현물 가격은 구매 또는 판매된 각 NFT에 대해 델타값으로 업데이트됩니다.

예시로 현물 가격이 1 ETH이고, delta가 0.1 ETH인 LSSVM Pair 선형곡선을 가정하겠습니다. 사용자가 해당 pair에 5개의 NFT를 판매하면 다음과 같은 sell price를 적용받게 됩니다.

  • 첫 번째 가격: 1 ETH, 두 번째 가격: 0.9 ETH …. 다섯 번째 가격: 0.6 ETH
    멀티 스왑이 끝나게 되면, 새로운 현물가는 0.5 ETH로 설정 됩니다.

이번 포스팅에서는 sudoAMM에 관한 전반적인 요약과 가격 산정 방식에 대해 다루었습니다. 다음 포스팅에서는 LSSVMPair와 LSSVMRouter의 기능적 면모를 분석해보겠습니다.

본 글은 verse2에서 제공하는 sudoswap AMM 시리즈: (1)본딩커브를 통한 효율적인 NFT 거래 플랫폼입니다. sudoswap AMM 시리즈를 읽기 원하신다면 아래의 리스트를 참조하십시오. 시리즈의 경우 순차적으로 글을 읽는 것을 권장드립니다.

1. sudoswap AMM 시리즈: (1)본딩커브를 통한 효율적인 NFT 거래 플랫폼
2. sudoswap AMM 시리즈: (2) sudoswap AMM의 모델 메커니즘

verse2는 Web3 프로덕트 개발에 전문화된 팀이자, 잠재력 있는 Web3 프로젝트를 위한 인큐베이터입니다. 팀은 Crypto Finance 분야에 대한 심층적인 지식과 경험을 보유하고 있습니다.

verse2 [Homepage | Twitter | Medium]

--

--

verse2
verse2
Editor for

Build, incubate, invest — Making all possible in the crypto. / verse2.io