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
相关产品推荐
相关产品推荐

