diff --git a/Pipfile b/Pipfile index b65021b0..f07ae931 100644 --- a/Pipfile +++ b/Pipfile @@ -4,26 +4,28 @@ verify_ssl = true name = "pypi" [packages] -protobuf = "*" -grpcio-tools = "*" -grpcio = "*" -asyncio = "*" +aiocron = "*" aiohttp = "*" -ecdsa = "*" +asyncio = "*" bech32 = "*" -mnemonic = "*" -hdwallets = "*" bip32 = "*" -requests = "*" -eip712_structs = "*" coincurve = "*" -aiocron = "*" -websockets = "*" +ecdsa = "*" +eip712 = "*" +grpcio = "*" +grpcio-tools = "*" +hdwallets = "*" +mnemonic = "*" +protobuf = "*" +requests = "*" +safe-pysha3 = "*" urllib3 = "<2" +websockets = "*" [dev-packages] pytest = "*" pytest-asyncio = "*" +requests-mock = "*" [requires] -python_version = "3.9" +python_version = "3" diff --git a/Pipfile.lock b/Pipfile.lock index c17ec6bb..4865929d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "43418c6c59b0ed3d50fc1f375ae7ebdf4a0a5d895c4257b6d55310855a598e86" + "sha256": "ddd9c0acafbf86fc3b26c88650bee0a2aa19d05a537541bfcbd8c8c2a1401266" }, "pipfile-spec": 6, "requires": { - "python_version": "3.9" + "python_version": "3" }, "sources": [ { @@ -182,6 +182,113 @@ "index": "pypi", "version": "==3.4" }, + "bitarray": { + "hashes": [ + "sha256:0052e0cfa15810b0dbb1e347b2e4676caa1a7a65c6f6838f50aca6518e8bc153", + "sha256:0400c5a6d68dcf4546e763b10239f916fc7145d909b7e72f0fcb372bf1d44b81", + "sha256:0655cb36ac48c7253af3de83e7c1132d04cf999c065a3afdf970d8f0fa0ed180", + "sha256:07a604d41e2a9ee88fb6f8dd6744b4c1845a537970321588485e4a55bd09e403", + "sha256:0d60f26cbfbea04d3960e442ff1d2e439dc0accc10412e0551ec743b399c1595", + "sha256:0d78d26ab9ab3b0bf684fcb4b947af71e164d2c6def892914d10d6b512383d52", + "sha256:11367e4e29d79295b83a3bbfaa9a928531b958e9db37f80497b7c6100950d049", + "sha256:128f398b119751c39abba1395764ff43995d5756844005c9d4db0e97867e6474", + "sha256:14dc0e1938955b340dc364591422a28e7c5d9c4cbb42ba215b6855b7edd5b9dc", + "sha256:15046a69aac33940fe14bdfc049a9ade5e8bd680eb662704e2581d2860be5ff7", + "sha256:158d099722ebf7294385f2071734b90e5665bba3ad56418c81b3fe3f9d39f720", + "sha256:1617c6fbe36f91e4aaa1552da57270e102a8733008d53239eac1d9f2cf15b265", + "sha256:1d8d5df5d0872edb1e1c50cd0d7fc04b0f373ad7b678ff1b1b48228d28c91f25", + "sha256:22a48b5682a6eb235d1a2ac82147e17bb4bb045afcb5869f53f42d1ba34e2bab", + "sha256:252bd62619339818a520d6ef0763086986611a2d27d2f3c0681d3d6ff7d78213", + "sha256:25321952806d070bd12fc652416047438a2f1984011f1e23e4f2391f7e3ab3d2", + "sha256:263e6239203e453a1e33b2232978012966a4e1fec47a1a519f715936e605b4e6", + "sha256:26cd0ec1a556fb5062d0bda13d8664f3bf5b0f9023a0254fbd76db366cd12673", + "sha256:2c5ed8ef5366a33a92bccb423529a8215b6dcc1a1ad095fab360eac9be94bcae", + "sha256:2e9e69d24b557fc614360e61d373b8e3114204c590c84b26ff31ac212a398052", + "sha256:37fb5777f155e5f2abc98e6db00c8bf7def8bcf2e36d736db025fa3cd7ad044e", + "sha256:38bda909b392f80b1fc04d2f86511cdec05e4a6151d0a660a50589ee0da394ae", + "sha256:3f4f8fd69642313e1ec288a22eb2ef49b8b0e6a6fb98afab0fb227a35a06543c", + "sha256:4024882e77dcb19c6e874faca47f637b97e02a9fcddc20289eabd427c641e902", + "sha256:41ef308abe02aed03058451ed17dad1365d4b4d32a7e63efa81a0becbc36b5ff", + "sha256:42b740e565858b51e8e64160ed204a8dd874293d9c78d513548da8b640b2d3c9", + "sha256:4819ad0640348da61d88e4820f2fbc66927cf6378c4fd609259a000c170660b7", + "sha256:4b729d2ee6a8b9ed9573ffd7fb3f66c5b340658013a73e334c8f7dc09d8e2bba", + "sha256:4bf7b7da77a275e937c2a42fcb846af581fc3f698683b9629827acda40bf96d1", + "sha256:4cfd9590a81606fb08adb7e08aefe1eae0b38ef65c82263b08cdb8daca1f6763", + "sha256:4d3503017ba68689b118f921b008750c955b8dd12ede9148cf99b97125670067", + "sha256:4d801f31a88f544b46c707dbfc095d427f81d02bffcfc1732a3359702550b87b", + "sha256:52baaf7c23f4416fc6ab4654cc7290ed0048950775125bed40b89bc331ede0d8", + "sha256:555f7fd1ec7b2d1b911929615df272bc831ff7b57e0d56bd6aefba427ed79c58", + "sha256:5677ca0196bf340c41c72038141e4da9ed0ac8159b7644ed4ae507d016f12787", + "sha256:576f1fd95043959cb2c04aa6835cafaa25c7f8c1b191ce99dbdd41137c6356eb", + "sha256:59b02a18100a0c94dd79d62903d29f830517291dc32fa5e36d08aea37277ae1a", + "sha256:5a862f19c387b9c53423bc5bed097c0394cead5b85dd1b55941d029889c681c3", + "sha256:5b7cdb62535b2c0851011856bb4eed233dfd183b06a254c7826a7b4b7cfaa714", + "sha256:5dabc0c23af19e48470740d4ab22cb04871f636ef297d7ae4e6a0b7f746e5500", + "sha256:67a740475995a6a53f58a922210c3d267d14780dae3cbd997a0ffc0640416fe6", + "sha256:6fd7b5c762a922df8b75080e6f976f4ce62d2b7e7648bb277b44ed482e19cf31", + "sha256:7606369109a1451623837a272c04020d47c92ea9af1bc6d074cbcceb9f9481f2", + "sha256:761bfac893c18d90b82bbdcc243e887ff315059c63f13459397e3d955834e4e9", + "sha256:761cc24012b0be2acebc2929eeaee3d9036655478974c847a0b5d5ac24d54d70", + "sha256:78b88c247ef366ad07b6877fd13fc96e363d791b200bed10706c4b5522853371", + "sha256:7e25891c8b3c29d785c18716202eacc237a9b65361e17d22d433639a3b1c0126", + "sha256:7e8ab9fa522c878afe2a049087ea723d932bbb15b0a08239d572945158731636", + "sha256:801639ec1663cde71eec343c81936aa6e2480d1ce1345560df7f63c9d49a6a4f", + "sha256:81f7c02f4a8ac119751d6350da0dba64dd4a5b4f1dd61da882b4adce0c1e3e4d", + "sha256:83ec9ea40f74bdbd4018a6d05f2ab68b20935e9c32fc1bdd3164db0a7214764a", + "sha256:8536467187b027bf40cdb1b20c0d2f0087893e427218f0db3cde0a9bd93548c6", + "sha256:85a3c39d55945f86541bc74fcecf107b0a8098b3b7f14f5126b515c9ec61857e", + "sha256:878f2c840ed693351d3531a127424af5e38e2c059727b8d47c0b8a56dc6800f2", + "sha256:8a0f3f1bb9c485f5120f49f37e18ca000beaad4c5bcb709be9a2f0061dcbdee4", + "sha256:8cf406ac78997bad3fc1b1eb99799934b309014177f0ebe46fc52d5e11e381a3", + "sha256:8de204abcb13bcfbea964e50e08dc1ee8d493b6a2da424fac1a866c24aab8557", + "sha256:9061e217e3b6041cd8eeff029681026e4c8f8c96821803e9358dc3cd2f21ce97", + "sha256:91b9de7c52fba6627c38aefda3acafc049a62aae398d0a7af6303b15dd1ad7bc", + "sha256:9225c310b34ba37627b917d49bb9ab9fb3192afdc15c4a2e466fdc3a1f3f7656", + "sha256:94871d66db2370409830b0f3a147e0bc83ebcdc7a233dfe856b989687ea29ab5", + "sha256:994de983cd6153931b98b28a3a37b14e3297d367975031f3a1610e716026bb98", + "sha256:9b66bc21240b150d14310464fe70d8b64350d3d7d1ba377251e75873d9980f2b", + "sha256:a40f3014e579372713a2f589a22dc2a95c46d04cb5c96111cc1e02b5fec398e8", + "sha256:a53f104555788164c3cc44c6e23ff2700b2aee53165d129577db0d21a697cb0d", + "sha256:a670877159565154d68c261e4a0eed151cae1ca05459d4967bfa7ed8f97785e7", + "sha256:a7fed384fc49b280533ba685aec6e3a2e0f72cd70819688991b01a23d6632f89", + "sha256:a81f6815ea3612aa490dccfb9a22274349fe4c7e83c97c6c97a6a57fb1e779b5", + "sha256:b1bdcb3c0e58087b2f38d27e91faa871a872fc8d5e7ceab4e89dd5029943030f", + "sha256:b363105ae888f305addf543471fa6bfe272a7db34c56f3e777f86c32f66c9f88", + "sha256:b43ea42693715a6a7ca11d8eb8b13c8148306559ce277a29c85afa48e9739b54", + "sha256:b44ad887182dd1b6236bc49b4f422e3360edadc0c31511764c82d5da272498b5", + "sha256:b4bc74c81184a2571b6b35bff9b0d749e8e3934ea682e5ea64b53f2b759fe111", + "sha256:b82dbc0a0b6ed67b4c9fa411c945ba642ff40a91799c0d6ce68ef623d951e468", + "sha256:b9b56d36e57ddf1b17d91597a4666adb947c38b76cba59e315ef58fa7a4d5ca9", + "sha256:bb26c370a4001cfe65115ffb564fc09401a8cf51a2cdc20def7526d253656146", + "sha256:bc3a297b9cef1210b43435d74ad8c5aea07c947676fe32306573ec42d94ff426", + "sha256:bc5a6a68fbb716a07a8cce47a9bae6db360cceb0fb60e304a51715f324f73bc8", + "sha256:becfb1f803fe380d5bcdf985e439cd4ae0ed06e19e52d5130bef2186908e350d", + "sha256:c528f2ee881e135b95306612b023c46556a811afa2ec509eab7b8d0559395bcb", + "sha256:c8bfcc26140486e52bbfb70e95fba8d4bd18f72b2aeb9659ecd2ee44f2514af0", + "sha256:ca9133085bec365957040aa88778dce400cbb9620e31a133233769d9c57567b4", + "sha256:d16fe3da83a6d7afc21313ebb17d63d820e34f736a0cf8c2da689c4c46cbc76e", + "sha256:d335e0cf7fd81ff687cfffe35ea862be582b1164fee6276ff3dec86de7dc7dfe", + "sha256:d356b956ee20a74ebe625be1cbf6536302bc09cc8ee39e29faf1ae671dee4263", + "sha256:d36b6b14ef5fa5108290c16f9af4e486e95b362468154c0ba654523674c3b877", + "sha256:d420b298a76acf7400df1d4296ab37d19157aa3397ececf3b5c288d6a76a2f8c", + "sha256:d5a76f9c263b0ed622d2ca99ad07b65dd0ebbd6d4ef4937cdd2a060ada5c6df4", + "sha256:d9e1ea490cb2760b1369b5033445b7389364c6b457d0d90524eced6c262f6bfc", + "sha256:e01bf467c3291e56ddaefb18599434c925479465d8658e5771bada6261926db9", + "sha256:e4bb54dcf8880722678e4f9fa32e7b7bfe4bd5281fd43441426767fe0afd8244", + "sha256:e73109715d748b6890c807b8a70d68939fedfda665a15ebe72009e1538f3d6fc", + "sha256:e86d7ffff696b11867c3624615461f7e91aa415ab53e3b0a08a595da78c653dc", + "sha256:e92212abfba29b903138b3be5c59d082e9dfe1e7054ed287a15f119d569046a3", + "sha256:ea1ec56b9e90ad186af7396cab8c44db720e77d34e9664c3e448c3d8b9234ea4", + "sha256:ede561bd1b20e7a647ecd00a84c15db4ba31d43bf36738337ec36f5c0ac01d31", + "sha256:f05e813ff8a06e1ef6feb23176e3d11ca4348ccd0e6715ed0e0888cb38886815", + "sha256:f66366166632e36a878e519cb91afba5ea067a65253cda747436236cd1637017", + "sha256:f89b9d0b1e09ca711e8100e78e1883b6fa6eb086f49dc8c8b4d53657188dce6e", + "sha256:fca906f07f9e3e782204366a34ddd55b405de50fd73c1c7b97e9c542076e2964", + "sha256:fe9aab0aca202df3170833c390496ca1f91ff7899076a4f7e9edf2cb04cc4d0c", + "sha256:ff91db785adc05f4f4ad6e9aa57333cb30346d2177c6470f3dbc8860121140bc" + ], + "version": "==2.7.5" + }, "certifi": { "hashes": [ "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", @@ -390,11 +497,11 @@ }, "croniter": { "hashes": [ - "sha256:924a38fda88f675ec6835667e1d32ac37ff0d65509c2152729d16ff205e32a65", - "sha256:f17f877be1d93b9e3191151584a19d8b367b017ab0febc8c5472b9300da61c4c" + "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361", + "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128" ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.3.15" + "version": "==1.4.1" }, "cytoolz": { "hashes": [ @@ -500,6 +607,14 @@ "markers": "implementation_name == 'cpython'", "version": "==0.12.1" }, + "dataclassy": { + "hashes": [ + "sha256:ad6622cb91e644d13f68768558983fbc22c90a8ff7e355638485d18b9baf1198", + "sha256:bcb030d3d700cf9b1597042bbc8375b92773e6f68f65675a7071862c0ddb87f5" + ], + "markers": "python_version >= '3.6'", + "version": "==0.11.1" + }, "ecdsa": { "hashes": [ "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49", @@ -508,36 +623,78 @@ "index": "pypi", "version": "==0.18.0" }, - "eip712-structs": { + "eip712": { "hashes": [ - "sha256:b24400aef07b4d0287fb9bf8ce02b0abbe80c476d1b67222a7c5158df3a3e38d" + "sha256:3997dace7e581b66a84d106a10baac47a3f6c94095d79c7d0971ca0ede1926ad", + "sha256:c984c577358d1c7e5d4e52802bf4bd0432e965ba7326448998f95fcc1b6d5269" ], "index": "pypi", - "version": "==1.1.0" + "version": "==0.2.1" + }, + "eth-abi": { + "hashes": [ + "sha256:15f9870ca054c09a8e474d2d7e81aff0c32421aebdac896193183fc143e31b50", + "sha256:fe738cdb24983adfe89abf727c723c288f8d0029e97fb08160b20bb5290ab475" + ], + "markers": "python_full_version >= '3.7.2' and python_version < '4'", + "version": "==4.1.0" + }, + "eth-account": { + "hashes": [ + "sha256:0ccc0edbb17021004356ae6e37887528b6e59e6ae6283f3917b9759a5887203b", + "sha256:ccb2d90a16c81c8ea4ca4dc76a70b50f1d63cea6aff3c5a5eddedf9e45143eca" + ], + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==0.8.0" }, "eth-hash": { + "extras": [ + "pycryptodome" + ], "hashes": [ - "sha256:4d992e885f3ae3901abbe98bd776ba62d0f6335f98c6e9fc60a39b9d114dfb5a", - "sha256:9805075f653e114a31a99678e93b257fb4082337696f4eff7b4371fe65158409" + "sha256:1b5f10eca7765cc385e1430eefc5ced6e2e463bb18d1365510e2e539c1a6fe4e", + "sha256:251f62f6579a1e247561679d78df37548bd5f59908da0b159982bf8293ad32f0" ], "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==0.5.1" + "version": "==0.5.2" + }, + "eth-keyfile": { + "hashes": [ + "sha256:471be6e5386fce7b22556b3d4bde5558dbce46d2674f00848027cb0a20abdc8c", + "sha256:609773a1ad5956944a33348413cad366ec6986c53357a806528c8f61c4961560" + ], + "version": "==0.6.1" + }, + "eth-keys": { + "hashes": [ + "sha256:7d18887483bc9b8a3fdd8e32ddcb30044b9f08fcb24a380d93b6eee3a5bb3216", + "sha256:e07915ffb91277803a28a379418bdd1fad1f390c38ad9353a0f189789a440d5d" + ], + "version": "==0.4.0" + }, + "eth-rlp": { + "hashes": [ + "sha256:e88e949a533def85c69fa94224618bbbd6de00061f4cff645c44621dab11cf33", + "sha256:f3263b548df718855d9a8dbd754473f383c0efc82914b0b849572ce3e06e71a6" + ], + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==0.3.0" }, "eth-typing": { "hashes": [ - "sha256:323111b3b76c8ceaff01619367aa52806f0264ca0ec1a70d4b9a42e44360f554", - "sha256:e9535e9d524d4c7a0cbd3d9832093cc5001a3e31869e72645674d24c6376d196" + "sha256:347d50713dd58ab50063b228d8271624ab2de3071bfa32d467b05f0ea31ab4c5", + "sha256:7f49610469811ee97ac43eaf6baa294778ce74042d41e61ecf22e5ebe385590f" ], - "markers": "python_version < '4' and python_full_version >= '3.7.2'", - "version": "==3.3.0" + "markers": "python_full_version >= '3.7.2' and python_version < '4'", + "version": "==3.4.0" }, "eth-utils": { "hashes": [ - "sha256:63901e54ec9e4ac16ae0a0d28e1dc48b968c20184d22f2727e5f3ca24b6250bc", - "sha256:fcb4c3c1b32947ba92970963f9aaf40da73b04ea1034964ff8c0e70595127138" + "sha256:4938ab742f91cdf19bae024261af090664f63ccf83bdb1213e7146c14209e899", + "sha256:7cccfb0b0749431d0d001e327e9a7289bf07308316a73850ae3895020e5682f4" ], "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==2.1.0" + "version": "==2.1.1" }, "frozenlist": { "hashes": [ @@ -729,6 +886,14 @@ "index": "pypi", "version": "==0.1.2" }, + "hexbytes": { + "hashes": [ + "sha256:383595ad75026cf00abd570f44b368c6cdac0c6becfae5c39ff88829877f8a59", + "sha256:a3fe35c6831ee8fafd048c4c086b986075fc14fd46258fa24ecb8d65745f9a9d" + ], + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==0.3.1" + }, "idna": { "hashes": [ "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", @@ -825,24 +990,30 @@ "markers": "python_version >= '3.7'", "version": "==6.0.4" }, + "parsimonious": { + "hashes": [ + "sha256:b2ad1ae63a2f65bd78f5e0a8ac510a98f3607a43f1db2a8d46636a5d9e4a30c1" + ], + "version": "==0.9.0" + }, "protobuf": { "hashes": [ - "sha256:09310bce43353b46d73ba7e3bca78273b9bc50349509b9698e64d288c6372c2a", - "sha256:20874e7ca4436f683b64ebdbee2129a5a2c301579a67d1a7dda2cdf62fb7f5f7", - "sha256:25e3370eda26469b58b602e29dff069cfaae8eaa0ef4550039cc5ef8dc004511", - "sha256:281342ea5eb631c86697e1e048cb7e73b8a4e85f3299a128c116f05f5c668f8f", - "sha256:384dd44cb4c43f2ccddd3645389a23ae61aeb8cfa15ca3a0f60e7c3ea09b28b3", - "sha256:54a533b971288af3b9926e53850c7eb186886c0c84e61daa8444385a4720297f", - "sha256:6c081863c379bb1741be8f8193e893511312b1d7329b4a75445d1ea9955be69e", - "sha256:86df87016d290143c7ce3be3ad52d055714ebaebb57cc659c387e76cfacd81aa", - "sha256:8da6070310d634c99c0db7df48f10da495cc283fd9e9234877f0cd182d43ab7f", - "sha256:b2cfab63a230b39ae603834718db74ac11e52bccaaf19bf20f5cce1a84cf76df", - "sha256:c52cfcbfba8eb791255edd675c1fe6056f723bf832fa67f0442218f8817c076e", - "sha256:ce744938406de1e64b91410f473736e815f28c3b71201302612a68bf01517fea", - "sha256:efabbbbac1ab519a514579ba9ec52f006c28ae19d97915951f69fa70da2c9e91" + "sha256:0149053336a466e3e0b040e54d0b615fc71de86da66791c592cc3c8d18150bf8", + "sha256:08fe19d267608d438aa37019236db02b306e33f6b9902c3163838b8e75970223", + "sha256:29660574cd769f2324a57fb78127cda59327eb6664381ecfe1c69731b83e8288", + "sha256:2991f5e7690dab569f8f81702e6700e7364cc3b5e572725098215d3da5ccc6ac", + "sha256:3b01a5274ac920feb75d0b372d901524f7e3ad39c63b1a2d55043f3887afe0c1", + "sha256:3bcbeb2bf4bb61fe960dd6e005801a23a43578200ea8ceb726d1f6bd0e562ba1", + "sha256:447b9786ac8e50ae72cae7a2eec5c5df6a9dbf9aa6f908f1b8bda6032644ea62", + "sha256:514b6bbd54a41ca50c86dd5ad6488afe9505901b3557c5e0f7823a0cf67106fb", + "sha256:5cb9e41188737f321f4fce9a4337bf40a5414b8d03227e1d9fbc59bc3a216e35", + "sha256:7a92beb30600332a52cdadbedb40d33fd7c8a0d7f549c440347bc606fb3fe34b", + "sha256:84ea0bd90c2fdd70ddd9f3d3fc0197cc24ecec1345856c2b5ba70e4d99815359", + "sha256:aca6e86a08c5c5962f55eac9b5bd6fce6ed98645d77e8bfc2b952ecd4a8e4f6a", + "sha256:cc14358a8742c4e06b1bfe4be1afbdf5c9f6bd094dff3e14edb78a1513893ff5" ], "index": "pypi", - "version": "==4.23.2" + "version": "==4.23.3" }, "pycparser": { "hashes": [ @@ -851,40 +1022,145 @@ ], "version": "==2.21" }, - "pysha3": { - "hashes": [ - "sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0", - "sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48", - "sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4", - "sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d", - "sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9", - "sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603", - "sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f", - "sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f", - "sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77", - "sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5", - "sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9", - "sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d", - "sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24", - "sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608", - "sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b", - "sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030", - "sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8", - "sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef", - "sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf", - "sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07", - "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e" - ], - "version": "==1.0.2" + "pycryptodome": { + "hashes": [ + "sha256:01489bbdf709d993f3058e2996f8f40fee3f0ea4d995002e5968965fa2fe89fb", + "sha256:10da29526a2a927c7d64b8f34592f461d92ae55fc97981aab5bbcde8cb465bb6", + "sha256:12600268763e6fec3cefe4c2dcdf79bde08d0b6dc1813887e789e495cb9f3403", + "sha256:157c9b5ba5e21b375f052ca78152dd309a09ed04703fd3721dce3ff8ecced148", + "sha256:16bfd98dbe472c263ed2821284118d899c76968db1a6665ade0c46805e6b29a4", + "sha256:363dd6f21f848301c2dcdeb3c8ae5f0dee2286a5e952a0f04954b82076f23825", + "sha256:3811e31e1ac3069988f7a1c9ee7331b942e605dfc0f27330a9ea5997e965efb2", + "sha256:422c89fd8df8a3bee09fb8d52aaa1e996120eafa565437392b781abec2a56e14", + "sha256:4604816adebd4faf8810782f137f8426bf45fee97d8427fa8e1e49ea78a52e2c", + "sha256:4944defabe2ace4803f99543445c27dd1edbe86d7d4edb87b256476a91e9ffa4", + "sha256:51eae079ddb9c5f10376b4131be9589a6554f6fd84f7f655180937f611cd99a2", + "sha256:53aee6be8b9b6da25ccd9028caf17dcdce3604f2c7862f5167777b707fbfb6cb", + "sha256:62a1e8847fabb5213ccde38915563140a5b338f0d0a0d363f996b51e4a6165cf", + "sha256:6f4b967bb11baea9128ec88c3d02f55a3e338361f5e4934f5240afcb667fdaec", + "sha256:78d863476e6bad2a592645072cc489bb90320972115d8995bcfbee2f8b209918", + "sha256:795bd1e4258a2c689c0b1f13ce9684fa0dd4c0e08680dcf597cf9516ed6bc0f3", + "sha256:7a3d22c8ee63de22336679e021c7f2386f7fc465477d59675caa0e5706387944", + "sha256:83c75952dcf4a4cebaa850fa257d7a860644c70a7cd54262c237c9f2be26f76e", + "sha256:928078c530da78ff08e10eb6cada6e0dff386bf3d9fa9871b4bbc9fbc1efe024", + "sha256:957b221d062d5752716923d14e0926f47670e95fead9d240fa4d4862214b9b2f", + "sha256:9ad6f09f670c466aac94a40798e0e8d1ef2aa04589c29faa5b9b97566611d1d1", + "sha256:9c8eda4f260072f7dbe42f473906c659dcbadd5ae6159dfb49af4da1293ae380", + "sha256:b1d9701d10303eec8d0bd33fa54d44e67b8be74ab449052a8372f12a66f93fb9", + "sha256:b6a610f8bfe67eab980d6236fdc73bfcdae23c9ed5548192bb2d530e8a92780e", + "sha256:c9adee653fc882d98956e33ca2c1fb582e23a8af7ac82fee75bd6113c55a0413", + "sha256:cb1be4d5af7f355e7d41d36d8eec156ef1382a88638e8032215c215b82a4b8ec", + "sha256:d1497a8cd4728db0e0da3c304856cb37c0c4e3d0b36fcbabcc1600f18504fc54", + "sha256:d20082bdac9218649f6abe0b885927be25a917e29ae0502eaf2b53f1233ce0c2", + "sha256:e8ad74044e5f5d2456c11ed4cfd3e34b8d4898c0cb201c4038fe41458a82ea27", + "sha256:f022a4fd2a5263a5c483a2bb165f9cb27f2be06f2f477113783efe3fe2ad887b", + "sha256:f21efb8438971aa16924790e1c3dba3a33164eb4000106a55baaed522c261acf", + "sha256:fc0a73f4db1e31d4a6d71b672a48f3af458f548059aa05e83022d5f61aac9c08" + ], + "version": "==3.18.0" }, "python-dateutil": { "hashes": [ "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.8.2" }, + "regex": { + "hashes": [ + "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938", + "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6", + "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef", + "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525", + "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af", + "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc", + "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54", + "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8", + "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7", + "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568", + "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c", + "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f", + "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536", + "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2", + "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb", + "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df", + "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019", + "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18", + "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f", + "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac", + "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8", + "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9", + "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697", + "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06", + "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d", + "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036", + "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1", + "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787", + "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9", + "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0", + "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7", + "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461", + "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee", + "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3", + "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0", + "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f", + "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14", + "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477", + "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd", + "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16", + "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc", + "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff", + "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd", + "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2", + "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e", + "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef", + "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07", + "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3", + "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3", + "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a", + "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7", + "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa", + "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82", + "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77", + "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222", + "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c", + "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd", + "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d", + "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68", + "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9", + "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693", + "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487", + "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06", + "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591", + "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27", + "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a", + "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969", + "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3", + "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0", + "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7", + "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751", + "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747", + "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289", + "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72", + "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777", + "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9", + "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1", + "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1", + "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e", + "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf", + "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f", + "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd", + "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2", + "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c", + "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1", + "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88", + "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9", + "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23" + ], + "markers": "python_version >= '3.6'", + "version": "==2023.6.3" + }, "requests": { "hashes": [ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", @@ -893,6 +1169,20 @@ "index": "pypi", "version": "==2.31.0" }, + "rlp": { + "hashes": [ + "sha256:63b0465d2948cd9f01de449d7adfb92d207c1aef3982f20310f8009be4a507e8", + "sha256:d2a963225b3f26795c5b52310e0871df9824af56823d739511583ef459895a7d" + ], + "version": "==3.0.0" + }, + "safe-pysha3": { + "hashes": [ + "sha256:e429146b1edd198b2ca934a2046a65656c5d31b0ec894bbd6055127f4deaff17" + ], + "index": "pypi", + "version": "==1.0.4" + }, "setuptools": { "hashes": [ "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f", @@ -906,7 +1196,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.16.0" }, "toolz": { @@ -1091,13 +1381,102 @@ } }, "develop": { - "exceptiongroup": { + "certifi": { "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", + "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" ], - "markers": "python_version < '3.11'", - "version": "==1.1.1" + "markers": "python_version >= '3.6'", + "version": "==2023.5.7" + }, + "charset-normalizer": { + "hashes": [ + "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", + "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", + "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", + "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", + "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", + "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", + "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", + "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", + "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", + "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", + "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", + "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", + "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", + "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", + "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", + "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", + "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", + "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", + "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", + "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", + "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", + "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", + "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", + "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", + "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", + "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", + "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", + "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", + "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", + "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", + "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", + "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", + "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", + "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", + "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", + "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", + "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", + "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", + "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", + "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", + "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", + "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", + "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", + "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", + "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", + "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", + "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", + "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", + "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", + "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", + "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", + "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", + "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", + "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", + "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", + "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", + "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", + "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", + "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", + "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", + "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", + "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", + "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", + "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", + "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", + "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", + "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", + "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", + "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", + "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", + "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", + "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", + "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", + "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", + "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.0" + }, + "idna": { + "hashes": [ + "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + ], + "markers": "python_version >= '3.5'", + "version": "==3.4" }, "iniconfig": { "hashes": [ @@ -1125,11 +1504,11 @@ }, "pytest": { "hashes": [ - "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362", - "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3" + "sha256:cdcbd012c9312258922f8cd3f1b62a6580fdced17db6014896053d47cddf9295", + "sha256:ee990a3cc55ba808b80795a79944756f315c67c12b56abd3ac993a7b8c17030b" ], "index": "pypi", - "version": "==7.3.1" + "version": "==7.3.2" }, "pytest-asyncio": { "hashes": [ @@ -1139,13 +1518,37 @@ "index": "pypi", "version": "==0.21.0" }, - "tomli": { + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "index": "pypi", + "version": "==2.31.0" + }, + "requests-mock": { + "hashes": [ + "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4", + "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15" + ], + "index": "pypi", + "version": "==1.11.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.16.0" + }, + "urllib3": { "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", + "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" + "index": "pypi", + "version": "==1.26.16" } } } diff --git a/README.md b/README.md index 143bad81..0107105c 100644 --- a/README.md +++ b/README.md @@ -87,11 +87,20 @@ make tests ``` ### Changelogs -**0.6.4**(change before release) +**0.7** +* Removed references to pysha3 library (and also eip712-struct that required it) and replaced it with other implementation to allow the project to work with Python 3.11 + +**0.6.5** +* Removed `k8s` from the list of supported mainnet nodes (`lb` should be used instead) + +**0.6.4** * Change logging logic to use different loggers for each module and class * Solved issue preventing requesting spot and derivative historical orders for more than one market_id * Add `pytest` as a development dependency to implement and run unit tests +**0.6.3.3** +* Update the code to the new structure of transaction responses + **0.6.3.1** * Update the code to the new structure of transaction simulation responses diff --git a/examples/exchange_client/explorer_rpc/1_GetTxByHash.py b/examples/exchange_client/explorer_rpc/1_GetTxByHash.py index dc76bfa1..7362d1e0 100644 --- a/examples/exchange_client/explorer_rpc/1_GetTxByHash.py +++ b/examples/exchange_client/explorer_rpc/1_GetTxByHash.py @@ -2,15 +2,22 @@ import logging from pyinjective.async_client import AsyncClient +from pyinjective.composer import Composer from pyinjective.constant import Network async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() client = AsyncClient(network, insecure=False) + composer = Composer(network=network.string()) tx_hash = "0F3EBEC1882E1EEAC5B7BDD836E976250F1CD072B79485877CEACCB92ACDDF52" - account = await client.get_tx_by_hash(tx_hash=tx_hash) - print(account) + transaction_response = await client.get_tx_by_hash(tx_hash=tx_hash) + print(transaction_response) + + transaction_messages = composer.UnpackTransactionMessages(transaction=transaction_response.data) + print(transaction_messages) + first_message = transaction_messages[0] + print(first_message) if __name__ == '__main__': asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/2_AccountTxs.py b/examples/exchange_client/explorer_rpc/2_AccountTxs.py index 6b9566fc..7e5c7a3f 100644 --- a/examples/exchange_client/explorer_rpc/2_AccountTxs.py +++ b/examples/exchange_client/explorer_rpc/2_AccountTxs.py @@ -2,17 +2,23 @@ import logging from pyinjective.async_client import AsyncClient +from pyinjective.composer import Composer from pyinjective.constant import Network async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() client = AsyncClient(network, insecure=False) + composer = Composer(network=network.string()) address = "inj1phd706jqzd9wznkk5hgsfkrc8jqxv0kmlj0kex" - type = "cosmos.bank.v1beta1.MsgSend" + message_type = "cosmos.bank.v1beta1.MsgSend" limit = 2 - account = await client.get_account_txs(address=address, type=type, limit=limit) - print(account) + transactions_response = await client.get_account_txs(address=address, type=message_type, limit=limit) + print(transactions_response) + first_transaction_messages = composer.UnpackTransactionMessages(transaction=transactions_response.data[0]) + print(first_transaction_messages) + first_message = first_transaction_messages[0] + print(first_message) if __name__ == '__main__': asyncio.get_event_loop().run_until_complete(main()) diff --git a/pyinjective/composer.py b/pyinjective/composer.py index b7f09bb7..5db90cc9 100644 --- a/pyinjective/composer.py +++ b/pyinjective/composer.py @@ -2,7 +2,7 @@ import json import logging -from google.protobuf import any_pb2, message, timestamp_pb2 +from google.protobuf import any_pb2, timestamp_pb2, json_format from .proto.cosmos.authz.v1beta1 import authz_pb2 as cosmos_authz_pb from .proto.cosmos.authz.v1beta1 import tx_pb2 as cosmos_authz_tx_pb @@ -13,7 +13,6 @@ from .proto.injective.exchange.v1beta1 import tx_pb2 as injective_exchange_tx_pb from pyinjective.proto.injective.exchange.v1beta1 import exchange_pb2 as injective_dot_exchange_dot_v1beta1_dot_exchange__pb2 -from .proto.injective.types.v1beta1 import tx_response_pb2 as tx_response_pb from .proto.injective.auction.v1beta1 import tx_pb2 as injective_auction_tx_pb @@ -958,3 +957,45 @@ def UnpackMsgExecResponse(msg_type, data): responses = [header_map[msg_type].FromString(result) for result in data.results] return responses + + @staticmethod + def UnpackTransactionMessages(transaction): + meta_messages = json.loads(transaction.messages.decode()) + + header_map = { + "/injective.exchange.v1beta1.MsgCreateSpotLimitOrder": injective_exchange_tx_pb.MsgCreateSpotLimitOrderResponse, + "/injective.exchange.v1beta1.MsgCreateSpotMarketOrder": injective_exchange_tx_pb.MsgCreateSpotMarketOrderResponse, + "/injective.exchange.v1beta1.MsgCreateDerivativeLimitOrder": injective_exchange_tx_pb.MsgCreateDerivativeLimitOrderResponse, + "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrder": injective_exchange_tx_pb.MsgCreateDerivativeMarketOrderResponse, + "/injective.exchange.v1beta1.MsgCancelSpotOrder": injective_exchange_tx_pb.MsgCancelSpotOrderResponse, + "/injective.exchange.v1beta1.MsgCancelDerivativeOrder": injective_exchange_tx_pb.MsgCancelDerivativeOrderResponse, + "/injective.exchange.v1beta1.MsgBatchCancelSpotOrders": injective_exchange_tx_pb.MsgBatchCancelSpotOrdersResponse, + "/injective.exchange.v1beta1.MsgBatchCancelDerivativeOrders": injective_exchange_tx_pb.MsgBatchCancelDerivativeOrdersResponse, + "/injective.exchange.v1beta1.MsgBatchCreateSpotLimitOrders": injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrders, + "/injective.exchange.v1beta1.MsgBatchCreateDerivativeLimitOrders": injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrders, + "/injective.exchange.v1beta1.MsgBatchUpdateOrders": injective_exchange_tx_pb.MsgBatchUpdateOrders, + "/injective.exchange.v1beta1.MsgDeposit": injective_exchange_tx_pb.MsgDeposit, + "/injective.exchange.v1beta1.MsgWithdraw": injective_exchange_tx_pb.MsgWithdraw, + "/injective.exchange.v1beta1.MsgSubaccountTransfer": injective_exchange_tx_pb.MsgSubaccountTransfer, + "/injective.exchange.v1beta1.MsgLiquidatePosition": injective_exchange_tx_pb.MsgLiquidatePosition, + "/injective.exchange.v1beta1.MsgIncreasePositionMargin": injective_exchange_tx_pb.MsgIncreasePositionMargin, + "/injective.auction.v1beta1.MsgBid": injective_auction_tx_pb.MsgBid, + "/injective.exchange.v1beta1.MsgCreateBinaryOptionsLimitOrder": injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrder, + "/injective.exchange.v1beta1.MsgCreateBinaryOptionsMarketOrder": injective_exchange_tx_pb.MsgCreateBinaryOptionsMarketOrder, + "/injective.exchange.v1beta1.MsgCancelBinaryOptionsOrder": injective_exchange_tx_pb.MsgCancelBinaryOptionsOrder, + "/injective.exchange.v1beta1.MsgAdminUpdateBinaryOptionsMarket": injective_exchange_tx_pb.MsgAdminUpdateBinaryOptionsMarket, + "/injective.exchange.v1beta1.MsgInstantBinaryOptionsMarketLaunch": injective_exchange_tx_pb.MsgInstantBinaryOptionsMarketLaunch, + "/cosmos.bank.v1beta1.MsgSend": cosmos_bank_tx_pb.MsgSend, + "/cosmos.authz.v1beta1.MsgGrant": cosmos_authz_tx_pb.MsgGrant, + "/cosmos.authz.v1beta1.MsgExec": cosmos_authz_tx_pb.MsgExec, + "/cosmos.authz.v1beta1.MsgRevoke": cosmos_authz_tx_pb.MsgRevoke, + "/injective.oracle.v1beta1.MsgRelayPriceFeedPrice": injective_oracle_tx_pb.MsgRelayPriceFeedPrice, + "/injective.oracle.v1beta1.MsgRelayProviderPrices": injective_oracle_tx_pb.MsgRelayProviderPrices, + } + + msgs = [] + for msg in meta_messages: + msg_as_string_dict = json.dumps(msg["value"]) + msgs.append(json_format.Parse(msg_as_string_dict, header_map[msg["type"]]())) + + return msgs diff --git a/pyinjective/constant.py b/pyinjective/constant.py index 72bbf2ec..0cb16a77 100644 --- a/pyinjective/constant.py +++ b/pyinjective/constant.py @@ -109,7 +109,6 @@ def testnet(cls): @classmethod def mainnet(cls, node='lb'): nodes = [ - 'k8s', # us, prod 'lb', # us, asia, prod 'sentry0', # ca, prod 'sentry1', # ca, prod diff --git a/pyinjective/orderhash.py b/pyinjective/orderhash.py index 06d54eae..b27551b1 100644 --- a/pyinjective/orderhash.py +++ b/pyinjective/orderhash.py @@ -1,38 +1,48 @@ -import sha3 import requests from decimal import Decimal -from eip712_structs import make_domain, EIP712Struct, String - -class OrderInfo(EIP712Struct): - SubaccountId = String() - FeeRecipient = String() - Price = String() - Quantity = String() - -class SpotOrder(EIP712Struct): - MarketId = String() - OrderInfo = OrderInfo - Salt = String() - OrderType = String() - TriggerPrice = String() - -class DerivativeOrder(EIP712Struct): - MarketId = String() - OrderInfo = OrderInfo - OrderType = String() - Margin = String() - TriggerPrice = String() - Salt = String() - -EIP712_domain = make_domain( - name='Injective Protocol', - version='2.0.0', - chainId=888, - verifyingContract='0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', - salt='0x0000000000000000000000000000000000000000000000000000000000000000' -) - -domain_separator = EIP712_domain.hash_struct() + +from eip712.messages import EIP712Message, EIP712Type +from eth_account.messages import _hash_eip191_message as hash_eip191_message +from hexbytes import HexBytes + + +class OrderInfo(EIP712Type): + SubaccountId: "string" + FeeRecipient: "string" + Price: "string" + Quantity: "string" + + +class SpotOrder(EIP712Message): + _name_ = "Injective Protocol" + _version_ = "2.0.0" + _chainId_ = 888 + _verifyingContract_ = "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + _salt_ = HexBytes("0x0000000000000000000000000000000000000000000000000000000000000000") + + MarketId: "string" + OrderInfo: OrderInfo + Salt: "string" + OrderType: "string" + TriggerPrice: "string" + + +class DerivativeOrder(EIP712Message): + _name_ = "Injective Protocol" + _version_ = "2.0.0" + _chainId_ = 888 + _verifyingContract_ = "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + _salt_ = HexBytes("0x0000000000000000000000000000000000000000000000000000000000000000") + + MarketId: "string" + OrderInfo: OrderInfo + OrderType: "string" + Margin: "string" + TriggerPrice: "string" + Salt: "string" + + +# domain_separator = EIP712_domain.hash_struct() order_type_dict = {0: '\x00', 1: '\x01', 2: '\x02', 3: '\x03', 4: '\x04', 5: '\x05', 6: '\x06', 7: '\x07', 8: '\x08'} class OrderHashResponse: @@ -127,8 +137,6 @@ def build_eip712_msg(order, nonce): ) def hash_order(msg): - typed_data_hash = msg.hash_struct() - typed_bytes = b'\x19\x01' + domain_separator + typed_data_hash - keccak256 = sha3.keccak_256() - keccak256.update(typed_bytes) - return '0x' + keccak256.hexdigest() + signable_message = msg.signable_message + hex_digest = hash_eip191_message(signable_message=signable_message).hex() + return "0x" + hex_digest diff --git a/pyinjective/transaction.py b/pyinjective/transaction.py index 0a83ec9e..7a02228f 100644 --- a/pyinjective/transaction.py +++ b/pyinjective/transaction.py @@ -46,7 +46,7 @@ def with_messages(self, *msgs: message.Message) -> "Transaction": def with_sender(self, client: Client, sender: str) -> "Transaction": if len(self.msgs) == 0: - raise EmptyMsgError("messsage is empty, please use with_messages at least 1 message") + raise EmptyMsgError("message is empty, please use with_messages at least 1 message") account = client.get_account(sender) if account: self.account_num = account.account_number diff --git a/pyinjective/wallet.py b/pyinjective/wallet.py index f682cdd2..c557dd8f 100644 --- a/pyinjective/wallet.py +++ b/pyinjective/wallet.py @@ -1,11 +1,10 @@ -import sys import sha3 import hashlib -import bech32 import aiohttp import json import requests from typing import Tuple + from bech32 import bech32_encode, bech32_decode, convertbits from bip32 import BIP32 from ecdsa import SigningKey, VerifyingKey, SECP256k1, BadSignatureError @@ -25,6 +24,7 @@ DEFAULT_DERIVATION_PATH = "m/44'/60'/0'/0/0" + class PrivateKey: """ Class for wrapping SigningKey that is used for signature creation and public key derivation. @@ -99,9 +99,8 @@ def sign(self, msg: bytes) -> bytes: :return: a signature of this private key over the given message """ - # return self.signing_key.sign_deterministic(msg, hashfunc=hashlib.sha256, sigencode=sigencode_string_canonize) - return self.signing_key.sign_deterministic(msg, hashfunc=sha3.keccak_256, sigencode=sigencode_string_canonize) + return self.signing_key.sign_deterministic(msg, hashfunc=sha3.keccak_256, sigencode=sigencode_string_canonize) class PublicKey: """ @@ -174,15 +173,10 @@ def to_cons_bech32(self) -> str: def to_address(self) -> "Address": """Return address instance from this public key""" - # pubkey = self.verify_key.to_string("compressed") - # s = hashlib.new("sha256", pubkey).digest() - # r = hashlib.new("ripemd160", s).digest() - # return Address(r) - pubkey = self.verify_key.to_string("uncompressed") - k = sha3.keccak_256() - k.update(pubkey[1:]) - addr = k.digest()[12:] + keccak_hash = sha3.keccak_256() + keccak_hash.update(pubkey[1:]) + addr = keccak_hash.digest()[12:] return Address(addr) def verify(self, msg: bytes, sig: bytes) -> bool: diff --git a/setup.py b/setup.py index cbad77b8..f3c350d7 100755 --- a/setup.py +++ b/setup.py @@ -16,30 +16,33 @@ URL = "https://github.com/InjectiveLabs/sdk-python" EMAIL = "achilleas@injectivelabs.com" AUTHOR = "Injective Labs" -REQUIRES_PYTHON = ">=3.7, <3.11" -VERSION = "0.6.4-pre" +REQUIRES_PYTHON = ">=3.9" +VERSION = "0.7" REQUIRED = [ - "protobuf", - "grpcio-tools", - "grpcio", - "asyncio", "aiohttp", - "ecdsa", + "aiocron", + "asyncio", "bech32", - "mnemonic", - "hdwallets", "bip32", - "requests", - "eip712_structs", "coincurve", - "aiocron", - "websockets" + "ecdsa", + "eip712", + "grpcio", + "grpcio-tools", + "hdwallets", + "mnemonic", + "protobuf", + "requests", + "safe-pysha3", + "urllib3", + "websockets", ] DEV_REQUIRED = [ "pytest", "pytest-asyncio", + "request-mock", ] # The rest you shouldn't have to touch too much :) diff --git a/tests/test_orderhash.py b/tests/test_orderhash.py new file mode 100644 index 00000000..2aff84a0 --- /dev/null +++ b/tests/test_orderhash.py @@ -0,0 +1,59 @@ +from pyinjective import PrivateKey +from pyinjective.composer import Composer +from pyinjective.constant import Network +from pyinjective.orderhash import OrderHashManager + + +class TestOrderHashManager: + + def test_spot_order_hash(self, requests_mock): + network = Network.devnet() + composer = Composer(network=network.string()) + priv_key = PrivateKey.from_mnemonic("test one few words") + pub_key = priv_key.to_public_key() + address = pub_key.to_address() + + subaccount_id = address.get_subaccount_id(index=0) + + url = network.lcd_endpoint + "/injective/exchange/v1beta1/exchange/" + subaccount_id + requests_mock.get(url, json={"nonce": 0}) + order_hash_manager = OrderHashManager( + address=address, + network=network, + subaccount_indexes=[0] + ) + + spot_market_id = "0xa508cb32923323679f29a032c70342c147c17d0145625922b0ef22e955c844c0" + fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" + + spot_orders = [ + composer.SpotOrder( + market_id=spot_market_id, + subaccount_id=subaccount_id, + fee_recipient=fee_recipient, + price=0.524, + quantity=0.01, + is_buy=True, + is_po=False + ), + composer.SpotOrder( + market_id=spot_market_id, + subaccount_id=subaccount_id, + fee_recipient=fee_recipient, + price=27.92, + quantity=0.01, + is_buy=False, + is_po=False + ), + ] + + order_hashes_response = order_hash_manager.compute_order_hashes( + spot_orders=spot_orders, + derivative_orders=[], + subaccount_index=0 + ) + + assert (len(order_hashes_response.spot) == 2) + assert (len(order_hashes_response.derivative) == 0) + assert (order_hashes_response.spot[0] == "0x6b1e4d1fb3012735dd5e386175eb4541c024e0d8dbfeb452767b973d70ae0924") + assert (order_hashes_response.spot[1] == "0xb36146f913955d989269732d167ec554e6d0d544411d82d7f86aef18350b252b") diff --git a/tests/test_wallet.py b/tests/test_wallet.py new file mode 100644 index 00000000..4e6132a6 --- /dev/null +++ b/tests/test_wallet.py @@ -0,0 +1,29 @@ +from eth_hash.auto import keccak + +from pyinjective import PrivateKey, Address + + +class TestPrivateKey: + + def test_private_key_signature_generation(self): + private_key = PrivateKey.from_mnemonic("test mnemonic never use other places") + + signature = private_key.sign(msg="test message".encode()) + expected_signature = b'\x8f\xae\xcb#z\x9a+\x12\x88\xea\xb5xZ"\x8f\x98y\xb8\x97\xa7F\xd5\xdd\x15s\x05;\x04\x1d\xbaY|rw\x8b\xbb\x19\xfc\x8e\x15\x8b\xf1\x18\x08\xba\xc7\x15\xed\xb0\xee\x95\x0e|Ch\x7f\xaf\x9cH\xc6\x9f\xbf\x14\xa5' + + assert (expected_signature == signature) + + +class TestPublicKey: + + def test_convert_public_key_to_address(self): + private_key = PrivateKey.from_mnemonic("test mnemonic never use other places") + public_key = private_key.to_public_key() + address = public_key.to_address() + + key = public_key.verify_key.to_string("uncompressed") + hashed_value = keccak(key[1:]) + expected_address = Address(hashed_value[12:]) + + assert (expected_address == address) +