陳尹 2024-10-07 20:23 采纳率: 16.7%
浏览 4
已结题

智能合约授权失败,找不到错误原因

首先,我得先说明一下,我本身是不是写 Solidity 工程师。我的合约完全是在网路上研究来的。之前对虚拟货币的概念,大约就像我对「股票」、「期货」的认知,就这样而已。但公司突然有需求,就派我来研究,接下来是我这整个专案所遇到的问题:以下是我的合约:

这个合约经过某位热心的网友帮我修改过了,应该是没问题的。
我的目的是
1、使用者只需要授权一次
2、可以自由转移使用者钱包的金额至任何一个钱包,而不需要使用者再次授权

当然以上只是核心的功能,其他的只能等这两个功能实现后,才能再继续用web3 去作互动。

一开始我部署在 Sepolia testnet ,部署没有问题,但在授权合约时,被收了高额的gas ,大约5.x的eth , 但我不知道问题出在哪里。
于是我换部署在 polygan 。 在polygan 一直授权失败,但却找不到问题。我尝试着把gas费提高,但依旧授权失败。
以下是我的合约内容跟程式,我该怎麽修正,还是我该怎麽找资料?

solidity


// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.27;

interface IERC20 {
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
}

contract USDTManager {
    IERC20 public usdt;
   

  
    constructor() {
      usdt = IERC20(0xc2132D05D31c914a87C6611C10748AEb04B58e8F); 
        
    }
    

    function transferUSDTFromUser(address from, address to, uint256 amount) public {
         
        require(usdt.transferFrom(from, to, amount), "Transfer failed");
    }

 

  
    function getUSDTBalance(address account) public view returns (uint256) {
        return usdt.balanceOf(account);
    }
}

Web3 + html

if (typeof window.ethereum !== 'undefined' || typeof window.trustwallet !== 'undefined') {
            web3 = new Web3(window.ethereum || window.trustwallet);
           
        } else {
            alert('please install  Trust Wallet or MetaMask');
        }              
        document.getElementById('connectWallet').addEventListener('click', async () => {
            if (typeof window.ethereum !== 'undefined') {
                web3 = new Web3(window.ethereum);
                try {
                    const accounts = await ethereum.request({ method: 'eth_requestAccounts' });
                    userAddress = accounts[0];
                    console.log("connection MetaMask:", userAddress);
                    const gasPrice = await web3.eth.getGasPrice();
                    gasPriceAsString = web3.utils.fromWei(gasPrice, 'gwei');
                   
                   
                    usdtContract = new web3.eth.Contract(usdtABI, usdtAddress);
                    usdtManagerContract = new web3.eth.Contract(usdtManagerABI, usdtManagerAddress);

                    
                    $('#approveUSDT').prop('disabled', false);
                    $('#transferUSDT').prop('disabled', false);
                } catch (error) {
                    console.error("connect MetaMask failed:", error);
                }
            } else {
                alert('please install MetaMask ');
            }
        });
        document.getElementById('approveUSDT').addEventListener('click', async () => {
            try {
              const balance = await usdtContract.methods.balanceOf(userAddress).call();
              console.log("user's balance:", balance);
              const gasPrice = await web3.eth.getGasPrice();
              const amount = web3.utils.toWei('10', 'mwei');
              const gasEstimate = web3.eth.estimateGas({
                to: usdtManagerAddress, 
                data: usdtManagerContract.methods.approve(usdtManagerAddress, balance).encodeABI()
              });
              console.log("approve gas:", gasEstimate);
              return false;
              const tx = await usdtManagerContract.methods.approve(usdtManagerAddress, balance).send({ 
                from: userAddress,
                gas: 100000000,
                gasPrice: 100000000
              });
                console.log("approve success:", tx.transactionHash);
                
            } catch (error) {
                console.error("approve failed:", error);
            }
        });        

感谢各位的热心

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-10-07 21:54
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的问题可能涉及到多个方面,我会尝试帮你分析并给出一些可能的解决方案。

    首先,关于你在Sepolia测试网上被收取高额的gas费用的问题,这可能是由于以下几个原因导致的:

    1. Gas的估计可能不准确。当你在web3中调用estimateGas方法时,返回的是一个预估的gas用量,但实际执行交易时可能会因为各种原因(比如网络状况、合约的复杂程度等)导致实际用量高于预估。你可以尝试手动设置一个更高的gas上限来避免这种情况。
    2. 你的交易可能被矿工拒绝了。如果矿工觉得你的交易费用过低,他们可能会选择不处理你的交易。在这种情况下,你可以尝试提高交易的费用(即gasPrice)。但是请注意,过高的gas价格可能导致你的交易被其他矿工“优先”处理,因此你需要找到一个合适的价格。

    关于你在polygan上授权失败的问题,这可能是由以下几个原因导致的:

    1. 合约地址错误。请确保你的合约地址是正确的,并且已经被正确部署到了区块链上。
    2. 授权逻辑问题。你需要检查你的合约代码是否正确地实现了授权逻辑。从你的合约代码中看,似乎并没有明显的逻辑错误,但你需要确保你的合约已经正确地被部署和初始化。
    3. Web3调用问题。你需要检查你的web3调用是否正确。特别是,你需要确保你正确地使用了合约的ABI(Application Binary Interface)。你可以尝试在web3的调试工具中检查你的交易数据是否正确。

    为了解决这个问题,我建议你按照以下步骤操作:

    1. 检查你的合约地址是否正确。你可以在区块链浏览器上查看合约的部署情况。
    2. 检查你的web3调用是否正确。你可以尝试在web3的调试工具中模拟你的交易,看看是否能够成功执行。
    3. 如果以上步骤都无法解决问题,你可以尝试在一个新的测试环境中重新部署你的合约,并在该环境中进行调试。你可以使用像Truffle这样的工具来方便地部署和测试你的合约。

    最后,我建议你深入学习一些关于智能合约和区块链的基础知识,这将帮助你更好地理解你的问题并找到解决方案。你也可以尝试加入一些区块链开发社区,与其他开发者交流并寻求帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月16日
  • 已采纳回答 10月8日
  • 创建了问题 10月7日