[암호화폐] 아무도 알려주지 않는 LP의 의미(1)
DeFi로 채굴을 하기 위해서는 LP를 만들어서 유동성 공급을 합니다. LP 공급할 때 나오는 LP 수량의 의미를 파악하기가 힘든데요. 특히 현재 LP에 pair 토큰이 몇 개가 있는지를 바로 확인하기가 어렵습니다.
이런 답답함을 일시에 풀어준 서비스가 바로 https://yieldwatch.net/ 입니다. 여기에 본인의 eth 주소를 넣으면 투자 중인 LP가 모두 나오고, 각각의 LP를 클릭해보면 자세한 정보도 나옵니다. 이렇게요.
이 값을 파이썬으로 구해보도록 하겠습니다.
이 값을 구하기 전에 smart contract에 대하여 좀 더 공부를 해보겠습니다.
uniswap과 같은 자동화된 마켓 메이커(AMM, Automated Market Maker)는 유동성에 있는 pair 토큰들의 수량에 따라서 가격이 결정이 됩니다.
B 토큰 가격 = LP에 있는 A 토큰 수량 / LP에 있는 B 토큰 수량
LP에 남아있는 토큰의 수량에 따라서 가격이 결정된다는 점이 아주 흥미롭습니다. 만약 A -> B로 전환하는 거래가 성립하면 LP에 있는 A 토큰 수량은 늘고, B 토큰 수는 감소하므로 B 토큰 가격은 상승합니다. 반대의 경우에는 가격이 하락합니다.
이런 간단한 구조로 AMM이 동작을 합니다. 이런 구조를 보면 가격을 왜곡시킬 수 있는 방법이 딱 떠오르죠. 실제로 가격을 왜곡시켜 먹튀하는 경우도 많았습니다. 그럼에도 불구하고 AMM이 잘 동작하는 이유는 유동성 공급이 아주 아주 크기 때문입니다. 유동성 공급이 클수록 가격이 잘 유지되는 특성을 가지고 있습니다.
이렇게 간단한 개념으로 교환이 이루어지고 있다니 조금 충격적이기는 합니다. uniswap과 같은 분산거래소의 동작원리를 이해하고 나니 왜 LP 공급 확대를 위하여 노력하는지 이해가 됩니다. 분산 거래소의 핵심 중의 핵심은 유동성 공급을 증가시키는 것이군요. 유동성 규모가 클수록 대규모 거래에 대해서도 가격 변동성을 줄일 수 있기 때문에 수요가 증가하기 때문입니다.
여기서 한가지 더 이해를 해야할 부분은 각 토큰의 발행량과 특정 LP에 투입된 토큰과의 관계입니다.
예를들어 BUSD와 BNB로 이루어진 BUSD-BNB LP의 경우에 아래 그림과 같이 BUSD 중 일부, BNB 중 일부가 BUSD-BNB LP에 공급되어 있습니다.
BUSD 토큰 중 BUSD-BNB LP에 공급된 수량은 아래와 같은 방식으로 구할 수 있습니다.
BUSD-BNB LP : 0x1B96B92314C44b159149f7E0303511fB2Fc4774f
BUSD : 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56
BNB : 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
bscscam.com에서 busd 주소를 입력하면 busd의 smart contract 내용을 확인할 수 있습니다. 이중 5. balanceOf에 busd-bnb lp 주소를 입력해보면 busd-bnb lp에 있는 busd 수량을 알 수 있습니다.
같은 방식으로 bnb 주소를 입력한 후 busd-bnb lp 주소를 입력하면 busd-bnb lp에 있는 bnb 수량을 알 수 있습니다.
앞에서 설명한 바와 같이 bnb 가격은 이 두 값을 나누면 나옵니다. 이것을 파이썬으로 함수를 만들어보면 아래와 같습니다.
def get_bnb_price() :
lp_addr = sc_addr['bnb-busd']
# busd
t1 = w3.eth.contract(sc_tokens['busd'], abi=contract_common_abi)
name1 = t1.functions.name().call()
sym1 = t1.functions.symbol().call()
bal1 = t1.functions.balanceOf(lp_addr).call() / (10 ** 18 )
# bnb
t2 = w3.eth.contract(sc_tokens['bnb'], abi=contract_common_abi)
name2 = t2.functions.name().call()
sym2 = t2.functions.symbol().call()
bal2 = t2.functions.balanceOf(lp_addr).call() / (10 ** 18 )
price = bal1 / bal2
print("[%6s - %6s] %10.4f %10.4f, price $%10.4f"%(sym1, sym2, bal1, bal2, price))
return price
pancakeswap에서 현재가를 확인해본 값과
프로그램으로 출력한 값이 비슷하게 나옵니다.
두 프로그램에서 금액상 차이가 나는 부분은 pancakeswap의 경우에는 수수료 0.3%가 포함되어서 그런 것 같습니다.
이번 글에서는 LP에서 각 토큰의 수량을 확인하는 방법과 이를 이용하여 해당 토큰의 가격을 결정하는 과정에 대하여 기술하였습니다. 다음에는 그동안 설명한 사항들을 모두 모아 본인이 투자한 LP에 있는 각 토큰의 수량, 현재 가치를 계산하는 방법에 대하여 기술하도록 하겠습니다.
[US$49.00](▼14%)[Nespresso]스타벅스 네스프레소 호환 캡슐 7종 / 120 캡슐 골라담기 / 20개씩 총 6종류 교차 선택 가능 / 중복 선택 가능 / 재고 확보 / 무료배송 / 개당 약 486원 최저가★
WWW.QOO10.COM@tradingideas transfered 15 KRWP to @krwp.burn. voting percent : 53.69%, voting power : 80.25%, steem power : 1722733.45, STU KRW : 1200.
@tradingideas staking status : 7500 KRWP
@tradingideas limit for KRWP voting service : 22.5 KRWP (rate : 0.003)
What you sent : 15 KRWP [51800643 - ba4c3ce588cc33baf7a86e96c5daef4a6542f23a]
바쁘시다면서 요즘 더 열심이신것 같습니다.
역설적으로 바뻐서.. 자동화가 필요해서 작업 중입니다. ㅎ
무슨말인지 이해하려면 언제가 되야 할까요...에휴.
아 어렵네요
LP부터 막히네요.