在BSC链出售代币时如何直接获取BNB而非wBNB?
BSC链wBNB解包为原生BNB实现方案
方案一:直接兑换得到原生BNB(推荐,无需额外解包)
你当前使用的swapExactTokensForTokensSupportingFeeOnTransferTokens是代币兑代币的接口,因此到账资产是ERC20标准的wBNB。你可以直接替换为PancakeRouter的swapExactTokensForETHSupportingFeeOnTransferTokens接口,兑换完成后直接到账原生BNB,无需单独做解包操作。
对应代码修改如下:
def sell_drdc(wallet_address, token_address, wallet_no): if not is_approved(token_address): approve(wallet_address, private_key) erc20 = web3.eth.contract(token_address, abi=erc20Abi) token_value = erc20.functions.balanceOf(wallet_address).call() if token_value != 0: # 替换为兑换原生BNB的接口,路径保持不变,路由会自动完成最后一步解包 pancakeswap2_txn = router.functions.swapExactTokensForETHSupportingFeeOnTransferTokens( token_value, 0, [DRDC_Address, wbnb_contract], wallet_address, (int(time()) + 900) ).buildTransaction({ 'from': wallet_address, 'nonce': web3.eth.get_transaction_count(wallet_address), # 兑换原生BNB需要额外加gas limit配置,避免交易失败 'gas': 250000 }) signed_txn = web3.eth.account.sign_transaction(pancakeswap2_txn, private_key=private_key) try: tx_token = web3.eth.send_raw_transaction(signed_txn.rawTransaction) web3.eth.waitForTransactionReceipt(tx_token, timeout=900) display_success() update_text() except ValueError: display_error() except UnboundLocalError: sell_drdc(wallet_address, token_address, wallet_no)
方案二:收到wBNB后单独发起解包交易
如果你的业务逻辑需要先接收wBNB再转为原生BNB,直接调用wBNB合约的withdraw方法即可,该方法会销毁你账户内指定数量的wBNB,同时将等额原生BNB转入你的调用地址。
解包操作示例代码如下:
# 初始化wBNB合约,wBNB在BSC主网地址为0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c wbnb_contract = web3.eth.contract(address=wbnb_address, abi=wbnb_abi) # 查询你账户内的wBNB余额 wbnb_balance = wbnb_contract.functions.balanceOf(wallet_address).call() if wbnb_balance > 0: # 构建解包交易 withdraw_txn = wbnb_contract.functions.withdraw(wbnb_balance).buildTransaction({ 'from': wallet_address, 'nonce': web3.eth.get_transaction_count(wallet_address), 'gas': 100000 }) # 签名并发送交易 signed_withdraw = web3.eth.account.sign_transaction(withdraw_txn, private_key=private_key) tx_hash = web3.eth.send_raw_transaction(signed_withdraw.rawTransaction) web3.eth.waitForTransactionReceipt(tx_hash, timeout=300)
注意事项
- wBNB的标准ABI需要包含
withdraw(uint256)方法定义,可直接使用通用的wBNB ABI - 解包交易需要消耗少量BNB作为gas费,请确保账户内有足够的gas储备
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

