diff --git a/backend/Pipfile b/backend/Pipfile index a05d72e2..20e05fea 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -77,7 +77,7 @@ python-dotenv = "*" dataclasses-json = "*" jwcrypto = "*" sqlalchemy-paginator = "*" -diem = "*" +diem = {extras = ["all"], version = "*"} [pipenv] allow_prereleases = true diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index 553d3b15..c275d2ae 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3a58f24adcc77b417de050a74786b9f63f4a5fe34c1e9e213dd747727a582f4d" + "sha256": "f46ab153a4d04b842fae2631e960f7a42e620b486f415d518d055c4ef63f5210" }, "pipfile-spec": 6, "requires": { @@ -18,46 +18,46 @@ "default": { "aiohttp": { "hashes": [ - "sha256:0b795072bb1bf87b8620120a6373a3c61bfcb8da7e5c2377f4bb23ff4f0b62c9", - "sha256:0d438c8ca703b1b714e82ed5b7a4412c82577040dadff479c08405e2a715564f", - "sha256:16a3cb5df5c56f696234ea9e65e227d1ebe9c18aa774d36ff42f532139066a5f", - "sha256:1edfd82a98c5161497bbb111b2b70c0813102ad7e0aa81cbeb34e64c93863005", - "sha256:2406dc1dda01c7f6060ab586e4601f18affb7a6b965c50a8c90ff07569cf782a", - "sha256:2858b2504c8697beb9357be01dc47ef86438cc1cb36ecb6991796d19475faa3e", - "sha256:2a7b7640167ab536c3cb90cfc3977c7094f1c5890d7eeede8b273c175c3910fd", - "sha256:3228b7a51e3ed533f5472f54f70fd0b0a64c48dc1649a0f0e809bec312934d7a", - "sha256:328b552513d4f95b0a2eea4c8573e112866107227661834652a8984766aa7656", - "sha256:39f4b0a6ae22a1c567cb0630c30dd082481f95c13ca528dc501a7766b9c718c0", - "sha256:3b0036c978cbcc4a4512278e98e3e6d9e6b834dc973206162eddf98b586ef1c6", - "sha256:3ea8c252d8df5e9166bcf3d9edced2af132f4ead8ac422eac723c5781063709a", - "sha256:41608c0acbe0899c852281978492f9ce2c6fbfaf60aff0cefc54a7c4516b822c", - "sha256:59d11674964b74a81b149d4ceaff2b674b3b0e4d0f10f0be1533e49c4a28408b", - "sha256:5e479df4b2d0f8f02133b7e4430098699450e1b2a826438af6bec9a400530957", - "sha256:684850fb1e3e55c9220aad007f8386d8e3e477c4ec9211ae54d968ecdca8c6f9", - "sha256:6ccc43d68b81c424e46192a778f97da94ee0630337c9bbe5b2ecc9b0c1c59001", - "sha256:6d42debaf55450643146fabe4b6817bb2a55b23698b0434107e892a43117285e", - "sha256:710376bf67d8ff4500a31d0c207b8941ff4fba5de6890a701d71680474fe2a60", - "sha256:756ae7efddd68d4ea7d89c636b703e14a0c686688d42f588b90778a3c2fc0564", - "sha256:77149002d9386fae303a4a162e6bce75cc2161347ad2ba06c2f0182561875d45", - "sha256:78e2f18a82b88cbc37d22365cf8d2b879a492faedb3f2975adb4ed8dfe994d3a", - "sha256:7d9b42127a6c0bdcc25c3dcf252bb3ddc70454fac593b1b6933ae091396deb13", - "sha256:8389d6044ee4e2037dca83e3f6994738550f6ee8cfb746762283fad9b932868f", - "sha256:9c1a81af067e72261c9cbe33ea792893e83bc6aa987bfbd6fdc1e5e7b22777c4", - "sha256:c1e0920909d916d3375c7a1fdb0b1c78e46170e8bb42792312b6eb6676b2f87f", - "sha256:c68fdf21c6f3573ae19c7ee65f9ff185649a060c9a06535e9c3a0ee0bbac9235", - "sha256:c733ef3bdcfe52a1a75564389bad4064352274036e7e234730526d155f04d914", - "sha256:c9c58b0b84055d8bc27b7df5a9d141df4ee6ff59821f922dd73155861282f6a3", - "sha256:d03abec50df423b026a5aa09656bd9d37f1e6a49271f123f31f9b8aed5dc3ea3", - "sha256:d2cfac21e31e841d60dc28c0ec7d4ec47a35c608cb8906435d47ef83ffb22150", - "sha256:dcc119db14757b0c7bce64042158307b9b1c76471e655751a61b57f5a0e4d78e", - "sha256:df3a7b258cc230a65245167a202dd07320a5af05f3d41da1488ba0fa05bc9347", - "sha256:df48a623c58180874d7407b4d9ec06a19b84ed47f60a3884345b1a5099c1818b", - "sha256:e1b95972a0ae3f248a899cdbac92ba2e01d731225f566569311043ce2226f5e7", - "sha256:f326b3c1bbfda5b9308252ee0dcb30b612ee92b0e105d4abec70335fab5b1245", - "sha256:f411cb22115cb15452d099fec0ee636b06cf81bfb40ed9c02d30c8dc2bc2e3d1" - ], - "index": "pypi", - "version": "==3.7.3" + "sha256:119feb2bd551e58d83d1b38bfa4cb921af8ddedec9fad7183132db334c3133e0", + "sha256:16d0683ef8a6d803207f02b899c928223eb219111bd52420ef3d7a8aa76227b6", + "sha256:2eb3efe243e0f4ecbb654b08444ae6ffab37ac0ef8f69d3a2ffb958905379daf", + "sha256:2ffea7904e70350da429568113ae422c88d2234ae776519549513c8f217f58a9", + "sha256:40bd1b101b71a18a528ffce812cc14ff77d4a2a1272dfb8b11b200967489ef3e", + "sha256:418597633b5cd9639e514b1d748f358832c08cd5d9ef0870026535bd5eaefdd0", + "sha256:481d4b96969fbfdcc3ff35eea5305d8565a8300410d3d269ccac69e7256b1329", + "sha256:4c1bdbfdd231a20eee3e56bd0ac1cd88c4ff41b64ab679ed65b75c9c74b6c5c2", + "sha256:5563ad7fde451b1986d42b9bb9140e2599ecf4f8e42241f6da0d3d624b776f40", + "sha256:58c62152c4c8731a3152e7e650b29ace18304d086cb5552d317a54ff2749d32a", + "sha256:5b50e0b9460100fe05d7472264d1975f21ac007b35dcd6fd50279b72925a27f4", + "sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de", + "sha256:5dde6d24bacac480be03f4f864e9a67faac5032e28841b00533cd168ab39cad9", + "sha256:5e91e927003d1ed9283dee9abcb989334fc8e72cf89ebe94dc3e07e3ff0b11e9", + "sha256:62bc216eafac3204877241569209d9ba6226185aa6d561c19159f2e1cbb6abfb", + "sha256:6c8200abc9dc5f27203986100579fc19ccad7a832c07d2bc151ce4ff17190076", + "sha256:6ca56bdfaf825f4439e9e3673775e1032d8b6ea63b8953d3812c71bd6a8b81de", + "sha256:71680321a8a7176a58dfbc230789790639db78dad61a6e120b39f314f43f1907", + "sha256:7c7820099e8b3171e54e7eedc33e9450afe7cd08172632d32128bd527f8cb77d", + "sha256:7dbd087ff2f4046b9b37ba28ed73f15fd0bc9f4fdc8ef6781913da7f808d9536", + "sha256:822bd4fd21abaa7b28d65fc9871ecabaddc42767884a626317ef5b75c20e8a2d", + "sha256:8ec1a38074f68d66ccb467ed9a673a726bb397142c273f90d4ba954666e87d54", + "sha256:950b7ef08b2afdab2488ee2edaff92a03ca500a48f1e1aaa5900e73d6cf992bc", + "sha256:99c5a5bf7135607959441b7d720d96c8e5c46a1f96e9d6d4c9498be8d5f24212", + "sha256:b84ad94868e1e6a5e30d30ec419956042815dfaea1b1df1cef623e4564c374d9", + "sha256:bc3d14bf71a3fb94e5acf5bbf67331ab335467129af6416a437bd6024e4f743d", + "sha256:c2a80fd9a8d7e41b4e38ea9fe149deed0d6aaede255c497e66b8213274d6d61b", + "sha256:c44d3c82a933c6cbc21039326767e778eface44fca55c65719921c4b9661a3f7", + "sha256:cc31e906be1cc121ee201adbdf844522ea3349600dd0a40366611ca18cd40e81", + "sha256:d5d102e945ecca93bcd9801a7bb2fa703e37ad188a2f81b1e65e4abe4b51b00c", + "sha256:dd7936f2a6daa861143e376b3a1fb56e9b802f4980923594edd9ca5670974895", + "sha256:dee68ec462ff10c1d836c0ea2642116aba6151c6880b688e56b4c0246770f297", + "sha256:e76e78863a4eaec3aee5722d85d04dcbd9844bc6cd3bfa6aa880ff46ad16bfcb", + "sha256:eab51036cac2da8a50d7ff0ea30be47750547c9aa1aa2cf1a1b710a1827e7dbe", + "sha256:f4496d8d04da2e98cc9133e238ccebf6a13ef39a93da2e87146c8c8ac9768242", + "sha256:fbd3b5e18d34683decc00d9a360179ac1e7a320a5fee10ab8053ffd6deab76e0", + "sha256:feb24ff1226beeb056e247cf2e24bba5232519efb5645121c4aea5b6ad74c1f2" + ], + "index": "pypi", + "version": "==3.7.4" }, "apispec": { "hashes": [ @@ -83,11 +83,11 @@ }, "astroid": { "hashes": [ - "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703", - "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386" + "sha256:21d735aab248253531bb0f1e1e6d068f0ee23533e18ae8a6171ff892b98297cf", + "sha256:cfc35498ee64017be059ceffab0a25bedf7548ab76f2bea691c5565896e7128d" ], "index": "pypi", - "version": "==2.4.2" + "version": "==2.5.1" }, "async-timeout": { "hashes": [ @@ -189,11 +189,16 @@ }, "cryptography": { "hashes": [ + "sha256:066bc53f052dfeda2f2d7c195cf16fb3e5ff13e1b6b7415b468514b40b381a5b", + "sha256:0923ba600d00718d63a3976f23cab19aef10c1765038945628cd9be047ad0336", "sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87", + "sha256:4169a27b818de4a1860720108b55a2801f32b6ae79e7f99c00d79f2a2822eeb7", "sha256:57ad77d32917bc55299b16d3b996ffa42a1c73c6cfa829b14043c561288d2799", "sha256:5ecf2bcb34d17415e89b546dbb44e73080f747e504273e4d4987630493cded1b", + "sha256:600cf9bfe75e96d965509a4c0b2b183f74a4fa6f5331dcb40fb7b77b7c2484df", "sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0", "sha256:93cfe5b7ff006de13e1e89830810ecbd014791b042cbe5eec253be11ac2b28f3", + "sha256:9e98b452132963678e3ac6c73f7010fe53adf72209a32854d55690acac3f6724", "sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2", "sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964" ], @@ -209,12 +214,15 @@ "version": "==0.5.2" }, "diem": { + "extras": [ + "all" + ], "hashes": [ - "sha256:0718ecc21b703ff285c148293dfcae21e780e2f1532b24a1a943561cb063c9e0", - "sha256:6b9311ca5f671677eb4d1affafc39d720b8f44562dc8e7db961477d378777542" + "sha256:7aeb15d83553df15756de81b2e05f9c3a1c091d9712b03cf44c8e94f33a4b7e3", + "sha256:c69663de90bb04b93f8b4846bf39249bd9bf404ca2f23553b3a826118b20efce" ], "index": "pypi", - "version": "==1.2.5" + "version": "==1.2.8" }, "diem-sample-wallet": { "editable": true, @@ -247,6 +255,25 @@ "index": "pypi", "version": "==0.3" }, + "falcon": { + "hashes": [ + "sha256:18157af2a4fc3feedf2b5dcc6196f448639acf01c68bc33d4d5a04c3ef87f494", + "sha256:24adcd2b29a8ffa9d552dc79638cd21736a3fb04eda7d102c6cebafdaadb88ad", + "sha256:54f2cb4b687035b2a03206dbfc538055cc48b59a953187b0458aa1b574d47b53", + "sha256:59d1e8c993b9a37ea06df9d72cf907a46cc8063b30717cdac2f34d1658b6f936", + "sha256:733033ec80c896e30a43ab3e776856096836787197a44eb21022320a61311983", + "sha256:74cf1d18207381c665b9e6292d65100ce146d958707793174b03869dc6e614f4", + "sha256:95bf6ce986c1119aef12c9b348f4dee9c6dcc58391bdd0bc2b0bf353c2b15986", + "sha256:9712975adcf8c6e12876239085ad757b8fdeba223d46d23daef82b47658f83a9", + "sha256:a5ebb22a04c9cc65081938ee7651b4e3b4d2a28522ea8ec04c7bdd2b3e9e8cd8", + "sha256:aa184895d1ad4573fbfaaf803563d02f019ebdf4790e41cc568a330607eae439", + "sha256:e3782b7b92fefd46a6ad1fd8fe63fe6c6f1b7740a95ca56957f48d1aee34b357", + "sha256:e9efa0791b5d9f9dd9689015ea6bce0a27fcd5ecbcd30e6d940bffa4f7f03389", + "sha256:eea593cf466b9c126ce667f6d30503624ef24459f118c75594a69353b6c3d5fc", + "sha256:f93351459f110b4c1ee28556aef9a791832df6f910bea7b3f616109d534df06b" + ], + "version": "==2.0.0" + }, "filelock": { "hashes": [ "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", @@ -387,11 +414,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:ace61d5fc652dc280e7b6b4ff732a9c2d40db2c0f92bc6cb74e07b73d53a1771", - "sha256:fa5daa4477a7414ae34e95942e4dd07f62adf589143c875c133c1e53c4eff38d" + "sha256:24499ffde1b80be08284100393955842be4a59c7c16bbf2738aad0e464a8e0aa", + "sha256:c6af5dbf1126cd959c4a8d8efd61d4d3c83bddb0459a17e554284a077574b614" ], "index": "pypi", - "version": "==3.4.0" + "version": "==3.7.0" }, "iniconfig": { "hashes": [ @@ -441,30 +468,33 @@ }, "lazy-object-proxy": { "hashes": [ - "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d", - "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449", - "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08", - "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a", - "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50", - "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd", - "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239", - "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb", - "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea", - "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e", - "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156", - "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142", - "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442", - "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62", - "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db", - "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531", - "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383", - "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a", - "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357", - "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", - "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0" - ], - "index": "pypi", - "version": "==1.4.3" + "sha256:1d33d6f789697f401b75ce08e73b1de567b947740f768376631079290118ad39", + "sha256:2f2de8f8ac0be3e40d17730e0600619d35c78c13a099ea91ef7fb4ad944ce694", + "sha256:3782931963dc89e0e9a0ae4348b44762e868ea280e4f8c233b537852a8996ab9", + "sha256:37d9c34b96cca6787fe014aeb651217944a967a5b165e2cacb6b858d2997ab84", + "sha256:38c3865bd220bd983fcaa9aa11462619e84a71233bafd9c880f7b1cb753ca7fa", + "sha256:429c4d1862f3fc37cd56304d880f2eae5bd0da83bdef889f3bd66458aac49128", + "sha256:522b7c94b524389f4a4094c4bf04c2b02228454ddd17c1a9b2801fac1d754871", + "sha256:57fb5c5504ddd45ed420b5b6461a78f58cbb0c1b0cbd9cd5a43ad30a4a3ee4d0", + "sha256:5944a9b95e97de1980c65f03b79b356f30a43de48682b8bdd90aa5089f0ec1f4", + "sha256:6f4e5e68b7af950ed7fdb594b3f19a0014a3ace0fedb86acb896e140ffb24302", + "sha256:71a1ef23f22fa8437974b2d60fedb947c99a957ad625f83f43fd3de70f77f458", + "sha256:8a44e9901c0555f95ac401377032f6e6af66d8fc1fbfad77a7a8b1a826e0b93c", + "sha256:b6577f15d5516d7d209c1a8cde23062c0f10625f19e8dc9fb59268859778d7d7", + "sha256:c8fe2d6ff0ff583784039d0255ea7da076efd08507f2be6f68583b0da32e3afb", + "sha256:cadfa2c2cf54d35d13dc8d231253b7985b97d629ab9ca6e7d672c35539d38163", + "sha256:cd1bdace1a8762534e9a36c073cd54e97d517a17d69a17985961265be6d22847", + "sha256:ddbdcd10eb999d7ab292677f588b658372aadb9a52790f82484a37127a390108", + "sha256:e7273c64bccfd9310e9601b8f4511d84730239516bada26a0c9846c9697617ef", + "sha256:e7428977763150b4cf83255625a80a23dfdc94d43be7791ce90799d446b4e26f", + "sha256:e960e8be509e8d6d618300a6c189555c24efde63e85acaf0b14b2cd1ac743315", + "sha256:ecb5dd5990cec6e7f5c9c1124a37cb2c710c6d69b0c1a5c4aa4b35eba0ada068", + "sha256:ef3f5e288aa57b73b034ce9c1f1ac753d968f9069cd0742d1d69c698a0167166", + "sha256:fa5b2dee0e231fa4ad117be114251bdfe6afe39213bd629d43deb117b6a6c40a", + "sha256:fa7fb7973c622b9e725bee1db569d2c2ee64d2f9a089201c5e8185d482c7352d" + ], + "index": "pypi", + "version": "==1.5.2" }, "markupsafe": { "hashes": [ @@ -681,28 +711,28 @@ }, "protobuf": { "hashes": [ - "sha256:013a9ec4dccad9a6ed3aa1ad9e86a25a4e0d6d3bbe059b6f6502db20473c3e69", - "sha256:0e00b4e4a4800b389ae7f0058e1fc9d012444fdde926569d8cce55c84a01ef74", - "sha256:11f192d491613f692b3ddc18f06c925785b3019c8e35d32c811421ca9ff7d50e", - "sha256:25f0ee57684f7bc3f0511b73cf55c016a891d09079c357794759663fe3da9cd3", - "sha256:2ccc0169b5145b3af676b6997be6fe62961edfc12bb524a7b9c46fb5d208a3d4", - "sha256:40f031f79b0254aa62082ca87776c0959d85adf99f09cdef9d0b320bb772a609", - "sha256:44d824adb48fe8baf81e628c2edaf9911912cd592a83621d2b877ccfde631d61", - "sha256:50f28efa66232a2fbbdd638dd61d9399ff66bcfde40ff305263b229692928081", - "sha256:51e080fb1de5db54b0a6b1519ba8dda55e57404b0a4948e58f1342a3e15d89ec", - "sha256:5c2ee13f5ea237a17bd81f52f972b7d334c0a43330d2a2a7b25b07f16eb146d8", - "sha256:830a9c71df347b3fb3cd24ec985c4ed64f6e75983f543a1d8a3c96302dae915c", - "sha256:867635c1d541ce336a1a4df3379d1116f02eba6dc326d080c8ef02f34036c415", - "sha256:94b34486986d7683e83f9d02a0112533263fc20fae54fff3f4fd69451e682ec7", - "sha256:ae4bcd5a0ce3f77d0523c3e5ed0d04ed2af454f7bf7cef08cb7a8d0915ac80a9", - "sha256:b04449133e31b65924650d758efbc2397c2d0e5eb3c8cae7428ffc4fa9c3403d", - "sha256:d892e487bd544463ce1e656434591593f710169335ac3f02ce30ee866c2f2464", - "sha256:e9f13fadb15b80e4a83ef5d9fa44e19243b1e2d96e84ee2228ca305180ca059e", - "sha256:ef69a10d45529a08367e70e736b3ce8e2af51360f23650ef1d4381ff9038467a", - "sha256:f6d10b1f86cebb8008a256f474948fc6204391e02a9c12935eebf036bbb07b65", - "sha256:fecf1b00ccc87bb8debca8b56458cc57c486d2d7afe22c7526728f79ffe232f4" - ], - "version": "==3.15.0" + "sha256:1f2c6c5880073274c668e0cde1e793309a4bbb0fa30cad524a03a9aba3be17ec", + "sha256:38441691e4ad01d80240539dd34df18ea239f5c3296caac24a78500181e826c1", + "sha256:3c47e5ccc7d9574a082e0e5d3b3cb2cbe05a0de6515644996374bd9f7b5d4367", + "sha256:3ccf6d78efaefd7835258f5cbcc32a12b0ff39b86c759d7b52b343254daa8da1", + "sha256:43d7555dd0c01b4b148eba8d11e2cc717715388f02cbdc40bfa8c100b9b2f0d5", + "sha256:490090723b295a726635dcc62bf10517fb8328037304b47af069fedf505e6fac", + "sha256:4bec6a559ea39cdc035af1feff4e595c30f16acf6985322b89039161f523db9e", + "sha256:4de3836941091ee0f8bf2c9b4e14c83c11602130d0c483c82be37a1d151dd0e8", + "sha256:657f6b12673b36c4e10050cdfd4768e7383d676ec40ec921b4bd681e3e011445", + "sha256:68d53160b3f9e29af2d9d7c5ba0dfd3bb07e854e2945b0f38a1d7eac885811f2", + "sha256:79cd09d9316428e984ef09e01e8b5cd8d094c3d35361ce7ae2389a02f590eee8", + "sha256:a90123931f89fd2a5cc5029f79ef76dec2681271a8e5dfe3d3a892e3ce2f7628", + "sha256:bb15d4809925035b661d08939ae930b8b0586f866ba59a83116937c3d115fc31", + "sha256:bb8f243c165d14200921b7a66453b0959b1033276feb9157c059862671fdd20e", + "sha256:bddb3207a702fe6b9f6908083b4974ffad16f0598fd1b6dcb55cd4f97cb445b6", + "sha256:c36ba220ca9dbd91e8e5b1ee1f894c660bd8f1db3a5f691dd2d315ab2d18fc49", + "sha256:d51c7092194a1981489f9c8d6ef1281e947a269793ddce042423994a96ee2806", + "sha256:dda5716f1cf04fdd78fd521f3c76773b03a39a14ba60049d3231839a5b1d9a9a", + "sha256:eb12f2496f1f196b4bd3040272b60a49802bcf71941d7c0ac9d18d0420ded292", + "sha256:eef1f8ff05202d9e2c6d12d988d1dc93eaf4551512f4eff737c03278501f4aa9" + ], + "version": "==3.15.4" }, "psycopg2-binary": { "hashes": [ @@ -779,11 +809,11 @@ }, "pylint": { "hashes": [ - "sha256:718b74786ea7ed07aa0c58bf572154d4679f960d26e9641cc1de204a30b87fc9", - "sha256:e71c2e9614a4f06e36498f310027942b0f4f2fde20aebb01655b31edc63b9eaf" + "sha256:0e21d3b80b96740909d77206d741aa3ce0b06b41be375d92e1f3244a274c1f8a", + "sha256:d09b0b07ba06bcdff463958f53f23df25e740ecd81895f7d2699ec04bbd8dc3b" ], "index": "pypi", - "version": "==2.6.2" + "version": "==2.7.2" }, "pyopenssl": { "hashes": [ @@ -962,16 +992,16 @@ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, "tox": { "hashes": [ - "sha256:89afa9c59c04beb55eda789c7a65feb1a70fde117f85f1bd1c27c66758456e60", - "sha256:ed1e650cf6368bcbc4a071eeeba363c480920e0ed8a9ad1793c7caaa5ad33d49" + "sha256:05a4dbd5e4d3d8269b72b55600f0b0303e2eb47ad5c6fe76d3576f4c58d93661", + "sha256:e007673f3595cede9b17a7c4962389e4305d4a3682a6c5a4159a1453b4f326aa" ], "index": "pypi", - "version": "==3.22.0" + "version": "==3.23.0" }, "typed-ast": { "hashes": [ @@ -1015,7 +1045,7 @@ "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" ], - "markers": "python_version < '3.8' and python_version < '3.8'", + "markers": "python_version < '3.8'", "version": "==3.7.4.3" }, "typing-inspect": { @@ -1042,6 +1072,13 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==20.4.2" }, + "waitress": { + "hashes": [ + "sha256:1bb436508a7487ac6cb097ae7a7fe5413aefca610550baf58f0940e51ecfb261", + "sha256:3d633e78149eb83b60a07dfabb35579c29aac2d24bb803c18b26fb2ab1a584db" + ], + "version": "==1.4.4" + }, "watchdog": { "hashes": [ "sha256:7e65882adb7746039b6f3876ee174952f8eaaa34491ba34333ddf1fe35de4162" @@ -1204,13 +1241,6 @@ } }, "develop": { - "aniso8601": { - "hashes": [ - "sha256:513d2b6637b7853806ae79ffaca6f3e8754bdd547048f5ccc1420aec4b714f1e", - "sha256:d10a4bf949f619f719b227ef5386e31f49a2b6d453004b21f02661ccc8670c7b" - ], - "version": "==7.0.0" - }, "appdirs": { "hashes": [ "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", @@ -1226,6 +1256,14 @@ "markers": "sys_platform == 'darwin'", "version": "==0.1.2" }, + "async-generator": { + "hashes": [ + "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", + "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144" + ], + "markers": "python_version >= '3.5'", + "version": "==1.10" + }, "attrs": { "hashes": [ "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", @@ -1256,13 +1294,6 @@ "index": "pypi", "version": "==7.1.2" }, - "click-log": { - "hashes": [ - "sha256:16fd1ca3fc6b16c98cea63acf1ab474ea8e676849dc669d86afafb0ed7003124", - "sha256:eee14dc37cdf3072158570f00406572f9e03e414accdccfccd4c538df9ae322c" - ], - "version": "==0.3.2" - }, "colorama": { "hashes": [ "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b", @@ -1271,13 +1302,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==0.4.4" }, - "dataclasses": { - "hashes": [ - "sha256:454a69d788c7fda44efd71e259be79577822f5e3f53f029a22d08004e951dc9f", - "sha256:6988bd2b895eef432d562370bb707d540f32f7360ab13da45340101bc2307d84" - ], - "version": "==0.6" - }, "dataclasses-json": { "hashes": [ "sha256:56ec931959ede74b5dedf65cf20772e6a79764d20c404794cce0111c88c085ff", @@ -1307,68 +1331,13 @@ "index": "pypi", "version": "==1.4.5" }, - "fb-sapp": { - "hashes": [ - "sha256:03672bb55d169057b527b535cfa5ba5ec9cf28ff42ebd3de446be86b46747466", - "sha256:1a5c2f28a27152afa615aeb960856198f91559000ae74cbf0544a225ae6feff2" - ], - "version": "==0.2.8" - }, - "flask": { - "hashes": [ - "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060", - "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557" - ], - "index": "pypi", - "version": "==1.1.2" - }, - "flask-graphql": { - "hashes": [ - "sha256:825578c044df436cd74503a38bbd31c919a90acda5e9b6e0e45736964bc5235d" - ], - "version": "==2.0.1" - }, - "graphene": { - "hashes": [ - "sha256:09165f03e1591b76bf57b133482db9be6dac72c74b0a628d3c93182af9c5a896", - "sha256:2cbe6d4ef15cfc7b7805e0760a0e5b80747161ce1b0f990dfdc0d2cf497c12f9" - ], - "version": "==2.1.8" - }, - "graphene-sqlalchemy": { - "hashes": [ - "sha256:2b1a9cf4ed44aec78140605f38061a79b51be5902400d10c3d19b2cf64046215", - "sha256:97ed52bc0d01d757df50d25b5bdd490a2327778d41223d4e084d38a239925e8e" - ], - "version": "==2.3.0" - }, - "graphql-core": { - "hashes": [ - "sha256:44c9bac4514e5e30c5a595fac8e3c76c1975cae14db215e8174c7fe995825bad", - "sha256:aac46a9ac524c9855910c14c48fc5d60474def7f99fd10245e76608eba7af746" - ], - "version": "==2.3.2" - }, - "graphql-relay": { - "hashes": [ - "sha256:870b6b5304123a38a0b215a79eace021acce5a466bf40cd39fa18cb8528afabb", - "sha256:ac514cb86db9a43014d7e73511d521137ac12cf0101b2eaa5f0a3da2e10d913d" - ], - "version": "==2.0.1" - }, - "graphql-server-core": { - "hashes": [ - "sha256:04ee90da0322949f7b49ff6905688e3a21a9efbd5a7d7835997e431a0afdbd11" - ], - "version": "==1.2.0" - }, "importlib-metadata": { "hashes": [ - "sha256:ace61d5fc652dc280e7b6b4ff732a9c2d40db2c0f92bc6cb74e07b73d53a1771", - "sha256:fa5daa4477a7414ae34e95942e4dd07f62adf589143c875c133c1e53c4eff38d" + "sha256:24499ffde1b80be08284100393955842be4a59c7c16bbf2738aad0e464a8e0aa", + "sha256:c6af5dbf1126cd959c4a8d8efd61d4d3c83bddb0459a17e554284a077574b614" ], "index": "pypi", - "version": "==3.4.0" + "version": "==3.7.0" }, "iniconfig": { "hashes": [ @@ -1379,11 +1348,11 @@ }, "ipython": { "hashes": [ - "sha256:1918dea4bfdc5d1a830fcfce9a710d1d809cbed123e85eab0539259cb0f56640", - "sha256:1923af00820a8cf58e91d56b89efc59780a6e81363b94464a0f17c039dffff9e" + "sha256:04323f72d5b85b606330b6d7e2dc8d2683ad46c3905e955aa96ecc7a99388e70", + "sha256:34207ffb2f653bced2bc8e3756c1db86e7d93e44ed049daae9814fed66d408ec" ], "index": "pypi", - "version": "==7.20.0" + "version": "==7.21.0" }, "ipython-genutils": { "hashes": [ @@ -1392,14 +1361,6 @@ ], "version": "==0.2.0" }, - "itsdangerous": { - "hashes": [ - "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", - "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749" - ], - "index": "pypi", - "version": "==1.1.0" - }, "jedi": { "hashes": [ "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93", @@ -1408,14 +1369,6 @@ "markers": "python_version >= '3.6'", "version": "==0.18.0" }, - "jinja2": { - "hashes": [ - "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419", - "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6" - ], - "index": "pypi", - "version": "==2.11.3" - }, "libcst": { "hashes": [ "sha256:2766671c107263daa3fc34e39d55134a6fe253701564d7670586f30eee2c201c", @@ -1424,64 +1377,6 @@ "markers": "python_version >= '3.6'", "version": "==0.3.17" }, - "markupsafe": { - "hashes": [ - "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", - "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", - "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", - "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", - "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", - "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f", - "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39", - "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", - "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", - "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014", - "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f", - "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", - "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", - "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", - "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", - "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", - "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", - "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", - "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", - "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85", - "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1", - "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", - "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", - "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", - "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850", - "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0", - "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", - "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", - "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb", - "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", - "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", - "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", - "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1", - "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2", - "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", - "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", - "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", - "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7", - "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", - "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8", - "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", - "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193", - "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", - "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b", - "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", - "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5", - "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c", - "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", - "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be", - "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621" - ], - "index": "pypi", - "version": "==1.1.1" - }, "marshmallow": { "hashes": [ "sha256:4ab2fdb7f36eb61c3665da67a7ce281c8900db08d72ba6bf0e695828253581f7", @@ -1497,13 +1392,6 @@ ], "version": "==1.5.1" }, - "munch": { - "hashes": [ - "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2", - "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd" - ], - "version": "==2.5.0" - }, "mypy-extensions": { "hashes": [ "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", @@ -1557,12 +1445,6 @@ "index": "pypi", "version": "==0.13.1" }, - "promise": { - "hashes": [ - "sha256:dfd18337c523ba4b6a58801c164c1904a9d4d1b1747c7d5dbf45b693a49d93d0" - ], - "version": "==2.3" - }, "prompt-toolkit": { "hashes": [ "sha256:0fa02fa80363844a4ab4b8d6891f62dd0645ba672723130423ca4037b80c1974", @@ -1638,12 +1520,12 @@ }, "pyre-check": { "hashes": [ - "sha256:6ce1922c3255c8ba7d62dd07b27be6b4555b4e05304f32e8c6771a9f60b4adb1", - "sha256:e678fd2b13d0c39fd7c07545c554823c88a543ee7e9f3be454dd6fba6494bf49", - "sha256:f925aa04904e3196ce358b21ee0a81e37c2f0b8a23a4e5f8688529a93ef75389" + "sha256:2a2112315f3a5670d4de9dd95773207b1f5e70b432a47208c50462edea6c16d3", + "sha256:4b153b57a6512c3b8fdda17f5b7d8756f99a180b08b0b38a730bdc0e07a38980", + "sha256:76de7d42ffaecc4e6400968d9c8ca8279678c522609a4a5e51eb8e9a303a9202" ], "index": "pypi", - "version": "==0.0.59" + "version": "==0.0.60" }, "pyre-extensions": { "hashes": [ @@ -1755,20 +1637,6 @@ ], "version": "==2020.11.13" }, - "rx": { - "hashes": [ - "sha256:13a1d8d9e252625c173dc795471e614eadfe1cf40ffc684e08b8fff0d9748c23", - "sha256:7357592bc7e881a95e0c2013b73326f704953301ab551fbc8133a6fadab84105" - ], - "version": "==1.6.1" - }, - "singledispatch": { - "hashes": [ - "sha256:5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c", - "sha256:833b46966687b3de7f438c761ac475213e53b306740f1abfaa86e1d1aae56aa8" - ], - "version": "==3.4.0.3" - }, "six": { "hashes": [ "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", @@ -1784,62 +1652,25 @@ ], "version": "==2.3.0" }, - "sqlalchemy": { - "hashes": [ - "sha256:040bdfc1d76a9074717a3f43455685f781c581f94472b010cd6c4754754e1862", - "sha256:1fe5d8d39118c2b018c215c37b73fd6893c3e1d4895be745ca8ff6eb83333ed3", - "sha256:23927c3981d1ec6b4ea71eb99d28424b874d9c696a21e5fbd9fa322718be3708", - "sha256:24f9569e82a009a09ce2d263559acb3466eba2617203170e4a0af91e75b4f075", - "sha256:2578dbdbe4dbb0e5126fb37ffcd9793a25dcad769a95f171a2161030bea850ff", - "sha256:269990b3ab53cb035d662dcde51df0943c1417bdab707dc4a7e4114a710504b4", - "sha256:29cccc9606750fe10c5d0e8bd847f17a97f3850b8682aef1f56f5d5e1a5a64b1", - "sha256:37b83bf81b4b85dda273aaaed5f35ea20ad80606f672d94d2218afc565fb0173", - "sha256:63677d0c08524af4c5893c18dbe42141de7178001360b3de0b86217502ed3601", - "sha256:639940bbe1108ac667dcffc79925db2966826c270112e9159439ab6bb14f8d80", - "sha256:6a939a868fdaa4b504e8b9d4a61f21aac11e3fecc8a8214455e144939e3d2aea", - "sha256:6b8b8c80c7f384f06825612dd078e4a31f0185e8f1f6b8c19e188ff246334205", - "sha256:6c9e6cc9237de5660bcddea63f332428bb83c8e2015c26777281f7ffbd2efb84", - "sha256:6ec1044908414013ebfe363450c22f14698803ce97fbb47e53284d55c5165848", - "sha256:6fca33672578666f657c131552c4ef8979c1606e494f78cd5199742dfb26918b", - "sha256:751934967f5336a3e26fc5993ccad1e4fee982029f9317eb6153bc0bc3d2d2da", - "sha256:8be835aac18ec85351385e17b8665bd4d63083a7160a017bef3d640e8e65cadb", - "sha256:927ce09e49bff3104459e1451ce82983b0a3062437a07d883a4c66f0b344c9b5", - "sha256:94208867f34e60f54a33a37f1c117251be91a47e3bfdb9ab8a7847f20886ad06", - "sha256:94f667d86be82dd4cb17d08de0c3622e77ca865320e0b95eae6153faa7b4ecaf", - "sha256:9e9c25522933e569e8b53ccc644dc993cab87e922fb7e142894653880fdd419d", - "sha256:a0e306e9bb76fd93b29ae3a5155298e4c1b504c7cbc620c09c20858d32d16234", - "sha256:a8bfc1e1afe523e94974132d7230b82ca7fa2511aedde1f537ec54db0399541a", - "sha256:ac2244e64485c3778f012951fdc869969a736cd61375fde6096d08850d8be729", - "sha256:b4b0e44d586cd64b65b507fa116a3814a1a53d55dce4836d7c1a6eb2823ff8d1", - "sha256:baeb451ee23e264de3f577fee5283c73d9bbaa8cb921d0305c0bbf700094b65b", - "sha256:c7dc052432cd5d060d7437e217dd33c97025287f99a69a50e2dc1478dd610d64", - "sha256:d1a85dfc5dee741bf49cb9b6b6b8d2725a268e4992507cf151cba26b17d97c37", - "sha256:d90010304abb4102123d10cbad2cdf2c25a9f2e66a50974199b24b468509bad5", - "sha256:ddfb511e76d016c3a160910642d57f4587dc542ce5ee823b0d415134790eeeb9", - "sha256:e273367f4076bd7b9a8dc2e771978ef2bfd6b82526e80775a7db52bff8ca01dd", - "sha256:e5bb3463df697279e5459a7316ad5a60b04b0107f9392e88674d0ece70e9cf70", - "sha256:e8a1750b44ad6422ace82bf3466638f1aa0862dbb9689690d5f2f48cce3476c8", - "sha256:eab063a70cca4a587c28824e18be41d8ecc4457f8f15b2933584c6c6cccd30f0", - "sha256:ecce8c021894a77d89808222b1ff9687ad84db54d18e4bd0500ca766737faaf6", - "sha256:f4d972139d5000105fcda9539a76452039434013570d6059993120dc2a65e447", - "sha256:fd3b96f8c705af8e938eaa99cbd8fd1450f632d38cad55e7367c33b263bf98ec", - "sha256:fdd2ed7395df8ac2dbb10cefc44737b66c6a5cd7755c92524733d7a443e5b7e2" - ], - "index": "pypi", - "version": "==1.3.23" - }, "stringcase": { "hashes": [ "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008" ], "version": "==1.2.0" }, + "tabulate": { + "hashes": [ + "sha256:d7c013fe7abbc5e491394e10fa845f8f32fe54f8dc60c6622c6cf482d25d47e4", + "sha256:eb1d13f25760052e8931f2ef80aaf6045a6cceb47514db8beab24cded16f13a7" + ], + "version": "==0.8.9" + }, "toml": { "hashes": [ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, "traitlets": { @@ -1892,7 +1723,7 @@ "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" ], - "markers": "python_version < '3.8' and python_version < '3.8'", + "markers": "python_version < '3.8'", "version": "==3.7.4.3" }, "typing-inspect": { @@ -1903,33 +1734,6 @@ ], "version": "==0.6.0" }, - "ujson": { - "hashes": [ - "sha256:0190d26c0e990c17ad072ec8593647218fe1c675d11089cd3d1440175b568967", - "sha256:0ea07fe57f9157118ca689e7f6db72759395b99121c0ff038d2e38649c626fb1", - "sha256:30962467c36ff6de6161d784cd2a6aac1097f0128b522d6e9291678e34fb2b47", - "sha256:4d6d061563470cac889c0a9fd367013a5dbd8efc36ad01ab3e67a57e56cad720", - "sha256:5e1636b94c7f1f59a8ead4c8a7bab1b12cc52d4c21ababa295ffec56b445fd2a", - "sha256:7333e8bc45ea28c74ae26157eacaed5e5629dbada32e0103c23eb368f93af108", - "sha256:84b1dca0d53b0a8d58835f72ea2894e4d6cf7a5dd8f520ab4cbd698c81e49737", - "sha256:91396a585ba51f84dc71c8da60cdc86de6b60ba0272c389b6482020a1fac9394", - "sha256:a214ba5a21dad71a43c0f5aef917cd56a2d70bc974d845be211c66b6742a471c", - "sha256:aad6d92f4d71e37ea70e966500f1951ecd065edca3a70d3861b37b176dd6702c", - "sha256:b3a6dcc660220539aa718bcc9dbd6dedf2a01d19c875d1033f028f212e36d6bb", - "sha256:b5c70704962cf93ec6ea3271a47d952b75ae1980d6c56b8496cec2a722075939", - "sha256:c615a9e9e378a7383b756b7e7a73c38b22aeb8967a8bfbffd4741f7ffd043c4d", - "sha256:d3a87888c40b5bfcf69b4030427cd666893e826e82cc8608d1ba8b4b5e04ea99", - "sha256:e2cadeb0ddc98e3963bea266cc5b884e5d77d73adf807f0bda9eca64d1c509d5", - "sha256:e390df0dcc7897ffb98e17eae1f4c442c39c91814c298ad84d935a3c5c7a32fa", - "sha256:e6e90330670c78e727d6637bb5a215d3e093d8e3570d439fd4922942f88da361", - "sha256:eb6b25a7670c7537a5998e695fa62ff13c7f9c33faf82927adf4daa460d5f62e", - "sha256:f273a875c0b42c2a019c337631bc1907f6fdfbc84210cc0d1fff0e2019bbfaec", - "sha256:f8aded54c2bc554ce20b397f72101737dd61ee7b81c771684a7dd7805e6cca0c", - "sha256:fc51e545d65689c398161f07fd405104956ec27f22453de85898fa088b2cd4bb" - ], - "markers": "python_version >= '3.6'", - "version": "==4.0.2" - }, "watchdog": { "hashes": [ "sha256:7e65882adb7746039b6f3876ee174952f8eaaa34491ba34333ddf1fe35de4162" @@ -1944,70 +1748,6 @@ "index": "pypi", "version": "==0.2.5" }, - "werkzeug": { - "hashes": [ - "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", - "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" - ], - "index": "pypi", - "version": "==1.0.1" - }, - "xxhash": { - "hashes": [ - "sha256:02476c5cef803cfd1350662b1e543e47ad64bd5f7f792033d94d590f9674da11", - "sha256:0ecea927fd3df8f3f3a1d6e5bc85838eb44a69ea2f4c9263dfd0f68c4e17e483", - "sha256:0f5f1b9ae8e2cf2ff606018769f7e46147df70291312f64e1b80d10482ca8c0b", - "sha256:16e4b7d508bb49b6fc84bf077f2f7f51263b5618cc61f33a64ed43786ec2c6cf", - "sha256:1b86f49b36c25ebdbd1b5539d428a37d9051ad49eb576a3edd964a8770bc8f3a", - "sha256:28c1f0bb6dadc11162d1f2e203d7a12d38b511b87fbb5ffa729594fd456f48e6", - "sha256:2912d7810bcf7e39b3929fb186fe46ff83b1bd4a3d6b7eba956d57fa1516ac0c", - "sha256:2f0ca6673fcbae988389576a779c00a62a28718a18ddc7b2e5b32d7fb30c6f98", - "sha256:3221f1a5bc2ee1f150b84a0c4c7cddc7724aaa01460f3353cf63fd667d89f593", - "sha256:33c4832e689f429539d70baf69162b41dfbabc7f31ca542b5b772cb8a55e7a79", - "sha256:3d25b540148f1ebf4852e4115f3f4819b585ecd36f121a1f388e8966d69d3a1c", - "sha256:3f29f6d455388cc415fe52c0f63f442aaea674cee35a2252d8d4dc8d640938c6", - "sha256:4167f22b037e128820f7642ecc1fbf1b4b4956346093a2e75081bee82b9cfb7e", - "sha256:44b26872fd63f1eaf1ab527817aebbd455a3fdcbd56ff6df74fd42a6a137cff4", - "sha256:48b99c55fc643b32f5efca9c35fcaac6ea553958cf503e202c10eb62718e7a0e", - "sha256:58ca818554c1476fa1456f6cd4b87002e2294f09baf0f81e5a2a4968e62c423c", - "sha256:5b3c0c84187556d463626ceed85f0d735a5b8ea1678da3e858d3934f38f23915", - "sha256:5d2edbb50025a67f061d09d381c54c7d0948c1572f6c9bd15ee238a303d368d9", - "sha256:635b1d7fa85d215112f41d089bd113ac139f6a42769fcc49c73e779904160f7f", - "sha256:7291392bdb1d38c44557dfd3fcd4fd04c363a696dbfa7e6592700a31e4ff6657", - "sha256:7709bc8a5e30c74b07203553f33232531e7739458f72204908cedb08a00bd546", - "sha256:7943ede91d8aedfcacb7178b2d881b7498145590206ff61c3e84dc66e6a51d6a", - "sha256:80903d4ce7337921bbc8e5ac695b45691b43c0a00b21964c76e19ea21b9108ea", - "sha256:82034c9ed54db20f051133cba01de959b5208fe2900e67ebb4c9631f1fd523fd", - "sha256:85c5de6c56335b75beef2cba713f95a1b62422be5e27dad30b5083419c6839c4", - "sha256:8b7e930a60dfe7380e52466aa27941290dd575a5750c622158c86941797eaa1b", - "sha256:8f90deec6567a38e1da29feff36973468691e309b2db8235e64936e61df77c43", - "sha256:922ae5b1efa1f9a9cc959f7197113a623ad110853622e990433242a9d8d00d5c", - "sha256:99b5412a3eddb1aa9aaf36cdbf93be4eca99ad83ff8c692672fdeedc7fb597de", - "sha256:9d0311fcd78dabe04ab3b4034659628b00ac220e77e37648f73aebbf4cb13680", - "sha256:ade1c356acd0b0454a3d3cf42442afe7ad0f46fc944ea1e84720b3858bfdb772", - "sha256:b5c2edb8b0a2acc5bdac984b3177711f206463b970aa03087221771c2b0d8f1d", - "sha256:b94f13f4f946500f3cc78f11da4ec4b340bd92c5200b5fe4e6aeac96064aa1fd", - "sha256:bcd1e9f3ba8df23edefe1d0a886f16b4e27602acbd8575b39540fea26e1aa6d2", - "sha256:bdbc195231c87d63b0503785d9c5264f4275a92da41d9f28fdf08fb321453356", - "sha256:bde4d39997de901d0a66ebd631b34f9cf106676fec0878f36b7baf630cb3965a", - "sha256:be93004b832717234a7d2f47dc555428ab1e8712f99cad7d212cebe0e27d3d48", - "sha256:bf360465dc3d24b1501b799c85815c82ddcfc0ffbcba0232968f3a7cd64306fc", - "sha256:cb4feeb8881eb89b9ddd0fae797deb078ebdaad6b1ae6c185b9993d241ed365a", - "sha256:cba4b6d174b524623ac8b64bda734601d574f95033f87ddf9c495c69a70135e8", - "sha256:d1859d54837af16ae2a7975477e619793ac698a374d909f533e317c3b384b223", - "sha256:df8d1ebdef86bd5d772d81c91d5d111a5ee8e4b68b8fc6b6edfa5aa825dd2a3d", - "sha256:e0fc170c3a00ca008d992c2e6324da3f1467b30044b5835d2feb27870645d38c", - "sha256:e296b0dee072a54c40c04f09ca35bb9902bb74b54f0fffeafabfc937b3ec85f9", - "sha256:e37b25182e969212d5aec60a8da7d1e6a960dbffdb9ba4c63e2240de3605c184", - "sha256:f01c59f5bad2e46bb4235b71b36c56be353f08b6d514a3bd0deb9bf56e4b180a", - "sha256:fabee25186b6649bbf6ff258f23941339902374786f8317b0422144ddaa505df", - "sha256:fb3c9760598009b1d8bbe57785e278aeb956efb7372d8f9b0bb43cd46f420dff", - "sha256:fc03a399205268815742125b17d967afa9f23b08cdafe185e41368cf7ba9b278", - "sha256:fca7d0fb6fde33d1ac5f97298f44e711e5fe1b4587832864be8c6545cb072a54" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.0.0" - }, "zipp": { "hashes": [ "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108", diff --git a/backend/README.md b/backend/README.md index 80c69458..c22a4e3b 100644 --- a/backend/README.md +++ b/backend/README.md @@ -69,6 +69,15 @@ To test: $ ./format.sh # runs black $ ./test.sh # runs unit tests and type-checker + +### Running the Diem Mini Wallet (DMW) TestSuite +1. Ensure that you have DRW running `../scripts/lrw.sh develop 8080` +2. Run the mw_drw proxy: `DRW_URL_PREFIX=http://localhost:8080 MW_DRW_PROXY_PORT=3130 pipenv run python3 ./tests/mw_drw_proxy/proxy.py` . + There is additional documentation on this command in the `tests/mw_drw_proxy` folder. +3. Run the test suite: `pipenv run dmw -- test --verbose=true --target http://127.0.0.1:3130`. + To run a specific test, you can add `--pytest-args '-ktest_payment_under_threshold_succeed[sender-999999]'` to the test command + + ### Git setup It is recommended to install our git pre-commit hook. This hook runs all needed validations before committing: diff --git a/backend/tests/e2e_tests/__init__.py b/backend/tests/e2e_tests/__init__.py index c0ba616b..d0d054c2 100644 --- a/backend/tests/e2e_tests/__init__.py +++ b/backend/tests/e2e_tests/__init__.py @@ -5,6 +5,9 @@ import random import requests from dataclasses import dataclass + +from requests import HTTPError + from diem_utils.types.currencies import DiemCurrency, FiatCurrency LRW_WEB_1 = os.getenv("LRW_WEB_1") @@ -21,7 +24,7 @@ print(VASP_ADDR_1) print(VASP_ADDR_2) -sherlock_info = { +SHERLOCK_INFO = { "address_1": "221B Baker Street", "address_2": "", "city": "London", @@ -37,16 +40,31 @@ } +def default_log_fn(*args, **kwargs): + print(*args, **kwargs) + + @dataclass class UserClient: name: str backend: str token: str payment_method: str + log_fn: typing.Callable @staticmethod - def create(backend: str, name: str) -> "UserClient": - return create_test_user(backend, f"{name}_{random.randint(0, 1000)}") + def create( + backend: str, + name: str, + kyc_info=None, + log_fn=default_log_fn, + ) -> "UserClient": + return create_test_user( + backend, + name, + log_fn=log_fn, + kyc_info=kyc_info, + ) def auth_headers(self) -> typing.Dict[str, str]: ret = {"Authorization": f"Bearer {self.token}"} @@ -67,26 +85,42 @@ def wait_for_balance( f"wait for {self.name}'s {currency} balance timeout ({timeout} secs), found balance: {new_balance}, expect {target_balance}" ) + def update_user(self, user_data: dict) -> dict: + res = requests.put( + f"{self.backend}/api/user", headers=self.auth_headers(), json=user_data + ) + res.raise_for_status() + return res.json() + + def get_payment_methods(self) -> list: + res = requests.get( + f"{self.backend}/api/user/payment-methods", headers=self.auth_headers() + ) + res.raise_for_status() + return res.json().get("payment_methods") + def buy(self, amount: int, currency: str, by_currency: str): + self.log_fn(f"Buying {amount} {currency} for {self.name} ") err = None for i in range(8): try: self._buy(amount, currency, by_currency) return except Exception as e: + if isinstance(e, HTTPError): + raise err = e - pass raise RuntimeError(f"failed after retry, last error: {err}") def _buy(self, amount: int, currency: str, by_currency: str): before_balance = self.get_balance(currency) - + self.log_fn(f"Current balance for {currency}: {amount} for '{self.name}'") pair = f"{currency}_{by_currency}" quote_id = get_test_quote( self.backend, self.auth_headers(), amount, "buy", pair ) - print(f"quote_id: {quote_id}") + self.log_fn(f"quote_id: {quote_id}") # pay with the first payment method added to wallet 1 payload = {"payment_method": self.payment_method} res = requests.post( @@ -95,7 +129,7 @@ def _buy(self, amount: int, currency: str, by_currency: str): json=payload, ) res.raise_for_status() - self.wait_for_balance(currency, before_balance + amount, 20) + self.wait_for_balance(currency, before_balance + amount, 50) def get_recv_addr(self) -> str: """Get the receiving subaddr for a test user""" @@ -106,18 +140,20 @@ def get_recv_addr(self) -> str: res.raise_for_status() return res.json().get("address") - def transfer(self, addr: str, amount: int, currency) -> None: + def transfer(self, addr: str, amount: int, currency: str) -> dict: payload = { "amount": amount, "currency": currency, "receiver_address": addr, } + self.log_fn(f"Transferring money '{payload}' for {self.name}") res = requests.post( f"{self.backend}/api/account/transactions", headers=self.auth_headers(), json=payload, ) res.raise_for_status() + return res.json() def get_transactions(self) -> list: params = {"limit": 10} @@ -129,10 +165,15 @@ def get_transactions(self) -> list: res.raise_for_status() return res.json().get("transaction_list") - def get_balance(self, currency: str) -> list: + def get_balances(self) -> typing.List[typing.Dict]: res = requests.get(f"{self.backend}/api/account", headers=self.auth_headers()) res.raise_for_status() - balances = res.json().get("balances") + return res.json().get("balances") + + def get_balance(self, currency: str) -> int: + self.log_fn(f"Getting balance for {currency} for '{self.name}'") + balances = self.get_balances() + self.log_fn(f"got balances: {balances} for '{self.name}'") for b in balances: if b.get("currency") == currency: return b.get("balance") @@ -140,42 +181,58 @@ def get_balance(self, currency: str) -> list: raise ValueError(f"no balance for the currency {currency} in {balances}") -def invoke_kyc_check(backend, headers) -> None: - """Invoke a KYC check by updating user info for the first time""" +def randomize_username(name): + suffix = "@test.com" + if "@" in name: + name, suffix = name.split("@") + return f"{name}_{random.randint(0, 100000000)}{suffix}" - res = requests.put(f"{backend}/api/user", headers=headers, json=sherlock_info) + +def invoke_kyc_check(backend, headers, kyc_info=None, log_fn=default_log_fn) -> None: + """Invoke a KYC check by updating user info for the first time""" + kyc_info = kyc_info or SHERLOCK_INFO + log_fn(f"Updating user info with KYC for '{kyc_info}'") + res = requests.put(f"{backend}/api/user", headers=headers, json=kyc_info) res.raise_for_status() -def create_test_user(backend, username) -> UserClient: +def create_test_user( + backend, username, log_fn=default_log_fn, kyc_info=None +) -> UserClient: """Create a test user""" - + username = randomize_username(username) payload = {"username": username, "password": "fakepassword"} + log_fn(f"Creating user '{username}', with password 'fakepassword'") res = requests.post(f"{backend}/api/user", json=payload) res.raise_for_status() token = res.text.strip('"') headers = {"Authorization": f"Bearer {token}"} - invoke_kyc_check(backend, headers) - payment_method = create_test_payment_method(backend, headers) + invoke_kyc_check(backend, headers, kyc_info=kyc_info, log_fn=log_fn) + payment_method = create_test_payment_method(backend, headers, log_fn=log_fn) return UserClient( - name=username, backend=backend, token=token, payment_method=payment_method + name=username, + backend=backend, + token=token, + payment_method=payment_method, + log_fn=log_fn, ) -def create_test_payment_method(backend, headers) -> str: +def create_test_payment_method(backend, headers, log_fn=default_log_fn) -> str: """ Create a test payment method and return its id as a string NOTE: assumes that this is the only payment method being added for the user """ - payment_token = f"paymenttoken{random.randint(0, 1000)}" + payment_token = f"paymenttoken{random.randint(0, 1000000)}" payment_payload = { "name": "credit", "provider": "CreditCard", "token": payment_token, } + log_fn(f"Creating payment method '{payment_payload}'") res = requests.post( f"{backend}/api/user/payment-methods", headers=headers, json=payment_payload ) @@ -185,7 +242,10 @@ def create_test_payment_method(backend, headers) -> str: res.raise_for_status() assert len(res.json().get("payment_methods")) > 0 - return str(res.json().get("payment_methods")[0].get("id")) + + result_id = str(res.json().get("payment_methods")[0].get("id")) + log_fn(f"Created payment method '{result_id}'") + return result_id def get_test_quote(backend, headers, amount, buy_sell="buy", pair="XUS_USD") -> str: diff --git a/backend/tests/mw_drw_proxy/README.md b/backend/tests/mw_drw_proxy/README.md new file mode 100644 index 00000000..35fb30a8 --- /dev/null +++ b/backend/tests/mw_drw_proxy/README.md @@ -0,0 +1,16 @@ +# MiniWallet <=> Reference Wallet Proxy + +This will run a proxy which allows the DMW test suite to communicate with DRW. + +For example, when the DRW requests to set up a user, the proxy registers a user, updates their information with KYC, +and deposits any initial test balances that the DMW required, before returning an identifier for that user which DMW +will reuse in future calls. + + +### Usage: +(from inside the venv) +``` +DRW_URL_PREFIX=http://reference_wallet:8080 MW_DRW_PROXY_PORT=3130 pipenv run python3 tests/mw_drw_proxy/proxy.py +``` +This will launch the proxy server on `http://localhost:3130`, and will proxy the requests to an instance of +DRW running at `http://reference_wallet:8080` \ No newline at end of file diff --git a/backend/tests/mw_drw_proxy/__init__.py b/backend/tests/mw_drw_proxy/__init__.py new file mode 100644 index 00000000..50fa65ee --- /dev/null +++ b/backend/tests/mw_drw_proxy/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) The Diem Core Contributors +# SPDX-License-Identifier: Apache-2.0 diff --git a/backend/tests/mw_drw_proxy/helpers.py b/backend/tests/mw_drw_proxy/helpers.py new file mode 100644 index 00000000..6abee1fc --- /dev/null +++ b/backend/tests/mw_drw_proxy/helpers.py @@ -0,0 +1,78 @@ +# Copyright (c) The Diem Core Contributors +# SPDX-License-Identifier: Apache-2.0 +import logging +import traceback +import random + +import typing +from requests import HTTPError + +DEFAULT_KYC_INFO = { + "first_name": "Default", + "last_name": "KYC", + "dob": "1956-07-09", + "phone": "1 202-456-1414", + "address_1": "1840 Century Park East", + "address_2": "", + "city": "Los Angeles", + "state": "California", + "zip": "90067", + "country": "US", + "selected_fiat_currency": "USD", + "selected_language": "en", +} + + +def convert_user_info_to_offchain(user_info: dict) -> dict: + return { + "payload_version": 1, + "type": "individual", + "given_name": user_info.get("first_name"), + "surname": user_info.get("last_name"), + "dob": user_info.get("dob"), + "address": { + "line1": user_info.get("address_1"), + "line2": user_info.get("address_2"), + "city": user_info.get("city"), + "state": user_info.get("state"), + "postal_code": user_info.get("zip"), + "country": user_info.get("country"), + }, + } + + +def convert_offchain_to_user_info(offchain: dict) -> dict: + address = offchain.get("address") or {} + return { + **DEFAULT_KYC_INFO, + "first_name": offchain.get("given_name"), + "last_name": offchain.get("surname"), + "dob": offchain.get("dob"), + "address_1": address.get("line1"), + "address_2": address.get("line2"), + "city": address.get("city"), + "state": address.get("state"), + "zip": address.get("postal_code"), + "country": address.get("country"), + "selected_fiat_currency": "USD", + "selected_language": "en", + } + + +def error_response(logger: logging.Logger, e: Exception) -> typing.Tuple[dict, int]: + # Use status code 418 (I'm a teapot) to indicate actual proxy server failures vs upstream issues + status_code = 418 + if isinstance(e, HTTPError): + status_code = e.response.status_code + logger.warning( + f"Got error: {e}. {e.request.method} - {e.request.path_url} - {e.request.body}" + ) + else: + backtrace = "\n".join(traceback.format_tb(e.__traceback__)) + logger.warning(f"Got error: {e}. \n{backtrace}") + + response = { + "error": str(e), + "stacktrace": traceback.format_tb(e.__traceback__), + } + return response, status_code diff --git a/backend/tests/mw_drw_proxy/proxy.py b/backend/tests/mw_drw_proxy/proxy.py new file mode 100644 index 00000000..e67d8448 --- /dev/null +++ b/backend/tests/mw_drw_proxy/proxy.py @@ -0,0 +1,165 @@ +# Copyright (c) The Diem Core Contributors +# SPDX-License-Identifier: Apache-2.0 + +import json +import os +import typing + +from flask import Flask, request +import logging + +from diem import identifier + +from tests.e2e_tests import UserClient, create_test_user +from tests.mw_drw_proxy.helpers import ( + DEFAULT_KYC_INFO, + convert_offchain_to_user_info, + convert_user_info_to_offchain, + error_response, +) + +APP_NAME = __name__.split(".")[0] +LOG = logging.getLogger(APP_NAME) +logging.basicConfig(level=logging.INFO) + +app = Flask(APP_NAME) + +STATE: typing.Dict[str, UserClient] = {} + +DRW_URL_PREFIX = os.getenv("DRW_URL_PREFIX", "https://demo-wallet.diem.com") + + +@app.route("/reset", methods=["GET", "POST"]) +def reset_test(): + STATE.clear() + + +@app.route("/accounts", methods=["POST"]) +def create_test_account(): + try: + data = json.loads(request.data) + + # "{\"type\": \"individual\", \"payload_version\": 1, \"given_name\": \"Tom\", \"surname\": \"Jack\"}" + if data.get("kyc_data") is None: + kyc_info = DEFAULT_KYC_INFO + else: + # This may explode, and that's ok + try: + kyc_info = convert_offchain_to_user_info(json.loads(data["kyc_data"])) + except Exception as e: + LOG.error(f">>>> ERROR! {e}") + raise + + uc = create_test_user( + DRW_URL_PREFIX, + f"{kyc_info['first_name']}_{kyc_info['last_name']}_{len(STATE)}".lower(), + kyc_info=kyc_info, + log_fn=LOG.info, + ) + + for currency, amount in (data["balances"] or {}).items(): + uc.buy(amount, currency, "USD") + + STATE[uc.name] = uc + + return {"id": uc.name, "kyc_data": data["kyc_data"]} + + except Exception as e: + return error_response(LOG, e) + + +@app.route("/accounts//balances", methods=["GET"]) +def account_balances(account_id): + try: + return {b["currency"]: b["balance"] for b in STATE[account_id].get_balances()} + + except Exception as e: + return error_response(LOG, e) + + +@app.route("/accounts//payments", methods=["POST"]) +def send_payment(account_id): + try: + # { "currency": "XUS", "amount": 0, "payee": "string" } + data = json.loads(request.data) + + res = STATE[account_id].transfer( + addr=data["payee"], amount=data["amount"], currency=data["currency"] + ) + + return { + "id": res["id"], + "account_id": account_id, + "currency": res["currency"], + "amount": res["amount"], + "payee": data["payee"], + } + + except Exception as e: + return error_response(LOG, e) + + +@app.route("/accounts//payment_uris", methods=["POST"]) +def get_payment_uri(account_id): + try: + address = STATE[account_id].get_recv_addr() + + return { + "id": address, + "account_id": account_id, + "payment_uri": identifier.encode_intent(address, "", 0), + } + + except Exception as e: + return error_response(LOG, e) + + +@app.route("/kyc_sample", methods=["GET"]) +def kyc_sample(): + return { + "minimum": json.dumps( + convert_user_info_to_offchain( + { + **DEFAULT_KYC_INFO, + "first_name": "Accept", + "last_name": "KYC", + } + ) + ), + "reject": json.dumps( + convert_user_info_to_offchain( + { + **DEFAULT_KYC_INFO, + "first_name": "Reject", + "last_name": "KYC", + } + ) + ), + # TODO: these are not implemented yet + "soft_match": json.dumps( + convert_user_info_to_offchain( + { + **DEFAULT_KYC_INFO, + "first_name": "SoftMatch", + "last_name": "KYC", + } + ) + ), + "soft_reject": json.dumps( + convert_user_info_to_offchain( + { + **DEFAULT_KYC_INFO, + "first_name": "SoftReject", + "last_name": "KYC", + } + ) + ), + } + + +if __name__ == "__main__": + port = os.getenv("MW_DRW_PROXY_PORT", 5001) + LOG.info( + f"Launching server on http://127.0.0.1:{port} - proxying to {DRW_URL_PREFIX}" + ) + app.run(port=port)