실제 투자 사례를 통해서 유동성 공급에 대한 이해를 좀 더 높여보겠습니다.

지난 3/3일 uniswap에 eth/usdt 유동성 공급을 하였습니다.

그당시 eth는 $1780이었으며 총 $3,500불어치인 2.12608 eth를 유동성 공급하였습니다.

 

유동성 공급한 수량과 금액은 아래와 같습니다.

eth 2.12608

usdt $3,500

 

당시 eth/usdt 수수료 수입은 연 40% 정도였습니다.

 

오늘은 5/11일. 그동안 eth가 많이 올랐습니다.

오늘자 uniswap에 있는 제 계정의 eth/usdt 상태입니다.

여기에 나오는 내용에 대한 설명입니다.

eth-usdt liq.의 현재 가치는 $12,083이고 유동성 풀에는 1.5403개의 eth가 있고, 6,035개의 usdt가 있습니다. 이중 수수료 수입은 $1,076입니다.

 

즉 eth가 오르는 과정에서 eth가 usdt로 전환이 되었으며, 그동안 수수료 수입도 꽤 많이 나왔습니다.

 

그렇다면 유동성 공급하지 않았을 때와 했을 때의 수익을 비교해보겠습니다.

 

우선 유동성 공급을 한 경우입니다.

 

기간 동안 eth는 121% 올랐고, eth 수량은 28% 감소, usdt는 59% 증가하여 결국 59% 수익이 발생하였습니다. 이 표를 보고 eth 상승에 비하여 수익이 낮다고 생각하실 수 있는데요. eth 상승은 eth 단독 코인의 경우이고, 유동성 공급을 하였다는 것은 eth + usdt 를 함께 투자하였다는 의미입니다. eth가 오르는 동안 usdt는 오르지 않았으므로, eth와 usdt를 별도로 가지고 있는 경우와 비교를 해 보아야 합니다.

 

eth 단독 보유한 경우에는 eth의 상승분은 모두 반영하고, 당시 usdt를 더하면 됩니다. 이렇게 되면 eth가 121%가 올랐지만 61% 오른 것도 계산이 됩니다. eth-usdt 유동성 공급한 것과 비교하면 거의 차이가 없습니다. 

 

 

결론적으로 너무 단기에 급등하지 않는다면 2배 혹은 3배로 오르더라도 유동성 공급하는 것이 크게 손실이 나지 않습니다. 특히 비슷한 가격대에서 장기적으로 횡보한다면 수수료 수익을 확보할 수 있기 때문에 유동성 공급이 더 유리할 수 있습니다. 또한 유동성 공급을 해 놓으면 뇌동매매를 하지 않기 때문에 장기 보유하기 편한 점도 있습니다.

 

 

 

반응형

설정

트랙백

댓글

유동성 공급을 하면 한번 쯤 듣는 단어가 Impermanent loss입니다. 한글로는 비영구적손실..
뭔가 아주 어려운 의미같습니다. 손실은 손실인데 비영구적이는 것이 무슨 의미일까요?

 

비영구적이란 영구적이 아니라는 의미입니다. 즉 확정 손실이 아니라는 의미입니다. 따라서 비영구적 손실이란 유동성 공급을 하였을 때 필연적으로 발생하는 손실을 말합니다. 비영구적이라함은 유동성 공급을 계속하고 있으면 손실이 나지 않을 수도 있다는(?) 의미로 이해는 되지만 사실을 그렇지 않습니다. 유동성 공급을 하는 순간 상대적 손실은 발생합니다. 손실이 발생하지 않는 딱 한가지 경우가 있는데, 바로 유동성 공급하는 시점과 같은 가격이 되는 순간입니다. 따라서 유동성 공급자의 비영구적손실은 유동성 공급을 유지하고 있으면 손실이 아니다라는 말은 사실은 틀린말입니다. 앞에서 설명한 딱 한가지 경우을 제외하고는 무조건 상대적 손실이 생깁니다.

 

그런데 왜 유동성 공급을 할까요? 그것은 바로 Impermanent loss가 상대적 손실이기 때문입니다. 여기에서 상대적과 절대적의 의미를 이해를 해야하는데요.

 

예를들어보겠습니다. $100에 산 A 토큰이 $110이 되었습니다. 사용자 F는 $110에 A 토큰을 팔았습니다. $10의 이익이 생겼습니다. 하지만 사용자 G는 A토큰을 $110이 되기 전인 $109에 팔았습니다. 사용자 G의 이익은 $9입니다. 사용자 G는 사용자 F와 비교를 해보면 조금 빨리 팔아서 $1의 상대적인 손실이 생겼습니다. 사용자 G 입장에서는 빨리 팔아서 더 벌 수 있는 기회를 놓친거죠.

 

A토큰과 USDT를 유동성 공급한 사용자 Z는 입장에서는 A 토큰의 가격이 변화면서 지속적으로 매매가 이루어지고 있습니다. 어느 시점 A 토큰을 가격이 $110일 때 유동성에 있는 A의 가치는 $110이 아닌 이보다 작은 어떤 값이 됩니다. 그 이유는 앞에서 설명한 사용자 G와 같이 행동을 하기 때문입니다.

즉 유동성 공급자는 토큰을 보유하고 가만히 있는 사람에 비해서는 어떤 비율만큼 손실이 발생합니다. 이것을 Impermanent loss라고 합니다.

 

