ETH Price: $2,309.24 (+5.69%)

Transaction Decoder

Block:
20157826 at Jun-24-2024 12:00:11 AM +UTC
Transaction Fee:
0.002730652303902576 ETH $6.31
Gas Used:
812,472 Gas / 3.360918658 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x0041CCa0...859dA901D 0.026234920753736099 Eth0.027504594239473703 Eth0.001269673485737604
0x049668bd...7fC7D6353 0.000272777452018503 Eth0.002898374571948937 Eth0.002625597119930434
0x09FE7750...F6b517c8f 0.000223838550986916 Eth0.002961393558692966 Eth0.00273755500770605
0x1245CE01...18fBe3779 1.82159712797950896 Eth1.859687332551637083 Eth0.038090204572128123
0x125D011A...367E7523b 0.004735238343087872 Eth0.007443636343679931 Eth0.002708398000592059
0x17807BA6...B705c4C68 0.029557258162413927 Eth0.031397998300080542 Eth0.001840740137666615
3.162494472649843979 Eth3.163713180649843979 Eth0.001218708
0x20ea45C8...04c4AC422 0.004188101092275138 Eth0.008808276252093707 Eth0.004620175159818569
0x23285d76...dB21efF02 0.007332878044564663 Eth0.039074715188004766 Eth0.031741837143440103
0x23361C16...7C99e85c8 0.001377872822535562 Eth0.015678186191407019 Eth0.014300313368871457
0x276f7188...95DEa0BC0 0.017057326185521938 Eth0.019596673156997146 Eth0.002539346971475208
0x27a8f27f...53CB45E2f 0.005302803656442965 Eth0.007166814083772498 Eth0.001864010427329533
0x304AF7a8...922bBA875 0.008926310046404818 Eth0.040668147189844921 Eth0.031741837143440103
0x30a25ad8...F8601c5d4
1.954889109764643641 Eth
Nonce: 2
1.369418668175947573 Eth
Nonce: 3
0.585470441588696068
0x3B048b8A...bdfE6dEa9 0.009978247627647311 Eth0.01128455267293324 Eth0.001306305045285929
0x3C77419e...bb55424f1 0.075161990344544025 Eth0.088480147526617068 Eth0.013318157182073043
0x3EA2f1E4...57eAC8764 0.039749379426028313 Eth0.041019052911765917 Eth0.001269673485737604
0x3eFEEE40...23e7314AB 0.008137375665109136 Eth0.00940704915084674 Eth0.001269673485737604
0x44050e88...7c0be5e10 0.000739177126085465 Eth0.002902771870060756 Eth0.002163594743975291
0x515b3F66...985b76948 0.009557980616577902 Eth0.011976597250003363 Eth0.002418616633425461
0x529fC1a4...5055957D7 0.147719845670531504 Eth0.188141281988639461 Eth0.040421436318107957
0x56aEd1EA...59005AA52 1.134127565494811691 Eth1.136766317947698834 Eth0.002638752452887143
0x620382dD...AF1699b13 0.004337644196424123 Eth0.007043734399914052 Eth0.002706090203489929
0x6241ACCC...c4B731385 0.00717893844116685 Eth0.013554155375252319 Eth0.006375216934085469
0x64124E5E...6645E0B2D 0.004128569829507777 Eth0.009678036953307979 Eth0.005549467123800202
0x664A73aF...55B409425 0.004890063042132236 Eth0.006746871387475359 Eth0.001856808345343123
0x7400668d...30B0905A1 0.921276943561306566 Eth0.940322045847370628 Eth0.019045102286064062
0x74d701eD...686b7c70e 0.009466237521880147 Eth0.013617473588408591 Eth0.004151236066528444
0x7A18bd76...d0C43B7B0 0.02973288101778707 Eth0.032976639148704315 Eth0.003243758130917245
0x7A772ff7...5fbcCFdac 0.003239462972230326 Eth0.007738452114727603 Eth0.004498989142497277
0x7c9Af046...97c70528F 0.009554546153247567 Eth0.012170986424875221 Eth0.002616440271627654
0x7ddB6165...C6238af3C 0.205610216572858008 Eth0.221395447408762303 Eth0.015785230835904295
0x7e37EfA6...247F68cA9 0.032215119612868029 Eth0.033484793098605633 Eth0.001269673485737604
0x7Ee326e9...Ede33FD76 0.166143192084115588 Eth0.169228859864484008 Eth0.00308566778036842
0x85125432...0a7a2F4af 0.009465055495077912 Eth0.011143156986303324 Eth0.001678101491225412
0x8a7Ce226...8E4450Ab3 0.102492050467572748 Eth0.106172113780240472 Eth0.003680063312667724
0x92c3717A...90469325A 0.302939504118558281 Eth0.334681341261998384 Eth0.031741837143440103
0x940e3146...1262D640f 0.007910891761432318 Eth0.011476494549122725 Eth0.003565602787690407
0x9a76e856...39576F18C 0.005708708764548976 Eth0.018405443621925017 Eth0.012696734857376041
0x9af741D0...9EF05F61d 0.004303447694792821 Eth0.005777612414321037 Eth0.001474164719528216
0xa2528B5a...b3CFcF773 0.015690331131268121 Eth0.026577676611574666 Eth0.010887345480306545
0xa9Ea6847...3C586c199 0.003997901139775563 Eth0.010853871897004116 Eth0.006855970757228553
0xb030Be69...408587Aa1 0.004858422907242651 Eth0.008577626814313936 Eth0.003719203907071285
0xB906b222...4001d4f14 0.302272489460727978 Eth0.303938935910758583 Eth0.001666446450030605
0xBaDEe5e0...aC7EAA84e 0.00955986213555377 Eth0.013415087858673498 Eth0.003855225723119728
0xBdbE1727...3e9f0Fb67 0.011494005605412564 Eth0.014712993365766576 Eth0.003218987760354012
0xBeC4e72e...dFddf75Ed 0.000342550469373 Eth0.032084387612813103 Eth0.031741837143440103
0xBEEC0888...Ad3136844 0.037181544616968374 Eth0.038490106431782528 Eth0.001308561814814154
0xc3198495...415684d1F 0.004286666563433188 Eth0.006209197637854391 Eth0.001922531074421203
0xc45e688C...06931d5bf 2.164528896594441965 Eth2.166419431502364922 Eth0.001890534907922957
0xc9Ed68D3...a9B9f4ad8 0.004568859045279099 Eth0.007239519462865129 Eth0.00267066041758603
0xCeF9C7E3...5fF66A645 0.003679879092844454 Eth0.008208655801154133 Eth0.004528776708309679
0xD2bdf92B...3ceEA002A 0.006689129179062586 Eth0.014636205382406866 Eth0.00794707620334428
0xDb81F287...BEb40C4dc 0.008453627706346843 Eth0.014914871621944085 Eth0.006461243915597242
0xDE1Aa581...73DFB8313 0.003102925215751769 Eth0.007155910212550626 Eth0.004052984996798857
0xE407c896...A014A6530 0.004011800316977982 Eth0.010870269154142106 Eth0.006858468837164124
0xE4E6aD9f...4f146e3b4 0.105182658379385122 Eth0.107103674464456226 Eth0.001921016085071104
0xE761A5E0...9a061bb2A 0.82648171395475392 Eth0.827751387440491524 Eth0.001269673485737604
0xE8375A3F...2Db895885 0.000086846525548168 Eth0.004002058935178143 Eth0.003915212409629975
0xE918dA9A...833d083F0 0.030041669873952001 Eth0.031311353298109995 Eth0.001269683424157994
0xE9424Bda...423bAFaE8 0.0283 Eth0.060041837143440103 Eth0.031741837143440103
0xEa22c5D7...560d32f92 0.005032904696245291 Eth0.009099997411906823 Eth0.004067092715661532
0xea88AC58...c769eB487 0.027290648400393442 Eth0.032063619365080238 Eth0.004772970964686796
0xeD5E3aA4...61A49fF29 5.995664745175180572 Eth6.008754199606772026 Eth0.013089454431591454
0xedcc46d5...5c415911B 0.014977062515680704 Eth0.017132942366928394 Eth0.00215587985124769
0xEe13e635...dd912b141 0 Eth0.000000000000000003 Eth0.000000000000000003
0xEEFB9e60...497E4B979 0.418871950144692847 Eth0.422092522301757859 Eth0.003220572157065012
0xF39A426C...1fe04df84 0.00260484337448827 Eth0.011323541618696424 Eth0.008718698244208154
0xf565cDC0...40Fd2A5fa 0.000202748223063207 Eth0.00253067273828241 Eth0.002327924515219203
0xf77521Bc...8c04C9033 0.006212256060588112 Eth0.031605725775340194 Eth0.025393469714752082
0xf7D3eCa7...2DB17882E 0.1025180722667261 Eth0.118583058737455382 Eth0.016064986470729282
0xf9114897...539f29C44 0.047241561287717825 Eth0.059938296145093866 Eth0.012696734857376041
0xfA5E28Ef...FD4dcEF54 0.000234337922781013 Eth0.001512652083360285 Eth0.001278314160579272
0xfb609A7d...504022b58 0.030253268370977776 Eth0.03204178548394255 Eth0.001788517112964774
0xFBFd51C1...191C9dA60 0.001016434909192427 Eth0.005514943039844748 Eth0.004498508130652321
0xFC3B60BC...66221F315 0.005369885472411106 Eth0.019163505292989229 Eth0.013793619820578123
0xfce7B5ba...51Df30836 0.005017038929927603 Eth0.007011050132468098 Eth0.001994011202540495
0xfd58EB00...2B7dD6a11 2.743866476808009307 Eth2.745136150293746911 Eth0.001269673485737604

