Crypto-BscTradeHistory Project

Pre:

debank是个很好用的产品,比如交易历史功能,相比原生的bscsan的原生记录,debank的展示得更清晰,某笔交易和哪个项目的做了什么交互动作、token的交换记录、gas费用转换成u显示。
看着不错,仿照debank的交易历史功能做个小项目练练手。


debank交易历史界面:

20211031160825

有以下功能点:

  • 钱包余额总值
  • 不同的公链
  • 交易时间
  • 交易hash
  • 与什么合约做了什么交互动作
  • token的传输记录,增加了X Token,减少了X Token
  • gas费用换算成u

项目效果图:

项目地址:bsc_trade_history

20211104122542


功能点:

合约交互记录-重点:

20211031161445

有以下几个点:

  • 项目的logo
  • 项目名字
  • 调用合约的具体函数

合约交互记录-项目logo和名字:

交易记录里,会记录你地址与哪个合约发生了交互

20211031161723

可以知道合约地址,一个项目可以有好几个合约地址,比如PancakeSwap可以有几个合约地址

  • PancakeSwap: Router v2
  • PancakeSwap: Router v1

这里主要是要找到合约地址项目的映射关系
暂时有几个思路:

  • contract creator 部署项目合约的地址

20211031162907

  • 在项目源码找常量,记录了那些项目合约地址

这一块感觉后续要不断去维护这些映射关系


合约交互记录-调用合约的具体函数:

调用bscscan的这个Get a list of 'Normal' Transactions By Address接口,可以获得以下数据

20211104123527

调用合约的具体函数可以通过解析input_data得知

如果项目合约是开源验证过的话,可以通过decode_function_input接得

1
2
contract_ins = self.get_token_contract_with_abi(contract_address, contract_abi_json)
func, params = contract_ins.decode_function_input(input_data)

如果项目合约未开源,input_data的前4个字节是函数原型的Keccak256哈希,可以调用4byte.directory进行哈希查询,反查出函数名。


transaction里的token传输记录:

20211104131002

要怎么解析出交易里代币的传输记录?
20211029094938

token基本都是符合erc20标准,都含有标准的Transfer函数
要知道该次交易里token的传输记录,要解析log里的Transfer event

但并不是所有log里,都能看到Transfer的字眼
20211029100319

有的就没有
20211029100713

由于符合erc20标准的代币的Transfer(address from, address to, uint256 value)函数是固定的,
经过keccak哈希后,可得到哈希字符串0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

如果该次交易里含有erc20代币的传输,那么就存在含有该哈希的event. 接下来去解析这些event就可以知道token的传输记录了

参考:ERC20 Tokens Transferred Information from Transaction Hash


Bug&Todo:

个人地址转账:

20211103115056

如何判断一个地址是合约地址还是个人地址?

How to detect if an address is a contract?

20211103115835

个人地址的转账记录这块还没做对应的解析

SSL error:

[SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption failed or bad record mac (_ssl.c:2570)

normal

只用了bscscan的这个Get a list of 'Normal' Transactions By Address接口,还有一些交易类型没收录进去,仍有欠缺


Refs: