diff --git a/backend/app/constants.py b/backend/app/constants.py index 6df97ccb16..aca64a667f 100644 --- a/backend/app/constants.py +++ b/backend/app/constants.py @@ -89,479 +89,898 @@ ] GUEST_LIST = { - "0x16f3f2f0ba34973937A1ebb989a295Ca106b67C7", - "0xBB5935dAaFbacAE82c8D2CA8377F16073D70061a", - "0xba84B5cA750b33DfAdDBFdD1B7C6887885a34977", - "0x4e9A05226993F094A56A3472C8c816F2599423A6", - "0x40DE3299Bd8a10D8Ac3f32C1A55DE40640cF9B75", - "0xC33F87697EF41e0E95e7a55d1ec8180F04088578", - "0xCBc924183Bc32D02746Fa8D38843B5Ce08662eB4", - "0xDc9C5e34959eC3643AF1e1D34A83D6b251AAb1eF", - "0x762BBc211990D0a356F35E4D500843F59d223C2e", - "0x55187a1165EBB441A1BF227fff1EB0D32a65bc46", - "0x7aE59f3F2B2E5f3842B50a15bCb5247c5De881Be", - "0x59072B3a3287F4a75cadfb36D671A2f0d1959B09", - "0x4A5da2a1D3258dF8FFb431Cf0110FE9b98ADeEbf", - "0x514A9771Af8Afe71057666b680238dFBeA578d65", - "0xE70055e9575f15A6f51F3068901D73ac63952adF", - "0x9e831B58001e2b69F70C892e4F8ce9d2118B7E00", - "0x51c1C7f1e168a36Bf1FaBFD91E98b43476a6B14D", - "0x33878e070db7f70D2953Fe0278Cd32aDf8104572", - "0x3df13B9bd79158f0cccDDd0833cF774178e3d2e9", - "0xB9573982875b83aaDc1296726E2ae77D13D9B98F", - "0xE862E2C1ca94eAcfEDe3c95a217c15EF0086a29D", - "0x0442A9aBbc93058a873c371F21CC366338254A88", - "0x0194325BF525Be0D4fBB0856894cEd74Da3B8356", - "0x399e0Ae23663F27181Ebb4e66Ec504b3AAB25541", - "0x9f729294b308f79243285348A7Be3f58ae5ED31A", - "0xb62E762Af637b49Eb4870BCe8fE21bffF189e495", - "0x5725a458b319d73B8Ec84c47de80620E7B191B0C", - "0x57Ccc081824b43B75986727875929AF3A6Ad721C", - "0xf13e477365B0FAa64130DA2FF663aAb20d32d929", - "0xFD868dB0696ef762351F8421535cC5f9F423B23C", - "0x30043aAbBCeBbD887437Ec4F0Cfe6d4c0eB5CC64", - "0xAa01DeC5307CF17F20881A3286dcaA062578cea7", - "0x3FFD0C300fa4a021364Ae7e85a7b0d3a02133f99", - "0xBEa26DE685Ef828b60cA53b40Ecc9Bab35645fDF", - "0x4103CFcb300599dFcB31dBc95d919592619B4EAc", - "0x22bAac1E95efC010E35D5eD643BB16c9dB254a11", - "0x686A484bc2E2bE79f358c7055e8539A69413A3Ed", - "0x073a360C372FD51Bd6E56B4a4d73790fDAec4641", - "0xdd0206010CA82fF22303b58863b3a6f3006C86C4", - "0x25FA68A4c340202737EDBC67fD1a2Ec8DE872dB6", - "0x5b655EDa7D101f98934392Cc3610BcB25b633789", - "0x32cEfb2dC869BBfe636f7547CDa43f561Bf88d5A", - "0xA4369e39e3ED13593Adb0142A1ea5d08AbdF99C4", - "0xA8F0048A0d1A04663Ca5010d0bEaC5BCAEeA0eef", - "0x65F632cfe8015B7ae6976e549645ed04cde60fe4", - "0xb35E0a0D00c640ab75fAD3cf3B83264bC64D23eC", - "0xafA3E6E29D99337b166b83fB24bA17b19764B49D", - "0x57DD1517c12659365E59F71129Fa9B1611Dd18AF", - "0x9120FfD5d04ca4B26AaBCe611989A8F026dc099a", - "0x2AC6A3561a43f06d62602eF9728C2B9eEc393326", - "0x297Aa50D0557c865F6C9B0AA0a91f41C26E55eE6", - "0x9Ff46343d0b652D6e766F85f9aE91653869349a5", - "0xEd36bf0b2b17768E782Db2ece6A327055b2f3e9C", - "0xC28D2fDFE6d5a482d32f855457Bb5F8cAcdB32b1", - "0x1d44404C1C53991Ec33095225da173d544Cd4Af3", - "0x5d9fbd984B9CeC714a4B14c38Ea83bBC82d06d69", - "0x5Bc0AEbdbab698e12FD33A2E133e6858fe6Cdd76", - "0x66805D8B82664Acab4CbE0C0498889dDE9aF7841", - "0xaF7610578F54c7De7563655AaF461E2CbeCB08C6", - "0x6c3F373Baec5D2d0Fb3C82C4f3Db5E48873ae363", - "0x015122A625b45f68E6D795C0Ab99fC7107e4c3B9", - "0x508A4F07B60BA0940283Cd4e32d5DEb0CC38AdF7", - "0xb150c9bEd10a8C62997d58a81c4e1fA75160643e", - "0x212647c56BA10ee429a838bc567dFb03A8D054Ba", - "0x73306dAb0D39A4D47df4972c7022CB2cac075D4e", - "0x914D5d84aAA064207C2c31014426227405edab41", - "0x3FBcEC42405391B1fb377664daA5AE7Bc9Ba7BF5", - "0x8c8296a0042E842Cb865DfFD94678c941fD24bAE", - "0xf5c2087877218AA979Dd0e2e5108837199aF44D2", - "0x529dc928E67D8A43133D10769B308F1D5A629401", - "0xF1bb436c29E46B1987bC825879ffc9c34Ab97f99", - "0xFDDE7aE208B3596f1982D66F6BAe4cDabF29244b", - "0x02e4Cc9ffF7566563618fb21B3BB10Eab4B3D726", - "0xd8821dbbcb8ea0c14Bd1F0aCbFBeBB3Fd984269b", - "0x31d23825aFbda5B6B1690Bbdbbb8117B5ea0f8E4", - "0x731022D6De647991864203a35dFaD1A192240d07", - "0xEb5e0B8e80FCe271c13F533fA728D7bB03cafa4c", - "0xFC967DE4e029fdcD16B418DaC2147d282C93085b", - "0x801a6d6dBC1e40466E131aA21D951629A9efAB4e", - "0x4892139De0e73141438D9E55D593171C0Cc6B143", - "0x8124eFC94c951cF41D4B0B42794C678458a00726", - "0x81cc36DdA894256aa95458F78B4029381b09BDfb", - "0x4Dcb2BCA3450B427F3d1b424C885259D05363080", - "0x7Dd8030F9d33Af4a40ee074f990892E825132e61", - "0x432C53218A11bEd08d238Cf84ff547CE4fe933ab", - "0xE77ad9c5af60332D24E5531B51A6B7f61D0B8703", - "0x0f792e55668AD78476d4B563E6EB1228D636a71e", - "0x583bBaDA56bb535BCBb31877A620A6ff2A25CeA5", - "0x5C0E777dC8F3De6b0911b44DbBDD8Bf71b2E8e38", - "0x8a4a50B13Fd2cb36FeB96c408CB98B4c9F2b8F25", - "0x1e55C85801a2C4F0beC57c84742a8eF3d72dE57B", - "0x26d3bE736aB6b5D8A3266fFCC0895dDc1bc19a38", - "0x809C9f8dd8CA93A41c3adca4972Fa234C28F7714", - "0xfB94f39B150Ae661F85762154c0CadC65E083791", - "0x4B7C0Da1C299Ce824f55A0190Efb13663442FA2c", - "0x77E64560Bd6C323c075F206a5AB9dD6850F31609", - "0x0F46540678c7e6D2eF983B382CC07Fa815AB148c", - "0x82073f802547fEeEc0fd49719a3D7697fB66076a", - "0xBAab83De8DbA764bF02a530cad33555bD23eba22", - "0x890a0047f8D573347872cB6C019F86552f2367d6", - "0x14D92832265eeAFDEF9e526356FEfc90105966c3", - "0x512B436cB2Ed6016e80d4F89ca578F99DBBccb61", - "0x696Ee4AE0b15feae8ED1AfC865930e0ea65b1f3F", - "0xbb4D885fD41c807e8eCC2dD9e6295a7F96Adb0EB", - "0xB1dE969883b1FdD90a43fF475A5171a3CfEfe76d", - "0x7DBF6820D32cFBd5D656bf9BFf0deF229B37cF0E", - "0xfE2e3cCEE9714b29Ab2FB4E940e52672194815fC", - "0x57fb3f4b027fbaDbd8d20Eb5E48feb1e2b02DF30", - "0x9AE494FBAc34682c122A1D4e3D6ae1Eb5404A469", - "0xb2b9300475aF157676C44eE64d39a5eB3C294DbD", - "0x01Bc28E036b6e75247Fe8F49f0a8b9410b19d851", - "0xcCE9A28b570946123f392Cf1DbfA6D2D5e636a1f", - "0xb2a3b5B9d2C0f07cBA328b58737147cfc172EB9f", - "0xCC3d7F9fE6946979215A901BbA385a88FdabBBf4", - "0x38f80f8f76B1C44B2beeFB63bb561F570fb6ddB6", - "0xd82803b7B9A5EB1D5FC558FD619afC6c031cd0B1", - "0x844AeeD1B294Ef9632c18E73F57ef77D0A23D0e2", - "0x9cD7D1981B3e15a2DEE4d512ac60E0579Ae18546", - "0xEBCd250474C27cBaD3C56f3F34e08F97b370AC2d", - "0xDA47bdcC48f26FB4709f90316341D9104cB1fb89", - "0x5cbB6ad79008908aA125667D1300558D9253B589", - "0x1078DaA844CDF1EDB51E5189c8b113B80a6A6957", - "0x8341c4106523b49fc247f84e412Bb2AF5597038f", - "0xCe57ebEd9aC38402DcAA44f65a1c9b04e26b8283", - "0x2dd2036C9Db2ADA2739509AF0047c00C8b9291EF", - "0xa77294828d42B538890fa6E97AdFfE9305536171", - "0x8dA48e5846c06B558970ACd42EDc7Da8799481E4", - "0x50418699cB44BfDa9c9afc9B7a0b0d244d8927D2", - "0x936d69AbCD9acdC89455EEFAf744044fFC1CA660", - "0x90C32e6B29794Fd7f5BbA2BBEE74e924078B3f9b", - "0x362B7e0599E950b921ca9D86336ca409208FFDEC", - "0xd98aD1Fd4aa0E1c876d91968D1385aa9E1Aa98df", - "0xD2602C7bDFC9F413974e944280BbFae275d1B1b6", - "0x731A2e51ebfAeBacF8477E992CDEB1E8eacf519C", - "0x072d63796C4FE69B306a23E1D01156d51F7B3e16", - "0x051010142A0B9de7F0Fd8fb31d085407287F6381", - "0x8498843f6D9046f7b59482978E152D61869203bC", - "0xB48ef8e4e7Bef79ddF64d4424151f003a59BfbfB", - "0xb423A138fD171c28d90A5883A01ec92fF3D63609", - "0xAfA3a2528E8baAd576a83ffC52dB9f100dEbe307", - "0x055fdA7Eb509cc338C898b0F698B7624387AB813", - "0x0B3BD83E857997b370FaDC8504fB712244F6786C", - "0x8D12A71Cb933A4222d42feCBb4ba9c15e455305b", - "0xDEF3D19ff35a42F5b8E3c706c8fD287De72e6D15", - "0x19a2BC678785BAD6A947A87494D480DAD57711c6", - "0x2c3E79D3DCE90FB0886C89Ec602E61757E589a94", - "0xe8aa836a597a66724D678860D105561c13E95bFa", - "0x3352a3277d2B74A773Fa6E68a625FcB18E4Fc282", - "0x2df292AF809Fd693D94C7D17E36BE352e15Bb98a", - "0x269Aa10398Aaa695259C3E8211ab27a15004110C", - "0x02d9c84a495986b8b3C3347Ad16849DCB1b9793e", - "0x8FDA1Daa6a674C1726d1896E3054B9a82d123F12", - "0x1021e61f2cDd8bB295b0e64A20eBB7D8ec3734bf", - "0x58d7d9c971A613117E493062bEC1A6A5484f2780", - "0x2bb96f44b9709b02189A50B377755edC30bc65C7", - "0x7bE20B02095944657275eD608615A39931d783F2", - "0x4AA51a723882ee676FeC444D4561c5eE16c339E9", - "0x1B243D42F53924118646EFaec5b3f6116b563960", - "0x01b7348EC3fb20Ab1f40b97Cc82df44aeD360768", - "0xbf4C0104dbfb028f3484CfAC17BB22aa15E5c7E2", - "0xCc3B817D4ABa7698EaafB4C68E7688CF61B0BF46", - "0x572E1b86471c900Cd16AFa9cBB7701862D0e70cB", - "0x602Ac8C3f61b351be325FEeb58842EF557431c2e", - "0x8d0CD1AB81EaDa4F92C7cb5c8DBc25C69cc296AD", - "0xAE2C7AB762317DB453317b70f1f40145755fAfb7", - "0x7bdae9AAbE238188c4882D48a3aEE21288A38eD0", - "0x96e4152f00894f677d860023b9784d578bC1c145", - "0xF572C9b11E757d3580C7C7310630cd488E8EA736", - "0x3769092DBfa6eb34434fB5B7cf0eB06E710728F3", - "0xCA72c93172BA6EfF168E59e7F17C3C7A8FeA9B62", - "0x1c0AcCc24e1549125b5b3c14D999D3a496Afbdb1", - "0x7fC80faD32Ec41fd5CfcC14EeE9C31953b6B4a8B", - "0x5d36a202687fD6Bd0f670545334bF0B4827Cc1E2", - "0xe64113140960528f6AF928d7cA4f45d192286a7a", - "0xf6B6F07862A02C85628B3A9688beae07fEA9C863", - "0xD779aFEE481e3Df5cd0544F0e4353Cf534FD99Db", - "0x183bDB344A07Ee3D27f07AC4799A56E4A2fE5439", - "0xA8cadC2268B01395f8573682fb9DD00Bd582E8A0", - "0x75535661Ab25a468Dfb3137320a7568FeCda4832", - "0xd37ED782323A82e5BD55A92500E48FF5eFcc415E", - "0x03bB5bC3c8fdAB212A6b2B347a049133DfCB3A47", - "0x61987699055394c65355F2797D3e4e589f7FaBf4", - "0x2bC12061C8912505978472C21d4a23dB43AF62aA", - "0xad7575AEFd4d64520c3269FD24eae1b0E13dbE7B", - "0x0D89421D6eec0A4385F95f410732186A2Ab45077", - "0x04c0cD38B8c203b14ef2b7B8d736D69B938AFF71", - "0x0CF30daf2Fb962Ed1d5D19C97F5f6651F3b691c1", - "0x6EEb37b9757DcA963120f61c7E0e0160469A44D3", - "0x616caD18642F45d3fa5FCaaD0a2d81764A9cBa84", - "0xdC1d963D21C9c1bFf7b6Bea6e10080dAa9b4fc51", - "0x8073639B11994C549eDa58fC3cd7132a72aaDF10", - "0xe52C39327FF7576bAEc3DBFeF0787bd62dB6d726", - "0x8f21bD39FcAeA3A729D46339A383081ecB7E84E0", - "0x8Fb7087336678F36E42313f6130567A109a8e73d", - "0x276E69CdD336001afEF07075859A93078496C3c1", - "0x954F716e6de059360d278B773138f8e046696721", - "0x997D410b26CdD17b0750F2c1751e59cBcfaE446f", - "0xE8b6b71f3b1E6d2ad406D2cf36B1f2C567342dF1", - "0x83108A0653a14EAeB8301E7b10a37CfAc39C82f6", - "0xF95D9549b3Ab9470d306a6413Aa45082e8B66043", - "0x82d92494f6fFFB17A1DDFfd9B7d88D1d0a360009", - "0xA19947DA8B916f64Ac6F362cEC9001D8BCBeEe93", - "0x7ef5e4062dcCaD29A6F8d5458590160536056C81", - "0x653d973b36137A5cB2fc304996E0af1F1afCC628", - "0x5F319CA6Ecf072A4d183edAa711Cd04dC225df19", - "0x4D32D90D6535bD4e7eaBaa27EE72932cB214BbfA", - "0x73b9f6a6e52aCE2797F0a6E52AAc530Ed1F2a2Af", - "0xaA3600788b72863ff51C8f0dB5F10bB65fbFeAB4", - "0xf93F0b770784602fC3079eb1D2fB1Ff488Bb02B0", - "0xC8Ddd59c496D04C4C060Ab5038d03d661DDC2617", - "0xc42c77b6B2A2B220b9502F357bBf51334Db3C93f", - "0x2615214F8200B526a7B1eACe03971F2672B48CF2", - "0x9d8d7220D060fd12Ca33336B7239688e366327dE", - "0x9e602c1920443F01Cb100a57A7F894df8Eb42f66", - "0x7e651F5f597436cD0fa941F5FF2cD45Ef3F2Fda8", - "0x8e30Dc2AEF957B1F7dd67B1b7bC651fFe7E17a06", - "0x597dC4159a4b85c086c3C679a0B6c8Fe2836886F", - "0x7fBdE8B27D2B4F164B66F2a9dc02bbD6697e5b19", - "0xf5819cC26F0481c9b86294B4c24027518a04BD5B", - "0x8e7D20638947132B0e6E1aFdE2da1B103aFF9280", - "0xCBA711BEF21496Cfd66323d9AEA8C8EFd0F43e9d", - "0xdfBaeeF21396BF205D4B7D23345155489072Cf9B", - "0x3B981fA5dD50237dAb6F96A417A6690B6f20FcC4", - "0x6C31212a23040998E1D1c157ACe3982aBDBE3154", - "0xCDdF772F8A3295C89DC37510E16e360ee2d29789", - "0x002B5dfB3C71E1dC97A2e5A0A7f69F3e7b83F269", - "0xAD7A185b2456d5AFD85838A50C7d8aCE3aB2f871", - "0x7993F18C91A9f68593d308C5846f380A2a374F46", - "0xc5d82775c9bc5272B1225DB8D62b7034e064BA91", - "0x8bfcF8cb383149D4Ef37e7A609cEc195CDCbE099", - "0xA515F7fB260095eebC860425493b8761B4FC9abd", - "0xaA95cA26c92b0634dF7a1A1504f579F13bFB7f9d", - "0xC2812325caD4C4C782CbbC1164e9373371D31dB2", - "0x4831DdB6502ca45dbEEDf58B47292061Cdb6050B", - "0x6733c60E6E02f9C8FA221Db1aeA018d80D949861", - "0xCaD3887923B39cD2b0B6d13538C4ecB7C5EE9825", - "0x4520cD8BC085B962eF8c0ec696ac9D3Ef1d8bf55", - "0x7D85fCbB505D48E6176483733b62b51704e0bF95", - "0x27259b0F4209e76f8C6Cf27106C9FF83BdC2E831", - "0xE04885c3f1419C6E8495C33bDCf5F8387cd88846", - "0x23ee51e614cBF138e4cAbA9EC5ed4fF7D27A8596", - "0x2cab4d881962D247218356B32aBc4AA5c46bA0d2", - "0x1c0A032954f20761E59138feE236204bECbb8bdb", - "0x701d0ECB3BA780De7b2b36789aEC4493A426010a", - "0x1Ec3C1f70E1D6bBDC84092ae86eAaDE495fdDB9b", - "0xB53b0255895c4F9E3a185E484e5B674bCCfbc076", - "0x770569f85346B971114e11E4Bb5F7aC776673469", - "0x8289432ACD5EB0214B1C2526A5EDB480Aa06A9ab", - "0xdca6F7CB3cF361C8dF8FDE119370F1b21b2fFf63", - "0x117e1EbB7D05545064850513021dF6ADe3C1690B", - "0x7fb43C99a26a9EA8ba841d58390BF1C2996EDFB0", - "0x84B5a60Df2d7e3397B3A4A3c6282f090304Aca26", - "0x72F434Fa010929656AeF58695dab85447E51Fbc6", - "0xA29b0D2F3b4555359A1bF684d700753b1b06cBc4", - "0x4318cC449b1cbE6d64dd82E16abE58C79E076C2B", - "0x8F48282e50B0210bd7c7DD69C54205E98b9Ef5D9", - "0xa305B293e44A82f3Cd489b5fB26084647bb5D8ae", - "0xd9e5De13eF1dBC4DFE0Ee1BB76276228b9B23d0f", - "0x4AcEEB7bF9ec8104CC2379f1E8D648Ee47249FCb", - "0x0743542070891051861f8D0a4550f97B43B0B89a", - "0x58aD805f26272C5Ba06D24Bd0E43c8a2d1c634D9", - "0xE6ED9C681967a4EA7Cef4486942b800139DfB000", - "0x51b9C1Df35B044b5c0099D1fD07EAb7cE38f325d", - "0x55DFFA17578e6bAcE42e4Bf8687A11A85cCfEF97", - "0x1FAE8f99E9F932BdBA910061590C2156eE512A91", - "0xA25207Bb8f8EC2423E2ddf2686A0CD2048352f3E", - "0x746bb7beFD31D9052BB8EbA7D5dD74C9aCf54C6d", - "0x38bc91AA6Aa434c4fae7E666F68C859292deEd95", - "0xA3aD5CFb4FF4B68e37A338Da200BA441C1850B5b", - "0x4bfb2c232F70c83136a3F206cd26Df2A0B605cEC", - "0xf5AB6B4a8d578807491ef59cE855982990932617", - "0x1Fdd220E14b59E26bf1888e8267C4C221983a0A6", - "0xE2D6AFF297b41881c1aEA9599F68AEDFAB38C651", - "0x7d547666209755FB833f9B37EebEa38eBF513Abb", - "0xb681B19bb1F7e9F3C2AE0EDeab368c2afaa4e590", - "0x7Eb84E42059F0D44269C50f4D3A280Fd307a6824", - "0x84f0620A547a4D14A7987770c4F5C25d488d6335", - "0x4Ae6a8A28c87b75e935a90D6128F2649C969c0D8", - "0xb79223E868871DBAc27E8E301f73734abd4Cc628", - "0x6F219Bd1167568aB67494A9067CbbB5679bf0022", - "0x9Ff548c1B3eA3dd123AFE39C759dDA548009B6C8", - "0x3085051F89666E7124e7Ab95b693Fc1E09770907", - "0xa25211B64D041F690C0c818183E32f28ba9647Dd", - "0x6166E1964447E0959bC7c8d543DB3ab82dB65044", - "0x76E059C6FF6bf9FFFD5f33AFdf4AB2FD511C9DF4", - "0x4CC9E6fABb800F083a2685501d1A30CdAbb4B2De", - "0x5f3371793285920351344a1EaaAA48d45e600652", - "0xAFE2b51592b89095A4cFb18da2B5914b528f4c01", - "0xe3F4F3aD70C1190EC480554bbc3Ed30285aE0610", - "0xE0D8926A51F9A1dD8E089D9a3DD88F88fFb2F1Dc", - "0xa6c366D97cb64708211f24310dFAd5363BC96a04", - "0xB7562F12E41C762CeCDA99d62Bd6EAC7b0C3B4c1", - "0x301605C95acbED7A1fD9C2c0DeEe964e2AFBd0C3", - "0x5d47e5D242a8F66a6286b0a2353868875F5d6068", - "0x0ea26051F7657d59418da186137141CeA90D0652", - "0x88f1706c20d94A4d1551C5F799C9E3380A24C3AC", - "0xFB40932271Fc9Db9DbF048E80697E2Da4AA57250", - "0x40Db8365d1252bcb06598927698238a99D39228E", - "0xaCf4C2950107eF9b1C37faA1F9a866C8F0da88b9", - "0x144c4E5027B69f7798B2B162D924BcAE5c149f15", - "0xeeE844540644b204f0005c063Ae95F244BF06a84", - "0x014607F2d6477bADD9d74bF2c5D6356e29a9b957", - "0x1E8eE48D0621289297693fC98914DA2EfDcE1477", - "0x4AdA1B9D9fe28aBd9585f58cfEeD2169A39e1c6b", - "0x31460f49EEA93Ef8255b42be019FB96F89Cf0c49", - "0x63A32F1595a68E811496D820680B74A5ccA303c5", - "0x022ca32d31da3Ef85922AAFD9aD29C5b2418172C", - "0x93B109C3c279bcBbB673Ed1ae1A8BB2dE8eEf9da", - "0x689476323Eb5e9A5DEd342F54B562fc2c156A522", - "0x1C9F765C579F94f6502aCd9fc356171d85a1F8D0", - "0xe0144FA05A0d32B5B1De10CcEe7211616B3E3EF0", - "0x6C965b656C450259a6D4d95A2E68Fb4319EecBc0", - "0xE36BD8C15a83b89E2E49806d7312846069755C63", - "0x59DDA36bD196Ec849838CE2163E6821f946b37Dc", - "0xDd31dB93082a3A71b98D37ba26230f8734Bd63C3", - "0x83c98211C50480e457a0dF930d2A56a891BC4d4b", - "0x11FA934f6754076AEb7Cf0A72a1c2D2518aA4C77", - "0x2B888954421b424C5D3D9Ce9bB67c9bD47537d12", - "0x2383A8b8cC8561a65871F1d2783B7C52e22B62c1", - "0xCED608Aa29bB92185D9b6340Adcbfa263DAe075b", - "0x841AD0AbAb2D33520ca236A2F5D8b038adDc12BA", - "0x76d2DDCe6b781e66c4B184C82Fbf4F94346Cfb0D", - "0xf21e38ac177B48fDE02dB7F2CA97466AE8Eae87D", - "0x7537Cb0AEe6a3483a7601ebf1084eD4df73166Ab", - "0x5f0bD06A71E038206ef3e5090eB448E9a9773772", - "0x3C0c7B44c1F9366271F5c491121a1F7d55d33eF5", - "0xa96a437eFb71bAF50A59027C340FA3362ef703F7", - "0x55bA9c90c37e3206570AC9dc872c0f053d155F77", - "0xC68bba423525576C7684e7ea25E7D5F079b1361E", - "0x78E87757861185Ec5e8C0EF6BF0C69Fa7832df6C", - "0xCb36F8580A36788A48518dEC95Ea458357E64E30", - "0x25854e2a49A6CDAeC7f0505b4179834509038549", - "0x639749b7b08aEe65039c21d8a411103C6ceBEBF0", - "0xF517529866d371F04780885923F739bc17694BFb", - "0xC728DEa8B2972E6e07493BE8DC2F0314F7dC3E98", - "0x33f6EE932cEa603Fafd6854827259bE172C91Da4", - "0x6D97d65aDfF6771b31671443a6b9512104312d3D", - "0xB7BaBe35CE543e2Cf2F615CB1c792a2025feb572", - "0x4D9e86a5AC368Aa4Df0473eF07e13Ec2Fbe04025", - "0xaa79B87DC8B046A5E4f7D03F1562D7fe5BF98737", - "0xE71FbB197BC8fD11090FA657C100d52Dbb407662", - "0xB22981bA3FE1De2325935c91a3B717168fB86714", - "0xf389dD1F828525b449D63D14157f2d3A25eE0a41", - "0x877B37D3E5467B4aAE7687Dd3480A46C8D3e16Be", - "0xf9e1D1e9F22c96752356AdFd377231528c7E851E", - "0x187089B33E5812310Ed32A57F53B3fAD0383a19D", - "0xF1659A2FD5007192314F9676e6a4a39FD1202160", - "0xFdd210ce1b829E837D9e034DAE0F0312F176cef6", - "0xaCE1f1c6c5c89AE3Fc3209ff92e7120fb74445aA", - "0x6Ceb397b68059Ca73049874D0a30c62500aE9877", - "0xC46c67Bb7E84490D7EbdD0b8ecDaca68Cf3823F4", - "0xbb2eb4c7eB36ECce7A3E6bc501590CE12c9c1050", - "0x9Cf251A782cE7310D5bec0fe0a1C2B826d962545", - "0x43930Ff04D18a5B59805151c1Eb403C55870641E", - "0xA270f5649A42feDfE66ddb3b0b50bebAe1e3DDB0", - "0xd3488EA0c1DC99a5d72F75c84004224f8b58694E", - "0x7aBa691D12D8eF8793F1643eBa66b69C70EC72f1", - "0x8558f502887a9a52c4B265d72327E0E529Ff790d", - "0xA906c85B7e809b79c5e69d485693B44d65B1B252", - "0x3abdC9ed5f5dE6A74CFeb42a82087C853E160E76", - "0x30C7F4F7504D6366916f669cd8E731ED4dF6C702", - "0xed8DB37778804A913670d9367aAf4F043AAd938b", - "0xc191a29203a83eec8e846c26340f828C68835715", - "0xa32aECda752cF4EF89956e83d60C04835d4FA867", - "0x059F7da59Ad1EB412B4d2fFc12E9B50Da91cFdb6", - "0x85BEad65c61dB8cF230b3ec30552B8b3E6388570", - "0xF3Ad97364bcCC3eA0582Ede58C363888f8C4ec85", - "0x3F87755E2974534888Ddb20A52dCE45Ef9f204AB", - "0x757CC91CcBB88cB0d78d6798D20051d39E5A7296", - "0xF553C8223cA8542Af9Db7b916Fe9dc7c28b73751", - "0x40f9bf922c23c43acdad71Ab4425280C0ffBD697", - "0x9600e2eE6377DAdad7299B120026661c336A5e6d", - "0x516fCA170bfE24BFC54e01F215EF85Fe9B5B798A", - "0x61C820e261717A5A0555488872F78ac7b9CE77Ec", - "0xEb263241eB948Cc0eB53A58bf743289D074F474F", - "0x841C11b14c428dd591093348B8Afa2652C863988", - "0x3c114973c0260290C2dbD40323327d996972FCeB", - "0x765a16ca391A6b9249cfA65bf2D14C38722198e3", - "0xC3268DDB8E38302763fFdC9191FCEbD4C948fe1b", - "0x6B92686c40747C85809a6772D0eda8e22a77C60c", - "0xc799bE8De03F20B2D3b101E6F6516D614e6fFe06", - "0x40Dc654af5cE40C122ffDC679fa8E8ca8b91556A", - "0xCE8D52c38d74B77a0aA361c48Fdce6b220A3370e", - "0xEfa4c696Ea2505ec038c9dDC849b1bf817d7f69d", - "0xf7253A0E87E39d2cD6365919D4a3D56D431D0041", - "0xcf79C7EaEC5BDC1A9e32D099C5D6BdF67E4cF6e8", - "0xff75E131c711e4310C045317779d39B3B4f718C4", - "0xdE2BE7C9C542c55a7a77489A3A7745493988947F", - "0xFeB3E0f50107f6cfB2EC8C2bC8287f2707E0E2Ea", - "0x6b759Bf480407D19c8903c16023c706868c29a2A", - "0x6E38911dA6Dd0379F1CaC396F74387c95A1f0D21", - "0x5a5D9aB7b1bD978F80909503EBb828879daCa9C3", - "0xe96056A9936C58e89D1703cF6bD97F134341EE44", - "0x4dD6720D2Bb8721A46bdF9a528704164578E03B9", - "0xE83B9A1B9056B21a01b85162E77AD76a42A1c64B", - "0xbeC48f1cCf82d8e4C983Ee00Ac2eC6B03B81d710", - "0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "0xB68da7fbF71383Afab240839287878539cFFf20b", - "0xfBDDB719cC7c795a1D9b7EA7aC11494A19b3231F", - "0x07506a5F48D71fDB34D3900fB086D43EF1B58FF9", - "0xa85cdd5478B7E525a808eF9707c3e33432cE1e7F", - "0xCf7C21DeD40f2Df85A564207A89b3379780d9CE3", - "0xd26b76e50f6510cdD4bf45d59279705f36946d23", - "0xdb7a41e39807E8C988859f150296Db92674b7dc7", - "0x719028736f10164c838Ef129936779eD739312f2", - "0xaBCdef0AbbA5D0106595174213156797bc0DB33E", - "0x3D2b8879f97e413b2609F9844A5fc8dB8FE4f6F8", - "0x81EbE8Ee7b51741fD5DaD31F6987E626A9bb8111", - "0x1D45c8fa65F6b18E7dAe04b2efEa332c55696DaA", - "0x978eB534b26CB8749D352a2C94EC21e659e4248d", - "0xa7CA400d49BBa87EB606ee05af93689BD21FaB99", - "0x65ad2BF7E09af2597C140dF6386a3003d0F5f8Ee", - "0x835918a3fBDf946364a9aee3114173865b712663", - "0x6073cFfc1D46b1eA57BA89A28074cA734aCD7003", - "0x2B13D52dFd33E2eBd13232866fDf96088e77d596", - "0x55F5601357f6e0B10a3386914c93916c6C9A368A", - "0xA1D5D2d931b532A0503e97f540f65ed256f374e6", - "0x6C9258895FFBE2178b3EdEfE09AF304a1e99bF2F", - "0x973375b099943cDdFd390022CeA90D4F1d0c493c", - "0x8A8C879D39A74fCE0593714956bB7Ed048A5c1BF", - "0x9c42B0c70D0dAF1211f3aab2A1E6EC5E717dE12a", - "0x81a6383041593c556d1c8e69e2749b35b5008F09", - "0xF41b98a4C32bB61468C8001E0C69Ef64ce6DEa57", - "0x8FaE81bb674c89cCDE35a386587333D074b57786", - "0xa8258ED271BB9be9d7E16c5818E45eF6F2577d92", - "0x1e90474D2E83e7B7dD45553156Beb316845E66A4", - "0x2cCbbC4c10F5d807FDd447219B57D0b883a28DC8", - "0x1bBeAc736875c5043486A8a4374E6B5616eC8883", - "0x95add3DfEF3AE0A832607Dc71C4A9C6A6C2D7Eb7", - "0x744c6Eed427aF293b0106B46700fdDD3C9f62Eef", - "0x743Ec55fc166D24D2FD0211fb6Ce53926D0Ff3b1", - "0xDd03d2434C02c6BfFb097b7130528F9568b6C70d", - "0x97C12EFA574923E3ee445370d2dE432332857110", - "0xB69951a0642b55CD5731535ed5B290Fa49D3454A", - "0xBA56878729540404dE2aa14561b451aE2350744a", - "0x8D247f4Fbbe81429d3D164a5c9Ae0063210edBdC", - "0x850a146D7478dAAa98Fc26Fd85e6A24e50846A9d", - "0xfE1552DA65FAcAaC5B50b73CEDa4C993e16d4694", - "0x9705FE3586a7D768Fee061aAfE9384b1D4B8F2D8", - "0x5554672e67bA866B9861701D0e0494AB324aD19A", - "0xacc5c1e73d70F7F9622De2d574885Ce8E6981033", - "0xbe9E7b0ed19526544B55b697107231f9467a805f", - "0x172DBab6f5E62A1FE7E2bA5eA1624ADB33e0aa14", - "0x96725Fa2F9A0b5bAf80fC36C20C2cA79d86424ed", - "0xa392cCadABFf735dbFF69dC93d7C13f34A30611b", - "0xEbF0e04E47F726D0f44801dFEC5e705aDcd6694b", - "0xC0891e8FCeA09680BFe9170809fad1BCCa10b96b", - "0xA21000E7A5A2A2Bd9329428A859f9d7dcE0f0961", - "0x9A387307F7508DE113092BaFC5CB4B3AE0706521", - "0xBA719E0197470A790726075fD98EDEF04E2467af", - "0xda08BE028304db1A73a13Bce7C943127C2E393dB", - "0xfB4a965A35603010FeAcC648cA022Cb6A12D33F5", - "0x3Aa73ed90e9f0CEd87ff99CB60cA79019279e6CE", - "0x150bB505A9259b0be44FFb15415C79199E83c445", - "0xB170A41F2523220A12F84f17A54bD31953D98027", - "0x2Fcd65d9c8078644adCf1CB0cd70A1b61F3F9C5b", - "0x73006C818880d07dD510e165C3De3E74F2407187", - "0x747e6ABc102222f1dF65C662540dDf471241a644", - "0xeeEe5D271A56Aa09C4F8862aF514ADD3E882857c", - "0x98Ad82AB467bc8c70e0CC183a5826d903751b7d8", - "0xC624434420f6CbE835D6358A8223b78432773cEd", - "0x848e313d4b25bC0B48CaFdB6A72391E892E6A247", - "0x0025Ab2d69F6c2C3Ffac32Ab6A16e18c807518B8", - "0x2efe744ecc4F6BD55538da57D09DAE895C95b223", - "0xBc6d82D8d6632938394905Bb0217Ad9c673015d1", - "0xe1555c6EE61366a3f90135Dc704Acd25C3247ACA", - "0x2f51E78ff8aeC6A941C4CEeeb26B4A1f03737c50", + "0x16f3f2f0ba34973937a1ebb989a295ca106b67c7", + "0xbb5935daafbacae82c8d2ca8377f16073d70061a", + "0xba84b5ca750b33dfaddbfdd1b7c6887885a34977", + "0x4e9a05226993f094a56a3472c8c816f2599423a6", + "0x40de3299bd8a10d8ac3f32c1a55de40640cf9b75", + "0xc33f87697ef41e0e95e7a55d1ec8180f04088578", + "0xcbc924183bc32d02746fa8d38843b5ce08662eb4", + "0xdc9c5e34959ec3643af1e1d34a83d6b251aab1ef", + "0x762bbc211990d0a356f35e4d500843f59d223c2e", + "0x55187a1165ebb441a1bf227fff1eb0d32a65bc46", + "0x7ae59f3f2b2e5f3842b50a15bcb5247c5de881be", + "0x59072b3a3287f4a75cadfb36d671a2f0d1959b09", + "0x4a5da2a1d3258df8ffb431cf0110fe9b98adeebf", + "0x514a9771af8afe71057666b680238dfbea578d65", + "0xe70055e9575f15a6f51f3068901d73ac63952adf", + "0x9e831b58001e2b69f70c892e4f8ce9d2118b7e00", + "0x51c1c7f1e168a36bf1fabfd91e98b43476a6b14d", + "0x33878e070db7f70d2953fe0278cd32adf8104572", + "0x3df13b9bd79158f0cccddd0833cf774178e3d2e9", + "0xb9573982875b83aadc1296726e2ae77d13d9b98f", + "0xe862e2c1ca94eacfede3c95a217c15ef0086a29d", + "0x0442a9abbc93058a873c371f21cc366338254a88", + "0x0194325bf525be0d4fbb0856894ced74da3b8356", + "0x399e0ae23663f27181ebb4e66ec504b3aab25541", + "0x9f729294b308f79243285348a7be3f58ae5ed31a", + "0xb62e762af637b49eb4870bce8fe21bfff189e495", + "0x5725a458b319d73b8ec84c47de80620e7b191b0c", + "0x57ccc081824b43b75986727875929af3a6ad721c", + "0xf13e477365b0faa64130da2ff663aab20d32d929", + "0xfd868db0696ef762351f8421535cc5f9f423b23c", + "0x30043aabbcebbd887437ec4f0cfe6d4c0eb5cc64", + "0xaa01dec5307cf17f20881a3286dcaa062578cea7", + "0xbea26de685ef828b60ca53b40ecc9bab35645fdf", + "0x4103cfcb300599dfcb31dbc95d919592619b4eac", + "0x22baac1e95efc010e35d5ed643bb16c9db254a11", + "0x686a484bc2e2be79f358c7055e8539a69413a3ed", + "0x073a360c372fd51bd6e56b4a4d73790fdaec4641", + "0xdd0206010ca82ff22303b58863b3a6f3006c86c4", + "0x25fa68a4c340202737edbc67fd1a2ec8de872db6", + "0x5b655eda7d101f98934392cc3610bcb25b633789", + "0x32cefb2dc869bbfe636f7547cda43f561bf88d5a", + "0xa4369e39e3ed13593adb0142a1ea5d08abdf99c4", + "0x65f632cfe8015b7ae6976e549645ed04cde60fe4", + "0xb35e0a0d00c640ab75fad3cf3b83264bc64d23ec", + "0xafa3e6e29d99337b166b83fb24ba17b19764b49d", + "0x57dd1517c12659365e59f71129fa9b1611dd18af", + "0x9120ffd5d04ca4b26aabce611989a8f026dc099a", + "0x2ac6a3561a43f06d62602ef9728c2b9eec393326", + "0x297aa50d0557c865f6c9b0aa0a91f41c26e55ee6", + "0x9ff46343d0b652d6e766f85f9ae91653869349a5", + "0xed36bf0b2b17768e782db2ece6a327055b2f3e9c", + "0xc28d2fdfe6d5a482d32f855457bb5f8cacdb32b1", + "0x1d44404c1c53991ec33095225da173d544cd4af3", + "0x5d9fbd984b9cec714a4b14c38ea83bbc82d06d69", + "0x5bc0aebdbab698e12fd33a2e133e6858fe6cdd76", + "0x66805d8b82664acab4cbe0c0498889dde9af7841", + "0xaf7610578f54c7de7563655aaf461e2cbecb08c6", + "0x6c3f373baec5d2d0fb3c82c4f3db5e48873ae363", + "0x015122a625b45f68e6d795c0ab99fc7107e4c3b9", + "0x508a4f07b60ba0940283cd4e32d5deb0cc38adf7", + "0xb150c9bed10a8c62997d58a81c4e1fa75160643e", + "0x212647c56ba10ee429a838bc567dfb03a8d054ba", + "0x73306dab0d39a4d47df4972c7022cb2cac075d4e", + "0x914d5d84aaa064207c2c31014426227405edab41", + "0xfdde7ae208b3596f1982d66f6bae4cdabf29244b", + "0x02e4cc9fff7566563618fb21b3bb10eab4b3d726", + "0x31d23825afbda5b6b1690bbdbbb8117b5ea0f8e4", + "0x731022d6de647991864203a35dfad1a192240d07", + "0xeb5e0b8e80fce271c13f533fa728d7bb03cafa4c", + "0xfc967de4e029fdcd16b418dac2147d282c93085b", + "0x801a6d6dbc1e40466e131aa21d951629a9efab4e", + "0x4892139de0e73141438d9e55d593171c0cc6b143", + "0x8124efc94c951cf41d4b0b42794c678458a00726", + "0x81cc36dda894256aa95458f78b4029381b09bdfb", + "0x4dcb2bca3450b427f3d1b424c885259d05363080", + "0x7dd8030f9d33af4a40ee074f990892e825132e61", + "0x432c53218a11bed08d238cf84ff547ce4fe933ab", + "0xe77ad9c5af60332d24e5531b51a6b7f61d0b8703", + "0x0f792e55668ad78476d4b563e6eb1228d636a71e", + "0x583bbada56bb535bcbb31877a620a6ff2a25cea5", + "0x5c0e777dc8f3de6b0911b44dbbdd8bf71b2e8e38", + "0x8a4a50b13fd2cb36feb96c408cb98b4c9f2b8f25", + "0x1e55c85801a2c4f0bec57c84742a8ef3d72de57b", + "0x26d3be736ab6b5d8a3266ffcc0895ddc1bc19a38", + "0xfb94f39b150ae661f85762154c0cadc65e083791", + "0x4b7c0da1c299ce824f55a0190efb13663442fa2c", + "0x77e64560bd6c323c075f206a5ab9dd6850f31609", + "0x0f46540678c7e6d2ef983b382cc07fa815ab148c", + "0x82073f802547feeec0fd49719a3d7697fb66076a", + "0xbaab83de8dba764bf02a530cad33555bd23eba22", + "0x890a0047f8d573347872cb6c019f86552f2367d6", + "0x14d92832265eeafdef9e526356fefc90105966c3", + "0x512b436cb2ed6016e80d4f89ca578f99dbbccb61", + "0x696ee4ae0b15feae8ed1afc865930e0ea65b1f3f", + "0xbb4d885fd41c807e8ecc2dd9e6295a7f96adb0eb", + "0xb1de969883b1fdd90a43ff475a5171a3cfefe76d", + "0x7dbf6820d32cfbd5d656bf9bff0def229b37cf0e", + "0xfe2e3ccee9714b29ab2fb4e940e52672194815fc", + "0x57fb3f4b027fbadbd8d20eb5e48feb1e2b02df30", + "0x9ae494fbac34682c122a1d4e3d6ae1eb5404a469", + "0xb2b9300475af157676c44ee64d39a5eb3c294dbd", + "0x01bc28e036b6e75247fe8f49f0a8b9410b19d851", + "0xcce9a28b570946123f392cf1dbfa6d2d5e636a1f", + "0xb2a3b5b9d2c0f07cba328b58737147cfc172eb9f", + "0xcc3d7f9fe6946979215a901bba385a88fdabbbf4", + "0x38f80f8f76b1c44b2beefb63bb561f570fb6ddb6", + "0xd82803b7b9a5eb1d5fc558fd619afc6c031cd0b1", + "0x844aeed1b294ef9632c18e73f57ef77d0a23d0e2", + "0x9cd7d1981b3e15a2dee4d512ac60e0579ae18546", + "0xebcd250474c27cbad3c56f3f34e08f97b370ac2d", + "0xda47bdcc48f26fb4709f90316341d9104cb1fb89", + "0x5cbb6ad79008908aa125667d1300558d9253b589", + "0x1078daa844cdf1edb51e5189c8b113b80a6a6957", + "0x8341c4106523b49fc247f84e412bb2af5597038f", + "0xce57ebed9ac38402dcaa44f65a1c9b04e26b8283", + "0x2dd2036c9db2ada2739509af0047c00c8b9291ef", + "0xa77294828d42b538890fa6e97adffe9305536171", + "0x8da48e5846c06b558970acd42edc7da8799481e4", + "0x50418699cb44bfda9c9afc9b7a0b0d244d8927d2", + "0x936d69abcd9acdc89455eefaf744044ffc1ca660", + "0x90c32e6b29794fd7f5bba2bbee74e924078b3f9b", + "0x362b7e0599e950b921ca9d86336ca409208ffdec", + "0xd98ad1fd4aa0e1c876d91968d1385aa9e1aa98df", + "0xd2602c7bdfc9f413974e944280bbfae275d1b1b6", + "0x731a2e51ebfaebacf8477e992cdeb1e8eacf519c", + "0x072d63796c4fe69b306a23e1d01156d51f7b3e16", + "0x051010142a0b9de7f0fd8fb31d085407287f6381", + "0x8498843f6d9046f7b59482978e152d61869203bc", + "0xb48ef8e4e7bef79ddf64d4424151f003a59bfbfb", + "0xb423a138fd171c28d90a5883a01ec92ff3d63609", + "0xafa3a2528e8baad576a83ffc52db9f100debe307", + "0x055fda7eb509cc338c898b0f698b7624387ab813", + "0x0b3bd83e857997b370fadc8504fb712244f6786c", + "0x8d12a71cb933a4222d42fecbb4ba9c15e455305b", + "0xdef3d19ff35a42f5b8e3c706c8fd287de72e6d15", + "0x19a2bc678785bad6a947a87494d480dad57711c6", + "0x2c3e79d3dce90fb0886c89ec602e61757e589a94", + "0xe8aa836a597a66724d678860d105561c13e95bfa", + "0x3352a3277d2b74a773fa6e68a625fcb18e4fc282", + "0x2df292af809fd693d94c7d17e36be352e15bb98a", + "0x269aa10398aaa695259c3e8211ab27a15004110c", + "0x02d9c84a495986b8b3c3347ad16849dcb1b9793e", + "0x8fda1daa6a674c1726d1896e3054b9a82d123f12", + "0x1021e61f2cdd8bb295b0e64a20ebb7d8ec3734bf", + "0x58d7d9c971a613117e493062bec1a6a5484f2780", + "0x2bb96f44b9709b02189a50b377755edc30bc65c7", + "0x7be20b02095944657275ed608615a39931d783f2", + "0x4aa51a723882ee676fec444d4561c5ee16c339e9", + "0x1b243d42f53924118646efaec5b3f6116b563960", + "0x01b7348ec3fb20ab1f40b97cc82df44aed360768", + "0xbf4c0104dbfb028f3484cfac17bb22aa15e5c7e2", + "0xcc3b817d4aba7698eaafb4c68e7688cf61b0bf46", + "0x572e1b86471c900cd16afa9cbb7701862d0e70cb", + "0x602ac8c3f61b351be325feeb58842ef557431c2e", + "0x8d0cd1ab81eada4f92c7cb5c8dbc25c69cc296ad", + "0xae2c7ab762317db453317b70f1f40145755fafb7", + "0x7bdae9aabe238188c4882d48a3aee21288a38ed0", + "0x96e4152f00894f677d860023b9784d578bc1c145", + "0xf572c9b11e757d3580c7c7310630cd488e8ea736", + "0x3769092dbfa6eb34434fb5b7cf0eb06e710728f3", + "0xca72c93172ba6eff168e59e7f17c3c7a8fea9b62", + "0x7fc80fad32ec41fd5cfcc14eee9c31953b6b4a8b", + "0x5d36a202687fd6bd0f670545334bf0b4827cc1e2", + "0xe64113140960528f6af928d7ca4f45d192286a7a", + "0xf6b6f07862a02c85628b3a9688beae07fea9c863", + "0xd779afee481e3df5cd0544f0e4353cf534fd99db", + "0x183bdb344a07ee3d27f07ac4799a56e4a2fe5439", + "0xa8cadc2268b01395f8573682fb9dd00bd582e8a0", + "0x75535661ab25a468dfb3137320a7568fecda4832", + "0xd37ed782323a82e5bd55a92500e48ff5efcc415e", + "0x03bb5bc3c8fdab212a6b2b347a049133dfcb3a47", + "0x61987699055394c65355f2797d3e4e589f7fabf4", + "0x2bc12061c8912505978472c21d4a23db43af62aa", + "0xad7575aefd4d64520c3269fd24eae1b0e13dbe7b", + "0x0d89421d6eec0a4385f95f410732186a2ab45077", + "0x04c0cd38b8c203b14ef2b7b8d736d69b938aff71", + "0x0cf30daf2fb962ed1d5d19c97f5f6651f3b691c1", + "0x6eeb37b9757dca963120f61c7e0e0160469a44d3", + "0x616cad18642f45d3fa5fcaad0a2d81764a9cba84", + "0xdc1d963d21c9c1bff7b6bea6e10080daa9b4fc51", + "0x8073639b11994c549eda58fc3cd7132a72aadf10", + "0xe52c39327ff7576baec3dbfef0787bd62db6d726", + "0x8f21bd39fcaea3a729d46339a383081ecb7e84e0", + "0x8fb7087336678f36e42313f6130567a109a8e73d", + "0x276e69cdd336001afef07075859a93078496c3c1", + "0x954f716e6de059360d278b773138f8e046696721", + "0x997d410b26cdd17b0750f2c1751e59cbcfae446f", + "0xe8b6b71f3b1e6d2ad406d2cf36b1f2c567342df1", + "0x83108a0653a14eaeb8301e7b10a37cfac39c82f6", + "0xf95d9549b3ab9470d306a6413aa45082e8b66043", + "0x82d92494f6fffb17a1ddffd9b7d88d1d0a360009", + "0xa19947da8b916f64ac6f362cec9001d8bcbeee93", + "0x7ef5e4062dccad29a6f8d5458590160536056c81", + "0x653d973b36137a5cb2fc304996e0af1f1afcc628", + "0x5f319ca6ecf072a4d183edaa711cd04dc225df19", + "0x4d32d90d6535bd4e7eabaa27ee72932cb214bbfa", + "0x73b9f6a6e52ace2797f0a6e52aac530ed1f2a2af", + "0xaa3600788b72863ff51c8f0db5f10bb65fbfeab4", + "0xf93f0b770784602fc3079eb1d2fb1ff488bb02b0", + "0xc8ddd59c496d04c4c060ab5038d03d661ddc2617", + "0xc42c77b6b2a2b220b9502f357bbf51334db3c93f", + "0x2615214f8200b526a7b1eace03971f2672b48cf2", + "0x9d8d7220d060fd12ca33336b7239688e366327de", + "0x9e602c1920443f01cb100a57a7f894df8eb42f66", + "0x7e651f5f597436cd0fa941f5ff2cd45ef3f2fda8", + "0x8e30dc2aef957b1f7dd67b1b7bc651ffe7e17a06", + "0x597dc4159a4b85c086c3c679a0b6c8fe2836886f", + "0x7fbde8b27d2b4f164b66f2a9dc02bbd6697e5b19", + "0xf5819cc26f0481c9b86294b4c24027518a04bd5b", + "0x8e7d20638947132b0e6e1afde2da1b103aff9280", + "0xcba711bef21496cfd66323d9aea8c8efd0f43e9d", + "0xdfbaeef21396bf205d4b7d23345155489072cf9b", + "0x3b981fa5dd50237dab6f96a417a6690b6f20fcc4", + "0x6c31212a23040998e1d1c157ace3982abdbe3154", + "0xcddf772f8a3295c89dc37510e16e360ee2d29789", + "0x002b5dfb3c71e1dc97a2e5a0a7f69f3e7b83f269", + "0xad7a185b2456d5afd85838a50c7d8ace3ab2f871", + "0x7993f18c91a9f68593d308c5846f380a2a374f46", + "0xc5d82775c9bc5272b1225db8d62b7034e064ba91", + "0x8bfcf8cb383149d4ef37e7a609cec195cdcbe099", + "0xa515f7fb260095eebc860425493b8761b4fc9abd", + "0xaa95ca26c92b0634df7a1a1504f579f13bfb7f9d", + "0xc2812325cad4c4c782cbbc1164e9373371d31db2", + "0x4831ddb6502ca45dbeedf58b47292061cdb6050b", + "0x6733c60e6e02f9c8fa221db1aea018d80d949861", + "0xcad3887923b39cd2b0b6d13538c4ecb7c5ee9825", + "0x4520cd8bc085b962ef8c0ec696ac9d3ef1d8bf55", + "0x27259b0f4209e76f8c6cf27106c9ff83bdc2e831", + "0x23ee51e614cbf138e4caba9ec5ed4ff7d27a8596", + "0x2cab4d881962d247218356b32abc4aa5c46ba0d2", + "0x1c0a032954f20761e59138fee236204becbb8bdb", + "0x701d0ecb3ba780de7b2b36789aec4493a426010a", + "0x1ec3c1f70e1d6bbdc84092ae86eaade495fddb9b", + "0xb53b0255895c4f9e3a185e484e5b674bccfbc076", + "0x770569f85346b971114e11e4bb5f7ac776673469", + "0x8289432acd5eb0214b1c2526a5edb480aa06a9ab", + "0xdca6f7cb3cf361c8df8fde119370f1b21b2fff63", + "0x117e1ebb7d05545064850513021df6ade3c1690b", + "0x7fb43c99a26a9ea8ba841d58390bf1c2996edfb0", + "0x84b5a60df2d7e3397b3a4a3c6282f090304aca26", + "0x72f434fa010929656aef58695dab85447e51fbc6", + "0xa29b0d2f3b4555359a1bf684d700753b1b06cbc4", + "0x4318cc449b1cbe6d64dd82e16abe58c79e076c2b", + "0x8f48282e50b0210bd7c7dd69c54205e98b9ef5d9", + "0xa305b293e44a82f3cd489b5fb26084647bb5d8ae", + "0xd9e5de13ef1dbc4dfe0ee1bb76276228b9b23d0f", + "0x4aceeb7bf9ec8104cc2379f1e8d648ee47249fcb", + "0x0743542070891051861f8d0a4550f97b43b0b89a", + "0x58ad805f26272c5ba06d24bd0e43c8a2d1c634d9", + "0xe6ed9c681967a4ea7cef4486942b800139dfb000", + "0x51b9c1df35b044b5c0099d1fd07eab7ce38f325d", + "0x55dffa17578e6bace42e4bf8687a11a85ccfef97", + "0x1fae8f99e9f932bdba910061590c2156ee512a91", + "0xa25207bb8f8ec2423e2ddf2686a0cd2048352f3e", + "0x746bb7befd31d9052bb8eba7d5dd74c9acf54c6d", + "0x38bc91aa6aa434c4fae7e666f68c859292deed95", + "0xa3ad5cfb4ff4b68e37a338da200ba441c1850b5b", + "0x4bfb2c232f70c83136a3f206cd26df2a0b605cec", + "0xf5ab6b4a8d578807491ef59ce855982990932617", + "0x1fdd220e14b59e26bf1888e8267c4c221983a0a6", + "0xe2d6aff297b41881c1aea9599f68aedfab38c651", + "0x7d547666209755fb833f9b37eebea38ebf513abb", + "0xb681b19bb1f7e9f3c2ae0edeab368c2afaa4e590", + "0x7eb84e42059f0d44269c50f4d3a280fd307a6824", + "0x84f0620a547a4d14a7987770c4f5c25d488d6335", + "0x4ae6a8a28c87b75e935a90d6128f2649c969c0d8", + "0xb79223e868871dbac27e8e301f73734abd4cc628", + "0x6f219bd1167568ab67494a9067cbbb5679bf0022", + "0x9ff548c1b3ea3dd123afe39c759dda548009b6c8", + "0x3085051f89666e7124e7ab95b693fc1e09770907", + "0x6166e1964447e0959bc7c8d543db3ab82db65044", + "0x76e059c6ff6bf9fffd5f33afdf4ab2fd511c9df4", + "0x4cc9e6fabb800f083a2685501d1a30cdabb4b2de", + "0x5f3371793285920351344a1eaaaa48d45e600652", + "0xafe2b51592b89095a4cfb18da2b5914b528f4c01", + "0xe3f4f3ad70c1190ec480554bbc3ed30285ae0610", + "0xe0d8926a51f9a1dd8e089d9a3dd88f88ffb2f1dc", + "0xa6c366d97cb64708211f24310dfad5363bc96a04", + "0xb7562f12e41c762cecda99d62bd6eac7b0c3b4c1", + "0x301605c95acbed7a1fd9c2c0deee964e2afbd0c3", + "0x5d47e5d242a8f66a6286b0a2353868875f5d6068", + "0x88f1706c20d94a4d1551c5f799c9e3380a24c3ac", + "0xfb40932271fc9db9dbf048e80697e2da4aa57250", + "0x40db8365d1252bcb06598927698238a99d39228e", + "0xacf4c2950107ef9b1c37faa1f9a866c8f0da88b9", + "0x144c4e5027b69f7798b2b162d924bcae5c149f15", + "0xeee844540644b204f0005c063ae95f244bf06a84", + "0x014607f2d6477badd9d74bf2c5d6356e29a9b957", + "0x1e8ee48d0621289297693fc98914da2efdce1477", + "0x4ada1b9d9fe28abd9585f58cfeed2169a39e1c6b", + "0x31460f49eea93ef8255b42be019fb96f89cf0c49", + "0x63a32f1595a68e811496d820680b74a5cca303c5", + "0x022ca32d31da3ef85922aafd9ad29c5b2418172c", + "0x93b109c3c279bcbbb673ed1ae1a8bb2de8eef9da", + "0x689476323eb5e9a5ded342f54b562fc2c156a522", + "0xe0144fa05a0d32b5b1de10ccee7211616b3e3ef0", + "0x6c965b656c450259a6d4d95a2e68fb4319eecbc0", + "0xe36bd8c15a83b89e2e49806d7312846069755c63", + "0x59dda36bd196ec849838ce2163e6821f946b37dc", + "0x83c98211c50480e457a0df930d2a56a891bc4d4b", + "0x11fa934f6754076aeb7cf0a72a1c2d2518aa4c77", + "0x2b888954421b424c5d3d9ce9bb67c9bd47537d12", + "0x2383a8b8cc8561a65871f1d2783b7c52e22b62c1", + "0x841ad0abab2d33520ca236a2f5d8b038addc12ba", + "0x76d2ddce6b781e66c4b184c82fbf4f94346cfb0d", + "0xf21e38ac177b48fde02db7f2ca97466ae8eae87d", + "0x7537cb0aee6a3483a7601ebf1084ed4df73166ab", + "0x5f0bd06a71e038206ef3e5090eb448e9a9773772", + "0x3c0c7b44c1f9366271f5c491121a1f7d55d33ef5", + "0xa96a437efb71baf50a59027c340fa3362ef703f7", + "0x55ba9c90c37e3206570ac9dc872c0f053d155f77", + "0xc68bba423525576c7684e7ea25e7d5f079b1361e", + "0x78e87757861185ec5e8c0ef6bf0c69fa7832df6c", + "0xcb36f8580a36788a48518dec95ea458357e64e30", + "0x25854e2a49a6cdaec7f0505b4179834509038549", + "0x639749b7b08aee65039c21d8a411103c6cebebf0", + "0xf517529866d371f04780885923f739bc17694bfb", + "0xc728dea8b2972e6e07493be8dc2f0314f7dc3e98", + "0x33f6ee932cea603fafd6854827259be172c91da4", + "0x6d97d65adff6771b31671443a6b9512104312d3d", + "0xb7babe35ce543e2cf2f615cb1c792a2025feb572", + "0x4d9e86a5ac368aa4df0473ef07e13ec2fbe04025", + "0xaa79b87dc8b046a5e4f7d03f1562d7fe5bf98737", + "0xe71fbb197bc8fd11090fa657c100d52dbb407662", + "0xf389dd1f828525b449d63d14157f2d3a25ee0a41", + "0x877b37d3e5467b4aae7687dd3480a46c8d3e16be", + "0xf9e1d1e9f22c96752356adfd377231528c7e851e", + "0x187089b33e5812310ed32a57f53b3fad0383a19d", + "0xf1659a2fd5007192314f9676e6a4a39fd1202160", + "0xfdd210ce1b829e837d9e034dae0f0312f176cef6", + "0xace1f1c6c5c89ae3fc3209ff92e7120fb74445aa", + "0x6ceb397b68059ca73049874d0a30c62500ae9877", + "0xc46c67bb7e84490d7ebdd0b8ecdaca68cf3823f4", + "0xbb2eb4c7eb36ecce7a3e6bc501590ce12c9c1050", + "0x9cf251a782ce7310d5bec0fe0a1c2b826d962545", + "0x43930ff04d18a5b59805151c1eb403c55870641e", + "0xa270f5649a42fedfe66ddb3b0b50bebae1e3ddb0", + "0xd3488ea0c1dc99a5d72f75c84004224f8b58694e", + "0x7aba691d12d8ef8793f1643eba66b69c70ec72f1", + "0x8558f502887a9a52c4b265d72327e0e529ff790d", + "0x3abdc9ed5f5de6a74cfeb42a82087c853e160e76", + "0x30c7f4f7504d6366916f669cd8e731ed4df6c702", + "0xed8db37778804a913670d9367aaf4f043aad938b", + "0xc191a29203a83eec8e846c26340f828c68835715", + "0xa32aecda752cf4ef89956e83d60c04835d4fa867", + "0x059f7da59ad1eb412b4d2ffc12e9b50da91cfdb6", + "0x85bead65c61db8cf230b3ec30552b8b3e6388570", + "0x3f87755e2974534888ddb20a52dce45ef9f204ab", + "0x757cc91ccbb88cb0d78d6798d20051d39e5a7296", + "0xf553c8223ca8542af9db7b916fe9dc7c28b73751", + "0x40f9bf922c23c43acdad71ab4425280c0ffbd697", + "0x9600e2ee6377dadad7299b120026661c336a5e6d", + "0x516fca170bfe24bfc54e01f215ef85fe9b5b798a", + "0x61c820e261717a5a0555488872f78ac7b9ce77ec", + "0xeb263241eb948cc0eb53a58bf743289d074f474f", + "0x841c11b14c428dd591093348b8afa2652c863988", + "0x3c114973c0260290c2dbd40323327d996972fceb", + "0x765a16ca391a6b9249cfa65bf2d14c38722198e3", + "0xc3268ddb8e38302763ffdc9191fcebd4c948fe1b", + "0x6b92686c40747c85809a6772d0eda8e22a77c60c", + "0xc799be8de03f20b2d3b101e6f6516d614e6ffe06", + "0x40dc654af5ce40c122ffdc679fa8e8ca8b91556a", + "0xce8d52c38d74b77a0aa361c48fdce6b220a3370e", + "0xefa4c696ea2505ec038c9ddc849b1bf817d7f69d", + "0xcf79c7eaec5bdc1a9e32d099c5d6bdf67e4cf6e8", + "0xff75e131c711e4310c045317779d39b3b4f718c4", + "0xde2be7c9c542c55a7a77489a3a7745493988947f", + "0xfeb3e0f50107f6cfb2ec8c2bc8287f2707e0e2ea", + "0x6b759bf480407d19c8903c16023c706868c29a2a", + "0x6e38911da6dd0379f1cac396f74387c95a1f0d21", + "0x5a5d9ab7b1bd978f80909503ebb828879daca9c3", + "0xe96056a9936c58e89d1703cf6bd97f134341ee44", + "0x4dd6720d2bb8721a46bdf9a528704164578e03b9", + "0xe83b9a1b9056b21a01b85162e77ad76a42a1c64b", + "0xbec48f1ccf82d8e4c983ee00ac2ec6b03b81d710", + "0xefedaf9c07e6eb56bb8f82f30018e4461b1c5f4c", + "0xb68da7fbf71383afab240839287878539cfff20b", + "0xfbddb719cc7c795a1d9b7ea7ac11494a19b3231f", + "0x07506a5f48d71fdb34d3900fb086d43ef1b58ff9", + "0xa85cdd5478b7e525a808ef9707c3e33432ce1e7f", + "0xcf7c21ded40f2df85a564207a89b3379780d9ce3", + "0xd26b76e50f6510cdd4bf45d59279705f36946d23", + "0xdb7a41e39807e8c988859f150296db92674b7dc7", + "0x719028736f10164c838ef129936779ed739312f2", + "0xabcdef0abba5d0106595174213156797bc0db33e", + "0x3d2b8879f97e413b2609f9844a5fc8db8fe4f6f8", + "0x81ebe8ee7b51741fd5dad31f6987e626a9bb8111", + "0x1d45c8fa65f6b18e7dae04b2efea332c55696daa", + "0x978eb534b26cb8749d352a2c94ec21e659e4248d", + "0xa7ca400d49bba87eb606ee05af93689bd21fab99", + "0x65ad2bf7e09af2597c140df6386a3003d0f5f8ee", + "0x835918a3fbdf946364a9aee3114173865b712663", + "0x6073cffc1d46b1ea57ba89a28074ca734acd7003", + "0x2b13d52dfd33e2ebd13232866fdf96088e77d596", + "0x55f5601357f6e0b10a3386914c93916c6c9a368a", + "0xa1d5d2d931b532a0503e97f540f65ed256f374e6", + "0x6c9258895ffbe2178b3edefe09af304a1e99bf2f", + "0x973375b099943cddfd390022cea90d4f1d0c493c", + "0x8a8c879d39a74fce0593714956bb7ed048a5c1bf", + "0x9c42b0c70d0daf1211f3aab2a1e6ec5e717de12a", + "0x81a6383041593c556d1c8e69e2749b35b5008f09", + "0xf41b98a4c32bb61468c8001e0c69ef64ce6dea57", + "0x8fae81bb674c89ccde35a386587333d074b57786", + "0xa8258ed271bb9be9d7e16c5818e45ef6f2577d92", + "0x2ccbbc4c10f5d807fdd447219b57d0b883a28dc8", + "0x1bbeac736875c5043486a8a4374e6b5616ec8883", + "0x95add3dfef3ae0a832607dc71c4a9c6a6c2d7eb7", + "0x744c6eed427af293b0106b46700fddd3c9f62eef", + "0x743ec55fc166d24d2fd0211fb6ce53926d0ff3b1", + "0xdd03d2434c02c6bffb097b7130528f9568b6c70d", + "0x97c12efa574923e3ee445370d2de432332857110", + "0xb69951a0642b55cd5731535ed5b290fa49d3454a", + "0xba56878729540404de2aa14561b451ae2350744a", + "0x8d247f4fbbe81429d3d164a5c9ae0063210edbdc", + "0x850a146d7478daaa98fc26fd85e6a24e50846a9d", + "0xfe1552da65facaac5b50b73ceda4c993e16d4694", + "0x9705fe3586a7d768fee061aafe9384b1d4b8f2d8", + "0x5554672e67ba866b9861701d0e0494ab324ad19a", + "0xacc5c1e73d70f7f9622de2d574885ce8e6981033", + "0xbe9e7b0ed19526544b55b697107231f9467a805f", + "0x172dbab6f5e62a1fe7e2ba5ea1624adb33e0aa14", + "0x96725fa2f9a0b5baf80fc36c20c2ca79d86424ed", + "0xa392ccadabff735dbff69dc93d7c13f34a30611b", + "0xebf0e04e47f726d0f44801dfec5e705adcd6694b", + "0xc0891e8fcea09680bfe9170809fad1bcca10b96b", + "0xa21000e7a5a2a2bd9329428a859f9d7dce0f0961", + "0x9a387307f7508de113092bafc5cb4b3ae0706521", + "0xba719e0197470a790726075fd98edef04e2467af", + "0xda08be028304db1a73a13bce7c943127c2e393db", + "0xfb4a965a35603010feacc648ca022cb6a12d33f5", + "0x3aa73ed90e9f0ced87ff99cb60ca79019279e6ce", + "0x150bb505a9259b0be44ffb15415c79199e83c445", + "0x2fcd65d9c8078644adcf1cb0cd70a1b61f3f9c5b", + "0x73006c818880d07dd510e165c3de3e74f2407187", + "0x747e6abc102222f1df65c662540ddf471241a644", + "0xeeee5d271a56aa09c4f8862af514add3e882857c", + "0x98ad82ab467bc8c70e0cc183a5826d903751b7d8", + "0x848e313d4b25bc0b48cafdb6a72391e892e6a247", + "0x0025ab2d69f6c2c3ffac32ab6a16e18c807518b8", + "0x2efe744ecc4f6bd55538da57d09dae895c95b223", + "0xbc6d82d8d6632938394905bb0217ad9c673015d1", + "0xe1555c6ee61366a3f90135dc704acd25c3247aca", + "0x2f51e78ff8aec6a941c4ceeeb26b4a1f03737c50", + "0x0b924785d2bbbc8834cbd5fc63d10543ff799d4d", + "0xa50064d462e17f7091ee62baebeb18bfebe21507", + "0x6ead98ac60771343a361cf7558e8493b32fc8304", + "0x433485b5951f250cefdcbf197cb0f60fdbe55513", + "0x6dd6934452eb4e6d87b9c874ae0ef83ec3bd5803", + "0x29e1a61fccd40408f489336993e798d14d57d77f", + "0xfa7448891b9a58a7f71cc2aee436690ae1bfdb68", + "0x29185eb8cfd22aa719529217bfbade61677e0ad2", + "0x73bea65145f19702da07d8908e994a193b5855a1", + "0x140d3f60ac840571a3e08e218b823094d4715564", + "0x82cb2305388c853ecfe9ea83a1604acf58466659", + "0xb13a55d8512aec4bf7b15067d733c4c3c68f2439", + "0x2842decf9baeb5ec76988d1261325329848522ae", + "0x5fe4326d06d901886d9a11e6a7134f5c9707f0ad", + "0xa8f0048a0d1a04663ca5010d0beac5bcaeea0eef", + "0x6d465d2081b799770d0ce7e755d8db1665903ffb", + "0x837667c7c5cb49609ed5bfa5d3b2f1bbae81d8ba", + "0x77fb4fa1aba92576942ad34bc47834059b84e693", + "0xf31263051c09bcc2853dac78185e1e5c59f4ee56", + "0x3fad8bcd2aea732d02a203c156b19205253f2a06", + "0x09b43a8fdadddade8e75c18a20a6fc0dbe4a1f68", + "0x7e475a846af78e49aa56f05706530bc5ebe58ea8", + "0x38b826a4426a0d4d9b4377ac57c9af0308281c5d", + "0x84e1056ed1b76fb03b43e924ef98833dba394b2b", + "0xd0ccfeef904cce8e0c70014db37e5133a6a8aa1c", + "0x5c7291e18c3ecf30e14ccf1dcd646c0ca3309113", + "0x2dbfd11c5073095670e0eec58e8d2313fac9e494", + "0xfd37f4625ca5816157d55a5b3f7dd8dd5f8a0c2f", + "0x2d4ac9c27fffcd87d7fa2619f537c7eb0db96fb7", + "0x9e6cdaff95f4bb1a21ce2f81f7655e2aac53840a", + "0x9dcba70b2dfe5807e2a847e065ebb666791f8b8a", + "0xff6d6a7718a234a84f740480dbb07f6c09cf1cd5", + "0x69dc230b06a15796e3f42baf706e0e55d4d5eaa1", + "0x535b3fc92c40823b5b28df471491f6b5dd5fc4e8", + "0x2d122fef1613e82c0c90f443b59e54468e16525c", + "0x5ff677061159e4d0ae380607c2572e7a0e4f0d75", + "0x865528d9897d990cffca5fd1c90f0cab919c9794", + "0x6bd6109fb3bf59f67c86cab3bc09adb8b77485b7", + "0x6c05ecd97c3a2b1e15f832093aa15efb7e9924fb", + "0x867adfebee5dc35c8353cd1475a9ba92f819c10b", + "0x9f4fbbbcbe8b8e90449dec9032bd5cce65bb52e5", + "0xf449ae59575b9f2d276a532da9e835ecd1d33a42", + "0x1b13d62de363e964ce8a9981f58dd293c005e2b4", + "0x2c053707f844bdd9167d20a385641f5d55b42a70", + "0x6ba54cf6b626f1108a2f6c16767f8397060022c0", + "0xe02e99b7c9094a04c5571c07320b9fcf85a5e4c4", + "0xe040fbff9d04bd20a0c76fe44b046d170348e2e8", + "0xdeda35dfaf6e2b26d6fb9c92037bd86f9ed3bf21", + "0x72578e136e72a18a832be6762230a820f514d180", + "0x591a406cfa71bb26935ed8a644d108f0cc3d94b4", + "0x3a37cc1096865987546d237f42e18737acdeb2c8", + "0xbecb225ed2f25c5973f5b2c8455aef2491177ee5", + "0x899eb407e36965d58f300e1435e262281909f7be", + "0xb19ca68eefd8378e34329d5f31b855f808820890", + "0x26cc56986a3f0f278536194b868ba88be1c8e8ca", + "0xd67b7c3ba9304ac3f80654b8bb95895a9d0a8ebd", + "0x0d72724bf16877bd814b8ec52b2b65a4a385d7fe", + "0xd700b177296cdbbf3d404147fe3dac3900370a0a", + "0x13f823967682151bee6e571adf8363dc41274d0d", + "0x038a4e7c11193ebdf6fe574bd9ecf6989c8beafe", + "0x5fdce124662b8fa60f2a6852939ccc997f9d8e60", + "0x6e72dd10375c221d1be5a71bee11cf1c7105ec7c", + "0xf1b915f886efe71e1574da2c0c3fcd79fae5035b", + "0xcb0424775ce3f6d1cd15d5622085cc7e7e47ff76", + "0xe1896d5e7547d63e79861d53a3dacb066769dfb1", + "0xa8e5d871de077d625cfaea1a5d163389fa091e1b", + "0x93082bfea9424363861ab35110ab65b8a5dfe9df", + "0x7a129f1b0550e6dc115dda6428003adf9bc7bf90", + "0x7a122100f101e8819b23f237d62a3bb7480a6ad0", + "0x2fe31177bbbf34f9b80be48b4dc56b1eb88192ad", + "0x707e2302149294584f570d53c666d3008d39d24e", + "0xdc1fc1361efc9efef65ff81ff3acadd421a577e1", + "0xa85de57d5f22560e7c98012bfb8604af20f35933", + "0xb76bc3ad9c150cc6f83984d02ab8e42225e4d0c2", + "0x98f1bda2d45ffaca73fcf2154e9e007871e14934", + "0x90d3c980149ccbd039292ceee75b3186da05c998", + "0xb335d18843137b21db0c9ebc23e7ed9f0d33f14d", + "0x38a02b64ccd5b157062cd2bad9ecd7f85d0b8480", + "0x61c4a9107de33e75ed6fe29550ae2cc29ced2264", + "0x20e903db0a973f6d400e227d7fb7708d45fd5577", + "0x25a411f95ad3b558a783f6730e7c7d8e297b0fee", + "0x1c0accc24e1549125b5b3c14d999d3a496afbdb1", + "0x282d656a9d95c64522f6bc1a42ee759de81e8dc0", + "0x57af2c4249761f4b266dbd80fe44061faf4780c3", + "0x2387c1d431afc94600b1d7262ad90eb61a25a6e8", + "0xb9479331df573d6bca8b924f48e8cacb84664ce7", + "0xf04aebaa5c9e6ab7f2ae303f76504e00e7ed43cf", + "0x2937d75b326bae98fd823f3e5e4ea01fe9de37e3", + "0x0276dece5594a6db72e044c85488519a18f9e462", + "0x6710287cee1a9d1a00251fdc9a12795ec7a86189", + "0x9ae8912ea6562957043c8d048641aa9b450c397f", + "0x300da191248a500b2174aed992d6697bf97f9139", + "0x2d240c5d58a8445e99dadf3fd41a492dfeaf7e4c", + "0x42e0793e4f029557d4c16a05ae0d989a173ec6aa", + "0x18b54c6c9960bd16b1f7568ae9f39143c2d3390c", + "0x3bfb159c76833bc019e7c93708f26f318ad61504", + "0x2a87c1345024ab463acc26417124c433b3069fdd", + "0xd8b41b798a7ce8d30cbc87f007ecb95e1d3c876c", + "0xa831d11c0c280b118c5f44b192a327cf64d9ee91", + "0xa13ac077544dfd51193f8b15641a0c7a3e0286b7", + "0x93e4297ea2b1368274ef91aabb900debfd915d7e", + "0x0bf61023640b5ffa269ebaba895cc3662793a4c9", + "0x3e6c23cdaa52b1b6621dbb30c367d16ace21f760", + "0xe5adabbd71225e8074e30ff6ce2a66c9319c071b", + "0xd11256d99f8833bee0b99203ddcfe4cd6c823d8d", + "0x7f96a6269b00c56cdc319721be80bf8c290324a5", + "0xd1da06878d2817a358498c384418417a752dfa68", + "0x072001b736b049934eb1e66bcbbc281d010fe7b6", + "0x8d4c0ebb98b259f40f783924a78c1b1affde200e", + "0xee549cc0a0ab1aeea4bb326a1de9fd1684dd83b6", + "0x4d5b28d08e8c00e041053b0dc584e00e6997daa3", + "0x72337d25034d5a27fc10dce0c893fd29c1301d5b", + "0x65c20b3e50fc7575fdea5a76f99a2c4140155531", + "0x58f7ff14700a754a652b3e6f5edcb51e617c4e86", + "0xf40cca17034fa8a698bc5fa7e7a5caf0b298452f", + "0xbe4cf8e9d23cd50cdc3d56e6d6fcb75bfbbd2f67", + "0xacd59e854adf632d2322404198624f757c868c97", + "0x9ced5f42f2f8fec2eddc7fbb360ee17ffd6bdc21", + "0x1e8c64fd8f94da1d0e23853118b7f73a7b467209", + "0x00a66045ccc58a3e79999d6de0f49809c577ed3c", + "0x2aa64e6d80390f5c017f0313cb908051be2fd35e", + "0x3f649dbfafbe454940b8a82c5058b8d176dd3871", + "0x7d85fcbb505d48e6176483733b62b51704e0bf95", + "0xfe6afe37c8563c653bacd30924d2251ea5bb9740", + "0xb2206f941a5206b55bfa33e665687523a8bced80", + "0x5b0ffbe6218a68208ee61bbc1282c2637f0bca16", + "0xf11704511975cc5908f6dbd89be922f5c86c1055", + "0xf9903c5d11e8f4bfebcf02747d53319e9c4a10c6", + "0xc8d92326bd4dd3bb1d4eae8355fca6833d64ea80", + "0xfbd39c29dbbbe1f3e563e2a8233262c29040efef", + "0xd74e6428cb1c29cd6ef8ce4da4932f47e88a0946", + "0x5bb73e04b810527b14b87c37eff3d62481f2d416", + "0xbd56efc637f8cb7133e304b3f929df9a6fa35468", + "0x488abaa18b5af3f24e9d69ca0eb3d6fd6ae4fbf1", + "0xaca2f322d69e07993e073c8730180fb139ca4446", + "0xb3313b023e68cda95d7b625200e1b0fe6335a0c2", + "0x778549eb292ac98a96a05e122967f22efa003707", + "0xcb77e0c9ca70c750fbe49c44f094e1f2dd4f599c", + "0x74d5c70117e9ea382b199c140ee0f05fbf9defd0", + "0x99272db5353e13c18b711d99d3a8f36ba459f747", + "0x3566f9562d1bc28df6c5dc744ab40ef11c56e4a5", + "0xef8df6d246cc9802ebf5afd55e77df152497fd7f", + "0x64bf8d9a93a5642ca93d98b5db88b2cc953c8426", + "0x5a6a84fb9063af1d83d0ac4809697a40715a1530", + "0xa9a3266f73d629c19189f461ac8ca42801b2288c", + "0xd5df3f5022572f461459fc62dbbfaa54191fc551", + "0xc971c4e2c7c2eac9a8358f6b9c3b923a93009f8f", + "0xb2e1462847e6244f9931915ea2294005643b4861", + "0x21339e2ce5ce1d7a19a28e774513619c0c6259da", + "0xc793ee64e6ac6239c527fd041a78a8fcaa245e4f", + "0xba6e1c26be2f8b46d9e7ab7573b99921ee81acf5", + "0x29e4c293963b6767755a84726a41d05117f16b7a", + "0x4acb075efd8540850d0a86c156e2c7778022a9ea", + "0xa5a44fafdddfd87038549fefb6c65fff8c59317e", + "0x228f308e90c36ef1acee0bec99061f9de65dbcdd", + "0xb5196c5a415d26672e9392d1fd9a37d43a9089b2", + "0x20429f7a5689c86a0f9a93124efa5cff37574dbf", + "0x5c0b7a237c91f28881afd7e0ccb1d33937ac3271", + "0x6543c99d0e073c140fd08a741c6cfdcd1449da94", + "0x770ab2db2aad19fde1ce844d159624a6476438c8", + "0x026b727b60d336806b87d60e95b6d7fad2443dd6", + "0xdbeb3b980ef88e9f5e59c8c9bb4d261d6736d0c4", + "0xc624434420f6cbe835d6358a8223b78432773ced", + "0x64c5c700e87b6485f51f096a8d06fab8084c8632", + "0x08e3f287adba42a26904919917bc7907f1f0df18", + "0x2e57674ea14fa08a6dda865dd139ce3924ab5951", + "0xcee0feb4b08bad3e86bdc3f01a5cdd9e7ca72427", + "0x2619c03753bbfebfe2a5b4b3b7ca6d1a042af9ce", + "0x8b580433568e521ad351b92b98150c0c65ce69b7", + "0x28d604a4205549ea2510d03f2addc673ded2187f", + "0xf60581c6dba9a2bd660b7a83f73705a5788158b6", + "0x1ee8e6a0e949ecab1f66636601d6f36488f16b78", + "0xc34d7c4ddeafb22f22a482a71676e00edc58790a", + "0x2812b1e084a0214cc15f0c873f60514c0902ff8a", + "0xe3dd2e59f26f9793f50183c1c405c0134b638c2d", + "0x0bb5e2eab6cb24c40392783847e23e760b8b986b", + "0x255f7d91b2dddabbe044c64840460a1b7285ad5f", + "0xb3bcaee28ecd97745737e756cf1bafed9dbca88d", + "0xe5caf4d7cbc6b80ae5fd072ab17aa4e91a5dd495", + "0xcc3cb5c01a3cdcd5eb8ebf87e2ec088147bada8a", + "0xfa2199d17b5fae567bf82a0806921a20ddffe8d8", + "0x8b577d9f981da6fc6e33de495a1465ee302f67a5", + "0x8f791f061d7f36dc07de081ad88f87d71be1585e", + "0x7a749c38f16388085e3e2356d7a074f18117d780", + "0xd2bc5cb641ae6f7a880c3dd5aee0450b5210be23", + "0xc163041d404e7657530491577665e40da84c9bd7", + "0x1375847014ba64517210cbfe185808232cf45d4a", + "0x8f51dc0791cddddce08052fff939eb7cf0c17856", + "0x9f75582d2be13b5ee454161ee394daada8b39efa", + "0x302e2a0d4291ac14aa1160504ca45a0a1f2e7a5c", + "0x11d86e90aba195ca20905ab2d3745ed9faad5a2d", + "0x4461eabec259e164ad5da873d5fc4c0e1fe8e6b5", + "0xcbd4d0241481b49158077e8833afdcaec7d9d804", + "0xdfbecc0b4aef80b96da27ab483feb0892472eac2", + "0x6c19c7ee70a280693199ffd79daa7d114bbfa898", + "0xe73a198e7c07c418d7dcfd42f5e953074abbd125", + "0x7d03c5c37f77fd01211334b9115ca108c84e8f3b", + "0xbad8bcc9eb5749829cf12189fdd5c1230d6c85e8", + "0x76a6d08b82034b397e7e09dae4377c18f132bbb8", + "0xd0bfb40f057322ff734a75cbe2f79b9e5c7e4cb3", + "0xe04885c3f1419c6e8495c33bdcf5f8387cd88846", + "0x87690be28b65f13394741c2c2be5a6bdb0505039", + "0xd26a3f686d43f2a62ba9eae2ff77e9f516d945b9", + "0x884ff907d5fb8bae239b64aa8ad18ba3f8196038", + "0xbc5b552641e5d203f0a6c230aa9dc14da7450053", + "0xca3589b6dc6b6ae9da653b82b5cf1dd2806db087", + "0xf4c6a5df9050b15a21aabccbc84ccb31fbdc0846", + "0xd6b97e042d03edbdc100eb55fbe43eb75f2e3036", + "0x2c8467da8b7b3d0a7e3886f6cb6697c49571ff66", + "0xd9bb77e8a0095ba2b3c5649d21ea91221e010abc", + "0x1d3bf13f8f7a83390d03db5e23a950778e1d1309", + "0xd662fa474c0a1346a26374bb4581d1f6d3fb2d94", + "0xd714dd60e22bbb1cbafd0e40de5cfa7bbdd3f3c8", + "0x1df428833f2c9fb1ef098754e5d710432450d706", + "0xcf61ebd3613684a53e48ee85d8fbc80c5156c479", + "0x67243d6c3c3bdc2f59d2f74ba1949a02973a529d", + "0x03f11c7a45ba8219c87f312eecb07287c2095302", + "0x0cb27e883e207905ad2a94f9b6ef0c7a99223c37", + "0x7b8b83e68c73aa4f00e6ed1a505de15147ad5764", + "0x83ab8e31df35aa3281d630529c6f4bf5ac7f7abf", + "0xff16d64179a02d6a56a1183a28f1d6293646e2dd", + "0xced608aa29bb92185d9b6340adcbfa263dae075b", + "0x1c9f765c579f94f6502acd9fc356171d85a1f8d0", + "0x05a1ff0a32bc24265bcb39499d0c5d9a6cb2011c", + "0xd1e19c472bf71fcb1016705d2d4cda041bbf0a06", + "0x303a6b190768f91c5823d24c267fe1778ac6c56a", + "0x516cafd745ec780d20f61c0d71fe258ea765222d", + "0x7136fbddd4dffa2369a9283b6e90a040318011ca", + "0xe4b420f15d6d878dcd0df7120ac0fc1509ee9cab", + "0x843a3c4ed93fb1f1335d5d174745551468106715", + "0x4286d9da0d8085b8a7a34fa49a87b900845cc2f8", + "0x84674aa65cc7734f12b690ce46aec1027b434211", + "0xd705eab54190c7943115607f2b7573e115a413a0", + "0x644b63e356291d549ceae65c8be6fe2f9ad7dcd6", + "0xaa163c47065c22d17ed1c47e3e244337d2056c17", + "0x7e1b9a73a1deaa3fdfaf80a3c3a545936d79eda5", + "0xf145929a2f094840a797851cd306ae70c2b51986", + "0x6379828b3c5acdc2badc6bbca10357fb0e36aeab", + "0x438615976c27b2b44f57ced3ac73b5ac113b8730", + "0xf54f4815f62ccc360963329789d62d3497a121ae", + "0x4fd6b3204a6ab48978018b25821682f090840333", + "0xe31bc121ef5b129a01b0f22ed2b214122c4abb3e", + "0x4e934aa13be79944e5cb53257c41a3798ad221c8", + "0x4339769e5d64228a063a19ea5244633caeeccdaf", + "0x2dcd860489cd099fb966d1729f890b8c5c997908", + "0xd90a9ab5fee2c5d3d4cd1fd508ac6e1b88c7315e", + "0x6f95e0fe96c1cfb979dc5c6528d4c50b13c9f52c", + "0x9bdf2c3bb976a6072dd287dac8e762e4c7760ef8", + "0x19b4effb433abacca77e79c7e7b3a33cc2996c5c", + "0x6d92b4284e31a0e30bceecab483e058a0089a29f", + "0xc003a79dc66c11e2567f8ae8493116abed6a67a0", + "0x4638349a09683bcebfc3c62c3dbe41b4b70e407b", + "0x47887e3695cae28f028772082d88598cd07bef12", + "0xd592d65f52db0323a93a929462a0f63b540cb324", + "0xa25211b64d041f690c0c818183e32f28ba9647dd", + "0x7650c86ba29782182e4b111f8daa8de8a3c8e22d", + "0x06582c5cd9ebe65982850f506bc9acb9b252e478", + "0xb548e7b80d321cc904cd8a2d9f774c59d96d83f7", + "0xcb3af325e2d0bafc3f082dcc6501f0140f4315ce", + "0x4c71f7b3e2f5140e933420b65459430c6eb368dc", + "0x2afba221c12c35cb25a27966dbd5e3770e6194e5", + "0x75de9f13184a3dd1cf32843fe2db973e275b035e", + "0x595c51223860baf322837269d69dc76016c6eb1d", + "0xb067c8705d9b59fcc73b3abd11d3aed36172aee3", + "0xdd31db93082a3a71b98d37ba26230f8734bd63c3", + "0x0ea26051f7657d59418da186137141cea90d0652", + "0xa906c85b7e809b79c5e69d485693b44d65b1b252", + "0x22300aadf0cce33a4b993e5d2a1bb24409bab8e1", + "0xc2fb4b3ea53e10c88d193e709a81c4dc7aec902e", + "0x86213f1cf0a501857b70df35c1cb3c2ecf112844", + "0x7899d9b1181cbb427b0b1be0684c096c260f7474", + "0x6ab7b4550698fe1af0c7cd9c1ed69eb383c48257", + "0xa31895c358d899030a1eb78feaadf28c8000cf47", + "0x03d8ac6b92aac24549eb583b969d93bc49f9ddb3", + "0x6718c0b9061159823440abf4635707b2ed8e5ca8", + "0xc78a95019c52ad9856aa764d6908e88d5b7930ee", + "0x2b88fd6240e0ce71e3048b612088e76ab8d7d634", + "0xc8b0d32bc09fb11c12c82582825c1e6b624822b8", + "0xb749a586080436e616f097f193ba9cb6a25e7ea6", + "0xa9d20b435a85faaa002f32d66f7d21564130e9cf", + "0xf3ad97364bccc3ea0582ede58c363888f8c4ec85", + "0x63c3329720b993dec8af0018fb083dcba94e49e5", + "0x99c9bc20d9f57a0c19136e10987fb234abdf3a5c", + "0x7986debcbc2709435461cbe6e0d73f62c19bfa95", + "0x5833869fdeb4d371b854d7474f5f84b43320fd05", + "0x01242a2e4f27b42d564d3668a58d98baa751b3ce", + "0x986e92868a27548a31e88f7692e746cd7e86f39a", + "0xaeb99a255c3a243ab3e4f654041e9bf5340cf313", + "0x8270a0febba70899419e76a98bf2b5dc15fe2ff4", + "0x0d0c0941e2578da2b9e2ad03619615f7eebc48f7", + "0x7c1e9430655963129a0b6edecd8398c06429209f", + "0x48e206fd64ddbb9714be058ca6ea6f1479515624", + "0xe7a8dea3c2521a883d01e1b714b4480e64322462", + "0x8bb2884ee943111aa5119a36b30085a15a66c972", + "0x2399a1758afd2e061134b78ad1965e4204dbc0b8", + "0x4059f3c0064cd380276de8dbab6935005535eed6", + "0x7df96b926f4e321a2358bb8d9ecaba88fe7ff9d5", + "0x9eca7b82e857e92b05b6c7d904e5a26b4b020687", + "0xfe324b463ba927af7d08c34fd4abbd267b133ef0", + "0x21fa7f8238a84565dafc7681eda644009ca15ae7", + "0x092cff73c77a9de794d25b0088ded0e430733dbb", + "0x0a10998913b2e1786b7d0e376611781b28387cc4", + "0xd388aa414e0788f5d27fb8f2cc3f1dadd7b3b507", + "0x3bb9ef68c0e8a291f7730bb6da37ad682331f380", + "0xd164572b07a7a022facd4b0a63a72c9280ad78e2", + "0x63c3774531ef83631111fe2cf01520fb3f5a68f7", + "0x51f956b281b282fceb2635f295200157a22b920b", + "0x5c05740df496ddc881642566c431b88bdf60842e", + "0x09988e9aeb8c0b835619305abfe2ce68fea17722", + "0x54becc7560a7be76d72ed76a1f5fee6c5a2a7ab6", + "0x92ed343af03bae63a7ac938edf570084a3392742", + "0x775af9b7c214fe8792ab5f5da61a8708591d517e", + "0xb170a41f2523220a12f84f17a54bd31953d98027", + "0x461acd846b4cc249b96242f1ab7c72a39d94747c", + "0xfc9265a28f66cf4561d74a4e25d7bbd3f482b8e6", + "0x3a2fac2ab3cf4bc342910eac744cc68c8b9a69bf", + "0xc6e70206e0ab82d82933339b820feb124ec7ec5c", + "0x924657b110248cc5456562232351c49f795914c9", + "0x7bc48221928f11184b376da7a57650768dfd3332", + "0x23c0c5e0d894d006e4fe4520b6c3d91b7f9ef7ab", + "0x1e90474d2e83e7b7dd45553156beb316845e66a4", + "0x9f000bfb33b0b63fce685b538b1a8af079b57d93", + "0x99e94142353411264731105fe38ff02dfe1f3c3a", + "0xb22981ba3fe1de2325935c91a3b717168fb86714", + "0xa61ed6d962af39adda5c405ce76f625b5c3f81dd", + "0x19d8da2674e8a025154153297ea3ab918debf96d", + "0x5cc2ec9378e4fd3e5b91a6fa338edcc8edd36ff8", + "0xbd4d5116d4795fd6f785f524c4dc9f28bc5ab308", + "0x44571d865d879ba75d8eabb4a08c01cc3fc36d3f", + "0xca85460d23bfb2e0079bab5aac84921d9d0762a4", + "0xfa9b7d81a8fcebe6e0ce2938963db2ccd3cd178f", + "0x41b0b75802b25fbc14e0157f9341473843c28e1e", + "0xacdbb883880850b7528edc58ce506d10fa5205c6", + "0xd1825dd9a5e49791fb7961ac3c4170deed5710b4", + "0xde0e98f0ffb36ec69df57b8cc7ac886f506e9ae6", + "0x4ef22a7356d96dbf95a7fdead4a196a668e75b38", + "0x7d2e4d645c0acc5a6bf596b612cab351864f4090", + "0xa64f2228ccec96076c82abb903021c33859082f8", + "0xbaba775a0400a5e442335ceaa4820edb1ded8f73", + "0xd6fcd2f85fe975bb9b0f3c1b1c6802bb09d33e43", + "0xc583789751910e39fd2ddb988ad05567bcd81334", + "0x745f933c33ab89d8f8437eacf176a2c8c0dd63a0", + "0x222cf246a3d56d61030ca49f5e6ffd6c20c3dc4f", } -TIMEOUT_LIST = set() +TIMEOUT_LIST = { + "0x85c7d244c6057d42c770ad85ae198fc5f47957fc", + "0xcd0d4cdb238eec15fcf4ff9d13d5a59051e507d7", + "0xab4e4f9c9c394d72dbae834075fd4519d7290456", + "0x76b4b27b47f211448964ed2cf92f731412602700", + "0x341c2f0e48087ce4e21ef0c75cd062629f496df8", + "0x50544864a4fe04fca8401937b849b48e1e53bcd8", + "0xc9c32a8c745bb66094b8b27a74be48e84fd1a8f3", + "0xd46e61d448568d00483d4e82b822381ee62c5774", + "0x87704a8cecbbf36f3d2f785ef953ed9affc82b65", + "0xacc3d48b216eafbe0f943167c3087e7f0c642d6e", + "0xebcf41fffa0aac1dc1b1d4d7c92a7d88694c4486", + "0xd454ed303748bb5a433388f9508433ba5d507030", + "0xa231a5ae629a0f15e1c1eb3ffbf813589e206926", + "0xb7025e51a5dcca0cb1c03f66fe31f5dcffd599aa", + "0x5c0e1377edf9a8e4f0430118ae5381024186f12d", + "0x5c1389dea2c418c1c0c10ef210851942a1d67fc4", + "0xd364055a2b9df6ca96970cbd6827991d741ee66a", + "0x6c16d2ba2464fa8026f26c0d5085f163279fb8ce", + "0xdb3926b5d93057b7ee5e16b7e8bc3778a78a3521", + "0x3c861c7ed852e584c671fabed429a03afc6a5513", + "0x3bece46ea4cb308b1b8d8f50cb1728d6a4a20808", + "0x4506568e4733f3062cfa9cdb952ba7904fc7d8bb", + "0xc6e18de9930a1b90f339e09c574a4123c3eace83", + "0x1cb82ccbb3965e4df7c446b44c20f90b1c6ce9b2", + "0xb986a0263b045b45765dad38a000334c1e10b6d7", + "0xa73064a00512aa5b6b9119cb4eb3fe3229269993", + "0x175e0ed70627644c35f310288fc8d6061f75ac76", + "0x3b6cce32ba37fa5689fab313371dcf044ecef536", + "0x529dc928e67d8a43133d10769b308f1d5a629401", + "0xf1bb436c29e46b1987bc825879ffc9c34ab97f99", + "0x14ddf441721297b97a4d5aa3304fb845bc35ec56", + "0xb38877b39b1f2221d36b11a82d7bb1e05084d67b", + "0x9bf829eb2dea8109b098353e7c91629c7fc77f2a", + "0x9030352e478cb1afcdf7235f806a3a13dc963d52", + "0xea8caeb4f367844eec65fa917ce10a91ee3e69d8", + "0x8c2b3e9946f57820cb2f11b30ce8010f8a74e8ec", + "0xf2c601710cedc357b752408b7e5023b84819f953", + "0x01935087b1da357a00cbdd1010b2b9647991fcf1", + "0x7c8afbbd7239fed03aaacfaf1e4e30503e90c2d0", + "0x93f38a40e451b17be5dc88898ece26c43a75b1c8", + "0xe2e464938c866203228aca1603c77d0279bda31d", + "0xd3fd8a8c4ff9c06c796d21658c6a1fcd91b2e1bb", + "0x26fa48591030e6e93f69877986a777feb0626ee8", + "0xec3f542313ac266968ce61a2e4e33b95dbee7397", + "0xc1f5bb071de011206781c71a8eebea7ada8d0df3", + "0xa8776899d2601a59a94e3aa057af778b8647f85c", + "0x387c4cc5cf37e917d307c957eaf7e5227e1bdaaa", + "0x3bc3dfa9ac77c38bb24f4283d9189ed6387158d1", + "0xe7eac2cb20079752875bc1c498ce53a5ed025ab9", + "0x8ddb01727e1b4e870d2d5643e653b74ca552dbe8", + "0x84c9fac77e6909450a625cbf11d1be9addc62e77", + "0x44c0fb885dd9f77693b44704dc40c4e31a308eea", + "0x1ee45e962af18a7a7bf3200d561269174b7b3b1c", + "0x71d0c96d7f574d1a734f5803a8f1ae839aa7a5d4", + "0xb4c8737dd9fd2a50f201ce2494d74c2c9bca3bb5", + "0x6cab1406d2e04cc3b442f7d585a85bacfb07ac6b", + "0xadd7b1e78f0e59d96135c5240e1175d5a7dc210d", + "0xac176d9a8dbae960e7b539f4a6e16ad9003ab37a", + "0xcff9d27eba4b7ffba8e9d33fc3f894cb095b54f7", + "0x92af24fac1326517ce2e536e2afaf72419103422", + "0x0c1be517a0d9d888c6c686ef4e4b74bbe496d047", + "0xc19c63d295e19d8e3be7d4fd32b6e29105bbacba", + "0xab1c327651a974890a21d79fac2c6150d44c3d10", + "0xe04f0abe1933499ff1d075fa10738ce7aad26b1a", + "0xf7a3bc9e0962e15a0a4dd5260263cf0deea0808a", + "0x65cbb0d8dae3d9e0145ef4ed72b6e9e8367fc1af", + "0xc0373876c2cc38fc2f75f4db8bf5d973fa4d7e29", + "0x6e0ef43c2b5bda0e145033a4164d93f8d06d8538", + "0x76e10e91772c99b862ff005b7fa934322d0c3df6", + "0x9d5b61a09065622ac073fcebd8058121fc34f755", + "0xcba6f488f384be185fe2cf77915c3d7a3e9d5c57", + "0x3c01c79bf796196e1d8ccb6e486c6d246f4a48a8", + "0xb2fd1ff783e179144374d478436d6f2bb297a06a", + "0x1e3832d739cc563da1a98d0e3ff903e49baba86c", + "0x869d091c2c558810cb22a210c6a7f964898d72a1", + "0xcf544ed05e9c29c3ea3335111739e21d98945260", + "0x4ea8e77c5812e15ce572be6df0715b80a069f420", + "0x9b6f53d2bec7416722412a8d1e48aa3bae84325f", + "0x0acc85d306d141ddf6ada4622f1854422cb542e6", + "0x642c0b9eddd83dcfa735976dd1cc844c0b1204c6", + "0x10343b076e2bcac3a66dc7e72227c6591f5b7df4", + "0x7a62729d31945904deb5cdd646532e4683ed70c0", + "0xf48478f4d08387611ec93fa8b25c5e1ab80cf122", + "0x7e5f476de2886bb37ed92cec195cb9ce311bfe50", + "0x3fe4a67c56f2899c878b05af8944398bbfa85156", + "0x3afcb2b25ce7c76c15bb4c4c43780f76b6181479", + "0xcdec2c8682840d593cdb221634c16dc6aca77fe9", + "0x9052d9d9e30afa79a8445b25acfc6141b2075737", + "0xef96945175b17d7c13f5e534f6953fa94f0b7695", + "0x080b0a14d0d84cee92ad2edc8a69e494c842a6a5", + "0xd08afa644e562e1b3d6e2385fdeb67912410f04f", + "0x990b415088ad6df8db9b7ed7a561b6c9b8af5875", + "0x2fee53687906ba239602ed42cceee2ac8a4ada36", + "0x98940dd82b5e66d8ec340110d6e15be8a4086b64", + "0x8100b643fa91d7a05704913a1242b2e2c2b7fb7c", + "0x3fbcec42405391b1fb377664daa5ae7bc9ba7bf5", + "0x8c8296a0042e842cb865dffd94678c941fd24bae", + "0xf5c2087877218aa979dd0e2e5108837199af44d2", + "0x3ffd0c300fa4a021364ae7e85a7b0d3a02133f99", +} TIMEOUT_LIST_NOT_MAINNET = { - "0xdf486eeC7b89C390569194834a2f7A71da05Ee13", - "0x689f1A51c177cCE66E3AfDcA4b1DeD7721f531F9", + "0xdf486eec7b89c390569194834a2f7a71da05ee13", + "0x689f1a51c177cce66e3afdca4b1ded7721f531f9", } GUEST_LIST_STAMP_PROVIDERS = [ diff --git a/backend/app/exceptions.py b/backend/app/exceptions.py index 3318ba3167..29546003f3 100644 --- a/backend/app/exceptions.py +++ b/backend/app/exceptions.py @@ -348,6 +348,14 @@ def __init__(self): super().__init__(self.description, self.code) +class InvalidDelegationRequest(OctantException): + code = 400 + description = "Invalid delegation request" + + def __init__(self): + super().__init__(self.description, self.code) + + class InvalidAddressFormat(OctantException): code = 400 description = "Invalid address format" diff --git a/backend/app/modules/modules_factory/current.py b/backend/app/modules/modules_factory/current.py index 4e0ef5d014..7ad35cbe47 100644 --- a/backend/app/modules/modules_factory/current.py +++ b/backend/app/modules/modules_factory/current.py @@ -126,6 +126,7 @@ def create(chain_id: int) -> "CurrentServices": verifier=score_delegation_verifier, antisybil=user_antisybil_service, user_deposits_service=user_deposits, + timeout_list=timeout_list, ) multisig_signatures = OffchainMultisigSignatures( diff --git a/backend/app/modules/score_delegation/core.py b/backend/app/modules/score_delegation/core.py index b77a155308..9d6ab43cd4 100644 --- a/backend/app/modules/score_delegation/core.py +++ b/backend/app/modules/score_delegation/core.py @@ -9,6 +9,7 @@ AntisybilScoreTooLow, InvalidRecalculationRequest, InvalidDelegationForLockingAddress, + InvalidDelegationRequest, ) from app.modules.common.crypto.signature import ( encode_for_signing, @@ -53,7 +54,10 @@ def verify_score_delegation( score: float, secondary_budget: int, action: ActionType, + primary_addr: str, + timeout_list: set, ): + _verify_timeout_list(primary_addr, timeout_list) _verify_hashed_addresses(action, hashed_addresses, all_hashes) _verify_score(score) _verify_non_locking(secondary_budget) @@ -87,6 +91,11 @@ def verify_signatures(payload: ScoreDelegationPayload, action: ActionType): raise InvalidSignature(payload.secondary_addr, payload.secondary_addr_signature) +def _verify_timeout_list(primary_addr: str, timeout_list: set): + if primary_addr in timeout_list: + raise InvalidDelegationRequest() + + def _verify_hashed_addresses( action: ActionType, hashed_addresses: HashedAddresses, all_hashes: Set[str] ): diff --git a/backend/app/modules/score_delegation/service/simple_obfuscation.py b/backend/app/modules/score_delegation/service/simple_obfuscation.py index 33c7ee8550..5272e0282a 100644 --- a/backend/app/modules/score_delegation/service/simple_obfuscation.py +++ b/backend/app/modules/score_delegation/service/simple_obfuscation.py @@ -36,15 +36,30 @@ def update_antisybil_status( class SimpleObfuscationDelegationVerifier(Verifier, Model): def _verify_logic(self, context: Context, **kwargs): - hashed_addresses, action_type, score, secondary_budget = ( + ( + hashed_addresses, + action_type, + score, + secondary_budget, + primary_addr, + timeout_list, + ) = ( kwargs["hashed_addresses"], kwargs["action_type"], kwargs["score"], kwargs["secondary_budget"], + kwargs["primary_addr"], + kwargs["timeout_list"], ) get_all_delegations = database.score_delegation.get_all_delegations() core.verify_score_delegation( - hashed_addresses, get_all_delegations, score, secondary_budget, action_type + hashed_addresses, + get_all_delegations, + score, + secondary_budget, + action_type, + primary_addr, + timeout_list, ) def _verify_signature(self, _: Context, **kwargs): @@ -56,6 +71,7 @@ class SimpleObfuscationDelegation(Model): verifier: Verifier antisybil: Antisybil user_deposits_service: UserEffectiveDeposits + timeout_list: set def delegate(self, context: Context, payload: ScoreDelegationPayload): primary, secondary, both = get_hashed_addresses( @@ -98,6 +114,8 @@ def _delegation( score=score, secondary_budget=secondary_budget, action_type=action, + primary_addr=payload.primary_addr, + timeout_list=self.timeout_list, ) self.antisybil.update_antisybil_status( context, payload.primary_addr, score, expires_at, stamps diff --git a/backend/app/modules/user/antisybil/service/initial.py b/backend/app/modules/user/antisybil/service/initial.py index 7fc1f39164..d39f7ab563 100644 --- a/backend/app/modules/user/antisybil/service/initial.py +++ b/backend/app/modules/user/antisybil/service/initial.py @@ -60,6 +60,10 @@ def _retry_fetch(): expires_at = _parse_expiration_date( min([stamp["credential"]["expirationDate"] for stamp in valid_stamps]) ) + + if user_address in self.timeout_list: + score["score"] = 0.0 + return float(score["score"]), expires_at, all_stamps def update_antisybil_status( diff --git a/backend/migrations/versions/5398b1538a31_remove_existing_delegations_before_e5_s_.py b/backend/migrations/versions/5398b1538a31_remove_existing_delegations_before_e5_s_.py new file mode 100644 index 0000000000..c2e14b5938 --- /dev/null +++ b/backend/migrations/versions/5398b1538a31_remove_existing_delegations_before_e5_s_.py @@ -0,0 +1,23 @@ +"""Remove existing delegations before E5's AW + +Revision ID: 5398b1538a31 +Revises: 2060b4c232c6 +Create Date: 2024-10-11 12:58:19.806125 + +""" +from alembic import op + + +revision = "5398b1538a31" +down_revision = "2060b4c232c6" +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute("TRUNCATE TABLE score_delegation") + op.execute("TRUNCATE TABLE gitcoin_passport_stamps") + + +def downgrade(): + pass diff --git a/backend/tests/modules/modules_factory/test_modules_factory.py b/backend/tests/modules/modules_factory/test_modules_factory.py index d2439af905..282133fd8d 100644 --- a/backend/tests/modules/modules_factory/test_modules_factory.py +++ b/backend/tests/modules/modules_factory/test_modules_factory.py @@ -52,7 +52,7 @@ from app.shared.blockchain_types import ChainTypes from app.modules.user.budgets.service.upcoming import UpcomingUserBudgets from app.modules.snapshots.pending.service.simulated import SimulatedPendingSnapshots -from tests.helpers.constants import UQ_THRESHOLD_MAINNET, TIMEOUT_LIST +from app.constants import UQ_THRESHOLD_MAINNET, TIMEOUT_LIST def test_future_services_factory(): diff --git a/backend/tests/modules/score_delegation/test_score_delegation_core.py b/backend/tests/modules/score_delegation/test_score_delegation_core.py index feb6c85b22..e6396de45c 100644 --- a/backend/tests/modules/score_delegation/test_score_delegation_core.py +++ b/backend/tests/modules/score_delegation/test_score_delegation_core.py @@ -7,8 +7,13 @@ from app import exceptions from app.modules.common.delegation import hash_addresses from app.modules.score_delegation import core -from app.exceptions import InvalidDelegationForLockingAddress -from tests.helpers.constants import USER1_ADDRESS, USER2_ADDRESS, USER3_ADDRESS +from app.exceptions import InvalidDelegationForLockingAddress, InvalidDelegationRequest +from tests.helpers.constants import ( + USER1_ADDRESS, + USER2_ADDRESS, + USER3_ADDRESS, + TIMEOUT_LIST, +) def test_score_delegation_passes(): @@ -18,7 +23,13 @@ def test_score_delegation_passes(): USER1_ADDRESS, USER2_ADDRESS, "salt", "salt_primary" ) core.verify_score_delegation( - hashed_addresses, {hashed_carol}, 20, 0, core.ActionType.DELEGATION + hashed_addresses, + {hashed_carol}, + 20, + 0, + core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -27,7 +38,13 @@ def test_score_delegation_passes_when_there_are_no_other_delegations(): USER1_ADDRESS, USER2_ADDRESS, "salt", "salt_primary" ) core.verify_score_delegation( - hashed_addresses, set(), 20, 0, core.ActionType.DELEGATION + hashed_addresses, + set(), + 20, + 0, + core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -43,6 +60,25 @@ def test_score_delegation_fails_when_secondary_is_locking(): 20, BUDGET_GREATER_THAN_ZERO, core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, + ) + + +def test_score_delegation_fails_when_primary_is_timeouted(): + hashed_addresses = hash_addresses( + USER1_ADDRESS, USER2_ADDRESS, "salt", "salt_primary" + ) + TIMEOUT_LIST = {USER1_ADDRESS} + with pytest.raises(InvalidDelegationRequest): + core.verify_score_delegation( + hashed_addresses, + set(), + 20, + 100, + core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -58,6 +94,8 @@ def test_score_delegation_fails(): 20, 0, core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) with pytest.raises(exceptions.DelegationAlreadyExists): @@ -67,6 +105,8 @@ def test_score_delegation_fails(): 20, 0, core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -80,6 +120,8 @@ def test_score_recalculation_passes(): 20, 0, core.ActionType.RECALCULATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -89,7 +131,13 @@ def test_score_recalculation_fails_when_there_are_no_other_delegations(): ) with pytest.raises(exceptions.DelegationDoesNotExist): core.verify_score_delegation( - hashed_addresses, set(), 20, 0, core.ActionType.RECALCULATION + hashed_addresses, + set(), + 20, + 0, + core.ActionType.RECALCULATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -110,6 +158,8 @@ def test_score_recalculation_fails(): 20, 0, core.ActionType.RECALCULATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -120,7 +170,13 @@ def test_score_is_too_low(): with pytest.raises(exceptions.AntisybilScoreTooLow): core.verify_score_delegation( - hashed_addresses, set(), 19.9, 0, core.ActionType.DELEGATION + hashed_addresses, + set(), + 19.9, + 0, + core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -129,7 +185,13 @@ def test_score_is_sufficient(): USER1_ADDRESS, USER2_ADDRESS, "salt", "salt_primary" ) core.verify_score_delegation( - hashed_addresses, set(), 20, 0, core.ActionType.DELEGATION + hashed_addresses, + set(), + 20, + 0, + core.ActionType.DELEGATION, + USER1_ADDRESS, + TIMEOUT_LIST, ) @@ -163,16 +225,16 @@ def check(addresses): assert set() == check([ALICE, ALICE]) assert set() == check([CAROL, BOB]) assert set() == check([CAROL, ALICE]) - assert set([(BOB, ALICE)]) == check([ALICE, BOB]) - assert set([(BOB, ALICE)]) == check([BOB, ALICE]) - assert set([(BOB, ALICE)]) == check([BOB, ALICE, EVE]) - assert set([(BOB, ALICE), (EVE, CAROL)]) == check([BOB, EVE, ALICE, CAROL]) + assert {(BOB, ALICE)} == check([ALICE, BOB]) + assert {(BOB, ALICE)} == check([BOB, ALICE]) + assert {(BOB, ALICE)} == check([BOB, ALICE, EVE]) + assert {(BOB, ALICE), (EVE, CAROL)} == check([BOB, EVE, ALICE, CAROL]) start = datetime.now() - assert set([(BOB, ALICE), (EVE, CAROL), (ALICE, FRANK)]) == check( + assert {(BOB, ALICE), (EVE, CAROL), (ALICE, FRANK)} == check( [ALICE, BOB, CAROL, EVE, FRANK, HEIDI, IVAN, JUDY, MALLORY, NICK] ) finish = datetime.now() assert finish - start < timedelta(seconds=2) # check if address checksumming works as expected - assert set([(BOB, ALICE.lower())]) == check([ALICE.lower(), BOB]) + assert {(BOB, ALICE.lower())} == check([ALICE.lower(), BOB]) diff --git a/backend/tests/modules/score_delegation/test_simple_obfuscation.py b/backend/tests/modules/score_delegation/test_simple_obfuscation.py index 44c7cf9824..d9906416e4 100644 --- a/backend/tests/modules/score_delegation/test_simple_obfuscation.py +++ b/backend/tests/modules/score_delegation/test_simple_obfuscation.py @@ -14,7 +14,12 @@ SimpleObfuscationDelegationVerifier, ) from app.modules.user.deposits.service.calculated import CalculatedUserDeposits -from tests.helpers.constants import USER1_ADDRESS, USER2_ADDRESS, USER3_ADDRESS +from tests.helpers.constants import ( + USER1_ADDRESS, + USER2_ADDRESS, + USER3_ADDRESS, + TIMEOUT_LIST, +) @pytest.fixture(autouse=True) @@ -44,7 +49,10 @@ def test_delegation( ["stamp"], ) service = SimpleObfuscationDelegation( - verifier=verifier, antisybil=antisybil, user_deposits_service=user_deposits + verifier=verifier, + antisybil=antisybil, + user_deposits_service=user_deposits, + timeout_list=TIMEOUT_LIST, ) service.delegate(context, payload) @@ -70,7 +78,10 @@ def test_delegation_disabled_when_secondary_is_locking( secondary_addr_signature="0x5e7e86d5acea5cc431b8d148842e21584a7afe16b7de3b5586d20f5de97179f549726baa021dcaf6220ee5116c579df9d40375fa58d3480390289df6a088b9ec1b", ) service = SimpleObfuscationDelegation( - verifier=verifier, antisybil=antisybil, user_deposits_service=user_deposits + verifier=verifier, + antisybil=antisybil, + user_deposits_service=user_deposits, + timeout_list=TIMEOUT_LIST, ) with pytest.raises(InvalidDelegationForLockingAddress): service.delegate(context, payload) @@ -88,7 +99,10 @@ def test_disable_recalculation_when_secondary_address_is_used( ["stamp"], ) service = SimpleObfuscationDelegation( - verifier=verifier, antisybil=antisybil, user_deposits_service=user_deposits + verifier=verifier, + antisybil=antisybil, + user_deposits_service=user_deposits, + timeout_list=TIMEOUT_LIST, ) service.delegate(context, payload) @@ -120,7 +134,10 @@ def test_recalculation_when_delegation_is_not_done( ["stamp"], ) service = SimpleObfuscationDelegation( - verifier=verifier, antisybil=antisybil, user_deposits_service=user_deposits + verifier=verifier, + antisybil=antisybil, + user_deposits_service=user_deposits, + timeout_list=TIMEOUT_LIST, ) service.delegate(context, payload) diff --git a/backend/tests/modules/user/antisybil/test_antisybil.py b/backend/tests/modules/user/antisybil/test_antisybil.py index cf371ae265..a0ee32bbb4 100644 --- a/backend/tests/modules/user/antisybil/test_antisybil.py +++ b/backend/tests/modules/user/antisybil/test_antisybil.py @@ -64,42 +64,44 @@ def test_gtc_staking_stamp_nullification( assert result.score == 0.5 -def test_guest_stamp_score_bump_for_both_gp_and_octant_side_application( - patch_gitcoin_passport_issue_address_for_scoring, - patch_gitcoin_passport_fetch_score, - patch_gitcoin_passport_fetch_stamps, - mock_users_db, -): - context = get_context(4) - - service = GitcoinPassportAntisybil(timeout_list=TIMEOUT_LIST) - alice, _, _ = mock_users_db - - score, expires_at, stamps = service.fetch_antisybil_status(context, alice.address) - service.update_antisybil_status(context, alice.address, score, expires_at, stamps) - result = service.get_antisybil_status(context, alice.address) - score = result.score - assert score == 2.572 # guest list score bonus not applied - - guest_address = "0x2f51E78ff8aeC6A941C4CEeeb26B4A1f03737c50" - database.user.add_user(guest_address) - score, expires_at, stamps = service.fetch_antisybil_status(context, guest_address) - service.update_antisybil_status(context, guest_address, score, expires_at, stamps) - result = service.get_antisybil_status(context, guest_address) - score = result.score - assert (not stamps) and ( - score == 21.0 - ) # is on guest list, no stamps, applying 21 score bonus manually - - stamp_address = "0xBc6d82D8d6632938394905Bb0217Ad9c673015d1" - database.user.add_user(stamp_address) - score, expires_at, stamps = service.fetch_antisybil_status(context, stamp_address) - service.update_antisybil_status(context, stamp_address, score, expires_at, stamps) - result = service.get_antisybil_status(context, stamp_address) - score = result.score - assert (stamps) and ( - score == 22.0 - ) # is on guest list, HAS GUEST LIST STAMP, score is from fetch +# TODO - OCT-2095: Fix this test as not to rely on the GP API but mock the response +# def test_guest_stamp_score_bump_for_both_gp_and_octant_side_application( +# patch_gitcoin_passport_issue_address_for_scoring, +# patch_gitcoin_passport_fetch_score, +# patch_gitcoin_passport_fetch_stamps, +# mock_users_db, +# ): +# context = get_context(4) +# +# service = GitcoinPassportAntisybil(timeout_list=TIMEOUT_LIST) +# alice, _, _ = mock_users_db +# +# score, expires_at, stamps = service.fetch_antisybil_status(context, alice.address) +# service.update_antisybil_status(context, alice.address, score, expires_at, stamps) +# result = service.get_antisybil_status(context, alice.address) +# score = result.score +# assert score == 2.572 # guest list score bonus not applied +# +# guest_address = "0xe6ed9c681967a4ea7cef4486942b800139dfb000" +# database.user.add_user(guest_address) +# score, expires_at, stamps = service.fetch_antisybil_status(context, guest_address) +# print("YYY", score, expires_at, stamps) +# service.update_antisybil_status(context, guest_address, score, expires_at, stamps) +# result = service.get_antisybil_status(context, guest_address) +# score = result.score +# assert (not stamps) and ( +# score == 21.0 +# ) # is on guest list, no stamps, applying 21 score bonus manually +# +# stamp_address = "0xBc6d82D8d6632938394905Bb0217Ad9c673015d1" +# database.user.add_user(stamp_address) +# score, expires_at, stamps = service.fetch_antisybil_status(context, stamp_address) +# service.update_antisybil_status(context, stamp_address, score, expires_at, stamps) +# result = service.get_antisybil_status(context, stamp_address) +# score = result.score +# assert (stamps) and ( +# score == 22.0 +# ) # is on guest list, HAS GUEST LIST STAMP, score is from fetch def test_antisybil_cant_be_update_when_address_is_delegated(alice, bob): @@ -140,3 +142,21 @@ def test_antisybil_score_is_nullified_when_address_on_timeout_list( assert result.score == 0.0 assert result.is_on_timeout_list is True + + +def test_fetch_antisybil_return_0_when_address_on_timeout_list( + patch_gitcoin_passport_issue_address_for_scoring, + patch_gitcoin_passport_fetch_score, + patch_gitcoin_passport_fetch_stamps, + mock_users_db, +): + context = get_context(4) + + service = GitcoinPassportAntisybil( + timeout_list={"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"} + ) + alice, _, _ = mock_users_db + timeout_address = alice.address + score, expires_at, stamps = service.fetch_antisybil_status(context, timeout_address) + + assert score == 0.0 diff --git a/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.module.scss b/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.module.scss index 81c019bed0..7b7c63f3f9 100644 --- a/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.module.scss +++ b/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.module.scss @@ -2,6 +2,8 @@ display: flex; flex-direction: column; flex: 1; + user-select: none; + -webkit-user-select: none; .image { height: 11.1rem; @@ -13,8 +15,8 @@ margin-bottom: 0.8rem; flex: 1; display: flex; - padding: 4.8rem 1.6rem 0; - margin-top: -3.2rem; + padding: 6rem 2rem 0; + margin: -3.2rem 0 0; overflow-y: hidden; overflow-x: auto; @@ -22,6 +24,10 @@ margin: 0; padding-top: 2.4rem; } + + .barsContainer { + display: flex; + } } .details { diff --git a/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.tsx b/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.tsx index c02851514e..8a23a311aa 100644 --- a/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.tsx +++ b/client/src/components/Home/HomeGridEpochResults/EpochResults/EpochResults.tsx @@ -1,20 +1,28 @@ import cx from 'classnames'; import { maxBy } from 'lodash'; -import React, { FC, useEffect, useState } from 'react'; +import React, { FC, useEffect, useRef, useState } from 'react'; import EpochResultsBar from 'components/Home/HomeGridEpochResults/EpochResultsBar'; import EpochResultsDetails from 'components/Home/HomeGridEpochResults/EpochResultsDetails'; import Img from 'components/ui/Img'; import { EPOCH_RESULTS_BAR_ID } from 'constants/domElementsIds'; import env from 'env'; +import useMediaQuery from 'hooks/helpers/useMediaQuery'; import { ProjectIpfsWithRewards } from 'hooks/queries/useProjectsIpfsWithRewards'; import styles from './EpochResults.module.scss'; import EpochResultsProps from './types'; -const EpochResults: FC = ({ projects, isLoading }) => { +const EpochResults: FC = ({ projects, isLoading, epoch }) => { const [highlightedBarAddress, setHighlightedBarAddress] = useState(null); + const [startDraggingPageX, setStartDraggingPageX] = useState(null); + const [lastScrollLeft, setLastScrollLeft] = useState(0); + const [isScrollable, setIsScrollable] = useState(false); + const [isDragging, setIsDragging] = useState(false); + const [scrollDirection, setScrollDirection] = useState<'right' | 'left'>('right'); const { ipfsGateways } = env; + const { isMobile, isTablet, isDesktop } = useMediaQuery(); + const graphContainerRef = useRef(null); const details = projects.find(d => d.address === highlightedBarAddress); @@ -36,52 +44,186 @@ const EpochResults: FC = ({ projects, isLoading }) => { return (Number(value) / Number(maxValue)) * 100; }; + const onMouseDown = (pageX: number) => { + if (!isScrollable) { + return; + } + setStartDraggingPageX(pageX); + }; + + const onMouseMove = (pageX: number) => { + if (!isScrollable || startDraggingPageX === null || !graphContainerRef.current) { + return; + } + setIsDragging(true); + const el = graphContainerRef.current; + const maxScrollLeft = el.scrollWidth - el.clientWidth; + + const difference = pageX + lastScrollLeft - startDraggingPageX; + + if (difference > 0 && lastScrollLeft <= maxScrollLeft) { + el.scroll({ left: difference }); + } + + setScrollDirection(el.scrollLeft === maxScrollLeft ? 'left' : 'right'); + }; + useEffect(() => { - if (!highlightedBarAddress) { + if (isLoading || !graphContainerRef.current) { + return; + } + const el = graphContainerRef.current; + const isScrollableNext = el.scrollWidth > el.clientWidth; + setIsScrollable(isScrollableNext); + + if (!isScrollableNext) { return; } + const mouseUpTouchEndListener = () => { + setIsDragging(false); + setStartDraggingPageX(null); + setLastScrollLeft(graphContainerRef.current?.scrollLeft || 0); + }; + + document.addEventListener('mouseup', mouseUpTouchEndListener); + document.addEventListener('touchend', mouseUpTouchEndListener); - const listener = e => { + return () => { + document.addEventListener('mouseup', mouseUpTouchEndListener); + document.removeEventListener('touchend', mouseUpTouchEndListener); + }; + }, [isLoading, isMobile, isTablet, isDesktop]); + + useEffect(() => { + if (isLoading && projects.length) { + return; + } + + const clickListener = e => { if ( - e.target.id === EPOCH_RESULTS_BAR_ID || - e.target.parentElement.id === EPOCH_RESULTS_BAR_ID + e.target?.id === EPOCH_RESULTS_BAR_ID || + e.target.parentElement?.id === EPOCH_RESULTS_BAR_ID || + !graphContainerRef.current || + highlightedBarAddress === null || + !isScrollable ) { return; } + if (isMobile) { + if (e.detail === 2) { + setHighlightedBarAddress(null); + return; + } + + const { left, right } = graphContainerRef.current.getBoundingClientRect(); + const highlightedProjectIdx = projects.findIndex( + project => project.address === highlightedBarAddress, + ); + + if (e.pageX < left && highlightedProjectIdx > 0) { + setHighlightedBarAddress(projects[highlightedProjectIdx - 1].address); + return; + } + + if (e.pageX > right && highlightedProjectIdx < projects.length - 1) { + setHighlightedBarAddress(projects[highlightedProjectIdx + 1].address); + } + return; + } + setHighlightedBarAddress(null); }; - document.addEventListener('click', listener); + document.addEventListener('click', clickListener); + + return () => { + document.removeEventListener('click', clickListener); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isLoading, isMobile, highlightedBarAddress, isScrollable]); + + useEffect(() => { + if (isLoading || !projects.length || !graphContainerRef.current) { + return; + } + + const { width } = graphContainerRef.current.getBoundingClientRect(); + + const barWidth = isDesktop ? 16 : 8; + const barWidthWithMarginLeft = barWidth + (isDesktop ? 18 : 14); + const numberOfVisibleBars = Math.floor((width - barWidth) / barWidthWithMarginLeft); + + const idxOfActiveBarToHighlight = Math.round(numberOfVisibleBars / 2) - 1; + + const projectAddressToHighlight = + projects[ + idxOfActiveBarToHighlight > projects.length - 1 + ? projects.length - 1 + : idxOfActiveBarToHighlight + ]?.address; - return () => document.removeEventListener('click', listener); - }, [highlightedBarAddress]); + setHighlightedBarAddress(projectAddressToHighlight); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isLoading]); return (
-
+
setHighlightedBarAddress(null)} + onMouseDown={e => onMouseDown(e.pageX)} + onMouseMove={e => onMouseMove(e.pageX)} + onScroll={() => { + if (!isScrollable || !graphContainerRef.current || isDragging || isMobile) { + return; + } + const el = graphContainerRef.current; + const maxScrollLeft = el.scrollWidth - el.clientWidth; + setLastScrollLeft(el.scrollLeft); + setScrollDirection(el.scrollLeft === maxScrollLeft ? 'left' : 'right'); + }} + onTouchMove={e => { + if (!isScrollable) { + return; + } + e.stopPropagation(); + setIsDragging(true); + }} + > {isLoading ? ( ) : ( - projects.map(({ address, matchedRewards, donations, profileImageSmall, epoch }) => ( - `${element}${profileImageSmall}`)} - isHighlighted={!!(highlightedBarAddress && highlightedBarAddress === address)} - isLowlighted={!!(highlightedBarAddress && highlightedBarAddress !== address)} - onClick={setHighlightedBarAddress} - topBarHeightPercentage={getBarHeightPercentage(matchedRewards)} - /> - )) +
+ {projects.map(({ address, matchedRewards, donations, profileImageSmall }) => ( + `${element}${profileImageSmall}`)} + isDragging={isDragging} + isHighlighted={!!(highlightedBarAddress && highlightedBarAddress === address)} + isLowlighted={!!(highlightedBarAddress && highlightedBarAddress !== address)} + setHighlightedBarAddress={setHighlightedBarAddress} + topBarHeightPercentage={getBarHeightPercentage(matchedRewards)} + /> + ))} +
)}
); diff --git a/client/src/components/Home/HomeGridEpochResults/EpochResults/types.ts b/client/src/components/Home/HomeGridEpochResults/EpochResults/types.ts index 00f3c5a546..fae6bd2e05 100644 --- a/client/src/components/Home/HomeGridEpochResults/EpochResults/types.ts +++ b/client/src/components/Home/HomeGridEpochResults/EpochResults/types.ts @@ -2,6 +2,7 @@ import { ProjectIpfsWithRewards } from 'hooks/queries/useProjectsIpfsWithRewards export default interface EpochResultsProps { className?: string; + epoch: number; isLoading?: boolean; - projects: (ProjectIpfsWithRewards & { epoch: number })[]; + projects: ProjectIpfsWithRewards[]; } diff --git a/client/src/components/Home/HomeGridEpochResults/EpochResultsBar/EpochResultsBar.tsx b/client/src/components/Home/HomeGridEpochResults/EpochResultsBar/EpochResultsBar.tsx index bc41c28531..255c2ce7f5 100644 --- a/client/src/components/Home/HomeGridEpochResults/EpochResultsBar/EpochResultsBar.tsx +++ b/client/src/components/Home/HomeGridEpochResults/EpochResultsBar/EpochResultsBar.tsx @@ -1,9 +1,11 @@ import cx from 'classnames'; import { animate, AnimatePresence, motion, useInView } from 'framer-motion'; -import React, { FC, useEffect, useRef, useState } from 'react'; +import React, { FC, useEffect, useRef } from 'react'; import Img from 'components/ui/Img'; import { EPOCH_RESULTS_BAR_ID } from 'constants/domElementsIds'; +import useMediaQuery from 'hooks/helpers/useMediaQuery'; +import { ROOT_ROUTES } from 'routes/RootRoutes/routes'; import styles from './EpochResultsBar.module.scss'; import EpochResultsBarProps from './types'; @@ -12,19 +14,20 @@ const EpochResultsBar: FC = ({ address, topBarHeightPercentage, bottomBarHeightPercentage, - onClick, + setHighlightedBarAddress, isHighlighted, isLowlighted, imageSources, + epoch, + isDragging, }) => { const topBarRef = useRef(null); const bottomBarRef = useRef(null); const ref = useRef(null); + const { isMobile } = useMediaQuery(); const isInView = useInView(ref); - const [isProjectLogoVisible, setIsProjectLogoVisible] = useState(false); - useEffect(() => { if (!isInView) { return; @@ -52,13 +55,33 @@ const EpochResultsBar: FC = ({ animate={{ opacity: isLowlighted ? 0.5 : 1 }} className={cx(styles.root, topBarHeightPercentage && styles.hasValue)} id={EPOCH_RESULTS_BAR_ID} - onClick={() => topBarHeightPercentage && onClick(address)} - onMouseLeave={() => topBarHeightPercentage && setIsProjectLogoVisible(false)} - onMouseOver={() => topBarHeightPercentage && setIsProjectLogoVisible(true)} + onClick={e => { + e.stopPropagation(); + if (isDragging) { + return; + } + if (isMobile) { + setHighlightedBarAddress(address); + return; + } + window.open(`${ROOT_ROUTES.project.absolute}/${epoch}/${address}`); + }} + onMouseLeave={() => { + if (isMobile) { + return; + } + setHighlightedBarAddress(null); + }} + onMouseOver={() => { + if (isDragging || isMobile) { + return; + } + setHighlightedBarAddress(address); + }} whileHover={{ opacity: 1 }} > - {(isProjectLogoVisible || isHighlighted) && ( + {isHighlighted && ( void; + setHighlightedBarAddress: (address: string | null) => void; topBarHeightPercentage: number; } diff --git a/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.module.scss b/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.module.scss index 9b9a5a1f09..487703f0d2 100644 --- a/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.module.scss +++ b/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.module.scss @@ -7,6 +7,20 @@ background-color: $color-octant-grey6; border-radius: $border-radius-08; + .scrollInfo { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + color: $color-octant-grey5; + font-weight: $font-weight-semibold; + font-size: $font-size-12; + + .scrollInfoText { + margin: 0 0.2rem; + } + } + .loading { color: $color-octant-grey5; font-weight: $font-weight-bold; @@ -15,11 +29,11 @@ .projectName { color: $color-octant-dark; font-weight: $font-weight-bold; - width: 9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: left; + margin-right: auto; } .donations { @@ -49,16 +63,17 @@ .link { white-space: nowrap; color: $color-octant-grey5; - margin-left: auto; font-weight: $font-weight-semibold; padding: 0 1.6rem; - &:hover { - color: $color-octant-dark; - } - path { stroke: $color-octant-grey5; } + + &:hover { + path { + stroke: $color-octant-grey5; + } + } } } diff --git a/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.tsx b/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.tsx index 5dbe53530a..3192b3b334 100644 --- a/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.tsx +++ b/client/src/components/Home/HomeGridEpochResults/EpochResultsDetails/EpochResultsDetails.tsx @@ -1,25 +1,33 @@ -import React, { FC, useEffect, useState } from 'react'; +/* eslint-disable jsx-a11y/mouse-events-have-key-events */ +import React, { FC, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { useNavigate } from 'react-router-dom'; import Button from 'components/ui/Button'; import useGetValuesToDisplay, { GetValuesToDisplayProps, } from 'hooks/helpers/useGetValuesToDisplay'; import useMediaQuery from 'hooks/helpers/useMediaQuery'; -import { ROOT_ROUTES } from 'routes/RootRoutes/routes'; import styles from './EpochResultsDetails.module.scss'; import EpochResultsDetailsProps from './types'; -const EpochResultsDetails: FC = ({ details, isLoading }) => { +const EpochResultsDetails: FC = ({ + details, + isLoading, + isScrollable, + scrollDirection, + isDragging, + onMouseMove, + onMouseDown, +}) => { const { i18n, t } = useTranslation('translation', { keyPrefix: 'components.home.homeGridEpochResults', }); + const ref = useRef(null); const { isMobile } = useMediaQuery(); - const navigate = useNavigate(); const getValuesToDisplay = useGetValuesToDisplay(); const [dots, setDots] = useState(0); + const [showScrollInfo, setShowScrollInfo] = useState(false); const getValuesToDisplayCommonProps: GetValuesToDisplayProps = { cryptoCurrency: 'ethereum', @@ -53,6 +61,8 @@ const EpochResultsDetails: FC = ({ details, isLoading }).primary : null; + const isScrollInfoVisible = isDragging || showScrollInfo; + useEffect(() => { if (!isLoading) { return; @@ -73,8 +83,74 @@ const EpochResultsDetails: FC = ({ details, isLoading }; }, [isLoading]); + useEffect(() => { + if (!isMobile) { + return; + } + + const listener = e => { + if (ref.current && ref.current.contains(e.target)) { + return; + } + setShowScrollInfo(false); + }; + + document.addEventListener('click', listener); + + return () => document.removeEventListener('click', listener); + }, [isMobile]); + return ( -
+
{ + if (!isScrollable) { + return; + } + onMouseDown(e.pageX); + }} + onMouseLeave={e => { + e.stopPropagation(); + if (!isScrollable) { + return; + } + setShowScrollInfo(false); + }} + onMouseMove={e => { + if (!isScrollable) { + return; + } + onMouseMove(e.pageX); + }} + onMouseOver={e => { + e.stopPropagation(); + if (!isScrollable) { + return; + } + setShowScrollInfo(true); + }} + onTouchEnd={() => { + if (!isScrollable) { + return; + } + setShowScrollInfo(false); + }} + onTouchMove={e => { + if (!isScrollable) { + return; + } + e.stopPropagation(); + onMouseMove(e.changedTouches[0].pageX); + }} + onTouchStart={e => { + if (!isScrollable) { + return; + } + setShowScrollInfo(true); + onMouseDown(e.changedTouches[0].pageX); + }} + > {isLoading && (
{t('loadingChartData')} @@ -83,7 +159,16 @@ const EpochResultsDetails: FC = ({ details, isLoading ))}
)} - {details && ( + {isScrollInfoVisible && ( +
+ {scrollDirection === 'left' && '←'} + + {isMobile ? t('scrollInfoMobile') : t('scrollInfo')} + + {scrollDirection === 'right' && '→'} +
+ )} + {!isScrollInfoVisible && details && ( <>
{details.name}
@@ -104,9 +189,8 @@ const EpochResultsDetails: FC = ({ details, isLoading {!isMobile && (
{isDesktop && (
- {tabs.map(({ label, to, isActive, isDisabled }, index) => ( + {tabs.map(({ label, to, isActive, isDisabled }) => (
{} : () => navigate(to)} + onClick={ + isDisabled && to + ? () => {} + : () => { + if (pathname === ROOT_ROUTES.projects.absolute) { + window[WINDOW_PROJECTS_SCROLL_Y] = window.scrollY; + } + navigate(to); + } + } > {label} {isActive ? (
- +
) : null}
diff --git a/client/src/components/ui/Button/Button.tsx b/client/src/components/ui/Button/Button.tsx index 6e79e36906..03a33a64a4 100644 --- a/client/src/components/ui/Button/Button.tsx +++ b/client/src/components/ui/Button/Button.tsx @@ -31,6 +31,7 @@ const Button = ( to, type = 'button', variant = 'secondary', + onMouseOver, }: T, ref, ) => { @@ -51,6 +52,7 @@ const Button = ( Component = 'button'; Object.assign(filteredProps, { disabled: isActionDisabled, + onMouseOver, type, }); } diff --git a/client/src/components/ui/Button/types.ts b/client/src/components/ui/Button/types.ts index 4c9ebae74c..116742cf81 100644 --- a/client/src/components/ui/Button/types.ts +++ b/client/src/components/ui/Button/types.ts @@ -1,4 +1,4 @@ -import { ButtonHTMLAttributes, ReactNode } from 'react'; +import { ButtonHTMLAttributes, DOMAttributes, ReactNode } from 'react'; import { LinkProps } from 'react-router-dom'; export const BUTTON_VARIANTS = [ @@ -39,6 +39,7 @@ export default interface ButtonProps { isSmallFont?: boolean; label?: string; onClick?: (event?: Event) => void; + onMouseOver?: DOMAttributes['onMouseOver']; rel?: string; target?: '_blank' | '_self' | '_parent' | '_top'; to?: LinkProps['to']; diff --git a/client/src/locales/en/translation.json b/client/src/locales/en/translation.json index ca5e238c6f..c93e0cd3a7 100644 --- a/client/src/locales/en/translation.json +++ b/client/src/locales/en/translation.json @@ -231,7 +231,9 @@ "matchingShort": "M", "totalShort": "T", "clickToVisitProject": "Click to visit project", - "loadingChartData": "Loading chart data " + "loadingChartData": "Loading chart data ", + "scrollInfo": "Click and drag or scroll to see more projects", + "scrollInfoMobile": "Tap and drag to see more projects" } }, "settings": { diff --git a/client/src/views/ProjectView/ProjectView.tsx b/client/src/views/ProjectView/ProjectView.tsx index 3c90bc9f38..4d872e8166 100644 --- a/client/src/views/ProjectView/ProjectView.tsx +++ b/client/src/views/ProjectView/ProjectView.tsx @@ -1,6 +1,6 @@ import { AnimatePresence } from 'framer-motion'; import throttle from 'lodash/throttle'; -import React, { ReactElement, useState, useEffect, useMemo } from 'react'; +import React, { ReactElement, useState, useEffect, useMemo, useLayoutEffect } from 'react'; import { useTranslation } from 'react-i18next'; import InfiniteScroll from 'react-infinite-scroller'; import { Navigate, Route, Routes, useParams } from 'react-router-dom'; @@ -81,6 +81,10 @@ const ProjectView = (): ReactElement => { } }; + useLayoutEffect(() => { + window.scrollTo(0, 0); + }, []); + useEffect(() => { if (!projectsIpfsWithRewards.length) { return;