WEB3-区块链后端语言Solidity-truffle-预言机

115 阅读21分钟

image.png

在这个辞旧迎新之际,先给大家拜个早年!祝大家新年快乐,龙年继续努力! 这篇文章主要介绍一下适合初学者学习的一个游戏网站

🤔今天给大家介绍一下这个适合小白学习的僵尸游戏,可以一边学习一边看到效果,以下是学习链接

加密僵尸游戏中文版。cryptozombies.io/zh/course/

为什么选择这个,请听我细细道来

image.png

image.png

在教程中我选择了两个我认为比较适合初学者学习的两个章节,我们可以看到图中的内容

第一章的内容有以下几点:

1、solidity语言的编码知识,主要是介绍solidity的特性和编码方式
2、ERC721非同质化货币的概念和相关的接口标准
3、web3.js主要用于和solidity智能合约进行交互,前端主要使用web3.js相关的接口,实例化智能合约的ABI和Address,使用合约实例去调用方法,与WEB2有些许的不同

第二章的内容有以下几点:

1、Truffle,那么什么是truffle呢,相当于java中的sringcloud或者是vue脚手架,使用truffle,能够帮我们实例化一个基础的项目,里面包含以下的目录,学习truffle,能够帮助我们去编译、测试、部署我们的合约代码

image.png

build目录是我们使用truffle migration时,会将我们的solidity代码编译生成.json格式的文件,文件中的内容是用于web3.js用来实例化与链上的solidity交互
contracts目录中包含的是solidity开发的后端代码
migrations则是我们编写的编译规则,需要编译的solidity
test目录则是存放我们编写的测试用例,用来在不部署合约的情况下测试我们的代码

预言机

我的理解,预言机也是寻常的solidity,根据学习课程的用例,描述预言机是用来访问链下的数据,但是交互逻辑是,链下的数据通过前端获取,前端A执行更新的预言机B接口,预言机B接口回调了我们需要更新的C实例接口进行更新并发送事件,前端A根据监听事件知道更新成功,就获取C实例的数据进行展示

以下是上述几个目录的样例内容

migrations则是我们编写的编译规则

const NoahNFT = artifacts.require("NoahNFT");
// const { copyAbiFile, updateEnvFile } = require("../../utils/deploy");

module.exports = function (deployer) {
  deployer.deploy(NoahNFT, 'name:Noah', 'symbol:NOAH', 'baseURI:https://gateway.pinata.cloud/ipfs/').then(() => {
    // const { address } = NoahNFT;
    // copyAbiFile('noah-nft');
    // updateEnvFile('NFT_CONTRACT_ADDRESS', address);
  });
};

test目录的内容

const MetaCoin = artifacts.require("NoahNFT");

contract("MetaCoin", (accounts) => {
  it("should put 10000 MetaCoin in the first account", async () => {
    const metaCoinInstance = await MetaCoin.deployed();
    const balance = await metaCoinInstance.balanceOf(accounts[0]);

    assert.equal(balance.valueOf(), 0, "10000 wasn't in the first account");
  });
  it("should call a function that depends on a linked library", async () => {
    const metaCoinInstance = await MetaCoin.deployed();
    const metaCoinBalance = (
      await metaCoinInstance.balanceOf(accounts[0])
    ).toNumber();
    const metaCoinEthBalance = (
      await metaCoinInstance.balanceOf(accounts[0])
    ).toNumber();

    assert.equal(
      metaCoinEthBalance,
      2 * metaCoinBalance,
      "Library function returned unexpected function, linkage may be broken"
    );
  });
  it("should send coin correctly", async () => {
    const metaCoinInstance = await MetaCoin.deployed();

    // Setup 2 accounts.
    const accountOne = accounts[0];
    const accountTwo = accounts[1];

    // Get initial balances of first and second account.
    const accountOneStartingBalance = (
      await metaCoinInstance.balanceOf(accountOne)
    ).toNumber();
    const accountTwoStartingBalance = (
      await metaCoinInstance.balanceOf(accountTwo)
    ).toNumber();

    // Make transaction from first account to second.
    const amount = 10;
    await metaCoinInstance.transferFrom(accountOne,accountTwo, amount, { from: accountOne });

    // Get balances of first and second account after the transactions.
    const accountOneEndingBalance = (
      await metaCoinInstance.balanceOf(accountOne)
    ).toNumber();
    const accountTwoEndingBalance = (
      await metaCoinInstance.balanceOf(accountTwo)
    ).toNumber();

    assert.equal(
      accountOneEndingBalance,
      accountOneStartingBalance - amount,
      "Amount wasn't correctly taken from the sender"
    );
    assert.equal(
      accountTwoEndingBalance,
      accountTwoStartingBalance + amount,
      "Amount wasn't correctly sent to the receiver"
    );
  });
});