아래 그래프 많이 보셨을 겁니다. 가격이 상승하는데 왜 손실이 발생하느냐라는 질문을 많이 하게 만드는 그래프입니다. 앞에서 설명하였듯이 중간 중간 매도를 하기 때문에 특정 가격에서 보면 유동성 공급하지 않고 보유한 사람에 비하여 Impermanent loss 만큼 상대적 손실이 생깁니다.

문제를 간단하게 정의하기 위하여 A는 변동 코인, B는 stable 코인으로 가정하겠습니다.
그래프의 내용을 좀더 이해하기 싶게 수치로 정리해 보겠습니다.

 

A 코인의 가격 변화
1.25x price change = 0.6% loss
1.50x price change = 2.0% loss
1.75x price change = 3.8% loss
2x price change = 5.7% loss
3x price change = 13.4% loss
4x price change = 20.0% loss
5x price change = 25.5% loss

 

즉 A 코인이 2배 오르면 상대적으로 5.7% 손해를 봅니다. 다시말하면 유동성 공급하지 않았으면 100% 수익이 나는데, 유동성 공급을 함으로써 94.7% 수익이 난다는 의미입니다. 당연하겠지만 A 코인의 가격이 오르면 오를수록 Impermanent loss는 커집니다. 왜냐하면 상승 중간 중간 A 코인을 팔아서 수량이 적어지기 때문입니다.

A 코인이 급등하여 5배 올랐다면 25.5%의 Impermanent loss 생깁니다. 5배나 올랐는데, 25.5% 덜 벌면 어때라고 생각하신다면 아무 문제가 없습니다만, 그래도 아쉽기는 하죠.

 

유동성 공급을 하면 Impermanent loss가 생기므로, 장기투자가들이 유동성 공급을 하지 않으려고 할것입니다. 그래서 유인책으로 swap시에 발생하는 수수료를 유동성 공급자에게 지급합니다. uniswap의 경우에는 수수료가 0.3%입니다. 이걸 모아 유동성 공급자에게 지급하는 거죠. 거래량이 많으면 수수료 수입이 짭짤해지므로, Impermanent loss가 어느정도 상쇄가 됩니다. 그래도 A 토큰 가격이 급등하면 Impermanent loss가 크기 때문에 수수료로는 감당이 안됩니다. 그럼에도 불구하고 유동성 공급을 하는 이유가 있겠죠.

 

저 같은 경우에는 별 생각없이 채굴 수익보고 유동성 공급을 하고 있는데요. 추가적으로 토큰을 장기보유하기 위함입니다. 그냥 계좌에 있으면 20-30%만 올라도 매도하고 싶은 욕구가 끓어올라오죠. 이걸 잠재울 수 있는 방법이 유동성 공급이라고 생각합니다.

 

여기까지는 유동성 공급에 대한 일반적인 이야기이고요. 제가 이 이야기를 이렇게 길게 한 이유는 유동성 공급하면서 발생하는 손실에 대하여 정확하게 알고 공급을 하여야 한다는 사실을 여러번 느꼈기 때문입니다.

이렇게 오르기만 하면 큰 문제가 없는데요. 문제는 내리는 경우입니다. 아래 참조한 글에서도 오른 예만 나오지 내린 예는 나오지 않습니다. 유동성 공급 중인데 A 코인이 폭락하면 아주 아주 손실이 커집니다.

 

A 코인의 가격 변화
-0.05x price change = 0.03% loss
-0.25x price change = 1.03% loss
-0.50x price change = 5.72% loss
-0.90x price change = 42.5% loss
-0.95x price change = 57.4% loss

 

25% 빠져도 1.03% 손해를 보내라고 해석을 하면 큰일이 납니다. Impermanent loss는 상대적 손실이라고 했습니다. 즉 -25% 대비하여 1.03% 손해이므로 거의 -24% 정도 손실이 나는 겁니다. 50% 손실이 나는 경우도 5.72% 손실이 나는 것이 아니라 44.28% 정도 손실이 나는 것입니다. 따라서 손실에 대해서는 빠른 대응이 필요합니다. 유동성 공급도 손절은 필수이니 꼭 유념하시기 바랍니다. 물론 장기적으로 유망한 코인이라면 50% 떨어져도 그냥 유동성 공급하셔도 됩니다. 결국 오를 것이기 때문에 중간의 가격 변화는 상관이 없겠죠.


여기까지는 Impermanent loss의 의미에 대한 설명이었습니다. 다음은 이 값을 직접 계산해보겠습니다.
수식은 아래와 같습니다.

여기에서 A코인의 price_ratio는 현재가/공급시가격 입니다.

이 수식으로 excel을 이용하여 계산한 결과 입니다.

A코인 가격 상승에 따른 유동성에 존재하는 A 코인의 수량 변화를 보시기 바랍니다. 가격 상승에 따라서 수량이 계속 줄고 있습니다. 대신 B코인 수량이 증가하는 것을 볼 수 있습니다. 그래프에서와 같이 5배 상승하면 Impermanent loss가 25.46% 나옵니다.

 

excel로 계산한 값은 수식을 대입한 것이므로, 당연히 맞게 나옵니다. 하지만 실제 유동성 공급한 코인에 대해서도 이런 결과가 나오는지 궁금해져서 수식을 보게 되었는데요. 다음에는 수식으로 계산한 값과 실제 유동성 공급한 부분에서도 같은 결과가 나오는지 확인해보겠습니다.

 

