[암호화폐] 아무도 알려주지 않는 LP의 의미(2)
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하는 쪽으로 연구를 해보도록 하겠습니다. 이것도 방법을 찾기가 힘들군요. 혹시 방법 아시는 분 계시면 댓글 부탁드립니다.
[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...
멋지십니다