Solidity

將乙太幣從智能合約轉移到 Truffle 中的另一個智能合約

  • May 5, 2021

我是 Solidity 的初學者,所以我的問題可能很簡單。我有兩個契約“BankA”和“客戶”。每當我在 Truffle 開發環境中部署 BankA 並呼叫pay()時,都會出現以下錯誤:

Error: Returned error: VM Exception while processing transaction: revert    at PromiEvent (C:\Users\lenovo\AppData\Roaming\npm\node_modules\truffle\build\webpack:\packages\contract\lib\promievent.js:9:1)

解決辦法是什麼。謝謝你。

銀行A:

pragma solidity ^0.5.12;

import "./customer.sol";
contract BankA{
 function pay() public returns(uint256){
   customer client=new customer();
   address(client).transfer(1000);
   return address(client).balance;
 }
 function() external payable{}

}

顧客:

pragma solidity^0.5.12;
contract customer{
 function() external payable{}
 }
}

如果 BankA 有足夠的資金,它看起來應該可以工作。

請記住:

address(client).transfer(1000);

如果沒有足夠的資金向客戶發送 1000,則無法工作。

因此,要麼呼叫 with {value: 1000}(或更多),要麼使用備份將一些資金單次轉移到 BankA。否則會因資金不足而失敗。

希望能幫助到你。

ps 考慮address(client).transfer(msg.value);轉發收到的任何內容。

當我們看到時,兩個合約都具有備份功能。因此,他們可以在平台中接收和發送一些乙太幣。正如@Rob Hitchens 回答的那樣,錯誤來自BankA 的餘額值。BankA 發送的乙太幣永遠不會超過其餘額。為了讓你的程式碼更聰明地解決這個問題,我建議使用下面的程式碼來告訴你 BankA 的餘額:

pragma solidity ^0.5.12;

import "./customer.sol";
contract BankA{
 function pay() public returns(uint256){
   require(address(this).balance>1000, "Balance Not Enough");
   customer client=new customer();
   address(client).transfer(1000);
   return address(client).balance;
 }
 function() external payable{}
}

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