참고자료
https://academy.binance.com/en/articles/impermanent-loss-explained
https://www.reddit.com/r/UniSwap/comments/eza8u4/how_to_calculate_uniswap_impermanent_losses_fees/

반응형

설정

트랙백

댓글

암호화폐 선물시장은 특이하게도 funding fee라는 것이 있습니다. funding fee는 매수/매도 중 position이 50%가 넘는 쪽이 부담하는 비용으로 매수/매도 balance를 맞추기 위하여 도입된 제도입니다. 반면에 일반 선물 시장에 비하여 장점은 무기한으로 포지션을 유지할 수 있다는 점입니다.

 

이러한 암호화폐 선물시장의 특성을 이용하여 암호화폐 매수 / 암호화폐 선물 매도 포지션을 유지하고 있으면(무기한) funding fee 수입을 올릴 수 있는 무위험 차익거래가 가능합니다.

 

funding fee는 상황에 따라 변하는데요. 인기가 없는 종목은 0.01%에서 인기가 좋은 경우에는 0.3%까지 올라갑니다. 아래는 현 시점 funding fee 중 낮은 순/높은 순입니다. 지금은 funding fee가 높은 상태입니다.

 

funding fee는 매 8시간마다 지급이 됩니다. 따라서 하루 3번 지급이 되는데, bnb 경우에 일 funding fee 수입은 약 0.7%까지 올라갑니다. 일 0.7%이면 연 200%가 넘는 고수익을 얻을 수 있습니다. 항상 이렇게 높은 funding fee가 나오지 않으므로 대략 예상을 해보면 100% 정도는 나올 것 같습니다. 

 

이를 정리하자면 인기있는 암호화폐를 잘 골라서 장기로 무위험 포지션을 가지고 있으면 연 100% 정도 수익이 가능하다는 의미입니다.

 

현재 저의 포지션은 아래와 같으며, 현재 가치로 balance는 $11,418입니다. PNL이 -인 것이 많은데, 동일 수량의 암호화폐를 매수해 두었으므로, 별 의미없는 수치입니다. 또한 Liq. Price도 현재가 대비 약 10배 정도 여유가 있으므로, 담보부족 사태에 대하여 크게 신경쓸 필요도 없습니다. 그 이유는 저는 1x로 매도만 하였기 때문에 원금대비 여유가 많은 상태입니다. 전업 투자가가 아니라면 1x로 매도해서 신경을 덜 쓰는 것이 좋을 것 같습니다.

조금 전 오후 5시에 나온 funding fee입니다. 총 20$이 나왔군요.

 

잔고가 $11,438이 되었습니다. 8시간에 $20이 늘어났으므로 연 191% 수익이 예상됩니다. 물론 지금은 funding fee가 높은 편이기 때문에 이런 수익률이 나옵니다. 평소에 나오는 funding fee는 보통 연 70-80% 정도 예상됩니다.

trading에 대한 고민없이 암호화폐 현물매수/선물매도 후 그냥 보유만하고 있으면 고수익을 올릴 수 있습니다. 그래서 전 요즘 trading을 거의 하지 않습니다. trading으로 연 70-80% 수익을 올린다는 보장이 없기 때문이죠. 또한 올해말까지는 암호화폐 수익에 대한 과세가 없기 때문에 실질 수익률은 더 높습니다.

 

이 방식의 유일한 단점이 하나 있습니다. 바로 funding fee가 -로 가는 경우인데요. 다시말하면 매도 포지션이 50%를 넘으면 매도자가 funding fee를 부담해야 합니다. 일 예로 얼마전 waves가 폭등하면서 선물 매도 포지션이 급격하게 증가하면서 funding fee가 -인 상황이 발생하였습니다. 

이런 경우에는 일시적으로 매도세가 우세할 것으로 예상이 되면 좀 더 가져가도 되지만, 잘 판단이 안되면 포지션 정리하면 됩니다. 즉 선물 매수/현물 매도하면 포지션 정리가 됩니다.

 

이렇게 가끔씩 매도 포지션에 funding fee가 붙는 경우가 있으니, 생각날 때 마다 접속해서 확인해보면 좋습니다. binance 거래소 api로 funding fee가 -인 경우에 telegram bot으로 알람을 보내주는 프로그램도 만들면 좋을 것 같습니다. 이러면 자주 접속할 필요도 없겠죠.

 

또 한가지 문제가 있습니다. 바로 김프인데요. 지금은 김프가 15% 정도 있어서 신규로 이 방식 투자를 하기에는 조금 애매합니다. 하지만 워낙 무위험 고수익이 보장되기 때문에 김프가 적절하게 빠지는 시점에 이 방식으로 투자하시를 권해드립니다. 

 

가끔씩 현 포지션 기준으로 funding fee가 어떻게 변했는지 정리해서 공유하도록 하겠습니다.

 

 

다음에는 현물로 사 놓은 암호화폐를 DeFi에 넣어서 추가 수익을 얻는 방법에 대해서 기술하도록 하겠습니다.

 

------------------

 

제가 사용하는 사이트는 binance.com입니다. 아래 링크로 가입하시면 10% 수수료 DC를 받을 수 있습니다. 

www.binance.com/en/register?ref=P30O3TM1

