如何在以太坊的 web3 python 中使用地址余额的代币 USDT 进行转账

How to get transfer with token USDT of address balance in web3 python in ethereum

提问人:Đỗ Văn Thắng 提问时间:7/24/2023 更新时间:10/30/2023 访问量:359

问:

嗨,我正在尝试从1个代币持有者的USDT代币获得所有转账,并提供以下信息:

  • 代币合约:0xdAC17F958D2ee523a2206206994597C13D831ec7
  • 代币持有者:0x28C6c06298d514Db089934071355E5743bf21d60

以下是该转移的链接:https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7?a=0x28c6c06298d514db089934071355e5743bf21d60

'从 web3 导入 Web3,HTTPProvider

实例化 Web3 远程提供程序

w3 = Web3(HTTPProvider('https://ethereum-mainnet.s.chainbase.online ...'))

Tether (USDT) 代币合约地址

token_contract_address = “0xdAC17F958D2ee523a2206206994597C13D831ec7”

替换为要查询的令牌持有者地址

token_holder_address =“0x28C6c06298d514Db089934071355E5743bf21d60”

从 web3 导入eth_abi

def get_transactions_with_token(web3, token_contract_address, token_holder_address): 合约 = web3.eth.contract(address=token_contract_address, abi=ERC20_ABI)

transfer_topic = web3.keccak(text="Transfer(address,address,uint256)")

transfer_events = web3.eth.getLogs({
    "address": token_contract_address,
    "topics": [transfer_topic, None, token_holder_address],
    "fromBlock": 0,
    "toBlock": "latest",
    
})

transactions = []
for event in transfer_events:
    decoded_event = eth_abi.decode_log(contract.abi, event.data, event.topics)
    tx_hash = event.transactionHash.hex()
    quantity = decoded_event[2]
    transactions.append({"tx_hash": tx_hash, "quantity": quantity})

return transactions

将 ERC20_ABI替换为 ERC-20 代币合约的 ABI(应用程序二进制接口)。

您可以从代币合约的官方文档或以太坊区块浏览器中获取 ABI。

ERC20_ABI = [{“constant”:True,“inputs”:[],“name”:“name”,“outputs”:[{“name”:“”,“type”:“stri”type“:”event“}] # 替换为实际的 ABI

调用函数以获取具有指定代币合约和代币持有者的交易

事务 = get_transactions_with_token(W3, token_contract_address, token_holder_address) 打印(交易)'

但是我无法获得像这张图片那样的传输信息enter image description here

datacontract 代码合约 web3py 合约

评论


答:

0赞 Divyasshree 10/30/2023 #1

您可以使用区块链数据索引器获取它,而无需联系 ABI。

Bitquery 有一个转账 API 和代币持有者 API。对于您提到的地址,您可以使用此查询获取来自该地址的所有转账。有一个自动代码生成器可以为您生成 Python 代码。enter image description here

{
  ethereum(network: ethereum) {
    transfers(
      options: {desc: "block.height", limit: 10, offset: 0}
      sender: {is: "0x28C6c06298d514Db089934071355E5743bf21d60"}
      amount: {gt: 0}
    ) {
      block {
        timestamp {
          time(format: "%Y-%m-%d %H:%M:%S")
        }
        height
      }
      sender {
        address
        annotation
      }
      receiver {
        address
        annotation
      }
      currency {
        address
        symbol
      }
      amount
      amount_usd: amount(in: USD)
      transaction {
        hash
      }
      external
    }
  }
}

在这里运行它