From bf2a7f38b8999c02592b14bd9b9e887c976bb5ab Mon Sep 17 00:00:00 2001 From: Harshal Dulera Date: Sat, 7 Dec 2024 17:25:04 +0530 Subject: [PATCH 1/2] feat: enhance leaderboard UI with custom scrollbar and responsive layout --- packages/nextjs/components/NewHeader.tsx | 124 ++++++++--------------- 1 file changed, 45 insertions(+), 79 deletions(-) diff --git a/packages/nextjs/components/NewHeader.tsx b/packages/nextjs/components/NewHeader.tsx index f2abfaa..80cec6d 100644 --- a/packages/nextjs/components/NewHeader.tsx +++ b/packages/nextjs/components/NewHeader.tsx @@ -12,94 +12,36 @@ export const NewHeader = () => { const { switchChain } = useSwitchChain(); const currentChainId = useChainId(); const { disconnect } = useDisconnect(); - const [isNetworkMenuOpen, setIsNetworkMenuOpen] = useState(false); const [isWalletMenuOpen, setIsWalletMenuOpen] = useState(false); const identicon = address ? blockies.create({ seed: address }).toDataURL() : ""; - - const networks = [ - { - id: sepolia.id, - name: sepolia.name, - icon: "🔵", - config: sepolia - }, - { - id: baseSepolia.id, - name: baseSepolia.name, - icon: "🟣", - config: baseSepolia - }, - // You can add more networks: - { - id: mainnet.id, - name: mainnet.name, - icon: "🌐", - config: mainnet - }, - { - id: base.id, - name: base.name, - icon: "🔷", - config: base - }, - { - id: optimism.id, - name: optimism.name, - icon: "🔴", - config: optimism - } + { id: sepolia.id, name: sepolia.name, icon: "🔵", config: sepolia }, + { id: baseSepolia.id, name: baseSepolia.name, icon: "🟣", config: baseSepolia }, + { id: mainnet.id, name: mainnet.name, icon: "🌐", config: mainnet }, + { id: base.id, name: base.name, icon: "🔷", config: base }, + { id: optimism.id, name: optimism.name, icon: "🔴", config: optimism } ]; + const currentNetwork = networks.find(network => network.id === currentChainId) || networks[0]; const handleNetworkSwitch = async (chainId: number) => { try { - const network = networks.find(n => n.id === chainId); - if (!network) throw new Error("Network not found"); - - console.log("Switching to network:", network.name); // Debug log await switchChain({ chainId }); - setIsNetworkMenuOpen(false); } catch (err) { console.error("Failed to switch network:", err); - // Maybe show an error toast or message to user } }; return (
- {/* Left side - Network Selector */} -
- - - {/* Network Dropdown Menu */} - {isNetworkMenuOpen && ( -
- {networks.map((network) => ( - - ))} -
- )} + {/* Left side - Logo */} +
+ StakeFIT
- {/* Right side - Wallet Connection */} + {/* Right side - Wallet Connection with Network Selection */} {!isConnected ? ( {isWalletMenuOpen && ( -
- +
+ {/* Network Selection */} +
+
Switch Network
+ {networks.map((network) => ( + + ))} +
+ + {/* Wallet Actions */} +
+ +
)}
From 8c33039622c9074fdc079ff4525cb2083c12660c Mon Sep 17 00:00:00 2001 From: Dhruv1238 Date: Sat, 7 Dec 2024 11:58:36 +0000 Subject: [PATCH 2/2] feat: daiyChalleng NFT | smartContract v3 deployed --- packages/hardhat/contracts/Stake&Step.sol | 94 +++++++++++++------ .../baseSepolia/StepStakeDynamicNFT.json | 92 ++++++++++++++---- ... => 0554c28b80095f2a4521c9d957750b57.json} | 2 +- .../nextjs/contracts/deployedContracts.ts | 54 ++++++++++- 4 files changed, 190 insertions(+), 52 deletions(-) rename packages/hardhat/deployments/baseSepolia/solcInputs/{a4f2dd33f5bc37a41a4f95d474cb2ef5.json => 0554c28b80095f2a4521c9d957750b57.json} (92%) diff --git a/packages/hardhat/contracts/Stake&Step.sol b/packages/hardhat/contracts/Stake&Step.sol index 9f718b1..fae1096 100644 --- a/packages/hardhat/contracts/Stake&Step.sol +++ b/packages/hardhat/contracts/Stake&Step.sol @@ -33,6 +33,7 @@ contract StepStakeDynamicNFT is ERC721URIStorage, Ownable { event StepsCounted(address indexed user, uint256 stepCount); event NFTMinted(address indexed user, uint256 tokenId); event StakeForfeit(address indexed user, uint256 amount); + event DailyChallengeNFTMinted(address indexed user, uint256 tokenId); constructor() ERC721("DailyStepChallenge", "STEPNFT") Ownable(msg.sender) { _tokenIdCounter = 1; @@ -40,11 +41,9 @@ contract StepStakeDynamicNFT is ERC721URIStorage, Ownable { // Stake function - allows staking with native token function stake() external payable { - // Ensure user hasn't already staked require(userStakes[msg.sender].amount == 0, "Already staked"); require(msg.value > 0, "Stake amount must be greater than 0"); - // Record stake information userStakes[msg.sender] = StakeInfo({ amount: msg.value, stakeTimestamp: block.timestamp, @@ -58,64 +57,68 @@ contract StepStakeDynamicNFT is ERC721URIStorage, Ownable { // Update daily steps function updateDailySteps(address wallet, uint256 stepCount) external { StakeInfo storage stakeInfo = userStakes[wallet]; - - // Ensure user has an active stake require(stakeInfo.amount > 0, "No active stake"); - - // Ensure stake is from today require(block.timestamp - stakeInfo.stakeTimestamp < STAKE_PERIOD, "Stake period expired"); - // Update step count stakeInfo.stepCount = stepCount; - emit StepsCounted(wallet, stepCount); } // Mint NFT and claim stake if goal is met - function claimStakeAndMintNFT(address wallet, string memory imageUrl) external { + function claimStakeAndMintNFT(address wallet, string memory imageUrl) external { StakeInfo storage stakeInfo = userStakes[wallet]; - - // Ensure stake exists require(stakeInfo.amount > 0, "No active stake"); - - // Ensure stake period has passed require(block.timestamp - stakeInfo.stakeTimestamp <= STAKE_PERIOD, "Stake period expired"); - - // Ensure not already claimed require(!stakeInfo.claimed, "Stake already claimed"); - - // Check if step goal is met + if (stakeInfo.stepCount >= DAILY_STEP_GOAL) { - // Mint unique NFT with provided image URL uint256 newTokenId = _tokenIdCounter; _mintDynamicNFT(wallet, newTokenId, stakeInfo.stepCount, imageUrl); - - // Transfer stake back to user + (bool success, ) = payable(wallet).call{ value: stakeInfo.amount }(""); require(success, "Transfer failed"); - - // Mark as claimed + stakeInfo.claimed = true; - emit NFTMinted(wallet, newTokenId); } else { - // Forfeit stake if goal not met (bool success, ) = payable(owner()).call{ value: stakeInfo.amount }(""); require(success, "Forfeit transfer failed"); - + emit StakeForfeit(wallet, stakeInfo.amount); } - - // Reset stake + delete userStakes[wallet]; } + // Mint Daily Challenge NFT + function mintDailyChallengeNFT( + address user, + string memory challengeType, + string memory description, + string memory quirkyMessage, + string memory imageUrl + ) external onlyOwner { + uint256 newTokenId = _tokenIdCounter; + + string memory metadata = generateDailyChallengeMetadata( + newTokenId, + challengeType, + description, + quirkyMessage, + imageUrl + ); + + _safeMint(user, newTokenId); + _setTokenURI(newTokenId, metadata); + + _tokenIdCounter++; + emit DailyChallengeNFTMinted(user, newTokenId); + } + // Internal function to mint NFT with dynamic metadata function _mintDynamicNFT(address user, uint256 tokenId, uint256 stepCount, string memory imageUrl) internal { - // Generate metadata string memory metadata = generateMetadata(tokenId, stepCount, imageUrl); - // Mint NFT with metadata _safeMint(user, tokenId); _setTokenURI(tokenId, metadata); @@ -140,8 +143,39 @@ contract StepStakeDynamicNFT is ERC721URIStorage, Ownable { '"},', '{"trait_type": "Goal Achieved", "value": "', (stepCount >= 5000 ? "Yes" : "No"), + '"}],"', + '"image": "', + imageUrl, '"}' - "],", + ) + ); + + return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(metadata)))); + } + + // Generate metadata for Daily Challenge NFT + function generateDailyChallengeMetadata( + uint256 tokenId, + string memory challengeType, + string memory description, + string memory quirkyMessage, + string memory imageUrl + ) internal pure returns (string memory) { + string memory metadata = string( + abi.encodePacked( + '{"name": "Daily Challenge NFT #', + tokenId.toString(), + '",', + '"description": "', + description, + '",', + '"attributes": [', + '{"trait_type": "Challenge Type", "value": "', + challengeType, + '"},', + '{"trait_type": "Quirky Message", "value": "', + quirkyMessage, + '"}],"', '"image": "', imageUrl, '"}' diff --git a/packages/hardhat/deployments/baseSepolia/StepStakeDynamicNFT.json b/packages/hardhat/deployments/baseSepolia/StepStakeDynamicNFT.json index 4ee2058..6e57a42 100644 --- a/packages/hardhat/deployments/baseSepolia/StepStakeDynamicNFT.json +++ b/packages/hardhat/deployments/baseSepolia/StepStakeDynamicNFT.json @@ -1,5 +1,5 @@ { - "address": "0xf809812695F341479218DAa3a8B2beEa2eC88339", + "address": "0x52dE6508FECCA4d712b75b0bD018a621EaF2d734", "abi": [ { "inputs": [], @@ -200,6 +200,25 @@ "name": "BatchMetadataUpdate", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "DailyChallengeNFTMinted", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -457,6 +476,39 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "string", + "name": "challengeType", + "type": "string" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "internalType": "string", + "name": "quirkyMessage", + "type": "string" + }, + { + "internalType": "string", + "name": "imageUrl", + "type": "string" + } + ], + "name": "mintDailyChallengeNFT", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "name", @@ -736,43 +788,43 @@ "type": "receive" } ], - "transactionHash": "0x50ab20660e306cd04ae3ed0c5d1ea0835c29c51193f9a8f355a1a60d4afef105", + "transactionHash": "0xc4871872d6e9865065a2803492de9559029af1095220e61315de052e0ad6cf7b", "receipt": { "to": null, "from": "0x3590950Ef67a3C10740845D75248D845b57F2cC2", - "contractAddress": "0xf809812695F341479218DAa3a8B2beEa2eC88339", - "transactionIndex": 9, - "gasUsed": "1949986", - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000040020000000000000000000800000000000080000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000100008400000000000000000000000000000000000", - "blockHash": "0x90f1b65d88310daf31f6fca17c03779f23d01a8849e078c0c6df6c1a83e5eb9e", - "transactionHash": "0x50ab20660e306cd04ae3ed0c5d1ea0835c29c51193f9a8f355a1a60d4afef105", + "contractAddress": "0x52dE6508FECCA4d712b75b0bD018a621EaF2d734", + "transactionIndex": 19, + "gasUsed": "2129465", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000100000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000040020000000000000000000800000000000000000000000080000000400000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000008000000000000000000000000000000000000", + "blockHash": "0x059113304a6baa485937475d067e1abbf348786e2576d4ec30c8d1379e12e4ad", + "transactionHash": "0xc4871872d6e9865065a2803492de9559029af1095220e61315de052e0ad6cf7b", "logs": [ { - "transactionIndex": 9, - "blockNumber": 18899742, - "transactionHash": "0x50ab20660e306cd04ae3ed0c5d1ea0835c29c51193f9a8f355a1a60d4afef105", - "address": "0xf809812695F341479218DAa3a8B2beEa2eC88339", + "transactionIndex": 19, + "blockNumber": 18902079, + "transactionHash": "0xc4871872d6e9865065a2803492de9559029af1095220e61315de052e0ad6cf7b", + "address": "0x52dE6508FECCA4d712b75b0bD018a621EaF2d734", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000003590950ef67a3c10740845d75248d845b57f2cc2" ], "data": "0x", - "logIndex": 12, - "blockHash": "0x90f1b65d88310daf31f6fca17c03779f23d01a8849e078c0c6df6c1a83e5eb9e" + "logIndex": 46, + "blockHash": "0x059113304a6baa485937475d067e1abbf348786e2576d4ec30c8d1379e12e4ad" } ], - "blockNumber": 18899742, - "cumulativeGasUsed": "2816904", + "blockNumber": 18902079, + "cumulativeGasUsed": "4244290", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "a4f2dd33f5bc37a41a4f95d474cb2ef5", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"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\":\"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\":false,\"internalType\":\"uint256\",\"name\":\"_fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_toTokenId\",\"type\":\"uint256\"}],\"name\":\"BatchMetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"NFTMinted\",\"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\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeForfeit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stepCount\",\"type\":\"uint256\"}],\"name\":\"StepsCounted\",\"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\":[],\"name\":\"DAILY_STEP_GOAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKE_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"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\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"imageUrl\",\"type\":\"string\"}],\"name\":\"claimStakeAndMintNFT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"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\":[],\"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\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"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\":\"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\":[],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"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\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stepCount\",\"type\":\"uint256\"}],\"name\":\"updateDailySteps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userStakes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stepCount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"claimed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"ERC721IncorrectOwner(address,uint256,address)\":[{\"details\":\"Indicates an error related to the ownership over a particular token. Used in transfers.\",\"params\":{\"owner\":\"Address of the current owner of a token.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InsufficientApproval(address,uint256)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC721InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC721InvalidOwner(address)\":[{\"details\":\"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. Used in balance queries.\",\"params\":{\"owner\":\"Address of the current owner of a token.\"}}],\"ERC721InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC721InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC721NonexistentToken(uint256)\":[{\"details\":\"Indicates a `tokenId` whose `owner` is the zero address.\",\"params\":{\"tokenId\":\"Identifier number of a token.\"}}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"BatchMetadataUpdate(uint256,uint256)\":{\"details\":\"This event emits when the metadata of a range of tokens is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFTs.\"},\"MetadataUpdate(uint256)\":{\"details\":\"This event emits when the metadata of a token is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFT.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Stake&Step.sol\":\"StepStakeDynamicNFT\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC4906.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\nimport {IERC721} from \\\"./IERC721.sol\\\";\\n\\n/// @title EIP-721 Metadata Update Extension\\ninterface IERC4906 is IERC165, IERC721 {\\n /// @dev This event emits when the metadata of a token is changed.\\n /// So that the third-party platforms such as NFT market could\\n /// timely update the images and related attributes of the NFT.\\n event MetadataUpdate(uint256 _tokenId);\\n\\n /// @dev This event emits when the metadata of a range of tokens is changed.\\n /// So that the third-party platforms such as NFT market could\\n /// timely update the images and related attributes of the NFTs.\\n event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);\\n}\\n\",\"keccak256\":\"0xb31b86c03f4677dcffa4655285d62433509513be9bafa0e04984565052d34e44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"../token/ERC721/IERC721.sol\\\";\\n\",\"keccak256\":\"0xc4d7ebf63eb2f6bf3fee1b6c0ee775efa9f31b4843a5511d07eea147e212932d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 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`\\u2019s `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 ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 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 EIP-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`\\u2019s 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 ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 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`\\u2019s 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\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"./IERC721.sol\\\";\\nimport {IERC721Receiver} from \\\"./IERC721Receiver.sol\\\";\\nimport {IERC721Metadata} from \\\"./extensions/IERC721Metadata.sol\\\";\\nimport {Context} from \\\"../../utils/Context.sol\\\";\\nimport {Strings} from \\\"../../utils/Strings.sol\\\";\\nimport {IERC165, ERC165} from \\\"../../utils/introspection/ERC165.sol\\\";\\nimport {IERC721Errors} from \\\"../../interfaces/draft-IERC6093.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n mapping(uint256 tokenId => address) private _owners;\\n\\n mapping(address owner => uint256) private _balances;\\n\\n mapping(uint256 tokenId => address) private _tokenApprovals;\\n\\n mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual returns (uint256) {\\n if (owner == address(0)) {\\n revert ERC721InvalidOwner(address(0));\\n }\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual returns (address) {\\n return _requireOwned(tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\\n _requireOwned(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual {\\n _approve(to, tokenId, _msgSender());\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual returns (address) {\\n _requireOwned(tokenId);\\n\\n return _getApproved(tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n // Setting an \\\"auth\\\" arguments enables the `_isAuthorized` check which verifies that the token exists\\n // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\\n address previousOwner = _update(to, tokenId, _msgSender());\\n if (previousOwner != from) {\\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\\n }\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\\n transferFrom(from, to, tokenId);\\n _checkOnERC721Received(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n *\\n * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\\n * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances\\n * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\\n * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\\n */\\n function _getApproved(uint256 tokenId) internal view virtual returns (address) {\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\\n * particular (ignoring whether it is owned by `owner`).\\n *\\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\\n * assumption.\\n */\\n function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\\n return\\n spender != address(0) &&\\n (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\\n * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets\\n * the `spender` for the specific `tokenId`.\\n *\\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\\n * assumption.\\n */\\n function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\\n if (!_isAuthorized(owner, spender, tokenId)) {\\n if (owner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n } else {\\n revert ERC721InsufficientApproval(spender, tokenId);\\n }\\n }\\n }\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\\n * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\\n *\\n * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\\n * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\\n * remain consistent with one another.\\n */\\n function _increaseBalance(address account, uint128 value) internal virtual {\\n unchecked {\\n _balances[account] += value;\\n }\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\\n * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\\n *\\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that\\n * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\\n *\\n * Emits a {Transfer} event.\\n *\\n * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\\n */\\n function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\\n address from = _ownerOf(tokenId);\\n\\n // Perform (optional) operator check\\n if (auth != address(0)) {\\n _checkAuthorized(from, auth, tokenId);\\n }\\n\\n // Execute the update\\n if (from != address(0)) {\\n // Clear approval. No need to re-authorize or emit the Approval event\\n _approve(address(0), tokenId, address(0), false);\\n\\n unchecked {\\n _balances[from] -= 1;\\n }\\n }\\n\\n if (to != address(0)) {\\n unchecked {\\n _balances[to] += 1;\\n }\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n return from;\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n address previousOwner = _update(to, tokenId, address(0));\\n if (previousOwner != address(0)) {\\n revert ERC721InvalidSender(address(0));\\n }\\n }\\n\\n /**\\n * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n _checkOnERC721Received(address(0), to, tokenId, data);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal {\\n address previousOwner = _update(address(0), tokenId, address(0));\\n if (previousOwner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n }\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n address previousOwner = _update(to, tokenId, address(0));\\n if (previousOwner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n } else if (previousOwner != from) {\\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\\n }\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\\n * are aware of the ERC721 standard to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is like {safeTransferFrom} in the sense that it invokes\\n * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `tokenId` token must exist and be owned by `from`.\\n * - `to` cannot be the zero address.\\n * - `from` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId) internal {\\n _safeTransfer(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n _checkOnERC721Received(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\\n * either the owner of the token, or approved to operate on all tokens held by this owner.\\n *\\n * Emits an {Approval} event.\\n *\\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\\n */\\n function _approve(address to, uint256 tokenId, address auth) internal {\\n _approve(to, tokenId, auth, true);\\n }\\n\\n /**\\n * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\\n * emitted in the context of transfers.\\n */\\n function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\\n // Avoid reading the owner unless necessary\\n if (emitEvent || auth != address(0)) {\\n address owner = _requireOwned(tokenId);\\n\\n // We do not use _isAuthorized because single-token approvals should not be able to call approve\\n if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\\n revert ERC721InvalidApprover(auth);\\n }\\n\\n if (emitEvent) {\\n emit Approval(owner, to, tokenId);\\n }\\n }\\n\\n _tokenApprovals[tokenId] = to;\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Requirements:\\n * - operator can't be the address zero.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n if (operator == address(0)) {\\n revert ERC721InvalidOperator(operator);\\n }\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\\n * Returns the owner.\\n *\\n * Overrides to ownership logic should be done to {_ownerOf}.\\n */\\n function _requireOwned(uint256 tokenId) internal view returns (address) {\\n address owner = _ownerOf(tokenId);\\n if (owner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n }\\n return owner;\\n }\\n\\n /**\\n * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the\\n * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n */\\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {\\n if (to.code.length > 0) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n if (retval != IERC721Receiver.onERC721Received.selector) {\\n revert ERC721InvalidReceiver(to);\\n }\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert ERC721InvalidReceiver(to);\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\\n * a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\\n * {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\\n * a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the address zero.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\\n * reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ERC721} from \\\"../ERC721.sol\\\";\\nimport {Strings} from \\\"../../../utils/Strings.sol\\\";\\nimport {IERC4906} from \\\"../../../interfaces/IERC4906.sol\\\";\\nimport {IERC165} from \\\"../../../interfaces/IERC165.sol\\\";\\n\\n/**\\n * @dev ERC721 token with storage based token URI management.\\n */\\nabstract contract ERC721URIStorage is IERC4906, ERC721 {\\n using Strings for uint256;\\n\\n // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only\\n // defines events and does not include any external function.\\n bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);\\n\\n // Optional mapping for token URIs\\n mapping(uint256 tokenId => string) private _tokenURIs;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {\\n return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireOwned(tokenId);\\n\\n string memory _tokenURI = _tokenURIs[tokenId];\\n string memory base = _baseURI();\\n\\n // If there is no base URI, return the token URI.\\n if (bytes(base).length == 0) {\\n return _tokenURI;\\n }\\n // If both are set, concatenate the baseURI and tokenURI (via string.concat).\\n if (bytes(_tokenURI).length > 0) {\\n return string.concat(base, _tokenURI);\\n }\\n\\n return super.tokenURI(tokenId);\\n }\\n\\n /**\\n * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\\n *\\n * Emits {MetadataUpdate}.\\n */\\n function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\\n _tokenURIs[tokenId] = _tokenURI;\\n emit MetadataUpdate(tokenId);\\n }\\n}\\n\",\"keccak256\":\"0xcc6f49e0c57072d6a18eef0d5fc22a4cc20462c18f0c365d2dd9a2c732fde670\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Base64.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.2) (utils/Base64.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n */\\nlibrary Base64 {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE = \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 0x20)\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n\\n // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\\n // set it to zero to make sure no dirty bytes are read in that section.\\n let afterPtr := add(endPtr, 0x20)\\n let afterCache := mload(afterPtr)\\n mstore(afterPtr, 0x00)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 byte (24 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\\n // Use this as an index into the lookup table, mload an entire word\\n // so the desired character is in the least significant byte, and\\n // mstore8 this least significant byte into the result and continue.\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n // Reset the value that was cached\\n mstore(afterPtr, afterCache)\\n\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x09000342b85b1a06fa1f5b71bdeef7c449cd25799aac14fa9053d8abd18219aa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n uint8 private constant ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev The `value` string doesn't fit in the specified `length`.\\n */\\n error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toStringSigned(int256 value) internal pure returns (string memory) {\\n return string.concat(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value)));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n uint256 localValue = value;\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = HEX_DIGITS[localValue & 0xf];\\n localValue >>= 4;\\n }\\n if (localValue != 0) {\\n revert StringsInsufficientHexLength(value, length);\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\\n * representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Muldiv operation overflow.\\n */\\n error MathOverflowedMulDiv();\\n\\n enum Rounding {\\n Floor, // Toward negative infinity\\n Ceil, // Toward positive infinity\\n Trunc, // Toward zero\\n Expand // Away from zero\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds towards infinity instead\\n * of rounding towards zero.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (b == 0) {\\n // Guarantee the same behavior as in a regular Solidity division.\\n return a / b;\\n }\\n\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n * denominator == 0.\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n * Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0 = x * y; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n if (denominator <= prod1) {\\n revert MathOverflowedMulDiv();\\n }\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n uint256 twos = denominator & (0 - denominator);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\\n // works in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n * towards zero.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n */\\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n return uint8(rounding) % 2 == 1;\\n }\\n}\\n\",\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\"},\"contracts/Stake&Step.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Base64.sol\\\";\\n\\ncontract StepStakeDynamicNFT is ERC721URIStorage, Ownable {\\n using Strings for uint256;\\n\\n // Stake information structure\\n struct StakeInfo {\\n uint256 amount;\\n uint256 stakeTimestamp;\\n uint256 stepCount;\\n bool claimed;\\n }\\n\\n // Mapping to track user stakes\\n mapping(address => StakeInfo) public userStakes;\\n\\n // Constants\\n uint256 public constant DAILY_STEP_GOAL = 5000;\\n uint256 public constant STAKE_PERIOD = 1 days;\\n\\n // Token counter for NFT minting\\n uint256 private _tokenIdCounter;\\n\\n // Events\\n event Staked(address indexed user, uint256 amount);\\n event StepsCounted(address indexed user, uint256 stepCount);\\n event NFTMinted(address indexed user, uint256 tokenId);\\n event StakeForfeit(address indexed user, uint256 amount);\\n\\n constructor() ERC721(\\\"DailyStepChallenge\\\", \\\"STEPNFT\\\") Ownable(msg.sender) {\\n _tokenIdCounter = 1;\\n }\\n\\n // Stake function - allows staking with native token\\n function stake() external payable {\\n // Ensure user hasn't already staked\\n require(userStakes[msg.sender].amount == 0, \\\"Already staked\\\");\\n require(msg.value > 0, \\\"Stake amount must be greater than 0\\\");\\n\\n // Record stake information\\n userStakes[msg.sender] = StakeInfo({\\n amount: msg.value,\\n stakeTimestamp: block.timestamp,\\n stepCount: 0,\\n claimed: false\\n });\\n\\n emit Staked(msg.sender, msg.value);\\n }\\n\\n // Update daily steps\\n function updateDailySteps(address wallet, uint256 stepCount) external {\\n StakeInfo storage stakeInfo = userStakes[wallet];\\n\\n // Ensure user has an active stake\\n require(stakeInfo.amount > 0, \\\"No active stake\\\");\\n\\n // Ensure stake is from today\\n require(block.timestamp - stakeInfo.stakeTimestamp < STAKE_PERIOD, \\\"Stake period expired\\\");\\n\\n // Update step count\\n stakeInfo.stepCount = stepCount;\\n\\n emit StepsCounted(wallet, stepCount);\\n }\\n\\n // Mint NFT and claim stake if goal is met\\n function claimStakeAndMintNFT(address wallet, string memory imageUrl) external {\\n StakeInfo storage stakeInfo = userStakes[wallet];\\n \\n // Ensure stake exists\\n require(stakeInfo.amount > 0, \\\"No active stake\\\");\\n \\n // Ensure stake period has passed\\n require(block.timestamp - stakeInfo.stakeTimestamp <= STAKE_PERIOD, \\\"Stake period expired\\\");\\n \\n // Ensure not already claimed\\n require(!stakeInfo.claimed, \\\"Stake already claimed\\\");\\n \\n // Check if step goal is met\\n if (stakeInfo.stepCount >= DAILY_STEP_GOAL) {\\n // Mint unique NFT with provided image URL\\n uint256 newTokenId = _tokenIdCounter;\\n _mintDynamicNFT(wallet, newTokenId, stakeInfo.stepCount, imageUrl);\\n \\n // Transfer stake back to user\\n (bool success, ) = payable(wallet).call{ value: stakeInfo.amount }(\\\"\\\");\\n require(success, \\\"Transfer failed\\\");\\n \\n // Mark as claimed\\n stakeInfo.claimed = true;\\n \\n emit NFTMinted(wallet, newTokenId);\\n } else {\\n // Forfeit stake if goal not met\\n (bool success, ) = payable(owner()).call{ value: stakeInfo.amount }(\\\"\\\");\\n require(success, \\\"Forfeit transfer failed\\\");\\n \\n emit StakeForfeit(wallet, stakeInfo.amount);\\n }\\n \\n // Reset stake\\n delete userStakes[wallet];\\n }\\n\\n // Internal function to mint NFT with dynamic metadata\\n function _mintDynamicNFT(address user, uint256 tokenId, uint256 stepCount, string memory imageUrl) internal {\\n // Generate metadata\\n string memory metadata = generateMetadata(tokenId, stepCount, imageUrl);\\n\\n // Mint NFT with metadata\\n _safeMint(user, tokenId);\\n _setTokenURI(tokenId, metadata);\\n\\n _tokenIdCounter++;\\n }\\n\\n // Generate metadata with dynamic attributes\\n function generateMetadata(\\n uint256 tokenId,\\n uint256 stepCount,\\n string memory imageUrl\\n ) internal pure returns (string memory) {\\n string memory metadata = string(\\n abi.encodePacked(\\n '{\\\"name\\\": \\\"Step Challenge NFT #',\\n tokenId.toString(),\\n '\\\",',\\n '\\\"description\\\": \\\"Daily Step Challenge Achievement\\\",',\\n '\\\"attributes\\\": [',\\n '{\\\"trait_type\\\": \\\"Steps\\\", \\\"value\\\": \\\"',\\n stepCount.toString(),\\n '\\\"},',\\n '{\\\"trait_type\\\": \\\"Goal Achieved\\\", \\\"value\\\": \\\"',\\n (stepCount >= 5000 ? \\\"Yes\\\" : \\\"No\\\"),\\n '\\\"}'\\n \\\"],\\\",\\n '\\\"image\\\": \\\"',\\n imageUrl,\\n '\\\"}'\\n )\\n );\\n\\n return string(abi.encodePacked(\\\"data:application/json;base64,\\\", Base64.encode(bytes(metadata))));\\n }\\n\\n // Allow contract to receive ETH\\n receive() external payable {}\\n\\n // Withdraw function for contract owner\\n function withdraw() external onlyOwner {\\n payable(owner()).transfer(address(this).balance);\\n }\\n}\\n\",\"keccak256\":\"0xf8307de6fc24dd46022a76e3acb47ddee7f864425e65623e42a2ad3b96f74407\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5033604051806040016040528060128152602001714461696c79537465704368616c6c656e676560701b8152506040518060400160405280600781526020016614d5115413919560ca1b81525081600090816200006f9190620001be565b5060016200007e8282620001be565b5050506001600160a01b038116620000b057604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620000bb81620000c7565b5060016009556200028a565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014457607f821691505b6020821081036200016557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001b957600081815260208120601f850160051c81016020861015620001945750805b601f850160051c820191505b81811015620001b557828155600101620001a0565b5050505b505050565b81516001600160401b03811115620001da57620001da62000119565b620001f281620001eb84546200012f565b846200016b565b602080601f8311600181146200022a5760008415620002115750858301515b600019600386901b1c1916600185901b178555620001b5565b600085815260208120601f198616915b828110156200025b578886015182559484019460019091019084016200023a565b50858210156200027a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61207b806200029a6000396000f3fe6080604052600436106101445760003560e01c8063715018a6116100b6578063b88d4fde1161006f578063b88d4fde146103bb578063c87b56dd146103db578063cb9cf4f6146103fb578063dd4b182314610411578063e985e9c514610428578063f2fde38b1461044857600080fd5b8063715018a6146102cc5780638da5cb5b146102e15780638da7ad23146102ff57806395d89b4114610366578063971fd6221461037b578063a22cb4651461039b57600080fd5b8063286fdc5311610108578063286fdc53146102215780633a4b66f1146102415780633ccfd60b1461024957806342842e0e1461025e5780636352211e1461027e57806370a082311461029e57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806323b872dd1461020157600080fd5b3661014b57005b600080fd5b34801561015c57600080fd5b5061017061016b3660046118a4565b610468565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610493565b60405161017c9190611911565b3480156101b357600080fd5b506101c76101c2366004611924565b610525565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa366004611959565b61054e565b005b34801561020d57600080fd5b506101ff61021c366004611983565b61055d565b34801561022d57600080fd5b506101ff61023c366004611959565b6105ed565b6101ff6106e7565b34801561025557600080fd5b506101ff61081d565b34801561026a57600080fd5b506101ff610279366004611983565b610861565b34801561028a57600080fd5b506101c7610299366004611924565b610881565b3480156102aa57600080fd5b506102be6102b93660046119bf565b61088c565b60405190815260200161017c565b3480156102d857600080fd5b506101ff6108d4565b3480156102ed57600080fd5b506007546001600160a01b03166101c7565b34801561030b57600080fd5b5061034461031a3660046119bf565b60086020526000908152604090208054600182015460028301546003909301549192909160ff1684565b604080519485526020850193909352918301521515606082015260800161017c565b34801561037257600080fd5b5061019a6108e8565b34801561038757600080fd5b506101ff610396366004611a66565b6108f7565b3480156103a757600080fd5b506101ff6103b6366004611ac8565b610c36565b3480156103c757600080fd5b506101ff6103d6366004611b04565b610c41565b3480156103e757600080fd5b5061019a6103f6366004611924565b610c58565b34801561040757600080fd5b506102be61138881565b34801561041d57600080fd5b506102be6201518081565b34801561043457600080fd5b50610170610443366004611b80565b610d69565b34801561045457600080fd5b506101ff6104633660046119bf565b610d97565b60006001600160e01b03198216632483248360e11b148061048d575061048d82610dd2565b92915050565b6060600080546104a290611bb3565b80601f01602080910402602001604051908101604052809291908181526020018280546104ce90611bb3565b801561051b5780601f106104f05761010080835404028352916020019161051b565b820191906000526020600020905b8154815290600101906020018083116104fe57829003601f168201915b5050505050905090565b600061053082610e22565b506000828152600460205260409020546001600160a01b031661048d565b610559828233610e5b565b5050565b6001600160a01b03821661058c57604051633250574960e11b8152600060048201526024015b60405180910390fd5b6000610599838333610e68565b9050836001600160a01b0316816001600160a01b0316146105e7576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610583565b50505050565b6001600160a01b038216600090815260086020526040902080546106455760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b6044820152606401610583565b620151808160010154426106599190611c03565b1061069d5760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b6044820152606401610583565b600281018290556040518281526001600160a01b038416907fb764fa86a0c0bf63220359c536a56dc51c46b28e94821b4b165bc99cd6500cc89060200160405180910390a2505050565b33600090815260086020526040902054156107355760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481cdd185ad95960921b6044820152606401610583565b600034116107915760405162461bcd60e51b815260206004820152602360248201527f5374616b6520616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608401610583565b6040805160808101825234808252426020808401918252600084860181815260608601828152338084526008855292889020965187559351600187015551600286015591516003909401805460ff19169415159490941790935592519081527f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d910160405180910390a2565b610825610f61565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561085e573d6000803e3d6000fd5b50565b61087c83838360405180602001604052806000815250610c41565b505050565b600061048d82610e22565b60006001600160a01b0382166108b8576040516322718ad960e21b815260006004820152602401610583565b506001600160a01b031660009081526003602052604090205490565b6108dc610f61565b6108e66000610f8e565b565b6060600180546104a290611bb3565b6001600160a01b0382166000908152600860205260409020805461094f5760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b6044820152606401610583565b620151808160010154426109639190611c03565b11156109a85760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b6044820152606401610583565b600381015460ff16156109f55760405162461bcd60e51b815260206004820152601560248201527414dd185ad948185b1c9958591e4818db185a5b5959605a1b6044820152606401610583565b611388816002015410610b075760006009549050610a198482846002015486610fe0565b81546040516000916001600160a01b038716918381818185875af1925050503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5050905080610aac5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610583565b60038301805460ff191660011790556040516001600160a01b038616907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090610af89085815260200190565b60405180910390a25050610bfe565b6000610b1b6007546001600160a01b031690565b82546040516001600160a01b039290921691600081818185875af1925050503d8060008114610b66576040519150601f19603f3d011682016040523d82523d6000602084013e610b6b565b606091505b5050905080610bbc5760405162461bcd60e51b815260206004820152601760248201527f466f7266656974207472616e73666572206661696c65640000000000000000006044820152606401610583565b81546040519081526001600160a01b038516907f0ab19b5769ef7984769b3a944a8b9009f5b7cf96c5061497372b15c9668212f19060200160405180910390a2505b50506001600160a01b03166000908152600860205260408120818155600181018290556002810191909155600301805460ff19169055565b61055933838361101f565b610c4c84848461055d565b6105e7848484846110be565b6060610c6382610e22565b5060008281526006602052604081208054610c7d90611bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca990611bb3565b8015610cf65780601f10610ccb57610100808354040283529160200191610cf6565b820191906000526020600020905b815481529060010190602001808311610cd957829003601f168201915b505050505090506000610d1460408051602081019091526000815290565b90508051600003610d26575092915050565b815115610d58578082604051602001610d40929190611c32565b60405160208183030381529060405292505050919050565b610d61846111e7565b949350505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610d9f610f61565b6001600160a01b038116610dc957604051631e4fbdf760e01b815260006004820152602401610583565b61085e81610f8e565b60006001600160e01b031982166380ac58cd60e01b1480610e0357506001600160e01b03198216635b5e139f60e01b145b8061048d57506301ffc9a760e01b6001600160e01b031983161461048d565b6000818152600260205260408120546001600160a01b03168061048d57604051637e27328960e01b815260048101849052602401610583565b61087c838383600161125c565b6000828152600260205260408120546001600160a01b0390811690831615610e9557610e95818486611362565b6001600160a01b03811615610ed357610eb260008560008061125c565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610f02576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6007546001600160a01b031633146108e65760405163118cdaa760e01b8152336004820152602401610583565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610fed8484846113c6565b9050610ff9858561147a565b6110038482611494565b6009805490600061101383611c61565b91905055505050505050565b6001600160a01b03821661105157604051630b61174360e31b81526001600160a01b0383166004820152602401610583565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156105e757604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611100903390889087908790600401611c7a565b6020604051808303816000875af192505050801561113b575060408051601f3d908101601f1916820190925261113891810190611cb7565b60015b6111a4573d808015611169576040519150601f19603f3d011682016040523d82523d6000602084013e61116e565b606091505b50805160000361119c57604051633250574960e11b81526001600160a01b0385166004820152602401610583565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146111e057604051633250574960e11b81526001600160a01b0385166004820152602401610583565b5050505050565b60606111f282610e22565b50600061120a60408051602081019091526000815290565b9050600081511161122a5760405180602001604052806000815250611255565b80611234846114e4565b604051602001611245929190611c32565b6040516020818303038152906040525b9392505050565b808061127057506001600160a01b03821615155b1561133257600061128084610e22565b90506001600160a01b038316158015906112ac5750826001600160a01b0316816001600160a01b031614155b80156112bf57506112bd8184610d69565b155b156112e85760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610583565b81156113305783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b61136d838383611577565b61087c576001600160a01b03831661139b57604051637e27328960e01b815260048101829052602401610583565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610583565b606060006113d3856114e4565b6113dc856114e4565b61138886101561140657604051806040016040528060028152602001614e6f60f01b815250611423565b6040518060400160405280600381526020016259657360e81b8152505b856040516020016114379493929190611cd4565b6040516020818303038152906040529050611451816115da565b6040516020016114619190611e66565b6040516020818303038152906040529150509392505050565b61055982826040518060200160405280600081525061173a565b60008281526006602052604090206114ac8282611ef9565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050565b606060006114f183611751565b600101905060008167ffffffffffffffff811115611511576115116119da565b6040519080825280601f01601f19166020018201604052801561153b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461154557509392505050565b60006001600160a01b03831615801590610d615750826001600160a01b0316846001600160a01b031614806115b157506115b18484610d69565b80610d615750506000908152600460205260409020546001600160a01b03908116911614919050565b606081516000036115f957505060408051602081019091526000815290565b600060405180606001604052806040815260200161200660409139905060006003845160026116289190611fb9565b6116329190611fcc565b61163d906004611fee565b67ffffffffffffffff811115611655576116556119da565b6040519080825280601f01601f19166020018201604052801561167f576020820181803683370190505b50905060018201602082018586518701602081018051600082525b828410156116f5576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f811687015186535060018501945061169a565b905250508551600390066001811461171457600281146117275761172f565b603d6001830353603d600283035361172f565b603d60018303535b509195945050505050565b6117448383611829565b61087c60008484846110be565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106117905772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106117bc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106117da57662386f26fc10000830492506010015b6305f5e10083106117f2576305f5e100830492506008015b612710831061180657612710830492506004015b60648310611818576064830492506002015b600a831061048d5760010192915050565b6001600160a01b03821661185357604051633250574960e11b815260006004820152602401610583565b600061186183836000610e68565b90506001600160a01b0381161561087c576040516339e3563760e11b815260006004820152602401610583565b6001600160e01b03198116811461085e57600080fd5b6000602082840312156118b657600080fd5b81356112558161188e565b60005b838110156118dc5781810151838201526020016118c4565b50506000910152565b600081518084526118fd8160208601602086016118c1565b601f01601f19169290920160200192915050565b60208152600061125560208301846118e5565b60006020828403121561193657600080fd5b5035919050565b80356001600160a01b038116811461195457600080fd5b919050565b6000806040838503121561196c57600080fd5b6119758361193d565b946020939093013593505050565b60008060006060848603121561199857600080fd5b6119a18461193d565b92506119af6020850161193d565b9150604084013590509250925092565b6000602082840312156119d157600080fd5b6112558261193d565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611a0b57611a0b6119da565b604051601f8501601f19908116603f01168101908282118183101715611a3357611a336119da565b81604052809350858152868686011115611a4c57600080fd5b858560208301376000602087830101525050509392505050565b60008060408385031215611a7957600080fd5b611a828361193d565b9150602083013567ffffffffffffffff811115611a9e57600080fd5b8301601f81018513611aaf57600080fd5b611abe858235602084016119f0565b9150509250929050565b60008060408385031215611adb57600080fd5b611ae48361193d565b915060208301358015158114611af957600080fd5b809150509250929050565b60008060008060808587031215611b1a57600080fd5b611b238561193d565b9350611b316020860161193d565b925060408501359150606085013567ffffffffffffffff811115611b5457600080fd5b8501601f81018713611b6557600080fd5b611b74878235602084016119f0565b91505092959194509250565b60008060408385031215611b9357600080fd5b611b9c8361193d565b9150611baa6020840161193d565b90509250929050565b600181811c90821680611bc757607f821691505b602082108103611be757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561048d5761048d611bed565b60008151611c288185602086016118c1565b9290920192915050565b60008351611c448184602088016118c1565b835190830190611c588183602088016118c1565b01949350505050565b600060018201611c7357611c73611bed565b5060010190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611cad908301846118e5565b9695505050505050565b600060208284031215611cc957600080fd5b81516112558161188e565b7f7b226e616d65223a202253746570204368616c6c656e6765204e465420230000815260008551611d0c81601e850160208a016118c1565b61088b60f21b601e918401918201527f226465736372697074696f6e223a20224461696c792053746570204368616c6c60208083019190915271195b99d9481058da1a595d995b595b9d088b60721b60408301526e2261747472696275746573223a205b60881b60528301527f7b2274726169745f74797065223a20225374657073222c202276616c7565223a606183015261101160f11b6081830152865190611dbe90829060838501908a016118c1565b62089f4b60ea1b910160838101919091527f7b2274726169745f74797065223a2022476f616c204163686965766564222c20608682015269113b30b63ab2911d101160b11b60a6820152611e5b611e4d611e47611e31611e2160b086018a611c16565b63089f574b60e21b815260040190565b691134b6b0b3b2911d101160b11b8152600a0190565b86611c16565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611e9e81601d8501602087016118c1565b91909101601d0192915050565b601f82111561087c57600081815260208120601f850160051c81016020861015611ed25750805b601f850160051c820191505b81811015611ef157828155600101611ede565b505050505050565b815167ffffffffffffffff811115611f1357611f136119da565b611f2781611f218454611bb3565b84611eab565b602080601f831160018114611f5c5760008415611f445750858301515b600019600386901b1c1916600185901b178555611ef1565b600085815260208120601f198616915b82811015611f8b57888601518255948401946001909101908401611f6c565b5085821015611fa95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561048d5761048d611bed565b600082611fe957634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761048d5761048d611bed56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220cabf39832245d38e49f6a36fc3d2f17cc710ce0311dd8fb46171dd2fc014207364736f6c63430008140033", - "deployedBytecode": "0x6080604052600436106101445760003560e01c8063715018a6116100b6578063b88d4fde1161006f578063b88d4fde146103bb578063c87b56dd146103db578063cb9cf4f6146103fb578063dd4b182314610411578063e985e9c514610428578063f2fde38b1461044857600080fd5b8063715018a6146102cc5780638da5cb5b146102e15780638da7ad23146102ff57806395d89b4114610366578063971fd6221461037b578063a22cb4651461039b57600080fd5b8063286fdc5311610108578063286fdc53146102215780633a4b66f1146102415780633ccfd60b1461024957806342842e0e1461025e5780636352211e1461027e57806370a082311461029e57600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806323b872dd1461020157600080fd5b3661014b57005b600080fd5b34801561015c57600080fd5b5061017061016b3660046118a4565b610468565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610493565b60405161017c9190611911565b3480156101b357600080fd5b506101c76101c2366004611924565b610525565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa366004611959565b61054e565b005b34801561020d57600080fd5b506101ff61021c366004611983565b61055d565b34801561022d57600080fd5b506101ff61023c366004611959565b6105ed565b6101ff6106e7565b34801561025557600080fd5b506101ff61081d565b34801561026a57600080fd5b506101ff610279366004611983565b610861565b34801561028a57600080fd5b506101c7610299366004611924565b610881565b3480156102aa57600080fd5b506102be6102b93660046119bf565b61088c565b60405190815260200161017c565b3480156102d857600080fd5b506101ff6108d4565b3480156102ed57600080fd5b506007546001600160a01b03166101c7565b34801561030b57600080fd5b5061034461031a3660046119bf565b60086020526000908152604090208054600182015460028301546003909301549192909160ff1684565b604080519485526020850193909352918301521515606082015260800161017c565b34801561037257600080fd5b5061019a6108e8565b34801561038757600080fd5b506101ff610396366004611a66565b6108f7565b3480156103a757600080fd5b506101ff6103b6366004611ac8565b610c36565b3480156103c757600080fd5b506101ff6103d6366004611b04565b610c41565b3480156103e757600080fd5b5061019a6103f6366004611924565b610c58565b34801561040757600080fd5b506102be61138881565b34801561041d57600080fd5b506102be6201518081565b34801561043457600080fd5b50610170610443366004611b80565b610d69565b34801561045457600080fd5b506101ff6104633660046119bf565b610d97565b60006001600160e01b03198216632483248360e11b148061048d575061048d82610dd2565b92915050565b6060600080546104a290611bb3565b80601f01602080910402602001604051908101604052809291908181526020018280546104ce90611bb3565b801561051b5780601f106104f05761010080835404028352916020019161051b565b820191906000526020600020905b8154815290600101906020018083116104fe57829003601f168201915b5050505050905090565b600061053082610e22565b506000828152600460205260409020546001600160a01b031661048d565b610559828233610e5b565b5050565b6001600160a01b03821661058c57604051633250574960e11b8152600060048201526024015b60405180910390fd5b6000610599838333610e68565b9050836001600160a01b0316816001600160a01b0316146105e7576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610583565b50505050565b6001600160a01b038216600090815260086020526040902080546106455760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b6044820152606401610583565b620151808160010154426106599190611c03565b1061069d5760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b6044820152606401610583565b600281018290556040518281526001600160a01b038416907fb764fa86a0c0bf63220359c536a56dc51c46b28e94821b4b165bc99cd6500cc89060200160405180910390a2505050565b33600090815260086020526040902054156107355760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481cdd185ad95960921b6044820152606401610583565b600034116107915760405162461bcd60e51b815260206004820152602360248201527f5374616b6520616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608401610583565b6040805160808101825234808252426020808401918252600084860181815260608601828152338084526008855292889020965187559351600187015551600286015591516003909401805460ff19169415159490941790935592519081527f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d910160405180910390a2565b610825610f61565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561085e573d6000803e3d6000fd5b50565b61087c83838360405180602001604052806000815250610c41565b505050565b600061048d82610e22565b60006001600160a01b0382166108b8576040516322718ad960e21b815260006004820152602401610583565b506001600160a01b031660009081526003602052604090205490565b6108dc610f61565b6108e66000610f8e565b565b6060600180546104a290611bb3565b6001600160a01b0382166000908152600860205260409020805461094f5760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b6044820152606401610583565b620151808160010154426109639190611c03565b11156109a85760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b6044820152606401610583565b600381015460ff16156109f55760405162461bcd60e51b815260206004820152601560248201527414dd185ad948185b1c9958591e4818db185a5b5959605a1b6044820152606401610583565b611388816002015410610b075760006009549050610a198482846002015486610fe0565b81546040516000916001600160a01b038716918381818185875af1925050503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5050905080610aac5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610583565b60038301805460ff191660011790556040516001600160a01b038616907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090610af89085815260200190565b60405180910390a25050610bfe565b6000610b1b6007546001600160a01b031690565b82546040516001600160a01b039290921691600081818185875af1925050503d8060008114610b66576040519150601f19603f3d011682016040523d82523d6000602084013e610b6b565b606091505b5050905080610bbc5760405162461bcd60e51b815260206004820152601760248201527f466f7266656974207472616e73666572206661696c65640000000000000000006044820152606401610583565b81546040519081526001600160a01b038516907f0ab19b5769ef7984769b3a944a8b9009f5b7cf96c5061497372b15c9668212f19060200160405180910390a2505b50506001600160a01b03166000908152600860205260408120818155600181018290556002810191909155600301805460ff19169055565b61055933838361101f565b610c4c84848461055d565b6105e7848484846110be565b6060610c6382610e22565b5060008281526006602052604081208054610c7d90611bb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca990611bb3565b8015610cf65780601f10610ccb57610100808354040283529160200191610cf6565b820191906000526020600020905b815481529060010190602001808311610cd957829003601f168201915b505050505090506000610d1460408051602081019091526000815290565b90508051600003610d26575092915050565b815115610d58578082604051602001610d40929190611c32565b60405160208183030381529060405292505050919050565b610d61846111e7565b949350505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610d9f610f61565b6001600160a01b038116610dc957604051631e4fbdf760e01b815260006004820152602401610583565b61085e81610f8e565b60006001600160e01b031982166380ac58cd60e01b1480610e0357506001600160e01b03198216635b5e139f60e01b145b8061048d57506301ffc9a760e01b6001600160e01b031983161461048d565b6000818152600260205260408120546001600160a01b03168061048d57604051637e27328960e01b815260048101849052602401610583565b61087c838383600161125c565b6000828152600260205260408120546001600160a01b0390811690831615610e9557610e95818486611362565b6001600160a01b03811615610ed357610eb260008560008061125c565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610f02576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6007546001600160a01b031633146108e65760405163118cdaa760e01b8152336004820152602401610583565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000610fed8484846113c6565b9050610ff9858561147a565b6110038482611494565b6009805490600061101383611c61565b91905055505050505050565b6001600160a01b03821661105157604051630b61174360e31b81526001600160a01b0383166004820152602401610583565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156105e757604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611100903390889087908790600401611c7a565b6020604051808303816000875af192505050801561113b575060408051601f3d908101601f1916820190925261113891810190611cb7565b60015b6111a4573d808015611169576040519150601f19603f3d011682016040523d82523d6000602084013e61116e565b606091505b50805160000361119c57604051633250574960e11b81526001600160a01b0385166004820152602401610583565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146111e057604051633250574960e11b81526001600160a01b0385166004820152602401610583565b5050505050565b60606111f282610e22565b50600061120a60408051602081019091526000815290565b9050600081511161122a5760405180602001604052806000815250611255565b80611234846114e4565b604051602001611245929190611c32565b6040516020818303038152906040525b9392505050565b808061127057506001600160a01b03821615155b1561133257600061128084610e22565b90506001600160a01b038316158015906112ac5750826001600160a01b0316816001600160a01b031614155b80156112bf57506112bd8184610d69565b155b156112e85760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610583565b81156113305783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b61136d838383611577565b61087c576001600160a01b03831661139b57604051637e27328960e01b815260048101829052602401610583565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610583565b606060006113d3856114e4565b6113dc856114e4565b61138886101561140657604051806040016040528060028152602001614e6f60f01b815250611423565b6040518060400160405280600381526020016259657360e81b8152505b856040516020016114379493929190611cd4565b6040516020818303038152906040529050611451816115da565b6040516020016114619190611e66565b6040516020818303038152906040529150509392505050565b61055982826040518060200160405280600081525061173a565b60008281526006602052604090206114ac8282611ef9565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050565b606060006114f183611751565b600101905060008167ffffffffffffffff811115611511576115116119da565b6040519080825280601f01601f19166020018201604052801561153b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461154557509392505050565b60006001600160a01b03831615801590610d615750826001600160a01b0316846001600160a01b031614806115b157506115b18484610d69565b80610d615750506000908152600460205260409020546001600160a01b03908116911614919050565b606081516000036115f957505060408051602081019091526000815290565b600060405180606001604052806040815260200161200660409139905060006003845160026116289190611fb9565b6116329190611fcc565b61163d906004611fee565b67ffffffffffffffff811115611655576116556119da565b6040519080825280601f01601f19166020018201604052801561167f576020820181803683370190505b50905060018201602082018586518701602081018051600082525b828410156116f5576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f811687015186535060018501945061169a565b905250508551600390066001811461171457600281146117275761172f565b603d6001830353603d600283035361172f565b603d60018303535b509195945050505050565b6117448383611829565b61087c60008484846110be565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106117905772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106117bc576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106117da57662386f26fc10000830492506010015b6305f5e10083106117f2576305f5e100830492506008015b612710831061180657612710830492506004015b60648310611818576064830492506002015b600a831061048d5760010192915050565b6001600160a01b03821661185357604051633250574960e11b815260006004820152602401610583565b600061186183836000610e68565b90506001600160a01b0381161561087c576040516339e3563760e11b815260006004820152602401610583565b6001600160e01b03198116811461085e57600080fd5b6000602082840312156118b657600080fd5b81356112558161188e565b60005b838110156118dc5781810151838201526020016118c4565b50506000910152565b600081518084526118fd8160208601602086016118c1565b601f01601f19169290920160200192915050565b60208152600061125560208301846118e5565b60006020828403121561193657600080fd5b5035919050565b80356001600160a01b038116811461195457600080fd5b919050565b6000806040838503121561196c57600080fd5b6119758361193d565b946020939093013593505050565b60008060006060848603121561199857600080fd5b6119a18461193d565b92506119af6020850161193d565b9150604084013590509250925092565b6000602082840312156119d157600080fd5b6112558261193d565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611a0b57611a0b6119da565b604051601f8501601f19908116603f01168101908282118183101715611a3357611a336119da565b81604052809350858152868686011115611a4c57600080fd5b858560208301376000602087830101525050509392505050565b60008060408385031215611a7957600080fd5b611a828361193d565b9150602083013567ffffffffffffffff811115611a9e57600080fd5b8301601f81018513611aaf57600080fd5b611abe858235602084016119f0565b9150509250929050565b60008060408385031215611adb57600080fd5b611ae48361193d565b915060208301358015158114611af957600080fd5b809150509250929050565b60008060008060808587031215611b1a57600080fd5b611b238561193d565b9350611b316020860161193d565b925060408501359150606085013567ffffffffffffffff811115611b5457600080fd5b8501601f81018713611b6557600080fd5b611b74878235602084016119f0565b91505092959194509250565b60008060408385031215611b9357600080fd5b611b9c8361193d565b9150611baa6020840161193d565b90509250929050565b600181811c90821680611bc757607f821691505b602082108103611be757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561048d5761048d611bed565b60008151611c288185602086016118c1565b9290920192915050565b60008351611c448184602088016118c1565b835190830190611c588183602088016118c1565b01949350505050565b600060018201611c7357611c73611bed565b5060010190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611cad908301846118e5565b9695505050505050565b600060208284031215611cc957600080fd5b81516112558161188e565b7f7b226e616d65223a202253746570204368616c6c656e6765204e465420230000815260008551611d0c81601e850160208a016118c1565b61088b60f21b601e918401918201527f226465736372697074696f6e223a20224461696c792053746570204368616c6c60208083019190915271195b99d9481058da1a595d995b595b9d088b60721b60408301526e2261747472696275746573223a205b60881b60528301527f7b2274726169745f74797065223a20225374657073222c202276616c7565223a606183015261101160f11b6081830152865190611dbe90829060838501908a016118c1565b62089f4b60ea1b910160838101919091527f7b2274726169745f74797065223a2022476f616c204163686965766564222c20608682015269113b30b63ab2911d101160b11b60a6820152611e5b611e4d611e47611e31611e2160b086018a611c16565b63089f574b60e21b815260040190565b691134b6b0b3b2911d101160b11b8152600a0190565b86611c16565b61227d60f01b815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611e9e81601d8501602087016118c1565b91909101601d0192915050565b601f82111561087c57600081815260208120601f850160051c81016020861015611ed25750805b601f850160051c820191505b81811015611ef157828155600101611ede565b505050505050565b815167ffffffffffffffff811115611f1357611f136119da565b611f2781611f218454611bb3565b84611eab565b602080601f831160018114611f5c5760008415611f445750858301515b600019600386901b1c1916600185901b178555611ef1565b600085815260208120601f198616915b82811015611f8b57888601518255948401946001909101908401611f6c565b5085821015611fa95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111561048d5761048d611bed565b600082611fe957634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141761048d5761048d611bed56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220cabf39832245d38e49f6a36fc3d2f17cc710ce0311dd8fb46171dd2fc014207364736f6c63430008140033", + "solcInputHash": "0554c28b80095f2a4521c9d957750b57", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"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\":\"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\":false,\"internalType\":\"uint256\",\"name\":\"_fromTokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_toTokenId\",\"type\":\"uint256\"}],\"name\":\"BatchMetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"DailyChallengeNFTMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"NFTMinted\",\"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\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"StakeForfeit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stepCount\",\"type\":\"uint256\"}],\"name\":\"StepsCounted\",\"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\":[],\"name\":\"DAILY_STEP_GOAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKE_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"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\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"imageUrl\",\"type\":\"string\"}],\"name\":\"claimStakeAndMintNFT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"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\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"challengeType\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"quirkyMessage\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"imageUrl\",\"type\":\"string\"}],\"name\":\"mintDailyChallengeNFT\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"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\":\"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\":[],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"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\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"stepCount\",\"type\":\"uint256\"}],\"name\":\"updateDailySteps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userStakes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stepCount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"claimed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"errors\":{\"ERC721IncorrectOwner(address,uint256,address)\":[{\"details\":\"Indicates an error related to the ownership over a particular token. Used in transfers.\",\"params\":{\"owner\":\"Address of the current owner of a token.\",\"sender\":\"Address whose tokens are being transferred.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InsufficientApproval(address,uint256)\":[{\"details\":\"Indicates a failure with the `operator`\\u2019s approval. Used in transfers.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\",\"tokenId\":\"Identifier number of a token.\"}}],\"ERC721InvalidApprover(address)\":[{\"details\":\"Indicates a failure with the `approver` of a token to be approved. Used in approvals.\",\"params\":{\"approver\":\"Address initiating an approval operation.\"}}],\"ERC721InvalidOperator(address)\":[{\"details\":\"Indicates a failure with the `operator` to be approved. Used in approvals.\",\"params\":{\"operator\":\"Address that may be allowed to operate on tokens without being their owner.\"}}],\"ERC721InvalidOwner(address)\":[{\"details\":\"Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. Used in balance queries.\",\"params\":{\"owner\":\"Address of the current owner of a token.\"}}],\"ERC721InvalidReceiver(address)\":[{\"details\":\"Indicates a failure with the token `receiver`. Used in transfers.\",\"params\":{\"receiver\":\"Address to which tokens are being transferred.\"}}],\"ERC721InvalidSender(address)\":[{\"details\":\"Indicates a failure with the token `sender`. Used in transfers.\",\"params\":{\"sender\":\"Address whose tokens are being transferred.\"}}],\"ERC721NonexistentToken(uint256)\":[{\"details\":\"Indicates a `tokenId` whose `owner` is the zero address.\",\"params\":{\"tokenId\":\"Identifier number of a token.\"}}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}]},\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"BatchMetadataUpdate(uint256,uint256)\":{\"details\":\"This event emits when the metadata of a range of tokens is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFTs.\"},\"MetadataUpdate(uint256)\":{\"details\":\"This event emits when the metadata of a token is changed. So that the third-party platforms such as NFT market could timely update the images and related attributes of the NFT.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Stake&Step.sol\":\"StepStakeDynamicNFT\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC4906.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\nimport {IERC721} from \\\"./IERC721.sol\\\";\\n\\n/// @title EIP-721 Metadata Update Extension\\ninterface IERC4906 is IERC165, IERC721 {\\n /// @dev This event emits when the metadata of a token is changed.\\n /// So that the third-party platforms such as NFT market could\\n /// timely update the images and related attributes of the NFT.\\n event MetadataUpdate(uint256 _tokenId);\\n\\n /// @dev This event emits when the metadata of a range of tokens is changed.\\n /// So that the third-party platforms such as NFT market could\\n /// timely update the images and related attributes of the NFTs.\\n event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);\\n}\\n\",\"keccak256\":\"0xb31b86c03f4677dcffa4655285d62433509513be9bafa0e04984565052d34e44\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"../token/ERC721/IERC721.sol\\\";\\n\",\"keccak256\":\"0xc4d7ebf63eb2f6bf3fee1b6c0ee775efa9f31b4843a5511d07eea147e212932d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC6093.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard ERC20 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 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`\\u2019s `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 ERC721 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 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 EIP-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`\\u2019s 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 ERC1155 Errors\\n * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 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`\\u2019s 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\",\"keccak256\":\"0x60c65f701957fdd6faea1acb0bb45825791d473693ed9ecb34726fdfaa849dd7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"./IERC721.sol\\\";\\nimport {IERC721Receiver} from \\\"./IERC721Receiver.sol\\\";\\nimport {IERC721Metadata} from \\\"./extensions/IERC721Metadata.sol\\\";\\nimport {Context} from \\\"../../utils/Context.sol\\\";\\nimport {Strings} from \\\"../../utils/Strings.sol\\\";\\nimport {IERC165, ERC165} from \\\"../../utils/introspection/ERC165.sol\\\";\\nimport {IERC721Errors} from \\\"../../interfaces/draft-IERC6093.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\nabstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors {\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n mapping(uint256 tokenId => address) private _owners;\\n\\n mapping(address owner => uint256) private _balances;\\n\\n mapping(uint256 tokenId => address) private _tokenApprovals;\\n\\n mapping(address owner => mapping(address operator => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual returns (uint256) {\\n if (owner == address(0)) {\\n revert ERC721InvalidOwner(address(0));\\n }\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual returns (address) {\\n return _requireOwned(tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual returns (string memory) {\\n _requireOwned(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual {\\n _approve(to, tokenId, _msgSender());\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual returns (address) {\\n _requireOwned(tokenId);\\n\\n return _getApproved(tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n // Setting an \\\"auth\\\" arguments enables the `_isAuthorized` check which verifies that the token exists\\n // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here.\\n address previousOwner = _update(to, tokenId, _msgSender());\\n if (previousOwner != from) {\\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\\n }\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual {\\n transferFrom(from, to, tokenId);\\n _checkOnERC721Received(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n *\\n * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the\\n * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances\\n * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by\\n * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`.\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.\\n */\\n function _getApproved(uint256 tokenId) internal view virtual returns (address) {\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in\\n * particular (ignoring whether it is owned by `owner`).\\n *\\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\\n * assumption.\\n */\\n function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) {\\n return\\n spender != address(0) &&\\n (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner.\\n * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets\\n * the `spender` for the specific `tokenId`.\\n *\\n * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this\\n * assumption.\\n */\\n function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual {\\n if (!_isAuthorized(owner, spender, tokenId)) {\\n if (owner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n } else {\\n revert ERC721InsufficientApproval(spender, tokenId);\\n }\\n }\\n }\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that\\n * a uint256 would ever overflow from increments when these increments are bounded to uint128 values.\\n *\\n * WARNING: Increasing an account's balance using this function tends to be paired with an override of the\\n * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership\\n * remain consistent with one another.\\n */\\n function _increaseBalance(address account, uint128 value) internal virtual {\\n unchecked {\\n _balances[account] += value;\\n }\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner\\n * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update.\\n *\\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that\\n * `auth` is either the owner of the token, or approved to operate on the token (by the owner).\\n *\\n * Emits a {Transfer} event.\\n *\\n * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}.\\n */\\n function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) {\\n address from = _ownerOf(tokenId);\\n\\n // Perform (optional) operator check\\n if (auth != address(0)) {\\n _checkAuthorized(from, auth, tokenId);\\n }\\n\\n // Execute the update\\n if (from != address(0)) {\\n // Clear approval. No need to re-authorize or emit the Approval event\\n _approve(address(0), tokenId, address(0), false);\\n\\n unchecked {\\n _balances[from] -= 1;\\n }\\n }\\n\\n if (to != address(0)) {\\n unchecked {\\n _balances[to] += 1;\\n }\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n return from;\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n address previousOwner = _update(to, tokenId, address(0));\\n if (previousOwner != address(0)) {\\n revert ERC721InvalidSender(address(0));\\n }\\n }\\n\\n /**\\n * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n _checkOnERC721Received(address(0), to, tokenId, data);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal {\\n address previousOwner = _update(address(0), tokenId, address(0));\\n if (previousOwner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n }\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal {\\n if (to == address(0)) {\\n revert ERC721InvalidReceiver(address(0));\\n }\\n address previousOwner = _update(to, tokenId, address(0));\\n if (previousOwner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n } else if (previousOwner != from) {\\n revert ERC721IncorrectOwner(from, tokenId, previousOwner);\\n }\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients\\n * are aware of the ERC721 standard to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is like {safeTransferFrom} in the sense that it invokes\\n * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `tokenId` token must exist and be owned by `from`.\\n * - `to` cannot be the zero address.\\n * - `from` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId) internal {\\n _safeTransfer(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n _checkOnERC721Received(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is\\n * either the owner of the token, or approved to operate on all tokens held by this owner.\\n *\\n * Emits an {Approval} event.\\n *\\n * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.\\n */\\n function _approve(address to, uint256 tokenId, address auth) internal {\\n _approve(to, tokenId, auth, true);\\n }\\n\\n /**\\n * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not\\n * emitted in the context of transfers.\\n */\\n function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual {\\n // Avoid reading the owner unless necessary\\n if (emitEvent || auth != address(0)) {\\n address owner = _requireOwned(tokenId);\\n\\n // We do not use _isAuthorized because single-token approvals should not be able to call approve\\n if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) {\\n revert ERC721InvalidApprover(auth);\\n }\\n\\n if (emitEvent) {\\n emit Approval(owner, to, tokenId);\\n }\\n }\\n\\n _tokenApprovals[tokenId] = to;\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Requirements:\\n * - operator can't be the address zero.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n if (operator == address(0)) {\\n revert ERC721InvalidOperator(operator);\\n }\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).\\n * Returns the owner.\\n *\\n * Overrides to ownership logic should be done to {_ownerOf}.\\n */\\n function _requireOwned(uint256 tokenId) internal view returns (address) {\\n address owner = _ownerOf(tokenId);\\n if (owner == address(0)) {\\n revert ERC721NonexistentToken(tokenId);\\n }\\n return owner;\\n }\\n\\n /**\\n * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the\\n * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n */\\n function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {\\n if (to.code.length > 0) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n if (retval != IERC721Receiver.onERC721Received.selector) {\\n revert ERC721InvalidReceiver(to);\\n }\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert ERC721InvalidReceiver(to);\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x13dd061770956c8489b80cfc89d9cdfc8ea2783d953691ea037a380731d52784\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\\n * a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\\n * {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\\n * a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the address zero.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be\\n * reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x7f7a26306c79a65fb8b3b6c757cd74660c532cd8a02e165488e30027dd34ca49\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/ERC721URIStorage.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {ERC721} from \\\"../ERC721.sol\\\";\\nimport {Strings} from \\\"../../../utils/Strings.sol\\\";\\nimport {IERC4906} from \\\"../../../interfaces/IERC4906.sol\\\";\\nimport {IERC165} from \\\"../../../interfaces/IERC165.sol\\\";\\n\\n/**\\n * @dev ERC721 token with storage based token URI management.\\n */\\nabstract contract ERC721URIStorage is IERC4906, ERC721 {\\n using Strings for uint256;\\n\\n // Interface ID as defined in ERC-4906. This does not correspond to a traditional interface ID as ERC-4906 only\\n // defines events and does not include any external function.\\n bytes4 private constant ERC4906_INTERFACE_ID = bytes4(0x49064906);\\n\\n // Optional mapping for token URIs\\n mapping(uint256 tokenId => string) private _tokenURIs;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {\\n return interfaceId == ERC4906_INTERFACE_ID || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireOwned(tokenId);\\n\\n string memory _tokenURI = _tokenURIs[tokenId];\\n string memory base = _baseURI();\\n\\n // If there is no base URI, return the token URI.\\n if (bytes(base).length == 0) {\\n return _tokenURI;\\n }\\n // If both are set, concatenate the baseURI and tokenURI (via string.concat).\\n if (bytes(_tokenURI).length > 0) {\\n return string.concat(base, _tokenURI);\\n }\\n\\n return super.tokenURI(tokenId);\\n }\\n\\n /**\\n * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\\n *\\n * Emits {MetadataUpdate}.\\n */\\n function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\\n _tokenURIs[tokenId] = _tokenURI;\\n emit MetadataUpdate(tokenId);\\n }\\n}\\n\",\"keccak256\":\"0xcc6f49e0c57072d6a18eef0d5fc22a4cc20462c18f0c365d2dd9a2c732fde670\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC721} from \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x37d1aaaa5a2908a09e9dcf56a26ddf762ecf295afb5964695937344fc6802ce1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Base64.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.2) (utils/Base64.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides a set of functions to operate with Base64 strings.\\n */\\nlibrary Base64 {\\n /**\\n * @dev Base64 Encoding/Decoding Table\\n */\\n string internal constant _TABLE = \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\\\";\\n\\n /**\\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\\n */\\n function encode(bytes memory data) internal pure returns (string memory) {\\n /**\\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\\n */\\n if (data.length == 0) return \\\"\\\";\\n\\n // Loads the table into memory\\n string memory table = _TABLE;\\n\\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\\n // and split into 4 numbers of 6 bits.\\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\\n // - `data.length + 2` -> Round up\\n // - `/ 3` -> Number of 3-bytes chunks\\n // - `4 *` -> 4 characters for each chunk\\n string memory result = new string(4 * ((data.length + 2) / 3));\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n // Prepare the lookup table (skip the first \\\"length\\\" byte)\\n let tablePtr := add(table, 1)\\n\\n // Prepare result pointer, jump over length\\n let resultPtr := add(result, 0x20)\\n let dataPtr := data\\n let endPtr := add(data, mload(data))\\n\\n // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\\n // set it to zero to make sure no dirty bytes are read in that section.\\n let afterPtr := add(endPtr, 0x20)\\n let afterCache := mload(afterPtr)\\n mstore(afterPtr, 0x00)\\n\\n // Run over the input, 3 bytes at a time\\n for {\\n\\n } lt(dataPtr, endPtr) {\\n\\n } {\\n // Advance 3 bytes\\n dataPtr := add(dataPtr, 3)\\n let input := mload(dataPtr)\\n\\n // To write each character, shift the 3 byte (24 bits) chunk\\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\\n // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\\n // Use this as an index into the lookup table, mload an entire word\\n // so the desired character is in the least significant byte, and\\n // mstore8 this least significant byte into the result and continue.\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n\\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\\n resultPtr := add(resultPtr, 1) // Advance\\n }\\n\\n // Reset the value that was cached\\n mstore(afterPtr, afterCache)\\n\\n // When data `bytes` is not exactly 3 bytes long\\n // it is padded with `=` characters at the end\\n switch mod(mload(data), 3)\\n case 1 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n mstore8(sub(resultPtr, 2), 0x3d)\\n }\\n case 2 {\\n mstore8(sub(resultPtr, 1), 0x3d)\\n }\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x09000342b85b1a06fa1f5b71bdeef7c449cd25799aac14fa9053d8abd18219aa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {Math} from \\\"./math/Math.sol\\\";\\nimport {SignedMath} from \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant HEX_DIGITS = \\\"0123456789abcdef\\\";\\n uint8 private constant ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev The `value` string doesn't fit in the specified `length`.\\n */\\n error StringsInsufficientHexLength(uint256 value, uint256 length);\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toStringSigned(int256 value) internal pure returns (string memory) {\\n return string.concat(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value)));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n uint256 localValue = value;\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = HEX_DIGITS[localValue & 0xf];\\n localValue >>= 4;\\n }\\n if (localValue != 0) {\\n revert StringsInsufficientHexLength(value, length);\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\\n * representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x55f102ea785d8399c0e58d1108e2d289506dde18abc6db1b7f68c1f9f9bc5792\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n /**\\n * @dev Muldiv operation overflow.\\n */\\n error MathOverflowedMulDiv();\\n\\n enum Rounding {\\n Floor, // Toward negative infinity\\n Ceil, // Toward positive infinity\\n Trunc, // Toward zero\\n Expand // Away from zero\\n }\\n\\n /**\\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n */\\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n uint256 c = a + b;\\n if (c < a) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\\n */\\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b > a) return (false, 0);\\n return (true, a - b);\\n }\\n }\\n\\n /**\\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n */\\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) return (true, 0);\\n uint256 c = a * b;\\n if (c / a != b) return (false, 0);\\n return (true, c);\\n }\\n }\\n\\n /**\\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n */\\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a / b);\\n }\\n }\\n\\n /**\\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n */\\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n unchecked {\\n if (b == 0) return (false, 0);\\n return (true, a % b);\\n }\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds towards infinity instead\\n * of rounding towards zero.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n if (b == 0) {\\n // Guarantee the same behavior as in a regular Solidity division.\\n return a / b;\\n }\\n\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\\n * denominator == 0.\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\\n * Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0 = x * y; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n if (denominator <= prod1) {\\n revert MathOverflowedMulDiv();\\n }\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\\n\\n uint256 twos = denominator & (0 - denominator);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\\n // works in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\\n * towards zero.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256 of a positive value rounded towards zero.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\\n */\\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\\n return uint8(rounding) % 2 == 1;\\n }\\n}\\n\",\"keccak256\":\"0x005ec64c6313f0555d59e278f9a7a5ab2db5bdc72a027f255a37c327af1ec02d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x5f7e4076e175393767754387c962926577f1660dd9b810187b9002407656be72\",\"license\":\"MIT\"},\"contracts/Stake&Step.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Base64.sol\\\";\\n\\ncontract StepStakeDynamicNFT is ERC721URIStorage, Ownable {\\n using Strings for uint256;\\n\\n // Stake information structure\\n struct StakeInfo {\\n uint256 amount;\\n uint256 stakeTimestamp;\\n uint256 stepCount;\\n bool claimed;\\n }\\n\\n // Mapping to track user stakes\\n mapping(address => StakeInfo) public userStakes;\\n\\n // Constants\\n uint256 public constant DAILY_STEP_GOAL = 5000;\\n uint256 public constant STAKE_PERIOD = 1 days;\\n\\n // Token counter for NFT minting\\n uint256 private _tokenIdCounter;\\n\\n // Events\\n event Staked(address indexed user, uint256 amount);\\n event StepsCounted(address indexed user, uint256 stepCount);\\n event NFTMinted(address indexed user, uint256 tokenId);\\n event StakeForfeit(address indexed user, uint256 amount);\\n event DailyChallengeNFTMinted(address indexed user, uint256 tokenId);\\n\\n constructor() ERC721(\\\"DailyStepChallenge\\\", \\\"STEPNFT\\\") Ownable(msg.sender) {\\n _tokenIdCounter = 1;\\n }\\n\\n // Stake function - allows staking with native token\\n function stake() external payable {\\n require(userStakes[msg.sender].amount == 0, \\\"Already staked\\\");\\n require(msg.value > 0, \\\"Stake amount must be greater than 0\\\");\\n\\n userStakes[msg.sender] = StakeInfo({\\n amount: msg.value,\\n stakeTimestamp: block.timestamp,\\n stepCount: 0,\\n claimed: false\\n });\\n\\n emit Staked(msg.sender, msg.value);\\n }\\n\\n // Update daily steps\\n function updateDailySteps(address wallet, uint256 stepCount) external {\\n StakeInfo storage stakeInfo = userStakes[wallet];\\n require(stakeInfo.amount > 0, \\\"No active stake\\\");\\n require(block.timestamp - stakeInfo.stakeTimestamp < STAKE_PERIOD, \\\"Stake period expired\\\");\\n\\n stakeInfo.stepCount = stepCount;\\n emit StepsCounted(wallet, stepCount);\\n }\\n\\n // Mint NFT and claim stake if goal is met\\n function claimStakeAndMintNFT(address wallet, string memory imageUrl) external {\\n StakeInfo storage stakeInfo = userStakes[wallet];\\n require(stakeInfo.amount > 0, \\\"No active stake\\\");\\n require(block.timestamp - stakeInfo.stakeTimestamp <= STAKE_PERIOD, \\\"Stake period expired\\\");\\n require(!stakeInfo.claimed, \\\"Stake already claimed\\\");\\n\\n if (stakeInfo.stepCount >= DAILY_STEP_GOAL) {\\n uint256 newTokenId = _tokenIdCounter;\\n _mintDynamicNFT(wallet, newTokenId, stakeInfo.stepCount, imageUrl);\\n\\n (bool success, ) = payable(wallet).call{ value: stakeInfo.amount }(\\\"\\\");\\n require(success, \\\"Transfer failed\\\");\\n\\n stakeInfo.claimed = true;\\n emit NFTMinted(wallet, newTokenId);\\n } else {\\n (bool success, ) = payable(owner()).call{ value: stakeInfo.amount }(\\\"\\\");\\n require(success, \\\"Forfeit transfer failed\\\");\\n\\n emit StakeForfeit(wallet, stakeInfo.amount);\\n }\\n\\n delete userStakes[wallet];\\n }\\n\\n // Mint Daily Challenge NFT\\n function mintDailyChallengeNFT(\\n address user,\\n string memory challengeType,\\n string memory description,\\n string memory quirkyMessage,\\n string memory imageUrl\\n ) external onlyOwner {\\n uint256 newTokenId = _tokenIdCounter;\\n\\n string memory metadata = generateDailyChallengeMetadata(\\n newTokenId,\\n challengeType,\\n description,\\n quirkyMessage,\\n imageUrl\\n );\\n\\n _safeMint(user, newTokenId);\\n _setTokenURI(newTokenId, metadata);\\n\\n _tokenIdCounter++;\\n emit DailyChallengeNFTMinted(user, newTokenId);\\n }\\n\\n // Internal function to mint NFT with dynamic metadata\\n function _mintDynamicNFT(address user, uint256 tokenId, uint256 stepCount, string memory imageUrl) internal {\\n string memory metadata = generateMetadata(tokenId, stepCount, imageUrl);\\n\\n _safeMint(user, tokenId);\\n _setTokenURI(tokenId, metadata);\\n\\n _tokenIdCounter++;\\n }\\n\\n // Generate metadata with dynamic attributes\\n function generateMetadata(\\n uint256 tokenId,\\n uint256 stepCount,\\n string memory imageUrl\\n ) internal pure returns (string memory) {\\n string memory metadata = string(\\n abi.encodePacked(\\n '{\\\"name\\\": \\\"Step Challenge NFT #',\\n tokenId.toString(),\\n '\\\",',\\n '\\\"description\\\": \\\"Daily Step Challenge Achievement\\\",',\\n '\\\"attributes\\\": [',\\n '{\\\"trait_type\\\": \\\"Steps\\\", \\\"value\\\": \\\"',\\n stepCount.toString(),\\n '\\\"},',\\n '{\\\"trait_type\\\": \\\"Goal Achieved\\\", \\\"value\\\": \\\"',\\n (stepCount >= 5000 ? \\\"Yes\\\" : \\\"No\\\"),\\n '\\\"}],\\\"',\\n '\\\"image\\\": \\\"',\\n imageUrl,\\n '\\\"}'\\n )\\n );\\n\\n return string(abi.encodePacked(\\\"data:application/json;base64,\\\", Base64.encode(bytes(metadata))));\\n }\\n\\n // Generate metadata for Daily Challenge NFT\\n function generateDailyChallengeMetadata(\\n uint256 tokenId,\\n string memory challengeType,\\n string memory description,\\n string memory quirkyMessage,\\n string memory imageUrl\\n ) internal pure returns (string memory) {\\n string memory metadata = string(\\n abi.encodePacked(\\n '{\\\"name\\\": \\\"Daily Challenge NFT #',\\n tokenId.toString(),\\n '\\\",',\\n '\\\"description\\\": \\\"',\\n description,\\n '\\\",',\\n '\\\"attributes\\\": [',\\n '{\\\"trait_type\\\": \\\"Challenge Type\\\", \\\"value\\\": \\\"',\\n challengeType,\\n '\\\"},',\\n '{\\\"trait_type\\\": \\\"Quirky Message\\\", \\\"value\\\": \\\"',\\n quirkyMessage,\\n '\\\"}],\\\"',\\n '\\\"image\\\": \\\"',\\n imageUrl,\\n '\\\"}'\\n )\\n );\\n\\n return string(abi.encodePacked(\\\"data:application/json;base64,\\\", Base64.encode(bytes(metadata))));\\n }\\n\\n // Allow contract to receive ETH\\n receive() external payable {}\\n\\n // Withdraw function for contract owner\\n function withdraw() external onlyOwner {\\n payable(owner()).transfer(address(this).balance);\\n }\\n}\\n\",\"keccak256\":\"0x0a54c751dc4b081f49e6f08205337ede5ece55cd6d0edab9845002fe497b9c56\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b5033604051806040016040528060128152602001714461696c79537465704368616c6c656e676560701b8152506040518060400160405280600781526020016614d5115413919560ca1b81525081600090816200006f9190620001be565b5060016200007e8282620001be565b5050506001600160a01b038116620000b057604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620000bb81620000c7565b5060016009556200028a565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014457607f821691505b6020821081036200016557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001b957600081815260208120601f850160051c81016020861015620001945750805b601f850160051c820191505b81811015620001b557828155600101620001a0565b5050505b505050565b81516001600160401b03811115620001da57620001da62000119565b620001f281620001eb84546200012f565b846200016b565b602080601f8311600181146200022a5760008415620002115750858301515b600019600386901b1c1916600185901b178555620001b5565b600085815260208120601f198616915b828110156200025b578886015182559484019460019091019084016200023a565b50858210156200027a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6123ba806200029a6000396000f3fe60806040526004361061014f5760003560e01c80638da5cb5b116100b6578063b88d4fde1161006f578063b88d4fde146103e6578063c87b56dd14610406578063cb9cf4f614610426578063dd4b18231461043c578063e985e9c514610453578063f2fde38b1461047357600080fd5b80638da5cb5b146102ec5780638da7ad231461030a57806395d89b411461037157806396aca7f414610386578063971fd622146103a6578063a22cb465146103c657600080fd5b80633a4b66f1116101085780633a4b66f11461024c5780633ccfd60b1461025457806342842e0e146102695780636352211e1461028957806370a08231146102a9578063715018a6146102d757600080fd5b806301ffc9a71461015b57806306fdde0314610190578063081812fc146101b2578063095ea7b3146101ea57806323b872dd1461020c578063286fdc531461022c57600080fd5b3661015657005b600080fd5b34801561016757600080fd5b5061017b6101763660046119ca565b610493565b60405190151581526020015b60405180910390f35b34801561019c57600080fd5b506101a56104be565b6040516101879190611a37565b3480156101be57600080fd5b506101d26101cd366004611a4a565b610550565b6040516001600160a01b039091168152602001610187565b3480156101f657600080fd5b5061020a610205366004611a7f565b610579565b005b34801561021857600080fd5b5061020a610227366004611aa9565b610588565b34801561023857600080fd5b5061020a610247366004611a7f565b610618565b61020a610712565b34801561026057600080fd5b5061020a610848565b34801561027557600080fd5b5061020a610284366004611aa9565b61088c565b34801561029557600080fd5b506101d26102a4366004611a4a565b6108ac565b3480156102b557600080fd5b506102c96102c4366004611ae5565b6108b7565b604051908152602001610187565b3480156102e357600080fd5b5061020a6108ff565b3480156102f857600080fd5b506007546001600160a01b03166101d2565b34801561031657600080fd5b5061034f610325366004611ae5565b60086020526000908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610187565b34801561037d57600080fd5b506101a5610913565b34801561039257600080fd5b5061020a6103a1366004611bac565b610922565b3480156103b257600080fd5b5061020a6103c1366004611c6a565b6109b3565b3480156103d257600080fd5b5061020a6103e1366004611cb8565b610cf2565b3480156103f257600080fd5b5061020a610401366004611cf4565b610cfd565b34801561041257600080fd5b506101a5610421366004611a4a565b610d14565b34801561043257600080fd5b506102c961138881565b34801561044857600080fd5b506102c96201518081565b34801561045f57600080fd5b5061017b61046e366004611d70565b610e25565b34801561047f57600080fd5b5061020a61048e366004611ae5565b610e53565b60006001600160e01b03198216632483248360e11b14806104b857506104b882610e8e565b92915050565b6060600080546104cd90611da3565b80601f01602080910402602001604051908101604052809291908181526020018280546104f990611da3565b80156105465780601f1061051b57610100808354040283529160200191610546565b820191906000526020600020905b81548152906001019060200180831161052957829003601f168201915b5050505050905090565b600061055b82610ede565b506000828152600460205260409020546001600160a01b03166104b8565b610584828233610f17565b5050565b6001600160a01b0382166105b757604051633250574960e11b8152600060048201526024015b60405180910390fd5b60006105c4838333610f24565b9050836001600160a01b0316816001600160a01b031614610612576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016105ae565b50505050565b6001600160a01b038216600090815260086020526040902080546106705760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b60448201526064016105ae565b620151808160010154426106849190611df3565b106106c85760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b60448201526064016105ae565b600281018290556040518281526001600160a01b038416907fb764fa86a0c0bf63220359c536a56dc51c46b28e94821b4b165bc99cd6500cc89060200160405180910390a2505050565b33600090815260086020526040902054156107605760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481cdd185ad95960921b60448201526064016105ae565b600034116107bc5760405162461bcd60e51b815260206004820152602360248201527f5374616b6520616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b60648201526084016105ae565b6040805160808101825234808252426020808401918252600084860181815260608601828152338084526008855292889020965187559351600187015551600286015591516003909401805460ff19169415159490941790935592519081527f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d910160405180910390a2565b61085061101d565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610889573d6000803e3d6000fd5b50565b6108a783838360405180602001604052806000815250610cfd565b505050565b60006104b882610ede565b60006001600160a01b0382166108e3576040516322718ad960e21b8152600060048201526024016105ae565b506001600160a01b031660009081526003602052604090205490565b61090761101d565b610911600061104a565b565b6060600180546104cd90611da3565b61092a61101d565b600954600061093c828787878761109c565b90506109488783611106565b6109528282611120565b6009805490600061096283611e06565b9190505550866001600160a01b03167fddb556c7bd395359905d909094a27257ea68b891c6c2102030d13a46486f9ea0836040516109a291815260200190565b60405180910390a250505050505050565b6001600160a01b03821660009081526008602052604090208054610a0b5760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b60448201526064016105ae565b62015180816001015442610a1f9190611df3565b1115610a645760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b60448201526064016105ae565b600381015460ff1615610ab15760405162461bcd60e51b815260206004820152601560248201527414dd185ad948185b1c9958591e4818db185a5b5959605a1b60448201526064016105ae565b611388816002015410610bc35760006009549050610ad58482846002015486611170565b81546040516000916001600160a01b038716918381818185875af1925050503d8060008114610b20576040519150601f19603f3d011682016040523d82523d6000602084013e610b25565b606091505b5050905080610b685760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016105ae565b60038301805460ff191660011790556040516001600160a01b038616907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090610bb49085815260200190565b60405180910390a25050610cba565b6000610bd76007546001600160a01b031690565b82546040516001600160a01b039290921691600081818185875af1925050503d8060008114610c22576040519150601f19603f3d011682016040523d82523d6000602084013e610c27565b606091505b5050905080610c785760405162461bcd60e51b815260206004820152601760248201527f466f7266656974207472616e73666572206661696c656400000000000000000060448201526064016105ae565b81546040519081526001600160a01b038516907f0ab19b5769ef7984769b3a944a8b9009f5b7cf96c5061497372b15c9668212f19060200160405180910390a2505b50506001600160a01b03166000908152600860205260408120818155600181018290556002810191909155600301805460ff19169055565b6105843383836111af565b610d08848484610588565b6106128484848461124e565b6060610d1f82610ede565b5060008281526006602052604081208054610d3990611da3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6590611da3565b8015610db25780601f10610d8757610100808354040283529160200191610db2565b820191906000526020600020905b815481529060010190602001808311610d9557829003601f168201915b505050505090506000610dd060408051602081019091526000815290565b90508051600003610de2575092915050565b815115610e14578082604051602001610dfc929190611e3b565b60405160208183030381529060405292505050919050565b610e1d84611377565b949350505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610e5b61101d565b6001600160a01b038116610e8557604051631e4fbdf760e01b8152600060048201526024016105ae565b6108898161104a565b60006001600160e01b031982166380ac58cd60e01b1480610ebf57506001600160e01b03198216635b5e139f60e01b145b806104b857506301ffc9a760e01b6001600160e01b03198316146104b8565b6000818152600260205260408120546001600160a01b0316806104b857604051637e27328960e01b8152600481018490526024016105ae565b6108a783838360016113ec565b6000828152600260205260408120546001600160a01b0390811690831615610f5157610f518184866114f2565b6001600160a01b03811615610f8f57610f6e6000856000806113ec565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610fbe576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6007546001600160a01b031633146109115760405163118cdaa760e01b81523360048201526024016105ae565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060006110a987611556565b858786866040516020016110c1959493929190611e6a565b60405160208183030381529060405290506110db816115e9565b6040516020016110eb9190611ff4565b60405160208183030381529060405291505095945050505050565b610584828260405180602001604052806000815250611749565b60008281526006602052604090206111388282612087565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050565b600061117d848484611760565b90506111898585611106565b6111938482611120565b600980549060006111a383611e06565b91905055505050505050565b6001600160a01b0382166111e157604051630b61174360e31b81526001600160a01b03831660048201526024016105ae565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561061257604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611290903390889087908790600401612147565b6020604051808303816000875af19250505080156112cb575060408051601f3d908101601f191682019092526112c891810190612184565b60015b611334573d8080156112f9576040519150601f19603f3d011682016040523d82523d6000602084013e6112fe565b606091505b50805160000361132c57604051633250574960e11b81526001600160a01b03851660048201526024016105ae565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461137057604051633250574960e11b81526001600160a01b03851660048201526024016105ae565b5050505050565b606061138282610ede565b50600061139a60408051602081019091526000815290565b905060008151116113ba57604051806020016040528060008152506113e5565b806113c484611556565b6040516020016113d5929190611e3b565b6040516020818303038152906040525b9392505050565b808061140057506001600160a01b03821615155b156114c257600061141084610ede565b90506001600160a01b0383161580159061143c5750826001600160a01b0316816001600160a01b031614155b801561144f575061144d8184610e25565b155b156114785760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016105ae565b81156114c05783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6114fd838383611814565b6108a7576001600160a01b03831661152b57604051637e27328960e01b8152600481018290526024016105ae565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016105ae565b6060600061156383611877565b600101905060008167ffffffffffffffff81111561158357611583611b00565b6040519080825280601f01601f1916602001820160405280156115ad576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846115b757509392505050565b6060815160000361160857505060408051602081019091526000815290565b6000604051806060016040528060408152602001612345604091399050600060038451600261163791906121a1565b61164191906121b4565b61164c9060046121d6565b67ffffffffffffffff81111561166457611664611b00565b6040519080825280601f01601f19166020018201604052801561168e576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015611704576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506116a9565b905250508551600390066001811461172357600281146117365761173e565b603d6001830353603d600283035361173e565b603d60018303535b509195945050505050565b611753838361194f565b6108a7600084848461124e565b6060600061176d85611556565b61177685611556565b6113888610156117a057604051806040016040528060028152602001614e6f60f01b8152506117bd565b6040518060400160405280600381526020016259657360e81b8152505b856040516020016117d194939291906121ed565b60405160208183030381529060405290506117eb816115e9565b6040516020016117fb9190611ff4565b6040516020818303038152906040529150509392505050565b60006001600160a01b03831615801590610e1d5750826001600160a01b0316846001600160a01b0316148061184e575061184e8484610e25565b80610e1d5750506000908152600460205260409020546001600160a01b03908116911614919050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106118b65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106118e2576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061190057662386f26fc10000830492506010015b6305f5e1008310611918576305f5e100830492506008015b612710831061192c57612710830492506004015b6064831061193e576064830492506002015b600a83106104b85760010192915050565b6001600160a01b03821661197957604051633250574960e11b8152600060048201526024016105ae565b600061198783836000610f24565b90506001600160a01b038116156108a7576040516339e3563760e11b8152600060048201526024016105ae565b6001600160e01b03198116811461088957600080fd5b6000602082840312156119dc57600080fd5b81356113e5816119b4565b60005b83811015611a025781810151838201526020016119ea565b50506000910152565b60008151808452611a238160208601602086016119e7565b601f01601f19169290920160200192915050565b6020815260006113e56020830184611a0b565b600060208284031215611a5c57600080fd5b5035919050565b80356001600160a01b0381168114611a7a57600080fd5b919050565b60008060408385031215611a9257600080fd5b611a9b83611a63565b946020939093013593505050565b600080600060608486031215611abe57600080fd5b611ac784611a63565b9250611ad560208501611a63565b9150604084013590509250925092565b600060208284031215611af757600080fd5b6113e582611a63565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b3157611b31611b00565b604051601f8501601f19908116603f01168101908282118183101715611b5957611b59611b00565b81604052809350858152868686011115611b7257600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611b9d57600080fd5b6113e583833560208501611b16565b600080600080600060a08688031215611bc457600080fd5b611bcd86611a63565b9450602086013567ffffffffffffffff80821115611bea57600080fd5b611bf689838a01611b8c565b95506040880135915080821115611c0c57600080fd5b611c1889838a01611b8c565b94506060880135915080821115611c2e57600080fd5b611c3a89838a01611b8c565b93506080880135915080821115611c5057600080fd5b50611c5d88828901611b8c565b9150509295509295909350565b60008060408385031215611c7d57600080fd5b611c8683611a63565b9150602083013567ffffffffffffffff811115611ca257600080fd5b611cae85828601611b8c565b9150509250929050565b60008060408385031215611ccb57600080fd5b611cd483611a63565b915060208301358015158114611ce957600080fd5b809150509250929050565b60008060008060808587031215611d0a57600080fd5b611d1385611a63565b9350611d2160208601611a63565b925060408501359150606085013567ffffffffffffffff811115611d4457600080fd5b8501601f81018713611d5557600080fd5b611d6487823560208401611b16565b91505092959194509250565b60008060408385031215611d8357600080fd5b611d8c83611a63565b9150611d9a60208401611a63565b90509250929050565b600181811c90821680611db757607f821691505b602082108103611dd757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156104b8576104b8611ddd565b600060018201611e1857611e18611ddd565b5060010190565b60008151611e318185602086016119e7565b9290920192915050565b60008351611e4d8184602088016119e7565b835190830190611e618183602088016119e7565b01949350505050565b7f7b226e616d65223a20224461696c79204368616c6c656e6765204e4654202300815260008651611ea281601f850160208b016119e7565b61088b60f21b601f9184019182018190526f113232b9b1b934b83a34b7b7111d101160811b60218301528751611edf816031850160208c016119e7565b60319201918201526e2261747472696275746573223a205b60881b60338201527f7b2274726169745f74797065223a20224368616c6c656e67652054797065222c60428201526a10113b30b63ab2911d101160a91b6062820152611fe8611fda611fd4611fbe611fad611fa7611f6a611f5b606d89018e611e1f565b62089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a2022517569726b79204d657373616765222c81526a10113b30b63ab2911d101160a91b6020820152602b0190565b8a611e1f565b64113eae961160d91b815260050190565b691134b6b0b3b2911d101160b11b8152600a0190565b86611e1f565b61227d60f01b815260020190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161202c81601d8501602087016119e7565b91909101601d0192915050565b601f8211156108a757600081815260208120601f850160051c810160208610156120605750805b601f850160051c820191505b8181101561207f5782815560010161206c565b505050505050565b815167ffffffffffffffff8111156120a1576120a1611b00565b6120b5816120af8454611da3565b84612039565b602080601f8311600181146120ea57600084156120d25750858301515b600019600386901b1c1916600185901b17855561207f565b600085815260208120601f198616915b82811015612119578886015182559484019460019091019084016120fa565b50858210156121375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061217a90830184611a0b565b9695505050505050565b60006020828403121561219657600080fd5b81516113e5816119b4565b808201808211156104b8576104b8611ddd565b6000826121d157634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176104b8576104b8611ddd565b7f7b226e616d65223a202253746570204368616c6c656e6765204e46542023000081526000855161222581601e850160208a016119e7565b61088b60f21b601e918401918201527f226465736372697074696f6e223a20224461696c792053746570204368616c6c60208083019190915271195b99d9481058da1a595d995b595b9d088b60721b60408301526e2261747472696275746573223a205b60881b60528301527f7b2274726169745f74797065223a20225374657073222c202276616c7565223a606183015261101160f11b60818301528651906122d790829060838501908a016119e7565b62089f4b60ea1b910160838101919091527f7b2274726169745f74797065223a2022476f616c204163686965766564222c20608682015269113b30b63ab2911d101160b11b60a6820152612339611fda611fd4611fbe611fad60b08601611fa7565b97965050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220fc7eb9b7f6092197ab3366375ea3f671abf93c19d4cd52f3cb5bbaa998212bcf64736f6c63430008140033", + "deployedBytecode": "0x60806040526004361061014f5760003560e01c80638da5cb5b116100b6578063b88d4fde1161006f578063b88d4fde146103e6578063c87b56dd14610406578063cb9cf4f614610426578063dd4b18231461043c578063e985e9c514610453578063f2fde38b1461047357600080fd5b80638da5cb5b146102ec5780638da7ad231461030a57806395d89b411461037157806396aca7f414610386578063971fd622146103a6578063a22cb465146103c657600080fd5b80633a4b66f1116101085780633a4b66f11461024c5780633ccfd60b1461025457806342842e0e146102695780636352211e1461028957806370a08231146102a9578063715018a6146102d757600080fd5b806301ffc9a71461015b57806306fdde0314610190578063081812fc146101b2578063095ea7b3146101ea57806323b872dd1461020c578063286fdc531461022c57600080fd5b3661015657005b600080fd5b34801561016757600080fd5b5061017b6101763660046119ca565b610493565b60405190151581526020015b60405180910390f35b34801561019c57600080fd5b506101a56104be565b6040516101879190611a37565b3480156101be57600080fd5b506101d26101cd366004611a4a565b610550565b6040516001600160a01b039091168152602001610187565b3480156101f657600080fd5b5061020a610205366004611a7f565b610579565b005b34801561021857600080fd5b5061020a610227366004611aa9565b610588565b34801561023857600080fd5b5061020a610247366004611a7f565b610618565b61020a610712565b34801561026057600080fd5b5061020a610848565b34801561027557600080fd5b5061020a610284366004611aa9565b61088c565b34801561029557600080fd5b506101d26102a4366004611a4a565b6108ac565b3480156102b557600080fd5b506102c96102c4366004611ae5565b6108b7565b604051908152602001610187565b3480156102e357600080fd5b5061020a6108ff565b3480156102f857600080fd5b506007546001600160a01b03166101d2565b34801561031657600080fd5b5061034f610325366004611ae5565b60086020526000908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610187565b34801561037d57600080fd5b506101a5610913565b34801561039257600080fd5b5061020a6103a1366004611bac565b610922565b3480156103b257600080fd5b5061020a6103c1366004611c6a565b6109b3565b3480156103d257600080fd5b5061020a6103e1366004611cb8565b610cf2565b3480156103f257600080fd5b5061020a610401366004611cf4565b610cfd565b34801561041257600080fd5b506101a5610421366004611a4a565b610d14565b34801561043257600080fd5b506102c961138881565b34801561044857600080fd5b506102c96201518081565b34801561045f57600080fd5b5061017b61046e366004611d70565b610e25565b34801561047f57600080fd5b5061020a61048e366004611ae5565b610e53565b60006001600160e01b03198216632483248360e11b14806104b857506104b882610e8e565b92915050565b6060600080546104cd90611da3565b80601f01602080910402602001604051908101604052809291908181526020018280546104f990611da3565b80156105465780601f1061051b57610100808354040283529160200191610546565b820191906000526020600020905b81548152906001019060200180831161052957829003601f168201915b5050505050905090565b600061055b82610ede565b506000828152600460205260409020546001600160a01b03166104b8565b610584828233610f17565b5050565b6001600160a01b0382166105b757604051633250574960e11b8152600060048201526024015b60405180910390fd5b60006105c4838333610f24565b9050836001600160a01b0316816001600160a01b031614610612576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016105ae565b50505050565b6001600160a01b038216600090815260086020526040902080546106705760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b60448201526064016105ae565b620151808160010154426106849190611df3565b106106c85760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b60448201526064016105ae565b600281018290556040518281526001600160a01b038416907fb764fa86a0c0bf63220359c536a56dc51c46b28e94821b4b165bc99cd6500cc89060200160405180910390a2505050565b33600090815260086020526040902054156107605760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481cdd185ad95960921b60448201526064016105ae565b600034116107bc5760405162461bcd60e51b815260206004820152602360248201527f5374616b6520616d6f756e74206d75737420626520677265617465722074686160448201526206e20360ec1b60648201526084016105ae565b6040805160808101825234808252426020808401918252600084860181815260608601828152338084526008855292889020965187559351600187015551600286015591516003909401805460ff19169415159490941790935592519081527f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d910160405180910390a2565b61085061101d565b6007546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610889573d6000803e3d6000fd5b50565b6108a783838360405180602001604052806000815250610cfd565b505050565b60006104b882610ede565b60006001600160a01b0382166108e3576040516322718ad960e21b8152600060048201526024016105ae565b506001600160a01b031660009081526003602052604090205490565b61090761101d565b610911600061104a565b565b6060600180546104cd90611da3565b61092a61101d565b600954600061093c828787878761109c565b90506109488783611106565b6109528282611120565b6009805490600061096283611e06565b9190505550866001600160a01b03167fddb556c7bd395359905d909094a27257ea68b891c6c2102030d13a46486f9ea0836040516109a291815260200190565b60405180910390a250505050505050565b6001600160a01b03821660009081526008602052604090208054610a0b5760405162461bcd60e51b815260206004820152600f60248201526e4e6f20616374697665207374616b6560881b60448201526064016105ae565b62015180816001015442610a1f9190611df3565b1115610a645760405162461bcd60e51b815260206004820152601460248201527314dd185ad9481c195c9a5bd908195e1c1a5c995960621b60448201526064016105ae565b600381015460ff1615610ab15760405162461bcd60e51b815260206004820152601560248201527414dd185ad948185b1c9958591e4818db185a5b5959605a1b60448201526064016105ae565b611388816002015410610bc35760006009549050610ad58482846002015486611170565b81546040516000916001600160a01b038716918381818185875af1925050503d8060008114610b20576040519150601f19603f3d011682016040523d82523d6000602084013e610b25565b606091505b5050905080610b685760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016105ae565b60038301805460ff191660011790556040516001600160a01b038616907f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804090610bb49085815260200190565b60405180910390a25050610cba565b6000610bd76007546001600160a01b031690565b82546040516001600160a01b039290921691600081818185875af1925050503d8060008114610c22576040519150601f19603f3d011682016040523d82523d6000602084013e610c27565b606091505b5050905080610c785760405162461bcd60e51b815260206004820152601760248201527f466f7266656974207472616e73666572206661696c656400000000000000000060448201526064016105ae565b81546040519081526001600160a01b038516907f0ab19b5769ef7984769b3a944a8b9009f5b7cf96c5061497372b15c9668212f19060200160405180910390a2505b50506001600160a01b03166000908152600860205260408120818155600181018290556002810191909155600301805460ff19169055565b6105843383836111af565b610d08848484610588565b6106128484848461124e565b6060610d1f82610ede565b5060008281526006602052604081208054610d3990611da3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6590611da3565b8015610db25780601f10610d8757610100808354040283529160200191610db2565b820191906000526020600020905b815481529060010190602001808311610d9557829003601f168201915b505050505090506000610dd060408051602081019091526000815290565b90508051600003610de2575092915050565b815115610e14578082604051602001610dfc929190611e3b565b60405160208183030381529060405292505050919050565b610e1d84611377565b949350505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610e5b61101d565b6001600160a01b038116610e8557604051631e4fbdf760e01b8152600060048201526024016105ae565b6108898161104a565b60006001600160e01b031982166380ac58cd60e01b1480610ebf57506001600160e01b03198216635b5e139f60e01b145b806104b857506301ffc9a760e01b6001600160e01b03198316146104b8565b6000818152600260205260408120546001600160a01b0316806104b857604051637e27328960e01b8152600481018490526024016105ae565b6108a783838360016113ec565b6000828152600260205260408120546001600160a01b0390811690831615610f5157610f518184866114f2565b6001600160a01b03811615610f8f57610f6e6000856000806113ec565b6001600160a01b038116600090815260036020526040902080546000190190555b6001600160a01b03851615610fbe576001600160a01b0385166000908152600360205260409020805460010190555b60008481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6007546001600160a01b031633146109115760405163118cdaa760e01b81523360048201526024016105ae565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b606060006110a987611556565b858786866040516020016110c1959493929190611e6a565b60405160208183030381529060405290506110db816115e9565b6040516020016110eb9190611ff4565b60405160208183030381529060405291505095945050505050565b610584828260405180602001604052806000815250611749565b60008281526006602052604090206111388282612087565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050565b600061117d848484611760565b90506111898585611106565b6111938482611120565b600980549060006111a383611e06565b91905055505050505050565b6001600160a01b0382166111e157604051630b61174360e31b81526001600160a01b03831660048201526024016105ae565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b1561061257604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611290903390889087908790600401612147565b6020604051808303816000875af19250505080156112cb575060408051601f3d908101601f191682019092526112c891810190612184565b60015b611334573d8080156112f9576040519150601f19603f3d011682016040523d82523d6000602084013e6112fe565b606091505b50805160000361132c57604051633250574960e11b81526001600160a01b03851660048201526024016105ae565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461137057604051633250574960e11b81526001600160a01b03851660048201526024016105ae565b5050505050565b606061138282610ede565b50600061139a60408051602081019091526000815290565b905060008151116113ba57604051806020016040528060008152506113e5565b806113c484611556565b6040516020016113d5929190611e3b565b6040516020818303038152906040525b9392505050565b808061140057506001600160a01b03821615155b156114c257600061141084610ede565b90506001600160a01b0383161580159061143c5750826001600160a01b0316816001600160a01b031614155b801561144f575061144d8184610e25565b155b156114785760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016105ae565b81156114c05783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b6114fd838383611814565b6108a7576001600160a01b03831661152b57604051637e27328960e01b8152600481018290526024016105ae565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016105ae565b6060600061156383611877565b600101905060008167ffffffffffffffff81111561158357611583611b00565b6040519080825280601f01601f1916602001820160405280156115ad576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846115b757509392505050565b6060815160000361160857505060408051602081019091526000815290565b6000604051806060016040528060408152602001612345604091399050600060038451600261163791906121a1565b61164191906121b4565b61164c9060046121d6565b67ffffffffffffffff81111561166457611664611b00565b6040519080825280601f01601f19166020018201604052801561168e576020820181803683370190505b50905060018201602082018586518701602081018051600082525b82841015611704576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506116a9565b905250508551600390066001811461172357600281146117365761173e565b603d6001830353603d600283035361173e565b603d60018303535b509195945050505050565b611753838361194f565b6108a7600084848461124e565b6060600061176d85611556565b61177685611556565b6113888610156117a057604051806040016040528060028152602001614e6f60f01b8152506117bd565b6040518060400160405280600381526020016259657360e81b8152505b856040516020016117d194939291906121ed565b60405160208183030381529060405290506117eb816115e9565b6040516020016117fb9190611ff4565b6040516020818303038152906040529150509392505050565b60006001600160a01b03831615801590610e1d5750826001600160a01b0316846001600160a01b0316148061184e575061184e8484610e25565b80610e1d5750506000908152600460205260409020546001600160a01b03908116911614919050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106118b65772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106118e2576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061190057662386f26fc10000830492506010015b6305f5e1008310611918576305f5e100830492506008015b612710831061192c57612710830492506004015b6064831061193e576064830492506002015b600a83106104b85760010192915050565b6001600160a01b03821661197957604051633250574960e11b8152600060048201526024016105ae565b600061198783836000610f24565b90506001600160a01b038116156108a7576040516339e3563760e11b8152600060048201526024016105ae565b6001600160e01b03198116811461088957600080fd5b6000602082840312156119dc57600080fd5b81356113e5816119b4565b60005b83811015611a025781810151838201526020016119ea565b50506000910152565b60008151808452611a238160208601602086016119e7565b601f01601f19169290920160200192915050565b6020815260006113e56020830184611a0b565b600060208284031215611a5c57600080fd5b5035919050565b80356001600160a01b0381168114611a7a57600080fd5b919050565b60008060408385031215611a9257600080fd5b611a9b83611a63565b946020939093013593505050565b600080600060608486031215611abe57600080fd5b611ac784611a63565b9250611ad560208501611a63565b9150604084013590509250925092565b600060208284031215611af757600080fd5b6113e582611a63565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611b3157611b31611b00565b604051601f8501601f19908116603f01168101908282118183101715611b5957611b59611b00565b81604052809350858152868686011115611b7257600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611b9d57600080fd5b6113e583833560208501611b16565b600080600080600060a08688031215611bc457600080fd5b611bcd86611a63565b9450602086013567ffffffffffffffff80821115611bea57600080fd5b611bf689838a01611b8c565b95506040880135915080821115611c0c57600080fd5b611c1889838a01611b8c565b94506060880135915080821115611c2e57600080fd5b611c3a89838a01611b8c565b93506080880135915080821115611c5057600080fd5b50611c5d88828901611b8c565b9150509295509295909350565b60008060408385031215611c7d57600080fd5b611c8683611a63565b9150602083013567ffffffffffffffff811115611ca257600080fd5b611cae85828601611b8c565b9150509250929050565b60008060408385031215611ccb57600080fd5b611cd483611a63565b915060208301358015158114611ce957600080fd5b809150509250929050565b60008060008060808587031215611d0a57600080fd5b611d1385611a63565b9350611d2160208601611a63565b925060408501359150606085013567ffffffffffffffff811115611d4457600080fd5b8501601f81018713611d5557600080fd5b611d6487823560208401611b16565b91505092959194509250565b60008060408385031215611d8357600080fd5b611d8c83611a63565b9150611d9a60208401611a63565b90509250929050565b600181811c90821680611db757607f821691505b602082108103611dd757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156104b8576104b8611ddd565b600060018201611e1857611e18611ddd565b5060010190565b60008151611e318185602086016119e7565b9290920192915050565b60008351611e4d8184602088016119e7565b835190830190611e618183602088016119e7565b01949350505050565b7f7b226e616d65223a20224461696c79204368616c6c656e6765204e4654202300815260008651611ea281601f850160208b016119e7565b61088b60f21b601f9184019182018190526f113232b9b1b934b83a34b7b7111d101160811b60218301528751611edf816031850160208c016119e7565b60319201918201526e2261747472696275746573223a205b60881b60338201527f7b2274726169745f74797065223a20224368616c6c656e67652054797065222c60428201526a10113b30b63ab2911d101160a91b6062820152611fe8611fda611fd4611fbe611fad611fa7611f6a611f5b606d89018e611e1f565b62089f4b60ea1b815260030190565b7f7b2274726169745f74797065223a2022517569726b79204d657373616765222c81526a10113b30b63ab2911d101160a91b6020820152602b0190565b8a611e1f565b64113eae961160d91b815260050190565b691134b6b0b3b2911d101160b11b8152600a0190565b86611e1f565b61227d60f01b815260020190565b98975050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161202c81601d8501602087016119e7565b91909101601d0192915050565b601f8211156108a757600081815260208120601f850160051c810160208610156120605750805b601f850160051c820191505b8181101561207f5782815560010161206c565b505050505050565b815167ffffffffffffffff8111156120a1576120a1611b00565b6120b5816120af8454611da3565b84612039565b602080601f8311600181146120ea57600084156120d25750858301515b600019600386901b1c1916600185901b17855561207f565b600085815260208120601f198616915b82811015612119578886015182559484019460019091019084016120fa565b50858210156121375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061217a90830184611a0b565b9695505050505050565b60006020828403121561219657600080fd5b81516113e5816119b4565b808201808211156104b8576104b8611ddd565b6000826121d157634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176104b8576104b8611ddd565b7f7b226e616d65223a202253746570204368616c6c656e6765204e46542023000081526000855161222581601e850160208a016119e7565b61088b60f21b601e918401918201527f226465736372697074696f6e223a20224461696c792053746570204368616c6c60208083019190915271195b99d9481058da1a595d995b595b9d088b60721b60408301526e2261747472696275746573223a205b60881b60528301527f7b2274726169745f74797065223a20225374657073222c202276616c7565223a606183015261101160f11b60818301528651906122d790829060838501908a016119e7565b62089f4b60ea1b910160838101919091527f7b2274726169745f74797065223a2022476f616c204163686965766564222c20608682015269113b30b63ab2911d101160b11b60a6820152612339611fda611fd4611fbe611fad60b08601611fa7565b97965050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220fc7eb9b7f6092197ab3366375ea3f671abf93c19d4cd52f3cb5bbaa998212bcf64736f6c63430008140033", "devdoc": { "errors": { "ERC721IncorrectOwner(address,uint256,address)": [ diff --git a/packages/hardhat/deployments/baseSepolia/solcInputs/a4f2dd33f5bc37a41a4f95d474cb2ef5.json b/packages/hardhat/deployments/baseSepolia/solcInputs/0554c28b80095f2a4521c9d957750b57.json similarity index 92% rename from packages/hardhat/deployments/baseSepolia/solcInputs/a4f2dd33f5bc37a41a4f95d474cb2ef5.json rename to packages/hardhat/deployments/baseSepolia/solcInputs/0554c28b80095f2a4521c9d957750b57.json index 0ab9e4e..99f4f40 100644 --- a/packages/hardhat/deployments/baseSepolia/solcInputs/a4f2dd33f5bc37a41a4f95d474cb2ef5.json +++ b/packages/hardhat/deployments/baseSepolia/solcInputs/0554c28b80095f2a4521c9d957750b57.json @@ -53,7 +53,7 @@ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" }, "contracts/Stake&Step.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\n\ncontract StepStakeDynamicNFT is ERC721URIStorage, Ownable {\n using Strings for uint256;\n\n // Stake information structure\n struct StakeInfo {\n uint256 amount;\n uint256 stakeTimestamp;\n uint256 stepCount;\n bool claimed;\n }\n\n // Mapping to track user stakes\n mapping(address => StakeInfo) public userStakes;\n\n // Constants\n uint256 public constant DAILY_STEP_GOAL = 5000;\n uint256 public constant STAKE_PERIOD = 1 days;\n\n // Token counter for NFT minting\n uint256 private _tokenIdCounter;\n\n // Events\n event Staked(address indexed user, uint256 amount);\n event StepsCounted(address indexed user, uint256 stepCount);\n event NFTMinted(address indexed user, uint256 tokenId);\n event StakeForfeit(address indexed user, uint256 amount);\n\n constructor() ERC721(\"DailyStepChallenge\", \"STEPNFT\") Ownable(msg.sender) {\n _tokenIdCounter = 1;\n }\n\n // Stake function - allows staking with native token\n function stake() external payable {\n // Ensure user hasn't already staked\n require(userStakes[msg.sender].amount == 0, \"Already staked\");\n require(msg.value > 0, \"Stake amount must be greater than 0\");\n\n // Record stake information\n userStakes[msg.sender] = StakeInfo({\n amount: msg.value,\n stakeTimestamp: block.timestamp,\n stepCount: 0,\n claimed: false\n });\n\n emit Staked(msg.sender, msg.value);\n }\n\n // Update daily steps\n function updateDailySteps(address wallet, uint256 stepCount) external {\n StakeInfo storage stakeInfo = userStakes[wallet];\n\n // Ensure user has an active stake\n require(stakeInfo.amount > 0, \"No active stake\");\n\n // Ensure stake is from today\n require(block.timestamp - stakeInfo.stakeTimestamp < STAKE_PERIOD, \"Stake period expired\");\n\n // Update step count\n stakeInfo.stepCount = stepCount;\n\n emit StepsCounted(wallet, stepCount);\n }\n\n // Mint NFT and claim stake if goal is met\n function claimStakeAndMintNFT(address wallet, string memory imageUrl) external {\n StakeInfo storage stakeInfo = userStakes[wallet];\n \n // Ensure stake exists\n require(stakeInfo.amount > 0, \"No active stake\");\n \n // Ensure stake period has passed\n require(block.timestamp - stakeInfo.stakeTimestamp <= STAKE_PERIOD, \"Stake period expired\");\n \n // Ensure not already claimed\n require(!stakeInfo.claimed, \"Stake already claimed\");\n \n // Check if step goal is met\n if (stakeInfo.stepCount >= DAILY_STEP_GOAL) {\n // Mint unique NFT with provided image URL\n uint256 newTokenId = _tokenIdCounter;\n _mintDynamicNFT(wallet, newTokenId, stakeInfo.stepCount, imageUrl);\n \n // Transfer stake back to user\n (bool success, ) = payable(wallet).call{ value: stakeInfo.amount }(\"\");\n require(success, \"Transfer failed\");\n \n // Mark as claimed\n stakeInfo.claimed = true;\n \n emit NFTMinted(wallet, newTokenId);\n } else {\n // Forfeit stake if goal not met\n (bool success, ) = payable(owner()).call{ value: stakeInfo.amount }(\"\");\n require(success, \"Forfeit transfer failed\");\n \n emit StakeForfeit(wallet, stakeInfo.amount);\n }\n \n // Reset stake\n delete userStakes[wallet];\n }\n\n // Internal function to mint NFT with dynamic metadata\n function _mintDynamicNFT(address user, uint256 tokenId, uint256 stepCount, string memory imageUrl) internal {\n // Generate metadata\n string memory metadata = generateMetadata(tokenId, stepCount, imageUrl);\n\n // Mint NFT with metadata\n _safeMint(user, tokenId);\n _setTokenURI(tokenId, metadata);\n\n _tokenIdCounter++;\n }\n\n // Generate metadata with dynamic attributes\n function generateMetadata(\n uint256 tokenId,\n uint256 stepCount,\n string memory imageUrl\n ) internal pure returns (string memory) {\n string memory metadata = string(\n abi.encodePacked(\n '{\"name\": \"Step Challenge NFT #',\n tokenId.toString(),\n '\",',\n '\"description\": \"Daily Step Challenge Achievement\",',\n '\"attributes\": [',\n '{\"trait_type\": \"Steps\", \"value\": \"',\n stepCount.toString(),\n '\"},',\n '{\"trait_type\": \"Goal Achieved\", \"value\": \"',\n (stepCount >= 5000 ? \"Yes\" : \"No\"),\n '\"}'\n \"],\",\n '\"image\": \"',\n imageUrl,\n '\"}'\n )\n );\n\n return string(abi.encodePacked(\"data:application/json;base64,\", Base64.encode(bytes(metadata))));\n }\n\n // Allow contract to receive ETH\n receive() external payable {}\n\n // Withdraw function for contract owner\n function withdraw() external onlyOwner {\n payable(owner()).transfer(address(this).balance);\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\n\ncontract StepStakeDynamicNFT is ERC721URIStorage, Ownable {\n using Strings for uint256;\n\n // Stake information structure\n struct StakeInfo {\n uint256 amount;\n uint256 stakeTimestamp;\n uint256 stepCount;\n bool claimed;\n }\n\n // Mapping to track user stakes\n mapping(address => StakeInfo) public userStakes;\n\n // Constants\n uint256 public constant DAILY_STEP_GOAL = 5000;\n uint256 public constant STAKE_PERIOD = 1 days;\n\n // Token counter for NFT minting\n uint256 private _tokenIdCounter;\n\n // Events\n event Staked(address indexed user, uint256 amount);\n event StepsCounted(address indexed user, uint256 stepCount);\n event NFTMinted(address indexed user, uint256 tokenId);\n event StakeForfeit(address indexed user, uint256 amount);\n event DailyChallengeNFTMinted(address indexed user, uint256 tokenId);\n\n constructor() ERC721(\"DailyStepChallenge\", \"STEPNFT\") Ownable(msg.sender) {\n _tokenIdCounter = 1;\n }\n\n // Stake function - allows staking with native token\n function stake() external payable {\n require(userStakes[msg.sender].amount == 0, \"Already staked\");\n require(msg.value > 0, \"Stake amount must be greater than 0\");\n\n userStakes[msg.sender] = StakeInfo({\n amount: msg.value,\n stakeTimestamp: block.timestamp,\n stepCount: 0,\n claimed: false\n });\n\n emit Staked(msg.sender, msg.value);\n }\n\n // Update daily steps\n function updateDailySteps(address wallet, uint256 stepCount) external {\n StakeInfo storage stakeInfo = userStakes[wallet];\n require(stakeInfo.amount > 0, \"No active stake\");\n require(block.timestamp - stakeInfo.stakeTimestamp < STAKE_PERIOD, \"Stake period expired\");\n\n stakeInfo.stepCount = stepCount;\n emit StepsCounted(wallet, stepCount);\n }\n\n // Mint NFT and claim stake if goal is met\n function claimStakeAndMintNFT(address wallet, string memory imageUrl) external {\n StakeInfo storage stakeInfo = userStakes[wallet];\n require(stakeInfo.amount > 0, \"No active stake\");\n require(block.timestamp - stakeInfo.stakeTimestamp <= STAKE_PERIOD, \"Stake period expired\");\n require(!stakeInfo.claimed, \"Stake already claimed\");\n\n if (stakeInfo.stepCount >= DAILY_STEP_GOAL) {\n uint256 newTokenId = _tokenIdCounter;\n _mintDynamicNFT(wallet, newTokenId, stakeInfo.stepCount, imageUrl);\n\n (bool success, ) = payable(wallet).call{ value: stakeInfo.amount }(\"\");\n require(success, \"Transfer failed\");\n\n stakeInfo.claimed = true;\n emit NFTMinted(wallet, newTokenId);\n } else {\n (bool success, ) = payable(owner()).call{ value: stakeInfo.amount }(\"\");\n require(success, \"Forfeit transfer failed\");\n\n emit StakeForfeit(wallet, stakeInfo.amount);\n }\n\n delete userStakes[wallet];\n }\n\n // Mint Daily Challenge NFT\n function mintDailyChallengeNFT(\n address user,\n string memory challengeType,\n string memory description,\n string memory quirkyMessage,\n string memory imageUrl\n ) external onlyOwner {\n uint256 newTokenId = _tokenIdCounter;\n\n string memory metadata = generateDailyChallengeMetadata(\n newTokenId,\n challengeType,\n description,\n quirkyMessage,\n imageUrl\n );\n\n _safeMint(user, newTokenId);\n _setTokenURI(newTokenId, metadata);\n\n _tokenIdCounter++;\n emit DailyChallengeNFTMinted(user, newTokenId);\n }\n\n // Internal function to mint NFT with dynamic metadata\n function _mintDynamicNFT(address user, uint256 tokenId, uint256 stepCount, string memory imageUrl) internal {\n string memory metadata = generateMetadata(tokenId, stepCount, imageUrl);\n\n _safeMint(user, tokenId);\n _setTokenURI(tokenId, metadata);\n\n _tokenIdCounter++;\n }\n\n // Generate metadata with dynamic attributes\n function generateMetadata(\n uint256 tokenId,\n uint256 stepCount,\n string memory imageUrl\n ) internal pure returns (string memory) {\n string memory metadata = string(\n abi.encodePacked(\n '{\"name\": \"Step Challenge NFT #',\n tokenId.toString(),\n '\",',\n '\"description\": \"Daily Step Challenge Achievement\",',\n '\"attributes\": [',\n '{\"trait_type\": \"Steps\", \"value\": \"',\n stepCount.toString(),\n '\"},',\n '{\"trait_type\": \"Goal Achieved\", \"value\": \"',\n (stepCount >= 5000 ? \"Yes\" : \"No\"),\n '\"}],\"',\n '\"image\": \"',\n imageUrl,\n '\"}'\n )\n );\n\n return string(abi.encodePacked(\"data:application/json;base64,\", Base64.encode(bytes(metadata))));\n }\n\n // Generate metadata for Daily Challenge NFT\n function generateDailyChallengeMetadata(\n uint256 tokenId,\n string memory challengeType,\n string memory description,\n string memory quirkyMessage,\n string memory imageUrl\n ) internal pure returns (string memory) {\n string memory metadata = string(\n abi.encodePacked(\n '{\"name\": \"Daily Challenge NFT #',\n tokenId.toString(),\n '\",',\n '\"description\": \"',\n description,\n '\",',\n '\"attributes\": [',\n '{\"trait_type\": \"Challenge Type\", \"value\": \"',\n challengeType,\n '\"},',\n '{\"trait_type\": \"Quirky Message\", \"value\": \"',\n quirkyMessage,\n '\"}],\"',\n '\"image\": \"',\n imageUrl,\n '\"}'\n )\n );\n\n return string(abi.encodePacked(\"data:application/json;base64,\", Base64.encode(bytes(metadata))));\n }\n\n // Allow contract to receive ETH\n receive() external payable {}\n\n // Withdraw function for contract owner\n function withdraw() external onlyOwner {\n payable(owner()).transfer(address(this).balance);\n }\n}\n" } }, "settings": { diff --git a/packages/nextjs/contracts/deployedContracts.ts b/packages/nextjs/contracts/deployedContracts.ts index 658c86b..dd02467 100644 --- a/packages/nextjs/contracts/deployedContracts.ts +++ b/packages/nextjs/contracts/deployedContracts.ts @@ -7,7 +7,7 @@ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract"; const deployedContracts = { 84532: { StepStakeDynamicNFT: { - address: "0xf809812695F341479218DAa3a8B2beEa2eC88339", + address: "0x52dE6508FECCA4d712b75b0bD018a621EaF2d734", abi: [ { inputs: [], @@ -208,6 +208,25 @@ const deployedContracts = { name: "BatchMetadataUpdate", type: "event", }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "user", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenId", + type: "uint256", + }, + ], + name: "DailyChallengeNFTMinted", + type: "event", + }, { anonymous: false, inputs: [ @@ -465,6 +484,39 @@ const deployedContracts = { stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + { + internalType: "string", + name: "challengeType", + type: "string", + }, + { + internalType: "string", + name: "description", + type: "string", + }, + { + internalType: "string", + name: "quirkyMessage", + type: "string", + }, + { + internalType: "string", + name: "imageUrl", + type: "string", + }, + ], + name: "mintDailyChallengeNFT", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, { inputs: [], name: "name",