Skip to content

Instantly share code, notes, and snippets.

@ggrieco-tob
Last active July 7, 2023 07:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ggrieco-tob/748bca8a0d166e026ea717e225a4fbf9 to your computer and use it in GitHub Desktop.
Save ggrieco-tob/748bca8a0d166e026ea717e225a4fbf9 to your computer and use it in GitHub Desktop.
Complementary material for the "Slither: A Static Analysis Framework For Smart Contracts" paper

Requirements

These scripts requires at least, Python 3.7 and Numpy (to compute some stats) and the timeout command.

Getting started

To run the experiments:

  1. Before starting, download the large dataset of contracts from this repository to a folder named contracts:

    $ git clone https://github.com/thec00n/etherscan_verified_contracts --depth 1
    $ mv etherscan_verified_contracts/contracts .
    
  2. If you have a valid Google Cloud Platform token, you can filter the list of contracts (with source-code) using the largest number of transactions with the fetch-info.py script:

    $ ./fetch-info.py contracts contracts-most-transactions.txt
    

    Otherwise, you can use the precomputed list available in contracts-most-transactions.txt

  3. Install all the required tools

  4. To run all the different tools using 6 cores:

    $ mkdir -p results/1000-contracts-most-transactions
    $ ./run.sh 6 contracts results/1000-contracts-most-transactions -timeout 120 -filter contracts-most-transactions.txt
    
  5. Finally, to process the result and obtain some statistics:

    ./process.py results/1000-contracts-most-transactions 
    
0x8d12a197cb00d4747a1fe03395095ce2a5cc6819
0x2a0c0dbecc7e4d658f48e01e3fa353f44050c208
0x06012c8cf97bead5deae237070f9587f8e7a266d
0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0
0xf230b790e05390fc8295f4d3f60332c93bed42e2
0xa3c1e324ca1ce40db73ed6026c4a177f099b5770
0x03df4c372a29376d2c8df33a1b5f001cd8d68b0e
0xd26114cd6ee289accf82350c8d8487fedb8a0c07
0x6090a6e47849629b7245dfa1ca21d94cd15878ef
0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac
0xb1690c08e213a35ed9bab7b318de14420fb57d8c
0x74fd51a98a4a1ecbef8cc43be801cce630e260bd
0x93e682107d1e9defb0b5ee701c71707a4b2e46bc
0x1f0480a66883de97d2b054929252aae8f664c15c
0xa74476443119a942de498590fe1f2454d7d4ac0d
0xd0a6e6c54dbc68db5db3a091b171a77407ff7ccf
0xd1ceeeeee83f8bcf3bedad437202b6154e9f5405
0x8a88f04e0c905054d2f33b26bb3a46d7091a039a
0x3495ffcee09012ab7d827abf3e3b3ae428a38443
0xa15c7ebe1f07caf6bff097d8a589fb8ac49ae5b3
0xe41d2489571d322189246dafa5ebde1f4699f498
0x744d70fdbe2ba4cf95131626614a1763df805b9e
0x0e69d0a2bbb30abcb7e5cfea0e4fde19c00a8d47
0x12459c951127e0c374ff9105dda097662a027093
0xc5d105e63711398af9bbff092d4b6769c82f793d
0xd850942ef8811f2a866692a623011bde52a462c1
0x14fbca95be7e99c15cc2996c6c9d841e54b79425
0xb3775fb83f7d12a36e0475abdd1fca35c091efbe
0x8fdcc30eda7e94f1c12ce0280df6cd531e8365c5
0xb5a5f22694352c15b00323844ad545abb2b11028
0x5da8d37485b4374fc338fc1f1ea31d07eb7bedd3
0x41e5560054824ea6b0732e656e3ad64e20e94e45
0xd1ceeeefa68a6af0a5f6046132d986066c7f9426
0x57b116da40f21f91aec57329ecb763d29c1b2355
0xaa1a6e3e6ef20068f7f8d8c835d2d22fd5116444
0x4672bad527107471cb5067a887f4656d585a8a31
0x275b69aa7c8c1d648a0557656bce1c286e69a29d
0xcb97e65f07da24d46bcdd078ebebd7c6e6e3d750
0xe530441f4f73bdb6dc2fa5af7c3fc5fd551ec838
0x595832f8fc6bf59c85c527fec3740a1b7a361269
0xece701c76bd00d1c3f96410a0c69ea8dfcf5f34e
0xa52e014b3f5cc48287c2d483a3e026c32cc76e6d
0x05f4a42e251f2d52b8ed15e9fedaacfcef1fad27
0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
0xf1ca9cb74685755965c7458528a36934df52a3ef
0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d
0xfa1a856cfa3409cfa145fa4e20eb270df3eb21ab
0xa62142888aba8370742be823c1782d17a0389da1
0xf85feea2fdd81d51177f6b8f35f0e6734ce45f5f
0xe94327d07fc17907b4db788e5adf2ed424addff6
0x048717ea892f23fb0126f00640e2b18072efd9d2
0x6ea6531b603f270d23d9edd2d8279135dc5d6773
0x08f5a9235b08173b7569f83645d2c7fb55e8ccd8
0xa701122c1b67220a8b6883d03c8ad67896b12466
0xd4fa1460f537bb9085d22c7bccb5dd450ef28e3a
0x182ebf4c80b28efc45ad992ecbb9f730e31e8c7f
0x0abdace70d3790235af448c88547603b945604ea
0x7415c7bf3e2415fa9a55f1fd8b6fccf2914c39a6
0xf1def7f0e620f39531eb352fe13da6825218e7df
0xf34839b310097fcb4cf3a302dda8cc9b57501083
0xb68042de5b3da08a80c20d29aefab999d0848385
0xbb9bc244d798123fde783fcc1c72d3bb8c189413
0x4cc29dd2b01a3e0ed005c6e2deb5b3666e4c240c
0x8713d26637cf49e1b6b4a7ce57106aabc9325343
0x49592d97be49033615a7fbc02c6853e4c58eb9bc
0x3597bfd533a99c9aa083587b074434e61eb0a258
0x9d9223436ddd466fc247e9dbbd20207e640fef58
0xb63b606ac810a52cca15e44bb630fd42d8d1d83d
0x419c4db4b9e25d6db2ad9691ccb832c8d9fda05e
0xd48b633045af65ff636f3c6edd744748351e020d
0x358d12436080a01a16f711014610f8a4c2c2d233
0x1776e1f26f98b1a5df9cd347953a26dd3cb46671
0x58a4884182d9e835597f405e5f258290e46ae7c2
0x5121e348e897daef1eef23959ab290e5557cf274
0x816051e2203ca534c4336d8d6df71987fa3ae0bd
0xb7cb1c96db6b22b0d3d9536e0108d062bd488f74
0xbf2179859fc6d5bee9bf9158632dc51678a4100e
0xe7d7b37e72510309db27c460378f957b1b04bd5d
0x7e9e431a0b8c4d532c745b1043c7fa29a48d4fba
0x0cfda67b0067f1a99deb1cb80e0273a3f26d317c
0xba51ff3802aa3170ce7ac7ac001831ca3eb6eeea
0xe99ddae9181957e91b457e4c79a1b577e55a5742
0x99ea4db9ee77acd40b119bd1dc4e33e1c070b80d
0x80fb784b7ed66730e8b1dbd9820afd29931aab03
0x5af2be193a6abca9c8817001f45744777db30756
0xea5ab833aff71bd7d280f0a0bc86423d1703288a
0x4ccc3759eb48faf1c6cfadad2619e7038db6b212
0xd73be539d6b2076bab83ca6ba62dfe189abc6bbe
0x514910771af9ca656af840dff83e8264ecf986ca
0x888666ca69e0f178ded6d75b5726cee99a87d698
0x2eb86e8fc520e0f6bb5d9af08f924fe70558ab89
0x32776933663b27ebcda98b07c4958ec74c0bafb1
0xd6df5935cd03a768b7b9e92637a01b25e24cb709
0x9f89388141c632c4c6f36d1060d5f50604ee3abc
0x922105fad8153f516bcfb829f56dc097a0e1d705
0x53066cddbc0099eb6c96785d9b3df2aaeede5da3
0x4ceda7906a5ed2179785cd3a40a69ee8bc99c466
0x8f136cc8bef1fea4a7b71aa2301ff1a52f084384
0x8f3470a7388c05ee4e7af3d01d8c722b0ff52374
0x6d5cac36c1ae39f41d52393b7a425d0a610ad9f2
0x516e5436bafdc11083654de7bb9b95382d08d5de
0x3520ba6a529b2504a28eebda47d255db73966694
0x8bbf4dd0f11b3a535660fd7fcb7158daebd3a17e
0x69b148395ce0015c13e36bffbad63f49ef874e03
0x27695e09149adc738a978e9a678f99e4c39e9eb9
0x219218f117dc9348b358b8471c55a073e5e0da0b
0x9b4e2b4b13d125238aa0480dd42b4f6fc71b37cc
0xd0a4b8946cb52f0661273bfbc6fd0e0c75fc6433
0x49e033122c8300a6d5091acf667494466ee4a9d2
0x69c4bb240cf05d51eeab6985bab35527d04a8c64
0x177d39ac676ed1c67a2b268ad7f1e58826e5b0af
0x4b317864a05c91225ab8f401ec7be0aeb87e9c12
0x1a95b271b0535d15fa49932daba31ba612b52946
0x0b76544f6c413a555f309bf76260d1e02377c02a
0x228ba514309ffdf03a81a205a6d040e429d6e80c
0x72dd4b6bd852a3aa172be4d6c5a6dbec588cf131
0x88d50b466be55222019d71f9e8fae17f5f45fca1
0x4f878c0852722b0976a955d68b376e4cd4ae99e5
0xf3586684107ce0859c44aa2b2e0fb8cd8731a15a
0x355a458d555151d3b27f94227960ade1504e526a
0x4e0603e2a27a30480e5e3a4fe548e29ef12f64be
0xfb0f7189b354660e649ae14261a9fe0e8febf369
0x09678741bd50c3e74301f38fbd0136307099ae5d
0x6c8dce6d842e0d9d109dc4c69f35cf8904fc4cbf
0x11016adcb85b65a0da8d8ddc3ade69dbad6bbca4
0xf7920b0768ecb20a123fac32311d07d193381d6f
0x46b9ad944d1059450da1163511069c718f699d31
0x286bda1413a2df81731d4930ce2f862a35a609fe
0xd4c435f5b09f855c3317c8524cb1f586e42795fa
0xbab165df9455aa0f2aed1f2565520b91ddadb4c8
0xd780ae2bf04cd96e577d3d014762f831d97129d0
0x0651842ee1f973367138cd512709d81bf8a62217
0xa37adde3ba20a396338364e2ddb5e0897d11a91d
0x943ed852dadb5c3938ecdc6883718df8142de4c8
0x667088b212ce3d06a1b553a7221e1fd19000d9af
0xe25bcec5d3801ce3a794079bf94adf1b8ccd802d
0x6810e776880c02933d47db1b9fc05908e5386b96
0xb9bb08ab7e9fa0a1356bd4a39ec0ca267e03b0b3
0xf433089366899d83a9f26a773d59ec7ecf30355e
0x618e75ac90b12c6049ba3b27f5d5f8651b0037f6
0xe3818504c1b32bf1557b16c238b2e01fd3149c17
0x68d57c9a1c35f63e2c83ee8e49a64e9d70528d25
0x55d34b686aa8c04921397c5807db9ecedba00a4c
0xf3db7560e820834658b590c96234c333cd3d5e5e
0x5d65d971895edc438f465c17db6992698a52318d
0x23352036e911a22cfc692b5e2e196692658aded9
0x96a65609a7b84e8842732deb08f56c3e21ac6f8a
0x0777f76d195795268388789343068e4fcd286919
0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4
0xb70835d7822ebb9426b56543e391846c107bd32c
0xc6725ae749677f21e4d8f85f41cfb6de49b9db29
0x006bea43baa3f7a6f765f14f10a1a1b08334ef45
0x7d2624470429a4fa48f09206238749fbbb45eaa8
0x39bb259f66e1c59d5abef88375979b4d20d98022
0x9064c91e51d7021a85ad96817e1432abf6624470
0x0bb04400fae60dc378143a12bf771927e39adf6e
0x98b4ca8bd52e4ed1f28d3f30d9f567d1166c9483
0x867ffb5a3871b500f65bdfafe0136f9667deae06
0xb2f7eb1f2c37645be61d73953035360e768d81e6
0x6c6ee5e31d828de241282b9606c8e98ea48526e2
0x26c7bdd051318b48092390eabd1b69fce5080b25
0x8dd5fbce2f6a956c3022ba3663759011dd51e73e
0x08711d3b02c8758f2fb3ab4e80228418a7f8e39c
0x23a3db04432123ccdf6ef4459684329cc7c0b022
0x5c3a228510d246b78a3765c20221cbf3082b44a4
0x4f833a24e1f95d70f028921e27040ca56e09ab0b
0xb98d4c97425d9908e66e53a6fdf673acca0be986
0x70a72833d6bf7f508c8224ce59ea1ef3d0ea3a38
0x311f71389e3de68f7b2097ad02c6ad7b2dde4c71
0xbe428c3867f05dea2a89fc76a102b544eac7f772
0xe0b7927c4af23765cb51314a0e0521a9645f0e2a
0xaf30d2a7e90d7dc361c8c4585e9bb7d2f6f15bc7
0x6aba1623ea906d1164cbb007e764ebde2514a2ba
0xdf6164efd12678bf6a7d5a1ddf73c831493f6574
0x351d5ea36941861d0c03fdfb24a8c2cb106e068b
0xf6b6aa0ef0f5edc2c1c5d925477f97eaf66303e7
0x410af23334e26aa13c1f3e630bae006bdd313264
0x85e076361cc813a908ff672f9bad1541474402b2
0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6
0x48bd67ad140c9d10f94099c1cef7ab17d90ac335
0xb6f43025b29196af2dddd69b0a58afba079cd600
0x6f259637dcd74c767781e37bc6133cd6a68aa161
0x3f9c0a5773817ffaa5a1061e1e33c1d9c8888dff
0xc55a13e36d93371a5b036a21d913a31cd2804ba4
0x5136c98a80811c3f46bdda8b5c4555cfd9f812f0
0xc56b13ebbcffa67cfb7979b900b736b3fb480d78
0xf3db5fa2c66b7af3eb0c0b782510816cbe4813b8
0xcdcfc0f66c522fd086a1b725ea3c0eeb9f9e8814
0x9cfed76501ac8cf181a9d9fead5af25e2c901959
0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206
0x3cd9024168e6240b4f18b466d9bea9f8efc66004
0xaae81c0194d6459f320b70ca0cedf88e11a242ce
0xc54083e77f913a4f99e1232ae80c318ff03c9d17
0xdc30a5baf62f3ce8d7e74a272bc139fbb7a0cab4
0x4dcadd9adfd450c2ef997bb71888c2995e2d33a0
0x9a2d163ab40f88c625fd475e807bbc3556566f80
0x798f509bade66b9f20980abb0dcc024ca7afc530
0xc8ffd394421e09cb48b620dda56168171ca35ab7
0x8eb24319393716668d768dcec29356ae9cffe285
0x85429f986a5cc38f90de7b4ffa44d570eef04066
0xa33e729bf4fdeb868b534e1f20523463d9c46bee
0x0e0989b1f9b8a38983c2ba8053269ca62ec9b195
0x1ed3d2c916cab00631cce4b08a7f880d4badae94
0xba5f00a28f732f23ba946c594716496ebdc9aef5
0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009
0x5b2e4a700dfbc560061e957edec8f6eeeb74a320
0x1844b21593262668b7248d0f57a220caaba46ab9
0x80a7e048f37a50500351c204cb407766fa3bae7f
0xd6d62024d82b5bf4fe4a9e214991743d543f1673
0x63f584fa56e60e4d0fe8802b27c7e6e3b33e007f
0xcdb7ecfd3403eef3882c65b761ef9b5054890a47
0xf46f98a8f6032914921ae9cfb5aaab5083bd9376
0xc7af99fe5513eb6710e6d5f44f9989da40f27f26
0xe30a76ec9168639f09061e602924ae601d341066
0x4212fea9fec90236ecc51e41e2096b16ceb84555
0x27054b13b1b798b345b591a4d22e6562d47ea75a
0x14ddda446688b73161aa1382f4e4343353af6fc8
0x5732046a883704404f284ce41ffadd5b007fd668
0x6f6deb5db0c4994a8283a01d6cfeeb27fc3bbe9c
0x0f71b8de197a1c84d31de0f1fa7926c365f052b3
0xe36df5bb57e80629cfc28a31e5f794071c085eca
0x40395044ac3c0c57051906da938b54bd6557f212
0x528d068ae69e90c90ad090b3c2b0d18241e9e9b5
0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0
0x58aff91f5b48245bd83deeb2c7d31875f68b3f0d
0x0cf0ee63788a0849fe5297f3407f701e122cc023
0x1ebd8d3ca115451b9b6bbaa7ee2f7b0f96e49fd8
0xb91318f35bdb262e9423bc7c7c2a3a93dd93c92c
0x4a8f44be523580a11cdb20e2c7c470adf44ec9bb
0xabbbb6447b68ffd6141da77c18c7b5876ed6c5ab
0x7d3b3b1aef60bf891bc2ad3c202f791707f0645c
0xc81774fd1b51bc7e26b2bad562dcdb0a2cbebaf2
0x08b67e38b4ecc788eb0cfbab72074c374ecddbf3
0xc44948cbbaf37a4d7f1315c08972b4338080bf59
0xc5903fe72a9530e4382187f729ccc050d7e89fae
0x13f25cd52b21650caa8225c9942337d914c9b030
0x51c6a6ef1352578ff01b078313e6779b88bdcb1e
0x29536b7ca7029b5cddeb03c0451715615aca35ba
0x342156c8d3ba54abc67920d35ba1d1e67201ac9c
0x26e75307fc0c021472feb8f727839531f112f317
0xfb5a551374b656c6e39787b1d3a03feab7f3a98e
0x21ab6c9fac80c59d401b37cb43f81ea9dde7fe34
0x317572aabc73d59fc55f923750d1c51680fd28b4
0x94cb815f4b601b00b363b3177b4d8ed8e0eb7cf2
0xaf4dce16da2877f8c9e00544c93b62ac40631f16
0x701c244b988a513c945973defa05de933b23fe1d
0x05c7065d644096a4e4c3fe24af86e36de021074b
0x9899af5aa1efa90921d686212c87e70f4fbea035
0x9b11efcaaa1890f6ee52c6bb7cf8153ac5d74139
0x584b44853680ee34a0f337b712a8f66d816df151
0x8ba49452e12449240425de9895b1aa51f5f3b90d
0x62caf75a67252f7be236a7335fed1410c7434b7f
0x491c9a23db85623eed455a8efdd6aba9b911c5df
0xe4c94d45f7aef7018a5d66f44af780ec6023378e
0xe75ad3aab14e4b0df8c5da4286608dabb21bd864
0xcbcc0f036ed4788f63fc0fee32873d6a7487b908
0xfa05a73ffe78ef8f1a739473e462c54bae6567d9
0xea26c4ac16d4a5a106820bc8aee85fd0b7b2b664
0x4d3ddfee61326469a1b353920a313f226ea84314
0xfbc6336ea5319daba3a1d6fa3028fc54a9022f9a
0x5ecd84482176db90bb741ddc8c2f9ccc290e29ce
0xd2f81cd7a20d60c0d558496c7169a20968389b40
0x127cae460d6e8d039f1371f54548190efe73e756
0xa4ea687a2a7f29cf2dc66b39c68e4411c0d00c49
0x36905fc93280f52362a1cbab151f25dc46742fb5
0xf3dd3acf1662a564e15d7569fd80c105596e8846
0xdf2c7238198ad8b389666574f2d8bc411a4b7428
0x57ad67acf9bf015e4820fbd66ea1a21bed8852ec
0x7bcec0ef877533ab557add0db19f833fdc18181c
0x8d8812b72d1e4ffcec158d25f56748b7d67c1e78
0x9b20dabcec77f6289113e61893f7beefaeb1990a
0xffa93aacf49297d51e211817452839052fdfb961
0x007ac2f589eb9d4fe1cea9f46b5f4f52dab73dd4
0x53a0f816c2ba51565cdc850ac314c42cb33cbfc8
0x2d0e95bd4795d7ace0da3c0ff7b706a5970eb9d3
0xffe02ee4c69edf1b340fcad64fbd6b37a7b9e265
0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b
0x72adadb447784dd7ab1f472467750fc485e4cb2d
0xb626a5facc4de1c813f5293ec3be31979f1d1c78
0x781fb4f25d07de3f3cfe2476645e52e0c661eefc
0xaf2dc9d375d3de6535d8c8aa2096371b8d5df8fd
0x5d48aca3954d288a5fea9fc374ac48a5dbf5fa6d
0xb363a3c584b1f379c79fbf09df015da5529d4dac
0xba9d4199fab4f26efe3551d490e3821486f135ba
0xa5b46ff9a887180c8fb2d97146398ddfc5fef1cd
0xe57cf6e88505f36954e7c8e6ca9d6b645d030375
0x111111f7e9b1fe072ade438f77e1ce861c7ee4e3
0x905e337c6c8645263d3521205aa37bf4d034e745
0x9a0242b7a33dacbe40edb927834f96eb39f8fbcb
0x80bc5512561c7f85a3a9508c7df7901b370fa1df
0x8d4b2cffe2dcbbf06eaa5920401db86ca5fb8177
0xd1f1c5ff90fb6f3b0d57f5f6ad4aaf7400f4b39b
0x2e954cfc5cb4f089f5f3d7331449861249106d85
0xebbdf302c940c6bfd49c6b165f457fdb324649bc
0x8b1f49491477e0fb46a29fef53f1ea320d13c349
0x6fb3e0a217407efff7ca062d46c26e5d60a14d69
0x9d9832d1beb29cc949d75d61415fd00279f84dc2
0x9f0f1be08591ab7d990faf910b38ed5d60e4d5bf
0x1c83501478f1320977047008496dacbd60bb15ef
0x642f4be6da9d9daa9076f8d161b15a166e966069
0x017925fdb447544da8ed671b5305461cfc6c6e1d
0x10dc623fcb8a3c151875f03d442103cbf6469be6
0xc42209accc14029c1012fb5680d95fbd6036e2a0
0x4824a7b64e3966b0133f4f4ffb1b9d6beb75fff7
0x4485561db76614ff727f8e0a3ea95690b8b16022
0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f
0xf7dca20054469a1d548b20859a100b9ec6ff1f61
0xa6a840e50bcaa50da017b91a0d86b8b2d41156ee
0x1234567461d3f8db7496581774bd869c83d51c93
0xb9ab8eed48852de901c13543042204c6c569b811
0x65292eeadf1426cd2df1c4793a3d7519f253913b
0xe7775a6e9bcf904eb39da2b68c5efb4f9360e08c
0x865ec58b06bf6305b886793aa20a2da31d034e68
0xea11755ae41d889ceec39a63e6ff75a02bc1c00d
0xd99b8a7fa48e25cce83b81812220a3e03bf64e5f
0x5e6b6d9abad9093fdc861ea1600eba1b355cd940
0xe7232a9fd8bf427aa41918bc008d32290e22990e
0x2f102963f61acf1ca4badfe82057b440f2fc722c
0x519475b31653e46d20cd09f9fdcf3b12bdacb4f5
0x29880855d419c6fa0e8c7fdfd985c80f286d914e
0xda6cb58a0d0c01610a29c5a65c303e13e885887c
0xafd75caff5c1d402cbf3692e289775438df6a9f0
0x13c2fab6354d3790d8ece4f0f1a3280b4a25ad96
0xc9c4d9ec2b44b241361707679d3db0876ac10ca6
0x1dc2189b355b5f53b5fdf64d22891900b19fb5ea
0x43ee79e379e7b78d871100ed696e803e7893b644
0xe0c8087ce1a17bdd5d6c12eb52f8d7eff7791987
0x92e52a1a235d9a103d970901066ce910aacefd37
0xb3bca6f5052c7e24726b44da7403b56a8a1b98f8
0x1a7a8bd9106f2b8d977e08582dc7d24c723ab0db
0x3893b9422cd5d70a81edeffe3d5a1c6a978310bb
0x8c9b261faef3b3c2e64ab5e58e04615f8c788099
0x1fe70be734e473e5721ea57c8b5b01e6caa52686
0x39e505e1518813ab3834d57d06c22b2e5a7fb9f2
0x6531f133e6deebe7f2dce5a0441aa7ef330b4e53
0xc7029ed9eba97a096e72607f4340c34049c7af48
0xd0929d411954c47438dc1d871dd6081f5c5e149c
0x998b3b82bc9dba173990be7afb772788b5acb8bd
0x5f53f7a8075614b699baad0bc2c899f4bad8fbbf
0xa98ad92a642570b83b369c4eb70efefe638bc895
0x5f0bfe2ac3c0a34eca548d377315c2d3fe60c84f
0x1014613e2b3cbc4d575054d4982e580d9b99d7b1
0x89dd662cc0651a6f3631a617724525f2ff373b1e
0x7d2d8ad6d6c689b583fbd91f7b54c4395815de30
0xcbeaec699431857fdb4d37addbbdc20e132d4903
0xdfb410994b66778bd6cc2c82e8ffe4f7b2870006
0xf485c5e679238f9304d986bb2fc28fe3379200e5
0x57c8d5d5b87a1580fdaf996cef674bb0d7f14c98
0xd077c09a7e65c4cca490a776d5e395fb4fe7179a
0x35a69642857083ba2f30bfab735dacc7f0bac969
0xfae4ee59cdd86e3be9e8b90b53aa866327d7c090
0x8a77e40936bbc27e80e9a3f526368c967869c86d
0xc6689eb9a6d724b8d7b1d923ffd65b7005da1b62
0xddf0d0b9914d530e0b743808249d9af901f1bd01
0x3258ff5a650d2a4601c12bc3da495557ef354066
0x51db5ad35c671a87207d88fc11d593ac0c8415bd
0x1961b3331969ed52770751fc718ef530838b6dee
0x141766882733cafa9033e8707548fdcac908db22
0xfb2f26f266fb2805a387230f2aa0a331b4d96fba
0xd20bcbd56d9d551cac10a6bc2a83635bfb72f3f4
0x13f1b7fdfbe1fc66676d56483e21b1ecb40b58e2
0xdd16ec0f66e54d453e6756713e533355989040e4
0x8e1b448ec7adfc7fa35fc2e885678bd323176e34
0xddaaf4a0702a03a4505f2352a1aba001ffc344be
0x636991bf69febcdd9eb1a58e11021d33d40c5660
0x3f17dd476faf0a4855572f0b6ed5115d9bba22ad
0x9af839687f6c94542ac5ece2e317daae355493a1
0xa5fd1a791c4dfcaacc963d4f73c6ae5824149ea7
0x399f9a95305114efacb91d1d6c02cbe234dd36af
0x1410434b0346f5be678d0fb554e5c7ab620f8f4a
0x700f5b6fbef95f3fbd4f50233e6d05d4eab6dd03
0xc5f5d88c6d39828cdb5e1150a13125e98b26b65e
0xf278c1ca969095ffddded020290cf8b5c424ace2
0x3ad2bfea535bf1673f22de61b19f758a2dd0efff
0xaaaf91d9b90df800df4f55c205fd6989c977e73a
0xea38eaa3c86c8f9b751533ba2e562deb9acded40
0x4d2c05109a1309c6de0d3b7f06f397c9c41b8fae
0x4270bb238f6dd8b1c3ca01f96ca65b2647c06d3c
0x423b5f62b328d0d6d44870f4eee316befa0b2df5
0xf1dd5964eabcc6e86230fa6f222677cfdaaf9f0e
0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
0xc528c28fec0a90c083328bc45f587ee215760a0f
0x1b793e49237758dbd8b752afc9eb4b329d5da016
0x168296bb09e24a88805cb9c33356536b980d3fc5
0x226bb599a12c826476e3a771454697ea52e9e220
0x10086399dd8c1e3de736724af52587a2044c9fa2
0x6dfe212d1461014be1781b0be710dda1c036d8ef
0xc0e0c1dba795bfe7c4aa302a189423460cca57ad
0x107c4504cd79c5d2696ea0030a8dd4e92601b82e
0xd44bb6663936cab1310584a277f7daa6943d4904
0x6a27348483d59150ae76ef4c0f3622a78b0ca698
0x07e3c70653548b04f0a75970c1f81b4cbbfb606f
0xd588b586d61c826a0e87919b3d1a239206d58bf2
0xa0c81655e84c31c4c5bd86d7f927f8cbe3c8a806
0x18a672e11d637fffadccc99b152f4895da069601
0xa43ebd8939d8328f5858119a3fb65f65c864c6dd
0x215ce36e90b1b64e6fa2e358305177f8fe5daf25
0xdf6ef343350780bf8c3410bf062e0c015b1dd671
0x9bbb9387c9e2477a6b5d81afece00255875c48ce
0x37f04d2c3ae075fad5483bb918491f656b12bdb6
0x02f61fd266da6e8b102d4121f5ce7b992640cf98
0x8fe19c447821b4cdcdd5012bca1b5469ca96d80d
0xbc34985b4d345aea933d5cac19f3a86bd1fb398f
0x50c6ed8237087d996fc086428d90355384d22e9b
0x95c41f88f11953d3642ca29d7aa327087313c7f0
0xdac17f958d2ee523a2206206994597c13d831ec7
0xf44745fbd41f6a1ba151df190db0564c5fcc4410
0xab95e915c123fded5bdfb6325e35ef5515f1ea69
0xd01db73e047855efb414e6202098c4be4cd2423b
0x139d415b5fd0981fbee78d0fa503168855b34652
0xc7bba5b765581efb2cdd2679db5bea9ee79b201f
0xdd98b423dc61a756e1070de151b1485425505954
0x5c8118fc0237697422ced89a448dce2c8e34b4ef
0x336db6c1ead9cc4d5b0a33ac03c057e20640126a
0x3833dda0aeb6947b98ce454d89366cba8cc55528
0xbb5ed1edeb5149af3ab43ea9c7a6963b3c1374f7
0xefcec6d87e3ce625c90865a49f2b7482963d73fe
0x1d41e18e8ed1ef148547ceade01912e638f464b8
0x2fe0bc5ffb80a84739da913f0a393a4b0cce661b
0x89cf87c35e69a9b84f7a3e50eaf54bfc3cabc377
0xe50365f5d679cb98a1dd62d6f6e58e59321bcddf
0xf8dbfd7098c0fe93daf06006d040f45a6e4390cf
0x89700d6cd7b77d1f52c29ca776a1eae313320fc5
0xed494c9e2f8e34e53bdd0ea9b4d80305cb15c5c2
0x22d1755515bef4afd277d8acd42adbac49c77d43
0xe13ef257cf4d5df928ca11d230427c037666d466
0x3282eb043414888a7c818ac9db0e8086fd5741c2
0xfca47962d45adfdfd1ab2d972315db4ce7ccf094
0x408e41876cccdc0f92210600ef50372656052a38
0x357af180d6822ebcdc269ea147cd3d36ed971596
0x04f062809b244e37e7fdc21d9409469c989c2342
0x41ab1b6fcbb2fa9dced81acbdec13ea6315f2bf2
0x5e3346444010135322268a4630d2ed5f8d09446c
0x55296f69f40ea6d20e478533c15a6b08b654e758
0x749f35ff65932e68267dd82f6cd85eea735d700e
0xd2d0f85b690604c245f61513bf4679b24ed64c35
0xb0866289e870d2efc282406cf4123df6e5bcb652
0xf7a6e15dfd5cdd9ef12711bd757a9b6021abf643
0xf04436b2edaa1b777045e1eefc6dba8bd2aebab8
0x1a0f2ab46ec630f9fd638029027b552afa64b94c
0x7444e28d8d8db540054271b1e9a9c2573aaf01b7
0x8ae4bf2c33a8e667de34b54938b0ccd03eb8cc06
0xe8ff5c9c75deb346acac493c463c8950be03dfba
0xcdf7cfc9f7c129a0d7aec376bc205ab87fc878e1
0x3c4a3ffd813a107febd57b2f01bc344264d90fde
0x1a8f615f0dd39b9de8ad26db89cfa76f7c9d0274
0xfb8bf095ebcdad57d2e37573a505e7d3bafdd3cc
0xdf7d9630d5c43f2ece338843c019f050f72dcd79
0xd7732e3783b0047aa251928960063f863ad022d8
0xfa7c200d0c1e6f0117ffc7b2f2485c53fd4c1ac4
0xf4c27b8b002389864ac214cb13bfeef4cc5c4e8d
0xff10c9186aa36617d0b442e4514251a5fed9576e
0xe12128d653b62f08fbed56bdeb65db729b6691c3
0xb9b4cfe4194d7e8511aa9b9f1260bc7b9634249e
0x1829aa045e21e0d59580024a951db48096e01782
0xa146240bf2c04005a743032dc0d241ec0bb2ba2b
0x8d2da938d6f717eb5d84f68bb0eca7584c8faf2a
0xe25b0bba01dc5630312b6a21927e578061a13f55
0x8542325b72c6d9fc0ad2ca965a78435413a915a0
0x9d8be94d0612170ce533ac4d7b43cc3cd91e5a1a
0xaa843f65872a25d6e9552ea0b360fb1d5e333124
0x3e65e1eefde5ea7ccfc9a9a1634abe90f32262f8
0x8b40761142b9aa6dc8964e61d0585995425c3d94
0x69beab403438253f13b6e92db91f7fb849258263
0x4bbbc57af270138ef2ff2c50dbfad684e9e0e604
0xcaef67f72114b4d2b4f43e7407455285b7de8de5
0x8b353021189375591723e7384262f45709a3c3dc
0xd294fb1b8b1169dc634017f60d9ca36a5701bd7d
0xff1f9c77a0f1fd8f48cfeee58b714ca03420ddac
0xd204616e2ecf6d0b27ee79207c4ba54f91182a9d
0x263c618480dbe35c300d8d5ecda19bbb986acaed
0xadebeafcdcf5de0a5a7f7dfdd467b0e9fb205be9
0x272f022a374fc7e9213b35952e167ea217303e18
0xe7d84cbee9b2234e53bde7ea093e7d1e198ca46a
0xe17dbb844ba602e189889d941d1297184ce63664
0xd8d48e52f39ab2d169c8b562c53589e6c71ac4d3
0x12b2028d5ecb59a7172c3d784f8938040e234fb6
0x420a43153da24b9e2aedcec2b8158a8653a3317e
0xf67acb7b9226e482afcf7f08aac9466c50c19d9c
0x0e8d6b471e332f140e7d9dbb99e5e3822f728da6
0x264dc2dedcdcbb897561a57cba5085ca416fb7b4
0xa645264c5603e96c3b0b078cdab68733794b0a71
0xf36ccb6465fa93bf90771b5459b0b210a2d82392
0xc47b8d6d6595f7934fc467ded288e1a267d71758
0x049399a6b048d52971f7d122ae21a1532722285f
0x8a60806f05876f4d6db00c877b0558dbcad30682
0xa974c709cfb4566686553a20790685a47aceaa33
0x79181b28976d691181776016b3d6a7d3d08f70e8
0x539efe69bcdd21a83efd9122571a64cc25e0282b
0x899f3b22908ff5674f8237c321ab309417887606
0x8e5610ab5e39d26828167640ea29823fe1dd5843
0x327682779bab2bf4d1337e8974ab9de8275a7ca8
0xebbdcd19b78d32fefa3c250b87f6fd7550cb911d
0x9041fe5b3fdea0f5e4afdc17e75180738d877a01
0x56f527c3f4a24bb2beba449ffd766331da840ffa
0xce96c5c02dd87a9ef4e7353383d121bb7edf1333
0x49b127bc33ce7e1586ec28cec6a65b112596c822
0x0dba7ca3d25f8c2f46d9b06ba7b1b3144e206f38
0x29488e24cfdaa52a0b837217926c0c0853db7962
0x4ba72f0f8dad13709ee28a992869e79d0fe47030
0x841ea7e00c9c6f8ce0c751a5f8151c928fb63a91
0x4a6058666cf1057eac3cd3a5a614620547559fc9
0xe11609b9a51caf7d32a55896386ac52ed90e66f1
0x24692791bc444c5cd0b81e3cbcaba4b04acd1f3b
0x7654915a1b82d6d2d0afc37c52af556ea8983c7e
0x9e2b209afc38b74b3278b4e3e2e61dcefc752bb2
0xa849eaae994fb86afa73382e9bd88c2b6b18dc71
0x8e870d67f660d95d5be530380d0ec0bd388289e1
0x702b1b84bb83bb2c651780bf83ba0cb17c656182
0x1ccaa0f2a7210d76e1fdec740d5f323e2e1b1672
0x0eb152d2bba8af722d7e296a1f223d819c3bbb1f
0xc6335206e56a3c5bc15a5096dfc2795c04c47619
0x101f62fb0bd47814c0bcd1e2499909adac5008c0
0x8effd494eb698cc399af6231fccd39e08fd20b15
0x59de2a5c00c7ee1c9cc823146cd18580fc5ff7b5
0xd54661c39362c2f1137f42307036f5b75a722a20
0xb0514a5b4aa58ac6e954f537598dd42a71916581
0xa8daa52ded91f7c82b4bb02b4b87c6a841db1fd5
0x9eec65e5b998db6845321baa915ec3338b1a469b
0xe6517b766e6ee07f91b517435ed855926bcb1aae
0x2567c677473d110d75a8360c35309e63b1d52429
0x846c66cf71c43f80403b51fe3906b3599d63336f
0x81e74a3ea4bab2277aa3b941e9d9f37b08ac5374
0x5d51fcced3114a8bb5e90cdd0f9d682bcbcc5393
0xc3972ac283b3a7a56125674631a5c254f7f373cf
0x57d90b64a1a57749b0f932f1a3395792e12e7055
0x9e3319636e2126e3c0bc9e3134aec5e1508a46c7
0xbc86727e770de68b1060c91f6bb6945c73e10388
0xf8c595d070d104377f58715ce2e6c93e49a87f3c
0xaa19961b6b858d9f18a115f25aa1d98abc1fdba8
0x390d6673c1fa9dbb8000db1ae89252b7d531ab75
0xf0ddd41ac68b71ecbad395aa6240c41c5b55c749
0x4f45901e24ab443529dc52aff4452b081f9564fa
0xb62d18dea74045e822352ce4b3ee77319dc5ff2f
0x95408930d6323ac7aa69e6c2cbfe58774d565fa8
0xaaf37055188feee4869de63464937e683d61b2a1
0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098
0xfa3118b34522580c35ae27f6cf52da1dbb756288
0x6cabf1b590ee8daa30a1c76ff5dd21284d8681d8
0xb1cfb2421f6f12ebda4f9b8d0336518c82e63b2c
0x97aeb5066e1a590e868b511457beb6fe99d329f5
0xff18dbc487b4c2e3222d115952babfda8ba52f5f
0x461733c17b0755ca5649b6db08b3e213fcf22546
0x24ddff6d8b8a42d835af3b440de91f3386554aa4
0xc47d7d42e44b2e04c83a45cf45898e597a0c2311
0x47dd62d4d075dead71d0e00299fc56a2d747bebb
0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d
0xa9ec9f5c1547bd5b0247cf6ae3aab666d10948be
0x4689a4e169eb39cc9078c0940e21ff1aa8a39b9c
0xa5b0f0d4d586f20f7d49005b5e9b856358332a2a
0x05984006707585f66465e8a6505341f46b64fa7a
0xcde21da29e54e3b60a1aaacd1dcbda76d8066af1
0x1818409ff612a6d574ca979904396bb4b8ea6d51
0xc80c5e40220172b36adee2c951f26f2a577810c5
0x41cd7bbab5758b3b675281f3ead24e666f2b1f0e
0x540449e4d172cd9491c76320440cd74933d5691a
0x898bf39cd67658bd63577fb00a2a3571daecbc53
0x81b4d08645da11374a03749ab170836e4e539767
0x27f706edde3ad952ef647dd67e24e38cd0803dd6
0x13119e34e140097a507b07a5564bde1bc375d9e6
0xe803267c5086252425befe8e1f9c4cec0ea3a952
0x2bdc0d42996017fce214b21607a515da41a9e0c5
0x946956f5bb7832aba7aa02ec722e4c558e12b2e1
0x83eea00d838f92dec4d1475697b9f4d3537b56e3
0xc8c6a31a4a806d3710a7b38b7b296d2fabccdba8
0xc27a2f05fa577a83ba0fdb4c38443c0718356501
0x9e96604445ec19ffed9a5e8dd7b50a29c899a10c
0x44197a4c44d6a059297caf6be4f7e172bd56caaf
0x0ad3227eb47597b566ec138b3afd78cfea752de5
0x7600bf5112945f9f006c216d5d6db0df2806edc6
0x949bd9e6031a3d43623fec3f85e9adbf8a6d9f7a
0x5c64031c62061865e5fd0f53d3cdaef80f72e99d
0x3e01b9ea9db8f17ab1825d848b2f2e04f57caf09
0x49fddeae0b521dab8d0c4b77e7161094f971320d
0x123ab195dd38b1b40510d467a6a359b201af056f
0xe38165c9f6deb144afc9c32c206b024817e1496d
0x1dfabf381d80dd29d43bc347207b30a5c484bbd0
0xd8698a985b89650d0a70f99ad2909bd0c0b4b51c
0xea5f88e54d982cbb0c441cde4e79bc305e5b43bc
0x9b68bfae21df5a510931a262cecf63f41338f264
0xf41861f194e7ba8de95144a89e0c6ed16ee0b3a0
0x0f8c45b896784a1e408526b9300519ef8660209c
0xa58c4f0e4dddb52d2017c77eac34c73a84cf8af8
0xae73b38d1c9a8b274127ec30160a4927c4d71824
0xa0872ee815b8dd0f6937386fd77134720d953581
0x6704b673c70de9bf74c8fba4b4bd748f0e2190e1
0x4e15361fd6b4bb609fa63c81a2be19d873717870
0x3543638ed4a9006e4840b105944271bcea15605d
0x827de8cb5bf8da8f16093505c58b5677122cdcec
0x47da42696a866cdc61a4c809a515500a242909c1
0xf4985070ce32b6b1994329df787d1acc9a2dd9e2
0xba2184520a1cc49a6159c57e61e1844e085615b6
0x1122b6a0e00dce0563082b6e2953f3a943855c1f
0xeb7c20027172e5d143fb030d50f91cece2d1485d
0x5b26c5d0772e5bbac8b3182ae9a13f9bb2d03765
0xfbd0d1c77b501796a35d86cf91d65d9778eee695
0xbf45f4280cfbe7c2d2515a7d984b8c71c15e82b7
0x588047365df5ba589f923604aac23d673555c623
0xb17df9a3b09583a9bdcf757d6367171476d4d8a3
0xd2d6158683aee4cc838067727209a0aaf4359de3
0x2baac9330cf9ac479d819195794d79ad0c7616e3
0xee609fe292128cad03b786dbb9bc2634ccdbe7fc
0x1fc7bd85293f3982f40d52698df8d26be89360d6
0xf069d9f8e394f23878e6beccbdef41c4a957b662
0x3d1ba9be9f66b8ee101911bc36d3fb562eac2244
0xcd3673af09e76c74d889aabab68ca0645566a3a1
0x4f27053f32eda8af84956437bc00e5ffa7003287
0xca14e435f1048569dab3264de3c6be764b29da2d
0x46751d82e59684f39bc554c6797663d62cef0f75
0x42d6622dece394b54999fbd73d108123806f6a18
0x5ea8f2e8e9a58a82ed53b0dd91cc7cf1bf319b86
0xd4fd252d7d2c9479a8d616f510eac6243b5dddf9
0x6aac8cb9861e42bf8259f5abdc6ae3ae89909e11
0x05860d453c7974cbf46508c06cba14e211c629ce
0x45e42d659d9f9466cd5df622506033145a9b89bc
0x1d085c7716118e5c99ab1c35c1cffdacffe454b6
0xab8b8adda5a07976ac696034ea2cd83156ccbd84
0xc2807533832807bf15898778d8a108405e9edfb1
0x4432e7ffd729442614d9233499000530e08e9d62
0xfc05987bd2be489accf0f509e44b0145d68240f7
0x9457725777a69922af16f3f3d58a92dae1995856
0xebf5ffaed443093dbda54eed6dc77f7bba6dc7f2
0x8b6cda5cc518c904e8844f445e1a7c7d2db0ff16
0xc72fe8e3dd5bef0f9f31f259399f301272ef2a2d
0x58b7056deb51ed292614f0da1e94e7e9c589828d
0x9af2c6b1a28d3d6bc084bd267f70e90d49741d5b
0x83984d6142934bb535793a82adb0a46ef0f66b6d
0x20bf6672497941bd3e4ec5fd551de5c31e0a898a
0xee2131b349738090e92991d55f6d09ce17930b92
0xa00fa22499478cc37beb45021a1f1c9f826f72e1
0x4d8fc1453a0f359e99c9675954e656d80d996fbf
0x2fd41f516fac94ed08e156f489f56ca3a80b04d0
0x7da90089a73edd14c75b0c827cb54f4248d47ecc
0xbe8115cdf67fcbbca3efb2a9ff18bb98eac2308f
0xb24754be79281553dc1adc160ddf5cd9b74361a4
0xfdfe8b7ab6cf1bd1e3d14538ef40686296c42052
0x1e143b2588705dfea63a17f2032ca123df995ce0
0x7ba8a5d59b21390a70b2ba968a183712e12a049c
0xa3d58c4e56fedcae3a7c43a725aee9a71f0ece4e
0x3afa1902b1f8a802abc18e5ad982d1bcd34afe22
0xb51088f5f37286b5c3462043200a0ce9aee71459
0xc324a2f6b05880503444451b8b27e6f9e63287cb
0x29d75277ac7f0335b2165d0895e8725cbf658d73
0x814f67fa286f7572b041d041b1d99b432c9155ee
0x83e2be8d114f9661221384b3a50d24b96a5653f5
0xef51c9377feb29856e61625caf9390bd0b67ea18
0x546e955456867a5822bb9532973f7380f1bf55a1
0xc64500dd7b0f1794807e67802f8abbf5f8ffb054
0x3635e381c67252405c1c0e550973155832d5e490
0x960f56e8a9f2084acf39a686ee5b1f5467cf81e4
0x5102791ca02fc3595398400bfe0e33d7b6c82267
0x765b0aaef0ecac2bf23065f559e5ca3b81067993
0x0778cc2e8bbad3d483e82371606d100cc8604522
0xf03bfb08a807716e3340e175b98b388d2dc56de0
0x7501a4f0b6fcf5ab8d682a57e668214edc3d3ea4
0xd6c523854f08759df65fd335c80a5609e2a28d5f
0xf263292e14d9d8ecd55b58dad1f1df825a874b7c
0x12b306fa98f4cbb8d4457fdff3a0a0a56f07ccdf
0xb07ec2c28834b889b1ce527ca0f19364cd38935c
0x9ba742f3a158ec4f7b317270037716cc84aafec1
0x7728dfef5abd468669eb7f9b48a7f70a501ed29d
0xbeb6fdf4ef6ceb975157be43cbe0047b248a8922
0xe9a95d175a5f4c9369f3b74222402eb1b837693b
0x8bfe5ebb128ee82f4ba80f56bb32409cc87bc6fb
0x97208bf5dc25e6fd4719cfc2a3c1d1a59a974c3b
0xe083515d1541f2a9fd0ca03f189f5d321c73b872
0x1e2fbe6be9eb39fc894d38be976111f332172d83
0x95abb152ed410cc4b6dffb3ed41d01015bdbb5d2
0x8ad6739649f1fbf079882c14d27862d5c2206660
0x4b94c8567763654101f690cf4d54957206383b75
0x602087badcb6ed10cc0dff3301b50d6f1993f3b3
0xbf4ed7b27f1d666546e30d74d50d173d20bca754
0xaac3090257be280087d8bdc530265203d105b120
0x7b307c1f0039f5d38770e15f8043b3dd26da5e8f
0x705ee96c1c160842c92c1aecfcffccc9c412e3d9
0x4a536c1ce7ad7f6e8d2e59135e17aef5ef4dd4e6
0x37304b0ab297f13f5520c523102797121182fb5b
0x171d750d42d661b62c277a6b486adb82348c3eca
0xe7c79deb6a9b74f691d5f882b7c588bba5db1a20
0x147b51d82a6038607895e11c4191431335b257e3
0x4d09c5e758ca68be27240f29fb681e5a5341ca98
0x2d07d53c82978fdce1dae5d5dee38923f520dd63
0xf453b5b9d4e0b5c62ffb256bb2378cc2bc8e8a89
0x3e716a958c185f2ba10f5951566bea740f4e892e
0xc011a72400e58ecd99ee497cf89e3775d4bd732f
0x4aff03b46792ba7f65403a0d96b2fb8ca8d54367
0x5aef06ec39e98c05201ee1e54b653c372ecb9cf3
0xfef3884b603c33ef8ed4183346e093a173c94da6
0xdf1338fbafe7af1789151627b886781ba556ef9a
0x647f274b3a7248d6cf51b35f08e7e7fd6edfb271
0xb16d3ed603d62b125c6bd45519eda40829549489
0x8b0b3526b414ed5019049326544c07725a30da92
0x76914ca27f3c7422a14c22aaeafbbd05d3f3526b
0x86949dc8043a5fd7619a1289d65964ad5ec3d25c
0x3a26746ddb79b1b8e4450e3f4ffe3285a307387e
0x7d3e7d41da367b4fdce7cbe06502b13294deb758
0x71d01db8d6a2fbea7f8d434599c237980c234e4c
0xa9b2d2be17f3472f9dfb626531f3821080c00159
0x357aac74d5fc24f271e5652ec6bdd8abfe048505
0xe2d82dc7da0e6f882e96846451f4fabcc8f90528
0xb5dbc6d3cf380079df3b27135664b6bcf45d1869
0x2c949199cff14aeaf1b33d64db01f48fb57f592f
0xf150b9054013552a6288320dc4afe1beebb79d8e
0x4c251de85ad3498c5b89388d8efc696ddd0b0fe7
0x2cc1060de78aa44e3e6a86102fac93f1de49adb2
0xac838aee2f650a6b970ecea56d4651653c1f84a1
0x13cb49bfbb653795c69846b0c139ad3ef8dcec47
0xa7ca36f7273d4d38fc2aec5a454c497f86728a7a
0xe841d388ed30c0988d5a2db071062c202f9c3a86
0x941b7f6d2f77bf472f491d96d9fdd14c294b892a
0x0b4bdc478791897274652dc15ef5c135cae61e60
0x00e3ea0019005cba812824d95814d7133ed616b7
0x9469d013805bffb7d3debe5e7839237e535ec483
0xb2e260f12406c401874ecc960893c0f74cd6afcd
0x21f15966e07a10554c364b988e91dab01d32794a
0x459f7854776ed005b6ec63a88f834fdab0b6993e
0xe69a353b3152dd7b706ff7dd40fe1d18b7802d31
0xb1ed41dc1fe9b723a31137afdd1201d17917fe91
0xe534619defdbf0caf673b8abf7158714f5bd4bd9
0x24e2b1d415e6e0d04042eaa45dc2a08fc33ca6cd
0xf487e54a41660ef17374f6ebf8340c6ef3163f30
0x254f91949d4f57b22392ba0278069cf5a9105f05
0x684e2dcb12bb755237e07242529c82f78a84ea61
0x83fa34ffd45dced0482d92048d04823556351520
0x8a9ac2ce73b37d1719989a854f83d456762ea303
0x607a5c47978e2eb6d59c6c6f51bc0bf411f4b85a
0x48c1b2f3efa85fbafb2ab951bf4ba860a08cdbb7
0x2cc114bbe7b551d62b15c465c7bdcccd9125b182
0x4304bd6506aa9d2708eed2aea1cfcb0adaf652e5
0x076641af1b8f06b7f8c92587156143c109002cbe
0x84119cb33e8f590d75c2d6ea4e6b0741a7494eda
0x72d47cceba146cccde497172decf5e65e03b407c
0xab51e836bdcbc7cc06d926c50d88328f1bb17148
0x27dce1ec4d3f72c3e457cc50354f1f975ddef488
0x4355fc160f74328f9b383df2ec589bb3dfd82ba0
0x65a15014964f2102ff58647e16a16a6b9e14bcf6
0xd43d09ec1bc5e57c8f3d0c64020d403b04c7f783
0xd8bd3958725f216eb236e9dc65b169de48101c6a
0x2832373dddad96bbfb44f1b7da11b6541026bf40
0xf3e014fe81267870624132ef3a646b8e83853a96
0xc5b106f17246b2f5c0c658dbd6e8d168695806ab
0x088dfd01e4e279d9b9b89690dc1682c89fee1dcb
0xbbff862d906e348e9946bfb2132ecb157da3d4b4
0x4fd8ba5d02259931438c325338bf543a5d2ad733
0x1e26b3d07e57f453cae30f7ddd2f945f5bf3ef33
0x814e0908b12a99fecf5bc101bb5d0b8b5cdf7d26
0xc29004ab38334dc7a9eca1b89d6d4bf9f564d5cf
0x6aeb95f06cda84ca345c2de0f3b7f96923a44f4c
0x8e89c7da6312aa236fc4c3f1f27fd6314f33a9ba
0x0c31f4ac8f7d6958e9226b4faf5dd7f235b9d552
0x28c8d01ff633ea9cd8fc6a451d7457889e698de6
0x900b4449236a7bb26b286601dd14d2bde7a6ac6c
0xe2ee1ac57b2e5564522b2de064a47b3f98b0e9c9
0x95daaab98046846bf4b2853e23cba236fa394a31
0x4a7babfafe46456bc4e965d6fbeaff7f01c8b330
0x8bcb64bfda77905398b67af0af084c744e777a20
0x49de436ea25be263cb3e8ff1401931c6f9b70660
0xfc79774fb9dedeea2325d0d5570554eddc4e6747
0xc39e626a04c5971d770e319760d7926502975e47
0xaad54c9f27b876d2538455dda69207279ff673a5
0x38c87aa89b2b8cd9b95b736e1fa7b612ea972169
0xace62f87abe9f4ee9fd6e115d91548df24ca0943
0x6ed680055bd5a04c194c954f71019ee90145001c
0x8810c63470d38639954c6b41aac545848c46484a
0x2956356cd2a2bf3202f771f50d3d14a367b48070
0x56bfead31c2c6a3bdeb0891fab022c0b90ea43f1
0xe55f8e53adecac547f892f9bb4abcc3355b1bd10
0x02725836ebf3ecdb1cdf1c7b02fcbbfaa2736af8
0xbc05e610eaac542bfa64504025413291beb58d36
0xaff69c67f5dbbdd088ccbc6d47cb9e0ea547e132
0x3aa927a97594c3ab7d7bf0d47c71c3877d1de4a1
0x31f3d9d1bece0c033ff78fa6da60a6048f3e13c5
0xe4bd56cbf537074e3836a1721983107cce9e689f
0xf37c4a962e70d813a4d9825942141cd9bc5169fd
0xce53a179047ebed80261689367c093c90a94cc08
0x5ffc014343cd971b7eb70732021e26c35b744cc4
0xf77f4810e7521298a6e2a04f82a6c3492706d74f
0x0f1ed66c251bcb52ecf7e67ac64bb72482048adb
0xeb96f4caaea05e69f41c25ae42b58ffff7df628d
0x5f33d158ca7275848f70a3f149b421190df85b32
0xfe76be9cec465ed3219a9972c21655d57d21aec6
0x543ff227f64aa17ea132bf9886cab5db55dcaddf
0x5301eae39a4cba1cc2a74e861fded062ca3e3420
0xc86d054809623432210c107af2e3f619dcfbf652
0xfc0555aca4a78be9668993b39739d1d2616c75b0
0xc3af5103551287cfc8f12d7bfe208e0c2c3c3ff1
0x27e7383e49be6fd965805a0302b32e40c3d9981e
0x5dbe296f97b23c4a6aa6183d73e574d02ba5c719
0x82b0e50478eeafde392d45d1259ed1071b6fda81
0x48845c3da5bb1a4060fa2cea0ad5a3ef3af9a874
0xec985525f3f22c7fa9c9ff4a49e37589a76d86d4
0xd8d3ee0d39028b8899926a89983537ab537e70f0
0x687174f8c49ceb7729d925c3a961507ea4ac7b28
0x039f5050de4908f9b5ddf40a4f3aa3f329086387
0x66e5dbc7fece1d31eb60af8cfa0563ec0d1a81bd
0xe964c79a2a6a94365c0b0c07a65f1c882e3f4059
0x7995ab36bb307afa6a683c24a25d90dc1ea83566
0x53148bb4551707edf51a1e8d7a93698d18931225
0xe1aee98495365fc179699c1bb3e761fa716bee62
0xb84e224216fec19d8631a0ad187326bc48f91b6b
0x9e6b2b11542f2bc52f3029077ace37e8fd838d7f
0xe0e32ae60f099ef844c39371fb3bb346eabf9409
0xdb25f211ab05b1c97d595516f45794528a807ad8
0x0aab3ac447ea90739bdbe4e0e00af0a54038904a
0x3618516f45cd3c913f81f9987af41077932bc40d
0x72430a612adc007c50e3b6946dbb1bb0fd3101d1
0x8a854288a5976036a725879164ca3e91d30c6a1b
0x87ed87a34adc1ecc62232f248d74fe1f81e5da68
0x57838ff342f36a1ec18224981ea8715a4667fb3a
0x0235fe624e044a05eed7a43e16e3083bc8a4287a
0xbc2afc039d2bfa67d582ac181dab5be17ec91f82
0x6710c63432a2de02954fc0f851db07146a6c0312
0xcb234d0e329b2ece05dda67b7db7a3176def1a74
0x7be8076f4ea4a4ad08075c2508e481d6c946d12b
0x6bd50f3589916783b5366262d51700ee81d31b7e
0x7568b9ece8966ae20e7f5edf90bcd6b77c2a47ca
0x6956983f8b3ce173b4ab84361aa0ad52f38d936f
0x20827ab17e406d92e2c5cbc2948be0871e160d8c
0x54318a379935d545eb8e474a191e11faac5a46e8
0x0d262e5dc4a06a0f1c90ce79c7a60c09dfc884e4
0xcb47c89cb17c10b719fc5ed9665bae157cac2cb1
0xec7954f452a6473c21c4078501f0bcf8b266bc99
0x5fa1ea99eb3acc1f9e84cf28fde6431b8fdc9dc0
0x594120039687ddaab50c4ab03bada20eb4b218f6
0xaaab2ec23dd5dd9602e631b8399fa94c9d134b3a
0x6fc9c554c2363805673f18b3a2b1912cce8bfb8a
0x31ead6a10b5215321afa8bef2f05aa271508fa6c
0xb6ee9668771a79be7967ee29a63d4184f8097143
0x58ea969c48d5d12dad1210d8482af7f69d53f6fe
0x9f103cd6fb907928351353e6f339c3fdcd5ee05c
0x50430b6201c9859c91a5590ac71700cc71499a0e
0xbdeb4b83251fb146687fa19d1c660f99411eefe3
0xd989a04ad891528b571ef73dacaefeb0402a65b3
0x5581c0bc21a762e43d148b06d310f088b6cf97b3
0x93a6efd1c4076b05526d6263aafd91942f75e4a4
0x1f4215fe007ee5b170391241656a28a8bd13826e
0x7c84e62859d0715eb77d1b1c4154ecd6abb21bec
0xdda9bcd985b1169607546b52910a0269dff5baf1
0x6059f55751603ead7dc6d280ad83a7b33d837c90
0xf8a15b1540d5f9d002d9ccb7fd1f23e795c2859d
0xe477292f1b3268687a29376116b0ed27a9c76170
0xdfc85c08d5e5924ab49750e006cf8a826ffb7b13
0xa783b02ce5853ad798b6fd0417c729cc462328df
0xca2796f9f61dc7b238aab043971e49c6164df375
0xd7631787b4dcc87b1254cfd1e5ce48e96823dee8
0xae84013bb37ef96abe16f5017a50c1e4d870a331
0x80d09da032f4293b1f1295274509cb76c2a5dc42
0x9d357d43d9733a1e59e5eb1432f2527e66e2cd43
0x093e5c256ff8b32c7f1377f4c20e331674c77f00
0x90e76c2c45599443339eca66bec2d05f20bb6f12
0x8400d94a5cb0fa0d041a3788e395285d61c9ee5e
0x354a16be55329b65837dce830cfd71265da0f53c
0x93190dbce9b9bd4aa546270a8d1d65905b5fdd28
0xcc74cb21eba98fda21da9a75ef0c1fa26c9b03c4
0xb39e9b7edf793611b615faa6e546ed68a23f7006
0xc28e860c9132d55a184f9af53fc85e90aa3a0153
0x2ba94c2fbb89e3b631629f38ebf1d888c1825ab3
0x55648de19836338549130b1af587f16bea46f66b
0xc98e0639c6d2ec037a615341c369666b110e80e5
0x8db54ca569d3019a2ba126d03c37c44b5ef81ef6
0xea1f346faf023f974eb5adaf088bbcdf02d761f4
0x906b3f8b7845840188eab53c3f5ad348a787752f
0xf239fab41de78533fa974b74d7605f1e68f8772e
0xa834150b855f7a1dd2ac1356059722dc2ac58393
0xc75506deae7c01f47bcd330b324226ce9ba78e30
0x9e88613418cf03dca54d6a2cf6ad934a78c7a17a
0x50ee674689d75c0f88e8f83cfe8c4b69e8fd590d
0x14d9779b6585f3a7d4f768383b3cb030705dad2e
0x94ffb55ce68231c5966ea8dab16a8f066846513f
0xdecd5780a9d50a96f34ce7e9e636903f6f3b47f5
0xfbe0e9846bd736b84a0a973322ad2a1fc8d7e5ca
0xfef5497bc53a69875e02ae5b14eeff668f09a729
0x4c0fbe1bb46612915e7967d2c3213cd4d87257ad
0x44509b653788fba0ecd37c0b0ebc9475a5792328
0x3032b9e916a575db2d5a0c865f413a82891bd260
0x106aa49295b525fcf959aa75ec3f7dcbf5352f1c
0x3839d8ba312751aa0248fed6a8bacb84308e20ed
0xb547cc51ce58293e6945ba08d664ce051563d9ac
0x90335e6f8cf5b4b3cc28217b6b2ece290439e492
0x89c6c856a6db3e46107163d0cda7a7ff211bd655
0xf9c402ac9aa43857e2fbf541ca1d38291d412e3d
0xf6317dd9b04097a9e7b016cd23dcaa7cfe19d9c6
0x146d8d942048ad517479c9bab1788712af180fde
0x03806ce5ef69bd9780edfb04c29da1f23db96294
0x5f6e7fb7fe92ea7822472bb0e8f1be60d6a4ea50
0xff98a08c143311719ca492e4b8c950c940f26872
0x5f742383b6d1298980030d6af943b76cdd902143
0xd366908c2f249537f905bdae5a77272a9fbda127
0xf5ed2dc77f0d1ea7f106ecbd1850e406adc41b51
0x38405fa410c6eba342f9eb5ac66b2aaf6498c8e9
0x8aa33a7899fcc8ea5fbe6a608a109c3893a1b8b2
0xb236e2477b8ed34b203b60e2b88884ee5b31a3c3
0x686e5ac50d9236a9b7406791256e47feddb26aba
0x1d18f44256a27862d886e27191d55ab4029172c1
0xd9c7e5b218818cb8ffa4fc5966c5ea5d99c30e1a
0x9002d4485b7594e3e850f0a206713b305113f69e
0x5a86568f9bbf7c31e30bf40f569762ca82ceb93c
0xb746aed479f18287dc8fc202fe06f25f1a0a60ae
0xd42debe4edc92bd5a3fbb4243e1eccf6d63a4a5d
0x4aac461c86abfa71e9d00d9a2cde8d74e4e1aeea
0xfd45e61e085b3e7a1990a47828d757755b206eee
0x60c68a87be1e8a84144b543aacfa77199cd3d024
0x503f9794d6a6bb0df8fbb19a2b3e2aeab35339ad
0x9a9bb9b4b11bf8eccff84b58a6ccccd4058a7f0d
0x1460a58096d80a50a2f1f956dda497611fa4f165
0xc4a21f9a38b813b2c8e3f2e01c8d7547a99ed2b7
0x86fe3c20379ac71ebbf8c0499b41fd2b457e4e9e
0xc78593c17482ea5de44fdd84896ffd903972878e
0x6f7a4bac3315b5082f793161a22e26666d22717f
0x5df18a3c0572b8591084a2c78711be7e3aa711ab
0x4af328c52921706dcb739f25786210499169afe6
0xabc1280a0187a2020cc675437aed400185f86db6
0x5661c46e366570360064ae1a50a17a7a1a8f3236
0x91d04cae7ec01de3de98e028b999a2edb129b169
0xa1e4608ff6b4b9324c6472eee2efebd20a20bbe8
0x808508acb3f5f9aef7950375bedb8f001cccab77
0xf81a850ee58fdd08eee998deeb4652edc5f2a4df
0xee4458e052b533b1aabd493b5f8c4d85d7b263dc
0xddd460bbd9f79847ea08681563e8a9696867210c
0xe8663a64a96169ff4d95b4299e7ae9a76b905b31
0xe642b6f79041c60d8447679b3a499f18d8b03b81
0x78021abd9b06f0456cb9db95a846c302c34f8b8d
0xeae08961bf8bfe92879b1455c96893e313c8d858
0x0f90ef4e2526e3d1791862574f9fb26a0f39ec86
0xeb9a4b185816c354db92db09cc3b50be60b901b6
0x162c91e864d37055f7d5696b845f3af520cd911d
0x1d72e76e38c815b9f91661c340949e8673e897b3
0x3c337fa1bf8725f59f73db6db719c792c5e8ae74
0x4209f9bbb4e4dd48dbd84701fcaaab1d492b5a05
0x722b035cdaf0daf521ead7bc3496029a280e6249
0x5d034d0d0d98fb76192ef2ef27e197fcfd9386ec
0xd234bf2410a0009df9c3c63b610c09738f18ccd7
0xbd4b50bbf385195c410a625681ff29d439ba61f3
0x98da3b3da368a23693eb609d5ce2d779896a31b5
0xd2946be786f35c3cc402c29b323647abda799071
0xad41548fa92921597da3ae783a330396b47cba3c
0xa8c7f56c90b20afaae9f7a006ca2df1dfba56279
0xf84c61bb982041c030b8580d1634f00fffb89059
0x737f98ac8ca59f2c68ad658e3c3d8c8963e40a4c
0xe8a51be86ad96447d45ddeddc55013f25157688c
0xdf4703c56d1497a33c3fe75c2ee4ba02515778e9
0xdae1baf249964bc4b6ac98c3122f0e3e785fd279
0x0eee3715d385ecefc6afd9fbf30ddee725be3de1
0x91f273b7a28f5169fd7b7995a54b767ca797bc63
0xfa55951f84bfbe2e6f95aa74b58cc7047f9f0644
0xd4e26b4e8e9881e8905315aba189b694f2307757
0x98ecf84ac50aa3c090f88b04676babc296d03527
0xb679afd97bcbc7448c1b327795c3ef226b39f0e9
0x500565e098d98a273224ec8fb33d98dc8946f8b9
0xda3cd7eeed7dc8a0bc76968a9ae67d318d1634b8
0xaf0e27602eaa73fdf4849806d75bdfc77fb95217
0xd53370acf66044910bb49cbcfe8f3cd020337f60
0x36d10c6800d569bb8c4fe284a05ffe3b752f972c
0xd9485499499d66b175cf5ed54c0a19f1a6bcb61a
0x0e935e976a47342a4aee5e32ecf2e7b59195e82f
0x9884d4e9b305ad015168e9d6e4400582dce2cd59
0xce1d3da32e3a45d27dc841781f09e40c41cac677
0x7046b8988d591b46c1e4562a1166745f24167a17
0x2ecb13a8c458c379c4d9a7259e202de03c8f3d19
0x378903a03fb2c3ac76bb52773e3ce11340377a32
0x1063ce524265d5a3a624f4914acd573dd89ce988
0x632f62fcf63cb56380ffd27d63afcf5f1349f73f
0x61245b6a6678f3158a37ab2c5e52369b9f452318
0xee8bd1502c3e9f6c543781467c01592ac51cfbb8
0x26eb39228eb4bb98c84ad821bb51464121b2276d
0xb5b8f5616fe42d5ceca3e87f3fddbdd8f496d760
0x001575786dfa7b9d9d1324ec308785738f80a951
0xeb61a78f06fc606d82892a38ea581c2bb7f82570
0x5d0d76787d9d564061dd23f8209f804a3b8ad2f2
0xe1144e3cfda7a6d40ae60a968c1edc8ad54aca70
0x0371a82e4a9d0a4312f3ee2ac9c6958512891372
0x93b7fa538913201066a262c03179c342262a7c76
0xcac00d55c89a2baaf37768e548d9c7ccd9fb8786
0x9e9801bace260f58407c15e6e515c45918756e0f
0x621d78f2ef2fd937bfca696cabaf9a779f59b3ed
0x449574c69f3a658794829ed81639a7a9ece041e1
0x813b428af3920226e059b68a62e4c04933d4ea7a
0xee22430595ae400a30ffba37883363fbf293e24e
0x5eb87caa0105a63aa87a36c7bd2573bd13e84fae
0x014b50466590340d41307cc54dcee990c8d58aa8
0x17e67d1cb4e349b9ca4bc3e17c7df2a397a7bb64
0xce958ecf2c752c74973e89674faa30404b15a498
0xad5fe5b0b8ec8ff4565204990e4405b2da117d8e
0x873224aca7ecb10811807b2899211b209b56a867
0x1a0c31837edb132a9312841b9527e6307db13509
0xafc39788c51f0c1ff7b55317f3e70299e521fff6
0x6ddca767d731f57d90a516dd751f2aa9282b37d2
0x2df4031060e27faec80e66380d31b142b7bbfa61
0x929dac58cf32c693c7c9e9e72c2786525679898d
0x32d74896f05204d1b6ae7b0a3cebd7fc0cd8f9c7
0xdbf3bf0c3ff7d43769d5150daa90f0014a0e2c4c
0xcdd6e4a8af49493ed5984d57e5e5c292feb9596d
0x4e646a576917a6a47d5b0896c3e207693870869d
0xbb1fa4fdeb3459733bf67ebc6f893003fa976a82
0xb3bd49e28f8f832b8d1e246106991e546c323502
0x1afafc35b364595f06e89a0429c5762452eb7ffd
0x0c28bf52d0d4d9447e86d7e7f0e317f273d3c9a3
0xd76b5c2a23ef78368d8e34288b5b65d616b746ae
0x7fce2856899a6806eeef70807985fc7554c66340
0x581bd3322a90866e5da8060b9d64d7904394ad42
#! /usr/bin/env python3
import json
import subprocess
import os
import sys
import time
import re
import argparse
from os import listdir
from os.path import isfile, join, abspath
from google.cloud import bigquery
def filter_contracts_by_transactions(addresses, limit=None):
found = []
client = bigquery.Client()
query_job = client.query("""
SELECT contracts.address, COUNT(1) AS tx_count
FROM `bigquery-public-data.ethereum_blockchain.contracts` AS contracts
JOIN `bigquery-public-data.ethereum_blockchain.transactions` AS transactions ON (transactions.to_address = contracts.address)
GROUP BY contracts.address
ORDER BY tx_count DESC""")
results = query_job.result() # Waits for job to complete.
for row in results:
if row.address in addresses:
if limit is not None:
if limit == 0:
break
limit = limit - 1
found.append(row.address)
return found
# [END bigquery_simple_app_print]
parser = argparse.ArgumentParser()
parser.add_argument('indir', type=str, help='')
parser.add_argument('outdir', type=str, help='')
parser.add_argument('-filter', type=str, help='')
parsed = parser.parse_args()
indir = abspath(parsed.indir)
outdir = abspath(parsed.outdir)
contracts = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.endswith('.sol'))]
total_contracts = len(contracts)
addresses = []
for contract in contracts:
cpath = join(indir, contract)
regex = '(0x[0-9a-zA-Z_$]*)_([$A-Za-z0-9\.]*).sol'
found = re.findall(regex, contract)[0]
address = found[0]
name = found[1]
addresses.append(address)
print("Initially, we have", len(addresses), "contracts")
addresses = filter_contracts_by_transactions(addresses, 1000)
opath = join(outdir,"contracts-most-transactions.txt")
with open(opath, 'wb+') as f:
for address in addresses:
f.write(bytes(str(address)+"\n",'utf-8'))
#print("After filtering, we have", len(addresses),"contracts")
#! /usr/bin/env python3
import json
import argparse
import matplotlib
import re
import numpy as np
from os import listdir
from os.path import isfile, join
from sys import exit
parser = argparse.ArgumentParser()
parser.add_argument('indir', type=str, help='')
parser.add_argument('-verbose', action='store_true', help='')
parsed = parser.parse_args()
indir = parsed.indir
verbose = parsed.verbose
def convertCamel(name):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1 \2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1 \2', s1)
stats = {}
stats['slither'] = {}
stats['securify'] = {}
stats['smartcheck'] = {}
stats['solhint'] = {}
stats['slither']['times'] = []
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('slither_') and f.endswith('.time'))]
for f in files:
with open(join(indir,f), 'r') as f:
stats['slither']['times'].append(float(f.read()))
stats['securify']['times'] = []
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('securify_') and f.endswith('.time'))]
for f in files:
with open(join(indir,f), 'r') as f:
stats['securify']['times'].append(float(f.read()))
stats['smartcheck']['times'] = []
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('smartcheck_') and f.endswith('.time'))]
for f in files:
with open(join(indir,f), 'r') as f:
stats['smartcheck']['times'].append(float(f.read()))
stats['solhint']['times'] = []
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('solhint_') and f.endswith('.time'))]
for f in files:
with open(join(indir,f), 'r') as f:
stats['solhint']['times'].append(float(f.read()))
stats['slither']['timeouts'] = 0
stats['slither']['errors'] = 0
stats['slither']['percontract'] = {}
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('slither_') and f.endswith('.time'))]
for f in files:
time = open(join(indir,f),"r").read()
if float(time) >= 119:
stats['slither']['timeouts'] = stats['slither']['timeouts'] + 1
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('slither_') and f.endswith('.err'))]
for f in files:
cissues = {}
errors = open(join(indir,f),"r").read()
if ":Traceback" in errors:
stats['slither']['errors'] = stats['slither']['errors'] + 1
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('slither_') and f.endswith('.json'))]
for f in files:
cissues = {}
js = json.load(open(join(indir,f),"r"))
for issue in js:
for element in issue['elements']:
if 'expression' in element:
y = stats['slither']['percontract'].get(f,set())
stats['slither']['percontract'][f] = y.union(element['source_mapping']['lines']) #, issue['check'])#
break
ncontracts = len(stats['slither']['percontract'])
nlines = 0
for x,y in stats['slither']['percontract'].items():
if verbose:
print(x.split("_")[1])
nlines = nlines + len(y)
print("slither:")
print("time:",np.mean(stats['slither']['times']), np.std(stats['slither']['times']))
print("stats",ncontracts, float(nlines) / ncontracts, float(stats['slither']['errors']) / len(files) * 100, float(stats['slither']['timeouts'])/1000 * 100)
stats['securify']['timeouts'] = 0
stats['securify']['errors'] = 0
stats['securify']['percontract'] = {}
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('securify_') and f.endswith('.time'))]
for f in files:
time = open(join(indir,f),"r").read()
if float(time) >= 119:
stats['securify']['timeouts'] = stats['securify']['timeouts'] + 1
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('securify_') and f.endswith('.err'))]
for f in files:
error = open(join(indir,f),"r").read()
if "Exception in thread" in error:
stats['securify']['errors'] = stats['securify']['errors'] + 1
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('securify_') and f.endswith('.json'))]
for f in files:
cissues = {}
js = json.load(open(join(indir,f),"r"))
#print(js.values())
for function,issue in js.items():
errors = (issue['securifyErrors'])['errors']
for x,result in issue['results'].items():
x = convertCamel(x)
x = x.lower()
if(x != 'dao'):
continue
vs = result['violations']
if vs != []:
y = stats['securify']['percontract'].get(f,set())
stats['securify']['percontract'][f] = y.union(vs) #, issue['check'])#
#stats['securify']['total'][x] = stats['securify']['total'].get(x,0) + 1
#cissues[x] = 1
#if verbose:
#print(x, f, vs)
#for k,v in cissues.items():
# stats['securify']['percontract'][k] = stats['securify']['percontract'].get(k,0) + 1
ncontracts = len(stats['securify']['percontract'])
nlines = 0
for x,y in stats['securify']['percontract'].items():
nlines = nlines + len(y)
print("securify")
print("time:",np.mean(stats['securify']['times']), np.std(stats['securify']['times']))
print("stat",ncontracts, float(nlines) / ncontracts, float(stats['securify']['errors'] / 1000 * 100), float(stats['securify']['timeouts'])/1000 * 100)
stats['smartcheck']['timeouts'] = 0
stats['smartcheck']['errors'] = 0
stats['smartcheck']['percontract'] = {}
out = {}
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('smartcheck_') and f.endswith('.out'))]
for f in files:
cissues = {}
errors = open(join(indir,f.replace(".out",".err")),"r").read()
if len(errors) > 1:
stats['smartcheck']['errors'] = stats['smartcheck']['errors'] + 1
time = open(join(indir,f.replace(".out",".time")),"r").read()
if float(time) >= 119:
print(time) #stats['smartcheck']['errors'] = stats['smartcheck']['errors'] + 1
#print(f)
for line in open(join(indir,f),"r").read().split("\n"):
if "ruleId:" in line:
#if verbose:
# print(line.replace("ruleId:",""),end=' ')
x = line.split(": ")[-1].replace("_"," ")
x = x.lower()
x = x.replace("solidity ", "")
#stats['smartcheck']['total'][x] = stats['smartcheck']['total'].get(x,0) + 1
#cissues[x] = 1
if "line:" in line:
if True:
contract = f.split("_")[1]
n = line.replace("line:","").split(" ")[-1]
#print(contract,n)
stats['smartcheck']['percontract'][contract] = stats['smartcheck']['percontract'].get(contract,set()).union([int(n)])
#print(f,line.replace("line:",""))
ncontracts = len(stats['smartcheck']['percontract'])
nlines = 0
for x,y in stats['smartcheck']['percontract'].items():
nlines = nlines + len(y)
print("smartcheck:")
print("time:",np.mean(stats['smartcheck']['times']), np.std(stats['smartcheck']['times']))
print(ncontracts, float(nlines) / ncontracts, float(stats['smartcheck']['errors'] / 1000 * 100), float(stats['smartcheck']['timeouts'])/1000 * 100)
stats['solhint']['errors'] = 0
stats['solhint']['timeouts'] = 0
stats['solhint']['percontract'] = {}
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('solhint_') and f.endswith('.time'))]
for f in files:
time = open(join(indir,f),"r").read()
if float(time) >= 119:
stats['solhint']['timeouts'] = stats['solhint']['timeouts'] + 1
files = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.startswith('solhint_') and f.endswith('.out'))]
for f in files:
cissues = {}
if not("✖" in open(join(indir,f),"r").read()):
continue
errors = open(join(indir,f.replace(".out",".err")),"r").read()
if len(errors) > 1:
#x = 'parse errors'
stats['solhint']['errors'] = stats['solhint']['errors'] + 1
#cissues[x] = 1
for line in open(join(indir,f),"r").read().split("\n"):
if ":" in line:
x = (line.split(" ")[-1]).replace("-"," ")
x = x.lower()
if x != "reentrancy":
continue
#if verbose:
#print(line.strip())
y = stats['solhint']['percontract'].get(f,set())
stats['solhint']['percontract'][f] = y.union([line.strip().split(" ")[0]])
ncontracts = len(stats['solhint']['percontract'])
nlines = 0
for x,y in stats['solhint']['percontract'].items():
nlines = nlines + len(y)
print("solhint:")
print("time:",np.mean(stats['solhint']['times']), np.std(stats['solhint']['times']))
print("stats",ncontracts, float(nlines) / ncontracts, float(stats['solhint']['errors'] / 1000 * 100), float(stats['solhint']['timeouts'])/1000 * 100)
#! /usr/bin/env python3
import json
import subprocess
import os
import sys
import time
import re
import argparse
from os import listdir
from os.path import isfile, join, abspath #, expanduser
parser = argparse.ArgumentParser()
parser.add_argument('idx', type=int, help='')
parser.add_argument('nprocess', type=int, help='')
parser.add_argument('indir', type=str, help='')
parser.add_argument('outdir', type=str, help='')
parser.add_argument('-filter', type=str, help='')
parser.add_argument('-max', type=int, default=0xffffffff, help='')
parser.add_argument('-timeout', type=int, default=60, help='')
parsed = parser.parse_args()
idx_process = parsed.idx
total_process = parsed.nprocess
indir = abspath(parsed.indir)
outdir = abspath(parsed.outdir)
max_contracts = parsed.max
timeout = parsed.timeout
timeout_cmd = ["timeout", "-k", "0.1", str(timeout)]
slither_cmd = ["slither", "--detect", "reentrancy"]
securify_cmd = ["java","-jar","./build/libs/securify-0.1.jar"]
securify_dir = "./securify"
smartcheck_cmd = ["java","-jar","./smartcheck/target/solidity-checker-1.0-SNAPSHOT-jar-with-dependencies.jar"]
solhint_cmd = [ "./node_modules/solhint/solhint.js" ]
if parsed.filter is not None:
addrs = open(parsed.filter).read().split("\n")
else:
addrs = None
#print(addrs)
analyzed = []
contracts = [f for f in listdir(indir) if (isfile(join(indir, f)) and f.endswith('.sol'))]
total_contracts = len(contracts)
contract_per_process = int(total_contracts / total_process)
start = int(contract_per_process * idx_process)
if idx_process < (total_process-1):
end = int(contract_per_process * (idx_process+1))
else:
end = total_contracts
end = min(end, max_contracts)
for index in range(start, end):
contract = contracts[index]
index = index + 1
#print("%d of %d"%(index, len(contracts)))
cpath = join(indir, contract)
regex = '(0x[0-9a-zA-Z_$]*)_([$A-Za-z0-9\.]*).sol'
found = re.findall(regex, contract)[0]
address = found[0]
name = found[1]
if (addrs is None or address.lower() in addrs):
print(cpath)
else:
continue
# slither
try:
filename = "slither_"+address+"_"+name
start = time.time()
proc = subprocess.Popen( timeout_cmd + slither_cmd + [cpath, "--json", join(outdir,filename+".json")], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = proc.communicate()
proc.wait()
with open(join(outdir,filename+".out"), 'wb+') as f:
for line in output[0].split(b'\n'):
f.write(line+b'\n')
with open(join(outdir,filename+".err"), 'wb+') as f:
for line in output[1].split(b'\n'):
f.write(line+b'\n')
elapsed = round(time.time() - start, 2)
with open(join(outdir,filename+".time"), 'wb+') as f:
f.write(bytes(str(elapsed),'utf-8'))
except subprocess.CalledProcessError as e:
print(name, address, " failed after runing slither!")
#print(e.returncode)
#print(e.output)
# securify
try:
filename = "securify_"+address+"_"+name
start = time.time()
proc = subprocess.Popen( timeout_cmd + securify_cmd + ["-fs", cpath, "-o", join(outdir,filename+".json")], cwd=securify_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = proc.communicate()
proc.wait()
with open(join(outdir, filename+".out"), 'wb+') as f:
for line in output[0].split(b'\n'):
f.write(line+b'\n')
with open(join(outdir, filename+".err"), 'wb+') as f:
for line in output[1].split(b'\n'):
f.write(line+b'\n')
elapsed = round(time.time() - start, 2)
with open(join(outdir, filename+".time"), 'wb+') as f:
f.write(bytes(str(elapsed),'utf-8'))
except subprocess.CalledProcessError as e:
print(name, address, " failed after runing securify!")
# smartcheck
try:
filename = "smartcheck_"+address+"_"+name
start = time.time()
proc = subprocess.Popen( timeout_cmd + smartcheck_cmd + ["-p", cpath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = proc.communicate()
proc.wait()
with open(join(outdir, filename+".out"), 'ab') as f:
for line in output[0].split(b'\n'):
f.write(line+b'\n')
with open(join(outdir, filename+".err"), 'ab') as f:
for line in output[1].split(b'\n'):
f.write(line+b'\n')
elapsed = round(time.time() - start,2)
with open(join(outdir, filename+".time"), 'ab') as f:
f.write(bytes(str(elapsed),'utf-8'))
except subprocess.CalledProcessError as e:
print(name, address, " failed after runing smartcheck!")
# solhint
try:
filename = "solhint_"+address+"_"+name
start = time.time()
proc = subprocess.Popen( timeout_cmd + solhint_cmd + [cpath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = proc.communicate()
proc.wait()
with open(join(outdir, filename+".out"), 'ab') as f:
for line in output[0].split(b'\n'):
f.write(line+b'\n')
with open(join(outdir, filename+".err"), 'ab') as f:
for line in output[1].split(b'\n'):
f.write(line+b'\n')
elapsed = round(time.time() - start,2)
with open(join(outdir, filename+".time"), 'ab') as f:
f.write(bytes(str(elapsed),'utf-8'))
except subprocess.CalledProcessError as e:
print(name, address, " failed after runing solhint!")
for r in $(seq 0 $(($1-1))) ; do
./run.py $r $@ 2> log.$r.err > log.$r.out &
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment