More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 75 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy | 18315229 | 461 days ago | IN | 0.42 ETH | 0.00686433 | ||||
Buy | 18144016 | 485 days ago | IN | 0.42 ETH | 0.01065359 | ||||
Buy | 18143772 | 485 days ago | IN | 0.42 ETH | 0.00920974 | ||||
Buy | 18136996 | 486 days ago | IN | 0.42 ETH | 0.01692217 | ||||
Buy | 18136941 | 486 days ago | IN | 0.42 ETH | 0.02052419 | ||||
Buy | 18136932 | 486 days ago | IN | 0.42 ETH | 0.02341068 | ||||
Buy | 18136931 | 486 days ago | IN | 0.42 ETH | 0.02206653 | ||||
Create Sale | 18136807 | 486 days ago | IN | 0 ETH | 0.00328648 | ||||
Withdraw All | 17273781 | 607 days ago | IN | 0 ETH | 0.00206924 | ||||
Buy | 17262428 | 608 days ago | IN | 0.69 ETH | 0.01895764 | ||||
Buy | 17254579 | 610 days ago | IN | 0.69 ETH | 0.01959543 | ||||
Buy | 17253972 | 610 days ago | IN | 0.169 ETH | 0.02615861 | ||||
Buy | 17253924 | 610 days ago | IN | 0.169 ETH | 0.02584335 | ||||
Buy | 17253663 | 610 days ago | IN | 0.169 ETH | 0.02989594 | ||||
Buy | 17253663 | 610 days ago | IN | 0.169 ETH | 0.03056502 | ||||
Buy | 17253604 | 610 days ago | IN | 0.169 ETH | 0.02655086 | ||||
Buy | 17253596 | 610 days ago | IN | 0.169 ETH | 0.02561117 | ||||
Buy | 17253557 | 610 days ago | IN | 0.169 ETH | 0.02786671 | ||||
Buy | 17253498 | 610 days ago | IN | 0.169 ETH | 0.032438 | ||||
Buy | 17253486 | 610 days ago | IN | 0.169 ETH | 0.02846086 | ||||
Buy | 17253472 | 610 days ago | IN | 0.69 ETH | 0.01816398 | ||||
Buy | 17253447 | 610 days ago | IN | 0.169 ETH | 0.02855886 | ||||
Buy | 17253429 | 610 days ago | IN | 0.169 ETH | 0.031061 | ||||
Buy | 17253395 | 610 days ago | IN | 0.169 ETH | 0.02675666 | ||||
Buy With Proof | 17250630 | 610 days ago | IN | 0.169 ETH | 0.0021545 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17273781 | 607 days ago | 18.71 ETH |
Loading...
Loading
Contract Name:
KillerAcidFunOriginalsSales
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMNOdxXMMMMMMMMNOdlloxXMMMXxooxXMMMXxokNMXOxoxXMMMMNOxoodkXW0xkKMMKxdONKxddddddddONMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMM0' dMMMMMMNx, ...kMMWd oWMMx. ,KMO:. .kMWKl' ...dN: lWWl '0x. . ;0MMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMM0' dMMMMMNo. .cOK00WMMK; ,KMMd ,KMOc. .kWk. .lk00OXN: .;;. '0N00k' :00KWMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMM0' dMMMMMO. cNMMMMMMMx. .. oWMd ,KMOl. .x0' 'OMWNXNWN: ... '0MMMX; oMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMM0' dMMMMMk. cWMMMMMMX; ', '0Md '0Mk:. .kO. ;XM0:.;ON: :XXc '0MMMX; oMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMM0' dMMMMMK; .dXWWNWMx. lWO. :k; ,KNl ,dc. .kN: cWWl '0MMMX; oMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMM0' dMMMMMMKc. .,,;OX; :xkl. .ONo. .xWMNx, .kWc cWWl '0MMMX; oMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMXdcl0MMMMMMMW0dc;;;c0Xo:lKMMNxcl0MWOoc:clo0WMMMMNOdc::cxXWOlcOWM0lcdXMMMNxcl0MMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMWklclOWMMMMMMMMMMWKxlcclkNMWKdc:clkNMM0olxXMXxlo0XxoooooooooxXXxooooodx0WMMMNklcl0MMMMMW0dlcclkN0dooooooookNMMM // MMMMMM0' ,KMMMMMMMMMKc. ...:XNo. . :XWl ;KO. oO,... ..'Ok. ... .cXMMO. ;XMMM0:. ...cXd... ..cXMMM // MMMMMWo oWMMMMMMMK; 'xXXKXWo .dKo. oWl ;d. oWXKK0: ,0KKWk. .dX0: .kMWl .xMM0' 'kXXKXMNKKk' lKKXWMMM // MMMMMK, .'. ,KMMMMMMMo .xMMMMMK, lWMK, cNl . oMMMMWl :NMMMk. ':,. ;KM0' .'. ;KWl .kMMMMMMMMMK, dMMMMMMM // MMMMWo .,. oWMMMMMWl .xMMMMM0' oMM0' oWl oMMMMWl :NMMMk. .. :KMWo .,. dNc .kMMMMMMMMMK, dMMMMMMM // MMMMK, '0MMMMMMO. 'kXNXNNc 'xx, '0Wl ;o. oMMMMWl :NMMMk. .xO' cNM0' ,Kk. ,kXNXNMMMMK, dMMMMMMM // MMMWd 'xOk; lWMMMMMWO;. .'.:KK: 'OWWl ;XO' oMMMMWl :NMMMk. .OWx. .xWo ,kOk, oNk, .'.cXMMMK, dMMMMMMM // MMMWkccOWMMKolkNMMMMMMMW0dc::cdXMNkl::cxXMMMOllkWM0oll0MMMMWOolOWMMMXdldXMNkllkNkclOMMM0olkWMNOdc::cxXMMMNkloKMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMNkodKMWOllkNKolxXMMMWKxocccdKWOod0MM0olxNMMMMWOlccccccccoKKdlllllodONMMMXxc::co0WMXdloOWMMMMM0olokNMMMMMMMMM // MMMMMMMMMK, oNX: ,Kd. '0MWO:. ....xN: lNXc '0MMMMWc .....,Ox. ... cXWk' .. .xWO. .xWMMMO' ,KMMMMMMMMM // MMMMMMMMMK, .'. ,Kd '0Wd. ,xKXXKNN: .'.. '0MMMMWc 'xO0KKXWk. .xX0: .kO. cK0, ,KO. .xWWO' ,KMMMMMMMMM // MMMMMMMMMX; .;,. ,Kd '0O. ,KMWK0KNN: .,,. '0MMMMWc ..cKMMMk. ';'. :Ko '0MMd .OO. .ox. ,KMMMMMMMMM // MMMMMMMMMX; oWN: ,Kd '0O. ,KMO,.'ON: cWWc '0MMMMWc .::dXMMMk. .. cXWo ,KMNc ,KO. .. ;, ,KMMMMMMMMM // MMMMMMMMMX; oMN: ,Kd '0No. .c: .kN: lWWc '0MMMMWc :NMMMMMMk. .O0' cNMO. ckc. .dWO. ox. cXo ,KMMMMMMMMM // MMMMMMMMMN: oMNc ,Kd '0MNk;. .ONc lWWl '0MMMMWc :NMMMMMMk. .OWx. .dWWx. .oNMO. dWO,.oNMo ,KMMMMMMMMM // MMMMMMMMMWOddKMW0ddONKxdkNMMMWKkdoodONW0dd0MM0ddkNMMMMWOoooOWMMMMMMXxoxXMWOooOWMMKxlcld0WMMXkdxKMMXKWMMKddONMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMM0lcoXWOlclOWNxclOWOc:xWMMMMMXo::lKMMMMMWk::ccccc:xNXdccccccokXMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMd .xo. cXMX; oWl :NMMMMMO. .kMMMMMWc .....lN0' .'.. ,0MMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMo . ,KMMX; oWl :NMMMMMO. .kMMMMMN: ;kO0XXNW0' oNKc dMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMd .dWMX; oWc :NMMMMMk. .OMMMMMN: ..:KMMM0' .'.. ,0MMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMd ,kd. '0MX; oWc cNMMMMMk. .OMMMMMN: .ccdXMMM0' .' ;KMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMd .OMNc cNX; oN: ,kOOO0Nk. .oOOOOXN: ;OOOOO0N0' .xX: ,KMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMd .OMMO. .xX; oN: 'Ox. oX: .x0' .xM0' lNMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMKxdkNMMW0xx0W0dxKWOdddddddxXXxdddddddd0WOdddddddddKNkdxXMM0ddONMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWMMMMMMMMMMWWWWMMMMMMMMMMMWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXo,,;OMMMMMXxc,',,;xNKl:oKXo,,,;:lONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx. ;XMMWx' .;;,,dWk. .O0' ... ;0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX: .dWWx. cXMMWWWMk. .OO. .ONO; :NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMk. .;. ,KN: '0MMMMMMMk. .OO. '0MMk. '0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN: .. dN: .kMMMMMMMk. .OO. '0MWd. ,KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMk. ... ,Kk. 'd00OOXMk. .OO. .oxc. .xWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNc cKX0; oW0c. :Xk. .OO. .,kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWOdxXMMMXkkKWMWXOdoodd0NNOkONNkdddxk0NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWMMWWWWMMMWWWMMWWWMMMMWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNo,,,,,,,,lXk,,,dWMk;'lX0:,;xNWd,,oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX; .,;,,,oXl cNMd '0x. .oX: ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX; ;kOKWWWNc cWMx. '0x. .:, ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX; cNMMN: cNMx. '0k. ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX; ,odOWMMWl ,KWl ,Kk. .. ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNO0WX; oMMMMMMMk. ,;. lWk. .xl ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWd.'0X; dMMMMMMMWx'.. .lXMk. .ONd. :XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXO0WW0kkXMMMMMMMMMNK0kkOXWMMNOkONMWKkkKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXKK0KXNWMMMMMMMMMMMMMMMMMMMMMMWKxo:,'''';:lx0XWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMW0dc;'.......,:ldOXWMMMMMMMMMMMMMMWk;. .;oOXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMWO;. .;lkNMMMMMMMMMMMk. ':cclc:;'. .:xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMO. .;codxxxdoc;'. 'l0WMMMMMMMWl .xNMN0OO0KNXOd:. 'xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMN: .dKKkollox0NMMN0d:. .c0WMMMMMN: lWMXc. ..;dXWWXd' ,kNMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMK, .OWk' ... .,kNMMMWK: .oxdoddl. lWMO. ;xd' .oXMMXd. cXMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMM0' cNK, ;0Nd. cXMMMMXc lWMK, :NMx. ;0MMW0; ,OWMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMM0' oMK, :NM0' ;0MMMM0' lWMX; ;XMk. :XMMMX; .kWMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMO. oWWc .OMNc ,0MMMX; .:::' cWMX; ;XMO. .kMMMMk. .kWMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMk. cNMx. oWMd cNMMN: .dXWMM0' cWMX; ,KMO. lWMMMX; '0MMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMx. ,KMX; ,OKo. ;XMM0' .xWMMMM0' oWMWo .;oc. .OMMMWl ;XMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMWXl '0MWk. ... ...'xWMMx. :XMMMMMNo ,0MMMNx:'. dMMMWl cNMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMNk:. cXMMMXkdxkOO00KKNMMMMXd:oKMMMMMMMN0OXMMMMMMMWX0kdc,''cKMMWx. .dWMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMNl. .:xXMMMMMMMMMMMMMMMWX00NMMMMMMMMMMMMMMMMMMMMMMMMMWXNWWWWMMMWd. '0MMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMNl .xNWMMMMMMMMMMMMMMMMKc. ,OMMMMMMMMMMMMMMMMMMMMMMWk,..oNMMMMWd. lNMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMWd. .lXMMMMMMMWNXKKXXWMX; lWMMMMMMMWWNK0OOO0KNWMMO. .OMMMMX; .oWMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMM0' .xMMMW0dc,......'::. oWMMMWKxc;''''''''.';lx: .xMMMMW0occldxxo;. .kMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMWo .;xNMKo,..,ldxkkkdl;. .xMMWO:.'cdxk0KXXXKOxl,. dMMMMMMMMMMMMMMWK: :NMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMX; :0WMXo. ,dKWMMMMMMMMWXx, .xMXl.'xXMMMMMMMMMMMMMWO: dMMMMMMMMMMMMMMMM0' .OMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMO. lNMK; ;dxxxddoolllcccc;. .kNl .lxxxkkkkkkkkkkOOO0Oc dMMMMMMMMMMMMMMMMX; oMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMk. oXc .'''. .'. .xk. .. ... .... oWMMMMMMMMMMMMMMMX; :NMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMx. ;k, :k: :kkd' lXNk. '0d 'kO; .cxxd' .oOOk: .oNMMMMMMMMMMMMMMK, ,KMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMx. .x0' oMXl. 'xNMWo lWx.'0MK:. .... .xWMMN: ;0MMMMNkdodxkOkc. lNMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMx. 'kWNc ,KMW0o:;'';coONMMNd. :KMK, cXMW0oc;'....;oKWMMWd. ;XMM0; .kMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMx. ,KMMM0, ,OWMMMWWWWMMMMNk; .oXWX0l. 'lxOKNNNXKKXWMMMWKc. .,cOWMM0' ;KMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMO. ;0XNMMKc..:x0XNWWNX0kl'..cddc,.. ..,cd0KKXKOd:. .;lxKWMMMMMWx. .. .dNMMMMMMMMMMMMMM // MMMMMMMMMMMMMWKl. .,',cONW0; ..''''.. .:lc;. .;loxkkOOkdl:,. .... .,;l0MMMMMMMWO, .c: ,kWMMMMMMMMMMMM // MMMMMMMMMMMMXl';dOKKOo..ck0Oc'.....,;loo:. 'lkXMMMMMMMMMMMMWKx:. .,kMMMMMMMMMK; .xNk' .oNMMMMMMMMMMM // MMMMMMMMMMM0,.dNNkllkXO. .'l0XXXXNXkl'..ckNMMMMMMMMMMMMMMMMMMWKl. .lxxkOKNMMMMMMMMMMM0' .'';xNMM0' .dMMMMMMMMMMM // MMMMMMMMMMK,.xWK:.,'.lX: cXXOd:'..:xXMMMMMMMMMMMMMMMMMMMMMMMWKc. lNMMMMMMMMMMMMMMMMWd. ,0WNWWXkl' ,OMMMMMMMMMMM // MMMMMMMMMMd ;XWl.lNk.;0: ....;ok0xokNMMMMMMMMMMMMMMMMMMNOxxKWNl ':oxOKNMMMMMMMMMMMK, .OMWO;. 'ckNMMMMMMMMMMMM // MMMMMMMMMMo ;XX;.dk;.ox. .',cok0NWMMO'.cXMMMMMMMMMMMMMMW0xl'. '0MX; .'lXMMMMMMMMMWo dMNc ,0MMMMMMMMMMMMMMM // MMMMMMMMMMk..OWO:,,;do..cOXNWMM0l:kWMWKOKWMMMMMMMMMMMNOo,. .cl. dMMx. '0MWK0OO0KNWO. ;XMXd, ,0MMMMMMMMMMMMMM // MMMMMMMMMMNl.'xXNKkd;..xWMMMMMMO;,dNMMk,'oXMMMMMWNOdc' .:d0Wd .kMMO. .c0WO;. ..,;. ,KMMMNo. ,0MMMMMMMMMMMMM // MMMMMMMMMMMNk,..''. .dMMMMMMMMMWWMMMMO:;xNWX0ko;. .,'...':. ;XMMk. .lKWMN: ,kWMMMMWd. 'OWMMMMMMMMMMM // MMMMMMMMMMMMMN0kkxl' .coxk0KXXXXK00Okxdol:,.. .. .dNNKxl;. .kMMNc .c0WMMMWk. .OMMMMMMWKl. .OMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMNOo:'. ....... ,k0KOc..lXMMMWO; .xWWx. ,OWMMMMMMM0; '0Nklc:;'.. ;0MMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMXl. .;lxd:. .,cl:,','. ,KMMMWx. cXMMMMX: 'Ox. .oNMMMMMMMMMMX: ..:OWd ':lodONMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMWk' ,dXWWO,.'lOXNk,... :x; 'xWMMWk. lNMMMMO. .. .kWMMMMMMMMMMMM0' lKNWMMKl. ,xNMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMM0' ,KMMMK, :XMMWd..dKd..cd. .oNMMWl .OMMMMX; :KMMMMMMMMMMMMMMWl lWMMMMMMXx; ;0WMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMx. ,KMMMNl .:llc. .,'. .OMMMk. dMMMMX; .xNMMMMMMMMMMMMMMMMx. :NMMMMMMMMNx. 'OMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMK, 'dKWMNkl:;;::cloddxkkl. dMMMO. oWWMM0' lWMMMMMWX0OOOOO00Od, .dWMMMNXKK0ko' dMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMO' .;lxOKXNWWMMMWWWWNNXo. dMMM0' lNWMWd .OMMMMMKc. .dWMNk:'... .,dXMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMXo' ..',,;;;,,'''... .xMMMO. oWWMK, cNMMMMWl 'kWO. .codkOKWMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMNk; .kMMMx..OMMNl 'OMMMMMM0:. .ONx, 'xNMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMNd. ,lxkkxl, .xMMMKdOWMNo..xWMMMMMMMW0c. .lXMMNO, .dWMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMWO' :XMMMMMMNk' ,0MMMMW0x:..dWMMMMMMMMMMWk' .;odxOXWMMMWNl lWMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMK: '0MMMMMMMMK; .cool;. .;OWMMMMMMMMMMMMMk. .ckkkxdol:;,. ,0MMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNo. :XMMMMMMMMK, .cx0WMMMMMMMMMMMMMMMNc ...',;cokXMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWx. ;0WMMMMMMM0; cNMMMMMMMMMMMMMMMMMMX; .dkkOO0KXNWMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWO, .cONMMMMMMNx;...'lXMMMMMMMMMMMMMMMWXOo, cOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN0kdc. 'cxKNWWWWNK00KXXKK00Okkxdoolc:;'. .cKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMXo'. ..',,,,'''...... ;0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMXo,'....',,;::cccccccccllllllooooooooooooollllllllllodONMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNXXXNWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM // SPDX-License-Identifier: MIT pragma solidity 0.8.18; import {Sales} from "./Sales.sol"; contract KillerAcidFunOriginalsSales is Sales { constructor() Sales( 0x00000000000076A84feF008CDAbe6409d2FE638B, 0xda3Bb6122BDC762Fb83D37AD2b09e7F2Cf6612f5 ) {} }
// 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.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// 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.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.18; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "./delegatecash/IDelegationRegistry.sol"; interface IReleases { function releaseExists(uint256 __id) external view returns (bool); function mint(address __account, uint256 __id, uint256 __amount) external; function maxSupply(uint __id) external returns (uint256); } contract Sales is Ownable, ReentrancyGuard { error AmountExceedsWalletLimit(); error Forbidden(); error HasEnded(); error HasNotStarted(); error HasStarted(); error IncorrectPrice(); error InvalidAddress(); error InvalidProof(); error InvalidStart(); error InvalidTimeframe(); error LimitGreaterThanSupply(); error MerkleRootNotSet(); error NotDelegatedError(); error ProofIsRequired(); error ReleaseNotFound(); error SaleNotFound(); error WithdrawFailed(); event SaleCreated(uint256 __tokenID, uint256 __saleID); event SalePriceUpdated( uint256 __tokenID, uint256 __saleID, uint256 __price ); event SaleStartUpdated( uint256 __tokenID, uint256 __saleID, uint256 __start ); event SaleEndUpdated(uint256 __tokenID, uint256 __saleID, uint256 __end); event SaleWalletLimitUpdated( uint256 __tokenID, uint256 __saleID, uint256 __walletLimit ); event SaleMerkleRootUpdated( uint256 __tokenID, uint256 __saleID, bytes32 __merkleRoot ); struct Sale { uint256 price; uint256 start; uint256 end; uint256 walletLimit; bytes32 merkleRoot; } IDelegationRegistry private _delegateContract; IReleases private _releasesContract; // Mapping of sales mapping(uint256 => Sale[]) private _sales; // Mapping of wallet sales mapping(uint256 => mapping(uint256 => mapping(address => uint256))) private _walletSales; /** * @dev Sets releases contract using contract address upon construction. */ constructor( address __delegateContractAddress, address __releasesContractAddress ) { if ( __delegateContractAddress == address(0) || __releasesContractAddress == address(0) || __delegateContractAddress == __releasesContractAddress ) { revert InvalidAddress(); } _delegateContract = IDelegationRegistry(__delegateContractAddress); _releasesContract = IReleases(__releasesContractAddress); } //////////////////////////////////////////////////////////////////////////// // MODIFIERS //////////////////////////////////////////////////////////////////////////// /** * @dev Checks if sale exists. * * Requirements: * * - `__id` must be of existing release. */ modifier onlyExistingSale(uint256 __tokenID, uint256 __saleID) { if (__saleID >= _sales[__tokenID].length) { revert SaleNotFound(); } _; } /** * @dev Checks if sender is EOA. * * Requirements: * * - Sender must be EOA. */ modifier onlyEOA() { if (tx.origin != msg.sender) { revert Forbidden(); } _; } //////////////////////////////////////////////////////////////////////////// // INTERNALS //////////////////////////////////////////////////////////////////////////// /** * @dev Used to complete purchase. * * Requirements: * * - `__tokenID` must be of existing release. * - `__saleID` must be of existing sale. * - `__amount` plus current wallet sales cannot exceed wallet limit. * - `msg.value` must be correct price of sale. * - `block.timestampe` must be within sale timeframe. */ function _buy( address __account, uint256 __tokenID, uint256 __saleID, uint256 __amount ) internal { Sale memory sale = _sales[__tokenID][__saleID]; if (sale.walletLimit != 0) { if ( _walletSales[__tokenID][__saleID][__account] + __amount > sale.walletLimit ) revert AmountExceedsWalletLimit(); } if (sale.price * __amount != msg.value) { revert IncorrectPrice(); } if (sale.start > 0 && block.timestamp < sale.start) { revert HasNotStarted(); } if (sale.end > 0 && block.timestamp > sale.end) { revert HasEnded(); } _walletSales[__tokenID][__saleID][__account] = _walletSales[__tokenID][__saleID][__account] + __amount; _releasesContract.mint(__account, __tokenID, __amount); } /** * @dev Used to verify merkle proof. * * Requirements: * * - Sale's `merkleRoot` must be set. */ function _verifyProof( address __sender, uint256 __tokenID, uint256 __saleID, bytes32[] calldata __proof ) internal view { if (_sales[__tokenID][__saleID].merkleRoot == 0x0) revert MerkleRootNotSet(); bool verified = MerkleProof.verify( __proof, _sales[__tokenID][__saleID].merkleRoot, keccak256(abi.encodePacked(__sender)) ); if (!verified) revert InvalidProof(); } //////////////////////////////////////////////////////////////////////////// // OWNER //////////////////////////////////////////////////////////////////////////// /** * @dev Used to create a new sale. * * Requirements: * * - `__tokenID` must be of existing release. * - `__start` must be later than current time. * - `__start` must be earlier than `__end`. * - `__walletLimit` must be less or equal to max supply of release. * * Emits a {SaleCreated} event. * */ function createSale( uint256 __tokenID, uint256 __price, uint256 __start, uint256 __end, uint256 __walletLimit, bytes32 __merkleRoot ) external onlyOwner { if (!_releasesContract.releaseExists(__tokenID)) { revert ReleaseNotFound(); } if (__start > 0 && block.timestamp > __start) revert InvalidStart(); if (__end > 0 && __start > __end) revert InvalidTimeframe(); if ( _releasesContract.maxSupply(__tokenID) > 0 && __walletLimit > _releasesContract.maxSupply(__tokenID) ) revert LimitGreaterThanSupply(); _sales[__tokenID].push( Sale({ price: __price, start: __start, end: __end, walletLimit: __walletLimit, merkleRoot: __merkleRoot }) ); emit SaleCreated(__tokenID, _sales[__tokenID].length - 1); } /** * @dev Used to update the merkle root of a sale. * * Emits a {SaleMerkleRootUpdated} event. * */ function editMerkleRoot( uint256 __tokenID, uint256 __saleID, bytes32 __merkleRoot ) external onlyOwner onlyExistingSale(__tokenID, __saleID) { _sales[__tokenID][__saleID].merkleRoot = __merkleRoot; emit SaleMerkleRootUpdated(__tokenID, __saleID, __merkleRoot); } /** * @dev Used to update the price of a sale. * * Emits a {SalePriceUpdated} event. * */ function editPrice( uint256 __tokenID, uint256 __saleID, uint256 __price ) external onlyOwner onlyExistingSale(__tokenID, __saleID) { _sales[__tokenID][__saleID].price = __price; emit SalePriceUpdated(__tokenID, __saleID, __price); } /** * @dev Used to update the start/end timeframe of a sale. * * Requirements: * * - Sale must not have already started. * - `__start` must be later than current time. * - `__start` must be earlier than sale end. * * Emits a {SaleStartUpdated} event. * */ function editStart( uint256 __tokenID, uint256 __saleID, uint256 __start ) external onlyOwner onlyExistingSale(__tokenID, __saleID) { if (block.timestamp >= _sales[__tokenID][__saleID].start) revert HasStarted(); if (__start > 0 && block.timestamp > __start) revert InvalidStart(); if ( _sales[__tokenID][__saleID].end > 0 && __start > _sales[__tokenID][__saleID].end ) revert InvalidTimeframe(); _sales[__tokenID][__saleID].start = __start; emit SaleStartUpdated(__tokenID, __saleID, __start); } /** * @dev Used to update the start/end timeframe of a sale. * * Requirements: * * - Sale must not have already ended. * - `__end` must be later than sale start. * * Emits a {SaleEndUpdated} event. * */ function editEnd( uint256 __tokenID, uint256 __saleID, uint256 __end ) external onlyOwner onlyExistingSale(__tokenID, __saleID) { if ( _sales[__tokenID][__saleID].end > 0 && block.timestamp >= _sales[__tokenID][__saleID].end ) revert HasEnded(); if (__end > 0 && _sales[__tokenID][__saleID].start > __end) revert InvalidTimeframe(); _sales[__tokenID][__saleID].end = __end; emit SaleEndUpdated(__tokenID, __saleID, __end); } /** * @dev Used to update the wallet limit of a sale. * * Requirements: * * - `__walletLimit` must be less or equal to max supply of release. * * Emits a {SaleWalletLimitUpdated} event. * */ function editWalletLimit( uint256 __tokenID, uint256 __saleID, uint256 __walletLimit ) external onlyOwner onlyExistingSale(__tokenID, __saleID) { if ( _releasesContract.maxSupply(__tokenID) > 0 && __walletLimit > _releasesContract.maxSupply(__tokenID) ) revert LimitGreaterThanSupply(); _sales[__tokenID][__saleID].walletLimit = __walletLimit; emit SaleWalletLimitUpdated(__tokenID, __saleID, __walletLimit); } /** * @dev Used to end a sale immediately. * * Requirements: * * - Sale must not have already ended. * * Emits a {SaleEndUpdated} event. * */ function endSale( uint256 __tokenID, uint256 __saleID ) external onlyOwner onlyExistingSale(__tokenID, __saleID) { if ( _sales[__tokenID][__saleID].end > 0 && block.timestamp >= _sales[__tokenID][__saleID].end ) revert HasEnded(); _sales[__tokenID][__saleID].end = block.timestamp; emit SaleEndUpdated(__tokenID, __saleID, block.timestamp); } /** * @dev Used to withdraw funds from the contract. */ function withdraw(uint256 amount) external onlyOwner { (bool success, ) = owner().call{value: amount}(""); if (!success) revert WithdrawFailed(); } /** * @dev Used to withdraw all funds from the contract. */ function withdrawAll() external onlyOwner { (bool success, ) = owner().call{value: address(this).balance}(""); if (!success) revert WithdrawFailed(); } //////////////////////////////////////////////////////////////////////////// // WRITES //////////////////////////////////////////////////////////////////////////// /** * @dev Buys a release. */ function buy( uint256 __tokenID, uint256 __saleID, uint256 __amount ) external payable nonReentrant onlyEOA onlyExistingSale(__tokenID, __saleID) { if (_sales[__tokenID][__saleID].merkleRoot != 0x0) revert ProofIsRequired(); _buy(_msgSender(), __tokenID, __saleID, __amount); } /** * @dev Buys a release with a merkle proof. */ function buyWithProof( uint256 __tokenID, uint256 __saleID, uint256 __amount, bytes32[] calldata __proof ) external payable nonReentrant onlyEOA onlyExistingSale(__tokenID, __saleID) { _verifyProof(_msgSender(), __tokenID, __saleID, __proof); _buy(_msgSender(), __tokenID, __saleID, __amount); } /** * @dev Buys a release using a vault via delegate.cash. */ function delegatedBuy( address __vault, uint256 __tokenID, uint256 __saleID, uint256 __amount ) external payable nonReentrant onlyEOA onlyExistingSale(__tokenID, __saleID) { if (_sales[__tokenID][__saleID].merkleRoot != 0x0) revert ProofIsRequired(); if ( !_delegateContract.checkDelegateForContract( _msgSender(), __vault, address(this) ) ) { revert NotDelegatedError(); } _buy(__vault, __tokenID, __saleID, __amount); } /** * @dev Buys a release with a merkle proof using a vault via delegate.cash. */ function delegatedBuyWithProof( address __vault, uint256 __tokenID, uint256 __saleID, uint256 __amount, bytes32[] calldata __proof ) external payable nonReentrant onlyEOA onlyExistingSale(__tokenID, __saleID) { if ( !_delegateContract.checkDelegateForContract( _msgSender(), __vault, address(this) ) ) { revert NotDelegatedError(); } _verifyProof(__vault, __tokenID, __saleID, __proof); _buy(__vault, __tokenID, __saleID, __amount); } //////////////////////////////////////////////////////////////////////////// // READS //////////////////////////////////////////////////////////////////////////// /** * @dev Returns a release sale. */ function getSale( uint256 __tokenID, uint256 __saleID ) external view onlyExistingSale(__tokenID, __saleID) returns (Sale memory) { return _sales[__tokenID][__saleID]; } /** * @dev Returns number of wallet sales per release. */ function getWalletSales( address __account, uint256 __tokenID, uint256 __saleID ) external view onlyExistingSale(__tokenID, __saleID) returns (uint256) { return _walletSales[__tokenID][__saleID][__account]; } /** * @dev Returns number of sales per release. */ function totalSales(uint256 __tokenID) external view returns (uint256) { return _sales[__tokenID].length; } }
// SPDX-License-Identifier: CC0-1.0 pragma solidity ^0.8.17; /** * @title An immutable registry contract to be deployed as a standalone primitive * @dev See EIP-5639, new project launches can read previous cold wallet -> hot wallet delegations * from here and integrate those permissions into their flow */ interface IDelegationRegistry { /// @notice Delegation type enum DelegationType { NONE, ALL, CONTRACT, TOKEN } /// @notice Info about a single delegation, used for onchain enumeration struct DelegationInfo { DelegationType type_; address vault; address delegate; address contract_; uint256 tokenId; } /// @notice Info about a single contract-level delegation struct ContractDelegation { address contract_; address delegate; } /// @notice Info about a single token-level delegation struct TokenDelegation { address contract_; uint256 tokenId; address delegate; } /// @notice Emitted when a user delegates their entire wallet event DelegateForAll(address vault, address delegate, bool value); /// @notice Emitted when a user delegates a specific contract event DelegateForContract(address vault, address delegate, address contract_, bool value); /// @notice Emitted when a user delegates a specific token event DelegateForToken(address vault, address delegate, address contract_, uint256 tokenId, bool value); /// @notice Emitted when a user revokes all delegations event RevokeAllDelegates(address vault); /// @notice Emitted when a user revoes all delegations for a given delegate event RevokeDelegate(address vault, address delegate); /** * ----------- WRITE ----------- */ /** * @notice Allow the delegate to act on your behalf for all contracts * @param delegate The hotwallet to act on your behalf * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForAll(address delegate, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific contract * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForContract(address delegate, address contract_, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific token * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external; /** * @notice Revoke all delegates */ function revokeAllDelegates() external; /** * @notice Revoke a specific delegate for all their permissions * @param delegate The hotwallet to revoke */ function revokeDelegate(address delegate) external; /** * @notice Remove yourself as a delegate for a specific vault * @param vault The vault which delegated to the msg.sender, and should be removed */ function revokeSelf(address vault) external; /** * ----------- READ ----------- */ /** * @notice Returns all active delegations a given delegate is able to claim on behalf of * @param delegate The delegate that you would like to retrieve delegations for * @return info Array of DelegationInfo structs */ function getDelegationsByDelegate(address delegate) external view returns (DelegationInfo[] memory); /** * @notice Returns an array of wallet-level delegates for a given vault * @param vault The cold wallet who issued the delegation * @return addresses Array of wallet-level delegates for a given vault */ function getDelegatesForAll(address vault) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault and contract * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract you're delegating * @return addresses Array of contract-level delegates for a given vault and contract */ function getDelegatesForContract(address vault, address contract_) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault's token * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract holding the token * @param tokenId The token id for the token you're delegating * @return addresses Array of contract-level delegates for a given vault's token */ function getDelegatesForToken(address vault, address contract_, uint256 tokenId) external view returns (address[] memory); /** * @notice Returns all contract-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of ContractDelegation structs */ function getContractLevelDelegations(address vault) external view returns (ContractDelegation[] memory delegations); /** * @notice Returns all token-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of TokenDelegation structs */ function getTokenLevelDelegations(address vault) external view returns (TokenDelegation[] memory delegations); /** * @notice Returns true if the address is delegated to act on the entire vault * @param delegate The hotwallet to act on your behalf * @param vault The cold wallet who issued the delegation */ function checkDelegateForAll(address delegate, address vault) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a token contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForContract(address delegate, address vault, address contract_) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a specific token, the token's contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId) external view returns (bool); }
{ "remappings": [ "@openzeppelin/=lib/openzeppelin-contracts/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountExceedsWalletLimit","type":"error"},{"inputs":[],"name":"Forbidden","type":"error"},{"inputs":[],"name":"HasEnded","type":"error"},{"inputs":[],"name":"HasNotStarted","type":"error"},{"inputs":[],"name":"HasStarted","type":"error"},{"inputs":[],"name":"IncorrectPrice","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidStart","type":"error"},{"inputs":[],"name":"InvalidTimeframe","type":"error"},{"inputs":[],"name":"LimitGreaterThanSupply","type":"error"},{"inputs":[],"name":"MerkleRootNotSet","type":"error"},{"inputs":[],"name":"NotDelegatedError","type":"error"},{"inputs":[],"name":"ProofIsRequired","type":"error"},{"inputs":[],"name":"ReleaseNotFound","type":"error"},{"inputs":[],"name":"SaleNotFound","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"__tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__saleID","type":"uint256"}],"name":"SaleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"__tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__saleID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__end","type":"uint256"}],"name":"SaleEndUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"__tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__saleID","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"__merkleRoot","type":"bytes32"}],"name":"SaleMerkleRootUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"__tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__saleID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__price","type":"uint256"}],"name":"SalePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"__tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__saleID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__start","type":"uint256"}],"name":"SaleStartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"__tokenID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__saleID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"__walletLimit","type":"uint256"}],"name":"SaleWalletLimitUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__amount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__amount","type":"uint256"},{"internalType":"bytes32[]","name":"__proof","type":"bytes32[]"}],"name":"buyWithProof","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__price","type":"uint256"},{"internalType":"uint256","name":"__start","type":"uint256"},{"internalType":"uint256","name":"__end","type":"uint256"},{"internalType":"uint256","name":"__walletLimit","type":"uint256"},{"internalType":"bytes32","name":"__merkleRoot","type":"bytes32"}],"name":"createSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"__vault","type":"address"},{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__amount","type":"uint256"}],"name":"delegatedBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"__vault","type":"address"},{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__amount","type":"uint256"},{"internalType":"bytes32[]","name":"__proof","type":"bytes32[]"}],"name":"delegatedBuyWithProof","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__end","type":"uint256"}],"name":"editEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"bytes32","name":"__merkleRoot","type":"bytes32"}],"name":"editMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__price","type":"uint256"}],"name":"editPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__start","type":"uint256"}],"name":"editStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"},{"internalType":"uint256","name":"__walletLimit","type":"uint256"}],"name":"editWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"}],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"}],"name":"getSale","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"walletLimit","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"internalType":"struct Sales.Sale","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"__account","type":"address"},{"internalType":"uint256","name":"__tokenID","type":"uint256"},{"internalType":"uint256","name":"__saleID","type":"uint256"}],"name":"getWalletSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"__tokenID","type":"uint256"}],"name":"totalSales","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506d76a84fef008cdabe6409d2fe638b73da3bb6122bdc762fb83d37ad2b09e7f2cf6612f56200004133620000d1565b600180556001600160a01b03821615806200006357506001600160a01b038116155b80620000805750806001600160a01b0316826001600160a01b0316145b156200009f5760405163e6c4247b60e01b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b0319918216179091556003805492909316911617905562000121565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6123d480620001316000396000f3fe6080604052600436106101445760003560e01c8063a3568e7c116100c0578063d6dfa50f11610074578063f2fde38b11610059578063f2fde38b14610378578063f4350b9414610398578063f94d9185146103b857600080fd5b8063d6dfa50f14610345578063eef602231461036557600080fd5b8063b43348e8116100a5578063b43348e814610295578063bf3f6b3d146102a8578063c75c5970146102e357600080fd5b8063a3568e7c14610255578063af80bea21461027557600080fd5b806340993b26116101175780637bf5e06b116100fc5780637bf5e06b146101e6578063853828b6146102065780638da5cb5b1461021b57600080fd5b806340993b26146101be578063715018a6146101d157600080fd5b80630498116f146101495780630bae9df31461016b5780632e1a7d4d1461017e5780633bcdce231461019e575b600080fd5b34801561015557600080fd5b50610169610164366004612018565b6103d8565b005b6101696101793660046120a7565b610765565b34801561018a57600080fd5b50610169610199366004612108565b61081c565b3480156101aa57600080fd5b506101696101b9366004612121565b6108c2565b6101696101cc366004612121565b610aed565b3480156101dd57600080fd5b50610169610c02565b3480156101f257600080fd5b50610169610201366004612121565b610c16565b34801561021257600080fd5b50610169610e00565b34801561022757600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026157600080fd5b50610169610270366004612121565b610ea5565b34801561028157600080fd5b50610169610290366004612121565b610f6f565b6101696102a3366004612176565b6111a5565b3480156102b457600080fd5b506102d56102c3366004612108565b60009081526004602052604090205490565b60405190815260200161024c565b3480156102ef57600080fd5b506103036102fe3660046121af565b6113ab565b60405161024c9190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561035157600080fd5b50610169610360366004612121565b6114a0565b6101696103733660046121d1565b611567565b34801561038457600080fd5b50610169610393366004612242565b61170f565b3480156103a457600080fd5b506101696103b33660046121af565b6117c8565b3480156103c457600080fd5b506102d56103d336600461225d565b611942565b6103e06119ce565b6003546040517f1137660a0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff90911690631137660a90602401602060405180830381865afa15801561044f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104739190612290565b6104a9576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841180156104b857508342115b156104ef576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831180156104fe57508284115b15610535576040517fa97de69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810188905260009173ffffffffffffffffffffffffffffffffffffffff169063869f7594906024016020604051808303816000875af11580156105a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cb91906122b2565b11801561066b57506003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff9091169063869f7594906024016020604051808303816000875af1158015610644573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066891906122b2565b82115b156106a1576040517eb0dfe600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460208181526040808420815160a0810183528a81528084018a81529281018981526060820189815260808301898152845460018181018755868b52888b2095516005909202909501908155955186850155915160028601555160038501555192850192909255938a905291905290547f35f25ba6c68be9e7f0a8a50f4d284bb035a4a21d856a0e7d3fd7945079c5ab3091889161074591906122fa565b6040805192835260208301919091520160405180910390a1505050505050565b61076d611a4f565b3233146107a6576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020548590859081106107f1576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107fe3388888787611ac2565b61080a33888888611c29565b505061081560018055565b5050505050565b6108246119ce565b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d806000811461087e576040519150601f19603f3d011682016040523d82523d6000602084013e610883565b606091505b50509050806108be576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6108ca6119ce565b600083815260046020526040902054839083908110610915576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054859081106109355761093561230d565b906000526020600020906005020160010154421061097f576040517ffc505be900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008311801561098e57508242115b156109c5576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604081208054869081106109e5576109e561230d565b906000526020600020906005020160020154118015610a3457506000858152600460205260409020805485908110610a1f57610a1f61230d565b90600052602060002090600502016002015483115b15610a6b576040517fa97de69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805484919086908110610a8e57610a8e61230d565b6000918252602091829020600160059092020101919091556040805187815291820186905281018490527f15dd9e7f83b04fbc5b7a752401ccee796f0fd9db7097a443b0e578a4f4ace183906060015b60405180910390a15050505050565b610af5611a4f565b323314610b2e576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260046020526040902054839083908110610b79576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805485908110610b9957610b9961230d565b9060005260206000209060050201600401546000801b14610be6576040517f13be407500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bf233868686611c29565b5050610bfd60018055565b505050565b610c0a6119ce565b610c146000611f0c565b565b610c1e6119ce565b600083815260046020526040902054839083908110610c69576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260408120805486908110610c8957610c8961230d565b906000526020600020906005020160020154118015610cd957506000858152600460205260409020805485908110610cc357610cc361230d565b9060005260206000209060050201600201544210155b15610d10576040517f0cbb94e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083118015610d5257506000858152600460205260409020805484919086908110610d3e57610d3e61230d565b906000526020600020906005020160010154115b15610d89576040517fa97de69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805484919086908110610dac57610dac61230d565b6000918252602091829020600260059092020101919091556040805187815291820186905281018490527f20f13b82dcb15f40ef675301d9333b7658221c2a59d1249967da726da68b805690606001610ade565b610e086119ce565b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169047908381818185875af1925050503d8060008114610e62576040519150601f19603f3d011682016040523d82523d6000602084013e610e67565b606091505b5050905080610ea2576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610ead6119ce565b600083815260046020526040902054839083908110610ef8576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805484919086908110610f1b57610f1b61230d565b6000918252602091829020600460059092020101919091556040805187815291820186905281018490527fb4f1ea28a6a7126590c834383e0be21b087e8fad77c9efc638362f519eb95a2290606001610ade565b610f776119ce565b600083815260046020526040902054839083908110610fc2576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810187905260009173ffffffffffffffffffffffffffffffffffffffff169063869f7594906024016020604051808303816000875af1158015611034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105891906122b2565b1180156110f857506003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff9091169063869f7594906024016020604051808303816000875af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906122b2565b83115b1561112e576040517eb0dfe600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054849190869081106111515761115161230d565b6000918252602091829020600360059092020101919091556040805187815291820186905281018490527f56c12c2a4c38c2805d5523f887b9a220a87975712005ceabda08b7048111091c90606001610ade565b6111ad611a4f565b3233146111e6576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260046020526040902054839083908110611231576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054859081106112515761125161230d565b9060005260206000209060050201600401546000801b1461129e576040517f13be407500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166390c9a2d0336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff91821660048201529089166024820152306044820152606401602060405180830381865afa158015611334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113589190612290565b61138e576040517f3d94debd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139a86868686611c29565b50506113a560018055565b50505050565b6113e06040518060a0016040528060008152602001600081526020016000815260200160008152602001600080191681525090565b60008381526004602052604090205483908390811061142b576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260046020526040902080548590811061144b5761144b61230d565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509250505092915050565b6114a86119ce565b6000838152600460205260409020548390839081106114f3576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054849190869081106115165761151661230d565b6000918252602091829020600590910201919091556040805187815291820186905281018490527fae83572f861e1ad5a0091d29986e73633965028088f707f39079ed27236f889c90606001610ade565b61156f611a4f565b3233146115a8576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020548590859081106115f3576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166390c9a2d0336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9182166004820152908b166024820152306044820152606401602060405180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612290565b6116e3576040517f3d94debd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f08888888787611ac2565b6116fc88888888611c29565b505061170760018055565b505050505050565b6117176119ce565b73ffffffffffffffffffffffffffffffffffffffff81166117bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610ea281611f0c565b6117d06119ce565b60008281526004602052604090205482908290811061181b576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260046020526040812080548590811061183b5761183b61230d565b90600052602060002090600502016002015411801561188b575060008481526004602052604090208054849081106118755761187561230d565b9060005260206000209060050201600201544210155b156118c2576040517f0cbb94e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526004602052604090208054429190859081106118e5576118e561230d565b6000918252602091829020600260059092020101919091556040805186815291820185905242908201527f20f13b82dcb15f40ef675301d9333b7658221c2a59d1249967da726da68b80569060600160405180910390a150505050565b60008281526004602052604081205483908390811061198d576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050600091825260056020908152604080842092845291815281832073ffffffffffffffffffffffffffffffffffffffff94909416835292909252205490565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016117b6565b600260015403611abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016117b6565b6002600155565b6000848152600460205260409020805484908110611ae257611ae261230d565b9060005260206000209060050201600401546000801b03611b2f576040517f9f8a28f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bf083838080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508a8152600460205260409020805490935089925082109050611b8757611b8761230d565b90600052602060002090600502016004015488604051602001611bd5919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b60405160208183030381529060405280519060200120611f81565b905080611707576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600460205260408120805484908110611c4957611c4961230d565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090508060600151600014611d225760608101516000858152600560209081526040808320878452825280832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054611cea90849061233c565b1115611d22576040517fbdf8ae8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80513490611d3190849061234f565b14611d68576040517f99b5cb1d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160200151118015611d7f5750806020015142105b15611db6576040517fedfcf79700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160400151118015611dcd5750806040015142115b15611e04576040517f0cbb94e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560209081526040808320868452825280832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611e4790839061233c565b6000858152600560209081526040808320878452825280832073ffffffffffffffffffffffffffffffffffffffff8a811680865291909352928190209390935560035492517f156e29f600000000000000000000000000000000000000000000000000000000815260048101929092526024820187905260448201859052919091169063156e29f690606401600060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082611f8e8584611f97565b14949350505050565b600081815b8451811015611fdc57611fc882868381518110611fbb57611fbb61230d565b6020026020010151611fe6565b915080611fd481612366565b915050611f9c565b5090505b92915050565b6000818310612002576000828152602084905260409020612011565b60008381526020839052604090205b9392505050565b60008060008060008060c0878903121561203157600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008083601f84011261206d57600080fd5b50813567ffffffffffffffff81111561208557600080fd5b6020830191508360208260051b85010111156120a057600080fd5b9250929050565b6000806000806000608086880312156120bf57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156120eb57600080fd5b6120f78882890161205b565b969995985093965092949392505050565b60006020828403121561211a57600080fd5b5035919050565b60008060006060848603121561213657600080fd5b505081359360208301359350604090920135919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461217157600080fd5b919050565b6000806000806080858703121561218c57600080fd5b6121958561214d565b966020860135965060408601359560600135945092505050565b600080604083850312156121c257600080fd5b50508035926020909101359150565b60008060008060008060a087890312156121ea57600080fd5b6121f38761214d565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff81111561222457600080fd5b61223089828a0161205b565b979a9699509497509295939492505050565b60006020828403121561225457600080fd5b6120118261214d565b60008060006060848603121561227257600080fd5b61227b8461214d565b95602085013595506040909401359392505050565b6000602082840312156122a257600080fd5b8151801515811461201157600080fd5b6000602082840312156122c457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115611fe057611fe06122cb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611fe057611fe06122cb565b8082028115828204841417611fe057611fe06122cb565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612397576123976122cb565b506001019056fea2646970667358221220cbd23e498fc15440120955dfccd28654a22a084920cdd9a04a59cb118d9bcf6f64736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101445760003560e01c8063a3568e7c116100c0578063d6dfa50f11610074578063f2fde38b11610059578063f2fde38b14610378578063f4350b9414610398578063f94d9185146103b857600080fd5b8063d6dfa50f14610345578063eef602231461036557600080fd5b8063b43348e8116100a5578063b43348e814610295578063bf3f6b3d146102a8578063c75c5970146102e357600080fd5b8063a3568e7c14610255578063af80bea21461027557600080fd5b806340993b26116101175780637bf5e06b116100fc5780637bf5e06b146101e6578063853828b6146102065780638da5cb5b1461021b57600080fd5b806340993b26146101be578063715018a6146101d157600080fd5b80630498116f146101495780630bae9df31461016b5780632e1a7d4d1461017e5780633bcdce231461019e575b600080fd5b34801561015557600080fd5b50610169610164366004612018565b6103d8565b005b6101696101793660046120a7565b610765565b34801561018a57600080fd5b50610169610199366004612108565b61081c565b3480156101aa57600080fd5b506101696101b9366004612121565b6108c2565b6101696101cc366004612121565b610aed565b3480156101dd57600080fd5b50610169610c02565b3480156101f257600080fd5b50610169610201366004612121565b610c16565b34801561021257600080fd5b50610169610e00565b34801561022757600080fd5b5060005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026157600080fd5b50610169610270366004612121565b610ea5565b34801561028157600080fd5b50610169610290366004612121565b610f6f565b6101696102a3366004612176565b6111a5565b3480156102b457600080fd5b506102d56102c3366004612108565b60009081526004602052604090205490565b60405190815260200161024c565b3480156102ef57600080fd5b506103036102fe3660046121af565b6113ab565b60405161024c9190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561035157600080fd5b50610169610360366004612121565b6114a0565b6101696103733660046121d1565b611567565b34801561038457600080fd5b50610169610393366004612242565b61170f565b3480156103a457600080fd5b506101696103b33660046121af565b6117c8565b3480156103c457600080fd5b506102d56103d336600461225d565b611942565b6103e06119ce565b6003546040517f1137660a0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff90911690631137660a90602401602060405180830381865afa15801561044f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104739190612290565b6104a9576040517f28663ff800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841180156104b857508342115b156104ef576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831180156104fe57508284115b15610535576040517fa97de69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810188905260009173ffffffffffffffffffffffffffffffffffffffff169063869f7594906024016020604051808303816000875af11580156105a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cb91906122b2565b11801561066b57506003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff9091169063869f7594906024016020604051808303816000875af1158015610644573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066891906122b2565b82115b156106a1576040517eb0dfe600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460208181526040808420815160a0810183528a81528084018a81529281018981526060820189815260808301898152845460018181018755868b52888b2095516005909202909501908155955186850155915160028601555160038501555192850192909255938a905291905290547f35f25ba6c68be9e7f0a8a50f4d284bb035a4a21d856a0e7d3fd7945079c5ab3091889161074591906122fa565b6040805192835260208301919091520160405180910390a1505050505050565b61076d611a4f565b3233146107a6576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020548590859081106107f1576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107fe3388888787611ac2565b61080a33888888611c29565b505061081560018055565b5050505050565b6108246119ce565b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d806000811461087e576040519150601f19603f3d011682016040523d82523d6000602084013e610883565b606091505b50509050806108be576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b6108ca6119ce565b600083815260046020526040902054839083908110610915576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054859081106109355761093561230d565b906000526020600020906005020160010154421061097f576040517ffc505be900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008311801561098e57508242115b156109c5576040517f38356e4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604081208054869081106109e5576109e561230d565b906000526020600020906005020160020154118015610a3457506000858152600460205260409020805485908110610a1f57610a1f61230d565b90600052602060002090600502016002015483115b15610a6b576040517fa97de69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805484919086908110610a8e57610a8e61230d565b6000918252602091829020600160059092020101919091556040805187815291820186905281018490527f15dd9e7f83b04fbc5b7a752401ccee796f0fd9db7097a443b0e578a4f4ace183906060015b60405180910390a15050505050565b610af5611a4f565b323314610b2e576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260046020526040902054839083908110610b79576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805485908110610b9957610b9961230d565b9060005260206000209060050201600401546000801b14610be6576040517f13be407500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bf233868686611c29565b5050610bfd60018055565b505050565b610c0a6119ce565b610c146000611f0c565b565b610c1e6119ce565b600083815260046020526040902054839083908110610c69576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260408120805486908110610c8957610c8961230d565b906000526020600020906005020160020154118015610cd957506000858152600460205260409020805485908110610cc357610cc361230d565b9060005260206000209060050201600201544210155b15610d10576040517f0cbb94e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083118015610d5257506000858152600460205260409020805484919086908110610d3e57610d3e61230d565b906000526020600020906005020160010154115b15610d89576040517fa97de69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805484919086908110610dac57610dac61230d565b6000918252602091829020600260059092020101919091556040805187815291820186905281018490527f20f13b82dcb15f40ef675301d9333b7658221c2a59d1249967da726da68b805690606001610ade565b610e086119ce565b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169047908381818185875af1925050503d8060008114610e62576040519150601f19603f3d011682016040523d82523d6000602084013e610e67565b606091505b5050905080610ea2576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b610ead6119ce565b600083815260046020526040902054839083908110610ef8576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020805484919086908110610f1b57610f1b61230d565b6000918252602091829020600460059092020101919091556040805187815291820186905281018490527fb4f1ea28a6a7126590c834383e0be21b087e8fad77c9efc638362f519eb95a2290606001610ade565b610f776119ce565b600083815260046020526040902054839083908110610fc2576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810187905260009173ffffffffffffffffffffffffffffffffffffffff169063869f7594906024016020604051808303816000875af1158015611034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105891906122b2565b1180156110f857506003546040517f869f75940000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff9091169063869f7594906024016020604051808303816000875af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906122b2565b83115b1561112e576040517eb0dfe600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054849190869081106111515761115161230d565b6000918252602091829020600360059092020101919091556040805187815291820186905281018490527f56c12c2a4c38c2805d5523f887b9a220a87975712005ceabda08b7048111091c90606001610ade565b6111ad611a4f565b3233146111e6576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083815260046020526040902054839083908110611231576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054859081106112515761125161230d565b9060005260206000209060050201600401546000801b1461129e576040517f13be407500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166390c9a2d0336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff91821660048201529089166024820152306044820152606401602060405180830381865afa158015611334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113589190612290565b61138e576040517f3d94debd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139a86868686611c29565b50506113a560018055565b50505050565b6113e06040518060a0016040528060008152602001600081526020016000815260200160008152602001600080191681525090565b60008381526004602052604090205483908390811061142b576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260046020526040902080548590811061144b5761144b61230d565b90600052602060002090600502016040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509250505092915050565b6114a86119ce565b6000838152600460205260409020548390839081106114f3576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090208054849190869081106115165761151661230d565b6000918252602091829020600590910201919091556040805187815291820186905281018490527fae83572f861e1ad5a0091d29986e73633965028088f707f39079ed27236f889c90606001610ade565b61156f611a4f565b3233146115a8576040517fee90c46800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600460205260409020548590859081106115f3576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff166390c9a2d0336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9182166004820152908b166024820152306044820152606401602060405180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612290565b6116e3576040517f3d94debd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f08888888787611ac2565b6116fc88888888611c29565b505061170760018055565b505050505050565b6117176119ce565b73ffffffffffffffffffffffffffffffffffffffff81166117bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610ea281611f0c565b6117d06119ce565b60008281526004602052604090205482908290811061181b576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084815260046020526040812080548590811061183b5761183b61230d565b90600052602060002090600502016002015411801561188b575060008481526004602052604090208054849081106118755761187561230d565b9060005260206000209060050201600201544210155b156118c2576040517f0cbb94e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526004602052604090208054429190859081106118e5576118e561230d565b6000918252602091829020600260059092020101919091556040805186815291820185905242908201527f20f13b82dcb15f40ef675301d9333b7658221c2a59d1249967da726da68b80569060600160405180910390a150505050565b60008281526004602052604081205483908390811061198d576040517f56172c4100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050600091825260056020908152604080842092845291815281832073ffffffffffffffffffffffffffffffffffffffff94909416835292909252205490565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016117b6565b600260015403611abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016117b6565b6002600155565b6000848152600460205260409020805484908110611ae257611ae261230d565b9060005260206000209060050201600401546000801b03611b2f576040517f9f8a28f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bf083838080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508a8152600460205260409020805490935089925082109050611b8757611b8761230d565b90600052602060002090600502016004015488604051602001611bd5919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b60405160208183030381529060405280519060200120611f81565b905080611707576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600460205260408120805484908110611c4957611c4961230d565b90600052602060002090600502016040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090508060600151600014611d225760608101516000858152600560209081526040808320878452825280832073ffffffffffffffffffffffffffffffffffffffff8a168452909152902054611cea90849061233c565b1115611d22576040517fbdf8ae8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80513490611d3190849061234f565b14611d68576040517f99b5cb1d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160200151118015611d7f5750806020015142105b15611db6576040517fedfcf79700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160400151118015611dcd5750806040015142115b15611e04576040517f0cbb94e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600560209081526040808320868452825280832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611e4790839061233c565b6000858152600560209081526040808320878452825280832073ffffffffffffffffffffffffffffffffffffffff8a811680865291909352928190209390935560035492517f156e29f600000000000000000000000000000000000000000000000000000000815260048101929092526024820187905260448201859052919091169063156e29f690606401600060405180830381600087803b158015611eed57600080fd5b505af1158015611f01573d6000803e3d6000fd5b505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082611f8e8584611f97565b14949350505050565b600081815b8451811015611fdc57611fc882868381518110611fbb57611fbb61230d565b6020026020010151611fe6565b915080611fd481612366565b915050611f9c565b5090505b92915050565b6000818310612002576000828152602084905260409020612011565b60008381526020839052604090205b9392505050565b60008060008060008060c0878903121561203157600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008083601f84011261206d57600080fd5b50813567ffffffffffffffff81111561208557600080fd5b6020830191508360208260051b85010111156120a057600080fd5b9250929050565b6000806000806000608086880312156120bf57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156120eb57600080fd5b6120f78882890161205b565b969995985093965092949392505050565b60006020828403121561211a57600080fd5b5035919050565b60008060006060848603121561213657600080fd5b505081359360208301359350604090920135919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461217157600080fd5b919050565b6000806000806080858703121561218c57600080fd5b6121958561214d565b966020860135965060408601359560600135945092505050565b600080604083850312156121c257600080fd5b50508035926020909101359150565b60008060008060008060a087890312156121ea57600080fd5b6121f38761214d565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff81111561222457600080fd5b61223089828a0161205b565b979a9699509497509295939492505050565b60006020828403121561225457600080fd5b6120118261214d565b60008060006060848603121561227257600080fd5b61227b8461214d565b95602085013595506040909401359392505050565b6000602082840312156122a257600080fd5b8151801515811461201157600080fd5b6000602082840312156122c457600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115611fe057611fe06122cb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611fe057611fe06122cb565b8082028115828204841417611fe057611fe06122cb565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612397576123976122cb565b506001019056fea2646970667358221220cbd23e498fc15440120955dfccd28654a22a084920cdd9a04a59cb118d9bcf6f64736f6c63430008120033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,259.02 | 2.94 | $9,581.51 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.