반응형

설정

트랙백

댓글

지난 번 글에 이어 40%짜리 defi 소개합니다.

stable 코인을 쌍으로 넣기 때문에 risk가 거의 zero입니다.

 

추가로 연 20% 나오는 DeFi가 나왔습니다. 여기는 바로 terra에서 최근에 발표한 lending site인 anchor입니다.
terra chain의 stable coin인 ust를 deposit하면 연 20%를 줍니다. uniswap이나 pancake에 비하여 처음 투자하시는 분이 상대적으로 쉽게 접근할 수 있습니다. 어제 제 지인에게도 ust deposit을 권해주었습니다. 상대적으로 설명하기도 쉽고 이해도 잘 하더군요. 다만 김프가 너무 높아서 일단은 지켜보고 있다고 합니다.

https://app.anchorprotocol.com/earn

stable coin defi가 대충 20% 정도인데요. 연 20% 이상의 수익을 얻을 수 있는 사이트를 발견하여 소개해드립니다.

 

  1. dodo
    https://app.dodoex.io/mining
    bsc 거래소 중의 하나인데요. 현재 busd-usdt pair로 45% 정도 나옵니다. 무기한으로 45%를 제공하는 것은 아닌 것같습니다. 기간 제한이 있는 것으로 보이니 수시로 확인하여야 하는 불편함은 있습니다.

  2. belt
    최근에 pancake에서 ifo한 토큰입니다. belt도 stable코인 swap을 전문으로 하는사이트입니다. stable coin을 swap해 주려면 stable coin이 많이 필요하겠죠. 그래서인지 stable coin 수익률이 현재로써는 최고입니다.
    무려 연 77%, 일 0.21%입니다.
    4 종류의 stable을 모두 staking할 수 있는데요. 각 코인의 수량도 다양하게 넣을 수 있습니다. 다만 한가지 단점은 지갑에 있는 4가지 stable coin을 모두 넣어야하더군요. 수량 조절하는 부분이 없어서 지갑에 각 토큰의 양을 조절한 후 유동성 공급을 하셔야 합니다. 또 한가지는 유동성 공급하는 토큰의 수만큼 approve를 해 주어야 한다는 점도 참고하시기 바랍니다.

Belt에 유동성 공급된 스테이블 코인은 Venus에 투자가 됩니다. Venus에 직접 투자를 하여도 비슷한 수익률이 나올 수 있지만 belt에 투입하는 것이 더 편한 것 같습니다.

 

현재 두 군데 모두 투자하고 있으며, 풀에 대한 변화가 생기면 공지하도록 하겠습니다.

 

마지막으로 stable 코인 defi여서 코인 하락에 대한 risk는 거의 없지만 맏기는 사이트에 대한 risk는 여전히 존재합니다. 따라서 적절한 금액만 투입하기는 것이 안전할 것 같습니다.

 

--------------

 

defi를 이용하기 위해서는 binance 거래소 계정이 필요합니다. 아래 링크로 가입하시면 수수료 10% DC 됩니다.

 

www.binance.com/en/register?ref=P30O3TM1

반응형

설정

트랙백

댓글

그동안 소개한 파이썬을 이용한 BSC Smart Contract 관련 글을 모두 모아서 pancakeswap에서 채굴 중인 pool 중 특정 수량 이상 harvest된 pool에 있는 cake을 harvest한 후 정해놓은 syrup 풀에 deposit하는 파이썬 프로그램을 완성하였습니다. 이제는 파이썬 프로그램에 규칙을 등록해놓으면 알아서 harvest하고 deposit할 수 있습니다.

 

소스는 아래 guthub에 있습니다.

 

github.com/multizone-quant/DeFi/blob/main/DeFi_harvest_deposit

 

사용법은 간단합니다. 

아래 부분에 원하는 값을 입력하시면 됩니다. my_addr는 본인이 사용하는 eth주소, my_priv는 해당 주소의 private key입니다. claim, deposit을 하기 위해서는 private key가 필요합니다.

 

POOL_NAME는 수정할 필요가 없고, MIN_HARVEST_NUM 값은 claim할 최소 갯수입니다. 이렇게 claim한 cake은 DEPOSIT_POOL에 지정된 pool에 deposit합니다.

 

현재 test한 syrup풀은 alice이며 본인이 사용하는 syrup pool의 smart contract를 찾아서 추가하면 됩니다.

 

# 수정할 부분
my_addr = 'my eth address'
my_priv = "my_addr's priavate key"

POOL_NAME = 'pancake-masterchef'
MIN_HARVEST_NUM = 2.3  # harvest할 최소 수량
DEPOSIT_POOL = 'syrup-alice'  # harvest한 cake을 저장할 pool

# 수정할 부분 끝

새로운 syrup 풀을 추가하는 방법은 bscscan.com에서 pool의 주소를 확인한 후 sc_addr에 추가하면 됩니다.

 

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

contract 별로 abi가 별도로 존재하는데, 이것을 자동으로 가져오는 함수도 발견하였습니다. 관련 함수는 fetch_abi() 입니다. 한번 사용한 contract는 컴퓨터 내부에 저장하고 있으므로, 이후에는 빠른 처리가 가능합니다.

 

