У меня есть 3 контракта: Пользователь, Пациент и Доктор. Пациент и доктор оба наследуют от пользователя.
Пользователь.sol
contract User {
// Stuff not relevant for question
function User() {
// Constructs
}
}
Пациент.sol
contract Patient is User {
mapping(bytes32 => bytes32[]) category_Records;
mapping(bytes32 => Record) id_Record;
// Records
struct Record {
bytes32 id;
bytes32 category;
address addedBy;
address addedByContract;
uint dateAdded;
bytes32 _hash;
bool verified;
}
// Adding record
function addRecord(bytes32 _id, bytes32 _category, bytes32 _hash) {
Record memory newRecord = Record(_id, _category, tx.origin, msg.sender, now, _hash, false);
id_Record[_id] = newRecord;
category_Records[_category].push(_id);
}
}
Доктор.соль
contract Doctor is User {
// Adding record
function addRecord(bytes32 patientID, bytes32 _id, bytes32 _category, bytes32 _hash) {
// The registry bit is a registry contract which is working
address _patient = registry.getContractAddress(patientID);
// From the registry we get the patient contract address
Patient patient = Patient(_patient);
patient.addRecord(_id, _category, _hash);
}
}
У меня есть кнопка в моем интерфейсе, которая вызывает
contract.user.doctor.addRecord(publicAddress, contractAddress, pID, _id, category, hash);
который, в свою очередь, вызывает (эта функция находится внутри объекта contract.user.doctor)
function addRecord(publicAddress, contractAddress, pID, _id, category, hash) {
const input = fs.readFileSync('contracts/All.sol').toString();
const output = solc.compile(input);
const bytecode = output.contracts[':Doctor'].bytecode;
const abi = JSON.parse(output.contracts[':Doctor'].interface);
const contract = web3.eth.contract(abi).at(contractAddress);
// Insert gas estimation here, default prob insufficient
contract.addRecord(patientID, _id, _category, _hash, {from: publicAddress}, (err, res) => {
if (err) {
console.log(err);
} else {
console.log('tx: ' + res);
}
});
}
Когда я нажимаю на нее, я возвращаюсь
Error: Invalid number of arguments to Solidity function
Причина, по которой я думаю , что это связано с наследованием, заключается в том, что я пытался для тестирования сделать Doctor автономным (не унаследованным) контрактом только с двумя методами getBytes()
и setBytes()
. Когда я звонил из своего приложения узла, все работало нормально.
Я проверял много раз, и у функции Solidity есть правильные аргументы, поэтому я понятия не имею, почему она возвращает мне эту ошибку.
Есть идеи?
Похоже, вы передаете null
первый аргумент объекту контракта web3.
Эта линия имеет pID
:
function addRecord(publicAddress, contractAddress, pID, _id, category, hash) {
У этого есть patientID
:
contract.addRecord(patientID, _id, _category, _hash, {from: publicAddress}, (err, res) => {