{"language":"Solidity","sources":{"PokemonDex.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.29;\n\ncontract PokemonDex {\n    struct Pokemon {\n        uint id;\n        string name;\n        string typeOf;\n    }\n\n    mapping(uint => Pokemon) private allPokemon;\n    mapping(address => uint[]) private playerDex;\n    mapping(address => mapping(uint => bool)) private playerPokemon;\n\n    event PokemonCaught(address indexed player, uint indexed pokemonId, string name, string typeOf);\n    event PokemonTraded(address indexed from, address indexed to, uint indexed pokemonId);\n\n    constructor() {\n        // Initialize with some Pokémon for demonstration\n        allPokemon[1] = Pokemon(1, \"Bulbasaur\", \"Grass\");\n        allPokemon[2] = Pokemon(2, \"Charmander\", \"Fire\");\n        allPokemon[3] = Pokemon(3, \"Squirtle\", \"Water\");\n        // Add more Pokémon as needed\n    }\n\n    function catchPokemon(uint pokemonId) public {\n        require(pokemonId > 0 && pokemonId <= 3, \"Invalid Pokemon ID\");\n        require(!playerPokemon[msg.sender][pokemonId], \"Pokemon already caught.\");\n\n        playerDex[msg.sender].push(pokemonId);\n        playerPokemon[msg.sender][pokemonId] = true;\n\n        emit PokemonCaught(msg.sender, pokemonId, allPokemon[pokemonId].name, allPokemon[pokemonId].typeOf);\n    }\n\n    function viewDex() public view returns (Pokemon[] memory) {\n        uint[] memory playerPokemonIds = playerDex[msg.sender];\n        Pokemon[] memory pokemons = new Pokemon[](playerPokemonIds.length);\n\n        for (uint i = 0; i < playerPokemonIds.length; i++) {\n            pokemons[i] = allPokemon[playerPokemonIds[i]];\n        }\n\n        return pokemons;\n    }\n\n    function tradePokemon(address to, uint pokemonId) public {\n        require(playerPokemon[msg.sender][pokemonId], \"You don't own this Pokemon.\");\n        require(!playerPokemon[to][pokemonId], \"Receiver already owns this Pokemon.\");\n\n        // Transfer ownership\n        playerPokemon[msg.sender][pokemonId] = false;\n        playerPokemon[to][pokemonId] = true;\n\n        // Remove from sender's Dex and add to receiver's Dex\n        for (uint i = 0; i < playerDex[msg.sender].length; i++) {\n            if (playerDex[msg.sender][i] == pokemonId) {\n                playerDex[msg.sender][i] = playerDex[msg.sender][playerDex[msg.sender].length - 1];\n                playerDex[msg.sender].pop();\n                break;\n            }\n        }\n        playerDex[to].push(pokemonId);\n\n        emit PokemonTraded(msg.sender, to, pokemonId);\n    }\n}\n"}},"settings":{"outputSelection":{"*":{"*":["*"]}},"optimizer":{"enabled":true,"runs":200}}}