0

This is my smart contract:

pragma solidity ^0.5.0; contract Agent { struct patient { string name; string dob; address[] doctorAccessList; uint[] diagnosis; string record; } struct doctor { string name; string dob; address[] patientAccessList; } uint creditPool; address[] public patientList; address[] public doctorList; mapping (address => patient) patientInfo; mapping (address => doctor) doctorInfo; // might not be necessary mapping (address => string) patientRecords; function add_agent(string memory _name, string memory _dob, uint _designation, string memory _hash) public { address addr = msg.sender; if(_designation == 0){ patientInfo[addr].name = _name; patientInfo[addr].dob = _dob; patientInfo[addr].record = _hash; patientList.push(addr)-1; } else if (_designation == 1){ doctorInfo[addr].name = _name; doctorInfo[addr].dob = _dob; doctorList.push(addr)-1; } else{ revert(); } } function get_patient(address addr) view public returns (string memory, string memory, uint, string memory){ // if(keccak256(patientInfo[addr].name) == keccak256(""))revert(); return (patientInfo[addr].name, patientInfo[addr].dob, patientInfo[addr].diagnosis, patientInfo[addr].record); } function get_doctor(address addr) view public returns (string memory, string memory){ // if(keccak256(doctorInfo[addr].name)==keccak256(""))revert(); return (doctorInfo[addr].name, doctorInfo[addr].dob); } function get_patient_doctor_name(address paddr, address daddr) view public returns (string memory, string memory){ return (patientInfo[paddr].name,doctorInfo[daddr].name); } function permit_access(address addr) payable public { require(msg.value == 2 ether); creditPool += 2; doctorInfo[addr].patientAccessList.push(msg.sender)-1; patientInfo[msg.sender].doctorAccessList.push(addr)-1; } //must be called by doctor function insurance_claim(address paddr, uint _diagnosis, string memory _hash) public { bool patientFound = false; for(uint i = 0;i<doctorInfo[msg.sender].patientAccessList.length;i++){ if(doctorInfo[msg.sender].patientAccessList[i]==paddr){ msg.sender.transfer(2 ether); creditPool -= 2; patientFound = true; } } if(patientFound==true){ set_hash(paddr, _hash); remove_patient(paddr, msg.sender); }else { revert(); } bool DiagnosisFound = false; for(uint j = 0; j < patientInfo[paddr].diagnosis.length;j++){ if(patientInfo[paddr].diagnosis[j] == _diagnosis)DiagnosisFound = true; } } function remove_element_in_array(address[] storage Array, address addr) internal returns(uint) { bool check = false; uint del_index = 0; for(uint i = 0; i<Array.length; i++){ if(Array[i] == addr){ check = true; del_index = i; } } if(!check) revert(); else{ if(Array.length == 1){ delete Array[del_index]; } else { Array[del_index] = Array[Array.length - 1]; delete Array[Array.length - 1]; } Array.length--; } } function remove_patient(address paddr, address daddr) public { remove_element_in_array(doctorInfo[daddr].patientAccessList, paddr); remove_element_in_array(patientInfo[paddr].doctorAccessList, daddr); } function get_accessed_doctorlist_for_patient(address addr) public view returns (address) { address[] storage doctoraddr = patientInfo[addr].doctorAccessList; return doctoraddr; } function get_accessed_patientlist_for_doctor(address addr) public view returns (address) { return doctorInfo[addr].patientAccessList; } function revoke_access(address daddr) public payable{ remove_patient(msg.sender,daddr); msg.sender.transfer(2 ether); creditPool -= 2; } function get_patient_list() public view returns(address){ return patientList; } function get_doctor_list() public view returns(address){ return doctorList; } function get_hash(address paddr) public view returns(string memory){ return patientInfo[paddr].record; } function set_hash(address paddr, string memory _hash) internal { patientInfo[paddr].record = _hash; } } 

It was initially written in version 0.4.15. I'm using solidity version 0.5.0

The error being shown:

home/superdupertafara/Desktop/HIT_400/contracts/PatientEMRSet.sol:1:1: SyntaxError: Source file requires different compiler version (current compiler is 0.5.0+commit.1d4f565a.Emscripten.clang - note that nightly builds are considered to be strictly less than the released version pragma solidity ^0.4.0; ^---------------------^ ,/home/superdupertafara/Desktop/HIT_400/contracts/Patient_Doctor.sol:53:16: TypeError: Return argument type tuple(string storage ref,string storage ref,uint256[] storage ref,string storage ref) is not implicitly convertible to expected type tuple(string memory,string memory,uint256,string memory). return (patientInfo[addr].name, patientInfo[addr].dob, patientInfo[addr].diagnosis, patientInfo[addr].record); ^----------------------------------------------------------------------------------------------------^ ,/home/superdupertafara/Desktop/HIT_400/contracts/Patient_Doctor.sol:130:16: TypeError: Return argument type address[] storage pointer is not implicitly convertible to expected type (type of first return variable) address. return doctoraddr; ^--------^ ,/home/superdupertafara/Desktop/HIT_400/contracts/Patient_Doctor.sol:134:16: TypeError: Return argument type address[] storage ref is not implicitly convertible to expected type (type of first return variable) address. return doctorInfo[addr].patientAccessList; ^--------------------------------^ ,/home/superdupertafara/Desktop/HIT_400/contracts/Patient_Doctor.sol:145:16: TypeError: Return argument type address[] storage ref is not implicitly convertible to expected type (type of first return variable) address. return patientList; ^---------^ ,/home/superdupertafara/Desktop/HIT_400/contracts/Patient_Doctor.sol:149:16: TypeError: Return argument type address[] storage ref is not implicitly convertible to expected type (type of first return variable) address. return doctorList; ^--------^

1 Answer 1

1

The error has nothing to do with the compiler version; you need to return an array (e.g. uint[], address[]) if you specified an array in the return statement:

// return uint[], not uint function get_patient(address addr) view public returns (string memory, string memory, uint[] memory, string memory){ // if(keccak256(patientInfo[addr].name) == keccak256(""))revert(); return (patientInfo[addr].name, patientInfo[addr].dob, patientInfo[addr].diagnosis, patientInfo[addr].record); } 

The error is the same across all of them. Remember to check your error messages - it was hinted here: Return argument type tuple(string storage ref,string storage ref,uint256[] storage ref,string storage ref) is not implicitly convertible to expected type tuple(string memory,string memory,uint256,string memory). You were telling the function to return an array as a single element, that's why it was trying to "implicitly convert" it to another type.

3
  • 1
    I think I understand, let me try it out. Thank you. Commented Jun 25, 2021 at 7:46
  • It worked. Thank you so much for your help Commented Jun 25, 2021 at 8:06
  • No problem! Do accept this solution as the answer if it was useful :) Commented Jun 25, 2021 at 9:08

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.