Execution Trace

ETH 0.582739789284793492 BulkTransfer.distribute( recipients=[0x529fC1a45Ed9d383822DD0b5Becb4285055957D7, 0x1245CE0180Fb54CF8a446692459B58418fBe3779, 0x23285d76e062EAFa4cb5dbA6461aA4adB21efF02, 0xBeC4e72eD6774fcE5Ca4f0063B309b4dFddf75Ed, 0xE9424Bda18c8c084D5584C0Fae704A4423bAFaE8, 0x304AF7a86a0644A6c3D0B38D2E71105922bBA875, 0x92c3717A1318cf0e02883Ca0BAE73bd90469325A, 0xf77521BcCbfB6607D90CfC7ac6FBe308c04C9033, 0x7400668de2cF223142D7F2CEe8b2eBC30B0905A1, 0xf7D3eCa7C5f164E953689685B8f6e832DB17882E, 0x7ddB6165bD9069976d0D243a5413358C6238af3C, 0x23361C165dF7bAc1f9372C0D1C9E2577C99e85c8, 0xFC3B60BCB3eA240F44A0CE0118A89f566221F315, 0x3C77419e4436aB222678eeC79D49232bb55424f1, 0xeD5E3aA45f217CC1Ae1413074afaF5861A49fF29, 0xf9114897D8B1796aD884922D9c53adA539f29C44, 0x9a76e856878Fe8c6d80A06B9989d4CB39576F18C, 0xa2528B5a0cFF462dEA2416a7c5A2cd0b3CFcF773, 0xF39A426C6C81BFf86498589a739ddD41fe04df84, 0xD2bdf92BF7546A5B9beBf6659Db442e3ceEA002A, 0xE407c896374F70F1A7A57C552950Ea0A014A6530, 0xa9Ea6847D4861b9140E14CAb4fc56283C586c199, 0xDb81F2874bCfB183A609cC2E0177D89BEb40C4dc, 0x6241ACCC6757C8fd20DBb645814B8dCc4B731385, 0x64124E5E7587DFdFa38FE44CAfb2EC46645E0B2D, 0xea88AC58bdBD5912b5287Ee3F37A2d3c769eB487, 0x20ea45C8773be815E95A93302fe624904c4AC422, 0xCeF9C7E3d3f8317f8DC3E0CfB04e02B5fF66A645, 0x7A772ff7Ddd092666AF713Cddb997F45fbcCFdac, 0xFBFd51C1B46A5Aaa07200A1E181C525191C9dA60, 0x74d701eD10Bd155e2e581A0d0BccA92686b7c70e, 0xEa22c5D79448EdDC683bD5d39a31513560d32f92, 0xDE1Aa581C8aC4eE219619b469Fc9d1073DFB8313, 0xE8375A3F342868872Ea8b7EBbF58A772Db895885, 0xBaDEe5e0363448d47B185A1f7fB78E2aC7EAA84e, 0xb030Be6931Bd089674FEF0F697e3D6F408587Aa1, 0x8a7Ce2266E270e18F634AA11C33ad438E4450Ab3, 0x940e3146A0F97152470C44Dfd4674CA1262D640f, 0x7A18bd765EC7C4Df631CF8762fB6a3ad0C43B7B0, 0xEEFB9e60e33C4dAED5E2EDddd25AAdB497E4B979, 0xBdbE1727eBE3bd3afb796e8834A729C3e9f0Fb67, 0x7Ee326e9FDB690dB418906dD8c9798CEde33FD76, 0x09FE7750BfCFE0c8096b92f68aE5DF3F6b517c8f, 0x125D011ADE1e91d3d801a17C51e44B1367E7523b, 0x620382dD5189c8e27e63E3CDCC2b3E9AF1699b13, 0xc9Ed68D33b400dC6f3A19885342c220a9B9f4ad8, 0x56aEd1EA03EFEBdEA57c9afb3eF3Ae259005AA52, 0x049668bd29cb7e7cc86Ac8B6D9C854D7fC7D6353, 0x7c9Af04677Aa6Bb1591D396d9535AF997c70528F, 0x276f7188204F9b23d960B8f6F59798c95DEa0BC0, 0x515b3F66E9F58703F1f62c31b9dEE96985b76948, 0xf565cDC0c4125ac213803Ccef7e754D40Fd2A5fa, 0x44050e88593382D9883594872a6Dc0F7c0be5e10, 0xedcc46d5Ca1Af923b7F067490Cd1d985c415911B, 0xfce7B5ba8682c140F9851368E36174451Df30836, 0xc3198495055A2b75c593fD85a659b08415684d1F, 0xE4E6aD9f49c41D6c78B85e6EdbF2A644f146e3b4, 0xc45e688C14F4f9c5fb0786a2181C81906931d5bf, 0x27a8f27f12ffA2C787C32488b52425153CB45E2f, 0x664A73aFE82f1A786A95bE90F113d8355B409425, 0x17807BA63957B6E504a41E98915f6b4B705c4C68, 0xfb609A7dDA3ed3c2AA73E5ec1174897504022b58, 0x85125432d4579AB579337fB6716d4250a7a2F4af, 0xB906b222C1A94500588b35090e48ef74001d4f14, 0x9af741D0Ea10DE95f8B564364B1d2759EF05F61d, 0xBEEC08888f8BFAE5193279A2260C590Ad3136844, 0x3B048b8Af52F5379559BEA2940353eEbdfE6dEa9, 0xfA5E28EfFdFFf9b0e56ef6B43008e62FD4dcEF54, 0xE918dA9A4987aB2321a2596f05c59d4833d083F0, 0x3EA2f1E4e885E5b73C929E199cdcD5e57eAC8764, 0x7e37EfA6B2fAaC505b50017695370d6247F68cA9, 0xfd58EB009ec629C79819C82F9F4fd482B7dD6a11, 0x3eFEEE40cb4294e094C06F162F042CA23e7314AB, 0x0041CCa0Ee0d3bCb6c818Dc5036d31c859dA901D, 0xE761A5E025afB6620B85c429aCB9d1e9a061bb2A], amounts=[40421436318107957, 38090204572128123, 31741837143440103, 31741837143440103, 31741837143440103, 31741837143440103, 31741837143440103, 25393469714752082, 19045102286064062, 16064986470729282, 15785230835904295, 14300313368871457, 13793619820578123, 13318157182073043, 13089454431591454, 12696734857376041, 12696734857376041, 10887345480306545, 8718698244208154, 7947076203344280, 6858468837164124, 6855970757228553, 6461243915597242, 6375216934085469, 5549467123800202, 4772970964686796, 4620175159818569, 4528776708309679, 4498989142497277, 4498508130652321, 4151236066528444, 4067092715661532, 4052984996798857, 3915212409629975, 3855225723119728, 3719203907071285, 3680063312667724, 3565602787690407, 3243758130917245, 3220572157065012, 3218987760354012, 3085667780368420, 2737555007706050, 2708398000592059, 2706090203489929, 2670660417586030, 2638752452887143, 2625597119930434, 2616440271627654, 2539346971475208, 2418616633425461, 2327924515219203, 2163594743975291, 2155879851247690, 1994011202540495, 1922531074421203, 1921016085071104, 1890534907922957, 1864010427329533, 1856808345343123, 1840740137666615, 1788517112964774, 1678101491225412, 1666446450030605, 1474164719528216, 1308561814814154, 1306305045285929, 1278314160579272, 1269683424157994, 1269673485737604, 1269673485737604, 1269673485737604, 1269673485737604, 1269673485737604, 1269673485737604] )
  • ETH 0.040421436318107957 0x529fc1a45ed9d383822dd0b5becb4285055957d7.CALL( )
  • ETH 0.038090204572128123 0x1245ce0180fb54cf8a446692459b58418fbe3779.CALL( )
  • ETH 0.031741837143440103 0x23285d76e062eafa4cb5dba6461aa4adb21eff02.CALL( )
  • ETH 0.031741837143440103 0xbec4e72ed6774fce5ca4f0063b309b4dfddf75ed.CALL( )
  • ETH 0.031741837143440103 0xe9424bda18c8c084d5584c0fae704a4423bafae8.CALL( )
  • ETH 0.031741837143440103 0x304af7a86a0644a6c3d0b38d2e71105922bba875.CALL( )
  • ETH 0.031741837143440103 0x92c3717a1318cf0e02883ca0bae73bd90469325a.CALL( )
  • ETH 0.025393469714752082 0xf77521bccbfb6607d90cfc7ac6fbe308c04c9033.CALL( )
  • ETH 0.019045102286064062 0x7400668de2cf223142d7f2cee8b2ebc30b0905a1.CALL( )
  • ETH 0.016064986470729282 0xf7d3eca7c5f164e953689685b8f6e832db17882e.CALL( )
  • ETH 0.015785230835904295 0x7ddb6165bd9069976d0d243a5413358c6238af3c.CALL( )
  • ETH 0.014300313368871457 0x23361c165df7bac1f9372c0d1c9e2577c99e85c8.CALL( )
  • ETH 0.013793619820578123 0xfc3b60bcb3ea240f44a0ce0118a89f566221f315.CALL( )
  • ETH 0.013318157182073043 0x3c77419e4436ab222678eec79d49232bb55424f1.CALL( )
  • ETH 0.013089454431591454 0xed5e3aa45f217cc1ae1413074afaf5861a49ff29.CALL( )
  • ETH 0.012696734857376041 0xf9114897d8b1796ad884922d9c53ada539f29c44.CALL( )
  • ETH 0.012696734857376041 0x9a76e856878fe8c6d80a06b9989d4cb39576f18c.CALL( )
  • ETH 0.010887345480306545 0xa2528b5a0cff462dea2416a7c5a2cd0b3cfcf773.CALL( )
  • ETH 0.008718698244208154 0xf39a426c6c81bff86498589a739ddd41fe04df84.CALL( )
  • ETH 0.00794707620334428 0xd2bdf92bf7546a5b9bebf6659db442e3ceea002a.CALL( )
  • ETH 0.006858468837164124 0xe407c896374f70f1a7a57c552950ea0a014a6530.CALL( )
  • ETH 0.006855970757228553 0xa9ea6847d4861b9140e14cab4fc56283c586c199.CALL( )
  • ETH 0.006461243915597242 0xdb81f2874bcfb183a609cc2e0177d89beb40c4dc.CALL( )
  • ETH 0.006375216934085469 0x6241accc6757c8fd20dbb645814b8dcc4b731385.CALL( )
  • ETH 0.005549467123800202 0x64124e5e7587dfdfa38fe44cafb2ec46645e0b2d.CALL( )
  • ETH 0.004772970964686796 0xea88ac58bdbd5912b5287ee3f37a2d3c769eb487.CALL( )
  • ETH 0.004620175159818569 0x20ea45c8773be815e95a93302fe624904c4ac422.CALL( )
  • ETH 0.004528776708309679 0xcef9c7e3d3f8317f8dc3e0cfb04e02b5ff66a645.CALL( )
  • ETH 0.004498989142497277 0x7a772ff7ddd092666af713cddb997f45fbccfdac.CALL( )
  • ETH 0.004498508130652321 0xfbfd51c1b46a5aaa07200a1e181c525191c9da60.CALL( )
  • ETH 0.004151236066528444 0x74d701ed10bd155e2e581a0d0bcca92686b7c70e.CALL( )
  • ETH 0.004067092715661532 0xea22c5d79448eddc683bd5d39a31513560d32f92.CALL( )
  • ETH 0.004052984996798857 0xde1aa581c8ac4ee219619b469fc9d1073dfb8313.CALL( )
  • ETH 0.003915212409629975 0xe8375a3f342868872ea8b7ebbf58a772db895885.CALL( )
  • ETH 0.003855225723119728 0xbadee5e0363448d47b185a1f7fb78e2ac7eaa84e.CALL( )
  • ETH 0.003719203907071285 0xb030be6931bd089674fef0f697e3d6f408587aa1.CALL( )
  • ETH 0.003680063312667724 0x8a7ce2266e270e18f634aa11c33ad438e4450ab3.CALL( )
  • ETH 0.003565602787690407 0x940e3146a0f97152470c44dfd4674ca1262d640f.CALL( )
  • ETH 0.003243758130917245 0x7a18bd765ec7c4df631cf8762fb6a3ad0c43b7b0.CALL( )
  • ETH 0.003220572157065012 0xeefb9e60e33c4daed5e2edddd25aadb497e4b979.CALL( )
  • ETH 0.003218987760354012 0xbdbe1727ebe3bd3afb796e8834a729c3e9f0fb67.CALL( )
  • ETH 0.00308566778036842 0x7ee326e9fdb690db418906dd8c9798cede33fd76.CALL( )
  • ETH 0.00273755500770605 0x09fe7750bfcfe0c8096b92f68ae5df3f6b517c8f.CALL( )
  • ETH 0.002708398000592059 0x125d011ade1e91d3d801a17c51e44b1367e7523b.CALL( )
  • ETH 0.002706090203489929 0x620382dd5189c8e27e63e3cdcc2b3e9af1699b13.CALL( )
  • ETH 0.00267066041758603 0xc9ed68d33b400dc6f3a19885342c220a9b9f4ad8.CALL( )
  • ETH 0.002638752452887143 0x56aed1ea03efebdea57c9afb3ef3ae259005aa52.CALL( )
  • ETH 0.002625597119930434 0x049668bd29cb7e7cc86ac8b6d9c854d7fc7d6353.CALL( )
  • ETH 0.002616440271627654 0x7c9af04677aa6bb1591d396d9535af997c70528f.CALL( )
  • ETH 0.002539346971475208 0x276f7188204f9b23d960b8f6f59798c95dea0bc0.CALL( )
  • ETH 0.002418616633425461 0x515b3f66e9f58703f1f62c31b9dee96985b76948.CALL( )
  • ETH 0.002327924515219203 0xf565cdc0c4125ac213803ccef7e754d40fd2a5fa.CALL( )
  • ETH 0.002163594743975291 0x44050e88593382d9883594872a6dc0f7c0be5e10.CALL( )
  • ETH 0.00215587985124769 0xedcc46d5ca1af923b7f067490cd1d985c415911b.CALL( )
  • ETH 0.001994011202540495 0xfce7b5ba8682c140f9851368e36174451df30836.CALL( )
  • ETH 0.001922531074421203 0xc3198495055a2b75c593fd85a659b08415684d1f.CALL( )
  • ETH 0.001921016085071104 0xe4e6ad9f49c41d6c78b85e6edbf2a644f146e3b4.CALL( )
  • ETH 0.001890534907922957 0xc45e688c14f4f9c5fb0786a2181c81906931d5bf.CALL( )
  • ETH 0.001864010427329533 0x27a8f27f12ffa2c787c32488b52425153cb45e2f.CALL( )
  • ETH 0.001856808345343123 0x664a73afe82f1a786a95be90f113d8355b409425.CALL( )
  • ETH 0.001840740137666615 0x17807ba63957b6e504a41e98915f6b4b705c4c68.CALL( )
  • ETH 0.001788517112964774 0xfb609a7dda3ed3c2aa73e5ec1174897504022b58.CALL( )
  • ETH 0.001678101491225412 0x85125432d4579ab579337fb6716d4250a7a2f4af.CALL( )
  • ETH 0.001666446450030605 0xb906b222c1a94500588b35090e48ef74001d4f14.CALL( )
  • ETH 0.001474164719528216 0x9af741d0ea10de95f8b564364b1d2759ef05f61d.CALL( )
  • ETH 0.001308561814814154 0xbeec08888f8bfae5193279a2260c590ad3136844.CALL( )
  • ETH 0.001306305045285929 0x3b048b8af52f5379559bea2940353eebdfe6dea9.CALL( )
  • ETH 0.001278314160579272 0xfa5e28effdfff9b0e56ef6b43008e62fd4dcef54.CALL( )
  • ETH 0.001269683424157994 0xe918da9a4987ab2321a2596f05c59d4833d083f0.CALL( )
  • ETH 0.001269673485737604 0x3ea2f1e4e885e5b73c929e199cdcd5e57eac8764.CALL( )
  • ETH 0.001269673485737604 0x7e37efa6b2faac505b50017695370d6247f68ca9.CALL( )
  • ETH 0.001269673485737604 0xfd58eb009ec629c79819c82f9f4fd482b7dd6a11.CALL( )
  • ETH 0.001269673485737604 0x3efeee40cb4294e094c06f162f042ca23e7314ab.CALL( )
  • ETH 0.001269673485737604 0x0041cca0ee0d3bcb6c818dc5036d31c859da901d.CALL( )
  • ETH 0.001269673485737604 0xe761a5e025afb6620b85c429acb9d1e9a061bb2a.CALL( )
    // Sources flattened with hardhat v2.19.1 https://hardhat.org
    
    // SPDX-License-Identifier: MIT
    
    // File @openzeppelin/contracts/utils/[email protected]
    
    // Original license: 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;
        }
    }
    
    
    // File @openzeppelin/contracts/access/[email protected]
    
    // Original license: SPDX_License_Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
    
    pragma solidity ^0.8.0;
    
    /**
     * @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. Can only be called by the current owner.
         *
         * NOTE: Renouncing ownership will leave the contract without an owner,
         * thereby disabling any functionality that is only available to the owner.
         */
        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);
        }
    }
    
    
    // File @openzeppelin/contracts/token/ERC20/extensions/[email protected]
    
    // Original license: SPDX_License_Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)
    
    pragma solidity ^0.8.0;
    
    /**
     * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
     * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
     *
     * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
     * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
     * need to send a transaction, and thus is not required to hold Ether at all.
     */
    interface IERC20Permit {
        /**
         * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
         * given ``owner``'s signed approval.
         *
         * IMPORTANT: The same issues {IERC20-approve} has related to transaction
         * ordering also apply here.
         *
         * Emits an {Approval} event.
         *
         * Requirements:
         *
         * - `spender` cannot be the zero address.
         * - `deadline` must be a timestamp in the future.
         * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
         * over the EIP712-formatted function arguments.
         * - the signature must use ``owner``'s current nonce (see {nonces}).
         *
         * For more information on the signature format, see the
         * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
         * section].
         */
        function permit(
            address owner,
            address spender,
            uint256 value,
            uint256 deadline,
            uint8 v,
            bytes32 r,
            bytes32 s
        ) external;
    
        /**
         * @dev Returns the current nonce for `owner`. This value must be
         * included whenever a signature is generated for {permit}.
         *
         * Every successful call to {permit} increases ``owner``'s nonce by one. This
         * prevents a signature from being used multiple times.
         */
        function nonces(address owner) external view returns (uint256);
    
        /**
         * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
         */
        // solhint-disable-next-line func-name-mixedcase
        function DOMAIN_SEPARATOR() external view returns (bytes32);
    }
    
    
    // File @openzeppelin/contracts/token/ERC20/[email protected]
    
    // Original license: SPDX_License_Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.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);
    }
    
    
    // File @openzeppelin/contracts/utils/[email protected]
    
    // Original license: SPDX_License_Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.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
         *
         * Furthermore, `isContract` will also return true if the target contract within
         * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
         * which only has an effect at the end of a transaction.
         * ====
         *
         * [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://consensys.net/diligence/blog/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.8.0/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);
            }
        }
    }
    
    
    // File @openzeppelin/contracts/token/ERC20/utils/[email protected]
    
    // Original license: SPDX_License_Identifier: MIT
    // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)
    
    pragma solidity ^0.8.0;
    
    
    
    /**
     * @title SafeERC20
     * @dev Wrappers around ERC20 operations that throw on failure (when the token
     * contract returns false). Tokens that return no value (and instead revert or
     * throw on failure) are also supported, non-reverting calls are assumed to be
     * successful.
     * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
     * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
     */
    library SafeERC20 {
        using Address for address;
    
        /**
         * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
         * non-reverting calls are assumed to be successful.
         */
        function safeTransfer(IERC20 token, address to, uint256 value) internal {
            _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
        }
    
        /**
         * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
         * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
         */
        function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
            _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
        }
    
        /**
         * @dev Deprecated. This function has issues similar to the ones found in
         * {IERC20-approve}, and its usage is discouraged.
         *
         * Whenever possible, use {safeIncreaseAllowance} and
         * {safeDecreaseAllowance} instead.
         */
        function safeApprove(IERC20 token, address spender, uint256 value) internal {
            // safeApprove should only be called when setting an initial allowance,
            // or when resetting it to zero. To increase and decrease it, use
            // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
            require(
                (value == 0) || (token.allowance(address(this), spender) == 0),
                "SafeERC20: approve from non-zero to non-zero allowance"
            );
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
        }
    
        /**
         * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
         * non-reverting calls are assumed to be successful.
         */
        function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
            uint256 oldAllowance = token.allowance(address(this), spender);
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
        }
    
        /**
         * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
         * non-reverting calls are assumed to be successful.
         */
        function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
            unchecked {
                uint256 oldAllowance = token.allowance(address(this), spender);
                require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
                _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
            }
        }
    
        /**
         * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
         * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
         * to be set to zero before setting it to a non-zero value, such as USDT.
         */
        function forceApprove(IERC20 token, address spender, uint256 value) internal {
            bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
    
            if (!_callOptionalReturnBool(token, approvalCall)) {
                _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
                _callOptionalReturn(token, approvalCall);
            }
        }
    
        /**
         * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
         * Revert on invalid signature.
         */
        function safePermit(
            IERC20Permit token,
            address owner,
            address spender,
            uint256 value,
            uint256 deadline,
            uint8 v,
            bytes32 r,
            bytes32 s
        ) internal {
            uint256 nonceBefore = token.nonces(owner);
            token.permit(owner, spender, value, deadline, v, r, s);
            uint256 nonceAfter = token.nonces(owner);
            require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
        }
    
        /**
         * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
         * on the return value: the return value is optional (but if data is returned, it must not be false).
         * @param token The token targeted by the call.
         * @param data The call data (encoded using abi.encode or one of its variants).
         */
        function _callOptionalReturn(IERC20 token, bytes memory data) private {
            // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
            // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
            // the target address contains contract code and also asserts for success in the low-level call.
    
            bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
            require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    
        /**
         * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
         * on the return value: the return value is optional (but if data is returned, it must not be false).
         * @param token The token targeted by the call.
         * @param data The call data (encoded using abi.encode or one of its variants).
         *
         * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
         */
        function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
            // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
            // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
            // and not revert is the subcall reverts.
    
            (bool success, bytes memory returndata) = address(token).call(data);
            return
                success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
        }
    }
    
    
    // File contracts/alpha/BulkTransfer.sol
    
    // Original license: SPDX_License_Identifier: MIT
    pragma solidity ^0.8.0;
    
    
    
    contract BulkTransfer is Ownable {
        using Address for address payable;
        using SafeERC20 for IERC20;
    
        function distribute(
            address[] calldata recipients,
            uint256[] calldata amounts
        ) external payable {
            uint256 sumAmount;
            uint256 count = recipients.length;
            require(count == amounts.length, "length mismatch");
    
            for (uint256 i; i < count; ) {
                payable(recipients[i]).sendValue(amounts[i]);
                sumAmount += amounts[i];
                unchecked {
                    ++i;
                }
            }
            require(sumAmount <= msg.value, "insufficient funds");
        }
    
        receive() external payable {}
    
        /**
         * @dev It allows the admin to recover tokens sent to the contract
         * @param token_: the address of the token to withdraw
         * @param amount_: the number of tokens to withdraw
         *
         * This function is only callable by owner
         */
        function recoverToken(address token_, uint256 amount_) external onlyOwner {
            IERC20(token_).safeTransfer(_msgSender(), amount_);
        }
    
        /**
         * @dev It allows the admin to recover ETH sent to the contract
         * @param amount_: the number of ETH to withdraw
         *
         * This function is only callable by owner
         */
        function recoverETH(uint256 amount_) external onlyOwner {
            payable(_msgSender()).sendValue(amount_);
        }
    }