ETH Price: $2,294.57 (-5.08%)

Transaction Decoder

Block:
15601511 at Sep-24-2022 06:45:35 AM +UTC
Transaction Fee:
0.053108882185774408 ETH $121.86
Gas Used:
9,333,862 Gas / 5.689915084 Gwei

Emitted Events:

109 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xc27BA52C...140520F0b, tokenId=1821 )
110 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xc27BA52C...140520F0b, tokenId=1823 )
111 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x80BF2A39...e6D2AAd31, tokenId=1827 )
112 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x273D066b...bc42041aA, tokenId=1829 )
113 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xD2F43E8b...00f95F5FA, tokenId=1831 )
114 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xfF54Eb52...6bBbF5a91, tokenId=1833 )
115 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xaD0E75eB...8422cAe23, tokenId=1851 )
116 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x2E1511d4...04024F0C0, tokenId=1855 )
117 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xa762507A...06f60521D, tokenId=1865 )
118 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1867 )
119 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1869 )
120 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1871 )
121 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1873 )
122 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1875 )
123 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1877 )
124 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1879 )
125 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1881 )
126 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1883 )
127 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6918beb8...a51666A4D, tokenId=1885 )
128 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8Bcb8dC9...261dC8647, tokenId=1887 )
129 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xa5967Bfd...7a321a046, tokenId=1893 )
130 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5aB167A8...8f969F84f, tokenId=1895 )
131 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5aB167A8...8f969F84f, tokenId=1897 )
132 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xBd1B251c...1632cf221, tokenId=1899 )
133 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xCF9cEf6F...997153064, tokenId=1903 )
134 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xe2268dCb...2ab157FAf, tokenId=1909 )
135 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xFa94C902...51F5B30D2, tokenId=1917 )
136 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xFa94C902...51F5B30D2, tokenId=1919 )
137 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xFa94C902...51F5B30D2, tokenId=1921 )
138 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xf20d6998...15E668A5C, tokenId=1923 )
139 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x38C4d91c...0a988f34E, tokenId=1925 )
140 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xb423f2A7...573A84c57, tokenId=1927 )
141 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8bEA722e...c3Fb27497, tokenId=1929 )
142 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xDC6C67f8...853396e57, tokenId=1931 )
143 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xFAb40d61...Cb989Fac9, tokenId=1935 )
144 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xdbcbe8ff...037E8dBEF, tokenId=1939 )
145 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5b045b3e...d478b3424, tokenId=1941 )
146 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3Bb8510f...469ce4365, tokenId=1943 )
147 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xe2048f92...e229F95f1, tokenId=1947 )
148 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xC6D72Ff6...B9a0897FC, tokenId=1949 )
149 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8D0F88CC...d280fCCCE, tokenId=1953 )
150 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x647faA4D...484D80481, tokenId=1961 )
151 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x1f9744fE...604324F56, tokenId=1963 )
152 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x548e1F81...6f33c1AC7, tokenId=1965 )
153 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xBb13C056...EfE0dF9F7, tokenId=1967 )
154 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xbDD2B318...E9345B6b4, tokenId=1969 )
155 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xb754F396...92b238ade, tokenId=1971 )
156 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x32b01e17...FD707DB8b, tokenId=1973 )
157 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xF9E2d78a...32C335Eb8, tokenId=1975 )
158 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x02BDc6D7...b32d2BBBd, tokenId=1977 )
159 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x6e49CaAb...096961fCE, tokenId=1979 )
160 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xDBcd6947...D7f323479, tokenId=1981 )
161 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x164B45a5...8cD195216, tokenId=1983 )
162 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x164B45a5...8cD195216, tokenId=1985 )
163 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x164B45a5...8cD195216, tokenId=1987 )
164 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0F954816...Fd524d6Af, tokenId=1989 )
165 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0F954816...Fd524d6Af, tokenId=1991 )
166 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0F954816...Fd524d6Af, tokenId=1993 )
167 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0F954816...Fd524d6Af, tokenId=1995 )
168 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0F954816...Fd524d6Af, tokenId=1997 )
169 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0F954816...Fd524d6Af, tokenId=1999 )
170 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x278003A1...fc78D6458, tokenId=2003 )
171 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xC0E6eA72...FEBefA489, tokenId=2007 )
172 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xC0E6eA72...FEBefA489, tokenId=2009 )
173 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8e9575fa...733953C13, tokenId=2011 )
174 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xE490ae17...424F4Ffd1, tokenId=2013 )
175 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x39d1C368...b28f842f9, tokenId=2015 )
176 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xf433C3A7...ED78F013A, tokenId=2019 )
177 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x55772Bc1...062b7FCD7, tokenId=2021 )
178 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x996b972a...22eA786A0, tokenId=2023 )
179 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x1B241635...6776bbd01, tokenId=2025 )
180 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2027 )
181 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2029 )
182 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2031 )
183 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2033 )
184 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2035 )
185 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2037 )
186 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2039 )
187 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2041 )
188 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2043 )
189 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2045 )
190 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2047 )
191 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2049 )
192 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xA031e745...0683E8381, tokenId=2051 )
193 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2053 )
194 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2055 )
195 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2057 )
196 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2059 )
197 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0e969844...74DDA8112, tokenId=2061 )
198 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2063 )
199 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x93f23A19...13AcC5c5B, tokenId=2065 )
200 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xEB175a4E...26B00034C, tokenId=2067 )
201 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xd493FeC2...dB71E1b88, tokenId=2075 )
202 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xE8b6Fe11...96962c343, tokenId=2077 )
203 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xcbAA6a10...867ECb2da, tokenId=2079 )
204 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x55772Bc1...062b7FCD7, tokenId=2083 )
205 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x9246307e...f7bAc0b7E, tokenId=2087 )
206 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x56A2B6F9...41407ecF0, tokenId=2091 )
207 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x591a6cA1...690DfDDD0, tokenId=2093 )
208 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xDBcd6947...D7f323479, tokenId=2095 )
209 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x55772Bc1...062b7FCD7, tokenId=2099 )
210 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x58E8D62b...87ce56993, tokenId=2103 )
211 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x55772Bc1...062b7FCD7, tokenId=2105 )
212 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x55772Bc1...062b7FCD7, tokenId=2107 )
213 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x55772Bc1...062b7FCD7, tokenId=2109 )
214 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xCBf08aFd...7f4a5591f, tokenId=2111 )
215 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xCBf08aFd...7f4a5591f, tokenId=2113 )
216 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x59b87fa8...8855c7DeF, tokenId=2115 )
217 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8C1e1f64...d56AdfBB6, tokenId=2117 )
218 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8e9575fa...733953C13, tokenId=2119 )
219 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x548e1F81...6f33c1AC7, tokenId=2121 )
220 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x548e1F81...6f33c1AC7, tokenId=2123 )
221 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x827F779F...f6D0c3191, tokenId=2125 )
222 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x827F779F...f6D0c3191, tokenId=2127 )
223 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xEB1fF71d...2cE09D85C, tokenId=2129 )
224 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x79907F42...633E9Bc4a, tokenId=2131 )
225 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xce942465...6253bFe75, tokenId=2133 )
226 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xe85D2Eb4...03924ce59, tokenId=2135 )
227 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8D0F88CC...d280fCCCE, tokenId=2137 )
228 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0abe1826...f17D63927, tokenId=2 )
229 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x956180c1...6258DB3d3, tokenId=4 )
230 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x956180c1...6258DB3d3, tokenId=6 )
231 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x956180c1...6258DB3d3, tokenId=8 )
232 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x56A2B6F9...41407ecF0, tokenId=14 )
233 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x56A2B6F9...41407ecF0, tokenId=16 )
234 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xc38086bc...2252D0105, tokenId=18 )
235 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x56A2B6F9...41407ecF0, tokenId=20 )
236 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xcbAA6a10...867ECb2da, tokenId=24 )
237 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3D579b3a...516aBCcaD, tokenId=26 )
238 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3D579b3a...516aBCcaD, tokenId=28 )
239 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3D579b3a...516aBCcaD, tokenId=30 )
240 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xDA1f47f8...49a7e6ded, tokenId=34 )
241 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x47a1F415...a92DCc78a, tokenId=36 )
242 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x47a1F415...a92DCc78a, tokenId=38 )
243 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x47a1F415...a92DCc78a, tokenId=40 )
244 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4E35554E...E5AAB4564, tokenId=44 )
245 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xfe08059d...a7B152f77, tokenId=46 )
246 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8e9575fa...733953C13, tokenId=50 )
247 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3BF2A508...Aa1A60E40, tokenId=56 )
248 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x55772Bc1...062b7FCD7, tokenId=58 )
249 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xbDD2B318...E9345B6b4, tokenId=62 )
250 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xbDD2B318...E9345B6b4, tokenId=66 )
251 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3b1E58c4...a6e6F6bed, tokenId=68 )
252 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3b1E58c4...a6e6F6bed, tokenId=70 )
253 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3b1E58c4...a6e6F6bed, tokenId=72 )
254 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4dD2A59A...258b3cb68, tokenId=76 )
255 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4E35554E...E5AAB4564, tokenId=78 )
256 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x3BBEDa4d...C0a02EAa7, tokenId=80 )
257 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xf5146950...622F7A763, tokenId=82 )
258 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x366377b1...5eF953a5e, tokenId=84 )
259 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xBA7c7F41...17c635512, tokenId=86 )
260 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xce942465...6253bFe75, tokenId=88 )
261 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4306Dd0c...449392d49, tokenId=90 )
262 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4306Dd0c...449392d49, tokenId=92 )
263 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4306Dd0c...449392d49, tokenId=94 )
264 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xc148E88d...037768108, tokenId=96 )
265 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xc148E88d...037768108, tokenId=98 )
266 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xc3ed24f7...1965F9131, tokenId=100 )
267 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x251EaC00...22eE20E72, tokenId=102 )
268 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xEA0795e1...DcB73A296, tokenId=104 )
269 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xEA0795e1...DcB73A296, tokenId=106 )
270 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x596d7975...1a2A573B8, tokenId=108 )
271 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xa5fe8c23...FEfa3Fa7E, tokenId=110 )
272 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x0E144090...070d5F940, tokenId=114 )
273 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x44Ca2963...D183e9Cf2, tokenId=116 )
274 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x17681601...75835114c, tokenId=118 )
275 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5BA31b06...b2DCCABE4, tokenId=122 )
276 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5BA31b06...b2DCCABE4, tokenId=124 )
277 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5BA31b06...b2DCCABE4, tokenId=126 )
278 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5BA31b06...b2DCCABE4, tokenId=128 )
279 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x5BA31b06...b2DCCABE4, tokenId=130 )
280 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x97153F61...b644Ea7E7, tokenId=132 )
281 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x97153F61...b644Ea7E7, tokenId=134 )
282 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x461bAdd7...AFC2AA589, tokenId=136 )
283 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x48a19c6B...5A0403C13, tokenId=138 )
284 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x06f23fD6...302d6dd5f, tokenId=140 )
285 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x287E1956...c6dC67fB7, tokenId=142 )
286 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xB5BFb68a...6F78C9F49, tokenId=144 )
287 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xb261e618...B74923aEf, tokenId=146 )
288 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4aD06A01...82C1628e9, tokenId=148 )
289 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4aD06A01...82C1628e9, tokenId=150 )
290 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x4aD06A01...82C1628e9, tokenId=152 )
291 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xDd1C982C...642adB305, tokenId=154 )
292 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xD2F43E8b...00f95F5FA, tokenId=156 )
293 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xD2F43E8b...00f95F5FA, tokenId=158 )
294 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xa5fe8c23...FEfa3Fa7E, tokenId=160 )
295 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xb7586CE8...56F5cbD0D, tokenId=162 )
296 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xC55551a4...9EDC95082, tokenId=164 )
297 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xfdAee6ab...Aa117F4b7, tokenId=166 )
298 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x06f23fD6...302d6dd5f, tokenId=168 )
299 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x06f23fD6...302d6dd5f, tokenId=170 )
300 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x59E99caB...c4FA6982b, tokenId=172 )
301 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x59E99caB...c4FA6982b, tokenId=174 )
302 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x253a61ab...d69539198, tokenId=176 )
303 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x281714f1...4294050D9, tokenId=178 )
304 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8afFBF7d...D6E7B05Eb, tokenId=180 )
305 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x8afFBF7d...D6E7B05Eb, tokenId=182 )
306 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x62551Ef0...238cA5E1d, tokenId=184 )
307 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0x62551Ef0...238cA5E1d, tokenId=186 )
308 DeepSeaCreatures.Transfer( from=[Sender] 0x0da99ec978b0405bbc56a19dda8ae095cd7154dc, to=0xb434a3F2...101B2f137, tokenId=192 )

