Transaction Hash:
Block:
5800455 at Jun-16-2018 06:24:47 PM +UTC
Transaction Fee:
0.003414538 ETH
$7.94
Gas Used:
1,707,269 Gas / 2 Gwei
Emitted Events:
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
|
0xb2930B35...e543a0347
Miner
| (MiningPoolHub: Old Address) | 18,234.170265232391337496 Eth | 18,234.173679770391337496 Eth | 0.003414538 | |
| 0xb89E0394...96a2Fc618 |
0.275406088 Eth
Nonce: 204
|
0.27199155 Eth
Nonce: 205
| 0.003414538 |
Execution Trace
EthealPromoDistribute.massNotify( _owners=[0xa47cBf15C2B07d14b8f85F7e2744b9B0FbC1F8b9, 0xBE0cD7e74315f9d7BdB13210d270EdcE923afE6C, 0xa0574E8EFa51cDA4bfE335bA1EA8f62B0FB5cB9a, 0x77206C3AFc80a1c5BC7cA98f51D7Cf30A8FB6a36, 0x7dd4b0dEb53294D2Bb9aEAa663573bb64806a27D, 0xc91ED37A0538994b49917a24383eA738Aad5A34c, 0x1c9288300827082bB4D78022c13b3122E371A840, 0x490B214b1A498CE8f91F5D48642757b50cBa1C82, 0x85aC8FFFe303AfF713276b2969008A67dD3E5145, 0x794D4a00bE010bBE04972686eae908Ed8EE31673, 0x171637DA4d03A1D947A5b2ca0545E24A34539792, 0x007663Df7e94a3c4cd70F5124672E9E8549B6dE0, 0x68D9B52A540b8036eA48dDAE923F9132C411CcDF, 0xEF81cdF057161896cA710a7B529530D5585820a9, 0xEa4FAf02e966DF60dc0AAc00473aeAF20D2A9834, 0x5B4Bd05E378d5d056FA7bF7564E5BCF8bae329d6, 0x969c560C0595A363830ffC9B083Af9D771447704, 0x79D28e63D9A7f69311cb225eAC45fC4cC14C8caE, 0x1f4c0602Fc07be4934f8205Cc3C230dF58c8d9A7, 0xba6A9A9F8B74Ca1DB257BFf14745468ee1eb9439, 0xC72beFa89825B5c243F20A61B39a81142EBDd71e, 0x1e150aE084DE4340411e38F9DC671609ab3356E8, 0x5256E7f919317a9E454A94A29BA00068A913dd78, 0x2315771Dba453b5b42B312A6b6f7188B291e8D3c, 0x73b5Ca59f9d8a3B17DcFe06D5B961A11e06a0Ac5, 0x9b58f17925dF745f8f3A47b2519064f3B370B8C2, 0xF8Ac91dd1aa23C786D78dDbF6c60C3F72a043110, 0xfff13a33e611F51bF60e36F58eBbA9d15c7c0F4c, 0x85D504c5E4F87E0fb28A7737DE0DBB61a1FFB529, 0x6eaFeFCC00302A5cb172E614157b6De20243FAF0, 0x0C4AB53b0E2169a5E58346F4BF1f84548F64d4b3, 0x8599F4c75E803F53B587ae532eD1239EB76dA1f8, 0xFEdD303431dB3086bE00E711Bf320d7CDb717204, 0x9E73fAE1A572B6A20243f9509DEb3326826A9FbA, 0xD8d816019298BE382104fCB20CEF1F4957046cf3, 0xdE34a1D782A2e3fCcdfe87c6b9F4250BAca7df2E, 0x5B0dFe827501Fa14f378f40e0D6820EEBBD3cB37, 0x1b86e8458a85373cCAd6eCbD0f700012F81C68e6, 0xE322F4abbF8d922aB99A6710ee23ca234c01a529, 0x5795C7b86b39E152A26347341490ec235baF8B0e, 0x6a4f3D6D40d3b97A30662F36d7d2a96AC0061229, 0x0eDA64D1A9cF816BcCaE5ec58eD233c977268f5E, 0x8fFF01a9A03542d5f8A7F089B844B90902FE6C63, 0x4096c35e685bb68404c410A61aF6564E083b5F53, 0x228458e0E016DEA2Cc2077186CE0212912008b97, 0x79e3E0B7aCc6561bcF8607D98ba6cbB9F644b86C, 0xae9E4033cBd43e728ceB7A565c73D9444863f60c, 0xB070a30d5525B9b56a2364E2252E28788D8399a2, 0xAF2608e3049e678f857C4676D0b8f68AFd1cF7FF, 0x9eE0297cf715f0C6D05609E0045c54e7D771039e, 0xD097D56cCa1DD5eF852309ECCE1F20068734474E, 0xdDdf069E5b45Af7D48C447a3AdbAfFca35b69867, 0xC92A25B020dA74FA41bD9f8C5C584f11A5c69dD9, 0x1146477ECE376a67FB87773bA5972cec4490c557, 0xe0c4034c56c7344f215cEd319108d54Ea5622E61, 0x76FbD4Ef3c9BC230b9A96D784491e6Bd6CBA2007, 0xD1f91011235FB95F4aD40e04c2850015EEfdfaF8, 0x8cEafCE0a88F2B9e9b05519702fF06E130B5ff61, 0x11eA605a777F985A10dfdf14897f0d4638c1Fd22, 0x156cf9747cA5327CC67519B6F3F56e5f5B526Ef4, 0xEb7882fc90c7B015E155812bB0496f2B1725ca08, 0x7eA1c9b1b3Df4b5d3d9a5AEf40176eE9ebbE4065, 0x5BBcC8E8079379607004Ba20A096f4479395A784, 0x3A432641859B318Cb8405cc439238142f50e58da, 0x69dCe2D4bB83f2A6BFE93017994A9A4d9413E417, 0x5b6d97049C76D2C7f4A7c82a8cad86E7ee74F116, 0xbDf47dc040b8817E912290cD86f6cd3324C5bC2E, 0x052Ec3e51c2e98D512F20924EA422563C49C5790, 0xa5410Ac81f837235141EDEdeF1f4F7a326e422d6, 0x7F501B4751881017E633A74aF46B3d41B3C1857e, 0xaf1B3c9EE18dfF35365Bb9adc18C36A6Bf817fCE, 0xf1398747f0E29a5253D8CBCdD9a26e74A9697cCa, 0xa0f5dFC5914FC1dE83004Fdd091109913E701453, 0x5183CB983895B583872D8575a53D3f6501dddf04, 0xCA3eed6F4dd4b55228aBB387feedcA83c3072748, 0xad703B98F1e58A084ccF12041e3b4CFb65F92263, 0x49Fd6b97Be45B0AFa67a53a4Ea933B673fC738E3, 0x9aAc1Cbd701466B22d4b9B15f6533e0D5a335FE0, 0x1c45375e4639c4eDD5DBaA05c067Ff8698B6aC74, 0xFa40361ADBaaC9A2ffA1C1B573d75b09d850Eb34, 0x8362E39A9A31D90910F2fA80C386253faF33b6c6, 0x691Ca25c046eD8A18C9a0BA70189A26A20ccf8Bd, 0x9FA343F398F0Ba34AD14e66Ace272E50C9536533, 0x63B5e77B719ece17De91c1cEc40d18c94dcDc29F, 0x67EeCEcAFe593399A15E06CBb4bFede13d4E80F8, 0x3493dCF1F747a7278b7eeeE49c9F048cB2BCA645, 0x42d4183Fece6eF9a54Bc167015AAe7f3cdfA33ff, 0x4e64372cA4674c8DE4BfCDe718B5182fb3267b15, 0xa2E4b7cd82C31d6c583740AdA6d90E96BA26d2Ff, 0x1d4838Df9fCbF6b7c278b109273Cb5B8dc68cE05, 0x2B11B690218DafD76F9c63f58153FF19134a919D, 0xD1d3a8282a4AC773689428e263d1da6F0650A08F, 0x2A24A7E1bC2d6FB07064a5bB8E4692180B9Db265, 0xd036BF4e3596ec9772FCe689773E9530C5b475b9, 0x061a12353e4f6BF2D8c5CD00e5635eCe51f17236, 0x73D0E4707485aC16F0B67C944516830eBddB224e, 0x9a191e0a0CE95F00cC43f53CcF4aDd89f252DD50, 0x7e9F59E5Da12FC26541Ff92b48205c0f3048c60b, 0x5064d4466d4569640e83d9a9837945e6db332373, 0x787257e306113F388b31AF4D5a920647198F3942, 0x7329A19739909313271FfBB9A3a5438D8c3b857C, 0xcDF07447eB9b946Fe16d0c0F23B741Aa03D8a226, 0x162B6955FABDf84157e18cBf988b4D89D6099F1A, 0xBce385e25c04d44EA455A66c31f88dde3D27D52C, 0xBD97862529740bec706e1223E4DAB945a6B34Da7, 0x695FF73dbdf5718060df23D98c0082FB46387883, 0xe7C165f04756725eD5B26fA9A208A7b4E33d9001, 0x219eBa09E916e47C2fcC948C270e13EdCF542Cb9, 0x7d6ba6535f39De0389152fcE8421E6100E314669, 0xC639B2EA79C14c474274F30D01b6aDE6a3E38c7b, 0xb9f606bA6208585a410a188aEc2FcC0FF4023cde, 0xCb87580e059367aB6AEDA0800a111B7564BeFEB2, 0x3AB1aE8Fd0395cb54aaC78d7dDC081995eFEee56, 0x17f6e07F5A823D9017C904020214e1bE0176c330, 0xCa578948522F1e46866aA43d400cDB3308a31C72, 0x84b42E755b3dc15EF1baA3F454F1326db74ca3E0, 0xF809d0aaED395bee072bF519288f9AC8685EeB05, 0xb685EAC5Cd564f3800A6407b2eA1304001Daa3Cf, 0xA4622d4b427576A2b58381b8decA16EC0Eba5435, 0xcfc17fD56fB282603ACd59ABa1e5098C81BC79fA, 0xB09f30F0C01013D2a2Ef6919Fd51448872206F76, 0x6843A1Cc358DF19a615EFF44fec4076852CaBBE7, 0x548183920dfCE64DAB9660f092585F5A12b24a31, 0x2F1888e61F720e156BE3EEF69F49e2a58B14C1bD, 0x31a61116d21CE5C00c0f780c766Fc60B06ECFC88, 0x3946e305c7BC8fA0449E2F1A6bB47c8b7735323E, 0x5D02b470c8De72d7ca1c29C52225c5fC6A4CA6aA, 0x764de3e6AEFD0812bF4A01f8A1bd68f35f43466D, 0x48eF0A333acE9CBEA02BE5A27e6F38476e68B047, 0x5D10efd2ac304519C65F0dFAE7A29EF56372De88, 0x6142f69ec6625A015Cf58dE2E3e3bEA100Bdb28C, 0xf1C1b29e44fAFD325343aAd9C4b370a6FDb8C25B, 0x2B71ed698404394457Fd1700f62c8026553DdC84, 0x94d9Afe57dbe581B922d46BadF853a4dD2A6E692, 0x5133b8EFc46f5B4925c613291d4f50A320aa9110, 0x30867B430baDC2b69ED533793bE0F4F8225583d6, 0xCcC7d4d5360e0108aD387987dacB27C2555e93ed, 0xA043945375d32E36c0B536A464599AA81481c013, 0x7e493288c10F9eAe8d0FFe5A0343798d6F99AE97, 0xc4Deed5c64002E63eae4F5d07B8Cab958425e748, 0x95169A240A584e17Ad52790298cFd9950eCd0EA6, 0xd3d1198D1dB80ED3651d13D9Dec2f32031674de2, 0xf447FDabbc8887f912F20ea379CC5Ed5255FD3a0, 0x9741F733B9DBbfc90c5D710E56E817fcCd8CC4f4, 0x3b66298b73574f81E20a1726E6E5692726969600, 0x5E8E7A26e849D9012703C4747049e86ab97e4Cea, 0x646dde2c6F7Be7eA8A8AaCD1fDc90ffA6604fD8a, 0x61eF6679040CE9217c43321175eA7E621e0D0308, 0xf7db9831171912dE3c4f1F94270Aa173EcB83F62, 0xd68E6c59B60eC3791c10A31f0CAa3c8eF036f3ce, 0xd076225d0121804b558e7e42cd42a5bfC40bc49b, 0x6d63a0aB10C3C5F3F701B0d38D206a02B516Fd7E, 0x66349EEf57DdBa4EA6E3be2468afa57964F559b9, 0x8B9c87A9386700899b3739b3A3bF46A4986FE352, 0xDFbb1c858406e4d9845bB2A110E3924CF6D17494, 0xaD21052a16176E3300a29D45292810092f869311, 0xB0b35fC00c575D01c9415F08672D3a5d88C44DfC, 0xC237720b255c86aBF131E09f8aE8Fc3A9abB6965, 0xD6f5767eEc28E2DbA187DC64f694265b20e581c5, 0x9394dfe40E1123ccb0D713FdB64930489Cdc54b0, 0x253B365e24eAd53764c76Aabe190E6dc5B141de7, 0x95112D392c5925F46ae3eB213E41F3eF1D89C10B, 0x6341878E98f69F592EC40339aF89f11DC3D54d63, 0x4946FECfE075311F67Ec05b73c16D5A72567fddC, 0x164437fa53eaFaE4A71f76798f9f8d836358d4B9, 0xDa07Ac78F7Ef476A4E76aB1F478676AC5af421c6, 0x5894874739bFdb9C6F4EFF35478CDfD3fBe99686, 0x94D1830f1372A835A1fFB8FEa2238734AF3B26b2, 0xDB89D586930AE64513b99Bd60Ec8E93cCD420eff, 0xF5Fea6C4849dC47Cb005444B23097B46443e5FC1, 0x56565be7023923b972c0987E5947125e902744F1, 0x2967e6345acBf42db1efb4c7FD0664192573648f, 0x45238465d450663b6B4C195bD55F2a86277622BF, 0x130Eb987a68559Af65e843d2cEffc535288deAFD, 0x452aA38c9938E50E08DD17a61D4B4E2eD5171D97, 0x225f2496651728C9C1D39edDa9d23eA46bC6A50e, 0x87efE563Fe7AFe1cC8b49CC750a765c67a1B5bfc, 0x372546A2332Fb165FFcaABC85C8994Df91d3C6Cf, 0x7b96b4139fd86737fc56E2900feF66011a0e83b4, 0xe6094A7eeD8b881C76685949A1C2b59E62271a87, 0x2B20536C6cE33E9cf6a9f4fC4Dd5bDed7303AA66, 0xFEF7600e5293b98982240D73553609eB3A2e2EF8, 0xD4cDe264B184F6efcc70c7fE0d677e549a125056, 0xd165D4FFA3609F0930B1abA4bD589B253870d137, 0xd3Cbd845a289710a43fdf648C056e8f7C6Fb0797, 0xE68F1118A6DBB5C8A2F7799aBF986eCaa9842ca4, 0xdd7B0F54bB4Acb6c4C8A39c1a689d81f5179Cc3a, 0xd4A5Cd8F17f2203a3BFBcd9C3818665BEB30fEB7, 0xf7c749e22040Bc69Bb30f6992c25C5c47F79ECBD, 0x2916fDd953f0E8cda0F81e79da3D4F81CF0b849A, 0xA64976d80f1D525ecD9832A35eba480C5018b757, 0x30DC93E5d8E4D2fB476E3Dc99AD21826cd03CFeB, 0x584fa626a4aE2D46e3F97704b869c2E30C5C4D93, 0xBB0737177EF367Bb1ED00c2056eFdC78128f78ce, 0x29212474cbf7465C2f6ccdd6eFB90D8AB9e18E32, 0x4ACaFF0085dcd2aA32c928329AAC5F33D2d549D7, 0x901F24d516e04cE06c23E0739294632eb7593a0c, 0xe0D38048F63F5C0c216d8Df77b83993fcc588275, 0x7eAC305cdc3eab4d1eAcaA7309D9301c0186e90E, 0x5FC939C76ECB500A613dB21C8d6521898E58Ba85, 0xC2b8BFDA869A2de05Ddf82bd81e9ee6218f9a09D, 0x729233c99D88EE5a91644Ac19D95135f15a5FA56, 0xa7DE69b2622599A4B6310b0f259A2fB6cBd865b6, 0x2829fF97cDd9eDBE2B69B1476D3E492345A3918B, 0x79D82792DF98085cB57D23f897Bb95E31BfE6947, 0x120A68D75854cEd70c4177beaa2A69C1bC74a10C, 0xBC24f5AEE562bb9884326560F94A394215F82CA4, 0x1c857Eb4ac51Fad3a9ab5de1140E36f30EE2De80, 0x093FeE32B95e4CB8159Bec0a96C71F488992A135, 0x3f18162e5A6b37C1B2c93827a50BF1913c1a35E4, 0x2463a644A5197B506c98E445591f41AF3b117c65, 0xc63e79f8863Ff431fB0F284edC85dBf70D8126c4, 0xB9ecC35a6cB9269B86242238B72285f667949A65, 0xBD9950B5840AB3B5AA873247C835CDe12359FDf5, 0x310c781FD88124FEb1C46eD6E416329B4bA2D255, 0x9085D78370E21d4baa9d0B9C7567271899995D5e, 0xdEfB390F318Ac4b6da594905051043Cfb76D0266, 0x062B7AdD03C4D1b8602214290D5cC2C2Df1393Dc, 0x6Bb5d94f8D2E2A0e23AcdB1C05f7F7c09B805D00, 0xB2B4E5eb1f929968604C3ED7AD0E5dDbAb190E67, 0xE5A2CD0C316a237b2FB900F0002CF31F2605A8dc, 0x589088ea42A516111d3eAB8501Dd577F0b410EcE, 0x5164aE76032470868502030A309e0463E5Eb689c, 0x0638E5Af59D83a0aE56aA60bf14CaF4a259188a1, 0xAF0D829397EFB90435022C0EA6611a4ABf2675EF, 0xa7f168Ca7e07801aA771550F7985e96B611940aB, 0xCEB926fe5ff00807F3074F93F03A0a194BBDD265, 0xE6C11eccaFBBeBfeF0762Cf7693Ea02cB6803C5c, 0x9552ab60B846328e7fA53d101C6BB347cddcb6eF, 0xDE1A0e68607270A6e8138C8Ff8FAe0b451Be12b4, 0xc1b874746960d14f92EC58a57C919c9ADCCe9D2b, 0x6EF6A581787E0183e303EeB63653437F83835C79, 0x57F9aC948a711AbEf3bdc56d7c6B19eE33B62034, 0x9c1ef5b444e55DAFE05E1458114DC7F539a6cC93, 0x11e68C2C3a79B7397c08298fdE9303F88eff2145, 0xb9a1E0233B48488ece064B31c7dF32cd74D09B4c, 0xdf2b2164aBe42B5F563d01761F4B7F62247E8659, 0x3D9114d10D1706fe9e32f306dabc669b58E3ceAC, 0xBc62825566667068638E541fdB40b5B53F348d61, 0x65634b5663e4f7c482feF44322E8C24717b8273d, 0x52ac15C684E040e0E620f9F5ef643E62368436d3, 0xA9E92D9aA3497Cde0FcC52A8472f3420258cBe44, 0x1df9cb7e6c0fd1Ed6e9C487dF2B0C73287918c23, 0x1cCa0F4a187136066ae37349E405d41d4Ee40dcC, 0x051F74ed1aD42F434c3f3BC7Ef477ec9eD85355a, 0xb5492144be55d656e15584dBAA67F346703b4d62, 0xfa273Fb78f170D4d5A40419a805bBeB3119f6beb, 0x5186d0D692D2C1574C923d9ffA1c4aC3bc630361, 0x45E9dB199518100e8945AbDE1d16881619874b7c, 0x6326a515DcE5DAE551c06E73A3e72274F38B9554, 0x7F072308b27c48e30030942E86E2fB6A3326522F, 0xfd5839A68FA7cEB4C05A32600099738453c7a3E4, 0x3828D045f1E06Bb67dEC3cE0CCeA27476145D849, 0xc7E4f2EAd501f2C83fcfc3D2B12d8eA2af88b6CD, 0x0e7d69027E29c8f275d746B9db276f8D66F1E90f, 0xC0a55a514e091EdB2068B7cEa9c39BdA444A6FCf, 0x690F38a29AD87A0d2d34D012bF0a0638893a3e41, 0xEd80605e66093A41A2cc3c90c62F74B47Ee3cA31, 0x47D16e4f0057C4613d7AD513F59Aa4A03C3440b6, 0xCDD996d94fAfD37E5685575d6c8520DA6E0c868E, 0xF0c801e041005b345516fAa57C4f1763557160ec, 0xaC15fE4d2197e14937D476918cD3C95652D3B2bB, 0xDa124fE632dF574B6e0883610D1d873599e0A12B, 0x991A5C7240201102DA48109080f73C5eDAc065d9, 0x3FE215Ccc6a782bAa39024b22f0aD0D3D3E0E7b8, 0x41BeC6FAdA7a12933FE5b79fbBE95Bc61F9Ec77C, 0x39DB9f33E378a776DE7929B1f5E414f69EbA5395, 0x869067b983a6e328a5bde3df3377DB9F1A4B2B38, 0x2BA186Aa24Eb5e9BA953f8B7B1597D3C0e071013, 0x332Ca8dC42Ef1B8FDb82c4b1FC6ae21d596d87dd, 0xe890ab2497167B9c83a11a60ad3b33206d5C31B1, 0x92Fc6B3f077B9235185C11055b70Aa000D217485, 0x4E7F22d7Fd34C34b238eCCB966Dd718d4BB8D5b3, 0xd9E8606E05Dc11c40cbDDf6aF2F2c653031A403f, 0xf5E0ccef6995Cee94F2e5Ea35cd7D22a0a430323, 0xa8dEB7dF0131436c1B80cd0428bC87564d19CaA0, 0x9e21B8e6515741FFe6FabAe7246CaC97dD1E35B9, 0x7178AB68a86c402762423492d68132103a32E9f6, 0x1f0ECAac8896906deaa160b57bb210910Ac67930, 0xfA35597e2b4dab4418de698Ef00c83BEcF61c206, 0xbD80e9d191cb754e26B256B5B7f284559FBAeFcD, 0xC64805057dA11F4088e1aeFea6D0F3aDfAAB6631, 0xD5106b56Ccf30309146CA33Def827093ef254F07, 0x7F051284371b056EbC22fDBD351d9769Bb47eBf5, 0x250E39b93DCF06f0ab98FCDcC650579e2f0a617e, 0xf0e2aF1d73519DCa59AFE66C9e51E9b001aa8Fc6, 0x49D06b209D558D6aC6C0bF90c8E3D2580068cb51, 0x76Abe820495a64a23F09335611E689b872cC04ce, 0x2d6c3075aE8d8E0e8c41C327e836C061f704a73a, 0x76efB67A2E64c1b8cF8118a38921D40BEDC2655b, 0xec557Cd88C8A35A64Be83c39DEEC839f8fD71fc7, 0x43CfA2281b7F5dfFBAe870Db2f083aeb4Eed9751, 0x66F70279247cfabe40bb104E39549C91966Ac5c9, 0x2A6B6D7B23917978EDAa7913588947E287d7a1C0, 0xB4C5eF538508069E16cA0E8D3fDAe105146C43B1, 0x781C162f6d48F16AcD001CE2c6Faa028012c7f9D, 0x8B49FFe476C2df08F9e533b718632f342d12610b, 0x8217c66F92B4C461221589B58A5256D3024BEd92, 0xa081335353644315770bf5B7c99Beb56a6545c5F, 0xec24c28637A1edb21E5E8B8b4C4B2ca38EA26645, 0x230c885A68c00a23e93DD3aE4323fAF34590C90E, 0xf3cB56Dd1d5f4d2741C88D2d0203af2BE0d590f0, 0xE44269CbA842c9cE487097547fae4943A07C0c36, 0xDD6855c8bE96572c3FAB3fc8FCf5dE4559A6c637, 0x372851EE6c6861F35d5898cF61d81860BFe217bf, 0x1ca08dbc0E9c0525B96843d528BFc936C7c69d1F, 0x19c825eA62aE9fe551114ad4e808C349DfF56794, 0xD8ad31878416B8359B3da6462832DC0A69856bC4, 0xA3F35aB696F6daE2Ae246cf93b8B68c1Ac3263fB, 0x4CDE3759459395527e7F43d9b84Cc8e1ef1560aD, 0xD62Fd93a5b17f114669EC50EEf698aa168d62135, 0xFBfC98210cDAb3FCdB25d8A5B4E85bD544D13fD9, 0xEf3DAFE895B216231143c6143441Be9670CF7a01, 0xEcdC4589883247793C1d7Ff84AdE2d3E9248Ca66, 0xbd51775C7F0cC0DB643E6265e118024e767160CD, 0x61f7656283a06c1dA39d2D0f6289843405fC0F26, 0x41F2ef80a6FaddA6D58b3C11F72F2F877cFf7319, 0x219e6C7750A55D2BBE47114Bbb518cB9BAb21ce3, 0x1EC7D390b1DA39ca67bA20ec42459542ee66b331, 0x03A126d177Ee82018Be12103D4125C32FbB7a98F, 0xc03B13250dD39feCa9fc8573156BdBDF447272c0, 0xbb83f4e3E8F6288103Cc6Fcd79B8EadbCBE7008f, 0x764f457219A8634fAad1c12Cbca5931b27F6ddcf, 0xA66633d97038b72C76c2088F3508a6EaB91347c5, 0x001f23FBbB768732F544F9d469bE75Efd3993550, 0x47A5d4a1dFB34094AdB36318185f020A5fD74AA3, 0x5b5dCcBc5844f4b4F3ca3409405a66EFe3c02636, 0x11b2c7d37a94747AD4642D8C7352d9c675fbE43A, 0xd05Ed7cA4434AF8e7dAd5e35Cf9a0763405594ff, 0xb264908d21F3562ce82ED391c121aB0A3db93FdF, 0x272424099E9b15a19925C7AF1F532eD2730F6d0F, 0x696bD18Fd69dFDBed0E561859e077eF37Bc02067, 0x659fd6C9fB20631Ba1e8A9a039268aB4CB5ceA52, 0x73bE6D93D77A82c0B234084dE54f617CbEFac323, 0xEa38cEBf7A86F9f8A8363B40F1316f39f60b8202, 0xe22722f2C9b86aA386DC9eb58Dc5352770c74C0d, 0xFE4DAb7dE895CfBfC85254682080CbBd15cac856, 0x0a8489031c6e678abD279C602833d9380b1DaFf3, 0x97Bd6E7e755b4Eb925F739147009C494f11BCA55, 0xBeB47a667E8457606164cD12BA368d252ecEe5E5, 0x90c668f43f7c574F42dE6F8c5752B9dC3b463532, 0x9D7ca9c8E4DB88149b08e0Aac0a6fB906973dabf, 0x97B3Deb441eFc227b6f962fA374b459620241710, 0x330f64262d60adEe9Cbe00A073E457029876297E, 0x7D408Dd027134e5CD551E8D930004E4A5aE0CF60, 0x4044F465e2e818d44902b7A009ff41Ef64134f6E, 0xA5c4B4721f4c49176165C61Dd74A4f74f21d0Ed1, 0x2A70d7e6D12586d65C20B13A86fAc4c52Ff01AE2, 0xD280913AAE96E875545F97D9BB3097122e8323A1, 0x247a28E1Fe9E8EaaC8520E02cB2E2c16b3eCA7f0, 0x937858868C7456f373EF4e9CA82Ed9dDd8662F5b, 0x17AdED37A973576344B99B6084CFCF1648Fd7976, 0x057bdF5211D6889feB89a7B9BE5Afb95Fd203b9a, 0xd13A14B04278327F8469588C42678999f35a68f8, 0x5517a173bCF607F40A39Be24f99710c4d66aCFB5, 0xA60705F4c123EA309aF1D532c0Ed3f98e6bD0fcb, 0x30f91e58bE1f0895900F66Ff79f1E836751C1923, 0x3C0f004BbC47eBa58b02409d7F1D210479EAecCC, 0x1fde817F7F1B7bc8B4feF6DAf154734e27320863, 0xa0Db18Ad72A9c2Cb579954275465c29ed2963d78, 0xfAf98aCd4b9A0b57a918e4569f86415c943b6276, 0x6C809Fa700a31F375D4331Fb270E911a9B188EcB, 0x46bB76a621963F5634C36211Ef02d4F2CDfBf190, 0x9281f9581fD59F15E9a0604c0b23cdd56E497c79, 0x237d64276BCA2d63bb75B884585a93dE0AcBe954, 0xC98de9A81c512DbD3B9b610C7b4F301400405f8B, 0x0B7e2a41E25E9D3D74f97D499f5A98A2e3FA84c3, 0xb99411a1B122E0aE23165ce593BbAa2641b80278, 0x24CD08248cc84Fc4A1E197D9cE85167d926BCdd5, 0xF9F9A4146F94edB8522FB009445Ba92a384c8BCE, 0x1aD2832EcDE8799Dc37c4FEEf3e5b9a5d80AdF10, 0x1ec8c33D2337f442B4670Db774dF14F091803646, 0x93502a67FC1a10De616df1C8586DC457058d9A33, 0x6626ab2019f025F254A08897Feb2a462bfa51E78, 0x2e9292617BAA117d1FadcB01B81453629D038e9b, 0x19a7048BBB13FE9A65c138b47A13c7770F64586C, 0x1744f2C7165C925F70aC6FdA1a6c89Be58d895C6, 0xe6D8F7cF4Cb8A51c2b052B0f7DCFb329d1A87f49, 0x30AdF4633F7808FFDd0137E918b3536c2Fb510B2, 0xCc81715c270eb458bb8AbfA809B54C86bB93Ab54, 0x2d9648B58Dd5b046a49FA9044ED2a7A90D7Ca229, 0x6150ef85a69887052023b63a0A22774092970607, 0x13538e550977B1Efe6ac47028007B618d19aac91, 0x2053b0fB2B4BeFf5a5b04D92d68038D67C4F7444, 0xddA699CB6336E76B0925efbD2C680D8E4A92d770, 0x6D13B48ed9B3de8a81f171e2103A02D5E24b3883, 0x4bD836Dc85D53150535203117D28BDa5E62983EC, 0x2Bd9027Cff1644cF3dC0BC6c18eb7E41DD101055, 0xE2C78417C7e38F40183C14c779C685Ae6b49dCAd, 0xA928a13B207859c98fd6CE52CE99a76aB2209202, 0x50E2bf04C16c9207dC14919Ed9F0063e1fb70D12, 0x39649A0c12e34a0D531Dd07ce4001e6d661d9F6e, 0x5DA7eD3Fb50f03c8e23CD7fe1431F85e6bf43bF6, 0xF557e5616C03D3C6b5E0372702D543d63e7ba06f, 0x9a278057512d8066C021f18941E856B0AeDd984c, 0xE2EEfc900244fF9042eE395385E69f334195a8e5, 0x7AFD1fE7fc82E2B7D45FFF2F5503A81Bcae10d19, 0x85A56fA841AF0f021f91BcB9fa0a90b4529536C1, 0xD10b81348c1b0F98F9F5E2AC5fb03754C0545F34, 0x19127285D001E8041BA04808463108DE19ca7b40, 0x4AA75D14cB7AAF4a45c1c640Fb7b196D2BC41960, 0xeA885F5988766225dBaa8D4a7603de6e0A5fa5a3, 0xa8b4769eBAC8bb354f2aBe6186206f834e8c0A43, 0xe4755E25440484e4b1b131F64FA506E91eB6d075, 0xb45394FcaDB2Cb7FbFf1F8E004bCa3eD6Da1B4cB, 0x7948a2504200A755e617364D393D90C622655349, 0xdC5Cf59c2ea87734037F5bF16DeB47f3Ac423444, 0xF621998D74f58757a920eA2AAE0d41841E7E7526, 0x916769041683e72B5974FBB31Bd12BB5874c6bcB, 0xE82092c9FBA97Af6C709853EB83E1D592AF1f3f6, 0xF7f6F5f372A253358d2ceB49d886e3aF877700BB, 0x0496aF9eE8c4de54C324DcacE5f71C13328521e1, 0xb9e404147e472aE31799E905B31e7b920f9424cF, 0x9aD8A3be394Bd0Cac052b19d01100D3c909A4894, 0xA3416958354D99714a91c7bBee8392670D1d117a, 0x7567AA359b8D885E780EA160cD5174aD3C775440, 0x581F014AaCEa3a03a920F23a70bc738c7dF70720, 0x527c509249Edd69E9715da10d11E85621291eC33, 0xF6a796c1EC1c06e93c16A44f2d6b664Fe1926A69, 0x8E3404c6aB09AA6b541c54a300c6A9B2cdF4D048, 0x5F78d70388Af8909d8513c89CefD81E8F65A3973, 0x58A0F75331929454Cf803323B42f0fBc34d1E240, 0x943E95BB9E698c06Ec9CBedf0594586f505BD736, 0x3CC2A20882627814D814A4F5A89DF9d262D76AcE, 0x94aeA01B7F60D262021ba0ed742e8760f0ff4633, 0x7dD9c596806C706a12359d4729f0743ad6E200AA, 0x2230574CF03adF7445A9EdE609Eeca0D70FF7f9c, 0x6cf6A4233d1DAF396F3B35093CAd61b94E31a00E, 0xff0E7016fa23F597590c7a93FB2e87df697029ca, 0x439eeaF97BbCa20817f2beF3C6a75aEa6F029592, 0x1d87e40385d92Ae747c0088EE2073f4B26FbbBdB, 0x44855c3ff61B49C62a8538BF226A82A4d1b8C1f4, 0x127F66825eb9B1F7C667Fc253f37E97E4BDE4DE8, 0x5A49ED67a96aff97E1E2006a21F7D193d27Bd28F, 0x625522D96c6BB741f96D8C99CBa0A5B67c18002B, 0x72F05544b5ffc11ACF02b52806FC9d7B2e428635, 0x8c9188e8cB29078684ffFEaa5C0FAf09E7b3A95D, 0x178C13Af021D434E48471De556749c607A1C2b93, 0x7a3C799DaF89F18210F123BcDe62D14fcfc315ae, 0xB3d92Fd17952851563969EC32f0e64406218B6Ca, 0xC6687bA20103E0861BB09Ed1Cb7d297489bC1A41, 0x17Fa25Ab8e7Fbd64a69C1D963CB97Ae6E20CE88E, 0xCba6dcdFDb7d0E8a38D965D634f3b4A20fa65d6E, 0x670494E88eD61e093A53aD65603190A3c844038D, 0x82978F70b2E16f1C6124BF1A97d8c30E0A7E9782, 0x6c725F41E98451F167820551013BD2f5BE8bFE6f, 0x5a4021481c2eB83d63E64433d618ff98db56fFeb, 0x1f56A3B72AcD2c8898ABdF9805077F78eBD0a9Ec, 0x871ea72e8FC9043D0DFa7487096c313F1E75584a, 0xB644518e5f4c0c0e461D195c596a837b7273FB75, 0x1083F74dBEA81603522964C1Ae6E79DB762538D4, 0xc0dE7d6A5F9B145ab280651267f4E55F2Ff63b2d, 0x5aFda214BcE264e0cD6abF0858BB248D82c52329, 0x9e18c551Ee13104c5ee56Ff26Db439E7a9E8d32c, 0x44761c2dFFFADC354578Db62ec0A4071d242A62d, 0xAd028E3d0AcDDA373dF217413115353A2C516BCb, 0x620022c311b16F62AAC19FfE5b3C1CAC2F15B2f2, 0x16C4776dD7f89E0E702BBed3A875c0E3a1EEdEBB, 0xFEc9B0710822cFE9f2E74342c95B53caF869C44C, 0x5C0C3F639116751f170F36037B9Bf323B824c665, 0xEE1B917229C8536cE985286629AAd8FC643387da, 0x0cD078AA1324623EDEe6769817b1f19747e3a5b0, 0xbE8f4bc1c523Ab034ba1FD51f31BbB040Ce9d0A7, 0x935aBEa578e9338B97055866739231793111D31b, 0x3efFc6dE41C6cFcAFe4842f6b0EEd71eA723eB97, 0x80104EE52A11a12EC5B11639aAcDe1e982281dB4, 0x33D9CBAa6ff2569273798559B5cD307cd74004a8, 0xb8E162a19A4CE299B06d3b1Cd50229Cb04d8f04C, 0xA266AFaE64d0c8cCd56878c1ea3b3ff9283b17D1, 0xC293CB3A5A48bcB7Fc512B8F248254862f5A06B4, 0x1b137E5E5109F43F5AD969169e593e40280Cf056, 0x54C30EC6Bc03d765E3e2EC9E85bF5903509c1350, 0x9a48C7a0B06FAd94892C1E1F03aFdA8c76385725, 0x08148392755b6ea8Ce7EfC5db3518746c1C22ED6, 0x3a44f49e3EC2B4876483e05F45811D1Ac5563f3f, 0xB12DD4571F0d2A275A4139f3AB48d2F9bfA6b0E1, 0xaA43938eEc078196dBCf61aC5B02b2fad914e08B, 0xfff90A1Ca55af379E7f2F96FAD938C2c42eFCb8C, 0xcA4dAa959438d523cFf6741E2Ed0cEE175Ff38a9, 0xD141BfdcC30aB6cb4B5712eaC1fa1444C66fe2e2, 0xc8B0f1d9542E0f2A9D8ED119F7c34f44A51a06d2, 0x9f42818B96F847F9010f4Cb2e9bA3b406496D786, 0xf91EA671a7569D85c3809a7cbEbdf51B809E4C99, 0xE264E02fa476b366DE5bB878FB174334389aC276, 0xE49E0E30a5d4d29Fb63835718EB49F26E743Bcdb, 0xED1570015FA2670E332bf9fDa70aA70A945dA3Da, 0x017d6016FB4450991bdDb1Ca4413d901b69C8a4C, 0x9A2A9f63ae9E3D8d59695C11599aC2BEE4608822, 0x823240Ff4267b7A66CA4219A8D3Bc2d55c1fe366, 0x2824C0195a79330Fd62680FA25074549d4EA027f, 0x691769BC034bD26D75c292c13cdc1142D5248563, 0x5aE17A4B8f47e33168906a939D183B5800b3566A, 0x52c6D207205c87f3fAF27de0F3db94070D5823E2, 0xAEC2C0c655f22Dcc0480EBAFAcC58b12295765c6, 0x59E6F388017657bF66e46A58C8bc498021036f31, 0x91E952Cd5F79F81a7C5A8d0D4A4B254fFC9553f4, 0xb1BFC5a95A2Cf72016C0a129C2074c1d32372568, 0x14D0b0Eb684683193d2fC4A7574d934B6791719b, 0xe00C1736D799cb9E2D7Cc7E26fDB93F2A2010464, 0xde8366beFC42cEBb138f379d91623E5AA10E5FC9] )
-
EthealPromoToken.massNotify( _owners=[0xa47cBf15C2B07d14b8f85F7e2744b9B0FbC1F8b9, 0xBE0cD7e74315f9d7BdB13210d270EdcE923afE6C, 0xa0574E8EFa51cDA4bfE335bA1EA8f62B0FB5cB9a, 0x77206C3AFc80a1c5BC7cA98f51D7Cf30A8FB6a36, 0x7dd4b0dEb53294D2Bb9aEAa663573bb64806a27D, 0xc91ED37A0538994b49917a24383eA738Aad5A34c, 0x1c9288300827082bB4D78022c13b3122E371A840, 0x490B214b1A498CE8f91F5D48642757b50cBa1C82, 0x85aC8FFFe303AfF713276b2969008A67dD3E5145, 0x794D4a00bE010bBE04972686eae908Ed8EE31673, 0x171637DA4d03A1D947A5b2ca0545E24A34539792, 0x007663Df7e94a3c4cd70F5124672E9E8549B6dE0, 0x68D9B52A540b8036eA48dDAE923F9132C411CcDF, 0xEF81cdF057161896cA710a7B529530D5585820a9, 0xEa4FAf02e966DF60dc0AAc00473aeAF20D2A9834, 0x5B4Bd05E378d5d056FA7bF7564E5BCF8bae329d6, 0x969c560C0595A363830ffC9B083Af9D771447704, 0x79D28e63D9A7f69311cb225eAC45fC4cC14C8caE, 0x1f4c0602Fc07be4934f8205Cc3C230dF58c8d9A7, 0xba6A9A9F8B74Ca1DB257BFf14745468ee1eb9439, 0xC72beFa89825B5c243F20A61B39a81142EBDd71e, 0x1e150aE084DE4340411e38F9DC671609ab3356E8, 0x5256E7f919317a9E454A94A29BA00068A913dd78, 0x2315771Dba453b5b42B312A6b6f7188B291e8D3c, 0x73b5Ca59f9d8a3B17DcFe06D5B961A11e06a0Ac5, 0x9b58f17925dF745f8f3A47b2519064f3B370B8C2, 0xF8Ac91dd1aa23C786D78dDbF6c60C3F72a043110, 0xfff13a33e611F51bF60e36F58eBbA9d15c7c0F4c, 0x85D504c5E4F87E0fb28A7737DE0DBB61a1FFB529, 0x6eaFeFCC00302A5cb172E614157b6De20243FAF0, 0x0C4AB53b0E2169a5E58346F4BF1f84548F64d4b3, 0x8599F4c75E803F53B587ae532eD1239EB76dA1f8, 0xFEdD303431dB3086bE00E711Bf320d7CDb717204, 0x9E73fAE1A572B6A20243f9509DEb3326826A9FbA, 0xD8d816019298BE382104fCB20CEF1F4957046cf3, 0xdE34a1D782A2e3fCcdfe87c6b9F4250BAca7df2E, 0x5B0dFe827501Fa14f378f40e0D6820EEBBD3cB37, 0x1b86e8458a85373cCAd6eCbD0f700012F81C68e6, 0xE322F4abbF8d922aB99A6710ee23ca234c01a529, 0x5795C7b86b39E152A26347341490ec235baF8B0e, 0x6a4f3D6D40d3b97A30662F36d7d2a96AC0061229, 0x0eDA64D1A9cF816BcCaE5ec58eD233c977268f5E, 0x8fFF01a9A03542d5f8A7F089B844B90902FE6C63, 0x4096c35e685bb68404c410A61aF6564E083b5F53, 0x228458e0E016DEA2Cc2077186CE0212912008b97, 0x79e3E0B7aCc6561bcF8607D98ba6cbB9F644b86C, 0xae9E4033cBd43e728ceB7A565c73D9444863f60c, 0xB070a30d5525B9b56a2364E2252E28788D8399a2, 0xAF2608e3049e678f857C4676D0b8f68AFd1cF7FF, 0x9eE0297cf715f0C6D05609E0045c54e7D771039e, 0xD097D56cCa1DD5eF852309ECCE1F20068734474E, 0xdDdf069E5b45Af7D48C447a3AdbAfFca35b69867, 0xC92A25B020dA74FA41bD9f8C5C584f11A5c69dD9, 0x1146477ECE376a67FB87773bA5972cec4490c557, 0xe0c4034c56c7344f215cEd319108d54Ea5622E61, 0x76FbD4Ef3c9BC230b9A96D784491e6Bd6CBA2007, 0xD1f91011235FB95F4aD40e04c2850015EEfdfaF8, 0x8cEafCE0a88F2B9e9b05519702fF06E130B5ff61, 0x11eA605a777F985A10dfdf14897f0d4638c1Fd22, 0x156cf9747cA5327CC67519B6F3F56e5f5B526Ef4, 0xEb7882fc90c7B015E155812bB0496f2B1725ca08, 0x7eA1c9b1b3Df4b5d3d9a5AEf40176eE9ebbE4065, 0x5BBcC8E8079379607004Ba20A096f4479395A784, 0x3A432641859B318Cb8405cc439238142f50e58da, 0x69dCe2D4bB83f2A6BFE93017994A9A4d9413E417, 0x5b6d97049C76D2C7f4A7c82a8cad86E7ee74F116, 0xbDf47dc040b8817E912290cD86f6cd3324C5bC2E, 0x052Ec3e51c2e98D512F20924EA422563C49C5790, 0xa5410Ac81f837235141EDEdeF1f4F7a326e422d6, 0x7F501B4751881017E633A74aF46B3d41B3C1857e, 0xaf1B3c9EE18dfF35365Bb9adc18C36A6Bf817fCE, 0xf1398747f0E29a5253D8CBCdD9a26e74A9697cCa, 0xa0f5dFC5914FC1dE83004Fdd091109913E701453, 0x5183CB983895B583872D8575a53D3f6501dddf04, 0xCA3eed6F4dd4b55228aBB387feedcA83c3072748, 0xad703B98F1e58A084ccF12041e3b4CFb65F92263, 0x49Fd6b97Be45B0AFa67a53a4Ea933B673fC738E3, 0x9aAc1Cbd701466B22d4b9B15f6533e0D5a335FE0, 0x1c45375e4639c4eDD5DBaA05c067Ff8698B6aC74, 0xFa40361ADBaaC9A2ffA1C1B573d75b09d850Eb34, 0x8362E39A9A31D90910F2fA80C386253faF33b6c6, 0x691Ca25c046eD8A18C9a0BA70189A26A20ccf8Bd, 0x9FA343F398F0Ba34AD14e66Ace272E50C9536533, 0x63B5e77B719ece17De91c1cEc40d18c94dcDc29F, 0x67EeCEcAFe593399A15E06CBb4bFede13d4E80F8, 0x3493dCF1F747a7278b7eeeE49c9F048cB2BCA645, 0x42d4183Fece6eF9a54Bc167015AAe7f3cdfA33ff, 0x4e64372cA4674c8DE4BfCDe718B5182fb3267b15, 0xa2E4b7cd82C31d6c583740AdA6d90E96BA26d2Ff, 0x1d4838Df9fCbF6b7c278b109273Cb5B8dc68cE05, 0x2B11B690218DafD76F9c63f58153FF19134a919D, 0xD1d3a8282a4AC773689428e263d1da6F0650A08F, 0x2A24A7E1bC2d6FB07064a5bB8E4692180B9Db265, 0xd036BF4e3596ec9772FCe689773E9530C5b475b9, 0x061a12353e4f6BF2D8c5CD00e5635eCe51f17236, 0x73D0E4707485aC16F0B67C944516830eBddB224e, 0x9a191e0a0CE95F00cC43f53CcF4aDd89f252DD50, 0x7e9F59E5Da12FC26541Ff92b48205c0f3048c60b, 0x5064d4466d4569640e83d9a9837945e6db332373, 0x787257e306113F388b31AF4D5a920647198F3942, 0x7329A19739909313271FfBB9A3a5438D8c3b857C, 0xcDF07447eB9b946Fe16d0c0F23B741Aa03D8a226, 0x162B6955FABDf84157e18cBf988b4D89D6099F1A, 0xBce385e25c04d44EA455A66c31f88dde3D27D52C, 0xBD97862529740bec706e1223E4DAB945a6B34Da7, 0x695FF73dbdf5718060df23D98c0082FB46387883, 0xe7C165f04756725eD5B26fA9A208A7b4E33d9001, 0x219eBa09E916e47C2fcC948C270e13EdCF542Cb9, 0x7d6ba6535f39De0389152fcE8421E6100E314669, 0xC639B2EA79C14c474274F30D01b6aDE6a3E38c7b, 0xb9f606bA6208585a410a188aEc2FcC0FF4023cde, 0xCb87580e059367aB6AEDA0800a111B7564BeFEB2, 0x3AB1aE8Fd0395cb54aaC78d7dDC081995eFEee56, 0x17f6e07F5A823D9017C904020214e1bE0176c330, 0xCa578948522F1e46866aA43d400cDB3308a31C72, 0x84b42E755b3dc15EF1baA3F454F1326db74ca3E0, 0xF809d0aaED395bee072bF519288f9AC8685EeB05, 0xb685EAC5Cd564f3800A6407b2eA1304001Daa3Cf, 0xA4622d4b427576A2b58381b8decA16EC0Eba5435, 0xcfc17fD56fB282603ACd59ABa1e5098C81BC79fA, 0xB09f30F0C01013D2a2Ef6919Fd51448872206F76, 0x6843A1Cc358DF19a615EFF44fec4076852CaBBE7, 0x548183920dfCE64DAB9660f092585F5A12b24a31, 0x2F1888e61F720e156BE3EEF69F49e2a58B14C1bD, 0x31a61116d21CE5C00c0f780c766Fc60B06ECFC88, 0x3946e305c7BC8fA0449E2F1A6bB47c8b7735323E, 0x5D02b470c8De72d7ca1c29C52225c5fC6A4CA6aA, 0x764de3e6AEFD0812bF4A01f8A1bd68f35f43466D, 0x48eF0A333acE9CBEA02BE5A27e6F38476e68B047, 0x5D10efd2ac304519C65F0dFAE7A29EF56372De88, 0x6142f69ec6625A015Cf58dE2E3e3bEA100Bdb28C, 0xf1C1b29e44fAFD325343aAd9C4b370a6FDb8C25B, 0x2B71ed698404394457Fd1700f62c8026553DdC84, 0x94d9Afe57dbe581B922d46BadF853a4dD2A6E692, 0x5133b8EFc46f5B4925c613291d4f50A320aa9110, 0x30867B430baDC2b69ED533793bE0F4F8225583d6, 0xCcC7d4d5360e0108aD387987dacB27C2555e93ed, 0xA043945375d32E36c0B536A464599AA81481c013, 0x7e493288c10F9eAe8d0FFe5A0343798d6F99AE97, 0xc4Deed5c64002E63eae4F5d07B8Cab958425e748, 0x95169A240A584e17Ad52790298cFd9950eCd0EA6, 0xd3d1198D1dB80ED3651d13D9Dec2f32031674de2, 0xf447FDabbc8887f912F20ea379CC5Ed5255FD3a0, 0x9741F733B9DBbfc90c5D710E56E817fcCd8CC4f4, 0x3b66298b73574f81E20a1726E6E5692726969600, 0x5E8E7A26e849D9012703C4747049e86ab97e4Cea, 0x646dde2c6F7Be7eA8A8AaCD1fDc90ffA6604fD8a, 0x61eF6679040CE9217c43321175eA7E621e0D0308, 0xf7db9831171912dE3c4f1F94270Aa173EcB83F62, 0xd68E6c59B60eC3791c10A31f0CAa3c8eF036f3ce, 0xd076225d0121804b558e7e42cd42a5bfC40bc49b, 0x6d63a0aB10C3C5F3F701B0d38D206a02B516Fd7E, 0x66349EEf57DdBa4EA6E3be2468afa57964F559b9, 0x8B9c87A9386700899b3739b3A3bF46A4986FE352, 0xDFbb1c858406e4d9845bB2A110E3924CF6D17494, 0xaD21052a16176E3300a29D45292810092f869311, 0xB0b35fC00c575D01c9415F08672D3a5d88C44DfC, 0xC237720b255c86aBF131E09f8aE8Fc3A9abB6965, 0xD6f5767eEc28E2DbA187DC64f694265b20e581c5, 0x9394dfe40E1123ccb0D713FdB64930489Cdc54b0, 0x253B365e24eAd53764c76Aabe190E6dc5B141de7, 0x95112D392c5925F46ae3eB213E41F3eF1D89C10B, 0x6341878E98f69F592EC40339aF89f11DC3D54d63, 0x4946FECfE075311F67Ec05b73c16D5A72567fddC, 0x164437fa53eaFaE4A71f76798f9f8d836358d4B9, 0xDa07Ac78F7Ef476A4E76aB1F478676AC5af421c6, 0x5894874739bFdb9C6F4EFF35478CDfD3fBe99686, 0x94D1830f1372A835A1fFB8FEa2238734AF3B26b2, 0xDB89D586930AE64513b99Bd60Ec8E93cCD420eff, 0xF5Fea6C4849dC47Cb005444B23097B46443e5FC1, 0x56565be7023923b972c0987E5947125e902744F1, 0x2967e6345acBf42db1efb4c7FD0664192573648f, 0x45238465d450663b6B4C195bD55F2a86277622BF, 0x130Eb987a68559Af65e843d2cEffc535288deAFD, 0x452aA38c9938E50E08DD17a61D4B4E2eD5171D97, 0x225f2496651728C9C1D39edDa9d23eA46bC6A50e, 0x87efE563Fe7AFe1cC8b49CC750a765c67a1B5bfc, 0x372546A2332Fb165FFcaABC85C8994Df91d3C6Cf, 0x7b96b4139fd86737fc56E2900feF66011a0e83b4, 0xe6094A7eeD8b881C76685949A1C2b59E62271a87, 0x2B20536C6cE33E9cf6a9f4fC4Dd5bDed7303AA66, 0xFEF7600e5293b98982240D73553609eB3A2e2EF8, 0xD4cDe264B184F6efcc70c7fE0d677e549a125056, 0xd165D4FFA3609F0930B1abA4bD589B253870d137, 0xd3Cbd845a289710a43fdf648C056e8f7C6Fb0797, 0xE68F1118A6DBB5C8A2F7799aBF986eCaa9842ca4, 0xdd7B0F54bB4Acb6c4C8A39c1a689d81f5179Cc3a, 0xd4A5Cd8F17f2203a3BFBcd9C3818665BEB30fEB7, 0xf7c749e22040Bc69Bb30f6992c25C5c47F79ECBD, 0x2916fDd953f0E8cda0F81e79da3D4F81CF0b849A, 0xA64976d80f1D525ecD9832A35eba480C5018b757, 0x30DC93E5d8E4D2fB476E3Dc99AD21826cd03CFeB, 0x584fa626a4aE2D46e3F97704b869c2E30C5C4D93, 0xBB0737177EF367Bb1ED00c2056eFdC78128f78ce, 0x29212474cbf7465C2f6ccdd6eFB90D8AB9e18E32, 0x4ACaFF0085dcd2aA32c928329AAC5F33D2d549D7, 0x901F24d516e04cE06c23E0739294632eb7593a0c, 0xe0D38048F63F5C0c216d8Df77b83993fcc588275, 0x7eAC305cdc3eab4d1eAcaA7309D9301c0186e90E, 0x5FC939C76ECB500A613dB21C8d6521898E58Ba85, 0xC2b8BFDA869A2de05Ddf82bd81e9ee6218f9a09D, 0x729233c99D88EE5a91644Ac19D95135f15a5FA56, 0xa7DE69b2622599A4B6310b0f259A2fB6cBd865b6, 0x2829fF97cDd9eDBE2B69B1476D3E492345A3918B, 0x79D82792DF98085cB57D23f897Bb95E31BfE6947, 0x120A68D75854cEd70c4177beaa2A69C1bC74a10C, 0xBC24f5AEE562bb9884326560F94A394215F82CA4, 0x1c857Eb4ac51Fad3a9ab5de1140E36f30EE2De80, 0x093FeE32B95e4CB8159Bec0a96C71F488992A135, 0x3f18162e5A6b37C1B2c93827a50BF1913c1a35E4, 0x2463a644A5197B506c98E445591f41AF3b117c65, 0xc63e79f8863Ff431fB0F284edC85dBf70D8126c4, 0xB9ecC35a6cB9269B86242238B72285f667949A65, 0xBD9950B5840AB3B5AA873247C835CDe12359FDf5, 0x310c781FD88124FEb1C46eD6E416329B4bA2D255, 0x9085D78370E21d4baa9d0B9C7567271899995D5e, 0xdEfB390F318Ac4b6da594905051043Cfb76D0266, 0x062B7AdD03C4D1b8602214290D5cC2C2Df1393Dc, 0x6Bb5d94f8D2E2A0e23AcdB1C05f7F7c09B805D00, 0xB2B4E5eb1f929968604C3ED7AD0E5dDbAb190E67, 0xE5A2CD0C316a237b2FB900F0002CF31F2605A8dc, 0x589088ea42A516111d3eAB8501Dd577F0b410EcE, 0x5164aE76032470868502030A309e0463E5Eb689c, 0x0638E5Af59D83a0aE56aA60bf14CaF4a259188a1, 0xAF0D829397EFB90435022C0EA6611a4ABf2675EF, 0xa7f168Ca7e07801aA771550F7985e96B611940aB, 0xCEB926fe5ff00807F3074F93F03A0a194BBDD265, 0xE6C11eccaFBBeBfeF0762Cf7693Ea02cB6803C5c, 0x9552ab60B846328e7fA53d101C6BB347cddcb6eF, 0xDE1A0e68607270A6e8138C8Ff8FAe0b451Be12b4, 0xc1b874746960d14f92EC58a57C919c9ADCCe9D2b, 0x6EF6A581787E0183e303EeB63653437F83835C79, 0x57F9aC948a711AbEf3bdc56d7c6B19eE33B62034, 0x9c1ef5b444e55DAFE05E1458114DC7F539a6cC93, 0x11e68C2C3a79B7397c08298fdE9303F88eff2145, 0xb9a1E0233B48488ece064B31c7dF32cd74D09B4c, 0xdf2b2164aBe42B5F563d01761F4B7F62247E8659, 0x3D9114d10D1706fe9e32f306dabc669b58E3ceAC, 0xBc62825566667068638E541fdB40b5B53F348d61, 0x65634b5663e4f7c482feF44322E8C24717b8273d, 0x52ac15C684E040e0E620f9F5ef643E62368436d3, 0xA9E92D9aA3497Cde0FcC52A8472f3420258cBe44, 0x1df9cb7e6c0fd1Ed6e9C487dF2B0C73287918c23, 0x1cCa0F4a187136066ae37349E405d41d4Ee40dcC, 0x051F74ed1aD42F434c3f3BC7Ef477ec9eD85355a, 0xb5492144be55d656e15584dBAA67F346703b4d62, 0xfa273Fb78f170D4d5A40419a805bBeB3119f6beb, 0x5186d0D692D2C1574C923d9ffA1c4aC3bc630361, 0x45E9dB199518100e8945AbDE1d16881619874b7c, 0x6326a515DcE5DAE551c06E73A3e72274F38B9554, 0x7F072308b27c48e30030942E86E2fB6A3326522F, 0xfd5839A68FA7cEB4C05A32600099738453c7a3E4, 0x3828D045f1E06Bb67dEC3cE0CCeA27476145D849, 0xc7E4f2EAd501f2C83fcfc3D2B12d8eA2af88b6CD, 0x0e7d69027E29c8f275d746B9db276f8D66F1E90f, 0xC0a55a514e091EdB2068B7cEa9c39BdA444A6FCf, 0x690F38a29AD87A0d2d34D012bF0a0638893a3e41, 0xEd80605e66093A41A2cc3c90c62F74B47Ee3cA31, 0x47D16e4f0057C4613d7AD513F59Aa4A03C3440b6, 0xCDD996d94fAfD37E5685575d6c8520DA6E0c868E, 0xF0c801e041005b345516fAa57C4f1763557160ec, 0xaC15fE4d2197e14937D476918cD3C95652D3B2bB, 0xDa124fE632dF574B6e0883610D1d873599e0A12B, 0x991A5C7240201102DA48109080f73C5eDAc065d9, 0x3FE215Ccc6a782bAa39024b22f0aD0D3D3E0E7b8, 0x41BeC6FAdA7a12933FE5b79fbBE95Bc61F9Ec77C, 0x39DB9f33E378a776DE7929B1f5E414f69EbA5395, 0x869067b983a6e328a5bde3df3377DB9F1A4B2B38, 0x2BA186Aa24Eb5e9BA953f8B7B1597D3C0e071013, 0x332Ca8dC42Ef1B8FDb82c4b1FC6ae21d596d87dd, 0xe890ab2497167B9c83a11a60ad3b33206d5C31B1, 0x92Fc6B3f077B9235185C11055b70Aa000D217485, 0x4E7F22d7Fd34C34b238eCCB966Dd718d4BB8D5b3, 0xd9E8606E05Dc11c40cbDDf6aF2F2c653031A403f, 0xf5E0ccef6995Cee94F2e5Ea35cd7D22a0a430323, 0xa8dEB7dF0131436c1B80cd0428bC87564d19CaA0, 0x9e21B8e6515741FFe6FabAe7246CaC97dD1E35B9, 0x7178AB68a86c402762423492d68132103a32E9f6, 0x1f0ECAac8896906deaa160b57bb210910Ac67930, 0xfA35597e2b4dab4418de698Ef00c83BEcF61c206, 0xbD80e9d191cb754e26B256B5B7f284559FBAeFcD, 0xC64805057dA11F4088e1aeFea6D0F3aDfAAB6631, 0xD5106b56Ccf30309146CA33Def827093ef254F07, 0x7F051284371b056EbC22fDBD351d9769Bb47eBf5, 0x250E39b93DCF06f0ab98FCDcC650579e2f0a617e, 0xf0e2aF1d73519DCa59AFE66C9e51E9b001aa8Fc6, 0x49D06b209D558D6aC6C0bF90c8E3D2580068cb51, 0x76Abe820495a64a23F09335611E689b872cC04ce, 0x2d6c3075aE8d8E0e8c41C327e836C061f704a73a, 0x76efB67A2E64c1b8cF8118a38921D40BEDC2655b, 0xec557Cd88C8A35A64Be83c39DEEC839f8fD71fc7, 0x43CfA2281b7F5dfFBAe870Db2f083aeb4Eed9751, 0x66F70279247cfabe40bb104E39549C91966Ac5c9, 0x2A6B6D7B23917978EDAa7913588947E287d7a1C0, 0xB4C5eF538508069E16cA0E8D3fDAe105146C43B1, 0x781C162f6d48F16AcD001CE2c6Faa028012c7f9D, 0x8B49FFe476C2df08F9e533b718632f342d12610b, 0x8217c66F92B4C461221589B58A5256D3024BEd92, 0xa081335353644315770bf5B7c99Beb56a6545c5F, 0xec24c28637A1edb21E5E8B8b4C4B2ca38EA26645, 0x230c885A68c00a23e93DD3aE4323fAF34590C90E, 0xf3cB56Dd1d5f4d2741C88D2d0203af2BE0d590f0, 0xE44269CbA842c9cE487097547fae4943A07C0c36, 0xDD6855c8bE96572c3FAB3fc8FCf5dE4559A6c637, 0x372851EE6c6861F35d5898cF61d81860BFe217bf, 0x1ca08dbc0E9c0525B96843d528BFc936C7c69d1F, 0x19c825eA62aE9fe551114ad4e808C349DfF56794, 0xD8ad31878416B8359B3da6462832DC0A69856bC4, 0xA3F35aB696F6daE2Ae246cf93b8B68c1Ac3263fB, 0x4CDE3759459395527e7F43d9b84Cc8e1ef1560aD, 0xD62Fd93a5b17f114669EC50EEf698aa168d62135, 0xFBfC98210cDAb3FCdB25d8A5B4E85bD544D13fD9, 0xEf3DAFE895B216231143c6143441Be9670CF7a01, 0xEcdC4589883247793C1d7Ff84AdE2d3E9248Ca66, 0xbd51775C7F0cC0DB643E6265e118024e767160CD, 0x61f7656283a06c1dA39d2D0f6289843405fC0F26, 0x41F2ef80a6FaddA6D58b3C11F72F2F877cFf7319, 0x219e6C7750A55D2BBE47114Bbb518cB9BAb21ce3, 0x1EC7D390b1DA39ca67bA20ec42459542ee66b331, 0x03A126d177Ee82018Be12103D4125C32FbB7a98F, 0xc03B13250dD39feCa9fc8573156BdBDF447272c0, 0xbb83f4e3E8F6288103Cc6Fcd79B8EadbCBE7008f, 0x764f457219A8634fAad1c12Cbca5931b27F6ddcf, 0xA66633d97038b72C76c2088F3508a6EaB91347c5, 0x001f23FBbB768732F544F9d469bE75Efd3993550, 0x47A5d4a1dFB34094AdB36318185f020A5fD74AA3, 0x5b5dCcBc5844f4b4F3ca3409405a66EFe3c02636, 0x11b2c7d37a94747AD4642D8C7352d9c675fbE43A, 0xd05Ed7cA4434AF8e7dAd5e35Cf9a0763405594ff, 0xb264908d21F3562ce82ED391c121aB0A3db93FdF, 0x272424099E9b15a19925C7AF1F532eD2730F6d0F, 0x696bD18Fd69dFDBed0E561859e077eF37Bc02067, 0x659fd6C9fB20631Ba1e8A9a039268aB4CB5ceA52, 0x73bE6D93D77A82c0B234084dE54f617CbEFac323, 0xEa38cEBf7A86F9f8A8363B40F1316f39f60b8202, 0xe22722f2C9b86aA386DC9eb58Dc5352770c74C0d, 0xFE4DAb7dE895CfBfC85254682080CbBd15cac856, 0x0a8489031c6e678abD279C602833d9380b1DaFf3, 0x97Bd6E7e755b4Eb925F739147009C494f11BCA55, 0xBeB47a667E8457606164cD12BA368d252ecEe5E5, 0x90c668f43f7c574F42dE6F8c5752B9dC3b463532, 0x9D7ca9c8E4DB88149b08e0Aac0a6fB906973dabf, 0x97B3Deb441eFc227b6f962fA374b459620241710, 0x330f64262d60adEe9Cbe00A073E457029876297E, 0x7D408Dd027134e5CD551E8D930004E4A5aE0CF60, 0x4044F465e2e818d44902b7A009ff41Ef64134f6E, 0xA5c4B4721f4c49176165C61Dd74A4f74f21d0Ed1, 0x2A70d7e6D12586d65C20B13A86fAc4c52Ff01AE2, 0xD280913AAE96E875545F97D9BB3097122e8323A1, 0x247a28E1Fe9E8EaaC8520E02cB2E2c16b3eCA7f0, 0x937858868C7456f373EF4e9CA82Ed9dDd8662F5b, 0x17AdED37A973576344B99B6084CFCF1648Fd7976, 0x057bdF5211D6889feB89a7B9BE5Afb95Fd203b9a, 0xd13A14B04278327F8469588C42678999f35a68f8, 0x5517a173bCF607F40A39Be24f99710c4d66aCFB5, 0xA60705F4c123EA309aF1D532c0Ed3f98e6bD0fcb, 0x30f91e58bE1f0895900F66Ff79f1E836751C1923, 0x3C0f004BbC47eBa58b02409d7F1D210479EAecCC, 0x1fde817F7F1B7bc8B4feF6DAf154734e27320863, 0xa0Db18Ad72A9c2Cb579954275465c29ed2963d78, 0xfAf98aCd4b9A0b57a918e4569f86415c943b6276, 0x6C809Fa700a31F375D4331Fb270E911a9B188EcB, 0x46bB76a621963F5634C36211Ef02d4F2CDfBf190, 0x9281f9581fD59F15E9a0604c0b23cdd56E497c79, 0x237d64276BCA2d63bb75B884585a93dE0AcBe954, 0xC98de9A81c512DbD3B9b610C7b4F301400405f8B, 0x0B7e2a41E25E9D3D74f97D499f5A98A2e3FA84c3, 0xb99411a1B122E0aE23165ce593BbAa2641b80278, 0x24CD08248cc84Fc4A1E197D9cE85167d926BCdd5, 0xF9F9A4146F94edB8522FB009445Ba92a384c8BCE, 0x1aD2832EcDE8799Dc37c4FEEf3e5b9a5d80AdF10, 0x1ec8c33D2337f442B4670Db774dF14F091803646, 0x93502a67FC1a10De616df1C8586DC457058d9A33, 0x6626ab2019f025F254A08897Feb2a462bfa51E78, 0x2e9292617BAA117d1FadcB01B81453629D038e9b, 0x19a7048BBB13FE9A65c138b47A13c7770F64586C, 0x1744f2C7165C925F70aC6FdA1a6c89Be58d895C6, 0xe6D8F7cF4Cb8A51c2b052B0f7DCFb329d1A87f49, 0x30AdF4633F7808FFDd0137E918b3536c2Fb510B2, 0xCc81715c270eb458bb8AbfA809B54C86bB93Ab54, 0x2d9648B58Dd5b046a49FA9044ED2a7A90D7Ca229, 0x6150ef85a69887052023b63a0A22774092970607, 0x13538e550977B1Efe6ac47028007B618d19aac91, 0x2053b0fB2B4BeFf5a5b04D92d68038D67C4F7444, 0xddA699CB6336E76B0925efbD2C680D8E4A92d770, 0x6D13B48ed9B3de8a81f171e2103A02D5E24b3883, 0x4bD836Dc85D53150535203117D28BDa5E62983EC, 0x2Bd9027Cff1644cF3dC0BC6c18eb7E41DD101055, 0xE2C78417C7e38F40183C14c779C685Ae6b49dCAd, 0xA928a13B207859c98fd6CE52CE99a76aB2209202, 0x50E2bf04C16c9207dC14919Ed9F0063e1fb70D12, 0x39649A0c12e34a0D531Dd07ce4001e6d661d9F6e, 0x5DA7eD3Fb50f03c8e23CD7fe1431F85e6bf43bF6, 0xF557e5616C03D3C6b5E0372702D543d63e7ba06f, 0x9a278057512d8066C021f18941E856B0AeDd984c, 0xE2EEfc900244fF9042eE395385E69f334195a8e5, 0x7AFD1fE7fc82E2B7D45FFF2F5503A81Bcae10d19, 0x85A56fA841AF0f021f91BcB9fa0a90b4529536C1, 0xD10b81348c1b0F98F9F5E2AC5fb03754C0545F34, 0x19127285D001E8041BA04808463108DE19ca7b40, 0x4AA75D14cB7AAF4a45c1c640Fb7b196D2BC41960, 0xeA885F5988766225dBaa8D4a7603de6e0A5fa5a3, 0xa8b4769eBAC8bb354f2aBe6186206f834e8c0A43, 0xe4755E25440484e4b1b131F64FA506E91eB6d075, 0xb45394FcaDB2Cb7FbFf1F8E004bCa3eD6Da1B4cB, 0x7948a2504200A755e617364D393D90C622655349, 0xdC5Cf59c2ea87734037F5bF16DeB47f3Ac423444, 0xF621998D74f58757a920eA2AAE0d41841E7E7526, 0x916769041683e72B5974FBB31Bd12BB5874c6bcB, 0xE82092c9FBA97Af6C709853EB83E1D592AF1f3f6, 0xF7f6F5f372A253358d2ceB49d886e3aF877700BB, 0x0496aF9eE8c4de54C324DcacE5f71C13328521e1, 0xb9e404147e472aE31799E905B31e7b920f9424cF, 0x9aD8A3be394Bd0Cac052b19d01100D3c909A4894, 0xA3416958354D99714a91c7bBee8392670D1d117a, 0x7567AA359b8D885E780EA160cD5174aD3C775440, 0x581F014AaCEa3a03a920F23a70bc738c7dF70720, 0x527c509249Edd69E9715da10d11E85621291eC33, 0xF6a796c1EC1c06e93c16A44f2d6b664Fe1926A69, 0x8E3404c6aB09AA6b541c54a300c6A9B2cdF4D048, 0x5F78d70388Af8909d8513c89CefD81E8F65A3973, 0x58A0F75331929454Cf803323B42f0fBc34d1E240, 0x943E95BB9E698c06Ec9CBedf0594586f505BD736, 0x3CC2A20882627814D814A4F5A89DF9d262D76AcE, 0x94aeA01B7F60D262021ba0ed742e8760f0ff4633, 0x7dD9c596806C706a12359d4729f0743ad6E200AA, 0x2230574CF03adF7445A9EdE609Eeca0D70FF7f9c, 0x6cf6A4233d1DAF396F3B35093CAd61b94E31a00E, 0xff0E7016fa23F597590c7a93FB2e87df697029ca, 0x439eeaF97BbCa20817f2beF3C6a75aEa6F029592, 0x1d87e40385d92Ae747c0088EE2073f4B26FbbBdB, 0x44855c3ff61B49C62a8538BF226A82A4d1b8C1f4, 0x127F66825eb9B1F7C667Fc253f37E97E4BDE4DE8, 0x5A49ED67a96aff97E1E2006a21F7D193d27Bd28F, 0x625522D96c6BB741f96D8C99CBa0A5B67c18002B, 0x72F05544b5ffc11ACF02b52806FC9d7B2e428635, 0x8c9188e8cB29078684ffFEaa5C0FAf09E7b3A95D, 0x178C13Af021D434E48471De556749c607A1C2b93, 0x7a3C799DaF89F18210F123BcDe62D14fcfc315ae, 0xB3d92Fd17952851563969EC32f0e64406218B6Ca, 0xC6687bA20103E0861BB09Ed1Cb7d297489bC1A41, 0x17Fa25Ab8e7Fbd64a69C1D963CB97Ae6E20CE88E, 0xCba6dcdFDb7d0E8a38D965D634f3b4A20fa65d6E, 0x670494E88eD61e093A53aD65603190A3c844038D, 0x82978F70b2E16f1C6124BF1A97d8c30E0A7E9782, 0x6c725F41E98451F167820551013BD2f5BE8bFE6f, 0x5a4021481c2eB83d63E64433d618ff98db56fFeb, 0x1f56A3B72AcD2c8898ABdF9805077F78eBD0a9Ec, 0x871ea72e8FC9043D0DFa7487096c313F1E75584a, 0xB644518e5f4c0c0e461D195c596a837b7273FB75, 0x1083F74dBEA81603522964C1Ae6E79DB762538D4, 0xc0dE7d6A5F9B145ab280651267f4E55F2Ff63b2d, 0x5aFda214BcE264e0cD6abF0858BB248D82c52329, 0x9e18c551Ee13104c5ee56Ff26Db439E7a9E8d32c, 0x44761c2dFFFADC354578Db62ec0A4071d242A62d, 0xAd028E3d0AcDDA373dF217413115353A2C516BCb, 0x620022c311b16F62AAC19FfE5b3C1CAC2F15B2f2, 0x16C4776dD7f89E0E702BBed3A875c0E3a1EEdEBB, 0xFEc9B0710822cFE9f2E74342c95B53caF869C44C, 0x5C0C3F639116751f170F36037B9Bf323B824c665, 0xEE1B917229C8536cE985286629AAd8FC643387da, 0x0cD078AA1324623EDEe6769817b1f19747e3a5b0, 0xbE8f4bc1c523Ab034ba1FD51f31BbB040Ce9d0A7, 0x935aBEa578e9338B97055866739231793111D31b, 0x3efFc6dE41C6cFcAFe4842f6b0EEd71eA723eB97, 0x80104EE52A11a12EC5B11639aAcDe1e982281dB4, 0x33D9CBAa6ff2569273798559B5cD307cd74004a8, 0xb8E162a19A4CE299B06d3b1Cd50229Cb04d8f04C, 0xA266AFaE64d0c8cCd56878c1ea3b3ff9283b17D1, 0xC293CB3A5A48bcB7Fc512B8F248254862f5A06B4, 0x1b137E5E5109F43F5AD969169e593e40280Cf056, 0x54C30EC6Bc03d765E3e2EC9E85bF5903509c1350, 0x9a48C7a0B06FAd94892C1E1F03aFdA8c76385725, 0x08148392755b6ea8Ce7EfC5db3518746c1C22ED6, 0x3a44f49e3EC2B4876483e05F45811D1Ac5563f3f, 0xB12DD4571F0d2A275A4139f3AB48d2F9bfA6b0E1, 0xaA43938eEc078196dBCf61aC5B02b2fad914e08B, 0xfff90A1Ca55af379E7f2F96FAD938C2c42eFCb8C, 0xcA4dAa959438d523cFf6741E2Ed0cEE175Ff38a9, 0xD141BfdcC30aB6cb4B5712eaC1fa1444C66fe2e2, 0xc8B0f1d9542E0f2A9D8ED119F7c34f44A51a06d2, 0x9f42818B96F847F9010f4Cb2e9bA3b406496D786, 0xf91EA671a7569D85c3809a7cbEbdf51B809E4C99, 0xE264E02fa476b366DE5bB878FB174334389aC276, 0xE49E0E30a5d4d29Fb63835718EB49F26E743Bcdb, 0xED1570015FA2670E332bf9fDa70aA70A945dA3Da, 0x017d6016FB4450991bdDb1Ca4413d901b69C8a4C, 0x9A2A9f63ae9E3D8d59695C11599aC2BEE4608822, 0x823240Ff4267b7A66CA4219A8D3Bc2d55c1fe366, 0x2824C0195a79330Fd62680FA25074549d4EA027f, 0x691769BC034bD26D75c292c13cdc1142D5248563, 0x5aE17A4B8f47e33168906a939D183B5800b3566A, 0x52c6D207205c87f3fAF27de0F3db94070D5823E2, 0xAEC2C0c655f22Dcc0480EBAFAcC58b12295765c6, 0x59E6F388017657bF66e46A58C8bc498021036f31, 0x91E952Cd5F79F81a7C5A8d0D4A4B254fFC9553f4, 0xb1BFC5a95A2Cf72016C0a129C2074c1d32372568, 0x14D0b0Eb684683193d2fC4A7574d934B6791719b, 0xe00C1736D799cb9E2D7Cc7E26fDB93F2A2010464, 0xde8366beFC42cEBb138f379d91623E5AA10E5FC9] )
massNotify[EthealPromoDistribute (ln:86)]
massNotify[EthealPromoDistribute (ln:88)]
File 1 of 4: EthealPromoDistribute
File 2 of 4: EthealPromoToken
File 3 of 4: Wallet
File 4 of 4: MultiSigWalletWithDailyLimit
pragma solidity ^0.4.17;
/**
* @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.
*/
constructor() 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) onlyOwner public {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
contract iPromo {
function massNotify(address[] _owners) public;
function transferOwnership(address newOwner) public;
}
/**
* Distribute promo tokens parallel
* negligible, +3k gas cost / tx
* 500 address ~ 1.7M gas
* author: thesved, viktor.tabori at etheal dot com
*/
contract EthealPromoDistribute is Ownable {
mapping (address => bool) public admins;
iPromo public token;
// constructor
constructor(address _promo) public {
token = iPromo(_promo);
}
// set promo token
function setToken(address _promo) onlyOwner public {
token = iPromo(_promo);
}
// transfer ownership of token
function passToken(address _promo) onlyOwner public {
require(_promo != address(0));
require(address(token) != address(0));
token.transferOwnership(_promo);
}
// set admins
function setAdmin(address[] _admins, bool _v) onlyOwner public {
for (uint256 i = 0; i<_admins.length; i++) {
admins[ _admins[i] ] = _v;
}
}
// notify
function massNotify(address[] _owners) external {
require(admins[msg.sender] || msg.sender == owner);
token.massNotify(_owners);
}
}File 2 of 4: EthealPromoToken
pragma solidity ^0.4.17;
/**
* @title ERC20
* @dev ERC20 interface
*/
contract ERC20 {
function balanceOf(address who) public constant returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
function allowance(address owner, address spender) public constant returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
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() {
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) onlyOwner public {
require(newOwner != address(0));
OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/// @dev Crowdsale interface for Etheal Normal Sale, functions needed from outside.
contract iEthealSale {
bool public paused;
uint256 public minContribution;
uint256 public whitelistThreshold;
mapping (address => uint256) public stakes;
function setPromoBonus(address _investor, uint256 _value) public;
function buyTokens(address _beneficiary) public payable;
function depositEth(address _beneficiary, uint256 _time, bytes _whitelistSign) public payable;
function depositOffchain(address _beneficiary, uint256 _amount, uint256 _time) public;
function hasEnded() public constant returns (bool);
}
/**
* @title claim accidentally sent tokens
*/
contract HasNoTokens is Ownable {
event ExtractedTokens(address indexed _token, address indexed _claimer, uint _amount);
/// @notice This method can be used to extract mistakenly
/// sent tokens to this contract.
/// @param _token The address of the token contract that you want to recover
/// set to 0 in case you want to extract ether.
/// @param _claimer Address that tokens will be send to
function extractTokens(address _token, address _claimer) onlyOwner public {
if (_token == 0x0) {
_claimer.transfer(this.balance);
return;
}
ERC20 token = ERC20(_token);
uint balance = token.balanceOf(this);
token.transfer(_claimer, balance);
ExtractedTokens(_token, _claimer, balance);
}
}
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || 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;
}
}
/*
* ERC-20 Standard Token Smart Contract Interface.
* Copyright © 2016–2017 by ABDK Consulting.
* Author: Mikhail Vladimirov <mikhail.vladimirov@gmail.com>
*/
/**
* ERC-20 standard token interface, as defined
* <a href="http://github.com/ethereum/EIPs/issues/20">here</a>.
*/
contract Token {
/**
* Get total number of tokens in circulation.
*
* @return total number of tokens in circulation
*/
function totalSupply () view returns (uint256 supply);
/**
* Get number of tokens currently belonging to given owner.
*
* @param _owner address to get number of tokens currently belonging to the
* owner of
* @return number of tokens currently belonging to the owner of given address
*/
function balanceOf (address _owner) view returns (uint256 balance);
/**
* Transfer given number of tokens from message sender to given recipient.
*
* @param _to address to transfer tokens to the owner of
* @param _value number of tokens to transfer to the owner of given address
* @return true if tokens were transferred successfully, false otherwise
*/
function transfer (address _to, uint256 _value) returns (bool success);
/**
* Transfer given number of tokens from given owner to given recipient.
*
* @param _from address to transfer tokens from the owner of
* @param _to address to transfer tokens to the owner of
* @param _value number of tokens to transfer from given owner to given
* recipient
* @return true if tokens were transferred successfully, false otherwise
*/
function transferFrom (address _from, address _to, uint256 _value) returns (bool success);
/**
* Allow given spender to transfer given number of tokens from message sender.
*
* @param _spender address to allow the owner of to transfer tokens from
* message sender
* @param _value number of tokens to allow to transfer
* @return true if token transfer was successfully approved, false otherwise
*/
function approve (address _spender, uint256 _value) returns (bool success);
/**
* Tell how many tokens given spender is currently allowed to transfer from
* given owner.
*
* @param _owner address to get number of tokens allowed to be transferred
* from the owner of
* @param _spender address to get number of tokens allowed to be transferred
* by the owner of
* @return number of tokens given spender is currently allowed to transfer
* from given owner
*/
function allowance (address _owner, address _spender) view returns (uint256 remaining);
/**
* Logged when tokens were transferred from one owner to another.
*
* @param _from address of the owner, tokens were transferred from
* @param _to address of the owner, tokens were transferred to
* @param _value number of tokens transferred
*/
event Transfer (address indexed _from, address indexed _to, uint256 _value);
/**
* Logged when owner approved his tokens to be transferred by some spender.
*
* @param _owner owner who approved his tokens to be transferred
* @param _spender spender who were allowed to transfer the tokens belonging
* to the owner
* @param _value number of tokens belonging to the owner, approved to be
* transferred by the spender
*/
event Approval (address indexed _owner, address indexed _spender, uint256 _value);
}
/*
* Abstract Token Smart Contract. Copyright © 2017 by ABDK Consulting.
* Author: Mikhail Vladimirov <mikhail.vladimirov@gmail.com>
* Modified to use SafeMath library by thesved
*/
/**
* Abstract Token Smart Contract that could be used as a base contract for
* ERC-20 token contracts.
*/
contract AbstractToken is Token {
using SafeMath for uint;
/**
* Create new Abstract Token contract.
*/
function AbstractToken () {
// Do nothing
}
/**
* Get number of tokens currently belonging to given owner.
*
* @param _owner address to get number of tokens currently belonging to the owner
* @return number of tokens currently belonging to the owner of given address
*/
function balanceOf (address _owner) view returns (uint256 balance) {
return accounts[_owner];
}
/**
* Transfer given number of tokens from message sender to given recipient.
*
* @param _to address to transfer tokens to the owner of
* @param _value number of tokens to transfer to the owner of given address
* @return true if tokens were transferred successfully, false otherwise
*/
function transfer (address _to, uint256 _value) returns (bool success) {
uint256 fromBalance = accounts[msg.sender];
if (fromBalance < _value) return false;
if (_value > 0 && msg.sender != _to) {
accounts[msg.sender] = fromBalance.sub(_value);
accounts[_to] = accounts[_to].add(_value);
Transfer(msg.sender, _to, _value);
}
return true;
}
/**
* Transfer given number of tokens from given owner to given recipient.
*
* @param _from address to transfer tokens from the owner of
* @param _to address to transfer tokens to the owner of
* @param _value number of tokens to transfer from given owner to given recipient
* @return true if tokens were transferred successfully, false otherwise
*/
function transferFrom (address _from, address _to, uint256 _value) returns (bool success) {
uint256 spenderAllowance = allowances[_from][msg.sender];
if (spenderAllowance < _value) return false;
uint256 fromBalance = accounts[_from];
if (fromBalance < _value) return false;
allowances[_from][msg.sender] = spenderAllowance.sub(_value);
if (_value > 0 && _from != _to) {
accounts[_from] = fromBalance.sub(_value);
accounts[_to] = accounts[_to].add(_value);
Transfer(_from, _to, _value);
}
return true;
}
/**
* Allow given spender to transfer given number of tokens from message sender.
*
* @param _spender address to allow the owner of to transfer tokens from
* message sender
* @param _value number of tokens to allow to transfer
* @return true if token transfer was successfully approved, false otherwise
*/
function approve (address _spender, uint256 _value) returns (bool success) {
allowances[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
/**
* Tell how many tokens given spender is currently allowed to transfer from
* given owner.
*
* @param _owner address to get number of tokens allowed to be transferred from the owner
* @param _spender address to get number of tokens allowed to be transferred by the owner
* @return number of tokens given spender is currently allowed to transfer from given owner
*/
function allowance (address _owner, address _spender) view returns (uint256 remaining) {
return allowances[_owner][_spender];
}
/**
* Mapping from addresses of token holders to the numbers of tokens belonging
* to these token holders.
*/
mapping (address => uint256) accounts;
/**
* Mapping from addresses of token holders to the mapping of addresses of
* spenders to the allowances set by these token holders to these spenders.
*/
mapping (address => mapping (address => uint256)) private allowances;
}
/*
* Abstract Virtual Token Smart Contract. Copyright © 2017 by ABDK Consulting.
* Author: Mikhail Vladimirov <mikhail.vladimirov@gmail.com>
* Modified to use SafeMath library by thesved
*/
/**
* Abstract Token Smart Contract that could be used as a base contract for
* ERC-20 token contracts supporting virtual balance.
*/
contract AbstractVirtualToken is AbstractToken {
using SafeMath for uint;
/**
* Maximum number of real (i.e. non-virtual) tokens in circulation (2^255-1).
*/
uint256 constant MAXIMUM_TOKENS_COUNT = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
/**
* Mask used to extract real balance of an account (2^255-1).
*/
uint256 constant BALANCE_MASK = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
/**
* Mask used to extract "materialized" flag of an account (2^255).
*/
uint256 constant MATERIALIZED_FLAG_MASK = 0x8000000000000000000000000000000000000000000000000000000000000000;
/**
* Create new Abstract Virtual Token contract.
*/
function AbstractVirtualToken () {
// Do nothing
}
/**
* Get total number of tokens in circulation.
*
* @return total number of tokens in circulation
*/
function totalSupply () view returns (uint256 supply) {
return tokensCount;
}
/**
* Get number of tokens currently belonging to given owner.
*
* @param _owner address to get number of tokens currently belonging to the owner
* @return number of tokens currently belonging to the owner of given address
*/
function balanceOf (address _owner) constant returns (uint256 balance) {
return (accounts[_owner] & BALANCE_MASK).add(getVirtualBalance(_owner));
}
/**
* Transfer given number of tokens from message sender to given recipient.
*
* @param _to address to transfer tokens to the owner of
* @param _value number of tokens to transfer to the owner of given address
* @return true if tokens were transferred successfully, false otherwise
*/
function transfer (address _to, uint256 _value) returns (bool success) {
if (_value > balanceOf(msg.sender)) return false;
else {
materializeBalanceIfNeeded(msg.sender, _value);
return AbstractToken.transfer(_to, _value);
}
}
/**
* Transfer given number of tokens from given owner to given recipient.
*
* @param _from address to transfer tokens from the owner of
* @param _to address to transfer tokens to the owner of
* @param _value number of tokens to transfer from given owner to given
* recipient
* @return true if tokens were transferred successfully, false otherwise
*/
function transferFrom (address _from, address _to, uint256 _value) returns (bool success) {
if (_value > allowance(_from, msg.sender)) return false;
if (_value > balanceOf(_from)) return false;
else {
materializeBalanceIfNeeded(_from, _value);
return AbstractToken.transferFrom(_from, _to, _value);
}
}
/**
* Get virtual balance of the owner of given address.
*
* @param _owner address to get virtual balance for the owner of
* @return virtual balance of the owner of given address
*/
function virtualBalanceOf (address _owner) internal view returns (uint256 _virtualBalance);
/**
* Calculate virtual balance of the owner of given address taking into account
* materialized flag and total number of real tokens already in circulation.
*/
function getVirtualBalance (address _owner) private view returns (uint256 _virtualBalance) {
if (accounts [_owner] & MATERIALIZED_FLAG_MASK != 0) return 0;
else {
_virtualBalance = virtualBalanceOf(_owner);
uint256 maxVirtualBalance = MAXIMUM_TOKENS_COUNT.sub(tokensCount);
if (_virtualBalance > maxVirtualBalance)
_virtualBalance = maxVirtualBalance;
}
}
/**
* Materialize virtual balance of the owner of given address if this will help
* to transfer given number of tokens from it.
*
* @param _owner address to materialize virtual balance of
* @param _value number of tokens to be transferred
*/
function materializeBalanceIfNeeded (address _owner, uint256 _value) private {
uint256 storedBalance = accounts[_owner];
if (storedBalance & MATERIALIZED_FLAG_MASK == 0) {
// Virtual balance is not materialized yet
if (_value > storedBalance) {
// Real balance is not enough
uint256 virtualBalance = getVirtualBalance(_owner);
require (_value.sub(storedBalance) <= virtualBalance);
accounts[_owner] = MATERIALIZED_FLAG_MASK | storedBalance.add(virtualBalance);
tokensCount = tokensCount.add(virtualBalance);
}
}
}
/**
* Number of real (i.e. non-virtual) tokens in circulation.
*/
uint256 tokensCount;
}
/**
* Etheal Promo ERC-20 contract
* Author: thesved
*/
contract EthealPromoToken is HasNoTokens, AbstractVirtualToken {
// Balance threshold to assign virtual tokens to the owner of higher balances then this threshold.
uint256 private constant VIRTUAL_THRESHOLD = 0.1 ether;
// Number of virtual tokens to assign to the owners of balances higher than virtual threshold.
uint256 private constant VIRTUAL_COUNT = 911;
// crowdsale to set bonus when sending token
iEthealSale public crowdsale;
// logging promo token activation
event LogBonusSet(address indexed _address, uint256 _amount);
////////////////
// Basic functions
////////////////
/// @dev Constructor, crowdsale address can be 0x0
function EthealPromoToken(address _crowdsale) {
crowdsale = iEthealSale(_crowdsale);
}
/// @dev Setting crowdsale, crowdsale address can be 0x0
function setCrowdsale(address _crowdsale) public onlyOwner {
crowdsale = iEthealSale(_crowdsale);
}
/// @notice Get virtual balance of the owner of given address.
/// @param _owner address to get virtual balance for the owner
/// @return virtual balance of the owner of given address
function virtualBalanceOf(address _owner) internal view returns (uint256) {
return _owner.balance >= VIRTUAL_THRESHOLD ? VIRTUAL_COUNT : 0;
}
/// @notice Get name of this token.
function name() public pure returns (string result) {
return "An Etheal Promo";
}
/// @notice Get symbol of this token.
function symbol() public pure returns (string result) {
return "HEALP";
}
/// @notice Get number of decimals for this token.
function decimals() public pure returns (uint8 result) {
return 0;
}
////////////////
// Set sale bonus
////////////////
/// @dev Internal function for setting sale bonus
function setSaleBonus(address _from, address _to, uint256 _value) internal {
if (address(crowdsale) == address(0)) return;
if (_value == 0) return;
if (_to == address(1) || _to == address(this) || _to == address(crowdsale)) {
crowdsale.setPromoBonus(_from, _value);
LogBonusSet(_from, _value);
}
}
/// @dev Override transfer function to set sale bonus
function transfer(address _to, uint256 _value) public returns (bool) {
bool success = super.transfer(_to, _value);
if (success) {
setSaleBonus(msg.sender, _to, _value);
}
return success;
}
/// @dev Override transfer function to set sale bonus
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
bool success = super.transferFrom(_from, _to, _value);
if (success) {
setSaleBonus(_from, _to, _value);
}
return success;
}
////////////////
// Extra
////////////////
/// @notice Notify owners about their virtual balances.
function massNotify(address[] _owners) public onlyOwner {
for (uint256 i = 0; i < _owners.length; i++) {
Transfer(address(0), _owners[i], VIRTUAL_COUNT);
}
}
/// @notice Kill this smart contract.
function kill() public onlyOwner {
selfdestruct(owner);
}
}File 3 of 4: Wallet
//sol Wallet
// Multi-sig, daily-limited account proxy/wallet.
// @authors:
// Gav Wood <g@ethdev.com>
// inheritable "property" contract that enables methods to be protected by requiring the acquiescence of either a
// single, or, crucially, each of a number of, designated owners.
// usage:
// use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by
// some number (specified in constructor) of the set of owners (specified in the constructor, modifiable) before the
// interior is executed.
contract multiowned {
// TYPES
// struct for the status of a pending operation.
struct PendingState {
uint yetNeeded;
uint ownersDone;
uint index;
}
// EVENTS
// this contract only has five types of events: it can accept a confirmation, in which case
// we record owner and operation (hash) alongside it.
event Confirmation(address owner, bytes32 operation);
event Revoke(address owner, bytes32 operation);
// some others are in the case of an owner changing.
event OwnerChanged(address oldOwner, address newOwner);
event OwnerAdded(address newOwner);
event OwnerRemoved(address oldOwner);
// the last one is emitted if the required signatures change
event RequirementChanged(uint newRequirement);
// MODIFIERS
// simple single-sig function modifier.
modifier onlyowner {
if (isOwner(msg.sender))
_
}
// multi-sig function modifier: the operation must have an intrinsic hash in order
// that later attempts can be realised as the same underlying operation and
// thus count as confirmations.
modifier onlymanyowners(bytes32 _operation) {
if (confirmAndCheck(_operation))
_
}
// METHODS
// constructor is given number of sigs required to do protected "onlymanyowners" transactions
// as well as the selection of addresses capable of confirming them.
function multiowned(address[] _owners, uint _required) {
m_numOwners = _owners.length + 1;
m_owners[1] = uint(msg.sender);
m_ownerIndex[uint(msg.sender)] = 1;
for (uint i = 0; i < _owners.length; ++i)
{
m_owners[2 + i] = uint(_owners[i]);
m_ownerIndex[uint(_owners[i])] = 2 + i;
}
m_required = _required;
}
// Revokes a prior confirmation of the given operation
function revoke(bytes32 _operation) external {
uint ownerIndex = m_ownerIndex[uint(msg.sender)];
// make sure they're an owner
if (ownerIndex == 0) return;
uint ownerIndexBit = 2**ownerIndex;
var pending = m_pending[_operation];
if (pending.ownersDone & ownerIndexBit > 0) {
pending.yetNeeded++;
pending.ownersDone -= ownerIndexBit;
Revoke(msg.sender, _operation);
}
}
// Replaces an owner `_from` with another `_to`.
function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data, block.number)) external {
if (isOwner(_to)) return;
uint ownerIndex = m_ownerIndex[uint(_from)];
if (ownerIndex == 0) return;
clearPending();
m_owners[ownerIndex] = uint(_to);
m_ownerIndex[uint(_from)] = 0;
m_ownerIndex[uint(_to)] = ownerIndex;
OwnerChanged(_from, _to);
}
function addOwner(address _owner) onlymanyowners(sha3(msg.data, block.number)) external {
if (isOwner(_owner)) return;
clearPending();
if (m_numOwners >= c_maxOwners)
reorganizeOwners();
if (m_numOwners >= c_maxOwners)
return;
m_numOwners++;
m_owners[m_numOwners] = uint(_owner);
m_ownerIndex[uint(_owner)] = m_numOwners;
OwnerAdded(_owner);
}
function removeOwner(address _owner) onlymanyowners(sha3(msg.data, block.number)) external {
uint ownerIndex = m_ownerIndex[uint(_owner)];
if (ownerIndex == 0) return;
if (m_required > m_numOwners - 1) return;
m_owners[ownerIndex] = 0;
m_ownerIndex[uint(_owner)] = 0;
clearPending();
reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot
OwnerRemoved(_owner);
}
function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data, block.number)) external {
if (_newRequired > m_numOwners) return;
m_required = _newRequired;
clearPending();
RequirementChanged(_newRequired);
}
function isOwner(address _addr) returns (bool) {
return m_ownerIndex[uint(_addr)] > 0;
}
function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) {
var pending = m_pending[_operation];
uint ownerIndex = m_ownerIndex[uint(_owner)];
// make sure they're an owner
if (ownerIndex == 0) return false;
// determine the bit to set for this owner.
uint ownerIndexBit = 2**ownerIndex;
if (pending.ownersDone & ownerIndexBit == 0) {
return false;
} else {
return true;
}
}
// INTERNAL METHODS
function confirmAndCheck(bytes32 _operation) internal returns (bool) {
// determine what index the present sender is:
uint ownerIndex = m_ownerIndex[uint(msg.sender)];
// make sure they're an owner
if (ownerIndex == 0) return;
var pending = m_pending[_operation];
// if we're not yet working on this operation, switch over and reset the confirmation status.
if (pending.yetNeeded == 0) {
// reset count of confirmations needed.
pending.yetNeeded = m_required;
// reset which owners have confirmed (none) - set our bitmap to 0.
pending.ownersDone = 0;
pending.index = m_pendingIndex.length++;
m_pendingIndex[pending.index] = _operation;
}
// determine the bit to set for this owner.
uint ownerIndexBit = 2**ownerIndex;
// make sure we (the message sender) haven't confirmed this operation previously.
if (pending.ownersDone & ownerIndexBit == 0) {
Confirmation(msg.sender, _operation);
// ok - check if count is enough to go ahead.
if (pending.yetNeeded <= 1) {
// enough confirmations: reset and run interior.
delete m_pendingIndex[m_pending[_operation].index];
delete m_pending[_operation];
return true;
}
else
{
// not enough: record that this owner in particular confirmed.
pending.yetNeeded--;
pending.ownersDone |= ownerIndexBit;
}
}
}
function reorganizeOwners() private returns (bool) {
uint free = 1;
while (free < m_numOwners)
{
while (free < m_numOwners && m_owners[free] != 0) free++;
while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;
if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
{
m_owners[free] = m_owners[m_numOwners];
m_ownerIndex[m_owners[free]] = free;
m_owners[m_numOwners] = 0;
}
}
}
function clearPending() internal {
uint length = m_pendingIndex.length;
for (uint i = 0; i < length; ++i)
if (m_pendingIndex[i] != 0)
delete m_pending[m_pendingIndex[i]];
delete m_pendingIndex;
}
// FIELDS
// the number of owners that must confirm the same operation before it is run.
uint public m_required;
// pointer used to find a free slot in m_owners
uint public m_numOwners;
// list of owners
uint[256] m_owners;
uint constant c_maxOwners = 250;
// index on the list of owners to allow reverse lookup
mapping(uint => uint) m_ownerIndex;
// the ongoing operations.
mapping(bytes32 => PendingState) m_pending;
bytes32[] m_pendingIndex;
}
// inheritable "property" contract that enables methods to be protected by placing a linear limit (specifiable)
// on a particular resource per calendar day. is multiowned to allow the limit to be altered. resource that method
// uses is specified in the modifier.
contract daylimit is multiowned {
// MODIFIERS
// simple modifier for daily limit.
modifier limitedDaily(uint _value) {
if (underLimit(_value))
_
}
// METHODS
// constructor - stores initial daily limit and records the present day's index.
function daylimit(uint _limit) {
m_dailyLimit = _limit;
m_lastDay = today();
}
// (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data, block.number)) external {
m_dailyLimit = _newLimit;
}
// (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today.
function resetSpentToday() onlymanyowners(sha3(msg.data, block.number)) external {
m_spentToday = 0;
}
// INTERNAL METHODS
// checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and
// returns true. otherwise just returns false.
function underLimit(uint _value) internal onlyowner returns (bool) {
// reset the spend limit if we're on a different day to last time.
if (today() > m_lastDay) {
m_spentToday = 0;
m_lastDay = today();
}
// check to see if there's enough left - if so, subtract and return true.
if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) {
m_spentToday += _value;
return true;
}
return false;
}
// determines today's index.
function today() private constant returns (uint) { return now / 1 days; }
// FIELDS
uint public m_dailyLimit;
uint public m_spentToday;
uint public m_lastDay;
}
// interface contract for multisig proxy contracts; see below for docs.
contract multisig {
// EVENTS
// logged events:
// Funds has arrived into the wallet (record how much).
event Deposit(address from, uint value);
// Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going).
event SingleTransact(address owner, uint value, address to, bytes data);
// Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going).
event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data);
// Confirmation still needed for a transaction.
event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data);
// FUNCTIONS
// TODO: document
function changeOwner(address _from, address _to) external;
function execute(address _to, uint _value, bytes _data) external returns (bytes32);
function confirm(bytes32 _h) returns (bool);
}
// usage:
// bytes32 h = Wallet(w).from(oneOwner).transact(to, value, data);
// Wallet(w).from(anotherOwner).confirm(h);
contract Wallet is multisig, multiowned, daylimit {
uint public version = 2;
// TYPES
// Transaction structure to remember details of transaction lest it need be saved for a later call.
struct Transaction {
address to;
uint value;
bytes data;
}
// METHODS
// constructor - just pass on the owner array to the multiowned and
// the limit to daylimit
function Wallet(address[] _owners, uint _required, uint _daylimit)
multiowned(_owners, _required) daylimit(_daylimit) {
}
// kills the contract sending everything to `_to`.
function kill(address _to) onlymanyowners(sha3(msg.data, block.number)) external {
suicide(_to);
}
// gets called when no other function matches
function() {
// just being sent some cash?
if (msg.value > 0)
Deposit(msg.sender, msg.value);
}
// Outside-visible transact entry point. Executes transacion immediately if below daily spend limit.
// If not, goes into multisig process. We provide a hash on return to allow the sender to provide
// shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
// and _data arguments). They still get the option of using them if they want, anyways.
function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 _r) {
// first, take the opportunity to check that we're under the daily limit.
if (underLimit(_value)) {
SingleTransact(msg.sender, _value, _to, _data);
// yes - just execute the call.
_to.call.value(_value)(_data);
return 0;
}
// determine our operation hash.
_r = sha3(msg.data, block.number);
if (!confirm(_r) && m_txs[_r].to == 0) {
m_txs[_r].to = _to;
m_txs[_r].value = _value;
m_txs[_r].data = _data;
ConfirmationNeeded(_r, msg.sender, _value, _to, _data);
}
}
// confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order
// to determine the body of the transaction from the hash provided.
function confirm(bytes32 _h) onlymanyowners(_h) returns (bool) {
if (m_txs[_h].to != 0) {
m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data);
MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data);
delete m_txs[_h];
return true;
}
}
// INTERNAL METHODS
function clearPending() internal {
uint length = m_pendingIndex.length;
for (uint i = 0; i < length; ++i)
delete m_txs[m_pendingIndex[i]];
super.clearPending();
}
// FIELDS
// pending transactions we have at present.
mapping (bytes32 => Transaction) m_txs;
}File 4 of 4: MultiSigWalletWithDailyLimit
pragma solidity 0.4.4;
/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <stefan.george@consensys.net>
contract MultiSigWallet {
uint constant public MAX_OWNER_COUNT = 50;
event Confirmation(address indexed sender, uint indexed transactionId);
event Revocation(address indexed sender, uint indexed transactionId);
event Submission(uint indexed transactionId);
event Execution(uint indexed transactionId);
event ExecutionFailure(uint indexed transactionId);
event Deposit(address indexed sender, uint value);
event OwnerAddition(address indexed owner);
event OwnerRemoval(address indexed owner);
event RequirementChange(uint required);
mapping (uint => Transaction) public transactions;
mapping (uint => mapping (address => bool)) public confirmations;
mapping (address => bool) public isOwner;
address[] public owners;
uint public required;
uint public transactionCount;
struct Transaction {
address destination;
uint value;
bytes data;
bool executed;
}
modifier onlyWallet() {
if (msg.sender != address(this))
throw;
_;
}
modifier ownerDoesNotExist(address owner) {
if (isOwner[owner])
throw;
_;
}
modifier ownerExists(address owner) {
if (!isOwner[owner])
throw;
_;
}
modifier transactionExists(uint transactionId) {
if (transactions[transactionId].destination == 0)
throw;
_;
}
modifier confirmed(uint transactionId, address owner) {
if (!confirmations[transactionId][owner])
throw;
_;
}
modifier notConfirmed(uint transactionId, address owner) {
if (confirmations[transactionId][owner])
throw;
_;
}
modifier notExecuted(uint transactionId) {
if (transactions[transactionId].executed)
throw;
_;
}
modifier notNull(address _address) {
if (_address == 0)
throw;
_;
}
modifier validRequirement(uint ownerCount, uint _required) {
if ( ownerCount > MAX_OWNER_COUNT
|| _required > ownerCount
|| _required == 0
|| ownerCount == 0)
throw;
_;
}
/// @dev Fallback function allows to deposit ether.
function()
payable
{
if (msg.value > 0)
Deposit(msg.sender, msg.value);
}
/*
* Public functions
*/
/// @dev Contract constructor sets initial owners and required number of confirmations.
/// @param _owners List of initial owners.
/// @param _required Number of required confirmations.
function MultiSigWallet(address[] _owners, uint _required)
public
validRequirement(_owners.length, _required)
{
for (uint i=0; i<_owners.length; i++) {
if (isOwner[_owners[i]] || _owners[i] == 0)
throw;
isOwner[_owners[i]] = true;
}
owners = _owners;
required = _required;
}
/// @dev Allows to add a new owner. Transaction has to be sent by wallet.
/// @param owner Address of new owner.
function addOwner(address owner)
public
onlyWallet
ownerDoesNotExist(owner)
notNull(owner)
validRequirement(owners.length + 1, required)
{
isOwner[owner] = true;
owners.push(owner);
OwnerAddition(owner);
}
/// @dev Allows to remove an owner. Transaction has to be sent by wallet.
/// @param owner Address of owner.
function removeOwner(address owner)
public
onlyWallet
ownerExists(owner)
{
isOwner[owner] = false;
for (uint i=0; i<owners.length - 1; i++)
if (owners[i] == owner) {
owners[i] = owners[owners.length - 1];
break;
}
owners.length -= 1;
if (required > owners.length)
changeRequirement(owners.length);
OwnerRemoval(owner);
}
/// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
/// @param owner Address of owner to be replaced.
/// @param owner Address of new owner.
function replaceOwner(address owner, address newOwner)
public
onlyWallet
ownerExists(owner)
ownerDoesNotExist(newOwner)
{
for (uint i=0; i<owners.length; i++)
if (owners[i] == owner) {
owners[i] = newOwner;
break;
}
isOwner[owner] = false;
isOwner[newOwner] = true;
OwnerRemoval(owner);
OwnerAddition(newOwner);
}
/// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
/// @param _required Number of required confirmations.
function changeRequirement(uint _required)
public
onlyWallet
validRequirement(owners.length, _required)
{
required = _required;
RequirementChange(_required);
}
/// @dev Allows an owner to submit and confirm a transaction.
/// @param destination Transaction target address.
/// @param value Transaction ether value.
/// @param data Transaction data payload.
/// @return Returns transaction ID.
function submitTransaction(address destination, uint value, bytes data)
public
returns (uint transactionId)
{
transactionId = addTransaction(destination, value, data);
confirmTransaction(transactionId);
}
/// @dev Allows an owner to confirm a transaction.
/// @param transactionId Transaction ID.
function confirmTransaction(uint transactionId)
public
ownerExists(msg.sender)
transactionExists(transactionId)
notConfirmed(transactionId, msg.sender)
{
confirmations[transactionId][msg.sender] = true;
Confirmation(msg.sender, transactionId);
executeTransaction(transactionId);
}
/// @dev Allows an owner to revoke a confirmation for a transaction.
/// @param transactionId Transaction ID.
function revokeConfirmation(uint transactionId)
public
ownerExists(msg.sender)
confirmed(transactionId, msg.sender)
notExecuted(transactionId)
{
confirmations[transactionId][msg.sender] = false;
Revocation(msg.sender, transactionId);
}
/// @dev Allows anyone to execute a confirmed transaction.
/// @param transactionId Transaction ID.
function executeTransaction(uint transactionId)
public
notExecuted(transactionId)
{
if (isConfirmed(transactionId)) {
Transaction tx = transactions[transactionId];
tx.executed = true;
if (tx.destination.call.value(tx.value)(tx.data))
Execution(transactionId);
else {
ExecutionFailure(transactionId);
tx.executed = false;
}
}
}
/// @dev Returns the confirmation status of a transaction.
/// @param transactionId Transaction ID.
/// @return Confirmation status.
function isConfirmed(uint transactionId)
public
constant
returns (bool)
{
uint count = 0;
for (uint i=0; i<owners.length; i++) {
if (confirmations[transactionId][owners[i]])
count += 1;
if (count == required)
return true;
}
}
/*
* Internal functions
*/
/// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
/// @param destination Transaction target address.
/// @param value Transaction ether value.
/// @param data Transaction data payload.
/// @return Returns transaction ID.
function addTransaction(address destination, uint value, bytes data)
internal
notNull(destination)
returns (uint transactionId)
{
transactionId = transactionCount;
transactions[transactionId] = Transaction({
destination: destination,
value: value,
data: data,
executed: false
});
transactionCount += 1;
Submission(transactionId);
}
/*
* Web3 call functions
*/
/// @dev Returns number of confirmations of a transaction.
/// @param transactionId Transaction ID.
/// @return Number of confirmations.
function getConfirmationCount(uint transactionId)
public
constant
returns (uint count)
{
for (uint i=0; i<owners.length; i++)
if (confirmations[transactionId][owners[i]])
count += 1;
}
/// @dev Returns total number of transactions after filers are applied.
/// @param pending Include pending transactions.
/// @param executed Include executed transactions.
/// @return Total number of transactions after filters are applied.
function getTransactionCount(bool pending, bool executed)
public
constant
returns (uint count)
{
for (uint i=0; i<transactionCount; i++)
if ( pending && !transactions[i].executed
|| executed && transactions[i].executed)
count += 1;
}
/// @dev Returns list of owners.
/// @return List of owner addresses.
function getOwners()
public
constant
returns (address[])
{
return owners;
}
/// @dev Returns array with owner addresses, which confirmed transaction.
/// @param transactionId Transaction ID.
/// @return Returns array of owner addresses.
function getConfirmations(uint transactionId)
public
constant
returns (address[] _confirmations)
{
address[] memory confirmationsTemp = new address[](owners.length);
uint count = 0;
uint i;
for (i=0; i<owners.length; i++)
if (confirmations[transactionId][owners[i]]) {
confirmationsTemp[count] = owners[i];
count += 1;
}
_confirmations = new address[](count);
for (i=0; i<count; i++)
_confirmations[i] = confirmationsTemp[i];
}
/// @dev Returns list of transaction IDs in defined range.
/// @param from Index start position of transaction array.
/// @param to Index end position of transaction array.
/// @param pending Include pending transactions.
/// @param executed Include executed transactions.
/// @return Returns array of transaction IDs.
function getTransactionIds(uint from, uint to, bool pending, bool executed)
public
constant
returns (uint[] _transactionIds)
{
uint[] memory transactionIdsTemp = new uint[](transactionCount);
uint count = 0;
uint i;
for (i=0; i<transactionCount; i++)
if ( pending && !transactions[i].executed
|| executed && transactions[i].executed)
{
transactionIdsTemp[count] = i;
count += 1;
}
_transactionIds = new uint[](to - from);
for (i=from; i<to; i++)
_transactionIds[i - from] = transactionIdsTemp[i];
}
}
/// @title Multisignature wallet with daily limit - Allows an owner to withdraw a daily limit without multisig.
/// @author Stefan George - <stefan.george@consensys.net>
contract MultiSigWalletWithDailyLimit is MultiSigWallet {
event DailyLimitChange(uint dailyLimit);
uint public dailyLimit;
uint public lastDay;
uint public spentToday;
/*
* Public functions
*/
/// @dev Contract constructor sets initial owners, required number of confirmations and daily withdraw limit.
/// @param _owners List of initial owners.
/// @param _required Number of required confirmations.
/// @param _dailyLimit Amount in wei, which can be withdrawn without confirmations on a daily basis.
function MultiSigWalletWithDailyLimit(address[] _owners, uint _required, uint _dailyLimit)
public
MultiSigWallet(_owners, _required)
{
dailyLimit = _dailyLimit;
}
/// @dev Allows to change the daily limit. Transaction has to be sent by wallet.
/// @param _dailyLimit Amount in wei.
function changeDailyLimit(uint _dailyLimit)
public
onlyWallet
{
dailyLimit = _dailyLimit;
DailyLimitChange(_dailyLimit);
}
/// @dev Allows anyone to execute a confirmed transaction or ether withdraws until daily limit is reached.
/// @param transactionId Transaction ID.
function executeTransaction(uint transactionId)
public
notExecuted(transactionId)
{
Transaction tx = transactions[transactionId];
bool confirmed = isConfirmed(transactionId);
if (confirmed || tx.data.length == 0 && isUnderLimit(tx.value)) {
tx.executed = true;
if (!confirmed)
spentToday += tx.value;
if (tx.destination.call.value(tx.value)(tx.data))
Execution(transactionId);
else {
ExecutionFailure(transactionId);
tx.executed = false;
if (!confirmed)
spentToday -= tx.value;
}
}
}
/*
* Internal functions
*/
/// @dev Returns if amount is within daily limit and resets spentToday after one day.
/// @param amount Amount to withdraw.
/// @return Returns if amount is under daily limit.
function isUnderLimit(uint amount)
internal
returns (bool)
{
if (now > lastDay + 24 hours) {
lastDay = now;
spentToday = 0;
}
if (spentToday + amount > dailyLimit || spentToday + amount < spentToday)
return false;
return true;
}
/*
* Web3 call functions
*/
/// @dev Returns maximum withdraw amount.
/// @return Returns amount.
function calcMaxWithdraw()
public
constant
returns (uint)
{
if (now > lastDay + 24 hours)
return dailyLimit;
if (dailyLimit < spentToday)
return 0;
return dailyLimit - spentToday;
}
}