Я пытаюсь создать Dapp, который поддерживает различные версии сделки (новые версии создаются, когда мы обновляем данные сделки).Я использую javascript we3.js api для вызова моих функций солидности через javascript.У меня есть функция, которая отображает данные, когда мы ищем, используя поле под названием «клиент».Когда я нажимаю кнопку для поиска на основе клиента, он возвращает ошибку.Я использую обещания в javascript, но мне кажется, что функция javascript возвращает обещание, которое не определено для функции solid.Но после ошибки функция javascript возвращает ожидаемые значения (я проверил, используя console.log).
Я пытался использовать async / await, но это не помогло.
Мой код Javascript: -
getVersion:async function(i){
var returnedLatestVersion;
App.contracts.Trades.deployed().then(async function(instance){
await instance.getLatestVersionOfTrade.call(i).then(function(a){
returnedLatestVersion = a;
console.log("test:"+returnedLatestVersion+",a:"+a);
}).catch(function(err){
console.log(err)
})
console.log("test2="+returnedLatestVersion);
return await returnedLatestVersion;
})
},
searchByClient: function(){
var tradesInstance;
var client = $('#clientSearch').val();
var tradeResults = $("#tradesResult");
tradeResults.empty();
App.contracts.Trades.deployed().then(function(instance){
tradesInstance = instance;
return tradesInstance.getClientData.call(client).then(async function(returnValues){
console.log("returnValues Array = "+returnValues);
var returnValuesLength = returnValues.length;
for(var i=0;i<returnValuesLength;i++){
var a = returnValues[i];
var c = returnValues[i];
var j;
j = await App.getVersion(a);
console.log("version ="+j);
console.log("tradeId="+a);
tradesInstance.trades(c,j).then(function(trade){
var secId = trade[0];
var notional = trade [1];
var price = trade[2];
var client = trade[3];
var tradeTemplate = "<tr><td>" + secId + "</td><td>" + notional + "</td><td>" + price + "</td><td>" + client +"</td></tr>"
tradeResults.append(tradeTemplate);
})
}
}).catch(function(err){
console.log(err);
})
}).catch(function(err){
console.warn(err);
})
}
};
Мой смарт-контракт: -
pragma solidity 0.5.0;
contract Trades {
struct Trade {
string secId;
uint notional;
uint price;
string client;
uint version;
uint index;
uint tradeId;
}
mapping(uint =>mapping(uint => Trade)) public trades;
uint public tradeId;
uint[] tradeIndex;
uint[] tradeID;
uint[] public totalNum;
function updateTrade(uint _tradeId, string memory _secId,uint _notional,uint _price,string memory _client) public{
uint j;
j= (getLatestVersionOfTrade(_tradeId)) + 1;
trades[_tradeId][j].secId = _secId;
trades[_tradeId][j].notional = _notional;
trades[_tradeId][j].price = _price;
trades[_tradeId][j].client = _client;
trades[_tradeId][j].version = j;
trades[_tradeId][j].index = tradeIndex.push(tradeIndex[tradeIndex.length-1]+1);
}
function setTrade(string memory _secId,uint _notional,uint _price,string memory _client) public {
uint version = 0;
tradeId++;
trades[tradeId][version].secId = _secId;
trades[tradeId][version].notional = _notional;
trades[tradeId][version].price = _price;
trades[tradeId][version].client = _client;
trades[tradeId][version].version = version;
trades[tradeId][version].index = tradeIndex.push(tradeId);
tradeID.push(tradeId);
}
function getAllTradeData()view public returns(uint[] memory){
return tradeIndex;
}
function getAllTradeDataId()view public returns(uint[] memory){
return tradeID;
}
function getTradeById(uint _tradeId,uint version)view public returns(string memory, uint, uint, string memory, uint, uint){
return (trades[_tradeId][version].secId, trades[_tradeId][version].notional, trades[_tradeId][version].price,
trades[_tradeId][version].client,trades[_tradeId][version].version, trades[_tradeId][version].index);
}
function getLatestVersionOfTrade(uint _tradeId) view public returns (uint) {
uint max = 0;
for (uint i = 0; i < tradeIndex.length; i++) {
uint ver = trades[_tradeId][i].version;
if (ver > max) {
max = ver;
}
}
return max;
}
function getClientData(string memory _client) public returns (uint[] memory) {
if (totalNum.length > 0){
delete totalNum;
}
for(uint i=1; i <= tradeID.length;i++){
uint j;
j= (getLatestVersionOfTrade(i));
if(uint(keccak256(abi.encodePacked(trades[i][j].client))) == uint(keccak256(abi.encodePacked(_client)))){
totalNum.push(i);
}
}
return totalNum;
}
function getTotalNumLength() public returns (uint){
return totalNum.length;
}
}
Ошибка, отображаемая на консоли браузера: -
returnValues Array = 3,4,5
app.js:113 version =undefined
app.js:114 tradeId=3
app.js:113 version =undefined
app.js:114 tradeId=4
app.js:113 version =undefined
app.js:114 tradeId=5
3inpage.js:1 Uncaught (in promise) Error: Invalid number of arguments to
Solidity function
at Object.InvalidNumberOfSolidityArgs (inpage.js:1)
at u.validateArgs (inpage.js:1)
at u.toPayload (inpage.js:1)
at u.call (inpage.js:1)
at u.execute (inpage.js:1)
at truffle-contract.js:136
at new Promise (<anonymous>)
at truffle-contract.js:127
app.js:77 test:0,a:0
app.js:82 test2=0
app.js:77 test:0,a:0
app.js:82 test2=0
app.js:77 test:1,a:1
app.js:82 test2=1
Переменная 'j' в searchByClient возвращает неопределенное значение, когда оно передается в 'trades (c, j)'.Но в функции getVersion возвращаемое значение выглядит нормально.Пожалуйста, помогите мне, так как у меня нет других вариантов.Также я крайне новичок в javascript, поэтому, пожалуйста, скажите мне, если я сделал какие-либо ошибкиЯ смог написать этот код с помощью учебника.