ETH Price: $2,460.67 (-0.06%)
Gas: 1.21 Gwei

Transaction Decoder

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 Code
0x58b6A8A3...e733aB239
0x8e306b00...766cC15c8
(Livepeer: Merkle Mine)
0xd40a4FA0...7f4f96f79
2.516243868780157582 Eth
Nonce: 536
2.504655923120157582 Eth
Nonce: 537
0.01158794566
(Ethermine)
906.199127445516776357 Eth906.210715391176776357 Eth0.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 )
                        File 1 of 4: MultiMerkleMine
                        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;
                          }
                        }