swap token:
测试用BNB
去购买VRT
代码步骤:
执行一段完整的交易,代码需要进行几个步骤:
- swapExactETHForTokens 传参,构造好函数
1 | func = router_contract.functions.swapExactETHForTokens(min_output_tokens, [self.addr.wbnb, token_address], self.wallet, self.deadline(60)) |
- buildTransaction 构造好交易
1 | transaction = func.buildTransaction(tx_params) |
- sign_transaction 私钥进行签名
1 | signed_tx = self.w3.eth.account.sign_transaction(transaction, private_key=self.secret_key) |
- send_raw_transaction 广播交易
1 | self.w3.eth.send_raw_transaction(signed_tx.rawTransaction) |
- wait_for_transaction_receipt 等待交易完成,获取收据
1 | self.w3.eth.wait_for_transaction_receipt(tx, timeout=60) |
- processReceipt 可以解析获取Transfer事件的内容
1 | logs = self.get_token_contract(token_address=token_address).events.Transfer().processReceipt(receipt) |
receipt log 交易收据log:
example:
1 | { |
Event:
- Wbnb Deposit()
- Wbnb Transfer()
- VRT Transfer()
- PancakeSwap V2: VRT 5 Sync()
- PancakeSwap V2: VRT 5 Swap()
Events:
交易后可以获取到收据对象,收据对象里有log,记录了每个调用函数的 入参
- Wbnb——Deposit()
1 | AttributeDict({ |
往router_v2
质押了0.001 BNB
- Wbnb——Transfer()
1 | AttributeDict({ |
router_v2
给PancakeSwap V2: VRT 5
转了0.001BNB
- VRT——Transfer()
1 | AttributeDict({ |
PancakeSwap V2: VRT 5
给My Address
转了404.08851360983209232 vrt
- PancakeSwap V2: VRT 5——Sync()
1 | AttributeDict({ |
1 | (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings |
看了下solidity源码,这步应该是用于同步 交易定价和分配流动性的token0和token1储备
- PancakeSwap V2: VRT 5——Swap()
1 | AttributeDict({ |
这步和第3步有什么区别?
Question:
swap比转账要消耗更多的gas?
我觉得是,测试过程中,swap的话消耗 0.000652585 BNB
,转账的话消耗 0.0001071 BNB
swap要比转账需要更多的执行步骤, 所以需要消耗更多的gas
Summary:
交易收据里log列表里有事件event
event里的内容,用对应合约去解析一下,就可以看到记录里调用哪个合约的哪个函数以及哪些入参
感觉可以写个简单页面玩玩,类似debank里的交易历史
后面还要看看预言机
的相关内容