Contract-Development

呼叫其他合約時出現“資金不足”錯誤

  • March 7, 2022

我創建了兩個合約,分別是 Balance 和 TempDeposit。在 Balance 合約中,我編寫了 Mint 函式來鑄造合約中儲存的一定數量的代幣。鑄造的總代幣將被添加到 minter(msg.sender) 的餘額中。

然後我在 TempDeposit 合約中呼叫fundNewContract 函式將使用者的餘額轉移到 TempDeposit 合約中。但我沒有這樣做,並收到“金額不足”的錯誤消息。我想轉入 TempDeposit 合約的金額遠低於使用者在 Balance 合約中的餘額。有人知道這裡有什麼問題嗎?

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Balance {
   
   uint public totalSupply;
   mapping(address => uint) public balanceOf;

   function mint(uint amount) external {
       balanceOf[msg.sender] += amount;
       totalSupply += amount;
   }

   function transfer(address _to, uint amount) public {
       require(balanceOf[msg.sender] >= amount, "Insufficient Amount");
       balanceOf[msg.sender] -= amount;
       balanceOf[_to] += amount;
   }

   function viewBalance(address _address) public view returns (uint) {
       return balanceOf[_address];
   }

}

contract TempDeposit {

   Balance balanceContract;

   constructor(address _address) {
       balanceContract = Balance(_address);
   }

   function fundNewContract(uint amount) public {
       balanceContract.transfer(address(this), amount);
   }

   function viewUserBalance(address _address) public view returns(uint) {
       return balanceContract.viewBalance(_address);
   }

}

你應該問問自己,鑄幣者和呼叫 TempDeposit 合約的 fundNewContract 函式的鑄幣者是否相同?

顯然你在 Balance 合約的 transfer 函式中的要求沒有得到滿足(require(balanceOf

$$ msg.sender $$>= amount, “Insufficient Amount”)) 並且這個錯誤表示 msg.sender(呼叫 TempDeposit 合約的 fundNewContract 函式的那個人)沒有足夠的餘額來進行這次轉賬。 說了以上所有內容並閱讀了關於“從合約呼叫合約時誰是 msg.sender ”這個美麗的問題後,您將了解合約出現該錯誤的原因。正是因為這個事實,msg.sender in require(balanceOf

$$ msg.sender $$>= amount, “Insufficient Amount”) 是 TempDeposit 合約的地址,而不是你將你的鑄幣數量映射到其餘額的鑄幣者 (balanceOf$$ msg.sender $$+= 數量)。 解決這個問題的可能解決方案(如果 minter 和 fundNewContract 函式的呼叫者相同):只需將 msg.sender 傳遞給函式:

function fundNewContract(uint amount) public {
   balanceContract.transfer(msg.sender, address(this), amount);
}

function transfer(address origin, address _to, uint amount) public {
   require(balanceOf[origin] >= amount, "Insufficient Amount");
   balanceOf[origin] -= amount;
   balanceOf[_to] += amount;
}

希望這可以幫助。

引用自:https://ethereum.stackexchange.com/questions/123257