Transaction Hash:
Block:
19633969 at Apr-11-2024 05:48:59 PM +UTC
Transaction Fee:
0.08667797494804266 ETH
$239.71
Gas Used:
3,572,945 Gas / 24.259532388 Gwei
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x03ac0a08...793E572c8 |
0 Eth
Nonce: 0
|
0.0239 Eth
Nonce: 0
| 0.0239 | ||
0x0489Dd2b...694FBc959 |
0 Eth
Nonce: 0
|
0.0211 Eth
Nonce: 0
| 0.0211 | ||
0x06879800...B36930341 |
0 Eth
Nonce: 0
|
0.02672 Eth
Nonce: 0
| 0.02672 | ||
0x0765428C...CB515Bdc5 |
0 Eth
Nonce: 0
|
0.02286 Eth
Nonce: 0
| 0.02286 | ||
0x09AF9CFF...a8BE6bF66 |
0 Eth
Nonce: 0
|
0.0276 Eth
Nonce: 0
| 0.0276 | ||
0x0C3D35a6...759d843f2 |
0 Eth
Nonce: 0
|
0.02332 Eth
Nonce: 0
| 0.02332 | ||
0x0ceEf475...2a496D666 |
0 Eth
Nonce: 0
|
0.0296 Eth
Nonce: 0
| 0.0296 | ||
0x102338E5...11D963346 |
0 Eth
Nonce: 0
|
0.0253 Eth
Nonce: 0
| 0.0253 | ||
0x12Ec3Aa0...1414B68Bf |
0 Eth
Nonce: 0
|
0.0264 Eth
Nonce: 0
| 0.0264 | ||
0x15c2e488...49d447481 |
0 Eth
Nonce: 0
|
0.02528 Eth
Nonce: 0
| 0.02528 | ||
0x15D1e6D9...F956c1a83 |
13.576033985036659963 Eth
Nonce: 5
|
8.512336010088617303 Eth
Nonce: 6
| 5.06369797494804266 | ||
0x161b8857...2F75e2C8d |
0 Eth
Nonce: 0
|
0.02796 Eth
Nonce: 0
| 0.02796 | ||
0x1712845A...2A3770d82 |
0 Eth
Nonce: 0
|
0.02872 Eth
Nonce: 0
| 0.02872 | ||
0x17789223...16dC6AA84 |
0 Eth
Nonce: 0
|
0.02446 Eth
Nonce: 0
| 0.02446 | ||
0x1aA8677F...a16aBe256 |
0 Eth
Nonce: 0
|
0.02346 Eth
Nonce: 0
| 0.02346 | ||
0x1f9090aa...8e676c326
Miner
| 5.798588023751057697 Eth | 5.805406235570809947 Eth | 0.00681821181975225 | ||
0x2115deE7...2F582BF9C |
0 Eth
Nonce: 0
|
0.02242 Eth
Nonce: 0
| 0.02242 | ||
0x28070821...0C9e8E63C | 0 Eth | 2.44762 Eth | 2.44762 | ||
0x2998a3DC...FbD7dc8ea |
0 Eth
Nonce: 0
|
0.02142 Eth
Nonce: 0
| 0.02142 | ||
0x2ac0B9D2...ebd26f99D |
0 Eth
Nonce: 0
|
0.0277 Eth
Nonce: 0
| 0.0277 | ||
0x2ADB3ee7...6AebF19c7 |
0 Eth
Nonce: 0
|
0.022 Eth
Nonce: 0
| 0.022 | ||
0x2D8e6Eff...791752CBb |
0 Eth
Nonce: 0
|
0.02668 Eth
Nonce: 0
| 0.02668 | ||
0x2E63dB88...269c893D0 |
0 Eth
Nonce: 0
|
0.02844 Eth
Nonce: 0
| 0.02844 | ||
0x2f7ed818...caaC51652 |
0 Eth
Nonce: 0
|
0.0273 Eth
Nonce: 0
| 0.0273 | ||
0x30dEBa55...52bc5f9aF |
0 Eth
Nonce: 0
|
0.02314 Eth
Nonce: 0
| 0.02314 | ||
0x3123C0ae...2b1f6A9da |
0 Eth
Nonce: 0
|
0.02472 Eth
Nonce: 0
| 0.02472 | ||
0x33f47521...433fdbFb2 |
0 Eth
Nonce: 0
|
0.02758 Eth
Nonce: 0
| 0.02758 | ||
0x3a91BC69...7396a024a |
0 Eth
Nonce: 0
|
0.0258 Eth
Nonce: 0
| 0.0258 | ||
0x3c067f01...a68E5ab25 |
0 Eth
Nonce: 0
|
0.02314 Eth
Nonce: 0
| 0.02314 | ||
0x3C473a65...7B6bE2bDb |
0 Eth
Nonce: 0
|
0.02744 Eth
Nonce: 0
| 0.02744 | ||
0x4063827b...61561F996 |
0 Eth
Nonce: 0
|
0.02072 Eth
Nonce: 0
| 0.02072 | ||
0x4195ad5C...f2d2f4cd1 |
0 Eth
Nonce: 0
|
0.02288 Eth
Nonce: 0
| 0.02288 | ||
0x453b63e8...F7EB40F79 |
0 Eth
Nonce: 0
|
0.0273 Eth
Nonce: 0
| 0.0273 | ||
0x4690F640...512108BdF |
0 Eth
Nonce: 0
|
0.02354 Eth
Nonce: 0
| 0.02354 | ||
0x49f91922...374b952fa |
0 Eth
Nonce: 0
|
0.02988 Eth
Nonce: 0
| 0.02988 | ||
0x4a3c505B...9585c9D6A |
0 Eth
Nonce: 0
|
0.0234 Eth
Nonce: 0
| 0.0234 | ||
0x4b8641eC...822381b6E |
0 Eth
Nonce: 0
|
0.02994 Eth
Nonce: 0
| 0.02994 | ||
0x4D4d540b...ac122A817 |
0 Eth
Nonce: 0
|
0.02316 Eth
Nonce: 0
| 0.02316 | ||
0x512978f2...8C11dfEF0 |
0 Eth
Nonce: 0
|
0.0218 Eth
Nonce: 0
| 0.0218 | ||
0x5400B11d...D4656b223 |
0 Eth
Nonce: 0
|
0.02906 Eth
Nonce: 0
| 0.02906 | ||
0x54a2BC62...620261521 |
0 Eth
Nonce: 0
|
0.02462 Eth
Nonce: 0
| 0.02462 | ||
0x56FB451E...C7e193BEC |
0 Eth
Nonce: 0
|
0.02852 Eth
Nonce: 0
| 0.02852 | ||
0x5f683aA1...42fe1C11E |
0 Eth
Nonce: 0
|
0.024 Eth
Nonce: 0
| 0.024 | ||
0x62c02D7E...a2622a95B |
0 Eth
Nonce: 0
|
0.02716 Eth
Nonce: 0
| 0.02716 | ||
0x62f10f1b...5019b6cD0 |
0 Eth
Nonce: 0
|
0.02676 Eth
Nonce: 0
| 0.02676 | ||
0x6B2b0B6A...380b7937D |
0 Eth
Nonce: 0
|
0.02438 Eth
Nonce: 0
| 0.02438 | ||
0x75A303b8...eF3eFED55 |
0 Eth
Nonce: 0
|
0.0232 Eth
Nonce: 0
| 0.0232 | ||
0x76D305d6...3bebCf188 |
0 Eth
Nonce: 0
|
0.02948 Eth
Nonce: 0
| 0.02948 | ||
0x78a29EAf...7341741F8 |
0 Eth
Nonce: 0
|
0.02296 Eth
Nonce: 0
| 0.02296 | ||
0x7b2DB6C7...77cfd0aC5 |
0 Eth
Nonce: 0
|
0.02122 Eth
Nonce: 0
| 0.02122 | ||
0x7b4d12a0...45174DCF4 |
0 Eth
Nonce: 0
|
0.02996 Eth
Nonce: 0
| 0.02996 | ||
0x7e7aCB28...75d5935fe |
0 Eth
Nonce: 0
|
0.02372 Eth
Nonce: 0
| 0.02372 | ||
0x804eE8BB...fDd1A9B1E |
0 Eth
Nonce: 0
|
0.02446 Eth
Nonce: 0
| 0.02446 | ||
0x819b0E86...22782d873 |
0 Eth
Nonce: 0
|
0.02528 Eth
Nonce: 0
| 0.02528 | ||
0x82977101...6E7aF3736 |
0 Eth
Nonce: 0
|
0.02242 Eth
Nonce: 0
| 0.02242 | ||
0x85392299...35757c700 |
0 Eth
Nonce: 0
|
0.02534 Eth
Nonce: 0
| 0.02534 | ||
0x885ba670...AefE45167 |
0 Eth
Nonce: 0
|
0.02482 Eth
Nonce: 0
| 0.02482 | ||
0x88876a31...54f03fa71 |
0 Eth
Nonce: 0
|
0.02796 Eth
Nonce: 0
| 0.02796 | ||
0x89551D8b...38AF4ED8a |
0 Eth
Nonce: 0
|
0.02174 Eth
Nonce: 0
| 0.02174 | ||
0x8B7e1016...911163E63 |
0 Eth
Nonce: 0
|
0.02908 Eth
Nonce: 0
| 0.02908 | ||
0x8c3A680B...46231bc84 |
0 Eth
Nonce: 0
|
0.02958 Eth
Nonce: 0
| 0.02958 | ||
0x8e482a76...5770B3757 |
0 Eth
Nonce: 0
|
0.02758 Eth
Nonce: 0
| 0.02758 | ||
0x96655209...9E2393c75 |
0 Eth
Nonce: 0
|
0.02298 Eth
Nonce: 0
| 0.02298 | ||
0x98be9417...2E0ef7866 |
0 Eth
Nonce: 0
|
0.02238 Eth
Nonce: 0
| 0.02238 | ||
0x99d51af6...763d9d091 |
0 Eth
Nonce: 0
|
0.0228 Eth
Nonce: 0
| 0.0228 | ||
0x9F55F3D2...DfA5bd353 |
0 Eth
Nonce: 0
|
0.0221 Eth
Nonce: 0
| 0.0221 | ||
0xa08d78bE...716B65E37 |
0 Eth
Nonce: 0
|
0.02816 Eth
Nonce: 0
| 0.02816 | ||
0xa1e3AB23...63AB6902b |
0 Eth
Nonce: 0
|
0.02684 Eth
Nonce: 0
| 0.02684 | ||
0xa392fbb1...e0271a1ca |
0 Eth
Nonce: 0
|
0.02366 Eth
Nonce: 0
| 0.02366 | ||
0xA87EfDD8...7eF09e58D |
0 Eth
Nonce: 0
|
0.02222 Eth
Nonce: 0
| 0.02222 | ||
0xa884De9A...826E73dBf |
0 Eth
Nonce: 0
|
0.02768 Eth
Nonce: 0
| 0.02768 | ||
0xb3cD6E25...384C5AC42 |
0 Eth
Nonce: 0
|
0.02718 Eth
Nonce: 0
| 0.02718 | ||
0xb49c8BD0...9d0558b14 |
0 Eth
Nonce: 0
|
0.0218 Eth
Nonce: 0
| 0.0218 | ||
0xb50Dc670...003a1c605 |
0 Eth
Nonce: 0
|
0.0298 Eth
Nonce: 0
| 0.0298 | ||
0xB76CDB89...9fF1b254a |
0 Eth
Nonce: 0
|
0.02668 Eth
Nonce: 0
| 0.02668 | ||
0xBA007e75...05b0E4f45 |
0 Eth
Nonce: 0
|
0.02496 Eth
Nonce: 0
| 0.02496 | ||
0xC145fe84...DA61ea0c6 |
0 Eth
Nonce: 0
|
0.02152 Eth
Nonce: 0
| 0.02152 | ||
0xC43CF313...e82043b51 |
0 Eth
Nonce: 0
|
0.0295 Eth
Nonce: 0
| 0.0295 | ||
0xce544f8F...16f2a7C94 |
0 Eth
Nonce: 0
|
0.02028 Eth
Nonce: 0
| 0.02028 | ||
0xD082Ba56...801a1BFE0 |
0 Eth
Nonce: 0
|
0.02234 Eth
Nonce: 0
| 0.02234 | ||
0xd3A0a97c...E94681F89 |
0 Eth
Nonce: 0
|
0.02946 Eth
Nonce: 0
| 0.02946 | ||
0xD5aC62BA...ab5b3B797 |
0 Eth
Nonce: 0
|
0.02812 Eth
Nonce: 0
| 0.02812 | ||
0xD5Ad9cF0...f53cAAD17 |
0 Eth
Nonce: 0
|
0.02778 Eth
Nonce: 0
| 0.02778 | ||
0xd6e1cf72...1848682fb |
0 Eth
Nonce: 0
|
0.02144 Eth
Nonce: 0
| 0.02144 | ||
0xDA1b4429...5aE6cAa65 |
0 Eth
Nonce: 0
|
0.0212 Eth
Nonce: 0
| 0.0212 | ||
0xDaa18D8d...4066BdA68 |
0 Eth
Nonce: 0
|
0.0273 Eth
Nonce: 0
| 0.0273 | ||
0xDb9cF8Fb...4F8F53ade |
0 Eth
Nonce: 0
|
0.02548 Eth
Nonce: 0
| 0.02548 | ||
0xdcD3298B...Bac3e4780 |
0 Eth
Nonce: 0
|
0.02356 Eth
Nonce: 0
| 0.02356 | ||
0xDd32a7ef...1F4D6eE3A |
0 Eth
Nonce: 0
|
0.0258 Eth
Nonce: 0
| 0.0258 | ||
0xDDe63E6E...fA4347e69 |
0 Eth
Nonce: 0
|
0.02368 Eth
Nonce: 0
| 0.02368 | ||
0xe32DA9b1...e6a489aD7 |
0 Eth
Nonce: 0
|
0.02334 Eth
Nonce: 0
| 0.02334 | ||
0xE78a43A1...9726A9dE9 |
0 Eth
Nonce: 0
|
0.02038 Eth
Nonce: 0
| 0.02038 | ||
0xeCe9E6FC...1E225a301 |
0 Eth
Nonce: 0
|
0.0249 Eth
Nonce: 0
| 0.0249 | ||
0xEE472fcE...4729DA988 |
0 Eth
Nonce: 0
|
0.02716 Eth
Nonce: 0
| 0.02716 | ||
0xEf09Bf7c...BE8253EA7 |
0 Eth
Nonce: 0
|
0.02972 Eth
Nonce: 0
| 0.02972 | ||
0xEF683B3c...2dA76a0B4 |
0 Eth
Nonce: 0
|
0.02736 Eth
Nonce: 0
| 0.02736 | ||
0xF1226D1A...510D07e0E |
0 Eth
Nonce: 0
|
0.02918 Eth
Nonce: 0
| 0.02918 | ||
0xf24cA4DC...d4A22d6B8 |
0 Eth
Nonce: 0
|
0.02826 Eth
Nonce: 0
| 0.02826 | ||
0xf2AaEC42...65102f819 |
0 Eth
Nonce: 0
|
0.02232 Eth
Nonce: 0
| 0.02232 | ||
0xf5944A50...ed8cF6eE2 |
0 Eth
Nonce: 0
|
0.02314 Eth
Nonce: 0
| 0.02314 | ||
0xfcB71e89...87C68287D |
0 Eth
Nonce: 0
|
0.02948 Eth
Nonce: 0
| 0.02948 | ||
0xFF0f956D...9A0E21c7C |
0 Eth
Nonce: 0
|
0.02112 Eth
Nonce: 0
| 0.02112 | ||
0xffE808af...75aA6736A |
0 Eth
Nonce: 0
|
0.02596 Eth
Nonce: 0
| 0.02596 |
Execution Trace
ETH 4.97702
ERC1967Proxy.fcf6b22d( )
ETH 4.97702
0xb576029c76002935c201310ad2efbfad8521e1a4.fcf6b22d( )
- ETH 0.02482
0x885ba670ae996e4933ff1bc8b903decaefe45167.CALL( )
- ETH 0.02038
0xe78a43a1a035c0da643d8e0bb001f8e9726a9de9.CALL( )
- ETH 0.0264
0x12ec3aa0cb2defdabbfd37abf23c6921414b68bf.CALL( )
- ETH 0.02242
0x829771013a6bc6bb3e4e9b5a79b1c586e7af3736.CALL( )
- ETH 0.02596
0xffe808afff9d43e34477954600917ec75aa6736a.CALL( )
- ETH 0.02366
0xa392fbb11dc310be694af546d89fea6e0271a1ca.CALL( )
- ETH 0.02958
0x8c3a680b16e59efa68eb043a7fdd4b946231bc84.CALL( )
- ETH 0.0239
0x03ac0a081e6a85c5c8624048d974ff9793e572c8.CALL( )
- ETH 0.0276
0x09af9cff7a9e26a38426fffea86bcf9a8be6bf66.CALL( )
- ETH 0.02758
0x33f475216fbfbc3e25fbbdb654b0cc8433fdbfb2.CALL( )
- ETH 0.02356
0xdcd3298b00a8a172ec23486742b76babac3e4780.CALL( )
- ETH 0.0211
0x0489dd2bce6dd4ed0034ed72261194a694fbc959.CALL( )
- ETH 0.02314
0x30deba55611da6931019dfc1465bdc052bc5f9af.CALL( )
- ETH 0.0249
0xece9e6fcfbb752b2347db3f77a854e81e225a301.CALL( )
- ETH 0.02286
0x0765428c780fb2d749888bc625b0b0ccb515bdc5.CALL( )
- ETH 0.02372
0x7e7acb287b924aa90bed596b3b8a52c75d5935fe.CALL( )
- ETH 0.0298
0xb50dc6702a21c4d3f43aa4ab676909b003a1c605.CALL( )
- ETH 0.02222
0xa87efdd810d86bd6de88c4977ad368e7ef09e58d.CALL( )
- ETH 0.02232
0xf2aaec42dcac8e8d77fea9e329b44f465102f819.CALL( )
- ETH 0.02122
0x7b2db6c76e458e3851d332a5c395f9d77cfd0ac5.CALL( )
- ETH 0.02472
0x3123c0ae0605b74b9164788bc5cf4f62b1f6a9da.CALL( )
- ETH 0.02796
0x88876a31a6c587c5fd84c9bddd5f84354f03fa71.CALL( )
- ETH 0.02826
0xf24ca4dc3140067d380697792c25356d4a22d6b8.CALL( )
- ETH 0.02112
0xff0f956d9d0aabd5926347ff1af93569a0e21c7c.CALL( )
- ETH 0.02796
0x161b8857578c7ec881cfd741af1f2762f75e2c8d.CALL( )
- ETH 0.02354
0x4690f64070aaf7adf078e8921256629512108bdf.CALL( )
- ETH 0.02152
0xc145fe84d70876515ba149531bd9ba6da61ea0c6.CALL( )
- ETH 0.02996
0x7b4d12a0c15a91695dbd0035948ea8145174dcf4.CALL( )
- ETH 0.0273
0x453b63e86408cae615b4934bb48a5dcf7eb40f79.CALL( )
- ETH 0.02852
0x56fb451eb57fd252e98aaa124f67baec7e193bec.CALL( )
- ETH 0.0253
0x102338e5c090465a283fb9e7043b0fd11d963346.CALL( )
- ETH 0.02144
0xd6e1cf72ef0e17a32f6b529acf578da1848682fb.CALL( )
- ETH 0.02668
0xb76cdb89600e90ee95a0328f3576ebc9ff1b254a.CALL( )
- ETH 0.02844
0x2e63db8846c0e36dbdf1e8dade91c5f269c893d0.CALL( )
- ETH 0.02316
0x4d4d540b191076cac3e79579f0be3faac122a817.CALL( )
- ETH 0.02238
0x98be9417a67cbd9645ba717e2e3e42c2e0ef7866.CALL( )
- ETH 0.02314
0xf5944a509859e4808f7b2358da52e84ed8cf6ee2.CALL( )
- ETH 0.0258
0x3a91bc69a53fe6e1aded8c183ededc77396a024a.CALL( )
- ETH 0.02528
0x819b0e86579951d692b1b57d264b31322782d873.CALL( )
- ETH 0.02072
0x4063827bf334465096fb0574624ccc361561f996.CALL( )
- ETH 0.02988
0x49f91922a560f9cdb7cece5e8d72556374b952fa.CALL( )
- ETH 0.0218
0x512978f25c26d96a014c1c8b61975018c11dfef0.CALL( )
- ETH 0.02142
0x2998a3dc50ac2a3768444076128229ffbd7dc8ea.CALL( )
- ETH 0.0273
0xdaa18d8dea4fda885e9dd8d84cfd1134066bda68.CALL( )
- ETH 0.022
0x2adb3ee72f0508ef47a41ac89c24e246aebf19c7.CALL( )
- ETH 0.02684
0xa1e3ab236fbbea4bb22a11b8c66cb0263ab6902b.CALL( )
- ETH 0.02548
0xdb9cf8fbdcfc8cc8068cace9cca0cf24f8f53ade.CALL( )
- ETH 0.02948
0xfcb71e89a88663a11a31371b1f2fdd987c68287d.CALL( )
- ETH 0.0295
0xc43cf3131e82f7f99d2ee1758d8b031e82043b51.CALL( )
- ETH 0.02496
0xba007e75415b3288dbb37925bcc0a5605b0e4f45.CALL( )
- ETH 0.02368
0xdde63e6e0158c1dfe690c6a5f79da8ffa4347e69.CALL( )
- ETH 0.02668
0x2d8e6effe1d1db3defd24c57295eef8791752cbb.CALL( )
- ETH 0.02446
0x804ee8bbeccbb908ffef84fb127745bfdd1a9b1e.CALL( )
- ETH 0.024
0x5f683aa15e4ef9e332e0e0a4bb91e8c42fe1c11e.CALL( )
- ETH 0.02768
0xa884de9a91102178fe8ebff2bb98a92826e73dbf.CALL( )
- ETH 0.0273
0x2f7ed8185df43d1316f6689201fd62acaac51652.CALL( )
- ETH 0.02334
0xe32da9b1f2f08c1bf645772e875e917e6a489ad7.CALL( )
- ETH 0.02676
0x62f10f1b9dd8abb5db297177cb0a1305019b6cd0.CALL( )
- ETH 0.02736
0xef683b3cfd5b749641d8888bc4853702da76a0b4.CALL( )
- ETH 0.02812
0xd5ac62bada6dd0f505f3a28222b8a8bab5b3b797.CALL( )
- ETH 0.02534
0x8539229974795ca24ccc0c57e6b8ac735757c700.CALL( )
- ETH 0.0212
0xda1b4429146c142d72667b832a49c195ae6caa65.CALL( )
- ETH 0.02918
0xf1226d1ac5bfa6e66dc63f772cc9b39510d07e0e.CALL( )
- ETH 0.02758
0x8e482a76b5cf0460e70e23b315ceb865770b3757.CALL( )
- ETH 0.0296
0x0ceef475156d715e0150f31a7629ee42a496d666.CALL( )
- ETH 0.02528
0x15c2e488c80efacfc8f71e858e5c21649d447481.CALL( )
- ETH 0.02672
0x068798005cb9a8ed98978be9c9b48abb36930341.CALL( )
- ETH 0.02718
0xb3cd6e256db0042eb5d40826a36fb2c384c5ac42.CALL( )
- ETH 0.02242
0x2115dee7829ba3fe3f51230423508562f582bf9c.CALL( )
- ETH 0.02446
0x17789223d967ac17725c6fa3de5065916dc6aa84.CALL( )
- ETH 0.02716
0x62c02d7e5b85d23596f19886ad967e8a2622a95b.CALL( )
- ETH 0.02744
0x3c473a6520ad6868fe484c751bcbda57b6be2bdb.CALL( )
- ETH 0.02234
0xd082ba568ba3ecbbd7f94bc3c44ae35801a1bfe0.CALL( )
- ETH 0.0234
0x4a3c505bc73c83867ac6e0c769a164a9585c9d6a.CALL( )
- ETH 0.02028
0xce544f8fad12be521b553027462847d16f2a7c94.CALL( )
- ETH 0.0218
0xb49c8bd0bc307d1a4c6255c9024852e9d0558b14.CALL( )
- ETH 0.02296
0x78a29eafd87357890935fe5c2f578997341741f8.CALL( )
- ETH 0.0232
0x75a303b80032193a6cdb1155ddde79eef3efed55.CALL( )
- ETH 0.02872
0x1712845ac94c9fa1d63e333f5439e1f2a3770d82.CALL( )
- ETH 0.02438
0x6b2b0b6a0da1174393717d761ed8089380b7937d.CALL( )
- ETH 0.02346
0x1aa8677f332b90874fda85b86fc72e6a16abe256.CALL( )
- ETH 0.02314
0x3c067f01c74d0aed277178b45b8c9c9a68e5ab25.CALL( )
- ETH 0.02288
0x4195ad5c27e07217011d31ae4416944f2d2f4cd1.CALL( )
- ETH 0.02462
0x54a2bc62d62b01e2ee947857e108d39620261521.CALL( )
- ETH 0.02332
0x0c3d35a69211024dd7d863f775fbe55759d843f2.CALL( )
- ETH 0.02972
0xef09bf7c3f182cb111750536e5767ebbe8253ea7.CALL( )
- ETH 0.02948
0x76d305d6908838d39d4efd13b7c52883bebcf188.CALL( )
- ETH 0.0221
0x9f55f3d2340233dd5691b5dd1900729dfa5bd353.CALL( )
- ETH 0.02994
0x4b8641eca803a4d4268e7d4fc9d7608822381b6e.CALL( )
- ETH 0.0228
0x99d51af69c14256eef9ded6198bfe5e763d9d091.CALL( )
- ETH 0.02816
0xa08d78be850e8b68ab8f82dfcc6b960716b65e37.CALL( )
- ETH 0.02298
0x966552097c36d3e45fdf7482cfcabb39e2393c75.CALL( )
- ETH 0.02906
0x5400b11d6c62de40f1f41f1c2a31143d4656b223.CALL( )
- ETH 0.0258
0xdd32a7ef6566267fdfdb015143dc8671f4d6ee3a.CALL( )
- ETH 0.02716
0xee472fce73f4e5bc6559f7221a880c14729da988.CALL( )
- ETH 0.02908
0x8b7e10169ea23669d8d9a6394b7d2fa911163e63.CALL( )
- ETH 0.02174
0x89551d8bf1d491ae268009da283575c38af4ed8a.CALL( )
- ETH 0.02946
0xd3a0a97ca68ece4a7de502d8cbac02ce94681f89.CALL( )
- ETH 0.0277
0x2ac0b9d297252c6f3befc15281da412ebd26f99d.CALL( )
- ETH 0.02778
0xd5ad9cf05fe275bfd8fc1bf8e432ae4f53caad17.CALL( )
- ETH 0.02482
// 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); } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.3) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.9._ */ interface IERC1967 { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/beacon/BeaconProxy.sol) pragma solidity ^0.8.0; import "./IBeacon.sol"; import "../Proxy.sol"; import "../ERC1967/ERC1967Upgrade.sol"; /** * @dev This contract implements a proxy that gets the implementation address for each call from an {UpgradeableBeacon}. * * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't * conflict with the storage layout of the implementation behind the proxy. * * _Available since v3.4._ */ contract BeaconProxy is Proxy, ERC1967Upgrade { /** * @dev Initializes the proxy with `beacon`. * * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This * will typically be an encoded function call, and allows initializing the storage of the proxy like a Solidity * constructor. * * Requirements: * * - `beacon` must be a contract with the interface {IBeacon}. */ constructor(address beacon, bytes memory data) payable { _upgradeBeaconToAndCall(beacon, data, false); } /** * @dev Returns the current beacon address. */ function _beacon() internal view virtual returns (address) { return _getBeacon(); } /** * @dev Returns the current implementation address of the associated beacon. */ function _implementation() internal view virtual override returns (address) { return IBeacon(_getBeacon()).implementation(); } /** * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}. * * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. * * Requirements: * * - `beacon` must be a contract. * - The implementation returned by `beacon` must be a contract. */ function _setBeacon(address beacon, bytes memory data) internal virtual { _upgradeBeaconToAndCall(beacon, data, false); } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol) pragma solidity ^0.8.0; import "./IBeacon.sol"; import "../../access/Ownable.sol"; import "../../utils/Address.sol"; /** * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their * implementation contract, which is where they will delegate all function calls. * * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon. */ contract UpgradeableBeacon is IBeacon, Ownable { address private _implementation; /** * @dev Emitted when the implementation returned by the beacon is changed. */ event Upgraded(address indexed implementation); /** * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the * beacon. */ constructor(address implementation_) { _setImplementation(implementation_); } /** * @dev Returns the current implementation address. */ function implementation() public view virtual override returns (address) { return _implementation; } /** * @dev Upgrades the beacon to a new implementation. * * Emits an {Upgraded} event. * * Requirements: * * - msg.sender must be the owner of the contract. * - `newImplementation` must be a contract. */ function upgradeTo(address newImplementation) public virtual onlyOwner { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Sets the implementation contract address for this beacon * * Requirements: * * - `newImplementation` must be a contract. */ function _setImplementation(address newImplementation) private { require(Address.isContract(newImplementation), "UpgradeableBeacon: implementation is not a contract"); _implementation = newImplementation; } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol) pragma solidity ^0.8.0; import "../Proxy.sol"; import "./ERC1967Upgrade.sol"; /** * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an * implementation address that can be changed. This address is stored in storage in the location specified by * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the * implementation behind the proxy. */ contract ERC1967Proxy is Proxy, ERC1967Upgrade { /** * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`. * * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded * function call, and allows initializing the storage of the proxy like a Solidity constructor. */ constructor(address _logic, bytes memory _data) payable { _upgradeToAndCall(_logic, _data, false); } /** * @dev Returns the current implementation address. */ function _implementation() internal view virtual override returns (address impl) { return ERC1967Upgrade._getImplementation(); } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.3) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeacon.sol"; import "../../interfaces/IERC1967.sol"; import "../../interfaces/draft-IERC1822.sol"; import "../../utils/Address.sol"; import "../../utils/StorageSlot.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967Upgrade is IERC1967 { // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { Address.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( Address.isContract(IBeacon(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol) pragma solidity ^0.8.0; /** * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to * be specified by overriding the virtual {_implementation} function. * * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a * different contract through the {_delegate} function. * * The success and return data of the delegated call will be returned back to the caller of the proxy. */ abstract contract Proxy { /** * @dev Delegates the current call to `implementation`. * * This function does not return to its internal call site, it will return directly to the external caller. */ function _delegate(address implementation) internal virtual { assembly { // Copy msg.data. We take full control of memory in this inline assembly // block because it will not return to Solidity code. We overwrite the // Solidity scratch pad at memory position 0. calldatacopy(0, 0, calldatasize()) // Call the implementation. // out and outsize are 0 because we don't know the size yet. let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) // Copy the returned data. returndatacopy(0, 0, returndatasize()) switch result // delegatecall returns 0 on error. case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } } /** * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function * and {_fallback} should delegate. */ function _implementation() internal view virtual returns (address); /** * @dev Delegates the current call to the address returned by `_implementation()`. * * This function does not return to its internal call site, it will return directly to the external caller. */ function _fallback() internal virtual { _beforeFallback(); _delegate(_implementation()); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other * function in the contract matches the call data. */ fallback() external payable virtual { _fallback(); } /** * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data * is empty. */ receive() external payable virtual { _fallback(); } /** * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` * call, or as part of the Solidity `fallback` or `receive` functions. * * If overridden should call `super._beforeFallback()`. */ function _beforeFallback() internal virtual {} } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.3) (proxy/transparent/ProxyAdmin.sol) pragma solidity ^0.8.0; import "./TransparentUpgradeableProxy.sol"; import "../../access/Ownable.sol"; /** * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}. */ contract ProxyAdmin is Ownable { /** * @dev Returns the current implementation of `proxy`. * * Requirements: * * - This contract must be the admin of `proxy`. */ function getProxyImplementation(ITransparentUpgradeableProxy proxy) public view virtual returns (address) { // We need to manually run the static call since the getter cannot be flagged as view // bytes4(keccak256("implementation()")) == 0x5c60da1b (bool success, bytes memory returndata) = address(proxy).staticcall(hex"5c60da1b"); require(success); return abi.decode(returndata, (address)); } /** * @dev Returns the current admin of `proxy`. * * Requirements: * * - This contract must be the admin of `proxy`. */ function getProxyAdmin(ITransparentUpgradeableProxy proxy) public view virtual returns (address) { // We need to manually run the static call since the getter cannot be flagged as view // bytes4(keccak256("admin()")) == 0xf851a440 (bool success, bytes memory returndata) = address(proxy).staticcall(hex"f851a440"); require(success); return abi.decode(returndata, (address)); } /** * @dev Changes the admin of `proxy` to `newAdmin`. * * Requirements: * * - This contract must be the current admin of `proxy`. */ function changeProxyAdmin(ITransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner { proxy.changeAdmin(newAdmin); } /** * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}. * * Requirements: * * - This contract must be the admin of `proxy`. */ function upgrade(ITransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner { proxy.upgradeTo(implementation); } /** * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See * {TransparentUpgradeableProxy-upgradeToAndCall}. * * Requirements: * * - This contract must be the admin of `proxy`. */ function upgradeAndCall( ITransparentUpgradeableProxy proxy, address implementation, bytes memory data ) public payable virtual onlyOwner { proxy.upgradeToAndCall{value: msg.value}(implementation, data); } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.3) (proxy/transparent/TransparentUpgradeableProxy.sol) pragma solidity ^0.8.0; import "../ERC1967/ERC1967Proxy.sol"; /** * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy} * does not implement this interface directly, and some of its functions are implemented by an internal dispatch * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not * include them in the ABI so this interface must be used to interact with it. */ interface ITransparentUpgradeableProxy is IERC1967 { function admin() external view returns (address); function implementation() external view returns (address); function changeAdmin(address) external; function upgradeTo(address) external; function upgradeToAndCall(address, bytes memory) external payable; } /** * @dev This contract implements a proxy that is upgradeable by an admin. * * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector * clashing], which can potentially be used in an attack, this contract uses the * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two * things that go hand in hand: * * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if * that call matches one of the admin functions exposed by the proxy itself. * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the * implementation. If the admin tries to call a function on the implementation it will fail with an error that says * "admin cannot fallback to proxy target". * * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due * to sudden errors when trying to call a function from the proxy implementation. * * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy. * * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the * implementation. * * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised. */ contract TransparentUpgradeableProxy is ERC1967Proxy { /** * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}. */ constructor( address _logic, address admin_, bytes memory _data ) payable ERC1967Proxy(_logic, _data) { _changeAdmin(admin_); } /** * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin. * * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the * implementation provides a function with the same selector. */ modifier ifAdmin() { if (msg.sender == _getAdmin()) { _; } else { _fallback(); } } /** * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior */ function _fallback() internal virtual override { if (msg.sender == _getAdmin()) { bytes memory ret; bytes4 selector = msg.sig; if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) { ret = _dispatchUpgradeTo(); } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) { ret = _dispatchUpgradeToAndCall(); } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) { ret = _dispatchChangeAdmin(); } else if (selector == ITransparentUpgradeableProxy.admin.selector) { ret = _dispatchAdmin(); } else if (selector == ITransparentUpgradeableProxy.implementation.selector) { ret = _dispatchImplementation(); } else { revert("TransparentUpgradeableProxy: admin cannot fallback to proxy target"); } assembly { return(add(ret, 0x20), mload(ret)) } } else { super._fallback(); } } /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function _dispatchAdmin() private returns (bytes memory) { _requireZeroValue(); address admin = _getAdmin(); return abi.encode(admin); } /** * @dev Returns the current implementation. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` */ function _dispatchImplementation() private returns (bytes memory) { _requireZeroValue(); address implementation = _implementation(); return abi.encode(implementation); } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _dispatchChangeAdmin() private returns (bytes memory) { _requireZeroValue(); address newAdmin = abi.decode(msg.data[4:], (address)); _changeAdmin(newAdmin); return ""; } /** * @dev Upgrade the implementation of the proxy. */ function _dispatchUpgradeTo() private returns (bytes memory) { _requireZeroValue(); address newImplementation = abi.decode(msg.data[4:], (address)); _upgradeToAndCall(newImplementation, bytes(""), false); return ""; } /** * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the * proxied contract. */ function _dispatchUpgradeToAndCall() private returns (bytes memory) { (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes)); _upgradeToAndCall(newImplementation, data, true); return ""; } /** * @dev Returns the current admin. */ function _admin() internal view virtual returns (address) { return _getAdmin(); } /** * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to * emulate some proxy functions being non-payable while still allowing value to pass through. */ function _requireZeroValue() private { require(msg.value == 0); } } // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // 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) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } }