首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UseDapp --如何从实体函数中获得返回值?

UseDapp --如何从实体函数中获得返回值?
EN

Stack Overflow用户
提问于 2022-02-04 19:06:14
回答 1查看 1.2K关注 0票数 1

我想与一份明智的合同进行互动。我想设置一个字符串,并得到它的一个坚实的函数。我可以设置字符串,但问题在于使用returns语句获得字符串。如何获得返回值并打印出来?

错误消息( yay是我之前设置的字符串):

代码语言:javascript
复制
Object { status: "Fail", transaction: "yay", receipt: undefined, errorMessage: "transaction.wait is not a function", chainId: 42 }

我的钩子:

代码语言:javascript
复制
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}
}

我的反应成分:

代码语言:javascript
复制
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>
    )
}

我的合同:

代码语言:javascript
复制
// 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;
    }
}

类似问题的答案是没有帮助的。谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-05-28 16:06:06

帮我修好的是清除localStorage transactions key。正如在这个GitHub问题上提到的:https://github.com/TrueFiEng/useDApp/issues/459

但这一开始还不够,它会不断地重新填充被窃听的事务。

而且,对我来说,我超出了默认getDefaultProvider('rinkeby')提供程序的API请求限制。在获得我自己的恩弗拉API密钥之后,被清除的存储将保持空,因为我相信useDapp仍然在重新尝试发送事务,这就是为什么当我最初刚刚清除localStorage时,它不会消失的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70991615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档