[암호화폐] 아무도 알려주지 않는 LP의 의미(1)

in hive-101145 •  4 years ago  (edited)

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에 있는 각 토큰의 수량, 현재 가치를 계산하는 방법에 대하여 기술하도록 하겠습니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

[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부터 막히네요.