【问题标题】:I keep getting metamask RPC error when i call getPlayersByOwner() function当我调用 getPlayersByOwner() 函数时,我不断收到元掩码 RPC 错误
【发布时间】:2022-07-10 17:57:33
【问题描述】:

我正在尝试使用 ethers.js 调用函数 getPlayersByOwner() 但我不断收到此错误:MetaMask - RPC Error: MetaMask Tx Signature: User denied transaction signature

只有当我调用这个函数而不是当我调用其他函数时才会得到这个错误。

我的合同:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract FutNFT is ERC721, ERC721Enumerable, Ownable {
    struct Player {
        string name;
        string preferredPosition;
        uint256 id;
        uint8 age;
        uint8 level;
        uint64 lastUpgrade;
        string[] suitablePositions;
        string imageURI;
    }

    struct History {
        uint256 winCount;
        uint256 lossCount;
    }

    mapping(address => History) ownerHistory;
    mapping(uint256 => Player) players;
    mapping(uint256 => address) public playerToOwner;
    mapping(uint256 => uint256) listedPlayerIndex;
    uint256[] public listedPlayers;
    uint256[] playerIds;

    event PlayerAdded(uint256 playerId);

    modifier owned(uint256 id) {
        require(getPlayerExists(id), "Player does not exist");
        require(msg.sender == ownerOf(id), "Not the owner!");
        _;
    }

    constructor() ERC721("FutNFT", "FNFT") {}

    function getListedPlayers() public view returns (uint256[] memory) {
        return listedPlayers;
    }

    function getPlayer(uint256 _id) public view returns (Player memory) {
        return players[_id];
    }

    function getPlayersByOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256[] memory result;
        uint256 index = 0;
        for (uint256 i = 0; i < playerIds.length; i++) {
            if (playerToOwner[playerIds[i]] == _owner) {
                result[index] = playerIds[i];
                index++;
            }
        }
        return result;
    }

    function ownerOf(uint256 tokenId)
        public
        view
        override(ERC721, IERC721)
        returns (address)
    {
        return super.ownerOf(tokenId);
    }

    function getPlayerExists(uint256 _id) public view returns (bool) {
        return playerToOwner[_id] != address(0);
    }

    function mint(Player memory _player) public onlyOwner {
        require(playerToOwner[_player.id] == address(0), "Player Exists!");
        players[_player.id] = _player;
        playerIds.push(_player.id);
        playerToOwner[_player.id] = msg.sender;
        _mint(msg.sender, _player.id);
        emit PlayerAdded(_player.id);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

我的前端功能:

const getPlayersByOwner = async (owner: string): Promise<number[]> => {
  const provider = new ethers.providers.Web3Provider((window as any).ethereum);
  const address = "0x0088b2315E6DfEE90F75Af7292Abf9B13c6b7253";
  const futNFT = new ethers.Contract(address, abi, provider);
  return futNFT.getPlayersByOwner(owner);
};

我是否调用了这个函数错误(例如,所有者的数据类型作为字符串是否正确?)

【问题讨论】:

  • 你有足够的ETH来支付gas费吗?
  • 是的,我正在使用孟买测试网,我有足够的 MATIC

标签: blockchain ethereum solidity web3js ethers.js


【解决方案1】:

任何类型的返回函数都不能改变任何它只能读取输出的东西, 尝试有两个函数,一个 set 函数和一个 read 函数。您试图在返回函数中设置一个函数,这会产生错误。

【讨论】:

  • 感谢我在阅读完这篇文章后做了一些修改,它奏效了!
【解决方案2】:

您能分享一下您的更改吗?

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2021-02-20
    • 2018-04-27
    • 2021-09-29
    • 2016-05-05
    • 2015-07-07
    相关资源
    最近更新 更多