# 소개

KLAYswap Documentation에 오신 것을 환영합니다! 이 문서는 AMM 프로토콜을 사용하는 방법부터 AMM 프로토콜의 특징, 토큰 이코노미 및 기능 등 KLAYswap에 대해 알아야 할 모든 것을 다룹니다.

**이 문서에서는 Klaytn Network의 AMM 프로토콜인 KLAYswap과 KLAYswap의 기능 및 거버넌스 토큰인 KSP(KLAYswap Protocol)에 대해 소개합니다.**

AMM (Automated Market Maker) 프로토콜은 현재 DeFi (Decentralized Finance) 라는 탈중앙화 금융 시장을 일반 대중에게까지 알리게 한 결정적인 DEX 프로토콜입니다. AMM 이란 간단히 말해 기존의 매수/매도로 구성된 오더북을 유동성 공급자들에 의해 조성된 온체인 유동성 풀 (Liquidity Pool) 로 대체하여 토큰 간의 즉각적인 스왑을 지원하는 프로토콜입니다.

AMM 기반의 덱스를 포함하여 전반적인 탈중앙화 금융 생태계를 활성화하기 위해서는 풍부한 유동성이 필요합니다. 이더리움의 대표적인 DeFi 프로토콜인 유니스왑 (Uniswap)의 경우 현재 약 USD 2.7 B 이상의 자산이 유동성 풀로 조성되어 있으며, 사용자들은 이 유동성을 기반으로 거래 활동을 합니다. 기존 이더리움 생태계의 DeFi 프로토콜에 비교하여 KLAYswap이 확실한 차별점을 가지며 실질적으로 사용될 수 있도록, 오지스는 오르빗 브릿지라는 체인 간 자산이 연계되어 이전의 탈중앙화 세계에서는 다루기 어려웠던 자산들의 페어와 유동성이 공급되는 환경을 일차적으로 구축했습니다. 오늘은 새롭게 구축된 클레이튼의 유동성 환경을 활용할 수 있는 DeFi 솔루션, KLAYswap을 여러분들께 소개드립니다.

**KLAYswap은 여러분의 참여를 기다립니다.**

완전한 온체인 인스턴트 스왑 프로토콜인 KLAYswap에서 거래자들은 유동성 풀에 의한 즉각적인 거래 환경을 경험할 수 있을 뿐 아니라, KSP라는 거버넌스 토큰으로 KLAYswap의 정책과 방향성 등을 결정하며 서비스를 발전시킬 수 있습니다.

또한, 사용자들은 프로토콜의 성장에 기여하는 만큼 거래 수수료 수익 등 다양한 형태의 기여 보상을 받을 수 있습니다. 암호화폐를 장기간 보유하고자 하는 장기 투자자, 수수료 수익을 원하는 투자자, KSP 마이닝을 통해 KLAYswap 거버넌스에 참여하고자 하는 채굴자 등 다양한 분들이 KLAYswap 생태계에 참여할 수 있습니다.

그동안 DeFi를 경험해보고 싶었지만 생소한 동작방식과 낮은 접근성으로 참여에 어려움을 겪었던 모든 분들이 이번 KLAYswap 런칭을 통해 손쉽게 경험하고 즐길 수 있을 것으로 기대합니다.

여러분들의 많은 참여를 부탁드리며, KLAYswap을 시작으로 클레이튼 네트워크에 만들어질 다양한 DeFi 프로토콜을 기대해주세요.


# 프로토콜 개요

KLAYswap은 AMM 기반 스왑 프로토콜입니다.

AMM은 기존 오더북 기반의 DEX에서 발전하여, 온체인상에서의 암호화폐 거래 방식을 변화시킨 혁신적인 거래 매커니즘입니다. 매수/매도 오더북을 대신하여 유동성 공급자들에 의해 조성된 유동성 풀을 통해 트레이더들은 자유롭게 거래할 수 있으며, 유동성 공급자들은 해당 유동성 풀에서 발생하는 거래수수료를 자신의 유동성 기여분에 맞춰 수익으로 공유 받을수 있습니다. 또한, KCT (Klaytn Compatible Token) 타입을 따르는 토큰을 보유하고 있는 보유자라면 누구든 유동성 공급자가 될 수 있습니다.

KLAYswap의 AMM 메커니즘은 x\*y=k \[ x= KLAY, y= KCT, k= Constant Function ] 공식을 바탕으로, 유동성 풀 생성시에 각 토큰의 수량에 따라 해당하는 토큰의 가격대가 형성됩니다. 예를 들어, x (KLAY) 의 유동성 공급량이 증가하면 상수 함수 k를 유지하기 위해 y (KCT)가 줄어듭니다. 이와 같은 방식으로 유동성 풀에서 토큰 별 공급 수량이 변화하며 가격이 형성되도록 설계되어 있습니다.

**참여자들:**

KLAYswap은 AMM(Automated Market-Making) 메커니즘과 유동성 풀로 동작하는 스왑 프로토콜로, KLAY 또는 KCT 유형의 토큰을 보유한 모든 사람이 유동성 공급자가 되어 거래 수수료로 수익을 얻을 수 있는 온체인 스왑 서비스입니다.

* **단일 예치자** : 한 개의 자산을 풀에 예치하고 해당 토큰의 예치 이자와 KSP 보상을 받을 수 있습니다. 단일 예치자는 풀(컨트랙트)에 자산 예치 시 공급 증표인 iToken을 지갑에 수령하게 되며, 풀 내에서의 내 iToken 지분율에 따라 각종 보상을 분배받습니다.
* **일반 페어 예치자** : 두 개의 자산을 V2 풀에 예치하고 KSP보상, 추가 에어드랍 보상을 받을 수 있습니다. 일반 페어 예치자는 풀(컨트랙트)에 자산 예치 시 공급 증표인 LP (Liquidity Provider) Token을 지갑에 수령하게 되며, 풀 내에서의 LP Tokne 지분율에 따라 각종 보상을 분배받습니다.
* **집중화 페어 예치자** : 두 개의 자산을 V3 풀에 예치하고 거래 수수료 수익, KSP보상, 추가 에어드랍 보상을 받을 수 있습니다. 집중화 페어 예치자는 풀(컨트랙트)에 자산 예치 시 공급 증표인 LP (Liquidity Provider) NFT를 지갑에 수령하게 되며, 풀 내에서의 지분율에 따라 각종 보상을 분배받습니다.
* **플러스 페어 예치자** : 두 개의 자산 예치 시 내 자산과 함께 추가 자산(플러스 자산)을 투입하여 극대화된 KSP보상, 추가 에어드랍 보상을 받을 수 있습니다. 추가 예치하는 자산은 단일 풀에서 활용합니다. 풀(컨트랙트)에 자산 예치 시 일반 페어 예치와 동일하게 공급 증표인 LP (Liquidity Provider) Token을 지갑에 수령하게 되며, 풀 내에서의 LP Tokne 지분율에 따라 각종 보상을 분배받습니다.
* **거래자** : KLAYswap 풀에서 원하는 토큰을 거래할 수 있습니다. 거래 가격은 풀 내 예치된 두 자산의 수량(교환비율)에 따라 변동됩니다.
* **스테이커** : 스테이커는 KSP를 스테이킹하고 KSP 인플레이션 보상을 받습니다. 장기간 스테이킹 할 수록 더 많은 vKSP(투표권)를 획득하며, 전체 프로토콜 vKSP에서 내 지분율에 따라 KSP 보상과 KLAYswap Drops를 통해 분배되는 다양한 토큰 에어드랍까지 획득할 수 있습니다.
* **풀 투표자** : KSP 스테이킹 후 획득한 vKSP(투표권)를 활용해 풀 투표에 참여하는 경우, 해당 풀에서 발생한 거래 수수료의 50%를 분배 받습니다.

\*AMM 기반 스왑 프로토콜에서는 거래 시점의 예상 가격과 실제 체결된 가격의 괴리 (슬리피지/Slippage)가 발생할 수 있습니다. 또한, 유동성 공급자는 공급 시점 이후에 해당 풀의 토큰 가격이 외부 가격과의 괴리가 발생하여 자동화된 마켓 메이킹 메커니즘에 의해 조정되는 과정에서 손실 (Impermanent Loss) 이 발생할 수 있습니다.

거래 및 유동성 공급시에는 해당 리스크를 염두에 두시고 진행하시길 바랍니다.


# 핵심 개념

KLAYswap의 스마트 계약 구조, 스왑 요청 및 채굴의 핵심 개념을 설명합니다.

![](/files/F4VIfuBUoEHkPFTuEktj)

\
계약 유형:‌

* Factory Smart Contract
* Exchange Smart Contract
* Governance Smart Contract
* VotingKSP Smart Contract
* PoolVoting Smart Contract
* Treasury Smart Contract
* Distribution Smart Contract

‌

계약 유형은 문서의 [Contract](/kr/developer/contract) 부분에서 더 자세히 설명하겠습니다.&#x20;


# 클레이스왑의 장점

KLAYswap은 안정성, 지속 가능성 및 확장성의 장점이 있습니다.

**안정성**

KLAYswap은 세계적인 보안 감사 기관과 협업해 보안감사를 진행 중입니다. KLAYswap은 프로토콜을 구성하는 다양한 스마트 컨트랙트로 모든 동작이 이루어집니다. 스마트 컨트랙트 내의 작은 취약점 하나만으로도 서비스 이용 및 보안과 관련하여 치명적인 사고가 발생할 수 있습니다. 사용자들의 거래 안전을 최우선시 하는 KLAYswap은 예상되는 모든 보안 사고를 미연에 방지할 수 있도록 세계적인 보안 감사 기관에 의뢰해 꾸준히 보안 인증을 진행 중에 있습니다.

{% content-ref url="/pages/bXoNHEwpGkqYYDz3adWP" %}
[보안 감사](/kr/audit)
{% endcontent-ref %}

**지속 가능성**

KLAYswap은 Uniswap의 아류작이 아닙니다. sKLAY와 KLAY 축을 중심으로한 ‘실질적’이고도 ‘유의미한’ 거래 볼륨이 꾸준히 발생할 수밖에 없는 구조입니다. 특히 sKLAY의 경우 스테이킹 된 KLAY와 본딩된 자산이기 때문에 7일의 언스테이킹 기간을 회피하고자 ‘할인’하려는 수요와, 시장가격보다 저렴하게 KLAY를 구매하려고 하려는 수요가 만나는 흥미로운 시장이 형성될 것입니다. 특히 sKLAY-KLAY 풀에 기여할 경우 :

1. KSP 마이닝 토큰 획득
2. KLAYswap에서 발생하는 거래 수수료에 대한 KLAY 획득
3. sKLAY 보유로 KLAY에 대한 스테이킹 보상 KLAY의 획득이 가능합니다.

그 어떤 다른 Swap 서비스에서도 찾아볼 수 없었던 (3) 항목의 수익이 보장됨으로 인하여 더 많은 가치의 창출이 가능해지는 것은 물론 기존의 DeFi가 갖고 있던 지속 가능성 문제 또한 해결할 수 있습니다.

**확장성**

KLAYswap은 단순히 Klaytn 기반의 토큰만을 다루는 것이 아닌, 실생활에 존재하는 다양한 디지털 자산을 다루고자 하는 Klaytn 재단의 목표에 맞춰 Orbit Chain의 상호운용성에 의해 타 네트워크 기반 토큰들까지 다룰 수 있습니다. 유동성 채굴 프로그램에서 확인할 수 있듯이, 이더리움 기반의 토큰들 (ETH, ORC, DAI, WBTC) 은 오르빗 브릿지를 통해 클레이튼 생태계로 넘어올 수 있습니다.

또한, 유동성 공급시 공급 증표로 나오는 LP 토큰은 자체적으로 수익을 발생 시킬 수 있는 구조이기 때문에, 타 금융 프로토콜과의 연동이 가능하며 생태계 내 모든 이해관계자 간 가치 교환을 가능하게 합니다. 이 LP 토큰을 활용하여 클레이튼에는 혁신적인 금융 어플리케이션이 만들어질 수 있습니다. 요약하자면, KLAYswap은 상호운용성과 자산의 효율성 증대로 인하여 확장성이 확보된 상태로 Klaytn의 경제 생태계를 활성화 시킬 수 있는 중요한 ‘시작점’과 같습니다.\
\ <br>


# 위험 & 보안

KLAYswap 사용에는 다음과 같은 위험요소가 있음을 주의하시기 바랍니다.

&#x20;

●   KLAYswap은 <mark style="color:blue;">**중앙화된 중개인이 없는 블록체인 탈중앙 프로토콜**</mark>로 사용자는 스스로의 책임과 판단으로 다른 사용자들이 생성한 블록체인 상의 유동성 풀을 통해 거래에 참여하게 됩니다. 이로 인해 사용자의 실수로 발생한 결과에 대해 복구지원을 받기 어려운 경우가 많으므로 실수(오송금등)에 의한 리스크 관리를 위해 항상 먼저 소액으로 테스트를 해보실 것을 권고합니다.

●   클레이스왑 웹사이트에서 확인되는 모든 자산 및 자산 유동성 풀은 <mark style="color:blue;">**개별 심사를 거치지 않고 사용자가 자율 등록한**</mark> 클레이튼 체인상의 토큰이며 <mark style="color:blue;">**클레이스왑 팀에서 안전성을 보증하지 않습니다.**</mark>

●   AMM(Automated Market Maker) 방식의 특성상, 사용자가 클레이스왑에서 자산 교환 시 건당 규모, 현재 풀에 대기중인 자산수량(비율), 풀의 실시간 입출금 변동에 따라 사용자가 적용받는 <mark style="color:blue;">**자산가격이 크게 변동할 수 있습니다.**</mark>

●   자산가격 변동으로 인해 사용자가 예상하지 못한 가격 또는 비율로 자산이 풀에 예치되거나 출금될 수 있으며, 풀에 예치한 시점의 가격에서 변동이 발생할 경우 출금 시 일반적으로 자산을 그냥 보유했을 때보다 손실이 발생할 수 있습니다.

●   웹사이트 내에서 <mark style="color:blue;">**표시되는 모든 수치는 사용자의 판단을 돕기 위해 제공되는 추정적 예상 정보**</mark>로, 정보의 적시성, 적합성, 정확성을 보증하지 않습니다.

●   정상적인 클레이스왑 웹사이트는 <mark style="color:blue;">**절대로 사용자 개인지갑의 개인키, 니모닉키, 시드 구문 등의 입력을 요구하지 않습니다.**</mark>

●   그 외 위험요소, 유의사항 및 사용조건은 아래 내용을 확인해주시기 바랍니다.

## **1. 개요**

KLAYswap은 제3자가 개발한 클레이튼(Klaytn) 체인을 플랫폼으로 활용하는 <mark style="color:blue;">**탈중앙 어플리케이션(DApp)**</mark>입니다. 클레이스왑의 사용자는 클레이스왑 사이트([https://klayswap.com](https://klayswap.com/))(이하 KLAYswap과 클레이스왑 사이트를 함께 “클레이스왑”이라 합니다)를 비롯한 접근 인터페이스를 통해 자신이 소유한 클레이튼 블록체인 지갑을 탈중앙화 프로토콜과 직접 통신하여 여러 가상자산의 교환 및 유동성 공급 기능을 이용할 수 있습니다.

<mark style="color:blue;">**본 유의사항 안내문(이하 “본 안내문”이라고 합니다)의 내용은 사용자가 클레이스왑을 사용하기 위해 반드시 동의하여야 하는 사항을 포함하고 있으니 주의 깊게 끝까지 읽어 주시기 바랍니다. 사용자가 본 안내문을 확인하고 클레이스왑을 계속 사용할 경우, 본 안내문의 내용을 읽고 이해하고 동의한 것으로 인정됩니다.**</mark>

&#x20;

## **2. 본 안내문의 변경**

본 안내문의 내용은 클레이스왑의 변경, 추가, 삭제, 보완, 사용자 보호, 오류 수정 등 사유로 상시 변경될 수 있습니다. 본 안내문의 내용이 변경될 경우, 변경 내용이 게시된 시점부터 변경 내용의 효력이 발생합니다. 다만 변경될 내용이 사용자에게 불리하거나 중대한 사항의 변경인 경우에는 그 효력발생일 30일 이전부터 게시합니다. 효력발생일 이후에 사용자가 변경된 본 안내문을 확인하고 클레이스왑을 계속하여 이용하는 경우 변경 내용을 읽고 이해하고 동의한 것으로 인정됩니다.

&#x20;

## **3. 이용 자격(Eligibility)**

• 클레이스왑을 사용하려면, 사용자는 자신의 국가에서 최소한 민사상 성년(예: 싱가포르 기준 만21세)이어야 하며 사용자 자신 혹은 사용자가 대리 또는 대표하는 법인을 대신하여 민사상 계약을 체결하고 이를 준수할 수 있는 완전한 권리 및 권한을 가지고 있음을 진술하여야 합니다.

• 사용자는 (i) 어떠한 정부 당국(the Office of Foreign Assets Control of the U.S. Department of the Treasury 등을 포함하나 이에 국한되지 않음)에 의해서도 경제 또는 무역 제재의 대상에 등재되지 않았고, (ii) 미국에 의한 포괄적인 경제 제재의 대상이 되는 관할 구역의 시민, 거주자가 아니고, (iii) 사용자의 클레이스왑 접근 및 사용이 관련 법령과 규제를 완전히 준수하고, 사용자가 어떠한 불법적인 활동을 수행하거나 촉진, 조장할 목적으로 클레이스왑을 사용하지 않을 것을 진술합니다.

&#x20;

## **4. 클레이스왑 이용과정에서의 유의사항**

## **4.1. 일반사항**

클레이스왑 사이트 이용 시 안정적인 네트워크 환경 조성을 위해 반드시 아래 유의사항을 확인해주시기 바랍니다.

• 사이트 이용 시 한 개의 탭을 사용하는 것을 권장합니다.

• 여러 개의 탭으로 장시간 접속, 회사/공용 IP를 사용하는 장소에서 접속, RPC에 과도한 요청이 발생하는 경우 이용이 어려울 수 있습니다.

• 이외 기타 원인으로 인하여 사이트 이용이 어려운 경우 사이트에 접속중인 모든 탭을 종료한 후 최소 1시간 초과 후 다시 사이트에 접속해주시기 바랍니다.\[O1]

&#x20;

## **4.2. 자산 입출금 관련**

### **4.2.1. 자산 입출금 일반**

사용자는 클레이스왑에서 자산 입출금을 위해 다음과 같은 사항에 유의해야 합니다.

• 트랜잭션을 요청하기 위해서는 클레이튼 자산을 다룰 수 있는 클레이튼 지갑과, 클레이튼 체인에서 트랜잭션 처리 수수료로 사용할 약간의 클레이튼(KLAY)을 보유하고 있어야 합니다.

• 클레이스왑에서 예치에 활용할 수 있는 자산은 클레이튼 체인 상에서 발행된 클레이튼 호환 토큰(KCT, Klaytn Compatible Token) 형태를 따릅니다. 그러므로 <mark style="color:blue;">**클레이튼 호환 토큰(KCT) 종류와 다른 이종 체인(이더리움, 리플, 바이낸스 스마트체인 등, 여기에 명시적으로 언급된 자산에 한정되지 않음)의 자산은 반드시 브릿지 사이트를 통해 클레이튼 호환 토큰 형태로 전환하여 입금해야 합니다.**</mark>

[토큰별 입금 방법 보기(링크)](https://docs.klayswap.com/v/kr/how-to-guides/deposit)\ <br>

### **4.2.2. 자산 오송금**

사용자는 클레이스왑에서 자산의 입출금을 진행할 때 자산의 종류와 주소를 정확히 확인하여야 합니다. 사용자가 <mark style="color:blue;">**클레이튼 체인에서 지원하지 않는 종류의 자산을 입금하거나, 입금 주소를 미입력하거나 오입력할 경우**</mark> 정상 입금 처리가 되지 않아 <mark style="color:blue;">**자산이 유실될 수**</mark> 있습니다.

자산 오송금과 관련된 보다 자세한 유의사항은 아래 링크를 참조하시기 바랍니다.

• 클레이튼과 다른 이종 체인의 자산이지만 브릿지 사이트를 거치지 않고 클레이스왑 인터페이스를 통해 바로 지갑 입출금이 가능한 일부 자산(리플, XRP)의 경우에도, <mark style="color:blue;">**사용자는 각 지갑별로 할당되는 입금주소와 데스티네이션 태그를 정확히 입력해야 합니다. 입금 주소 또는 데스티네이션 태그를 미입력하거나 오입력할 경우 정상 입금 처리가 되지 않아 자산이 유실될 수 있습니다.**</mark>

• <mark style="color:blue;">**클레이스왑은 사용자 자산의 개인 키를 중앙 주체가 관리하지 않는 탈중앙형 애플리케이션으로서, 위와 같은 상황을 포함한 사용자의 오입금에 대해 클레이스왑에서 자산의 복구 및 기술적 지원이 불가능한 구조로 되어 있습니다.**</mark> 이 구조는 사용자가 자산을 오입금할 경우 해당 자산에 대해 클레이스왑을 비롯한 어느 누구도 접근할 수 없게 설계되어 있으며, 이 때문에 클레이스왑의 오입금 대응은 다른 중앙형 거래소(Upbit, Bithumb, Coinone 등)에서의 오입금 대응방식과는 기술적, 구조적인 사유로 인하여 동일하지 않을 수 있습니다.

• 사용자 실수를 방지하기 위해 먼저 **소액으로 입출금 테스트 완료 후 전체 자산을 전송**하는 것을 권장합니다.

\* 브릿지를 통해 발생한 자산 오입금은 개별 브릿지 사이트의 약관, 유의사항을 확인해주시기 바랍니다. 오르빗 브릿지의 경우에는 아래 링크를 참조하시기 바랍니다.

[오르빗 브릿지(링크)](https://bridge.orbitchain.io/)

&#x20;

## **4.3. 유동성 공급(예치), 유동성 제거(출금), 스왑 관련**

사용자는 클레이스왑에서 유동성 풀에 사용자의 자산을 공급(예치)하거나 제거(출금)하여 유동성 공급자의 포지션을 취할 수 있고, 또한 유동성 풀을 통해 스왑 거래를 할 수 있으나, 이로 인해 발생할 수 있는 위험에 대해 인지하고 모든 행위를 자신의 판단과 책임으로 진행하여야 합니다.

### &#x20;**4.3.1. 가격**

클레이스왑은 AMM(Automated Market Maker) 방식을 기반으로 작동하여, 클레이스왑에서 각 토큰의 가격은 토큰 쌍이 예치된 컨트랙트 내의 교환비율로 결정됩니다. 자동화된 스마트 컨트랙트가 각 풀이 x\*y=k 공식에 의해 항상성을 유지하도록 가격을 조정하기 때문에, 이에 따라 클레이스왑 웹사이트에 표시되는 가격은 <mark style="color:blue;">**타 거래소의 가격과 동일하지 않을 수 있으며, 적정가격 또는 시세와의 일치를 보장할 수 없습니다.**</mark>

\[참고] [AMM이 가격을 측정하는 방식](https://academy.binance.com/ko/articles/what-is-an-automated-market-maker-amm)

가격과 관련된 보다 자세한 유의사항은 아래 링크를 참조하시기 바랍니다.

• 사용자가 자산을 예치, 출금, 스왑 하는 시점의 각 토큰 가격은 위의 가격 측정 방식(토큰 쌍의 교환 비율)으로 적용되며, <mark style="color:blue;">**교환 수량에 정비례하여 가격이 결정되지 않습니다.**</mark>

• 또한 다양한 참여자들의 실시간 참여로 인해 <mark style="color:blue;">**순간적으로 토큰 쌍의 교환 비율이 변경**</mark><mark style="color:blue;">됨에 따라</mark> <mark style="color:blue;"></mark><mark style="color:blue;">**거래 직전 클레이스왑 웹사이트 상에서 표시된 가격이 거래시점에 변동될 가능성이 존재하며, 실제 거래시점에 적용되는 가격은 달라질 수 있습니다.**</mark> (토큰쌍에서 거래 발생, 토큰 쌍에서 자산 입출금 등)

• 클레이스왑 프로토콜은 현재 교환 비율이 크게 변동되어 발생할 수 있는 손실을 최소화하기 위하여 사용자가 적용 받게 될 교환비율에서 일정 범위 내에서만 요청이 실행될 수 있도록 안정 장치를 두고 있으나, <mark style="color:blue;">**사용자는 반드시 거래시점에 적용된 교환 비율을 명확하게 확인한 후에 유동성 예치, 출금, 스왑을 진행해야 합니다.**</mark>

&#x20;

### **4.3.2. 예상 수익률, 활용 비용의 표시**&#x20;

예치 수익률, KSP 분배수익률, 에어드랍 수익률, 거래 수수료 수익률, 스테이킹 수익률, 플러스 예치자가 단일 풀 자산을 활용하는 대가로 지불하는 활용 비용 등 <mark style="color:blue;">**클레이스왑의 웹사이트 상에서**</mark> <mark style="color:blue;">**표시되는 모든 수익률은 분배되는 보상을 연 기준으로 환산한 예상 추정치로, 확정이율을 보장하는 것이 아닙니다.**</mark>

표시되는 수익률과 관련된 보다 자세한 유의사항은 아래 링크를 참조하시기 바랍니다.

• 특히 각 유동성 풀의 KSP 수익률은 매일 오전 9시(KST) 유저 풀 투표와 풀 별 KSP 바이백 수량에 따라 집계된 KSP Mining rate에 따라 업데이트 됩니다. 이때 KSP 수익률은 개발팀에 할당되는 물량(15%)을 포함하여 표시된 수치이며, 사용자가 실제로 분배받는 보상은 팀물량을 제외한 수량입니다.

• 클레이스왑은 최대한 실시간으로 정확한 정보를 제공하기 위해 노력하고 있으나, 분배되는 토큰의 가격 변동, 유동성 풀 규모 변화, 트랜잭션 상의 처리 지연 등으로 인하여 표시되는 예상수익률은 실제수익률과 달라질 수 있습니다.

• 예상수익률 계산 방식은 클레이스왑 웹사이트의 관련 Documentation 을 참조하시기 바랍니다.

&#x20;

## **4.4. 예치 방식 별 세부 주의사항**

### **4.4.1. 단일 예치**

사용자는 클레이스왑에서 한 종류의(단일) 자산을 예치하여 KSP 분배와 예치 수익을 획득할 수 있습니다. <mark style="color:blue;">**단일 예치자가 예치한 자산은 플러스 예치자에 의해 활용**</mark>될 수 있으며, <mark style="color:blue;">**플러스 예치자가 단일 풀 자산을 활용하는 대가로 지불한 비용(이자)**</mark>은 단일 예치자에게 분배됩니다. (플러스 예치자가 지불한 비용의 80% 분배)

단일 풀에 예치된 자산의 출금은 지연될 수 있습니다. 자세한 내용은 아래 링크를 참조하시기 바랍니다.

플러스 예치자가 단일 풀 자산을 지나치게 활용하는 경우, 단일 풀에 예치된 자산의 출금이 지연될 수 있습니다. 그러나 자동화된 스마트 컨트랙트가 단일 풀 자산 활용 수요와 단일 풀 자산 공급의 상호작용에 따라 예치 수익률과 활용 비용을 조정함에 따라 자연스럽게 단일 풀의 추가 자산 공급과 활용 자산의 반환을 유도하여 단일 풀에 예치된 자산의 출금 기능 정상화를 효과적으로 추구하도록 설계되어 있습니다.

&#x20;

### **4.4.2. 페어 예치**

사용자는 클레이스왑에서 두 종류의(페어) 자산을 예치하여 KSP 분배 수익, 거래수수료 분배 수익, 토큰 에어드랍 수익을 획득할 수 있습니다.

페어 예치에서는 비영구적 손실이 발생할 수 있습니다. 자세한 내용은 아래 링크를 참조하시기 바랍니다.

<mark style="color:blue;">**사용자가 예치한 자산의 현재 시장가격이 예치 시점의 가격보다 크게 상승하거나 하락하는 경우, 자산을 예치하지 않고 그대로 보유한 경우보다도 기대수익이 낮아질 수 있으며, 오히려 해당 시점의 평가손실이 발생할 가능성도 있습니다.**</mark> 단, 이런 손실은 사용자가 풀에서 자산을 출금하는 시점에 확정되며(이런 성격 때문에 이런 손실을 비영구적 손실이라고 부르며 더 자세한 내용은 아래 링크를 참조하시기 바랍니다), 출금하기 전의 예치 상태에서 자산의 가격 차이가 풀에 예치할 당시의 가격으로 회복되는 경우 실제 손실은 줄어들 수 있습니다. 또한 전체 수익은 KSP 분배와 거래수수료 분배 수익까지 함께 고려하여 예상하여야 합니다. 비영구적 손실에 관한 보다 자세한 내용은 아래 링크를 참조하시기 바랍니다.

\[참고] [비영구적 손실이란?](https://academy.binance.com/ko/articles/impermanent-loss-explained)&#x20;

&#x20;

### **4.4.3. 플러스 예치**

사용자는 클레이스왑에서 플러스 예치에 의하여 KSP 분배 수익, 거래 수수료 분배 수익, 토큰 에어드랍 수익을 획득할 수 있습니다. 플러스 페어 예치 시 사용자는 자신이 예치하는 자산(이하 본 항에서 “기본자산”이라 합니다) 외에 추가로 투입할 자산(이하 본 항에서 “추가자산”이라 합니다)을 단일 풀에서 활용해 페어로 예치하며 그에 따른 수익을 분배받습니다.

<mark style="color:blue;">**그러나 기본자산 및 추가자산의 현재 시장가격이 예치 시점의 가격보다 크게 상승하거나 하락하는 경우, 자산을 예치하지 않고 그대로 보유한 경우보다도 기대수익이 낮아질 수 있으며, 오히려 해당 시점의 평가손실이 발생할 가능성도 있습니다. (페어 예치의 경우와 동일)**</mark>

<mark style="color:blue;">**플러스 예치의 경우 플러스 풀에 예치된 자산의 가격이 급격하게 변동하여 총 예치자산 가치 대비 추가자산 가치의 비율(자산 활용 비율)이 기준치(85%)를 초과하게 될 경우 사용자가 기대하지 않은 시점에 사용자가 예치한 전체 자산이 자동으로 반환될(자동반환 수수료 추가) 수 있고 이 경우 사용자에게 큰 손실이 발생할 가능성이 있습니다. 플러스 예치의 경우 매우 위험한 상품이므로 플러스 예치를 사용하기 이전에 아래 플러스 예치 가이드를 주의 깊게 읽어 보시기 바랍니다.**</mark>

[**플러스 예치 가이드(링크)**](https://docs.klayswap.com/v/kr/product/plusdeposit)

&#x20;

플러스 페어 예치 시 사용자는 자신이 예치하는 자산(이하 본 항에서 “기본자산”이라 합니다) 외에 추가로 투입할 자산(이하 본 항에서 “추가자산”이라 합니다)을 단일 풀에서 활용해 페어로 예치하며 그에 따른 수익을 분배받습니다. 예치 시 추가로 투입할 추가자산의 규모는 플러스 예치 사용자가 예치하는 기본자산의 미(美)달러 환산가치를 기준으로 계산됩니다. (Price Oracle 가격 기준)

사용자는 위와 같이 계산된 추가 자산의 해당 수량을 단일 풀에서 활용하며, 실시간 활용비용에 따라 비용(이자)이 누적됩니다. 사용자는 플러스 페어 예치 종료 시 위 비용(이자)를 포함한 활용자산 추가 자산 전체를 반환해야 합니다.

사용자의 기본자산, 추가자산, 활용자산에 따라 자산의 일정 비율이 자동으로 스왑(거래)된 후 페어로 예치되므로, 스왑(거래)에서의 조건에 의한 풀 별 거래 수수료율에 따라 거래 수수료가 발생하며, 이 수수료가 제외된 후 페어로 예치됩니다. 이 과정에서 <mark style="color:blue;">**거래 규모가 클 수록 현재 풀 교환비율(가격)과 스왑 시 적용 받는 가격에 차이(Price impact)가 발생하여 최초 선택한 추가 자산 규모(플러스 배수)와 차이가 발생할 수 있으므로,**</mark> 사용자는 반드시 위험에 대해 신중히 평가, 고려한 후 자신의 책임과 판단 하에 거래를 진행하여야 합니다. &#x20;

사용자가 플러스 페어 예치 자산을 출금하는 경우, 출금된 자산은 우선적으로 활용중인 추가자산을 반환하기 위해 사용됩니다. 사용자가 활용중인 추가자산을 모두 반환한 상태라면 남은 자산을 출금해 지갑으로 수령할 수 있습니다. 반환 시 자동적으로 반환을 위한 스왑(거래)이 발생할 수 있으며, 스왑(거래)에서의 조건에 의한 풀 별 거래 수수료율에 따라 발생한 거래 수수료가 제외된 후 반환이 진행됩니다. <mark style="color:blue;">**거래 규모가 클 수록 현재 풀 교환비율(가격)과 스왑 시 적용 받는 가격에 차이(Price impact)가 발생하여 반환 내역에 차이가 발생할 수 있으므로,**</mark> 사용자는 반드시 이러한 위험에 대해 신중히 평가, 고려한 후 자신의 책임과 판단하에 거래를 진행하여야 합니다.

<mark style="color:blue;">**플러스 예치**</mark>의 경우, 사용자가 활용한 추가자산의 안전한 단일 풀 반환을 위해 자동반환이 진행될 수 있습니다. 즉, 사용자는 사용자의 <mark style="color:blue;">**자산 활용 비율(사용자의 총 예치 자산 가치 대비 활용한 추가자산의 가치) 이 85%를 초과한 경우, 자동으로 현재 예치된 자산에서 활용중인 추가자산이 우선 반환되고, 남은 자산에서 자동 반환 수수료(20%)가 제외된 후의 자산을  사용자가 직접 사용자의 지갑에 수령**</mark>할 수 있습니다. <mark style="color:blue;">**토큰 가격의 급격한 변동으로 인해 활용한 추가자산 반환을 위해 사용자가 예치한 자산이 100% 반환(손실)되는 경우도 발생할 수 있습니다.**</mark> 자동반환을 방지하기 위해서는 <mark style="color:blue;">**낮은 플러스 배수로 추가 자산을 예치**</mark><mark style="color:blue;">하거나,</mark> <mark style="color:blue;"></mark><mark style="color:blue;">**출금 탭에서 플러스 자산에 해당하는 수량의 출금을 진행**</mark>해야 합니다.

&#x20;

### **4.4.4. 포지션 예치**

사용자는 클레이스왑에서 포지션 예치에 의하여 KSP 분배 수익, 예치 수익, 가격 차익으로 인한 수익을 획득할 수 있습니다.

포지션 예치를 위해 사용자가 기본으로 예치하는 자산(이하 본 항에서 “기본자산”이라 합니다)의 미(美)달러 환산가치(Price Oracle 가격 기준)를 기준으로 정해지는 최대 범위 내에서, 사용자는 단일 풀에 예치된 다른 사용자들의 자산을 일정한 비용(이하 본 항에서 “활용비용”이라 합니다)을 지불하고 임시 활용(이하 본 항에서 “활용자산”이라 합니다)할 수 있습니다. 활용자산 최대 범위 계산공식은 변경될 수 있으며 아래 포지션 예치 가이드 링크를 참조하시기 바랍니다.

사용자는 이러한 활용자산으로 특정 토큰(이하 본 항에서 “대상자산”이라 합니다)을 매수하거나 매도하여 대상자산의 가치상승 조건에 따라 이익을 추구하는 포지션(롱 포지션) 또는 대상자산의 가치하락 조건에 따라 이익을 추구하는 포지션(숏 포지션)을 취할 수 있습니다. 사용자의 기본자산과 위와 같이 포지션을 취하면서 매수 또는 매도하여 보유한 자산은 단일 풀 예치조건(단일 풀 항목 참조)에 따라 단일 풀에 예치됩니다.

사용자는 <mark style="color:blue;">**본 항 및 기타 포지션 예치조건에 고지된 특수한 경우(자동반환의 경우 포함)를 제외하고**</mark> 원칙적으로 사용자가 원하는 시점에 포지션 예치를 종료할 수 있습니다. 포지션 예치 종료 시에는 확보자산을 사용하여 우선 활용자산 전체(활용자산의 활용비용 추가)를 반환하며, 활용자산 반환 후 잔여자산은 사용자가 출금하여 지갑으로 수령할 수 있습니다.

사용자는 포지션 예치 시 다음과 같은 점들을 포함한 기대수익의 하락 또는 자산손실의 위험에 대해 주의해야 합니다.

<mark style="color:blue;">**(1) 대상자산의 시장 가격이 포지션 예치 시점의 시장 가격보다 크게 상승하거나 하락하는 경우, 사용자가 대상자산에 대해 특정 포지션을 취하지 않고 단순 보유하는 경우보다도 기대수익이 낮을 수 있으며, 평가손실 또는 확정손실이 발생할 가능성이 있습니다.**</mark>

<mark style="color:blue;">**(2) 포지션 예치 중 가치변동 등의 사유로 인하여 ‘총 예치자산 가치\[기본자산과 확보자산 가치(단일 풀 예치수익 포함)의 합]’ 대비 ‘활용자산 가치(활용비용 포함)’의 비율(이하 본 항에서 “자산 활용 비율”이라 합니다)이 기준치를 초과할 경우, 사용자의 동의나 확인 또는 사용자에 대한 통보를 필요로 하지 않고 사용자가 예치한 총 예치자산이 자동으로 예치 해제되어 활용자산 반환에 사용될 수 있으며(이 경우 정해진 조건에 따른 자동반환 수수료가 추가됨), 이 경우 해당 시점의 사용자의 수익 또는 손실이 그대로 확정되며 큰 손실이 발생할 가능성도 있습니다. 자동반환 기준공식 및 기준치는 아래 포지션 예치 가이드 링크를 참조하시기 바랍니다.**</mark>

<mark style="color:blue;">**(3) 포지션 예치, 포지션 종료, 자동반환 등의 과정에서 풀에서 스왑(거래)이 발생합니다. 이때 스왑(거래) 시점의 조건에 의한 풀 별 거래 수수료율에 따라 거래수수료가 발생하며, 사용자가 이러한 거래수수료를 부담합니다. 이 과정에서 거래규모가 클수록 현재 풀 교환비율(가격)과 스왑 시 적용 받는 가격에 차이(Price impact)가 상당한 규모로 발생할 수 있습니다.**</mark>

<mark style="color:blue;">**(4) 사용자가 단일 풀에 예치된 다른 사용자의 활용자산을 활용할 때는 해당 풀의 활용비용 조건에 따라 실시간으로 사용자의 활용비용이 누적되며 포지션 종료 시 이러한 누적 활용비용을 활용자산과 함께 반환하여야 합니다.**</mark>

<mark style="color:blue;">**(5) 기타 블록체인, 가상자산의 특성 및 본 문서에 고지된 클레이스왑의 특성에 기반한 기대수익의 하락 또는 자산손실의 위험 등을 모두 고려하여야 합니다.**</mark>

&#x20;

<mark style="color:blue;">**포지션 예치의 경우 구조적인 복잡도가 높고 자산손실의 위험성도 높은 기능에 해당하므로, 가상자산 투자경험이 적은 사용자, 손실의 가능성을 감당하기 어려운 성격의 자금 사용자 등에게는 사용을 추천하지 않습니다.**</mark>

<mark style="color:blue;">**사용자는 포지션 예치 기능을 사용하기 이전에 위 포지션 예치 관련 내용을 숙지하고 아래 포지션 예치 가이드를 주의 깊게 읽어보시기 바랍니다.**</mark>

<mark style="color:blue;">**\[참고]**</mark> [**포지션 예치 가이드(링크)**](https://docs.klayswap.com/v/kr/product/PositionDeposit)

포지션 예치를 위해 사용자가 기본으로 예치하는 자산(이하 “기본자산”이라 합니다)의 미(美)달러 환산가치(Price Oracle 가격 기준)를 기준으로 정해지는 최대 범위 내에서, 사용자는 단일 풀에 예치된 다른 사용자들의 자산을 일정한 비용(이하 “활용비용”이라 합니다)을 지불하고 임시 활용(이하 “활용자산”이라 합니다)할 수 있습니다.

사용자는 이러한 활용자산으로 특정 토큰(이하 “대상자산”이라 합니다)을 매수하거나 매도하여 대상자산의 가치상승 조건에 따라 이익을 추구하는 포지션(롱 포지션) 또는 대상자산의 가치하락 조건에 따라 이익을 추구하는 포지션(숏 포지션)을 취할 수 있습니다. 사용자의 기본자산과 위와 같이 포지션을 취하면서 매수 또는 매도하여 보유한 자산(매수의 경우 대상자산을 보유하게 되고, 매도의 경우 스테이블 자산을 보유하게 됩니다. 이하 “확보자산”이라 합니다)은 단일 풀 예치조건에 따라 단일 풀에 예치됩니다. &#x20;

롱 포지션 예치 사용자는 스테이블 자산의 단일 풀에서 활용자산을 활용해 대상자산을 매수하여 취득하고, 숏 포지션 예치 사용자는 대상자산의 단일 풀에서 활용자산을 활용하여 대상자산을 매도하여 스테이블 자산을 취득합니다. 이 때 롱 포지션은 매수한 대상자산을 확보자산으로, 숏 포지션은 대상자산을 매도하여 확보한 스테이블 자산을 확보자산으로 취득합니다.

가격 차익은 사용자가 원하는 시점에 포지션을 종료함으로써 실현할 수 있습니다. 사용자는 <mark style="color:blue;">**이용안내문 및 기타 포지션 예치조건에 고지된 특수한 경우(자동반환의 경우 포함)를 제외하고**</mark> 원칙적으로 사용자가 원하는 시점에 포지션 예치를 종료할 수 있습니다. 포지션 예치 종료 시에는 확보자산을 사용하여 우선 활용자산 전체(활용자산의 활용비용 추가)를 반환하며, 활용자산 반환 후 잔여자산은 사용자가 출금하여 지갑으로 수령할 수 있습니다.

&#x20;

#### **\[기대수익의 하락 또는 손실의 위험]**

사용자는 포지션 예치 시 다음과 같은 점들을 포함한 기대수익의 하락 또는 자산손실의 위험에 대해 주의해야 합니다.

&#x20;

<mark style="color:blue;">**(1) 대상자산의 시장 가격이 포지션 예치 시점의 시장 가격보다 크게 상승하거나 하락하는 경우, 사용자가 대상자산에 대해 특정 포지션을 취하지 않고 단순 보유하는 경우보다도 기대수익이 낮을 수 있으며, 평가손실 또는 확정손실이 발생할 가능성이 있습니다.**</mark>

<mark style="color:blue;">**(2) 포지션 예치 중 가치변동 등의 사유로 인하여 ‘총 예치자산 가치\[기본자산과 확보자산 가치(단일 풀 예치수익 포함)의 합]’ 대비 ‘활용자산 가치(활용비용 포함)’의 비율(이하 본 항에서 “자산 활용 비율”이라 합니다)이 기준치를 초과할 경우, 사용자의 동의나 확인 또는 사용자에 대한 통보를 필요로 하지 않고 사용자가 예치한 총 예치자산이 자동으로 예치 해제되어 활용자산 반환에 사용될 수 있으며(이 경우 정해진 조건에 따른 자동반환 수수료가 추가됨), 이 경우 해당 시점의 사용자의 수익 또는 손실이 그대로 확정되며 큰 손실이 발생할 가능성도 있습니다. 자동반환 기준공식 및 기준치는 아래 포지션 예치 가이드를 참조하시기 바랍니다.**</mark>

<mark style="color:blue;">**(3) 포지션 예치, 포지션 종료, 자동반환 등의 과정에서 풀에서 스왑(거래)이 발생합니다. 이때 스왑(거래) 시점의 조건에 의한 풀 별 거래 수수료율에 따라 거래수수료가 발생하며, 사용자가 이러한 거래수수료를 부담합니다. 이 과정에서 거래규모가 클수록 현재 풀 교환비율(가격)과 스왑 시 적용 받는 가격에 차이(Price impact)가 상당한 규모로 발생할 수 있습니다.**</mark>

<mark style="color:blue;">**(4) 사용자가 단일 풀에 예치된 다른 사용자의 활용자산을 활용할 때는 실시간 활용비용에 따라 사용자의 활용비용이 누적되며 포지션 종료 시 이러한 누적 활용비용이 추가되어 활용자산과 함께 반환하여야 합니다.**</mark>

<mark style="color:blue;">**(5) 기타 블록체인, 가상자산의 특성 및 본 문서에 고지된 클레이스왑의 특성에 기반한 기대수익의 하락 또는 자산손실의 위험 등을 모두 고려하여야 합니다.**</mark>

&#x20;

#### **\[자동반환에 대한 상세설명]**

포지션 예치 중 자산의 시장가격이 변동하는 등의 요인이 발생하여 사용자가 임시로 활용중인 활용자산이 반환되지 못할 위험을 방지하기 위해, 자동반환 기준공식에 따른 자동반환 조건이 충족된 경우 사용자의 동의나 확인 또는 사용자에 대한 통보를 필요로 하지 않고 즉시 자동반환이 진행될 수 있습니다. 이 경우 활용자산에 해당하는 부분만 반환되는 것이 아니라 사용자의 총 예치자산이 예치 해제되어 반환에 쓰일 수 있습니다.

즉, 포지션 예치 중 실시간으로 사용자의 ‘총 예치자산 가치\[기본자산과 확보자산 가치(단일 풀 예치수익 포함)의 합]’ 대비 ‘활용자산 가치(활용비용 포함)’의 비율(이하 “자산 활용 비율”이라 합니다)이 기준치(90%)를 초과할 경우, 자동반환 조건이 충족됩니다.

자동반환 조건이 충족되면 자동으로 사용자가 예치한 총 예치자산에서 활용자산(활용비용 포함)이 우선적으로 반환되고, 그 후 잔여자산에서 자동반환수수료(20%)가 제외된 후의 자산을 사용자가 직접 사용자의 지갑에서 수령할 수 있습니다. 단, 자산의 시장가격이 급격히 변동하는 등의 사유로 인해 자동반환이 실행되는 과정에서 사용자가 예치한 자산의 전부(100%)가 반환(또는 손실)되어 사용자가 수령할 수 있는 자산이 남지 않는 경우도 발생할 수 있습니다.

자동반환을 방지하기 위해서는 자산 활용 비율이 기준치(90%)를 초과하지 않도록 미리 기본자산을 추가로 여유 있게 예치해 놓거나, 포지션 종료(Close)탭에서 일정 부분 이상의 포지션을 종료하여 활용자산의 규모를 낮춰 두어야 합니다.

&#x20;

**\[포지션예치 과정에서 발생하는 거래비용 및 Price Impact에 대한 상세설명]**

포지션 예치부터 종료까지의 전 과정에서는 사용자의 활용 자산이 풀에서 자동으로 스왑(거래)되므로, 해당 스왑(거래)에서의 조건에 의한 풀 별 거래 수수료율에 따라 거래 수수료가 발생하며, 이 수수료는 사용자의 자산에서 지불하게 됩니다. 이 과정에서 거래 규모가 클수록 해당 스왑 시점의 풀 교환비율(가격)과 스왑 시 실제로 적용 받는 가격에 차이(Price impact)가 발생할 수 있습니다.

&#x20;

#### **\[포지션예치에서 사용되는 기준공식 및 수치 정리]**

&#x20;

**• 활용자산 최대규모 계산공식**

\[  ]

**• 자동반환 기준공식**: 사용자의 자산 활용 비율 = 활용자산 가치(활용비용 포함) / 총 예치자산 가치\[기본자산과 확보자산 가치(단일 풀 예치 수익 포함)의 합]&#x20;

&#x20;사용자의 자산 활용 비율 > 0.90

\* 기본자산 : 포지션 예치를 위해 사용자가 기본으로 예치하는 자산

\* 활용자산 : 단일 풀에 예치된 다른 사용자들의 자산을 일정한 비용을 지불하고 임시 활용하는 자산

\* 확보자산 : 사용자가 포지션을 취하면서 특정 토큰(대상자산)을 매수 또는 매도하여 보유한 자산됨)

&#x20;

**• 자동반환수수료 비율**

활용자산 반환 후 잔여자산의 20%

&#x20;

**• 활용자산의 활용비용**

실시간으로 변경(각 풀의 비용에 따름)

&#x20;

<mark style="color:blue;">**포지션 예치의 경우 구조적인 복잡도가 높고 자산손실의 위험성도 높은 기능에 해당하므로, 가상자산 투자경험이 적은 사용자, 손실의 가능성을 감당하기 어려운 사용자 등에게는 사용을 추천하지 않습니다.**</mark>

<mark style="color:blue;">**사용자는 본 포지션 예치가이드의 내용을 상세히 살펴보시고 포지션 예치의 위험에 대하여 신중히 평가, 고려한 후 자신의 책임과 판단 하에 거래를 진행하여야 합니다.**</mark>

&#x20;

&#x20;**Price Oracle**

&#x20;Price Oracle은 클레이스왑에서 사용하는 외부 가격 기준입니다. 플러스 예치, 포지션 예치, 출금, 자동반환의 실행과 관련된 가격 기준은 Price Oracle을 통해 측정됩니다. Price Oracle 가격은 클레이스왑 내 풀 교환비율(가격)과 다를 수 있습니다.

• 스테이블 코인(USDT, USDC, DAI 등)은 고정된 가치 (USD 1.0)로 계산됩니다. 다만, 스테이블 코인의 안정성에 중대한 문제가 발생하거나 이에 준하는 사유가 존재하는 경우에는 적절한 조치가 취해질 수 있습니다.

• 그외 코인은 자산별 유동성을 고려하여 Binance, Upbit, Bithumb, Coinone, Huobi, gateio등 중앙거래소의 가격, KLAYSwap 내 풀 교환 비율 및 TWAP 중 중앙값을 기준으로 합리적으로 결정합니다.

&#x20;

### **4.5. KSP 스테이킹 관련**

**•&#x20;**<mark style="color:blue;">**KSP 스테이킹은 KSP를 타인에게 맡겨 보관하거나 위탁하는 행위가 아니라 사용자 스스로가 정해진 조건(스테이킹 기간 등)에 따라 대상 KSP가 송금, 거래되지 않도록 서명하여 락업하는 것입니다. 따라서 이러한 조건을 위반하는 중도취소, 출금, 출금지갑 변경 등은 불가능합니다.**</mark>

• 8X 효율로 스테이킹을 하는 경우, 정해진 언스테이킹 기간 없이 계속해서 스테이킹을 진행합니다. 4X 이하의 효율로 스테이킹을 하는 경우, 스테이킹 종료 30일 전부터 언스테이킹 안내 팝업창을 확인할 수 있으며, <mark style="color:blue;">**스테이킹 계약 종료일로부터 30일 동안 계약을 연장하거나 스테이킹한 자산을 출금할 수 있습니다.**</mark> <mark style="color:blue;">**30일간의 대기 기간 동안 언스테이킹 되지 않은 경우 직전 계약 기간(4/8/12개월) 중 가장 긴 기간을 기준으로 새로운 스테이킹 계약이 자동으로 진행되며, 자동 재계약된 스테이킹은 취소가 불가능합니다.**</mark>

• <mark style="color:blue;">**스테이킹이 실행될 경우, 스테이킹의 중도 취소, 스테이킹 자산의 중도 출금, 출금 지갑 변경 등이 불가능합니다. 따라서 아래 스테이킹 정책 및 계약의 종료에 관한 가이드를 주의 깊게 확인한 후 스테이킹 여부를 결정하시기 바랍니다.**</mark>

[**클레이스왑 스테이킹 정책 및 스테이킹 계약의 종료에 관한 가이드 보기(링크)**](https://docs.klayswap.com/v/kr/product/stakeandvote/undefined)

&#x20;

### **4.6. 클레이스왑 풀 투표 관련**

KSP 토큰을 스테이킹하여 투표권(vKSP)을 보유한 자는 클레이스왑 풀 투표 정책에 따라 클레이스왑 풀 투표에 참여할 수 있습니다. 클레이스왑 풀 투표 정책은 아래 링크를 참조하시기 바랍니다.

[**클레이스왑 풀 투표 정책 보기(링크)**](https://docs.klayswap.com/v/kr/product/stakeandvote/undefined)

&#x20;

### **4.7. 클레이스왑 거버넌스 투표 관련**

KSP 토큰을 스테이킹하여 투표권(vKSP)을 보유한 자는 클레이스왑 거버넌스 투표 정책에 따라 클레이스왑 거버넌스 투표에 참여할 수 있습니다. 클레이스왑 거버넌스 투표 정책은 아래 링크를 참조하시기 바랍니다.

[**클레이스왑 거버넌스 투표 정책 보기(링크)**](https://docs.klayswap.com/v/kr/product/governance/detail)

&#x20;

## **5. 클레이스왑 V3 관련 추가 유의사항**

## **5.1. 집중화된 유동성**

클레이스왑 V3(Version 3)는 **집중화된 유동성(Concentrated Liquidity**) 기능을 제공합니다. 본 안내문에서는 집중화된 유동성이 적용된 유동성 풀을 ‘V3 풀’이라 하고 그 이전의 기능이 적용된 유동성 풀을 ‘V2 풀’이라 합니다.

V3 풀은 V2 풀에 비하여 사용자에게 집중화된 유동성 공급 및 공급구간의 지정에 대해 더 많은 자유와 선택권을 부여하며, 동작 원리상 V2 풀에 비해 더 많은 기대이익 및 더 높은 손실위험이 있을 수 있습니다.

V3 풀 예치의 위험으로, V2 풀 예치에 비하여 지정한 가격범위가 좁아질수록 더 높아지는, (i)비영구적 손실(IL; Impermanent Loss) 위험 (ii)예치 자산의 구성비율 및 가치 변화 위험(예치했던 두 자산의 비율이 출금 시 100:0으로 확정되는 것도 가능), (iii)토큰의 가격이 사용자가 지정한 가격범위를 이탈하는 경우 더 이상 예치 보상을 얻을 수 없는 위험, (iv)가격범위 이탈 시 가격범위 마이그레이션(V3 to V3 마이그레이션) 실행에 의한 손실 위험 등이 있을 수 있습니다. 보다 자세한 설명은 아래의 링크를 참고하여 주시기 바랍니다.

[**집중화 풀 개념과 도입 배경 및 유의사항 보기**](https://docs.klayswap.com/v/kr/product/v3)\
[**V2 to V3 마이그레이션 가이드 보기**](https://docs.klayswap.com/v/kr/product/v3/v2-to-v3/v2-to-v3)\
[**V2 to V3 마이그레이션 정책 보기**](https://docs.klayswap.com/v/kr/product/v3/v2-to-v3/v2-to-v3-1)\
[**집중화 페어 예치 가이드 보기**](https://docs.klayswap.com/v/kr/product/v3/v3/v3)\
[**집중화 페어 예치 정책 보기**](https://docs.klayswap.com/v/kr/product/v3/v3/v3-1)\
[**V3 to V3 마이그레이션 가이드 보기**](https://docs.klayswap.com/v/kr/product/v3/v3-to-v3/v3-to-v3)\
[**V3 to V3 마이그레이션 정책 보기**](https://docs.klayswap.com/v/kr/product/v3/v3-to-v3/v3-to-v3-1)\
[**집중화 풀 출금 가이드 보기**](https://docs.klayswap.com/v/kr/product/v3/v3-1/v3)\
[**집중화 풀 출금 정책 보기**](https://docs.klayswap.com/v/kr/product/v3/v3-1/v3-1)

V3 풀 예치는 구조적인 복잡도가 높고 자산손실 위험의 예측 난이도도 높은 기능(특히 좁은 가격범위의 예치의 경우 위험 상승)에 해당하므로, 가상자산 투자경험이 적은 사용자, 손실의 가능성을 감당하기 어려운 성격의 자금 사용자 등에게는 사용을 추천하지 않습니다.

사용자는 반드시 집중화된 유동성과 관련된 위험에 대해 신중히 평가, 고려한 후 자신의 책임과 판단 하에 유동성 풀에 유동성을 공급하고 관리하여야 합니다.

## **5.2 V2 to V3 마이그레이션**

사용자는 V2 to V3 마이그레이션 기능을 사용하여 V2 풀에 공급하였던 유동성을 V3 풀로 이동시킬 수 있습니다. 다만, V2 to V3 마이그레이션 실행 시 (i)V2 풀에서 출금이 일어나므로 당시 V2 풀의 비영구적 손실이 확정되는 손실, (ii)V3 풀에서 사용자가 선택한 가격범위 진입을 위해 자산 간 스왑이 발생함에 따른 거래수수료, 슬리피지 등의 손실 등의 부담이 발생할 수 있습니다. \
보다 자세한 설명은 아래의 링크를 참고하여 주시기 바랍니다.&#x20;

[**V2 to V3 마이그레이션 유의사항 보기**](https://docs.klayswap.com/v/kr/product/v3/v2-to-v3/v2-to-v3-1)

## **6. 금지되는 행위**

사용자는 본 안내문의 유의사항을 준수하여야 하고, 아래의 행위를 하여서는 안 됩니다.

• 클레이스왑의 건전한 거래질서를 해치거나 교란하는 행위

• 에이전트(Agent), 스크립트(Script), 스파이더(Spider), 스파이웨어(Spyware), 툴바(Toolbar) 등의 자동화된 수단 또는 기타 부정한 방법을 통하여 클레이스왑(클레이스왑 인터페이스, 클레이스왑 프로토콜 등)의 운영에 장애를 초래하거나 부정적인 영향을 미치는 행위

• 클레이스왑 팀의 명예를 훼손하거나 업무를 방해하는 행위

• 클레이스왑을 사용하면서 정확하지 않거나 잘못된 정보 혹은 오해의 소지가 있는 정보를 제공하는 행위

• 정당한 원인 없이 클레이스왑 사용자들의 자산을 탈취하거나 사용자 지갑의 권한을 탈취하는 것에 관여하는 행위

• 클레이스왑을 이용함에 있어서 모든 형태의 범죄 활동(테러 활동, 조세 회피 등)과 직간접적으로 관련된 수익금을 활용하는 행위

• 클레이스왑 팀의 서포트 기능을 이용하는 커뮤니케이션 과정에서 본인이 아닌 다른 사람을 사칭하는 행위

• 기타 관련 법령에 위반되는 불법적인 행위

&#x20;

## **7. 보증 부인 및 책임의 제한**

• 클레이스왑은 사용자가 자신이 소유한 클레이튼 블록체인 지갑을 탈중앙화 프로토콜과 직접 통신하여 여러 가상자산의 교환 및 유동성 공급 기능을 이용할 수 있도록 돕는 웹사이트 형태의 인터페이스로서 사용자의 개인 자산이나 사용자가 자산을 예치하는 각 유동성 풀을 관리 또는 통제하거나 거래의 무결성 및 신뢰성을 보증하지 않습니다. <mark style="color:blue;">**사용자는 각 거래의 이점 및 토큰 가격, 교환비율의 변동 등에 의한 손실의 위험에 대해 신중히 평가, 고려한 후 자신의 책임과 판단 하에 거래를 진행하여야 합니다.**</mark>

• 클레이스왑에서 제공되는 예상수익률, 토큰의 현재 가격, 수익률 계산 예시 등을 비롯한 콘텐츠와 정보는 사용자의 유동성 공급, 제거, 스왑 등의 탈중앙형 거래나 클레이스왑 이용을를 돕기 위한 보조 자료이며, 투자 또는 거래의 권유 및 암시가 아닙니다. 클레이스왑은 가능한 한 적시의 정확한 정보를 제공하기 위해 합리적인 노력을 다하지만 <mark style="color:blue;">**해당 정보의 적시성, 적합성, 정확성을 보증하지 않습니다.**</mark>

• 클레이스왑은 사용자가 클레이스왑을 이용하여 기대하는 이익을 얻지 못하거나 거래에 내재한 위험으로 인해 자산 또는 재산의 손실을 입은 것에 대하여 책임을 지지 않습니다.

• 클레이스왑은 <mark style="color:blue;">**클레이스왑에서 사용되는 기능과 서비스의 지속성을 보장하지 않습니다**</mark><mark style="color:blue;">.</mark> 클레이스왑에서 제공되는 기능은 특정 시점에 추가되거나 영구적으로 삭제될 수 있으며 클레이스왑 서비스가 중단되거나 변경될 수 있습니다. (영구적인 기능 삭제나 서비스 중단의 경우 이로 인해 영향을 받는 사용자가 있는 경우에는 사전에 30일 이상의 합리적인 기간을 두고 사용자의 대처방법에 대해 공지 및 안내할 예정입니다.)

• 클레이스왑은 클레이스왑 프로토콜이 사용하는 클레이튼(Klaytn) 블록체인 플랫폼, 제3자가 제공하는 지갑 애플리케이션 등을 비롯한 <mark style="color:blue;">**제3자가 제공하는 서비스에 대해 책임을 지지 않습니다**</mark><mark style="color:blue;">.</mark>

• 클레이스왑의 개발자, 운영자 및 거버넌스 참여자는 법령이 허용하는 한도 내에서 관련 프로토콜, 코드, 서비스 등에 대해 <mark style="color:blue;">**어떠한 직간접적인 약정, 보증을 하지 아니합니다**</mark><mark style="color:blue;">.</mark>

• 클레이스왑에서 사용하는 스마트 컨트랙트 코드를 비롯해 모든 소프트웨어에는 본질적인 복잡성과 한계로 인해 업계 통상 수준의 기술과 노력으로도 발견되지 못한 결함이 존재할 수 있으며, 이러한 결함을 악용한 해킹, 플래시론 공격 등을 통한 자산 탈취로 인한 원금 손실의 위험이 존재합니다.

• 클레이스왑은 최신 블록 동기화를 유지할 수 있도록 최선의 노력을 하고 있으나, 천재지변, 서버점검 또는 클레이튼 체인 상의 트랜잭션 혼잡도 상승, 컴퓨터 시스템 오류, 소프트웨어 공격 등의 상황으로 <mark style="color:blue;">**클레이스왑의 기능제공은 예고 없이 중단/종료**</mark>될 수 있으며, <mark style="color:blue;">**24시간 클레이스왑 기능의 제공이 보장되지 않습니다.**</mark>

• 위와 같은 문제 상황에서는 <mark style="color:blue;">**웹사이트 상의 표시된 수치 상의 오류, 일시적인 서비스 연결 불가, 접속오류 및 중지가 발생할 수 있습니다**</mark><mark style="color:blue;">.</mark> 이때 사용자가 요청한 유동성 예치, 출금, 스왑 등 트랜잭션이 처리 과정에서 지연 및 요청 실패가 발생할 수 있습니다.

• 클레이스왑은 클레이스왑과 관련하여 관련 법률이 허용하는 한도 내에서 위에 예시된 것을 포함해 명시적으로 또는 묵시적으로 어떠한 보증, 보장 또는 조건도 제공하지 않습니다. 사용자는 클레이스왑 사용에 대한 모든 책임을 지고 클레이스왑이 “있는 그대로(as-is)”, “이용 가능한 대로(as-available)” 제공되는 것을 이해하고 클레이스왑을 사용해야 합니다. 사용자는 컴퓨터, 소프트웨어, 통신, 블록체인 시스템이 완전무결할 수 없음을 이해하고 인정합니다.

**•&#x20;**<mark style="color:blue;">**클레이스왑의 책임영역 내에 있으면서 동시에 클레이스왑의 고의 또는 중과실이 있는 경우가 아닌 한 클레이스왑은 이에 대해 책임을 지지 아니하며, 배상책임을 지는 경우에도 그 발생원인을 불문하고 그리고 어떠한 책임이론에 근거한 것이든 상관없이 귀하가 입게 되는 직접, 간접, 부수적, 특별, 결과적 또는 징벌적 손해\[여기에는 모든 이익의 상실(직접적으로 발생하든지 또는 간접적으로 발생하든지 불문함), 신용 또는 사업적 평판의 상실, 데이터 손실로 인한 피해, 대체 제품 또는 서비스를 얻기 위한 비용 또는 기타 무형의 손해 등도 포함]에 대해서는 배상하지 아니합니다. 그 어떤 경우에도 클레이스왑이 사용자에게 지는 배상책임의 한도는 사용자가 클레이스왑의 사용 대가로 클레이스왑에 지불한 금액과 미화 100.00 달러 중 더 큰 금액을 한도로 합니다. 본 항에 따른 책임 제한은 관련 법령상 허용되는 한도 내에서 효력을 갖습니다.**</mark>

&#x20;

## **8. 권리보호 및 사법기관 협조**

다음과 같은 경우 사용자의 클레이스왑 웹사이트 접속정보(지갑주소, 접속정보 등)가 적법한 규제당국 또는 사법기관에 제공되는 등 합리적으로 필요하다고 여겨지는 조치가 취해질 수 있습니다.

• 해킹, 자금세탁 또는 기타 범죄행위에 연루된 자산으로 볼 수 있는 합리적인 근거가 있는 경우

• 법령에 근거한 규제기관 또는 사법기관의 요청이 있는 경우

&#x20;

## **9. 분쟁해결**

본 유의사항 또는 사용자의 클레이스왑의 접속 또는 사용과 관련하여 또는 이로부터 발생하는 모든 분쟁은 탈중앙 원리에 따라 합의로 해결하고자 최선을 다하되 이로써 해결되지 않는 경우에는 사용자가 대한민국 거주자인 경우 서울에서 서울중앙지방법원을 제1심 법원으로 하여 해결합니다.

&#x20;

## **10. 안전성 및 보안**

클레이스왑은 전문적인 보안 감사 업무를 수행하는 업체를 통해 전문 보안 감사를 완료하였으며 보안 취약점을 제거하고 예방하기 위한 합리적인 노력을 다하고 있습니다.

[**스마트 계약 보안 감사 리포트 확인하기 (링크)**](https://github.com/KlaySwap/klayswap/blob/master/audit/Smart_Contract_Audit_Report_KlaySwap_ver_2.0.pdf)

## **12. 사용자 공지**&#x20;

&#x20;클레이스왑은 공개 커뮤니케이션 수단(클레이스왑 웹사이트에 게시된 SNS 채널주소 등)을 사용하는 것을 포함하여 상업적으로 합리적인 수단을 사용하여 사용자에게 공지 및 통지를 할 수 있습니다. 클레이스왑이 공개 커뮤니케이션 수단을 사용하여 제공하는 공지 및 통지는 게시된 시점에 즉시 효력이 발생합니다.

이 서비스 유의사항 개정본은 2023년 6월 13일부터 유효합니다.

&#x20;

서비스 유의사항 변경 및 게시이력

**(2021년 6월 18일) : 최초 제정**

**(2021년 12월 27일) : 1차 개정(**&#xB2E8;일, 일반 페어, 플러스 페어 유동성 공급 관련 내용 추가)

**(2022년 10월 25일) : 2차 개정(**&#xD3EC;지션 예치 관련 내용 추가)

**(2023년 6월 14일) : 3차 개정**(집중화 페어 예치 관련 내용 추가)

###


# 개인정보처리방침

본 개인정보처리방침은 klayswap.com 웹사이트(이하 “서비스”)에서 서비스의 사용자 정보를 처리하는 내용을 다룹니다.

&#x20;

### ■ 개인정보의 처리목적, 수집항목, 보유 및 이용기간, 제3자 제공

서비스는 사용자의 개인정보를 수집, 이용하거나 제3자에게 제공하지 않습니다.

\* 서비스는 사용자 개인을 식별할 수 있는 정보, 또는 사용자가 소유하고 있는 지갑에 접근하기 위하여 필요한 개인키, 니모닉키, 시드구문 등의 정보, 혹은 이에 준하는 정보를 요구하거나 보관하거나 처리하지 않습니다. 따라서 사용자가 스스로 이를 안전하게 관리하여야 하며, 서비스는 사용자가 이러한 주의 의무를 다하지 못하여 손해가 발생한 경우 책임을 지지 않습니다.

&#x20;

### ■ 개인정보 자동수집장치의 설치, 운영 및 거부에 관한 사항

1\. 서비스는 사용자에게 개별적인 맞춤 서비스를 제공하기 위해 사용 정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용할 수 있습니다.

2\. 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 사용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 사용자들의 PC 컴퓨터 내의 하드디스크에 저장되기도 합니다.

1\)      쿠키의 사용목적: 사용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 사용자에게 최적화된 정보 제공을 위해 사용됩니다.

2\)      쿠키의 설치·운영 및 거부 : 웹브라우저의 기본기능을 이용해 쿠키 저장을 활성화 또는 비활성화할 수 있습니다. 브라우저별 자세한 쿠키 설정 방법은 각 브라우저의 설명을 참고하시기 바랍니다.

3\)      쿠키저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다

&#x20;

### ■  행태정보의 수집, 이용 및 거부 등에 관한 사항

서비스는 서비스의 품질개선, 통계작성 및 연구 등의 목적으로 다음과 같은 외부 분석툴을 이용한 행태정보 분석서비스를 사용하고 있으며, 이러한 분석에서 제외되고 싶으신 경우 각 항목에 안내된 바에 따라 설정을 해제하실 수 있습니다.

1\)      Google LLC, (<googlekrsupport@google.com>) (미국)

\- 수집방법: 웹 사이트 내에 방문자 서비스 이용시점에 네트워크를 통한 전송

\- 수집항목: 쿠키, 기기 브라우저 관련 데이터, 기기 정보, 사이트 활동정보

\- 설정해제방법 : <https://tools.google.com/dlpage/gaoptout>

&#x20;

### ■   연락방법

본 개인정보처리방침에 대해 문의가 있으신 경우 **<privacy@ozys.io>** 로 연락주시기 바랍니다. 고객의 메시지는 회사의 개인정보처리방침 담당자에게 전달됩니다.

&#x20;

### ■  개인정보처리방침 개정

서비스는 본 개인정보처리방침을 수시로 개정하여 게시할 수 있고 게시와 동시에 개정된 방침이적용되며, 만약 개인정보처리방침이 사용자에게 중대하게 불이익하게 변경되는 경우에는 적용일 전 30일 이상의 기간을 두고 게시합니다.

&#x20;

### ■   개정이력

### 1. (1차 제정) 2023. 01. 11

&#x20;

&#x20;


# 보안 감사

## 오딧 히스토리

| 오딧 일자      | 오딧 기관  | 오딧 내용                      |
| ---------- | ------ | -------------------------- |
| 2020-11-25 | Certik | 전체 Contract                |
| 2021-03-24 | Haechi | vKSP, LP Airdrop           |
| 2021-08-20 | Haechi | Buyback, MiningRate Logic  |
| 2021-10-07 | Theori | 전체 Contract                |
| 2021-12-25 | Theori | Single/PlusPool/Governance |

## 오딧 결과확인

[https://github.com/KlaySwap/klayswap ](<https://github.com/KlaySwap/klayswap >)


# KSP

![](/files/-MiZRiVpaPH7S2BRck8t)

* **Ticker** : KSP
* **Contract address** : [https://scope.klaytn.com/token/0xc6a2ad8cc6e4a7e08fc37cc5954be07d499e7654](https://scope.klaytn.com/token/0xc6a2ad8cc6e4a7e08fc37cc5954be07d499e7654?tabId=tokenTransfer)​
* **Chain** : Klaytn (Cypress)

​‌

KSP는 클레이스왑 프로토콜 생태계를 유지하는 핵심 토큰으로, 인플레이션을 통해 유통되는 KSP보상은 단일, 페어(일반/집중화/플러스), 스테이킹 참여자에게 모두 분배됩니다.‌

### Use cases <a href="#use-cases" id="use-cases"></a>

‌

KSP는 단일예치, 페어 예치(일반/집중화/플러스), 스테이킹 등 생태계 기여를 통해 분배 받거나, [거래](https://klayswap.com/exchange/swap)를 통해 획득할 수 있으며 다음과 같이 활용할 수 있습니다.‌

* KSP를 단일예치, 페어예치, 플러스예치에 활용하여 인플레이션 보상을 분배 받을 수 있습니다.
* KSP 스테이킹에 참여하여 KSP 인플레이션 보상을 분배 받을 수 있습니다.
* KSP 보상 풀의 KSP 분배율을 결정하는 투표에 참여할 수 있습니다.
* 프로토콜의 의제와 관련된 거버넌스 투표에 활용할 수 있습니다.&#x20;
* 새로운 풀(페어)을 생성하는 비용으로 활용할 수 있습니다. (풀 생성 비용은 소각)

‌

## Detail <a href="#detail" id="detail"></a>

{% content-ref url="/pages/-MiZSs2suYjzh\_7t0VEV" %}
[KSP Tokenomics](/kr/tokenomics/ksp/ksp-tokenomics)
{% endcontent-ref %}

{% content-ref url="/pages/-MiZSyOMOc4gxKb\_WPTO" %}
[KSP Allocation](/kr/tokenomics/ksp/ksp-allocation)
{% endcontent-ref %}


# KSP Tokenomics

KSP는 생태계 참여자에게 주어지는 보상으로, 클레이스왑 프로토콜에 더 많은 유동성을 확보하기 위한 \
강력한 인센티브 역할을 합니다. 한정된 KSP 자원의 효율적 분배 및 가치 극대화가 가능하도록 동작하는 토큰 이코노미 구조를 통해 유의미한 유동성 기반의 거래, 더 많은 금융 기회 제공합니다.‌

### ​ <a href="#undefined" id="undefined"></a>

### KSP 마이닝 수량 <a href="#ksp-1" id="ksp-1"></a>

‌

KSP의 1일 총 마이닝 수량은 **43,200 KSP**로, 2년 간격으로 반감기가 적용됩니다. 상세 마이닝 계획은 [KSP Allocation](/kr/tokenomics/ksp/ksp-allocation) 을 참고해주시기 바랍니다.‌

| ​항목              | 초기                          | 현재             |
| ---------------- | --------------------------- | -------------- |
| **블록 당 분배 수량**   | **1 KSP**                   | **0.5 KSP**    |
| **개발 커미션 (15%)** | **0.15 KSP**                | **0 KSP**      |
| **1일 총 마이닝 수량**  | **86,400 KSP**              | **43,200 KSP** |
| ​                | \*\*\* 커미션 제외 시: 73,440 KSP | 해당 없음          |

​‌

### **KSP 인플레이션 분배 비율** <a href="#ksp-2" id="ksp-2"></a>

‌‌

KSP 인플레이션은 클레이스왑 생태계의 핵심 기여자인 **단일, 페어(일반/집중화/플러스), KSP 스테이킹 참여자**에게 모두 분배합니다. 분배 비율은 거버넌스 투표를 통해 조정될 수 있습니다.‌

**초기 (반감기 이전)**

<table data-header-hidden><thead><tr><th width="209">분배 대상</th><th>블록 당 분배 비율(%)</th><th width="160">블록 당 분배 수량</th><th>1일 분배 수량 (86,400 블록)</th></tr></thead><tbody><tr><td><strong>분배 대상</strong></td><td><strong>블록 당 분배 비율(%)</strong></td><td><strong>블록 당 분배 수량</strong></td><td><strong>1일 분배 수량 (86,400 블록)</strong></td></tr><tr><td><strong>단일 예치자</strong></td><td><strong>5%</strong></td><td><strong>0.05 KSP</strong></td><td><strong>4,320 KSP</strong></td></tr><tr><td><strong>페어 예치자(일반, 플러스)</strong></td><td><strong>45%</strong></td><td><strong>0.45 KSP</strong></td><td><strong>38,880 KSP</strong></td></tr><tr><td><strong>KSP 스테이킹 참여</strong> </td><td><strong>50%</strong></td><td><strong>0.5 KSP</strong></td><td><strong>43,200 KSP</strong></td></tr><tr><td><strong>Total</strong></td><td><strong>100%</strong></td><td><strong>1KSP</strong></td><td><strong>86,400 KSP</strong></td></tr><tr><td>​</td><td><strong>* **커미션 제외 시</strong> </td><td><strong>0.85 KSP</strong></td><td><strong>73,440 KSP</strong></td></tr></tbody></table>

**​현재  (첫 반감기 적용)**

<table data-header-hidden><thead><tr><th width="209">분배 대상</th><th>블록 당 분배 비율(%)</th><th width="160">블록 당 분배 수량</th><th>1일 분배 수량 (86,400 블록)</th></tr></thead><tbody><tr><td><strong>분배 대상</strong></td><td><strong>블록 당 분배 비율(%)</strong></td><td><strong>블록 당 분배 수량</strong></td><td><strong>1일 분배 수량 (43,200 블록)</strong></td></tr><tr><td><strong>단일 예치자</strong></td><td><strong>3%</strong></td><td><strong>0.015 KSP</strong></td><td><strong>1,296 KSP</strong></td></tr><tr><td><strong>페어 예치자(일반, 플러스)</strong></td><td><strong>35%</strong></td><td><strong>0.175 KSP</strong></td><td><strong>15,120 KSP</strong></td></tr><tr><td><strong>KSP 스테이킹 참여</strong> </td><td><strong>62%</strong></td><td><strong>0.31 KSP</strong></td><td><strong>26,784 KSP</strong></td></tr><tr><td><strong>Total</strong></td><td><strong>100%</strong></td><td><strong>0.5 KSP</strong></td><td><strong>43,200 KSP</strong></td></tr></tbody></table>

‌

## KSP 디플레이션을 통한 가치 극대화 <a href="#ksp" id="ksp"></a>

‌

클레이스왑 프로토콜은 디플레이션 모델을 통해 KSP 유통량을 조절하여 KSP의 가치를 극대화 할 수 있는 탄력적인 토큰 이코노미 구조를 갖추고 있습니다. 이를 통해 풀 예치자와 스테이킹 참여자가 공급하는 유동성에 대해 높은 보상 APR을 제시할 수 있을 뿐 아니라, 더 많은 유저의 참여가 활성화 될수록 KSP의 희소 가치가 점진적으로 높아지는, 더욱 견고하고 지속 가능한 생태계를 구축합니다.‌

### 반감기를 통한 유통량 감소 효과 <a href="#undefined-1" id="undefined-1"></a>

‌인플레이을 통한 KSP 유통을 매 2년 주기의 반감기를 통해 블록 당 분배 되는 수량을 감소 시켜 인플레이션을 둔화합니다.‌ 상세 인플레이계획은 KSP Allocation을 확인해주시기 바랍니다.&#x20;

{% content-ref url="/pages/-MiZSyOMOc4gxKb\_WPTO" %}
[KSP Allocation](/kr/tokenomics/ksp/ksp-allocation)
{% endcontent-ref %}

### 바이백 & 소각을 통한 유통량 감소 효과‌ <a href="#and" id="and"></a>

* **바이백 펀드를 활용한 KSP 소각** : 모든 풀 에서 발생한 거래 수수료의 50%를 KSP 바이백 펀드로 조성하여 KSP 소각에 사용합니다.<br>
* **KSP 풀 등록 수수료의 소각** : 클레이스왑에 새로운 페어를 생성하는데 사용, 해당 비용은 소각됩니다.


# KSP 분배율 자동화

KLAYswap의 생태계 참여자 중 특히 **페어 예치자(일반/집중화/플러스)에 대한 KSP 분배**는 KSP 가치 상승 및 프로토콜 전체 성장과 직결된다는 점에서 매우 중요합니다. 더 많은 거래 수수료를 창출하는 건전한 페어에 더 많은 KSP를 분배해야만 KSP 소각량 증가를 통한 가치 상승이 가능하며, 다시 가치가 상승된 KSP 보상이 개별 페어의 유동성 공급자에게 분배됨으로써 개별 유동성 규모와 거래량 확대, 더 나아가 KLAYswap 전체 TVL의 확대에까지 이르는 시너지 효과를 얻을 수 있기 때문입니다. 한정된 KSP 자원을 더 효율적으로 활용하기 위해 KLAYswap 거버넌스는 다음의 기준을 통해 각 페어에 KSP를 분배합니다.

### **일반 자산의 거버넌스 투표 진행**&#x20;

KLAYswap거버넌스는 생태계 내의 유동성을 **다음의 세 개로 분류 합니다.** 이때 **DAO는 일반자산 중 KSP 를 분배할 자산을 거버넌스 투표로 결정**합니다. 한번 거버넌스를 통과한 일반 자산이더라도 3개월 마다 자격 유지 투표를 통해 DAO의 심사를 거칩니다.

**(1) KSP**

* KLAYswap의 핵심 토큰으로, KSP와 결합된 유동성 페어의 활성화는 KSP의 일시적인 유통량 동결 효과를 얻을 수 있습니다.
* KSP 페어는 KSP를 활용한 추가 수익의 기회까지 제공하여 KSP에 대한 추가 수요를 창출하여 가격 가치 안정화를 유도합니다.

**(2) 대중적 자산 (A 레벨)**

* 다수의 대형 거래소에서 지원되는 일정 시가총액 이상의 대형자산은 높은 자산 접근성, 대중 기반의 거대한 유동성과 홀더 커뮤니티를 보유하고 있습니다.
* 이를 KLAYswap 내부로 끌어들임으로써 해당 자산에 대한 대중의 거래 수요를 흡수해 막대한 거래량을 창출하고, KSP 소각을 통한 가치 상승과 신규 유동성의 유입을 유도합니다.
* 대중 자산의 홀더 커뮤니티를 대상으로 KLAYswap과 KSP를 노출하여, 대중기반의 강력한 시장 지배력을 형성합니다.

**(3) 거버넌스 통과 자산 (B레벨)**

* 일반 자산(C레벨)의 평가는 팀, 기술, 커뮤니티와 관련해 현재적 가치 판단이 어려운 영역으로, KLAYswap과 KSP의 강력한 지지자인 DAO의 판단(거버넌스 투표)을 통해 생태계 참여 여부를 결정합니다. 일반자산의 거버넌스 통과 정책은 아래 페이지를 참고해주세요. &#x20;

{% content-ref url="/pages/2mmOggKGNa0tfe6hw591" %}
[거버넌스 통과 투표 정책](/kr/tokenomics/ksp/kspminingrate/tokenvote)
{% endcontent-ref %}

### **페어별 가중치의 반영**&#x20;

각 페어는 자산 결합 유형에 따라 다음과 같이 분류되며, **DAO는 투표를 통해 페어별 가중치를 조정**합니다. 페어별 가중치는 페어별로 집계된 유저 풀 투표와 KSP 바이백 지표에 적용됩니다.

A. **KSP Core pair (5)** : KSP + 대중적 자산이 결합된 페어&#x20;

B. **Core pair (4)** : 대중적 자산 간 결합된 페어&#x20;

C. **KSP Community pair(3)** : KSP + 거버넌스 통과 자산이 결합된 페어&#x20;

D. **Community pair(2)** : 대중적 자산 + 거버넌스 통과 자산이 결합된 페어

* () 괄호는 각 항목의 가중치이며, 거버넌스 투표를 통해 변경될 수 있습니다.

### **KSP 분배율 자동화**&#x20;

KLAYswap 거버넌스는 **KSP 바이백 수량과 유저 풀 투표**를 종합적으로 반영한 **KSP 분배율 자동화 시스템**을 통해 각 페어의 기여도와 성장 가능성에 대해 평가하여 KSP를 분배합니다. DAO는 투표를 통해 두 항목의 상세 반영 비율을 조정합니다.

**(1) KSP 바이백 수량 (50%)**

* KLAYswap과 KSP에 기여하는 바 가장 명확한 지표는 **거래량**이며, KSP 바이백 수량은 이를 객관적이고 지속적으로 측정할 수 있는 지표입니다.
* 스마트 컨트랙트가 각 페어에서 발생한 거래 수수료를 활용해 한 시간마다 자동으로 KSP를 바이백하며, 일별로 누적된 페어별 KSP 바이백 수량을 매일 1회 소각해 데일리 지표로 집계합니다.
* 단기/장기 지표를 모두 반영하기 위해 1일(15%), 7일(15%), 30일(20%) KSP 바이백 수량을 모두 반영합니다.

**(2) 유저 풀 투표 (50%)**

* 토큰에 대한 신뢰, 토큰 컨텐츠, 프로덕트의 미래 성장 가치 등 자동화 된 집계가 어려운 영역의 평가는 유저 풀 투표를 통해 보완합니다.\
  \- () 괄호는 각 항목의 반영비율이며, 거버넌스 투표를 통해 변경될 수 있습니다.

[KSP 분배율 상세 정책 보기 ](/kr/tokenomics/ksp/kspminingrate/detail)


# 거버넌스 통과 투표 정책

### 일반 자산의 거버넌스 통과 투표

* 일반 자산은 거버넌스의 투표(KSP 분배 자격 획득)를 통해 거버넌스 통과 자산(B레벨)으로 변경될 수 있습니다.
* 이때 거버넌스 통과 자산은 3개월마다 자동으로 자격 유지 투표를 진행합니다.
* 스마트 컨트랙트를 통해 해당 토큰의 KSP 분배 자격 종료 예정 블록시점으로부터 7일전에 유지 투표가 자동으로 생성해 DAO의 투표를 진행합니다.
* 기존의 거버넌스 투표 정책 가결 기준에 따라 해당 자산의 유지 투표 가결(통과)시, 다시 3개월 간 레벨이 유지됩니다. 부결(취소)된 경우, 코드 반영 완료 시점부터 해당 자산과 관련된 페어는 KSP 분배 대상에서 제외됩니다.
* 유지 투표와 별개로 직접 KSP 분배 철회 투표 생성 및 가결되는 경우 해당 자산과 관련된 페어는 KSP 분배 대상에서 제외됩니다.


# KSP 분배율 반영 정책

### 유저 풀 투표의 집계

* 유저 투표는 매일 오전 9시(KST) 스냅샷 기준으로 계산됩니다.
* 특정 페어에 투표 완료 시, 다음 스냅샷 시점 이후 철회할 수 있습니다.
* 기존에 KSP 보상 풀이었으나 KSP 분배 철회 투표로 인해 관련 토큰 레벨의 하락 및 미보상 풀로 변경된 경우, 다음 라운드 스냅샷 시점 이전에 철회가 가능합니다.

### KSP 바이백 수량의 집계

* 스마트 컨트랙트가 각 페어에서 발생한 거래 수수료를 활용해 한 시간마다 자동으로 KSP를 바이백 합니다.
* 24시간동안(매일 오전 9시\~다음날 오전9시) 누적된 페어별 KSP 바이백 수량을 1일 KSP 바이백 수량으로 확정하며, 매일 1회 소각합니다.
* KSP 바이백 수량은 1일(15%), 7일(15%), 30일(20%) 수량을 합산하여 집계합니다.
* 페어생성 기간이 짧아 7일, 30일 KSP 바이백 수량 집계 기준을 충족하지 못하는 경우, 페어 생성 이후부터 현재까지 집계된 KSP 바이백 수량을 기준으로합니다.
* 생성된 지 3일차인 페어의 일자별 KSP 바이백 수량이 다음과 같을 때 1일, 7일, 30일 KSP 바이백 수량 지표의 집계는 다음과 같습니다. \
  \
  **- 일자별 바이백 수량** \
  1일차 : 10KSP / 2일차 : 10KSP / 3일차 : 20KSP \
  \
  **- 페어의 1일/7일/30일 KSP 바이백 수량 지표**\
  1일 : 10KSP / 7일 : 40KSP (10+10+20) / 30일 : 40KSP (10+10+20)


# KSP Allocation

아래 표는 6년간 KSP를 분배를 표시하는 차트입니다. 일일 채굴량은 63,072,000블록(2년)마다 절반으로 줄어듭니다.

| Year | Daily Mining Volume | Yearly Volume | Total Volume | Notes            |
| ---- | ------------------- | ------------- | ------------ | ---------------- |
| 1    | 86,400 KSP          | 31,536,000    | 31,536,000   | \*15% commission |
| 2    | 86,400 KSP          | 31,536,000    | 63,072,000   | \*15% commission |
| 3    | 43,200 KSP          | 15,768,000    | 78,840,000   | Halved           |
| 4    | 43,200 KSP          | 15,768,000    | 94,608,000   |                  |
| 5    | 21,600 KSP          | 7,884,000     | 102,492,000  | Halved           |
| 6    | 21,600 KSP          | 7,884,000     | 110,376,000  |                  |

1. **총 발행량 : 126,144,000 KSP**
2. **시작 물량 \* : 0 KSP**
3. **KSP 일 채굴량\*\*: 86,400개 (63,072,000 블록 (약 2년) 동안 블록 당 1개 씩 채굴)**
4. **반감기\*\*\*: 유동성 채굴 프로그램 (Liqudity Mining Program) 시작 후 매 63,072,000 블록 마다 일일 채굴량이 절반으로 줄어듭니다.**&#x20;
5. **개발 및 안정화 커미션 \*\*\*\* : 채굴량 중 15% (첫 2년 간 지속 후 채굴량에 대한 커미션은 사라짐, 총발행량 기준 7.5%)**

\* 초기 KSP 공급을 0으로 설정하면 초기 사용자가 자유롭게 성장하고 체계적인 결정을 내릴 수 있는 동등한 기회를 갖게 됩니다. 처음부터 KSP는 각 Genesis 블록에서 유동성 채굴을 통해서만 분배되며, 보상으로 KLAYswap 유동성 공급자에게 분배됩니다.&#x20;

\*\* unfreezeBlock 48681371 까지 채굴되는 KSP는 거버넌스의 안정화와 토큰 이코노미의 성공적 안착을 위해 전량 Lock-up(초기 유통량 : 86,400 \* 61 = 5,270,400 KSP)됩니다. 48681371 Block 까지 예상 기간은 61일 입니다.

\*\* 2020년 11월 11일 (block 43407094 부터 unfreezeBlock 48681371까지의 채굴 물량에 대한 일괄 락업 해제 : Block 48681371.

\*\*\* 이 반감기 모델은 비트코인의 철학에서 영감을 받아 만들어졌습니다. 출시 후 첫 2년 동안 총 공급량의 50%가 발행된다는 점에 유의하십시오.&#x20;

\*\*\*\* 커미션은 초기 프로토콜 구축과 거버넌스 세팅 등 KLAYswap의 전반적인 거래환경을 구축한 개발사에 배정됩니다.&#x20;


# 스왑

![](/files/Xmn6DF15jGFCpaNT6wXn)

**토큰 스왑**은 풀에 예치된 토큰 쌍의 비율에 따라 클레이튼 체인상에서 유통되는 다양한  KIP7 토큰을 교환할 수 있는 가장 간단한 방법입니다.&#x20;

클레이스왑의 풀을 통해 토큰을 교환(거래) 하는 경우,  **각 풀 별 수수료 정책**에따라 수수료가 발생하며,  발생한 거래 수수료는 다음과 같이 분배 됩니다.&#x20;

**V2 풀 거래 수수료 분배**

| 풀 종류         |            수수료 분배 구성            |
| ------------ | :-----------------------------: |
| **KSP 보상 풀** |  바이백 펀드 조성 (50%) + 풀 투표자 (50%)  |
| **일반 풀**     | 바이백 펀드 조성 (50%) + 유동성 공급자 (50%) |

&#x20;

**V3 풀 거래 수수료 분배**

| 풀 종류         |                  수수료 분배 구성                 |
| ------------ | :----------------------------------------: |
| **KSP 보상 풀** | 유동성 공급자(40%) + 바이백 펀드 조성(30%) + 풀 투표자(30%) |
| **일반 풀**     |       유동성 공급자(70%) + 바이백 펀드 조성 (30%)       |

&#x20;

* 모든 풀에서 발생한 수수료의 절반은 KSP 바이백 & 소각을 위한 펀드의 재원으로 활용됩니다.&#x20;
* (KSP 보상 풀인 경우) 해당 풀에 투표한 유저에게 분배합니다.
* (일반 풀인 경우) 해당 풀에 자산을 예치한 유저에게 분배합니다.


# 단일 예치

![](/files/7II3xXlLB6ZJQbukUHFS)

**단일 예치는 하나의 자산만 예치하고도 그에 대한 이자 수익을 얻을 수 있는 간편하고 안전한 예치** 방식입니다. 만약 KLAY를 단일 풀에 예치한 유저라면, 실시간 수익률에 따라 KLAY 이자를 획득할 수 있습니다. 더불어 예치 수익 뿐 아니라, 단일 풀 예치자의 유동성 공급 기여에 따라 **추가로 KSP 보상을 분배**하여 디지털 자산 시장의 그 어떤 단일 자산 예치 서비스/프로토콜 보다 높은 수익률을 제공합니다.

단일 예치자의 예치 수익(이자)은 KLAYswap의 또 다른 예치 기능인 [**플러스 예치**](/kr/product/plusdeposit), [**롱/숏 포지션 예치**](/kr/product/positiondeposit)와의 상호 작용 구조를 통해 발생합니다. 각 예치자가 단일 풀 자산을 활용하는 대가로 비용(이자)을 지불하고, \
이 비용을 다시 단일 예치자에게 분배하는 구조를 통해 단일 풀에 예치된 자산이 활발히 활용될 수록 더 높은 **예치 수익률**을 획득할 수 있습니다.&#x20;

이러 구조 상에서 자산 활용, 이자 지불, 자산 반환은 모두 자동화된 스마트 컨트랙트를 통해 안전하게 진행됩니다. 더불어 KLAYswap은 자체적으로 단일 예치와 관련된 Safety fund를 별도로 조성하여 단일 풀 \
예치자의 자산과 수익을 안전하게 관리합니다. Safety fund는 일정 안전 기준을 초과한 플러스 예치자로부터 거두어들인 수수료를 적립한 재원으로, 만에 하나 누군가 활용한 단일 풀 자산이 정상적으로 반환되지 못하는 예외적인 상황이 발생한 경우 Safety fund를 활용해 단일 풀 자산을 대신 반환합니다. 이에 따라 단일 예치자는 자산 손실의 위험을 최소화하여 안전하게 수익 창출의 기회를 누릴 수 있습니다.


# 단일예치 상세정책

### 예치, 출금 정책&#x20;

* 유저는 자유롭게 토큰을 예치하고, 분배된 이자를 언제든지 자유롭게 출금할 수 있습니다. 토큰 이자 수익 뿐 아니라, 예치에 대한 기여로 KSP 보상이 추가로 분배되며, 각 단일 풀의 총 수익률은 예치 수익률 + KSP 분배 수익률을 합친 값입니다.&#x20;
* 각 단일 풀의 예치 수익률(%), KSP 분배 수익률(%)은 실시간 변동값으로, 풀의 총 예치규모, 예치/활용 현황, 1일 KSP 분배수량에 따라 변동됩니다.&#x20;
* 최초 예치 시 토큰별로 승인 트랜잭션을완료해야하며, 트랜잭션 완료 시 계속해서 예치를 진행할 수 있습니다.&#x20;
* &#x20;플러스 예치자들이 지불하여 누적된 이자의 80%를 단일 풀 예치자에게 분배하며, 20%는 준비금으로 적립되며, 추후 KSP 바이백 및 소각을 위한 재원(Reserve fund)으로 사용됩니다.
* 예치한 자산(원금)에 실시간 수익률에 따른 이자가 누적되며, 출금 시 현재까지 누적된 이자 수익을 포함하여 출금할 수 있습니다. <br>
* 밸런스 변동(추가 예치/출금)시 해당 시점까지 분배된 KSP 보상은 내 지갑에 자동으로 수령됩니다.&#x20;
* 각 단일 풀의 활용비용(%)은 현재 얼마나 많은 플러스 예치자들이 자산을 활용중인지를 나타내는 풀 활성화 비율에 따라 달라집니다.

![](https://lh3.googleusercontent.com/GZhRh61Le7KuJeL5QEshl531PUivjUgxh-wxIwk0XrDvKo2THW3QB7nu8TR-HWIp_lN3dlKLCUuYXYmAPfkw10TF_SNI_GQ50uNrgLYDkmpHgQLFdhFX35pWhl1CkRXCS6JpX1H1)

위 예치 수익률 그래프에서 확인할 수 있듯이, 단일 풀에서 많은 자산이 활용될 수록(활성화 비율 높음) 예치 수익률이 상승합니다. \
\
\*  풀 활성화에 따른 예치 수익룰/활용 비용은 [**토큰별 이자율 모델**](/kr/product/undefined)을 확인해주세요.

![](https://lh6.googleusercontent.com/jv2HfVClVklgre-141ECboFmEVCOGGBuJlx5sOWv_mOcY2LHEQGq-FDyscALb1hzjHGxrZapRpthKbrd2rY8HhcgnZwybGkxyQpihwib2eJbBgM2g4wAOCViYXHtmX-NLahX6CJI)

한편, 단일 풀에서 많은 자산이 활용될 수록 플러스 예치자가 지불해야 하는 활용 비용은 더욱 가파르게 상승합니다. 이처럼 자산 활용 수요(플러스 예치자)와 단일 예치 자산 공급(단일 예치자)의 상호작용에 따른 이자율 형성 메커니즘은 단일 풀 자산이 활발하게 활용될 수록 예치자에게 더 높은 수익을 제공해 더 많은 예치를 유도하고, 지나치게 활성화되는 경우(90% 이상) 높은 비용을 책정하여 활용중인 자산의 자연스러운 반환을 유도합니다. 이에 따라 단일 풀에 예치된 자산은 풀이 지나치게 활성화 된 경우에 한해 일시적으로 출금의 지연은 발생할 수 있으나, 출금이 불가능한 경우 없이 예치한 자산의 전체 출금이 가능합니다.

### 용어

![](/files/SKTapmkFUzsvshrqNHkv)

&#x20;


# 일반 페어 예치(V2)

### 유동성 공급과  LP Token

유저는 원하는 풀에 자산을 예치할 수 있고, 우리는 이러한 생태계 참여자를 **유동성 공급자(LP, Liquidity Provider)** 라고 부릅니다. 풀에 유동성을 제공하면 이에 대한 증거로 **LP(Liquidity Pool) Token**을 수령하며,\
수령한 LP Token의 개수는 전체 풀에서 내 몫의 지분(%) 나타냅니다. \
\
풀에 예치한 내 자산을 완전히 출금하면 LP Token 을 다시 자동으로 반환하며, 유저는 자산 예치 기간 동안  \
LP Token의 증명을 통해 풀에서 다음과 같은 보상을 분배 받을 수 있습니다.

* **KSP 분배 보상** \
  \
  &#x20;KSP 보상 풀에 유동성을 공급한 경우, 풀 에서의 내 LP 지분율에 따라 KSP 마이닝 보상을 받게 됩니다. (KSP 보상풀 별 1일 분배 수량은 풀 투표로 결정)\ <br>
* **거래 수수료 보상** \
  \
  일반 풀에 유동성을 공급한 경우, 풀 에서의 내 LP 지분율에 따라 거래 수수료 보상 받게 됩니다. \
  거래 수수료는 풀에 적립되는 구조로, 출금 당시의 교환 비율에 따라 수수료까지 포함하여 출금할 수 있습니다. (발생한 거래 수수료의 50%)\ <br>
* **토큰 에어드랍 보상**\
  에어드랍을 진행 중인 풀에 유동성을 공급한 경우,  내 LP 지분율에 따라 에어드랍 토큰을 분배 받게 됩니다.


# 집중화 페어 예치(V3)

<figure><img src="/files/HuFCQIjVhl08y0ZL7zos" alt=""><figcaption></figcaption></figure>

## 집중화 페어 예치란?

모든 가격 범위(0\~∞)에 자산을 예치하는 기존의 일반 페어 예치와 달리, 집중화 페어 예치는 특정 가격 범위에 사용자의 자산을 예치합니다. 이렇게 **특정 ‘가격 범위’ 안에서만 유동성이 거래에 사용될 수 있도록 자산을 공급**하는 것을 **집중화된 유동성(Concentrated Liquidity)**&#xC774;라 합니다.&#x20;

**유동성 풀의 확대**는 KLAYswap 생태계 성장의 핵심 원동력입니다. 풀에 예치된 자산(유동성) 규모가 커질수록 더 많은 거래와 거래 수수료가 발생하고, 더 많은 수수료를 유동성 공급자에게 분배할 수록 새로운 유동성과 사용자가 KLAYswap 생태계 내로 지속적으로 유입될 수 있기 때문입니다.

그러나 기존의 일반 페어 예치 풀은 x ∗ y = k 기반의 CPMM 모델(유니스왑 V2)로 구축되어 모든 가격 범위에 자산을 예치함으로써 예치된 유동성 대부분이 거래에 활용되지 못하는 ‘**낮은 유동성 효율**’ 문제를 일으키고, 이는 KLAYswap 전체 거래량과 거래 수수료 수익의 감소로 추가 유동성 유입 동기를 약화시키는 결과를 낳습니다.&#x20;

**집중화 페어 예치(V3)는 실제 시장에서 거래가 일어나는 가격대에 유동성을 집중적으로 공급함으로써 조성된 유동성이 더 많은 거래에 사용**되도록 합니다. 이를 통한 많은 수수료 수익의 창출은 KLAYswap 생태계 참여자에 대한 보상의 증가는 물론, KSP 부양(바이백)을 더 효과적으로 수행할 수 있는 더 많은 재원을 확보하게 됨을 의미합니다.

<figure><img src="/files/M4eYS0jfauB1QC92dEmD" alt=""><figcaption></figcaption></figure>

## 집중화 페어 예치 특징

KLAYswap의 집중화 페어 예치는 다음과 같은 주요 특징을 가지고 있습니다.&#x20;

### **1) 유동성 공급자(LP)에 대한 거래 수수료 분배**

<figure><img src="/files/HAueuMjCqa2kgaUOEjfZ" alt=""><figcaption></figcaption></figure>

일반 페어(V2) 예치자는 풀 거래 수수료 대신 KSP 보상만 분배 받는 반면, **집중화 페어(V3) 예치자**는 **풀에서 발생한 수수료 수익의 40%를 분배** 받습니다. 집중화 페어 풀에 예치한 자산은 거래에 활발하게 활용되면서 더 많은 거래 수수료 수익을 창출합니다. 이러한 거래 수수료 수익을 분배함으로써 예치자는 유동성 공급 과정에서 발생할 수 있는 비영구적 손실에 대한 부담을 줄일 수 있습니다. 또한 KSP 분배 정책에 따라 집중화 풀에도 **KSP 보상이 분배**되며, 활발한 거래량을 바탕으로 더 많은 KSP가 분배되어 예치자가 더 확대된 보상을 획득할 수 있습니다.

### **2) 집중화 페어 예치 유형**

<figure><img src="/files/mqXkUQOK2BwKIuUbUjm2" alt=""><figcaption></figcaption></figure>

사용자는 원하는 가격 범위를 직접 설정(custom)하여 자유롭게 예치할 수 있습니다. 또는 KLAYswap 집중화 페어 예치가 제공하는 Spot, Wide, Full range 3가지 가격 범위 중 1개를 선택해 빠르고 편리하게 예치할 수 있습니다. 각 유형은 컨트랙트에 미리 설정된 파라미터에 따라 현재 토큰 가격 기준으로 +-N% 만큼의 가격 범위에 해당합니다.

'가격 범위'란, 예치하는 자산이 거래에 활용될 최소가격과 최고가격 구간을 의미하며, 이 가격 범위 내에서 거래가 발생하면 예치자는 거래 수수료 수익을 분배받을 수 있습니다. 각 가격 범위의 특징은 다음과 같습니다.

**Spot, Wide, Full range 가격 범위 별 특징**

<figure><img src="/files/vBic5SeV4aNIf1EZn21D" alt=""><figcaption></figcaption></figure>

가격 범위를 좁힐 수록, 사용자가 공급한 유동성이 거래에 사용될 가능성이 증가하므로, 더 많은 거래 수수료 수익을 기대할 수 있습니다.

단, 가격 변동 폭이 큰 토큰은 좁은 가격 범위에 집중적으로 예치할수록 현재 토큰 가격이 예치한 범위를 이탈하지 않는지 지속적으로 모니터링해야 하고, 이탈한 경우에는 보상을 획득할 수 있는 유효한(스왑이 일어나는) 가격 범위로 다시 예치할 수 있도록 자산을 마이그레이션해야 합니다. 뿐만 아니라 좁은 가격 범위에 예치할 수록 토큰의 가격이 예치한 시점과 달라져 발생하는 비영구적 손실도 함께 커질 수 있는 가능성이 존재합니다([가격 범위 이탈과 마이그레이션](https://docs.klayswap.com/v/kr/product/v3/v3-to-v3#undefined) 참고).

KLAYswap의 집중화 페어 예치는 위 예치 방식을 통해 V3 유동성 공급 경험이 없는 예치자도 집중화 페어 예치를 쉽고 간편하게 이용할 수 있습니다.

### **3) 집중화 페어 예치 마이그레이션(V3 → V3) 지원**

&#x20;KLAYswap의 집중화 페어 예치는 예치중인 자산을 다른 가격 범위로 이동하고자 하는 경우, \
한 번의 트랜잭션만으로 마이그레이션 할 수 있도록 원스탑 마이그레이션을 지원합니다. 상세 절차는 \
자산 출금 – 새로운 가격 범위로 예치로 이루어지며, 예치자는 유동성을 공급한 풀의 상세 페이지에서 \
마이그레이션 할 수 있습니다. \
\
더 자세한 내용은 아래의 V3 to V3 마이그레이션 마이그레이션 가이드와 정책을 참고하여 주시기 바랍니다.

{% content-ref url="/pages/VOKWFRnDUhzkrGnSKzUz" %}
[V3 to V3 마이그레이션 가이드](/kr/product/v3/v3-to-v3/v3-to-v3)
{% endcontent-ref %}

{% content-ref url="/pages/WsacrOU2an7ceUAhIgwE" %}
[V3 to V3 마이그레이션 상세 정책](/kr/product/v3/v3-to-v3/v3-to-v3-1)
{% endcontent-ref %}

### &#x20;**4) 일반 페어 예치에서 집중화 페어 예치로 마이그레이션(V2 → V3) 지원**

집중화 페어 예치는 일반 페어 예치보다 예치한 자산을 거래에 효율적으로 활용하므로, \
예치자에게 높은 거래 수수료 수익을 제공합니다. 기존의 일반 페어 예치(V2)에 자산을 예치 중인 사용자 또한 마이그레이션 기능을 통해 편리하게 집중화 페어 예치(V3)로 유동성을 공급할 수 있습니다. \
\
예치자는 유동성을 공급한 일반 예치 풀의 상세 페이지에서 편리하게 마이그레이션할 수 있습니다. \
마이그레이션은 한 번의 트랜잭션으로 일반 페어 풀(V2) 자산 출금 – 집중화 페어 풀(V3)로 자산 예치를 \
진행합니다. \
\
더 자세한 내용은 아래의 V3 to V3 마이그레이션 마이그레이션 가이드와 정책을 참고하여 주시기 바랍니다.

{% content-ref url="/pages/woBWWQ6C85YIHKJV1S9P" %}
[V2 to V3 마이그레이션 가이드](/kr/product/v3/v2-to-v3/v2-to-v3)
{% endcontent-ref %}

{% content-ref url="/pages/46gmQTMGGGJkeBiU5K8r" %}
[V2 to V3 마이그레이션 상세 정책](/kr/product/v3/v2-to-v3/v2-to-v3-1)
{% endcontent-ref %}

<br>

## 집중화 페어 예치를 통한 KLAYswap의 성장

KLAYswap은 이미 Klaytn 최대 규모의 유동성과 생태계 참여자를 보유하고 있으며, 이 유동성을 자연스럽게 V3로 마이그레이션함으로써 생태계 유동성 자본을 더욱 효율적이고 역동적으로 흐르게 하고자 합니다.

집중화된 유동성은 거래자에게 더 유리한 환경을 제공하고, 이에 따라 KLAYswap은 기존 V2풀의 배가되는 활발한 거래량을 확보하게 될 것입니다. 이러한 거래량으로 인한 폭발적인 거래 수수료 수익의 증가는 KLAYswap, 생태계 참여자, KSP 가치부양을 가능하게 하는 재원으로 활용하게 됩니다.&#x20;

<figure><img src="/files/VC6xKRD21nuDkay0ObaC" alt=""><figcaption></figcaption></figure>

### **KLAYswap 생태계 성장**

집중화 페어 예치 풀에서 발생한 거래 수수료 수익의 40%를 집중화 페어 예치자에게 분배하여 신규 유동성을 지속적으로 유입시킵니다. 이를 통해 KLAYswap은 더 풍부한 유동성을 확보하여 TVL이 증가하고, 더 풍부한 유동성을 확보하여, 상승한 TVL을 바탕으로 다시 더  많은 거래 수수료 수익을 발생시키는 선순환 구조를 구축합니다.<br>

### **생태계 참여자 보상 확대**

KSP 토크노믹스에 따라, 집중화 페어 풀에서 발생한 거래 수수료 수익의 30%는 풀 투표자에게 보상으로 분배합니다. 이에 따라 집중화 페어 예치자 뿐 아니라 KSP 분배를 결정하는 KSP 스테이킹 참여자(vKSP 홀더) 또한 더 확대된 보상을 획득할 수 있습니다.&#x20;

### **KSP 가치 부양**

집중화 페어 풀에서 발생한 거래 수수료 수익의 나머지 30%는 KSP 바이백 재원으로 활용합니다.  KSP 바이백 확대를 통한 KSP 인플레이션 유통량 조절은 KSP 가치를 안정적으로 부양하고, KSP를 보유하려는 수요를 지속적으로 증가시킬 것입니다.

&#x20;

<figure><img src="/files/b8Qa7pJP4bjqeqMc1pY8" alt=""><figcaption></figcaption></figure>


# V2 to V3 마이그레이션

<figure><img src="/files/ly4LEhjyZyyrp3xcIoZQ" alt=""><figcaption></figcaption></figure>

집중화 페어 예치는 일반 페어 예치보다 예치한 자산을 거래에 효율적으로 활용하므로, 예치자에게 더 높은 이율과 더 큰 거래 수수료 수익을 제공할 수 있습니다.

기존의 일반 페어 풀(V2)에 자산을 예치 중인 사용자 또한 마이그레이션 기능을 통해 편리하게 집중화 페어 예치(V3)로 유동성을 공급할 수 있습니다. 예치자는 유동성을 공급한 일반 예치 풀의 상세 페이지에서 편리하게 마이그레이션할 수 있습니다. 마이그레이션은 한 번의 트랜잭션으로 일반 페어 풀(V2) 자산 출금 – 집중화 페어 풀(V3)로 자산 예치를 진행합니다.

더 자세한 내용은 아래의 마이그레이션 가이드와 정책을 참고하여 주시기 바랍니다.

{% content-ref url="/pages/woBWWQ6C85YIHKJV1S9P" %}
[V2 to V3 마이그레이션 가이드](/kr/product/v3/v2-to-v3/v2-to-v3)
{% endcontent-ref %}

{% content-ref url="/pages/46gmQTMGGGJkeBiU5K8r" %}
[V2 to V3 마이그레이션 상세 정책](/kr/product/v3/v2-to-v3/v2-to-v3-1)
{% endcontent-ref %}

<br>


# V2 to V3 마이그레이션 가이드

1\. 일반 예치 풀 목록 페이지에서 마이그레이션을 진행할 풀을 선택합니다.

<figure><img src="/files/yTm0aOKDRWnMCwNB9tbX" alt=""><figcaption></figcaption></figure>

2\.  풀 상세 화면에서 **\[집중화 풀(V3) 마이그레이션]** 버튼을 클릭합니다. **“자산 마이그레이션”** 팝업에서 Spot, Wide, Full Range 중 V3에 마이그레이션을 진행할 가격 범위 유형을 선택한 후, **\[다음 단계로]** 버튼을 클릭합니다.

<figure><img src="/files/bHotJBhwCTt1i9SW4RuJ" alt=""><figcaption></figcaption></figure>

3\. **“트랜잭션 요청”** 팝업에서 V3 풀에 예치할 각 페어 자산의 수량과 현재 가격, 가격 범위, 보상 토큰 등 예상 정보를 확인한 후, **\[예치하기]** 버튼을 클릭합니다.

<figure><img src="/files/nIolnoE5Y7oBPwFJiqQv" alt=""><figcaption></figcaption></figure>

표시되는 정보는 모두 실시간 예상 정보로, 실제 마이그레이션 과정에서 차이가 발생할 수 있습니다. 그러므로 사용자는 마이그레이션 과정에서 발생할 수 있는 변동 사항에 대해 충분히 숙지하고 이해한 후에 예치하시기 바랍니다.

{% hint style="info" %}
**Tips**

* V2 풀에서 출금한 자산은 사용자가 선택한 V3 풀 가격 범위에 해당하는 가격 비율을 따라, 최대한의 자산을 V3풀에 예치합니다.
* V3 풀에 예치하는 과정에서 소량의 자산(wei)이 남을 수 있으며, 예치 후 남은 자산은 자동으로 사용자의 지갑으로 반환됩니다.
* 선택한 자산을 KLAYswap에서 거래한 이력이 없다면, 집중화 풀 예치 트랜잭션을 진행하기 이전에 Token Approve Transaction이 선행됩니다 (최초 1회에 한함).
  {% endhint %}

<figure><img src="/files/3R6QcbavStArZRLN2Oof" alt=""><figcaption></figcaption></figure>


# V2 to V3 마이그레이션 상세 정책

<figure><img src="/files/P79Tqi0Qb7FSvFIftSF1" alt=""><figcaption></figcaption></figure>

1\) 일반 페어 예치(V2 풀)에서 집중화 페어 예치(V3)로의 마이그레이션 기능 사용 시 일반적으로 **Approve(자산 승인) – 기존 V2 풀에서 자산 출금 – V3풀로 자산 예치** 단계를 거칩니다.&#x20;

2\) 예치한 자산을 출금하기 위해서는 예치 증표에 해당하는 LP 토큰을 지갑에 보유하고 있어야 하며, 해당 토큰 자산에 대한 승인 트랜잭션을 완료해야 합니다. 트랜잭션 실행 시 클레이튼 체인 상에서 수수료가 발생합니다. LP 토큰 자산 이동 권한은 지갑(키) 소유자에게 있으므로, 만약 해당 자산을 다른 지갑으로 전송하는 경우 예치된 자산 출금이 불가능합니다.

3\) 자산 출금 과정에서 기존 가격 범위에서 예치 시점과 출금 시점의 가격과의 차이로 인해 자산 손실의 발생할 수 있습니다. 출금 시 밸런스 변동으로 인해 해당 시점까지 분배된 모든 보상(거래 수수료 수익, KSP, 에어드랍 토큰 등)은 자동으로 지갑에 수령됩니다.&#x20;

4\) 출금한 자산은 스마트 컨트랙트가 자동으로 사용자가 새롭게 예치하고자 하는 가격 범위의 풀 교환 비율에 따라 최적의 비율로 예치합니다.

5\) V2 풀에서 출금한 자산은 사용자가 선택한 V3 풀 가격 범위에 해당하는 가격 비율을 따라, 최대한의 자산을 V3풀에 예치합니다.

6\) 새로운 V3 풀 가격 범위에 예치 시 사용자가 설정한 거래 범위(Slippage) 안에서만 예치를 진행하며, 해당 범위를 초과하는 경우 예치 트랜잭션이 진행되지 않을 수 있습니다. 하단의 예상내역 영역에서 관련 정보를 모두 확인 후 예치를 진행해주세요.

7\) V3 풀에 예치하는 과정에서 소량의 자산(wei)이 남을 수 있으며, 예치 후 남은 자산은 자동으로 사용자의 지갑으로 반환됩니다.&#x20;

<br>


# 집중화 페어 풀(V3) 예치

<figure><img src="/files/T1fScw7aiaDBtDhKKELG" alt=""><figcaption></figcaption></figure>

### 유동성 공급과 V3 LP NFT Token

\
집중화 페어 풀에 자산을 예치하는 생태계 참여자를 유동성 공급자(LP, Liquidity Provider)라고 부릅니다. KLAYswap은 예치한 집중화 풀의 가격 범위를 NFT로 관리합니다. 사용자가 유동성 풀에 자산을 예치하면, 예치 증표로 KLAYswap V3 LP NFT를 받게 됩니다.

이 NFT는 **예치한 자산에 대한 소유권을 의미**하므로, **사용자가 자산을 예치하는 기간 동안 해당 풀에서 거래 수수료 수익과 보상 토큰을 받을 수 있습니다.**

**집중화 풀에 자산을 출금할 때에는**, 더이상 풀에 유동성을 제공하지 않으므로 **해당 NFT를 자동으로 반환합니다.**&#x20;

### KSP 분배 보상

V3 KSP 보상 풀에 유동성을 공급한 경우, 풀 에서의 내 LP 지분율에 따라 KSP 마이닝 보상을 받게 됩니다. (KSP 보상풀 별 1일 분배 수량은 KSP 분배 정책에 따름)

<br>

### 거래 수수료 보상

V3 풀에 유동성을 공급한 경우, 풀 에서의 내 LP 지분율에 따라 거래 수수료 보상 받게 됩니다. 분배 받은 거래 수수료는  “수령 가능”에서 확인한 후 직접 클레임하여 지갑으로  수령할 수 있습니다. &#x20;

<br>

### 토큰 에어드랍 보상

에어드랍을 진행 중인 풀에 유동성을 공급한 경우, 내 LP 지분율에 따라 에어드랍 토큰을 분배 받게 됩니다.

<br>

### 집중화 풀 상태에 따른 마이그레이션 관리&#x20;

집중화 페어 예치자는 거래가 발생할 것이라고 예상하는 특정 가격 범위에 자산을 예치하고, 예치한 자산(유동성)에서 거래 발생 시 거래 수수료 수익을 분배 받습니다.

반면 현재 토큰 가격이 예치한 가격 범위를 벗어나는 경우(비활성)에는 더이상 내가 예치한 자산이 스왑에 사용되지 않아, 일반적으로 풀에서 분배되는 보상(스왑 수수료와 리워드 토큰)을 획득할 수 없습니다. 그러므로 자산을 예치한 사용자는 예치한 가격 범위가 유효(활성)한 상태인지 항상 주의하여 자산을 관리해야 합니다.&#x20;

집중화 풀은 활성, 유의, 비활성 총 3가지 상태로 존재합니다.

<figure><img src="/files/HDsPUAgsYlraftr0qrlm" alt=""><figcaption></figcaption></figure>

더 자세한 내용은 아래의 집중화 페어 예치(V3) 가이드와 정책을 참고하여 주시기 바랍니다.

{% content-ref url="/pages/B7xBsgKuZz417RcYBqIV" %}
[집중화 페어 예치(V3) 가이드](/kr/product/v3/v3/v3)
{% endcontent-ref %}

{% content-ref url="/pages/7XQp0pYnPRhdRIH6Ilj3" %}
[집중화 페어 예치(V3) 상세 정책](/kr/product/v3/v3/v3-1)
{% endcontent-ref %}

<br>


# 집중화 페어 예치(V3) 가이드

1\. 상단 **\[예치]** 메뉴의 **\[집중화 풀(V3) 페어 예치]** 페이지로 이동합니다.

<figure><img src="/files/ZmmiUmjI2EsNmXOpWqxG" alt=""><figcaption></figcaption></figure>

2\. 풀 목록에서 예치할 풀을 선택한 후, **\[예치]** 버튼을 클릭해 예치 상세 페이지로 이동합니다.

<figure><img src="/files/wabTm7YdtEn8n9R6SaTm" alt=""><figcaption></figcaption></figure>

3\. 가격 범위를 설정합니다. 가격 범위는 아래 3가지 방법으로 조정할 수 있습니다.&#x20;

① 그래프에서 “최저 가격 막대”와 “최고 가격 막대”를 좌우로 드래그합니다.

② 가격 범위 설정에서 “최저 가격”과 “최고 가격”을 직접 입력합니다.

③ 가격 범위 설정에서 \[＋] 버튼 또는 \[－]버튼을 클릭합니다.

<figure><img src="https://lh3.googleusercontent.com/-VqtR8RbwPhIHQrcnLT3lgI45oUFJzYnkActY4IAW9VoPFYizh0KYB9Lh6PWofqpmpdS0cla2fD7B37wXb6oxaefLe6iQSJRdMzQDtGl__tXNX-xbExs4oH2dBum44X2AKc-tTn4c0MY6YOZT9QYkR8" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

&#x20;**Spot, Wide, Full range** 3가지 가격 범위 중 1개를 선택해 빠르고 편리하게 예치할 수 있습니다.
{% endhint %}

4\. 두 자산을 모두 예치할지, 한 자산만으로 예치할지 선택합니다.

<figure><img src="https://lh5.googleusercontent.com/pM7C_ixPBx9HvzgkpsYcM6_kJcdnBZ0SHpFXmGhDXN7mY8uAXDyUCaLDFATlppyU2097nknbLbp14EeYuo65w8irBY9Zer4Eo_ay4JE2lJmNXPqz-NRX2-kSkpidlZaVN_PLCuHVo83MPvTRn478gMg" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

* **두 자산 예치인 경우(A+B)**: 두 자산 예치는 페어를 구성하는 자산 두 개를 모두 보유한 경우 이용할 수 있습니다. 일단 하나의 자산 (A) 수량을 입력하면, 나머지 페어 자산 (B) 수량이 자동으로 계산되어 입력됩니다.
* **한 자산 예치인 경우(A or B)**: 한 자산 예치는 페어 중 한 개 자산만 보유하고 있는 경우에도, 편리하게 예치할 수 있습니다. 스마트 컨트랙트가 최대의 풀 지분율을 확보할 수 있도록 자동으로 최적의 비율로 스왑하여 자산을 예치합니다. 유저가 **가능한 한 최대의 풀 지분율을 확보할 수 있도록, Token A 수량의 일정 비율을 Token B로 스왑**해  A + B Token pair로 예치합니다.
* “max” 버튼을 클릭하면, 거래 가능한 최대 수량이 입력됩니다.
  {% endhint %}

{% hint style="warning" %}
**Notes**\
비활성 가격 범위에 예치하는 경우, 일반적으로 보상이 분배되지 않으며, 페어 중 한쪽 토큰으로만 예치할 수 있습니다.
{% endhint %}

5\. 보유한 토큰 수량을 확인한 후, 예치할 수량을 입력합니다. **“예상 내역”**&#xC5D0;서 예치 범위, 지분율, 데일리 보상 등의 예상 정보를 확인할 수 있습니다.  확인을 마쳤으면 **\[예치]** 버튼을 클릭해 주세요.

<figure><img src="https://lh4.googleusercontent.com/1hgOsDHjfdsB7pgm_4vAA_3PgElQOtGGPoMafHo5hPhlMSSJz4wxwPom4CdF4-fFV6LgpeFzA8caH8gwJ-qZiAN_Kmz3LWOGKPvg9g7bx3slD6oTQmCj5wfJYrSxRL6uPLKIdFOhxwgJ9Tw8ozyCNDg" alt=""><figcaption></figcaption></figure>

* 표시되는 정보는 모두 **실시간 예상 정보로, 실제 예치 과정에서 차이가 발생할 수 있습니다**. 그러므로 예치 과정에서 발생할 수 있는 변동 사항에 대해 충분히 숙지하고 이해한 후에 예치를 진행해주시기 바랍니다.<br>
* 한 자산 예치인 경우, **\[예치]** 버튼 클릭 후 **“예치 내역 확인”** 팝업을 확인할 수 있습니다.  스왑 시 적용되는 교환 비율과 스왑 수수료, 풀 별 수수료율을 확인한 후 다음 단계를 진행합니다.

<figure><img src="https://lh5.googleusercontent.com/Jm3TZ6hJ9C9bzOouVw-wDsn_fLbKGL-GUd_OBaA7XEw7-InlxUmdWpA-bZVKPJEreM22JemUIl1uHGPcJIxzv5LZstJCH0AIOF4lHtYjLCpx7TWtPlFloRWVVJnKx3Q2ZpTwdA8MWj6VoEYBCkb1DUE" alt=""><figcaption></figcaption></figure>

<br>

6\. **“트랜잭션 요청”** 팝업창에서 진행할 집중화 풀 예치에 대한 예상 정보를 확인한 후, **\[예치하기]** 버튼을 클릭합니다. 최종적으로 정보를 확인하였다면, 지갑에서 **\[Confirm]** 버튼을 눌러주세요.

<figure><img src="https://lh6.googleusercontent.com/aWziNf-KJlYgu2_oYVFDjbVbqRa70sDWu9kvTsQ55M1OE8vAIEAglUMhCJomPkWU0HXE5z07sxGxqxabnIYV8mUzeZuUIBx-ZUaLYbUq2naDdNf6Kxkalqd5z-mygPNLH_8FdiLxDaJ2ZEMSw2Q2GFE" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

선택한 자산을 KLAYswap에서 거래한 이력이 없다면, 집중화 풀 예치 트랜잭션을 진행하기 이전에 Token Approve Transaction이 선행됩니다 (최초 1회에 한함).
{% endhint %}

7\. 예치를 완료하면, 내 예치 정보와 수령 가능한 보상 정보(KSP, 수수료, 누적 수익)를 확인할 수 있습니다. 실시간 예상 수익률에 따라, 보상이 실시간으로 분배됩니다.

<figure><img src="/files/6bsdHrXyC2QnIKjFohBB" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

만약 추가로 예치하거나 예치중인 자산을 출금하여 **“내 예치 자산”** 밸런스가 변경되는 경우, 현재까지 분배된 보상(거래 수수료, KSP, 에어드랍 토큰)이 자동으로 유저 지갑으로 수령됩니다.
{% endhint %}

<br>


# 집중화 페어 예치(V3) 상세 정책

## 집중화 페어 예치 상세정책&#x20;

\
1\) 사용자는 현재 예치하려는 가격 범위에 해당하는 풀의 교환 비율(가격)에 따라 사용자가 원하는 자산 수량을 직접 입력하여 예치할 수 있습니다.

2\) 예치 시 두 자산을 모두 보유하거나 또는 한 자산만 보유하고 있더라도 예치할 수 있습니다. 두 자산 예치인 경우 스왑이 발생하지 않으나, 한 자산 예치인 경우(A or B) 스마트 컨트랙트가 자동으로 현재 풀 교환 비율에 따라 최적의 비율로 자산을 스왑해 예치합니다.

스왑이 필요한 경우 스왑 경로는 V2, V3풀을 활용하여 진행하며, 거래 수수료가 발생합니다. 거래 수수료는 풀 별 거래 수수료율의 적용을 받습니다.<br>

3\) 스왑 시 발생하는 수수료는 제외한 후 페어 예치를 진행하며, 스왑 시 거래 규모(수량)가 클수록 풀의 토큰간 교환 비율에 영향력을 주어 현재 가격과 교환 시 적용받는 가격에 차이(Price impact)가 발생할 수 있습니다. 적은 수량으로 여러 번을 실행하면 영향력을 줄일 수 있습니다.

4\) 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)가 발생하여 예상되는 교환 비율과 완전히 정확하게 예치가 진행되지 않을 수 있습니다. 이러한 경우를 방지하기 하기 위해 스왑 시 설정한 거래 범위(Slippage) 안에서만 예치를 진행하며, 해당 범위를 초과하는 경우 예치 트랜잭션이 진행되지 않을 수 있습니다(Revert). 하단의 예상 내역 영역에서 관련 정보를 모두 확인 후 예치를 진행해주세요.

5\) 예치 후 자산 구성의 변화 안내

특정 가격 범위에 예치함에 따라 자산의 구성 비율 및 가치 변화가 발생할 수 있습니다. 예치 시점에 사용자가 두 개의 토큰 포지션을 보유하고 있더라도, 토큰의 현재 거래 가격이 예치한 가격 범위를 벗어나는 경우, 사용자의 예치 자산은 더 낮은 가치의 자산 한 개를 보유한 포지션으로 변경됩니다.

예를 들어, 특정 사용자가 ETH/USDC 페어에서 1 ETH = 1,000 USDC \~ 1ETH = 3,000 USDC 가격 범위에 자산을 예치한 경우, ETH 가격이 1,000 미만으로 하락하게 되면 사용자의 예치 자산은 ETH 토큰으로만 보유하게 됩니다.  반대로, ETH 가격이 3,000 USDC를 초과하여 상승하는 경우, 사용자의 예치 자산은 USDC 토큰으로만 보유하게 됩니다.

이에 따라 사용자는 사용자가 자산을 출금하려는 시점의 현재 토큰 가격에 따라 최초 예치 시점과 다른 자산 구성으로 자산을 수령(출금)할 수도 있습니다.

6\) 풀 비활성 시 보상 수령 불가 안내

집중화 페어 예치는 거래가 발생한 것으로 예상되는 특정 가격 범위에 자산을 예치하고, 예치된 자산(유동성)에서 실제 거래가 발생한 경우 거래 수수료 수익을 분배 받습니다. 그러므로 현재 토큰 거래 가격이 사용자가 예치한 가격 범위를 벗어나는 경우, 일반적으로 풀에서 분배되는 보상을 획득할 수 없습니다. 이에 따라 지속적인 보상을 획득하기 위해서는 현재 자신이 예치한 가격 범위 내에서 거래가 발생하고 있는지 풀 상태(활성, 유의, 비활성)를 직접 확인하여 적절한 시점에 자산 마이그레이션하거나, 자산을 출금하여 유효한 가격 범위에 재 예치해야 합니다.&#x20;

7\) 특정 가격 범위에 유동성을 집중적으로 공급하는 집중화 페어 예치(V3)는 일반 페어 예치(V2)보다 큰 비영구적 손실이 발생할 수 있습니다. 특히 토큰 가격 변동이 큰 경우, 좁은 가격 범위에 예치할 수록 큰 비영구적 손실이 발생할 수 있습니다. 예치자는 이러한 비영구적 손실을 충분히 고려하고, 토큰의 가격 변동에 대비해 집중화 풀에 자산을 예치해야 합니다.

＊비영구적 손실: 토큰의 가격 변동에 따라 풀 내 자산의 비율이 변경되어, 토큰을 그대로 보유한 경우보다 DEX에 자산을 예치했기 때문에 자산 가치가 하락하는 현상을 의미합니다.

8\) 집중화 페어 예치(V3)에서 분배된 보상(거래 수수료, KSP, 에어드랍 토큰)은 상세 페이지 내에서 직접 수령(클레임)할 수 있습니다.

## 수익률, 예상내역

### 1) 수익률

모든 수익률(%)은 풀 별 거래 수수료율, 토큰 가격, 사용자의 지분율과 집중화 정도, 예치된 자산의 활성화 여부 등 실시간 현황에 따라 변동됩니다.

### 2) 거래 수수료 수익률(%)

\* 거래 수수료 수익률 관련 모든 예시는 V3 풀에서 발생한 거래 수수료 100%를 유동성 공급자(LP, 예치자)에게 분배함을 가정하였으며, 거버넌스 정책에 따라 유동성 공급자에게 분배되는 비율이 변경될 수 있습니다.

#### <거래  수수료 수익 분배 정책>

\* **분배 수수료** = 거래 수수료 \* (사용자의 유동성(A)/활성화 된 유동성(T))

거래 수수료 수익은 사용자가 자산을 예치한 가격 범위 내에서 거래가 발생한 경우, 해당 거래가 발생한 Tick을 포함하고 있는 활성화된 유동성 전체 규모 대비 해당 거래가 발생한 Tick을 포함하고 있는 사용자의 **유동성 규모의 지분율(%)**&#xC5D0; 따라 거래 수수료가 분배됩니다. (거래 발생 시점마다 거래 수수료 분배)

이때 사용자의 **유동성 지분율**은 같은 규모의 자금일지라도 더 좁은 가격 범위에 예치할 수록 더 높은 지분율을 차지하게 됩니다.&#x20;

<figure><img src="/files/Jer4h6fBsmIJMeROC5ri" alt=""><figcaption></figcaption></figure>

동일한 $ 1,000 규모의 자금을 Full range 범위에 예치하는 경우, 자산은 ① 과 같이 전체가격 범위 (0\~∞)에 균일하게 예치됩니다. 하지만 이 보다 더 제한된 가격 범위 (Pa\~Pb)에 자산을 예치하는 경우(②,③) 거래가 발생했을 때 풀 내에서 더 높은 유동성을 공급한 효과를 얻을 수 있습니다.    &#x20;

만약 USDT-DAI 풀에 위의 세 유형으로만 자산이 예치된 상태라고 가정한다면, 풀의 유동성 지형은 다음과 같이 확인할 수 있습니다.

<figure><img src="/files/Qb3TEPcn7wdOhHf7xYoa" alt=""><figcaption><p><strong>유동성 지형</strong></p></figcaption></figure>

풀에서 거래가 발생하여 토큰 가격이 P0 > P2로 변경되었다면, P0\~P1구간에서는 사용자 A의 자산이 사용되지 않고, P1\~P2 구간에서 사용자 A의 유동성이 거래에 사용됩니다. P1\~P2 구간에서 활성화된 거래 유동성 내 사용자 A의 지분율은 (사용자의 유동성(A)/활성화 된 유동성(T)) 입니다.<br>

<figure><img src="/files/8UJggAjZPyKrMwUotyAi" alt=""><figcaption><p><strong>사용자 A의 지분율=(사용자의 유동성(A)/활성화 된 유동성(T))</strong></p></figcaption></figure>

P1\~P2 구간에서의 거래량과 유동성 규모가 다음과 같을 때, 사용자 A가 획득하는 수수료는 다음과 같습니다.

USDT-DAI 풀 수수료율 :  0.06%

스왑 거래량 : $100&#x20;

P1\~P2 범위에서 사용자A의 유동성(A) : $ 1,000

P1\~P2 범위의 총 유동성(B) : $ 100,000

A가 획득하는  거래 수수료 수익 = ($100\*0.0006)\*(1,000/100,000)= $0.0006

#### <예상 거래 수수료 수익률 계산>

최근 24시간 동안 특정 페어의 V3 풀에서 발생한 거래 수수료를 현재 시점에 활성화된 유동성에 분배하였을 때의 연간 예상 수익률을 계산하여 표시합니다.&#x20;

<figure><img src="/files/NetTmt6k0cXFcG7Qr9fR" alt=""><figcaption></figcaption></figure>

만약 USDT-DAI 풀에 가격 범위 유형(Spot, Wide, Full range)별로 위와 같이 자산이 예치되어 있다고 가정했을 때, 토큰 가격이 P1 > P2로 변경되었다면, 풀 내 활성화된 유동성(T)은 다음과 같으며,

&#x20;&#x20;

<figure><img src="/files/5c36AdHStGWfupDfaUFh" alt=""><figcaption></figcaption></figure>

P1\~P2 구간에서의 거래량과 각 가격 범위 유형 (Spot, Wide, Full range)의 유동성 규모가 다음과 같을 때, 예상 수익률은 아래와 같이 계산합니다.

USDT-DAI 풀 수수료율 :  0.06%

최근 24시간 거래량 : $1,000&#x20;

USDT-DAI풀 P1\~P2 범위의 총 유동성(T) : $ 100,000

* Spot 유형 예치 시 공급하게 되는 유동성(S) :  $ 27,000
* Wide 유형 예치 시 공급하게 되는 유동성(W) : $ 4,650
* Full range 예치 시 공급하게 되는 유동성(F) : $ 10

#### **\<Spot 예상 거래 수수료 APR>**

\=   최근 24시간 풀 수수료 \* (활성화된 Spot 유동성(S)/활성화 된 유동성 전체(T))\*100\*365

<figure><img src="/files/tUnH86Ds3szmAlaAo9vO" alt=""><figcaption><p><strong>Spot 예상 거래 수수료 APR</strong></p></figcaption></figure>

\= $1,000\*0.0006\*($27,000/$100,000)\*100\*365 = 연 **5,913%**&#x20;

#### **\<Wide 예상 거래 수수료 APR>**&#x20;

\=   최근 24시간 풀 수수료 \* (활성화된 Wide 유동성(W)/활성화 된 유동성 전체(T))\*100\*365

<figure><img src="/files/L1Rwv7zHjQFWNwTqK83t" alt=""><figcaption><p><strong>Wide 예상 거래 수수료 APR</strong></p></figcaption></figure>

\= $1,000\*0.0006\*($4,650/$100,000)\*100\*365 = 연 **1,018%**

#### &#x20; **< Full range 예상 거래 수수료 APR>**&#x20;

\=   최근 24시간 풀 수수료 \* (활성화된 Full range 유동성(F)/활성화 된 유동성 전체(T))\*100\*365

<figure><img src="/files/1LBQDdXHL6nn0etcxLTS" alt=""><figcaption><p><strong>Full range 예상 거래 수수료 APR</strong></p></figcaption></figure>

\= $1,000\*0.0006\*($10/$100,000)\*100\*365 = 연 **2.19%**

### 3) KSP 분배 수익률(%)

#### **<풀 1일 KSP 분배 수량의 결정>**&#x20;

V3 풀의 1일 KSP 분배 수량 확정은 기존 V2 풀의 KSP 분배 정책과 동일하게 적용됩니다. 풀 투표(50%)와 KSP 바이백 수량(50%) 집계를 통해 계산된 최종 KSP 분배율에 따라 1일 분배 수량을 확정합니다.( KSP 분배 상세 정책 보기 )&#x20;

\ <br>

#### **<예상 KSP 분배 수익률 계산>**&#x20;

V3 풀에 분배된 1일 KSP 분배 수량을 현재 시점에 활성화된 유동성에 분배하였을 때의 연간 예상 수익률을 계산하여 표시합니다. KSP 분배 수익률 또한 각 가격 범위 유형 (Spot, Wide, Full range)에 따라 예상 수익률을 다음과 같이 계산할 수 있습니다.&#x20;

**\* Spot/Wide/Full range 유형의 예상 KSP 분배 APR**&#x20;

\=   1일 KSP 분배 수량 \* KSP 가격 \* (활성화된 각 유형 유동성/활성화된 유동성 전체)\*100\*365

<br>

### 4) 토큰 에어드랍 수익률&#x20;

V3 풀에 분배된 1일 에어드랍 토큰 수량을 현재 시점에 활성화된 유동성에 분배하였을 때 연간 예상 수익률을 계산하여 표시합니다. 에어드랍 수익률의 계산은 4) KSP 분배 수익률의 계산과 동일합니다.&#x20;

#### **\* Spot/Wide/Full range 유형의 예상 에어드랍  APR**&#x20;

\=   1일 토큰 분배 수량 \* 토큰 가격 \* (활성화된 각 유형 유동성/활성화된 유동성 전체)\*100\*365

### 5) KSP, 에어드랍 토큰의 분배

거버넌스 정책에 따라 KSP, 에어드랍 토큰의 분배는 **현재 시점에 활성화된 유동성에 실시간(클레이튼 블록 생성 타임 기준)분배**되므로, 전일자에 활성화된 유동성 범위 내에 자산을 예치한 경우라 하더라도, 실제 분배가 이루어지는 시점에 활성화된 유동성 범위가 아닌 경우 보상 분배를 받지 못할 수 있습니다. 이에 따라 사용자는 자신이 예치한 자산이 활성화된 범위 내인지 지속적으로 확인해야 합니다. 현재 토큰 가격 범위를 이탈한 경우(비활성 상태)  마이그레이션 또는 출금 후 재 예치하여 다시 유효한 가격 범위로 자산을 예치해야 보상을 획득할 수 있습니다.

{% content-ref url="/pages/VOKWFRnDUhzkrGnSKzUz" %}
[V3 to V3 마이그레이션 가이드](/kr/product/v3/v3-to-v3/v3-to-v3)
{% endcontent-ref %}

### **6) 모든 수치는 실시간 예상 값이며 실제 내역과 다를 수 있습니다.**


# V3 to V3 마이그레이션

<figure><img src="/files/9l5ESQS9mH2Ykm7ig6tZ" alt=""><figcaption></figcaption></figure>

## 가격 범위 이탈

'가격 범위'란, 예치하는 자산이 거래에 활용될 최소가격과 최대가격 구간을 의미하며, 이 가격 범위 내에서 거래가 발생하면 예치자는 거래 수수료 수익을 분배받을 수 있습니다.

예치한 풀의 토큰 가격이 변동하면, 풀 내 자산의 비율이 바뀌며, 토큰 가격이 크게 바뀌어 가격 범위를 벗어나는 경우에는 **페어 토큰 중 하나의 토큰만 보유하게 됩니다.** 또한, 예치한 자산이 거래에 사용되지 못하므로 **수수료 수익과 보상 토큰을 받을 수 없습니다**.

예를 들어, 가격 범위가 최소 1 KLAY = 1 USDT \~ 최대 1 KLAY = 2 USDT인 KLAY-USDT 집중화 풀의 경우, KLAY 가격이 1 KLAY = 3 USDT로 올랐을 때, 유동성 풀의 모든 자산은 USDT만 보유하게 됩니다.&#x20;

<br>

## 마이그레이션

예치자가 선택한 가격 범위 내에서 거래가 발생하지 않으면, 예치자는 거래 수수료 수익 및 추가 보상(KSP, 토큰 에어드랍 등)을 더이상 획득할 수 없는 비활성 상태가 됩니다. 이 경우, 예치자는 기존 가격 범위에서 자산을 직접 출금한 후 다시 예치해야 합니다.

KLAYswap의 집중화 페어 예치는 예치중인 자산을 다른 가격 범위로 이동하고자 하는 경우, 한 번의 트랜잭션만으로 마이그레이션할 수 있도록 원스탑 마이그레이션을 지원합니다. 상세 절차는 자산 출금 – 새로운 가격 범위에 예치로 이루어지며, 예치자는 유동성을 공급한 집중화 풀의 상세 페이지에서 마이그레이션할 수 있습니다.&#x20;

<figure><img src="/files/o66FooZh53E2b0JLaD2r" alt=""><figcaption></figcaption></figure>

* 경우1 비활성 풀: 토큰 가격이 Change2 상태로 변동하는 경우, 유동성 풀 A 안에서는 더이상 거래가 발생하지 않아, 풀A는 비활성화 상태가 됩니다.
* 경우2 유의 풀: 토큰 가격이 Change1 상태로 변동하는 경우, 풀 A에서 거래는 발생하고 있지만, 가격 범위를 벗어나 비활성 상태로 변경될 가능성이 있습니다.

▶ 두 경우 모두 마이그레이션을 통해 안정적인 가격 범위로 재예치할 수 있으며, 예치한 후에는 계속해서 수수료 수익과 보상을 얻을 수 있습니다.

더 자세한 내용은 아래의 V3 to V3 마이그레이션 마이그레이션 가이드와 정책을 참고하여 주시기 바랍니다.

{% content-ref url="/pages/VOKWFRnDUhzkrGnSKzUz" %}
[V3 to V3 마이그레이션 가이드](/kr/product/v3/v3-to-v3/v3-to-v3)
{% endcontent-ref %}

{% content-ref url="/pages/WsacrOU2an7ceUAhIgwE" %}
[V3 to V3 마이그레이션 상세 정책](/kr/product/v3/v3-to-v3/v3-to-v3-1)
{% endcontent-ref %}


# V3 to V3 마이그레이션 가이드

1\. 상단의 **\[예치]** 메뉴의 **\[집중화 풀(V3) 페어 예치]** 를 클릭합니다. **\[내 예치 목록]**&#xC744; 클릭해, 마이그레이션할 풀의 **\[관리]** 버튼을 클릭합니다.

<figure><img src="https://lh6.googleusercontent.com/0Hfeh8X3iFI6RyoxWKFnbg1lglkYiTP6_VBSmBhvJ_4slGW0p_6Ja9xCFJZuFrzsjW-NAv90zBlPRdp0h2YWcouB9L-bcAzQ-lDn4uuj56LSyl3LW0vIiy37bhV6EC2-h-VVGRXgtephPoBoXKbPSlw" alt=""><figcaption></figcaption></figure>

2\. 집중화 페어 예치의 상세 풀 페이지에서 **\[마이그레이션]** 탭을 선택합니다.

<figure><img src="https://lh6.googleusercontent.com/CeXgKvkylE8NFZs0QW6Nih7b9xYStzbmmG2t2eyJsWl5K5BxpwAQtxdTV21X5MeVPNI0clnG61tupUKpd-aZu_XQZrfPc7aqvhj503f8UCyXYy7W-MEjbRB7CATfL96uOmlLacY8F40hNBXEp5yfwZI" alt=""><figcaption></figcaption></figure>

3\. 마이그레이션을 진행할 가격 범위를 설정합니다. 가격 범위는 아래 3가지 방법으로 조정할 수 있습니다.&#x20;

① 그래프에서 “최저 가격 막대”와 “최고 가격 막대”를 좌우로 드래그합니다.

② 하단 가격 범위 설정에서 “최저 가격”과 “최고 가격”을 직접 입력합니다.

③ 하단 가격 범위 설정에서 \[＋] 버튼 또는 \[－]버튼을 클릭합니다.

<figure><img src="https://lh6.googleusercontent.com/AhsgwvNMxESzd3eHHVMsFsS_H0qVrjqhS6nLqKkW3I7PnL66-8JFmXx43IE9kvaL5mpeDUSfGck3JK1Z-VV1KMDtxKdEYGEorpW25AhNlOVevwQ7ZUAoF0Ht3rgKo7q3w20uhX-64lxxOKsSnIlxchM" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

&#x20;**Spot, Wide, Full range** 3가지 가격 범위 중 1개를 선택해 빠르고 편리하게 예치할 수 있습니다.
{% endhint %}

{% hint style="warning" %}
**Notes**

비활성 가격 범위에 예치하는 경우, 일반적으로 보상이 분배되지 않으며, 페어 중 한쪽 토큰으로만 예치할 수 있습니다.
{% endhint %}

4\. **“예상 내역”** 영역에서 예치 범위, 교환 비율, 지분율, 데일리 보상 등의 예상 정보를 확인한 후, **\[Migration]** 버튼을 클릭합니다.

<figure><img src="https://lh4.googleusercontent.com/EiRIlzYxzBuZVtYbw0Svrmo3JVtTzQ05WvChJd0_c1xCccMfPmEH93VqeKOpeKSPsLT9yZYjgOZyW8hWmHAOys3Q1_h3YR6zwb0bbMXsjP35L-7o6F1sF_LQviv-e7Dhk4TOjh9aVr9E0ONcCB7kk70" alt=""><figcaption></figcaption></figure>

* **표시되는 정보는 모두 실시간 예상 정보로, 실제 예치 과정에서 차이가 발생할 수 있습니다.** 그러므로 \
  예치 과정에서 발생할 수 있는 변동 사항에 대해 충분히 숙지하고 이해한 후에 예치하시기 바랍니다.

<br>

5\. **“마이그레이션 내역 확인”** 팝업에서 출금하는 자산 수량, 전환 후 예치하는 자산 수량 등 예상 정보를 확인한 후, **\[다음 단계로]** 버튼을 클릭합니다.

<figure><img src="/files/4gdnohCqrvo3Xx73mUtS" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

현재 예치중인 가격 범위와 동일한 가격 범위로는 마이그레이션할 수 없습니다.
{% endhint %}

6\. **“트랜잭션 요청”** 팝업에서 KLAYswap V3 LP NFT에 대한 approve 트랜잭션을 승인한 후, 지갑에서 **\[Confirm]** 버튼을 눌러주세요.

<figure><img src="/files/KzkEIPiniiKYczQew2Os" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

NFT는 예치한 자산에 대한 소유권을 의미하므로, 사용자가 자산을 예치하는 기간 동안 해당 풀에서 거래 수수료 수익과 보상 토큰을 받을 수 있습니다. 집중화 풀에서 자산을 완전히 출금하거나 마이그레이션할 때에는, 더이상 풀의 해당 가격 범위에 유동성을 제공하지 않게 되므로 자동으로 NFT를 반환합니다.
{% endhint %}

7\. **“트랜잭션 요청”**&#xC5D0;서 진행할 집중화 풀 예치에 대한 예상 정보를 확인한 후, **\[예치하기]** 버튼을 클릭합니다. 최종적으로 정보를 확인하였다면, 지갑에서 **\[Confirm]** 버튼을 눌러주세요.

<figure><img src="/files/kY0fuVNfmiRfW8MZFP87" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
&#x20;**Tips**

마이그레이션 또는 출금으로 인해 밸런스 변동이 생긴 경우, 거래 수수료와 KSP 보상을 지갑으로 자동으로 수령합니다.
{% endhint %}

<br>


# V3 to V3 마이그레이션 상세 정책

<figure><img src="/files/IhwACFzgGdEdVSQMqdyW" alt=""><figcaption></figcaption></figure>

1\) KLAYswap이 제공하는마이그레이션 기능 사용 시 일반적으로 **Approve(자산 승인) – 기존 가격 범위에서 자산 출금 – 자산 스왑 – 새로운 가격 범위로 자산 예치** 단계를 거칩니다. <br>

2\) 예치한 자산을 출금하기 위해서는 예치 증표에 해당하는 LP NFT 자산을 지갑에 보유하고 있어야 하며, 해당 NFT 자산에 대한 승인 트랜잭션을 완료해야 합니다. 트랜잭션 실행 시 클레이튼 체인 상에서 수수료가 발생합니다. LP NFT 자산 이동 권한은 지갑(키) 소유자에게 있으므로, 만약 해당 자산을 다른 지갑으로 전송하는 경우 예치된 자산 출금이 불가능합니다.&#x20;

3\) 자산 출금 과정에서 기존 가격 범위에서 예치 시점과 출금 시점의 가격과의 차이로 인해 자산 손실의 발생할 수 있습니다.<br>

4\) 출금 시점의 자산의 구성 비율 및 가치 변화가 발생할 수 있으며([<mark style="color:blue;">집중화 페어 예치 상세 정책</mark> ](https://docs.klayswap.com/v/kr/product/v3/v3/v3-1#undefined)참고), 출금 시 밸런스 변동으로 인해 해당 시점까지 분배된 모든 보상(거래 수수료 수익, KSP, 에어드랍 토큰 등)은 자동으로 지갑에 수령 됩니다. <br>

5\) 출금한 자산은 스마트 컨트랙트가 자동으로 사용자가 새롭게 예치하고자 하는 가격 범위의 풀 교환 비율에 따라 최적의 비율로 자산을 스왑해 예치합니다. 스왑이 필요한 경우 스왑 경로는 V2, V3풀을 활용하여 진행하며, 거래 수수료가 발생합니다. 거래 수수료는 풀 별 거래 수수료율의 적용을 받습니다.

6\) 스왑 시 발생하는 수수료는 제외한 후 페어 예치를 진행하며, 스왑 시 거래 규모(수량)가 클수록 풀의 토큰간 교환비율에 영향력을 주어 현재 가격과 교환 시 적용받는 가격에 차이(Price impact)가 발생할 수 있습니다. 적은 수량으로 여러 번을 실행하면 영향력을 줄일 수 있습니다.

7\) 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)가 발생하여 예상되는 교환 비율과 완전히 정확하게 예치가 진행되지 않을 수 있습니다. 이러한 경우를 방지하기 하기 위해 스왑 시 설정한 거래 범위(Slippage) 안에서만 예치를 진행하며, 해당 범위를 초과하는 경우 예치 트랜잭션이  진행되지 않을 수 있습니다.(Revert)  하단의 예상내역 영역에서 관련 정보를 모두 확인 후 예치를 진행해주세요.

8\) V3 풀에 예치하는 과정에서 소량의 자산(wei)이 남을 수 있으며, 예치 후 남은 자산은 자동으로 사용자의 지갑으로 반환됩니다.&#x20;

<br>


# 집중화 페어 예치(V3) 출금

&#x20;집중화 페어 예치(V3) 출금 가이드와 정책을 참고하여 주시기 바랍니다.


# 집중화 풀(V3) 출금 가이드

1\. 집중화 풀 목록 페이지에서 출금하려는 풀의 **\[관리]** 버튼을 클릭합니다.

<figure><img src="/files/ZDjvSPrcMcpT6D8ht3BD" alt=""><figcaption></figcaption></figure>

2\. 집중화 풀 상세 페이지에서 **\[Withdraw]** 탭을 클릭한 후, 버튼을 클릭하거나 또는 슬라이더를 드래그해 출금할 수량(%)을 선택합니다.&#x20;

<figure><img src="/files/JH7ItBeSXNhmLPmA6j0N" alt=""><figcaption></figcaption></figure>

<br>

3\. **“You Get”**&#xC5D0;서 출금 시 수령하는 토큰과 보상(거래 수수료 보상, KSP, 에어드랍) 정보를 확인한 후, **\[Withdraw]** 버튼을 클릭합니다.&#x20;

<br>

4\. **“트랜잭션 요청”** 팝업에서 예상 정보를 확인한 후, **\[확인]** 버튼을 클릭합니다. 최종적으로 정보를 확인하였다면, 지갑에서 **\[Confirm]** 버튼을 눌러주세요.

<figure><img src="/files/rr3LO53RpqzXqRCcDdDN" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

* 출금으로 인해 밸런스가 변동이 생기는 경우, 거래 수수료와 KSP 보상을 지갑으로 자동으로 수령합니다.
* 비활성 풀에는 한 종류의 자산만 존재하므로, 출금 시 페어 자산 중 한 종류의 자산만 출금합니다.
  {% endhint %}


# 집중화 풀(V3) 출금 상세 정책

1\) 예치한 자산을 출금하기 위해서는 예치 증표에 해당하는 LP NFT 자산을 지갑에 보유하고 있어야 하며, 해당 NFT 자산에 대한 승인 트랜잭션을 완료해야 합니다. 트랜잭션 실행 시 클레이튼 체인 상에서 수수료가 발생합니다. LP NFT 자산 이동 권한은 지갑(키) 소유자에게 있으므로, 만약 해당 자산을 다른 지갑으로 전송하는 경우 예치된 자산 출금이 불가능합니다.&#x20;

2\) 자산 출금 과정에서 기존 가격 범위에서 예치 시점과 출금 시점의 가격과의 차이로 인해 자산 손실의 발생할 수 있습니다.<br>

3\) 출금 시점의 자산의 구성 비율 및 가치 변화가 발생할 수 있으며([<mark style="color:blue;">집중화 페어 예치 상세 정책</mark>](https://docs.klayswap.com/v/kr/product/v3/v3/v3-1#undefined)[ ](https://docs.klayswap.com/v/kr/product/v3/v3/v3-1#undefined)참고), 출금 시 밸런스 변동으로 인해 해당 시점까지 분배된 모든 보상(거래 수수료 수익, KSP, 에어드랍 토큰 등)은 자동으로 지갑에 수령 됩니다.&#x20;

4\) 출금 시 설정한 거래 범위(Slippage) 안에서만 출금을 진행하며, 해당 범위를 초과하는 경우 출금 트랜잭션이 진행되지 않을 수 있습니다(Revert). 하단의 예상내역 영역에서 관련 정보를 모두 확인 후 출금을 진행해주세요.


# 플러스 예치

**플러스 예치**는 유저가 예치하는 자산에 **추가로 자산을 투입해 페어 예치**를 할 수 있도록 지원하는 기능입니다. 플러스 예치자는 자신이 보유한 자산보다 2배 \~ 3배의 자산을 투자한 것과 같은 효과를 얻게 되어 **일반 페어 예치에서 받던 보상에 비해 훨씬 더 많은 보상**을 획득할 수 있습니다. 이처럼 자본 효율성 극대화를 통한 수익 창출이 가능한 이유는 단일풀 자산을 활용할 수 있기 때문입니다. 플러스 예치자는 단일 풀에서 활용할 자산을 가져와 내 자산에 더하여 더 큰 규모로 페어 예치함으로써, 풀에서 발생하는 다양한 보상(KSP, 에어드랍 토큰)을 더 많이 획득하게 됩니다.

### **높은 수익률**

플러스 예치 시 자산 활용에 대한 이자를 지불해야 하지만, 일반 페어로 예치했을 때 보다 2\~3배 이상 훨씬 더 높아진 보상으로 인해 활용한 자산에 대한 이자 비용(%)을 지불하고도 결과적으로 기존보다 훨씬 더 많은 이익을 획득하게 됩니다.

### **자유로운 자산 예치**&#x20;

플러스 예치자는 한 개의 자산 또는 두 개의 자산을 현재 교환 비율(가격)에 관계없이 자유롭게 예치할 수 있습니다. 하나의 자산만으로 플러스 예치가 가능한 이유는 스마트 컨트랙트가 최적의 비율로 예치 자산을 자동으로 스왑해 페어로 예치하기 때문입니다.

### **플러스 예치 규모의 선택**&#x20;

유저는 ‘**플러스 배수**’를 통해 플러스 예치 규모를 자유롭게 선택할 수 있습니다. 만약 2.5배를 선택했다면, 현재 예치 하려는 자산의 2.5배의 규모로 페어 예치를 진행하게 됩니다. 만약 유저가 1.0배를 선택했다면 이는 추가 투입 자산 없이 내 자산만 그대로 예치한다는 의미로, 일반 페어 예치와 동일합니다.

(예시) KLAY+USDT 페어의 플러스 예치 유저가 100KLAY+200 USDT를 예치하면서 2.5배 플러스를 선택한 경우 (1KLAY=2.0 USDT, 수수료 미반영) → 예치하려는 자산 규모 = 100 KLAY +200 USDT = $400 → 총 플러스 예치 규모 = $400\*2.5배 = $1,000 → 추가로 투입해야 할 규모 = $1000- $400 = $600

### **활용할 단일 풀 자산 선택**

유저 자산 외에 추가로 투입해야 할 자산은 단일풀에서 가져와 활용합니다. 유저가 예치하려는 자산, 플러스 배수에 따라 스마트 컨트랙트가 단일 풀에서 가져온 자산을 스왑 없이 바로 페어로 예치하거나, 일정 비율을 스왑하여 최적의 전략으로 페어 예치를 진행합니다. 단일풀에서 활용한 자산은 플러스 예치 종료(출금) 시 반환해야 하는 자산으로, 변동 자산(KLAY, ETH, XRP, KSP) 뿐만 아니라, 가격 변동이 거의 없는 스테이블 자산(USDT, USDC, DAI)까지도 활용할 수 있어 더 안정적인 수익을 추구할 수 있습니다.

(예시) KLAY+USDT 페어의 플러스 예치 유저가 100KLAY+200 USDT를 예치하면서 2.5배 플러스, USDT 활용을 선택한 경우 (1KLAY=2.0 USDT, 수수료 미반영) → 추가로 투입해야 할 규모 = $600 → $600 규모의 페어 예치를 위해 활용할 자산 = 600 USDT → 600 USDT로 가능한 최대 페어 예치 = 150 KLAY + 300 USDT → 총 예치 자산 = 100 KLAY+200 USDT (내 자산) + 150 KLAY+300 USDT (플러스 자산)= 250 KLAY+500 USDT

* 활용 가능한 자산은 점차 확대될 예정이며, 스왑 시 슬리피지는 초기 1.0%로 고정됩니다.(추후 개별 설정 기능 제공 예정)

### 간편한 플러스 예치 종료(출금)

플러스예치 자산의 출금(종료)은 기존의 일반 페어 예치 출금 과정과 동일하여 간편합니다. 현재 보유한 총 LP Token수량을 기준으로 출금할 수량을 입력하면, 플러스 자산에 해당하는 LP 자산이 먼저 출금되어 활용자산을 우선 반환합니다. 플러스 자산에 해당하는 LP를 모두 출금하여 활용 자산 반환이 완료되면, 이후 남은 자산은 모두 유저의 지갑으로 출금할 수 있습니다. ‘출금’ 탭 상의 ‘플러스 자산’에 해당하는 수량은 현재 활용중인 자산을 반환하기 위해 필요한 LP Token 수량이며, 해당 수량 전체를 출금 요청하면 플러스 예치가 종료됩니다. 일부만 출금하면 활용 자산 일부를 먼저 반환하여 안전한 자산 관리가 가능합니다.

**(예시) 총 예치 자산 250 KLAY+500 USDT / 활용 자산 600 USDT** 상황에서 보유 LP Token 수량이 100, 내 자산이 40, 플러스 자산이 60 인 경우 (1KLAY=2.0 USDT, 수수료 미반영)&#x20;

* 유저가 플러스 자산(60)에 해당하는 LP 토큰 수량 보다 적거나 같은 수량 입력 시, 해당 자산은 출금 하여 활용 자산을 먼저 반환합니다. \
  → 50 LP Token 출금 시, 그에 상응하는 125 KLAY + 250 UDST 출금 \
  → 125 KLAY + 250 USDT 를 활용해 600 USDT 반환 진행 \
  1\) 250 USDT 반환 후 남은 활용 자산 : 350 USDT \
  2\) 125 KLAY > 250 USDT 전환하여 반환 후 남은 활용 자산 : 100 USDT \
  → 출금완료 후, **총 예치자산 125 KLAY + 250 USDT / 활용 자산 100 USDT**
* 플러스 자산이 0 인 경우, 현재 활용중인 자산을 모두 반환하였음을 의미합니다. 해당 시점부터 입력하여 출금되는 수량은 모두 사용자의 지갑으로 출금됩니다.

### **자산 활용 비율의 관리**&#x20;

자산활용 비율은 유저의 총 예치자산에서 활용자산이 차지하는 비율을 의미합니다. 플러스 예치 유저는 안전한 자산 관리를 위해 자산 활용 비율이 85%를 초과하지 않도록 항상 유의해야 합니다. 해당 비율을 초과하였다는 것은 자산의 급격한 가격 변동 시 반환 해야 할 자산(활용 자산)을 정상적으로 반환하기 어려울 수 있음을 의미합니다. 때문에 자산 활용비율 85% 초과 시, 프로토콜은 유저의 예치 자산에서 자동 반환을 진행하며, 유저는 반환 완료 후 남은 자산에서 반환 수수료(20%)를 제외한 자산을 수령할 수 있습니다.&#x20;

**자동 반환을 방지하기 위해서는** 1) 출금 탭에서 ‘플러스 자산 ’에 해당하는 LP Token 수량의 일부, 또는 전체 출금을 진행하거나 2) 낮은 플러스 배수로 자산을 추가 예치하여 자산활용 비율을 낮추어야 합니다. 반드시 자산 활용 비율 85%가 넘지 않도록 유의해주시기 바랍니다.

자산 활용 비율의 관리와 자동 반환은 프로토콜 안정성 및 플러스 예치 유저의 원활한 자산 활용을 위함입니다. 단일풀에서 활용된 자산이 안정적으로 반환되어야 단일풀 예치자가 시스템을 신뢰하고 더 많은 예치를 통해 단일 풀 자산 공급이 활성화 될 수 있습니다. 단일풀 자산 공급이 증가하면 **플러스 예치자는 더 낮은 비용(%)으로 자산을 활용할 수 있어 더 큰 수익을 얻을 수 있습니다.** 이를 위해 자동 반환이 발생한 유저로부터 반환 수수료(20%)를 적립해 Safety fund를 별도로 조성하고, 급격한 토큰 가격 변동으로 인해 단일 예치에서 활용한 자산을 미처 다 반환하지 못하는 경우 이를 사용해 반환을 완료합니다.

* [플러스 예치 상세 가이드 보러가기](/kr/product/plusdeposit/detail)


# 플러스 예치 상세 정책

### Price Oracle

자산 예치 시 가능한 플러스 규모의 계산, 자산 활용 비율에 따른 자동 반환 등과 관련된 가격 기준은 Price Oracle을 통해 측정되고 적용됩니다. (풀 교환비율과 상이)&#x20;

* 스테이블 코인은 고정된 가치($1.0)로 계산됩니다.&#x20;
* 그외 코인은 자산별 유동성을 고려하여 Binance, Upbit, Bithumb, Coinone, Huobi, gateio등 중앙거래소의 가격, KLAYSwap 내 풀 교환 비율(가격) 중 중앙값을 기준으로 결정합니다

### 수익률, 비용, 예상내역

* 모든 수익률(%)과 활용비용(%)은 페어 예치풀과 단일 예치풀의 실시간 현황에 따라 변동됩니다.
* 플러스 예치의 총 예상 수익률은 (연간 총 수익률-연간 총 비용)으로 계산됩니다. 연간 총 수익률은 KSP 분배 수익률, 에어드랍 수익률이 포함되며, 연간 총 비용은 유저가 활용하는 자산의 활용 비용을 의미합니다.
* KSP 분배 수익률(%), 에어드랍 수익률(%)은 풀에서 분배되는 KSP, 에어드랍 토큰으로 인해 획득할 것으로 예상되는 연간 수익률(APR)을 의미합니다.
* 활용 비용(%)은 플러스 예치로 단일 풀에서 자산 활용 시 지불해야하는 연간 이자 비용을 계산한 이율(APR)을 의미합니다.
* 모든 수치는 실시간 예상값이며 실제 내역과 다를 수 있습니다.

### 예치 정책

* 유저는 현재 풀의 교환비율(가격) 또는 자유비율로 사용자가 원하는 자산만 수량을 직접 입력하여 예치할 수 있습니다.
* 유저는 예치하는 자산의 달러 환산 가치를 기준으로 추가 자산을 얼마나 투입할 것인지 플러스 배수 설정을 통해 선택할 수 있습니다. **(예치자산 달러 환산 가치) \* (선택한 플러스 배수 - 1)** 의 규모만큼 추가로 자산을 투입하게 됩니다.
* 추가 자산 투입을 위해 유저는 어떤 자산을 활용할 지 선택할 수 있습니다. 선택한 자산을 단일 풀에서 활용하며, 유저는 활용 자산의 실시간 활용 비용(%)에 따라 누적된 이자를 포함한 활용자산을 반환 해야 합니다. 플러스 배수가 클수록 더 많은 자산을 활용하고, 그에 따른 비용을 지불해야 합니다.
* 유저의 예치 자산, 선택한 플러스 배수와 활용자산에 따라 자산의 일정 비율을 자동으로 스왑(거래)하여 최적의 비율로 페어 예치 합니다. 스왑이 필요한 경우 스왑 경로는 해당 페어 간 단일 경로로 진행하며, 거래 수수료가 발생합니다. 거래 수수료는 풀 별 거래 수수료율의 적용을 받습니다. (예를 들어 KLAY+KSP 페어의 플러스 예치 과정에서 스왑이 필요하다면, KLAY <> KSP 간 교환이 발생하며, 해당 풀의 거래 수수료율이 적용됩니다.)
* 거래 규모(수량)가 클수록, 풀의 토큰간 교환비율에 영향력을 주어 현재 가격과 교환 시 적용받는 가격에 차이(Price impact)가 발생할 수 있습니다. 적은 수량으로 여러 번을 실행하면 영향력을 줄일 수 있습니다.
* 스왑 시 발생하는 수수료는 제외한 후 페어 예치를 진행하며, 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)가 발생하여 유저가 선택한 플러스 배수와 완전히 정확한 규모로 플러스 예치가 진행되지 않을 수 있습니다. 이러한 경우를 방지하기 하기 위해 스왑 시 설정한 거래 범위 안에서만 예치를 진행(슬리피지는 1%)하며, 해당 범위를 초과하는 경우 예치 트랜잭션이  진행되지 않을 수 있습니다.(Revert)  하단의 예상내역 영역에서 관련 정보를 모두 확인 후 예치를 진행해주세요.
* 페어로 예치함에 따라 자산 가치는 계속해서 변동하며, 자산 활용비율 85% 초과 시 자동 반환이 진행됩니다. 자산 활용 비율은 내 예치자산의 가치 대비 활용자산 가치의 비율을 의미하며, 자산 활용 비율과 반환 정책을 반드시 확인해주세요.

### 출금 정책

* 유저가 출금을 요청하는 경우, 출금된 자산은 먼저 활용중인 자산을 반환합니다. 활용중인 자산을 모두 반환한 상태라면, 남은 자산을 출금해 지갑으로 수령할 수 있습니다.
* 유저는 출금 메뉴에서 현재 총 예치자산에 해당하는 총 LP Token 수량과, 내 자산과 플러스 자산 각각에 해당하는 LP Token 수량을 상세 확인할 수 있습니다.
* 플러스 자산에 해당하는 LP Token 수량을 유저가 출금하는 경우, 해당 LP Token은 활용중인 자산을 반환하는데 사용됩니다. 반환 자산 영역에서 반환에 사용되는 LP Token의 상세 수량을 확인할 수 있고, 지갑으로 수령할 수 있는 상세 수량은 You get 내역에서 확인할 수 있습니다.
* 플러스 자산에 해당하는 LP Token 수량이 0 인 경우, 유저는 내자산에 해당하는 LP Token 수량을 입력해 지갑으로 자산을 출금할 수 있습니다.
* 출금 시 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)로 인해 플러스 자산의 전체 출금 후에도 활용자산을 모두 반환하지 못하는 경우가 발생할 수 있습니다. 이러한 경우를 방지하기 하기 위해 스왑 시 설정한 거래 범위 안에서만 출금을 진행( 슬리피지는 1%)하며, 해당 범위를 초과하는 경우 출금 트랜잭션이 진행되지 않을 수 있습니다.

### 자산 활용 비율 자동 반환 정책 <a href="#assetutilizationratio" id="assetutilizationratio"></a>

* 플러스 예치중인 유저는 자산을 추가 투입해 KSP 보상 효율을 극대화 하는 대신 그에 대한 비용을 지불해야합니다. 비용은 실시간으로 활용자산에 포함되며, 비용이 포함된 활용자산을 모두 반환한 후 유저는 자산을 출금할 수 있습니다.
* 이때, 활용한 자산의 안전한 반환을 위해 유저의 총 예치자산 가치에서 활용자산의 가치가 차지하는 비율(자산 활용 비율)이 85%를 초과하는 경우, 자동 반환이 진행될 수 있습니다.
* 자산 활용 비율은 다음과 같이 계산됩니다.&#x20;

**자산 활용 비율(%) = (활용 자산의 달러 환산 가치/총 예치 자산 달러 환산 가치)\*100**

* 총 예치자산 가치의 하락 또는 활용 자산 가치의 상승 등으로 자산 활용 비율이 급격하게 변동할 수 있으므로, 유저는 반드시 주기적으로 자산 활용비율을 확인하여 자동 반환이 발생하지 않도록 유의해야 합니다.
* 자동 반환을 방지하기 위해 낮은 플러스 배수로 추가 자산을 예치하거나, 출금 탭에서 플러스 자산에 해당하는 수량의 출금을 진행해야 합니다.
* 자동 반환 시 현재 예치된 자산으로 활용중인 자산을 우선 반환하고, 남은 자산에서 자동 반환 수수료(20%)를 제외한 후 사용자가 자산을 직접 수령할 수 있습니다. (남은 자산, KSP 보상, 에어드랍 자산 포함)  자동 반환 과정에서 스왑이 발생하는 경우, 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)로 인해 활용자산을 모두 반환하지 못하는 경우가 발생할 수 있습니다. 이러한 경우 전체 예치 자산으로 모든 활용 자산을 반환해야 하므로, 자동반환 후에도 사용자가 수령해야 하는 자산이 없을 수 있습니다.
* 남은 자산의 수령은 상단의 내 예치자산 영역의 \[자산 상세] 버튼 클릭 후 \[반환 내역] 탭에서 진행할 수 있습니다.
* 자동 반환 수수료( 20%)는 급격한 가격 변동 발생으로 미처 반환되지 못한 단일 풀 자산을 반환하는 공익의 목적(Safety fund)으로 사용됩니다.

### 용어

![](/files/vmfcuFfCEDmJkZxKLyAz)


# 롱/숏 포지션 예치

### **롱/숏 포지션 예치란?**

KLAYswap의 롱/숏 포지션 예치는 온체인에서 레버리지를 활용해 롱/숏 포지션을 오픈할 수 있는 서비스입니다. 유저는 예치하는 자산을 기반으로 특정 토큰에 대해 최대 3배까지 롱 포지션이나 숏 포지션을 오픈할 수 있으며, 포지션 오픈 시점의 자산 가격과 수익 실현 시점의 가격 차이를 통해 수익을 획득할 수 있습니다. 특히, **숏 포지션 예치는 자산 가치 하락 시장에서도 지속적으로 수익을 추구**할 수 있어 예치자는 온 체인 환경에서도 시장 변동성에 능동적으로 대응할 수 있습니다.

또한, KLAYswap의 롱/숏 포지션은 유저가 **예치하는 자산**과 **각 포지션 오픈으로 확보하는 자산을 단일풀에 예치**함으로써, 포지션에 따른 가격 차익 실현 뿐 아니라 추가 예치 이자과 KSP 보상까지 획득할 수 있어 안전한 계좌 관리와 높은 수익성을 지니고 있습니다.

### 롱/숏 포지션 예치 특징

* 스테이블 자산 기반의 포지션 오픈 \
  \
  KLAYswap에서 롱/숏 포지션 오픈 시 USDC, USDT, DAI 등 스테이블 토큰만 사용 가능합니다. 유저가 예치한 스테이블 토큰의 달러 환산 가치를 기반으로 최대 3배까지 포지션을 오픈해 안정적으로 수익을 창출할 수 있습니다.<br>
* 유저의 자산 포트폴리오의 다양화 \
  \
  유저는 KLAYswap 단일 풀을 기반으로 온 체인에서도 롱/숏 포지션을 오픈해 디지털 자산 포트폴리오 구성을 다양화하여 새로운 수익 창출 기회를 얻을 수 있습니다.<br>
* 안전한 자산관리 & 수익률 극대화 \
  \
  유저가 예치한 자산은 단일풀에서 예치되어 예치이자와 KSP 보상을 받을 수 있습니다. 이를 통해 안전한 자산 관리와 수익률 극대화가 가능합니다.

### 자산 활용 비율의 관리

자산활용 비율은 유저의 총 예치자산에서 활용자산이 차지하는 비율을 의미합니다. 롱/숏 포지션 이용 유저는 안전한 자산 관리를 위해 자산 활용 비율이 90%를 초과하지 않도록 항상 유의해야 합니다. 해당 비율을 초과하였다는 것은 자산의 급격한 가격 변동 시 반환 해야 할 자산(활용 자산)을 정상적으로 반환하기 어려울 수 있음을 의미합니다. 때문에 자산 활용비율 90% 초과 시, 프로토콜은 유저의 예치 자산에서 자동 반환을 진행하며, 유저는 반환 완료 후 남은 자산에서 반환 수수료(20%)를 제외한 자산을 수령할 수 있습니다.

**자동 반환을 방지하기 위해서는** 1) ‘0x’ 상태에서 예치 자산을 추가하거나 2) 활용하고 있는 자산 중 일부를 반환해야하며 반드시 자산 활용 비율 90%가 넘지 않도록 유의해주시기 바랍니다.

자산 활용 비율의 관리와 자동 반환은 프로토콜 안정성 및 롱/숏 포지션 이용 유저의 원활한 자산 활용을 위함입니다. 단일풀에서 활용된 자산이 안정적으로 반환되어야 단일풀 예치자가 시스템을 신뢰하고 더 많은 예치를 통해 단일 풀 자산 공급이 활성화 될 수 있습니다.


# 롱/숏 포지션 오픈과 종료


# 롱 포지션 오픈

## 롱 포지션 오픈 상세절차

<figure><img src="/files/Q6bE89F384lfWufCPvOl" alt=""><figcaption></figcaption></figure>

**Step 1**

* KLAY 3배 롱 포지션을 오픈하는 경우, 예치 자산 1,000 USDT를 KLAYswap USDT 단일풀에 예치합니다.
* USDT 단일풀 예치로 유저는 풀에서 발생하는 예치 이자와 KSP 보상을 획득할 수 있습니다.

**Step 2**

* 유저는 예치 자산 1,000 USDT를 기반으로 3,000 USDT를 활용합니다. 이 때 활용한 3,000 USDT에 대해 활용 비용이 누적됩니다.
* 활용한 3,000 USDT는 KLAY/USDT 풀에서 5,982 KLAY로 스왑됩니다.
* 1 KLAY = 0.5 USDT 기준으로 계산되었으며, 스왑 과정에서 0.3%의 수수료가 발생합니다.

**Step 3**

* 스왑으로 획득한 5,982 KLAY는 KLAY 단일 예치 풀에 예치 하여 롱 포지션을 오픈합니다.
* 유저는 롱 포지션을 종료하기 전까지 KLAY 단일풀에 예치한 5,982 KLAY에 대해 예치 이자와 KSP 보상을 획득할 수 있습니다.

위와 같이 롱 포지션 예치를 완료한 유저는 다음과 같은 보상과 비용이 발생하게 됩니다.

1. 내 자산 1,000 USDT에 대해 USDT 단일 풀 예치 이자 (연 3.00%), KSP 보상 획득
2. 포지션 자산 5,982 KLAY에 대해 KLAY 단일 풀 예치이자(연 2.00%), KSP 보상 획득
3. 활용 자산 3,000 USDT에 대해 USDT 활용 비용 (연 6.00%) 발생


# 숏 포지션 오픈

## 숏 포지션 오픈 상세절차

<figure><img src="/files/vd0Pm81HxOKvrL3yJJfk" alt=""><figcaption></figcaption></figure>

**Step 1**

* KLAY 3배 숏포지션을 오픈하는 경우, 예치 자산 1,000 USDT를 KLAYswap USDT 단일풀에 예치합니다.
* USDT 단일풀 예치로 유저는 풀에서 발생하는 예치 이자와 KSP 보상을 획득할 수 있습니다

**Step 2**

* 유저는 예치 자산 1,000 USDT를 기반으로 6,000 KLAY를 활용합니다. 이 때 활용한 6,000 KLAY에 대해 활용 비용이 누적됩니다.
* 활용한 6,000 KLAY는 KLAY/USDT 풀에서 2,991 USDT로 스왑됩니다.
* 1 KLAY = 0.5 USDT로 계산되었으며, 스왑 과정에서 0.3%의 수수료가 발생합니다.

**Step 3**

* 스왑으로 획득한 2,991 USDT는 USDT 단일풀에 예치하여 숏 포지션을 오픈합니다.
* 유저는 숏 포지션을 종료하기 전까지 USDT 단일풀에 예치한 2,991 USDT에 대해 예치 이자와 KSP 보상을 획득할 수 있습니다.

위와 같이 숏포지션 예치를 완료한 유저는 다음과 같은 보상과 비용이 발생하게 됩니다.

1. 내 자산 1,000 USDT에 대해 USDT 단일 풀 예치이자(연 3.00%), KSP 보상 획득
2. 확보 자산 2,991 USDT에 대해 USDT 단일 풀 예치이자(연 3.00%), KSP 보상 획득
3. 활용 자산 6,000 KLAY에 대해 KLAY 활용 비용(연 7.00%) 발생


# 롱 포지션 종료

## 롱 포지션 종료 상세 절차

<figure><img src="/files/26BG9rizbbDLlDpuTYTw" alt=""><figcaption></figcaption></figure>

위 KLAY 3배 롱 포지션 예치 유저가 1 KLAY = 0.5 USDT 시점에 포지션을 오픈하고, 1년 뒤 1 KLAY = 0.8 USDT 인 시점에 모든 포지션을 종료한다고 가정합니다.

해당 유저의 포지션 오픈할 시점의 계좌 상황은 다음과 같습니다.

1. 오픈 시점의 KLAY 가격 : 1 KLAY = 0.5 USDT
2. 내 자산 1,000 USDT에 대해 USDT 단일 풀 예치 이자 (연 3.00%), KSP 보상 획득
3. 포지션 자산 5,982 KLAY에 대해 KLAY 단일 풀 예치이자(연 2.00%), KSP 보상 획득
4. 활용 자산 3,000 USDT에 대해 USDT 활용 비용 (연 6.00%) 발생

1년 뒤 포지션을 종료하고자 하는 시점의 계좌 상황은 다음과 같습니다.

1. 종료 시점의 KLAY 가격 : 1 KLAY = 0.8 USDT
2. 내 자산 = 1,000 USDT \*(1+0.03) = 1,030 USDT = $ 1,030.00
3. 포지션 자산 = 5,982 KLAY\*(1+0.02) = 6101.64 KLAY = $ 4,881.31
4. 활용 자산 = 3,000 USDT\*(1+0.06) =3,180 USDT = $ 3,180.00

**Step 1**

* 포지션 종료 요청 시, 먼저 단일풀에 예치중인 롱 포지션 토큰인 KLAY를 이용하여 활용 자산인 USDT를 반환합니다.
* 활용중인 3,180 USDT를 반환하기 위해 약 3986.96088 KLAY를 KLAY/USDT 풀에서 USDT로 스왑합니다

\[참고] 3,180 USDT 반환을 위해 필요한 KLAY 수량(x)의 계산

* 1KLAY = 0.8 USDT, 스왑 과정에서 0.3% 수수료 발생 x = 3,180/((1-0.003)\*0.8) = 3986.96088265 KLAY

**Step 2**

* 획득한 3,180 USDT를 반환하여 포지션을 종료합니다.
* 활용한 자산의 일부만 반환하면 포지션을 원하는 만큼 종료할 수 있습니다.

위와 같이 롱 포지션 예치를 종료한 유저는 다음과 같이 자산을 수령하게 됩니다.

1. 내 자산 1,030 USDT (예치 이자 + 30 USDT 획득)
2. 포지션 수익 + 1,701.31 USDT (=$4,881.31- $3,180.00)
3. USDT, KLAY 풀에서 획득한 추가 KSP 보상


# 숏 포지션 종료

<figure><img src="/files/d2aaSiaNSWtljju071qn" alt=""><figcaption></figcaption></figure>

위 KLAY 3배 숏 포지션 예치 유저가 1 KLAY = 0.5 USDT 시점에 포지션을 오픈하고, 1년 뒤 1 KLAY = 0.2 USDT 인 시점에 모든 포지션을 종료한다고 가정합니다.

해당 유저의 포지션 오픈할 시점의 계좌 상황은 다음과 같습니다.

1. 오픈 시점의 KLAY 가격 : 1 KLAY = 0.5 USDT
2. 내 자산 1,000 USDT에 대해 USDT 단일 풀 예치 이자 (연 3.00%), KSP 보상 획득
3. 포지션 자산 2,991 USDT에 대해 USDT 단일 풀 예치이자(연 3.00%), KSP 보상 획득
4. 활용 자산 6,000 KLAY에 대해 KLAY 활용 비용 (연 7.00%) 발생

1년 뒤 포지션을 종료하고자 하는 시점의 계좌 상황은 다음과 같습니다.

1. 종료 시점의 KLAY 가격 : 1 KLAY = 0.2 USDT
2. 내 자산 = 1,000 USDT \*(1+0.03) = 1,030 USDT = $ 1,030.00
3. 확보 자산 = 2,991 USDT\*(1+0.03) = 3,080.73 USDT = $ 3,080.73
4. 활용 자산 = 6,000 KLAY\*(1+0.07) \*$0.2=1,284 USDT = $ 1,284.00

**Step 1**

* 포지션 종료 요청 시, 먼저 단일풀에 예치중인 확보 자산인 USDT를 이용하여 활용 자산인 KLAY를 반환합니다.
* 활용중인 6,420 KLAY를 반환하기 위해 약 1,287.86359 USDT를 KLAY/USDT 풀에서 KLAY로 스왑합니다

\[참고] 6,420 KLAY 반환을 위해 필요한 USDT 수량(x)의 계산

* 1KLAY = 0.2 USDT, 스왑 과정에서 0.3% 수수료 발생 x = 6,420/(1-0.003)\*0.2 = 1,287.86359 USDT

**Step 2**

* 획득한 6,420 KLAY를 반환하여 포지션을 종료합니다.
* 활용한 자산의 일부만 반환하면 포지션을 원하는 만큼 종료할 수 있습니다.

위와 같이 숏 포지션 예치를 종료한 유저는 다음과 같이 자산을 수령하게 됩니다.

1. 내 자산 1,030 USDT (예치 이자 + 30 USDT 획득)
2. 포지션 수익 + 1,796.73 USDT (=$3,080.73- $1,284.00)
3. USDT, KLAY 풀에서 획득한 추가 KSP 보상


# 포지션 예치 상세 정책

## Price Oracle

* 자산 예치 규모의 계산, 자산 활용 비율에 따른 자동 반환 등과 관련된 가격 기준은 Price Oracle을 통해 측정되고 적용됩니다. (풀 교환비율과 상이)
* 스테이블 토큰은 고정된 가치($1.0)로 계산됩니다.
* 그외 토큰은 자산별 유동성을 고려하여 Binance, Upbit, Bithumb, Coinone, Huobi, gate.io등 중앙거래소의 가격, KLAYSwap 내 풀 교환 비율(가격) 중 중앙값을 기준으로 결정합니다&#x20;

## 수익률, 비용, 예상내역

* 모든 수익률(%)과 활용 비용(%)은 포지션 오픈 시 예치 자산, 확보 자산, 활용 자산 각 단일 풀의 실시간 현황에 따라 변동됩니다.
* 포지션 예치의 최대 예상 수익률은 (연간 예치 자산의 수익률 + 연간 확보 자산의 수익률 - 연간 활용 자산의 비용)으로 계산됩니다. 연간 수익률에는 예치 수익률, KSP 분배 수익률이 포함되며, 연간 비용은 유저가 활용하는 자산의 비용을 의미합니다.
* 예치 수익률(%)은 단일 풀 가동율에 따라 예치자에게 분배되는 토큰으로 인해 획득할 것으로 예상되는 연간 수익률(APR)을 의미합니다.
* KSP 분배 수익률(%)은 풀에서 분배되는 KSP토큰으로 인해 획득할 것으로 예상되는 연간 수익률(APR)을 의미합니다.
* 활용 비용(%)은 포지션 예치로 인해 단일 풀에서 자산 활용 시 지불해야하  는 연간 이자 비용을 계산한 이율(APR)을 의미합니다.
* PNL(Profit and Loss)은 오픈 된 포지션에 대한 미실현 수익을 의미합니다. 현재 시점의 토큰 가격(Price oracle)기준으로 포지션 종료 시 (내 예치 자산 가치 + 확보 자산 가치 - 활용 자산 가치) - 총 원금으로 계산되며, 포지션 종료 시 스왑(거래)이 발생하는 KLAYswap 유동성 풀 상황과 토큰 가격에 따라 실제 실현 수익은 예상 수익과 다를 수 있습니다.
* ROE(Return on Equity)는 유저가 투입한 총 원금 대비 수익률(%)을 의미하며 계산식은 다음과 같습니다. \
  \
  \* ROE(%) = (PNL / 총 원금) \* 100<br>
* 모든 수치는 실시간 예상값이며 실제 내역과 다를 수 있습니다.&#x20;

## 포지션 오픈 정책

* 유저는 예치하는 스테이블 자산의 달러 환산 가치를 기준으로 포지션 배수를 설정하여 포지션을 오픈 규모를 설정할 수 있습니다. (예치자산 달러 환산 가치)\*(선택한 포지션 배수) 규모만큼 단일풀에서 자산을 활용하여 포지션을 오픈하게 됩니다. 예치 자산의 최대 3배까지 포지션을 오픈할 수 있습니다.
* 롱 포지션 예치의 경우, 유저가 예치하는 스테이블 자산과 동일한 자산의 단일 풀에서 자산을 활용하며, 숏 포지션 예치의 경우, 유저가 포지셔닝 하려는 토큰의 단일 풀에서 자산을 활용합니다. 유저는 활용 자산의 실시간 활용 비용(%)에 따라 누적된 이자를 포함한 활용 자산을 반환해야 합니다. 설정한 포지션 배수가 클수록 더 많은 자산을 활용하고, 그에 따른 비용을 지불해야 합니다.
* 포지션 예치 시 활용 자산은 자동으로 스왑(거래)하여 포지션을 오픈하게 됩니다. 스왑 경로는 포지셔닝 토큰과 예치하는 스테이블 자산 간 스왑을 위한 라우팅을 진행하며, 거래 수수료가 발생합니다. 거래 수수료는 풀 별 거래수수료율의 적용을 받습니다. (예를 들어 USDT를 예치하며 KLAY를 포지셔닝하면서 KLAY>KSP>USDT 경로로 스왑이 발생하는 경우, KLAY/KSP 풀과 KSP/USDT 풀 각각의 거래 수수료율이 적용됩니다.)
* 거래 규모(수량)가 클수록, 풀의 토큰간 교환비율에 영향력을 주어 현재 가격과 교환 시 적용받는 가격에 차이(Price impact)가 발생할 수 있습니다. 적은 수량으로 여러 번을 실행하면 영향력을 줄일 수 있습니다.
* 스왑 시 발생하는 수수료는 제외한 후 포지션 오픈이 가능하며, 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)가 발생하여 유저가 선택한 포지션 배수와 완전히 정확한 규모로 포지션 오픈이 진행되지 않을 수 있습니다. 이러한 경우를 방지하기 하기 위해 스왑 시 설정한 거래 범위(슬리피지) 안에서만 예치를 진행하며, 해당 범위를 초과하는 경우 예치 트랜잭션이 진행되지 않을 수 있습니다.(Revert) 하단의 예상내역 영역에서 관련 정보를 모두 확인 후 예치를 진행해주세요.
* 예치 자산, 활용 자산, 확보 자산 가치는 계속해서 변동하며, 자산 활용 비율 90% 초과 시 자동 반환이 진행됩니다. 자산 활용 비율은 내 예치자산의 가치 대비 활용자산 가치의 비율을 의미하며, 자산 활용 비율과 반환 정책을 반드시 확인해주세요.&#x20;

## 포지션 종료 정책

* 유저가 포지션을 종료를 요청하는 경우, 단일 풀에 예치중인 확보 자산(롱 포지션 예치인 경우 롱 포지션 토큰에 해당하며, 숏 포지션인 경우 활용 자산을 매도하여 획득한 스테이블 토큰에 해당)을 출금하여 먼저 활용중인 자산을 반환합니다.활용중인 자산을 모두 반환한 상태라면, 남은 자산을 출금해 지갑으로 수령할 수 있습니다.
* 유저는 포지션 종료(Close탭) 메뉴에서 활용중인 자산의 상세 수량, 유저의 계좌에서 프로토콜로 반환되는 자산의 상세 수량, 반환 완료 후 지갑으로 수령하는 자산의 상세 수량을 확인할 수 있습니다.
* 롱 포지션 예치를 종료하는 경우, 단일 풀에 예치중인 롱 포지션 토큰을 출금하여 활용 중인 자산을 우선 반환합니다. 반환 과정에서 스왑이 발생하므로, 유저의 계좌에서 프로토콜로 반환되는 자산은 스왑 수수료를 포함하여 반환됩니다. 가격 변동으로 인해 롱 포지션 토큰만으로 활용 자산 전체를 반환하지 못하는 경우, 유저가 포지션 오픈 시 예치한 자산(내 자산)에서 추가로 반환이 진행될 수 있습니다.
* 숏 포지션 예치를 종료하는 경우, 단일 풀에 예치중인 스테이블 토큰을 출금하여 활용 중인 자산을 우선 반환합니다. 반환 과정에서 스왑이 발생하므로, 유저의 계좌에서 프로토콜로 반환되는 자산은 스왑 수수료를 포함하여 반환됩니다. 가격 변동으로 인해 스테이블 토큰만으로 활용 자산 전체를 반환하지 못하는 경우, 유저가 포지션 오픈 시 예치한 자산(내 자산)에서 추가로 반환이 진행될 수 있습니다.
* 포지션 종료 시 유저가 지갑으로 수령하는 상세 자산 수량은 ‘You get‘에서 확인할 수 있습니다. 포지션 오픈 시점의 가격과 종료 시점 가격에 따라 손실이 발생할 수 있습니다.
* 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)로 인해 포지션 종료 시 활용 자산을 모두 반환하지 못하는 경우가 발생할 수 있습니다. 이러한 경우를 방지하기 하기 위해 스왑 시 설정한 거래 범위(슬리피지) 안에서만 출금을 진행하며, 해당 범위를 초과하는 경우 트랜잭션이 진행되지 않을 수 있습니다.

## 자산 활용 비율 자동 반환 정책

* 롱/숏 포지션을 오픈한 유저는 자산을 추가로 활용해 수익을 극대화 하는 대신, 활용하는 자산에 대한 비용을 지불해야합니다. 비용은 실시간으로 활용자산에 포함되며, 비용이 포함된 활용자산을 모두 반환한 후 유저는 자산을 출금할 수 있습니다.
* 이때, 활용한 자산의 안전한 반환을 위해 유저의 총 예치자산 가치에서 활용자산의 가치가 차지하는 비율(자산 활용 비율)이 90%를 초과하는 경우, 자동 반환이 진행될 수 있습니다.
* 자산 활용 비율은 다음과 같이 계산됩니다.\
  \
  **1) 롱 포지션 예치인 경우**\
  \
  `자산 활용 비율(%) = (활용 자산의 달러 환산 가치 / (내 자산의 달러 환산 가치 + 롱 포지션 토큰의 달러 환산 가치)) * 100`\
  \
  **2) 숏 포지션 예치인 경우** \
  \
  `자산 활용 비율(%) = ( 숏 포지션 토큰 달러 환산 가치 / (내 자산의 달러 환산 가치 + 확보한 스테이블 토큰의 달러 환산 가치)) * 100`<br>
* 총 예치자산 가치의 하락 또는 활용한 자산 가치의 상승으로 자산 활용 비율이 급격하게 변동할 수 있으므로, 유저는 반드시 주기적으로 자산 활용비율을 확인하여 자동 반환이 발생하지 않도록 유의해야 합니다.
* 자동 반환을 방지하기 위해 0x 배수로 추가 자산을 예치 하거나, 포지션 종료 탭(Close 탭)에서 활용 중인 자산의 반환을 진행해야 합니다.
* 자동 반환 시 현재 예치된 자산으로 활용중인 자산을 우선 반환하고, 남은 자산에서 자동 반환 수수료(20%)를 제외한 후 사용자가 자산을 직접 수령할 수 있습니다. 자동 반환 과정에서 스왑이 발생하는 경우, 거래 규모에 따라 교환 시 적용 받는 가격에 차이(Price impact)로 인해 활용자산을 모두 반환하지 못하는 경우가 발생할 수 있습니다. 이러한 경우 전체 예치 자산으로 모든 활용 자산을 반환해야 하므로, 자동반환 후에도 사용자가 수령해야 하는 자산이 없을 수 있습니다.
* 남은 자산의 수령은 상단의 내 예치자산 영역의 \[자산 상세] 버튼 클릭 후 \[반환 내역] 탭에서 진행할 수 있습니다.
* 자동 반환 수수료(20%)는 급격한 가격 변동 발생으로 미처 반환되지 못한 단일 풀 자산을 반환하는 공익의 목적(Safety fund)으로 사용됩니다.

## 용어 정의

<figure><img src="/files/GmNGRQleF3N8hxna2wXg" alt=""><figcaption></figcaption></figure>


# KSP 스테이킹 & 보팅

![](/files/-MiZcuU9u7KIynE9O0bR)

KSP 스테이킹 참여자는 스테이킹 보상 뿐 아니라, 클레이스왑 전체 거버넌스와 관련된 풀 투표권(vKSP)을 획득합니다. 같은 수량의 KSP를 스테이킹하더라도 획득하는 풀 투표권(vKSP)은 스테이킹 기간에 따라 다를 수 있습니다. 즉, 거버넌스의 장기 참여자일수록 더 많은 투표권을 획득하며, 강력한 의사결정 권한을 확보함으로써 클레이스왑의 성장에 많은 영향력을 행사할 수 있습니다.&#x20;

​

**1KSP  스테이킹 기간에 따른 투표권 획득**&#x20;

|                    |   4개월  |   8개월  |   12개  | **12개월+a** |
| :----------------: | :----: | :----: | :----: | ---------- |
|        적용 배수       |   1배수  |   2배   |   4배수  | **8배**     |
| 1 KSP 스테이킹 시 획득 투표 | 1 vKSP | 2 vKSP | 4 vKSP | **8 vKSP** |

### &#x20;

### KSP 인플레이 보상&#x20;

KSP 스테이킹 참여자는 인플레이션으로 유통되는 KSP 보상과 풀 투표권(vKSP)을 획득할 수 있습니다. 스테이킹 참여자 대상 KSP 분배율은 40%로, 거버넌스 투표를 통해 변경될 수 있습니다.

<table data-header-hidden><thead><tr><th width="209">분배 대상</th><th>블록 당 분배 비율(%)</th><th width="160">블록 당 분배 수량</th><th>1일 분배 수량 (86,400 블록)</th></tr></thead><tbody><tr><td><strong>분배 대상</strong></td><td><strong>블록 당 분배 비율(%)</strong></td><td><strong>블록 당 분배 수량</strong></td><td><strong>1일 분배 수량 (43,200 블록)</strong></td></tr><tr><td><strong>단일 예치자</strong></td><td><strong>5%</strong></td><td><strong>0.025 KSP</strong></td><td><strong>2,160 KSP</strong></td></tr><tr><td><strong>페어 예치자(일반, 플러스)</strong></td><td><strong>45%</strong></td><td><strong>0.225 KSP</strong></td><td><strong>19,440 KSP</strong></td></tr><tr><td><strong>KSP 스테이킹 참여</strong> </td><td><strong>50%</strong></td><td><strong>0.25 KSP</strong></td><td><strong>21,600 KSP</strong></td></tr><tr><td><strong>Total</strong></td><td><strong>100%</strong></td><td><strong>0.5 KSP</strong></td><td><strong>43,200 KSP</strong></td></tr></tbody></table>

‌

### 풀 투표 보상&#x20;

풀 투표 클레이스왑을 동작하는 강력한 인센티브인 KSP를 어떤 풀에 더 많이 분배할 것인가를 결정하는 민주적인 의사 결정 체제입니다. 풀 투표권(vKSP) 보유자만 참여할 수 있으며, 투표권자는 해당 풀에서 발생한 거래 수수료의 50%를 추가 보상 받을 수 있습니다.&#x20;


# 스테이킹, 풀 투표 정책

## 스테이킹 정책

스테이킹 참여자는 아래 정책에 따라 스테이킹에 참여할 수 있습니다.&#x20;

* KSP 스테이킹은 **KSP를 타인에게 맡겨 보관하거나 위탁하는 행위가 아니라 이용자 스스로가 정해진 조건(스테이킹 기간 등)에 따라 대상 KSP가 송금, 거래되지 않도록 서명하여 락업**하는 것입니다. 따라서 이러한 조건을 위반하는 **중도취소, 출금, 출금지갑 변경 등은 불가능**합니다.
* 계약한 **스테이킹 종료일 이전에 중도 스테이킹 취소는 불가능** 합니다.&#x20;
* 스테이킹은 건 별이 아닌, 총 KSP 수량으로 스테이킹 가능하며, KSP 스테이킹 시 컨트랙트 승인 절차를 완료해야 합니다. ( 최초 1회 )&#x20;
* 풀 투표권(vKSP)은 KSP 수량과 스테이킹 기간(4/8/12/12+a개월)에 따라 매 스테이킹 시점마다 획득할 수 있습니다.&#x20;
* KSP 스테이킹 후 발행되는 투표권은 다음과 같이 산출됩니다.&#x20;
* 4개월, 8개월, 12개월, 12개월+a 스테이킹하면 각각 1배, 2배, 4배, 8배의 투표권을 획득합니다. **추가 스테이킹 시 선택한 기간이 이전 선택한 기간보다 짧은 경우, 각 건 별로 투표권 획득 배수를 적용 받습니다.** \
  \
  예시1) 100KSP씩 4개월-12개월 순차적으로 스테이킹 한 경우, 200KSP에 대한 4배가 적용되어 총 800vKSP를 획득 \
  \
  예시2) 100KSP씩 12개월-4개월 순차적으로 스테이킹 한 경우, 각각의 배수 적용으로 총 500vKSP 획득(12개월 - 400vKSP, 4개월 - 100vKSP) <br>
* 스테이킹 보상은 총 발행된 vKSP 대비 내 vKSP의 지분율에 따라 분배됩니다. (스테이킹 지분율 = 획득한 vKSP / 프로토콜 총 vKSP)&#x20;
* 4x이하의 효율로 스테이킹한 경우 \[최대로 올리기] 버튼을 통해 스테이킹 효율을 8X로 높이고 더 많은 vKSP를 획득할 수 있습니&#xB2E4;**. 8x 효율은 4x로 변경하기 전까지 정해진 종료일 없이 계속해서 vKSP 스테이킹을 진행하게 됩니다.**&#x20;
* 8x스테이킹을 진행중인 경우 \[4배로 낮추기]버튼을 클릭하여 **스테이킹 효율을 4x로 낮출 수 있으며, 해당시점으로부터 12개월 초과 후 언스테이킹 할 수 있습니다.**&#x20;
* 스테이킹 효율을 8x 에서 4x로 변경하는 경우, **획득 투표권 수량 변경으로 인해 유저가 참여한 풀 투표, Ecopot에 할당된 투표권 철회가 우선적으로 진행**됩니다. 그러나 풀 투표 정책에 의해 **유저가 투표한 풀 중 투표권을 철회할 수 있는 시점(매일 오전09시)에 제한이 있는 경우, 풀 투표를 철회가 가능한 시점에 4x로 변경이 가능**합니다.&#x20;
* 효율 변경 시점에 유저가 다수의 풀에 투표 중이거나 다수의 Ecopot에 참여중인 경우, **연산 비용으로 인해 트랜잭션 실행이 불가능**할 수 있습니다. 이 경우 유저는 풀 투표, Ecopot 풀에서 할당한 투표권을 직접 철회 한 후 4x 효율로 변경이 가능합니다.
* **추가 스테이킹 시점과 선택한 스테이킹 기간에 따라 스테이킹 종료 일시는 변동되며, 스테이킹 종료일 이후 언스테이킹(출금)이 가능**합니다.\
  \
  CASE1. 기존 스테이킹 종료일시 < 추가 스테이킹 시점 +선택한 스테이킹 기간(4/8/12개월)인 경우, 스테이킹 종료일이 증가합니다.\
  \
  CASE2. 기존 스테이킹 종료일시 > 추가 스테이킹 시점 +선택한 스테이킹 기간(4/8/12개월)인 경우, 기존 일시가 최종 스테이킹 종료일입니다.<br>
* 보상으로 분배된 KSP는 자유롭게 수령할 수 있으며, 지갑에서 확인할 수 있습니다.&#x20;
* 추가 스테이킹 또는 언스테이킹으로 인해 현재 총 KSP 수량이 변동되는 경우, 해당 시점까지 분배된 KSP 보상은 자동으로 지갑으로 수령됩니다.

## 스테이킹 계약의 종료&#x20;

* **8x 효율로 스테이킹하는 경우 정해진 언스테이킹 기간 없이 계속해서 스테이킹**을 진행합니다.&#x20;
* 4x 이하의 효율로 스테이킹하는 경우 스테이킹 계약 종료 30일 전부터 언스테이킹 안내 팝업창을 확인할 수 있으며, **스테이킹 계약 종료일로부터 30일 동안 계약을 연장하거나 스테이킹한 자금을 출금**할 수 있습니다.정해진 언스테이킹 기간 내 KSP를 출금하면 발행된 투표권(vKSP)이 반환됩니다.&#x20;
* 풀 투표에 참여중인 상태에서 KSP를 언스테이킹 하는 경우, 투표권 반환으로 인해 자동으로 투표가 철회되며, 철회 시점 전까지 분배된 거래 수수료는 지갑으로 수령합니다.&#x20;
* 획득한 투표권과 풀 투표 내역은 스테이킹 종료 후 대기기간 동안에도 유지됩니다.&#x20;
* 30일간의 대기 기간 동안 언스테이킹 되지 않은 경우 직전 계약 기간(4/8/12개월) 중 가장 긴 기간을 기준으로 새로운 스테이킹 계약이 자동 진행되며, 그에 상응하는 투표권(vKSP)을 획득합니다. 8x 스테이킹을 진행하다 4x로 효율을 낮춘경우 효율을 낮춘 시점으로부터 12 개월간 락업 후 언스테이킹(출금) 가능합니다. **자동 재계약 된 스테이킹은 취소가 불가능합니다.**&#x20;
* 만약 대기기간 안에 추가로 KSP 스테이킹을 진행하는 경우, 해당 시점을 기준으로 기존 스테이킹 수량 + 추가한 스테이킹 수량 총합의 스테이킹 계약이 진행됩니다.&#x20;
* 풀 투표로 인해 보유한 투표권(vKSP)의 수가 감소하지 않습니다.

## 풀 투표 정책

* vKSP 홀더는 V3 업데이트 대상인 페어에 대해 일반(V2), 집중화(V3) 총 2개 유형에 투표할 수 있습니다.
* V2 풀의 경우, 매일 오전 09시(KST) 일반풀에 투표된 vKSP 수량의 스냅샷 기준으로 집계됩니다.
* V3 풀의 경우, 매일 오전 09시(KST) 집중화풀에 투표된 vKSP 수량의 스냅샷 기준으로 집계됩니다
* 특정 페어에 투표 완료 시, 다음 스냅샷 시점 이후 철회할 수 있습니다.
* 기존에 KSP 보상 풀이었으나 KSP 분배 철회 투표로 인해 관련 토큰 레벨의 하락 및 미보상 풀로 변경된 경우, 다음 라운드 스냅샷 시점 이전에 철회가 가능합니다.
* 거버넌스 투표로 인한 토큰 레벨 변경이 이루어지는 경우, 코드 반영 완료 시점부터 해당 페어는 KSP 인플레이션 보상 분배 대상에서 제외됩니다.
* KSP 보상 풀을 대상으로 투표할 수 있으며, 풀 투표자는 최대 10개의 풀에 투표할 수 있습니다.
* 투표한 풀에서 발생한 거래 수수료의 50%는 풀 투표자에게 분배됩니다. 풀 투표 중인 기간 동안 발생한 거래 수수료만 대상이 됩니다.
* 해당 풀에서 내 풀 투표 지분율에 따라 거래 수수료를 분배받습니다. (내 풀 투표 지분율 = 내 vKSP 투표수량/해당 풀에 투표한 전체 vKSP 수량)
* 풀 투표가 이루어지지 않은 풀에 누적된 거래 수수료는 분배되지 않습니다.
* 풀 투표로 분배받은 거래 수수료는 자유롭게 수령하여 지갑에 받을 수 있습니다.
* 추가 투표, 투표 철회 또는 스테이킹 계약 기간 종료에 따른 언스테이킹으로 투표권 수량이 변동되는 경우, 해당 시점까지 분배된 거래 수수료를 자동으로 지갑에 수령합니다.

##


# 거버넌스

### Governance

KLAYswap 거버넌스는 투표를 통해 거버넌스를 운영하는 합의체인 KLAYswap DAO를 통해 KSP 가치 상승과 전체 생태계 성장을 위한 체계를 구축합니다. DAO는 KSP를 스테이킹하고 투표권(vKSP)을 획득하며, 투표권 행사와 거버넌스 참여의 대가로 KSP 인플레이션 보상을 분배 받습니다. KSP 가치 상승으로 DAO는 더 큰 수익을 얻을 수 있기 때문에, DAO는 자연스럽게 KSP 가치 상승을 통한 생태계 성장이라는 기본 전제에 따라 프로토콜의 주요 사안을 결정하게 됩니다. KLAYswwap은 KSP 가치 상승과 DAO의 이익이 직결되는 거버넌스 구조를 통해 투표권(vKSP) 확보를 위한 KSP에 대한 지속적인 수요를 창출하고, KSP 스테이킹 참여의 증가를 유도합니다. 이는 KSP의 안정적인 가격 지지기반을 형성할 뿐만 아니라, 거버넌스와 DAO의 활성화에 따라 KSP의 지속적인 가치 상승이 가능한 선순환 구조를 형성하게 됩니다.

### **거버넌스 투표 등록 절차**&#x20;

<figure><img src="/files/7Pofq8tsDjl3G9EMat7b" alt=""><figcaption></figcaption></figure>

KLAYswap 거버넌스 투표 등록과 실행 순서는 다음과 같습니다.

**1) 투표 등록**&#x20;

클레이스왑 거버넌스에 투표를 등록하고자 하는 유저는 투표 등록 시점 기준으로 프로토콜에 총 발행된 vKSP의 0.1%이상을 보유해야합니다. 투표 등록자는 제안 유형 중 한 개를 선택하여 등록할 수 있으며, 등록 비용은 500 KSP입니다. 등록 비용으로 사용된 KSP는 소각됩니다.

**2) 투표 기간**

투표는 총 3일 동안 진행됩니다. 투표가 시작된 시점에 전체 지갑에 대해 스냅샷 처리하여, 각 지갑별로 투표에 참여할 수 있는 vKSP 수량을 확정합니다. 투표가 시작된 이후 추가로 KSP를 스테이킹 하여 획득한 투표권은 행사할 수 없습니다.한 번 투표된 내역에 대해서는 변경이 불가합니다.

**3) 1차 가결**

투표가 완료된 시점에 해당 투표가 최소 참여 기준과 최종 가결 기준을 만족했다면 1차 가결에 성공한 것으로 간주하여 다음 단계로 넘어가고, 조건을 만족하지 못했다면 해당 투표는 취소 처리됩니다.

(1) 참여 가능 투표권

* 투표가 시작된 시점의 스냅샷 기준으로 프로토콜에 총 발행된 투표권 수량으로, 투표에 참여할 수 있는 투표권 수의 총합의 나타냅니다.

(2) 최소 참여 기준

* 참여 가능 투표권 수량 기준, 최소 20%이상 참여해야 유효한 투표로 인정

(3) 최종 가결 기준

* 총 투표자가 최소 참여 기준 이상이면서, 총 투표자의 과반수 이상 찬성하는 경우

**4) Timelock**&#x20;

1차 가결된 투표는 일정 기간동안 Timelock 상태로 유지됩니다. Timelock 기간 동안 해당 트랜잭션 실행으로 인한 문제가 없는지 최종 점검을 진행합니다.

**5) 최종 반영**

Timelock이 종료되면 트랜잭션이 실행되고 프로토콜 코드가 변경되며 투표가 최종 반영됩니다.

### 투표 생성 및 상세 절차

**1) 투표 등록 안내**

* 투표를 등록하기 위해서는 투표 제안서를 작성해야 합니다.
* 투표를 등록하려는 유저는 지갑에 투표 등록 시점 기준, 전체 프로토콜 vKSP의 0.1% 이상을 지갑에 보유해야 하며, 투표 등록에는 500KSP가 사용됩니다(제출된 500KSP는 소각됩니다)

**2) 투표 참여 안내**

* 투표에 참여하기 위해서는 투표가 시작되기 전 vKSP를 보유하고 있어야 합니다.
* 등록된 투표가 시작되는 시점에 스냅샷을 통해 vKSP 수량이 파악됩니다. 따라서 투표가 시작된 이후 추가로 KSP를 스테이킹하여 획득한 투표권은 반영되지 않습니다.
* KLAYswap 거버넌스 페이지 메인상의 각 투표 상세페이지에 들어가면 행사할 수 있는투표권( vKSP)수량을 확인할 수 있습니다. 투표 상세페이지에서 찬성 혹은 반대 버튼을 선택한 뒤, 트랜잭션 팝업창에서 \[투표하기] 버튼을 클릭하면 투표가 완료됩니다. 투표가 완료되면 변경할 수 없습니다.

[KSP 스테이킹 방법 가이드 보기](/kr/how-to-guides/stake-and-boost)


# 거버넌스 투표 정책

* 거버넌스 오픈 시점에는 일반 자산의 거버넌스 통과/철회 투표를 진행할 수 있습니다. 초기 안정화 기간 이후 모든 사안에 대한 변경을 투표할 수 있도록 순차적으로 업데이트 할 예정입니다.
* 거버넌스의 모든 시간은 (KST) 기준입니다.
* 투표가 거버넌스에 등록된 후에는 변경하거나 취소할 수 없습니다.
* 하나의 지갑 주소로 동시에 여러개의 투표를 등록할 수 없습니다. 이미 등록된 투표가 있는 경우 투표 종료 후 다른 투표를 등록할 수 있습니다.
* 투표를 등록하고자 하는 유저는 지갑에 투표 등록 시점 기준 전체 프로토콜 vKSP의 0.1% 이상을 지갑에 보유해야 합니다.
* 투표 등록 시 비용(500 KSP)이 발생하며, 비용은 전액 소각 됩니다. 등록 비용은 거버넌스 투표를 통해 변경될 수 있습니다.
* 투표의 본문 내용은 공백 포함 300자 이상 작성해야 하며, 영어로만 작성할 수 있습니다.
* 각 투표에 참여할 수 있는 투표권 (vKSP)은 각 투표 시작 시점에 스냅샷을 통해 확정됩니다. 거버넌스 메인 페이지에 나와 있는 “보유 투표권”은 실시간 vKSP 수량으로 각 투표에 참여할 수 있는 vKSP 수량과 다를 수 있습니다.
* 투표 시작 이후 스테이킹을 통해 더 많은 vKSP를 획득하거나 언스테이킹으로 vKSP수가 줄었어도 해당 투표에 투표할 수 있는 vKSP수는 투표 시작 시점과 동일합니다.
* 투표의 가결 기준은 다음과 같습니다. \
  \- 총 투표자가 최소 참여 기준 이상이면서, 총 투표자의 과반수 이상 찬성하는 경우 (상세 기준은 [거버넌스 투표 등록\_1차 가결 ](/kr/product/governance)항목 참고)
* 투표의 부결 기준은 다음과 같습니다. \
  \- 투표기간(3일) 종료까지 최소 참여 투표권 수량 미만으로 참여한 경우 \
  \- 투표 기간 종료 시점에 총 투표자의 과반수가 찬성하지 않은 경우


# Drops(드랍스)

![](/files/-MlIFO_JFPnvyotQI0s5)

##

&#x20;**Drops(드랍스)**&#xB294; Klaytn 기반의 다양한 프로젝트가 KLAYswap의 유저 베이스와 인프라를 활용해, 초기 토큰 자원을 가장 효과적으로 분배하고, 분배 계획-실행-분배 후 유동성 활성화에 이르는 전 과정을 성공적으로 수행할 수 있는 플랫폼입니다. \
\
프로젝트는 KLAYswap과 KSP의 강력한 지지자인 KSP 스테이킹 참여자를 대상으로 에어드랍을 진행함으로써 높은 주목도를 얻고, 잠재적인 유저 풀을 형성할 수 있습니다. 프로젝트는 이를 향후 유동성 형성을 위한 성장 동력으로 활용할 수 있으며, KSP 스테이킹에 참여한 유저는 스테이킹 보상 뿐 아니라 새로운 프로젝트 우선 참여 기회 및 추가 보상을 획득할 수 있습니다. <br>

### 프로젝트

* 별도의 비용과 리소스 투입 없이 토큰을 배포하고 초기 토큰 이코노미를 구축할 수 있습니다. <br>
* 에어드랍을 통해 클레이스왑 커뮤니티 자사 프로젝트 컨텐츠를 홍보하고, 신규 홀더를 \
  확보할 수 있습니다.\
  &#x20;
* 기존 KLAYswap 유저 대상으로 효과적인 컨텐츠 노출을 통해 초기 유동성을 조성하고 공급자를 확보할 수 있으며, 향후 풀 조성 시 유동성 연계가 가능합니다.<br>
* 컨트랙트 기술 지원을 받아 투명하고 안전하게 에어드랍을 진행할 수 있습니다. <br>
* 클레이스왑과 협의를 통해 상호 마케팅을 진행할 수 있습니다.

### **KSP 홀더**

* &#x20;KSP 스테이킹 참여 유저는 KSP 보상 외에 추가로 수익을 얻을 수 있습니다.<br>
* 에어드랍이 진행되는 여러 플랫폼을 검색할 필요 없이, KSP 스테이킹만으로 간편하게 클레이튼 생태계에서 분배되는 토큰을 에어드랍 받을 수 있습니다.  <br>
* 신규 프로젝트가 제공할 다양한 금융 기회를 선점할 수 있습니다.&#x20;

### **클레이스왑**

* &#x20;Drops를 통해 더 많은 건전한 프로젝트들이 KLAYswap 생태계로 들어옴에 따라 KLAYswap 생태계는 점차 확장될 것이고, 클레이스왑과 Drops참여 프로젝트가 함께 성장하는 선순환 구조가 만들어집니다. KLAYswap 사용 유저는 KSP 토큰 이코노미와 결합 가능한 프로젝트가 제공하는 새로운 금융 기회를 누릴 수 있습니다. 드랍스는 KSP 가치 증대에 기여하고, KLAYswap 생태계 발전에 도움이 되는 중요한 역할을 할 것입니다.&#x20;

### **드랍스(Drops) 참여 방법**&#x20;

KSP 스테이킹에 참여중인 유저는 자동으로 Drops가 지원하는 신규 프로젝트의 에어드랍 대상에 \
해당합니다.  KSP 스테이킹 외에 별도의 참여 절차는 없으며, 보유한 vKSP 수량을 기준으로 에어드랍 토큰을 분배합니다. \
\
장기간 KSP 스테이킹에 참여한 유저는더 많은 vKSP를 획득하므로, 에어드랍 혜택 역시 증가합니다. 분배되는 에어드랍 수량은 매일 오전 9시 스냅샷을 기준으로 확인할 수 있으며, 보상 수령은 에어드랍 종료 후 한 번에 할 수 있습니다.

{% content-ref url="/pages/-M\_nx6ZuQWU9sE7tSdlA" %}
[KSP 스테이킹 & 풀 투표하기](/kr/how-to-guides/stake-and-boost)
{% endcontent-ref %}

<br>

### **드랍스(Drops) 참여 유의사항**

* 에어드랍은 정해진 기간 동안 한 개의 프로젝트만 진행됩니다.<br>

* ‘내 에어드랍 수량’ 은  KSP 스테이킹 후 보유한 vKSP 수량의 스냅샷을 기준으로 분배됩니다.<br>

* 스냅샷은 매일 1회, 오전 9시(KST)에 진행됩니다.\
  (단, 클레이튼 체인상의 트랜잭션 혼잡도 상승, 컴퓨터 시스템 오류 등의 상황으로 스냅샷 처리에 지연이 발생할 수 있으며, 이 경우 정상 복구된 시점의 블록(Block)을 기준으로 vKSP 수량 스냅샷을 진행합니다. 해당 스냅샷을 기준으로 지연으로 인해 처리되지 못한 기간에 동일하게 적용하여 분배합니다)<br>

* 진행 예정인 에어드랍의 ‘내 에어드랍 예상 수량’은 해당 시점의 프로토콜에서 발행된 전체 vKSP 수량 대비 유저가 보유한  vKSP 수량을 기준으로 계산된 실시간 예상 수량으로, 실제 분배 받는 수량과 동일하지 않을 수 있습니다. 실제 분배 받는 수량은 매일 오전 진행되는 스냅샷을 기준으로 정해니다. <br>

* 분배된 드랍스 토큰의 “보상 수령 가능일”은 토큰별로 상이하며, 개발사 사정에 의하여 변경될 수 있습니다.

* 에어드랍에서 보상으로 제공되는 토큰은 별도의 심사를 거치지 않은, 클레이튼 체인 상에서 자율적으로 발행된 토큰으로 안전성을 보장하지 않습니다.<br>

* 에어드랍은 프로젝트사가 자율적으로 진행하며, 클레이스왑은 해당 토큰의 거래와 투자를 조장하지 않습니다. <br>

* 수령한 보상은 \[내 자산] 페이지에서 확인 가능하며, 표시되지 않는 경우 해당 토큰 컨트랙트 주소를 검색하여 확인할 수 있습니다.


# Ecopot(에코팟)

Ecopot은 클레이스왑과의 생태계 연결을 통해 유저와 유동성을 확대하고자 하는 에코시스템 파트너 \
프로젝트입니다. Ecopot 참여 프로젝트는 스테이킹 참여자(vKSP 홀더)를 대상으로 다양한 토큰을 제공합니다.

## Ecopot 참여 방법

KSP 스테이킹에 참여하여 투표권인 vKSP를 획득한 유저는 Ecopot에 참여할 수 있습니다.&#x20;

Ecopot 참여를 원하는 유저는보유한 vKSP로 다양한 Ecopot 풀에 참여할 수 있으며, 각 풀에서 분배되는 토큰을 보상으로 받게 됩니다. 장기간 KSP 스테이킹에 참여한 유저는더 많은 vKSP를 획득하므로 Ecopot에서 얻을 수 있는 혜택도 증가합니다. 분배되는 보상은 실시간으로 확인할 수 있으며 언제든지 수령할 수 있습니다. Ecopot 내 여러 프로젝트에 참여한 경우 \[전체 보상 수령]버튼을 통해 한 번에 보상을 수령할 수 있습니다.

{% content-ref url="/pages/-M\_nx6ZuQWU9sE7tSdlA" %}
[KSP 스테이킹 & 풀 투표하기](/kr/how-to-guides/stake-and-boost)
{% endcontent-ref %}

## ECOPOT 참여 유의사항

* 유저는 Ecopot 목록에서 보유한 투표권(vKSP)으로 최대 10개의 프로젝트에 참여할 수 있습니다.
* 유저는 "보유 투표권 총량"을 기준으로 Ecopot 에 참여할 수 있으며, Ecopot 과 풀 투표는 별개의 투표입니다. 예시) 1,000vKSP를 보유한 유저는 Ecopot 과 풀 투표 각각에서 1,000 vKSP를 행사할 수 있습니다.
* 예상 수익률은 해당 Ecopot 에 참여한 총 vKSP 수량 대비 유저가 참여한 vKSP 수량을 기준으로 연간 획득할 것으로 예상되는 보상 수량을 기준으로 계산된 연간 수익률(APR)을 나타낸 것으로, 실제 수익률과 다를수 있습니다.
* 분배된 Ecopot 보상은 자유롭게 수령할 수 있습니다.
* Ecopot 에서 보상으로 주어지는 토큰은 별도의 심사를 거치지 않은 클레이튼 체인 상에서 자율적으로 발행된 토큰으로 안전성을 보장하지 않습니다.
* Ecopot 은 프로젝트사가 자율적으로 참여하며, 클레이스왑은 해당 토큰의 거래와 투자를 조장하지 않습니다. Ecopot 보상 분배는 클레이스왑이 아닌 해당 프로젝트사가 직접 보상 물량을 분배하므로, 분배가 지연되거나 중단될 수 있습니다.
* 수령한 보상은 \[내 자산]페이지에서 확인 가능하며, 표시되지 않는 경우 해당 토큰의 컨트랙트 주소를 검색하여 확인할 수 있습니다.
* Ecopot은 각 프로젝트 사가 자발적으로 보상을 분배하며, start block부터 보상 분배가 시작됩니다. 현재 블록 넘버는 클레이튼 스코프 또는 클레이스왑 사이트 우측 상단(PC), 사이드 메뉴(모바일)에서 확인할 수 있습니다.


# 풀에어드랍

&#x20;클레이스왑의 에어드랍 기능을 활용하면, 클레이튼 체인의 다양한 디앱(Dapp) 프로젝트도 자유롭게 풀에 프로젝트 토큰을 분배할 수 있습니다. \
&#x20;만약 유동성 공급자가 에어드랍이 설정된 풀에 유동성을 공급하면, 내 LP Token 지분을 기준으로 \
매 블럭마다 설정된 에어드랍 토큰을 분배 받습니다. 에어드랍은 특정 풀에서 다중 설정도 가능하여 여러 개의 토큰을 모두 보상 받을 수도 있습니다.&#x20;

&#x20;그동안 클레이스왑은 높은 보상 APR & APY 획득 기회를 제공함으로써 다양한 유저의 적극적인 생태계 참여를 이끌어냈지만, 그 보상이 KSP와 거래수수료에 제한된다는 점, 동시에 클레이스왑 프로토콜에서 참여자로만 보상이 전달되는 일방향적 분배 구조라는 점 등 아쉬운 점이 존재했습니다.

&#x20;이에 클레이스왑은 추가적인 토큰 에어드랍 모델을 통해 제한된 환경을 벗어나, 단순히 \[클레이스왑 ㅡ 참여자]가 아닌, \[디앱(Dapp) 프로젝트 ㅡ 클레이스왑 ㅡ 참여자] 모두가 연결되는 유기적인 시스템으로 변화함으로써 클레이튼 생태계를 이코노미적으로 연결하는 탈중앙화 유동성 연결점까지 목표로 하고자 합니다.&#x20;

## 토큰 에어드랍이 제공하는 기회&#x20;

### **안정적인 유동성 공급 환경**

기존의  KSP,  거래수수료 보상 뿐 아니라 새로운 토큰 에어드랍이라는 추가적인 리워드 제공을 통해 , 유동성 공급 시 더 많은 가치를 얻을 수 있게 됩니다. 이는 초기 유동성 공급 진입 시 토큰 가격 변화로 인해 발생 가능한 위험을 상쇄할 수 있으며, 이로써 유저는 이전보다 더욱 안정적인 환경의 클레이스왑에 유동성을 공급할 수 있습니다.

###

### &#x20;**초기 디앱 (Dapp) 프로젝트의 초기 성장 견인**&#x20;

\
토큰 에어드랍 모델은 디앱 프로젝트가 기존에 가지고 있는 고유한 토큰 이코노미 모델의 확장을 가져올 수 있음은 물론 프로젝트 본연의 내재 가치를 유지할 수 있는 강력한 인센티브의 역할을 할 수 있습니다. \
특히 이제 막 클레이튼 생태계에서 성장하고자 하는 디앱 프로젝트들은 그동안 초기 유동성 부족으로 높은 가격 변동성에 큰 영향을 받을 수밖에 없었지만, 추가적인 보상이 이루어지는 클레이스왑의 AMM 환경에서는 더 나은 유동성의 질과 양을 상호 연관시킬 수 있습니다. 따라서, 클레이스왑을 활용하는 프로젝트들은 단기적인 가격 변동성을 방어하면서 프로젝트 본연의 가치 상승에 집중할 수 있습니다.

요약하자면, 이번에 새롭게 추가되는 기능은 유동성 제공자와 디앱들을 포함하여 전반적인 참여자들 간의 유기적인 연결이 추가적인 가치 제공으로 이루어질 수 있는 발전된 인센티브 환경의 구축을 의미합니다.<br>

Airdrop Operator 등록은 여기( [Developer - Airdrop - Airdrop Operator 권한 획득](https://docs.klayswap.com/v/kr/developer/airdrop/airdrop-operator) )를 참고하세요.


# APR & APY


# TVL

KLAYswap 내의 예치된 모든 자산( 유동성 풀 + Staking KSP ) 의 USD 가치를 나타냅니다.

#### USD 달러 표기화 방식법

KLAYswap 내 Token의 USD 달러 표기는 해당 토큰의 KLAYswap 내 KLAY 교환비율을 계산한 뒤, 바이낸스의 KLAY/USDT 마켓 가격을 기준으로 산출됩니다.

예시) 67976802 Block,  KLAY = 1.87$ 기준

|       | Pool                                                                            | Price                                     |
| ----- | ------------------------------------------------------------------------------- | ----------------------------------------- |
| 1KSP  | 40,450,000 **KLAY /** 2,525,000 **KSP**                                         | 40450000 / 2525000 \* 1 \* 1.87 = 29.96 $ |
| 1KORC | <p>18,490,000 <strong>KLAY /</strong> 33,077,000 <strong>kORC</strong> <br></p> | 18490000 / 33077000 \* 1 \* 1.87 = 1.05 $ |


# Pool

### 단일 예치 (Single Pool) 보상

SinglePool 유동성 공급자는 각 풀에 해당하는 토큰을 예치하고 유동성 지분에 대한 증거로 iToken을 받게 됩니다. 예치한 자산을 출금하는경우,  iToken을 다시 반환하고, 해당시점의 Token : iToken 교환 비율에 따라 누적된 예치 이자가  포함된 토큰을 수령합니다. iToken 보유자는 예치 이자 뿐아니라러  KSP 보상을 받게 됩니다.&#x20;

* KSP 보상 : 유동성을 공급할 경우 KSP 인플레이의 일정량을 유동성 공급 기간 동안 보상 받게 됩니다.&#x20;
* 예치 이자 보상 : 예치한 자산은 PlusPool을 위한 재원으로 활용되며, 플러스 예치자가 자산 활용 시 지불한 비용은 다시 단일 풀 예치자에게 분배됩니다. 분배된 수익은 내 예치자산 수량에 자동으로 포함됩니다.&#x20;

### **KSP 보상 APR & APY**

* iToken 보유자는 1 iToken의 KSP 연간 보상 수익률을 아래와 같이 추정할 수 있습니다.&#x20;
* APR은 iToken가격과 KSP가격에 따라 실시간으로 변동됩니다.&#x20;

$$
APR = SP DailyKSP 분배수량 \* KSP가격 / 총 SP규모 \* 365 \* 100
$$

* **SP 공급자 KSP 보상 APY = ((1+ APR / 365) ^ 365 -1) \* 100**
* 일일 분배 KSP = 86400
* SP DailyKSP 분배수량 = (일일 분배 KSP) \* SP KSP 분배율(5%) \* SP 분배율
* 예시

  * KLAY SP의 APR 구하는 과정&#x20;
  * 총LP규모 =  40,000,000 $&#x20;
  * DailKSP = 1728 =  86400(일일 분배 KSP) \* 0.05(SP KSP 분배율) \* 0.4(KLAY SP 분배율)
  * 1KSP = 29.20$
  * APR = 1728 \* 29.2 / 40000000 \* 365 \* 100 = 46.04%

### SP 공급자 예치수익률 APR

$$
APR =  borrowingRate \* Utiliztion \*(1- reserveFactor)
$$

### 풀 활성화 비율

$$
Utilization = TotalBorrow / TotalDeposit
$$

### 자산 활용 비 &#x20;

$$
BorrowingRate = Borrowing Rate Model ( Utilization )
$$

### Borrowing Rate Model

<table data-header-hidden><thead><tr><th width="150"></th><th width="150"></th><th></th></tr></thead><tbody><tr><td>Utilization Range</td><td>Borrowing Rate Range</td><td>Logic</td></tr><tr><td>0% ~ 60%</td><td>0% ~ 20%</td><td>Borrowing Rate = Utilization / 3 </td></tr><tr><td>60% ~ 90%</td><td>20%</td><td>Borrowing Rate = 0.2 </td></tr><tr><td>90% ~ 100%</td><td>20% ~ 100%</td><td>Borrowing Rate = Utilization * 8 - 7 </td></tr></tbody></table>

### 일반 페어 예치 (Pair Pool) 보상

&#x20;유동성 공급자는 풀 유동성을 제공할 경우 유동성 지분에 대한 증거로 LP(Liquidity Pool) Token을 받게 됩니다. 예치한 자산을 출금하는 경우, LP Token을 반환하고 그에 상응하는 자산을 수령할 수 있습니다.  &#x20;

&#x20;유동성 공급자는 유동성을 제공하고 KSP, 거래 수수료, Airdrop 보상을 받게 됩니다.&#x20;

* KSP 보상 : KSP 보상 풀에 유동성을 공급할 경우 KSP 일일채굴량의 일정량을 유동성 공급 기간 동안 보상 받게 됩니다.&#x20;
* 거래 수수료 보상 : KSP 보상풀이 아닌 풀에 유동성을 공급할 경우 거래 수수료의 50% 중 보유 LP 지분율에 따라 거래 수수료를 보상 받게 됩니다.
* Airdrop 보상 : Airdrop 대상 풀이라면 유동성 공급 기간 동안 Token을 분배 받게 됩니다.

### **LP 공급자 KSP 보상 APR & APY**

* LP 토큰 보유자는 1LP의 KSP 연간 보상 수익률을 아래와 같이 추정할 수 있습니다.&#x20;
* APR은 LP가격과 KSP가격에 따라 실시간으로 변동됩니다.&#x20;

$$
APR = LP DailyKSP 분배수량 \* KSP가격 / 총 LP규모 \* 365 \* 100
$$

* **LP 공급자 KSP 보상 APY = ((1+ APR / 365) ^ 365 -1) \* 100**
* 일일 분배 KSP = 86400
* LP DailyKSP 분배수량 = (일일 분배 KSP ) \* LP 공급자 KSP 분배율 \* 투표율
* 예시

  * 2021년 8월 24일 기준  KLAY/KUSDT Pair LP의 APR 구하는 과정&#x20;
  * 총LP규모 =  45,589,138 $&#x20;
  * DailKSP = 4427 =  86400(일일 분배 KSP) \* 0.6(LP 공급자 KSP 분배율) \* 0.0854(투표율)
  * 1KSP = 29.20$
  * APR = 4427 \* 29.2 / 45589138 \* 365 \* 100 = 103.5%

&#x20;

### LP 공급자 거래 수수료 보상 APR

$$
APR = TradeFee(24H) *0.5 /총LP규모*365\*100
$$

* 예시
  * 2021년 8월 24일 기준  KLAY/KUSDT Pair LP의 APR 구하는 과정
  * 총LP규모 = 45,589,138 $
  * TradeFee(24H) = 33,677 $
  * APR = 33677 \* 0.5 / 45589138 \* 365 \* 100 = 13.5 %

### LP 공급자 Airdrop 보상&#x20;

$$
APR = Daily Airdrop Token \* TokenPrice / 총LP규모*365*100
$$

* 특정 LP의 DailyAirdropToken 조회하는 과정&#x20;
  * Treasury Contract의 `distributionEntries` 함수로 해당 LP에 등록된 Distribution Contract Address 조회 ( 하나의 LP에는 여러개의 Distribution Contract가 등록될 수 있습니다. )
  * 조회된 address로 Distribution Contract들의 `blockAmount` 와 `token` 함수로 DailyAirdropToken을 조회할 수 있습니다. ( `distributedAmount`, `estimateEndBlock`, `totalAmount` 함수를 통해 조기마감, 종료 여부를 확인할 수 있습니다. )
* 예시
  * 임의의 토큰X, LPX의 APR 구하는 과정
  * 총LPX규모 = 45,500,000 $
  * 토큰X 가격 = 2$
  * 블럭별 토큰X 분배갯수 = 2
  * DailyAirdropToken = 10 \* 86400 = 864000
  * APR = 2 \* 86400 \* 2 / 45500000 \* 365 \* 100 = 277 %

### 플러스 페어 예치 (Plus Pair Pool) 보상

플러스 예치는 유동성 공급시 단일풀에서 자산을 활용해 예치하며, 이때 자산 활용 비용을 지불하게 됩니다.&#x20;

* 일반페어 예치 APR \*플러스 배수 - 활용자산비용\*(플러스배수-1) &#x20;


# Staking

KSP 보유자는 Staking을 통하여 KSP 보상과 투표권을 얻게 됩니다. 투표권 수량은 KSP 스테이킹 수량과 기간에 따라 정해지게 됩니다.

**스테이킹 기간에 따라 획득하는 vKSP 수량**  &#x20;

<table data-header-hidden><thead><tr><th width="177"></th><th width="150">     4개월</th><th width="150">     8개월</th><th>   12개월</th></tr></thead><tbody><tr><td>4개</td><td>     8개월</td><td>     12개월</td><td>   12개월+α</td></tr><tr><td>1vKSP</td><td>2vKSP</td><td>4vKSP</td><td>8vKSP</td></tr></tbody></table>

### Staking KSP 보상 APR & APY

스테이킹 참여자는 일일 KSP 인플레이션의 일정량을 vKSP 지분율에 따라 보상 받습니다.

#### APR = DailyKSP \* Staking 분배율 \* KSP가격\*(투표한vKSP/총 vKSP)/(스테이킹KSP\*KSP가격)\**100\**&#x33;65

* **Staking KSP보상 APY = ((1+APR / 365) ^ 365 - 1) \* 100**
* 스테이킹대상 DailyKSP 분배수량 = (일일 분배 KSP ) \* Staker KSP 분배율
* 예시
  * 83642957 Block 기준 총 vKSP(146,457,051)
  * 1KSP 12+α 개월 스테이킹시 APR \
    \= (864000\*0.85\*0.4)\*(8/146457051)\*5.39/(1\*5.39)\*100\*365 \
    \= 58.57%
  * 1KSP 12+α 개월 스테이킹시 일주일간 KSP 보상 = 약 0.0016 개

### Voting APR

획득한 투표권을 활용해 KSP 보상 풀에 투표하는 경우,  거래 수수료의 50%를 풀 투표 지분율에 따라 분배됩니다.

#### APR = TradeFee(24H) \*0.5 *(투표 vKSP/총 풀투표 vKSP)/(스테이킹KSP*KSP가격)\*10&#x30;*\*365*

* 투표 풀이 KSP보상 풀일 경우 거래수수료 보상을 받습니다
* 예시

  * 83642957 Block 기준 KLAY/KUSDT 총 투표 vKSP(33,325,638)
  * KLAY/KUSDT TradeFee = $ 37,581
  * KLAY/KUSDT 12+α 개월 1개 스테이킹 기준 APR \
    \= 37581\*0.5\*(8/33325638)/(1\*5.39)\*100\*365 \
    \= 30.545%

### EcoPot APR

획득한 투표권을 활용해 EcoPot 풀에 투표하는 경우, EcoPot 블럭당 분배수량을 투표 지분율에 따라 분배됩니다.

#### APR = 1일 분배 수량*분배 토큰 가격*(투표한vKSP/총vKSP)/(스테이킹 KSP\*KSP가격)\**100\**&#x33;65

* 거래 수수료 지급과 별개로 투표한 EcoPot 투표 지분율에 따라 분배됩니다.
* 예시
  * 83642957 Block 기준 KLAYMETA 총 투표 vKSP(36,798,084)
  * KLAYMETA 일일분배량 = 1,822 META
  * 1META = $ 0.6
  * KLAYMETA 12+α 개월 1개 스테이킹 기준 APR \
    \= 1822\*(8/36798084)\*0.6/(1\*5.39)\*100\*365 \
    \= 1.609%


# 이자율 모델

### 가동률(Utilization ratio)

$$
Utilization Ratio=(TotalBorrowed/PoolLiquidity)\*100
$$

​

### 예치  이율(Deposit  APR)

$$
DepositAPR=BorrowAPR∗(1−reserveFactor)
$$

* 플러스 예치, 롱/숏 포지션 예치자가 지불하는 누적 이자 수익의 80%는 단일 풀 예치자에게 분배되며, 20%는 Reserve fund로 분류되어 KSP 바이백과 소각에 사용합니다.&#x20;
* reserve Factor = 0.2

###

### 활용비용(Borrow APR)

$$
BorrowAPR=BorrowingRateModel\*Utilization
$$

### 토큰별  이자율  모델 <a href="#borrowingratemodel" id="borrowingratemodel"></a>

\*MBX , AZIT 토큰의 경우,  다른 토큰의 이자율 모델과 상이하므로 참고해주시기 바랍니다.

\
\
**KLAY / KSP / WEMIX / BORA / oETH / oUSDT / oUSDC / KDAI / oXRP / oORC / oMESH / oTON**&#x20;

<figure><img src="/files/uWnVM74pmLoBOJgBCcs2" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th>Utilization Ratio</th><th width="210.89753863766458">Borrowing Rage Range</th><th>Logic</th></tr></thead><tbody><tr><td>0%~60%</td><td>0%~20%</td><td>Borrowing Rate = Utilization / 3 </td></tr><tr><td>60%~90%</td><td>20%</td><td>Borrowing Rate = 0.2 </td></tr><tr><td>90%~100%</td><td>20%~100%</td><td>Borrowing Rate = Utilization * 8 - 7 </td></tr></tbody></table>

**MBX**

<figure><img src="/files/4Dagcr7MKXHczyWlWUXx" alt=""><figcaption></figcaption></figure>

| Utilization Ratio | Borrowing Rate Range | Logic                                   |
| ----------------- | -------------------- | --------------------------------------- |
| 0%\~60%           | 0%\~20%              | Borrowing Rate = Utilization / 3        |
| 60%\~90%          | 20%                  | Borrowing Rate = 0.2                    |
| 90%\~100%         | 20%\~300%            | Borrowing Rate = Utilization \* 28 - 25 |

**AZIT**

<figure><img src="/files/JuBNbn6oR81m4UxYbyke" alt=""><figcaption></figcaption></figure>

| Utilization Ratio | Borrowing Rate Range | Logic                                   |
| ----------------- | -------------------- | --------------------------------------- |
| 0%\~60%           | 0%\~100%             | Borrowing Rate = Utilization \* 5 / 3   |
| 60%\~90%          | 100%                 | Borrowing Rate = 1                      |
| 90%\~100%         | 100%\~500%           | Borrowing Rate = Utilization \* 40 - 35 |


# Contract

* [Factory ](/kr/developer/contract/factory)
* [Exchange](/kr/developer/contract/exchange)
* [PoolVoting](/kr/developer/contract/poolvoting)
* [VotingKSP](/kr/developer/contract/votingksp)
* [Treasury](/kr/developer/contract/treasury)
* [Distribution](/kr/developer/contract/distribution)
* [Governor](/kr/developer/contract/governor)
* [SinglePool](/kr/developer/contract/singlepool)
* [SinglePool Factory](/kr/developer/contract/singlepool-factory)
* [PlusPool](/kr/developer/contract/pluspool)
* [PlusPool Factory](/kr/developer/contract/pluspool-factory)
* [Store](/kr/developer/contract/store)
* [Utils](/kr/developer/contract/utils)
* [Single/Plus Utils](/kr/developer/contract/single-plus-utils)
* [Helper](/kr/developer/contract/helper)
* [EcoPotVoting](/kr/developer/contract/ecopotvoting)
* [EcoPot](/kr/developer/contract/ecopot)


# Factory

The Factory smart contract oversees the full functionality of token pair registration and transactions in KLAYswap. It is also a token contract for KLAYswap's KSP governance token that complies with the KIP7 standard, and a smart contract that implements all functions related to KSP mining.

## Code

Github Link: (Will be updated after official launch)

## Address

* Cypress : [0xC6a2Ad8cC6e4A7E08FC37cC5954be07d499E7654](https://scope.klaytn.com/account/0xC6a2Ad8cC6e4A7E08FC37cC5954be07d499E7654?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**Transfer**

```solidity
event Transfer(address indexed from, address indexed to, uint amount);
```

* Event for the movement and burning of KSP tokens
* A KIP7 Standard Event

**Approval**

```solidity
event Approval(address indexed holder, address indexed spender, uint amount);
```

* Event for KSP token approval
* A KIP7 Standard Event

**ChangeCreateFee**

```solidity
event ChangeCreateFee(uint _createFee);
```

* An event to change the Pool Contract Creation Fee when adding a new liquidity pool pair

**CreatePool**

```solidity
event CreatePool(address tokenA, uint amountA, address tokenB, uint amountB, uint fee, address exchange, uint exid);
```

* Event to create new liquidity pool&#x20;
* parameters&#x20;
  * `tokenA` : A token address in pair
  * `amountA` : A token amount in pool
  * `tokenB` : B token address in pair
  * `amountB` : B token amount in pool&#x20;
  * `fee` : pool fee rate exchange :&#x20;
  * `exchange` : contract address of this pool&#x20;
  * `exid` : exchange id

**ExchangePos**

```solidity
event ExchangePos(address tokenA, uint amountA, address tokenB, uint amountB);
```

* Positive exchange Event
* parameters&#x20;
  * `tokenA` : User input tokenA address&#x20;
  * `amountA` : User input tokenA amount&#x20;
  * `tokenB` : User get tokenB address&#x20;
  * `amountB` : User get tokenB amount

**ExchangeNeg**

```solidity
event ExchangePos(address tokenA, uint amountA, address tokenB, uint amountB);
```

* Positive exchange Event
* parameters&#x20;
  * `tokenA` : User input tokenA address&#x20;
  * `amountA` : User input tokenA amount&#x20;
  * `tokenB` : User get tokenB address&#x20;
  * `amountB` : User get tokenB amount

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### name

* KlaySwap Protocol

#### symbol

* KSP

#### decimals

* 18

#### totalSupply

* 126144000000000000000000000 = 126144000 KSP
* There is only one case in which the total supply can be changed:
  * A decrease due to fee payments for adding new liquidity pairs&#x20;

#### balanceOf

* The amount of KSP held in each address

#### allowance

* Status of approval to spender for each address

#### owner

* Governance Contract Address

#### miningAmount

* The total mining amount
* This cannot be changed after a contract is deployed

#### halfLife

* The block unit that proceeds with halving
* This cannot be changed after a contract is deployed

#### minableBlock

* The block number that starts mining

#### unfreezeBlock&#x20;

* The block number that makes KSP token transfers possible

#### teamRatio

* The ratio of the mined amount given to the developement team for the first two years.

#### pools

* List of liquidity pool pairings&#x20;
* Each item saves the smart contract address of the liquidity pool

#### poolExist

* Returns if the contract for the given liquidiy pool pair exists

#### tokenToPool

* When the addresses of tokenA and tokenB are inputted, this returns the contract address of the corresponding pairing
* Returns the  same contract address regardless of the order of the liquidity pool pairing tokens:

  tokenToPool\[tokenA]\[tokenB] == tokenToPool\[tokenB]\[tokenA]

#### createFee

* The amount of KSP that must be paired to create a new liquidity pool pair

#### teamWallet

* The address to which the development team can claim their reward

#### teamAward

* The team reward amount that has already been claimed

#### mined

```solidity
function mined() public view returns (uint) 
```

* Returns the KSP amount mined so far
* This amount includes the quantity already claimed and the quantity to be claimed
* The teamAward quantity is exempted from this amount

#### estimatePos

```solidity
function estimatePos(address inToken, uint inAmount, address outToken) private view returns (uint)
```

* Returns the possible quantity received for a POS transaction.
* Parameters&#x20;
  * `inToken` :  token address for payment
  * `inAmount` : amount of tokens for payment
  * `outToken` : token address for receiving

**estimateNeg**

```solidity
function estimateNeg(address inToken, address outToken, uint outAmount) private view returns (uint)
```

* Function to return the amount of tokens that need to be paid for a NEG transaction.&#x20;
* Parameters
  * `inToken` : token address for payment
  * `outToken` : token address for receiving
  * `outAmount` : amount of tokens to receive

#### getPoolCount

```solidity
function getPoolCount() public view returns (uint)
```

* Returns the current number of registered liquidity pools.&#x20;

#### getPoolAddress

```solidity
function getPoolAddress(uint idx) public view returns (address)
```

* Returns the liquidity pair contract address of the pair's index.
  {% endtab %}

{% tab title="State-Changing Functions" %}

## State-Changing Functions

#### transfer

```solidity
function transfer(address _to, uint _value) public returns (bool)
```

* KIP7 Standard
* Method to transfer KSP tokens

#### transferFrom

```solidity
function transferFrom(address _from, address _to, uint _value) public returns (bool)
```

* KIP7 Standard
* Method to transfer tokens on behalf of the approved wallet

#### approve

```solidity
function approve(address _spender, uint _value) public returns (bool)
```

* KIP7 Standard
* Method to approve a transfer as much as value to spender

#### burn

```solidity
function burn(uint amount) public
```

* KIP7 Standard
* Method to burn as much as value to spender

#### changePoolFee

```solidity
function changePoolFee(address tokenA, address tokenB, uint fee) public
```

* Method to change transaction fees for each liquidity pair
* only owner

#### changeMiningRate

```solidity
function changeMiningRate(address[] memory tokenA, address[] memory tokenB, uint[] memory rate) public
```

* Method to change the mining weight per liquidity pair
* All pairs for mining must be changed at once
* The rate of each pair is between 1 and 100
* The sum of rates for all pairs is 100
* only owner
* Parameters
  * `tokenA` : list of addresses of the first token pair
  * `tokenB` : list of addresses of the second token pair
  * `rate` : list of mining rate for a pair

#### createKlayPool

```solidity
function createKlayPool(address token, uint amount, uint fee) public payable
```

* A method called to add a liquidity pair with one side as KLAY
* The wallet that calls this must have KSP greater than or equal to createFee
* Token for when the KLAY-KIP7 pair to be registered has never been registered before
* Parameters
  * `token` : KIP7 token address to add liquidity
  * `amount` : the amount of tokens (KIP7) to be provided for the initial liquidity
  * `fee` : Sets the initial fee value for liquidity pairs
    * A value between 30 and 100
    * Meaning: 30 -> 0.3%, 100 -> 1%
  * `msg.value` : KLAY quantity to initially supply liquidity&#x20;
    * Delivers the transaction value without specifying otherwise

#### createKctPool

```solidity
function createKctPool(address tokenA, uint amountA, address tokenB, uint amountB, uint fee) public
```

* 양쪽 다 KIP7인 경우의 유동성 페어 추가를 위해 호출하는 method
* createFee 이상의 KSP를 호출하는 지갑이 보유하고 있어야 함
* 등록하려는 KIP7-KIP7 페어가 한번도 등록되지 않은 토큰 페어여야 함
* parameter
  * `tokenA` : The address of the first token
  * `amountA` : The quantity of the first token that supplies the initial liquidity
  * `tokenB` : The address of the second token
  * `amountB` : The quantity of the second token that supplies the initial liquidity
  * `fee` : Sets the initial fee value for liquidity pairs

#### exchangeKlayPos

```solidity
function exchangeKlayPos(address token, uint amount, address[] memory path) public payable
```

* Method to call when token to be paid is KLAY and a POS transaction is desired
* Parameters
  * `token` : Address of the KIP7 to be recieved
  * `amount` : the minimum amount tokens that you want to receive
    * If the amount of tokens to be received is lower than this amount, the Tx will fail.
  * `path` : list of token addresses to go through for routing transactions
    * If routing transaction is not needed, submit empty list
  * `msg.value` : KLAY quantity to be paid

#### exchangeKctPos

```solidity
function exchangeKctPos(address tokenA, uint amountA, address tokenB, uint amountB, address[] memory path) public
```

* Method called when the token to be paid is KIP7 and a POS transaction is desired
* Parameters
  * `tokenA` : address of token to be paid
  * `amountA` : the amount of tokens to be paid
  * `tokenB` : address of token to be received
    * When KLAY, it is 0x0
  * `amountB` : the minimum amount of tokens that you want to receive
    * If the amount of tokens to be received is lower than this amount, the Tx will fail.
  * `path` :list of token addresses to go through for routing transactions
    * If routing transaction is not needed, submit empty list

#### exchangeKlayNeg

```solidity
function exchangeKlayNeg(address token, uint amount, address[] memory path) public payable
```

* Method for executing a NEG transaction by paying KLAY
* Parameters
  * `token` :  address of tokens to be received
  * `amount` : quantity of tokens to be received
  * `path` : list of token addresses to go through for routing transactions
    * If routing transaction is not needed, submit empty list
  * `msg.value` : maximum amount of payable KLAY
    * If more KLAY than the corresponding quantity needs to be paid, theTx will fail
    * the difference with KLAY used in the actual transaction is returned to msg.sender

#### exchangeKctNeg

```solidity
function exchangeKctNeg(address tokenA, uint amountA, address tokenB, uint amountB, address[] memory path) public
```

* Method for executing NEG transaction by paying KIP7
* Parameters
  * `tokenA` : address of token to be paid
  * `amountA` : the maximum amount of tokenA that can be paid
    * If more tokenA than the corresponding amount is needed, the Tx will fail.
  * `tokenB` : address of the token to be received
    * For KLAY:  0x0
  * `amountB` : the amount of tokens to be received
  * `path` : list of token addresses to go through for routing transactions
    * If routing transaction is not needed, submit empty list
      {% endtab %}
      {% endtabs %}


# Exchange

This is a smart contract to expand KIP7 that is created with every liquidity pair. The Factory deploys this as new pool creation is requested. Although the Factory actually stores the two tokens of a pair and swapping takes place through it, the Exchange Contract must be called for liquidity to be provided or taken.

## Code

Github Link: (Will be updated after official launch)

## Address

Contract adress after production is deployed (scope link)&#x20;

## Events, Read-Only Functions, and State-Changing Functions&#x20;

{% tabs %}
{% tab title="Events" %}

## Events

#### Transfer

```solidity
event Transfer(address indexed from, address indexed to, uint amount);
```

* KIP7 Standard
* Event log of Transfer/Mint/Burn

#### Approval

```solidity
event Approval(address indexed holder, address indexed spender, uint amount);
```

* KIP7 Standard
* Event log of Approvals

#### ChangeMiningRate

```solidity
event ChangeMiningRate(uint _mining);
```

* Event log of mining rate change&#x20;

#### ChangeFee

```solidity
event ChangeFee(uint _fee);
```

* Event log of trading fee rate changes

#### UpdateMiningIndex

```solidity
event UpdateMiningIndex(uint lastMined, uint miningIndex);
```

* Event log of pairs’ mining index changes
* `lastMined` : Factory.mined() value at the time index is updated
* `miningIndex` : pairs’ miningIndex value at the time

#### GiveReward

```solidity
event GiveReward(address user, uint amount, uint lastIndex, uint rewardSum);
```

* Event log of when mined KSP is claimed and distributed
* `user` :  address of the user who claimed
* `amount` :  the amount of KSP claimed
* `lastIndex` :  index result of the pair of the wallet after claiming&#x20;
* `rewardSum` :  The amount of KSP that has been accrued so far

#### ExchangePos

```solidity
event ExchangePos(address tokenA, uint amountA, address tokenB, uint amountB);
```

* Event log of POS transactions
* `tokenA` : Token address delivered by the user
* `amountA` :  the amount of tokens delivered by the user
* `tokenB` : token address received by user&#x20;
* `amountB` : the amount of tokens received by the user

#### ExchangeNeg

```solidity
event ExchangeNeg(address tokenA, uint amountA, address tokenB, uint amountB);
```

* Event log of NEG transactions
* `tokenA` :  token address delivered by the user
* `amountA` : the amount of tokens delivered by the user&#x20;
* `tokenB` : token address received by the user
* `amountB` : the amount of tokens received by the user

#### AddLiquidity

```solidity
event AddLiquidity(address user, address tokenA, uint amountA, address tokenB, uint amountB, uint liquidity);
```

* Event log of liquidity additions
* `liquidity` :  the amount of LP tokens minted due to additional liquidity

#### RemoveLiquidity

```solidity
event RemoveLiquidity(address user, address tokenA, uint amountA, address tokenB, uint amountB, uint liquidity);
```

* Event log of liquidity removals
* `liquidity` : the amount of LP tokens burned due to liquidity removal
  {% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### name

* KlaySwap LP

#### symbol

* "KSLP" + " " + symbolA + "-" + symbolB

#### decimals

* 18

#### totalSupply

* mint/burn depending on liquidity addition/removal

#### balanceOf

* Number of LP tokens held by each address

#### allowance

* Status of approval to spender for each address

#### factory

* The factory address where the LP smart contract is deployed

#### tokenA

* The first token address composed of the pair
* When KLAY is one part of the pair, tokenA == 0x0

#### tokenB

* The second token address composed of the pair

#### fee

* Transaction fee for the pair
* It is a value between 0 and 100, in units of 0.01%
* 1 == 0.01%, 100 == 1%

#### mining

* The mining rate of the pair
* It is a value between 0 and 100, in units of 1%
* e.g. If mining is 10, the pair has claim authority for 10% of the quantity mined per block in the factory.

#### lastMined

* Factory.mined() value at the last time the pair updated the index

#### userRewardSum

* mapping(address => uint )
* Stores the cumulatively claimed KSP quantity value for each user

#### getCurrentPool

```solidity
function getCurrentPool() public view returns (uint, uint)
```

* Returns the liquidity quantity of the two assets in the current pool

#### estimatePos

```solidity
function estimatePos(address token, uint amount) public view returns (uint)
```

* When a request is made to sell the amount of the corresponding token through a POS transaction, the expected receiving amount of the opposite token is returned.

#### estimateNeg

```solidity
function estimateNeg(address token, uint amount) public view returns (uint)
```

* When a request is made to purchase the amount of the corresponding token through a NEG transaction, the expected payment amount of the opposite token is returned.

{% endtab %}

{% tab title="State-Changing Functions" %}

## State-Changing Functions

#### transfer

```solidity
function transfer(address _to, uint _value) public returns (bool)
```

* KIP7 Standard
* Method for KSP token transfer

#### transferFrom

```solidity
function transferFrom(address _from, address _to, uint _value) public returns (bool)
```

* KIP7 Standard
* Method to transfer tokens on behalf of the approved wallet

#### approve

```solidity
function approve(address _spender, uint _value) public returns (bool)
```

* KIP7 Standard
* Method to approve transfer as much as value to the spender

#### updateMiningIndex

```solidity
function updateMiningIndex() public
```

* Method to update the value of the pair contract based on the current Factory.mined() value
* Anyone can call in real time. Even if no one calls it, it calls itself if necessary.

#### claimReward

```solidity
function claimReward() public
```

* Method that a user calls to claim the claimable KSP that has accumulated for the pair
* When called, KSP is claimed from the Factory and paid to msg.sender
* Even if the method is not called directly, it is automatically called when the LP token balance of the user’s wallet changes.
  * When liquidity is added
  * When liquidity is removed
  * When LP tokens are sent
  * When LP tokens are received

#### addKlayLiquidity

```solidity
function addKlayLiquidity(uint amount) public payable
```

* Method used to provide liquidity when tokenA is KLAY
* Liquidity of the KLAY `msg.value` and tokenB `amount` is provided.
* After liquidity is provided, the LP token corresponding to the pool share is minted in the msg.sender wallet.
* If the pair ratio is wrong, as much liquidity as possible is supplied at the current pair ratio, and the remaining tokens are returned to msg.sender.
* If there is claimable KSP when called, the claim proceeds to msg.sender.

**addKlayLiquidityWithLimit**

```solidity
function addKlayLiquidityWithLimit(uint amount, uint minAmountA, uint minAmountB) public payable
```

* Method used to provide liquidity when tokenA is KLAY
* Liquidity of the KLAY `msg.value` and tokenB `amount` is provided.
* Set the minimum amount of tokenA and tokenB to be used for liquidity supply using minAmountA, minAmountB.
* After liquidity is provided, the LP token corresponding to the pool share is minted in the msg.sender wallet.
* If the pair ratio is wrong, as much liquidity as possible is supplied at the current pair ratio, and the remaining tokens are returned to msg.sender.
* If there is claimable KSP when called, the claim proceeds to msg.sender.

#### addKctLiquidity

```solidity
function addKctLiquidity(uint amountA, uint amountB) public
```

* Method used to provide liquidity when tokenA is KIP7 standard token&#x20;
* Liquidity of the number of tokenA `amountA` and tokenB `amountB` is provided.
* After liquidity is provided, the LP token corresponding to the pool share is minted in the msg.sender wallet.
* If the pair ratio is wrong, as much liquidity as possible is supplied at the current pair ratio, and the remaining tokens are returned to msg.sender.
* If there is claimable KSP when called, the claim proceeds to msg.sender.

**addKctLiquidityWithLimit**

```solidity
function addKctLiquidityWithLimit(uint amountA, uint amountB, uint minAmountA, uint minAmountB) public
```

* Method used to provide liquidity when tokenA is KIP7 standard token&#x20;
* Liquidity of the number of tokenA `amountA` and tokenB `amountB` is provided.
* Set the minimum amount of tokenA and tokenB to be used for liquidity supply using minAmountA, minAmountB.
* After liquidity is provided, the LP token corresponding to the pool share is minted in the msg.sender wallet.
* If the pair ratio is wrong, as much liquidity as possible is supplied at the current pair ratio, and the remaining tokens are returned to msg.sender.
* If there is claimable KSP when called, the claim proceeds to msg.sender.

#### removeLiquidity

```solidity
function removeLiquidity(uint amount) public
```

* Returns the amount of LP tokens, and distributes the corresponding tokenA and tokenB to the msg.sender wallet
* The returned LP token amount is burned
* If there is claimable KSP when called, the claim proceeds to msg.sender.

**removeLiquidityWithLimit**

```solidity
function removeLiquidityWithLimit(uint amount, uint minAmountA, uint minAmountB) public
```

* Returns the amount of LP tokens, and distributes the corresponding tokenA and tokenB to the msg.sender wallet
* Set the minimum amount for the returned tokenA and tokenB amounts by using minAmountA, minAmountB.
* The returned LP token amount is burned
* If there is claimable KSP when called, the claim proceeds to msg.sender.
  {% endtab %}
  {% endtabs %}


# PoolVoting

이 컨트랙트는 최대 투표 가능한 풀 수 (10개),  풀 전체의 투표 정보, 풀 투표 순위 등  KLAYswap의 유동성 풀 투표를 관리합니다. 풀 투표자에 대한 보상으로 풀 거래 수수료의 50%를 보유한 투표 지분에 따라 분배합니다.&#x20;

## Code

Github Link: (Will be updated after official launch)

## Address

* Cypress : [0x3d546560D16846374eD17F2F852251323eA1bC6c](https://scope.klaytn.com/account/0x71B59e4bC2995B57aA03437ed645AdA7Dd5B1890?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**AddVoting**

```solidity
event AddVoting(address user, address exchange, uint amount);
```

* vKSP를 투표시 발생되는 이벤트
* amount는 정수 단위로 입력 가능&#x20;

**RemoveVoting**

```solidity
event RemoveVoting(address user, address exchange, uint amount);
```

* vKSP를 철회시 발생되는 이벤트
* amount는 투표 한도내에 정수 단위로 입력 가능

**GiveReward**

```solidity
event GiveReward(address user, address exchange, address token, uint amount, uint lastIndex, uint rewardSum);
```

* 투표자에게 거래 수수료 보상 지급 시 발생되는 이벤트

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**isValidPool**

* KSP 보상 풀 여부

**MAX\_VOTING\_POOL\_COUNT**

* 분배 가능한 유동성 풀 수

**poolAmount**

* 유동성 풀 투표

**poolCount**

* 유동성 풀 개

**poolRanking**

* 투표 풀 순위

**prevPoolAmount**

* 다음 라운드 풀 투표 수

**prevValidPool**

* 다음 라운드 상위 풀 여부

**snapShotAmount**

* 풀 투표 수 스냅샷

**snapShotValidPool**

* 상위 풀 여부 스냅샷

**totalVotingAmount**

* 전체 투표 수

**userVotingPoolAddress**

* 투표자가 투표한 풀의 주소

**userVotingPoolAmount**

* 투표자가 투표한 풀의 투표권 수량

**userVotingPoolCount**

* 투표자가 투표의 풀의 개

**validPoolCount**

* 투표 가능한 풀의 개

{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**addVoting**

```solidity
function addVoting(address exchange, uint amount) public
```

* &#x20;투표 함수
* vKSP 정수 단위 허용

**removeVoting**

```solidity
function removeVoting(address exchange, uint amount) public
```

* 풀 투표 철회 함수&#x20;
* 투표 수량 범위내의 vKSP 정수 단위 허용

**claimReward**

```solidity
function claimReward(address exchange) public 
```

* 투표 풀의 거래 수수료 보상 청 함수

**claimRewardAll**

```solidity
function claimRewardAll() public
```

* 투표 풀 전체에 대한 거래 수수료 보상 청구 함수

**removeAllVoting**

```solidity
function removeAllVoting() public
```

* 투표 풀 전체에 대한 철회 함수
  {% endtab %}
  {% endtabs %}

&#x20;


# VotingKSP

이 컨트랙트는 KSP를 스테이킹과 관련된 생태계 동작을 담당합니다. 스테이킹 수량과 기간에 따라 투표권(vKSP)을 발행하며, 스테이킹 참여자에게  1일 KSP 마이닝 수량의 40%를 분배합니다. \
(스테이킹 참여자 대상 KSP 분배율은 거버넌스 투표를 통해 변경될 수 있습니다)&#x20;

## Code

Github Link: (Will be updated after official launch)

## Address

* Cypress : [0x2F3713F388BC4b8b364a7A2d8D57c5Ff4E054830](https://scope.klaytn.com/account/0x2F3713F388BC4b8b364a7A2d8D57c5Ff4E054830?tabId=txList)

&#x20;

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**LockKSP**

```solidity
event LockKSP(address user, uint lockPeriod, uint KSPAmount, uint totalLockedKSP, uint unlockTime);
```

* KSP를 스테이킹시 발생되는 이벤트
* Parameters
  * `user` : 유저 지갑 주소
  * `lockPeriod` :&#x20;
    * 4개월 : 10,368,000
    * 8개월 : 20,736,000
    * 12개월 : 31,104,000
    * x8 : 1,555,200,000
  * `KSPAmount` : KSP 수량
  * `totalLockedKSP` : 총 스테이킹된 KSP 수량
  * `unlockTime` : 언스테이킹 가능한 시간 (timestamp)

**UnlockKSP**&#x20;

<pre class="language-solidity"><code class="lang-solidity"><strong>event UnlockKSP(address user, uint vKSPAmount, uint KSPAmount);
</strong></code></pre>

* vKSP를 언스테이킹 시 발생되는 이벤트
* Parameters
  * `user` : 유저 지갑 주소
  * `vKSPAmount` : 보유했던 vKSP 수량
  * `KSPAmount` : 언스테이킹 KSP 수량

**UnlockKSPUnlimited**

```solidity
event UnlockKSPUnlimited(address user, uint vKSPBefore, uint vKSPAfter, uint KSPAmount, uint unlockTime);
```

* vKSP x8 스테이킹을 해제할시 발생되는 이벤트
* Parameters
  * `user` : 유저 지갑 주소
  * `vKSPBefore` : 보유했던 vKSP 수량
  * `vKSPAfter` : 스테이킹 해제후 보유한 vKSP 수량
  * `KSPAmount` : 스테이킹한 KSP 수량
  * `unlockTime` : 언스테이킹 가능한 시간 (timestamp)

**RefixBoosting**

```solidity
event RefixBoosting(address user, uint lockPeriod, uint boostingAmount, uint unlockTime);
```

* 스테이킹 기간 변경 시 발생되는 이벤트
* Parameter
  * `user` : 유저 지갑 주소
  * `lockPeriod` : 변경 기간
  * `boostingAmount` : 변경 후 보유 vKSP
  * `unlockTime` : 언스테이킹 가능한 시간 (timestamp)

**ChangeMiningRate**

```solidity
event ChangeMiningRate(uint _mining);
```

* 일일 KSP 분배율 변경 시 발생되는 이벤트

**GiveReward**

```solidity
event GiveReward(address user, uint amount, uint lastIndex, uint rewardSum);
```

* KSP 보상 시 발생되는 이벤트
  {% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**balanceOf**

* 지갑별 vKSP 보유 수량

**getCurrentBalance**

* 라운드 시작시 지갑별 vKSP 보유 수량

**getUserUnlockTime**

* 언스테이킹 가능 시점(스테이킹 기간 계산 포함)

**lockedKSP**

* 스테이킹 한 KSP 수량

**mining**

* 일일 KSP 분배
* 0 \~ 10000 값, 단위 0.01%

**snapShotBalance**

* 상위 풀 여부 스냅샷

**snapShotCount**

* 스냅샷 개

**unlockTime**

* 언스테이킹 가능 시

**getPriorBalance**

```solidity
function getPriorBalance(address user, uint blockNumber) public view returns (uint) 
```

* 블록 별 과거 vKSP 보유 수량
* Parameter
  * `user` : 지갑 주소
  * `blockNumber` : 과거 blockNumber

**getSnapBalance**

```solidity
function snapShotBalance(address user, uint index) public view returns (uint) 
```

* 지갑 별 과거 vKSP 보유 수량
* Parameter
  * `user` : 지갑 주소
  * `index` : 순차 별 인덱

**snapShotBlock**

```solidity
function snapShotBlock(address user, uint index) public view returns (uint) 
```

* 지갑 스냅샷 당시 BlockNumber
* Parameter
  * `user` : 지갑 주소
  * `index` : 순차 별 BlockNumber
    {% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**lockKSP**

```solidity
function lockKSP(uint amount, uint lockPeriodRequested) public
```

* KSP 스테이킹 함수
* KSP 정수단위로 스테이킹 가능&#x20;

**unlockKSP**

```solidity
function unlockKSP() public
```

* KSP 언스테이킹 함수
* 언락 기간에만 언스테이킹 가능하다

**unlockKSPUnlimited**

```solidity
function unlockKSPUnlimited() public
```

* KSP x8 스테이킹을 해제하는 함수
* 해제 시점부터 x4 스테이킹으로 변경

**refixBoosting**

```solidity
function refixBoosting(uint lockPeriodRequested)
```

* KSP 스테이킹 기간 변경 함수

**claimReward**

```solidity
function claimReward() public
```

* KSP 보상 수령 함수

**compoundReward**

```solidity
function compoundReward() public
```

* KSP 보상 스테이킹 함수&#x20;
* 보상이 1 KSP 이상일때 호출 가능
* 정수 단위로 스테이킹 가능하며 나머지는 지갑 주소로 전
  {% endtab %}
  {% endtabs %}


# Treasury

Treasury Contract는 에어드랍 실행을 주관하는 컨트랙트입니다. 권한을 가진 Operator는 Treasury Contract를 통하여 에어드랍을 설정하고 집행할 수 있습니다.&#x20;

## Code

Github Link: (Will be updated after official launch)

## Address

* Cypress : 0x29990aaF04f3D5Ac7d8C88beab1A009C1Ab4936e

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**ChangeCreationFee**&#x20;

```solidity
event ChangeCreationFee(uint fee);
```

* 생성 수수료(KSP) 변경 시 발생되는 이벤트

**SetOperator**

```solidity
event SetOperator(address operator, bool valid);
```

* Operator 설정 시 발생되는 이벤트

**CreateDistribution**

```solidity
event CreateDistribution(address operator, address token, uint totalAmount, uint blockAmount, uint blockNumber, address[] targets, uint[] rates);
```

* 에어드랍 설정 시 발생되는 이벤트
* Parameters

**RemoveDistribution**

```solidity
event RemoveDistribution(address operator, address token);
```

* 에어드랍 해제 시 발생되는 이벤트

**Deposit**

```solidity
event Deposit(address operator, address token, uint amount);
```

* Deposit 이벤트

**RefixBlockAmount**

```solidity
event RefixBlockAmount(address operator, address token, uint blockAmount);
```

* RefixBLockAmount 이벤트

**RefixDistributionRate**

```solidity
event RefixDistributionRate(address operator, address token, address[] targets, uint[] rates);
```

* RefixDistributionRate 이벤트

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**distributionCount**&#x20;

* 에어드랍 계획 개수&#x20;

**distributionEntries**

* mapping(address => mapping(uint => address))
* LP 별 distribution 주소

**distributionOperator**

* mapping (address => address)
* Distribution 별 Operator 주소

**fee**

* Distribution 생성 수수료

**owner**

* 현재 소유자
  {% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**changeCreationFee**

```solidity
function changeCreationFee(uint _fee) public 
```

* Distribution 생성 수수료 변경 함수
* only Owner&#x20;

**claim**

```solidity
function claim(address target) public
```

* 유동성 풀 에어드랍 수령 함수
* Parameters
  * `target` : 유동성 풀 주소

**createKlayDistribution**

```solidity
function createKlayDistribution(uint blockAmount, uint blockNumber, address[] memory targets, uint[] memory rates) public payable
```

* KLAY Distribution 생성 함수
* only Operator

**createTokenDistribution**

```solidity
function createTokenDistribution(address token, uint amount, uint blockAmount, uint blockNumber, address[] memory targets, uint[] memory rates) public
```

* Distribution 생성 함수
* only Operator

**depositKlay**

```solidity
function depositKlay() public payable
```

* KLAY 예치 함수
* only Operator

**depositToken**

```solidity
function depositToken(address token, uint amount) public
```

* KIP7 기반 토큰 예치 함수
* only Operator

**refixBlockAmount**

```solidity
function refixBlockAmount(address token, uint blockAmount) public
```

* Block 당 지급 수량 변경 함수
* only Operator

**refixDistributionRate**

```solidity
function refixDistributionRate(address token, address[] memory targets, uint[] memory rates) public
```

* Block 당 지급율 변경 함수
* only Operator

**removeDistribution**

```solidity
function removeDistribution(address operator, address token) public
```

* Distribution 제거 함수
* Distribution.removeDistribution() 함수 호출
* only Operator

{% endtab %}
{% endtabs %}


# Distribution

풀에 적용된 Airdrop 계획 컨트랙트입니다. 한 개의 유동성 풀과 한 개의 토큰을 타겟으로 할 수 있습니다. \
해당 컨트랙트는 권한이 있는 Operator가  Treasury 를 통해 계약을 집행하게 됩니다.&#x20;

## Code

Github Link: (Will be updated after official launch)

## Address

* Contract adress after production is deployed (scope link)&#x20;

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**Initialized**

```solidity
event Initialized(address token, uint amountPerBlock, uint distributableBlock, address[] targets, uint[] rates);
```

* 에어드랍 계획 수립 이벤트
* Parameters
  * `token` : KIP7 기반 토큰&#x20;
  * `amountPerBlock` : Block 당 분배할 토큰 수량
  * `distributableBlock` : 분배 시작할 Block Number
  * `targets` : 분배할 유동성 풀 주소 배열
  * `rates` : 유동성 풀 분배율 배열

**Deposit**

```solidity
event Deposit(uint amount, uint totalAmount);
```

* 토큰 예치 이벤트
* Parameters
  * `amount` : 예치 토큰 수량
  * `totalAmount` : 총 예치 토큰 수

**RefixBlockAmount**

```solidity
event RefixBlockAmount(uint amountPerBlock);
```

* 분배 수량 변경 이벤트

**RefixDistributionRate**

```solidity
event RefixDistributionRate(address[] targets, uint[] rates);
```

* 유동성 풀 별 분배율 설정 이벤트

**ChangeDistributionRate**

```solidity
event ChangeDistributionRate(address target, uint rate);
```

* 유동성 풀 분배율 설정 이벤트

**Distribute**

```solidity
event Distribute(address user, address target, uint amount, uint currentIndex, uint userRewardSum);
```

* 에어드랍 분배 이벤트
* Parameters
  * user : 참여자 수령 지갑 주소
  * target : 유동성 풀 주소
  * amount : 분배된 토큰 수량
  * currentIndex : 분배된 시점
  * userRewardSum : 참여자 총 수령 토큰 수량

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**blockAmount**

* 블럭 당 분배할 토큰 수량

**distributableBlock**

* 분배 시작될 Block Number

**distributedAmount**

* 분배량, 분배율이 수정되었을 경우, 마지막 분배된 총 토큰 수량

**distribution**

* 분배된 총 토큰 수량

**distributionRate**

* 유동성 풀 별 에어드랍 분배율

**estimateEndBlock**

* 에어드랍 종료 예정 Block Number

**operator**

* Operator 주소

**targetCount**

* 에어드랍 타겟 유동성 풀 개수&#x20;

**targetEntries**

* mapping(uint => address)
* 에어드랍 타겟 유동성 풀 주소

**token**

* KIP7 기반 분배 토큰 주소&#x20;

**totalAmount**

* 총 에어드랍  토큰 수량

**userRewardSum**

```
function userRewardSum(address target, address user) public view returns (uint) 
```

* 참여자 총 에어드랍 지급 토큰 &#x20;
* Parameter
  * `target` : 타겟 유동성 풀 주소
  * `user` : 참여자 지갑 주소
    {% endtab %}
    {% endtabs %}


# Governor

이 컨트랙트는 클레이스왑의 투표 등록, 투표 집계, 집행을 관리하는 관리자 기능을 합니다. 또한 클레이스왑의 중요 파라미터들과 제안 등록, 투표 집행을 수행합니다.&#x20;

## Address

* Cypress : [0x05343b228d61402e84d973ce114f34bc3f9e5987](https://scope.klaytn.com/account/0x05343b228d61402e84d973ce114f34bc3f9e5987?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**ProposalCreated**

```solidity
event ProposalCreated(uint id, address proposer, address target, string signature, bytes callData, uint startBlock, uint endBlock, string description);
```

* 제안 생성시 발생하는 이벤트
* Parameters
  * id : 제안 ID
  * proposer : 제안자 지갑 주소
  * target : 실행 컨트랙트 주소
  * signature : 실행할 함수 식별 정보
  * callData : 실행할 함수 내용
  * startBlock : 시작 블럭 번호
  * endBlock : 종료 블럭 번호
  * description : 제안 상세 내용

**VoteCast**

```solidity
event VoteCast(address voter, uint proposalId, bool support, uint votes, uint againstVotes, uint forVotes, uint quorumVotes, string reason);
```

* 투표시 발생하는 이벤트
* Parameters
  * voter : 투표자 지갑 주소
  * proposalId : 제안 ID
  * support : 찬반
  * votes : 투표 수량
  * againstVotes :  총 반대 투표 수량
  * forVotes : 총 찬성 투표 수량
  * quorumVotes : 의사정족수
  * reason : 투표 사유

**ProposalCanceled**

```solidity
event ProposalCanceled(uint id);
```

* 투표 취소시 발생하는 이벤트

**ProposalQueued**

```solidity
event ProposalQueued(uint id, uint eta, uint tid);
```

* 제안이 대기열에 들어갔을때 발생하는 이벤트

**ProposalExecuted**

```solidity
event ProposalExecuted(uint id, bool succeeded);
```

* 제안이 실행됐을때 발생하는 이벤트

**ProposalFeeSet**

```solidity
event ProposalFeeSet(uint oldProposalFee, uint proposalFee);
```

* 제안등록비용 변경시 발생되는 이벤트

{% endtab %}

{% tab title="State-Changing Functions" %}

## State-Changing Functions

#### propose

```solidity
function propose(address target, string memory signature, bytes memory callData, string memory description) public returns (uint)
```

* 새 안건을 생성하는 함수
* 최소 스테이킹 수량을 넘은 지갑만 안건   생성가능
* `target` : 안건이 실행할 컨트랙트 주소
* `signature` : 실행할 안건함수의 signautre
* `callData` : 실행할 안건의 callData
* `description` : 안건에 대한 설명

#### castVote

```solidity
function castVote(uint proposalId, bool support) external 
```

* 투표를 실행하는 함수
* `proposalId` : 투표를 실행할 안건의 id
* `support` : 찬반 여부 (찬성 = true, 반대 = false)
  {% endtab %}
  {% endtabs %}


# SinglePool

이 컨트랙트는 단일풀 컨트랙트로써 유동성 제공자는 자산을 예치/출금하고 플러스풀 사용자는 활용자산을 단일풀에서 가져오거나 반환하게 됩니다. &#x20;

## Address

* Contract adress after production is deployed (scope link)&#x20;

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**GiveReward**

```solidity
event GiveReward(address user, uint amount, uint lastIndex, uint rewardSum);
```

* KSP 보상 지급시 발생하는 이벤트&#x20;

**Deposit**

```solidity
event Deposit(address user, uint depositAmount, uint depositTokens, uint totalAmount, uint totalSupply);
```

* 단일풀 예치시 발생하는 이벤트
* Parameters
  * user : 예치한 지갑 주소
  * depositAmount : 예치한 Token 수량
  * depositTokens : 생성된 SP Token 수량
  * totalAmount : 풀에 예치된 총 Token 수량
  * totalSupply : 풀에 생성된 총 SP Token 수량

**Withdraw**

```solidity
event Withdraw(address user, uint withdrawAmount, uint withdrawTokens, uint totalAmount, uint totalSupply);
```

* 단일풀 출금시 발생하는 이벤트
* Parameters
  * user : 사용자 주소&#x20;
  * withdrawAmount : 출금한 Token 수량
  * withdrawTokens : 출금한 SP Token 수량
  * totalAmount : 풀에 예치된 총 Token 수량
  * totalSupply : 풀에 생성된 총 SP Token 수량

**Borrow**

```solidity
event Borrow(address user, address plusPoolAddress, uint borrowAmount, uint accountBorrows, uint totalBorrows);
```

* 플러스 예치시 활용자산 이용시 발생하는 이벤트
* Parameters
  * user : 사용자 주소&#x20;
  * plusPoolAddress : 플러스풀 주소&#x20;
  * borrowAmount : 활용자산으로 사용된 token 수량
  * accountBorrows : 사용자 총 활용자산 수량
  * totalBorrows : 단일풀 총 활용자산 수량   &#x20;

**Repay**

```solidity
event Repay(address user, address plusPoolAddress, uint repayAmount, uint accountBorrows, uint totalBorrows);
```

* 활용자산 반환시 발생하는 이벤트
* Parameters
  * user : 사용자 주소&#x20;
  * plusPoolAddress : 플러스풀 주소&#x20;
  * repayAmount : 반환된 활용자산 token 수량
  * accountBorrows : 사용자 총 활용자산 수량
  * totalBorrows : 단일풀 총 활용자산 수량
    {% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### name

* "I" + token name

#### symbol

* "i" + token symbol

**decimals**

* 18

**token**

* KIP7 기반 token address&#x20;

#### totalSupply

* 유동성 추가 제거에 따른 총 유동성 Token 수량

#### balanceOf

* 각 지갑 주소가 보유한 유동성 Token 수량

#### allowance

* 각 지갑 주소의 allowance 상태

#### getCash

* 예치된 Token 수량

#### reserveFactor

* 활용수수료 중 KSP 바이백 & 소각 배정 비율&#x20;
* 1 \~ 10^18, 단위 0.000000000000000001
* 기본 - 200000000000000000

#### totalBorrow

* 총 활용자산 수량

#### mining

* 단일풀에 분배되는 KSP 중 해당 풀이 채굴하는 비율
* 1 \~ 10000, 단위 0.0001

#### lastMined

* 마지막으로 수정된 SinglePoolFactory.mined() 값

#### withdrawActive

```solidity
function withdrawActive() public view returns (bool)
```

* 단일풀 출금 가능 여부

#### depositActive

```solidity
function depostiActive() public view returns (bool)
```

* 단일풀 예치 가능 여부&#x20;

####

{% endtab %}

{% tab title="State-Changing Functions" %}

## State-Changing Functions

#### transfer

```solidity
function transfer(address _to, uint _value) public returns (bool)
```

* KIP7 Standard
* 토큰 전송 함수&#x20;

#### transferFrom

```solidity
function transferFrom(address _from, address _to, uint _value) public returns (bool)
```

* KIP7 Standard
* 승인받은 지갑 토큰 전송 함수

#### approve

```solidity
function approve(address _spender, uint _value) public returns (bool)
```

* KIP7 Standard
* 전송 승인 요청 함수

#### depositKlay

```solidity
function depositKlay() public payable
```

* KLAY 단일풀 예치 함수
* `msg.value` 값 사용

#### depositKct

```solidity
function depositKct(uint depositAmount) public
```

* KIP7 기반 단일풀 예치입금 함수
* `depositAmount` : 토큰 수량

#### withdraw

```solidity
function withdraw(uint withdrawAmount)
```

* 단일풀 출금 함수
* withdrawAmount : 출금할 토큰 수량

#### withdrawByAmount

```solidity
function withdrawByAmount(uint withdrawTokens)
```

* 단일풀 유동성 토큰 출금 함수
* withdrawTokens : 출금할 단일풀 유동성 토큰(iToken) 수량

#### addReserves

```solidity
function addReserves(uint addAmount) external payable
```

* Buyback 대기금 충전 함수
* addAmount : 토큰 수량

#### claimReward

```solidity
function claimReward() public
```

* 보상 청구 함수
* 호출시 누적된 KSP 보상이 존재할 경우 함께 사용자 지갑으로 전송
* 사용자가 직접 호출하지 않는 경우에도 아래와 같은 경우에 자동으로 호출
  * 예치할 경우
  * 출금할 경우

####

{% endtab %}
{% endtabs %}


# SinglePool Factory

이 컨트랙트는 단일풀 생성/관리 컨트랙트로써 유동성 제공자는 자산을 예치/출금하고 플러스풀 사용자는 활용자산을 단일풀에서 가져오거나 반환하게 됩니다. &#x20;

## Address

* Cypress : [0xd1890d8f02f4c63553658ba49c53a82eb84009e6](https://scope.klaytn.com/account/0xd1890d8f02f4c63553658ba49c53a82eb84009e6?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**CreatePool**

```solidity
event CreatePool(address token, address pool, uint exid);
```

* SinglePool 생성시 발생하는 이벤트&#x20;
* Parameters
  * token : KLAY, KIP7 토큰 주소
  * pool : 생성된 SinglePool 주소
  * exid : SinglePool ID&#x20;

**SetDepositActive**

```solidity
event SetDepositActive(address poolAddress, bool b);
```

* SinglePool 예치 가능여부 변경시 발생되는 이벤트

**SetWithdrawActive**

```solidity
event SetWithdrawActive(address poolAddress, bool b);
```

* SinglePool 출금 가능여부 변경시 발생되는 이벤트

**ChangeMiningRate**

```solidity
event ChangeMiningRate(uint _mining);
```

* SinglePool 채굴비율 변경시 발생되는 이벤트

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### mining&#x20;

* KSP 채굴 비율&#x20;
* 1 \~ 10000, 단위 0.0001
* 기본 - 500 ( 총 KSP 채굴량의 5%  )&#x20;

#### getPoolCount

* Single Pool 개수

**getPoolAddressByIndex**

```solidity
function getPoolAddressByIndex(uint idx) public view returns (address)
```

* Single Pool 주소 조회

#### borrowBalanceStored

```solidity
function borrowBalanceStored(address token, address user, address poolAddress) public view returns (uint) 
```

* 활용자산 수량
* Parameters
  * token : 토큰 주소
  * user : 조회 지갑 주소&#x20;
  * poolAddress : 대출을 수행한 풀의 주소
    {% endtab %}
    {% endtabs %}


# PlusPool

이 컨트랙트는 KLAYswap의 플러스 풀 유동성 제공자의 활용 자산을 관리합니다. 유동성 제공자는 예치자산에 따라 플러스 예치를 사용하여 플러스자산(예치자산+활용자산)으로 수익을 극대화할 수 있습니다. 그러나 높은 자산활용 비율은 자동 반환을 일으켜 손실을 볼 수 있습니다.          &#x20;

## Address

* Contract adress after production is deployed (scope link)&#x20;

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**ChangeBorrowFactor**

```solidity
event ChangeBorrowFactor(uint newBorrowFactor);
```

* LTV 변경시 발생하는 이벤트

**ChangeLiquidationFactor**

```solidity
event ChangeLiquidationFactor(uint newLiquidationFactor);
```

* 임계 자동반환 비율 변경시 발생하는 이벤트

**ChangeBorrowable**

```solidity
event ChangeBorrowable(address token, bool b);
```

* 활용가능여부 변경시 발생하는 이벤트

**GiveReward**

```solidity
event GiveReward(address user, uint amount, uint lastIndex, uint rewardSum);
```

* KSP 보상 지급시 발생하는 이벤트&#x20;

**GiveAirdropReward**

```solidity
event GiveAirdropReward(address user, address dist, uint amount, uint currentIndex, uint userAirdropSum);
```

* Airdrop 보상 지급시 발생하는 이벤트

**OpenPosition**

```solidity
event OpenPosition(address user, uint amountA, uint amountB, uint borrowA, uint borrowB, uint amountLP, uint userLP);
```

* 플러스 예치시 발생하는 이벤트
* Parameters
  * user : 사용자 주소&#x20;
  * amountA : tokenA 의 담보 수량
  * amountB : tokenB 의 담보 수량
  * borrowA : tokenA 의 활용 수량
  * borrowB: tokenB 의 활용 수량&#x20;
  * amountLP: 예치 LP 수량
  * userLP : 유저 총 예치 LP 수량&#x20;

**ClosePosition**

```solidity
event ClosePosition(address user, uint amountLP, uint amountA, uint amountB, uint userLP);
```

* 플러스 예치 출금시 발생하는 이벤트
* Parameters
  * user : 사용자 주소&#x20;
  * amountLP : 출금 LP 수량&#x20;
  * amountA : 출금된 tokenA 수량
  * amountB : 출금된 tokenB 수량
  * userLP : 유저 총 예치 LP 수량&#x20;

**Liquidate**

```solidity
event Liquidate(address user, uint idx, uint debtA, uint debtB, uint lp, uint debtRatio, uint time);
```

* 자동 반환시 발생하는 이벤트
* Parameters
  * user : 사용자 주소&#x20;
  * idx : 사용자 누적 자동 반환 횟수 &#x20;
  * deptA : 자동 반환된 tokenA 수량
  * deptB : 자동 반환된 tokenB 수량
  * lp : 유저 예치 LP 수량&#x20;
  * debtRatio : 자동 반환시 자산 활용 비율
  * time : 자동 반환 발생시간   &#x20;

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### totalLP

* 플러스 자산으로 예치중인 총 LP 수량

**lpToken**

* 활용 자산을 사용해 획득할 수 있는 유동성풀 LP 주소

#### tokenA

* 유동성 풀의 첫번째 토큰의 주소

#### tokenB

* 유동성 풀의 두번째 토큰의 주소

#### borrowableA

* tokenA 활용 가능 여부

#### borrowableB

* tokenB 활용 가능 여부

#### liquidationFactor

* 자동 반환 기준 지표&#x20;
* 1 \~ 10^18, 단위 0.000000000000000001
* 기본 - 850000000000000000

#### borrowFactor

* 활용 자산의 활용 비용 이율&#x20;
* 1 \~ 10^18, 단위 0.000000000000000001
* 기본 - 750000000000000000

#### userLP

* 플러스 자산으로 예치중인 LP 수량

#### liquidationBonusRate

* KSP 바이백 & 소각으로 사용될 재원 비율

#### liquidationCount

```
function liquidationCount(address user) public view returns (uint)
```

* 사용자의 누적 자동 반환 횟수를 반환

{% endtab %}

{% tab title="State-Changing Functions" %}

## State-Changing Functions

#### claimReward

```solidity
function claimReward() public
```

* 보상 청구 함수
* 호출시 누적된 KSP 보상이 지급되며 Airdrop 보상이 존재할 경우 함께 사용자 지갑으로 전송
* 사용자가 직접 호출하지 않는 경우에도 아래와 같은 경우에 자동으로 호출
  * 플러스 예치를 추가로 할 경우
  * 예치된 자산을 출금할 경우

#### openPosition

```solidity
function openPosition(uint amountA, uint amountB, uint borrowA, uint borrowB, uint minAmountLP) public payable
```

* 플러스 자산 예치 함수
* tokenA가 KLAY 일 경우 `amountA` 를 `msg.value` 값을 사용
* 실행이 완료된 후 사용자의 지갑으로 LP token 생성
* Parameter
  * amountA : 예치할 사용자의 tokenA 수량
  * amountB : 예치할 사용자의 tokenB 수량&#x20;
  * borrowA : 활용 자산으로 사용할 tokenA 수량
  * borrowB : 활용 자산으로 사용할 tokenB 수량&#x20;
  * minAmountLP : 슬리피지 존재시 최소 보장 LP 수량

#### closePosition

```solidity
function closePosition(uint amountLP, uint minAmountA, uint minAmountB) public
```

* 플러스 자산 출금 함수
* 실행이 완료된 후 사용자의 지갑으로 tokenA, tokenB 전송
* Parameters
  * amountLP : 출금할 사용자의 LP 수량
  * minAmountA : 슬리피지 존재시 최소 보장 tokenA 수량&#x20;
  * minAmountB : 슬리피지 존재시 최소 보장 tokenB 수량

{% endtab %}
{% endtabs %}


# PlusPool Factory

이 컨트랙트는 PlusPool을 생성하고 각 PlusPool 의 상태를 관리하는 컨트랙트입니다. &#x20;

## Address

* Cypress : [0x01431f2a0d8c25646d1995e9ad345581d523341d](https://scope.klaytn.com/account/0x01431f2a0d8c25646d1995e9ad345581d523341d?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**CreatePool**

```solidity
event CreatePool(address tokenA, address tokenB, address lpToken, uint borrowFactor, uint liquidationFactor, bool borrowableA, bool borrowableB, address poolAddress, uint exid);
```

* PlusPool 생성 시 발생하는 이벤트&#x20;
* Parameters
  * tokenA : LP의 tokenA 주소
  * tokenB : LP의 tokenB 주소
  * lpToken : LP 주소
  * borrowFactor : 활용 자산 이자율
  * liquidationFactor : 자동반환 기준비율
  * borrowableA : tokenA 활용 가능 여부
  * borrowableB : tokenB 활용 가능 여부
  * poolAddress : 생성된 PlusPool 주소
  * exid : PlusPool ID&#x20;

**SetDepositActive**

```solidity
event SetDepositActive(address plusPoolAddress, bool b);
```

* PlusPool 예치 가능여부 변경시 발생되는 이벤트

**SetWithdrawActive**

```solidity
event SetWithdrawActive(address plusPoolAddress, bool b);
```

* PlusPool 출금 가능여부 변경시 발생되는 이벤트

{% endtab %}

{% tab title="Read-Only Functions" %}

#### getPoolCount

* Plus Pool 개수

**getPoolAddressByIndex**

```solidity
function getPoolAddressByIndex(uint idx) public view returns (address) 
```

* Plus Pool 주소 조회
  {% endtab %}
  {% endtabs %}


# Store

이 컨트랙트는 LP가 보유한 Token의 수량과 시간 가중치가 반영된 가격 정보를 갖고 있습니다. 보유한  priceACumulativeLast, priceBCumulativeLast는 TWCP(Time-Weighted Cumulative Price) 으로써 \
시간 가중치가 반영된 가격 정보입니다. 이 컨트랙트의 수량과 가격 정보는 Price Oracle 에 쓰이게 됩니다.&#x20;

## Address

* Cypress : [0x1289550d988177575154c2CA45c95CCfb32F837d](https://scope.klaytn.com/account/0x1289550d988177575154c2CA45c95CCfb32F837d?tabId=txList)

## Read-Only Functions

{% tabs %}
{% tab title="Events" %}

## Events

**Sync**

```solidity
event Sync(address pool, uint112 reserveA, uint112 reserveB);
```

* 풀 자산이 업데이트 할때 발생되는 이벤트
* Parameters
  * pool :  유동성 풀 주소
  * reserveA : TokenA 수량
  * reserveB : TokenB 수량
    {% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

reserveA

```solidity
function reserveA(address pool) public view returns (uint112 _reserveA)
```

* LP가 보유한 TokenA의 수량

reserveB

```solidity
function reserveB(address pool) public view returns (uint112 _reserveB)
```

* LP가 보유한 TokenB의 수량

priceACumulativeLast

```solidity
function priceACumulativeLast(address pool) public view returns (uint112 _priceA)
```

* LP가 보유한 TokenA의 TWCP

priceBCumulativeLast

```solidity
function priceBCumulativeLast(address pool) public view returns (uint112 _priceB)
```

* LP가 보유한 TokenB 의 TWCP

getReserves

```solidity
function getReserves(address pool) public view returns (uint112 _reserveA, uint112 _reserveB, uint32 _blockTimestampLast)
```

* LP가 보유한 수량과 TWCP 정보&#x20;
* Parameter
  * `_reserveA` : LP가 보유한  tokenA의 수량
  * `_reserveB` : LP가 보유한  tokenB의 수량
  * `_blockTimestampLast` : LP가 마지막으로 계산된 BlockTime
    {% endtab %}
    {% endtabs %}


# Utils

이 컨트랙트는 KLAYswap 서비스의 자산 상세 정보와 교환추정치를 확인해 볼 수 있습니다       &#x20;

## Address

* Cypress : [0x7A74B3be679E194E1D6A0C29A343ef8D2a5AC876](https://scope.klaytn.com/account/0x7A74B3be679E194E1D6A0C29A343ef8D2a5AC876?tabId=contractCode)

{% tabs %}
{% tab title="Read-Only Functions" %}

## Read-Only Functions

**getPoolData**

```solidity
function getPoolData(address lp) public view returns (
        uint miningRate,
        uint rateDecimals,
        address tokenA,
        uint reserveA,
        address tokenB,
        uint reserveB,
        uint airdropCount,
        address[] memory airdropTokens,
        uint[] memory airdropSettings 
)
```

* LP가 보유한 TokenA의 수량
* 네트워크의 블럭이 startBlock 과 endBlock 사이에만 Airdrop 진행     &#x20;
* Parameters
  * `miningRate` : KSP 분배비율 분자값
  * `rateDecimals` : KSP 분배비율 분모값
    * 예) 하루 KSP 분배비율
      * miningRate - 130323276365080043, rateDecimals - 10000000000000000
      * 130323276365080043 / 10000000000000000 = 13.0323276365080043
  * `tokenA` : LP의 tokenA
  * `reserveA` : LP가 보유한 tokenA 수량
  * `tokenB` : LP의 tokenB
  * `reserveB` : LP가 보유한 tokenB 수량
  * `airdropCount` : LP에서 진행중인 airdrop 계획의 개수
  * `airdropTokens` : Airdrop 토큰 주소 배열
  * `airdropSettings` : Airdrop 정보 배열
    * \[0]: blockAmount, \[1]: startBlock, \[2]: endBlock
* `airdropSettings` 데이터 형식
  * 예) TokenA, TokenB 2개 Airdrop 진행 &#x20;
    * airdropTokens = \[ TokenA address, TokenB address]
    * airdropSettings = \[ TokenA blockAmount, TokenA startBlock, TokenA endBlock, TokenB blockAmount, TokenB startBlock, TokenB endBlock ]

**getPendingReward**

```solidity
function getPendingReward(address lp, address user) public view returns ( 
    uint kspReward, 
    uint airdropCount, 
    address[] memory airdropTokens, 
    uint[] memory airdropRewards 
)
```

* User의 수령 가능한 보상 정보
* Parameters
  * `kspReward` : 수령가능한 KSP 수량
  * `airdropCount` : LP에서 진행중인 airdrop 계획의 개수
  * `airdropTokens` : Airdrop 토큰 주소 배열
  * `airdropRewards` : 수령가능한 Airdrop 수량 정보 배열
* `airdrop` 데이터 형식
  * 예) TokenA, TokenB 2개 Airdrop 진행 &#x20;
    * airdropTokens = \[ TokenA address, TokenB address]
    * airdropSettings = \[ TokenA reward, TokenB reward ]

**estimateSwap**

```solidity
function estimateSwap(
    address tokenIn, 
    address tokenOut, 
    uint amountIn, 
    address[] memory path
) public view returns (uint amountOut)
```

* KLAYswap 교환추정치 조회 함수
* Input Parameters
  * `tokenIn` : 교환할 Token 주소
  * `tokenOut` : 수령할 Token 주소
  * `amountIn` : 교환할 Token 수량
  * `path` : 교환 경로
* 교환 조회&#x20;
  * KLAY -> KSP 예)
    * tokenIn = KLAY token address
    * tokenOut = KSP token address
    * amountIn = 1e18 ( = 1 KLAY )
    * path = \[]
  * KLAY -> ORC -> KSP 예)
    * tokenIn = KLAY token address
    * tokenOut = KSP token address
    * amountIn = 1e18 ( = 1 KLAY )
    * path = \["{ORC token Address}"]
      {% endtab %}
      {% endtabs %}


# Single/Plus Utils

이 컨트랙트는 KLAYswap 서비스의 Single / Plus Pool 관련 수령 가능한 보상 정보를 확인해 볼 수 있습니다.

## Address

* Cypress : [0x3C9736fFd8752342eC64328C498eD6878A797887](https://scope.klaytn.com/account/0x3C9736fFd8752342eC64328C498eD6878A797887?tabId=internalTx)

{% tabs %}
{% tab title="Read-Only Functions" %}

## Read-Only Functions

**getPendingSingleReward**

```solidity
function getPendingSingleReward(address pool, address user) public view returns (
    uint reward
) 
```

* 특정 단일 예치 Pool 에서 User가 수령 가능한 KSP 보상 정보
* Input Parameters
  * `pool` : Single Pool 주소
  * `user` : User 주소
* Outputs
  * `reward` : 수령 가능한 KSP 수량

**getPendingPlusReward**

```solidity
function getPendingPlusReward(address pool, address user) public view returns (
    uint reward
) 
```

* 특정 플러스 예치 Pool 에서 User가 수령 가능한 KSP 보상 정보
* Input Parameters
  * `pool` : Plus Pool 주소
  * `user` : User 주소
* Outputs
  * `reward` : 수령 가능한 KSP 수량

**getSinglePoolBalance**

```solidity
function getSinglePoolBalance(address pool, address user) public view returns (
    uint ibal, uint bal
)
```

* 특정 단일 예치 Pool 의  User의 자산 갯수 조회
* Input Parameters
  * `pool` : Single Pool 주소
  * `user` : User 주소
* Outputs
  * `ibal` : 유저가 예치하고 있는 iToken 갯수
  * `bal` : 유저가 예치한 iToken 에 해당하는 token 갯수

**getPlusPoolStatus**

```solidity
function getPlusPoolStatus(address pool, address user) public view returns (
    uint lp, uint debtA, uint debtB
)

```

* 특정 플러스 예치 Pool 에서 User의 현재 상태
* Input Parameters
  * `pool` : Plus Pool 주소
  * `user` : User 주소
* Outputs
  * `lp` : User가 플러스 예치하고 있는 LP 갯수
  * `debtA`  : User가 대출하고 있는 tokenA의 갯수
  * `debtB`  : User가 대출하고 있는 tokenB의 갯수
    {% endtab %}
    {% endtabs %}


# Helper

해당 컨트랙트는 두 개의 토큰을 가져오지 않더라도, 하나의 토큰으로 풀에 예치할 수 도록 도와주는 기능을 제공하는 컨트랙트 입니다.

## Code

Github Link: (Will be updated after official launch)

## Address

* Cypress : [0x0363053524610888Fb883A5C0b16Fb55aA4701Cf](https://scope.klaytn.com/account/0x0363053524610888Fb883A5C0b16Fb55aA4701Cf?tabId=contractCode)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Read-Only Functions" %}

## State-Changing Functions

**estimateLP**

```solidity
function estimateLP(address lp, address token, uint amount, uint swap, bool validPool) public view returns (uint estLP, uint realInput, uint estTarget)
```

* Method to estimate the expected amounts, depositing with single token.
* Parameters
  * `lp` : Address of LP token
  * `token` : Token address to be deposited
  * `amount` : Amount of token not to be swapped
  * `swap` : Amount of token to swap
  * `validPool` : Whether it is a pool with KSP rewards
* Returns
  * `estLP` : Expected number of LP token to be minted
  * `realInput` : Actual number of input amount
  * `estTarget` :  Amount of tokens to be receivedthrough swap

**estimateSwapAmount**

```solidity
function estimateSwapAmount(address lp, address token, uint amount) public view returns (uint maxLP, uint maxSwap, uint targetAmount)
```

* Method to change the mining weight per liquidity pair
* Parameters
  * `lp` : Address of LP
  * `token` : Token address to be deposited
  * `amount` : Amount of token to be deposited
* Returns
  * `maxLP` :  Expected number of LP token to be minted
  * `maxSwap` : Expected amount of token to swap
  * `targetAmount` :  Amount of tokens to be received through swap
    {% endtab %}

{% tab title="State-Changing Functions" %}

## State-Changing Functions

####

**addLiquidityWithKlay**

```solidity
function addLiquidityWithKlay(address lp, uint limit, uint inputForLiquidity, uint targetForLiquidity) public payable
```

* Method to add liquidity only providing KLAY.
* Parameters
  * `lp` : address of LP token
  * `limit` : Minimum amounts of LP tokens to be minted.
  * `inputForLiquidity` : Expected amount of KLAY to provide LP
    * 1% slippage allowed
  * `targetForLiquidity` : Expected amount of target token to provide LP
    * 1% slippage allowed
  * `msg.value` : KLAY amount of token to be provided.

**addLiquidityWithKCT**

```solidity
function addLiquidityWithKCT(address lp, address token, uint amount, uint limit, uint inputForLiquidity, uint targetForLiquidity) public
```

* Method to add liquidity only providing single token.
* Parameters
  * `lp` : address of LP token
  * `token` : Token address to be deposited
  * `amount` : Amount of token to be deposited
  * `limit` : Minimum amounts of LP tokens to be minted.
  * `inputForLiquidity` : Expected amount of input token to provide LP
    * 1% slippage allowed
  * `targetForLiquidity` : Expected amount of target token to provide LP
    * 1% slippage allowed
      {% endtab %}
      {% endtabs %}


# EcoPotVoting

이 컨트랙트는 EcoPot 프로젝트 생성 및 상태 관리, EcoPot 프로젝트 투표권 행사를 주관하는 컨트랙트입니다. KSP 스테이킹 유저는 원하는 EcoPot 프로젝트에 투표하여 지분율에 따라 Token을 분배받게 됩니다.&#x20;

## Address

* Cypress : [0x2ce59e21364DcA92c90970AD15442146D638997f](https://scope.klaytn.com/account/0x2ce59e21364DcA92c90970AD15442146D638997f?tabId=txList)

{% tabs %}
{% tab title="Event" %}
**CreateEcoPot**

```solidity
event CreateEcoPot(address operator, address ecoPot, address token, string name);
```

* EcoPot 생성시 발생하는 이벤트&#x20;
* Parameters
  * `operator` : EcoPotOperator 주소
  * `ecoPot` : 생성된 EcoPot 주소
  * `token` : 분배될 token 주소 &#x20;
  * `name` : EcoPot Project 이름

**RemoveEcoPot**

```solidity
event RemoveEcoPot(address ecoPot);
```

* EcoPot 종료시 발생되는 이벤트

**ChangeEcoPotAvailable**

```solidity
event ChangeEcoPotAvailable(address ecoPot, bool b);
```

* EcoPot 상태 변경시 발생되는 이벤트

**AddVoting**

```solidity
event AddVoting(address user, address ecopot, uint amount);
```

* EcoPot 투표시 발생되는 이벤트
* Parameters
  * `user` : 투표자 주소
  * `ecopot` : EcoPot 주소
  * `amount` : 투표 량

**RemoveVoting**

```solidity
event RemoveVoting(address user, address ecopot, uint amount);
```

* EcoPot 투표 철회시 발생되는 이벤트
* Parameters
  * `user` : 투표자 주소
  * `ecopot` : EcoPot 주소
  * `amount` : 철회 수량

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**ecoPotCount**

* 생성된 EcoPot 개수

**MAX\_VOTING*****\_*****POT\_COUNT**

* 최대 투표 가능 EcoPot 개수

**ecoPotList**

* mapping(uint => address)
* EcoPot 주소

**ecoPotExist**

* mapping(address => bool)
* EcoPot 유무

**potTotalVotedAmount**

* EcoPot 총 투표 수

**userVotingPotCount**

* mapping(address => uint)
* 유저 투표 EcoPot 개수

**userVotingPotAddress**

```solidity
function userVotingPotAddress(address user, uint256 ecoPotIndex) public view returns (address) 
```

* 유저 투표 EcoPot 주소

**userVotingPotAmount**

```solidity
function userVotingPotAmount(address user, uint256 ecoPotIndex) public view returns (uint256) 
```

* 유저 EcoPot 투표 수

{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

addVoting

```solidity
function addVoting(address ecoPot, uint amount) public
```

* EcoPot 투표 함수
* vKSP 정수 단위 허용&#x20;

removeVoting

```solidity
function removeVoting(address ecoPot, uint amount) public
```

* Ecopot 투표 철회 함수&#x20;
* Ecopot 투표 수량 범위 내의 vKSP 정수 단위 허용

removeAllVoting

```solidity
function removeAllVoting() public
```

* Ecopot 투표 풀 전체에 대한 철회 함수

claimReward

```solidity
function claimReward(address ecopot) public 
```

* Ecopot 투표 풀의 보상 청구 함수

claimRewardAll

```solidity
function claimRewardAll() public
```

* Ecopot 투표 풀 전체에 대한 보상 청구 함수
  {% endtab %}
  {% endtabs %}


# EcoPot

스테이킹 유저에게 지급될 EcoPot 계획 컨트랙트입니다. Ecopot 프로젝트당 한 개의 Token을 분배할 수 있으며 권한을 부여받은 Operator만이 계획 수립과 진행이 가능합니다.

## Address

Contract address after production is deployed (scope link)&#x20;

## Events, Read-Only Functions, and State-Changing Functions&#x20;

{% tabs %}
{% tab title="Events" %}

## Events

**Initialized**

```solidity
event Initialized(uint totalAmount, uint amountPerBlock, uint distributableBlock, uint estimateEndBlock);
```

* Ecopot 계획 수립 이벤트
* Parameters
  * `totalAmount` : 분배할 토큰 수량 &#x20;
  * `amountPerBlock` : Block 당 분배할 토큰 수량
  * `distributableBlock` : 분배 시작 Block Number
  * `estimateEndBlock` : 예상 분배 종료 Block Number

**Deposit**

```solidity
event Deposit(uint amount, uint totalAmount, uint estimateEndBlock);
```

* 토큰 예치 이벤트
* Parameters
  * `amount` : 예치 토큰 수량
  * `totalAmount` : 총 예치 토큰 수
  * `estimateEndBlock` : 예상 분배 종료 Block Number

**Removed**

```solidity
event Removed(address operator, address token, uint estimateEndBlock, uint remainedBalance);
```

* Ecopot 종료 이벤트
* Parameters
  * `operator` : 예치 토큰 수량
  * `token` : 총 예치 토큰 수
  * `estimateEndBlock` : 예상 분배 종료 Block Number
  * `remainedBalance` : 잔여 토큰 수량

**ChangeAvailable**

```solidity
event ChangeAvailable(bool b);
```

* Ecopot 상태 변경 이벤트

**GiveReward**

```solidity
event GiveReward(address user, uint amount, uint currentIndex, uint userRewardSum);
```

* 토큰 보상 지급시 발생하는 이벤트
* Parameters
  * `user` : 유저 주소
  * `amount` : 지급 토큰 수량
  * `currentIndex`: 보상 지급 시점 Index
  * `userRewardSum` : 누적 보상 수량
    {% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### name

* EcoPot Project name

#### decimals

* 18

#### token

* 분배 Token 주소

**totalAmount**

* 총 배분된 Token 수량 &#x20;

#### getDistributedCurrent

* 배분된 Token 수량&#x20;

#### distributableBlock

* 분배 시작 Block 번호

#### estimateEndBlock

* 예정 종료 Block 번호

**amountPerBlock**

* 블럭당 배분되는 Token 수량

**isAvailable**

* Ecopot 진행 여부

**userRewardSum**

* mapping(address => uint)
* 유저 총 보상 수량
  {% endtab %}
  {% endtabs %}


# V3

KLAYswap V3 스마트 컨트랙트 문서에 오신 것을 환영합니다.&#x20;

이 페이지에는 KLAYswap V3 스마트 컨트랙트에 대한 가이드 및 기술 문서가 포함되어 있습니다. 이 문서는 KLAYswap V3 프로토콜 스마트 컨트랙트에 대해 정보를 얻을 수 있고 on-chain 통합을 도와줍니다.


# V3Factory

해당 컨트랙트는 V3 풀을 배포하고 풀 프로토콜 수수료에 대한 소유권 및 제어를 관리합니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress :  [0xA15Be7e90df29A4aeaD0C7Fc86f7a9fBe6502Ac9](https://scope.klaytn.com/account/0xA15Be7e90df29A4aeaD0C7Fc86f7a9fBe6502Ac9?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**PoolCreated**&#x20;

```solidity
event PoolCreated(
    address indexed token0,
    address indexed token1,
    uint24 indexed fee,
    int24 tickSpacing,
    address pool,
    uint256 exid
)
```

풀이 생성될 때 발생

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#parameters-6)

<table><thead><tr><th width="162.66666666666666">Name</th><th width="98">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>token0</code></td><td>address</td><td>주소 정렬 순서에 따른 풀의 첫 번째 토큰</td></tr><tr><td><code>token1</code></td><td>address</td><td>주소 정렬 순서에 따른 풀의 두 번째 토큰</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>풀의 모든 스왑에 대해 징수되는 수수료는 1/100 BIP 단위로 표시됩니다.</td></tr><tr><td><code>tickSpacing</code></td><td>int24</td><td>초기화된 틱 사이의 최소 틱 수</td></tr><tr><td><code>pool</code></td><td>address</td><td>생성된 풀의 주소</td></tr></tbody></table>

#### FeeAmountEnabled[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#feeamountenabled) <a href="#feeamountenabled" id="feeamountenabled"></a>

```solidity
event FeeAmountEnabled(
    uint24 fee,
    int24 tickSpacing
)
```

풀 생성에 대해 새로운 수수료 금액이 활성화되면 발생합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#parameters-7)

<table><thead><tr><th width="168.66666666666666">Name</th><th width="90">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>fee</code></td><td>uint24</td><td>1/100 BIP 단위로 표시되는 활성화된 수수료</td></tr><tr><td><code>tickSpacing</code></td><td>int24</td><td>주어진 수수료로 생성된 풀의 초기화된 틱 사이의 최소 틱 수</td></tr></tbody></table>
{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**getPoolCount**

```solidity
function getPoolCount() external view override returns (uint256);
```

V3에서 생성된 풀 수 가져오기

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Factory#return-values)

<table><thead><tr><th width="127.66666666666666">Name</th><th width="113">Type</th><th>Description</th></tr></thead><tbody><tr><td></td><td>uint256</td><td>V3에서 생성된 풀 수</td></tr></tbody></table>

**getPoolAddress**

```solidity
function getPoolAddress(uint256 idx) external view override returns (address);
```

**Parameters:**

<table><thead><tr><th width="127.66666666666666">Name</th><th width="113">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>idx</code></td><td>uint256</td><td>인덱스 번호</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Factory#return-values)

<table><thead><tr><th width="127.66666666666666">Name</th><th width="113">Type</th><th>Description</th></tr></thead><tbody><tr><td></td><td>address</td><td>index에 해당하는 풀의 주소</td></tr></tbody></table>

#### getPool[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#getpool) <a href="#getpool" id="getpool"></a>

```solidity
function getPool(
    address tokenA,
    address tokenB,
    uint24 fee
) external view returns (address pool)
```

주어진 토큰 쌍과 수수료에 대한 풀 주소를 반환하거나 존재하지 않는 경우 주소 0을 반환합니다. tokenA 및 tokenB는 token0/token1 또는 token1/token0 순서로 전달될 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#parameters-1)

<table><thead><tr><th width="137.66666666666666">Name</th><th width="105">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenA</code></td><td>address</td><td>token0 또는 token1의 컨트랙트 주소</td></tr><tr><td><code>tokenB</code></td><td>address</td><td>다른 토큰의 컨트랙트 주소</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>풀의 모든 스왑에 대해 징수되는 수수료 1/100 BIP 단위</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#return-values-2)

<table><thead><tr><th width="145.66666666666666">Name</th><th width="119">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>pool</code></td><td>address</td><td>풀 주소</td></tr></tbody></table>

**feeAmountTickSpacing**[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#feeamounttickspacing)

```solidity
function feeAmountTickSpacing(
    uint24 fee
) external view returns (int24)
```

활성화된 경우 주어진 수수료 금액에 대한 틱 간격을 반환하고 활성화되지 않은 경우 0을 반환합니다. 수수료 금액은 절대 제거할 수 없으므로 이 값은 하드 코딩되거나 호출 컨텍스트에 캐시되어야 합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#parameters)

<table><thead><tr><th width="133.66666666666666">Name</th><th width="106">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>fee</code></td><td>uint24</td><td>BIP의 100분의 1 단위로 표시되는 활성화된 수수료입니다. 활성화되지 않은 수수료의 경우 0을 반환합니다.</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#return-values-1)

<table><thead><tr><th width="179">Type</th><th>Description</th></tr></thead><tbody><tr><td>int24</td><td>틱 간격</td></tr></tbody></table>
{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**createPool**

```solidity
function createPool(
    address tokenA,
    address tokenB,
    uint24 fee
) external returns (address pool)
```

* 주어진 두 개의 토큰과 수수료에 대한 풀 생성&#x20;
* tokenA 및 tokenB는 token0/token1 또는 token1/token0 순서로 전달될 수 있습니다. tickSpacing은 수수료에서 검색됩니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Factory#parameters)

<table><thead><tr><th width="135.66666666666666">Name</th><th width="111">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenA</code></td><td>address</td><td>원하는 풀의 두 토큰 중 하나</td></tr><tr><td><code>tokenB</code></td><td>address</td><td>원하는 풀에 있는 두 개의 토큰 중 다른 하나</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>풀에 대한 원하는 수수료</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Factory#return-values)

<table><thead><tr><th width="138.66666666666666">Name</th><th width="109">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>pool</code></td><td>address</td><td>새로 생성된 풀의 주소</td></tr></tbody></table>

#### enableFeeAmount[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#enablefeeamount) <a href="#enablefeeamount" id="enablefeeamount"></a>

```solidity
function enableFeeAmount(
    uint24 fee,
    int24 tickSpacing
) external
```

주어진 tickSpacing으로 수수료 금액을 활성화합니다.&#x20;

수수료 금액은 활성화되면 제거할 수 없습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/IUniswapV3Factory#parameters-4)

<table><thead><tr><th width="164.66666666666666">Name</th><th width="108">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>fee</code></td><td>uint24</td><td>활성화할 수수료 금액으로, BIP의 100분의 1 단위(예: 1e-6)로 표시됩니다.</td></tr><tr><td><code>tickSpacing</code></td><td>int24</td><td>주어진 수수료 금액으로 생성된 모든 풀에 적용되는 틱 사이의 간격</td></tr></tbody></table>
{% endtab %}
{% endtabs %}


# V3Pool

해당 컨트랙트는 V3 풀입니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

#### Initialize[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#initialize) <a href="#initialize" id="initialize"></a>

```solidity
event Initialize(
    uint160 sqrtPriceX96,
    int24 tick
)
```

풀에서 #initialize가 처음 호출될 때 풀에서 정확히 한 번 방출됩니다.&#x20;

Mint/Burn/Swap은 초기화 전에 풀에서 내보낼 수 없습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#parameters)

<table><thead><tr><th width="178.66666666666666">Name</th><th width="92">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>sqrtPriceX96</code></td><td>uint160</td><td>풀의 초기 sqrt 가격(Q64.96)</td></tr><tr><td><code>tick</code></td><td>int24</td><td>풀의 초기 틱, 즉 풀 시작 가격의 로그 베이스 1.0001</td></tr></tbody></table>

#### Mint[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#mint) <a href="#mint" id="mint"></a>

```solidity
event Mint(
    address sender,
    address owner,
    int24 tickLower,
    int24 tickUpper,
    uint128 amount,
    uint256 amount0,
    uint256 amount1
)
```

주어진 포지션에 대해 유동성이 발행될 때 발생

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#parameters-1)

<table><thead><tr><th width="156.66666666666666">Name</th><th width="114">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>sender</code></td><td>address</td><td>유동성을 발행한 주소</td></tr><tr><td><code>owner</code></td><td>address</td><td>포지션 소유자 및 발행된 유동성 수령인</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>예치하고자 하는 포지션의 최소 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>예치하고자 하는 포지션의 최대 틱</td></tr><tr><td><code>amount</code></td><td>uint128</td><td>포지션 범위에 발행된 유동성의 양</td></tr><tr><td><code>amount0</code></td><td>uint256</td><td>발행된 유동성에 필요한 token0의 양</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>발행된 유동성에 필요한 token1의 양</td></tr></tbody></table>

#### Collect[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#collect) <a href="#collect" id="collect"></a>

```solidity
event Collect(
    address owner,
    int24 tickLower,
    int24 tickUpper,
    uint128 amount0,
    uint128 amount1
)
```

포지션 소유자가 수수료를 수령할 때 발생&#x20;

호출자가 수수료를 수집하지 않기로 선택하면 0 amount0 및 amount1로 수집 이벤트를 내보낼 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#parameters-2)

<table><thead><tr><th width="151.66666666666666">Name</th><th width="100">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>owner</code></td><td>address</td><td>수수료가 징수되는 포지션의 소유자</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>포지션의 최소 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>포지션의 최대 틱</td></tr><tr><td><code>amount0</code></td><td>uint128</td><td>수령한 token0 수수료 금액</td></tr><tr><td><code>amount1</code></td><td>uint128</td><td>수령한 token1 수수료 금액</td></tr></tbody></table>

#### Burn[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#burn) <a href="#burn" id="burn"></a>

```solidity
event Burn(
    address owner,
    int24 tickLower,
    int24 tickUpper,
    uint128 amount,
    uint256 amount0,
    uint256 amount1
)
```

포지션의 유동성이 제거되었을 때 발생&#x20;

\#collect를 통해 인출해야 하는 유동성 포지션에서 얻은 수수료를 인출하지 않습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#parameters-3)

<table><thead><tr><th width="154.66666666666666">Name</th><th width="117">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>owner</code></td><td>address</td><td>유동성이 제거된 포지션의 소유자</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>포지션의 최소 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>포지션의 최대 틱</td></tr><tr><td><code>amount</code></td><td>uint128</td><td>제거할 유동성의 양</td></tr><tr><td><code>amount0</code></td><td>uint256</td><td>인출된 token0의 양</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>인출된 token1의 양</td></tr></tbody></table>

#### Swap[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#swap) <a href="#swap" id="swap"></a>

```solidity
event Swap(
    address sender,
    address recipient,
    int256 amount0,
    int256 amount1,
    uint160 sqrtPriceX96,
    uint128 liquidity,
    int24 tick
)
```

token0과 token1 사이의 모든 스왑에 대해 풀에서 내보냅니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#parameters-4)

<table><thead><tr><th width="176.66666666666666">Name</th><th width="108">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>sender</code></td><td>address</td><td>스왑 호출을 시작하고 콜백을 수신한 주소</td></tr><tr><td><code>recipient</code></td><td>address</td><td>스왑의 결과물을 받은 주소</td></tr><tr><td><code>amount0</code></td><td>int256</td><td>풀의 token0 잔액 차이</td></tr><tr><td><code>amount1</code></td><td>int256</td><td>풀의 token1 잔액 차이</td></tr><tr><td><code>sqrtPriceX96</code></td><td>uint160</td><td>Q64.96으로 스왑 후 풀의 sqrt(가격)</td></tr><tr><td><code>liquidity</code></td><td>uint128</td><td>스왑 후 풀의 유동성</td></tr><tr><td><code>tick</code></td><td>int24</td><td>스왑 후 풀 가격의 로그 베이스 1.0001</td></tr></tbody></table>

#### &#x20;<a href="#flash" id="flash"></a>

IncreaseObservationCardinalityNext[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#increaseobservationcardinalitynext)

```solidity
event IncreaseObservationCardinalityNext(
    uint16 observationCardinalityNextOld,
    uint16 observationCardinalityNextNew
)
```

저장할 수 있는 관찰 수를 늘리기 위해 풀에서 내보냅니다.&#x20;

observationCardinalityNext는 mint/swap/burn 직전에 인덱스에 관측치가 기록될 때까지 관측 카디널리티가 아닙니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolEvents#parameters-6)

<table><thead><tr><th width="207.66666666666666">Name</th><th width="93">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>observationCardinalityNextOld</code></td><td>uint16</td><td>다음 관찰 카디널리티의 이전 값</td></tr><tr><td><code>observationCardinalityNextNew</code></td><td>uint16</td><td>다음 관찰 카디널리티의 업데이트된 값</td></tr></tbody></table>
{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### factory[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#factory) <a href="#factory" id="factory"></a>

```solidity
function factory() external view returns (address)
```

IUniswapV3Factory 인터페이스를 준수해야 하는 풀을 배포한 계약

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#return-values)

<table><thead><tr><th width="150">Type</th><th>Description</th></tr></thead><tbody><tr><td>address</td><td>컨트랙트 주소</td></tr></tbody></table>

#### token0[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#token0) <a href="#token0" id="token0"></a>

```solidity
function token0() external view returns (address)
```

주소별로 정렬된 풀의 두 토큰 중 첫 번째

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#return-values-1)

| Type    | Description |
| ------- | ----------- |
| address | 토큰 컨트랙트 주소  |

#### token1[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#token1) <a href="#token1" id="token1"></a>

```solidity
function token1() external view returns (address)
```

주소별로 정렬된 풀의 두 토큰 중 두 번째

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#return-values-2)

| Type    | Description |
| ------- | ----------- |
| address | 토큰 컨트랙트 주소  |

#### fee[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#fee) <a href="#fee" id="fee"></a>

```solidity
function fee() external view returns (uint24)
```

1/100 BIP 단위의 풀 수수료, 즉 1e-6

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#return-values-3)

| Type   | Description |
| ------ | ----------- |
| uint24 | 수수료         |

#### tickSpacing[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#tickspacing) <a href="#tickspacing" id="tickspacing"></a>

```solidity
function tickSpacing() external view returns (int24)
```

풀 틱 간격&#x20;

틱은 이 값의 배수에서만 사용할 수 있으며 최소값은 1이고 항상 양수입니다. \
예: tickSpacing이 3이면 틱이 3번째 틱마다 초기화될 수 있음을 의미합니다(예: ..., -6, -3, 0, 3, 6, ... 이 값은 항상 양수인데도 캐스팅을 피하기 위해 int24입니다.

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#return-values-4)

| Type  | Description |
| ----- | ----------- |
| int24 | 틱 간격        |

#### maxLiquidityPerTick[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#maxliquiditypertick) <a href="#maxliquiditypertick" id="maxliquiditypertick"></a>

```solidity
function maxLiquidityPerTick() external view returns (uint128)The maximum amount of position liquidity that can use any tick in the range
```

이 매개변수는 유동성이 uint128을 초과하는 것을 방지하기 위해 틱당 적용되며 풀에 범위 내 유동성을 추가하는 것을 방지하기 위해 범위를 벗어난 유동성이 사용되는 것을 방지합니다.

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolImmutables#return-values-5)

| Type    | Description |
| ------- | ----------- |
| uint128 | 틱당 최대 유동성   |

#### snapshotCumulativesInside[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#snapshotcumulativesinside) <a href="#snapshotcumulativesinside" id="snapshotcumulativesinside"></a>

```solidity
function snapshotCumulativesInside(
    int24 tickLower,
    int24 tickUpper
) external view returns (
    int56 tickCumulativeInside, 
    uint160 secondsPerLiquidityInsideX128, 
    uint32 secondsInside
)
```

틱 누적, 유동성당 초 및 틱 범위 내 초의 스냅샷을 반환합니다.&#x20;

스냅샷은 위치가 존재하는 기간 동안 찍은 다른 스냅샷과만 비교해야 합니다. \
즉, 첫 번째 스냅샷이 생성된 시점과 두 번째 스냅샷이 생성된 시점 사이의 전체 기간 동안 포지션이 유지되지 않으면 스냅샷을 비교할 수 없습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters)

<table><thead><tr><th width="184.66666666666666">Name</th><th width="137">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tickLower</code></td><td>int24</td><td>범위의 하위 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>범위의 상위 틱</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#return-values)

<table><thead><tr><th width="254.66666666666666">Name</th><th width="119">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tickCumulativeInside</code></td><td>int56</td><td>범위에 대한 틱 누산기의 스냅샷</td></tr><tr><td><code>secondsPerLiquidityInsideX128</code></td><td>uint160</td><td>범위에 대한 유동성당 초의 스냅샷</td></tr><tr><td><code>secondsInside</code></td><td>uint32</td><td>범위에 대한 유동성당 초의 스냅샷</td></tr></tbody></table>

#### observe[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#observe) <a href="#observe" id="observe"></a>

```solidity
function observe(
    uint32[] secondsAgos
) external view returns (
    int56[] tickCumulatives, 
    uint160[] secondsPerLiquidityCumulativeX128s
)
```

현재 블록 타임스탬프에서 각 타임스탬프 secondsAgo 시점의 누적 틱 및 유동성을 반환합니다.&#x20;

시간 가중 평균 틱 또는 범위 내 유동성을 얻으려면 두 개의 값으로 호출해야 합니다. \
하나는 기간의 시작을 나타내고 다른 하나는 기간의 끝을 나타냅니다. \
예를 들어 지난 시간 가중 평균 틱을 얻으려면 secondsAgos = \[3600, 0]으로 호출해야 합니다. 시간 가중 평균 틱은 토큰1 / 토큰0의 로그 기준 sqrt(1.0001)에서 풀의 기하학적 시간 가중 평균 가격을 나타냅니다. TickMath 라이브러리를 사용하여 눈금 값에서 비율로 이동할 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters-1)

<table><thead><tr><th width="173.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>secondsAgos</code></td><td>uint32[]</td><td>각 누적 틱 및 유동성 값이 반환되어야 하는 시점</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#return-values-1)

<table><thead><tr><th width="219.66666666666666">Name</th><th width="129">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tickCumulatives</code></td><td>int56[]</td><td>현재 블록 타임스탬프에서 각 <code>secondsAgos</code>의 누적 틱 값</td></tr><tr><td><code>secondsPerLiquidityCumulativeX128s</code></td><td>uint160[]</td><td>현재 블록의 각 <code>secondsAgos</code> 기준 유동성 범위 값당 누적 초</td></tr></tbody></table>

#### slot0[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#slot0) <a href="#slot0" id="slot0"></a>

```solidity
function slot0() external view returns (
    uint160 sqrtPriceX96, 
    int24 tick, 
    uint16 observationIndex, 
    uint16 observationCardinality, 
    uint16 observationCardinalityNext, 
    uint8 feeProtocol, 
    bool unlocked
)
```

풀의 0번째 스토리지 슬롯은 많은 값을 저장하며 외부에서 액세스할 때 가스를 절약하기 위한 단일 방법으로 노출됩니다.

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#return-values)

<table><thead><tr><th width="184.66666666666666">Name</th><th width="104">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>sqrtPriceX96</code></td><td>uint160</td><td>sqrt(token1/token0) Q64.96 값으로 풀의 현재 가격</td></tr><tr><td><code>tick</code></td><td>int24</td><td>풀의 현재 틱, 즉 실행된 마지막 틱 전환에 따른 것입니다. 가격이 틱 경계에 있는 경우 이 값은 항상 SqrtTickMath getTickAtSqrtRatio(sqrtPriceX96)와 같지 않을 수 있습니다.</td></tr><tr><td><code>observationIndex</code></td><td>uint16</td><td>작성된 마지막 오라클 관찰의 인덱스</td></tr><tr><td><code>observationCardinality</code></td><td>uint16</td><td>풀에 저장된 현재 최대 관찰 수</td></tr><tr><td><code>observationCardinalityNext</code></td><td>uint16</td><td>관찰 시 업데이트될 다음 최대 관찰 수입니다.</td></tr><tr><td><code>feeProtocol</code></td><td>uint8</td><td>* <strong>미사용</strong> *</td></tr><tr><td><code>unlocked</code></td><td>bool</td><td>풀이 현재 재진입에 잠겨 있는지 여부</td></tr></tbody></table>

#### feeGrowthGlobal0X128[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#feegrowthglobal0x128) <a href="#feegrowthglobal0x128" id="feegrowthglobal0x128"></a>

```solidity
function feeGrowthGlobal0X128() external view returns (uint256)
```

풀의 전체 수명 동안 유동성 단위당 수집된 token0의 Q128.128 수수료로 수수료 증가&#x20;

이 값은 uint256을 오버플로할 수 있습니다.

#### feeGrowthGlobal1X128[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#feegrowthglobal1x128) <a href="#feegrowthglobal1x128" id="feegrowthglobal1x128"></a>

```solidity
function feeGrowthGlobal1X128() external view returns (uint256)
```

풀의 전체 수명 동안 유동성 단위당 수집된 token1의 Q128.128 수수료로 수수료 증가&#x20;

이 값은 uint256을 오버플로할 수 있습니다.

#### liquidity[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#liquidity) <a href="#liquidity" id="liquidity"></a>

```solidity
function liquidity() external view returns (uint128)
```

현재 풀에서 사용할 수 있는 유동성 범위&#x20;

이 값은 모든 틱의 총 유동성과 관련이 없습니다.

#### ticks[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#ticks) <a href="#ticks" id="ticks"></a>

```solidity
function ticks(
    int24 tick
) external view returns (
    uint128 liquidityGross, 
    int128 liquidityNet, 
    uint256 feeGrowthOutside0X128, 
    uint256 feeGrowthOutside1X128, 
    int56 tickCumulativeOutside, 
    uint160 secondsPerLiquidityOutsideX128, 
    uint32 secondsOutside, 
    bool initialized,
    uint256 rewardGrowthOutsideX128
)
```

풀에서 특정 틱에 대한 정보 조회

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#parameters)

| Name   | Type  | Description |
| ------ | ----- | ----------- |
| `tick` | int24 | 조회할 틱       |

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#return-values-1)

<table><thead><tr><th width="259">Name</th><th width="97.66666666666666">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>liquidityGross</code></td><td>uint128</td><td>풀을 틱 하한 또는 상한 틱으로 사용하는 총 포지션 유동성,</td></tr><tr><td><code>liquidityNet</code></td><td>int128</td><td>풀 가격이 틱을 넘을 때 유동성이 얼마나 변하는지,</td></tr><tr><td><code>feeGrowthOutside0X128</code></td><td>uint256</td><td>token0의 현재 틱에서 틱 반대편의 수수료 증가,</td></tr><tr><td><code>feeGrowthOutside1X128</code></td><td>uint256</td><td>token1의 현재 틱에서 틱 반대편의 수수료 증가, <br>feeGrowthOutsideX128 값은 틱이 초기화된 경우에만 사용할 수 있습니다. 즉, liquidityGross가 0보다 큰 경우입니다. 또한 이러한 값은 상대적이며 계산에 사용됩니다. 스냅샷.</td></tr><tr><td><code>tickCumulativeOutside</code></td><td>int56</td><td></td></tr><tr><td><code>secondsPerLiquidityOutsideX128</code></td><td>uint160</td><td></td></tr><tr><td><code>secondsOutside</code></td><td>uint32</td><td></td></tr><tr><td><code>initialized</code></td><td>bool</td><td></td></tr><tr><td><code>rewardGrowthOutsideX128</code></td><td>uint256</td><td>현재 틱에서 틱 반대편의 reward 증가</td></tr></tbody></table>

#### positions[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#positions) <a href="#positions" id="positions"></a>

```solidity
function positions(
    bytes32 key
) external view returns (
    uint128 liquidity, 
    uint256 feeGrowthInside0LastX128, 
    uint256 feeGrowthInside1LastX128, 
    uint128 tokensOwed0, 
    uint128 tokensOwed1,
    uint256 rewardGrowthInsideLastX128,
    uint128 rewardOwed
)
```

포지션 키로 포지션에 대한 정보를 반환합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#parameters-1)

<table><thead><tr><th width="127.66666666666666">Name</th><th width="140">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>key</code></td><td>bytes32</td><td>위치의 키는 소유자인 tickLower 및 tickUpper가 구성한 사전 이미지의 해시입니다.</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#return-values-2)

<table><thead><tr><th width="211.66666666666666">Name</th><th width="102">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>liquidity</code></td><td>uint128</td><td>포지션의 유동성 양,</td></tr><tr><td><code>feeGrowthInside0LastX128</code></td><td>uint256</td><td>마지막 mint/burn/poke 기준 틱 범위 내에서 token0의 수수료 증가,</td></tr><tr><td><code>feeGrowthInside1LastX128</code></td><td>uint256</td><td>마지막 mint/burn/poke 기준 틱 범위 내에서 token1의 수수료 증가,</td></tr><tr><td><code>tokensOwed0</code></td><td>uint128</td><td>마지막 mint/burn/poke 시점의 포지션에 빚진 token0의 계산된 금액,</td></tr><tr><td><code>tokensOwed1</code></td><td>uint128</td><td>마지막 mint/burn/poke 시점의 포지션에 빚진 token1의 계산된 금액,</td></tr><tr><td><code>rewardGrowthInsideLastX128</code></td><td>uint256</td><td>마지막 mint/burn/poke 기준 틱 범위 내에서 reward의 증가,</td></tr><tr><td><code>rewardOwed</code></td><td>uint128</td><td>마지막 mint/burn/poke 시점의 포지션에 빚진 reward의 계산된 금액,</td></tr></tbody></table>

#### observe[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolDerivedState#observe) <a href="#observe" id="observe"></a>

```solidity
function observe(
    uint32[] secondsAgos
) external view returns (
    int56[] tickCumulatives, 
    uint160[] secondsPerLiquidityCumulativeX128s
)
```

현재 블록 타임스탬프에서 각 타임스탬프 `secondsAgo`시점의 누적 틱 및 유동성을 반환합니다.&#x20;

시간 가중 평균 틱 또는 범위 내 유동성을 얻으려면 두 개의 값으로 호출해야 합니다. \
하나는 기간의 시작을 나타내고 다른 하나는 기간의 끝을 나타냅니다. 예를 들어 지난 시간 가중 평균 틱을 얻으려면 secondsAgos = \[3600, 0]으로 호출해야 합니다. \
시간 가중 평균 틱은 토큰1 / 토큰0의 로그 기준 sqrt(1.0001)에서 풀의 기하학적 시간 가중 평균 가격을 나타냅니다. TickMath 라이브러리를 사용하여 눈금 값에서 비율로 이동할 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolDerivedState#parameters)

<table><thead><tr><th width="177">Name</th><th width="110.66666666666666">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>secondsAgos</code></td><td>uint32[]</td><td>각 누적 틱 및 유동성 값이 반환되어야 하는 시점부터</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolDerivedState#return-values)

<table><thead><tr><th width="241">Name</th><th width="107.66666666666666">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tickCumulatives</code></td><td>int56[]</td><td>현재 블록 타임스탬프에서 각 <code>secondsAgos</code>의 누적 틱 값</td></tr><tr><td><code>secondsPerLiquidityCumulativeX128s</code></td><td>uint160[]</td><td>현재 블록 타임스탬프에서 각 <code>secondsAgos</code>의 범위 내 유동성 값당 누적 초</td></tr></tbody></table>

#### observations[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#observations) <a href="#observations" id="observations"></a>

```solidity
function observations(
    uint256 index
) external view returns (
    uint32 blockTimestamp, 
    int56 tickCumulative, 
    uint160 secondsPerLiquidityCumulativeX128, 
    bool initialized
)
```

특정 관찰 색인에 대한 데이터를 반환합니다.&#x20;

배열의 특정 인덱스가 아닌 일정 시간 전의 관찰을 얻기 위해 이 메서드 대신 #observe()를 사용하고 싶을 가능성이 큽니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#parameters-2)

<table><thead><tr><th width="143.66666666666666">Name</th><th width="133">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>index</code></td><td>uint256</td><td>가져올 관찰 배열의 요소</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolState#return-values-3)

<table><thead><tr><th width="242">Name</th><th width="93.66666666666666">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>blockTimestamp</code></td><td>uint256</td><td>관찰의 타임스탬프,</td></tr><tr><td><code>tickCumulative</code></td><td>int56</td><td>관찰 타임스탬프를 기준으로 풀 수명 동안 경과된 시간(초)을 곱한 틱</td></tr><tr><td><code>secondsPerLiquidityCumulativeX128</code></td><td>uint160</td><td>관찰 타임스탬프를 기준으로 풀 수명 동안 범위 내 유동성 초당</td></tr><tr><td><code>initialized</code></td><td>bool</td><td>관찰이 초기화되었고 값이 사용하기에 안전한지 여부</td></tr></tbody></table>
{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

#### increaseObservationCardinalityNext[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#increaseobservationcardinalitynext) <a href="#increaseobservationcardinalitynext" id="increaseobservationcardinalitynext"></a>

```solidity
function increaseObservationCardinalityNext(
    uint16 observationCardinalityNext
) external; 
```

이 풀이 저장할 가격 및 유동성 관찰의 최대 수를 늘립니다.&#x20;

이 방법은 풀에 이미 입력 observeCardinalityNext보다 크거나 같은 observeCardinalityNext가 있는 경우 작동하지 않습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters-2)

<table><thead><tr><th width="159.66666666666666">Name</th><th width="144">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>observationCardinalityNext</code></td><td>uint16</td><td>풀이 저장할 최소 관찰 수</td></tr></tbody></table>

#### initialize[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#initialize) <a href="#initialize" id="initialize"></a>

```solidity
function initialize(
    uint160 sqrtPriceX96
) external;
```

풀의 초기 가격을 설정합니다. 잠금 해제된 상태로 초기화되기 때문에 잠기지 않음

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters-3)

<table><thead><tr><th width="185.66666666666666">Name</th><th width="116">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>sqrtPriceX96</code></td><td>uint160</td><td>풀의 초기 sqrt 가격을 Q64.96으로</td></tr></tbody></table>

#### mint[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#mint) <a href="#mint" id="mint"></a>

```solidity
function mint(
    address recipient,
    int24 tickLower,
    int24 tickUpper,
    uint128 amount,
    bytes data
) external returns (uint256 amount0, uint256 amount1)
```

주어진 수신자/tickLower/tickUpper 위치에 유동성 추가

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters-4)

<table><thead><tr><th width="150.66666666666666">Name</th><th width="108">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>recipient</code></td><td>address</td><td>유동성이 생성될 주소</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>유동성을 추가할 포지션의 하위 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>유동성을 추가할 위치의 상단 틱</td></tr><tr><td><code>amount</code></td><td>uint128</td><td>발행할 유동성의 양</td></tr><tr><td><code>data</code></td><td>bytes</td><td>콜백으로 전달되어야 하는 모든 데이터</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#return-values-2)

<table><thead><tr><th width="146.66666666666666">Name</th><th width="103">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0</code></td><td>uint256</td><td>주어진 양의 유동성을 발행하기 위해 지불된 token0의 양. 콜백의 값과 일치</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>주어진 양의 유동성을 발행하기 위해 지불된 token1의 양. 콜백의 값과 일치</td></tr></tbody></table>

#### collect[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#collect) <a href="#collect" id="collect"></a>

```solidity
function collect(
    address recipient,
    int24 tickLower,
    int24 tickUpper,
    uint128 amount0Requested,
    uint128 amount1Requested
) external returns (uint128 amount0, uint128 amount1)
```

포지션에 빚진 토큰을 수집합니다.&#x20;

획득한 수수료를 재계산하지 않으며, 이는 발행 또는 유동성 소각을 통해 수행되어야 합니다. \
콜렉트는 포지션 소유자가 호출해야 합니다. token0 또는 token1만 인출하려면 amount0Requested 또는 amount1Requested를 0으로 설정하면 됩니다. \
빚진 모든 토큰을 인출하기 위해 호출자는 빚진 실제 토큰보다 큰 값을 전달할 수 있습니다. 유형(uint128).max. 빚진 토큰은 누적된 스왑 수수료 또는 소진된 유동성에서 나올 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters-5)

<table><thead><tr><th width="213.66666666666666">Name</th><th width="123">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>recipient</code></td><td>address</td><td>징수된 수수료를 받을 주소</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>수수료를 징수할 포지션의 하단 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>수수료를 징수할 포지션의 상단 틱</td></tr><tr><td><code>amount0Requested</code></td><td>uint128</td><td>지불해야 할 수수료에서 얼마나 많은 token0을 인출해야 하는가</td></tr><tr><td><code>amount1Requested</code></td><td>uint128</td><td>지불해야 할 수수료에서 얼마나 많은 token1을 인출해야 하는가</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#return-values-3)

<table><thead><tr><th width="146.66666666666666">Name</th><th width="113">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0</code></td><td>uint128</td><td>token0에서 징수된 수수료 금액</td></tr><tr><td><code>amount1</code></td><td>uint128</td><td>token1에서 징수된 수수료 금액</td></tr></tbody></table>

#### burn[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#burn) <a href="#burn" id="burn"></a>

```solidity
function burn(
    int24 tickLower,
    int24 tickUpper,
    uint128 amount
) external returns (uint256 amount0, uint256 amount1)
```

발신자로부터 유동성을 소각하고 유동성에 대해 포지션에 빚진 계정 토큰

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters-6)

<table><thead><tr><th width="146.66666666666666">Name</th><th width="131">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tickLower</code></td><td>int24</td><td>유동성을 제거할 포지션의 하위 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>유동성을 제거할 포지션의 상위 틱</td></tr><tr><td><code>amount</code></td><td>uint128</td><td>소각할 유동성의 양</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#return-values-4)

<table><thead><tr><th width="138.66666666666666">Name</th><th width="116">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0</code></td><td>uint256</td><td>받는 사람에게 보낸 token0의 양</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>받는 사람에게 보낸 token1의 양</td></tr></tbody></table>

#### swap[​](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#swap) <a href="#swap" id="swap"></a>

```solidity
function swap(
    address recipient,
    bool zeroForOne,
    int256 amountSpecified,
    uint160 sqrtPriceLimitX96,
    bytes data
) external returns (int256 amount0, int256 amount1)
```

token0을 token1로 바꾸거나 token1을 token0으로 바꿉니다.&#x20;

이 메서드의 호출자는 IUniswapV3SwapCallback#uniswapV3SwapCallback 형식의 콜백을 받습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters-7)

<table><thead><tr><th width="225.66666666666666">Name</th><th width="102">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>recipient</code></td><td>address</td><td>스왑 출력을 수신할 주소</td></tr><tr><td><code>zeroForOne</code></td><td>bool</td><td>스왑의 방향, token0에서 token1로 true, token1에서 token0으로 false</td></tr><tr><td><code>amountSpecified</code></td><td>int256</td><td>정확한 입력(양수) 또는 정확한 출력(음수)으로 암시적으로 스왑을 구성하는 스왑의 양</td></tr><tr><td><code>sqrtPriceLimitX96</code></td><td>uint160</td><td>Q64.96 sqrt 가격 제한. token0 -> 1인 경우 가격은 스왑 후 이 값보다 낮을 수 없습니다. token1 -> 0인 경우 스왑 후 가격은 이 값보다 클 수 없습니다.</td></tr><tr><td><code>data</code></td><td>bytes</td><td>콜백으로 전달될 모든 데이터</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#return-values-5)

<table><thead><tr><th width="137.66666666666666">Name</th><th width="104">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0</code></td><td>int256</td><td>풀의 token0 잔액 델타, 음수일 때 정확, 양수일 때 최소값</td></tr><tr><td><code>amount1</code></td><td>int256</td><td>풀의 token1 잔액 델타, 음수일 때 정확, 양수일 때 최소값</td></tr></tbody></table>

#### snapshotCumulativesInside[​](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolDerivedState#snapshotcumulativesinside) <a href="#snapshotcumulativesinside" id="snapshotcumulativesinside"></a>

```solidity
function snapshotCumulativesInside(
    int24 tickLower,
    int24 tickUpper
) external returns (
    int56 tickCumulativeInside, 
    uint160 secondsPerLiquidityInsideX128, 
    uint32 secondsInside
)
```

틱 누적, 유동성당 초 및 틱 범위 내 초의 스냅샷을 반환합니다.&#x20;

스냅샷은 위치가 존재하는 기간 동안 찍은 다른 스냅샷과만 비교해야 합니다. \
즉, 첫 번째 스냅샷이 생성된 시점과 두 번째 스냅샷이 생성된 시점 사이의 전체 기간 동안 포지션이 유지되지 않으면 스냅샷을 비교할 수 없습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolDerivedState#parameters-1)

<table><thead><tr><th width="187">Name</th><th width="86.66666666666666">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tickLower</code></td><td>int24</td><td>범위의 하위 틱</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>범위의 상위 틱</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/core/interfaces/pool/IUniswapV3PoolDerivedState#return-values-1)

<table><thead><tr><th width="259">Name</th><th width="102.66666666666666">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tickCumulativeInside</code></td><td>int56</td><td>범위에 대한 틱 누산기의 스냅샷</td></tr><tr><td><code>secondsPerLiquidityInsideX128</code></td><td>uint160</td><td>범위에 대한 유동성당 초의 스냅샷</td></tr><tr><td><code>secondsInside</code></td><td>uint32</td><td>범위에 대한 유동성당 초의 스냅샷</td></tr></tbody></table>
{% endtab %}
{% endtabs %}


# NonfungiblePositionManager

해당 컨트랙트는  ERC721 대체 불가능한 토큰 인터페이스의 KLAYswap V3 포지션을 wrapping합니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0x51D233B5aE7820030A29c75d6788403B8B5d317B](https://scope.klaytn.com/account/0x51D233B5aE7820030A29c75d6788403B8B5d317B?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**IncreaseLiquidity**

```solidity
event IncreaseLiquidity(
    uint256 indexed tokenId, 
    uint128 liquidity, 
    uint256 amount0, 
    uint256 amount1
);
```

포지션 NFT에 대한 유동성 증가 시 발생 또한 토큰이 발행될 때 방출됩니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungiblePositionManager#parameters-7)

<table><thead><tr><th width="170.66666666666666">Name</th><th width="116">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>The ID of the token for which liquidity was increased</td></tr><tr><td><code>liquidity</code></td><td>uint128</td><td>The amount by which liquidity for the NFT position was increased</td></tr><tr><td><code>amount0</code></td><td>uint256</td><td>The amount of token0 that was paid for the increase in liquidity</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>The amount of token1 that was paid for the increase in liquidity</td></tr></tbody></table>

**DecreaseLiquidity**

```solidity
event DecreaseLiquidity(
    uint256 indexed tokenId, 
    uint128 liquidity, 
    uint256 amount0, 
    uint256 amount1
);
```

포지션 NFT에 대한 유동성 감소 시 발생

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungiblePositionManager#parameters-8)

<table><thead><tr><th width="159.66666666666666">Name</th><th width="113">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>The ID of the token for which liquidity was decreased</td></tr><tr><td><code>liquidity</code></td><td>uint128</td><td>The amount by which liquidity for the NFT position was decreased</td></tr><tr><td><code>amount0</code></td><td>uint256</td><td>The amount of token0 that was accounted for the decrease in liquidity</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>The amount of token1 that was accounted for the decrease in liquidity</td></tr></tbody></table>

**Collect**

```solidity
event Collect(
    uint256 indexed tokenId, 
    address recipient,
    uint256 amount0, 
    uint256 amount1,
    uint256 reward
);
```

포지션 NFT에 대한 토큰이 수집될 때 발생합니다. \
보고된 금액은 반올림 동작으로 인해 이체된 금액과 정확히 일치하지 않을 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungiblePositionManager#parameters-9)

<table><thead><tr><th width="147.66666666666666">Name</th><th width="120">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>포지션 NFT ID</td></tr><tr><td><code>recipient</code></td><td>address</td><td>수집된 토큰을 받은 계정의 주소</td></tr><tr><td><code>amount0</code></td><td>uint256</td><td>수집된 포지션에 빚진 token0의 양</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>수집된 포지션에 빚진 token1의 양</td></tr></tbody></table>
{% endtab %}

{% tab title="Parameter Structs" %}

## Parameter Structs

#### MintParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungiblePositionManager#mintparams) <a href="#mintparams" id="mintparams"></a>

```solidity
struct MintParams {
    address token0;
    address token1;
    uint24 fee;
    int24 tickLower;
    int24 tickUpper;
    uint256 amount0Desired;
    uint256 amount1Desired;
    uint256 amount0Min;
    uint256 amount1Min;
    address recipient;
    uint256 deadline;
}
```

#### IncreaseLiquidityParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungiblePositionManager#increaseliquidityparams) <a href="#increaseliquidityparams" id="increaseliquidityparams"></a>

```solidity
struct IncreaseLiquidityParams {
   uint256 tokenId;
   uint256 amount0Desired;
   uint256 amount1Desired;
   uint256 amount0Min;
   uint256 amount1Min;
   uint256 deadline;
}
```

#### DecreaseLiquidityParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungiblePositionManager#decreaseliquidityparams) <a href="#decreaseliquidityparams" id="decreaseliquidityparams"></a>

```solidity
struct DecreaseLiquidityParams {
    uint256 tokenId;
    uint128 liquidity;
    uint256 amount0Min;
    uint256 amount1Min;
    uint256 deadline;
}
```

#### CollectParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungiblePositionManager#collectparams) <a href="#collectparams" id="collectparams"></a>

```solidity
struct CollectParams {
    uint256 tokenId;
    address recipient;
    uint128 amount0Max;
    uint128 amount1Max;
}
```

{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### positions[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#positions) <a href="#positions" id="positions"></a>

<pre class="language-solidity"><code class="lang-solidity"><strong>function positions(
</strong>    uint256 tokenId
) external view returns (
    uint96 nonce, 
    address operator, 
    address token0, 
    address token1, 
    uint24 fee, 
    int24 tickLower, 
    int24 tickUpper, 
    uint128 liquidity, 
    uint256 feeGrowthInside0LastX128, 
    uint256 feeGrowthInside1LastX128, 
    uint128 tokensOwed0, 
    uint128 tokensOwed1
)
</code></pre>

주어진 토큰 ID와 관련된 위치 정보를 반환합니다.&#x20;

토큰 ID가 유효하지 않은 경우 throw.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters)

<table><thead><tr><th width="161">Name</th><th width="152.66666666666666">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>포지션을 나타내는 토큰의 ID</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#return-values)

<table><thead><tr><th width="209.66666666666663">Name</th><th width="101">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>nonce</code></td><td>uint96</td><td>permit에 대한 nonce 값</td></tr><tr><td><code>operator</code></td><td>address</td><td>지출이 승인된 주소</td></tr><tr><td><code>token0</code></td><td>address</td><td>특정 풀에 대한 token0의 주소</td></tr><tr><td><code>token1</code></td><td>address</td><td>특정 풀에 대한 token1의 주소</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>풀과 관련된 수수료</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>위치에 대한 틱 범위의 하단</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>위치에 대한 틱 범위의 상단</td></tr><tr><td><code>liquidity</code></td><td>uint128</td><td>포지션의 유동성</td></tr><tr><td><code>feeGrowthInside0LastX128</code></td><td>uint256</td><td>개별 포지션에 대한 마지막 조치를 기준으로 token0의 수수료 증가</td></tr><tr><td><code>feeGrowthInside1LastX128</code></td><td>uint256</td><td>개별 포지션에 대한 마지막 조치를 기준으로 token1의 수수료 증가</td></tr><tr><td><code>tokensOwed0</code></td><td>uint128</td><td>마지막 계산 시점의 위치에 대한 미수금된 token0의 양</td></tr><tr><td><code>tokensOwed1</code></td><td>uint128</td><td>마지막 계산 시점의 위치에 대한 미수금된 token1의 양</td></tr></tbody></table>

#### positionRewards <a href="#positions" id="positions"></a>

```solidity
function positionRewards(uint256 tokenId)
external
view
returns (
    uint256 rewardGrowthInsideLastX128,
    uint128 reward,
    uint128 fee0Sum,
    uint128 fee1Sum,
    uint128 rewardSum
);
```

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters)

<table><thead><tr><th width="137.66666666666666">Name</th><th width="106">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>포지션을 나타내는 토큰의 ID</td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="209.66666666666663">Name</th><th width="101">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>rewardGrowthInsideLastX128</code></td><td>uint256</td><td>개별 포지션에 대한 마지막 행동에 따른 보상 증가</td></tr><tr><td><code>reward</code></td><td>uint128</td><td>미수령 보상 금액</td></tr><tr><td><code>fee0Sum</code></td><td>uint128</td><td>token0의 누적 수수료</td></tr><tr><td><code>fee1Sum</code></td><td>uint128</td><td>token1의 누적 수수료</td></tr><tr><td><code>rewardSum</code></td><td>uint128</td><td>적립된 리워드 금액</td></tr></tbody></table>

#### getApproved[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#getapproved) <a href="#getapproved" id="getapproved"></a>

```solidity
  function getApproved() public view returns (address)
```

tokenId 토큰에 대해 승인된 계정을 반환합니다.&#x20;

요구 사항: 토큰 ID가 있어야 합니다.

#### tokenURI[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#tokenuri) <a href="#tokenuri" id="tokenuri"></a>

```solidity
  function tokenURI(uint256 tokenId) public view returns (string)
```

특정 토큰 ID를 설명하는 URI를 반환합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters-2)

<table><thead><tr><th width="136.66666666666666">Name</th><th width="100">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>발행된 포지션을 나타내는 토큰의 ID</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#return-values-2)

URI 데이터가 포함된 base64 문자열입니다.

#### baseURI[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#baseuri) <a href="#baseuri" id="baseuri"></a>

```solidity
  function baseURI() public returns (string)
```

{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

#### mint[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#mint) <a href="#mint" id="mint"></a>

```solidity
function mint(
    struct INonfungiblePositionManager.MintParams params
) external returns (
    uint256 tokenId, 
    uint128 liquidity, 
    uint256 amount0, 
    uint256 amount1
)
```

NFT로 래핑된 새 포지션을 생성합니다.&#x20;

풀이 존재하고 초기화될 때 이것을 호출하십시오. 풀이 생성되었지만 초기화되지 않은 경우 메서드가 존재하지 않습니다. 즉, 풀이 초기화된 것으로 간주됩니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters-1)

<table><thead><tr><th width="126.66666666666666">Name</th><th width="238">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct INonfungiblePositionManager.MintParams</code></td><td>calldata에서 MintParams로 인코딩된 위치를 생성하는 데 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#return-values-1)

<table><thead><tr><th width="142.66666666666666">Name</th><th width="134">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>발행된 포지션을 나타내는 토큰의 ID</td></tr><tr><td><code>liquidity</code></td><td>uint128</td><td>이 포지션의 유동성 양</td></tr><tr><td><code>amount0</code></td><td>uint256</td><td>token0의 수량</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>token1의 수량</td></tr></tbody></table>

#### increaseLiquidity[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#increaseliquidity) <a href="#increaseliquidity" id="increaseliquidity"></a>

```solidity
function increaseLiquidity(
    struct INonfungiblePositionManager.IncreaseLiquidityParams params
) external returns (
    uint128 liquidity, 
    uint256 amount0, 
    uint256 amount1
)
```

`msg.sender`가 지불한 토큰으로 포지션의 유동성을 높입니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters-3)

<table><thead><tr><th width="120.66666666666666">Name</th><th width="233">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct INonfungiblePositionManager.IncreaseLiquidityParams</code></td><td>calldata에서 IncreaseLiquidityParams로 인코딩된 포지션의 유동성을 증가시키는 데 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#return-values-3)

<table><thead><tr><th width="144.66666666666666">Name</th><th width="104">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>liquidity</code></td><td>uint128</td><td>증가에 따른 새로운 유동성 양</td></tr><tr><td><code>amount0</code></td><td>uint256</td><td>유동성을 달성하기 위한 token0의 양</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>유동성을 달성하기 위한 token1의 양</td></tr></tbody></table>

#### decreaseLiquidity[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#decreaseliquidity) <a href="#decreaseliquidity" id="decreaseliquidity"></a>

<pre class="language-solidity"><code class="lang-solidity">function decreaseLiquidity(
<strong>    struct INonfungiblePositionManager.DecreaseLiquidityParams params
</strong>) external returns (uint256 amount0, uint256 amount1)
</code></pre>

포지션의 유동성을 줄여 포지션에 반영

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters-4)

<table><thead><tr><th width="130.66666666666666">Name</th><th width="231">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct INonfungiblePositionManager.DecreaseLiquidityParams</code></td><td>calldata에서 IncreaseLiquidityParams로 인코딩된 포지션의 유동성을 줄이는 데 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#return-values-4)

<table><thead><tr><th width="129.66666666666666">Name</th><th width="120">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0</code></td><td>uint256</td><td>포지션의 빚진 토큰에 해당하는 token0의 양</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>포지션의 빚진 토큰에 해당하는 token1의 양</td></tr></tbody></table>

#### collect[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#collect) <a href="#collect" id="collect"></a>

```solidity
function collect(
    struct INonfungiblePositionManager.CollectParams params
) external returns (uint256 amount0, uint256 amount1)
```

수령인에게 지불해야 하는 최대 금액의 수수료를 징수합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters-5)

<table><thead><tr><th width="143.66666666666666">Name</th><th width="241">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct INonfungiblePositionManager.CollectParams</code></td><td>calldata에서 CollectParams로 인코딩된 수집에 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#return-values-5)

<table><thead><tr><th width="136.66666666666666">Name</th><th width="138">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0</code></td><td>uint256</td><td>token0에서 징수된 수수료 금액</td></tr><tr><td><code>amount1</code></td><td>uint256</td><td>token1에서 징수된 수수료 금액</td></tr></tbody></table>

#### burn[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#burn) <a href="#burn" id="burn"></a>

```solidity
function burn(uint256 tokenId) external
```

NFT 계약에서 토큰 ID를 삭제하는 토큰 ID를 소각합니다. \
토큰은 유동성이 0이어야 하며 모든 토큰이 먼저 수집되어야 합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters-6)

<table><thead><tr><th width="140.66666666666666">Name</th><th width="134">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>소각되는 토큰의 ID</td></tr></tbody></table>
{% endtab %}
{% endtabs %}


# NonfungibleTokenPositionDescriptor

해당 컨트랙트는 JSON 메타데이터 문자열에 대한 데이터 URI를 포함하는 문자열을 생성합니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress :&#x20;

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

#### UpdateTokenRatioPriority[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungibleTokenPositionDescriptor#updatetokenratiopriority) <a href="#updatetokenratiopriority" id="updatetokenratiopriority"></a>

```solidity
event UpdateTokenRatioPriority(
    address token,
    int256 priority
)
```

표시된 가격 비율에서 토큰에 새로운 우선 순위가 부여될 때 발생합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/INonfungibleTokenPositionDescriptor#parameters-1)

<table><thead><tr><th width="142.66666666666666">Name</th><th width="117">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>token</code></td><td>address</td><td>우선 순위가 부여되는 토큰</td></tr><tr><td><code>priority</code></td><td>int256</td><td>비율로 우선 순위를 나타냅니다. 더 높은 정수가 분자 우선 순위를 갖습니다.</td></tr></tbody></table>
{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

#### tokenURI[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungibleTokenPositionDescriptor#tokenuri) <a href="#tokenuri" id="tokenuri"></a>

```solidity
function tokenURI(
    contract INonfungiblePositionManager positionManager,
    uint256 tokenId
) external returns (string)
```

위치 관리자의 특정 토큰 ID를 설명하는 URI를 생성합니다. 이 URI는 data: JSON 콘텐츠가 직접 인라인된 URI일 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungibleTokenPositionDescriptor#parameters)

<table><thead><tr><th width="132.66666666666666">Name</th><th width="208">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>positionManager</code></td><td><code>contract INonfungiblePositionManager</code></td><td>토큰을 설명할 <code>positionManager</code></td></tr><tr><td><code>tokenId</code></td><td>uint256</td><td>유효하지 않을 수 있는 설명을 생성할 토큰의 ID</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungibleTokenPositionDescriptor#return-values)

<table><thead><tr><th width="132.66666666666666">Name</th><th width="107">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>String</code></td><td>string</td><td>ERC721 호환 메타데이터의 URI</td></tr></tbody></table>

#### flipRatio[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungibleTokenPositionDescriptor#flipratio) <a href="#flipratio" id="flipratio"></a>

```solidity
function flipRatio() public returns (bool)
```

#### tokenRatioPriority[​](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungibleTokenPositionDescriptor#tokenratiopriority) <a href="#tokenratiopriority" id="tokenratiopriority"></a>

```solidity
function tokenRatioPriority() public returns (int256)
```

{% endtab %}
{% endtabs %}


# V3SwapRouter

해당 컨트랙트는 KLAYswap V3에 대한 상태 비저장 스왑 실행을 위한 라우터입니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0x6c14e2e4bae412137437a8ec9e57263212d141a0](https://scope.klaytn.com/account/0x6C14E2e4bae412137437A8Ec9e57263212d141A0?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Parameter Structs" %}

## Parameter Structs

#### ExactInputSingleParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/ISwapRouter#exactinputsingleparams) <a href="#exactinputsingleparams" id="exactinputsingleparams"></a>

```solidity
struct ExactInputSingleParams {
    address tokenIn;
    address tokenOut;
    uint24 fee;
    address recipient;
    uint256 deadline;
    uint256 amountIn;
    uint256 amountOutMinimum;
    uint160 sqrtPriceLimitX96;
}
```

#### ExactInputParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/ISwapRouter#exactinputparams) <a href="#exactinputparams" id="exactinputparams"></a>

```solidity
struct ExactInputParams {
   bytes path;
   address recipient;
   uint256 deadline;
   uint256 amountIn;
   uint256 amountOutMinimum;
}
```

#### ExactOutputSingleParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/ISwapRouter#exactoutputsingleparams) <a href="#exactoutputsingleparams" id="exactoutputsingleparams"></a>

```solidity
struct ExactOutputSingleParams {
    address tokenIn;
    address tokenOut;
    uint24 fee;
    address recipient;
    uint256 deadline;
    uint256 amountOut;
    uint256 amountInMaximum;
    uint160 sqrtPriceLimitX96;
}
```

#### ExactOutputParams[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/ISwapRouter#exactoutputparams) <a href="#exactoutputparams" id="exactoutputparams"></a>

```solidity
struct ExactOutputParams {
    bytes path;
    address recipient;
    uint256 deadline;
    uint256 amountOut;
    uint256 amountInMaximum;
}
```

{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

#### uniswapV3SwapCallback[​](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#uniswapv3swapcallback) <a href="#uniswapv3swapcallback" id="uniswapv3swapcallback"></a>

```solidity
function uniswapV3SwapCallback(
    int256 amount0Delta,
    int256 amount1Delta,
    bytes data
) external
```

IUniswapV3Pool#swap을 통해 스왑을 실행한 후 `msg.sender`에 호출됩니다.&#x20;

구현 시 스왑에 대한 풀 토큰을 지불해야 합니다. 이 메서드의 호출자는 정식 UniswapV3Factory에 의해 배포된 UniswapV3Pool인지 확인해야 합니다. amount0Delta 및 amount1Delta는 교환된 토큰이 없는 경우 모두 0이 될 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#parameters)

<table><thead><tr><th width="174">Name</th><th width="83">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0Delta</code></td><td>int256</td><td>스왑이 끝날 때까지 풀에서 전송되었거나(음수) 받아야 하는(양수) token0의 양입니다. 긍정적인 경우 콜백은 해당 양의 token0을 풀로 보내야 합니다.</td></tr><tr><td><code>amount1Delta</code></td><td>int256</td><td>스왑이 끝날 때까지 풀에서 전송되었거나(음수) 받아야 하는(양수) token1의 양입니다. 긍정적인 경우 콜백은 해당 양의 token1을 풀로 보내야 합니다.</td></tr><tr><td><code>data</code></td><td>bytes</td><td>IUniswapV3Pool Actions#swap 호출을 통해 호출자가 전달한 모든 데이터</td></tr></tbody></table>

#### exactInputSingle[​](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#exactinputsingle) <a href="#exactinputsingle" id="exactinputsingle"></a>

```solidity
function exactInputSingle(
    struct ISwapRouter.ExactInputSingleParams params
) external returns (uint256 amountOut)
```

한 토큰의 `amountIn`을 다른 토큰의 가능한 한 많이 스왑합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#parameters-1)

<table><thead><tr><th width="116.66666666666666">Name</th><th width="203">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct ISwapRouter.ExactInputSingleParams</code></td><td>calldata에서 ExactInputSingleParams로 인코딩된 스왑에 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#return-values)

<table><thead><tr><th width="147.66666666666666">Name</th><th width="133">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountOut</code></td><td>uint256</td><td>받은 토큰의 양</td></tr></tbody></table>

#### exactInput[​](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#exactinput) <a href="#exactinput" id="exactinput"></a>

```solidity
function exactInput(
    struct ISwapRouter.ExactInputParams params
) external returns (uint256 amountOut)
```

지정된 경로를 따라 한 토큰의 `amountIn`을 가능한 한 다른 토큰으로 교환합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#parameters-2)

<table><thead><tr><th width="121.66666666666666">Name</th><th width="197">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct ISwapRouter.ExactInputParams</code></td><td>calldata에서 ExactInputParams로 인코딩된 다중 홉 스왑에 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#return-values-1)

<table><thead><tr><th width="157.66666666666666">Name</th><th width="123">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountOut</code></td><td>uint256</td><td>받은 토큰의 양</td></tr></tbody></table>

#### exactOutputSingle[​](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#exactoutputsingle) <a href="#exactoutputsingle" id="exactoutputsingle"></a>

```solidity
function exactOutputSingle(
    struct ISwapRouter.ExactOutputSingleParams params    
) external returns (uint256 amountIn)
```

다른 토큰의 `amountOut`에 대해 하나의 토큰을 가능한 한 적게 스왑합니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#parameters-3)

<table><thead><tr><th width="113.66666666666666">Name</th><th width="225">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct ISwapRouter.ExactOutputSingleParams</code></td><td>calldata에서 ExactOutputSingleParams로 인코딩된 스왑에 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#return-values-2)

<table><thead><tr><th width="137.66666666666666">Name</th><th width="100">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountIn</code></td><td>uint256</td><td>입력 토큰의 양</td></tr></tbody></table>

#### exactOutput[​](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#exactoutput) <a href="#exactoutput" id="exactoutput"></a>

```solidity
function exactOutput(
    struct ISwapRouter.ExactOutputParams params
) external returns (uint256 amountIn)
```

지정된 경로를 따라 다른 토큰의 `amountOut`에 대해 가능한 한 적은 토큰을 교환합니다(반전됨).

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#parameters-4)

<table><thead><tr><th width="130.66666666666666">Name</th><th width="199">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct ISwapRouter.ExactOutputParams</code></td><td>calldata에서 ExactOutputParams로 인코딩된 다중 홉 스왑에 필요한 매개변수</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/SwapRouter#return-values-3)

<table><thead><tr><th width="140.66666666666666">Name</th><th width="114">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountIn</code></td><td>uint256</td><td>입력 토큰의 양</td></tr></tbody></table>
{% endtab %}
{% endtabs %}


# V3Migrator

이 컨트랙트를 통해 KLAYswap v2 풀에서 KLAYswap v3 풀로 유동성을 마이그레이션할 수 있습니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0x689d8eA1BD4e02B9E9caD9dCc871a050Ff923593](https://scope.klaytn.com/account/0x689d8eA1BD4e02B9E9caD9dCc871a050Ff923593?tabId=txList)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Parameter Structs" %}

## Parameter Structs

#### MigrateParams <a href="#migrate" id="migrate"></a>

```solidity
struct MigrateParams {
    address pair; // the KLAYswap v2 pair
    uint256 liquidityToMigrate; // expected to be balanceOf(msg.sender)
    uint8 percentageToMigrate; // represented as a numerator over 100
    address token0;
    address token1;
    uint24 fee;
    int24 tickLower;
    int24 tickUpper;
    uint256 amount0Min; // must be discounted by percentageToMigrate
    uint256 amount1Min; // must be discounted by percentageToMigrate
    address recipient;
    uint256 deadline;
    bool refundAsETH;
}
```

{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

#### migrate[​](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/IV3Migrator#migrate) <a href="#migrate" id="migrate"></a>

```solidity
function migrate(
    struct IV3Migrator.MigrateParams params
) external
```

v2 유동성을 소각하고 v3에 대한 새 위치를 생성하여 유동성을 v3로 마이그레이션합니다.&#x20;

슬리피지 보호는 `amount{0,1}Min`을 통해 적용되며, 이는 v2 유동성이 얻을 수 있는 최대 v3 유동성의 예상 값을 할인해야 합니다. 범위를 벗어난 위치로 이동하는 특별한 경우의 경우 `amount{0,1}Min`을 0으로 설정하여 위치가 범위를 벗어나도록 강제할 수 있습니다.

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/interfaces/IV3Migrator#parameters)

<table><thead><tr><th width="118.66666666666666">Name</th><th width="177">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>params</code></td><td><code>struct IV3Migrator.MigrateParams</code></td><td>calldata에서 MigrateParams로 인코딩된 v2 유동성을 마이그레이션하는 데 필요한 매개변수</td></tr></tbody></table>
{% endtab %}
{% endtabs %}


# V3Estimator

해당 컨트랙트는 v3 스왑 금액을 추정합니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0x09067f1b4E1a1CD08C91519D811F3D04c69a5a5f](https://scope.klaytn.com/account/0x09067f1b4E1a1CD08C91519D811F3D04c69a5a5f?tabId=internalTx)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Read-Only Functions" %}

## Read-Only Functions

**estimatePos**

```solidity
function estimatePos(
    struct IUniswapV3Pool pool, 
    address token, 
    uint256 amountIn
) external view returns (
    uint256 amountOut, 
    uint160 sqrtPriceX96After
)
```

**Parameters:**

<table><thead><tr><th width="134.66666666666666">Name</th><th width="178">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>pool</code></td><td><code>contract IUniswapV3Pool</code></td><td>풀 주소</td></tr><tr><td><code>token</code></td><td>address</td><td>교환되는 토큰</td></tr><tr><td><code>amountIn</code></td><td>uint256</td><td>원하는 투입량</td></tr></tbody></table>

[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters)**Return Values:**

<table><thead><tr><th width="219.66666666666666">Name</th><th width="101">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountOut</code></td><td>uint256</td><td>받을 토큰의 양</td></tr><tr><td><code>sqrtPriceX96After</code></td><td>uint160</td><td>스왑 후 sqrt 가격</td></tr></tbody></table>

**estimateNeg**

```solidity
function estimateNeg(
    contract IUniswapV3Pool pool, 
    address token, 
    uint256 amountOut
) external view returns (
    uint256 amountIn, 
    uint160 sqrtPriceX96After
)
```

**Parameters:**

<table><thead><tr><th width="145.66666666666666">Name</th><th width="178">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>pool</code></td><td><code>contract IUniswapV3Pool</code></td><td>풀 주소</td></tr><tr><td><code>token</code></td><td>address</td><td>교환되어 받을토큰</td></tr><tr><td><code>amountOut</code></td><td>uint256</td><td>원하는 출력량</td></tr></tbody></table>

[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters)**Return Values:**

<table><thead><tr><th width="219.66666666666666">Name</th><th width="101">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountIn</code></td><td>uint256</td><td><code>amountOut</code>을 받기 위해 스왑에 대한 입력으로 필요한 금액</td></tr><tr><td><code>sqrtPriceX96After</code></td><td>uint160</td><td>스왑 후 sqrt 가격</td></tr></tbody></table>

**estimate**

```solidity
function estimate(
    contract IUniswapV3Pool pool,
    bool zeroForOne,
    int256 amountSpecified
) public view returns (int256 amount0, int256 amount1, uint160 sqrtPriceX96After) {
```

**Parameters:**

<table><thead><tr><th width="202.66666666666666">Name</th><th width="178">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>pool</code></td><td><code>contract IUniswapV3Pool</code></td><td>풀 주소</td></tr><tr><td><code>zeroForOne</code></td><td>bool</td><td>스왑 방향이 0 -> 1인지?</td></tr><tr><td><code>amountSpecified</code></td><td>int256</td><td>지정된 양의 토큰</td></tr></tbody></table>

[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters)**Return Values:**

<table><thead><tr><th width="219.66666666666666">Name</th><th width="101">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amount0</code></td><td>int256</td><td>변경된 token0 수량</td></tr><tr><td><code>amount1</code></td><td>int256</td><td>변경된 token1 수량</td></tr><tr><td><code>sqrtPriceX96After</code></td><td>uint160</td><td>스왑 후 sqrt 가격</td></tr></tbody></table>

[**​**](https://docs.uniswap.org/contracts/v3/reference/core/UniswapV3Pool#parameters)
{% endtab %}
{% endtabs %}


# PositionMigrator

해당 컨트랙트는 V3 포지션을 마이그레이션합니다. 이 컨트랙트는 포지션에 예치된 자산을 예치하고 새로운 포지션에 예치하는 데 도움이 됩니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0xb43879a835FD2097515b7B5C6c549929F1666bFc](https://scope.klaytn.com/account/0xb43879a835FD2097515b7B5C6c549929F1666bFc?tabId=internalTx)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**MigratePosition**

```solidity
event MigratePosition(
    address user, 
    address token0, 
    address token1, 
    uint24 fee, 
    uint256 burnId, 
    uint256 mintId
)
```

**Parameters:**

<table><thead><tr><th width="134.66666666666666">Name</th><th width="128">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>user</code></td><td>address</td><td>user 주소</td></tr><tr><td><code>token0</code></td><td>address</td><td>token0 주소</td></tr><tr><td><code>token1</code></td><td>address</td><td>token1 주소</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>fee </td></tr><tr><td><code>burnId</code></td><td>uint256</td><td>migrate 한 포지션의 tokenId</td></tr><tr><td><code>mintId</code></td><td>uint256</td><td>새로 발급된 포지션의 tokenId</td></tr></tbody></table>

**Zap**

```solidity
event Zap(
    address user, 
    address token0, 
    address token1, 
    uint24 fee, 
    uint256 amount, 
    bool zeroForOne, 
    uint256 tokenId
)
```

**Parameters:**

<table><thead><tr><th width="160.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>user</code></td><td>address</td><td>user 주소</td></tr><tr><td><code>token0</code></td><td>address</td><td>token0 주소</td></tr><tr><td><code>token1</code></td><td>address</td><td>token1 주소</td></tr><tr><td><code>fee</code></td><td>uint24</td><td>fee </td></tr><tr><td><code>amount</code></td><td>uint256</td><td>예치할 amount</td></tr><tr><td><code>zeroForOne</code></td><td>bool</td><td>token0으로 예치시  : <code>true</code><br>token1으로 예치시   : <code>false</code></td></tr><tr><td><code>tokenId</code></td><td>uint256</td><td>새로 발급된 포지션의 tokenId</td></tr></tbody></table>

1
{% endtab %}

{% tab title="Parameter Structs" %}

## Parameter Struct

**MigrationParams**

```solidity
struct MigrationParams {
    uint256 tokenId;
    // Burn
    uint256 burnAmount0Min;
    uint256 burnAmount1Min;
    // Swap
    address tokenIn;
    uint256 swapAmountIn;
    uint256 swapAmountOutMin;
    // Mint
    int24 tickLower;
    int24 tickUpper;
    uint256 mintAmount0Min;
    uint256 mintAmount1Min;
    uint256 deadline;
    bool compoundFee;
}
```

**Parameters:**

<table><thead><tr><th width="211.66666666666666">Name</th><th width="103">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>tokenId</code></td><td>uint256</td><td>Migrate 할tokenId</td></tr><tr><td><code>burnAmount0Min</code></td><td>uint256</td><td>인출시 받게될 token0의 최소값</td></tr><tr><td><code>burnAmount1Min</code></td><td>uint256</td><td>인출시 받게될 token0의 최소값</td></tr><tr><td><code>tokenIn</code></td><td>address</td><td>교환할 token의 주소</td></tr><tr><td><code>swapAmountIn</code></td><td>uint256</td><td>교환할 token amount</td></tr><tr><td><code>swapAmountOutMin</code></td><td>uint256</td><td>교환으로 받게될 token의 최소값</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>새로 예치할 포지션의 최소 tick</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>새로 예치할 포지션의 최대 tick</td></tr><tr><td><code>mintAmount0Min</code></td><td>uint256</td><td>새로 예치할 포지션에서 예치될 token0 최소값</td></tr><tr><td><code>mintAmount1Min</code></td><td>uint256</td><td>새로 예치할 포지션에서 예치될 token1 최소값</td></tr><tr><td><code>deadline</code></td><td>uint256</td><td>deadline</td></tr><tr><td><code>compoundFee</code></td><td>bool</td><td>fee를 누적하여 예치할 지 여부</td></tr></tbody></table>

**ZappingParams**

```solidity
struct ZappingParams {
    contract IUniswapV3Pool pool;
    uint256 amount;
    int24 tickLower;
    int24 tickUpper;
    bool zeroForOne;
    uint256 mintAmount0Min;
    uint256 mintAmount1Min;
    uint256 tokenId;    
    uint256 deadline;
}
```

**Parameters:**

<table><thead><tr><th width="211.66666666666666">Name</th><th width="135">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>pool</code></td><td><code>contract IUniswapV3Pool</code></td><td>예치할 pool 주소</td></tr><tr><td><code>amount</code></td><td>uint256</td><td>예치할 token amount</td></tr><tr><td><code>tickLower</code></td><td>int24</td><td>새로 예치할 포지션의 최소 tick</td></tr><tr><td><code>tickUpper</code></td><td>int24</td><td>새로 예치할 포지션의 최대 tick</td></tr><tr><td><code>zeroForOne</code></td><td>bool</td><td>예치할 token이 token0인지 여부</td></tr><tr><td><code>mintAmount0Min</code></td><td>uint256</td><td>예치할 포지션에서 예치될 token0 최소값</td></tr><tr><td><code>mintAmount1Min</code></td><td>uint256</td><td>예치할 포지션에서 예치될 token1 최소값</td></tr><tr><td><code>tokenId</code></td><td>uint256</td><td>Zap 으로 예치할 tokenId<br>첫 예치시 '0'</td></tr><tr><td><code>deadline</code></td><td>uint256</td><td>deadline</td></tr></tbody></table>
{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**migrate**

```solidity
function migrate(
    struct MigrationParams calldata params
) external
```

포지션에 예치된 자산을 예치하고 새로운 포지션에 예치합니다.

**zapWithETH**

```solidity
function zapWithETH(
    struct ZappingParams memory params
) external
```

ETH로 풀에 입금할 수 있도록 도와주는 기능

**zapWithToken**

```solidity
function zapWithToken(
    struct ZappingParams memory params
) external 
```

하나의 자산 토큰으로 풀에 입금할 수 있도록 도와주는 기능
{% endtab %}
{% endtabs %}


# V3Treasury

해당 컨트랙트는 V3 풀 에어드랍 운영을 관리합니다. 권한을 가진 운영자는 V3Treasury 계약을 통해 에어드롭을 설정하고 실행할 수 있습니다. Airdrop은 token0과 token1만 가능합니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0x3E8477f4D81090FA55af350C7d31819eeD2dC293](https://scope.klaytn.com/account/0x3E8477f4D81090FA55af350C7d31819eeD2dC293?tabId=internalTx)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Events" %}

## Events

**DeployAirdropOperator**

```solidity
event DeployAirdropOperator(address operator);
```

{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**deployAirdropOperator**

```solidity
function deployAirdropOperator(
    address token, 
    address pool
) external returns (
    address operator
)
```

**Parameters:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters)

<table><thead><tr><th width="139.66666666666666">Name</th><th width="109">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>token</code></td><td>address</td><td>에어드랍 할 토큰 주소</td></tr><tr><td><code>pool</code></td><td>address</td><td>에어드랍할 풀 주소</td></tr></tbody></table>

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters)

<table><thead><tr><th width="139.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>operator</code></td><td>address</td><td>V3AirdropOperator이 배포된 주소</td></tr></tbody></table>
{% endtab %}
{% endtabs %}


# V3AirdropOperator

해당 컨트랙트는 각 에어드롭을 운영합니다. 에어드랍되는 LP와 토큰은 생성 시점에 결정되며 수정할 수 없습니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Read-Only Functions" %}

## Read-Only Functions

**getAirdropStat**

```solidity
function getAirdropStat() external view returns (
    uint256 totalAmount,
    uint256 blockAmount,
    uint256 distributableBlock,
    uint256 endBlock,
    uint256 distributed,
    uint256 remain,
    bool created
) 
```

**Return Values:**

<table><thead><tr><th width="239.66666666666663">Name</th><th width="107">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>totalAmount</code></td><td>uint256</td><td>에어드랍 총 물량</td></tr><tr><td><code>blockAmount</code></td><td>uint256</td><td>블록당 에어드랍된 토큰의 양</td></tr><tr><td><code>distributableBlock</code></td><td>uint256</td><td>에어드랍가능한 블록의 블록 번호</td></tr><tr><td><code>endBlock</code></td><td>uint256</td><td>에어드랍 종료되는 블록 번호</td></tr><tr><td><code>distributed</code></td><td>uint256</td><td>현재 분배된 양</td></tr><tr><td><code>remain</code></td><td>uint256</td><td>남아있는 양</td></tr><tr><td><code>created</code></td><td>bool</td><td>초기화되었는지 여부</td></tr></tbody></table>

**getDistributionId**

```solidity
function getDistributionId() public view returns (bytes32 id)
```

**Return Values:**[**​**](https://docs.uniswap.org/contracts/v3/reference/periphery/NonfungiblePositionManager#parameters)

<table><thead><tr><th width="119.66666666666666">Name</th><th width="116">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>id</code></td><td>bytes32</td><td>에어드랍 ID</td></tr></tbody></table>
{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**changeNextOwner**

```solidity
function changeNextOwner(address _nextOwner) external
```

**changeOwner**

```solidity
function changeOwner() external
```

**createDistribution**

```solidity
function createDistribution(
    uint256 totalAmount,
    uint256 blockAmount,
    uint256 startBlock
) external
```

**Parameters:**

<table><thead><tr><th width="175.66666666666666">Name</th><th width="102">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>totalAmount</code></td><td>uint256</td><td>Total number of tokens to be distributed by airdrop</td></tr><tr><td><code>blockAmount</code></td><td>uint256</td><td>Token quantity to be distributed per block</td></tr><tr><td><code>startBlock</code></td><td>uint256</td><td>Airdrop start block number</td></tr></tbody></table>

**deposit**

```solidity
function deposit(uint256 amount) external
```

If there is an issue of token exhaustion or extension during the airdrop process, tokens can be recharged using the AirdropOperator's Deposit function.

* When executing the function, transfer more than the amount of tokens entered into the wallet.
* The token specified when creating the operator is charged.
* When recharging due to exhaustion, it will be applied from the block after recharging.

**refixBlockAmount**

```solidity
function refixBlockAmount(uint256 blockAmount) external
```

* Modify the amount of tokens distributed per block
* It is applied from the block after the transaction is executed.

**withdraw**

```solidity
function withdraw(address _token) external
```

* The remaining tokens can be withdrawn after the Airdrop plan is in progress.
* Withdrawal will be made to the owner's account.
  {% endtab %}
  {% endtabs %}


# UniversalRouter

해당 컨트랙트는 V2 및 V3 풀을 사용하는 KLAYswap 라우터입니다. 이 계약은 V2 및 V3 풀에서 거래를 집계하여 사용자가 매우 유연하고 개인화된 거래에 액세스할 수 있도록 합니다.

## Code

Github Link: (Will be updated after official launch)<br>

## Address

* Cypress : [0xe0fbB27D0E7F3a397A67a9d4864D4f4DD7cF8cB9](https://scope.klaytn.com/account/0xe0fbB27D0E7F3a397A67a9d4864D4f4DD7cF8cB9?tabId=internalTx)

## Events, Read-Only Functions, and State-Changing Functions

{% tabs %}
{% tab title="Parameter Structs" %}

## Parameter Structs

**SwapParams**

```solidity
struct SwapParams {
    address to;
    address[] path;
    address[] pool;
    uint deadline;
}
```

**Parameters:**

<table><thead><tr><th width="142.66666666666663">Name</th><th width="107">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>to</code></td><td>address</td><td>교환 후 토큰을 받게 될 주소</td></tr><tr><td><code>path</code></td><td>address[]</td><td>스왑 경로(토큰 주소 목록)</td></tr><tr><td><code>pool</code></td><td>address[]</td><td>스왑의 풀 경로(풀 주소 목록) <br>v2 pool 사용 시 : <code>address(0)</code> <br>v3 pool 사용 시 : <code>v3 풀 주소</code></td></tr><tr><td><code>deadline</code></td><td>uint256</td><td>deadline</td></tr></tbody></table>
{% endtab %}

{% tab title="Read-Only Functions" %}

## Read-Only Functions

**getAmountsOut**

```solidity
function getAmountsOut(
    uint256 amountIn, 
    address[] memory path, 
    address[] memory pool
) public view returns (
    uint256[] memory amounts
)
```

**Parameters:**

<table><thead><tr><th width="142.66666666666663">Name</th><th width="107">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountIn</code></td><td>uint256</td><td>지불해야 하는 첫 번째 토큰의 양</td></tr><tr><td><code>path</code></td><td>address[]</td><td>스왑 경로(토큰 주소 목록)</td></tr><tr><td><code>pool</code></td><td>address[]</td><td>스왑의 풀 경로(풀 주소 목록) <br>v2 pool 사용 시 : <code>address(0)</code> <br>v3 pool 사용 시 : <code>v3 풀 주소</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>

**getAmountsIn**

```solidity
function getAmountsIn(
    uint256 amountOut, 
    address[] memory path, 
    address[] memory pool
) public view returns (
    uint256[] memory amounts
)
```

**Parameters:**

<table><thead><tr><th width="147.66666666666666">Name</th><th width="107">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountOut</code></td><td>uint256</td><td>마지막으로 받을 토큰의 양</td></tr><tr><td><code>path</code></td><td>address[]</td><td>스왑 경로(토큰 주소 목록)</td></tr><tr><td><code>pool</code></td><td>address[]</td><td>스왑의 풀 경로(풀 주소 목록) <br>v2 pool 사용 시 : <code>address(0)</code> <br>v3 pool 사용 시 : <code>v3 풀 주소</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>
{% endtab %}

{% tab title="State-Changing Functions" %}

## **State-Changing Functions**

**swapExactTokensForTokens**

```solidity
function swapExactTokensForTokens(
    uint256 amountIn, 
    uint256 amountOutMin, 
    struct SwapParams calldata p
) external returns (uint256[] memory amounts)
```

경로에 의해 결정된 경로를 따라 가능한 한 많은 출력 토큰에 대해 정확한 양의 입력 토큰을 교환합니다.

**Parameters:**

<table><thead><tr><th width="142.66666666666663">Name</th><th width="142">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountIn</code></td><td>uint256</td><td>지불할 입력 토큰의 양</td></tr><tr><td><code>amountOutMin</code></td><td>uint256</td><td>트랜잭션이 되돌리지 않기 위해 받아야 하는 출력 토큰의 최소량</td></tr><tr><td><code>p</code></td><td><code>struct SwapParams</code> </td><td>스왑을 위한 <code>struct SwapParams</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>

**swapTokensForExactTokens**

```solidity
function swapTokensForExactTokens(
    uint256 amountOut, 
    uint256 amountInMax, 
    struct SwapParams calldata p
) external returns (uint256[] memory amounts)
```

경로에 의해 결정된 경로를 따라 가능한 한 적은 입력 토큰에 대해 정확한 양의 출력 토큰을 받습니다.

**Parameters:**

<table><thead><tr><th width="169.66666666666663">Name</th><th width="142">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountOut</code></td><td>uint256</td><td>받을 출력 토큰의 양</td></tr><tr><td><code>amountInMax</code></td><td>uint256</td><td>트랜잭션이 되돌리기 전에 필요할 수 있는 입력 토큰의 최대 양</td></tr><tr><td><code>p</code></td><td><code>struct SwapParams</code> </td><td>스왑을 위한 <code>struct SwapParams</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>

**swapExactETHForTokens**

```solidity
function swapExactETHForTokens(
    uint256 amountOutMin, 
    struct SwapParams calldata p
) external payable returns (uint256[] memory amounts)
```

경로에 의해 결정된 경로를 따라 가능한 한 많은 출력 토큰에 대해 정확한 양의 ETH를 교환합니다.

**Parameters:**

<table><thead><tr><th width="173.66666666666663">Name</th><th width="142">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>msg.value</code></td><td>uint256</td><td>지불할 ETH 금액</td></tr><tr><td><code>amountOutMin</code></td><td>uint256</td><td>트랜잭션이 되돌리지 않기 위해 받아야 하는 출력 토큰의 최소량</td></tr><tr><td><code>p</code></td><td><code>struct SwapParams</code> </td><td>스왑을 위한 <code>struct SwapParams</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>

**swapTokensForExactETH**

```solidity
function swapTokensForExactETH(
    uint256 amountOut, 
    uint256 amountInMax, 
    struct SwapParams calldata p
) external returns (uint256[] memory amounts)
```

경로에 의해 결정된 경로를 따라 가능한 한 적은 입력 토큰에 대해 정확한 양의 ETH를 받습니다.

**Parameters:**

<table><thead><tr><th width="173.66666666666663">Name</th><th width="142">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountOut</code></td><td>uint256</td><td>받을 ETH 금액</td></tr><tr><td><code>amountInMax</code></td><td>uint256</td><td>트랜잭션이 되돌리기 전에 필요할 수 있는 입력 토큰의 최대 양</td></tr><tr><td><code>p</code></td><td><code>struct SwapParams</code> </td><td>스왑을 위한 <code>struct SwapParams</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>

**swapExactTokensForETH**

```solidity
function swapExactTokensForETH(
    uint256 amountIn, 
    uint256 amountOutMin, 
    struct SwapParams calldata p
) external returns (uint256[] memory amounts)
```

경로에 의해 결정된 경로를 따라 가능한 한 많은 ETH에 대해 정확한 양의 토큰을 스왑합니다.

**Parameters:**

<table><thead><tr><th width="173.66666666666663">Name</th><th width="142">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountIn</code></td><td>uint256</td><td>지불할 입력 토큰의 양</td></tr><tr><td><code>amountOutMin</code></td><td>uint256</td><td>트랜잭션이 되돌리지 않기 위해 받아야 하는 출력 토큰의 최소량</td></tr><tr><td><code>p</code></td><td><code>struct SwapParams</code> </td><td>스왑을 위한 <code>struct SwapParams</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>

**swapETHForExactTokens**

```solidity
function swapETHForExactTokens(
    uint256 amountOut,
    struct SwapParams calldata p
) external payable returns (uint256[] memory amounts)
```

경로에 의해 결정된 경로를 따라 가능한 한 많은 ETH에 대해 정확한 양의 토큰을 스왑합니다.

**Parameters:**

<table><thead><tr><th width="173.66666666666663">Name</th><th width="142">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amountOut</code></td><td>uint256</td><td>받을 토큰의 양</td></tr><tr><td><code>msg.value</code> (amountInMax)</td><td>uint256</td><td>트랜잭션을 되돌리기 전에 요구할 수 있는 최대 ETH 금액</td></tr><tr><td><code>p</code></td><td><code>struct SwapParams</code> </td><td>스왑을 위한 <code>struct SwapParams</code></td></tr></tbody></table>

**Return Values:**

<table><thead><tr><th width="129.66666666666666">Name</th><th width="115">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>amounts</code></td><td>uint256[]</td><td>입력 토큰 금액 및 모든 후속 출력 토큰 금액.</td></tr></tbody></table>

{% endtab %}
{% endtabs %}


# Airdrop

Airdrop 은 Exchange 컨트랙트의 giveReward 함수가 호출될 때 Treasury에 저장된 Airdrop 계약들을 \
확인하여 유동성 공급자에게 토큰을 분배하게 됩니다.

\
**AirdropOperator**

* Airdrop 계획을 수립, 권한을 보유한 Contract

**Treasury**

* Airdrop 에 사용될 자산을 관리하는 Contract


# Airdrop Operator 권한 획득

## 1. Contract Deploy

{% tabs %}
{% tab title="Deploy Guide" %}

* **Airdrop 진행할 LP와 Token은 생성 시 정해지며 수정이 불가능합니다.**
* **Contract가 Public 환경에 배포되었는지 확인해주세요**.
* Owner 계정의 보안에 유의해주세요.
* Klaytn 의 Smart contract deploy 는 [여기](https://scope.klaytn.com/contract/submission) 를 참고해주세요.
* KLAY를 Airdrop Token으로 사용할 경우 Token Address는`0x0000000000000000000000000000000000000000` 로 설정해야 합니다.
  {% endtab %}

{% tab title="AirdropOperator Smart Contract Code" %}

```
pragma solidity 0.5.6;

interface IKIP7 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function decimals() external view returns (uint8);
}

interface DistributionLike {
    function estimateEndBlock() external view returns (uint);
    function totalAmount() external view returns (uint);
    function blockAmount() external view returns (uint);
    function distributableBlock() external view returns (uint);
    function distribution() external view returns (uint);
    function targetEntries(uint) external view returns (address);
    function targetCount() external view returns (uint);
    function distributionRate(address) external view returns (uint);
}

interface TreasuryLike {
    function fee() external view returns (uint);
    function validOperator(address) external view returns (bool);
    function distributions(address, address) external view returns (address);
    function createKlayDistribution(uint, uint, address[] calldata, uint[] calldata) external payable;
    function createTokenDistribution(address, uint, uint, uint, address[] calldata, uint[] calldata) external;
    function depositKlay() external payable;
    function depositToken(address, uint) external;
    function refixBlockAmount(address, uint) external;
    function refixDistributionRate(address, address[] calldata, uint[] calldata) external;
}

interface FactoryLike {
    function poolExist(address) external view returns (bool);
}

contract Operator {
    address constant public treasury = 0x29990aaF04f3D5Ac7d8C88beab1A009C1Ab4936e;
    address constant public ksp = 0xC6a2Ad8cC6e4A7E08FC37cC5954be07d499E7654;

    address public owner;
    address public nextOwner;
    address public token;
    address public lp;

    constructor(address _token, address _lp) public {
        owner = msg.sender;

        token = _token;
        if(token != address(0)) require(IKIP7(token).decimals() != 0);

        lp = _lp;
        require(FactoryLike(ksp).poolExist(lp));
    }

    function version() external pure returns (string memory) {
        return "AirdropOperator20210824";
    }

    // valid fallback
    function () payable external { }

    // ======================= owner method ===========================

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function changeNextOwner(address _nextOwner) public onlyOwner {
        nextOwner = _nextOwner;
    }

    function changeOwner() public {
        require(msg.sender == nextOwner);

        owner = nextOwner;
        nextOwner = address(0);
    }

    //withdraw tokens remaining in the operator contract
    function withdraw(address tokenAddr) public onlyOwner {
        uint balance = 0;
        if(tokenAddr == address(0)){
            balance = (address(this)).balance;
            if(balance > 0){
                (bool res, ) = owner.call.value(balance)("");
                require(res);
            }
        }
        else{
            balance = IKIP7(tokenAddr).balanceOf(address(this));
            if(balance > 0){
                require(IKIP7(tokenAddr).transfer(owner, balance));
            }
        }
    }

    // ====================== Stat ====================================

    function getAirdropStat() public view returns (
        address distributionContract, // airdrop distribution contract address
        uint totalAmount, // Total amount of tokens to be distributed
        uint blockAmount, // Amount of tokens to be distributed per block
        uint distributableBlock, // Block number to airdrop start
        uint endBlock, // Block number to airdrop end
        uint distributed,  // Amount of tokens distributed
        uint remain, // amount remaining in the contract 
        uint targetCount, // airdrop target LP count
        address[] memory targets, // airdrop target LP list
        uint[] memory rates // airdrop target lp rate list
    ){
        distributionContract = TreasuryLike(treasury).distributions(address(this), token);

        DistributionLike dis = DistributionLike(distributionContract);
        totalAmount = dis.totalAmount();
        blockAmount = dis.blockAmount();
        distributableBlock = dis.distributableBlock();
        endBlock = dis.estimateEndBlock();
        distributed = dis.distribution();
        if(token == address(0)){
            remain = (distributionContract).balance;
        }
        else{
            remain = IKIP7(token).balanceOf(distributionContract);
        }

        targetCount = dis.targetCount();
        targets = new address[](targetCount);
        rates = new uint[](targetCount);

        for(uint i = 0; i < targetCount; i++){
            targets[i] = dis.targetEntries(i);
            rates[i] = dis.distributionRate(targets[i]);
        }
    }

    // ===================== Airdrop method ===========================
    ///@param totalAmount : Total amount of tokens to be distributed
    ///@param blockAmount : Amount of tokens to be distributed per block
    ///@param startBlock  : Block number to airdrop start
    function createDistribution(
        uint totalAmount,
        uint blockAmount,
        uint startBlock
    ) public onlyOwner {
        TreasuryLike Treasury = TreasuryLike(treasury);

        require(Treasury.validOperator(address(this)));
        require(Treasury.distributions(address(this), token) == address(0));
        require(startBlock >= block.number);

        address[] memory targets = new address[](1);
        targets[0] = lp;

        uint[] memory rates = new uint[](1);
        rates[0] = 100;

        if(Treasury.fee() > 0){
            require(IKIP7(ksp).balanceOf(address(this)) >= Treasury.fee());
            require(IKIP7(ksp).approve(treasury, Treasury.fee()));
        }

        if(token == address(0)){
            require((address(this)).balance >= totalAmount);
            Treasury.createKlayDistribution.value(totalAmount)(blockAmount, startBlock, targets, rates);
        }
        else {
            require(IKIP7(token).balanceOf(address(this)) >= totalAmount);
            require(IKIP7(token).approve(treasury, totalAmount));
            Treasury.createTokenDistribution(token, totalAmount, blockAmount, startBlock, targets, rates);
        }
    }

    // Airdrop token deposit
    ///@param amount : Amount of airdrop token to deposit
    function deposit(uint amount) public onlyOwner {
        TreasuryLike Treasury = TreasuryLike(treasury);

        require(Treasury.validOperator(address(this)));
        require(Treasury.distributions(address(this), token) != address(0));
        require(amount != 0);

        if(token == address(0)){
            require((address(this)).balance >= amount);
            Treasury.depositKlay.value(amount)();
        }
        else{
            require(IKIP7(token).balanceOf(address(this)) >= amount);
            require(IKIP7(token).approve(treasury, amount));
            Treasury.depositToken(token, amount);
        }
    }

    // Airdrop amount per block modification function 
    // The function is applied immediately from the called block 
    ///@param blockAmount : airdrop block amount to change
    function refixBlockAmount(uint blockAmount) public onlyOwner {
        TreasuryLike Treasury = TreasuryLike(treasury);

        require(Treasury.validOperator(address(this)));
        require(Treasury.distributions(address(this), token) != address(0));
        require(blockAmount != 0);

        Treasury.refixBlockAmount(token, blockAmount);
    }
}

```

{% endtab %}
{% endtabs %}

## 2. Contract Submission

* [Klaytnscope Contract Submission](https://scope.klaytn.com/contract/submission)

## 3. ValidOperator Request

* &#x20;Operator 등록요청 (<support@klayswap.com>)&#x20;
* Public AirdropOperator Code로 배포된 contract 확인 과정 후 Valid Operator 설정&#x20;


# Airdrop 계획 진행

Airdrop Operator 권한을 획득한 Contract 는 생성 시 정한 유동성 풀과 토큰을 이용해 Airdrop을 시작할 수 있습니다.&#x20;

{% hint style="warning" %}

1. Amount 설정 시 사용되는 단위는 Decimal이 포함된 단위입니다.

   예) KLAY 10개 = 10 \* (10^18) = 10000000000000000000
2. KLAY를 Airdrop Token으로 설정 시 \
   zero address(`0x0000000000000000000000000000000000000000`)로 설정해야 합니다.
3. Airdrop 설정은 Contract 마다 1개의 LP, 1개의 Token 만 설정 가능하므로 다른 LP 혹은 다른 Token 설정 시 새로운 Airdrop Contract를 배포해야 합니다.&#x20;
   {% endhint %}

### Airdrop 수수료&#x20;

* Airdrop 생성에는 일정량의 KSP가 필요할 수 있습니다.&#x20;
* KSP 수수료가 있다면 생성 전 필요한 KSP를 Operator에 전송해야 합니다.

### Airdrop 생성

AirdropOperator Contract의 createDistribution 함수를 실행합니다.

* Valid Operator 권한 획득 후 진행해야 합니다.&#x20;
* 필요한 토큰의 수량과 수수료는 Contract에 Deposit이 아닌 Transfer 해두어야 합니다.&#x20;
* Request Parameters
  * totalAmount : Airdrop으로 분배할 총 Token 수량
  * blockAmount : 블럭마다 분배할 Token 수량
  * startBlock : Airdrop 시작 Block 번호

```
function createDistribution(
    uint totalAmount,
    uint blockAmount,
    uint startBlock,
) public
```

### Airdrop Token 충전

Airdrop 진행 중 Token 소진, 연장의 이슈가 있어 Token이 부족하다면 AirdropOperator Contract의  Deposit 함수로 토큰을 충전할 수 있습니다.

* 함수 실행 시 지갑에 입력한 amount 이상의 토큰을 Transfer 해두어 합니다.
* Operator 생성 시에 지정한 Token을 충전합니다.
* 물량 소진으로 재 충전 시, 충전 이후 Block 부터 적용됩니다.

```
function deposit(uint amount) public
```

### Airdrop 수정

* 블럭 당 분배되는 토큰의 양을 수정합니다
* Transaction이 실행된 다음 Block부터 적용됩니다.

```
function refixBlockAmount(uint blockAmount) public
```

### **Airdrop 토큰 출금**

* Airdrop 계획 진행 후 남아있는 토큰을 출금할 수 있습니다.
* Owner 계정으로 출금됩니다.

```
function withdraw(address tokenAddr) public
```


# EcoPot

EcoPot의 분배 계획과 EcoPotVoting 컨트랙트의 스테이킹 유저 EcoPot 지분율에 따라 토큰을 분배하게 됩니다.&#x20;

EcoPotOperator

* EcoPot 계획을 수립, 권한을 보유한 Contract

EcoPot

* EcoPot 계획과 사용될 자산을 관리하는 Contract   &#x20;


# EcoPot Operator 권한 획득

## 1. Contract Deploy

{% tabs %}
{% tab title="Deploy Guide" %}

* **EcoPot 진행할 Token과 Project Name  생성시 정해지며 수정이 불가능합니다.**
* **Contract가 Public 환경에 배포되었는지 확인해주세요**.
* Owner 계정의 보안에 유의해주세요.
* Klaytn 의 Smart contract deploy 는 [여기](https://scope.klaytn.com/contract/submission) 를 참고해주세요.
  {% endtab %}

{% tab title="EcoPot Operator Smart Contract Code" %}

```
pragma solidity 0.5.6;

interface IKIP7 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function decimals() external view returns (uint8);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

interface EcoPotLike {
    function totalAmount() external view returns (uint);
    function amountPerBlock() external view returns (uint);
    function distributableBlock() external view returns (uint);
    function estimateEndBlock() external view returns (uint);
    function operator() external view returns (address);
    function getDistributedCurrent() external view returns (uint);
    function isInitialized() external view returns (bool);
    function isAvailable() external view returns (bool);

    function initialize(uint, uint, uint) external payable;
    function depositKlay() external payable;
    function depositToken(uint) external;
    function refixAmountPerBlock(uint) external;
}

interface EcoPotVotingLike {
    function ecoPotExist(address) external view returns (bool);
}

contract EcoPotOperator {
    address constant public ecoPotVoting = 0x2ce59e21364DcA92c90970AD15442146D638997f;
    address constant public ksp = 0xC6a2Ad8cC6e4A7E08FC37cC5954be07d499E7654;

    address public owner;
    address public nextOwner;

    address public ecoPot;
    address public token;
    string public name;

    constructor(address _token, string memory _name) public {
        owner = msg.sender;

        token = _token;
        if(token != address(0)) require(IKIP7(token).decimals() != 0);
        name = _name;
    }

    function version() external pure returns (string memory) {
        return "EcoPotOperator20220221A";
    }

    // valid fallback
    function () payable external { }

    // ======================= owner method ===========================

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function changeNextOwner(address _nextOwner) public onlyOwner {
        nextOwner = _nextOwner;
    }

    function changeOwner() public {
        require(msg.sender == nextOwner);

        owner = nextOwner;
        nextOwner = address(0);
    }

    //withdraw tokens remaining in the operator contract
    function withdraw(address tokenAddr) public onlyOwner {
        uint balance = 0;
        if(tokenAddr == address(0)){
            balance = (address(this)).balance;
            if(balance > 0){
                (bool res, ) = owner.call.value(balance)("");
                require(res);
            }
        }
        else{
            balance = IKIP7(tokenAddr).balanceOf(address(this));
            if(balance > 0){
                require(IKIP7(tokenAddr).transfer(owner, balance));
            }
        }
    }

    modifier onlyEcoPotVoting {
        require(msg.sender == ecoPotVoting);
        _;
    }

    function setEcoPot(address _ecoPot) public onlyEcoPotVoting {
        require(ecoPot == address(0));
        ecoPot = _ecoPot;
    }

    // ====================== Stat ====================================

    function getEcoPotStat() public view returns (
        address ecoPotContract, // airdrop distribution contract address
        uint totalAmount, // Total amount of tokens to be distributed
        uint blockAmount, // Amount of tokens to be distributed per block
        uint distributableBlock, // Block number to airdrop start
        uint endBlock, // Block number to airdrop end
        uint distributed,  // Amount of tokens distributed
        uint remain // amount remaining in the contract
    ){
        ecoPotContract = ecoPot;

        EcoPotLike pot = EcoPotLike(ecoPot);

        totalAmount = pot.totalAmount();
        blockAmount = pot.amountPerBlock();
        distributableBlock = pot.distributableBlock();
        endBlock = pot.estimateEndBlock();
        distributed = pot.getDistributedCurrent();
        if(token == address(0)){
            remain = (ecoPot).balance;
        }
        else{
            remain = IKIP7(token).balanceOf(ecoPot);
        }
    }

    // For Drops AirdropPool
    function getAirdropStat() public view returns (
        address ecoPotContract, // airdrop distribution contract address
        uint totalAmount, // Total amount of tokens to be distributed
        uint blockAmount, // Amount of tokens to be distributed per block
        uint distributableBlock, // Block number to airdrop start
        uint endBlock, // Block number to airdrop end
        uint distributed,  // Amount of tokens distributed
        uint remain, // amount remaining in the contract
        uint emptyUint, // return for airdropPool
        address[] memory emptyAddressArr, // return for airdropPool
        uint[] memory emptyUintArr // return for airdropPool
    ){
        ecoPotContract = ecoPot;

        EcoPotLike pot = EcoPotLike(ecoPot);

        totalAmount = pot.totalAmount();
        blockAmount = pot.amountPerBlock();
        distributableBlock = pot.distributableBlock();
        endBlock = pot.estimateEndBlock();
        distributed = pot.getDistributedCurrent();
        if(token == address(0)){
            remain = (ecoPot).balance;
        }
        else{
            remain = IKIP7(token).balanceOf(ecoPot);
        }

        emptyUint = 0;
        emptyAddressArr = new address[](0);
        emptyUintArr = new uint[](0);
    }

    // ===================== Airdrop method ===========================
    ///@param totalAmount : Total amount of tokens to be distributed
    ///@param blockAmount : Amount of tokens to be distributed per block
    ///@param startBlock  : Block number to airdrop start
    function initialize(uint totalAmount, uint blockAmount, uint startBlock) public payable onlyOwner {
        require(totalAmount != 0);
        require(blockAmount != 0);
        require(startBlock >= block.number);

        EcoPotLike pot = EcoPotLike(ecoPot);
        require(pot.operator() == address(this));
        require(!pot.isInitialized());

        if(token == address(0)){
            require((address(this)).balance >= totalAmount);
            pot.initialize.value(totalAmount)(totalAmount, blockAmount, startBlock);
        }
        else {
            require(IKIP7(token).transferFrom(owner, address(this), totalAmount));
            require(IKIP7(token).approve(ecoPot, totalAmount));
            pot.initialize(totalAmount, blockAmount, startBlock);
        }
    }

    // Airdrop token deposit
    ///@param amount : Amount of airdrop token to deposit
    function deposit(uint amount) public onlyOwner {
        EcoPotLike pot = EcoPotLike(ecoPot);

        require(pot.operator() == address(this));
        require(pot.isAvailable());
        require(amount != 0);

        if(token == address(0)){
            require((address(this)).balance >= amount);
            pot.depositKlay.value(amount)();
        }
        else{
            require(IKIP7(token).balanceOf(address(this)) >= amount);
            require(IKIP7(token).approve(ecoPot, amount));
            pot.depositToken(amount);
        }
    }

    // Airdrop amount per block modification function
    // The function is applied immediately from the called block
    ///@param blockAmount : airdrop block amount to change
    function refixBlockAmount(uint blockAmount) public onlyOwner {
        EcoPotLike pot = EcoPotLike(ecoPot);

        require(pot.operator() == address(this));
        require(pot.isAvailable());
        require(blockAmount != 0);

        pot.refixAmountPerBlock(blockAmount);
    }
}

```

{% endtab %}
{% endtabs %}

## 2. Contract Submission

* [Klaytnscope Contract Submission](https://scope.klaytn.com/contract/submission)

## 3. ValidOperator Request

* &#x20;Operator 등록요청 (<support@klayswap.com>)&#x20;
* Public EcoPotOperator Code로 배포된 contract 확인 과정 후 Valid Operator 설정&#x20;


# EcoPot 계획 진행

EcoPot Operator 권한을 획득한 Contract 는 생성 시 정한 토큰을 이용해 EcoPot을 생성할 수 있습니다.&#x20;

{% hint style="warning" %}

1. Amount 설정 시 사용되는 단위는 Decimal이 포함된 단위입니다.

   예) KLAY 10개 = 10 \* (10^18) = 10000000000000000000
2. EcoPot 설정은 Contract 마다 1개의 Token 만 설정 가능하므로 다른 Token 설정 시 새로운 EcoPotOperator Contract를 배포해야 합니다.&#x20;
   {% endhint %}

### EcoPot 설정

EcoPotOperator Contract의 initialize 함수를 실행합니다.

* 필요한 토큰의 수량과 수수료는 Contract에 Deposit이 아닌 Transfer 해두어야 합니다.&#x20;
* KLAY 토큰 설정시 msg.value 에 설정할 수량을 입력하셔야 합니다.&#x20;
* KIP7 기반 토큰 설정시 Owner 지갑에서 EcoPotOperator 에 설정한 수량만큼 approve 설정을 해주셔야 합니다.
* Request Parameters
  * totalAmount : EcoPot으로 분배할 총 Token 수량
  * blockAmount : 블럭마다 분배할 Token 수량
  * startBlock : EcoPot 시작 Block 번호

```
function initialize(
    uint totalAmount,
    uint blockAmount,
    uint startBlock,
) public
```

### EcoPot Token 충전

EcoPot 진행 중 Token 소진, 연장의 이슈가 있어 Token이 부족하다면 EcoPotOperator Contract의  Deposit 함수로 토큰을 충전할 수 있습니다.

* 함수 실행 시 EcoPotOperator Contract에 입력한 amount 이상의 토큰을 Transfer 해두어 합니다.
* 물량 소진으로 재 충전 시, 충전 이후 Block 부터 적용됩니다.

```
function deposit(uint amount) public
```

### EcoPot 수정

* 블럭당 분배되는 토큰의 양을 수정합니다
* Transaction이 실행된 다음 Block부터 적용됩니다.

```
function refixBlockAmount(uint blockAmount) public
```

### EcoPot 설정 확인

EcoPot의 현재 설정값을 확인할 수 있습니다.

* Valid Operator 권한 획득 후 진행해야 합니다.&#x20;
* Return Parameters
  * ecoPotContract : EcoPot Contract address
  * totalAmount : EcoPot으로 분배할 총 Token 수량
  * blockAmount : 블럭마다 분배할 Token 수량
  * distributableBlock : EcoPot 분배 시작 Block 번호
  * endBlock : 예상 분배 종료 Block 번호
  * distributed : 분배된 Token 수량
  * remain : 잔여 Token 수량

```
function getEcoPotStat() public view returns (
    address ecoPotContract, 
    uint totalAmount, 
    uint blockAmount, 
    uint distributableBlock, 
    uint endBlock,
    uint distributed, 
    uint remain
)
```

### **EcoPot 토큰 출금**

* EcoPot 계획 진행 후 남아있는 토큰을 출금할 수 있습니다.
* Owner 계정으로 출금됩니다.

```
function withdraw(address tokenAddr) public
```


# 클레이스왑 가이드

{% content-ref url="/pages/-M\_eSvNsnvK4-wDcBp9R" %}
[서비스에 연결하기](/kr/how-to-guides/wallet-connect)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_3bZRTBMuIkRuSlSjT" %}
[활용할 자산 입금하기](/kr/how-to-guides/deposit)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_eUwSK5jNnb-t-ovwI" %}
[풀에 예치하기](/kr/how-to-guides/pool-deposit)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_eVD6JFt6-LcWM-aqn" %}
[\[클립\] 모바일에서 KSP 스테이킹 하기](/kr/how-to-guides/stake-and-boost/mobile-klip)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_eVLz\_3x3jHak2AIkJ" %}
[\[클립\] PC에서 풀 투표 하기](/kr/how-to-guides/stake-and-boost/pool-vote)
{% endcontent-ref %}


# 서비스에 연결하기

탈중앙 금융 시스템 상에서는 별도의 회원 계정 체계가 아닌, 고유한 블록체인 지갑을 통해\
서비스와 상호작용(연결)을 진행합니다. KLAYswap은 클레이튼 체인 기반의 서비스로, \
클레이튼 자산을 지원하는 아래 지갑을 통해 서비스 연결이 가능합니다.<br>

* **카카오톡 클립(Klip) 지갑** \
  클립은 카카오톡 앱에 내장된 블록체인 지갑으로, PC와 모바일에서 모두 편리한 연결을 지원합니다.

{% content-ref url="/pages/-M\_nCeNxozPfoGTf5zBK" %}
[\[클립\] PC에서 연결하기](/kr/how-to-guides/wallet-connect/pc-klip)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_nDN5r4CT\_BmoCZWQy" %}
[\[클립\] 모바일에서 연결하기](/kr/how-to-guides/wallet-connect/klip-mobile)
{% endcontent-ref %}

* **카이카스(Kaikas) 지갑**\
  크롬 브라우저의 확장 프로그램으로,  PC에서만 사용이 가능합니다.  [카이카스 설치하기 ](https://chrome.google.com/webstore/detail/kaikas/jblndlipeogpafnldhgmapagcccfchpi?hl=ko)

{% content-ref url="/pages/-M\_eUU-VpVwKAXXg5dQr" %}
[\[카이카스\] PC에서 연결하기](/kr/how-to-guides/wallet-connect/pc-kaikas)
{% endcontent-ref %}

* **디센트(D'CENT) 지갑**\
  &#x20;하드웨어, 모바일앱 월렛을 모두 지원하는 지갑입니다.&#x20;

&#x20;       [콜드월렛 연결하기(디센트 제공 가이드)](https://userguide.dcentwallet.com/v/kr/biometric-wallet/setting-up)

&#x20;        [모바일 앱 연결하기 (디센트 제공 가이드)](https://userguide.dcentwallet.com/v/kr/mobile-app/intro)


# \[클립] PC에서 연결하기

1. 우측 상단 "**지갑연결**" 클릭 후, \[**카카오 klip 지갑으로 연결**] 버튼을 클릭합니다.&#x20;

![](/files/-M_n80mHyL8wK74ep8fX)

2\. 카카오톡 앱을 실행하여 화면에 표시된 QR 코드를 스캔합니다.&#x20;

{% hint style="info" %}
1\) 카카오톡 앱 실행 - 2) 상단 검색창&#x20;
{% endhint %}

![](/files/-M_n8WNPB0ENf5LEUCYA)

3\. QR 코드 스캔 시 자동으로 클립 지갑이 실행됩니다.  \[**다음**] 버튼을 클릭하여 \
&#x20;   KLAYswap 서비스에 연결을 완료합니다.&#x20;

![](/files/-M_n9WbtS_ZvP5cs3ARo)

4\. 지갑 연결이 완료되면 PC 화면상에서 연결된 지갑 주소를 확인할 수 있습니다.&#x20;

![](/files/-M_nA3yDS05I1Jqh8Grb)


# \[클립] 모바일에서 연결하기

1. 우측 상단의 메뉴를 열어 \[**지갑연결**] 버튼을 선택합니다. 지갑 연결 팝업 상의 \
   \[**카카오 Klip 지갑으로 연결**]을 클릭하여 카카오톡에서 열기를 실행합니다. <br>

![](/files/-M_nFqQD7qBol9I7IWL9)

\
2\. 자동으로 클립 지갑이 실행되며,  \[**다음**] 버튼을 클릭하여 KLAYswap 서비스에 연결을 완료합니다.&#x20;

![](/files/-M_n9WbtS_ZvP5cs3ARo)

3\. 지갑 연결이 완료되면 모바일 웹 화면상에서 연결된 지갑 주소를 확인할 수 있습니다.&#x20;

![](/files/-M_nGrRfB3picCnMGsz2)


# \[카이카스] PC에서 연결하기

{% hint style="info" %}
1\) 크롬 브라우저 상에서 카이카스 지갑 설치를 완료해주세요.\
2\) 카이카스 지갑 설치 , 내 지갑 생성을 완료해주세요.&#x20;
{% endhint %}

1. 우측 상단 "**지갑연결**" 클릭 후, \[**Kaikas 지갑으로 연]** 버튼을 클릭합니다.&#x20;

![](/files/-M_nI3G_A6z-NsERleBH)

2\. 자동으로 브라우저에 설치된 Kaikas 지갑이 실행됩니다. \[**Connect**] 버튼을 클릭하여 \
&#x20;  KLAYswap 서비스에 연결을 완료합니다.&#x20;

![](/files/-M_nIav3WFa-edQFouX5)

3\. 지갑 연결이 완료되면 PC 화면상에서 연결된 지갑 주소를 확인할 수 있습니다.&#x20;

![](/files/-M_nA3yDS05I1Jqh8Grb)

​<br>


# 활용할 자산 입금하기

거래소/개인지갑에 보유중인 암호화폐는 먼저 내 클레이튼 지갑으로 입금한 후 클레이스왑\
예치에 활용할 수 있습니다.&#x20;

이더리움, 리플, 클레이튼 등 모든 블록체인은 각 체인별로 고유의 토큰 형식이 존재하므로,  \
아래 **블록 체인별 지원 자산 목록** 에서 입금할 자산을 확인한 후, 클레이튼 지갑으로 전송하는 \
방법을 확인해주세요.

{% content-ref url="/pages/-M\_3ijbq-e2rE1ECpeiu" %}
[클레이튼 자산 입금하기](/kr/how-to-guides/deposit/depositklaytn)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_3iySDD9DbcIJI4KRy" %}
[리플 자산 입금하기](/kr/how-to-guides/deposit/depositxrp)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_3ipDeKQFdoXOw7giZ" %}
[이더리움/BSC 자산 입금하기](/kr/how-to-guides/deposit/depositethereum)
{% endcontent-ref %}

###

### 블록 체인별 지원 자산  목록&#x20;

| Klaytn             | XRP Ledger | Ethereum       | BSC          |
| ------------------ | ---------- | -------------- | ------------ |
| 클레이 (KLAY)         | 리플 (XRP)   | 이더리움 (ETH)     | 바이낸스 코인(BNB) |
| 클레이스왑프로토콜 (KSP)    |            | 랩트비티코인 (WBTC)  | 벨트(BELT)     |
| 에스클레이 (SKLAY)      |            | 오르빗체인 (ORC)    | 비너스(XVS)     |
| 클레이튼이더리움 (KETH)    |            | 테더(USDT)       | 팬케이크스왑(CAKE) |
| 클레이튼랩트비트코인 (KWBTC) |            | 다이 (DAI)       | 오토팜(AUTO)    |
| 클레이튼오르빗체인(KORC)    |            | 트라이엄프엑스 (TRIX) | 비피(BIFI)     |
| 클레이튼테더(KUSDT)      |            | 핸디 (HANDY)     |              |
| 클레이튼다이(KDAI)       |            | 듀카토 (DUCATO)   |              |
| 클레이튼리플(KXRP)       |            | 토카막네트워크(TON)   |              |
| 클레이튼트라이엄프엑스(KTRIX) |            | 퀸비(QBZ)        |              |
| 클레이튼핸디(KHANDY)     |            | 스트림프로토콜(STPL)  |              |
| 클레이튼두카토(KDUCATO)   |            |                |              |
| 클라우드브릭(CLBK)       |            |                |              |
| 클레이튼바이낸스코인(KBNB)   |            |                |              |
| 클레이튼벨트(KBELT)      |            |                |              |
| 클레이비너스(KXVS)       |            |                |              |
| 클레이튼팬케이크스왑(KCAKE)  |            |                |              |
| 클레이튼오토팜(KAUTO)     |            |                |              |
| 클레이튼비피(KBIFI)      |            |                |              |
| 클레이튼토카막네트워크(KTON)  |            |                |              |
| 클레이튼스트림프로토콜(KSTPL) |            |                |              |
| 클레이튼퀸비(KQBZ)       |            |                |              |
| 트리클(TRCL)          |            |                |              |
| 미네랄(MNR)           |            |                |              |
| 썸씽(SSX)            |            |                |              |
| 인슈어리움(ISR)         |            |                |              |
| 에어블록(ABL)          |            |                |              |
| 위믹스(WEMIX)         |            |                |              |
| 피블(PIB)            |            |                |              |
| 프로젝트위드(WIKEN)      |            |                |              |
| 블루바이칼(BBC)         |            |                |              |
| 힌트(HINT)           |            |                |              |
| 레디(REDi)           |            |                |              |
| 아고브 (AGOV)         |            |                |              |
| 힙스(HIBS)           |            |                |              |
| 카이 토큰(KAI)         |            |                |              |
| 카이 쉐어 토큰(sKAI)     |            |                |              |
| 식스(SIX)            |            |                |              |


# 클레이튼 자산 입금하기

클레이튼 체인의 기축 암호화폐는 클레이(KLAY) 이며, 클레이스왑프로토콜(KSP), 에스클레이(SKLAY)와 \
같은 'KCT' 표준 형태를 따르는 다양한 토큰들이 존재합니다.&#x20;

클레이튼 체인 자산은 거래소에서 내 클레이튼 지갑주소로 자산을 전송하면 바로 입금됩니다.<br>

{% hint style="info" %}
암호화폐 특성 상 전송한 자산은 취소가 불가능합니다. \
자산 전송 시 반드시 소량의 입금 테스트 후 실제 자산을 전송하는 것을 권장해드립니다.&#x20;
{% endhint %}

{% tabs %}
{% tab title="클립(Klip) 지갑으로 전송하기" %}
\
1\. 카카오톡 클립에서 **내 지갑 주소**를 확인합니다.

![](/files/-MiPsW1B_53LR5mWFN3Q)

2.거래소/개인지갑 출금 화면의 **출금주소 입력란에 내 지갑주소를 입력한 후 출금**합니다.

![](/files/-M_3rzxIc0gYz-wkEjoV)
{% endtab %}

{% tab title="카이카스(Kaikas) 지갑으로 전송하기" %}
\
1\. 카이카에 지갑에서 **내 지갑 주소**를 확인합니다

![](/files/-M_3tCnkFdWdnv4KZvl6)

\
\
2\. 거래소/개인지갑 출금 화면의 **출금주소 입력란에 내 지갑주소를 입력한 후 출금**합니다.

![](/files/-M_3rzxIc0gYz-wkEjoV)
{% endtab %}

{% tab title="디센트(D'CENT) 지갑으로 전송하기" %}

1\. 디센트 지갑에서 **내 지갑 주소**를 확인합니다.&#x20;

![](/files/-M_3uEqrcDEse37efn0_)

<br>

2\. 거래소/개인지갑 출금 화면의 **출금주소 입력란에 내 지갑주소를 입력한 후 출금**합니다.

![](/files/-M_3rzxIc0gYz-wkEjoV)
{% endtab %}
{% endtabs %}


# 이더리움/BSC 자산 입금하기

거래소/개인지갑에 보관중인 이더리움/BSC 계 자산은 오르빗 브릿지 사이트에서 직접 브릿징을 통해 \
클레이튼 체인의 자산으로 전환하여 입금해야 합니다.&#x20;

* [오르빗 브릿지 사이트 이동](https://bridge.orbitchain.io/)
* [오르빗 브릿지 가이드 확인하기](https://bridge.orbitchain.io/assets/orbitbridge_guide_en.pdf)

{% hint style="info" %}
암호화폐 특성 상 전송한 자산은 취소가 불가능합니다. \
자산 전송 시 반드시 소량의 입금 테스트 후 실제 자산을 전송하는 것을 권장해드립니다.
{% endhint %}


# 리플 자산 입금하기

\
거래소/개인지갑에 보관중인 리플은 내 리플 전용 입금주소로 전송하면 바로 클레이튼 리플(KXRP)로 전\
환하여 입금되며, 클레이스왑에서 리플 예치를 시작할 수 있습니다.   &#x20;

{% hint style="info" %}
암호화폐 특성 상 전송한 자산은 취소가 불가능합니다. \
자산 전송 시 반드시 소량의 입금 테스트 후 실제 자산을 전송하는 것을 권장해드립니다.
{% endhint %}

{% tabs %}
{% tab title="PC에서 입금하기" %}
\
1\. 지갑 연결 후, "**Asset**" 메뉴로 이동하여 \[**XRP로 입금**] 버튼을 클릭합니다.

![](/files/-M_Iw83C8lqQVTUZdYgM)

\
&#x20; 2\. 내 리플 입금주소를 확인한 후, 거래소 출금 주소에 **입금주소**와 **데스티네이션** **태그**를 \
&#x20;   모두 정확히 입력합니다.\
\
\* 리플은 반드시 입금주소와 태그를 모두 정확히 입력해야 합니다. 주소, 태그 오입력 또는 미입력으로 인한 자산 오전송으로 인한 손실은 복구가 불가능합니다.

![](/files/-M_IziG8bK-6i0FTiG0u)

3\. 리플 입금이 완료되면, 자산 목록에서 확인할 수 있습니다.&#x20;

![](/files/-M_J--ofYgO0_SAcedmW)

<br>
{% endtab %}

{% tab title="모바일에서 입금하기" %}
\
1\. 지갑 연결 후, "**Asset**" 메뉴로 이동하여 \[**XRP로 입금**] 버튼을 클릭합니다.

![](/files/-M_J03JnQ1AQPBz1giap)

2\. 내 리플 입금주소를 확인한 후, 거래소 출금 주소에 **입금주소**와 **데스티네이션** **태그**를 \
&#x20;   모두 정확히 입력합니다.\
\
\* 리플은 반드시 입금주소와 태그를 모두 정확히 입력해야 합니다. 주소, 태그 오입력 또는 미입력으로 인한 자산 오전송으로 인한 손실은 복구가 불가능합니다.&#x20;

<br>

![](/files/-M_J0JiWEU0vMWX_Unbj)

3\. 리플 입금이 완료되면, 자산 목록에서 확인할 수 있습니다.&#x20;

&#x20;

\ <br>
{% endtab %}
{% endtabs %}


# 풀에 예치하기

* **단일 예치 (KLAY)**\
  단일 예치는 클레이튼(KLAY) 자산에 한해 기능을 지원합니다.

* **일반 페어 예치**\
  페어 예치는 두 개의 암호화폐 자산을 쌍(Pair)으로 스마트 컨트랙트에 예치하는 방식입니다.&#x20;

{% content-ref url="/pages/-M\_nivuTUVWDzAuRMauR" %}
[\[클립\] PC에서 일반 페어 예치 하기](/kr/how-to-guides/pool-deposit/pc-klip)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_nhz0xzmfIo4g0PVnK" %}
[\[클립\] 모바일에서 일반 페어 예치 하기](/kr/how-to-guides/pool-deposit/mobile-klip)
{% endcontent-ref %}

{% content-ref url="/pages/-M\_n3ykDFdj1i5J8PU1H" %}
[\[카이카스\] PC에서 일반 페어 예치하기](/kr/how-to-guides/pool-deposit/pc-kaikas)
{% endcontent-ref %}

{% hint style="success" %}
클레이스왑에서 자산을 페어로 예치하려는 경우,  내 지갑에  두 개의 자산을 \
모두 보유하지 않아도 예치가 가능합니다.\
\
아래 **활용할 자산 선택하기** 옵션에 대한 안내를 참고하여 쉽고 편리하게 예치를 진행해보세요.
{% endhint %}

* 플러스 예치<br>


# \[클립] PC에서 단일 예치하기

1\. **\[예치]** 메뉴의 **\[단일 예치]** 페이지로 이동합니다.

![](/files/njWjxQOdSiOYsbhwyNA3)

2\. 단일 예치에서 예치하고자 하는 자산을 확인 후 클릭합니다. 예치하고자 하는 암호화폐의 토큰명, 심볼명으로 검색하면 쉽게 토큰을 찾을 수 있습니다.

![](/files/XnqrJt4hdbJUadinSu4x)

3\. 목록에서 **\[예치]** 버튼 클릭 시 예치 팝업창이 뜹니다.

![](/files/ZcB0yBhmXiLn5IN27E4O)

4\. 예치하고자 하는 자산의 수량을 기입하여 “예상 내역”에서 수익률과 지분율 변화를 확인한 후 \[다음 단계로] 버튼을 클릭합니다.

![](/files/Hlijz6mTu9r8pvGpFtx4)

{% hint style="info" %}
**수익률 정보**

* 연간 KSP 분배 수익률(%) 단일 풀 예치자는 풀에 분배되는 1일 KSP 수량에서 각자의 예치 지분율에 따라 KSP를 분배받습니다.

* 연간 예치 수익률(%) 단일 풀 예치자가 예치한 자산은 플러스 예치를 위한 재원으로 활용되며, 플러스 예치자가 자산 활용 시 지불한 비용은 다시 단일 풀 예치자에게 분배합니다. 분배된 수익은 내 예치자산 수량에 자동으로 포함됩니다.
  {% endhint %}

5\. **\[승인하기]** 버튼 클릭 후 카카오톡 앱을 실행하여 화면에 표시된 QR 코드를 스캔합니다.

![](/files/Joi9CF4HFYUvOT9x6c8P)

6\. QR 코드 스캔 시 자동으로 클립 지갑이 실행됩니다. **\[다음]** 버튼 클릭 후 클립에서 설정한 비밀번호 입력을 완료해 트랜잭션 승인을 완료합니다.

![](/files/uSVys9ktYO4WrGNklnG3)

7\. **\[승인하기]** 완료 후 **\[예치하기]** 버튼을 클릭하면 예치가 최종 완료됩니다.

![](/files/K1TnRJ0P4YNfeou6igW7)

8\. 예치가 완료되면 예치한 자산 탭에서 “내 예치자산”, “KSP 보상”, “수익률 상세”를 확인할 수 있으며, 실시간 예치 수익률에 따른 이자가 예치한 자산에 누적되어 표시됩니다. 예치/출금으로 잔액 변동 시 현재까지 분배된 KSP 보상이 자동으로 유저 지갑으로 수령됩니다

![](/files/EPnEKBsEH1gQGBMV2OTm)


# \[부리또월렛] 모바일에서 단일 예치하기

### 요약

<figure><img src="https://lh5.googleusercontent.com/LQbtg2xOrSbQTHE1tsuG9tuhbLCnn6gbJ-N0hHNBn3QHcpXOgqtPPXyRd52B3aoFGXwb00tczUDUkPUs8UWtSXHx7rOpIXPUSplJLE5IZz4vkJvkpqp9AuFe7SMPIJwYDKYTDCaLyYgWNHVILSBQuu4" alt=""><figcaption></figcaption></figure>

1\) 빗썸 등 거래소에서 암호화폐를 구매합니다.

2\) 암호화폐를 부리또 월렛으로 전송합니다.

3\) Dapp 페이지에서 KLAYswap에 접속하고, 부리또 월렛을 연결합니다.

4\) 단일 예치, 페어 예치, 플러스 예치, 포지션 예치 중 원하는 서비스에 예치한 후, 예치 이자와 KSP 보상을 받습니다.

### 1. 빗썸에서 부리또월렛으로 자산 옮기기

암호화폐를 부리또 월렛으로 전송하는 자세한 가이드는 아래를 참고해 주세요.

{% embed url="<https://rotonda.notion.site/9481e1237e0b4b04980b58eb6c21d3e4>" %}

### 2. 부리또월렛에서 KLAYswap 연결하기

dApp > 인기 또는 Exchanges  > KLAYswap

1\) 하단 메뉴에서 “dAPP” 버튼을 클릭한 후, dAPP 페이지에서 상단의 “인기” 탭 또는 “Exchanges” 탭을 클릭합니다.

<figure><img src="/files/jUp09J8Nwc7vy7fhn87x" alt=""><figcaption></figcaption></figure>

2\) KLAYswap에 접속하고, **\[지갑 연결]** 버튼을 클릭합니다. **\[WalletConnect 지갑 연결]**&#xC744; 클릭해 메인 지갑 연결을 진행합니다.

<figure><img src="/files/MguNuuX0darj6qPIXh4r" alt=""><figcaption></figcaption></figure>

### 3. KLAYswap에서 자산 예치하기

1\) 상단의 **\[예치]** 메뉴의 **\[단일 예치]** 페이지로 이동합니다. &#x20;

![](/files/U8iT7cvtSJ88i3SSDy1D)<br>

2\) 풀 목록에서 예치할 자산 풀을 선택한 후, **\[예치]** 버튼을 클릭합니다.

![](https://lh5.googleusercontent.com/rOD8AU4qs-lT3CPIMDFu0iIR6QWYeBzzasdBhTfG3JWOfwYRwLlc-8V5_IT0LfL89Ra_rTVj8GSmggpvLPEkJdke1PNL9cu0u72j-maYMMoKHYvf0BSJWI9EwgfYjq9qVeVJjTGxZR8XLq59T3OYYFY)

{% hint style="info" %}
**Tips**

예치하려는 자산의 이름, 심볼로 검색하면 빠르고 쉽게 찾을 수 있습니다.
{% endhint %}

3\) 자산 예치 팝업에서 보유 수량을 확인한 후, 예치할 수량을 입력하세요. “예상 내역”에서 예치를 진행할 경우의 총 예치 이율과 지분율을 확인할 수 있습니다. 확인을 마친 후 **\[다음 단계로]** 버튼을 클릭해 주세요.

![](/files/FfKbyQD30FPEhITRElFr)

{% hint style="info" %}
**Tips**

"max" 버튼 클릭하면, 실시간으로 가능한 최대 수량으로 트랜잭션이 요청됩니다.&#x20;
{% endhint %}

&#x20;4\) “트랜잭션 요청” 팝업창에서 진행할 단일 예치에 대한 예상 정보를 확인한 후, **\[예치하기]** 버튼을 클릭합니다. 최종적으로 정보를 확인하였다면, 부리또월렛에서 **\[서명 하기]** 버튼을 눌러주세요.

<figure><img src="/files/adYWbGmqvXslL44pRhK7" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

선택한 자산을 KLAYswap에서 거래한 이력이 없다면, 단일 예치 트랜잭션을 진행하기 전에 **토큰 승인 트랜잭션**이 선행됩니다 (최초 1회에 한함).
{% endhint %}

5\) 예치를 완료하면, “내 예치 자산”, “수령 가능 KSP” 를 확인할 수 있습니다. 실시간 예상 수익률에 따라, 이자가 실시간으로 누적됩니다. 만약 추가로 예치하거나 예치중인 자산을 출금하여 “내 예치 자산” 수량이 변경되는 경우, 현재까지 분배된 KSP 보상이 자동으로 유저 지갑으로 수령됩니다.

![](https://lh5.googleusercontent.com/CZjQ98UiX6XoqZnbfqbrx2R5NfgC2-u4SPKcgiDl2cdwpuYofLDjnS6DaCdqmdJSCuXkH8IsvX1f3ffGiEGqHMVeYTfrS7ckNIKo_vjtBVPZ6teJUn2cPV8i_Krdx_2Ol77hatWmUMd5hAjyyBA0T9A)

{% hint style="info" %}
**Tips**

“상세” 버튼 클릭 시, 수익률 상세 정보를 확인할 수 있습니다.

* **예치 수익률 (%)**: 단일 예치자가 예치한 자산은 플러스 예치를 위한 재원으로 활용하며, 플러스 예치자가 지불하는 이자 비용은 단일 풀 예치자에게 분배합니다. 예치 이자는 예치한 자산 수량에 자동으로 포함되며, 원하는 시점에 출금할 수 있습니다.
* **KSP 분배 (%)**: 단일 예치자는 풀에 분배되는 1일 KSP 수량에서 각자의 예치 지분율에 따라 MESH를 분배 받습니다.
  {% endhint %}

<figure><img src="https://lh3.googleusercontent.com/36tpnRhKG3NIR55QV3QZ34cTAq1krKECgsdMX9X04jMcFOuNKJ0Ro4kCeKV_kb9nL8MVKR3SOmmkrm_iv_Z3xZl1fcMesYkjQVIPStz6EnX_Dd-zKiqxyy3E1VzI7KM0aqGaYnXBsREzvu1d_QJSK4E" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Tips**

클레이튼 뿐 아니라 이더리움, 리플, 톤 등 여러 체인의 자산을 KLAYswap의 다양한 서비스에 예치할 수 있습니다. 단일 예치, 페어 예치, 플러스 예치, 롱/숏 포지션 예치 중 투자 성향에 맞는 서비스에 예치하고, 이자 수익과 KSP 보상을 받으세요.
{% endhint %}


# \[클립] PC에서 일반 페어 예치 하기

1. "**Pool**" 메뉴에서 예치할 페어를 확인 후 클릭합니다. 예치하고자 하는 암호화폐의 \
   토큰명, 심볼명으로 검색하면 쉽게 페어를 찾을 수 있습니다.

![](/files/-M_nPiXlK5kcEPklK7Ka)

2\. 풀 목록에서 \[**예치**] 를 클릭하여 상세페이지로 이동합니다. "**Deposit**" 메뉴에서 한 쪽 \
자산 수량을 입력하면, 함께 예치하기 위해 필요한 반대쪽 자산 수량이 자동으로 계산되어 입력됩니다.&#x20;

![](/files/-M_nQqDjBn4J2I0GFXg2)

\
\
3\. 이때, 화면 하단에서 예치와 관련된 상세 내역을 확인할 수 있습니다. 사용자는 내 예치과정에서 \
&#x20;   발생할 수 있는 변동 사항에 대해 충분히 숙지하고, 이를 이해한 경우에 예치를 진행해야 합니다. \
&#x20;   표시되는 정보는 모두 **실시간 예상 정보로, 실제 예치 과정에서 차이가 발생할 수 있습니다.**&#x20;

![](/files/-M_nRCsmIxXD2pg9NkpV)

{% hint style="info" %}
&#x20;**상세 내역 정보**&#x20;

* **교환비율** \
  현재 KLAYswap 내에서의 두 자산의 가격을 확인할 수 있습니다. <br>
* **지분율** \
  현재 풀 규모를 기준으로, 입력한 자산 예치 시 내 예상 지분율을 확인할 수 있습니다. <br>
* **데일리 보상** \
  현재 풀의 KSP 분배 수익률을 기준으로 입력한 자산 예치 시 1일 동안 분배될 KSP 수량을 확인할 수 있습니다. <br>
* **교환 비율 범위**\
  현재 화면에서 표시된 토큰의 교환 비율(가격)에서  ±1% 범위내에서만 예치를 진행합니다.

  만약, 다른 참여자들이 풀에서  예치와 출금을 진행하여 토큰 교환비율(가격)이 크게 변동하는 경우 내가 예상하지 않은 토큰 가격으로 풀에 예치가 진행되지 않도록 방지하기 위한 안전 장치입니다.반드시 변동 가능한 범위를 충분히 숙지 후 예치를 진행해야 합니다.
  {% endhint %}

4\. 상세 내용 확인 후, \[**Deposit**] 버튼을 클릭합니다. 최초로 예치하는 경우 토큰 승인 절차가 필요할 수 있습니다.  \[**승인하기**] 버튼을 클릭합니다.

![](/files/-M_nVanzMj-Ec4PdEhGj)

\
5\. 카카오톡 앱을 실행하여 화면에 표시된 QR 코드를 스캔합니다. <br>

![](/files/-M_nkY3GF1Kz9Ra5Fpgt)

\
\
6\. QR 코드 스캔 시 자동으로 클립 지갑이 실행됩니다.  \[**다음**] 버튼 클릭 후 클립에서 설정한 비밀번호 입력을 완료해 트랜잭션 승인을 완료합니다

![](/files/-M_nlA5XT8xFhw-0f6mv)

\
7\. 최종 예치내역을 확인 후 \[**예치하기**] 버튼을 클릭합니다.&#x20;

![](/files/-M_nfkgre1eUgJwjUCfh)

\
\
\
8\. 카카오톡 앱을 실행하여 다시 한번 화면에 표시된 QR 코드를 스캔합니다. 자동으로 실행된 클립 지갑에서 예치 트랜잭션 승인을 완료합니다. <br>

![](/files/-M_nkY3GF1Kz9Ra5Fpgt)

\
\
9\. 예치가 완료되면, 상단 "내 **예치자산**" 영역에서 확인할 수 있습니다. 예치 완료 후 부터 \
&#x20;    보상이 실시간으로 분배됩니다.

![](/files/-M_nhbBKyVLHj6qauLrR)




---

[Next Page](/llms-full.txt/1)