Account State Difference:

  Address   Before After State Difference Code
0x0Da99ec9...5Cd7154DC
(Deep Sea Creatures: Deployer)
1.240000053238411227 Eth
Nonce: 1842
1.186891171052636819 Eth
Nonce: 1843
0.053108882185774408
0x7Cc46CF6...3b83Da761
(MEV Bot: 0x7d0...2e1)
0.06722007075843108 Eth0.07655393275843108 Eth0.009333862

Execution Trace

DeepSeaCreatures.bulkTransferFrom( from=0x0Da99ec978B0405bbc56a19DDA8Ae095Cd7154DC, addresses=[0xc27BA52C493e291FA50a8e537142dF2140520F0b, 0xc27BA52C493e291FA50a8e537142dF2140520F0b, 0x80BF2A39AA8587ec18405b990F9447fe6D2AAd31, 0x273D066bC8e57E45fD83da6b722c1B3bc42041aA, 0xD2F43E8b729Cec4868B23B45ef522F400f95F5FA, 0xfF54Eb5239c4Aee355D0faA499052eb6bBbF5a91, 0xaD0E75eBf186F49d8fB39ac775A63B08422cAe23, 0x2E1511d484761723b49C9748a65Bd1f04024F0C0, 0xa762507AF9A09DbcBC12B585b2e134706f60521D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x6918beb870533aB9738Ef1F8F6DDBE0a51666A4D, 0x8Bcb8dC9D363c2BD1F3E329071B9894261dC8647, 0xa5967BfdF95101164BD7055d81AeBB57a321a046, 0x5aB167A862A3b34E6A40B8bdc111e8B8f969F84f, 0x5aB167A862A3b34E6A40B8bdc111e8B8f969F84f, 0xBd1B251cd8976f3AD7474b29523d7091632cf221, 0xCF9cEf6F513197030018c795814dAe3997153064, 0xe2268dCb87CB93D4941e79f48fB4f982ab157FAf, 0xFa94C902871233B016e4Cb028B8Ead051F5B30D2, 0xFa94C902871233B016e4Cb028B8Ead051F5B30D2, 0xFa94C902871233B016e4Cb028B8Ead051F5B30D2, 0xf20d6998f6eAab4aB0a824e1B2F44b715E668A5C, 0x38C4d91c6C9585F035bA0770d38f0000a988f34E, 0xb423f2A7786d8fDd70aADa0d13a11Ed573A84c57, 0x8bEA722ee1FEB8027E9F66050373B7ac3Fb27497, 0xDC6C67f803a7819Cae8A39615b80243853396e57, 0xFAb40d61aAf31D87cE73E59324BEc7fCb989Fac9, 0xdbcbe8ff4C46622e45A9A3a5B6f36A9037E8dBEF, 0x5b045b3eB5293Bd614A0A00F2a2499cd478b3424, 0x3Bb8510feBeb27CE68bF2E0D0508A47469ce4365, 0xe2048f928618db4a90632aE897A0522e229F95f1, 0xC6D72Ff6202873F10d3905cd7Bbd5f5B9a0897FC, 0x8D0F88CC0f08e6d21B0cf7c3aCc90e8d280fCCCE, 0x647faA4Da0e66F4e7BC81Cb5043A8e6484D80481, 0x1f9744fEB293b52b00bC640F812F322604324F56, 0x548e1F8133ABa7918183b96d8f411ec6f33c1AC7, 0xBb13C0560C8A8354E6A914f1f2b873CEfE0dF9F7, 0xbDD2B31825fF27986F675E12ED2F994E9345B6b4, 0xb754F3962664CBB9945479eb9f3458d92b238ade, 0x32b01e179e93e519429468abC3436fbFD707DB8b, 0xF9E2d78aDD3b960E8F77539a81BEF1D32C335Eb8, 0x02BDc6D74bAef3171Bdcec459819029b32d2BBBd, 0x6e49CaAb63ca86A9FdFCD276514A64d096961fCE, 0xDBcd6947dE7bf74bC36147773dbFc03D7f323479, 0x164B45a5998C1983337CDDeF90C187E8cD195216, 0x164B45a5998C1983337CDDeF90C187E8cD195216, 0x164B45a5998C1983337CDDeF90C187E8cD195216, 0x0F9548165C4960624DEbb7e38b504E9Fd524d6Af, 0x0F9548165C4960624DEbb7e38b504E9Fd524d6Af, 0x0F9548165C4960624DEbb7e38b504E9Fd524d6Af, 0x0F9548165C4960624DEbb7e38b504E9Fd524d6Af, 0x0F9548165C4960624DEbb7e38b504E9Fd524d6Af, 0x0F9548165C4960624DEbb7e38b504E9Fd524d6Af, 0x278003A190fE984BE655eB3C69B9c33fc78D6458, 0xC0E6eA72b743E08E0653170429D4d7aFEBefA489, 0xC0E6eA72b743E08E0653170429D4d7aFEBefA489, 0x8e9575faA5Afb0c55CbE3056636e4fE733953C13, 0xE490ae17Ad1F21C3B9fb2d7a5363FA3424F4Ffd1, 0x39d1C368bd4a216499Ba25b4eAb0a9Bb28f842f9, 0xf433C3A736b6E63d3C315f39F0bA0b3ED78F013A, 0x55772Bc11A973b8faE3A248568FF8Ca062b7FCD7, 0x996b972a67E065b0932Ab9BA609755F22eA786A0, 0x1B2416353a6B71cD6B0c8291d863b376776bbd01, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0xA031e7459b3643aF95296EDa77d7D4B0683E8381, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x0e9698440B70c496Af28c5a221BBe3674DDA8112, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0x93f23A19374e6547D02478e776CF49113AcC5c5B, 0xEB175a4EeB32C647553D03A66d480d026B00034C, 0xd493FeC2246B3f0C1162A7Aef29BAf8dB71E1b88, 0xE8b6Fe11786F501823671889fdf520A96962c343, 0xcbAA6a102b62D6e75E6C69D8463f429867ECb2da, 0x55772Bc11A973b8faE3A248568FF8Ca062b7FCD7, 0x9246307e550fbd40bcB6Ce18f96c7E4f7bAc0b7E, 0x56A2B6F924324ACBFF99c872f6E2C0D41407ecF0, 0x591a6cA12f2CF8FA533a95070aA8F2a690DfDDD0, 0xDBcd6947dE7bf74bC36147773dbFc03D7f323479, 0x55772Bc11A973b8faE3A248568FF8Ca062b7FCD7, 0x58E8D62b7222de758b00810efC6859087ce56993, 0x55772Bc11A973b8faE3A248568FF8Ca062b7FCD7, 0x55772Bc11A973b8faE3A248568FF8Ca062b7FCD7, 0x55772Bc11A973b8faE3A248568FF8Ca062b7FCD7, 0xCBf08aFd8dB11E6e0b00b8a704c633C7f4a5591f, 0xCBf08aFd8dB11E6e0b00b8a704c633C7f4a5591f, 0x59b87fa89986c81baBD1d91ebBF109F8855c7DeF, 0x8C1e1f64E3eFA9a4537500D61E0d10Dd56AdfBB6, 0x8e9575faA5Afb0c55CbE3056636e4fE733953C13, 0x548e1F8133ABa7918183b96d8f411ec6f33c1AC7, 0x548e1F8133ABa7918183b96d8f411ec6f33c1AC7, 0x827F779F74cC202c48E02694Cb8d3B0f6D0c3191, 0x827F779F74cC202c48E02694Cb8d3B0f6D0c3191, 0xEB1fF71d309d8E9E1f99C7B1117baB92cE09D85C, 0x79907F422604355E6774b2B49c688bA633E9Bc4a, 0xce942465Bc45B94E85fac0ba932172b6253bFe75, 0xe85D2Eb488EDd4E3b90816a2Af8E81603924ce59, 0x8D0F88CC0f08e6d21B0cf7c3aCc90e8d280fCCCE, 0x0abe1826777A9a7f1cD4aFDdF846695f17D63927, 0x956180c1495Ffe5fa8ef13F7C732C676258DB3d3, 0x956180c1495Ffe5fa8ef13F7C732C676258DB3d3, 0x956180c1495Ffe5fa8ef13F7C732C676258DB3d3, 0x56A2B6F924324ACBFF99c872f6E2C0D41407ecF0, 0x56A2B6F924324ACBFF99c872f6E2C0D41407ecF0, 0xc38086bcaCd96e8e6471844b186A62d2252D0105, 0x56A2B6F924324ACBFF99c872f6E2C0D41407ecF0, 0xcbAA6a102b62D6e75E6C69D8463f429867ECb2da, 0x3D579b3a72Ce12f99A14a75DC14A7d6516aBCcaD, 0x3D579b3a72Ce12f99A14a75DC14A7d6516aBCcaD, 0x3D579b3a72Ce12f99A14a75DC14A7d6516aBCcaD, 0xDA1f47f8442041853C5eA39a9f7B97449a7e6ded, 0x47a1F4156b955E746F6C4D76d8664B4a92DCc78a, 0x47a1F4156b955E746F6C4D76d8664B4a92DCc78a, 0x47a1F4156b955E746F6C4D76d8664B4a92DCc78a, 0x4E35554E4065d9c8352CB076FB4B2e0E5AAB4564, 0xfe08059dBa9db9C4133d3fb99150B42a7B152f77, 0x8e9575faA5Afb0c55CbE3056636e4fE733953C13, 0x3BF2A508bb66Bf739EBa9058f434B24Aa1A60E40, 0x55772Bc11A973b8faE3A248568FF8Ca062b7FCD7, 0xbDD2B31825fF27986F675E12ED2F994E9345B6b4, 0xbDD2B31825fF27986F675E12ED2F994E9345B6b4, 0x3b1E58c4a9124dc19065d6f6EC30261a6e6F6bed, 0x3b1E58c4a9124dc19065d6f6EC30261a6e6F6bed, 0x3b1E58c4a9124dc19065d6f6EC30261a6e6F6bed, 0x4dD2A59Ad0ccEe73B72be69d89Ca73E258b3cb68, 0x4E35554E4065d9c8352CB076FB4B2e0E5AAB4564, 0x3BBEDa4dd5DcE087C27Ae8323997e83C0a02EAa7, 0xf5146950d99515Cc525A3BD4e7B9cec622F7A763, 0x366377b1963C815acE6D1E6F52c1c705eF953a5e, 0xBA7c7F41fAd4D3815d69B6Fce33855317c635512, 0xce942465Bc45B94E85fac0ba932172b6253bFe75, 0x4306Dd0c18b58e34E587003841d736A449392d49, 0x4306Dd0c18b58e34E587003841d736A449392d49, 0x4306Dd0c18b58e34E587003841d736A449392d49, 0xc148E88d31c32225379b5caEb9D6669037768108, 0xc148E88d31c32225379b5caEb9D6669037768108, 0xc3ed24f7c43970c9d4dbc65BF2d77E81965F9131, 0x251EaC00018f407723F663B418879FE22eE20E72, 0xEA0795e1209d9e8f9AADEDD76162912DcB73A296, 0xEA0795e1209d9e8f9AADEDD76162912DcB73A296, 0x596d79752803156362fF8515D22D73A1a2A573B8, 0xa5fe8c23b853Edb652B415d52f1cD9dFEfa3Fa7E, 0x0E14409004703a9363B308260C63a1f070d5F940, 0x44Ca29633FfF332c57676a66c70f60DD183e9Cf2, 0x17681601b21aF0920753935D3EDAa0b75835114c, 0x5BA31b0653642C9aA2379d6a67bC452b2DCCABE4, 0x5BA31b0653642C9aA2379d6a67bC452b2DCCABE4, 0x5BA31b0653642C9aA2379d6a67bC452b2DCCABE4, 0x5BA31b0653642C9aA2379d6a67bC452b2DCCABE4, 0x5BA31b0653642C9aA2379d6a67bC452b2DCCABE4, 0x97153F61d3Fdb5e04B6617678Eda36db644Ea7E7, 0x97153F61d3Fdb5e04B6617678Eda36db644Ea7E7, 0x461bAdd7380DD032E21A4aac36A4f09AFC2AA589, 0x48a19c6B158491325E84c8837ED8Ba95A0403C13, 0x06f23fD6ba324b2Cec508F19BA06519302d6dd5f, 0x287E195639AB5110817e6799E3E1a91c6dC67fB7, 0xB5BFb68aF63Fd849ba18383FDB2477E6F78C9F49, 0xb261e618A2b8468A2353B8CF8B765BfB74923aEf, 0x4aD06A01C14cB8CF20E49Fc53c647b882C1628e9, 0x4aD06A01C14cB8CF20E49Fc53c647b882C1628e9, 0x4aD06A01C14cB8CF20E49Fc53c647b882C1628e9, 0xDd1C982C2169485136D0349DF562494642adB305, 0xD2F43E8b729Cec4868B23B45ef522F400f95F5FA, 0xD2F43E8b729Cec4868B23B45ef522F400f95F5FA, 0xa5fe8c23b853Edb652B415d52f1cD9dFEfa3Fa7E, 0xb7586CE8B03E9C24848Dd89644b36E056F5cbD0D, 0xC55551a44629A77155Ba79d01a941489EDC95082, 0xfdAee6ab7117C152Ed8205443096793Aa117F4b7, 0x06f23fD6ba324b2Cec508F19BA06519302d6dd5f, 0x06f23fD6ba324b2Cec508F19BA06519302d6dd5f, 0x59E99caBBdbCB2863c38bF3107E580ac4FA6982b, 0x59E99caBBdbCB2863c38bF3107E580ac4FA6982b, 0x253a61ab118E8C3f0c8f0BFE1403e3Cd69539198, 0x281714f1958245Ce900cc1Be022DfDF4294050D9, 0x8afFBF7d6A37B7e16fA8eC45d3619F7D6E7B05Eb, 0x8afFBF7d6A37B7e16fA8eC45d3619F7D6E7B05Eb, 0x62551Ef05A2BC568D83C5646734d234238cA5E1d, 0x62551Ef05A2BC568D83C5646734d234238cA5E1d, 0xb434a3F2a0F0DAA5d5fdEdd81179714101B2f137], tokenIds=[1821, 1823, 1827, 1829, 1831, 1833, 1851, 1855, 1865, 1867, 1869, 1871, 1873, 1875, 1877, 1879, 1881, 1883, 1885, 1887, 1893, 1895, 1897, 1899, 1903, 1909, 1917, 1919, 1921, 1923, 1925, 1927, 1929, 1931, 1935, 1939, 1941, 1943, 1947, 1949, 1953, 1961, 1963, 1965, 1967, 1969, 1971, 1973, 1975, 1977, 1979, 1981, 1983, 1985, 1987, 1989, 1991, 1993, 1995, 1997, 1999, 2003, 2007, 2009, 2011, 2013, 2015, 2019, 2021, 2023, 2025, 2027, 2029, 2031, 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 2063, 2065, 2067, 2075, 2077, 2079, 2083, 2087, 2091, 2093, 2095, 2099, 2103, 2105, 2107, 2109, 2111, 2113, 2115, 2117, 2119, 2121, 2123, 2125, 2127, 2129, 2131, 2133, 2135, 2137, 2, 4, 6, 8, 14, 16, 18, 20, 24, 26, 28, 30, 34, 36, 38, 40, 44, 46, 50, 56, 58, 62, 66, 68, 70, 72, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 192] )
// SPDX-License-Identifier: MIT
///////////////////////////
// Developed by Hirshey //
/////////////////////////
pragma solidity ^0.8.4;
import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract DeepSeaCreatures is ERC721A, Ownable {
    uint256 public immutable maxSupply = 10000;
    
    IERC20 public immutable baitToken = IERC20(0x77BD077fFFe51EdFC4913Ee50506a3e59063bbEa);
    IERC721 public immutable fishyFamContract = IERC721(0x63FA29Fec10C997851CCd2466Dad20E51B17C8aF);
    string private _baseTokenURI;
    bool private isMintable;
    bool private isBurnable;
    constructor(
      string memory baseURI,
      bool _isMintable,
      bool _isBurnable
    ) ERC721A("Deep Sea Creatures", "DSC") {
      _baseTokenURI = baseURI;
      isMintable = _isMintable;
      isBurnable = _isBurnable;
    }
    function devMint(address _address, uint256 quantity) external onlyOwner {
      require(isMintable, "minting is not enabled");
      require(totalSupply() + quantity <= maxSupply, "Max supply reached");
      _mint(_address, quantity);
    }
    function mint(uint256 quantity) external {
        require(
            fishyFamContract.balanceOf(msg.sender) > 0,
            "You do not own any Fishy Fam NFTs"
        );
        require(
            baitToken.transferFrom(msg.sender, address(this), quantity * 1e18),
            "Bait token transfer failed"
        );
        require(totalSupply() + quantity <= maxSupply, "reached max supply");
        require(isMintable, "minting is not enabled");
        _mint(msg.sender, quantity);
    }
    function setMintable(bool _isMintable) external onlyOwner {
        isMintable = _isMintable;
    }
    function setBurnable(bool _isBurnable) external onlyOwner {
        isBurnable = _isBurnable;
    }
    
    //burn by tokenId
    function burn(uint256 tokenId) external {
        require(isBurnable, "burning is not enabled");
        _burn(tokenId, true);
        //transfer back 0.5 BAIT to user for burning
        baitToken.transfer(msg.sender, 0.5e18);
    }
    //bulk burn by tokenId
    function bulkBurn(uint256[] calldata tokenIds) external {
        require(isBurnable, "burning is not enabled");
        for (uint256 i; i < tokenIds.length;) {
            _burn(tokenIds[i], true);
            unchecked { i++; }
        }
        //transfer back 0.5 BAIT to user for burning
        baitToken.transfer(msg.sender, 0.5e18 * tokenIds.length);
    }
    //bulk transferFrom
    function bulkTransferFrom(address from, address[] calldata addresses, uint256[] calldata tokenIds) external {
        for (uint256 i; i < tokenIds.length;) {
            transferFrom(from, addresses[i], tokenIds[i]);
            unchecked { i++; }
        }
    }
    // metadata URI
    function _baseURI() internal view virtual override returns (string memory) {
      return _baseTokenURI;
    }
    function setBaseURI(string calldata baseURI) external onlyOwner {
      _baseTokenURI = baseURI;
    }
}// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();
    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();
    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();
    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();
    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();
    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();
    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();
    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();
    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();
    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();
    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();
    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();
    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();
    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();
    // =============================================================
    //                            STRUCTS
    // =============================================================
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }
    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================
    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);
    // =============================================================
    //                            IERC165
    // =============================================================
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
    // =============================================================
    //                            IERC721
    // =============================================================
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    // =============================================================
    //                        IERC721Metadata
    // =============================================================
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);
    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);
    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
    // =============================================================
    //                           IERC2309
    // =============================================================
    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs
pragma solidity ^0.8.4;
import './IERC721A.sol';
/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }
    // =============================================================
    //                           CONSTANTS
    // =============================================================
    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;
    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;
    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;
    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;
    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;
    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;
    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;
    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;
    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;
    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;
    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;
    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
    // =============================================================
    //                            STORAGE
    // =============================================================
    // The next token ID to be minted.
    uint256 private _currentIndex;
    // The number of tokens burned.
    uint256 private _burnCounter;
    // Token name
    string private _name;
    // Token symbol
    string private _symbol;
    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;
    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;
    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;
    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }
    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================
    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }
    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }
    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }
    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }
    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }
    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================
    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }
    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }
    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }
    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }
    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }
    // =============================================================
    //                            IERC165
    // =============================================================
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }
    // =============================================================
    //                        IERC721Metadata
    // =============================================================
    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }
    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }
    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }
    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }
    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }
    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }
    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;
        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }
    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }
    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }
    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }
    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }
        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
        return _tokenApprovals[tokenId].value;
    }
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }
    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }
    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }
    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================
    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();
        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();
        _beforeTokenTransfers(from, to, tokenId, 1);
        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.
            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );
            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }
    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }
    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }
    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================
    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();
        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );
            uint256 toMasked;
            uint256 end = startTokenId + quantity;
            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();
            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }
    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();
        _beforeTokenTransfers(address(0), to, startTokenId, quantity);
        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);
            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );
            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);
            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }
    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);
        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }
    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }
    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================
    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, true);
    }
    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);
        address from = address(uint160(prevOwnershipPacked));
        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);
        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }
        _beforeTokenTransfers(from, address(0), tokenId, 1);
        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;
            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );
            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }
        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);
        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }
    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================
    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }
    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}
    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }
    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================
    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }
    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)
            // Cache the end of the memory to calculate the length later.
            let end := str
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }
            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;
    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;
    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);
    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);
    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);
    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);
    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);
    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }
    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}