contracts目录

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC721 {
    // 事件
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // 查询
    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    // 转账
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    // 授权
    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC721Metadata {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}


build目录,编译出来的solidity代码

{
  "contractName": "IERC721",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "approved",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "balance",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.21+commit.d9974bed\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/IERC721.sol\":\"IERC721\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"project:/contracts/IERC721.sol\":{\"keccak256\":\"0x70be2d6bc1ab763925b82bde15c2c5fc3baed193998633f42c18c46c30eb914c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://382ee7b3003bfaf140e5e8d29753bd1f2ef920c81527b3df86a77541636e065b\",\"dweb:/ipfs/QmVNxZw1P4mJrZ1WRTCeqTzn8NHpSGa9zhQLQ45TPo32FK\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\ninterface IERC721 {\n    // 事件\n    event Transfer(\n        address indexed from,\n        address indexed to,\n        uint256 indexed tokenId\n    );\n    event Approval(\n        address indexed owner,\n        address indexed approved,\n        uint256 indexed tokenId\n    );\n    event ApprovalForAll(\n        address indexed owner,\n        address indexed operator,\n        bool approved\n    );\n\n    // 查询\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    // 转账\n    function safeTransferFrom(\n        address from,\n        address to,\n        uint256 tokenId\n    ) external;\n\n    function safeTransferFrom(\n        address from,\n        address to,\n        uint256 tokenId,\n        bytes calldata data\n    ) external;\n\n    function transferFrom(\n        address from,\n        address to,\n        uint256 tokenId\n    ) external;\n\n    // 授权\n    function approve(address to, uint256 tokenId) external;\n\n    function getApproved(uint256 tokenId)\n        external\n        view\n        returns (address operator);\n\n    function setApprovalForAll(address operator, bool _approved) external;\n\n    function isApprovedForAll(address owner, address operator)\n        external\n        view\n        returns (bool);\n}\n\ninterface IERC721Receiver {\n    function onERC721Received(\n        address operator,\n        address from,\n        uint256 tokenId,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n\ninterface IERC721Metadata {\n    function name() external view returns (string memory);\n\n    function symbol() external view returns (string memory);\n\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n",
  "sourcePath": "E:\\随便玩玩\\web3-examples-main\\web3-test\\contracts\\IERC721.sol",
  "ast": {
    "absolutePath": "project:/contracts/IERC721.sol",
    "exportedSymbols": {
      "IERC721": [
        109
      ],
      "IERC721Metadata": [
        141
      ],
      "IERC721Receiver": [
        123
      ]
    },
    "id": 142,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 11,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "33:23:1"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "IERC721",
        "contractDependencies": [],
        "contractKind": "interface",
        "fullyImplemented": false,
        "id": 109,
        "linearizedBaseContracts": [
          109
        ],
        "name": "IERC721",
        "nameLocation": "68:7:1",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "eventSelector": "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
            "id": 19,
            "name": "Transfer",
            "nameLocation": "102:8:1",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 13,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "from",
                  "nameLocation": "136:4:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 19,
                  "src": "120:20:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "120:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 15,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "to",
                  "nameLocation": "166:2:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 19,
                  "src": "150:18:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 14,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "150:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "194:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 19,
                  "src": "178:23:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 16,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "178:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "110:97:1"
            },
            "src": "96:112:1"
          },
          {
            "anonymous": false,
            "eventSelector": "8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925",
            "id": 27,
            "name": "Approval",
            "nameLocation": "219:8:1",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 26,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 21,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "253:5:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 27,
                  "src": "237:21:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 20,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "237:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 23,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "approved",
                  "nameLocation": "284:8:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 27,
                  "src": "268:24:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 22,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "268:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 25,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "318:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 27,
                  "src": "302:23:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 24,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "302:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "227:104:1"
            },
            "src": "213:119:1"
          },
          {
            "anonymous": false,
            "eventSelector": "17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31",
            "id": 35,
            "name": "ApprovalForAll",
            "nameLocation": "343:14:1",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 34,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 29,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "383:5:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 35,
                  "src": "367:21:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 28,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "367:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 31,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "operator",
                  "nameLocation": "414:8:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 35,
                  "src": "398:24:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 30,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "398:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 33,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "approved",
                  "nameLocation": "437:8:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 35,
                  "src": "432:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 32,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "432:4:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "357:94:1"
            },
            "src": "337:115:1"
          },
          {
            "functionSelector": "70a08231",
            "id": 42,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "balanceOf",
            "nameLocation": "481:9:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 38,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 37,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "499:5:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 42,
                  "src": "491:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 36,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "491:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "490:15:1"
            },
            "returnParameters": {
              "id": 41,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 40,
                  "mutability": "mutable",
                  "name": "balance",
                  "nameLocation": "537:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 42,
                  "src": "529:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 39,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "529:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "528:17:1"
            },
            "scope": 109,
            "src": "472:74:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "6352211e",
            "id": 49,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "ownerOf",
            "nameLocation": "561:7:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 45,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 44,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "577:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 49,
                  "src": "569:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 43,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "569:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "568:17:1"
            },
            "returnParameters": {
              "id": 48,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "617:5:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 49,
                  "src": "609:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "609:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "608:15:1"
            },
            "scope": 109,
            "src": "552:72:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "42842e0e",
            "id": 58,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "safeTransferFrom",
            "nameLocation": "653:16:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 56,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 51,
                  "mutability": "mutable",
                  "name": "from",
                  "nameLocation": "687:4:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 58,
                  "src": "679:12:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 50,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "679:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 53,
                  "mutability": "mutable",
                  "name": "to",
                  "nameLocation": "709:2:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 58,
                  "src": "701:10:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 52,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "701:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 55,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "729:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 58,
                  "src": "721:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 54,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "721:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "669:73:1"
            },
            "returnParameters": {
              "id": 57,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "751:0:1"
            },
            "scope": 109,
            "src": "644:108:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "b88d4fde",
            "id": 69,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "safeTransferFrom",
            "nameLocation": "767:16:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 67,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60,
                  "mutability": "mutable",
                  "name": "from",
                  "nameLocation": "801:4:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 69,
                  "src": "793:12:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 59,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "793:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 62,
                  "mutability": "mutable",
                  "name": "to",
                  "nameLocation": "823:2:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 69,
                  "src": "815:10:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 61,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "815:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 64,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "843:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 69,
                  "src": "835:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 63,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "835:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 66,
                  "mutability": "mutable",
                  "name": "data",
                  "nameLocation": "875:4:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 69,
                  "src": "860:19:1",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 65,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "860:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "783:102:1"
            },
            "returnParameters": {
              "id": 68,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "894:0:1"
            },
            "scope": 109,
            "src": "758:137:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "23b872dd",
            "id": 78,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "transferFrom",
            "nameLocation": "910:12:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 76,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 71,
                  "mutability": "mutable",
                  "name": "from",
                  "nameLocation": "940:4:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 78,
                  "src": "932:12:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 70,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "932:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 73,
                  "mutability": "mutable",
                  "name": "to",
                  "nameLocation": "962:2:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 78,
                  "src": "954:10:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 72,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "954:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 75,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "982:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 78,
                  "src": "974:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 74,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "974:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "922:73:1"
            },
            "returnParameters": {
              "id": 77,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1004:0:1"
            },
            "scope": 109,
            "src": "901:104:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "095ea7b3",
            "id": 85,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "approve",
            "nameLocation": "1034:7:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 83,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 80,
                  "mutability": "mutable",
                  "name": "to",
                  "nameLocation": "1050:2:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 85,
                  "src": "1042:10:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 79,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1042:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 82,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "1062:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 85,
                  "src": "1054:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 81,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1054:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1041:29:1"
            },
            "returnParameters": {
              "id": 84,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1079:0:1"
            },
            "scope": 109,
            "src": "1025:55:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "081812fc",
            "id": 92,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "getApproved",
            "nameLocation": "1095:11:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 88,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 87,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "1115:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 92,
                  "src": "1107:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 86,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1107:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1106:17:1"
            },
            "returnParameters": {
              "id": 91,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 90,
                  "mutability": "mutable",
                  "name": "operator",
                  "nameLocation": "1179:8:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 92,
                  "src": "1171:16:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 89,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1171:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1170:18:1"
            },
            "scope": 109,
            "src": "1086:103:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "a22cb465",
            "id": 99,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "setApprovalForAll",
            "nameLocation": "1204:17:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 97,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 94,
                  "mutability": "mutable",
                  "name": "operator",
                  "nameLocation": "1230:8:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 99,
                  "src": "1222:16:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 93,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1222:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 96,
                  "mutability": "mutable",
                  "name": "_approved",
                  "nameLocation": "1245:9:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 99,
                  "src": "1240:14:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 95,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1240:4:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1221:34:1"
            },
            "returnParameters": {
              "id": 98,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1264:0:1"
            },
            "scope": 109,
            "src": "1195:70:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "e985e9c5",
            "id": 108,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "isApprovedForAll",
            "nameLocation": "1280:16:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 104,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 101,
                  "mutability": "mutable",
                  "name": "owner",
                  "nameLocation": "1305:5:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 108,
                  "src": "1297:13:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 100,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1297:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 103,
                  "mutability": "mutable",
                  "name": "operator",
                  "nameLocation": "1320:8:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 108,
                  "src": "1312:16:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 102,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1312:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1296:33:1"
            },
            "returnParameters": {
              "id": 107,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 106,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 108,
                  "src": "1377:4:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 105,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1377:4:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1376:6:1"
            },
            "scope": 109,
            "src": "1271:112:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 142,
        "src": "58:1327:1",
        "usedErrors": [],
        "usedEvents": [
          19,
          27,
          35
        ]
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "IERC721Receiver",
        "contractDependencies": [],
        "contractKind": "interface",
        "fullyImplemented": false,
        "id": 123,
        "linearizedBaseContracts": [
          123
        ],
        "name": "IERC721Receiver",
        "nameLocation": "1397:15:1",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "functionSelector": "150b7a02",
            "id": 122,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "onERC721Received",
            "nameLocation": "1428:16:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 118,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 111,
                  "mutability": "mutable",
                  "name": "operator",
                  "nameLocation": "1462:8:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 122,
                  "src": "1454:16:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 110,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1454:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 113,
                  "mutability": "mutable",
                  "name": "from",
                  "nameLocation": "1488:4:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 122,
                  "src": "1480:12:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 112,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1480:7:1",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 115,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "1510:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 122,
                  "src": "1502:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 114,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1502:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 117,
                  "mutability": "mutable",
                  "name": "data",
                  "nameLocation": "1542:4:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 122,
                  "src": "1527:19:1",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 116,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1527:5:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1444:108:1"
            },
            "returnParameters": {
              "id": 121,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 120,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 122,
                  "src": "1571:6:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 119,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "1571:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1570:8:1"
            },
            "scope": 123,
            "src": "1419:160:1",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 142,
        "src": "1387:194:1",
        "usedErrors": [],
        "usedEvents": []
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "IERC721Metadata",
        "contractDependencies": [],
        "contractKind": "interface",
        "fullyImplemented": false,
        "id": 141,
        "linearizedBaseContracts": [
          141
        ],
        "name": "IERC721Metadata",
        "nameLocation": "1593:15:1",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "functionSelector": "06fdde03",
            "id": 128,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "name",
            "nameLocation": "1624:4:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 124,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1628:2:1"
            },
            "returnParameters": {
              "id": 127,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 126,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 128,
                  "src": "1654:13:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 125,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1654:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1653:15:1"
            },
            "scope": 141,
            "src": "1615:54:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "95d89b41",
            "id": 133,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "symbol",
            "nameLocation": "1684:6:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 129,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1690:2:1"
            },
            "returnParameters": {
              "id": 132,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 131,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 133,
                  "src": "1716:13:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 130,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1716:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1715:15:1"
            },
            "scope": 141,
            "src": "1675:56:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "functionSelector": "c87b56dd",
            "id": 140,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "tokenURI",
            "nameLocation": "1746:8:1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 136,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 135,
                  "mutability": "mutable",
                  "name": "tokenId",
                  "nameLocation": "1763:7:1",
                  "nodeType": "VariableDeclaration",
                  "scope": 140,
                  "src": "1755:15:1",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 134,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1755:7:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1754:17:1"
            },
            "returnParameters": {
              "id": 139,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 138,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 140,
                  "src": "1795:13:1",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 137,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1795:6:1",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1794:15:1"
            },
            "scope": 141,
            "src": "1737:73:1",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 142,
        "src": "1583:229:1",
        "usedErrors": [],
        "usedEvents": []
      }
    ],
    "src": "33:1780:1"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.21+commit.d9974bed.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.16",
  "updatedAt": "2024-01-26T06:46:42.262Z",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}