[암호화폐] bscscan 같은 프로그램 만들어보기(2)

in SCT.암호화폐.Crypto5 years ago (edited)

지난 편에서는 아주 아주 간단하게 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 ...

Sort:  

[US$49.00](▼14%)[Nespresso]스타벅스 네스프레소 호환 캡슐 7종 / 120 캡슐 골라담기 / 20개씩 총 6종류 교차 선택 가능 / 중복 선택 가능 / 재고 확보 / 무료배송 / 개당 약 486원 최저가★

WWW.QOO10.COM

@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 👌

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.082
BTC 60666.80
ETH 1563.25
USDT 1.00
SBD 0.47