pancakeswap masterchef에 있는 pool 중 BRY-BNB에 있는 BRY smart contract가 조금 이상합니다. name() 항목이 abi가 존재하지 않아 오류가 발생하더군요. 그래서 cake-bnb abi를 이용하여 모든 pool에 대하여 사용하는 방식으로 오류를 회피하였습니다.

 

코드는 간단하므로, 자세한 설명을 생략합니다. 

 

실행한 결과입니다. 2.3개이상 채굴한 두 pool이 claim되었습니다.

 

 

그 결과를 bscscan에서 확인해보겠습니다. 풀 2개에서 cake이 claim되었고, alice pool에 deposit되었습니다. 그동안 alice pool에서 채굴 중이던 alice도 claim되었군요. 이건 자동으로 이루어지는 것입니다.

 

 

 

다음 편에서는 cake 가격이 특정 가격 이상이면 시럽에 deposit하지않고 busd로 swap하는 코드까지 소개하도록 하겠습니다.

 

반응형

설정

트랙백

댓글

요즘 이자 수익률이 1%대 입니다. 상당히 낮은 수익률이죠.

하지만 DeFi 쪽으로 눈을 돌리면 아주 아주 안정적으로 20% 이상의 고수익을 얻을 수 있습니다. 그것도 방법이 아주 많습니다.

이번에는 리스크 (거의) zero인 stable coin을 이용한 defi 수익률을 정리해보고자 합니다.
우선 stable 코인에 대한 정의가 필요한데요.

stable 코인은 US$1을 추종하는 코인입니다. 여기서 추종한다는 의미는 노력한다는 의미이지 반드시 1불을 따라간다는 것은 아닙니다. 일시적으로 1불을 지키지 못하는 경우도 있지만 대부분 $1을 지킵니다.

그럼 stable 코인으로 staking을 하면 staking 토큰의 가치가 하락할 일은 없으니, staking한 자산의 가격 변동성에 대하서는 무시하면 됩니다. 남은 것은 제공하는 이율만 신경을 쓰면 됩니다.

 

1. pancakeswap
https://exchange.pancakeswap.finance/#/swap
BSC 체인의 대표적인 defi 사이트죠.
현재 20-30% 정도 수익률이 나옵니다.

 

2. venus
https://app.venus.io/dashboard

 

BSC 체인에서 대표적인 lending 사이트입니다. usdt, busd 수익률이 약 16%, 추가로 이것을 담보로 VAI mint한 후 staking하면 8% 정도 나옵니다. 합하면 24%

 


3. uniswap
분산거래소가 가장 유명한 곳이죠. 여기에 LP 공급을 하면 수수료인 0.3%를 LP 공급자에게 지급합니다. 수익은 거래량에 비례하는데 안정적인 usdc/usdt pair의 경우에 연 10-20% 사이 나옵니다.

 

4. 가끔씩 나오는 핫한 사이트입니다.
오늘 출시된 따끈뜨끈한 사이트입니다.
말이 안되는 수익률이지만 현재는 이렇습니다. 앞으로는 계속 떨어질 것으로 예상합니다.
이런 사이트는 믿음이 중요한데, 믿을만한 곳이 아니면 투자를 하면 안됩니다.

 

결론적으로 자동매매로 이정도 수익률이 나온다는 보장이 없어서 요즘은 DeFi 위주로 투자하고 있습니다.

 

 

--------------

 

defi를 이용하기 위해서는 binance 거래소 계정이 필요합니다. 아래 링크로 가입하시면 수수료 10% DC 됩니다.

 

www.binance.com/en/register?ref=P30O3TM1

반응형

설정

트랙백

댓글

 

node.js를 이용한 방법은 많이 나와있지만 파이썬을 이용한 방법을 찾지 못하여 어렵게 방법을 찾았습니다.

어디에도 없는 파이썬을 이용한 BSC Smart Contract에서 claim하는 방법에 대하여 정리합니다.

 

pancakeswap 중 syrup에 있는 Alice pool에서 채굴 중인 cake을 자동으로 claim하는 코드입니다. 다른 pool의 경우에도 주소만 변경하면 같은 방식으로 claim이 가능합니다.

 

우선 alice 채굴 풀의 주소입니다.
'syrup-alice' : '0x4C32048628D0d32d4D6c52662FB4A92747782B56'

이 주소에 접속한 후 contract 부분을 보면 아래와 같은 정보를 확인할 수 있습니다.

  • 현재까지 채굴된 cake 수 : pendingReward(my_addr)
  • 현재까지 채굴된 cake claim : withdraw(0)

 

alice 채굴풀의 Smart Contract에서 채굴한 수량을 검색한 후 일정 수량이상 쌓여있다면 withdraw()를 하면 됩니다.

 

pendingReward() 함수는 직관적이라 설명을 생략하고요. 채굴된 cake을 claim하는 함수가 withdraw()입니다. 그런데 deposit한 cake도 뺄 때 사용하는 함수입니다. 따라서 deposit한 cake은 빼지않고, reward만 claim하는 방법은 인자로 0을 넣으면 됩니다.

pancakeswap에서 claim을 해보면 지갑이 뜨고, Confirm을 눌러야 claim이 됩니다. 이런 일을 코드로 전달해주어야 합니다. 그런데 이 부분이 아주 난감했습니다만, 어찌어찌하여 방법을 알아내었습니다.

코드는 아래와 같습니다.

 

