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

Solidity合约allowance校验异常:事件显示通过但require报错

合约授权校验异常排查求助

在Polygon Mumbai测试网部署了一份保险Solidity合约,校验发送者对合约的USDC授权额度时出现异常:通过Succeeded事件输出IERC20(USDCAddress).allowance(msg.sender, address(this))>=requiredAmount的结果为true,但紧接着的同条件require语句却始终触发「Insufficient USDC allowance」报错,无法通过校验。

相关代码片段:

emit Succeeded(IERC20(USDCAddress).allowance(msg.sender, address(this))>=requiredAmount);
require(IERC20(USDCAddress).allowance(msg.sender, address(this))>=requiredAmount, "Insufficient USDC allowance");

完整合约代码:

pragma solidity ^0.8.13;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

//Insurance smart contract
contract InsuranceAgreement {
    
    //ADDRESSES
    //master wallet who deployed smart contract (me)
    address public master=0xbCCc6A9926455a43EB72700fA99BD4A98ba6A087;  //Testing

    //address public master = 0x6781d837FD7Bda919c5d8ab3e71d6e5833346450; //Testnet
    address USDCAddress = 0xE097d6B3100777DC31B34dC2c58fB524C2e76921; //Testnet

    //buyer public address
    address public buyerAddr;
    //seller public address
    address public sellerAddr;
    
    //INITIAL TERMS OF CONTRACT
    //premium required
    uint256 premiumRequired;
    //payout required
    uint256 payoutRequired;
    //timeline of insurance agreement (in seconds)
    uint256 duration;

    //CASH
    //premium 
    uint256 premium;
    //payout 
    uint256 payout;

    //TIMES
    //contract finalized time in seconds
    uint256 finalizedTime;
    //contract initailization time
    uint256 initializedTime;
    //last time withdrew premium
    uint256 lastWithdrewPremium;


    //CANCELLATION 
    //bool if buyer wants to cancel
    bool buyerCancel;
    //bool if seller wants to cancel
    bool sellerCancel;


    //contract initialized 
    constructor(address _sellerAddr, uint256 _duration, uint256 _premiumRequired, uint256 _payoutRequired) {
        //avoid invalid terms
        require(_premiumRequired>0, "Premium must be greater than 0");
        require(_payoutRequired>0, "Payout must be greater than 0");
        require(_duration>0, "Duration must be greater than 0");
        //initialize addresses
        buyerAddr = msg.sender;
        sellerAddr = _sellerAddr;
        //initialize contract terms
        duration = _duration;
        premiumRequired = _premiumRequired;
        payoutRequired = _payoutRequired;
        
    }
    
    //Events for logging
    event TimeStamp(uint256 value);
    event NumTokens(uint256 value);
    event Address(address value);
    event Succeeded(bool value);

    //only allow master wallet to access function
    modifier onlyMaster() {
        require(msg.sender == master, "You are not the master");
        _;
    }
    //only allow seller to access function
    modifier requireSeller(){
        require(msg.sender==sellerAddr, "You are not the seller");
        _;
    }
    //only allow buyer to access function
    modifier requireBuyer(){
        require(msg.sender==buyerAddr, "You are not the buyer");
        _;
    }
    modifier requireFinalizationPeriodNotExpired(){
        require(block.timestamp-initializedTime<=60*60*24*2, "Finalization period already expired");
        _;
    }
    modifier requireAgreementNotOver(){
        require(block.timestamp-finalizedTime<duration, "Agreement duration already over");
        _;
    }
    //ensure that agreement is finalized
    modifier requireFinalized(){
        require(finalizedTime>0, "Agreement not yet finalized");
        _;
    }

       

    //deposit premium to initialize contract
    function depositPremium() external requireBuyer {
        
         //deposit premium to create "pending" contract
         uint256 allowance = IERC20(USDCAddress).allowance(msg.sender, address(this));
         emit NumTokens(allowance); 
       require(allowance>=premiumRequired, "Insufficient USDC allowance");
        /*require(IERC20(USDCAddress).transferFrom(msg.sender, address(this), premiumRequired), "Failed to transfer USDC premium");
        //Require premium not locked in
        require(premium ==0, "Premium already locked in");
         //initialize deposit -- wait for payout to be locked in
        premium+=premiumRequired;
        //set contract initialization time
        initializedTime=block.timestamp; */
    }

    //deposit payout to finalize contract
    function depositPayout() external requireFinalizationPeriodNotExpired requireSeller {
        //make sure payout valid
        require(premium==premiumRequired,"Premium not yet deposited");
        require(IERC20(USDCAddress).allowance(msg.sender, address(this)) >= payoutRequired, "Insufficient USDC allowance");
        require(IERC20(USDCAddress).transferFrom(msg.sender, address(this), payoutRequired), "Failed to transfer USDC payout");
        require(payout==0,"Payout already locked in");
        //finalize agreement and lock in payout
        payout+=payoutRequired;
        finalizedTime=block.timestamp;
        lastWithdrewPremium=block.timestamp;
    }

}

恳请协助排查该异常问题的原因。

内容的提问来源于stack exchange,提问作者Michael X

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:02:08