呼叫其他合約時出現“資金不足”錯誤
我創建了兩個合約,分別是 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; }
希望這可以幫助。