我尝试通过react/javascript(web3.js)和Metamask调用Synthetix合同中的transferMargin()函数。我想在Button上使用,单击部署的智能契约中的transferMargin函数,但是它不能工作,我不知道我的代码有什么问题,我从契约和地址复制了完整的ABI。
这是我的密码:
import react, { useState } from "react";
import { Component } from 'react';
import Web3 from 'web3'
export default function KwentaOptimism()
{
let provider = window.ethereum;
let selectedAccount;
if (typeof provider !== 'undefined') {
provider
.request({method: 'eth_requestAccounts' })
.then((accounts) => {
selectedAccount = accounts[0];
console.log(`Selected account is ${selectedAccount}`);
})
}
const web3 = new Web3(provider);
async function loadContract(){
let address = "0x1e28378F64bC04E872a9D01Eb261926717346F98";
let chainlinkFutureContractABI = [{"constant":false,"inputs":[{"internalType":"int256","name":"marginDelta","type":"int256"}],"name":"transferMargin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}];
var Contract = require('web3-eth-contract');
var chainlinkFutureContract = new Contract(chainlinkFutureContractABI, address);
return await chainlinkFutureContract;
}
async function openLong(){
let linkContract = await loadContract();
linkContract.methods.transferMargin("100000000000000000000").send({from: '0xce05626e35c053995d4988b75af85e2eb7251b3c'});
}
return(
<div>
<br/>
<button onclick = {openLong()}>Chainlink Long</button>
</div>
)
}控制台错误消失了,但是onclick函数openLong()在我启动服务器或刷新页面时会自动地被调用。但是,只有当我单击"Chainlink Long“按钮时,才应该调用该函数。为什么会有这种奇怪的行为?
发布于 2022-07-22 16:01:03
这是因为当您使用.call()时,您正在尝试使用.send()调用智能契约函数。
所以你应该试着用
linkContract.methods.transferMargin("100000000000000000000").send();在这里,您可以阅读每个用例的文档:
https://web3js.readthedocs.io/en/v1.2.11/web3-eth-contract.html#methods-mymethod-call
https://web3js.readthedocs.io/en/v1.2.11/web3-eth-contract.html#methods-mymethod-send
https://stackoverflow.com/questions/73081533
复制相似问题