我想与一份明智的合同进行互动。我想设置一个字符串,并得到它的一个坚实的函数。我可以设置字符串,但问题在于使用returns语句获得字符串。如何获得返回值并打印出来?
错误消息( yay是我之前设置的字符串):
Object { status: "Fail", transaction: "yay", receipt: undefined, errorMessage: "transaction.wait is not a function", chainId: 42 }我的钩子:
import { useContractFunction } from '@usedapp/core'
import { Contract } from "@ethersproject/contracts"
export function GetValue(contract: Contract) {
const { state, send } = useContractFunction(contract, "getValue", {transactionName: ""})
return {state, send}
}
export function SetValue(contract: Contract) {
const { state, send } = useContractFunction(contract, "setValue", {transactionName: ""})
return {state, send}
}我的反应成分:
import { useEthers } from "@usedapp/core"
import { GetValue, SetValue } from "./../hooks/index"
import lotteryAbi from "./../chain-info/abi.json"
import networkMapping from "./../chain-info/map.json"
import { constants, utils } from "ethers"
import { Contract } from "@ethersproject/contracts"
import { useEffect } from "react"
import React, { useState } from 'react';
export const Value = () => {
// Smart Contract
const { chainId } = useEthers()
const { abi } = lotteryAbi
const valueAddress = chainId ? networkMapping["42"]["ChangeValue"][0] : constants.AddressZero
const valueInterface = new utils.Interface(abi)
const valueContract = new Contract(valueAddress, valueInterface)
// get smart contract functions
const {state: statusGet, send: callGet} = GetValue(valueContract)
const {state: statusSet, send: callSet} = SetValue(valueContract)
// call smart contract functions if button pressed
function getValue() {
console.log(callGet())
}
function setValue() {
callSet(text)
}
// detect status changes
useEffect(() => {
console.log("Get:")
console.log(statusGet)
},[statusGet])
useEffect(() => {
console.log("Set:")
console.log(statusSet)
},[statusSet])
const [text, setText] = useState<string>("")
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const newText = event.target.value === "" ? "" : String(event.target.value)
setText(newText)
console.log(newText)
}
return(
<div>
<input
onChange={handleChange}
/>
<br></br>
<button onClick={setValue}>Set</button>
<button onClick={getValue}>Get</button>
</div>
)
}我的合同:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ChangeValue {
string public value;
function setValue(string memory _value) public {
value = _value;
}
function getValue() public view returns (string memory) {
return value;
}
}类似问题的答案是没有帮助的。谢谢
发布于 2022-05-28 16:06:06
帮我修好的是清除localStorage transactions key。正如在这个GitHub问题上提到的:https://github.com/TrueFiEng/useDApp/issues/459
但这一开始还不够,它会不断地重新填充被窃听的事务。
而且,对我来说,我超出了默认getDefaultProvider('rinkeby')提供程序的API请求限制。在获得我自己的恩弗拉API密钥之后,被清除的存储将保持空,因为我相信useDapp仍然在重新尝试发送事务,这就是为什么当我最初刚刚清除localStorage时,它不会消失的原因。
https://stackoverflow.com/questions/70991615
复制相似问题