I'm currently trying to test run source code from GitHub based on a 2018 tutorial where solidity was using version 0.5.16. I'm currently using truffle v4.1.14. I understand that there was an update from "address" to "address payable", but I'm still not able to get it to work after referencing to similar threads. Appreciate any help. Thanks!
pragma solidity ^0.5.16;
import "./StringUtils.sol";
import "./Accounts.sol";
/** @title Documents. */
contract Documents {
address payable private owner;
address public accountsAddress;
Document payable[] private documents;
mapping (address => Count) private counts;
enum DocStatus {Pending, Verified, Rejected}
mapping (address => uint) balances;
struct Document {
address requester;
address verifier;
string name;
string description;
string docAddress;
DocStatus status;
}
struct Count {
uint verified;
uint rejected;
uint total;
}
event DocumentAdded (address user);
event DocumentVerified (address user);
event test (uint test);
function verifyDocument(string memory docAddress, DocStatus status)
public
payable
{
for (uint i=0; i<documents.length; i++) {
if(StringUtils.equal(documents[i].docAddress, docAddress) && documents[i].verifier == msg.sender && documents[i].status == DocStatus.Pending){
emit DocumentVerified(msg.sender);
uint price = Accounts(accountsAddress).getPrice(documents[i].verifier);
balances[documents[i].verifier] -= price;
if(status == DocStatus.Rejected){
counts[documents[i].requester].rejected = counts[documents[i].requester].rejected + 1;
counts[documents[i].verifier].rejected = counts[documents[i].verifier].rejected + 1;
// return the ether for rejection
documents[i].requester.transfer(price);
}
if(status == DocStatus.Verified){
counts[documents[i].requester].verified = counts[documents[i].requester].rejected + 1;
counts[documents[i].verifier].verified = counts[documents[i].verifier].verified + 1;
// send ether to verified account
documents[i].verifier.transfer(price);
}
documents[i].status = status;
break;
}
}
}
** Documents.sol:208:13: TypeError: "send" and "transfer" are only available for objects of type "address payable", not "address".
documents[i].requester.transfer(price);
^—————————–^ **
Full source code: https://github.com/lionel1702/final-project-RumeelHussain/blob/master/contracts/Documents.sol
Error Log: https://github.com/lionel1702/log/blob/master/emailRegexErrorLog4
Best Answer
You just need to change a few more of type
address
to beaddress payable
. Namely here:Change into:
Possible also changes needed in other parts of the contracts, but this should fix this immediate issue.