Skip to content

Instantly share code, notes, and snippets.

@CrackerHax
Created September 14, 2019 11:39
Show Gist options
  • Save CrackerHax/ec6964ea030d4b31d47b7d412036c623 to your computer and use it in GitHub Desktop.
Save CrackerHax/ec6964ea030d4b31d47b7d412036c623 to your computer and use it in GitHub Desktop.
Python script for getting ethereum public key from transaction id
import web3
w3 = web3.Web3(web3.HTTPProvider('https://geth.golem.network:55555'))
tx = w3.eth.getTransaction('0x00ee93fd1e6fdbdf841b4458a078210449dce89525502c965fd3534ba397e2e3')
tx.hash
from eth_account._utils.signing import extract_chain_id, to_standard_v
s = w3.eth.account._keys.Signature(vrs=(
to_standard_v(extract_chain_id(tx.v)[1]),
w3.toInt(tx.r),
w3.toInt(tx.s)
))
from eth_account._utils.transactions import ALLOWED_TRANSACTION_KEYS
tt = {k:tx[k] for k in ALLOWED_TRANSACTION_KEYS - {'chainId', 'data'}}
tt['data']=tx.input
tt['chainId']=extract_chain_id(tx.v)[0]
from eth_account._utils.transactions import serializable_unsigned_transaction_from_dict
ut = serializable_unsigned_transaction_from_dict(tt)
s.recover_public_key_from_msg_hash(ut.hash())
@finety
Copy link

finety commented Nov 15, 2021

Hello I've No module named 'eth_account._utils.transactions
is there a way to solv ?
of cour I've got web3 and eth_account installed

@CrackerHax
Copy link
Author

CrackerHax commented Nov 15, 2021

its in here: https://github.com/ethereum/eth-account/tree/master/eth_account/_utils

Maybe web3 has changed since I posted this git 2 years ago

@Alf71
Copy link

Alf71 commented Dec 11, 2021

Hi.
I am getting this error message:

File "getPubKey.py", line 5, in
tx.hash
AttributeError: 'NoneType' object has no attribute 'hash'

@CrackerHax
Copy link
Author

the transaction result should have a hash value

https://web3py.readthedocs.io/en/stable/web3.eth.html

This is an old gist, web3 is probably different now

@Alf71
Copy link

Alf71 commented Dec 11, 2021

Having already the values
"v":"0x25", // 37
"r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea",
"s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c"

is it possible to calculate the pubkey directly?

@CrackerHax
Copy link
Author

CrackerHax commented Dec 11, 2021

Thats where the next part comes in

s = w3.eth.account._keys.Signature(vrs=(
to_standard_v(extract_chain_id(tx.v)[1]),
w3.toInt(tx.r),
w3.toInt(tx.s)
))

so you can use s = w3.eth.account._keys.Signature(vrs=(V, R, S))

@sjdthree
Copy link

sjdthree commented Jan 4, 2022

Looks like transactions was moved to legacy_transactions. Try these:

new L14:
from eth_account._utils.legacy_transactions import ALLOWED_TRANSACTION_KEYS

new L19:
from eth_account._utils.legacy_transactions import serializable_unsigned_transaction_from_dict

@kunalgoyal9
Copy link

Updated script

import web3

w3 = web3.Web3(web3.HTTPProvider('https://rpc-testnet.lachain.io'))
tx = w3.eth.getTransaction('0x5ee0eb7a8e867c72752e9965904b5bd71e023b83c6a0506a0ddbc91502316995')
tx.hash

from eth_account._utils.signing import extract_chain_id, to_standard_v

s = w3.eth.account._keys.Signature(vrs=(
    to_standard_v(extract_chain_id(tx.v)[1]),
    w3.toInt(tx.r),
    w3.toInt(tx.s)
))

print("signature: ", s)

