You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:24:07