Hi,
I am trying to compile the following contract:
pragma solidity ^0.5.1;
contract Governmental{
uint constant TWELVE_HOURS = 12;
//address[] payable creditorAddresses;
function lendGovernmentMoney ( address buddy ) public returns ( bool ) {
address owner;
uint[ ] memory creditorAddresses;
uint lastTimeOfNewCredit =0;
uint amount = msg. value ;
uint creditorAmounts = 0;
uint profitFromCrash = 0;
uint round = 0;
uint lastCreditorPayedOut = 0;
address[] memory creditorAddresses;
// check the condition to end the game
if ( lastTimeOfNewCredit + TWELVE_HOURS > block . timestamp ) {
msg.sender.send ( amount );
// Sends jacpot to the last creditor
creditorAddresses[creditorAddresses.length - 1].send ( profitFromCrash );
owner.send (this.balance);
// Reset contract state
lastCreditorPayedOut = 0;
lastTimeOfNewCredit = block . timestamp ;
profitFromCrash = 0;
creditorAddresses = new address [](0);
creditorAmounts = new uint [](0);
round += 1;
return false ;
}
}
I am getting the error:
Error: Member "send" not found or not visible after argument-dependent lookup in uint256.
creditorAddresses[creditorAddresses.length - 1].send ( profitFromCrash );
I changed:
uint[ ] memory creditorAddresses;
to
address[ ] payable creditorAddresses;
but I m getting the error:
prg17.sol:16:17: Error: Expected ';' but got 'payable'
address payable creditorAddresses;
This is how you declare an array of payable addresses:
address payable[] memory creditorAddresses;
By the way, you have quite a few other errors here. creditorAddresses is declared twice, creditorAmounts of type uint is being assigned uint[], msg.value is being used in a non-payable function, etc.
To the compiler this looks like you're trying to convert 0 to type uint[] and that's not possible.
To allocate memory for the array you should use the new keyword:
Hi, @cameel , Thanks a lot for this information. Is this (i.e. memory array of size zero) a vulnerability?I am trying to compile the program given in Figure 17 of :Making the smart contract smarter.
The code is still giving the 'payable' error as you said, I don't know how to correct it, I have used the payable directive in the signtaure but its still giving me the error:
pragma solidity ^0.5.1;
contract Governmental{
uint constant TWELVE_HOURS = 12;
//address[] payable creditorAddresses;
function lendGovernmentMoney ( address buddy ) payable returns ( bool ) {
address payable owner;
address payable[ ] memory creditorAddresses;
uint lastTimeOfNewCredit =0;
uint amount = msg. value ;
uint[] memory creditorAmounts = new uint[](0);
uint profitFromCrash = 0;
uint round = 0;
uint lastCreditorPayedOut = 0;
//address[] payable creditorAddresses;
// check the condition to end the game
if ( lastTimeOfNewCredit + TWELVE_HOURS > block . timestamp ) {
msg.sender.send ( amount );
// Sends jacpot to the last creditor
creditorAddresses[creditorAddresses.length - 1].send ( profitFromCrash );
owner.send (address(this).balance);
// Reset contract state
lastCreditorPayedOut = 0;
lastTimeOfNewCredit = block . timestamp ;
profitFromCrash = 0;
creditorAddresses = new address payable [](0);
//creditorAmounts = new uint [](0);
round += 1;
return false ;
}
}
}
prg17.sol:13:21: Error: "msg.value" and "callvalue()" can only be used in payable public functions. Make the function "payable" or use an internal function to avoid this error.
uint amount = msg. value ;
^--------^
Somebody please guide me.