0

你好 Stackoverflow 社区,

由于一个奇怪的错误,我很难推进我的空投合同,并且不知道为什么会发生这种情况。

我将在下面详细解释这个问题:

基本上,我正在尝试为代币($LOFI)编写一个空投合约

空投合约:

我的空投合约非常简单,我有一个函数,它接收代币地址、空投地址列表和代币总价值,它会从代币合约中调用 transferFrom 函数。

我的空投合约源代码在这里:合约地址0x3518711f5ffe4108ea4532a854e7314895ebe7d1 | BscScan

/**
 *Submitted for verification at BscScan.com on 2021-10-30
*/

pragma solidity ^0.4.22;

contract ERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract LofiAirdropContract {
    function airdrop(address tokenAddr, address[] dests, uint256 value) public payable {
        uint256 valuePerCount = value / dests.length;
        for (uint i = 0; i < dests.length; i++) {
            ERC20(tokenAddr).transferFrom(msg.sender, dests[i], valuePerCount);
        }
    }
}

但是,当我调用我的空投合约来分发代币时,它总是失败并出现以下错误:“失败并出现错误‘转账金额超过 maxTxAmount。’”

代币合约:

故障排除后,我想,正是 LOFI 代币合约中的这种情况导致了第 530 行(合约地址 0x17D8519F57450E2B7E6aE1163E0E448322a8aF17 | BscScan):

在这种情况下失败:

        if(from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

完整方法:

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
        bool takeFee = true;
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        _tokenTransfer(from,to,amount,takeFee);
    }

Python脚本:

基本上,我将执行以下操作来进行空投过程:

例如,我们有 3 个地址:

  1. 空投合约地址0xabc...
  2. 钱包地址 0xdef...
  3. 令牌地址 0xopq....

Step1:批准0xabc...地址代0xdef...地址消费token

Step2:从空投合约调用空投函数,空投到给定的目标地址,

def approve(wallet_address, token_address, airdrop_contract_address, token_count, gas_price, web3):
    nonce = web3.eth.getTransactionCount(wallet_address)
    checksum_token_address = Web3.toChecksumAddress(token_address)
    checksum_airdrop_contract_address = Web3.toChecksumAddress(airdrop_contract_address)

    contract_instance = web3.eth.contract(address=checksum_token_address, abi=token_contract_abi)

    tx = contract_instance.functions.approve(checksum_airdrop_contract_address, web3.toWei(token_count, 'ether')).buildTransaction({
        "from": wallet_address,
        "nonce": nonce,
        "gas": 100000,
        "gasPrice": web3.toWei(gas_price, 'gwei')
    })

    # Wait for transaction to complete
    signed_tx = web3.eth.account.signTransaction(tx, private_key)
    tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
    web3.eth.wait_for_transaction_receipt(tx_hash)

    time.sleep(5)

    return True

def airdrop(wallet_address, token_address, airdrop_contract_address, token_count, gas_price, dest_account_addrs, web3):
    nonce = web3.eth.getTransactionCount(wallet_address)
    checksum_token_address = Web3.toChecksumAddress(token_address)
    checksum_airdrop_contract_address = Web3.toChecksumAddress(airdrop_contract_address)

    contract_instance = web3.eth.contract(address=checksum_airdrop_contract_address, abi=airdrop_contract_abi)
    tx = contract_instance.functions.airdrop( checksum_token_address,
                                                dest_account_addrs,
                                                web3.toWei(token_count, 'ether')).buildTransaction({
        "from": wallet_address,
        "nonce": nonce,
        "gas": 100000,
        "gasPrice": web3.toWei(gas_price, 'gwei')
    })

    signed_tx = web3.eth.account.signTransaction(tx, private_key)
    tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
    web3.eth.wait_for_transaction_receipt(tx_hash)
    trans = web3.toHex(tx_hash)
    trans = web3.eth.get_transaction(trans)
    time.sleep(5)

    return True

我不确定如何绕过它,如果社区中的任何人知道如何解决它,我将不胜感激!

非常感谢您的帮助!

4

0 回答 0