你好 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 个地址:
- 空投合约地址0xabc...
- 钱包地址 0xdef...
- 令牌地址 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
我不确定如何绕过它,如果社区中的任何人知道如何解决它,我将不胜感激!
非常感谢您的帮助!