{"file_path":"gcoin.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/security/Pausable.sol\";\n\ncontract GCoin is ERC20, Ownable, Pausable {\n    uint256 public constant TOTAL_SUPPLY = 60_000_000_000 * 10**9; // 60B total supply\n    uint256 public constant SALE_SUPPLY = 54_000_000_000 * 10**9; // 54B allocated for sale\n    uint256 public constant STEP_SUPPLY = 54_000_000 * 10**9; // 54M per step\n    uint256 public constant LIQUIDITY_INITIAL = 5_000_000_000 * 10**9; // 5B tokens for liquidity\n    uint256 public constant LIQUIDITY_MINTABLE = 10_000_000_000 * 10**9; // 10B tokens can be minted later\n    uint256 public constant DEVELOPMENT_SUPPLY = 9_000_000_000 * 10**9; // 9B for vesting\n    uint256 public constant PARTNERSHIPS_SUPPLY = 3_000_000_000 * 10**9; // 3B for Partnerships\n    uint256 public constant MARKETING_SUPPLY = 3_000_000_000 * 10**9; // 3B for Marketing & Community\n    uint256 public constant TEAM_SUPPLY = 3_000_000_000 * 10**9; // 3B for Team & Staff\n\n    uint256 public constant DEVELOPMENT_VESTING_PERIOD = 36 * 30 * 24 * 60 * 60; // 36 months\n    uint256 public constant PARTNERSHIPS_VESTING_PERIOD = 24 * 30 * 24 * 60 * 60; // 24 months\n    uint256 public constant TEAM_VESTING_PERIOD = 24 * 30 * 24 * 60 * 60; // 24 months\n    uint256 public constant VESTING_INTERVAL = 30 * 24 * 60 * 60; // 30 days\n\n    uint256 public currentStep = 0;\n    uint256 public currentPrice = 10_000; // $0.000010000 (scaled by 1e9)\n    uint256 public immutable PRICE_INCREMENT = 2; // 2% increment per step\n    uint256 public constant PRICE_SCALE = 1e9;\n    address public treasury;\n    address public liquidityWallet;\n    address public developmentWallet;\n    address public partnershipsWallet;\n    address public marketingWallet;\n    address public teamWallet;\n\n    uint256 public totalSold = 0;\n    uint256 public totalMinted = 0;\n    uint256 public launchTime;\n\n    mapping(address => uint256) public claimedVestedTokens;\n\n    event NextStep(uint256 newStep, uint256 newPrice);\n    event VestedTokensClaimed(address indexed wallet, string group, uint256 amount);\n    event LaunchTimeSet(uint256 launchTime);\n    event WalletUpdated(string walletType, address newWallet);\n\n    constructor(\n        address _treasury,\n        address _liquidityWallet,\n        address _developmentWallet,\n        address _partnershipsWallet,\n        address _marketingWallet,\n        address _teamWallet\n    ) ERC20(\"G Coin\", \"G\") Ownable(msg.sender) {\n        treasury = _treasury;\n        liquidityWallet = _liquidityWallet;\n        developmentWallet = _developmentWallet;\n        partnershipsWallet = _partnershipsWallet;\n        marketingWallet = _marketingWallet;\n        teamWallet = _teamWallet;\n\n        // Initial minting for liquidity allocation\n        _mint(liquidityWallet, LIQUIDITY_INITIAL);\n        // Initial minting for marketing allocation\n        _mint(marketingWallet, MARKETING_SUPPLY);\n        // Initial minting first step tokens for sale to the treasury\n        _mint(treasury, STEP_SUPPLY);\n    }\n\n    function setLaunchTime(uint256 _launchTime) external onlyOwner {\n        require(_launchTime >= block.timestamp, \"Launch time cannot be in the past\");\n\n        // Allow resetting launch time only if it hasn't started\n        require(launchTime == 0 || block.timestamp < launchTime, \"Launch time already started\");\n\n        launchTime = _launchTime;\n        emit LaunchTimeSet(launchTime);\n    }\n\n    function _nextStep() internal {\n        require(totalMinted + STEP_SUPPLY <= SALE_SUPPLY, \"Cannot mint beyond sale supply\");\n        require(totalSupply() + STEP_SUPPLY <= TOTAL_SUPPLY, \"Cannot mint beyond total supply\");\n        require(currentStep < (SALE_SUPPLY / STEP_SUPPLY), \"All steps completed\");\n\n        uint256 remainingSupply = TOTAL_SUPPLY - totalSupply();\n        uint256 mintAmount = remainingSupply > STEP_SUPPLY ? STEP_SUPPLY : remainingSupply;\n\n        currentStep++;\n        currentPrice = (currentPrice * (10000 + (PRICE_INCREMENT * 100))) / 10000;\n        \n        _mint(treasury, mintAmount);\n        totalMinted += mintAmount;\n\n        emit NextStep(currentStep, currentPrice);\n    }\n\n   function _update(address from, address to, uint256 amount) internal override {\n        super._update(from, to, amount);\n\n        // Only track sales when sending from treasury\n        if (from == treasury && to != treasury) {\n            totalSold += amount;\n\n            // Ensure `_nextStep()` is triggered only when `totalSold` crosses a step boundary\n            uint256 nextStepThreshold = (currentStep + 1) * STEP_SUPPLY;\n            if (totalSold >= nextStepThreshold && totalSold < SALE_SUPPLY) {\n                uint256 previousStep = currentStep;\n                _nextStep();\n                emit NextStep(previousStep + 1, currentPrice);\n            }\n        }\n    }\n\n    function updateWallet(string memory walletType, address newWallet) external onlyOwner {\n        require(newWallet != address(0), \"Invalid wallet address\");\n\n        if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked(\"treasury\"))) {\n            require(newWallet != treasury, \"New address is the same as the current one\");\n            treasury = newWallet;\n        } else if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked(\"liquidity\"))) {\n            require(newWallet != liquidityWallet, \"New address is the same as the current one\");\n            liquidityWallet = newWallet;\n        } else if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked(\"development\"))) {\n            require(newWallet != developmentWallet, \"New address is the same as the current one\");\n            developmentWallet = newWallet;\n        } else if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked(\"partnerships\"))) {\n            require(newWallet != partnershipsWallet, \"New address is the same as the current one\");\n            partnershipsWallet = newWallet;\n        } else if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked(\"marketing\"))) {\n            require(newWallet != marketingWallet, \"New address is the same as the current one\");\n            marketingWallet = newWallet;\n        } else if (keccak256(abi.encodePacked(walletType)) == keccak256(abi.encodePacked(\"team\"))) {\n            require(newWallet != teamWallet, \"New address is the same as the current one\");\n            teamWallet = newWallet;\n        } else {\n            revert(\"Invalid wallet type\");\n        }\n        emit WalletUpdated(walletType, newWallet);\n    }\n\n    function claimDevelopmentTokens() external {\n        require(msg.sender == developmentWallet, \"Not authorized\");\n        require(launchTime > 0, \"Launch time not set\");\n        require(block.timestamp >= launchTime, \"Vesting period has not started yet\");\n\n        // Ensure first batch is claimable immediately at launch\n        uint256 monthsElapsed = ((block.timestamp - launchTime) / VESTING_INTERVAL) + 1;\n\n        // Ensure monthsElapsed does not exceed the full vesting period\n        uint256 maxMonths = DEVELOPMENT_VESTING_PERIOD / VESTING_INTERVAL;\n        if (monthsElapsed > maxMonths) {\n            monthsElapsed = maxMonths;\n        }\n\n        // Ensure first batch is available immediately\n        uint256 vestedAmount = (DEVELOPMENT_SUPPLY * monthsElapsed) / maxMonths;\n\n        // Calculate remaining claimable tokens\n        uint256 claimableAmount = vestedAmount - claimedVestedTokens[msg.sender];\n\n        require(claimableAmount > 0, \"No vested tokens available to claim\");\n\n        // Ensure claimable amount never exceeds total allocation\n        if (claimedVestedTokens[msg.sender] + claimableAmount > DEVELOPMENT_SUPPLY) {\n            claimableAmount = DEVELOPMENT_SUPPLY - claimedVestedTokens[msg.sender];\n        }\n\n        // Update claimed amount and mint\n        claimedVestedTokens[msg.sender] += claimableAmount;\n        _mint(msg.sender, claimableAmount);\n\n        emit VestedTokensClaimed(msg.sender, \"Development\", claimableAmount);\n    }\n\n    function claimVestedTokens() external {\n        require(msg.sender == partnershipsWallet || msg.sender == teamWallet, \"Not authorized\");\n\n        uint256 vestingPeriod;\n        uint256 totalAllocation;\n        uint256 cliffTime = launchTime + 6 * 30 * 24 * 60 * 60;\n\n        if (msg.sender == partnershipsWallet) {\n            vestingPeriod = PARTNERSHIPS_VESTING_PERIOD;\n            totalAllocation = PARTNERSHIPS_SUPPLY;\n        } else if (msg.sender == teamWallet) {\n            vestingPeriod = TEAM_VESTING_PERIOD;\n            totalAllocation = TEAM_SUPPLY;\n            cliffTime = launchTime + 12 * 30 * 24 * 60 * 60;\n        }\n\n        require(block.timestamp >= cliffTime, \"Vesting has not started yet\");\n\n        uint256 monthsElapsed = (block.timestamp - cliffTime) / VESTING_INTERVAL;\n        uint256 vestedAmount = (totalAllocation * monthsElapsed) / (vestingPeriod / VESTING_INTERVAL);\n        uint256 claimableAmount = vestedAmount - claimedVestedTokens[msg.sender];\n\n        // Ensure no over-claiming\n        if (claimedVestedTokens[msg.sender] + claimableAmount > totalAllocation) {\n            claimableAmount = totalAllocation - claimedVestedTokens[msg.sender];\n        }\n\n        require(claimableAmount > 0, \"No vested tokens available to claim\");\n\n        claimedVestedTokens[msg.sender] += claimableAmount;\n        _mint(msg.sender, claimableAmount);\n\n        if (msg.sender == partnershipsWallet)\n            emit VestedTokensClaimed(msg.sender, \"Partnerships\", claimableAmount);\n        else if (msg.sender == teamWallet)\n            emit VestedTokensClaimed(msg.sender, \"Team & Staff\", claimableAmount);\n    }\n\n    function decimals() public pure override returns (uint8) {\n        return 9;\n    }\n}\n","deployed_bytecode":"0x608080604052600436101561001357600080fd5b60003560e01c90816306fdde031461149057508063095ea7b31461140a5780630a525a8b146113e857806318160ddd146113ca57806323b872dd146112dd578063269a3d4c146112be578063313ce567146112a25780633d14ca2e1461127f578063519da0b31461125c57806359927044146112335780635bc34f71146112155780635c975abb146111ef57806361d027b3146111c65780636d25d8021461118b57806370a0823114611151578063715018a6146110f457806375f0a874146110cb578063780b973714610c10578063790ca41314610bf25780638da5cb5b14610bc9578063902d55a514610ba557806390d7a4521461022b5780639106d7ba14610b8757806391d1f78414610b5e578063933143961461055857806395d89b4114610a4e5780639d1b464a14610a305780639ff46e741461092b578063a2309ff81461090d578063a4f6e86d146108d3578063a5ca2afa146108b5578063a9059cbb14610884578063b9c3a8181461022b578063c04a54141461085b578063c33f59d31461083c578063cbf6fff914610818578063d4520678146105d7578063d4698016146105ae578063dd62ed3e1461055d578063e559c72414610558578063e74f3fbb146102ba578063f2fde38b14610230578063fb2f66561461022b5763ff1f133a1461020357600080fd5b34610226576000366003190112610226576020604051674563918244f400008152f35b600080fd5b6115e2565b3461022657602036600319011261022657610249611594565b610251611844565b6001600160a01b031680156102a457600580546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b631e4fbdf760e01b600052600060045260246000fd5b3461022657600036600319011261022657600b546001600160a01b03163314808015610544575b6102ea90611683565b60008060105462ed4e00810180821161052e5793156104ea575050506303b538006729a2241af62c0000915b8042106104a55761035c9162278d0061033d8161033661034595426116de565b0486611782565b9104906116eb565b3360009081526011602052604090205b54906116de565b90806103848361037e3360018060a01b03166000526011602052604060002090565b5461173d565b11610486575b50610396811515611795565b3360009081526011602052604090206103b082825461173d565b90556103bc813361186d565b600b54336001600160a01b0390911603610421576040519060408252600c60408301526b506172746e6572736869707360a01b606083015260208201527ff8108cad8157f70e63676f74241ce3ac263b2bdd1d6af409864b96ac84f70c2760803392a2005b600d546001600160a01b0316331461043557005b6040519060408252600c60408301526b2a32b0b690131029ba30b33360a11b606083015260208201527ff8108cad8157f70e63676f74241ce3ac263b2bdd1d6af409864b96ac84f70c2760803392a2005b33600090815260116020526040902061049f9250610355565b8161038a565b60405162461bcd60e51b815260206004820152601b60248201527f56657374696e6720686173206e6f7420737461727465642079657400000000006044820152606490fd5b600d54929391926001600160a01b03163314610507575b50610316565b925050506303b538006729a2241af62c0000916301da9c00810180911161052e5783610501565b634e487b7160e01b600052601160045260246000fd5b50600d546001600160a01b031633146102e1565b611605565b3461022657604036600319011261022657610576611594565b61057e6115aa565b6001600160a01b039182166000908152600160209081526040808320949093168252928352819020549051908152f35b34610226576000366003190112610226576009546040516001600160a01b039091168152602090f35b3461022657600036600319011261022657600a546105ff906001600160a01b03163314611683565b60105480156107dd5780421061078d5762278d0061062061062692426116de565b0461170b565b602490818111610786575b80677ce66c50e28400000290677ce66c50e28400008204036107715781801561075d57336000908152601160205260409020610671929190910490610355565b9061067d821515611795565b336000908152601160205260409020677ce66c50e2840000906106a190849061037e565b1161071e575b503360009081526011602052604090206106c282825461173d565b90556106ce813361186d565b6040519060408252600b60408301526a11195d995b1bdc1b595b9d60aa1b606083015260208201527ff8108cad8157f70e63676f74241ce3ac263b2bdd1d6af409864b96ac84f70c2760803392a2005b33600090815260116020526040902054677ce66c50e2840000908103925082116107495750816106a7565b634e487b7160e01b60009081526011600452fd5b634e487b7160e01b60009081526012600452fd5b50634e487b7160e01b60009081526011600452fd5b5080610631565b60405162461bcd60e51b815260206004820152602260248201527f56657374696e6720706572696f6420686173206e6f7420737461727465642079604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152601360248201527213185d5b98da081d1a5b59481b9bdd081cd95d606a1b6044820152606490fd5b346102265760003660031901126102265760206040516802ed6689e54f1800008152f35b34610226576000366003190112610226576020604051633b9aca008152f35b3461022657600036600319011261022657600a546040516001600160a01b039091168152602090f35b34610226576040366003190112610226576108aa6108a0611594565b60243590336117ed565b602060405160018152f35b3461022657600036600319011261022657602060405162278d008152f35b34610226576020366003190112610226576001600160a01b036108f4611594565b1660005260116020526020604060002054604051908152f35b34610226576000366003190112610226576020600f54604051908152f35b3461022657602036600319011261022657600435610947611844565b4281106109e15760105480159081156109d7575b5015610992576020817f904fc432821d8cadec83d758c8133c3003214b3735ce8c68f0d2428e2e2f2f2b92601055604051908152a1005b60405162461bcd60e51b815260206004820152601b60248201527f4c61756e63682074696d6520616c7265616479207374617274656400000000006044820152606490fd5b905042108261095b565b60405162461bcd60e51b815260206004820152602160248201527f4c61756e63682074696d652063616e6e6f7420626520696e20746865207061736044820152601d60fa1b6064820152608490fd5b34610226576000366003190112610226576020600754604051908152f35b346102265760003660031901126102265760405160006004548060011c90600181168015610b54575b602083108114610b4057828552908115610b1c5750600114610abc575b610ab883610aa4818503826115c0565b60405191829160208352602083019061156f565b0390f35b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b808210610b0257509091508101602001610aa4610a94565b919260018160209254838588010152019101909291610aea565b60ff191660208086019190915291151560051b84019091019150610aa49050610a94565b634e487b7160e01b84526022600452602484fd5b91607f1691610a77565b3461022657600036600319011261022657600b546040516001600160a01b039091168152602090f35b34610226576000366003190112610226576020600e54604051908152f35b34610226576000366003190112610226576020604051680340aad21b3b7000008152f35b34610226576000366003190112610226576005546040516001600160a01b039091168152602090f35b34610226576000366003190112610226576020601054604051908152f35b346102265760403660031901126102265760043567ffffffffffffffff811161022657366023820112156102265780600401359067ffffffffffffffff82116110b55760405191610c6b601f8201601f1916602001846115c0565b808352602083019136602483830101116102265781600092602460209301853784010152610c976115aa565b610c9f611844565b6001600160a01b0316908115611077576040516020810190610cdb6020828751610cca81878961154c565b81010301601f1981018352826115c0565b519020604051602081019067747265617375727960c01b825260088152610d036028826115c0565b51902003610d6a5750600854600080516020611c3a83398151915292610d5f9290918190610d3c6001600160a01b038216831415611624565b6001600160a01b031916176008555b60405192839260408452604084019061156f565b9060208301520390a1005b6040516020810190610d856020828751610cca81878961154c565b5190206040516020810190686c697175696469747960b81b825260098152610dae6029826115c0565b51902003610dfa5750600954600080516020611c3a83398151915292610d5f9290918190610de76001600160a01b038216831415611624565b6001600160a01b03191617600955610d4b565b6040516020810190610e156020828751610cca81878961154c565b51902060405160208101906a19195d995b1bdc1b595b9d60aa1b8252600b8152610e40602b826115c0565b51902003610e8c5750600a54600080516020611c3a83398151915292610d5f9290918190610e796001600160a01b038216831415611624565b6001600160a01b03191617600a55610d4b565b6040516020810190610ea76020828751610cca81878961154c565b51902060405160208101906b706172746e6572736869707360a01b8252600c8152610ed3602c826115c0565b51902003610f1f5750600b54600080516020611c3a83398151915292610d5f9290918190610f0c6001600160a01b038216831415611624565b6001600160a01b03191617600b55610d4b565b6040516020810190610f3a6020828751610cca81878961154c565b5190206040516020810190686d61726b6574696e6760b81b825260098152610f636029826115c0565b51902003610faf5750600c54600080516020611c3a83398151915292610d5f9290918190610f9c6001600160a01b038216831415611624565b6001600160a01b03191617600c55610d4b565b610cca90610fcd60206040518093828201958691895192839161154c565b5190206040516020810190637465616d60e01b825260048152610ff16024826115c0565b5190200361103c57600d54600080516020611c3a83398151915292610d5f92909181906110296001600160a01b038216831415611624565b6001600160a01b03191617600d55610d4b565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c69642077616c6c6574207479706560681b6044820152606490fd5b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642077616c6c6574206164647265737360501b6044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b3461022657600036600319011261022657600c546040516001600160a01b039091168152602090f35b346102265760003660031901126102265761110d611844565b600580546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610226576020366003190112610226576001600160a01b03611172611594565b1660005260006020526020604060002054604051908152f35b346102265760003660031901126102265760206040517f00000000000000000000000000000000000000000000000000000000000000028152f35b34610226576000366003190112610226576008546040516001600160a01b039091168152602090f35b3461022657600036600319011261022657602060ff60055460a01c166040519015158152f35b34610226576000366003190112610226576020600654604051908152f35b3461022657600036600319011261022657600d546040516001600160a01b039091168152602090f35b34610226576000366003190112610226576020604051677ce66c50e28400008152f35b34610226576000366003190112610226576020604051678ac7230489e800008152f35b3461022657600036600319011261022657602060405160098152f35b3461022657600036600319011261022657602060405163058fd4008152f35b34610226576060366003190112610226576112f6611594565b6112fe6115aa565b6001600160a01b038216600081815260016020908152604080832033845290915290205490926044359291600019811061133e575b506108aa93506117ed565b8381106113ad578415611397573315611381576108aa946000526001602052604060002060018060a01b0333166000526020528360406000209103905584611333565b634a1406b160e11b600052600060045260246000fd5b63e602df0560e01b600052600060045260246000fd5b8390637dc7a0d960e11b6000523360045260245260445260646000fd5b34610226576000366003190112610226576020600254604051908152f35b3461022657600036600319011261022657602060405166bfd8b6c1df00008152f35b3461022657604036600319011261022657611423611594565b602435903315611397576001600160a01b031690811561138157336000526001602052604060002082600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346102265760003660031901126102265760006003548060011c90600181168015611542575b602083108114610b4057828552908115610b1c57506001146114e257610ab883610aa4818503826115c0565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b80821061152857509091508101602001610aa4610a94565b919260018160209254838588010152019101909291611510565b91607f16916114b6565b60005b83811061155f5750506000910152565b818101518382015260200161154f565b906020916115888151809281855285808601910161154c565b601f01601f1916010190565b600435906001600160a01b038216820361022657565b602435906001600160a01b038216820361022657565b90601f8019910116810190811067ffffffffffffffff8211176110b557604052565b346102265760003660031901126102265760206040516729a2241af62c00008152f35b346102265760003660031901126102265760206040516303b538008152f35b1561162b57565b60405162461bcd60e51b815260206004820152602a60248201527f4e65772061646472657373206973207468652073616d65206173207468652063604482015269757272656e74206f6e6560b01b6064820152608490fd5b1561168a57565b60405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606490fd5b680340aad21b3b7000000390680340aad21b3b700000821161052e57565b9190820391821161052e57565b81156116f5570490565b634e487b7160e01b600052601260045260246000fd5b906001820180921161052e57565b9066bfd8b6c1df0000820180921161052e57565b6127100190816127101161052e57565b9190820180921161052e57565b9066bfd8b6c1df000082029180830466bfd8b6c1df0000149015171561052e57565b9060648202918083046064149015171561052e57565b8181029291811591840414171561052e57565b1561179c57565b60405162461bcd60e51b815260206004820152602360248201527f4e6f2076657374656420746f6b656e7320617661696c61626c6520746f20636c60448201526261696d60e81b6064820152608490fd5b91906001600160a01b0383161561182e576001600160a01b038116156118185761181692611884565b565b63ec442f0560e01b600052600060045260246000fd5b634b637e8f60e11b600052600060045260246000fd5b6005546001600160a01b0316330361185857565b63118cdaa760e01b6000523360045260246000fd5b906001600160a01b03821615611818576118169160005b6001600160a01b031690816119c35761189f8360025461173d565b6002555b6001600160a01b031690816119aa5782600254036002555b81817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051878152a36008546001600160a01b0316809114918261199f575b50506119065750565b61191561191a91600e5461173d565b600e55565b60065461192e6119298261170b565b61174a565b600e5490811015908161198c575b506119445750565b61194c611af6565b6119767fe5e5d875889af491955d305c82a289d672cf6bebf4931cf1b4eebf3c8efacd1e9161170b565b60075460408051928352602083019190915290a1565b6802ed6689e54f1800009150103861193c565b1415905038806118fd565b81600052600060205260406000208381540190556118bb565b8160005260006020526040600020548381106119f0578390836000526000602052036040600020556118a3565b91905063391434e360e21b60005260045260245260445260646000fd5b15611a1457565b60405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206d696e74206265796f6e642073616c6520737570706c7900006044820152606490fd5b15611a6057565b60405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e74206265796f6e6420746f74616c20737570706c79006044820152606490fd5b15611aac57565b60405162461bcd60e51b8152602060048201526013602482015272105b1b081cdd195c1cc818dbdb5c1b195d1959606a1b6044820152606490fd5b600019811461052e5760010190565b611b156802ed6689e54f180000611b0e600f54611719565b1115611a0d565b600254611b35680340aad21b3b700000611b2e83611719565b1115611a59565b611b4e60065491611b496103e88410611aa5565b6116c0565b66bfd8b6c1df0000811115611c2c5750611b77611b7266bfd8b6c1df000092611ae7565b600655565b611bc7611bc2611bba600754611bb4611baf7f000000000000000000000000000000000000000000000000000000000000000261176c565b61172d565b90611782565b612710900490565b600755565b600854611bde9082906001600160a01b031661186d565b611bed611bf291600f5461173d565b600f55565b6006546007546040805192835260208301919091527fe5e5d875889af491955d305c82a289d672cf6bebf4931cf1b4eebf3c8efacd1e91a1565b611b72611b779192611ae756fe6ff3a4003b90be84595beb5f6acb9d54f88bd3e6dd4887ca67e53dc9645465eaa264697066735822122040aa6e25bf7e297a9e8b8beb2f1e998d10eb0e244e9a50e0a415e602111f8ac364736f6c634300081a0033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"github_repository_metadata":null,"compiler_settings":{"evmVersion":"paris","libraries":{},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["ast"],"*":["abi","metadata","devdoc","userdoc","storageLayout","evm.legacyAssembly","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","evm.gasEstimates","evm.assembly"]}},"viaIR":true},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":[["0x8a9E2ffE353fDFD55302DB8C464d64851dB2491e",{"internalType":"address","name":"_treasury","type":"address"}],["0x09E559F17673C68Ff565e16Eb78435090143080a",{"internalType":"address","name":"_liquidityWallet","type":"address"}],["0x863d1354e456Ada526E79Ff0B03CAfE51528f602",{"internalType":"address","name":"_developmentWallet","type":"address"}],["0x360770A8501109EAE932dF324A8ED54279014ADe",{"internalType":"address","name":"_partnershipsWallet","type":"address"}],["0x0C5D8E34ef904085f8E3aB5C5a5E49A5460ac7aF",{"internalType":"address","name":"_marketingWallet","type":"address"}],["0x1EAEA43C3b28F3D7de4E426cE16AFa9E629fD048",{"internalType":"address","name":"_teamWallet","type":"address"}]],"compiler_version":"v0.8.26+commit.8a97fa7a","is_verified_via_verifier_alliance":true,"verified_at":"2025-03-02T13:46:44.156896Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60a06040523461072b576128cd60c0813803918261001c81610730565b93849283398101031261072b5761003281610755565b61003e60208301610755565b9161004b60408201610755565b9261005860608301610755565b9061007160a061006a60808601610755565b9401610755565b9361007c6040610730565b6006815265239021b7b4b760d11b60208201526100996040610730565b60018152604760f81b6020820152815190916001600160401b0382116106285760035490600182811c92168015610721575b60208310146106085781601f8493116106b1575b50602090601f83116001146106495760009261063e575b50508160011b916000199060031b1c1916176003555b8051906001600160401b0382116106285760045490600182811c9216801561061e575b60208310146106085781601f849311610598575b50602090601f831160011461053057600092610525575b50508160011b916000199060031b1c1916176004555b331561050f57600554336001600160a01b0382167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36001600160a81b0319163360ff60a01b191617600555600060068190556127106007556002608052600e819055600f55600880546001600160a01b03199081166001600160a01b03938416179091556009805482169383169384179055600a8054821697831697909717909655600b8054871693821693909317909255600c8054861693831693909317909255600d805490941692169190911790915580156103d157610260674563918244f40000826000610915565b6008546001600160a01b031680159182610504575b505061047b575b600c546001600160a01b031680156103d1576102a26729a2241af62c0000826000610915565b6008546001600160a01b031680159182610470575b50506103e7575b6008546001600160a01b031680156103d1576102e366bfd8b6c1df0000826000610915565b6008546001600160a01b0316801591826103c6575b505061031e575b604051611c8f9081610bfe82396080518181816111a30152611b8b0152f35b600e5466bfd8b6c1df000081018091116103b057600e556006546103496103448261082f565b61086e565b600e5490811015908161039d575b50610363575b506102ff565b61038360008051602061288d8339815191529161037e610aea565b61082f565b60075460408051928352602083019190915290a13861035d565b6802ed6689e54f18000091501038610357565b634e487b7160e01b600052601160045260246000fd5b1415905038806102f8565b63ec442f0560e01b600052600060045260246000fd5b600e546729a2241af62c000081018091116103b057600e5560065461040e6103448261082f565b600e5490811015908161045d575b50610428575b506102be565b61044360008051602061288d8339815191529161037e610aea565b60075460408051928352602083019190915290a138610422565b6802ed6689e54f1800009150103861041c565b1415905038806102b7565b600e54674563918244f4000081018091116103b057600e556006546104a26103448261082f565b600e549081101590816104f1575b506104bc575b5061027c565b6104d760008051602061288d8339815191529161037e610aea565b60075460408051928352602083019190915290a1386104b6565b6802ed6689e54f180000915010386104b0565b141590503880610275565b631e4fbdf760e01b600052600060045260246000fd5b01519050388061015a565b600460009081528281209350601f198516905b8181106105805750908460019594939210610567575b505050811b01600455610170565b015160001960f88460031b161c19169055388080610559565b92936020600181928786015181550195019301610543565b60046000529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c810191602085106105fe575b90601f859493920160051c01905b8181106105ef5750610143565b600081558493506001016105e2565b90915081906105d4565b634e487b7160e01b600052602260045260246000fd5b91607f169161012f565b634e487b7160e01b600052604160045260246000fd5b0151905038806100f6565b600360009081528281209350601f198516905b8181106106995750908460019594939210610680575b505050811b0160035561010c565b015160001960f88460031b161c19169055388080610672565b9293602060018192878601518155019501930161065c565b60036000529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c81019160208510610717575b90601f859493920160051c01905b81811061070857506100df565b600081558493506001016106fb565b90915081906106ed565b91607f16916100cb565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761062857604052565b51906001600160a01b038216820361072b57565b6001600160a01b0381169081156103d15782610784916108b9565b6008546001600160a01b031680159182610824575b50506107a25750565b6107b16107b691600e54610861565b600e55565b6006546107c56103448261082f565b600e54908110159081610811575b506107db5750565b6107e3610aea565b6107fb60008051602061288d8339815191529161082f565b60075460408051928352602083019190915290a1565b6802ed6689e54f180000915010386107d3565b141590503880610799565b90600182018092116103b057565b9066bfd8b6c1df000082018092116103b057565b612710019081612710116103b057565b919082018092116103b057565b9066bfd8b6c1df000082029180830466bfd8b6c1df000014901517156103b057565b906064820291808304606414901517156103b057565b818102929181159184041417156103b057565b6000805160206128ad83398151915260206000926108d985600254610861565b6002556001600160a01b031693841584146109005780600254036002555b604051908152a3565b848452838252604084208181540190556108f7565b6001600160a01b0316908161097e5760206000805160206128ad8339815191529161094285600254610861565b6002555b6001600160a01b03169384610966578060025403600255604051908152a3565b846000526000825260406000208181540190556108f7565b8160005260006020526040600020548381106109bc576000805160206128ad8339815191529184602092856000526000845203604060002055610946565b91905063391434e360e21b60005260045260245260445260646000fd5b156109e057565b60405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206d696e74206265796f6e642073616c6520737570706c7900006044820152606490fd5b15610a2c57565b60405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e74206265796f6e6420746f74616c20737570706c79006044820152606490fd5b15610a7857565b60405162461bcd60e51b815260206004820152601360248201527f416c6c20737465707320636f6d706c65746564000000000000000000000000006044820152606490fd5b680340aad21b3b7000000390680340aad21b3b70000082116103b057565b60001981146103b05760010190565b610b096802ed6689e54f180000610b02600f5461083d565b11156109d9565b600254610b29680340aad21b3b700000610b228361083d565b1115610a25565b610b4260065491610b3d6103e88410610a71565b610abd565b66bfd8b6c1df0000811115610bf05750610b6b610b6666bfd8b6c1df000092610adb565b600655565b610b9d610b98610b90600754610b8a610b85608051610890565b610851565b906108a6565b612710900490565b600755565b600854610bb49082906001600160a01b0316610769565b610bc3610bc891600f54610861565b600f55565b60065460075460408051928352602083019190915260008051602061288d83398151915291a1565b610b66610b6b9192610adb56fe608080604052600436101561001357600080fd5b60003560e01c90816306fdde031461149057508063095ea7b31461140a5780630a525a8b146113e857806318160ddd146113ca57806323b872dd146112dd578063269a3d4c146112be578063313ce567146112a25780633d14ca2e1461127f578063519da0b31461125c57806359927044146112335780635bc34f71146112155780635c975abb146111ef57806361d027b3146111c65780636d25d8021461118b57806370a0823114611151578063715018a6146110f457806375f0a874146110cb578063780b973714610c10578063790ca41314610bf25780638da5cb5b14610bc9578063902d55a514610ba557806390d7a4521461022b5780639106d7ba14610b8757806391d1f78414610b5e578063933143961461055857806395d89b4114610a4e5780639d1b464a14610a305780639ff46e741461092b578063a2309ff81461090d578063a4f6e86d146108d3578063a5ca2afa146108b5578063a9059cbb14610884578063b9c3a8181461022b578063c04a54141461085b578063c33f59d31461083c578063cbf6fff914610818578063d4520678146105d7578063d4698016146105ae578063dd62ed3e1461055d578063e559c72414610558578063e74f3fbb146102ba578063f2fde38b14610230578063fb2f66561461022b5763ff1f133a1461020357600080fd5b34610226576000366003190112610226576020604051674563918244f400008152f35b600080fd5b6115e2565b3461022657602036600319011261022657610249611594565b610251611844565b6001600160a01b031680156102a457600580546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b631e4fbdf760e01b600052600060045260246000fd5b3461022657600036600319011261022657600b546001600160a01b03163314808015610544575b6102ea90611683565b60008060105462ed4e00810180821161052e5793156104ea575050506303b538006729a2241af62c0000915b8042106104a55761035c9162278d0061033d8161033661034595426116de565b0486611782565b9104906116eb565b3360009081526011602052604090205b54906116de565b90806103848361037e3360018060a01b03166000526011602052604060002090565b5461173d565b11610486575b50610396811515611795565b3360009081526011602052604090206103b082825461173d565b90556103bc813361186d565b600b54336001600160a01b0390911603610421576040519060408252600c60408301526b506172746e6572736869707360a01b606083015260208201527ff8108cad8157f70e63676f74241ce3ac263b2bdd1d6af409864b96ac84f70c2760803392a2005b600d546001600160a01b0316331461043557005b6040519060408252600c60408301526b2a32b0b690131029ba30b33360a11b606083015260208201527ff8108cad8157f70e63676f74241ce3ac263b2bdd1d6af409864b96ac84f70c2760803392a2005b33600090815260116020526040902061049f9250610355565b8161038a565b60405162461bcd60e51b815260206004820152601b60248201527f56657374696e6720686173206e6f7420737461727465642079657400000000006044820152606490fd5b600d54929391926001600160a01b03163314610507575b50610316565b925050506303b538006729a2241af62c0000916301da9c00810180911161052e5783610501565b634e487b7160e01b600052601160045260246000fd5b50600d546001600160a01b031633146102e1565b611605565b3461022657604036600319011261022657610576611594565b61057e6115aa565b6001600160a01b039182166000908152600160209081526040808320949093168252928352819020549051908152f35b34610226576000366003190112610226576009546040516001600160a01b039091168152602090f35b3461022657600036600319011261022657600a546105ff906001600160a01b03163314611683565b60105480156107dd5780421061078d5762278d0061062061062692426116de565b0461170b565b602490818111610786575b80677ce66c50e28400000290677ce66c50e28400008204036107715781801561075d57336000908152601160205260409020610671929190910490610355565b9061067d821515611795565b336000908152601160205260409020677ce66c50e2840000906106a190849061037e565b1161071e575b503360009081526011602052604090206106c282825461173d565b90556106ce813361186d565b6040519060408252600b60408301526a11195d995b1bdc1b595b9d60aa1b606083015260208201527ff8108cad8157f70e63676f74241ce3ac263b2bdd1d6af409864b96ac84f70c2760803392a2005b33600090815260116020526040902054677ce66c50e2840000908103925082116107495750816106a7565b634e487b7160e01b60009081526011600452fd5b634e487b7160e01b60009081526012600452fd5b50634e487b7160e01b60009081526011600452fd5b5080610631565b60405162461bcd60e51b815260206004820152602260248201527f56657374696e6720706572696f6420686173206e6f7420737461727465642079604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152601360248201527213185d5b98da081d1a5b59481b9bdd081cd95d606a1b6044820152606490fd5b346102265760003660031901126102265760206040516802ed6689e54f1800008152f35b34610226576000366003190112610226576020604051633b9aca008152f35b3461022657600036600319011261022657600a546040516001600160a01b039091168152602090f35b34610226576040366003190112610226576108aa6108a0611594565b60243590336117ed565b602060405160018152f35b3461022657600036600319011261022657602060405162278d008152f35b34610226576020366003190112610226576001600160a01b036108f4611594565b1660005260116020526020604060002054604051908152f35b34610226576000366003190112610226576020600f54604051908152f35b3461022657602036600319011261022657600435610947611844565b4281106109e15760105480159081156109d7575b5015610992576020817f904fc432821d8cadec83d758c8133c3003214b3735ce8c68f0d2428e2e2f2f2b92601055604051908152a1005b60405162461bcd60e51b815260206004820152601b60248201527f4c61756e63682074696d6520616c7265616479207374617274656400000000006044820152606490fd5b905042108261095b565b60405162461bcd60e51b815260206004820152602160248201527f4c61756e63682074696d652063616e6e6f7420626520696e20746865207061736044820152601d60fa1b6064820152608490fd5b34610226576000366003190112610226576020600754604051908152f35b346102265760003660031901126102265760405160006004548060011c90600181168015610b54575b602083108114610b4057828552908115610b1c5750600114610abc575b610ab883610aa4818503826115c0565b60405191829160208352602083019061156f565b0390f35b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b808210610b0257509091508101602001610aa4610a94565b919260018160209254838588010152019101909291610aea565b60ff191660208086019190915291151560051b84019091019150610aa49050610a94565b634e487b7160e01b84526022600452602484fd5b91607f1691610a77565b3461022657600036600319011261022657600b546040516001600160a01b039091168152602090f35b34610226576000366003190112610226576020600e54604051908152f35b34610226576000366003190112610226576020604051680340aad21b3b7000008152f35b34610226576000366003190112610226576005546040516001600160a01b039091168152602090f35b34610226576000366003190112610226576020601054604051908152f35b346102265760403660031901126102265760043567ffffffffffffffff811161022657366023820112156102265780600401359067ffffffffffffffff82116110b55760405191610c6b601f8201601f1916602001846115c0565b808352602083019136602483830101116102265781600092602460209301853784010152610c976115aa565b610c9f611844565b6001600160a01b0316908115611077576040516020810190610cdb6020828751610cca81878961154c565b81010301601f1981018352826115c0565b519020604051602081019067747265617375727960c01b825260088152610d036028826115c0565b51902003610d6a5750600854600080516020611c3a83398151915292610d5f9290918190610d3c6001600160a01b038216831415611624565b6001600160a01b031916176008555b60405192839260408452604084019061156f565b9060208301520390a1005b6040516020810190610d856020828751610cca81878961154c565b5190206040516020810190686c697175696469747960b81b825260098152610dae6029826115c0565b51902003610dfa5750600954600080516020611c3a83398151915292610d5f9290918190610de76001600160a01b038216831415611624565b6001600160a01b03191617600955610d4b565b6040516020810190610e156020828751610cca81878961154c565b51902060405160208101906a19195d995b1bdc1b595b9d60aa1b8252600b8152610e40602b826115c0565b51902003610e8c5750600a54600080516020611c3a83398151915292610d5f9290918190610e796001600160a01b038216831415611624565b6001600160a01b03191617600a55610d4b565b6040516020810190610ea76020828751610cca81878961154c565b51902060405160208101906b706172746e6572736869707360a01b8252600c8152610ed3602c826115c0565b51902003610f1f5750600b54600080516020611c3a83398151915292610d5f9290918190610f0c6001600160a01b038216831415611624565b6001600160a01b03191617600b55610d4b565b6040516020810190610f3a6020828751610cca81878961154c565b5190206040516020810190686d61726b6574696e6760b81b825260098152610f636029826115c0565b51902003610faf5750600c54600080516020611c3a83398151915292610d5f9290918190610f9c6001600160a01b038216831415611624565b6001600160a01b03191617600c55610d4b565b610cca90610fcd60206040518093828201958691895192839161154c565b5190206040516020810190637465616d60e01b825260048152610ff16024826115c0565b5190200361103c57600d54600080516020611c3a83398151915292610d5f92909181906110296001600160a01b038216831415611624565b6001600160a01b03191617600d55610d4b565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c69642077616c6c6574207479706560681b6044820152606490fd5b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642077616c6c6574206164647265737360501b6044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b3461022657600036600319011261022657600c546040516001600160a01b039091168152602090f35b346102265760003660031901126102265761110d611844565b600580546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610226576020366003190112610226576001600160a01b03611172611594565b1660005260006020526020604060002054604051908152f35b346102265760003660031901126102265760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610226576000366003190112610226576008546040516001600160a01b039091168152602090f35b3461022657600036600319011261022657602060ff60055460a01c166040519015158152f35b34610226576000366003190112610226576020600654604051908152f35b3461022657600036600319011261022657600d546040516001600160a01b039091168152602090f35b34610226576000366003190112610226576020604051677ce66c50e28400008152f35b34610226576000366003190112610226576020604051678ac7230489e800008152f35b3461022657600036600319011261022657602060405160098152f35b3461022657600036600319011261022657602060405163058fd4008152f35b34610226576060366003190112610226576112f6611594565b6112fe6115aa565b6001600160a01b038216600081815260016020908152604080832033845290915290205490926044359291600019811061133e575b506108aa93506117ed565b8381106113ad578415611397573315611381576108aa946000526001602052604060002060018060a01b0333166000526020528360406000209103905584611333565b634a1406b160e11b600052600060045260246000fd5b63e602df0560e01b600052600060045260246000fd5b8390637dc7a0d960e11b6000523360045260245260445260646000fd5b34610226576000366003190112610226576020600254604051908152f35b3461022657600036600319011261022657602060405166bfd8b6c1df00008152f35b3461022657604036600319011261022657611423611594565b602435903315611397576001600160a01b031690811561138157336000526001602052604060002082600052602052806040600020556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346102265760003660031901126102265760006003548060011c90600181168015611542575b602083108114610b4057828552908115610b1c57506001146114e257610ab883610aa4818503826115c0565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b80821061152857509091508101602001610aa4610a94565b919260018160209254838588010152019101909291611510565b91607f16916114b6565b60005b83811061155f5750506000910152565b818101518382015260200161154f565b906020916115888151809281855285808601910161154c565b601f01601f1916010190565b600435906001600160a01b038216820361022657565b602435906001600160a01b038216820361022657565b90601f8019910116810190811067ffffffffffffffff8211176110b557604052565b346102265760003660031901126102265760206040516729a2241af62c00008152f35b346102265760003660031901126102265760206040516303b538008152f35b1561162b57565b60405162461bcd60e51b815260206004820152602a60248201527f4e65772061646472657373206973207468652073616d65206173207468652063604482015269757272656e74206f6e6560b01b6064820152608490fd5b1561168a57565b60405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606490fd5b680340aad21b3b7000000390680340aad21b3b700000821161052e57565b9190820391821161052e57565b81156116f5570490565b634e487b7160e01b600052601260045260246000fd5b906001820180921161052e57565b9066bfd8b6c1df0000820180921161052e57565b6127100190816127101161052e57565b9190820180921161052e57565b9066bfd8b6c1df000082029180830466bfd8b6c1df0000149015171561052e57565b9060648202918083046064149015171561052e57565b8181029291811591840414171561052e57565b1561179c57565b60405162461bcd60e51b815260206004820152602360248201527f4e6f2076657374656420746f6b656e7320617661696c61626c6520746f20636c60448201526261696d60e81b6064820152608490fd5b91906001600160a01b0383161561182e576001600160a01b038116156118185761181692611884565b565b63ec442f0560e01b600052600060045260246000fd5b634b637e8f60e11b600052600060045260246000fd5b6005546001600160a01b0316330361185857565b63118cdaa760e01b6000523360045260246000fd5b906001600160a01b03821615611818576118169160005b6001600160a01b031690816119c35761189f8360025461173d565b6002555b6001600160a01b031690816119aa5782600254036002555b81817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051878152a36008546001600160a01b0316809114918261199f575b50506119065750565b61191561191a91600e5461173d565b600e55565b60065461192e6119298261170b565b61174a565b600e5490811015908161198c575b506119445750565b61194c611af6565b6119767fe5e5d875889af491955d305c82a289d672cf6bebf4931cf1b4eebf3c8efacd1e9161170b565b60075460408051928352602083019190915290a1565b6802ed6689e54f1800009150103861193c565b1415905038806118fd565b81600052600060205260406000208381540190556118bb565b8160005260006020526040600020548381106119f0578390836000526000602052036040600020556118a3565b91905063391434e360e21b60005260045260245260445260646000fd5b15611a1457565b60405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206d696e74206265796f6e642073616c6520737570706c7900006044820152606490fd5b15611a6057565b60405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e74206265796f6e6420746f74616c20737570706c79006044820152606490fd5b15611aac57565b60405162461bcd60e51b8152602060048201526013602482015272105b1b081cdd195c1cc818dbdb5c1b195d1959606a1b6044820152606490fd5b600019811461052e5760010190565b611b156802ed6689e54f180000611b0e600f54611719565b1115611a0d565b600254611b35680340aad21b3b700000611b2e83611719565b1115611a59565b611b4e60065491611b496103e88410611aa5565b6116c0565b66bfd8b6c1df0000811115611c2c5750611b77611b7266bfd8b6c1df000092611ae7565b600655565b611bc7611bc2611bba600754611bb4611baf7f000000000000000000000000000000000000000000000000000000000000000061176c565b61172d565b90611782565b612710900490565b600755565b600854611bde9082906001600160a01b031661186d565b611bed611bf291600f5461173d565b600f55565b6006546007546040805192835260208301919091527fe5e5d875889af491955d305c82a289d672cf6bebf4931cf1b4eebf3c8efacd1e91a1565b611b72611b779192611ae756fe6ff3a4003b90be84595beb5f6acb9d54f88bd3e6dd4887ca67e53dc9645465eaa264697066735822122040aa6e25bf7e297a9e8b8beb2f1e998d10eb0e244e9a50e0a415e602111f8ac364736f6c634300081a0033e5e5d875889af491955d305c82a289d672cf6bebf4931cf1b4eebf3c8efacd1eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0000000000000000000000008a9e2ffe353fdfd55302db8c464d64851db2491e00000000000000000000000009e559f17673c68ff565e16eb78435090143080a000000000000000000000000863d1354e456ada526e79ff0b03cafe51528f602000000000000000000000000360770a8501109eae932df324a8ed54279014ade0000000000000000000000000c5d8e34ef904085f8e3ab5c5a5e49a5460ac7af0000000000000000000000001eaea43c3b28f3d7de4e426ce16afa9e629fd048","name":"GCoin","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"@openzeppelin/contracts/access/Ownable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/interfaces/draft-IERC6093.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard ERC-20 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.\n */\ninterface IERC20Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC20InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC20InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     * @param allowance Amount of tokens a `spender` is allowed to operate with.\n     * @param needed Minimum amount required to perform a transfer.\n     */\n    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC20InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.\n     * @param spender Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC20InvalidSpender(address spender);\n}\n\n/**\n * @dev Standard ERC-721 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.\n */\ninterface IERC721Errors {\n    /**\n     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.\n     * Used in balance queries.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721InvalidOwner(address owner);\n\n    /**\n     * @dev Indicates a `tokenId` whose `owner` is the zero address.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721NonexistentToken(uint256 tokenId);\n\n    /**\n     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param tokenId Identifier number of a token.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC721InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC721InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC721InsufficientApproval(address operator, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC721InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC721InvalidOperator(address operator);\n}\n\n/**\n * @dev Standard ERC-1155 Errors\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.\n */\ninterface IERC1155Errors {\n    /**\n     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     * @param balance Current balance for the interacting account.\n     * @param needed Minimum amount required to perform a transfer.\n     * @param tokenId Identifier number of a token.\n     */\n    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);\n\n    /**\n     * @dev Indicates a failure with the token `sender`. Used in transfers.\n     * @param sender Address whose tokens are being transferred.\n     */\n    error ERC1155InvalidSender(address sender);\n\n    /**\n     * @dev Indicates a failure with the token `receiver`. Used in transfers.\n     * @param receiver Address to which tokens are being transferred.\n     */\n    error ERC1155InvalidReceiver(address receiver);\n\n    /**\n     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     * @param owner Address of the current owner of a token.\n     */\n    error ERC1155MissingApprovalForAll(address operator, address owner);\n\n    /**\n     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.\n     * @param approver Address initiating an approval operation.\n     */\n    error ERC1155InvalidApprover(address approver);\n\n    /**\n     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.\n     * @param operator Address that may be allowed to operate on tokens without being their owner.\n     */\n    error ERC1155InvalidOperator(address operator);\n\n    /**\n     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.\n     * Used in batch transfers.\n     * @param idsLength Length of the array of token identifiers\n     * @param valuesLength Length of the array of token amounts\n     */\n    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);\n}\n"},{"file_path":"@openzeppelin/contracts/security/Pausable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    bool private _paused;\n\n    /**\n     * @dev Initializes the contract in unpaused state.\n     */\n    constructor() {\n        _paused = false;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        require(!paused(), \"Pausable: paused\");\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        require(paused(), \"Pausable: not paused\");\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/ERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC20Metadata} from \"./extensions/IERC20Metadata.sol\";\nimport {Context} from \"../../utils/Context.sol\";\nimport {IERC20Errors} from \"../../interfaces/draft-IERC6093.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC-20\n * applications.\n */\nabstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {\n    mapping(address account => uint256) private _balances;\n\n    mapping(address account => mapping(address spender => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}.\n     *\n     * All two of these values are immutable: they can only be set once during\n     * construction.\n     */\n    constructor(string memory name_, string memory symbol_) {\n        _name = name_;\n        _symbol = symbol_;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the default value returned by this function, unless\n     * it's overridden.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return 18;\n    }\n\n    /**\n     * @dev See {IERC20-totalSupply}.\n     */\n    function totalSupply() public view virtual returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @dev See {IERC20-balanceOf}.\n     */\n    function balanceOf(address account) public view virtual returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - the caller must have a balance of at least `value`.\n     */\n    function transfer(address to, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _transfer(owner, to, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-allowance}.\n     */\n    function allowance(address owner, address spender) public view virtual returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on\n     * `transferFrom`. This is semantically equivalent to an infinite approval.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 value) public virtual returns (bool) {\n        address owner = _msgSender();\n        _approve(owner, spender, value);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Skips emitting an {Approval} event indicating an allowance update. This is not\n     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].\n     *\n     * NOTE: Does not update the allowance if the current allowance\n     * is the maximum `uint256`.\n     *\n     * Requirements:\n     *\n     * - `from` and `to` cannot be the zero address.\n     * - `from` must have a balance of at least `value`.\n     * - the caller must have allowance for ``from``'s tokens of at least\n     * `value`.\n     */\n    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {\n        address spender = _msgSender();\n        _spendAllowance(from, spender, value);\n        _transfer(from, to, value);\n        return true;\n    }\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to`.\n     *\n     * This internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _transfer(address from, address to, uint256 value) internal {\n        if (from == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        if (to == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(from, to, value);\n    }\n\n    /**\n     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`\n     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding\n     * this function.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _update(address from, address to, uint256 value) internal virtual {\n        if (from == address(0)) {\n            // Overflow check required: The rest of the code assumes that totalSupply never overflows\n            _totalSupply += value;\n        } else {\n            uint256 fromBalance = _balances[from];\n            if (fromBalance < value) {\n                revert ERC20InsufficientBalance(from, fromBalance, value);\n            }\n            unchecked {\n                // Overflow not possible: value <= fromBalance <= totalSupply.\n                _balances[from] = fromBalance - value;\n            }\n        }\n\n        if (to == address(0)) {\n            unchecked {\n                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.\n                _totalSupply -= value;\n            }\n        } else {\n            unchecked {\n                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.\n                _balances[to] += value;\n            }\n        }\n\n        emit Transfer(from, to, value);\n    }\n\n    /**\n     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).\n     * Relies on the `_update` mechanism\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead.\n     */\n    function _mint(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidReceiver(address(0));\n        }\n        _update(address(0), account, value);\n    }\n\n    /**\n     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.\n     * Relies on the `_update` mechanism.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * NOTE: This function is not virtual, {_update} should be overridden instead\n     */\n    function _burn(address account, uint256 value) internal {\n        if (account == address(0)) {\n            revert ERC20InvalidSender(address(0));\n        }\n        _update(account, address(0), value);\n    }\n\n    /**\n     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     *\n     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\n     */\n    function _approve(address owner, address spender, uint256 value) internal {\n        _approve(owner, spender, value, true);\n    }\n\n    /**\n     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.\n     *\n     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by\n     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any\n     * `Approval` event during `transferFrom` operations.\n     *\n     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to\n     * true using the following override:\n     *\n     * ```solidity\n     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {\n     *     super._approve(owner, spender, value, true);\n     * }\n     * ```\n     *\n     * Requirements are the same as {_approve}.\n     */\n    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {\n        if (owner == address(0)) {\n            revert ERC20InvalidApprover(address(0));\n        }\n        if (spender == address(0)) {\n            revert ERC20InvalidSpender(address(0));\n        }\n        _allowances[owner][spender] = value;\n        if (emitEvent) {\n            emit Approval(owner, spender, value);\n        }\n    }\n\n    /**\n     * @dev Updates `owner` s allowance for `spender` based on spent `value`.\n     *\n     * Does not update the allowance value in case of infinite allowance.\n     * Revert if not enough allowance is available.\n     *\n     * Does not emit an {Approval} event.\n     */\n    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {\n        uint256 currentAllowance = allowance(owner, spender);\n        if (currentAllowance < type(uint256).max) {\n            if (currentAllowance < value) {\n                revert ERC20InsufficientAllowance(spender, currentAllowance, value);\n            }\n            unchecked {\n                _approve(owner, spender, currentAllowance - value, false);\n            }\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/IERC20.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},{"file_path":"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Context.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_liquidityWallet","type":"address"},{"internalType":"address","name":"_developmentWallet","type":"address"},{"internalType":"address","name":"_partnershipsWallet","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_teamWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"launchTime","type":"uint256"}],"name":"LaunchTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStep","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"NextStep","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"string","name":"group","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VestedTokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"walletType","type":"string"},{"indexed":false,"internalType":"address","name":"newWallet","type":"address"}],"name":"WalletUpdated","type":"event"},{"inputs":[],"name":"DEVELOPMENT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPMENT_VESTING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_INITIAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_MINTABLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARKETING_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTNERSHIPS_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PARTNERSHIPS_VESTING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_INCREMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_SCALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STEP_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_VESTING_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VESTING_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDevelopmentTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimVestedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedVestedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partnershipsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_launchTime","type":"uint256"}],"name":"setLaunchTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"walletType","type":"string"},{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateWallet","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"package_name":null,"constructor_args":"0x0000000000000000000000008a9e2ffe353fdfd55302db8c464d64851db2491e00000000000000000000000009e559f17673c68ff565e16eb78435090143080a000000000000000000000000863d1354e456ada526e79ff0b03cafe51528f602000000000000000000000000360770a8501109eae932df324a8ed54279014ade0000000000000000000000000c5d8e34ef904085f8e3ab5c5a5e49a5460ac7af0000000000000000000000001eaea43c3b28f3d7de4e426ce16afa9e629fd048"}