from eth_account._utils.legacy_transactions import ALLOWED_TRANSACTION_KEYS
tt = {k:tx[k] for k in ALLOWED_TRANSACTION_KEYS - {'chainId', 'data'}}
tt['data']=tx.input
tt['chainId']=extract_chain_id(tx.v)[0]

print("Transaction: ", tt)

from eth_account._utils.legacy_transactions import serializable_unsigned_transaction_from_dict
ut = serializable_unsigned_transaction_from_dict(tt)

print("Hash:: ", ut.hash())

print("Public kye: ", s.recover_public_key_from_msg_hash(ut.hash()))

@CrackerHax
Copy link
Author

Thanks!

@Alf71
Copy link

Alf71 commented Jul 23, 2022

Is there a similar script for BTC?

@CrackerHax
Copy link
Author

Is there a similar script for BTC?

I think you can do it with secp256k1

https://github.com/iceland2k14/secp256k1

@DicksonWu654
Copy link

DicksonWu654 commented Aug 10, 2023

Older txns have type 0, but for newer ones the code above won't work.

Here's the code for type 2 (the new ones)

import web3
from eth_account._utils.signing import extract_chain_id, to_standard_v
from eth_account._utils.legacy_transactions import ALLOWED_TRANSACTION_KEYS
from eth_account._utils.legacy_transactions import serializable_unsigned_transaction_from_dict


w3 = web3.Web3(web3.HTTPProvider(NODE_URL))
tx = w3.eth.get_transaction("0x7f21e0d18374e2707458c72b0ce2510b2781e9b5db0789b2b68a8b44c2371a3a")

s = w3.eth.account._keys.Signature(vrs=(
    to_standard_v(extract_chain_id(tx.v)[1]),
    w3.to_int(tx.r),
    w3.to_int(tx.s)
))

tt = {k:tx[k] for k in ["to",
"nonce",
"value",
"gas",
"chainId",
"maxFeePerGas",
"maxPriorityFeePerGas",
"type",]}
tt["data"] = tx["input"]

ut = serializable_unsigned_transaction_from_dict(tt)
public_address = s.recover_public_key_from_msg_hash(ut.hash())
from_address = s.recover_public_key_from_msg_hash(ut.hash()).to_checksum_address()

@DicksonWu654
Copy link

Turns out that has edge cases, here's the full code for all types:

import web3
from eth_account._utils.signing import extract_chain_id, to_standard_v
from eth_account._utils.legacy_transactions import serializable_unsigned_transaction_from_dict


w3 = web3.Web3(web3.HTTPProvider(NODE_URL))
tx = w3.eth.get_transaction("0x7f21e0d18374e2707458c72b0ce2510b2781e9b5db0789b2b68a8b44c2371a3a")
tx = dict(tx)

type_0_keys = ['chainId', 'gas', 'gasPrice', 'nonce', 'to', 'value']
type_1_keys = ["to",
    "nonce",
    "value",
    "gas",
    'gasPrice',
    "chainId",
    "type"]
type_2_keys = ["to",
    "nonce",
    "value",
    "gas",
    "chainId",
    "maxFeePerGas",
    "maxPriorityFeePerGas",
    "type"]

s = w3.eth.account._keys.Signature(vrs=(
    to_standard_v(extract_chain_id(tx["v"])[1]),
    w3.to_int(tx["r"]),
    w3.to_int(tx["s"])
))

if tx["type"] == 0:
    keys_to_get = type_0_keys
elif tx["type"] == 1:
    keys_to_get = type_1_keys
elif tx["type"] == 2:
    keys_to_get = type_2_keys

if "chainId" not in tx:
    # !! This is hardcoded for ETH
    tx["chainId"] = 1

tt = {k:tx[k] for k in keys_to_get}
tt["data"] = tx["input"]



ut = serializable_unsigned_transaction_from_dict(tt)
# public_address = s.recover_public_key_from_msg_hash(ut.hash())
from_address = s.recover_public_key_from_msg_hash(ut.hash()).to_checksum_address()