sc_addr = {
    'bnb-busd' : '0x1B96B92314C44b159149f7E0303511fB2Fc4774f',
    'cake-bnb' : '0xA527a61703D82139F8a06Bc30097cC9CAA2df5A6',
    'ust-nflx' : '0xF609ade3846981825776068a8eD7746470029D1f',
    'syrup-alice' : '0x4C32048628D0d32d4D6c52662FB4A92747782B56',
}
sc_abis = {
    'syrup' : '[]'  # abi 코드가 길어서 삭제함.
}

my_addr  = 'my eth address'
my_priv = 'my private key'

w3 = Web3(Web3.HTTPProvider('https://bsc-dataseed.binance.org/'))

print(w3.isConnected())

# alice harvest
if 1 : 
    addr = sc_addr['syrup-alice']
    abi = sc_abis['syrup']
    syrup = w3.eth.contract(address=addr, abi=abi)
    pending = syrup.functions.pendingReward(my_addr).call()
    print(pending)
    tx = syrup.functions.withdraw(0).buildTransaction({   # 채굴한 코인 claim시에는 0
                'gas': 150000,
                'gasPrice': w3.toWei('10', 'gwei'),
                'nonce':  w3.eth.getTransactionCount(my_addr),
            })
    signed_tx = w3.eth.account.signTransaction(tx, private_key=my_priv)
    ret = w3.eth.sendRawTransaction(signed_tx.rawTransaction)

이 코드의 결과를 bscscan에서 확인해보겠습니다.

 

 

 

원하는 결과가 나왔습니다.
앞으로는 주기적으로 자동으로 claim하고, 원하는 곳에 deposit을 할 수 있을 것 같습니다.

 

그동안 소개한 Smart Contract를 다루는 방법을 모아서 pancakeswap에서 채굴 중인 cake을 claim한 후 syrup pool에 deposit하는 작업을 마무리한 후 코드 공개하도록 하겠습니다.

 

반응형

설정

트랙백

댓글

BSC DeFi에 대한 간단한 소개에 이어 이제 실전으로 들어가보겠습니다.

우선 web3.py를 설치하여야 합니다. 설치 방법은 아래와 같이.

 

pip install web3

 

DeFi 프로젝트에 따라서 smart contract을 만드는 방식이 다양합니다. 따라서 사이트에 맞게 필요한 smart contract 주소를 잘 찾아야합니다. 예제로 선보인 pancakeswap은 아래와 같은 구조로 구성되어 있습니다.

 

pancakeswap 풀에 있는 모든 풀은 MasterChef라는 이름의 smart contract 만들어져있습니다. 각각의 풀도 smart contract이고 각 풀에 있는 token들도 smart contract로 만들어져있습니다.

 

 

각각의 smart contract 주소는 아래와 같습니다.

 

MasterChef : 0x73feaa1eE314F8c655E354234017bE2193C9E24E
   |
  +-- Cake-BNB LP : 0xA527a61703D82139F8a06Bc30097cC9CAA2df5A6
     |
    + Cake : 0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82
    + Bnb : 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c

 

전 글에서 언급하였듯이 smart contract의 ABI가 필요합니다. bscscan에 접속하여 해당 주소를 입력한 후 ABI 값을 복사해옵니다.

 

Cake-BNB LP와 Cake, Bnb의 경우에는 Cake-BNB LP smart contract를 사용합니다. 일반적인 smart contract에 있는 함수만 사용하기 때문에 각각의 ABI 파일을 다운받을 필요가 없지만 각 contract 고유의 기능을 사용하려면 별도로 모두 받아야합니다. 이 절차가 조금 번거롭기는 합니다.

 

파이썬 프로그램으로 해당 smart contract의 값을 읽어오는 절차입니다.

 

우선 bsc network으로 Web3를 기동시킵니다. 사용하는 블럭체인에 맞는 주소를 입력해주면 됩니다.

w3 = Web3(Web3.HTTPProvider('https://bsc-dataseed.binance.org/'))

 다음으로는 검색할 pool에 대한 주소와 ABI 값을 dict구조에 추가합니다. 앞으로 여러 pool을 대상으로 검색을 할 수 있도록 dict 형태로 작업을 했습니다.

그리고 common abi도 하나 복사해두었습니다. 이건 Cake-BNB LP에서 가져온 ABI입니다.

 

이러한 정보를 바탕으로 w3.eth.contract() 함수를 호출합니다.

pools = { 
        'pancake' : 
            {   'addr':'0x73feaa1eE314F8c655E354234017bE2193C9E24E',
                'abi' : '[{"inputs":[{"internalType"...]' # 너무 길어서 생략
            },
}

# 일반적인 풀의 abi. 만약 함수명이 틀린 풀이 있으면 해당 풀의 abi로 대체
contract_common_abi = '[{"inputs":[],"payable":false, ...]' # 너무 길어서 생략

def pool_info():
    for name in pools : 
        ee = w3.eth.contract(pools[name]['addr'], abi=pools[name]['abi'])
        

 

