MetaMask - RPC Error: Cannot set properties of undefined (setting 'loadingDefaults') error
MetaMask - RPC Error: Cannot set properties of undefined (setting 'loadingDefaults') error
我正在构建一个 staking 函数并在允许访问我的令牌后遇到以下错误:
"MetaMask - RPC Error: Cannot set properties of undefined (setting 'loadingDefaults')"
质押功能 Solidity 合约:
// Staking function
function depositTokens(uint _amount) public {
require(_amount > 0, 'Amount has to be > 0');
// Transfer tether tokens to this contract
tether.transferFrom(msg.sender, address(this), _amount);
// Update Staking balance
stakingBalance[msg.sender] = stakingBalance[msg.sender] + _amount;
if(!hasStaked[msg.sender]) {
stakers.push(msg.sender);
}
// Update Staking balance
isStaking[msg.sender] = true;
hasStaked[msg.sender] = true;
}
质押前端
stakeTokens = (amount) => {
this.setState({loading: true })
this.state.tether.methods.approve(this.state.deBank._address, amount).send({from: this.state.account}).on('transactionHash', (hash) => {
this.state.deBank.methods.depositTokens(amount).send({from: this.state.account}).on('transactionHash', (hash) => {
this.setState({loading:false})
})
})
}
奇怪的是,在 25-30% 的情况下,我会进入第二个批准步骤并完成交易。
有人知道是什么原因造成的吗?
与您在同一门课程上遇到同样的问题,也许尝试使用节点 10 并重新部署所有内容。
如果可行,请告诉我。
尝试以下方法,对我有用:
- 在 Metamask 中转到您的测试帐户,设置 > 高级设置,然后单击“重置帐户”。
- 清除浏览器的缓存。
警告:确保您在 Metamask 中使用的是测试帐户。
重新安装模块并重新编译没有做任何事情,但是在我将函数更改为异步等待语法后它成功了:
stakeTokens = async (amount) => {
this.setState({ loading: true });
await this.state.tether.methods
.approve(this.state.decentralBank._address, amount)
.send({ from: this.state.account });
await this.state.decentralBank.methods
.depositTokens(amount)
.send({ from: this.state.account });
this.setState({ loading: false });
};
现在应该提示 Metamask 两次。第一个用于批准,第二个用于存款令牌。
这个错误在 Metamask 的 Github 上有一个未解决的问题:https://github.com/MetaMask/metamask-extension/issues/13197
我已经尝试节点版本 12.18.0 然后成功工作
删除 .on('transactionHash', (hash) => {
并使用异步等待语法对我有用
将函数更改为异步等待语法:
stakeTokens = async (amount) => {
await this.setState({ loading: true });
await this.state.tetherToken.methods.approve(this.state.tokenBank._address,amount).send({from : this.state.account });
this.state.tokenBank.methods.stakeTokens(amount).send({from: this.state.account});
this.setState ({ loading: false });
将 'on' 函数的参数值从 'transactionHash' 更改为 'confirmation' 解决了这个问题。必须在执行批准操作时更改此设置。
sellTokens = (tokenAmount) => { this.setState({ loading: true }) this.state.token.methods.approve(this.state.cryptoExchange.address, tokenAmount).send({ from: this.state.account }).on('confirmation', (confirmation ) => { this.state.cryptoExchange.methods.sellTokens(tokenAmount).send({ from: this.state.account }).on('transactionHash', (hash) => { this.setState({ loading: false }) }) }) }
我正在构建一个 staking 函数并在允许访问我的令牌后遇到以下错误:
"MetaMask - RPC Error: Cannot set properties of undefined (setting 'loadingDefaults')"
质押功能 Solidity 合约:
// Staking function
function depositTokens(uint _amount) public {
require(_amount > 0, 'Amount has to be > 0');
// Transfer tether tokens to this contract
tether.transferFrom(msg.sender, address(this), _amount);
// Update Staking balance
stakingBalance[msg.sender] = stakingBalance[msg.sender] + _amount;
if(!hasStaked[msg.sender]) {
stakers.push(msg.sender);
}
// Update Staking balance
isStaking[msg.sender] = true;
hasStaked[msg.sender] = true;
}
质押前端
stakeTokens = (amount) => {
this.setState({loading: true })
this.state.tether.methods.approve(this.state.deBank._address, amount).send({from: this.state.account}).on('transactionHash', (hash) => {
this.state.deBank.methods.depositTokens(amount).send({from: this.state.account}).on('transactionHash', (hash) => {
this.setState({loading:false})
})
})
}
奇怪的是,在 25-30% 的情况下,我会进入第二个批准步骤并完成交易。
有人知道是什么原因造成的吗?
与您在同一门课程上遇到同样的问题,也许尝试使用节点 10 并重新部署所有内容。
如果可行,请告诉我。
尝试以下方法,对我有用:
- 在 Metamask 中转到您的测试帐户,设置 > 高级设置,然后单击“重置帐户”。
- 清除浏览器的缓存。
警告:确保您在 Metamask 中使用的是测试帐户。
重新安装模块并重新编译没有做任何事情,但是在我将函数更改为异步等待语法后它成功了:
stakeTokens = async (amount) => {
this.setState({ loading: true });
await this.state.tether.methods
.approve(this.state.decentralBank._address, amount)
.send({ from: this.state.account });
await this.state.decentralBank.methods
.depositTokens(amount)
.send({ from: this.state.account });
this.setState({ loading: false });
};
现在应该提示 Metamask 两次。第一个用于批准,第二个用于存款令牌。
这个错误在 Metamask 的 Github 上有一个未解决的问题:https://github.com/MetaMask/metamask-extension/issues/13197
我已经尝试节点版本 12.18.0 然后成功工作
删除 .on('transactionHash', (hash) => {
并使用异步等待语法对我有用
将函数更改为异步等待语法:
stakeTokens = async (amount) => {
await this.setState({ loading: true });
await this.state.tetherToken.methods.approve(this.state.tokenBank._address,amount).send({from : this.state.account });
this.state.tokenBank.methods.stakeTokens(amount).send({from: this.state.account});
this.setState ({ loading: false });
将 'on' 函数的参数值从 'transactionHash' 更改为 'confirmation' 解决了这个问题。必须在执行批准操作时更改此设置。
sellTokens = (tokenAmount) => { this.setState({ loading: true }) this.state.token.methods.approve(this.state.cryptoExchange.address, tokenAmount).send({ from: this.state.account }).on('confirmation', (confirmation ) => { this.state.cryptoExchange.methods.sellTokens(tokenAmount).send({ from: this.state.account }).on('transactionHash', (hash) => { this.setState({ loading: false }) }) }) }