// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.12;
contract MyContract {
address payable public myaddress;
struct TUser {
uint totalInvested;
uint totalDeposits;
}
mapping( address => TUser ) public USERS;
constructor(address payable _walletProject) {
myaddress = _walletProject;
}
receive() payable external {
}
function newDeposit(uint _amount) public returns(uint,uint){
USERS[msg.sender].totalDeposits += 1;
USERS[msg.sender].totalInvested += _amount;
return (USERS[msg.sender].totalDeposits, USERS[msg.sender].totalInvested);
}
function getUserinfo (address _sender) public view returns (uint, uint) {
return (USERS[_sender].totalDeposits, USERS[_sender].totalInvested);
}
}
大家好,我已经被这个问题困扰了好几个小时了,我想不通。基本上,我只是想为每个存款的用户存储一些信息。目前,我只是想看看我的映射/结构是否只保存了一个用户的信息,但保存了多个存款的信息,所以它应该返回存款总数和每个存款金额的总和,但它总是在GetUserInfo函数中返回0,或者如果我试图直接从newDeposit函数返回,则返回undefined。
以下是用于调用MyContract函数的web3.js代码。
async function sendEth(_plan, _amount) {
const accounts = await ethereum.request({ method: 'eth_requestAccounts' });
const contract = await new web3.eth.Contract(abi, address);
const weiValue = Web3.utils.toWei(_amount, 'ether');
const receipt = await ethereum
.request({
method: 'eth_sendTransaction',
params: [
{
from: accounts[0],
to: address,
value: web3.utils.toHex(weiValue),
},
],
}).then((txHash) => console.log(txHash)).catch((error) => console.error);
console.log('first');
let result =[];
result = await contract.methods.newDeposit(weiValue);
console.log(result);
}
我已经编辑了我的代码如下,但它仍然不能保存我的用户信息
用于保存数据的函数,我也尝试过emiting事件,但仍然没有。
function newDeposit(uint _amount) public {
USERS[msg.sender].totalDeposits += 1;
USERS[msg.sender].totalInvested += _amount;
}
这是我用来读取数据的功能
function getUserinfo () public view returns (uint, uint) {
return (USERS[msg.sender].totalDeposits, USERS[msg.sender].totalInvested);
}
这里是启动交易并将数据发送到智能合约的web3.js部分
async function sendEth(_amount) {
const weiValue = Web3.utils.toWei(_amount, 'ether');
const amount = Web3.utils.toHex(weiValue);
const receipt = await ethereum
.request({
method: 'eth_sendTransaction',
params: [
{
from: accounts[0],
to: address,
value: amount,
},
],
}).then((txHash) => txWait(txHash, amount)).catch((error) => console.error);
}
async function txWait(_txHash, _amount){
console.log("cazzo");
let transactionReceipt = null;
while (transactionReceipt == null) {
transactionReceipt = await web3.eth.getTransactionReceipt(_txHash);
await sleep(expectedBlockTime);
}
console.log(transactionReceipt);
console.log(accounts[0]);
contract.methods.newDeposit(_amount).send({from: accounts[0]});
console.log('ciao2');
}
我试图直接从前端应用程序测试它,我已经在BscTestnet上部署了我的合同,但它不可能工作。
我使用了所有这些毫无意义的console.log,只是为了测试代码是否被卡住了,但没有,我取回了所有的console.logs,事务正常,一切似乎都很好,但我的合同并没有真正存储数据。
问题不在于映射或结构,而在于如何测试它
只要newDeposit
调用在执行过程中没有恢复,它就应该按预期工作。
由于您正在更改非视图函数newDeposit
中的状态,因此无法立即检索返回的值vbia-web3js。
我能想到的选项有:
-
在您的存款功能中发出事件,并在您的测试中读取事件
-
在调用
newDeposit
函数之后,由于getUserInfo
是一个视图函数,因此应该正确满足以下期望。
const [invested, deposits] = await contract.methods.getUserInfo(accounts[0]);
// invested and deposits should be fine