pancakswap MasterChef ABI를 보고서 필요한 함수를 부릅니다. 이 ABI에는 pool의 갯수를 알려주는 함수가 있습니다. 풀 갯수만큼 루프를 돌리면서 본인이 staking한 풀에 채굴된 cake 수량을 출력해주는 함수입니다.

 

        # 풀의 총 갯수를 얻는다.
        poolLength = ee.functions.poolLength().call()
        for 풀 수량 만큼 :
            # 해당 풀에 deposit한 수량을 얻는다.
            user_info = ee.functions.userInfo(i, my_addr).call()
	
            # 만약 내가 staking한 pool이면
            if user_info[0] > 0 :  # for only staked pools
                # 풀에 대한 정보를 얻는다.
                poolInfo = ee.functions.poolInfo(i).call()

                # deposit한 LP 수량을 얻는다.
                deposit = user_info[0] / (10 ** 18 ) 

                # 채굴된 cake의 수량을 얻는다.
                pending_cakes = ee.functions.pendingCake(i, my_addr).call() 
                pending_cakes_real = pending_cakes/(10 ** 18 )


                # 해당 풀의 smart contract 주소를 얻는다.
                addr1 = poolInfo[0]

                # 해당 풀의 토큰의 주소와 abi로 smart contract 정보를 얻는다.
                e1 = w3.eth.contract(addr1, abi=contract_common_abi)

                # 1번 토큰의 주소를 얻은 후 smart contract 정보를 얻는다.
                token1 = e1.functions.token0().call()
                t1 = w3.eth.contract(token1, abi=contract_common_abi)

                # 1번 토큰 정보를 얻는다
                name1 = t1.functions.name().call()
                sym1 = t1.functions.symbol().call()

                # 2번 토큰의 주소를 얻은 후 smart contract 정보를 얻는다.
                token2 = e1.functions.token1().call()
                t2 = w3.eth.contract(token2, abi=contract_common_abi)

                # 2번 토큰 정보를 얻는다
                name2 = t2.functions.name().call()
                sym2 = t2.functions.symbol().call()

                print("[%6s - %6s] %10.3f   %10.3f"%(sym1, sym2, deposit, pending_cakes_real))

 

 결과를 확인해보겠습니다.

 

화면에서 보는 수량과 일치하는 값을 얻을 수 있었습니다.

이 방식을 기반으로 여러 DeFi 프로젝트의 smart contract 주소와 ABI 파일을 구하면 본인이 투자한 DeFi에서 채굴한 토큰의 수량을 바로 파악을 할 수 있을 것 같습니다.

 

다음으로 할 일은 채굴된 토큰들을 자동으로 claim하는 부분입니다. 이 또한 예제가 부실하여 아직 작업이 마무리되지 못하였습니다. 이번 주말에 작업해서 성공한다면 정리해서 올리도록 하겠습니다.

 

파이썬으로 BSC Smart contract를 다루는 예제를 발견하기 어려운데요. 이렇게 간단하게 구현할 수 있는 것을 아주 아주 힘들게 돌아온 것 같습니다. 

 

본 글에 나오는 예제는 아래 github에 있습니다.

 

github.com/multizone-quant/DeFi/blob/main/WatchingDeFi.py

반응형

설정

트랙백

댓글

요즘은 트레이딩 보다는 DeFi에 집중을 하다보니, 자동매매 관련 글을 못올리고 있습니다. pancake, mir 등등 안정적이면서 높은 수익률을 보여주는 DeFi가 많이 있습니다. 이외도 현재 채굴 중인 DeFi가 많다보니, 매일같이 접속해서 채굴된 코인 claim하고 현재가에 매도하는 것만 해도 많은 시간이 소요됩니다.

 

이렇다보니, 검증된 DeFi의 현재 staking 상황, 채굴된 토큰 수량, 심지어 현재가 기준으로 자산 평가액까지 보여주는 사이트도 등장하였습니다. 대표적인 사이트가 yieldwatch.net/ 입니다. 원하는 DeFi를 선택한 후 주소를 입력하면 현재 투자한 DeFi에 대한 시가 평가액을 보여줍니다. 한눈에 투자 상황을 볼 수 있어서 엄청나게 편리합니다. 

 

 

심지어는 투자중인 DeFi를 등록하면 채굴된 토큰을 주기적으로 claim한 후 해당 LP에 추가해주는 사이트까지 등장하였습니다. 대표적인 사이트가 https://autofarm.network/ 입니다. 이 사이는 auto라고 하는 자체 token도 발행하여 타 사이트에 비하여 높은 수익률을 제공해주고 있습니다.

 

 

yieldwatch 덕분에 투자 상황을 한눈에 파악할 수 있고, autofarm 덕분에 claim하는 수고를 들기는 했지만 그래도 직접 claim하는 경우도 많이있습니다.

 

이에 현재 채굴 중인 Binance Smart Contract 이하 BSC 기반 DeFi의 채굴 상황을 확인하고, 필요하다면 claim까지 하는 프로그램을 만들어보고자 합니다.

 

BSC는 이더리움 기반이다보니 DeFi에 사용하는 smart contact는 solidity언어로 개발되어 있습니다. 이미 만들어진 smart contract를 읽고/쓰기 위해서는 다양한 언어를 이용할 수 있습니다.

 

전 파이썬을 주로 사용하기 때문에 파이썬을 이용하여 smart contract를 다루어 보도록 하겠습니다. 그런데 문제는 파이썬을 이용하여 BSC smart contract를 다루는 예제가 많지 않았습니다. 구글링을 통해서 조각을 맞쳐가면서 작업을 진행하고 있습니다.

 

우선 파이썬을 이용하여 이더리움 기반 smart contract를 다룰 수 있는 패키지는 web3.py입니다.

 

 

