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

in SteemCoinPan •  9 months ago  (Edited)

1편에 이어 LP에 있는 각 토큰의 수량 및 현재 가치를 알아볼 수 있는 방법에 대하여 기술합니다.

우선 mNflx의 가격을 구합니다.

앞 편에서 설명한바와 같이 usd-mNflx LP 주소와 ust, mNflx smart contract 주소만 있으면 mNflx 의 현재가를 구할 수 있습니다. 앞으로 많이 사용할 함수이므로, 일반화하여 잘 만들어보았습니다. bnb가 pair로 들어가는 경우에는 bnb 가격을 인자로 넣어주면 됩니다.

def get_bsc_token_price(lp_addr, tok1_addr, tok2_addr, bnb_price=0) :

    # token1
    t1 = w3.eth.contract(tok1_addr, abi=contract_common_abi)
    name1 = t1.functions.name().call()
    sym1 = t1.functions.symbol().call()
    bal1 = t1.functions.balanceOf(lp_addr).call() / (10 ** 18 ) 

    # token2
    t2 = w3.eth.contract(tok2_addr, 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

    # bnb 기반 lp이면 bnb 가격을 곱해준다. us$ 기준으로 돌려줌
    if bnb_price :
        price *= bnb_price

    print("[%6s - %6s] %10.4f %10.4f, price $%10.4f"%(sym1, sym2, bal1, bal2, price))
    return price

pancakeswap에서 확인한 값과 비슷하게 나오는군요.

다음으로는 LP의 정보를 출력하는 방법입니다.
ust-mNflx 주소에서 user_info 값을 구하면 [0] 값이 본인이 공급한 LP의 양이 나옵니다. 해당 LP의 전체 유동성 크기는 totalSupply() 함수로 구할 수 있습니다. 이 두 값을 참고하여 본인의 지분율을 계산합니다.

그 후 앞 글에서 설명한 방식으로 pair 각각의 토큰 주로에서 해당 LP가 가지고 있는 각 토큰의 수량을 구합니다. 이 값에 앞에서 구한 본인의 지분율을 곱하면 ust-mNflx에 공급한 본인의 각 토큰의 현재 수량이 나옵니다.

이렇게 각 토큰의 수량을 구한 후 각 토큰의 현재가를 곱하면 본인이 공급한 LP의 현재 가치를 계산할 수 있습니다.

개념이 약간 복잡합니다만, 찬찬히 읽어보면 당연한 이야기입니다. 하지만 어느 누구도 이런 것을 알려주지 않아서 LP에서의 지분을 구하는데 시간이 많이 걸렸습니다.

이러한 일들을 해 주는 코드는 아래와 같습니다.

sc_addr = {
    'bnb-busd' : '0x1B96B92314C44b159149f7E0303511fB2Fc4774f',
    'cake-bnb' : '0xA527a61703D82139F8a06Bc30097cC9CAA2df5A6',
    'ust-nflx' : '0xF609ade3846981825776068a8eD7746470029D1f',
}

sc_tokens = {
    'bnb' : '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
    'busd' : '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',
    'cake' : '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82',
    'nflx' : '0xa04F060077D90Fe2647B61e4dA4aD1F97d6649dc',
    'ust' : '0x23396cF899Ca06c4472205fC903bDB4de249D6fC',
}

def get_LP_info(pools, pos, lp_addr, token1, token2) :
    user_info = pools.functions.userInfo(pos, my_addr).call()
    my_lp_amount = user_info[0]

    # lp
    lp = w3.eth.contract(lp_addr, abi=contract_common_abi)
    # token1
    t1 = w3.eth.contract(token1, abi=contract_common_abi)
    name1 = t1.functions.name().call()
    sym1 = t1.functions.symbol().call().upper()
    bal1 = t1.functions.balanceOf(lp_addr).call() / (10 ** 18 ) 

    # token2
    t2 = w3.eth.contract(token2, abi=contract_common_abi)
    name2 = t2.functions.name().call()
    sym2 = t2.functions.symbol().call().upper()
    bal2 = t2.functions.balanceOf(lp_addr).call() / (10 ** 18 ) 

    price = bal1 / bal2

    lp_total = lp.functions.totalSupply().call()

    my_share = my_lp_amount / lp_total 
    my_holding_token1 = bal1 * my_share
    my_holding_token2 = bal2 * my_share

    cur_value =  my_holding_token1*coins_price[sym1] + my_holding_token2*coins_price[sym2]

    print('total   LP       : %15.2f'%(lp_total))
    print('total %-11s: %15.2f'%(sym1, bal1))
    print('total %-11s: %15.2f'%(sym2, bal2))
    print('own share of pool: %15.2f'%(my_lp_amount/lp_total*100))
    print('my share  %-7s: %15.2f'%(sym1, my_holding_token1))
    print('my share  %-7s: %15.2f'%(sym2, my_holding_token2))
    print('cur net value    : %15.2f'%cur_value)

name = 'pancake'
swap = w3.eth.contract(pools[name]['addr'], abi=pools[name]['abi'])
get_LP_info(swap, 60, sc_addr['ust-nflx'], sc_tokens['nflx'], sc_tokens['ust'])

결과를 확인해볼까요? 약간의 차이는 있지만 거의 비슷한 결과를 얻었음을 알 수 있습니다. mNflx의 경우에는 매수/매도 가격차가 아주 큰데요. 이러게 차이가 나는 이유는 잘 모르겠습니다. 좀 더 고민을 해봐야 할 듯 합니다.

이제 watchyield와 같은 프로그램을 만들 준비는 거의 끝난 것 같습니다. 이제는 공은 @goodhelllo님께 넘깁니다. 근사한 웹페이지가 곧 나올 것으로 기대합니다.

저는 이제 자동 claim하는 쪽으로 연구를 해보도록 하겠습니다. 이것도 방법을 찾기가 힘들군요. 혹시 방법 아시는 분 계시면 댓글 부탁드립니다.

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.25%, voting power : 78.98%, steem power : 1724908.69, STU KRW : 1200.
@tradingideas staking status : 10500 KRWP
@tradingideas limit for KRWP voting service : 21 KRWP (rate : 0.002)
What you sent : 15 KRWP [51886831 - d8aceaa32381f6881aab581bcd48085c0fee9912]

Thank You for Your insights...

멋지십니다