[암호화폐] bscscan 같은 프로그램 만들어보기(2)
지난 편에서는 아주 아주 간단하게 bscscan transaction을 출력해보았습니다.
이제는 조금 더 의미있게 trxid를 해석해보겠습니다. 해석상의 난해함이 있어서 하루 종일 작업을 했음에도 진도가 많이 나가지 않았습니다.
우선 bscscan에서 보면 아래와 같이 여러 토큰의 변화 과정이 나옵니다. 이 내용은 trxid에서 받아온 내용에는 존재하지 않습니다.
이 값을 알기 위해서는 trxid로 해당 transaction을 자세하게 읽어보아야 합니다.
api doc를 확인해보니 아래 방식으로 요청을 하면 됩니다.
https://api.bscscan.com/api?module=account&action=txlistinternal&address=0x0000000000000000000000000000000000001004&startblock=0&endblock=2702578&sort=asc&apikey=YourApiKeyToken
그래서 이걸 지원하는 api를 찾아보았습니다. 헐.. 아직 개발이 안되었군요,
def get_internal_by_hash(self, tx_hash=''):
"""
Currently not implemented
:return:
"""
여기서 멈추어나하나.. 한참을 고민하다가 제가 추가해보기로 했습니다. 이를 위하여 사용하는 api 소스를 찬찬히 살펴보았습니다.
특이하게도 url_dict에 keyword로 parameter를 등록하는 방식이었습니다.
self.url_dict[self.TXHASH]
그래서 api doc에 나오는 url을 참고하여 수정을 하였습니다. 기존 build_url() 함수는 transaction history를 구하는 것에 특화된 함수입니다. 그래서 build_url_internal() 함수를 추가하여 internal 함수를 위한 parameter를 설정하였습니다.
def get_internal_by_hash(self, tx_hash=''):
"""
Currently not implemented
:return:
"""
# updated by me
self.url_dict[self.ACTION] = 'txlistinternal'
self.url_dict[self.TXHASH] = tx_hash
self.build_url_internal()
req = self.connect() # added by me
if "No transactions found" in req['message']:
return {'status':"0"}
else:
return req
clinent.py
# added by me
def build_url_internal(self):
temp = self.url_dict.copy()
self.url_dict[self.ADDRESS] = ''
self.url_dict[self.OFFSET] = ''
self.url_dict[self.PAGE] = ''
self.url_dict[self.SORT] = ''
self.url = self.PREFIX + ''.join(
[param + val if val else '' for param, val in
self.url_dict.items()])
self.url_dict = temp
그리고 LP 주소와 pair 중 한 token 이름을 주면 나머지 token 이름을 돌려주는 함수도 하나 만들었습니다.
# return other token name in LP
def get_pair_token_name(addr, token_name) :
for each in sc_addr :
if sc_addr[each].lower() == addr.lower() :
names = each.split('-') #
if names[0] == token_name.lower() :
return names[1]
else :
return names[0]
return 'unknown'
이러한 것을 다 모은 코드입니다.
api = Account(address=MY_ADDR, api_key=BSC_SCAN_API_KEY)
transactions = api.get_transaction_page(page=1, offset=100, sort='desc', erc20=True)
my_addr = MY_ADDR.lower()
print("--------------------------------------")
print(" from to amount")
print("--------------------------------------")
pre_txid = ''
for each in transactions :
if each['from'] == '0x0000000000000000000000000000000000000000':
continue
qty = int(each['value'])/(10**18)
from_addr = ''
to_addr = 'my_addr'
if each['to'] == my_addr :
qty = int(each['value'])/(10**18)
from_token = get_pair_token_name(each['from'], each['tokenSymbol'])
print("%8s %7s %8.3f"%(from_token, each['tokenSymbol'], qty))
else :
ret = api.get_internal_by_hash(each['hash'])
if ret['status'] == '1' :
txids = ret['result']
to_token_name = get_token_name(txids[len(txids)-1]['from']) # to
qty = int(txids[len(txids)-1]['value'])/(10**18)
print('%8s %7s %8.3f'%(each['tokenSymbol'], to_token_name, qty))
결과를 보겠습니다. 비슷하게는 나옵니다만 중복된 내용도 보입니다. 그 이유는 trxid를 가져올 때 중복된 것이 있는데, 이것을 두 번 실행했기 때문입니다.
다음 편에서는 이런 중복 정보는 제거하고, defi 관련 채굴 사항을 좀 더 잘 구분할 수 있도록 정리를 해보도록 하겠습니다.
to be continued ...
[US$49.00](▼14%)[Nespresso]스타벅스 네스프레소 호환 캡슐 7종 / 120 캡슐 골라담기 / 20개씩 총 6종류 교차 선택 가능 / 중복 선택 가능 / 재고 확보 / 무료배송 / 개당 약 486원 최저가★
WWW.QOO10.COM@tipu curate 4
Upvoted 👌 (Mana: 0/10) Get profit votes with @tipU :)
@tradingideas transfered 45 KRWP to @krwp.burn. voting percent : 73.25%, voting power : 73.75%, steem power : 1771144.31, STU KRW : 1200.
@tradingideas staking status : 11000 KRWP
@tradingideas limit for KRWP voting service : 33 KRWP (rate : 0.003)
What you sent : 45 KRWP
Refund balance : 12 KRWP [53881068 - fc5d5d9f069ccd56710ce73e32dec7f4281cf10f]
Truly agree, absolutely fantastic ! Upvoted 👌