web3.py 덕분에 새로운 언어를 배우지 않고도 원하는 작업을 할 수 있어서 다행입니다.

 

다음으로는 Smart contract에 대하여 간단하게 알아보겠습니다.

 

BSC DeFi 대명사인 pancakeswap입니다. 무려 80여개의 채굴 풀이 동작 중입니다. 그러다보니 본인이 채굴 중인 풀을 찾기가 힘들었었는데요. 최근 staked only 항목이 생겨서 채굴 중인 풀을 한 눈에 볼 수 있어서 많이 편해졌습니다.

 

 

채굴 풀은 smart contract로 만들어져있습니다. 한번 만들어진 smart contract는 절대 변경할 수가 없습니다. 따라서 코드 오류만 없다면 안전하다고 볼 수 있습니다. 특정 풀의 smart contract는 bscscan.com/에서 확인이 가능합니다.

pancakeswap의 smart contract 주소는 0x73feaa1eE314F8c655E354234017bE2193C9E24E 입니다.

bscscan.com에서 해당 주소를 입력해보면 아래와 같은 내용을 볼 수 있습니다. 이 중 contract를 클릭하면 해당 smart contract의 소스코드를 볼 수 있습니다.

 

 

이 중 우리가 필요한 것은 ABI 입니다. abi는 Application Binary Interface의 약자로 해당 smart contract를 외부에서 사용할 수 있는 api라고 보시면 됩니다. 오른쪽에 있는 복사 아이콘을 사용하여 복사한 후 프로그램에서 사용하면 됩니다.

 

 

이제 pancakeswap에 있는 풀의 내용을 읽을 수 있는 준비가 되었습니다.

다음 글에서는 web3.py를 이용하여  pancakeswap 풀을 읽는 예제를 파이썬 코드로 소개하도록 하겠습니다.

 

반응형

설정

트랙백

댓글

etrade api를 이용한 시스템 트레이딩과 관련된 글을 적으려고 했는데, 내용을 정리하는데 시간이 많이 걸리는군요. 좀 더 정리해서 공개하도록 하겠습니다.

 

사실 요즘은 트레이딩보다는 DeFi 쪽 수익이 더 좋아서 시스템 트레이딩은 등한시하고 있는 것도 사실입니다.

 

제가 지난 주 부터 셋팅한 Mirror 사이트를 소개해드립니다.

 

Mirror는 Terra 블록체인을 사용하는 프로젝트로 Terra 재단에서 직접 개발에 참여한 프로젝트입니다. 그만큼 신뢰해도 된다는 의미입니다. 최근 BSC 기반 DeFi 몇 건에서 스캠이 발생하면서 수익률 좋은 DeFi에 무조건 참여하는 것은 조심해야 합니다. 그래서 저도 어느 정도 검정이 된 DeFi만 참여하고 있습니다.

 

Mirror 사이트는 아래와 같습니다.

terra.mirror.finance/

 

다른 DeFi는 높은 수익률이 나오는 이유를 전혀 이해를 못하겠지만, Mirror는 대충 이해가 갑니다. Mirror는 특이하게도 미국 유명 주식과 UST pair로 LP를 만들 수 있습니다. 따라서 LP 자산에 대한 움직임에 대한 예측이 어느정도 가능합니다. 물론 알리바바가 미국 나스닥에서 상장폐지되는 사태가 생긴다면.. LP 가격도 엄청나게 빠지겠지요. 그래서 저는 비교적 안정적인 Google, Apple에 투자하고 있습니다. 추가로 VIXY는 수익률이 높아서 소액 투자하고 있고요. 

 

Mirror에 LP 공급을 하면 수익률이 상당히 높은데요. 그 이유는 채굴 토큰인 mir의 가격이 폭등하였기 때문입니다. 불가 몇 주 전에 mir는 $1 정도였습니다. 그런데 최근에 luna 가격이 오르면서 mir도 함께 올랐습니다. 현재 가격은 $5 정도. 기존에 비하여 수익률이 5배나 올랐습니다. 그러다보니, 높은 수익률을 추구하는 사용자들이 대거 입성했습니다. 이렇게 mAsset에 대한 수요가 증가하다보니, 현재 mAsset의 가격이 약 7% 정도 프리미엄이 형성되어 있습니다.

 

좀더 투자를 하고 싶은데 현재는 프리가 너무 높아서 일단은 관망 중입니다. 매일 채굴되는 mir는 절반을 팔아서 ust를 만든 후 나머지 수량으로 mir-ust lp 만들어서 지속 공급 중입니다.

 

연 300% 정도를 일복리로 재투자하면 1년 후에 약 10배가 넘습니다. 물론 mir 가격이 $5을 유지한다는 가정입니다. 

 

트레이딩으로 일 0.7%를 지속적으로 얻기가 쉽지 않습니다. 하지만 mir에서는 이게 가능합니다.

 

아직도 mir 가격이 높게 유지되는 과정이 정확하게 이해는 안되지만, 시장에서 수요가 많기 때문이라고 생각됩니다. 이 수요는 mir-ust lp로 얻을 수 있는 수익이 연 209% 라는 사실때문이겠죠.

 

앞으로 mir 가격의 방향에 따라서 mir defi의 방향이 정해질 것 같습니다. 아직은 순항 중입니다.

 

 

반응형

설정

트랙백

댓글