Though there are still edge cases to this code which I haven't been able to figure out. MEV bots are able to break the code above to give inaccurate from_addresses. A sample of tx hashes that break the system:

['0xe895e8002c2e82c84d5381c10cc2729f5196e5441b51904e73940a9800fa3251',
 '0x5d59903f3da7ac6fc9b740960e3725bd261055239e69c08e555f5809445e4708',
 '0xa74af867307cca73377fd7b4a63109ff527c5400c490069be1353119e366884d',
 '0x979c513959a6ce72c11e405fec31cde6f3611d4fbe0fe7eeebc9b43ba21d3ed7',
 '0x544eed0fd9c049ec6857dc9bf683c2531026f194d764bd2eafc0f7eb443d7df9',
 '0xdfba7a04d63812b34b1f0d1aba5c0c4a71ef9f3a480fd6a2718582e4d51245f7',
 '0xd739675ef68c16d706d90e13c3136cdb435db3d0dffb489d35759cdd9d5668dd',
 '0x82f47fcd51626938de0d929cc6c99b33f491e47129423ac95cfcb88cbe3adb61',
 '0x102deeefe7b1068e6526ef9c49312afd4fc0a550e93bdca10a82018eeeeb35e3',
 '0x71e9463c0cce26c3e4ef04243993d6a590755a03ecf4373a2234bf65434744b2',
 '0xfe5c21ee64cda05f86b80acaea7f884f32cabc412f9db336dc964592653de07a',
 '0x3ec3bae775f0ba1e231d8f1cc5020dd00c843fe6d766058adb8bf9cbe06276e9',
 '0x1dd3ec83810edb4f468dd7d435ee13fca5f48b05d2c7daf529f34c377a74ce36',
 '0xcbb2c99bde6603f9a9287c75f3d8135edae8cefd8c8a4189cc495bbe65d613ca',
 '0x9afdeee98f7ecab044a3c17869072b7f85866a5589a50b9659dccaaf6e586738',
 '0x732f41fd383abe268efd372883862b7d1cce38fbabcffc6fe5bfb7f2a5b0d6e3',
 '0x94bf81ed380b97cf65c44ce9b7299f441de7523e185d15cdf906e775750989cf',
 '0xd1a320464aad7648e9ac904ae07ead02080b114d44905112ac7112ede379f664',
 '0x03fb07b09d90fca9f80d5e38a3c56ad1fd2dab466c7742515a9e64de64364df9',
 '0x517aa4b62d78bc21815f8e9ae47346ce538da94deb30111396aa4c0afb23263a',
 '0xf340f30832276b9c99b4e12f1945023d8b16d8c3e41797ad4ee4e3c7ccd2331a',
 '0x867564aeade8196a50c824ab2e0120e3b68503d5b9546f56079ef604017ffe09',
 '0x5d59f4a728f70a0905356a4d40892f3b65c2bf2f35436415a3a6a6e0906b2c72',
 '0xf5981249e37ec3468c362f4d358f84f171094bbd625ca4b9fb1bb74ef0ba7e69',
 '0xe410aab4359a369e62158dad527b577753300db338de4134703da9b8424f1fd4',
 '0xde872cc720bc441930c1cea4cc7ebc3728f8ad98e5d377c5ffc8088866533501',
 '0x4a8d49faeb2e019d375977a90fa1ba60c3d51265340c7ad602e4dfc2dbcfdf9f',
 '0x2b7be51e70ca9330b72788d7cb13b6677b9234da21cc022e4791e28221f870db',
 '0x0ab8b1dbc3a9cf0c26efbdab00c46474c88c4627fc032fa280b96f0041abc723',
 '0x6d1e5dd7a6663504e34db8401a2a23c197aedb1d68d0afa36067e82505832a28',
 '0xa2016792a0dfeaff36172523b6607d7c164ea51e1df15d1af66cc336eaf6a03d',
 '0x5f04cda07f50a3ac2e9586e67fc2b7a1906980c4e42e97336bb6b130388c9247',
 '0xff794e04ed8988989d13016777c0e878e8bbc9ba60721d199a9379025449bea3',
 '0x1da916036b6b67531167174c95bfd163bc81234ced1794691ec656890e9bbb9b',
 '0x9b5365a7fd9344f75bf100cdb52938f1ce9bd89d058f66e46d0a8127d91e9612',
 '0x7572f852e29eb7674bd719294cb68c03c125a9ba915801c5ed813cc19c38850f',
 '0x0a5090503ebc2abc8b55191b94daa92323d7ab29f2a65b3f288bcc9745f40331',
 '0x48754d0a89b899f2fdc6df13fb18a519b100061beb385c8ca3322580e0c81966',
 '0xa99e0af04c0ea70f497bff7d1d6a47a71a413a7f064dd6d3825b31a3002995a3',
 '0x8fa92df384c8ebd4a2c0258d8d80ae44476796149289f3c558f900dd9be850c9',
 '0x0fab2ff3274becef711bd92dddbe074a8dc6330cd2f28cc20c6d61dfab6961e4',
 '0xa5c033eead1a85e3619eae7538079995600b27149f3a4d41e4bc4f8757d57f6a',
 '0x44cb1ad1cdd6065dbc7a0ce58c5ad7c8d83a9f9f5f2b753585becbe3323d9bea',
 '0x461180a5d5a1cc1917c088f370f2fcbe7816168a4bd6af49d25f8fc67f99de24',
 '0xc3acb51c2ae0071e346240022d18ee7869e862bd3d47b487e607622fc55d75b7',
 '0x5a5ef496be5d361329167b4a3b4f39a0cb8bda02a9e98e3c74923bba5c84b19d',
 '0x32a73199118b1ea581c90ad8a9617d14a30c59b3fc7178d879a3672918a2aa75',
 '0x4170c6eee1e8563bc189451e5cf02333d21535fea64c4322b0130f06aa10416a',
 '0xea721d9a680894b8c2a27dc334d2c20fbea5bdb7d648b986ff382e4ae8386c7c',
 '0x2fe0d5f41d7bb7278b13f37b658814ea0475783a7ca233f33110f7a76f97667d',
 '0xb0797d6fb51c8386c192f836293062c1e47b7058b6e7a6b20d2f077ed93f7005',
 '0x2881bb618ee43ebfd5ed9dfc517b3a5ad0935bfca3f72b2a2452b5e442aa7bde',
 '0x53f33111e1688feb276871f96c530a1386b0074a398d3f7562c749b5105ab343',
 '0x1ed5e24121ab636befe029d35bcf74425eec6f5b5ff640124f6d9cc98dd7fe4a',
 '0x9887c72ac2a23c9bac8eab0d9eaf1da19a5d255851bdf6af3d0c7d003a13e3f6',
 '0x293a8899e5c706acef0e63c6bef4438e84f4163a0e5ca5287053836681bba4f6',
 '0x8026758c8e602a3e601b8c657924cf1484405ca711f24ac40266ef53e462c61e',
 '0x71424e342688312540c09fdf96e7d4718ebe9af784838c759e35d39d77967c84',
 '0xaa8c7f4316146f17f25d8bec5d2a46630ae5a91c3e52b4bfcc1a2fd6db2c8cbd',
 '0xdd26a450b7391ecc5bfd625a2badd6c1e6865c81e4425f428e565859fee2daa7',
 '0x48c4ccd5f69f1cd79fcf7d1963cf7f46bff17fba06579b2fbcdaee8962692396',
 '0xe9490d0a44402a18c3f0b3d63466c1f48c6b5d7affdd6162f466c411376b191e',
 '0x282d417df72496e970d56296badd8946241c81aaaa68145192e886463f35e1f3',
 '0x20b1a1618ec51a85385f55b58a76c3665e33fd16b221b8f882356099d470a34c',
 '0x33b464f64b78053ebde01e19547ca709e779109161be60d8085e9b2c4b43d814',
 '0xfea3a469a5c3cccc633b7d915d1c4a9c812aead2581719e49bbc979054af9867',
 '0xe43c86677678dbe4dcf990d3f05614d500d625008bb554ff803dd278e306ab23']

