Transaction Hash:
Block:
6433175 at Oct-01-2018 11:28:56 AM +UTC
Transaction Fee:
0.01158794566 ETH
$28.51
Gas Used:
1,459,439 Gas / 7.94 Gwei
Emitted Events:
166 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
167 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8b269631dE7Be4479299813194DbF6939389005A, value=2051927230441354375 )
|
168 |
MerkleMine.Generate( _recipient=0x8b269631dE7Be4479299813194DbF6939389005A, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
169 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
170 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8B26Dd8aA8Ef4D31D19399984e76501c039dDc37, value=2051927230441354375 )
|
171 |
MerkleMine.Generate( _recipient=0x8B26Dd8aA8Ef4D31D19399984e76501c039dDc37, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
172 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
173 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8b282013A1f6Cdf9203AcD69Fa9f3333640CA841, value=2051927230441354375 )
|
174 |
MerkleMine.Generate( _recipient=0x8b282013A1f6Cdf9203AcD69Fa9f3333640CA841, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
175 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
176 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8b2B908F4A077463189f8908465994DB798638ab, value=2051927230441354375 )
|
177 |
MerkleMine.Generate( _recipient=0x8b2B908F4A077463189f8908465994DB798638ab, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
178 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
179 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8b2C2bE5Fb0d96b9447dc74131009a69f47e99C4, value=2051927230441354375 )
|
180 |
MerkleMine.Generate( _recipient=0x8b2C2bE5Fb0d96b9447dc74131009a69f47e99C4, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
181 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
182 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8B2cFc09A3c5e64A9bfDA33283C9377e88954eCb, value=2051927230441354375 )
|
183 |
MerkleMine.Generate( _recipient=0x8B2cFc09A3c5e64A9bfDA33283C9377e88954eCb, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
184 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
185 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8b2E688f8E71DAF5E47CB8dBa3bdBC78921d616D, value=2051927230441354375 )
|
186 |
MerkleMine.Generate( _recipient=0x8b2E688f8E71DAF5E47CB8dBa3bdBC78921d616D, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
187 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
188 |
LivepeerToken.Transfer( from=MerkleMine, to=0xD4653B96C05388D7e8A8710f0Fea83071FA58a79, value=2051927230441354375 )
|
189 |
MerkleMine.Generate( _recipient=0xD4653B96C05388D7e8A8710f0Fea83071FA58a79, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
190 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
191 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8BdDfddc34Bf45Cbefc061500A8ADc08E131458e, value=2051927230441354375 )
|
192 |
MerkleMine.Generate( _recipient=0x8BdDfddc34Bf45Cbefc061500A8ADc08E131458e, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
193 |
LivepeerToken.Transfer( from=MerkleMine, to=[Receiver] MultiMerkleMine, value=389768935675737883 )
|
194 |
LivepeerToken.Transfer( from=MerkleMine, to=0x8bDfcE582fc639AFF748320C27375490116683b3, value=2051927230441354375 )
|
195 |
MerkleMine.Generate( _recipient=0x8bDfcE582fc639AFF748320C27375490116683b3, _caller=[Receiver] MultiMerkleMine, _recipientTokenAmount=2051927230441354375, _callerTokenAmount=389768935675737883, _block=6433175 )
|
196 |
LivepeerToken.Transfer( from=[Receiver] MultiMerkleMine, to=[Sender] 0xd40a4fa0429496da9cf8e453e6e68ba7f4f96f79, value=3897689356757378830 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x58b6A8A3...e733aB239 | |||||
0x8e306b00...766cC15c8 | (Livepeer: Merkle Mine) | ||||
0xd40a4FA0...7f4f96f79 |
2.516243868780157582 Eth
Nonce: 536
|
2.504655923120157582 Eth
Nonce: 537
| 0.01158794566 | ||
0xEA674fdD...16B898ec8
Miner
| (Ethermine) | 906.199127445516776357 Eth | 906.210715391176776357 Eth | 0.01158794566 |
Execution Trace
MultiMerkleMine.multiGenerate( _merkleMineContract=0x8e306b005773bee6bA6A6e8972Bc79D766cC15c8, _recipients=[0x8b269631dE7Be4479299813194DbF6939389005A, 0x8B26Dd8aA8Ef4D31D19399984e76501c039dDc37, 0x8b282013A1f6Cdf9203AcD69Fa9f3333640CA841, 0x8b2B908F4A077463189f8908465994DB798638ab, 0x8b2C2bE5Fb0d96b9447dc74131009a69f47e99C4, 0x8B2cFc09A3c5e64A9bfDA33283C9377e88954eCb, 0x8b2E688f8E71DAF5E47CB8dBa3bdBC78921d616D, 0xD4653B96C05388D7e8A8710f0Fea83071FA58a79, 0x8BdDfddc34Bf45Cbefc061500A8ADc08E131458e, 0x8bDfcE582fc639AFF748320C27375490116683b3], _merkleProofs=0x00000000000000000000000000000000000000000000000000000000000002C0B38472B8DA8144C2C0EA697193804890B9EF0A8E3CFB97B27B1A7F3DF7C518BD5F4C02CCCCBBEA6A72999DEDA01C7A64121635E93F05CA35CBA35595B31C50A10E8D9D4E6E799B54A3B28CF896D54A3957788F1300BE26140508C68CE6D7AC2CF7A5EC356A7C2246564A1CC5F19582C56A7C19F46D64239FC9B7A664F737F64D63956C126CDDCB2B6AFBCBD885600FFED276D85EC364857E8E64847B3D83A82749054B50DFA863982753CEBD61B83C700452078EA894A3DB6A594FBED1D6BE3481C50C9AB64A6A5C8DB20CB2E043AE9FD0C9C9928D6D2209E1A6051CC3BD37AC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC300000000000000000000000000000000000000000000000000000000000002C0B39B228B0DEDCA9760476E0450F3BA732CFEC7C9277E19BE4365C9E7974CE53B7E1E6C4C30C852723282B584AE73C7348B662E7889B613C0D5FCF9BB332C87095AFE2F9D9AAD53DE15D837C44BFC4B00F21F752A2B334124EAB0F64161F143591E7FD9B81A1286A718876A50B7361DC311AE272DBB54DEAD98952746DDF404E4EC45AD126D8F06A3CA61ED735B7831FB2FFE0F3D1AD36EBCA2C58955FAA47DDD49054B50DFA863982753CEBD61B83C700452078EA894A3DB6A594FBED1D6BE3481C50C9AB64A6A5C8DB20CB2E043AE9FD0C9C9928D6D2209E1A6051CC3BD37AC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC300000000000000000000000000000000000000000000000000000000000002C03257FB5C914AFE3B25D3EBF3FE61ACEE4C3E6F602404D7FD49901FB9390A37B5ECFD144EC36957C02CCD1DD0F0DDB7E1C1904939DF91B1F39DBD4B5A8B2B6838E1574C09B8FF0C1736B0F8D43773F7F9BDE8AED6C01D592A3DCF475B193EF57D5DE389F869706C6F099DA5F460B97071B5F59BDE1FF9BB21371ECA65E1467C71498CF6632C4EB15019938E149AAB67F7D7507BB61EAA7D47FCC192B02B20EC381272530780911788FEA6A04C25F7CFED44D6A07F1DB9D6AF95DBC224FFEDEE63453B8E1D0A08A7EFA7EAF49D3889926CB163A9235A0A8165E602D8967E96B4DC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC300000000000000000000000000000000000000000000000000000000000002C0F33725EB82A09676F2C4E2D7617B2A05A3F6A406D2D00D54F111ADCF889930FE9FF5E869D246C0158475069272FD8E66E7A0B2E870FEA28210C76994AE54BC90AF16BADCF19576E5CCF818AA5FEDE3025A52C10ACFD06D5700CF1B59A09027370E0F84C55BE29B470E8561A2A847061AEA514029B730A02680AC02EB589B99C248E8B37A642B6F6323A963E526AEF460E5771821CAF619A0366C83F76CCF9EA44DBC3E83A2F6F4643ACA2CBFDA57C22FEF27440B0C8666B85FB280855E4EF9BEDA5F65C7B78052C329FEDCC7F96A2B0DD486043AF8530C1006EFE62D93F29966E17B6092DD291D8A87B6141358B0CB898FFEF40AB24F7D1C2DC181627918506AC42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC300000000000000000000000000000000000000000000000000000000000002C04F4F1AC515B8585DA330E1C853DD687BFC8EC484182FD14C31965FA4B4E5E4B96DF2E78126AD6AC5B1B53F840BD4E89CE4F81CF9569BA6C791F81EDDBF276469D397BAA283CC1C4AA692DF4DC21F6F603366EDC5AD314BD71D18AC37A8310E95037E39C7A86E0550FB0C0DA5135CA7314BBC37983976EEE9C4224AEA96AE8D2883EE26E937532C97B4BDF641655C618DE694875FD8CE1DC19C8A1B9473ED44734DBC3E83A2F6F4643ACA2CBFDA57C22FEF27440B0C8666B85FB280855E4EF9BEDA5F65C7B78052C329FEDCC7F96A2B0DD486043AF8530C1006EFE62D93F29966E17B6092DD291D8A87B6141358B0CB898FFEF40AB24F7D1C2DC181627918506AC42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC300000000000000000000000000000000000000000000000000000000000002C0230A18E9307129DCB948F2BB8BBE2070DAC3C23AE6408EB648341C3A5C1996558128080D642C05F40CB750EDEF07138B1ED3021C27D978604DF919F97CDBB5A8A3BD1B5D0527FB570FC6FAB8C10070ECB1D003A40E1D2711C2D6B744C1FB53C0184DDE7627AF289EFFAFB78495726FB2B0DB621B6A0165952365A0AF996B47FBE836A56ED02F8AC09F02A37F4C6B3C77DC8D29828D0C63D8DEAE6DDBBD9EB49F9B033C1D0C2170109439DAA1F011B4973FB66CC0EF38ECFB04EAC695DA7D66A06CF24520DCF55FF33B642F9B581B413BD3E297FD0F72FD49313AF58F28ECA818AECF49AC0987FE47EE583EF48DEE0A11D085D882C932825E4EDD5D5CC7677081C42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC300000000000000000000000000000000000000000000000000000000000002C03ADD67D95E6D746016186D86A04B4AD219DEA9DD705DA7DB4533F06FC50B2AFB28B1A5E0AFE3A0D37C45061282BCB746A853E74CF16302B5CC1D50D3BFA11DDD717F9D6B5DBE3445412298B1C305A7EB44175B0DBB31D4C6C1EFAFA51BADEF4846EA933B1B902B6623C6ED64F0CB9FF871D535273821DD324CD34A8156D232F50568195C62BD16E5719012613E50C6EB64332AE5C35ADEBEBE816DF3FBB10B4BE3CE42E5AA3AEC3C1565722F0CF78C0A25992210A91F551820849CC78189854D85ADA1AD562E26B6719E1FB5E21A894A825091F23D0F40FAB28F824F3F11CD18AECF49AC0987FE47EE583EF48DEE0A11D085D882C932825E4EDD5D5CC7677081C42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3000000000000000000000000000000000000000000000000000000000000028072E888A63C6D23035A9A45AA15BDF1E66C23DABBABEE03A5F5EF23A23B886CE2B9E0BF561C24E25BE14FDB8DC5F8D4D483D7F46556707535B398541C513F139F1F5129447E69B0A569918C64796C2CB7110F2B6A4D089EFE64CB98F69ABC3FFE322A5B2FB49BA18F4041EB1DCED54F929DF7018A1DB8CCE1F9ED9E55925A478B4EC79694827824046949F16F791B66B8A5B9299F1030B5D3AB70072283E2A083E3C3F9893C940A472FFCFC852EF9AEBF1EBC37A06C4F4FA0EE10B3BAEB0C5FDF9D036B35A00947016123CFF5315749F8F3CC09609391E4D0E9B642C880325BFC4809CA98B428F219ECC3F62B241BE2BA6662DDDEB8B4C83BE55A82E99704FEBE00546A5D59913298271FC79656CFA63BB80A4692F4B9679492AC9E87C903CB0F8BF0D47BE8D6CB42E518937D0A5D1F47C348487C85CB6F323A344E519F84A71641B988B6A545F45C08DAB68B8D4EF6410B5A796F4875B14619B573A23FAF466D823C9FD3DBDA5865F3E5918E07EAAC5B8E2C1587C95BC80BD44D7219AC0B803A7A3832A6A06F5218D6E097CAE2D5BA00610FA88E95BCDD0B33B9148844DCB22AB3C0EAC4F1425CE775E82D9489E89BDE79A26E467DBBC6BBE3A41D7BB62A48708FBA9EB93287116E540D6DC946D65AF8F38F9211B18E274608B35B15C0755B650A14D0056E147EF629138D1ECFEADB86D0F2DBCF1FED0069A056D6BDE54AC55F2F0235F99E81D8FB1D6B6073D491DE9765A35A6991B544AE9E20188C9D3F0DB8C0EBF49C42AFE69282B7DEC8A84473465071749ED4125ECC829D23657D5BBDA9B39A92DA0DB8F9BF2CDE9A04F8F1E5764713F3BAB57293A721B80003A2D7A186169A1AFE438EFD5AFA9EC0F0BE8E2E1E1680B800B4881AFC9FCC2FE0CC544BFD00000000000000000000000000000000000000000000000000000000000002C0CB640FA9B459BE6E9D1B55C00CE13E6B361CD976B72C2CAE0FE4F448E7DC875DAD3461FC413D6157A8F42B24200B0586E021FE8E99D6B9CE9F00C29D4397125B8F95560A309CB7696C77397BB6FCC834BD147726628E79B2CAA1A822B17AFE646DA32B39F6D0317299676A55DC3DF2B270EFA6619F72CE37238FB216739EB026954AF55B1DA90C24CD77067278E2CC51E21E3B1CAF165C55A18CABB97FC089CBACB8D717740B1C1E0EAB83FF551AB2B76CB922582C60412DC2C5A5C55294DB20B7B6E373C7EC5D98AFFF9D30326130532311FE4041BD7B37499A7F9898C3043B0591AF42D152DA0F94631538D2EB2708B6F885A9D42454D38357003D2FB4C0099B753DE6C9F3C3BA2568293B06507FEF7308234AEA263C9C096BC0BFCF9C4B32EEE5B4F208ACDD8420713AC32C4F0FC1AA7DF672EF3A81A209B67DE36C4E016087E5C653F0AE65CE321D47161C5948316C32BCFCD89B14E4AB9181F9BCC1B735E8C1C635E4EADF7AE43F1154A8A32F45A5F0487483D94A75B6C8C3E2C05A8D0867626961FD6D0DE3E463504672384943F442AF2D6D0562A6DB21AEB9CFAB8FB73F65E54F360F0229C3893B1AE9E6F948F81A1B72C7043840635EE315BB4C4764286CF28D7CFE2DDA13E486C863A3559C484411FAFDDAE7F5ED68788E97CEB61FFF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC300000000000000000000000000000000000000000000000000000000000002C09DAAA21731A263CD1CE5B11AAD06A2E102497AB80B0773A1D6606268E0DB5E716F20D48A5CEDD7DF98A2A80631DE5CC8ABAB574497A2C6B3873DA180326358143F57711D0AFF5AC4921A27928653AFB3F0784D64DBD1961381F0AEE880D87AAA7A674A435445FCA9D2E428E3BF2BFE9528A161A8275E93E4B33D6D4D2D79D3168E63B4786A2EB73F94BC6F970444E476799824F9518D7E8564355C861CEE4751A910CB3AF6AB54C59A039413E15CAF55F75535AA97523CEB3D285648270CD6FD45C5040978AB629CBE262B9C748FA7102E9D28F51E29D057C060333AAD5758690591AF42D152DA0F94631538D2EB2708B6F885A9D42454D38357003D2FB4C0099B753DE6C9F3C3BA2568293B06507FEF7308234AEA263C9C096BC0BFCF9C4B32EEE5B4F208ACDD8420713AC32C4F0FC1AA7DF672EF3A81A209B67DE36C4E016087E5C653F0AE65CE321D47161C5948316C32BCFCD89B14E4AB9181F9BCC1B735E8C1C635E4EADF7AE43F1154A8A32F45A5F0487483D94A75B6C8C3E2C05A8D0867626961FD6D0DE3E463504672384943F442AF2D6D0562A6DB21AEB9CFAB8FB73F65E54F360F0229C3893B1AE9E6F948F81A1B72C7043840635EE315BB4C4764286CF28D7CFE2DDA13E486C863A3559C484411FAFDDAE7F5ED68788E97CEB61FFF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleMine.CALL( )
-
MerkleMine.CALL( )
-
LivepeerToken.balanceOf( _owner=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be ) => ( balance=0 )
-
MerkleMine.generated( 0x8b269631dE7Be4479299813194DbF6939389005A ) => ( False )
MerkleMine.generate( _recipient=0x8b269631dE7Be4479299813194DbF6939389005A, _merkleProof=0xB38472B8DA8144C2C0EA697193804890B9EF0A8E3CFB97B27B1A7F3DF7C518BD5F4C02CCCCBBEA6A72999DEDA01C7A64121635E93F05CA35CBA35595B31C50A10E8D9D4E6E799B54A3B28CF896D54A3957788F1300BE26140508C68CE6D7AC2CF7A5EC356A7C2246564A1CC5F19582C56A7C19F46D64239FC9B7A664F737F64D63956C126CDDCB2B6AFBCBD885600FFED276D85EC364857E8E64847B3D83A82749054B50DFA863982753CEBD61B83C700452078EA894A3DB6A594FBED1D6BE3481C50C9AB64A6A5C8DB20CB2E043AE9FD0C9C9928D6D2209E1A6051CC3BD37AC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0xB38472B8DA8144C2C0EA697193804890B9EF0A8E3CFB97B27B1A7F3DF7C518BD5F4C02CCCCBBEA6A72999DEDA01C7A64121635E93F05CA35CBA35595B31C50A10E8D9D4E6E799B54A3B28CF896D54A3957788F1300BE26140508C68CE6D7AC2CF7A5EC356A7C2246564A1CC5F19582C56A7C19F46D64239FC9B7A664F737F64D63956C126CDDCB2B6AFBCBD885600FFED276D85EC364857E8E64847B3D83A82749054B50DFA863982753CEBD61B83C700452078EA894A3DB6A594FBED1D6BE3481C50C9AB64A6A5C8DB20CB2E043AE9FD0C9C9928D6D2209E1A6051CC3BD37AC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=DFF8B1B4A176EDE31837BBE2A92F6D8E387FF9258408A2513E5FB3BC6B682F1C ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8b269631dE7Be4479299813194DbF6939389005A, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8B26Dd8aA8Ef4D31D19399984e76501c039dDc37 ) => ( False )
MerkleMine.generate( _recipient=0x8B26Dd8aA8Ef4D31D19399984e76501c039dDc37, _merkleProof=0xB39B228B0DEDCA9760476E0450F3BA732CFEC7C9277E19BE4365C9E7974CE53B7E1E6C4C30C852723282B584AE73C7348B662E7889B613C0D5FCF9BB332C87095AFE2F9D9AAD53DE15D837C44BFC4B00F21F752A2B334124EAB0F64161F143591E7FD9B81A1286A718876A50B7361DC311AE272DBB54DEAD98952746DDF404E4EC45AD126D8F06A3CA61ED735B7831FB2FFE0F3D1AD36EBCA2C58955FAA47DDD49054B50DFA863982753CEBD61B83C700452078EA894A3DB6A594FBED1D6BE3481C50C9AB64A6A5C8DB20CB2E043AE9FD0C9C9928D6D2209E1A6051CC3BD37AC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0xB39B228B0DEDCA9760476E0450F3BA732CFEC7C9277E19BE4365C9E7974CE53B7E1E6C4C30C852723282B584AE73C7348B662E7889B613C0D5FCF9BB332C87095AFE2F9D9AAD53DE15D837C44BFC4B00F21F752A2B334124EAB0F64161F143591E7FD9B81A1286A718876A50B7361DC311AE272DBB54DEAD98952746DDF404E4EC45AD126D8F06A3CA61ED735B7831FB2FFE0F3D1AD36EBCA2C58955FAA47DDD49054B50DFA863982753CEBD61B83C700452078EA894A3DB6A594FBED1D6BE3481C50C9AB64A6A5C8DB20CB2E043AE9FD0C9C9928D6D2209E1A6051CC3BD37AC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=50ADE26D3F684913CF482F8A0A842F41009C61EB2FB31860AB917D5F1D3E5F8D ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8B26Dd8aA8Ef4D31D19399984e76501c039dDc37, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8b282013A1f6Cdf9203AcD69Fa9f3333640CA841 ) => ( False )
MerkleMine.generate( _recipient=0x8b282013A1f6Cdf9203AcD69Fa9f3333640CA841, _merkleProof=0x3257FB5C914AFE3B25D3EBF3FE61ACEE4C3E6F602404D7FD49901FB9390A37B5ECFD144EC36957C02CCD1DD0F0DDB7E1C1904939DF91B1F39DBD4B5A8B2B6838E1574C09B8FF0C1736B0F8D43773F7F9BDE8AED6C01D592A3DCF475B193EF57D5DE389F869706C6F099DA5F460B97071B5F59BDE1FF9BB21371ECA65E1467C71498CF6632C4EB15019938E149AAB67F7D7507BB61EAA7D47FCC192B02B20EC381272530780911788FEA6A04C25F7CFED44D6A07F1DB9D6AF95DBC224FFEDEE63453B8E1D0A08A7EFA7EAF49D3889926CB163A9235A0A8165E602D8967E96B4DC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0x3257FB5C914AFE3B25D3EBF3FE61ACEE4C3E6F602404D7FD49901FB9390A37B5ECFD144EC36957C02CCD1DD0F0DDB7E1C1904939DF91B1F39DBD4B5A8B2B6838E1574C09B8FF0C1736B0F8D43773F7F9BDE8AED6C01D592A3DCF475B193EF57D5DE389F869706C6F099DA5F460B97071B5F59BDE1FF9BB21371ECA65E1467C71498CF6632C4EB15019938E149AAB67F7D7507BB61EAA7D47FCC192B02B20EC381272530780911788FEA6A04C25F7CFED44D6A07F1DB9D6AF95DBC224FFEDEE63453B8E1D0A08A7EFA7EAF49D3889926CB163A9235A0A8165E602D8967E96B4DC79BD7F52AFE8E8EA25AD77ABEF96DCE34C56E4DDA947E208DC1AFD0159404768EFFA669727BC6E9E0430F9251A94577AA168D59858354BF32100F474BBE7EFACEA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=94AE366F5B8AA6B97E124A816E39CE813EB642F4E55CA715ED390C0522A3330B ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8b282013A1f6Cdf9203AcD69Fa9f3333640CA841, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8b2B908F4A077463189f8908465994DB798638ab ) => ( False )
MerkleMine.generate( _recipient=0x8b2B908F4A077463189f8908465994DB798638ab, _merkleProof=0xF33725EB82A09676F2C4E2D7617B2A05A3F6A406D2D00D54F111ADCF889930FE9FF5E869D246C0158475069272FD8E66E7A0B2E870FEA28210C76994AE54BC90AF16BADCF19576E5CCF818AA5FEDE3025A52C10ACFD06D5700CF1B59A09027370E0F84C55BE29B470E8561A2A847061AEA514029B730A02680AC02EB589B99C248E8B37A642B6F6323A963E526AEF460E5771821CAF619A0366C83F76CCF9EA44DBC3E83A2F6F4643ACA2CBFDA57C22FEF27440B0C8666B85FB280855E4EF9BEDA5F65C7B78052C329FEDCC7F96A2B0DD486043AF8530C1006EFE62D93F29966E17B6092DD291D8A87B6141358B0CB898FFEF40AB24F7D1C2DC181627918506AC42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0xF33725EB82A09676F2C4E2D7617B2A05A3F6A406D2D00D54F111ADCF889930FE9FF5E869D246C0158475069272FD8E66E7A0B2E870FEA28210C76994AE54BC90AF16BADCF19576E5CCF818AA5FEDE3025A52C10ACFD06D5700CF1B59A09027370E0F84C55BE29B470E8561A2A847061AEA514029B730A02680AC02EB589B99C248E8B37A642B6F6323A963E526AEF460E5771821CAF619A0366C83F76CCF9EA44DBC3E83A2F6F4643ACA2CBFDA57C22FEF27440B0C8666B85FB280855E4EF9BEDA5F65C7B78052C329FEDCC7F96A2B0DD486043AF8530C1006EFE62D93F29966E17B6092DD291D8A87B6141358B0CB898FFEF40AB24F7D1C2DC181627918506AC42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=1C284BA64228B0659D3C4C9FA1D76B2FF4A652C8F9E0346D802596EEC60E237D ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8b2B908F4A077463189f8908465994DB798638ab, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8b2C2bE5Fb0d96b9447dc74131009a69f47e99C4 ) => ( False )
MerkleMine.generate( _recipient=0x8b2C2bE5Fb0d96b9447dc74131009a69f47e99C4, _merkleProof=0x4F4F1AC515B8585DA330E1C853DD687BFC8EC484182FD14C31965FA4B4E5E4B96DF2E78126AD6AC5B1B53F840BD4E89CE4F81CF9569BA6C791F81EDDBF276469D397BAA283CC1C4AA692DF4DC21F6F603366EDC5AD314BD71D18AC37A8310E95037E39C7A86E0550FB0C0DA5135CA7314BBC37983976EEE9C4224AEA96AE8D2883EE26E937532C97B4BDF641655C618DE694875FD8CE1DC19C8A1B9473ED44734DBC3E83A2F6F4643ACA2CBFDA57C22FEF27440B0C8666B85FB280855E4EF9BEDA5F65C7B78052C329FEDCC7F96A2B0DD486043AF8530C1006EFE62D93F29966E17B6092DD291D8A87B6141358B0CB898FFEF40AB24F7D1C2DC181627918506AC42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0x4F4F1AC515B8585DA330E1C853DD687BFC8EC484182FD14C31965FA4B4E5E4B96DF2E78126AD6AC5B1B53F840BD4E89CE4F81CF9569BA6C791F81EDDBF276469D397BAA283CC1C4AA692DF4DC21F6F603366EDC5AD314BD71D18AC37A8310E95037E39C7A86E0550FB0C0DA5135CA7314BBC37983976EEE9C4224AEA96AE8D2883EE26E937532C97B4BDF641655C618DE694875FD8CE1DC19C8A1B9473ED44734DBC3E83A2F6F4643ACA2CBFDA57C22FEF27440B0C8666B85FB280855E4EF9BEDA5F65C7B78052C329FEDCC7F96A2B0DD486043AF8530C1006EFE62D93F29966E17B6092DD291D8A87B6141358B0CB898FFEF40AB24F7D1C2DC181627918506AC42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=BE142F4E7F66FEF50C8C0CAE6A54B028088D4261F03F908479E5B49B5FC5CAF2 ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8b2C2bE5Fb0d96b9447dc74131009a69f47e99C4, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8B2cFc09A3c5e64A9bfDA33283C9377e88954eCb ) => ( False )
MerkleMine.generate( _recipient=0x8B2cFc09A3c5e64A9bfDA33283C9377e88954eCb, _merkleProof=0x230A18E9307129DCB948F2BB8BBE2070DAC3C23AE6408EB648341C3A5C1996558128080D642C05F40CB750EDEF07138B1ED3021C27D978604DF919F97CDBB5A8A3BD1B5D0527FB570FC6FAB8C10070ECB1D003A40E1D2711C2D6B744C1FB53C0184DDE7627AF289EFFAFB78495726FB2B0DB621B6A0165952365A0AF996B47FBE836A56ED02F8AC09F02A37F4C6B3C77DC8D29828D0C63D8DEAE6DDBBD9EB49F9B033C1D0C2170109439DAA1F011B4973FB66CC0EF38ECFB04EAC695DA7D66A06CF24520DCF55FF33B642F9B581B413BD3E297FD0F72FD49313AF58F28ECA818AECF49AC0987FE47EE583EF48DEE0A11D085D882C932825E4EDD5D5CC7677081C42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0x230A18E9307129DCB948F2BB8BBE2070DAC3C23AE6408EB648341C3A5C1996558128080D642C05F40CB750EDEF07138B1ED3021C27D978604DF919F97CDBB5A8A3BD1B5D0527FB570FC6FAB8C10070ECB1D003A40E1D2711C2D6B744C1FB53C0184DDE7627AF289EFFAFB78495726FB2B0DB621B6A0165952365A0AF996B47FBE836A56ED02F8AC09F02A37F4C6B3C77DC8D29828D0C63D8DEAE6DDBBD9EB49F9B033C1D0C2170109439DAA1F011B4973FB66CC0EF38ECFB04EAC695DA7D66A06CF24520DCF55FF33B642F9B581B413BD3E297FD0F72FD49313AF58F28ECA818AECF49AC0987FE47EE583EF48DEE0A11D085D882C932825E4EDD5D5CC7677081C42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=C4358924CBAB65EB192013D5B95F656B6A34B5554AFE1D5283B253FD4814D309 ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8B2cFc09A3c5e64A9bfDA33283C9377e88954eCb, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8b2E688f8E71DAF5E47CB8dBa3bdBC78921d616D ) => ( False )
MerkleMine.generate( _recipient=0x8b2E688f8E71DAF5E47CB8dBa3bdBC78921d616D, _merkleProof=0x3ADD67D95E6D746016186D86A04B4AD219DEA9DD705DA7DB4533F06FC50B2AFB28B1A5E0AFE3A0D37C45061282BCB746A853E74CF16302B5CC1D50D3BFA11DDD717F9D6B5DBE3445412298B1C305A7EB44175B0DBB31D4C6C1EFAFA51BADEF4846EA933B1B902B6623C6ED64F0CB9FF871D535273821DD324CD34A8156D232F50568195C62BD16E5719012613E50C6EB64332AE5C35ADEBEBE816DF3FBB10B4BE3CE42E5AA3AEC3C1565722F0CF78C0A25992210A91F551820849CC78189854D85ADA1AD562E26B6719E1FB5E21A894A825091F23D0F40FAB28F824F3F11CD18AECF49AC0987FE47EE583EF48DEE0A11D085D882C932825E4EDD5D5CC7677081C42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0x3ADD67D95E6D746016186D86A04B4AD219DEA9DD705DA7DB4533F06FC50B2AFB28B1A5E0AFE3A0D37C45061282BCB746A853E74CF16302B5CC1D50D3BFA11DDD717F9D6B5DBE3445412298B1C305A7EB44175B0DBB31D4C6C1EFAFA51BADEF4846EA933B1B902B6623C6ED64F0CB9FF871D535273821DD324CD34A8156D232F50568195C62BD16E5719012613E50C6EB64332AE5C35ADEBEBE816DF3FBB10B4BE3CE42E5AA3AEC3C1565722F0CF78C0A25992210A91F551820849CC78189854D85ADA1AD562E26B6719E1FB5E21A894A825091F23D0F40FAB28F824F3F11CD18AECF49AC0987FE47EE583EF48DEE0A11D085D882C932825E4EDD5D5CC7677081C42CA4BB8863AC8F8B580847DB3BFB34D525DF2223D0101696795B8001FD4FB9EA60290FAAC839038FD0BDD0095E0E99D92F5ADD4A329D1F4152F94D6E58F65CA1396241AD6BA49DEA25D5C88F704E85BB28BF0149E117D07F066172BBC9E2762280018A26CBB9CA6E64A2289411582A684DF1EC2C421DE9B065126211905C5A27FE55D9DFD5A82E8C151673FE30E2132741BD9BFE0D0589914530862F6D0865FA20FD28D1E65ABD1BFD31951B6E87E9D68EF35A8DAED33B15C63A1E3052B90365CEE2290B2D75D1F1D3F6D784698E5F0B115CD8C6ADB8C6B9849E8A7A03E240FF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=D302DD8F04B7773559200FA885BF87FA0897BA65A9478D010E0EE2D164994EA9 ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8b2E688f8E71DAF5E47CB8dBa3bdBC78921d616D, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0xD4653B96C05388D7e8A8710f0Fea83071FA58a79 ) => ( False )
MerkleMine.generate( _recipient=0xD4653B96C05388D7e8A8710f0Fea83071FA58a79, _merkleProof=0x72E888A63C6D23035A9A45AA15BDF1E66C23DABBABEE03A5F5EF23A23B886CE2B9E0BF561C24E25BE14FDB8DC5F8D4D483D7F46556707535B398541C513F139F1F5129447E69B0A569918C64796C2CB7110F2B6A4D089EFE64CB98F69ABC3FFE322A5B2FB49BA18F4041EB1DCED54F929DF7018A1DB8CCE1F9ED9E55925A478B4EC79694827824046949F16F791B66B8A5B9299F1030B5D3AB70072283E2A083E3C3F9893C940A472FFCFC852EF9AEBF1EBC37A06C4F4FA0EE10B3BAEB0C5FDF9D036B35A00947016123CFF5315749F8F3CC09609391E4D0E9B642C880325BFC4809CA98B428F219ECC3F62B241BE2BA6662DDDEB8B4C83BE55A82E99704FEBE00546A5D59913298271FC79656CFA63BB80A4692F4B9679492AC9E87C903CB0F8BF0D47BE8D6CB42E518937D0A5D1F47C348487C85CB6F323A344E519F84A71641B988B6A545F45C08DAB68B8D4EF6410B5A796F4875B14619B573A23FAF466D823C9FD3DBDA5865F3E5918E07EAAC5B8E2C1587C95BC80BD44D7219AC0B803A7A3832A6A06F5218D6E097CAE2D5BA00610FA88E95BCDD0B33B9148844DCB22AB3C0EAC4F1425CE775E82D9489E89BDE79A26E467DBBC6BBE3A41D7BB62A48708FBA9EB93287116E540D6DC946D65AF8F38F9211B18E274608B35B15C0755B650A14D0056E147EF629138D1ECFEADB86D0F2DBCF1FED0069A056D6BDE54AC55F2F0235F99E81D8FB1D6B6073D491DE9765A35A6991B544AE9E20188C9D3F0DB8C0EBF49C42AFE69282B7DEC8A84473465071749ED4125ECC829D23657D5BBDA9B39A92DA0DB8F9BF2CDE9A04F8F1E5764713F3BAB57293A721B80003A2D7A186169A1AFE438EFD5AFA9EC0F0BE8E2E1E1680B800B4881AFC9FCC2FE0CC544BFD )
-
MerkleProof.verifyProof( _proof=0x72E888A63C6D23035A9A45AA15BDF1E66C23DABBABEE03A5F5EF23A23B886CE2B9E0BF561C24E25BE14FDB8DC5F8D4D483D7F46556707535B398541C513F139F1F5129447E69B0A569918C64796C2CB7110F2B6A4D089EFE64CB98F69ABC3FFE322A5B2FB49BA18F4041EB1DCED54F929DF7018A1DB8CCE1F9ED9E55925A478B4EC79694827824046949F16F791B66B8A5B9299F1030B5D3AB70072283E2A083E3C3F9893C940A472FFCFC852EF9AEBF1EBC37A06C4F4FA0EE10B3BAEB0C5FDF9D036B35A00947016123CFF5315749F8F3CC09609391E4D0E9B642C880325BFC4809CA98B428F219ECC3F62B241BE2BA6662DDDEB8B4C83BE55A82E99704FEBE00546A5D59913298271FC79656CFA63BB80A4692F4B9679492AC9E87C903CB0F8BF0D47BE8D6CB42E518937D0A5D1F47C348487C85CB6F323A344E519F84A71641B988B6A545F45C08DAB68B8D4EF6410B5A796F4875B14619B573A23FAF466D823C9FD3DBDA5865F3E5918E07EAAC5B8E2C1587C95BC80BD44D7219AC0B803A7A3832A6A06F5218D6E097CAE2D5BA00610FA88E95BCDD0B33B9148844DCB22AB3C0EAC4F1425CE775E82D9489E89BDE79A26E467DBBC6BBE3A41D7BB62A48708FBA9EB93287116E540D6DC946D65AF8F38F9211B18E274608B35B15C0755B650A14D0056E147EF629138D1ECFEADB86D0F2DBCF1FED0069A056D6BDE54AC55F2F0235F99E81D8FB1D6B6073D491DE9765A35A6991B544AE9E20188C9D3F0DB8C0EBF49C42AFE69282B7DEC8A84473465071749ED4125ECC829D23657D5BBDA9B39A92DA0DB8F9BF2CDE9A04F8F1E5764713F3BAB57293A721B80003A2D7A186169A1AFE438EFD5AFA9EC0F0BE8E2E1E1680B800B4881AFC9FCC2FE0CC544BFD, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=DB1F9026146B089D6EB88E116003F0E53396D938F8F78C388CCECFCA22A88989 ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0xD4653B96C05388D7e8A8710f0Fea83071FA58a79, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8BdDfddc34Bf45Cbefc061500A8ADc08E131458e ) => ( False )
MerkleMine.generate( _recipient=0x8BdDfddc34Bf45Cbefc061500A8ADc08E131458e, _merkleProof=0xCB640FA9B459BE6E9D1B55C00CE13E6B361CD976B72C2CAE0FE4F448E7DC875DAD3461FC413D6157A8F42B24200B0586E021FE8E99D6B9CE9F00C29D4397125B8F95560A309CB7696C77397BB6FCC834BD147726628E79B2CAA1A822B17AFE646DA32B39F6D0317299676A55DC3DF2B270EFA6619F72CE37238FB216739EB026954AF55B1DA90C24CD77067278E2CC51E21E3B1CAF165C55A18CABB97FC089CBACB8D717740B1C1E0EAB83FF551AB2B76CB922582C60412DC2C5A5C55294DB20B7B6E373C7EC5D98AFFF9D30326130532311FE4041BD7B37499A7F9898C3043B0591AF42D152DA0F94631538D2EB2708B6F885A9D42454D38357003D2FB4C0099B753DE6C9F3C3BA2568293B06507FEF7308234AEA263C9C096BC0BFCF9C4B32EEE5B4F208ACDD8420713AC32C4F0FC1AA7DF672EF3A81A209B67DE36C4E016087E5C653F0AE65CE321D47161C5948316C32BCFCD89B14E4AB9181F9BCC1B735E8C1C635E4EADF7AE43F1154A8A32F45A5F0487483D94A75B6C8C3E2C05A8D0867626961FD6D0DE3E463504672384943F442AF2D6D0562A6DB21AEB9CFAB8FB73F65E54F360F0229C3893B1AE9E6F948F81A1B72C7043840635EE315BB4C4764286CF28D7CFE2DDA13E486C863A3559C484411FAFDDAE7F5ED68788E97CEB61FFF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0xCB640FA9B459BE6E9D1B55C00CE13E6B361CD976B72C2CAE0FE4F448E7DC875DAD3461FC413D6157A8F42B24200B0586E021FE8E99D6B9CE9F00C29D4397125B8F95560A309CB7696C77397BB6FCC834BD147726628E79B2CAA1A822B17AFE646DA32B39F6D0317299676A55DC3DF2B270EFA6619F72CE37238FB216739EB026954AF55B1DA90C24CD77067278E2CC51E21E3B1CAF165C55A18CABB97FC089CBACB8D717740B1C1E0EAB83FF551AB2B76CB922582C60412DC2C5A5C55294DB20B7B6E373C7EC5D98AFFF9D30326130532311FE4041BD7B37499A7F9898C3043B0591AF42D152DA0F94631538D2EB2708B6F885A9D42454D38357003D2FB4C0099B753DE6C9F3C3BA2568293B06507FEF7308234AEA263C9C096BC0BFCF9C4B32EEE5B4F208ACDD8420713AC32C4F0FC1AA7DF672EF3A81A209B67DE36C4E016087E5C653F0AE65CE321D47161C5948316C32BCFCD89B14E4AB9181F9BCC1B735E8C1C635E4EADF7AE43F1154A8A32F45A5F0487483D94A75B6C8C3E2C05A8D0867626961FD6D0DE3E463504672384943F442AF2D6D0562A6DB21AEB9CFAB8FB73F65E54F360F0229C3893B1AE9E6F948F81A1B72C7043840635EE315BB4C4764286CF28D7CFE2DDA13E486C863A3559C484411FAFDDAE7F5ED68788E97CEB61FFF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=DD0DD9D02F12B8220B3749A4435230276DBCB6E0CCFA236EE47D65D0E381A6A5 ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8BdDfddc34Bf45Cbefc061500A8ADc08E131458e, _value=2051927230441354375 ) => ( True )
-
-
MerkleMine.generated( 0x8bDfcE582fc639AFF748320C27375490116683b3 ) => ( False )
MerkleMine.generate( _recipient=0x8bDfcE582fc639AFF748320C27375490116683b3, _merkleProof=0x9DAAA21731A263CD1CE5B11AAD06A2E102497AB80B0773A1D6606268E0DB5E716F20D48A5CEDD7DF98A2A80631DE5CC8ABAB574497A2C6B3873DA180326358143F57711D0AFF5AC4921A27928653AFB3F0784D64DBD1961381F0AEE880D87AAA7A674A435445FCA9D2E428E3BF2BFE9528A161A8275E93E4B33D6D4D2D79D3168E63B4786A2EB73F94BC6F970444E476799824F9518D7E8564355C861CEE4751A910CB3AF6AB54C59A039413E15CAF55F75535AA97523CEB3D285648270CD6FD45C5040978AB629CBE262B9C748FA7102E9D28F51E29D057C060333AAD5758690591AF42D152DA0F94631538D2EB2708B6F885A9D42454D38357003D2FB4C0099B753DE6C9F3C3BA2568293B06507FEF7308234AEA263C9C096BC0BFCF9C4B32EEE5B4F208ACDD8420713AC32C4F0FC1AA7DF672EF3A81A209B67DE36C4E016087E5C653F0AE65CE321D47161C5948316C32BCFCD89B14E4AB9181F9BCC1B735E8C1C635E4EADF7AE43F1154A8A32F45A5F0487483D94A75B6C8C3E2C05A8D0867626961FD6D0DE3E463504672384943F442AF2D6D0562A6DB21AEB9CFAB8FB73F65E54F360F0229C3893B1AE9E6F948F81A1B72C7043840635EE315BB4C4764286CF28D7CFE2DDA13E486C863A3559C484411FAFDDAE7F5ED68788E97CEB61FFF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3 )
-
MerkleProof.verifyProof( _proof=0x9DAAA21731A263CD1CE5B11AAD06A2E102497AB80B0773A1D6606268E0DB5E716F20D48A5CEDD7DF98A2A80631DE5CC8ABAB574497A2C6B3873DA180326358143F57711D0AFF5AC4921A27928653AFB3F0784D64DBD1961381F0AEE880D87AAA7A674A435445FCA9D2E428E3BF2BFE9528A161A8275E93E4B33D6D4D2D79D3168E63B4786A2EB73F94BC6F970444E476799824F9518D7E8564355C861CEE4751A910CB3AF6AB54C59A039413E15CAF55F75535AA97523CEB3D285648270CD6FD45C5040978AB629CBE262B9C748FA7102E9D28F51E29D057C060333AAD5758690591AF42D152DA0F94631538D2EB2708B6F885A9D42454D38357003D2FB4C0099B753DE6C9F3C3BA2568293B06507FEF7308234AEA263C9C096BC0BFCF9C4B32EEE5B4F208ACDD8420713AC32C4F0FC1AA7DF672EF3A81A209B67DE36C4E016087E5C653F0AE65CE321D47161C5948316C32BCFCD89B14E4AB9181F9BCC1B735E8C1C635E4EADF7AE43F1154A8A32F45A5F0487483D94A75B6C8C3E2C05A8D0867626961FD6D0DE3E463504672384943F442AF2D6D0562A6DB21AEB9CFAB8FB73F65E54F360F0229C3893B1AE9E6F948F81A1B72C7043840635EE315BB4C4764286CF28D7CFE2DDA13E486C863A3559C484411FAFDDAE7F5ED68788E97CEB61FFF503CEA0BAAD587EDB1FD611E294DD2390FBDE83566E2FB12255C1859C9B4CAA4A66BC75D29DD6073DFC517107552766D48FB4844D6AB002F0590FEDFFD104207288F7757E38B7BE9E5C4CE64FC9EA7589FF5CD660C8DE46FF74E9EDDD1E98E240D361ED43139AEE515F913E449F65C4FE12F77E0FFBFB212AF43984FB6601F93012BB4162A0B320715E1F810D059B90BD669187596DFD80A4CE9F0722B559024D5938FD72D08ED68C0584E38DF8792101873A9603D94565893663A3F7EFAE61E74A86B2F0ACEAA39987CE1EE5E1150DC99DB6336CCA1BF9A005C776D0E3FC3, _root=53F35A304A1E1E20D6648E09BB3073CCD44A5BF1638A01355897A71E801879F8, _leaf=95AA17F119D64E52D731779C3F361B32F547CA0AF16D644262C38A65387CC8C9 ) => ( True )
-
LivepeerToken.transfer( _to=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be, _value=389768935675737883 ) => ( True )
-
LivepeerToken.transfer( _to=0x8bDfcE582fc639AFF748320C27375490116683b3, _value=2051927230441354375 ) => ( True )
-
-
LivepeerToken.balanceOf( _owner=0xBfd0fb15e6C04b396EA12f5BB9Ba803E29B282Be ) => ( balance=3897689356757378830 )
-
LivepeerToken.transfer( _to=0xd40a4FA0429496Da9cF8e453e6E68bA7f4f96f79, _value=3897689356757378830 ) => ( True )
multiGenerate[MultiMerkleMine (ln:388)]
token[MultiMerkleMine (ln:390)]
callerAllocationStartBlock[MultiMerkleMine (ln:393)]
balanceOf[MultiMerkleMine (ln:397)]
readBytes32[MultiMerkleMine (ln:407)]
dataPtr[BytesUtil (ln:364)]
substr[MultiMerkleMine (ln:414)]
dataPtr[BytesUtil (ln:352)]
toBytes[BytesUtil (ln:353)]
dataPtr[BytesUtil (ln:333)]
copy[BytesUtil (ln:334)]
generated[MultiMerkleMine (ln:428)]
generate[MultiMerkleMine (ln:429)]
balanceOf[MultiMerkleMine (ln:433)]
sub[MultiMerkleMine (ln:434)]
transfer[MultiMerkleMine (ln:438)]
File 1 of 4: MultiMerkleMine
File 2 of 4: MerkleMine
File 3 of 4: LivepeerToken
File 4 of 4: MerkleProof
pragma solidity 0.4.24; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /* * @title MerkleProof * @dev Merkle proof verification * @note Based on https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol */ library MerkleProof { /* * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves * and each pair of pre-images is sorted. * @param _proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree * @param _root Merkle root * @param _leaf Leaf of Merkle tree */ function verifyProof(bytes _proof, bytes32 _root, bytes32 _leaf) public pure returns (bool) { // Check if proof length is a multiple of 32 if (_proof.length % 32 != 0) return false; bytes32 proofElement; bytes32 computedHash = _leaf; for (uint256 i = 32; i <= _proof.length; i += 32) { assembly { // Load the current element of the proof proofElement := mload(add(_proof, i)) } if (computedHash < proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(proofElement, computedHash); } } // Check if the computed hash (root) is equal to the provided root return computedHash == _root; } } /** * @title MerkleMine * @dev Token distribution based on providing Merkle proofs of inclusion in genesis state to generate allocation */ contract MerkleMine { using SafeMath for uint256; // ERC20 token being distributed ERC20 public token; // Merkle root representing genesis state which encodes token recipients bytes32 public genesisRoot; // Total amount of tokens that can be generated uint256 public totalGenesisTokens; // Total number of recipients included in genesis state uint256 public totalGenesisRecipients; // Amount of tokens per recipient allocation. Equal to `totalGenesisTokens` / `totalGenesisRecipients` uint256 public tokensPerAllocation; // Minimum ETH balance threshold for recipients included in genesis state uint256 public balanceThreshold; // Block number of genesis - used to determine which ETH accounts are included in the genesis state uint256 public genesisBlock; // Start block where a third party caller (not the recipient) can generate and split the allocation with the recipient // As the current block gets closer to `callerAllocationEndBlock`, the caller receives a larger precentage of the allocation uint256 public callerAllocationStartBlock; // From this block onwards, a third party caller (not the recipient) can generate and claim the recipient's full allocation uint256 public callerAllocationEndBlock; // Number of blocks in the caller allocation period as defined by `callerAllocationEndBlock` - `callerAllocationStartBlock` uint256 public callerAllocationPeriod; // Track if the generation process is started bool public started; // Track the already generated allocations for recipients mapping (address => bool) public generated; // Check that a recipient's allocation has not been generated modifier notGenerated(address _recipient) { require(!generated[_recipient]); _; } // Check that the generation period is started modifier isStarted() { require(started); _; } // Check that the generation period is not started modifier isNotStarted() { require(!started); _; } event Generate(address indexed _recipient, address indexed _caller, uint256 _recipientTokenAmount, uint256 _callerTokenAmount, uint256 _block); /** * @dev MerkleMine constructor * @param _token ERC20 token being distributed * @param _genesisRoot Merkle root representing genesis state which encodes token recipients * @param _totalGenesisTokens Total amount of tokens that can be generated * @param _totalGenesisRecipients Total number of recipients included in genesis state * @param _balanceThreshold Minimum ETH balance threshold for recipients included in genesis state * @param _genesisBlock Block number of genesis - used to determine which ETH accounts are included in the genesis state * @param _callerAllocationStartBlock Start block where a third party caller (not the recipient) can generate and split the allocation with the recipient * @param _callerAllocationEndBlock From this block onwards, a third party caller (not the recipient) can generate and claim the recipient's full allocation */ function MerkleMine( address _token, bytes32 _genesisRoot, uint256 _totalGenesisTokens, uint256 _totalGenesisRecipients, uint256 _balanceThreshold, uint256 _genesisBlock, uint256 _callerAllocationStartBlock, uint256 _callerAllocationEndBlock ) public { // Address of token contract must not be null require(_token != address(0)); // Number of recipients must be non-zero require(_totalGenesisRecipients > 0); // Genesis block must be at or before the current block require(_genesisBlock <= block.number); // Start block for caller allocation must be after current block require(_callerAllocationStartBlock > block.number); // End block for caller allocation must be after caller allocation start block require(_callerAllocationEndBlock > _callerAllocationStartBlock); token = ERC20(_token); genesisRoot = _genesisRoot; totalGenesisTokens = _totalGenesisTokens; totalGenesisRecipients = _totalGenesisRecipients; tokensPerAllocation = _totalGenesisTokens.div(_totalGenesisRecipients); balanceThreshold = _balanceThreshold; genesisBlock = _genesisBlock; callerAllocationStartBlock = _callerAllocationStartBlock; callerAllocationEndBlock = _callerAllocationEndBlock; callerAllocationPeriod = _callerAllocationEndBlock.sub(_callerAllocationStartBlock); } /** * @dev Start the generation period - first checks that this contract's balance is equal to `totalGenesisTokens` * The generation period must not already be started */ function start() external isNotStarted { // Check that this contract has a sufficient balance for the generation period require(token.balanceOf(this) >= totalGenesisTokens); started = true; } /** * @dev Generate a recipient's token allocation. Generation period must be started. Starting from `callerAllocationStartBlock` * a third party caller (not the recipient) can invoke this function to generate the recipient's token * allocation and claim a percentage of it. The percentage of the allocation claimed by the * third party caller is determined by how many blocks have elapsed since `callerAllocationStartBlock`. * After `callerAllocationEndBlock`, a third party caller can claim the full allocation * @param _recipient Recipient of token allocation * @param _merkleProof Proof of recipient's inclusion in genesis state Merkle root */ function generate(address _recipient, bytes _merkleProof) external isStarted notGenerated(_recipient) { // Check the Merkle proof bytes32 leaf = keccak256(_recipient); // _merkleProof must prove inclusion of _recipient in the genesis state root require(MerkleProof.verifyProof(_merkleProof, genesisRoot, leaf)); generated[_recipient] = true; address caller = msg.sender; if (caller == _recipient) { // If the caller is the recipient, transfer the full allocation to the caller/recipient require(token.transfer(_recipient, tokensPerAllocation)); Generate(_recipient, _recipient, tokensPerAllocation, 0, block.number); } else { // If the caller is not the recipient, the token allocation generation // can only take place if we are in the caller allocation period require(block.number >= callerAllocationStartBlock); uint256 callerTokenAmount = callerTokenAmountAtBlock(block.number); uint256 recipientTokenAmount = tokensPerAllocation.sub(callerTokenAmount); if (callerTokenAmount > 0) { require(token.transfer(caller, callerTokenAmount)); } if (recipientTokenAmount > 0) { require(token.transfer(_recipient, recipientTokenAmount)); } Generate(_recipient, caller, recipientTokenAmount, callerTokenAmount, block.number); } } /** * @dev Return the amount of tokens claimable by a third party caller when generating a recipient's token allocation at a given block * @param _blockNumber Block at which to compute the amount of tokens claimable by a third party caller */ function callerTokenAmountAtBlock(uint256 _blockNumber) public view returns (uint256) { if (_blockNumber < callerAllocationStartBlock) { // If the block is before the start of the caller allocation period, the third party caller can claim nothing return 0; } else if (_blockNumber >= callerAllocationEndBlock) { // If the block is at or after the end block of the caller allocation period, the third party caller can claim everything return tokensPerAllocation; } else { // During the caller allocation period, the third party caller can claim an increasing percentage // of the recipient's allocation based on a linear curve - as more blocks pass in the caller allocation // period, the amount claimable by the third party caller increases linearly uint256 blocksSinceCallerAllocationStartBlock = _blockNumber.sub(callerAllocationStartBlock); return tokensPerAllocation.mul(blocksSinceCallerAllocationStartBlock).div(callerAllocationPeriod); } } } /** * @title BytesUtil * @dev Utilities for extracting bytes from byte arrays * Functions taken from: * - https://github.com/ethereum/solidity-examples/blob/master/src/unsafe/Memory.sol * - https://github.com/ethereum/solidity-examples/blob/master/src/bytes/Bytes.sol */ library BytesUtil{ uint256 internal constant BYTES_HEADER_SIZE = 32; uint256 internal constant WORD_SIZE = 32; /** * @dev Returns a memory pointer to the data portion of the provided bytes array. * @param bts Memory byte array */ function dataPtr(bytes memory bts) internal pure returns (uint256 addr) { assembly { addr := add(bts, /*BYTES_HEADER_SIZE*/ 32) } } /** * @dev Copy 'len' bytes from memory address 'src', to address 'dest'. * This function does not check the or destination, it only copies * the bytes. * @param src Memory address of source byte array * @param dest Memory address of destination byte array * @param len Number of bytes to copy from `src` to `dest` */ function copy(uint256 src, uint256 dest, uint256 len) internal pure { // Copy word-length chunks while possible for (; len >= WORD_SIZE; len -= WORD_SIZE) { assembly { mstore(dest, mload(src)) } dest += WORD_SIZE; src += WORD_SIZE; } // Copy remaining bytes uint256 mask = 256 ** (WORD_SIZE - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /** * @dev Creates a 'bytes memory' variable from the memory address 'addr', with the * length 'len'. The function will allocate new memory for the bytes array, and * the 'len bytes starting at 'addr' will be copied into that new memory. * @param addr Memory address of input byte array * @param len Number of bytes to copy from input byte array */ function toBytes(uint256 addr, uint256 len) internal pure returns (bytes memory bts) { bts = new bytes(len); uint256 btsptr = dataPtr(bts); copy(addr, btsptr, len); } /** * @dev Copies 'len' bytes from 'bts' into a new array, starting at the provided 'startIndex'. * Returns the new copy. * Requires that: * - 'startIndex + len <= self.length' * The length of the substring is: 'len' * @param bts Memory byte array to copy from * @param startIndex Index of `bts` to start copying bytes from * @param len Number of bytes to copy from `bts` */ function substr(bytes memory bts, uint256 startIndex, uint256 len) internal pure returns (bytes memory) { require(startIndex + len <= bts.length); if (len == 0) { return; } uint256 addr = dataPtr(bts); return toBytes(addr + startIndex, len); } /** * @dev Reads a bytes32 value from a byte array by copying 32 bytes from `bts` starting at the provided `startIndex`. * @param bts Memory byte array to copy from * @param startIndex Index of `bts` to start copying bytes from */ function readBytes32(bytes memory bts, uint256 startIndex) internal pure returns (bytes32 result) { require(startIndex + 32 <= bts.length); uint256 addr = dataPtr(bts); assembly { result := mload(add(addr, startIndex)) } return result; } } /** * @title MultiMerkleMine * @dev The MultiMerkleMine contract is purely a convenience wrapper around an existing MerkleMine contract deployed on the blockchain. */ contract MultiMerkleMine { using SafeMath for uint256; /** * @dev Generates token allocations for multiple recipients. Generation period must be started. * @param _merkleMineContract Address of the deployed MerkleMine contract * @param _recipients Array of recipients * @param _merkleProofs Proofs for respective recipients constructed in the format: * [proof_1_size, proof_1, proof_2_size, proof_2, ... , proof_n_size, proof_n] */ function multiGenerate(address _merkleMineContract, address[] _recipients, bytes _merkleProofs) public { MerkleMine mine = MerkleMine(_merkleMineContract); ERC20 token = ERC20(mine.token()); require( block.number >= mine.callerAllocationStartBlock(), "caller allocation period has not started" ); uint256 initialBalance = token.balanceOf(this); bytes[] memory proofs = new bytes[](_recipients.length); // Counter to keep track of position in `_merkleProofs` byte array uint256 i = 0; // Counter to keep track of index of each extracted Merkle proof uint256 j = 0; // Extract proofs while(i < _merkleProofs.length){ uint256 proofSize = uint256(BytesUtil.readBytes32(_merkleProofs, i)); require( proofSize % 32 == 0, "proof size must be a multiple of 32" ); proofs[j] = BytesUtil.substr(_merkleProofs, i + 32, proofSize); i = i + 32 + proofSize; j++; } require( _recipients.length == j, "number of recipients != number of proofs" ); for (uint256 k = 0; k < _recipients.length; k++) { // If recipient's token allocation has not been generated, generate the token allocation // Else, continue to the next recipient if (!mine.generated(_recipients[k])) { mine.generate(_recipients[k], proofs[k]); } } uint256 newBalanceSinceAllocation = token.balanceOf(this); uint256 callerTokensGenerated = newBalanceSinceAllocation.sub(initialBalance); // Transfer caller's portion of tokens generated by this function call if (callerTokensGenerated > 0) { require(token.transfer(msg.sender, callerTokensGenerated)); } } }
File 2 of 4: MerkleMine
pragma solidity 0.4.18; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /* * @title MerkleProof * @dev Merkle proof verification * @note Based on https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol */ library MerkleProof { /* * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves * and each pair of pre-images is sorted. * @param _proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree * @param _root Merkle root * @param _leaf Leaf of Merkle tree */ function verifyProof(bytes _proof, bytes32 _root, bytes32 _leaf) public pure returns (bool) { // Check if proof length is a multiple of 32 if (_proof.length % 32 != 0) return false; bytes32 proofElement; bytes32 computedHash = _leaf; for (uint256 i = 32; i <= _proof.length; i += 32) { assembly { // Load the current element of the proof proofElement := mload(add(_proof, i)) } if (computedHash < proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(proofElement, computedHash); } } // Check if the computed hash (root) is equal to the provided root return computedHash == _root; } } /** * @title MerkleMine * @dev Token distribution based on providing Merkle proofs of inclusion in genesis state to generate allocation */ contract MerkleMine { using SafeMath for uint256; // ERC20 token being distributed ERC20 public token; // Merkle root representing genesis state which encodes token recipients bytes32 public genesisRoot; // Total amount of tokens that can be generated uint256 public totalGenesisTokens; // Total number of recipients included in genesis state uint256 public totalGenesisRecipients; // Amount of tokens per recipient allocation. Equal to `totalGenesisTokens` / `totalGenesisRecipients` uint256 public tokensPerAllocation; // Minimum ETH balance threshold for recipients included in genesis state uint256 public balanceThreshold; // Block number of genesis - used to determine which ETH accounts are included in the genesis state uint256 public genesisBlock; // Start block where a third party caller (not the recipient) can generate and split the allocation with the recipient // As the current block gets closer to `callerAllocationEndBlock`, the caller receives a larger precentage of the allocation uint256 public callerAllocationStartBlock; // From this block onwards, a third party caller (not the recipient) can generate and claim the recipient's full allocation uint256 public callerAllocationEndBlock; // Number of blocks in the caller allocation period as defined by `callerAllocationEndBlock` - `callerAllocationStartBlock` uint256 public callerAllocationPeriod; // Track if the generation process is started bool public started; // Track the already generated allocations for recipients mapping (address => bool) public generated; // Check that a recipient's allocation has not been generated modifier notGenerated(address _recipient) { require(!generated[_recipient]); _; } // Check that the generation period is started modifier isStarted() { require(started); _; } // Check that the generation period is not started modifier isNotStarted() { require(!started); _; } event Generate(address indexed _recipient, address indexed _caller, uint256 _recipientTokenAmount, uint256 _callerTokenAmount, uint256 _block); /** * @dev MerkleMine constructor * @param _token ERC20 token being distributed * @param _genesisRoot Merkle root representing genesis state which encodes token recipients * @param _totalGenesisTokens Total amount of tokens that can be generated * @param _totalGenesisRecipients Total number of recipients included in genesis state * @param _balanceThreshold Minimum ETH balance threshold for recipients included in genesis state * @param _genesisBlock Block number of genesis - used to determine which ETH accounts are included in the genesis state * @param _callerAllocationStartBlock Start block where a third party caller (not the recipient) can generate and split the allocation with the recipient * @param _callerAllocationEndBlock From this block onwards, a third party caller (not the recipient) can generate and claim the recipient's full allocation */ function MerkleMine( address _token, bytes32 _genesisRoot, uint256 _totalGenesisTokens, uint256 _totalGenesisRecipients, uint256 _balanceThreshold, uint256 _genesisBlock, uint256 _callerAllocationStartBlock, uint256 _callerAllocationEndBlock ) public { // Address of token contract must not be null require(_token != address(0)); // Number of recipients must be non-zero require(_totalGenesisRecipients > 0); // Genesis block must be at or before the current block require(_genesisBlock <= block.number); // Start block for caller allocation must be after current block require(_callerAllocationStartBlock > block.number); // End block for caller allocation must be after caller allocation start block require(_callerAllocationEndBlock > _callerAllocationStartBlock); token = ERC20(_token); genesisRoot = _genesisRoot; totalGenesisTokens = _totalGenesisTokens; totalGenesisRecipients = _totalGenesisRecipients; tokensPerAllocation = _totalGenesisTokens.div(_totalGenesisRecipients); balanceThreshold = _balanceThreshold; genesisBlock = _genesisBlock; callerAllocationStartBlock = _callerAllocationStartBlock; callerAllocationEndBlock = _callerAllocationEndBlock; callerAllocationPeriod = _callerAllocationEndBlock.sub(_callerAllocationStartBlock); } /** * @dev Start the generation period - first checks that this contract's balance is equal to `totalGenesisTokens` * The generation period must not already be started */ function start() external isNotStarted { // Check that this contract has a sufficient balance for the generation period require(token.balanceOf(this) >= totalGenesisTokens); started = true; } /** * @dev Generate a recipient's token allocation. Generation period must be started. Starting from `callerAllocationStartBlock` * a third party caller (not the recipient) can invoke this function to generate the recipient's token * allocation and claim a percentage of it. The percentage of the allocation claimed by the * third party caller is determined by how many blocks have elapsed since `callerAllocationStartBlock`. * After `callerAllocationEndBlock`, a third party caller can claim the full allocation * @param _recipient Recipient of token allocation * @param _merkleProof Proof of recipient's inclusion in genesis state Merkle root */ function generate(address _recipient, bytes _merkleProof) external isStarted notGenerated(_recipient) { // Check the Merkle proof bytes32 leaf = keccak256(_recipient); // _merkleProof must prove inclusion of _recipient in the genesis state root require(MerkleProof.verifyProof(_merkleProof, genesisRoot, leaf)); generated[_recipient] = true; address caller = msg.sender; if (caller == _recipient) { // If the caller is the recipient, transfer the full allocation to the caller/recipient require(token.transfer(_recipient, tokensPerAllocation)); Generate(_recipient, _recipient, tokensPerAllocation, 0, block.number); } else { // If the caller is not the recipient, the token allocation generation // can only take place if we are in the caller allocation period require(block.number >= callerAllocationStartBlock); uint256 callerTokenAmount = callerTokenAmountAtBlock(block.number); uint256 recipientTokenAmount = tokensPerAllocation.sub(callerTokenAmount); if (callerTokenAmount > 0) { require(token.transfer(caller, callerTokenAmount)); } if (recipientTokenAmount > 0) { require(token.transfer(_recipient, recipientTokenAmount)); } Generate(_recipient, caller, recipientTokenAmount, callerTokenAmount, block.number); } } /** * @dev Return the amount of tokens claimable by a third party caller when generating a recipient's token allocation at a given block * @param _blockNumber Block at which to compute the amount of tokens claimable by a third party caller */ function callerTokenAmountAtBlock(uint256 _blockNumber) public view returns (uint256) { if (_blockNumber < callerAllocationStartBlock) { // If the block is before the start of the caller allocation period, the third party caller can claim nothing return 0; } else if (_blockNumber >= callerAllocationEndBlock) { // If the block is at or after the end block of the caller allocation period, the third party caller can claim everything return tokensPerAllocation; } else { // During the caller allocation period, the third party caller can claim an increasing percentage // of the recipient's allocation based on a linear curve - as more blocks pass in the caller allocation // period, the amount claimable by the third party caller increases linearly uint256 blocksSinceCallerAllocationStartBlock = _blockNumber.sub(callerAllocationStartBlock); return tokensPerAllocation.mul(blocksSinceCallerAllocationStartBlock).div(callerAllocationPeriod); } } }
File 3 of 4: LivepeerToken
/** *Submitted for verification at Etherscan.io on 2018-04-30 */ pragma solidity 0.4.18; /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); OwnershipTransferred(owner, newOwner); owner = newOwner; } } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) balances; /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); // SafeMath.sub will throw if there is not enough balance. balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } } /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * @dev https://github.com/ethereum/EIPs/issues/20 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval(address _spender, uint _addedValue) public returns (bool) { allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } /** * @title Mintable token * @dev Simple ERC20 Token example, with mintable token creation * @dev Issue: * https://github.com/OpenZeppelin/zeppelin-solidity/issues/120 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol */ contract MintableToken is StandardToken, Ownable { event Mint(address indexed to, uint256 amount); event MintFinished(); bool public mintingFinished = false; modifier canMint() { require(!mintingFinished); _; } /** * @dev Function to mint tokens * @param _to The address that will receive the minted tokens. * @param _amount The amount of tokens to mint. * @return A boolean that indicates if the operation was successful. */ function mint(address _to, uint256 _amount) onlyOwner canMint public returns (bool) { totalSupply = totalSupply.add(_amount); balances[_to] = balances[_to].add(_amount); Mint(_to, _amount); Transfer(address(0), _to, _amount); return true; } /** * @dev Function to stop minting new tokens. * @return True if the operation was successful. */ function finishMinting() onlyOwner canMint public returns (bool) { mintingFinished = true; MintFinished(); return true; } } contract VariableSupplyToken is MintableToken { event Burn(address indexed burner, uint256 value); /* * @dev Burns a specific amount of the sender's tokens * @param _value The amount of tokens to be burned */ function burn(uint256 _amount) public { // Must not burn more than the sender owns require(_amount <= balances[msg.sender]); address burner = msg.sender; balances[burner] = balances[burner].sub(_amount); totalSupply = totalSupply.sub(_amount); Burn(burner, _amount); } } contract ILivepeerToken is ERC20, Ownable { function mint(address _to, uint256 _amount) public returns (bool); function burn(uint256 _amount) public; } contract LivepeerToken is ILivepeerToken, VariableSupplyToken { string public name = "Livepeer Token"; uint8 public decimals = 18; string public symbol = "LPT"; string public version = "0.1"; }
File 4 of 4: MerkleProof
pragma solidity 0.4.18; /* * @title MerkleProof * @dev Merkle proof verification * @note Based on https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol */ library MerkleProof { /* * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves * and each pair of pre-images is sorted. * @param _proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree * @param _root Merkle root * @param _leaf Leaf of Merkle tree */ function verifyProof(bytes _proof, bytes32 _root, bytes32 _leaf) public pure returns (bool) { // Check if proof length is a multiple of 32 if (_proof.length % 32 != 0) return false; bytes32 proofElement; bytes32 computedHash = _leaf; for (uint256 i = 32; i <= _proof.length; i += 32) { assembly { // Load the current element of the proof proofElement := mload(add(_proof, i)) } if (computedHash < proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(proofElement, computedHash); } } // Check if the computed hash (root) is equal to the provided root return computedHash == _root; } }