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

in SCT.암호화폐.Crypto4 years 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하는 쪽으로 연구를 해보도록 하겠습니다. 이것도 방법을 찾기가 힘들군요. 혹시 방법 아시는 분 계시면 댓글 부탁드립니다.

Sort:  

[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...

멋지십니다

Coin Marketplace

STEEM 0.17
TRX 0.15
JST 0.028
BTC 58088.10
ETH 2353.31
USDT 1.00
SBD 2.44