Predicted, Actual, tx_hash:

0xeD430cB1dC33251c068E91b2A1d1bBe5D7614F17 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xe895e8002c2e82c84d5381c10cc2729f5196e5441b51904e73940a9800fa3251
0xdE2F0a63Edc35C456Da55ffF7b7d8A7a74eFF9aD 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x5d59903f3da7ac6fc9b740960e3725bd261055239e69c08e555f5809445e4708
0x6c2Af23f1f3668178f8F3d25545E7B8c737F5Ef9 0x24f7eF98522dd61D529464f67BB3ffe96eA8AFC2 0xa74af867307cca73377fd7b4a63109ff527c5400c490069be1353119e366884d
0x40CC06E3154f1DC85AA83c83Fb0aA52de570Ea96 0x90b14a8e71e9F3bB14917542278D31e1047e786b 0x979c513959a6ce72c11e405fec31cde6f3611d4fbe0fe7eeebc9b43ba21d3ed7
0x5D19fb8C930eb40E96629a7b549D7eb36Daa04B3 0x2e68128C55a6Dd32789b4a466719f8a4ed440C08 0x544eed0fd9c049ec6857dc9bf683c2531026f194d764bd2eafc0f7eb443d7df9
0x843E767BEBCEf1c4a0b40020a3597a916D144976 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0xdfba7a04d63812b34b1f0d1aba5c0c4a71ef9f3a480fd6a2718582e4d51245f7
0x5aCA0117Cb989607C2F26A90C2d898319CA5915F 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0xd739675ef68c16d706d90e13c3136cdb435db3d0dffb489d35759cdd9d5668dd
0x7399db5BA7153D9A7E15E39c872AeCc6c9453366 0xbf54079c9Bc879Ae4dD6BC79bCe11d3988fD9C2b 0x82f47fcd51626938de0d929cc6c99b33f491e47129423ac95cfcb88cbe3adb61
0x24a73fCF3F4f25D0D9159651f3F2aD16d6ef605d 0x93F635372008B7c5d770AAa6Ff313454c8dc498c 0x102deeefe7b1068e6526ef9c49312afd4fc0a550e93bdca10a82018eeeeb35e3
0x2601dFd3Fe31eC37dF7b3F86Ae7D942aA9313AB3 0x24f7eF98522dd61D529464f67BB3ffe96eA8AFC2 0x71e9463c0cce26c3e4ef04243993d6a590755a03ecf4373a2234bf65434744b2
0xc49E9475BA1F7fed9cD336664257Ed36a761C2D2 0xd24400ae8BfEBb18cA49Be86258a3C749cf46853 0xfe5c21ee64cda05f86b80acaea7f884f32cabc412f9db336dc964592653de07a
0x9416A164154685D727565b9a644c8502264a96dC 0xd24400ae8BfEBb18cA49Be86258a3C749cf46853 0x3ec3bae775f0ba1e231d8f1cc5020dd00c843fe6d766058adb8bf9cbe06276e9
0xc1B383236eDC1ae4577BE26c80bF5a568Cf2bee0 0xd24400ae8BfEBb18cA49Be86258a3C749cf46853 0x1dd3ec83810edb4f468dd7d435ee13fca5f48b05d2c7daf529f34c377a74ce36
0x6241b2EA4D510576C1C47741AD34536DC75b589D 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xcbb2c99bde6603f9a9287c75f3d8135edae8cefd8c8a4189cc495bbe65d613ca
0xF7D83b52BD3F7CfA58F3f5199f5f90d5aB72FdDe 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x9afdeee98f7ecab044a3c17869072b7f85866a5589a50b9659dccaaf6e586738
0x2513a6aE1B053a5388e730c8160f255b95fb5BBd 0xc9f2e6ea1637E499406986ac50ddC92401ce1f58 0x732f41fd383abe268efd372883862b7d1cce38fbabcffc6fe5bfb7f2a5b0d6e3
0xFdd6d6cB6010D07845427bD363Ea1792D6C739D9 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x94bf81ed380b97cf65c44ce9b7299f441de7523e185d15cdf906e775750989cf
0xB4668C0B15F1f31de121431C9F33B2d72cC67A63 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xd1a320464aad7648e9ac904ae07ead02080b114d44905112ac7112ede379f664
0xfFd07B0081B06B6bF1bC983a68D964885b51A789 0x0752CdE884A2075927806c432b2d4520265F111c 0x03fb07b09d90fca9f80d5e38a3c56ad1fd2dab466c7742515a9e64de64364df9
0x7Aa2ADf049540524541a71C7c07E3B3736642778 0x1cAc7a07e8cb87B73d94747028845638D55d3Fde 0x517aa4b62d78bc21815f8e9ae47346ce538da94deb30111396aa4c0afb23263a
0x79B2872A6883380568Ec43A1c971403d4F9e718a 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0xf340f30832276b9c99b4e12f1945023d8b16d8c3e41797ad4ee4e3c7ccd2331a
0x0F1f55F476087aB05B02934dc3AD0380C58f42Cc 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0x867564aeade8196a50c824ab2e0120e3b68503d5b9546f56079ef604017ffe09
0x1144CE6AB5C36FA67e6FbEFaBe7EEaE93c841703 0x188740AEc0262E1F368D85f94935B3e31EDd4FbF 0x5d59f4a728f70a0905356a4d40892f3b65c2bf2f35436415a3a6a6e0906b2c72
0x3aB8d1e4bE6BdaEd009ADf6444792c628e0Bb315 0x425A4a539C085Ff2568e19ee1304e97a92688959 0xf5981249e37ec3468c362f4d358f84f171094bbd625ca4b9fb1bb74ef0ba7e69
0xA4d2A4ea809B8De371ce26AF2F314B8d214197A9 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xe410aab4359a369e62158dad527b577753300db338de4134703da9b8424f1fd4
0x328F409D3E352D4152b593deE8F42abCFdc1C2B3 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xde872cc720bc441930c1cea4cc7ebc3728f8ad98e5d377c5ffc8088866533501
0xC666383ABf4f020b5CE4CE8C5044681E1c2cf5da 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x4a8d49faeb2e019d375977a90fa1ba60c3d51265340c7ad602e4dfc2dbcfdf9f
0xE922d55d20B78a8DeD664F1f539057847257fB78 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x2b7be51e70ca9330b72788d7cb13b6677b9234da21cc022e4791e28221f870db
0xfcbc6C92324b837E0764c06CDA0C1B176c410A24 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x0ab8b1dbc3a9cf0c26efbdab00c46474c88c4627fc032fa280b96f0041abc723
0x396C21A4AB3ad7B40d6b21DA604D4B597EcF4fE3 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x6d1e5dd7a6663504e34db8401a2a23c197aedb1d68d0afa36067e82505832a28
0x2c9146CA9E9777dC56fE1220b0527e13C00cF16a 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xa2016792a0dfeaff36172523b6607d7c164ea51e1df15d1af66cc336eaf6a03d
0x5dA805e16Bb6ad1aAA9a1BfF280d7D6E66d2adF3 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x5f04cda07f50a3ac2e9586e67fc2b7a1906980c4e42e97336bb6b130388c9247
0x97b2bE79F2988370D3e07752EdC7df70EbB1401a 0xFF02FEB96fF2bDd4f82CE71Fd42bbBA175FDd887 0xff794e04ed8988989d13016777c0e878e8bbc9ba60721d199a9379025449bea3
0xa67260649300B6802909BfaD4075B3e5274d9643 0xd24400ae8BfEBb18cA49Be86258a3C749cf46853 0x1da916036b6b67531167174c95bfd163bc81234ced1794691ec656890e9bbb9b
0x2d83147932aeeD286b7513C9d03D1fC3d15906AF 0x66E0214592dC00993044F3c8dA5a61d166BCaF02 0x9b5365a7fd9344f75bf100cdb52938f1ce9bd89d058f66e46d0a8127d91e9612
0x078059D1C476d3978f766cC29c5E4f634f47F7A3 0x66E0214592dC00993044F3c8dA5a61d166BCaF02 0x7572f852e29eb7674bd719294cb68c03c125a9ba915801c5ed813cc19c38850f
0x43Bd5cCbFC7F2e8F7a931A36fc650E4335566279 0x3d799A0a4470e066002E486B55F7d6506a2F3579 0x0a5090503ebc2abc8b55191b94daa92323d7ab29f2a65b3f288bcc9745f40331
0xbEcab29f71c34171e7A1720e66812369B7D30279 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x48754d0a89b899f2fdc6df13fb18a519b100061beb385c8ca3322580e0c81966
0x4ba87950D45C0f7E00b9569CB088353d1fDd5E7a 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xa99e0af04c0ea70f497bff7d1d6a47a71a413a7f064dd6d3825b31a3002995a3
0x10906bfEEc0e0D4D8Ed5A563b9D2546cD6CD1A4f 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x8fa92df384c8ebd4a2c0258d8d80ae44476796149289f3c558f900dd9be850c9
0x22EB53B262F9c8EE4DFC71cAb05EE2736304b685 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x0fab2ff3274becef711bd92dddbe074a8dc6330cd2f28cc20c6d61dfab6961e4
0xf48e4876f380AF3Dbd6a195933a9b3aD9b474112 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xa5c033eead1a85e3619eae7538079995600b27149f3a4d41e4bc4f8757d57f6a
0xDC9996A5308dAEC728A295d7F5ff446B84894ecf 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x44cb1ad1cdd6065dbc7a0ce58c5ad7c8d83a9f9f5f2b753585becbe3323d9bea
0xB788fcE37D1ed36bDa875BA11019423C2CB08a4c 0x8B286E3e967aD104EA51713FE0e7C47964914d25 0x461180a5d5a1cc1917c088f370f2fcbe7816168a4bd6af49d25f8fc67f99de24
0x8aa2314a5eD00cd6ca236B9754e46d9dA2079b76 0x09b1806Df13062B5f653BeDA6998972cabCF7009 0xc3acb51c2ae0071e346240022d18ee7869e862bd3d47b487e607622fc55d75b7
0x20420397Ba88A5A71EDC5Aad70B95fd0b995DD05 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x5a5ef496be5d361329167b4a3b4f39a0cb8bda02a9e98e3c74923bba5c84b19d
0x33D2548d296F494CFb80e41dd15DbA3eE13307f3 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x32a73199118b1ea581c90ad8a9617d14a30c59b3fc7178d879a3672918a2aa75
0xBEecb442fb7467A12cc94802927BFBB581C73724 0xE1e3b3448C58C1E14eA2BdaB878C48d238F2e29d 0x4170c6eee1e8563bc189451e5cf02333d21535fea64c4322b0130f06aa10416a
0x319423a10155D1De6ac8B01a4286065C23F6dDa1 0xd34D9Fc92d58128A969ba843a2bb4f699d74183F 0xea721d9a680894b8c2a27dc334d2c20fbea5bdb7d648b986ff382e4ae8386c7c
0x5AE710f6e861F1b19ffFF1b663B35C6845916400 0x111206594F2fB5927f719b4417Ab1DA3D41B14b1 0x2fe0d5f41d7bb7278b13f37b658814ea0475783a7ca233f33110f7a76f97667d
0x3A90F84b6d5C4f20B52854e51651AAcb0Acc1BE9 0x1113eFd5C8896CcF251EA360bB9d91F113707F80 0xb0797d6fb51c8386c192f836293062c1e47b7058b6e7a6b20d2f077ed93f7005
0x9f3Bd82452e89F20e5B88b11643a9d0cd6CCf13a 0xbd0aA1cB4f740401cA1c88F1B97D1018d3A05798 0x2881bb618ee43ebfd5ed9dfc517b3a5ad0935bfca3f72b2a2452b5e442aa7bde
0xb0D0A49DC5d0449E4427d5DC55e14f44bF818A6E 0x66D4104f99F6A3df367D9EC702cCDbd3c4C52cd1 0x53f33111e1688feb276871f96c530a1386b0074a398d3f7562c749b5105ab343
0x75D7c3B5A99FFe507d3D718391218D179BaFcDAe 0xAfcFC21B901D16C96fA6f1fbA665a5d981bBc7BC 0x1ed5e24121ab636befe029d35bcf74425eec6f5b5ff640124f6d9cc98dd7fe4a
0xa3246dC73bA61d5e3f4662AaE6eDF267aC3e4D53 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x9887c72ac2a23c9bac8eab0d9eaf1da19a5d255851bdf6af3d0c7d003a13e3f6
0x87050c34859F1bac10F316180001001B3eC207EF 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x293a8899e5c706acef0e63c6bef4438e84f4163a0e5ca5287053836681bba4f6
0x9E6c14117872F8bf1C98212B5d134cDBc222F0a8 0x188740AEc0262E1F368D85f94935B3e31EDd4FbF 0x8026758c8e602a3e601b8c657924cf1484405ca711f24ac40266ef53e462c61e
0xFaf0D0964211EA0374EbfA07e501c37D85591ABa 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0x71424e342688312540c09fdf96e7d4718ebe9af784838c759e35d39d77967c84
0x6960E64A54499EDfD0765A219630e6a7e2E6629f 0xae2Fc483527B8EF99EB5D9B44875F005ba1FaE13 0xaa8c7f4316146f17f25d8bec5d2a46630ae5a91c3e52b4bfcc1a2fd6db2c8cbd
0x1e675aC1ACfaCd9d5A1e3D0E1323748EA32273e3 0x047a2fbe8aEF590d4EB8942426a24970af301875 0xdd26a450b7391ecc5bfd625a2badd6c1e6865c81e4425f428e565859fee2daa7
0x261e32c055950b28968A1Db95F904c2c3B587667 0x4D521577f820525964C392352bB220482F1Aa63b 0x48c4ccd5f69f1cd79fcf7d1963cf7f46bff17fba06579b2fbcdaee8962692396
0x6ab60291dE08Cd1568Ea44d6DF6c81eE38Fd9172 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0xe9490d0a44402a18c3f0b3d63466c1f48c6b5d7affdd6162f466c411376b191e
0xa4DE26a3204C57CDc24268ac72B172BE54DBd087 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0x282d417df72496e970d56296badd8946241c81aaaa68145192e886463f35e1f3
0x8D9EBf7620805128D009e95738B4ba3D1DCa5CeA 0x0000B8e312942521fB3BF278D2Ef2458B0D3F243 0x20b1a1618ec51a85385f55b58a76c3665e33fd16b221b8f882356099d470a34c
0x59CBe6A47C9029b924d787E9DE03FFe41d8f7d72 0x0000B8e312942521fB3BF278D2Ef2458B0D3F243 0x33b464f64b78053ebde01e19547ca709e779109161be60d8085e9b2c4b43d814
0xC9Aad4794a6019c7515339315F22180d511a3A9A 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0xfea3a469a5c3cccc633b7d915d1c4a9c812aead2581719e49bbc979054af9867
0x0349044957ff2878f421aaF00FFCd972A62F375A 0x77ad3a15b78101883AF36aD4A875e17c86AC65d1 0xe43c86677678dbe4dcf990d3f05614d500d625008bb554ff803dd278e306ab23

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment